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;
  }
  
