tools: add shared parent path helper

Move the common parent path extraction helper into tools.c and declare it in
net.h.

Replace the local implementations in RIGHTS, NDIR and NWTESTS with
tool_parent_path(). The helper keeps the existing behavior of uppercasing the
path and preserving a trailing volume colon for parent paths such as SYS:.

No behavior change.
This commit is contained in:
Mario Fetka
2026-05-29 12:46:13 +02:00
parent 3a55cc9fc0
commit b6bdbf958f
5 changed files with 35 additions and 70 deletions

22
ndir.c
View File

@@ -467,26 +467,6 @@ static int ndir_attr_filter_match(uint32 attr, int options)
return(match);
}
static void ndir_parent_path(char *dst, char *src, int max)
{
char tmp[260];
char *p;
tool_upcopy(tmp, src, sizeof(tmp));
p = strrchr(tmp, '\\');
if (!p) p = strrchr(tmp, ':');
if (p) {
if (*p == ':') {
p[1] = '\0';
} else {
*p = '\0';
}
strmaxcpy(dst, tmp, max - 1);
} else {
dst[0] = '\0';
}
}
static void ndir_old_rights_string(uint8 old_rights, char *out)
{
@@ -627,7 +607,7 @@ static void ndir_effective_rights(char *path, char *out)
return;
}
ndir_parent_path(usepath, path, sizeof(usepath));
tool_parent_path(usepath, path, sizeof(usepath));
newhandle = alloc_temp_dir_handle(dhandle, usepath, 0, &eff_old);
if (newhandle >= 0) {
dealloc_dir_handle(newhandle);

1
net.h
View File

@@ -166,6 +166,7 @@ extern void tool_header_path(char *out, char *path, int max);
extern int tool_is_dot_dir(char *name);
extern void tool_join_path(char *out, char *base, char *name, int max);
extern int tool_has_wildcards(char *path);
extern void tool_parent_path(char *dst, char *src, int max);
extern void tool_parent_pattern(char *dir, char *pattern, char *path,
int maxdir, int maxpat);

View File

@@ -91,29 +91,6 @@ static void tests_mask_string(uint8 mask, char *out)
out[8] = '\0';
}
static void tests_parent_path(char *dst, char *src, int max)
{
char tmp[260];
char *p;
tool_upcopy(tmp, src, sizeof(tmp));
p = strrchr(tmp, '\\');
if (!p) p = strrchr(tmp, ':');
if (!p) {
dst[0] = '\0';
return;
}
if (*p == ':') {
p++;
*p = '\0';
} else {
*p = '\0';
}
strmaxcpy(dst, tmp, max - 1);
}
static void tests_print_mask(char *label, int rc, uint8 mask)
{
@@ -2575,7 +2552,7 @@ static int tests_effright(char *path)
tests_print_eff_row("old handle path", newhandle, 0, 0, 0);
}
tests_parent_path(usepath, path, sizeof(usepath));
tool_parent_path(usepath, path, sizeof(usepath));
newhandle = alloc_temp_dir_handle(dhandle, usepath, 0, &eff_old);
if (newhandle >= 0) {
dealloc_dir_handle(newhandle);

View File

@@ -63,30 +63,6 @@ static void rights_usage(void)
fprintf(stdout, " | Modify | File scan | Access Control\n");
}
static void rights_parent_path(char *dst, char *src, int max)
{
char tmp[260];
char *p;
tool_upcopy(tmp, src, sizeof(tmp));
p = strrchr(tmp, '\\');
if (!p) p = strrchr(tmp, ':');
if (!p) {
dst[0] = '\0';
return;
}
if (*p == ':') {
p++;
*p = '\0';
} else {
*p = '\0';
}
strmaxcpy(dst, tmp, max - 1);
}
static void rights_ncp_path(char *dst, char *src, int max)
{
@@ -184,7 +160,7 @@ static int rights_effective_mask(char *path, int is_dir, uint8 *mask)
} else {
char npath[260];
rights_ncp_path(npath, path, sizeof(npath));
rights_parent_path(usepath, npath, sizeof(usepath));
tool_parent_path(usepath, npath, sizeof(usepath));
}
newhandle = alloc_temp_dir_handle(dhandle, usepath, 0, &eff);

31
tools.c
View File

@@ -998,6 +998,37 @@ int tool_has_wildcards(char *path)
return(0);
}
/*
* tool_parent_path
*
* Purpose:
* Copies the parent directory part of a DOS/NetWare path. The result is
* uppercased and keeps a trailing volume colon for paths like SYS:FILE.TXT.
*/
void tool_parent_path(char *dst, char *src, int max)
{
char tmp[260];
char *p;
tool_upcopy(tmp, src, sizeof(tmp));
p = strrchr(tmp, '\\');
if (!p) p = strrchr(tmp, ':');
if (!p) {
dst[0] = '\0';
return;
}
if (*p == ':') {
p++;
*p = '\0';
} else {
*p = '\0';
}
strmaxcpy(dst, tmp, max - 1);
}
/*
* tool_parent_pattern
*