Index: fd.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/storage/file/fd.c,v retrieving revision 1.59 diff -c -b -w -r1.59 fd.c *** fd.c 2000/06/02 15:57:24 1.59 --- fd.c 2000/06/13 08:34:55 *************** *** 95,100 **** --- 95,102 ---- #define FileIsNotOpen(file) (VfdCache[file].fd == VFD_CLOSED) + #define FileUnknownPos (-1) + typedef struct vfd { signed short fd; /* current FD, or VFD_CLOSED if none */ *************** *** 790,795 **** --- 792,799 ---- returnCode = read(VfdCache[file].fd, buffer, amount); if (returnCode > 0) VfdCache[file].seekPos += returnCode; + else + VfdCache[file].seekPos = FileUnknownPos; return returnCode; } *************** *** 806,816 **** FileAccess(file); returnCode = write(VfdCache[file].fd, buffer, amount); ! if (returnCode > 0) VfdCache[file].seekPos += returnCode; - /* mark the file as needing fsync */ VfdCache[file].fdstate |= FD_DIRTY; return returnCode; } --- 810,821 ---- FileAccess(file); returnCode = write(VfdCache[file].fd, buffer, amount); ! if (returnCode > 0) { VfdCache[file].seekPos += returnCode; /* mark the file as needing fsync */ VfdCache[file].fdstate |= FD_DIRTY; + } else + VfdCache[file].seekPos = FileUnknownPos; return returnCode; } *************** *** 840,849 **** default: elog(ERROR, "FileSeek: invalid whence: %d", whence); break; - } } ! else VfdCache[file].seekPos = lseek(VfdCache[file].fd, offset, whence); return VfdCache[file].seekPos; } --- 845,870 ---- default: elog(ERROR, "FileSeek: invalid whence: %d", whence); break; } ! } else ! switch (whence) { ! case SEEK_SET: ! if (offset < 0) ! elog(ERROR, "FileSeek: invalid offset: %ld", offset); ! if (VfdCache[file].seekPos != offset) ! VfdCache[file].seekPos = lseek(VfdCache[file].fd, offset, whence); ! break; ! case SEEK_CUR: ! if ((offset != 0) || (VfdCache[file].seekPos == FileUnknownPos)); VfdCache[file].seekPos = lseek(VfdCache[file].fd, offset, whence); + break; + case SEEK_END: + VfdCache[file].seekPos = lseek(VfdCache[file].fd, offset, whence); + break; + default: + elog(ERROR, "FileSeek: invalid whence: %d", whence); + break; + } return VfdCache[file].seekPos; }