]> arthur.barton.de Git - netatalk.git/blob - libatalk/cnid/tdb/cnid_tdb_get.c
4e7f638dd18debb62470bc4f19b7bcb58be589e7
[netatalk.git] / libatalk / cnid / tdb / cnid_tdb_get.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #ifdef CNID_BACKEND_TDB
6
7 #include "cnid_tdb.h"
8
9 /* Return CNID for a given did/name. */
10 cnid_t cnid_tdb_get(struct _cnid_db *cdb, cnid_t did, const char *name, size_t len)
11 {
12     char start[CNID_DID_LEN + MAXPATHLEN + 1], *buf;
13     struct _cnid_tdb_private *db;
14     TDB_DATA key, data;
15     cnid_t id;
16
17     if (!cdb || !(db = cdb->_private) || (len > MAXPATHLEN)) {
18         return 0;
19     }
20
21     memset(&key, 0, sizeof(key));
22     memset(&data, 0, sizeof(data));
23
24     buf = start;
25     memcpy(buf, &did, sizeof(did));
26     buf += sizeof(did);
27     memcpy(buf, name, len);
28     *(buf + len) = '\0'; /* Make it a C-string. */
29     key.dptr = (unsigned char *)start;
30     key.dsize = CNID_DID_LEN + len + 1;
31     data = tdb_fetch(db->tdb_didname, key);
32     if (!data.dptr)
33         return 0;
34
35     memcpy(&id, data.dptr, sizeof(id));
36     free(data.dptr);
37     return id;
38 }
39
40 #endif