]> arthur.barton.de Git - netatalk.git/blob - libatalk/cnid/cnid_delete.c
Initial revision
[netatalk.git] / libatalk / cnid / cnid_delete.c
1 /* 
2  * Copyright (c) 1999. Adrian Sun (asun@zoology.washington.edu)
3  * All Rights Reserved. See COPYRIGHT.
4  *
5  * cnid_delete: delete a CNID from the database 
6  */
7
8 #include <stdio.h>
9 #include <string.h>
10 #include <errno.h>
11 #include <syslog.h>
12
13 #include <db.h>
14 #include <netatalk/endian.h>
15 #include <atalk/adouble.h>
16 #include <atalk/cnid.h>
17
18 #include "cnid_private.h"
19
20 int cnid_delete(void *CNID, const cnid_t id)
21 {
22   CNID_private *db;
23   DBT key, data;
24   DB_TXN *tid;
25   DB_TXNMGR *txnp;
26
27   if (!(db = CNID) || !id || (db->flags & CNIDFLAG_DB_RO))
28     return -1;
29
30   txnp = db->dbenv.tx_info;
31   memset(&key, 0, sizeof(key));
32   memset(&data, 0, sizeof(data));
33   
34
35 retry:
36   if (errno = txn_begin(txnp, NULL, &tid)) {
37     return errno;
38   }
39
40   /* get from main database */
41   key.data = &id;
42   key.size = sizeof(id);
43   if (errno = db->db_cnid->get(db->db_cnid, tid, &key, &data, 0)) {
44     txn_abort(tid);
45     switch (errno) {
46     case EAGAIN:
47       goto retry;
48       
49     case DB_NOTFOUND:
50       syslog(LOG_INFO, "cnid_delete: CNID(%x) not in database", id);
51       return 0;
52     default:
53       syslog(LOG_ERR, "cnid_delete: can't delete entry");
54       return errno;
55     }
56   }
57   
58   /* now delete from dev/ino database */
59   key.data = data.data;
60   key.size = CNID_DEVINO_LEN;
61   if (errno = db->db_devino->del(db->db_devino, tid, &key, 0)) {
62     if (errno == EAGAIN) {
63       txn_abort(tid);
64       goto retry;
65     }
66
67     /* be silent if there isn't an entry */
68     if (errno != DB_NOTFOUND) {
69       txn_abort(tid);
70       goto abort_err;
71     }
72   }
73
74   /* get data from the did/name database */
75   /* free from did/macname, did/shortname, and did/longname databases */
76
77   /* delete from did/name database */
78   key.data = data.data + CNID_DEVINO_LEN;
79   key.size = data.size - CNID_DEVINO_LEN;
80   if (errno = db->db_didname->del(db->db_didname, tid, &key, 0)) {
81     if (errno == EAGAIN) {
82       txn_abort(tid);
83       goto retry;
84     }
85     
86     /* be silent if there isn't an entry */
87     if (errno != DB_NOTFOUND) {
88       txn_abort(tid);
89       goto abort_err;
90     }
91   }
92
93   /* now delete from main database */
94   key.data = &id;
95   key.size = sizeof(id);
96   if (errno = db->db_cnid->del(db->db_cnid, tid, &key, 0)) {
97     txn_abort(tid);
98     if (errno == EAGAIN) {
99       goto retry;
100     }
101     goto abort_err;
102   }
103
104   return txn_commit(tid);
105
106 abort_err:
107   syslog(LOG_ERR, "cnid_del: unable to delete CNID(%x)", id);
108   return errno;
109 }