136ac495dSmrg /* posix.c -- POSIX file I/O routines for the backtrace library.
2*8feb0f0bSmrg Copyright (C) 2012-2020 Free Software Foundation, Inc.
336ac495dSmrg Written by Ian Lance Taylor, Google.
436ac495dSmrg
536ac495dSmrg Redistribution and use in source and binary forms, with or without
636ac495dSmrg modification, are permitted provided that the following conditions are
736ac495dSmrg met:
836ac495dSmrg
936ac495dSmrg (1) Redistributions of source code must retain the above copyright
1036ac495dSmrg notice, this list of conditions and the following disclaimer.
1136ac495dSmrg
1236ac495dSmrg (2) Redistributions in binary form must reproduce the above copyright
1336ac495dSmrg notice, this list of conditions and the following disclaimer in
1436ac495dSmrg the documentation and/or other materials provided with the
1536ac495dSmrg distribution.
1636ac495dSmrg
1736ac495dSmrg (3) The name of the author may not be used to
1836ac495dSmrg endorse or promote products derived from this software without
1936ac495dSmrg specific prior written permission.
2036ac495dSmrg
2136ac495dSmrg THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2236ac495dSmrg IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2336ac495dSmrg WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2436ac495dSmrg DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
2536ac495dSmrg INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2636ac495dSmrg (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2736ac495dSmrg SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2836ac495dSmrg HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
2936ac495dSmrg STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
3036ac495dSmrg IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3136ac495dSmrg POSSIBILITY OF SUCH DAMAGE. */
3236ac495dSmrg
3336ac495dSmrg #include "config.h"
3436ac495dSmrg
3536ac495dSmrg #include <errno.h>
3636ac495dSmrg #include <sys/types.h>
3736ac495dSmrg #include <sys/stat.h>
3836ac495dSmrg #include <fcntl.h>
3936ac495dSmrg #include <unistd.h>
4036ac495dSmrg
4136ac495dSmrg #include "backtrace.h"
4236ac495dSmrg #include "internal.h"
4336ac495dSmrg
4436ac495dSmrg #ifndef O_BINARY
4536ac495dSmrg #define O_BINARY 0
4636ac495dSmrg #endif
4736ac495dSmrg
4836ac495dSmrg #ifndef O_CLOEXEC
4936ac495dSmrg #define O_CLOEXEC 0
5036ac495dSmrg #endif
5136ac495dSmrg
5236ac495dSmrg #ifndef FD_CLOEXEC
5336ac495dSmrg #define FD_CLOEXEC 1
5436ac495dSmrg #endif
5536ac495dSmrg
5636ac495dSmrg /* Open a file for reading. */
5736ac495dSmrg
5836ac495dSmrg int
backtrace_open(const char * filename,backtrace_error_callback error_callback,void * data,int * does_not_exist)5936ac495dSmrg backtrace_open (const char *filename, backtrace_error_callback error_callback,
6036ac495dSmrg void *data, int *does_not_exist)
6136ac495dSmrg {
6236ac495dSmrg int descriptor;
6336ac495dSmrg
6436ac495dSmrg if (does_not_exist != NULL)
6536ac495dSmrg *does_not_exist = 0;
6636ac495dSmrg
6736ac495dSmrg descriptor = open (filename, (int) (O_RDONLY | O_BINARY | O_CLOEXEC));
6836ac495dSmrg if (descriptor < 0)
6936ac495dSmrg {
7036ac495dSmrg if (does_not_exist != NULL && errno == ENOENT)
7136ac495dSmrg *does_not_exist = 1;
7236ac495dSmrg else
7336ac495dSmrg error_callback (data, filename, errno);
7436ac495dSmrg return -1;
7536ac495dSmrg }
7636ac495dSmrg
7736ac495dSmrg #ifdef HAVE_FCNTL
7836ac495dSmrg /* Set FD_CLOEXEC just in case the kernel does not support
7936ac495dSmrg O_CLOEXEC. It doesn't matter if this fails for some reason.
8036ac495dSmrg FIXME: At some point it should be safe to only do this if
8136ac495dSmrg O_CLOEXEC == 0. */
8236ac495dSmrg fcntl (descriptor, F_SETFD, FD_CLOEXEC);
8336ac495dSmrg #endif
8436ac495dSmrg
8536ac495dSmrg return descriptor;
8636ac495dSmrg }
8736ac495dSmrg
8836ac495dSmrg /* Close DESCRIPTOR. */
8936ac495dSmrg
9036ac495dSmrg int
backtrace_close(int descriptor,backtrace_error_callback error_callback,void * data)9136ac495dSmrg backtrace_close (int descriptor, backtrace_error_callback error_callback,
9236ac495dSmrg void *data)
9336ac495dSmrg {
9436ac495dSmrg if (close (descriptor) < 0)
9536ac495dSmrg {
9636ac495dSmrg error_callback (data, "close", errno);
9736ac495dSmrg return 0;
9836ac495dSmrg }
9936ac495dSmrg return 1;
10036ac495dSmrg }
101