1/* 2 * $Id: cnid_cdb_get.c,v 1.5 2009-10-29 13:38:16 didg Exp $ 3 */ 4 5#ifdef HAVE_CONFIG_H 6#include "config.h" 7#endif /* HAVE_CONFIG_H */ 8 9#ifdef CNID_BACKEND_CDB 10#include "cnid_cdb_private.h" 11 12/* Return CNID for a given did/name. */ 13cnid_t cnid_cdb_get(struct _cnid_db *cdb, const cnid_t did, char *name, 14 const size_t len) 15{ 16 char start[CNID_DID_LEN + MAXPATHLEN + 1], *buf; 17 CNID_private *db; 18 DBT key, data; 19 cnid_t id; 20 int rc; 21 22 if (!cdb || !(db = cdb->_private) || (len > MAXPATHLEN)) { 23 return 0; 24 } 25 26 memset(&key, 0, sizeof(key)); 27 memset(&data, 0, sizeof(data)); 28 29 buf = start; 30 memcpy(buf, &did, sizeof(did)); 31 buf += sizeof(did); 32 memcpy(buf, name, len); 33 *(buf + len) = '\0'; /* Make it a C-string. */ 34 key.data = start; 35 key.size = CNID_DID_LEN + len + 1; 36 37 while ((rc = db->db_didname->get(db->db_didname, NULL, &key, &data, 0))) { 38 39 if (rc != DB_NOTFOUND) { 40 LOG(log_error, logtype_default, "cnid_get: Unable to get CNID %u, name %s: %s", 41 ntohl(did), name, db_strerror(rc)); 42 } 43 44 return 0; 45 } 46 47 memcpy(&id, data.data, sizeof(id)); 48#ifdef DEBUG 49 LOG(log_debug9, logtype_default, "cnid_get: Returning CNID for %u, name %s as %u", 50 ntohl(did), name, ntohl(id)); 51#endif 52 return id; 53} 54 55#endif /* CNID_BACKEND_CDB */ 56