1/* 2 * 3 * Copyright (C) Joerg Lenneis 2005 4 * All Rights Reserved. See COPYING. 5 */ 6 7#ifdef HAVE_CONFIG_H 8#include "config.h" 9#endif /* HAVE_CONFIG_H */ 10 11#include <stdio.h> 12#include <string.h> 13#include <arpa/inet.h> 14 15#include <atalk/logger.h> 16#include <atalk/cnid_dbd_private.h> 17 18#include "pack.h" 19#include "dbif.h" 20#include "dbd.h" 21 22 23/* rebuild_add: Enter all fields (including the CNID) into the database and 24 update the current cnid, for emergency repairs. */ 25 26int dbd_rebuild_add(DBD *dbd, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply) 27{ 28 DBT key, data; 29 cnid_t cur, tmp, id; 30 31 memset(&key, 0, sizeof(key)); 32 memset(&data, 0, sizeof(data)); 33 34 rply->namelen = 0; 35 36 key.data = &rqst->cnid; 37 key.size = sizeof(cnid_t); 38 39 data.data = pack_cnid_data(rqst); 40 data.size = CNID_HEADER_LEN + rqst->namelen + 1; 41 memcpy(data.data, &rqst->cnid, sizeof(cnid_t)); 42 43 /* FIXME: In cnid_cdb.c Bjoern does a lookup here and returns the CNID found if sucessful. Why? */ 44 45 if (dbif_put(dbd, DBIF_CNID, &key, &data, 0) < 0) { 46 rply->result = CNID_DBD_RES_ERR_DB; 47 return -1; 48 } 49 50 LOG(log_debug, logtype_cnid, 51 "dbd_rebuild_add(CNID: %u, did: %u, name: \"%s\", dev/ino:0x%llx/0x%llx): success", 52 ntohl(rqst->cnid), ntohl(rqst->did), rqst->name, 53 (unsigned long long)rqst->dev, (unsigned long long)rqst->ino); 54 55 key.data = ROOTINFO_KEY; 56 key.size = ROOTINFO_KEYLEN; 57 58 if (dbif_get(dbd, DBIF_CNID, &key, &data, 0) <= 0) { 59 /* FIXME: If we cannot find ROOTINFO_KEY, should this be considered 60 fatal or should we just return 0 and roll back? */ 61 rply->result = CNID_DBD_RES_ERR_DB; 62 return -1; 63 } 64 65 memcpy(&tmp, (char *) data.data + CNID_TYPE_OFS, sizeof(cnid_t)); 66 cur = ntohl(tmp); 67 id = ntohl(rqst->cnid); 68 69 if (id > cur) { 70 data.size = ROOTINFO_DATALEN; 71 memcpy((char *) data.data + CNID_TYPE_OFS, &rqst->cnid, sizeof(cnid_t)); 72 if (dbif_put(dbd, DBIF_CNID, &key, &data, 0) < 0) { 73 rply->result = CNID_DBD_RES_ERR_DB; 74 return -1; 75 } 76 } 77 78 rply->cnid = rqst->cnid; 79 rply->result = CNID_DBD_RES_OK; 80 return 1; 81} 82 83 84