2 * $Id: dbd_rebuild_add.c,v 1.4 2009-12-23 10:18:48 franklahm Exp $
4 * Copyright (C) Joerg Lenneis 2005
5 * All Rights Reserved. See COPYING.
10 #endif /* HAVE_CONFIG_H */
14 #include <atalk/logger.h>
15 #include <netatalk/endian.h>
16 #include <atalk/cnid_dbd_private.h>
24 /* rebuild_add: Enter all fields (including the CNID) into the database and
25 update the current cnid, for emergency repairs. */
27 int dbd_rebuild_add(DBD *dbd, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply)
32 memset(&key, 0, sizeof(key));
33 memset(&data, 0, sizeof(data));
37 key.data = &rqst->cnid;
38 key.size = sizeof(cnid_t);
40 data.data = pack_cnid_data(rqst);
41 data.size = CNID_HEADER_LEN + rqst->namelen + 1;
42 memcpy(data.data, &rqst->cnid, sizeof(cnid_t));
44 /* FIXME: In cnid_cdb.c Bjoern does a lookup here and returns the CNID found if sucessful. Why? */
46 if (dbif_put(dbd, DBIF_CNID, &key, &data, 0) < 0) {
47 rply->result = CNID_DBD_RES_ERR_DB;
51 LOG(log_debug, logtype_cnid,
52 "dbd_rebuild_add(CNID: %u, did: %u, name: \"%s\", dev/ino:0x%llx/0x%llx): success",
53 ntohl(rqst->cnid), ntohl(rqst->did), rqst->name,
54 (unsigned long long)rqst->dev, (unsigned long long)rqst->ino);
56 key.data = ROOTINFO_KEY;
57 key.size = ROOTINFO_KEYLEN;
59 if (dbif_get(dbd, DBIF_CNID, &key, &data, 0) <= 0) {
60 /* FIXME: If we cannot find ROOTINFO_KEY, should this be considered
61 fatal or should we just return 0 and roll back? */
62 rply->result = CNID_DBD_RES_ERR_DB;
66 memcpy(&tmp, (char *) data.data + CNID_TYPE_OFS, sizeof(cnid_t));
68 id = ntohl(rqst->cnid);
71 data.size = ROOTINFO_DATALEN;
72 memcpy((char *) data.data + CNID_TYPE_OFS, &rqst->cnid, sizeof(cnid_t));
73 if (dbif_put(dbd, DBIF_CNID, &key, &data, 0) < 0) {
74 rply->result = CNID_DBD_RES_ERR_DB;
79 rply->cnid = rqst->cnid;
80 rply->result = CNID_DBD_RES_OK;