Preserve the file offset if a seek operation fails.

This commit is contained in:
nvt-se 2010-05-13 18:24:55 +00:00
parent ed4debe285
commit 8c3ed291bb

View file

@ -869,7 +869,7 @@ find_next_record(struct file *file, coffee_page_t log_page,
preferred_batch_size = log_records > COFFEE_LOG_TABLE_LIMIT ?
COFFEE_LOG_TABLE_LIMIT : log_records;
{
/* The next log record is unknown. Search for it. */
/* The next log record is unknown at this point; search for it. */
uint16_t indices[preferred_batch_size];
uint16_t processed;
uint16_t batch_size;
@ -1027,6 +1027,7 @@ cfs_offset_t
cfs_seek(int fd, cfs_offset_t offset, int whence)
{
struct file_desc *fdp;
cfs_offset_t new_offset;
if(!FD_VALID(fd)) {
return -1;
@ -1034,25 +1035,24 @@ cfs_seek(int fd, cfs_offset_t offset, int whence)
fdp = &coffee_fd_set[fd];
if(whence == CFS_SEEK_SET) {
fdp->offset = offset;
new_offset = offset;
} else if(whence == CFS_SEEK_END) {
fdp->offset = fdp->file->end + offset;
new_offset = fdp->file->end + offset;
} else if(whence == CFS_SEEK_CUR) {
fdp->offset += offset;
new_offset = fdp->offset + offset;
} else {
return (cfs_offset_t)-1;
}
if(fdp->offset < 0 || fdp->offset > fdp->file->max_pages * COFFEE_PAGE_SIZE) {
fdp->offset = 0;
if(new_offset < 0 || new_offset > fdp->file->max_pages * COFFEE_PAGE_SIZE) {
return -1;
}
if(fdp->file->end < fdp->offset) {
fdp->file->end = fdp->offset;
if(fdp->file->end < new_offset) {
fdp->file->end = new_offset;
}
return fdp->offset;
return fdp->offset = new_offset;
}
/*---------------------------------------------------------------------------*/
int