]> arthur.barton.de Git - netatalk.git/blob - etc/cnid_dbd/dbd_resolve.c
53407757969b008256b7de3344250c53814f3d21
[netatalk.git] / etc / cnid_dbd / dbd_resolve.c
1 /*
2  *
3  * Copyright (C) Joerg Lenneis 2003
4  * All Rights Reserved.  See COPYING.
5  */
6
7 #ifdef HAVE_CONFIG_H
8 #include "config.h"
9 #endif /* HAVE_CONFIG_H */
10
11 #include <string.h>
12 #include <atalk/logger.h>
13 #include <errno.h>
14 #include <arpa/inet.h>
15
16 #include <atalk/cnid_dbd_private.h>
17
18 #include "dbif.h"
19 #include "dbd.h"
20 #include "pack.h"
21
22 /* Return the did/name pair corresponding to a CNID. */
23
24 int dbd_resolve(DBD *dbd, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply)
25 {
26     DBT key, data;
27     int rc;
28
29     memset(&key, 0, sizeof(key));
30     memset(&data, 0, sizeof(data));
31
32     rply->namelen = 0;
33
34     key.data = (void *) &rqst->cnid;
35     key.size = sizeof(cnid_t);
36
37     if ((rc = dbif_get(dbd, DBIF_CNID, &key, &data, 0)) < 0) {
38         LOG(log_error, logtype_cnid, "dbd_resolve: DB Error resolving CNID %u", ntohl(rqst->cnid));
39         rply->result = CNID_DBD_RES_ERR_DB;
40         return -1;
41     }
42      
43     if (rc == 0) {
44
45         LOG(log_debug, logtype_cnid, "dbd_resolve: Could not resolve CNID %u", ntohl(rqst->cnid));
46     
47         rply->result = CNID_DBD_RES_NOTFOUND;
48         return 1;
49     }
50
51     memcpy(&rply->did, (char *) data.data + CNID_DID_OFS, sizeof(cnid_t));
52
53     rply->namelen = data.size;
54     rply->name = (char *)data.data;
55
56     LOG(log_debug, logtype_cnid, "dbd_resolve(CNID: %u): did: %u, name: \"%s\"",
57         ntohl(rqst->cnid), ntohl(rply->did), rply->name + CNID_NAME_OFS);
58
59     rply->result = CNID_DBD_RES_OK;
60     return 1;
61 }