]> arthur.barton.de Git - netatalk.git/blob - etc/cnid_dbd/dbd_rebuild_add.c
f1bf7aca30fb219b4a9cb68d63c41c163d0e2a19
[netatalk.git] / etc / cnid_dbd / dbd_rebuild_add.c
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
26 int 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