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);