lets try the new mangling code
authorSimo Sorce <idra@samba.org>
Mon, 22 Oct 2001 06:53:28 +0000 (06:53 +0000)
committerSimo Sorce <idra@samba.org>
Mon, 22 Oct 2001 06:53:28 +0000 (06:53 +0000)
all the calls go through a compatibility interface will
change that soon
a new mangle.tdb file will be set in the lock directory
it contains a static mapping longname<->manglename

source/smbd/mangle.c
source/smbd/server.c

index 7139cb7f44b921a38d07c08ae7e21db362e76eca..1e00b04b0be133723d81adcc2e411105af37a70f 100644 (file)
@@ -113,7 +113,7 @@ extern BOOL case_mangle;    /* If true, all chars in 8.3 should be same case. */
 char magic_char = '~';
 
 
-#if 1
+#if 0
 
 
 
@@ -999,7 +999,7 @@ BOOL name_map_mangle(char *OutName, BOOL need83, BOOL cache83, int snum)
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-#if 0
+#if 1
 
 #define MANGLE_TDB_VERSION             "20010927"
 #define MANGLE_TDB_FILE_NAME           "mangle.tdb"
@@ -1451,6 +1451,10 @@ BOOL is_mangled(char *s)
        size_t u2len;
        BOOL ret = False;
        
+       DEBUG(10,("is_mangled: testing -> [%s]\n", s));
+       
+       if (!s || !*s) return False;
+       
        u2len = (strlen(s) + 1) * sizeof(smb_ucs2_t);
        u2 = (smb_ucs2_t *)malloc(u2len);
        if (!u2)
@@ -1459,11 +1463,12 @@ BOOL is_mangled(char *s)
                return ret;
        }
        dos_to_ucs2(u2, s, u2len);
-       
+
        res = unmangle(u2);
        if (res) ret = True;
        SAFE_FREE(res);
        SAFE_FREE(u2);
+       DEBUG(10,("is_mangled: returning -> %s\n", ret?"True":"False"));
        return ret;
 }
 
@@ -1471,9 +1476,15 @@ BOOL is_8_3(char *fname, BOOL check_case)
 {
        smb_ucs2_t *u2, *pref = 0, *ext = 0;
        char *s1 = 0, *s2;
-       size_t u2len;
+       size_t u2len, plen;
        BOOL ret = False;
 
+       DEBUG(10,("is_8_3: testing -> [%s]\n", fname));
+       
+       if (!fname || !*fname) return False;
+
+       if (strcmp(fname, ".") == 0 || strcmp(fname, "..") == 0) return True;
+
        u2len = (strlen(fname) + 1) * sizeof(smb_ucs2_t);
        u2 = (smb_ucs2_t *)malloc(u2len);
        if (!u2)
@@ -1492,7 +1503,12 @@ BOOL is_8_3(char *fname, BOOL check_case)
        
 
        if (!mangle_get_prefix(u2, &pref, &ext)) goto done;
-       if (strlen_w(pref) > 8) goto done;
+       plen = strlen_w(pref);
+       if (plen < 1 || plen > 8) goto done;
+       if (ext)
+               if (strlen_w(ext) > 3) goto done;
+       
+       DEBUG(10,("pref len = %d, ext len = %d\n", pref?strlen_w(pref):0, ext?strlen_w(ext):0));
 
        ucs2_to_dos(s1, u2, u2len);
        ucs2_to_dos83(s2, u2, u2len);
@@ -1505,6 +1521,9 @@ done:
        SAFE_FREE(s1);
        SAFE_FREE(pref);
        SAFE_FREE(ext);
+
+       DEBUG(10,("is_8_3: returning -> %s\n", ret?"True":"False"));
+       return ret;     
 }
 
 void reset_mangled_cache(void)
@@ -1519,6 +1538,9 @@ BOOL check_mangled_cache(char *s)
        BOOL ret = False;
        
        DEBUG(10,("check_mangled_cache: I'm so ugly, please remove me!\n"));
+       DEBUG(10,("check_mangled_cache: testing -> [%s]\n", s));
+
+       if (!s || !*s) return False;
 
        slen = strlen(s);
        u2len = (slen + 1) * sizeof(smb_ucs2_t);
@@ -1533,11 +1555,13 @@ BOOL check_mangled_cache(char *s)
        res = unmangle(u2);
        if (res)
        {
-               ucs2_to_dos (s, res, slen); /* ugly, but must be done this way */
+               ucs2_to_dos (s, res, 13); /* ugly, but must be done this way */
+               DEBUG(10,("check_mangled_cache: returning -> [%s]\n", s));
                ret = True;
        }
        SAFE_FREE(res);
        SAFE_FREE(u2);
+       DEBUG(10,("check_mangled_cache: returning -> %s\n", ret?"True":"False"));
        return ret;
 }
 
@@ -1548,7 +1572,10 @@ void mangle_name_83(char *s)
        BOOL ret = False;
        
        DEBUG(10,("mangle_name_83: I'm so ugly, please remove me!\n"));
+       DEBUG(10,("mangle_name_83: testing -> [%s]\n", s));
 
+       if (!s || !*s) return;
+       
        slen = strlen(s);
        u2len = (slen + 1) * sizeof(smb_ucs2_t);
        u2 = (smb_ucs2_t *)malloc(u2len);
@@ -1560,7 +1587,8 @@ void mangle_name_83(char *s)
        dos_to_ucs2(u2, s, u2len);
        
        res = _mangle(u2);
-       if (res) ucs2_to_dos (s, res, slen); /* ugly, but must be done this way */
+       if (res) ucs2_to_dos (s, res, 13); /* ugly, but must be done this way */
+       DEBUG(10,("mangle_name_83: returning -> [%s]\n", res));
        SAFE_FREE(res);
        SAFE_FREE(u2);
 }
@@ -1569,6 +1597,10 @@ BOOL name_map_mangle(char *OutName, BOOL need83, BOOL cache83, int snum)
 {
        DEBUG(10,("name_map_mangle: I'm so ugly, please remove me!\n"));
 
+       /* if (!need83) return True; */
+       if (is_8_3(OutName, True)) return True;
+       /* Warning: we should check for invalid chars in file name and mangle
+          if invalid chars found --simo*/
        mangle_name_83(OutName);
        return True;
 }
index 2e0fb1868d444eea86a007b14c504988f3cc3a23..16a092f152f26777910a443172b45eca50cb708f 100644 (file)
@@ -844,6 +844,11 @@ static void usage(char *pname)
        if (!init_oplocks()) {
                exit(1);
        }
+       
+       /* Setup mangle */
+       if (!init_mangle_tdb()) {
+               exit(1);
+       }
 
        /* Setup change notify */
        if (!init_change_notify()) {