]> arthur.barton.de Git - netatalk.git/blob - libatalk/cnid/cdb/cnid_cdb_resolve.c
big merge for db frontend and unicode.
[netatalk.git] / libatalk / cnid / cdb / cnid_cdb_resolve.c
1 /*
2  * $Id: cnid_cdb_resolve.c,v 1.1.4.1 2003-09-09 16:42:21 didg Exp $
3  */
4
5 #ifdef HAVE_CONFIG_H
6 #include "config.h"
7 #endif /* HAVE_CONFIG_H */
8
9 #ifdef CNID_BACKEND_CDB
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 #include <db.h>
19 #include <netatalk/endian.h>
20 #include <atalk/adouble.h>
21 #include "cnid_cdb.h"
22
23 #include "cnid_cdb_private.h"
24
25 /* Return the did/name pair corresponding to a CNID. */
26 char *cnid_cdb_resolve(struct _cnid_db *cdb, cnid_t *id, void *buffer, u_int32_t len) {
27     CNID_private *db;
28     DBT key, data;
29     int rc;
30
31     if (!cdb || !(db = cdb->_private) || !id || !(*id)) {
32         return NULL;
33     }
34
35     memset(&key, 0, sizeof(key));
36     memset(&data, 0, sizeof(data));
37
38     data.data = buffer;
39     data.ulen = len;
40     data.flags = DB_DBT_USERMEM;
41
42     key.data = id;
43     key.size = sizeof(cnid_t);
44     while ((rc = db->db_cnid->get(db->db_cnid, NULL, &key, &data, 0))) {
45
46         if (rc != DB_NOTFOUND) {
47             LOG(log_error, logtype_default, "cnid_resolve: Unable to get did/name: %s",
48                 db_strerror(rc));
49         }
50
51         *id = 0;
52         return NULL;
53     }
54
55     memcpy(id, (char *)data.data +CNID_DID_OFS, sizeof(cnid_t));
56 #ifdef DEBUG
57     LOG(log_info, logtype_default, "cnid_resolve: Returning id = %u, did/name = %s",
58         ntohl(*id), (char *)data.data + CNID_NAME_OFS);
59 #endif
60     return (char *)data.data +  CNID_NAME_OFS;
61 }
62
63 #endif