diff --git a/Makefile.common b/Makefile.common index 9d06030b4d..90edc8a84d 100644 --- a/Makefile.common +++ b/Makefile.common @@ -201,6 +201,7 @@ endif OBJ += \ $(LIBRETRO_COMM_DIR)/file/nbio/nbio_intf.o \ $(LIBRETRO_COMM_DIR)/file/file_path.o \ + $(LIBRETRO_COMM_DIR)/file/file_path_io.o \ file_path_special.o \ file_path_str.o \ $(LIBRETRO_COMM_DIR)/hash/rhash.o \ diff --git a/Makefile.ps3.salamander b/Makefile.ps3.salamander index 419fcffbe7..5ef63d2372 100644 --- a/Makefile.ps3.salamander +++ b/Makefile.ps3.salamander @@ -46,6 +46,7 @@ PPU_SRCS = frontend/frontend_salamander.c \ frontend/frontend_driver.c \ frontend/drivers/platform_ps3.c \ libretro-common/file/file_path.c \ + libretro-common/file/file_path_io.c \ libretro-common/lists/dir_list.c \ libretro-common/lists/string_list.c \ libretro-common/file/retro_dirent.c \ diff --git a/Makefile.psp1.salamander b/Makefile.psp1.salamander index 98ae539786..ce72543fae 100644 --- a/Makefile.psp1.salamander +++ b/Makefile.psp1.salamander @@ -36,6 +36,7 @@ OBJS = frontend/frontend_salamander.o \ frontend/frontend_driver.o \ frontend/drivers/platform_psp.o \ libretro-common/file/file_path.o \ + libretro-common/file/file_path_io.o \ libretro-common/string/stdstring.o \ libretro-common/lists/string_list.o \ libretro-common/lists/dir_list.o \ diff --git a/Makefile.vita.salamander b/Makefile.vita.salamander index 8898d5bab9..7081793bf8 100644 --- a/Makefile.vita.salamander +++ b/Makefile.vita.salamander @@ -36,6 +36,7 @@ OBJS = frontend/frontend_salamander.o \ frontend/frontend_driver.o \ frontend/drivers/platform_psp.o \ libretro-common/file/file_path.o \ + libretro-common/file/file_path_io.o \ libretro-common/string/stdstring.o \ libretro-common/lists/string_list.o \ libretro-common/lists/dir_list.o \ diff --git a/Makefile.wii.salamander b/Makefile.wii.salamander index 0fe78655da..81117e7151 100644 --- a/Makefile.wii.salamander +++ b/Makefile.wii.salamander @@ -56,6 +56,7 @@ OBJ = frontend/frontend_salamander.o \ frontend/drivers/platform_gx.o \ frontend/drivers/platform_wii.o \ libretro-common/file/file_path.o \ + libretro-common/file/file_path_io.o \ libretro-common/hash/rhash.o \ libretro-common/string/stdstring.o \ libretro-common/lists/string_list.o \ diff --git a/cores/libretro-imageviewer/Makefile b/cores/libretro-imageviewer/Makefile index 9916b3eeee..e3f4554a75 100644 --- a/cores/libretro-imageviewer/Makefile +++ b/cores/libretro-imageviewer/Makefile @@ -8,6 +8,7 @@ image_core.so: image_core.c ../../libretro-common/compat/compat_strcasestr.c \ ../../libretro-common/compat/compat_strl.c \ ../../libretro-common/file/file_path.c \ + ../../libretro-common/file/file_path_io.c \ ../../libretro-common/file/retro_dirent.c \ ../../libretro-common/lists/dir_list.c \ ../../libretro-common/lists/string_list.c \ diff --git a/griffin/griffin.c b/griffin/griffin.c index 715ba35faf..30c958d36f 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -967,6 +967,7 @@ CORES FILE ============================================================ */ #include "../libretro-common/file/file_path.c" +#include "../libretro-common/file/file_path_io.c" #include "../file_path_special.c" #include "../file_path_str.c" #include "../libretro-common/lists/dir_list.c" diff --git a/libretro-common/file/file_path.c b/libretro-common/file/file_path.c index 65b8f5b944..0b637554f3 100644 --- a/libretro-common/file/file_path.c +++ b/libretro-common/file/file_path.c @@ -32,8 +32,6 @@ #include #include #include -#define VFS_FRONTEND -#include /* TODO: There are probably some unnecessary things on this huge include list now but I'm too afraid to touch it */ #ifdef __APPLE__ @@ -114,133 +112,6 @@ #endif -static retro_vfs_stat_t path_stat_cb = retro_vfs_stat_impl; -static retro_vfs_mkdir_t path_mkdir_cb = retro_vfs_mkdir_impl; - -void path_vfs_init(const struct retro_vfs_interface_info* vfs_info) -{ - const struct retro_vfs_interface* - vfs_iface = vfs_info->iface; - - path_stat_cb = retro_vfs_stat_impl; - path_mkdir_cb = retro_vfs_mkdir_impl; - - if (vfs_info->required_interface_version < PATH_REQUIRED_VFS_VERSION || !vfs_iface) - return; - - path_stat_cb = vfs_iface->stat; - path_mkdir_cb = vfs_iface->mkdir; -} - -int path_stat(const char *path) -{ - return path_stat_cb(path, NULL); -} - -/** - * path_is_directory: - * @path : path - * - * Checks if path is a directory. - * - * Returns: true (1) if path is a directory, otherwise false (0). - */ -bool path_is_directory(const char *path) -{ - return (path_stat_cb(path, NULL) & RETRO_VFS_STAT_IS_DIRECTORY) != 0; -} - -bool path_is_character_special(const char *path) -{ - return (path_stat_cb(path, NULL) & RETRO_VFS_STAT_IS_CHARACTER_SPECIAL) != 0; -} - -bool path_is_valid(const char *path) -{ - return (path_stat_cb(path, NULL) & RETRO_VFS_STAT_IS_VALID) != 0; -} - -int32_t path_get_size(const char *path) -{ - int32_t filesize = 0; - if (path_stat_cb(path, &filesize) != 0) - return filesize; - - return -1; -} - -/** - * path_mkdir: - * @dir : directory - * - * Create directory on filesystem. - * - * Returns: true (1) if directory could be created, otherwise false (0). - **/ -bool path_mkdir(const char *dir) -{ - bool sret = false; - bool norecurse = false; - char *basedir = NULL; - - if (!(dir && *dir)) - return false; - - /* Use heap. Real chance of stack - * overflow if we recurse too hard. */ - basedir = strdup(dir); - - if (!basedir) - return false; - - path_parent_dir(basedir); - - if (!*basedir || !strcmp(basedir, dir)) - { - free(basedir); - return false; - } - -#if defined(GEKKO) - { - size_t len = strlen(basedir); - - /* path_parent_dir() keeps the trailing slash. - * On Wii, mkdir() fails if the path has a - * trailing slash... - * We must therefore remove it. */ - if (len > 0) - if (basedir[len - 1] == '/') - basedir[len - 1] = '\0'; - } -#endif - - if (path_is_directory(basedir)) - norecurse = true; - else - { - sret = path_mkdir(basedir); - - if (sret) - norecurse = true; - } - - free(basedir); - - if (norecurse) - { - int ret = path_mkdir_cb(dir); - - /* Don't treat this as an error. */ - if (ret == -2 && path_is_directory(dir)) - return true; - - return (ret == 0); - } - - return sret; -} - /** * path_get_archive_delim: * @path : path diff --git a/libretro-common/file/file_path_io.c b/libretro-common/file/file_path_io.c new file mode 100644 index 0000000000..c44afc5119 --- /dev/null +++ b/libretro-common/file/file_path_io.c @@ -0,0 +1,242 @@ +/* Copyright (C) 2010-2019 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (file_path_io.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#define VFS_FRONTEND +#include + +/* TODO: There are probably some unnecessary things on this huge include list now but I'm too afraid to touch it */ +#ifdef __APPLE__ +#include +#endif +#ifdef __HAIKU__ +#include +#endif +#ifndef __MACH__ +#include +#include +#endif +#include +#include +#include + +#if defined(_WIN32) +#ifdef _MSC_VER +#define setmode _setmode +#endif +#include +#ifdef _XBOX +#include +#define INVALID_FILE_ATTRIBUTES -1 +#else +#include +#include +#include +#include +#if defined(_MSC_VER) && _MSC_VER <= 1200 +#define INVALID_FILE_ATTRIBUTES ((DWORD)-1) +#endif +#endif +#elif defined(VITA) +#define SCE_ERROR_ERRNO_EEXIST 0x80010011 +#include +#include +#include +#else +#include +#include +#include +#endif + +#if defined(PSP) +#include +#endif + +#if defined(PS2) +#include +#include +#endif + +#if defined(__CELLOS_LV2__) +#include +#endif + +#if defined(VITA) +#define FIO_S_ISDIR SCE_S_ISDIR +#endif + +#if (defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)) || defined(__QNX__) || defined(PSP) || defined(PS2) +#include /* stat() is defined here */ +#endif + +#if !defined(RARCH_CONSOLE) && defined(RARCH_INTERNAL) +#ifdef __WINRT__ +#include +#endif +#endif + +/* Assume W-functions do not work below Win2K and Xbox platforms */ +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX) + +#ifndef LEGACY_WIN32 +#define LEGACY_WIN32 +#endif + +#endif + +static retro_vfs_stat_t path_stat_cb = retro_vfs_stat_impl; +static retro_vfs_mkdir_t path_mkdir_cb = retro_vfs_mkdir_impl; + +void path_vfs_init(const struct retro_vfs_interface_info* vfs_info) +{ + const struct retro_vfs_interface* + vfs_iface = vfs_info->iface; + + path_stat_cb = retro_vfs_stat_impl; + path_mkdir_cb = retro_vfs_mkdir_impl; + + if (vfs_info->required_interface_version < PATH_REQUIRED_VFS_VERSION || !vfs_iface) + return; + + path_stat_cb = vfs_iface->stat; + path_mkdir_cb = vfs_iface->mkdir; +} + +int path_stat(const char *path) +{ + return path_stat_cb(path, NULL); +} + +/** + * path_is_directory: + * @path : path + * + * Checks if path is a directory. + * + * Returns: true (1) if path is a directory, otherwise false (0). + */ +bool path_is_directory(const char *path) +{ + return (path_stat_cb(path, NULL) & RETRO_VFS_STAT_IS_DIRECTORY) != 0; +} + +bool path_is_character_special(const char *path) +{ + return (path_stat_cb(path, NULL) & RETRO_VFS_STAT_IS_CHARACTER_SPECIAL) != 0; +} + +bool path_is_valid(const char *path) +{ + return (path_stat_cb(path, NULL) & RETRO_VFS_STAT_IS_VALID) != 0; +} + +int32_t path_get_size(const char *path) +{ + int32_t filesize = 0; + if (path_stat_cb(path, &filesize) != 0) + return filesize; + + return -1; +} + +/** + * path_mkdir: + * @dir : directory + * + * Create directory on filesystem. + * + * Returns: true (1) if directory could be created, otherwise false (0). + **/ +bool path_mkdir(const char *dir) +{ + bool sret = false; + bool norecurse = false; + char *basedir = NULL; + + if (!(dir && *dir)) + return false; + + /* Use heap. Real chance of stack + * overflow if we recurse too hard. */ + basedir = strdup(dir); + + if (!basedir) + return false; + + path_parent_dir(basedir); + + if (!*basedir || !strcmp(basedir, dir)) + { + free(basedir); + return false; + } + +#if defined(GEKKO) + { + size_t len = strlen(basedir); + + /* path_parent_dir() keeps the trailing slash. + * On Wii, mkdir() fails if the path has a + * trailing slash... + * We must therefore remove it. */ + if (len > 0) + if (basedir[len - 1] == '/') + basedir[len - 1] = '\0'; + } +#endif + + if (path_is_directory(basedir)) + norecurse = true; + else + { + sret = path_mkdir(basedir); + + if (sret) + norecurse = true; + } + + free(basedir); + + if (norecurse) + { + int ret = path_mkdir_cb(dir); + + /* Don't treat this as an error. */ + if (ret == -2 && path_is_directory(dir)) + return true; + + return (ret == 0); + } + + return sret; +} diff --git a/libretro-db/Makefile b/libretro-db/Makefile index ec3c055a8b..bd717bb0a3 100644 --- a/libretro-db/Makefile +++ b/libretro-db/Makefile @@ -15,6 +15,7 @@ LIBRETRO_COMMON_C = \ $(LIBRETRO_COMM_DIR)/streams/file_stream.c \ $(LIBRETRO_COMM_DIR)/compat/compat_strcasestr.c \ $(LIBRETRO_COMM_DIR)/file/file_path.c \ + $(LIBRETRO_COMM_DIR)/file/file_path_io.c \ $(LIBRETRO_COMM_DIR)/vfs/vfs_implementation.c \ $(LIBRETRO_COMM_DIR)/encodings/encoding_utf.c \ $(LIBRETRO_COMM_DIR)/compat/compat_strl.c \ diff --git a/pkg/msvc/RetroArch-360-Salamander/RetroArch-Salamander.vcxproj b/pkg/msvc/RetroArch-360-Salamander/RetroArch-Salamander.vcxproj index 3503eea80d..8430cd3d0e 100644 --- a/pkg/msvc/RetroArch-360-Salamander/RetroArch-Salamander.vcxproj +++ b/pkg/msvc/RetroArch-360-Salamander/RetroArch-Salamander.vcxproj @@ -350,6 +350,14 @@ CompileAsC CompileAsC + + CompileAsC + CompileAsC + CompileAsC + CompileAsC + CompileAsC + CompileAsC + CompileAsC CompileAsC diff --git a/pkg/msvc/RetroArch-Xbox1-Salamander/RetroArch-Salamander.vcproj b/pkg/msvc/RetroArch-Xbox1-Salamander/RetroArch-Salamander.vcproj index fddffc630b..1e4a3e11ff 100644 --- a/pkg/msvc/RetroArch-Xbox1-Salamander/RetroArch-Salamander.vcproj +++ b/pkg/msvc/RetroArch-Xbox1-Salamander/RetroArch-Salamander.vcproj @@ -334,6 +334,9 @@ + + diff --git a/samples/tasks/database/Makefile b/samples/tasks/database/Makefile index 4421a9efdc..4fb16b2f8f 100644 --- a/samples/tasks/database/Makefile +++ b/samples/tasks/database/Makefile @@ -107,6 +107,7 @@ SOURCES_C := \ $(LIBRETRO_COMM_DIR)/file/archive_file.c \ $(LIBRETRO_COMM_DIR)/file/config_file.c \ $(LIBRETRO_COMM_DIR)/file/file_path.c \ + $(LIBRETRO_COMM_DIR)/file/file_path_io.c \ $(LIBRETRO_COMM_DIR)/file/retro_dirent.c \ $(LIBRETRO_COMM_DIR)/hash/rhash.c \ $(LIBRETRO_COMM_DIR)/compat/compat_fnmatch.c \