1/* Invoke dup, but avoid some glitches. 2 Copyright (C) 2001, 2004 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#include <errno.h> 25 26#if HAVE_FCNTL_H 27# include <fcntl.h> 28#endif 29 30#if HAVE_UNISTD_H 31# include <unistd.h> 32#endif 33#ifndef STDERR_FILENO 34# define STDERR_FILENO 2 35#endif 36 37#include <unistd-safer.h> 38 39/* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or 40 STDERR_FILENO. */ 41 42int 43dup_safer (int fd) 44{ 45#ifdef F_DUPFD 46 return fcntl (fd, F_DUPFD, STDERR_FILENO + 1); 47#else 48 int f = dup (fd); 49 if (0 <= f && f <= STDERR_FILENO) 50 { 51 int f1 = dup_safer (f); 52 int e = errno; 53 close (f); 54 errno = e; 55 f = f1; 56 } 57 return f; 58#endif 59} 60