From e6c5b0e6d7895b6dc1c3acef602799331cca72b9 Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Wed, 20 May 2026 09:12:28 +0200 Subject: [PATCH] namespace fix --- src/namspace.c | 62 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 19 deletions(-) diff --git a/src/namspace.c b/src/namspace.c index fb85c62..26bb243 100644 --- a/src/namspace.c +++ b/src/namspace.c @@ -1518,19 +1518,49 @@ static int search_match(struct dirent *dirbuff, XDPRINTF((8,0,"search_match, Name='%s' dname='%s'", name, dname)); if (!inode_search) { if (namespace == NAME_DOS) { - XDPRINTF((2,0, - "NS search_match DOS entry='%s' raw='%s' dname='%s' namespace=%d", - entry, - name, - dname, - namespace)); - flag = (*name != '.' && fn_dos_match_old(dname, entry, vol_options)); - XDPRINTF((2,0, - "NS search_match DOS result=%d entry='%s' raw='%s' dname='%s'", - flag, - entry, - name, - dname)); + char saved_dir[1024]; + char *slash; + + if (*name == '.') { + flag = 0; + } else { + /* + * For DOS namespace searches, build the DOS-visible alias first, + * then keep using the historical namespace matcher. The old matcher + * understands the special 0xff-prefixed wildcard patterns used by + * namespace search requests, while the regular DOS matcher does not. + */ + strncpy(saved_dir, (char *)ds->unixname, sizeof(saved_dir) - 1); + saved_dir[sizeof(saved_dir) - 1] = '\0'; + + slash = strrchr(saved_dir, '/'); + if (slash) + *slash = '\0'; + else + strcpy(saved_dir, "."); + + dos83_build_name_in_dir(saved_dir, + name, + dname, + size_dname, + vol_options); + + XDPRINTF((2,0, + "NS search_match DOS alias entry='%s' raw='%s' alias='%s' namespace=%d", + entry, + name, + dname, + namespace)); + + flag = fn_dos_match_old(dname, entry, vol_options); + + XDPRINTF((2,0, + "NS search_match DOS alias result=%d entry='%s' raw='%s' alias='%s'", + flag, + entry, + name, + dname)); + } } else if (namespace == NAME_OS2) { flag = (*name != '.' || (*(name+1) != '.' && *(name+1) != '\0' )) && fn_os2_match(dname, entry, vol_options); @@ -1705,12 +1735,6 @@ int nw_search_file_dir(int namespace, int datastream, XDPRINTF((5,0,"nw_s_f_d namsp=%d, sequence=%d, search='%s'", namespace, sequence, entry )); - XDPRINTF((2,0, - "NS nw_search_file_dir namespace=%d sequence=%d search='%s' vol_options=0x%x", - namespace, - sequence, - entry, - vol_options)); if ( (!sequence) || (sequence != dsh->lastsequence)) { XDPRINTF((5, 0, "dirpos set to 0 dsh->lastsequence = %d, dirpos=%d",