1/* 2 * $Id: dbd_get.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 <sys/param.h> 14#include <atalk/logger.h> 15#include <errno.h> 16#include <netatalk/endian.h> 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 27int 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} 67