]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/mangle.c
commit dircache rewrite.
[netatalk.git] / etc / afpd / mangle.c
index 6c124b912cb3f8590377246aacc251d52f3e1485..260d1e62adf9e31ffacc943d5dcdfdd95dfed42a 100644 (file)
@@ -1,5 +1,5 @@
 /* 
- * $Id: mangle.c,v 1.18 2006-09-18 01:06:44 didg Exp $ 
+ * $Id: mangle.c,v 1.19.4.1 2010-02-01 10:56:08 franklahm Exp $ 
  *
  * Copyright (c) 2002. Joe Marcus Clarke (marcus@marcuscom.com)
  * All Rights Reserved.  See COPYRIGHT.
@@ -41,7 +41,7 @@ static size_t mangle_extension(const struct vol *vol, const char* uname,
 static char *demangle_checks ( const struct vol *vol, char* uname, char * mfilename, size_t prefix, char * ext)
 {
     u_int16_t flags;
-    static char buffer[MAXPATHLEN];
+    static char buffer[MAXPATHLEN +2];  /* for convert_charset dest_len parameter +2 */
     size_t len;
     size_t mfilenamelen;
 
@@ -51,7 +51,7 @@ static char *demangle_checks ( const struct vol *vol, char* uname, char * mfilen
 
     /* check whether file extensions match */
     {
-      char buf[MAX_EXT_LENGTH + 1];
+      char buf[MAX_EXT_LENGTH + 2];  /* for convert_charset dest_len parameter +2 */
       size_t ext_len = mangle_extension(vol, uname, buf, CH_UTF8_MAC);
 
       if (ext_len) {
@@ -169,8 +169,8 @@ private_demangle(const struct vol *vol, char *mfilename, cnid_t did, cnid_t *osx
     }
 
     /* is it a dir?, there's a conflict with pre OSX 'trash #2'  */
-    if ((dir = dirsearch(vol, id))) {
-        if (dir->d_parent && dir->d_parent->d_did != did) {
+    if ((dir = dirlookup(vol, id))) {
+        if (dir->d_did != did) {
             /* not in the same folder, there's a race with outdate cache
              * but we have to live with it, hopefully client will recover
             */
@@ -178,12 +178,12 @@ private_demangle(const struct vol *vol, char *mfilename, cnid_t did, cnid_t *osx
         }
         if (!osx) {
             /* it's not from cname so mfilename and dir must be the same */
-            if (!strcmp(dir->d_m_name, mfilename)) {
-                return dir->d_u_name;
+            if (strcmp((char *)dir->d_m_name->data, mfilename) == 0) {
+                return (char *)dir->d_u_name->data;
             }
         } 
         else {
-           return demangle_checks (vol, dir->d_u_name, mfilename, prefix, t);
+            return demangle_checks (vol, (char *)dir->d_u_name->data, mfilename, prefix, t);
        }
     }
     else if (NULL != (u_name = cnid_resolve(vol->v_cdb, &id, buffer, len)) ) {
@@ -233,9 +233,9 @@ demangle_osx(const struct vol *vol, char *mfilename, cnid_t did, cnid_t *fileid)
 char *
 mangle(const struct vol *vol, char *filename, size_t filenamelen, char *uname, cnid_t id, int flags) {
     char *m = NULL;
-    static char mfilename[MAXPATHLEN + 1];
+    static char mfilename[MAXPATHLEN]; /* way > maxlen */
     char mangle_suffix[MANGLE_LENGTH + 1];
-    char ext[MAX_EXT_LENGTH];
+    char ext[MAX_EXT_LENGTH +2];  /* for convert_charset dest_len parameter +2 */
     size_t ext_len;
     size_t maxlen;
     int k;