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