
1: /* Return a safer copy of a file descriptor. 2: 3: Copyright (C) 2005, 2006 Free Software Foundation, Inc. 4: 5: This program is free software; you can redistribute it and/or modify 6: it under the terms of the GNU General Public License as published by 7: the Free Software Foundation; either version 2, or (at your option) 8: any later version. 9: 10: This program is distributed in the hope that it will be useful, 11: but WITHOUT ANY WARRANTY; without even the implied warranty of 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13: GNU General Public License for more details. 14: 15: You should have received a copy of the GNU General Public License 16: along with this program; if not, write to the Free Software Foundation, 17: Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 18: 19: /* Written by Paul Eggert. */ 20: 21: #include <config.h> 22: 23: #include "unistd-safer.h" 24: 25: #include <errno.h> 26: 27: #include <unistd.h> 28: #ifndef STDIN_FILENO 29: # define STDIN_FILENO 0 30: #endif 31: #ifndef STDERR_FILENO 32: # define STDERR_FILENO 2 33: #endif 34: 35: /* Return FD, unless FD would be a copy of standard input, output, or 36: error; in that case, return a duplicate of FD, closing FD. On 37: failure to duplicate, close FD, set errno, and return -1. Preserve 38: errno if FD is negative, so that the caller can always inspect 39: errno when the returned value is negative. 40: 41: This function is usefully wrapped around functions that return file 42: descriptors, e.g., fd_safer (open ("file", O_RDONLY)). */ 43: 44: int 45: fd_safer (int fd) 46: { 47: if (STDIN_FILENO <= fd && fd <= STDERR_FILENO) 48: { 49: int f = dup_safer (fd); 50: int e = errno; 51: close (fd); 52: errno = e; 53: fd = f; 54: } 55: 56: return fd; 57: }