]> arthur.barton.de Git - netatalk.git/blob - libatalk/cnid/db3/cnid_db3_resolve.c
use log_debug rather than log_info for LOG inside ifdef DEBUG
[netatalk.git] / libatalk / cnid / db3 / cnid_db3_resolve.c
1 /*
2  * $Id: cnid_db3_resolve.c,v 1.4 2009-10-29 13:17:29 didg Exp $
3  */
4
5 #ifdef HAVE_CONFIG_H
6 #include "config.h"
7 #endif /* HAVE_CONFIG_H */
8
9 #ifdef CNID_BACKEND_DB3
10
11 #include <stdio.h>
12 #include <string.h>
13 #include <sys/param.h>
14 #include <sys/stat.h>
15 #include <atalk/logger.h>
16 #include <errno.h>
17
18 #ifdef HAVE_DB4_DB_H
19 #include <db4/db.h>
20 #else
21 #include <db.h>
22 #endif
23 #include <netatalk/endian.h>
24 #include <atalk/adouble.h>
25 #include "cnid_db3.h"
26
27 #include "cnid_db3_private.h"
28
29 /* Return the did/name pair corresponding to a CNID. */
30 char *cnid_db3_resolve(struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len) {
31     CNID_private *db;
32     DBT key, data;
33     int rc;
34
35     if (!cdb || !(db = cdb->_private) || !id || !(*id)) {
36         return NULL;
37     }
38
39     memset(&key, 0, sizeof(key));
40     memset(&data, 0, sizeof(data));
41
42     data.data = buffer;
43     data.ulen = len;
44     data.flags = DB_DBT_USERMEM;
45
46     key.data = id;
47     key.size = sizeof(cnid_t);
48     while ((rc = db->db_cnid->get(db->db_cnid, NULL, &key, &data, 0))) {
49         if (rc == DB_LOCK_DEADLOCK) {
50             continue;
51         }
52
53         if (rc != DB_NOTFOUND) {
54             LOG(log_error, logtype_default, "cnid_resolve: Unable to get did/name: %s",
55                 db_strerror(rc));
56         }
57
58         *id = 0;
59         return NULL;
60     }
61
62     memcpy(id, (char *)data.data + CNID_DEVINO_LEN, sizeof(cnid_t));
63 #ifdef DEBUG
64     LOG(log_debug, logtype_default, "cnid_resolve: Returning id = %u, did/name = %s",
65         ntohl(*id), (char *)data.data + CNID_HEADER_LEN);
66 #endif
67     return (char *)data.data + CNID_HEADER_LEN;
68 }
69
70 #endif /* CNID_BACKEND_DB3 */