]> arthur.barton.de Git - netatalk.git/blob - libatalk/cnid/cnid_mangle_add.c
apply parts of the netbsd build patch by Patrick Welche <prlw1@newn.cam.ac.uk>, mostl...
[netatalk.git] / libatalk / cnid / cnid_mangle_add.c
1 /*
2  * $Id: cnid_mangle_add.c,v 1.6 2003-06-06 21:22:44 srittau 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 #ifdef CNID_DB_CDB
26     #define tid    NULL
27 #endif /* CNID_DB_CDB */
28
29 /* Add a mangled filename. */
30 int
31 cnid_mangle_add(void *CNID, char *mfilename, char *filename)
32 {
33     CNID_private *db;
34     DBT key, data;
35 #ifndef CNID_DB_CDB
36     DB_TXN *tid;
37 #endif /* CNID_DB_CDB */
38     int rc;
39
40     if (!(db = CNID)) {
41         return -1;
42     }
43
44     memset(&key, 0, sizeof(key));
45     memset(&data, 0, sizeof(data));
46
47     key.data = mfilename;
48     key.size = strlen(mfilename);
49     data.data = filename;
50     data.size = strlen(filename) + 1;
51
52 #ifndef CNID_DB_CDB
53 retry:
54     if ((rc = txn_begin(db->dbenv, NULL, &tid, 0)) != 0) {
55         LOG(log_error, logtype_default, "cnid_mangle_add: Failed to begin transaction: %s", db_strerror(rc));
56         return -1;
57     }
58 #endif /* CNID_DB_CDB */
59
60     if ((rc = db->db_mangle->put(db->db_mangle, tid, &key, &data, 0))) {
61 #ifndef CNID_DB_CDB
62         if ((ret = txn_abort(tid)) != 0) {
63             LOG(log_error, logtype_default, "cnid_mangle_add: txn_abort: %s", db_strerror(ret));
64             return -1;
65         }
66 #endif /* CNID_DB_CDB */
67         switch (rc) {
68 #ifndef CNID_DB_CDB
69         case DB_LOCK_DEADLOCK:
70             goto retry;
71 #endif /* CNID_DB_CDB */
72         default:
73             LOG(log_error, logtype_default, "cnid_mangle_add: Failed to add mangled filename to the database: %s", db_strerror(rc));
74             return -1;
75         }
76     }
77
78 #ifndef CNID_DB_CDB
79     if ((rc = txn_commit(tid, 0)) != 0) {
80         LOG(log_error, logtype_default, "cnid_mangle_add: Unable to commit transaction: %s", db_strerror(rc));
81         return -1;
82     }
83 #endif /* CNID_DB_CDB */
84
85     return 0;
86 }
87 #endif /* FILE_MANGLING */