]> arthur.barton.de Git - netatalk.git/blob - etc/cnid_dbd/dbd_rebuild_add.c
- merge branch-netatalk-afp-3x-dev, HEAD was tagged before
[netatalk.git] / etc / cnid_dbd / dbd_rebuild_add.c
1 /*
2  * $Id: dbd_rebuild_add.c,v 1.2 2005-04-28 20:49:48 bfernhomberg Exp $
3  *
4  * Copyright (C) Joerg Lenneis 2005
5  * All Rights Reserved.  See COPYING.
6  */
7
8 #ifdef HAVE_CONFIG_H
9 #include "config.h"
10 #endif /* HAVE_CONFIG_H */
11
12 #include <stdio.h>
13 #include <string.h>
14 #include <atalk/logger.h>
15 #include <netatalk/endian.h>
16 #include <atalk/cnid_dbd_private.h>
17
18
19 #include "pack.h"
20 #include "dbif.h"
21 #include "dbd.h"
22
23
24 /* rebuild_add: Enter all fields (including the CNID) into the database and
25    update the current cnid, for emergency repairs. */
26
27 int dbd_rebuild_add(struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply)
28 {
29     DBT key, data;
30     cnid_t cur, tmp, id;
31     
32     memset(&key, 0, sizeof(key));
33     memset(&data, 0, sizeof(data));
34
35     rply->namelen = 0;
36
37     key.data = &rqst->cnid;
38     key.size = sizeof(cnid_t);
39
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));
43
44     /* FIXME: In cnid_cdb.c Bjoern does a lookup here and returns the CNID found if sucessful. Why? */
45
46     if (dbif_put(DBIF_IDX_CNID, &key, &data, 0) < 0) {
47         rply->result = CNID_DBD_RES_ERR_DB;
48         return -1;
49     }
50
51     key.data = ROOTINFO_KEY;   
52     key.size = ROOTINFO_KEYLEN;
53     
54     if (dbif_get(DBIF_IDX_CNID, &key, &data, 0) <= 0) {
55         /* FIXME: If we cannot find ROOTINFO_KEY, should this be considered
56            fatal or should we just return 0 and roll back? */
57         rply->result = CNID_DBD_RES_ERR_DB;
58         return -1;
59     }
60     
61     memcpy(&tmp, (char *) data.data + CNID_TYPE_OFS, sizeof(cnid_t));    
62     cur = ntohl(tmp);
63     id  = ntohl(rqst->cnid);
64
65     if (id > cur) {
66         data.size = ROOTINFO_DATALEN;
67         memcpy((char *) data.data + CNID_TYPE_OFS, &rqst->cnid, sizeof(cnid_t));
68         if (dbif_put(DBIF_IDX_CNID, &key, &data, 0) < 0) {
69             rply->result = CNID_DBD_RES_ERR_DB;
70             return -1;
71         }
72     }
73     
74     rply->cnid = rqst->cnid;
75     rply->result = CNID_DBD_RES_OK;
76     return 1;
77 }
78
79