1/* 2 * $Id: cnid_cdb_resolve.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 the did/name pair corresponding to a CNID. */ 13char *cnid_cdb_resolve(struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len) { 14 CNID_private *db; 15 DBT key, data; 16 int rc; 17 18 if (!cdb || !(db = cdb->_private) || !id || !(*id)) { 19 return NULL; 20 } 21 22 memset(&key, 0, sizeof(key)); 23 memset(&data, 0, sizeof(data)); 24 25 data.data = buffer; 26 data.ulen = len; 27 data.flags = DB_DBT_USERMEM; 28 29 key.data = id; 30 key.size = sizeof(cnid_t); 31 while ((rc = db->db_cnid->get(db->db_cnid, NULL, &key, &data, 0))) { 32 33 if (rc != DB_NOTFOUND) { 34 LOG(log_error, logtype_default, "cnid_resolve: Unable to get did/name: %s", 35 db_strerror(rc)); 36 } 37 38 *id = 0; 39 return NULL; 40 } 41 42 memcpy(id, (char *)data.data +CNID_DID_OFS, sizeof(cnid_t)); 43#ifdef DEBUG 44 LOG(log_debug9, logtype_default, "cnid_resolve: Returning id = %u, did/name = %s", 45 ntohl(*id), (char *)data.data + CNID_NAME_OFS); 46#endif 47 return (char *)data.data + CNID_NAME_OFS; 48} 49 50#endif 51