BSD 4_1_snap release
[unix-history] / usr / src / libc / stdio / fseek.c
index 6ac9b3f..5347996 100644 (file)
@@ -1,3 +1,4 @@
+/* @(#)fseek.c 4.2 (Berkeley) 3/9/81 */
 /*
  * Seek for standard library.  Coordinates with buffering.
  */
 /*
  * Seek for standard library.  Coordinates with buffering.
  */
@@ -23,7 +24,8 @@ long offset;
                                p += c - lseek(fileno(iop),0L,1);
                        else
                                offset -= c;
                                p += c - lseek(fileno(iop),0L,1);
                        else
                                offset -= c;
-                       if(c>0&&p<=c&&p>=iop->_base-iop->_ptr){
+                       if(!(iop->_flag&_IORW) && c>0&&p<=c
+                           && p>=iop->_base-iop->_ptr){
                                iop->_ptr += (int)p;
                                iop->_cnt -= (int)p;
                                return(0);
                                iop->_ptr += (int)p;
                                iop->_cnt -= (int)p;
                                return(0);
@@ -31,13 +33,22 @@ long offset;
                        resync = offset&01;
                } else 
                        resync = 0;
                        resync = offset&01;
                } else 
                        resync = 0;
+               if (iop->_flag & _IORW) {
+                       iop->_ptr = iop->_base;
+                       iop->_flag &= ~_IOREAD;
+               }
                p = lseek(fileno(iop), offset-resync, ptrname);
                iop->_cnt = 0;
                if (resync)
                        getc(iop);
        }
                p = lseek(fileno(iop), offset-resync, ptrname);
                iop->_cnt = 0;
                if (resync)
                        getc(iop);
        }
-       else if (iop->_flag&_IOWRT) {
+       else if (iop->_flag & (_IOWRT|_IORW)) {
                fflush(iop);
                fflush(iop);
+               if (iop->_flag & _IORW) {
+                       iop->_cnt = 0;
+                       iop->_flag &= ~_IOWRT;
+                       iop->_ptr = iop->_base;
+               }
                p = lseek(fileno(iop), offset, ptrname);
        }
        return(p==-1?-1:0);
                p = lseek(fileno(iop), offset, ptrname);
        }
        return(p==-1?-1:0);