]> arthur.barton.de Git - netatalk.git/commitdiff
First round of mangling debugging. This should actually work. I ran into
authorjmarcus <jmarcus>
Thu, 30 May 2002 06:41:16 +0000 (06:41 +0000)
committerjmarcus <jmarcus>
Thu, 30 May 2002 06:41:16 +0000 (06:41 +0000)
some problems with read-only files, but that may be a product of 1.6cvs, and
not necessarily my code.

etc/afpd/mangle.c
libatalk/cnid/cnid_mangle_add.c
libatalk/cnid/cnid_mangle_get.c
libatalk/cnid/cnid_private.h

index 0a6146d69864277cf2448dd3f1846e7e0c50fb02..0057fb2c7ebde57039c4e23fe29aa4f325fdc1ae 100644 (file)
@@ -1,5 +1,5 @@
 /* 
- * $Id: mangle.c,v 1.1 2002-05-29 18:02:59 jmarcus Exp $ 
+ * $Id: mangle.c,v 1.2 2002-05-30 06:41:16 jmarcus Exp $ 
  *
  * Copyright (c) 2002. Joe Marcus Clarke (marcus@marcuscom.com)
  * All Rights Reserved.  See COPYRIGHT.
@@ -54,10 +54,12 @@ demangle(const struct vol *vol, char *mfilename) {
 
        return filename;
 }
+
 char *
 mangle(const struct vol *vol, char *filename) {
     char *ext = NULL;
-    char mfilename[MAX_LENGTH+1];
+    char *mfilename = NULL;
+    char *tf = NULL;
     char mangle_suffix[MANGLE_LENGTH+1];
     char dir[MAXPATHLEN+1];
     char tmp[MAXPATHLEN+1];
@@ -78,10 +80,18 @@ mangle(const struct vol *vol, char *filename) {
        return filename;
     }
 
+    if ((mfilename = malloc(MAX_LENGTH + 1)) == NULL) {
+       LOG(log_error, logtype_default, "mangle: Failed to allocate memory to hold the mangled filename");
+       return filename;
+    }
+
     /* Check to see if we already have a mangled filename by this name. */
     while (1) {
        strcpy(tmp, dir);
+
        strncpy(mfilename, filename, MAX_LENGTH - strlen(MANGLE_CHAR) - MANGLE_LENGTH - ((ext != NULL)?strlen(ext):0));
+       mfilename[MAX_LENGTH - strlen(MANGLE_CHAR) - MANGLE_LENGTH - ((ext != NULL)?strlen(ext):0)] = '\0';
+
        strcat(mfilename, MANGLE_CHAR);
        (void)sprintf(mangle_suffix, "%03d", mangle_suffix_int);
        strcat(mfilename, mangle_suffix);
@@ -89,11 +99,12 @@ mangle(const struct vol *vol, char *filename) {
        if (ext) {
                strcat(mfilename, ext);
        }
-       
+
        strcat(tmp, "/");
        strcat(tmp, mfilename);
 
-       if (!cnid_mangle_get(vol->v_db, tmp)) {
+       tf = cnid_mangle_get(vol->v_db, tmp);
+       if (tf == NULL || (strcmp(tf, filename)) == 0) {
            break;
        }
        else {
@@ -104,12 +115,13 @@ mangle(const struct vol *vol, char *filename) {
        }
     }
 
-    if (cnid_mangle_add(vol->v_db, mfilename, tmp) < 0) {
+    strcat(dir, "/");
+    strcat(dir, filename);
+
+    if (cnid_mangle_add(vol->v_db, tmp, dir) < 0) {
        return filename;
     }
 
-    filename = mfilename;
-
-    return filename;
+    return mfilename;
 }
 #endif /* FILE_MANGLING */
index bc88d564669e623307b3da8ae5f9df03bdb7353f..ed3f393b9fdb9df39f17c02502f3e87a5707ee00 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: cnid_mangle_add.c,v 1.1 2002-05-29 18:02:59 jmarcus Exp $
+ * $Id: cnid_mangle_add.c,v 1.2 2002-05-30 06:41:19 jmarcus Exp $
  */
 
 #ifdef HAVE_CONFIG_H
@@ -30,7 +30,6 @@ cnid_mangle_add(void *CNID, char *mfilename, char *filename)
     DBT key, data;
     DB_TXN *tid;
     cnid_t id;
-    struct stat st;
     int rc, ret;
 
     if (!(db = CNID)) {
@@ -41,9 +40,9 @@ cnid_mangle_add(void *CNID, char *mfilename, char *filename)
     memset(&data, 0, sizeof(data));
 
     key.data = mfilename;
-    key.size = strlen(mfilename) + 1;
+    key.size = strlen(mfilename);
     data.data = filename;
-    data.size = strlen(filename) + 1;
+    data.size = strlen(filename);
 
 retry:
     if ((rc = txn_begin(db->dbenv, NULL, &tid, 0)) != 0) {
@@ -65,6 +64,11 @@ retry:
        }
     }
 
+    if ((rc = txn_commit(tid, 0)) != 0) {
+       LOG(log_error, logtype_default, "cnid_mangle_add: Unable to commit transaction: %s", db_strerror(rc));
+       return -1;
+    }
+
     return 0;
 }
 #endif /* FILE_MANGLING */
index 6f80189c98bf72cc18185f7fdd75c5bfc1f48dbd..9fda314f10e8b279410063da67b3b0cc6431e1ef 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: cnid_mangle_get.c,v 1.1 2002-05-29 18:02:59 jmarcus Exp $
+ * $Id: cnid_mangle_get.c,v 1.2 2002-05-30 06:41:19 jmarcus Exp $
  */
 
 #ifdef HAVE_CONFIG_H
@@ -42,14 +42,15 @@ cnid_mangle_get(void *CNID, char *mfilename)
     memset(&data, 0, sizeof(data));
 
     key.data = mfilename;
-    key.size = strlen(mfilename) + 1;
+    key.size = strlen(mfilename);
 
-    while ((rc = db->db_didname->get(db->db_mangle, NULL, &key, &data, 0))) {
+    while ((rc = db->db_mangle->get(db->db_mangle, NULL, &key, &data, 0))) {
         if (rc == DB_LOCK_DEADLOCK) {
             continue;
         }
 
         if (rc == DB_NOTFOUND) {
+           LOG(log_error, logtype_default, "cnid_mangle_get: Failed to find mangled entry for %s", mfilename);
            return NULL;
 
         }
@@ -57,10 +58,10 @@ cnid_mangle_get(void *CNID, char *mfilename)
         return NULL;
     }
 
-    filename = strrchr(data.data, '/');
+    filename = strrchr((char *)data.data, '/');
     filename++; /* Skip the leading '/' */
 
-    if (stat(data.data, &st) < 0) {
+    if (stat((char *)data.data, &st) < 0) {
        if (errno == ENOENT) {
            /* The file no longer exists.  Purge it from the database. */
 /*retry:
index b7f7683da0c21d78102268ea00fb05b6c8121e13..5b6ff05afc2ea1d92a9dc4cf06dbe7080a74ab95 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: cnid_private.h,v 1.10 2002-05-29 18:02:59 jmarcus Exp $
+ * $Id: cnid_private.h,v 1.11 2002-05-30 06:41:19 jmarcus Exp $
  */
 
 #ifndef LIBATALK_CNID_PRIVATE_H
@@ -39,15 +39,17 @@ typedef struct CNID_private {
     DB *db_cnid;
     DB *db_didname;
     DB *db_devino;
+#ifdef FILE_MANGLING
     DB *db_mangle;
+#endif /* FILE_MANGLING */
 #ifdef EXTENDED_DB
     DB *db_shortname;
     DB *db_macname;
     DB *db_longname;
 #endif /* EXTENDED_DB */
-    DB_ENVdbenv;
+    DB_ENV *dbenv;
     int lockfd, flags;
-       char lock_file[MAXPATHLEN + 1];
+    char lock_file[MAXPATHLEN + 1];
 } CNID_private;
 
 /* on-disk data format (in network byte order where appropriate) --