diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index 0042f0330e..3956f087d9 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -45,7 +45,6 @@ struct RFILE { struct retro_vfs_file_handle *hfile; bool error_flag; - bool eof_flag; }; static retro_vfs_get_path_t filestream_get_path_cb = NULL; @@ -179,7 +178,6 @@ RFILE* filestream_open(const char *path, unsigned mode, unsigned hints) output = (RFILE*)malloc(sizeof(RFILE)); output->error_flag = false; - output->eof_flag = false; output->hfile = fp; return output; } @@ -363,14 +361,12 @@ int64_t filestream_seek(RFILE *stream, int64_t offset, int seek_position) if (output == VFS_ERROR_RETURN_VALUE) stream->error_flag = true; - stream->eof_flag = false; - return output; } int filestream_eof(RFILE *stream) { - return stream->eof_flag; + return filestream_tell(stream) == filestream_get_size(stream) ? EOF : 0; } int64_t filestream_tell(RFILE *stream) @@ -395,7 +391,6 @@ void filestream_rewind(RFILE *stream) return; filestream_seek(stream, 0L, RETRO_VFS_SEEK_POSITION_START); stream->error_flag = false; - stream->eof_flag = false; } int64_t filestream_read(RFILE *stream, void *s, int64_t len) @@ -410,8 +405,6 @@ int64_t filestream_read(RFILE *stream, void *s, int64_t len) if (output == VFS_ERROR_RETURN_VALUE) stream->error_flag = true; - if (output < len) - stream->eof_flag = true; return output; } diff --git a/libretro-common/vfs/vfs_implementation.c b/libretro-common/vfs/vfs_implementation.c index 878c9738f7..47bf49ed9f 100644 --- a/libretro-common/vfs/vfs_implementation.c +++ b/libretro-common/vfs/vfs_implementation.c @@ -560,10 +560,16 @@ int64_t retro_vfs_file_truncate_impl(libretro_vfs_implementation_file *stream, i { #ifdef _WIN32 if (stream && _chsize(_fileno(stream->fp), length) == 0) + { + stream->size = length; return 0; + } #elif !defined(VITA) && !defined(PSP) && !defined(PS2) && !defined(ORBIS) && (!defined(SWITCH) || defined(HAVE_LIBNX)) if (stream && ftruncate(fileno(stream->fp), (off_t)length) == 0) + { + stream->size = length; return 0; + } #endif return -1; } @@ -642,16 +648,34 @@ int64_t retro_vfs_file_read_impl(libretro_vfs_implementation_file *stream, int64_t retro_vfs_file_write_impl(libretro_vfs_implementation_file *stream, const void *s, uint64_t len) { + int64_t pos = 0; + size_t result = -1; + if (!stream) return -1; if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0) - return fwrite(s, 1, (size_t)len, stream->fp); + { + pos = retro_vfs_file_tell_impl(stream); + result = fwrite(s, 1, (size_t)len, stream->fp); + + if (result != -1 && pos + result > stream->size) + stream->size = pos + result; + + return result; + } #ifdef HAVE_MMAP if (stream->hints & RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS) return -1; #endif - return write(stream->fd, s, (size_t)len); + + pos = retro_vfs_file_tell_impl(stream); + result = write(stream->fd, s, (size_t)len); + + if (result != -1 && pos + result > stream->size) + stream->size = pos + result; + + return result; } int retro_vfs_file_flush_impl(libretro_vfs_implementation_file *stream)