/** * fill_pathname_parent_dir: * @out_dir : output directory * @in_dir : input directory * @size : size of output directory * * Copies parent directory of @in_dir into @out_dir. * Assumes @in_dir is a directory. Keeps trailing '/'. **/ void fill_pathname_parent_dir(char *out_dir, const char *in_dir, size_t size) { if (out_dir != in_dir) retro_assert(strlcpy(out_dir, in_dir, size) < size); path_parent_dir(out_dir); }
static int database_info_iterate_playlist( database_state_handle_t *db_state, database_info_handle_t *db, const char *name) { uint32_t extension_hash = 0; char parent_dir[PATH_MAX_LENGTH] = {0}; path_parent_dir(parent_dir); extension_hash = msg_hash_calculate(path_get_extension(name)); switch (extension_hash) { case HASH_EXTENSION_ZIP: #ifdef HAVE_ZLIB db->type = DATABASE_TYPE_ITERATE_ZIP; memset(&db->state, 0, sizeof(zlib_transfer_t)); db_state->zip_name[0] = '\0'; db->state.type = ZLIB_TRANSFER_INIT; return 1; #endif case HASH_EXTENSION_CUE: case HASH_EXTENSION_CUE_UPPERCASE: db_state->serial[0] = '\0'; cue_get_serial(db_state, db, name, db_state->serial); db->type = DATABASE_TYPE_SERIAL_LOOKUP; return 1; case HASH_EXTENSION_ISO: case HASH_EXTENSION_ISO_UPPERCASE: db_state->serial[0] = '\0'; iso_get_serial(db_state, db, name, db_state->serial); db->type = DATABASE_TYPE_SERIAL_LOOKUP; return 1; default: { ssize_t ret; int read_from = read_file(name, (void**)&db_state->buf, &ret); if (read_from != 1 || ret <= 0) return 0; #ifdef HAVE_ZLIB db_state->crc = zlib_crc32_calculate(db_state->buf, ret); #endif db->type = DATABASE_TYPE_CRC_LOOKUP; } break; } return 1; }
static int task_database_iterate_playlist( database_state_handle_t *db_state, database_info_handle_t *db, const char *name) { uint32_t extension_hash = 0; char parent_dir[PATH_MAX_LENGTH] = {0}; path_parent_dir(parent_dir); extension_hash = msg_hash_calculate(path_get_extension(name)); switch (extension_hash) { case HASH_EXTENSION_ZIP: #ifdef HAVE_ZLIB db->type = DATABASE_TYPE_ITERATE_ZIP; memset(&db->state, 0, sizeof(file_archive_transfer_t)); db_state->zip_name[0] = '\0'; db->state.type = ZLIB_TRANSFER_INIT; return file_get_crc(db_state, name, &db_state->zip_crc); #endif case HASH_EXTENSION_CUE: case HASH_EXTENSION_CUE_UPPERCASE: db_state->serial[0] = '\0'; cue_get_serial(db_state, db, name, db_state->serial); db->type = DATABASE_TYPE_SERIAL_LOOKUP; return 1; case HASH_EXTENSION_ISO: case HASH_EXTENSION_ISO_UPPERCASE: db_state->serial[0] = '\0'; iso_get_serial(db_state, db, name, db_state->serial); db->type = DATABASE_TYPE_SERIAL_LOOKUP; return 1; default: { db->type = DATABASE_TYPE_CRC_LOOKUP; return file_get_crc(db_state, name, &db_state->crc); } break; } return 1; }
static int task_database_iterate_playlist( database_state_handle_t *db_state, database_info_handle_t *db, const char *name) { char parent_dir[PATH_MAX_LENGTH] = {0}; path_parent_dir(parent_dir); switch (msg_hash_to_file_type(msg_hash_calculate(path_get_extension(name)))) { case FILE_TYPE_COMPRESSED: #ifdef HAVE_ZLIB db->type = DATABASE_TYPE_ITERATE_ZIP; memset(&db->state, 0, sizeof(file_archive_transfer_t)); db_state->zip_name[0] = '\0'; db->state.type = ZLIB_TRANSFER_INIT; return file_get_crc(db_state, name, &db_state->zip_crc); #else break; #endif case FILE_TYPE_CUE: db_state->serial[0] = '\0'; cue_get_serial(db_state, db, name, db_state->serial); db->type = DATABASE_TYPE_SERIAL_LOOKUP; break; case FILE_TYPE_ISO: db_state->serial[0] = '\0'; iso_get_serial(db_state, db, name, db_state->serial); db->type = DATABASE_TYPE_SERIAL_LOOKUP; break; case FILE_TYPE_LUTRO: db->type = DATABASE_TYPE_ITERATE_LUTRO; break; default: db->type = DATABASE_TYPE_CRC_LOOKUP; return file_get_crc(db_state, name, &db_state->crc); } return 1; }
static int task_database_iterate_playlist( database_state_handle_t *db_state, database_info_handle_t *db, const char *name) { char parent_dir[PATH_MAX_LENGTH]; parent_dir[0] = '\0'; path_parent_dir(parent_dir); switch (msg_hash_to_file_type(msg_hash_calculate(path_get_extension(name)))) { case FILE_TYPE_COMPRESSED: #ifdef HAVE_COMPRESSION database_info_set_type(db, DATABASE_TYPE_CRC_LOOKUP); /* first check crc of archive itself */ return file_get_crc(db_state, name, &db_state->archive_crc); #else break; #endif case FILE_TYPE_CUE: db_state->serial[0] = '\0'; cue_get_serial(db_state, db, name, db_state->serial); database_info_set_type(db, DATABASE_TYPE_SERIAL_LOOKUP); break; case FILE_TYPE_ISO: db_state->serial[0] = '\0'; iso_get_serial(db_state, db, name, db_state->serial); database_info_set_type(db, DATABASE_TYPE_SERIAL_LOOKUP); break; case FILE_TYPE_LUTRO: database_info_set_type(db, DATABASE_TYPE_ITERATE_LUTRO); break; default: database_info_set_type(db, DATABASE_TYPE_CRC_LOOKUP); return file_get_crc(db_state, name, &db_state->crc); } return 1; }
bool path_mkdir(const char *dir) { const char *target = NULL; /* Use heap. Real chance of stack overflow if we recurse too hard. */ char *basedir = strdup(dir); bool ret = true; if (!basedir) return false; path_parent_dir(basedir); if (!*basedir || !strcmp(basedir, dir)) { ret = false; goto end; } if (path_is_directory(basedir)) { target = dir; ret = path_mkdir_norecurse(dir); } else { target = basedir; ret = path_mkdir(basedir); if (ret) { target = dir; ret = path_mkdir_norecurse(dir); } } end: if (target && !ret) RARCH_ERR("Failed to create directory: \"%s\".\n", target); free(basedir); return ret; }
void fill_pathname_parent_dir(char *out_dir, const char *in_dir, size_t size) { rarch_assert(strlcpy(out_dir, in_dir, size) < size); path_parent_dir(out_dir); }
/** * 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) { /* Use heap. Real chance of stack overflow if we recurse too hard. */ const char *target = NULL; bool sret = false; bool norecurse = false; char *basedir = NULL; if (dir && *dir) basedir = strdup(dir); if (!basedir) return false; path_parent_dir(basedir); if (!*basedir || !strcmp(basedir, dir)) goto end; if (path_is_directory(basedir)) { target = dir; norecurse = true; } else { target = basedir; sret = path_mkdir(basedir); if (sret) { target = dir; norecurse = true; } } if (norecurse) { #if defined(_WIN32) #ifdef LEGACY_WIN32 int ret = _mkdir(dir); #else wchar_t *dirW = utf8_to_utf16_string_alloc(dir); int ret = -1; if (dirW) { ret = _wmkdir(dirW); free(dirW); } #endif #elif defined(IOS) int ret = mkdir(dir, 0755); #elif defined(VITA) || defined(PSP) int ret = sceIoMkdir(dir, 0777); #elif defined(__QNX__) int ret = mkdir(dir, 0777); #else int ret = mkdir(dir, 0750); #endif /* Don't treat this as an error. */ if (path_mkdir_error(ret) && path_is_directory(dir)) ret = 0; if (ret < 0) printf("mkdir(%s) error: %s.\n", dir, strerror(errno)); sret = (ret == 0); } end: if (target && !sret) printf("Failed to create directory: \"%s\".\n", target); free(basedir); return sret; }