Diff for /src/lib/libc/stdio/freopen.c between versions 1.3 and 1.4

version 1.3, 2004/06/07 20:35:41 version 1.4, 2004/06/08 00:45:00
Line 57  FILE * Line 57  FILE *
 freopen(const char *file, const char *mode, FILE *fp)  freopen(const char *file, const char *mode, FILE *fp)
 {  {
         int f;          int f;
        int flags, isopen, oflags, sverrno, wantfd;        int dflags, flags, isopen, oflags, sverrno, wantfd;
   
         if ((flags = __sflags(mode, &oflags)) == 0) {          if ((flags = __sflags(mode, &oflags)) == 0) {
                 (void) fclose(fp);                  (void) fclose(fp);
Line 69  freopen(const char *file, const char *mo Line 69  freopen(const char *file, const char *mo
         if (!__sdidinit)          if (!__sdidinit)
                 __sinit();                  __sinit();
   
           sverrno = 0;
   
           /*
            * If the filename is a NULL pointer, the caller is asking us to
            * re-open the same file with a different mode. We allow this only
            * if the modes are compatible.
            */
           if (file == NULL) {
                   /* See comment below regarding freopen() of closed files. */
                   if (fp->_flags == 0) {
                           FUNLOCKFILE(fp);
                           errno = EINVAL;
                           return (NULL);
                   }
                   if ((dflags = fcntl(fp->_file, F_GETFL)) < 0) {
                           sverrno = errno;
                           fclose(fp);
                           FUNLOCKFILE(fp);
                           errno = sverrno;
                           return (NULL);
                   }
                   if ((dflags & O_ACCMODE) != O_RDWR && (dflags & O_ACCMODE) !=
                       (oflags & O_ACCMODE)) {
                           fclose(fp);
                           FUNLOCKFILE(fp);
                           errno = EINVAL;
                           return (NULL);
                   }
                   if ((oflags ^ dflags) & O_APPEND) {
                           dflags &= ~O_APPEND;
                           dflags |= oflags & O_APPEND;
                           if (fcntl(fp->_file, F_SETFL, dflags) < 0) {
                                   sverrno = errno;
                                   fclose(fp);
                                   FUNLOCKFILE(fp);
                                   errno = sverrno;
                                   return (NULL);
                           }
                   }
                   if (oflags & O_TRUNC)
                           ftruncate(fp->_file, 0);
                   if (fseeko(fp, 0, oflags & O_APPEND ? SEEK_END : SEEK_SET) < 0 &&
                       errno != ESPIPE) {
                           sverrno = errno;
                           fclose(fp);
                           FUNLOCKFILE(fp);
                           errno = sverrno;
                           return (NULL);
                   }
                   f = fp->_file;
                   isopen = 0;
                   wantfd = -1;
                   goto finish;
           }
   
         /*          /*
          * There are actually programs that depend on being able to "freopen"           * There are actually programs that depend on being able to "freopen"
          * descriptors that weren't originally open.  Keep this from breaking.           * descriptors that weren't originally open.  Keep this from breaking.
Line 105  freopen(const char *file, const char *mo Line 160  freopen(const char *file, const char *mo
         }          }
         sverrno = errno;          sverrno = errno;
   
   finish:
         /*          /*
          * Finish closing fp.  Even if the open succeeded above, we cannot           * Finish closing fp.  Even if the open succeeded above, we cannot
          * keep fp->_base: it may be the wrong size.  This loses the effect           * keep fp->_base: it may be the wrong size.  This loses the effect

Removed from v.1.3  
changed lines
  Added in v.1.4