static int private_validate_dir ( char** path) { LISysStat stat; if (*path == NULL) return 0; if (!lisys_filesystem_stat (*path, &stat)) { lisys_free (*path); *path = NULL; return 0; } if (stat.type != LISYS_STAT_DIRECTORY && stat.type != LISYS_STAT_LINK) { lisys_free (*path); *path = NULL; return 0; } return 1; }
/** * \brief Creates a new paths object. * * \param path Package root directory or NULL for auto-detect. * \param name Module name. * \return Paths or NULL. */ LIPthPaths* lipth_paths_new ( const char* path, const char* name) { char* tmp; LIPthPaths* self; LISysStat stat; self = lisys_calloc (1, sizeof (LIPthPaths)); if (self == NULL) return NULL; /* Set module name. */ self->module_name = lisys_string_dup (name); if (self->module_name == NULL) goto error; /* Set root directory. */ if (path != NULL) { self->root = lisys_string_dup (path); if (self->root == NULL) goto error; } else { self->root = lipth_paths_get_root (); if (self->root == NULL) goto error; } /* Get data directory. */ #ifdef LI_RELATIVE_PATHS self->global_data = lisys_path_concat (self->root, "data", NULL); if (self->global_data == NULL) goto error; #else self->global_data = LIDATADIR; #endif self->module_data = lisys_path_concat (self->global_data, name, NULL); if (self->module_data == NULL) goto error; /* Get data override directory. */ tmp = lisys_paths_get_data_home (); if (tmp == NULL) goto error; self->override_data = lisys_path_concat (tmp, "lipsofsuna", "data", name, NULL); if (self->override_data == NULL) { lisys_free (tmp); goto error; } /* Get save directory. */ self->global_state = lisys_path_concat (tmp, "lipsofsuna", "save", NULL); lisys_free (tmp); if (self->global_state == NULL) goto error; self->module_state = lisys_path_concat (self->global_state, name, NULL); if (self->module_state == NULL) goto error; /* Get extension directory. */ #ifdef LI_RELATIVE_PATHS self->global_exts = lisys_path_concat (self->global_data, "lib", "extensions", NULL); if (self->global_exts == NULL) goto error; #else self->global_exts = LIEXTSDIR; #endif /* Check for valid data directory. */ if (!lisys_filesystem_stat (self->module_data, &stat)) { lisys_error_set (EIO, "missing data directory `%s'", self->module_data); goto error; } if (stat.type != LISYS_STAT_DIRECTORY && stat.type != LISYS_STAT_LINK) { lisys_error_set (EIO, "invalid data directory `%s': not a directory", self->module_data); goto error; } return self; error: lipth_paths_free (self); return NULL; }