]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/cnid/cnid_mangle_add.c
Add support for long filename mangling. Basically, tis code will take
[netatalk.git] / libatalk / cnid / cnid_mangle_add.c
diff --git a/libatalk/cnid/cnid_mangle_add.c b/libatalk/cnid/cnid_mangle_add.c
new file mode 100644 (file)
index 0000000..bc88d56
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * $Id: cnid_mangle_add.c,v 1.1 2002-05-29 18:02:59 jmarcus Exp $
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef FILE_MANGLING
+#include <stdio.h>
+#include <string.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <atalk/logger.h>
+#include <errno.h>
+
+#include <db.h>
+#include <netatalk/endian.h>
+#include <atalk/adouble.h>
+#include <atalk/cnid.h>
+
+#include "cnid_private.h"
+
+/* Add a mangled filename. */
+int
+cnid_mangle_add(void *CNID, char *mfilename, char *filename)
+{
+    CNID_private *db;
+    DBT key, data;
+    DB_TXN *tid;
+    cnid_t id;
+    struct stat st;
+    int rc, ret;
+
+    if (!(db = CNID)) {
+        return -1;
+    }
+
+    memset(&key, 0, sizeof(key));
+    memset(&data, 0, sizeof(data));
+
+    key.data = mfilename;
+    key.size = strlen(mfilename) + 1;
+    data.data = filename;
+    data.size = strlen(filename) + 1;
+
+retry:
+    if ((rc = txn_begin(db->dbenv, NULL, &tid, 0)) != 0) {
+       LOG(log_error, logtype_default, "cnid_mangle_add: Failed to begin transaction: %s", db_strerror(rc));
+       return -1;
+    }
+
+    if ((rc = db->db_mangle->put(db->db_mangle, tid, &key, &data, 0))) {
+       if ((ret = txn_abort(tid)) != 0) {
+           LOG(log_error, logtype_default, "cnid_mangle_add: txn_abort: %s", db_strerror(ret));
+           return -1;
+       }
+       switch (rc) {
+           case DB_LOCK_DEADLOCK:
+               goto retry;
+           default:
+               LOG(log_error, logtype_default, "cnid_mangle_add: Failed to add mangled filename to the database: %s", db_strerror(rc));
+               return -1;
+       }
+    }
+
+    return 0;
+}
+#endif /* FILE_MANGLING */