# HG changeset patch # User William Pitcock # Date 1185051013 18000 # Node ID 3eca96f6a73f28ff77962ae32ec78215c3d99f88 # Parent 25f92bfd50c487905791814ffdb2099e164fd4a0 Rewrite VFSBufferedFile::fseek(), now far less buggy! diff -r 25f92bfd50c4 -r 3eca96f6a73f src/audacious/vfs_buffered_file.c --- a/src/audacious/vfs_buffered_file.c Fri Jul 20 20:59:15 2007 -0500 +++ b/src/audacious/vfs_buffered_file.c Sat Jul 21 15:50:13 2007 -0500 @@ -116,14 +116,33 @@ vfs_fseek(handle->buffer, offset, whence); - /* if we go OOB, switch to live FD */ - if (vfs_ftell(handle->buffer) > ((VFSBuffer *) handle->buffer->handle)->size) + switch(whence) { - vfs_rewind(handle->buffer); - handle->which = TRUE; - vfs_fseek(handle->buffer, offset, whence); + case SEEK_END: + handle->which = TRUE; + vfs_fseek(handle->fd, offset, whence); + break; + case SEEK_CUR: + if (vfs_ftell(handle->buffer) + offset > ((VFSBuffer *) handle->buffer->handle)->size) + { + handle->which = TRUE; + vfs_fseek(handle->fd, offset, whence); + } + break; + case SEEK_SET: + default: + if (offset > ((VFSBuffer *) handle->buffer->handle)->size) + { + handle->which = TRUE; + vfs_fseek(handle->fd, offset, whence); + } + else + { + handle->which = FALSE; + vfs_fseek(handle->buffer, offset, whence); + } + break; } - return 0; } @@ -215,6 +234,7 @@ } sz = vfs_fread(fd->mem, 1, 40000, fd->fd); + vfs_rewind(fd->fd); if (!sz) {