fopen-safer.c revision 98038
1/* Invoke fopen, but avoid some glitches. 2 Copyright (C) 2001 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 2, or (at your option) 7 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, write to the Free Software Foundation, 16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 17 18/* Written by Paul Eggert. */ 19 20#if HAVE_CONFIG_H 21# include <config.h> 22#endif 23 24#if HAVE_UNISTD_H 25# include <unistd.h> 26#endif 27#include <unistd-safer.h> 28 29#ifndef STDERR_FILENO 30# define STDERR_FILENO 2 31#endif 32 33#include <errno.h> 34#ifndef errno 35extern int errno; 36#endif 37 38#include <stdio.h> 39#include <stdio-safer.h> 40 41/* Like fopen, but do not return stdin, stdout, or stderr. */ 42 43FILE * 44fopen_safer (char const *file, char const *mode) 45{ 46 FILE *fp = fopen (file, mode); 47 48 if (fp) 49 { 50 int fd = fileno (fp); 51 52 if (0 <= fd && fd <= STDERR_FILENO) 53 { 54 int f = dup_safer (fd); 55 56 if (f < 0) 57 { 58 int e = errno; 59 fclose (fp); 60 errno = e; 61 return NULL; 62 } 63 64 if (fclose (fp) != 0 65 || ! (fp = fdopen (f, mode))) 66 { 67 int e = errno; 68 close (f); 69 errno = e; 70 return NULL; 71 } 72 } 73 } 74 75 return fp; 76} 77