salvage: match scan entries by directory base
All checks were successful
Source release / source-package (push) Successful in 56s
All checks were successful
Source release / source-package (push) Successful in 56s
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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 ||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user