]> arthur.barton.de Git - netatalk.git/blob - libatalk/cnid/cdb/cnid_cdb_resolve.c
63ed9f8a1c14b51c9de5837ef32e91ab2713d558
[netatalk.git] / libatalk / cnid / cdb / cnid_cdb_resolve.c
1 /*
2  */
3
4 #ifdef HAVE_CONFIG_H
5 #include "config.h"
6 #endif /* HAVE_CONFIG_H */
7
8 #ifdef CNID_BACKEND_CDB
9 #include "cnid_cdb_private.h"
10
11 /* Return the did/name pair corresponding to a CNID. */
12 char *cnid_cdb_resolve(struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len) {
13     CNID_private *db;
14     DBT key, data;
15     int rc;
16
17     if (!cdb || !(db = cdb->_private) || !id || !(*id)) {
18         return NULL;
19     }
20
21     memset(&key, 0, sizeof(key));
22     memset(&data, 0, sizeof(data));
23
24     data.data = buffer;
25     data.ulen = len;
26     data.flags = DB_DBT_USERMEM;
27
28     key.data = id;
29     key.size = sizeof(cnid_t);
30     while ((rc = db->db_cnid->get(db->db_cnid, NULL, &key, &data, 0))) {
31
32         if (rc != DB_NOTFOUND) {
33             LOG(log_error, logtype_default, "cnid_resolve: Unable to get did/name: %s",
34                 db_strerror(rc));
35         }
36
37         *id = 0;
38         return NULL;
39     }
40
41     memcpy(id, (char *)data.data +CNID_DID_OFS, sizeof(cnid_t));
42 #ifdef DEBUG
43     LOG(log_debug9, logtype_default, "cnid_resolve: Returning id = %u, did/name = %s",
44         ntohl(*id), (char *)data.data + CNID_NAME_OFS);
45 #endif
46     return (char *)data.data +  CNID_NAME_OFS;
47 }
48
49 #endif