static int test_path_exists (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1, * path2; path1 = tr_buildPath (test_dir, "a", NULL); path2 = tr_buildPath (test_dir, "b", NULL); /* Non-existent file does not exist */ check (!tr_sys_path_exists (path1, &err)); check (err == NULL); /* Create file and see that it exists */ libtest_create_file_with_string_contents (path1, "test"); check (tr_sys_path_exists (path1, &err)); check (err == NULL); tr_sys_path_remove (path1, NULL); /* Create directory and see that it exists */ tr_sys_dir_create (path1, 0, 0777, NULL); check (tr_sys_path_exists (path1, &err)); check (err == NULL); tr_sys_path_remove (path1, NULL); if (create_symlink (path1, path2, false)) { /* Non-existent file does not exist (via symlink) */ check (!tr_sys_path_exists (path1, &err)); check (err == NULL); /* Create file and see that it exists (via symlink) */ libtest_create_file_with_string_contents (path2, "test"); check (tr_sys_path_exists (path1, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); /* Create directory and see that it exists (via symlink) */ tr_sys_dir_create (path2, 0, 0777, NULL); check (tr_sys_path_exists (path1, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); tr_sys_path_remove (path1, NULL); } else { fprintf (stderr, "WARNING: [%s] unable to run symlink tests\n", __FUNCTION__); } tr_free (path2); tr_free (path1); tr_free (test_dir); return 0; }
void tr_torrentRemoveResume (const tr_torrent * tor) { char * filename = getResumeFilename (tor); tr_sys_path_remove (filename, NULL); tr_free (filename); }
static void rm_rf (const char * killme) { tr_sys_path_info info; if (tr_sys_path_get_info (killme, 0, &info, NULL)) { tr_sys_dir_t odir; if (info.type == TR_SYS_PATH_IS_DIRECTORY && (odir = tr_sys_dir_open (killme, NULL)) != TR_BAD_SYS_DIR) { const char * name; while ((name = tr_sys_dir_read_name (odir, NULL)) != NULL) { if (strcmp (name, ".") != 0 && strcmp (name, "..") != 0) { char * tmp = tr_buildPath (killme, name, NULL); rm_rf (tmp); tr_free (tmp); } } tr_sys_dir_close (odir, NULL); } if (verbose) fprintf (stderr, "cleanup: removing %s\n", killme); tr_sys_path_remove (killme, NULL); } }
static tr_watchdir_status onFileAdded(tr_watchdir_t dir, char const* name, void* context) { tr_session* session = context; if (!tr_str_has_suffix(name, ".torrent")) { return TR_WATCHDIR_IGNORE; } char* filename = tr_buildPath(tr_watchdir_get_path(dir), name, NULL); tr_ctor* ctor = tr_ctorNew(session); int err = tr_ctorSetMetainfoFromFile(ctor, filename); if (err == 0) { tr_torrentNew(ctor, &err, NULL); if (err == TR_PARSE_ERR) { tr_logAddError("Error parsing .torrent file \"%s\"", name); } else { bool trash = false; bool const test = tr_ctorGetDeleteSource(ctor, &trash); tr_logAddInfo("Parsing .torrent file successful \"%s\"", name); if (test && trash) { tr_error* error = NULL; tr_logAddInfo("Deleting input .torrent file \"%s\"", name); if (!tr_sys_path_remove(filename, &error)) { tr_logAddError("Error deleting .torrent file: %s", error->message); tr_error_free(error); } } else { char* new_filename = tr_strdup_printf("%s.added", filename); tr_sys_path_rename(filename, new_filename, NULL); tr_free(new_filename); } } } else { err = TR_PARSE_ERR; } tr_ctorFree(ctor); tr_free(filename); return err == TR_PARSE_ERR ? TR_WATCHDIR_RETRY : TR_WATCHDIR_ACCEPT; }
static int test_path_resolve (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1, * path2; path1 = tr_buildPath (test_dir, "a", NULL); path2 = tr_buildPath (test_dir, "b", NULL); libtest_create_file_with_string_contents (path1, "test"); if (create_symlink (path2, path1, false)) { char * tmp; tmp = tr_sys_path_resolve (path2, &err); check (tmp != NULL); check (err == NULL); check (path_contains_no_symlinks (tmp)); tr_free (tmp); tr_sys_path_remove (path1, NULL); tr_sys_dir_create (path1, 0, 0755, NULL); tmp = tr_sys_path_resolve (path2, &err); check (tmp != NULL); check (err == NULL); check (path_contains_no_symlinks (tmp)); tr_free (tmp); } else { fprintf (stderr, "WARNING: [%s] unable to run symlink tests\n", __FUNCTION__); } tr_sys_path_remove (path2, NULL); tr_sys_path_remove (path1, NULL); tr_free (path2); tr_free (path1); tr_free (test_dir); return 0; }
static void blocklistDelete (tr_blocklistFile * b) { blocklistClose (b); tr_sys_path_remove (b->filename, NULL); }
static int test_path_is_same (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1, * path2, * path3; path1 = tr_buildPath (test_dir, "a", NULL); path2 = tr_buildPath (test_dir, "b", NULL); path3 = tr_buildPath (path2, "c", NULL); /* Two non-existent files are not the same */ check (!tr_sys_path_is_same (path1, path1, &err)); check (err == NULL); check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); /* Two same files are the same */ libtest_create_file_with_string_contents (path1, "test"); check (tr_sys_path_is_same (path1, path1, &err)); check (err == NULL); /* Existent and non-existent files are not the same */ check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); check (!tr_sys_path_is_same (path2, path1, &err)); check (err == NULL); /* Two separate files (even with same content) are not the same */ libtest_create_file_with_string_contents (path2, "test"); check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); tr_sys_path_remove (path1, NULL); /* Two same directories are the same */ tr_sys_dir_create (path1, 0, 0777, NULL); check (tr_sys_path_is_same (path1, path1, &err)); check (err == NULL); /* File and directory are not the same */ check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); check (!tr_sys_path_is_same (path2, path1, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); /* Two separate directories are not the same */ tr_sys_dir_create (path2, 0, 0777, NULL); check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); tr_sys_path_remove (path1, NULL); tr_sys_path_remove (path2, NULL); if (create_symlink (path1, ".", true)) { /* Directory and symlink pointing to it are the same */ check (tr_sys_path_is_same (path1, test_dir, &err)); check (err == NULL); check (tr_sys_path_is_same (test_dir, path1, &err)); check (err == NULL); /* Non-existent file and symlink are not the same */ check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); check (!tr_sys_path_is_same (path2, path1, &err)); check (err == NULL); /* Symlinks pointing to different directories are not the same */ create_symlink (path2, "..", true); check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); check (!tr_sys_path_is_same (path2, path1, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); /* Symlinks pointing to same directory are the same */ create_symlink (path2, ".", true); check (tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); /* Directory and symlink pointing to another directory are not the same */ tr_sys_dir_create (path2, 0, 0777, NULL); check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); check (!tr_sys_path_is_same (path2, path1, &err)); check (err == NULL); /* Symlinks pointing to same directory are the same */ create_symlink (path3, "..", true); check (tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); tr_sys_path_remove (path1, NULL); /* File and symlink pointing to directory are not the same */ libtest_create_file_with_string_contents (path1, "test"); check (!tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); check (!tr_sys_path_is_same (path3, path1, &err)); check (err == NULL); tr_sys_path_remove (path3, NULL); /* File and symlink pointing to same file are the same */ create_symlink (path3, path1, false); check (tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); check (tr_sys_path_is_same (path3, path1, &err)); check (err == NULL); /* Symlinks pointing to non-existent files are not the same */ tr_sys_path_remove (path1, NULL); create_symlink (path1, "missing", false); tr_sys_path_remove (path3, NULL); create_symlink (path3, "missing", false); check (!tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); check (!tr_sys_path_is_same (path3, path1, &err)); check (err == NULL); tr_sys_path_remove (path3, NULL); /* Symlinks pointing to same non-existent file are not the same */ create_symlink (path3, ".." NATIVE_PATH_SEP "missing", false); check (!tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); check (!tr_sys_path_is_same (path3, path1, &err)); check (err == NULL); /* Non-existent file and symlink pointing to non-existent file are not the same */ tr_sys_path_remove (path3, NULL); check (!tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); check (!tr_sys_path_is_same (path3, path1, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); tr_sys_path_remove (path1, NULL); } else { fprintf (stderr, "WARNING: [%s] unable to run symlink tests\n", __FUNCTION__); } tr_free (path3); path3 = tr_buildPath (test_dir, "c", NULL); libtest_create_file_with_string_contents (path1, "test"); if (create_hardlink (path2, path1)) { /* File and hardlink to it are the same */ check (tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); /* Two hardlinks to the same file are the same */ create_hardlink (path3, path2); check (tr_sys_path_is_same (path2, path3, &err)); check (err == NULL); check (tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); check (tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); tr_sys_path_remove (path3, NULL); /* File and hardlink to another file are not the same */ libtest_create_file_with_string_contents (path3, "test"); create_hardlink (path2, path3); check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); check (!tr_sys_path_is_same (path2, path1, &err)); check (err == NULL); tr_sys_path_remove (path3, NULL); tr_sys_path_remove (path2, NULL); } else { fprintf (stderr, "WARNING: [%s] unable to run hardlink tests\n", __FUNCTION__); } if (create_symlink (path2, path1, false) && create_hardlink (path3, path1)) { check (tr_sys_path_is_same (path2, path3, &err)); check (err == NULL); } else { fprintf (stderr, "WARNING: [%s] unable to run combined symlink and hardlink tests\n", __FUNCTION__); } tr_sys_path_remove (path3, NULL); tr_sys_path_remove (path2, NULL); tr_sys_path_remove (path1, NULL); tr_free (path3); tr_free (path2); tr_free (path1); tr_free (test_dir); return 0; }
static int test_get_info (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_sys_path_info info; tr_sys_file_t fd; tr_error * err = NULL; char * path1, * path2; time_t t; path1 = tr_buildPath (test_dir, "a", NULL); path2 = tr_buildPath (test_dir, "b", NULL); /* Can't get info of non-existent file/directory */ check (!tr_sys_path_get_info (path1, 0, &info, &err)); check (err != NULL); tr_error_clear (&err); t = time (NULL); libtest_create_file_with_string_contents (path1, "test"); /* Good file info */ clear_path_info (&info); check (tr_sys_path_get_info (path1, 0, &info, &err)); check (err == NULL); check_int_eq (TR_SYS_PATH_IS_FILE, info.type); check_int_eq (4, info.size); check (info.last_modified_at >= t && info.last_modified_at <= time (NULL)); /* Good file info (by handle) */ fd = tr_sys_file_open (path1, TR_SYS_FILE_READ, 0, NULL); clear_path_info (&info); check (tr_sys_file_get_info (fd, &info, &err)); check (err == NULL); check_int_eq (TR_SYS_PATH_IS_FILE, info.type); check_int_eq (4, info.size); check (info.last_modified_at >= t && info.last_modified_at <= time (NULL)); tr_sys_file_close (fd, NULL); tr_sys_path_remove (path1, NULL); /* Good directory info */ t = time (NULL); tr_sys_dir_create (path1, 0, 0777, NULL); clear_path_info (&info); check (tr_sys_path_get_info (path1, 0, &info, &err)); check (err == NULL); check_int_eq (TR_SYS_PATH_IS_DIRECTORY, info.type); check (info.size != (uint64_t) -1); check (info.last_modified_at >= t && info.last_modified_at <= time (NULL)); tr_sys_path_remove (path1, NULL); if (create_symlink (path1, path2, false)) { /* Can't get info of non-existent file/directory */ check (!tr_sys_path_get_info (path1, 0, &info, &err)); check (err != NULL); tr_error_clear (&err); t = time (NULL); libtest_create_file_with_string_contents (path2, "test"); /* Good file info */ clear_path_info (&info); check (tr_sys_path_get_info (path1, 0, &info, &err)); check (err == NULL); check_int_eq (TR_SYS_PATH_IS_FILE, info.type); check_int_eq (4, info.size); check (info.last_modified_at >= t && info.last_modified_at <= time (NULL)); /* Good file info (by handle) */ fd = tr_sys_file_open (path1, TR_SYS_FILE_READ, 0, NULL); clear_path_info (&info); check (tr_sys_file_get_info (fd, &info, &err)); check (err == NULL); check_int_eq (TR_SYS_PATH_IS_FILE, info.type); check_int_eq (4, info.size); check (info.last_modified_at >= t && info.last_modified_at <= time (NULL)); tr_sys_file_close (fd, NULL); tr_sys_path_remove (path2, NULL); /* Good directory info */ t = time (NULL); tr_sys_dir_create (path2, 0, 0777, NULL); clear_path_info (&info); check (tr_sys_path_get_info (path1, 0, &info, &err)); check (err == NULL); check_int_eq (TR_SYS_PATH_IS_DIRECTORY, info.type); check (info.size != (uint64_t) -1); check (info.last_modified_at >= t && info.last_modified_at <= time (NULL)); tr_sys_path_remove (path2, NULL); tr_sys_path_remove (path1, NULL); } else { fprintf (stderr, "WARNING: [%s] unable to run symlink tests\n", __FUNCTION__); } tr_free (path2); tr_free (path1); tr_free (test_dir); return 0; }