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