mirror of
https://github.com/libretro/RetroArch.git
synced 2025-01-21 08:26:17 +00:00
Fix various vfs / file stream issues (#14384)
* VFS: Fix stream size after truncate / write calls Those changes ensure the stream size get updated correctly after a truncate or write call. * File Stream: Fix file stream eof After a write call, EOF would be incorrect because it was only updated after a read call.
This commit is contained in:
parent
3bd36941a6
commit
788d602ec7
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user