]> arthur.barton.de Git - netatalk.git/blob - libatalk/cnid/cnid_mangle_get.c
0a2908dce82814985d60fa99eac6655e5a9a99d4
[netatalk.git] / libatalk / cnid / cnid_mangle_get.c
1 /*
2  * $Id: cnid_mangle_get.c,v 1.5 2002-06-09 07:15:58 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 /* Find a mangled filename entry. */
26 char *
27 cnid_mangle_get(void *CNID, char *mfilename)
28 {
29     CNID_private *db;
30     DBT key, data;
31     DB_TXN *tid;
32     cnid_t id;
33     struct stat st;
34     char *filename;
35     int rc;
36
37     if (!(db = CNID)) {
38         return NULL;
39     }
40
41     memset(&key, 0, sizeof(key));
42     memset(&data, 0, sizeof(data));
43
44     key.data = mfilename;
45     key.size = strlen(mfilename);
46
47     while ((rc = db->db_mangle->get(db->db_mangle, NULL, &key, &data, 0))) {
48         if (rc == DB_LOCK_DEADLOCK) {
49             continue;
50         }
51
52         if (rc == DB_NOTFOUND) {
53             LOG(log_debug, logtype_default, "cnid_mangle_get: Failed to find mangled entry for %s", mfilename);
54             return NULL;
55
56         }
57
58         LOG(log_error, logtype_default, "cnid_mangle_get: Failed to get mangle entry from the database: %s", db_strerror(rc));
59         return NULL;
60     }
61
62     filename = (char *)data.data;
63
64     return filename;
65 }
66 #endif /* FILE_MANGLING */