salvage: match scan entries by directory base
All checks were successful
Source release / source-package (push) Successful in 56s

This commit is contained in:
Test
2026-05-31 18:12:55 +00:00
committed by Mario Fetka
parent cb0967c7e1
commit e47a745d0b
3 changed files with 18 additions and 51 deletions

View File

@@ -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,

View File

@@ -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 ||

View File

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