1/* Open a descriptor to a file. 2 Copyright (C) 2007 Free Software Foundation, Inc. 3 4 This program is free software: you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 3 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 16 17/* Written by Bruno Haible <bruno@clisp.org>, 2007. */ 18 19#include <config.h> 20 21/* Specification. */ 22#include <fcntl.h> 23 24/* If the fchdir replacement is used, open() is defined in fchdir.c. */ 25#ifndef FCHDIR_REPLACEMENT 26 27# include <stdarg.h> 28# include <string.h> 29# include <sys/types.h> 30# include <sys/stat.h> 31 32int 33open (const char *filename, int flags, ...) 34# undef open 35{ 36 mode_t mode; 37 38 mode = 0; 39 if (flags & O_CREAT) 40 { 41 va_list arg; 42 va_start (arg, flags); 43 44 /* If mode_t is narrower than int, use the promoted type (int), 45 not mode_t. Use sizeof to guess whether mode_t is narrower; 46 we don't know of any practical counterexamples. */ 47 mode = (sizeof (mode_t) < sizeof (int) 48 ? va_arg (arg, int) 49 : va_arg (arg, mode_t)); 50 51 va_end (arg); 52 } 53 54# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ 55 if (strcmp (filename, "/dev/null") == 0) 56 filename = "NUL"; 57# endif 58 59 return open (filename, flags, mode); 60} 61#endif 62