Diff for /src/lib/libc/stdio/freopen.c between versions 1.5 and 1.6

version 1.5, 2005/01/31 22:29:40 version 1.6, 2005/07/23 20:23:06
Line 47 Line 47
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include "un-namespace.h"  #include "un-namespace.h"
   
 #include "libc_private.h"  #include "libc_private.h"
 #include "local.h"  #include "local.h"
   #include "priv_stdio.h"
   
 /*  /*
  * Re-direct an existing, open (probably) file to some other file.   * Re-direct an existing, open (probably) file to some other file.
Line 80  freopen(const char *file, const char *mo Line 82  freopen(const char *file, const char *mo
          */           */
         if (file == NULL) {          if (file == NULL) {
                 /* See comment below regarding freopen() of closed files. */                  /* See comment below regarding freopen() of closed files. */
                if (fp->_flags == 0) {                if (fp->pub._flags == 0) {
                         FUNLOCKFILE(fp);                          FUNLOCKFILE(fp);
                         errno = EINVAL;                          errno = EINVAL;
                         return (NULL);                          return (NULL);
                 }                  }
                if ((dflags = fcntl(fp->_file, F_GETFL)) < 0) {                if ((dflags = _fcntl(fp->pub._fileno, F_GETFL)) < 0) {
                         sverrno = errno;                          sverrno = errno;
                         fclose(fp);                          fclose(fp);
                         FUNLOCKFILE(fp);                          FUNLOCKFILE(fp);
Line 102  freopen(const char *file, const char *mo Line 104  freopen(const char *file, const char *mo
                 if ((oflags ^ dflags) & O_APPEND) {                  if ((oflags ^ dflags) & O_APPEND) {
                         dflags &= ~O_APPEND;                          dflags &= ~O_APPEND;
                         dflags |= oflags & O_APPEND;                          dflags |= oflags & O_APPEND;
                        if (fcntl(fp->_file, F_SETFL, dflags) < 0) {                        if (_fcntl(fp->pub._fileno, F_SETFL, dflags) < 0) {
                                 sverrno = errno;                                  sverrno = errno;
                                 fclose(fp);                                  fclose(fp);
                                 FUNLOCKFILE(fp);                                  FUNLOCKFILE(fp);
Line 111  freopen(const char *file, const char *mo Line 113  freopen(const char *file, const char *mo
                         }                          }
                 }                  }
                 if (oflags & O_TRUNC)                  if (oflags & O_TRUNC)
                        ftruncate(fp->_file, 0);                        ftruncate(fp->pub._fileno, 0);
                 if (_fseeko(fp, 0, oflags & O_APPEND ? SEEK_END : SEEK_SET) < 0 &&                  if (_fseeko(fp, 0, oflags & O_APPEND ? SEEK_END : SEEK_SET) < 0 &&
                     errno != ESPIPE) {                      errno != ESPIPE) {
                         sverrno = errno;                          sverrno = errno;
Line 120  freopen(const char *file, const char *mo Line 122  freopen(const char *file, const char *mo
                         errno = sverrno;                          errno = sverrno;
                         return (NULL);                          return (NULL);
                 }                  }
                f = fp->_file;                f = fp->pub._fileno;
                 isopen = 0;                  isopen = 0;
                 wantfd = -1;                  wantfd = -1;
                 goto finish;                  goto finish;
Line 134  freopen(const char *file, const char *mo Line 136  freopen(const char *file, const char *mo
          * a descriptor, defer closing it; freopen("/dev/stdin", "r", stdin)           * a descriptor, defer closing it; freopen("/dev/stdin", "r", stdin)
          * should work.  This is unnecessary if it was not a Unix file.           * should work.  This is unnecessary if it was not a Unix file.
          */           */
        if (fp->_flags == 0) {        if (fp->pub._flags == 0) {
                fp->_flags = __SEOF;        /* hold on to it */                fp->pub._flags = __SEOF;        /* hold on to it */
                 isopen = 0;                  isopen = 0;
                 wantfd = -1;                  wantfd = -1;
         } else {          } else {
                 /* flush the stream; ANSI doesn't require this. */                  /* flush the stream; ANSI doesn't require this. */
                if (fp->_flags & __SWR)                if (fp->pub._flags & __SWR)
                         (void) __sflush(fp);                          (void) __sflush(fp);
                 /* if close is NULL, closing is a no-op, hence pointless */                  /* if close is NULL, closing is a no-op, hence pointless */
                 isopen = fp->_close != NULL;                  isopen = fp->_close != NULL;
                if ((wantfd = fp->_file) < 0 && isopen) {                if ((wantfd = fp->pub._fileno) < 0 && isopen) {
                         (void) (*fp->_close)(fp->_cookie);                          (void) (*fp->_close)(fp->_cookie);
                         isopen = 0;                          isopen = 0;
                 }                  }
Line 170  finish: Line 172  finish:
          */           */
         if (isopen)          if (isopen)
                 (void) (*fp->_close)(fp->_cookie);                  (void) (*fp->_close)(fp->_cookie);
        if (fp->_flags & __SMBF)        if (fp->pub._flags & __SMBF)
                 free((char *)fp->_bf._base);                  free((char *)fp->_bf._base);
        fp->_w = 0;        fp->pub._w = 0;
        fp->_r = 0;        fp->pub._r = 0;
        fp->_p = NULL;        fp->pub._p = NULL;
         fp->_bf._base = NULL;          fp->_bf._base = NULL;
         fp->_bf._size = 0;          fp->_bf._size = 0;
        fp->_lbfsize = 0;        fp->pub._lbfsize = 0;
         if (HASUB(fp))          if (HASUB(fp))
                 FREEUB(fp);                  FREEUB(fp);
         fp->_ub._size = 0;          fp->_ub._size = 0;
Line 186  finish: Line 188  finish:
         fp->_lb._size = 0;          fp->_lb._size = 0;
   
         if (f < 0) {                    /* did not get it after all */          if (f < 0) {                    /* did not get it after all */
                fp->_flags = 0;             /* set it free */                fp->pub._flags = 0;             /* set it free */
                 errno = sverrno;        /* restore in case _close clobbered */                  errno = sverrno;        /* restore in case _close clobbered */
                 FUNLOCKFILE(fp);                  FUNLOCKFILE(fp);
                 return (NULL);                  return (NULL);
Line 204  finish: Line 206  finish:
                 }                  }
         }          }
   
        fp->_flags = flags;        fp->pub._flags = flags;
        fp->_file = f;        fp->pub._fileno = f;
         fp->_cookie = fp;          fp->_cookie = fp;
         fp->_read = __sread;          fp->_read = __sread;
         fp->_write = __swrite;          fp->_write = __swrite;

Removed from v.1.5  
changed lines
  Added in v.1.6