diff --git a/include/nwsalvage.h b/include/nwsalvage.h index 3578d02..f31b836 100644 --- a/include/nwsalvage.h +++ b/include/nwsalvage.h @@ -197,7 +197,8 @@ int nwsalvage_read_metadata(const char *metadata_path, * 0xffffffff for the first call, then the previously returned * scan_sequence for subsequent calls. */ -int nwsalvage_scan_directory(int volume, const char *unix_directory, +int nwsalvage_scan_directory(int volume, const char *relative_dir, + unsigned long directory_base, unsigned long scan_sequence, struct nwsalvage_scan_result *result); int nwsalvage_recover_scan_result(int volume, diff --git a/src/namspace.c b/src/namspace.c index 1059f27..350509b 100644 --- a/src/namspace.c +++ b/src/namspace.c @@ -2784,7 +2784,6 @@ int handle_func_0x57_salvage_scan(uint8 *q, int request_len, NW_HPATH *nwpathstruct; int result; DIR_BASE_ENTRY *dbe; - char *unixname; struct nwsalvage_scan_result scan; uint8 *p = responsedata; @@ -2808,14 +2807,10 @@ int handle_func_0x57_salvage_scan(uint8 *q, int request_len, if (!S_ISDIR(dbe->nwpath.statb.st_mode)) return(-0x9c); - unixname = alloc_nwpath2unix(&(dbe->nwpath), 2); - if (!unixname) - return(-0x96); - memset(&scan, 0, sizeof(scan)); - result = nwsalvage_scan_directory(dbe->nwpath.volume, unixname, - scan_sequence, &scan); - xfree(unixname); + result = nwsalvage_scan_directory(dbe->nwpath.volume, + (char *)dbe->nwpath.path, + dbe->basehandle, scan_sequence, &scan); if (result < 0) return(-0x98); if (result == 0) @@ -2850,7 +2845,6 @@ int handle_func_0x57_salvage_recover(uint8 *q, int request_len, unsigned long previous_sequence; int result; DIR_BASE_ENTRY *dbe; - char *directory_unixname; char *dest_unixname; struct nwsalvage_scan_result scan; @@ -2888,15 +2882,10 @@ int handle_func_0x57_salvage_recover(uint8 *q, int request_len, if (!S_ISDIR(dbe->nwpath.statb.st_mode)) return(-0x9c); - directory_unixname = alloc_nwpath2unix(&(dbe->nwpath), 2); - if (!directory_unixname) - return(-0x96); - memset(&scan, 0, sizeof(scan)); previous_sequence = scan_sequence ? scan_sequence - 1 : 0xffffffffUL; - result = nwsalvage_scan_directory((int)volume, directory_unixname, - previous_sequence, &scan); - xfree(directory_unixname); + result = nwsalvage_scan_directory((int)volume, (char *)dbe->nwpath.path, + directory_base, previous_sequence, &scan); if (result < 0) return(-0x98); if (result == 0 || scan.scan_sequence != scan_sequence || diff --git a/src/nwsalvage.c b/src/nwsalvage.c index 64542cf..09021f0 100644 --- a/src/nwsalvage.c +++ b/src/nwsalvage.c @@ -1821,43 +1821,22 @@ static int nwsalvage_path_join(char *out, size_t out_len, static int nwsalvage_metadata_dir_matches(const struct nwsalvage_metadata_entry *entry, const char *volume_name, - const char *relative_dir) + unsigned long directory_base) { - const char *colon; - const char *rel; - const char *slash; - size_t dir_len; - - if (!entry || !volume_name || !relative_dir) + if (!entry || !volume_name) return(0); - colon = strchr(entry->original_path, ':'); - if (!colon) - return(0); - if ((size_t)(colon - entry->original_path) != strlen(volume_name) || - strncasecmp(entry->original_path, volume_name, - (size_t)(colon - entry->original_path)) != 0) + if (strcasecmp(entry->volume_name, volume_name) != 0) return(0); - rel = colon + 1; - slash = strrchr(rel, '/'); - if (!slash) - dir_len = 0; - else - dir_len = (size_t)(slash - rel); - - if (!*relative_dir) - return(dir_len == 0); - - return(strlen(relative_dir) == dir_len && - strncasecmp(rel, relative_dir, dir_len) == 0); + return(entry->original_parent_entry_id == directory_base); } static int nwsalvage_scan_metadata_dir(const char *metadata_dir, const struct nwsalvage_config *config, const char *volume_root, const char *volume_name, - const char *relative_dir, + unsigned long directory_base, unsigned long start_index, unsigned long *match_index, struct nwsalvage_scan_result *result) @@ -1888,7 +1867,7 @@ static int nwsalvage_scan_metadata_dir(const char *metadata_dir, memset(&entry, 0, sizeof(entry)); if (nwsalvage_read_metadata(metadata_path, &entry) < 0) continue; - if (!nwsalvage_metadata_dir_matches(&entry, volume_name, relative_dir)) + if (!nwsalvage_metadata_dir_matches(&entry, volume_name, directory_base)) continue; if (*match_index < start_index) { @@ -1917,13 +1896,13 @@ static int nwsalvage_scan_metadata_dir(const char *metadata_dir, return(found); } -int nwsalvage_scan_directory(int volume, const char *unix_directory, +int nwsalvage_scan_directory(int volume, const char *relative_dir, + unsigned long directory_base, unsigned long scan_sequence, struct nwsalvage_scan_result *result) { struct nwsalvage_config config; char volume_root[NWSALVAGE_PATH_MAX]; - char relative_dir[NWSALVAGE_PATH_MAX]; char metadata_root[NWSALVAGE_PATH_MAX]; char volume_name[NWSALVAGE_REPOSITORY_NAME_MAX]; unsigned long start_index; @@ -1932,7 +1911,7 @@ int nwsalvage_scan_directory(int volume, const char *unix_directory, struct dirent *de; int found = 0; - if (!unix_directory || !result) { + if (!relative_dir || !result) { errno = EINVAL; return(-1); } @@ -1942,9 +1921,7 @@ int nwsalvage_scan_directory(int volume, const char *unix_directory, if (!config.enabled) return(0); - if (nwsalvage_copy_volume_root(volume, volume_root, sizeof(volume_root)) < 0 || - nwsalvage_relative_from_unix(volume, unix_directory, - relative_dir, sizeof(relative_dir)) < 0) + if (nwsalvage_copy_volume_root(volume, volume_root, sizeof(volume_root)) < 0) return(-1); if (nw_get_volume_name(volume, (uint8 *)volume_name, @@ -1983,7 +1960,7 @@ int nwsalvage_scan_directory(int volume, const char *unix_directory, } found = nwsalvage_scan_metadata_dir(scan_dir, &config, volume_root, - volume_name, relative_dir, + volume_name, directory_base, start_index, &match_index, result); if (found != 0) break;