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

glibc/2.7/libio/freopen.c

    1: /* Copyright (C) 1993,95,96,97,98,2000,2001,2002,2003
    2:         Free Software Foundation, Inc.
    3:    This file is part of the GNU C Library.
    4: 
    5:    The GNU C Library is free software; you can redistribute it and/or
    6:    modify it under the terms of the GNU Lesser General Public
    7:    License as published by the Free Software Foundation; either
    8:    version 2.1 of the License, or (at your option) any later version.
    9: 
   10:    The GNU C Library 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 GNU
   13:    Lesser General Public License for more details.
   14: 
   15:    You should have received a copy of the GNU Lesser General Public
   16:    License along with the GNU C Library; if not, write to the Free
   17:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   18:    02111-1307 USA.
   19: 
   20:    As a special exception, if you link the code in this file with
   21:    files compiled with a GNU compiler to produce an executable,
   22:    that does not cause the resulting executable to be covered by
   23:    the GNU Lesser General Public License.  This exception does not
   24:    however invalidate any other reasons why the executable file
   25:    might be covered by the GNU Lesser General Public License.
   26:    This exception applies to code released by its copyright holders
   27:    in files containing the exception.  */
   28: 
   29: #include "libioP.h"
   30: #include "stdio.h"
   31: #include <stdlib.h>
   32: 
   33: #include <shlib-compat.h>
   34: #include <fd_to_filename.h>
   35: 
   36: FILE*
   37: freopen (filename, mode, fp)
   38:      const char* filename;
   39:      const char* mode;
   40:      FILE* fp;
   41: {
   42:   FILE *result;
   43:   int fd = -1;
   44:   CHECK_FILE (fp, NULL);
   45:   if (!(fp->_flags & _IO_IS_FILEBUF))
   46:     return NULL;
   47:   _IO_acquire_lock (fp);
   48:   if (filename == NULL && _IO_fileno (fp) >= 0)
   49:     {
   50:       fd = __dup (_IO_fileno (fp));
   51:       if (fd != -1)
   52:         filename = fd_to_filename (fd);
   53:     }
   54: #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
   55:   if (&_IO_stdin_used == NULL)
   56:     {
   57:       /* If the shared C library is used by the application binary which
   58:          was linked against the older version of libio, we just use the
   59:          older one even for internal use to avoid trouble since a pointer
   60:          to the old libio may be passed into shared C library and wind
   61:          up here. */
   62:       _IO_old_file_close_it (fp);
   63:       _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_old_file_jumps;
   64:       result = _IO_old_file_fopen (fp, filename, mode);
   65:     }
   66:   else
   67: #endif
   68:     {
   69:       INTUSE(_IO_file_close_it) (fp);
   70:       _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_file_jumps;
   71:       if (_IO_vtable_offset (fp) == 0 && fp->_wide_data != NULL)
   72:         fp->_wide_data->_wide_vtable = &_IO_wfile_jumps;
   73:       result = INTUSE(_IO_file_fopen) (fp, filename, mode, 1);
   74:       if (result != NULL)
   75:         result = __fopen_maybe_mmap (result);
   76:     }
   77:   if (result != NULL)
   78:     /* unbound stream orientation */
   79:     result->_mode = 0;
   80:   if (fd != -1)
   81:     {
   82:       __close (fd);
   83:       if (filename != NULL)
   84:         free ((char *) filename);
   85:     }
   86:   _IO_release_lock (fp);
   87:   return result;
   88: }
Syntax (Markdown)