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