From 372288926dfa155a2c99667469cdd8a9afb7458b Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Wed, 20 May 2026 15:25:52 +0200 Subject: [PATCH] namedos: add initial DOS long-name alias support Add the initial DOS namespace alias layer for long Unix filenames. This introduces DOS 8.3 alias generation and path component resolution so DOS clients can address files whose real Unix names are not DOS-compatible. --- include/connect.h | 1 + include/namedos.h | 1 - src/connect.c | 16 ++++++++-------- src/namedos.c | 12 ++++++------ src/namspace.c | 3 +-- 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/include/connect.h b/include/connect.h index c64a44c..d566594 100644 --- a/include/connect.h +++ b/include/connect.h @@ -257,6 +257,7 @@ extern time_t nw_2_un_time(uint8 *d, uint8 *t); extern void un_time_2_nw(time_t time, uint8 *d, int high_low); +extern void mangle_dos_name(NW_VOL *vol, uint8 *unixname, uint8 *pp, int len); extern int nw_add_trustee(int dir_handle, uint8 *data, int len, uint32 id, int trustee, int extended); diff --git a/include/namedos.h b/include/namedos.h index 76d6976..5c68b20 100644 --- a/include/namedos.h +++ b/include/namedos.h @@ -10,7 +10,6 @@ extern int build_dos_83_alias(int options, uint8 *parent_unix, uint8 *real_name, ino_t inode, uint8 *alias, int alias_len); extern void mangle_dos_name(NW_VOL *vol, uint8 *unixname, uint8 *pp, int len); -extern int fn_dos_match(uint8 *s, uint8 *p, int soptions); #endif #endif diff --git a/src/connect.c b/src/connect.c index fd5fb81..749ae8c 100644 --- a/src/connect.c +++ b/src/connect.c @@ -60,6 +60,12 @@ static int act_umode_file=0; #include "namspace.h" #include "connect.h" +/* connect.h may already be include-guarded through another header before + * NW_VOL is visible, so keep this local forward declaration before the + * first call in build_dir_name(). + */ +void mangle_dos_name(NW_VOL *vol, uint8 *unixname, uint8 *pp, int len); + typedef struct { dev_t dev; /* unix dev */ @@ -1052,7 +1058,7 @@ static int build_dir_name(NW_PATH *nwpath, /* gets complete path */ dos2unixcharset(pp); pp += offset; pathlen -= offset; - mangle_dos_name(v, unixname, pp); + mangle_dos_name(v, unixname, pp, sizeof(unixname) - (int)(pp - unixname)); unix2doscharset(pp); XDPRINTF((5, 0, "Mangled DOS/unixname=%s", unixname)); memcpy(ppp, pp, pathlen); @@ -2679,13 +2685,7 @@ static int get_match(uint8 *unixname, uint8 *p) return(0); } -void mangle_dos_name(NW_VOL *vol, uint8 *unixname, uint8 *pp) -{ - struct stat stb; - if (!s_stat(unixname, &stb, NULL)) /* path is ok I hope */ - return; - get_match(unixname, pp-1); -} +/* DOS name mangling is provided by namedos.c. */ int nw_add_trustee(int dir_handle, uint8 *data, int len, diff --git a/src/namedos.c b/src/namedos.c index ae148d0..2aa6b03 100644 --- a/src/namedos.c +++ b/src/namedos.c @@ -224,7 +224,8 @@ void mangle_dos_name(NW_VOL *vol, uint8 *unixname, uint8 *pp, int len) uint8 *parent_slash; DIR *d; - if (!vol || !unixname || !pp || !*pp || len <= 1) return; + if (!vol || !unixname || !pp || !*pp) return; + if (len <= 1) return; slash=(uint8*)strchr((char*)pp, '/'); memset(rest, 0, sizeof(rest)); @@ -255,8 +256,7 @@ void mangle_dos_name(NW_VOL *vol, uint8 *unixname, uint8 *pp, int len) if (*rest) { uint8 *next=(uint8*)strchr((char*)pp, '/'); if (next && *(next+1)) - mangle_dos_name(vol, unixname, next+1, - len - (int)((next+1)-pp)); + mangle_dos_name(vol, unixname, next+1, len - (int)((next+1) - pp)); } return; } @@ -294,7 +294,7 @@ static inline int get_n_p(uint8 **p) return(pc); } -int fn_dos_match(uint8 *s, uint8 *p, int soptions) +static int ns_fn_dos_match(uint8 *s, uint8 *p, int soptions) /* OS/2 name matching routine */ { int pc, sc; @@ -329,7 +329,7 @@ int fn_dos_match(uint8 *s, uint8 *p, int soptions) int np; if (!*p) return(1); /* last star */ while (*s) { - if (fn_dos_match(s, p, soptions) == 1) return(1); + if (ns_fn_dos_match(s, p, soptions) == 1) return(1); else if (*s=='.') { pp=p; if (!get_n_p(&p) || !get_n_p(&p)) @@ -342,7 +342,7 @@ int fn_dos_match(uint8 *s, uint8 *p, int soptions) np=get_n_p(&p); p=pp; if (np == '.' || np == 1000) - return(fn_dos_match(s, p, soptions)); + return(ns_fn_dos_match(s, p, soptions)); } return(0); diff --git a/src/namspace.c b/src/namspace.c index 3659b0e..6a2832e 100644 --- a/src/namspace.c +++ b/src/namspace.c @@ -655,8 +655,7 @@ leave_build_nwpath: else up_fn(pp); - mangle_dos_name(v, unixname, pp, - sizeof(unixname)-v->unixnamlen-npbeg); + mangle_dos_name(v, unixname, pp, sizeof(unixname)-v->unixnamlen-npbeg); if (nplen > 0) { unix2doscharset(pp);