xref: /netbsd-src/external/gpl3/gcc.old/dist/libbacktrace/posix.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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