(linenum→info "unix/slp.c:2238")

coreutils/6.9/lib/fd-safer.c

    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: }
Syntax (Markdown)