]> arthur.barton.de Git - netatalk.git/blob - etc/cnid_dbd/dbd_delete.c
Merge master
[netatalk.git] / etc / cnid_dbd / dbd_delete.c
1 /*
2  * $Id: dbd_delete.c,v 1.5 2009-07-12 09:21:34 franklahm Exp $
3  *
4  * Copyright (C) Joerg Lenneis 2003
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 <string.h>
13 #include <errno.h>
14 #include <arpa/inet.h>
15
16 #include <atalk/logger.h>
17 #include <atalk/cnid_dbd_private.h>
18
19 #include "dbif.h"
20 #include "dbd.h"
21 #include "pack.h"
22
23 int dbd_delete(DBD *dbd, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply, int idx)
24 {
25     DBT key;
26     int rc;
27     unsigned char *buf;
28
29     memset(&key, 0, sizeof(key));
30     rply->namelen = 0;
31
32     switch (idx) {
33     case DBIF_IDX_DEVINO:
34         buf = pack_cnid_data(rqst);
35         key.data = buf + CNID_DEVINO_OFS;
36         key.size = CNID_DEVINO_LEN;
37         if ((rc = dbif_del(dbd, DBIF_IDX_DEVINO, &key, 0)) < 0) {
38             LOG(log_error, logtype_cnid, "dbd_delete: Unable to delete entry for dev/ino: 0x%llx/0x%llx",
39                 (unsigned long long)rqst->dev, (unsigned long long)rqst->ino);
40             rply->result = CNID_DBD_RES_ERR_DB;
41             return -1;
42         }
43         if (rc) {
44             LOG(log_debug, logtype_cnid, "cnid_delete: deleted dev/ino: 0x%llx/0x%llx",
45                 (unsigned long long)rqst->dev, (unsigned long long)rqst->ino);
46             rply->result = CNID_DBD_RES_OK;
47         } else {
48             LOG(log_debug, logtype_cnid, "cnid_delete: dev/ino: 0x%llx/0x%llx not in database", 
49                 (unsigned long long)rqst->dev, (unsigned long long)rqst->ino);
50             rply->result = CNID_DBD_RES_NOTFOUND;
51         }
52         break;
53     case DBIF_IDX_DIDNAME:
54         buf = pack_cnid_data(rqst);
55         key.data = buf + CNID_DID_OFS;
56         key.size = CNID_DID_LEN + rqst->namelen + 1;
57         if ((rc = dbif_del(dbd, DBIF_IDX_DIDNAME, &key, 0)) < 0) {
58             LOG(log_error, logtype_cnid, "dbd_delete: Unable to delete entry for DID: %lu, name: %s",
59                 ntohl(rqst->did), rqst->name);
60             rply->result = CNID_DBD_RES_ERR_DB;
61             return -1;
62         }
63         if (rc) {
64             LOG(log_debug, logtype_cnid, "cnid_delete: deleted DID: %lu, name: %s",
65                 ntohl(rqst->did), rqst->name);
66             rply->result = CNID_DBD_RES_OK;
67         } else {
68             LOG(log_debug, logtype_cnid, "cnid_delete: DID: %lu, name: %s not in database",
69                 ntohl(rqst->did), rqst->name);
70             rply->result = CNID_DBD_RES_NOTFOUND;
71         }
72         break;
73     default:
74         key.data = (void *) &rqst->cnid;
75         key.size = sizeof(rqst->cnid);
76
77         if ((rc = dbif_del(dbd, DBIF_CNID, &key, 0)) < 0) {
78             LOG(log_error, logtype_cnid, "dbd_delete: Unable to delete entry for CNID %u", ntohl(rqst->cnid));
79             rply->result = CNID_DBD_RES_ERR_DB;
80             return -1;
81         }
82         if (rc) {
83             LOG(log_debug, logtype_cnid, "cnid_delete: CNID %u deleted", ntohl(rqst->cnid));
84             rply->result = CNID_DBD_RES_OK;
85         } else {
86             LOG(log_debug, logtype_cnid, "cnid_delete: CNID %u not in database", ntohl(rqst->cnid));
87             rply->result = CNID_DBD_RES_NOTFOUND;
88         }
89     }
90
91     return 1;
92 }