nwconn: support AFP scan from directory entry IDs
All checks were successful
Source release / source-package (push) Successful in 47s

This commit is contained in:
OpenAI
2026-05-31 07:01:14 +00:00
committed by Mario Fetka
parent e90651f9a0
commit ac79fa9d22
7 changed files with 81 additions and 61 deletions

View File

@@ -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 */
}