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