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.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user