#include "entry.h" #include "utils.h" #include #include #include #include bool is_entry_id_valid(const char* entry_id) { if (entry_id == NULL) return false; size_t length = strlen(entry_id); // Check that the length is valid if (length == 0 || length > MAX_ENTRY_LENGTH) return false; // Check that the entry id does not contain any slashes for (size_t i = 0; i < length; i++) if (entry_id[i] == '/') return false; // Check that the entry id is not a reserved name if (strcmp(entry_id, ".") == 0 || strcmp(entry_id, "..") == 0) return false; return true; } Result get_entry_path(const char* entry_id, char** out_path) { *out_path = NULL; // Check that the entry id is valid if (!is_entry_id_valid(entry_id)) { log_message(LOG_LEVEL_ERROR, "Invalid entry id '%s'.", entry_id); return FAILURE; } return format(out_path, "%s/%s", ENTRY_POOL_DIR, entry_id); } Result entry_exists(const char* entry_id, bool* out_exists) { *out_exists = false; // Get the path of the entry char* path; Result result = get_entry_path(entry_id, &path); if (result != SUCCESS) return result; // Check if the entry exists and is a directory struct stat st; bool exists = stat(path, &st) == 0 && S_ISDIR(st.st_mode); // Free the path free(path); // Output the result *out_exists = exists; return SUCCESS; }