diff options
Diffstat (limited to 'source/smbd/mangle.c')
-rw-r--r-- | source/smbd/mangle.c | 59 |
1 files changed, 56 insertions, 3 deletions
diff --git a/source/smbd/mangle.c b/source/smbd/mangle.c index 8f1490c528d..177a34c9751 100644 --- a/source/smbd/mangle.c +++ b/source/smbd/mangle.c @@ -20,7 +20,6 @@ */ #include "includes.h" -#include "loadparm.h" extern int DEBUGLEVEL; extern int case_default; @@ -90,8 +89,6 @@ BOOL is_8_3(char *fname) if (slash_pos) fname = slash_pos+1; len = strlen(fname); - dot_pos = strchr(fname,'.'); - DEBUG(5,("checking %s for 8.3\n",fname)); if (case_mangle) @@ -122,6 +119,8 @@ BOOL is_8_3(char *fname) /* %%% A nice improvment to name mangling would be to translate filename to ANSI charset on the smb server host */ + dot_pos = strchr(fname,'.'); + { char *p = fname; #ifdef KANJI @@ -510,9 +509,36 @@ void mangle_name_83(char *s) *p++ = 0; while (*p && extlen < 3) { +#ifdef KANJI + if (is_shift_jis (*p)) + { + if (extlen < 2) + { + extension[extlen++] = p[0]; + extension[extlen++] = p[1]; + } + else + { + extension[extlen++] = base36 (((unsigned char) *p) % 36); + } + p += 2; + } + else if (is_kana (*p)) + { + extension[extlen++] = p[0]; + p++; + } + else + { + if (isdoschar (*p) && *p != '.') + extension[extlen++] = p[0]; + p++; + } +#else if (isdoschar(*p) && *p != '.') extension[extlen++] = *p; p++; +#endif /* KANJI */ } extension[extlen] = 0; } @@ -522,9 +548,36 @@ void mangle_name_83(char *s) while (*p && baselen < 5) { +#ifdef KANJI + if (is_shift_jis (*p)) + { + if (baselen < 4) + { + base[baselen++] = p[0]; + base[baselen++] = p[1]; + } + else + { + base[baselen++] = base36 (((unsigned char) *p) % 36); + } + p += 2; + } + else if (is_kana (*p)) + { + base[baselen++] = p[0]; + p++; + } + else + { + if (isdoschar (*p) && *p != '.') + base[baselen++] = p[0]; + p++; + } +#else if (isdoschar(*p) && *p != '.') base[baselen++] = *p; p++; +#endif /* KANJI */ } base[baselen] = 0; |