nwconn: support AFP scan from directory entry IDs
All checks were successful
Source release / source-package (push) Successful in 47s
All checks were successful
Source release / source-package (push) Successful in 47s
This commit is contained in:
39
src/nwconn.c
39
src/nwconn.c
@@ -2413,6 +2413,9 @@ static int afp_scan_file_information(uint8 *afp_req, int afp_len,
|
||||
int volume;
|
||||
char unixname[PATH_MAX];
|
||||
char childname[PATH_MAX];
|
||||
uint8 resolved_path[255];
|
||||
uint8 *scan_path_data;
|
||||
int scan_path_len;
|
||||
uint8 display_path[255];
|
||||
int display_path_len;
|
||||
DIR *dir;
|
||||
@@ -2455,19 +2458,35 @@ static int afp_scan_file_information(uint8 *afp_req, int afp_len,
|
||||
return(-0xbf); /* invalid namespace */
|
||||
}
|
||||
|
||||
if (!path_len) {
|
||||
XDPRINTF((2,0, "%s rejected: entry-id-only scan unsupported vol=%d entry=0x%08x last=0x%08x mask=0x%04x req=0x%04x",
|
||||
call_name, (int)volume_number, request_entry_id, last_seen_id,
|
||||
scan_path_data = afp_req + path_off;
|
||||
scan_path_len = path_len;
|
||||
if (request_entry_id) {
|
||||
result = afp_build_base_relative_path((int)volume_number,
|
||||
request_entry_id,
|
||||
afp_req + path_off, path_len,
|
||||
resolved_path,
|
||||
sizeof(resolved_path));
|
||||
if (result < 0) {
|
||||
XDPRINTF((2,0, "%s entry-id path build failed: vol=%d entry=0x%08x last=0x%08x path='%s' result=-0x%x",
|
||||
call_name, (int)volume_number, request_entry_id, last_seen_id,
|
||||
visable_data(afp_req + path_off, path_len), -result));
|
||||
return(result);
|
||||
}
|
||||
scan_path_data = resolved_path;
|
||||
scan_path_len = result;
|
||||
} else if (!path_len) {
|
||||
XDPRINTF((2,0, "%s rejected: empty path without entry-id vol=%d last=0x%08x mask=0x%04x req=0x%04x",
|
||||
call_name, (int)volume_number, last_seen_id,
|
||||
search_mask, request_mask));
|
||||
return(-0x9c); /* Invalid Path until persistent entry-id lookup exists */
|
||||
return(-0x9c); /* Invalid Path */
|
||||
}
|
||||
|
||||
volume = conn_get_kpl_unxname(unixname, sizeof(unixname), 0,
|
||||
afp_req + path_off, path_len);
|
||||
scan_path_data, scan_path_len);
|
||||
if (volume < 0) {
|
||||
XDPRINTF((2,0, "%s path resolve failed: vol=%d entry=0x%08x last=0x%08x path='%s' result=-0x%x",
|
||||
call_name, (int)volume_number, request_entry_id, last_seen_id,
|
||||
visable_data(afp_req + path_off, path_len), -volume));
|
||||
visable_data(scan_path_data, scan_path_len), -volume));
|
||||
return(volume);
|
||||
}
|
||||
|
||||
@@ -2475,7 +2494,7 @@ static int afp_scan_file_information(uint8 *afp_req, int afp_len,
|
||||
if (!dir) {
|
||||
XDPRINTF((2,0, "%s opendir failed: vol=%d entry=0x%08x last=0x%08x path='%s' unix='%s' errno=%d",
|
||||
call_name, (int)volume_number, request_entry_id, last_seen_id,
|
||||
visable_data(afp_req + path_off, path_len), unixname, errno));
|
||||
visable_data(scan_path_data, scan_path_len), unixname, errno));
|
||||
return(-0x9c); /* Invalid Path */
|
||||
}
|
||||
|
||||
@@ -2501,7 +2520,7 @@ static int afp_scan_file_information(uint8 *afp_req, int afp_len,
|
||||
}
|
||||
|
||||
display_path_len = snprintf((char *)display_path, sizeof(display_path),
|
||||
"%s%c%s", visable_data(afp_req + path_off, path_len),
|
||||
"%s%c%s", visable_data(scan_path_data, scan_path_len),
|
||||
':', de->d_name);
|
||||
if (display_path_len < 0 || display_path_len >= (int)sizeof(display_path)) {
|
||||
display_path_len = strlen(de->d_name);
|
||||
@@ -2521,7 +2540,7 @@ static int afp_scan_file_information(uint8 *afp_req, int afp_len,
|
||||
XDPRINTF((3,0, "%s: vol=%d entry=0x%08x last=0x%08x desired=%u mask=0x%04x req=0x%04x path='%s' count=1 reply_entry=0x%08x%s",
|
||||
call_name, (int)volume_number, request_entry_id, last_seen_id,
|
||||
(unsigned)desired_count, search_mask, request_mask,
|
||||
visable_data(afp_req + path_off, path_len),
|
||||
visable_data(scan_path_data, scan_path_len),
|
||||
entry_id ? entry_id : child_entry_id,
|
||||
(fallback || child_fallback) ? " fallback" : ""));
|
||||
return(2 + result);
|
||||
@@ -2531,7 +2550,7 @@ static int afp_scan_file_information(uint8 *afp_req, int afp_len,
|
||||
XDPRINTF((3,0, "%s completed: vol=%d entry=0x%08x last=0x%08x desired=%u path='%s' no more entries",
|
||||
call_name, (int)volume_number, request_entry_id, last_seen_id,
|
||||
(unsigned)desired_count,
|
||||
visable_data(afp_req + path_off, path_len)));
|
||||
visable_data(scan_path_data, scan_path_len)));
|
||||
return(-0xff); /* No files found / scan complete */
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user