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

coreutils/6.9/lib/fd-reopen.c

    1: /* Invoke open, but return either a desired file descriptor or -1.
    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 "fd-reopen.h"
   24: 
   25: #include <errno.h>
   26: #include <fcntl.h>
   27: #include <unistd.h>
   28: 
   29: /* Open a file to a particular file descriptor.  This is like standard
   30:    `open', except it always returns DESIRED_FD if successful.  */
   31: 
   32: int
   33: fd_reopen (int desired_fd, char const *file, int flags, mode_t mode)
   34: {
   35:   int fd;
   36: 
   37:   close (desired_fd);
   38:   fd = open (file, flags, mode);
   39:   if (fd == desired_fd || fd < 0)
   40:     return fd;
   41:   else
   42:     {
   43:       int fd2 = fcntl (fd, F_DUPFD, desired_fd);
   44:       int saved_errno = errno;
   45:       close (fd);
   46:       errno = saved_errno;
   47:       return fd2;
   48:     }
   49: }
Syntax (Markdown)