diff --git a/libretro-common/include/streams/file_stream.h b/libretro-common/include/streams/file_stream.h index 5e4294effa..40b867b007 100644 --- a/libretro-common/include/streams/file_stream.h +++ b/libretro-common/include/streams/file_stream.h @@ -47,6 +47,10 @@ enum RFILE_HINT_MMAP = 1<<9 /* requires RFILE_MODE_READ */ }; +long long int filestream_get_size(RFILE *stream); + +void filestream_set_size(RFILE *stream); + const char *filestream_get_ext(RFILE *stream); RFILE *filestream_open(const char *path, unsigned mode, ssize_t len); diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index b717f04880..46d99f61c2 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -69,6 +69,7 @@ struct RFILE { unsigned hints; char *ext; + long long int size; #if defined(PSP) SceUID fd; #else @@ -110,6 +111,26 @@ const char *filestream_get_ext(RFILE *stream) return stream->ext; } +long long int filestream_get_size(RFILE *stream) +{ + if (!stream) + return 0; + return stream->size; +} + +void filestream_set_size(RFILE *stream) +{ + if (!stream) + return; + + filestream_seek(stream, 0, SEEK_SET); + filestream_seek(stream, 0, SEEK_END); + + stream->size = filestream_tell(stream); + + filestream_seek(stream, 0, SEEK_SET); +} + RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) { int flags = 0; @@ -249,6 +270,8 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) stream->ext = strdup(ld ? ld + 1 : ""); } + filestream_set_size(stream); + return stream; error: