int dbd_rebuild_add(DBD *dbd, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply) { DBT key, data; cnid_t cur, tmp, id; memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); rply->namelen = 0; key.data = &rqst->cnid; key.size = sizeof(cnid_t); data.data = pack_cnid_data(rqst); data.size = CNID_HEADER_LEN + rqst->namelen + 1; memcpy(data.data, &rqst->cnid, sizeof(cnid_t)); /* FIXME: In cnid_cdb.c Bjoern does a lookup here and returns the CNID found if sucessful. Why? */ if (dbif_put(dbd, DBIF_CNID, &key, &data, 0) < 0) { rply->result = CNID_DBD_RES_ERR_DB; return -1; } LOG(log_debug, logtype_cnid, "dbd_rebuild_add(CNID: %u, did: %u, name: \"%s\", dev/ino:0x%llx/0x%llx): success", ntohl(rqst->cnid), ntohl(rqst->did), rqst->name, (unsigned long long)rqst->dev, (unsigned long long)rqst->ino); key.data = ROOTINFO_KEY; key.size = ROOTINFO_KEYLEN; if (dbif_get(dbd, DBIF_CNID, &key, &data, 0) <= 0) { /* FIXME: If we cannot find ROOTINFO_KEY, should this be considered fatal or should we just return 0 and roll back? */ rply->result = CNID_DBD_RES_ERR_DB; return -1; } memcpy(&tmp, (char *) data.data + CNID_TYPE_OFS, sizeof(cnid_t)); cur = ntohl(tmp); id = ntohl(rqst->cnid); if (id > cur) { data.size = ROOTINFO_DATALEN; memcpy((char *) data.data + CNID_TYPE_OFS, &rqst->cnid, sizeof(cnid_t)); if (dbif_put(dbd, DBIF_CNID, &key, &data, 0) < 0) { rply->result = CNID_DBD_RES_ERR_DB; return -1; } } rply->cnid = rqst->cnid; rply->result = CNID_DBD_RES_OK; return 1; }
int dbd_get(DBD *dbd, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply) { char start[CNID_DID_LEN + MAXPATHLEN + 1], *buf; DBT key, data; int rc; memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); rply->namelen = 0; buf = start; memcpy(buf, &rqst->did, sizeof(rqst->did)); buf += sizeof(rqst->did); memcpy(buf, rqst->name, rqst->namelen); *(buf + rqst->namelen) = '\0'; /* Make it a C-string. */ key.data = start; key.size = CNID_DID_LEN + rqst->namelen + 1; if ((rc = dbif_get(dbd, DBIF_IDX_DIDNAME, &key, &data, 0)) < 0) { LOG(log_error, logtype_cnid, "dbd_get: Unable to get CNID %u, name %s", ntohl(rqst->did), rqst->name); rply->result = CNID_DBD_RES_ERR_DB; return -1; } if (rc == 0) { LOG(log_debug, logtype_cnid, "cnid_get: CNID not found for did %u name %s", ntohl(rqst->did), rqst->name); rply->result = CNID_DBD_RES_NOTFOUND; return 1; } memcpy(&rply->cnid, data.data, sizeof(rply->cnid)); LOG(log_debug, logtype_cnid, "cnid_get: Returning CNID did %u name %s as %u", ntohl(rqst->did), rqst->name, ntohl(rply->cnid)); rply->result = CNID_DBD_RES_OK; return 1; }
int dbd_resolve(DBD *dbd, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply) { DBT key, data; int rc; memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); rply->namelen = 0; key.data = (void *) &rqst->cnid; key.size = sizeof(cnid_t); if ((rc = dbif_get(dbd, DBIF_CNID, &key, &data, 0)) < 0) { LOG(log_error, logtype_cnid, "dbd_resolve: DB Error resolving CNID %u", ntohl(rqst->cnid)); rply->result = CNID_DBD_RES_ERR_DB; return -1; } if (rc == 0) { LOG(log_debug, logtype_cnid, "dbd_resolve: Could not resolve CNID %u", ntohl(rqst->cnid)); rply->result = CNID_DBD_RES_NOTFOUND; return 1; } memcpy(&rply->did, (char *) data.data + CNID_DID_OFS, sizeof(cnid_t)); rply->namelen = data.size; rply->name = (char *)data.data; LOG(log_debug, logtype_cnid, "dbd_resolve(CNID: %u): did: %u, name: \"%s\"", ntohl(rqst->cnid), ntohl(rply->did), rply->name + CNID_NAME_OFS); rply->result = CNID_DBD_RES_OK; return 1; }