]> arthur.barton.de Git - netatalk.git/blob - etc/cnid_dbd/dbd_update.c
e8abf5d23dd3df7ee946b7ea8e362b2c62b4485e
[netatalk.git] / etc / cnid_dbd / dbd_update.c
1 /*
2  * Copyright (C) Joerg Lenneis 2003
3  * Copyright (C) Frank Lahm 2009,2010
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 <string.h>
12 #include <errno.h>
13 #include <atalk/logger.h>
14 #include <arpa/inet.h>
15
16 #include <atalk/cnid_dbd_private.h>
17
18
19 #include "pack.h"
20 #include "dbif.h"
21 #include "dbd.h"
22
23
24 /* 
25    cnid_update: takes the given cnid and updates the metadata.
26    First, delete given CNID, then re-insert.
27 */
28
29 int dbd_update(DBD *dbd, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply)
30 {
31     DBT key, data;
32
33     memset(&key, 0, sizeof(key));
34     memset(&data, 0, sizeof(data));
35     rply->namelen = 0;
36
37     /* Try to wipe everything, also using the indexes */
38     if (dbd_delete(dbd, rqst, rply, DBIF_CNID) < 0)
39         goto err_db;
40     if (dbd_delete(dbd, rqst, rply, DBIF_IDX_DEVINO) < 0)
41         goto err_db;
42     if (dbd_delete(dbd, rqst, rply, DBIF_IDX_DIDNAME) < 0)
43         goto err_db;
44
45     /* Make a new entry. */
46     key.data = &rqst->cnid;
47     key.size = sizeof(rqst->cnid);
48     data.data = pack_cnid_data(rqst);
49     data.size = CNID_HEADER_LEN + rqst->namelen + 1;
50     memcpy(data.data, &rqst->cnid, sizeof(rqst->cnid));
51
52     if (dbif_put(dbd, DBIF_CNID, &key, &data, 0) < 0)
53         goto err_db;
54
55     LOG(log_debug, logtype_cnid, "dbd_update: Updated dbd with dev/ino: 0x%llx/0x%llx, did: %u, name: %s, cnid: %u",
56         (unsigned long long)rqst->dev, (unsigned long long)rqst->ino, ntohl(rqst->did), rqst->name, ntohl(rqst->cnid));
57
58     rply->result = CNID_DBD_RES_OK;
59     return 1;
60
61 err_db:
62     LOG(log_error, logtype_cnid, "dbd_update: Unable to update CNID: %u, dev/ino: 0x%llx/0x%llx, DID: %u: %s",
63         ntohl(rqst->cnid), (unsigned long long)rqst->dev, (unsigned long long)rqst->ino, ntohl(rqst->did), rqst->name);
64
65     rply->result = CNID_DBD_RES_ERR_DB;
66     return -1;
67 }