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; }
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; }