int bd_hardlink(const char *pPathExistant, const char *pPathNouveauLien) { int existingFileiNode = find_iNode(pPathExistant); if (existingFileiNode == -1) { return -1; } // We check if the directory that will contain the new hardlink exists char newLinkPath[strlen(pPathNouveauLien)]; GetDirFromPath(pPathNouveauLien, newLinkPath); int newLinkPathiNode = find_iNode(newLinkPath); if (newLinkPathiNode == -1) { return -1; } // We check that the new hardlink doesn't already exists int newLinkExists = find_iNode(pPathNouveauLien); if (newLinkExists != -1) { return -2; } char linkName[strlen(pPathNouveauLien)]; GetFilenameFromPath(pPathNouveauLien, linkName); int isSuccess = create_hardlink(existingFileiNode, newLinkPathiNode, linkName); return isSuccess; }
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; }