]> arthur.barton.de Git - netatalk.git/blob - libatalk/cnid/cnid_mangle_add.c
be9c5553ef99210d4e0274da64f6bd21c80d5e66
[netatalk.git] / libatalk / cnid / cnid_mangle_add.c
1 /*
2  * $Id: cnid_mangle_add.c,v 1.3 2002-06-03 22:55:31 jmarcus Exp $
3  */
4
5 #ifdef HAVE_CONFIG_H
6 #include "config.h"
7 #endif /* HAVE_CONFIG_H */
8
9 #ifdef FILE_MANGLING
10 #include <stdio.h>
11 #include <string.h>
12 #include <sys/param.h>
13 #include <sys/stat.h>
14 #include <string.h>
15 #include <atalk/logger.h>
16 #include <errno.h>
17
18 #include <db.h>
19 #include <netatalk/endian.h>
20 #include <atalk/adouble.h>
21 #include <atalk/cnid.h>
22
23 #include "cnid_private.h"
24
25 /* Add a mangled filename. */
26 int
27 cnid_mangle_add(void *CNID, char *mfilename, char *filename)
28 {
29     CNID_private *db;
30     DBT key, data;
31     DB_TXN *tid;
32     cnid_t id;
33     int rc, ret;
34
35     if (!(db = CNID)) {
36         return -1;
37     }
38
39     memset(&key, 0, sizeof(key));
40     memset(&data, 0, sizeof(data));
41
42     key.data = mfilename;
43     key.size = strlen(mfilename);
44     data.data = filename;
45     data.size = strlen(filename) + 1;
46
47 retry:
48     if ((rc = txn_begin(db->dbenv, NULL, &tid, 0)) != 0) {
49         LOG(log_error, logtype_default, "cnid_mangle_add: Failed to begin transaction: %s", db_strerror(rc));
50         return -1;
51     }
52
53     if ((rc = db->db_mangle->put(db->db_mangle, tid, &key, &data, 0))) {
54         if ((ret = txn_abort(tid)) != 0) {
55             LOG(log_error, logtype_default, "cnid_mangle_add: txn_abort: %s", db_strerror(ret));
56             return -1;
57         }
58         switch (rc) {
59             case DB_LOCK_DEADLOCK:
60                 goto retry;
61             default:
62                 LOG(log_error, logtype_default, "cnid_mangle_add: Failed to add mangled filename to the database: %s", db_strerror(rc));
63                 return -1;
64         }
65     }
66
67     if ((rc = txn_commit(tid, 0)) != 0) {
68         LOG(log_error, logtype_default, "cnid_mangle_add: Unable to commit transaction: %s", db_strerror(rc));
69         return -1;
70     }
71
72     return 0;
73 }
74 #endif /* FILE_MANGLING */