1/*
2 * $Id: dbd_resolve.c,v 1.4 2009-05-06 11:54:24 franklahm Exp $
3 *
4 * Copyright (C) Joerg Lenneis 2003
5 * All Rights Reserved.  See COPYING.
6 */
7
8#ifdef HAVE_CONFIG_H
9#include "config.h"
10#endif /* HAVE_CONFIG_H */
11
12#include <string.h>
13#include <atalk/logger.h>
14#include <errno.h>
15#include <netatalk/endian.h>
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
24int 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}
62