/** * @return The number of leaves or zero if unknown. */ size_t tth_cache_lookup(const struct tth *tth, filesize_t filesize) { size_t expected, leave_count = 0; g_return_val_if_fail(tth, 0); expected = tt_good_node_count(filesize); if (expected > 1) { filestat_t sb; char *pathname; pathname = tth_cache_pathname(tth); if (stat(pathname, &sb)) { leave_count = 0; if (ENOENT != errno) { g_warning("%s(%s): stat(\"%s\") failed: %m", G_STRFUNC, tth_base32(tth), pathname); } } else { leave_count = tth_cache_leave_count(tth, &sb); } HFREE_NULL(pathname); } else { leave_count = 1; } return expected != leave_count ? 0 : leave_count; }
static int tth_cache_file_create(const struct tth *tth) { char *pathname; int accmode; int fd; g_return_val_if_fail(tth, -1); accmode = O_WRONLY | O_TRUNC; pathname = tth_cache_pathname(tth); /* * Critical section required since we could have a concurrent thread * deciding to remove empty directories whilst we are attempting * to create a new directory to store the new cached entry! */ TTH_PATH_LOCK; fd = file_create_missing(pathname, accmode, TTH_FILE_MODE); if (fd < 0 && ENOENT == errno) { char *dir = filepath_directory(pathname); if (0 == create_directory(dir, DEFAULT_DIRECTORY_MODE)) { fd = file_create(pathname, accmode, TTH_FILE_MODE); } HFREE_NULL(dir); } TTH_PATH_UNLOCK; HFREE_NULL(pathname); return fd; }
void tth_cache_remove(const struct tth *tth) { char *pathname; g_return_if_fail(tth); pathname = tth_cache_pathname(tth); unlink(pathname); HFREE_NULL(pathname); }
static bool tth_cache_file_exists(const struct tth *tth) { bool ret; char *pathname; g_return_val_if_fail(tth, FALSE); pathname = tth_cache_pathname(tth); ret = file_exists(pathname); HFREE_NULL(pathname); return ret; }
static int tth_cache_file_open(const struct tth *tth) { char *pathname; int fd; g_return_val_if_fail(tth, -1); pathname = tth_cache_pathname(tth); fd = file_open_missing(pathname, O_RDONLY); HFREE_NULL(pathname); return fd; }
static int tth_cache_file_create(const struct tth *tth) { char *pathname; int accmode; int fd; g_return_val_if_fail(tth, -1); accmode = O_WRONLY | O_TRUNC; pathname = tth_cache_pathname(tth); fd = file_create_missing(pathname, accmode, TTH_FILE_MODE); if (fd < 0 && ENOENT == errno) { char *dir = filepath_directory(pathname); if (0 == create_directory(dir, DEFAULT_DIRECTORY_MODE)) { fd = file_create(pathname, accmode, TTH_FILE_MODE); } HFREE_NULL(dir); } HFREE_NULL(pathname); return fd; }