]> arthur.barton.de Git - netatalk.git/blob - etc/cnid_dbd/dbd_get.c
c1c7bb8cc44f28e100f1540f2ff110f29ec7f872
[netatalk.git] / etc / cnid_dbd / dbd_get.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 <sys/param.h>
13 #include <atalk/logger.h>
14 #include <errno.h>
15 #include <arpa/inet.h>
16
17 #include <atalk/cnid_dbd_private.h>
18
19
20 #include "dbif.h"
21 #include "dbd.h"
22 #include "pack.h"
23
24
25 /* Return CNID for a given did/name. */
26
27 int dbd_get(DBD *dbd, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply)
28 {
29     char start[CNID_DID_LEN + MAXPATHLEN + 1], *buf;
30     DBT key, data;
31     int rc;
32
33     memset(&key, 0, sizeof(key));
34     memset(&data, 0, sizeof(data));
35
36     rply->namelen = 0;
37
38     buf = start;
39     memcpy(buf, &rqst->did, sizeof(rqst->did));
40     buf += sizeof(rqst->did);
41     memcpy(buf, rqst->name, rqst->namelen);
42     *(buf + rqst->namelen) = '\0'; /* Make it a C-string. */
43     key.data = start;
44     key.size = CNID_DID_LEN + rqst->namelen + 1;
45
46     if ((rc = dbif_get(dbd, DBIF_IDX_DIDNAME, &key, &data, 0)) < 0) {
47         LOG(log_error, logtype_cnid, "dbd_get: Unable to get CNID %u, name %s", ntohl(rqst->did), rqst->name);
48         rply->result = CNID_DBD_RES_ERR_DB;
49         return -1;
50     }
51
52     if (rc == 0) {
53         LOG(log_debug, logtype_cnid, "cnid_get: CNID not found for did %u name %s",
54             ntohl(rqst->did), rqst->name);
55     rply->result = CNID_DBD_RES_NOTFOUND;
56     return 1;
57     }
58
59     memcpy(&rply->cnid, data.data, sizeof(rply->cnid));
60
61     LOG(log_debug, logtype_cnid, "cnid_get: Returning CNID did %u name %s as %u",
62         ntohl(rqst->did), rqst->name, ntohl(rply->cnid));
63
64     rply->result = CNID_DBD_RES_OK;
65     return 1;
66 }