2 * $Id: cnid_delete.c,v 1.9.2.2 2001-12-03 15:53:39 jmarcus Exp $
4 * Copyright (c) 1999. Adrian Sun (asun@zoology.washington.edu)
5 * All Rights Reserved. See COPYRIGHT.
7 * cnid_delete: delete a CNID from the database
12 #endif /* HAVE_CONFIG_H */
21 #include <netatalk/endian.h>
22 #include <atalk/adouble.h>
23 #include <atalk/cnid.h>
25 #include "cnid_private.h"
27 int cnid_delete(void *CNID, const cnid_t id) {
33 if (!(db = CNID) || !id || (db->flags & CNIDFLAG_DB_RO)) {
37 memset(&key, 0, sizeof(key));
38 memset(&data, 0, sizeof(data));
41 if ((rc = txn_begin(db->dbenv, NULL, &tid, 0)) != 0) {
42 syslog(LOG_ERR, "cnid_delete: Failed to begin transaction: %s",
47 /* Get from ain CNID database. */
48 key.data = (cnid_t *)&id;
49 key.size = sizeof(id);
50 if ((rc = db->db_cnid->get(db->db_cnid, tid, &key, &data, 0))) {
52 if ((ret = txn_abort(tid)) != 0) {
53 syslog(LOG_ERR, "cnid_delete: txn_abort: %s", db_strerror(ret));
57 case DB_LOCK_DEADLOCK:
60 syslog(LOG_INFO, "cnid_delete: CNID %u not in database",
64 syslog(LOG_ERR, "cnid_delete: Unable to delete entry: %s",
70 /* Now delete from dev/ino database. */
72 key.size = CNID_DEVINO_LEN;
73 if ((rc = db->db_devino->del(db->db_devino, tid, &key, 0))) {
75 case DB_LOCK_DEADLOCK:
76 if ((rc = txn_abort(tid)) != 0) {
77 syslog(LOG_ERR, "cnid_delete: txn_abort: %s",
83 /* Quietly fall through if the entry isn't found. */
86 if ((rc = txn_abort(tid)) != 0) {
87 syslog(LOG_ERR, "cnid_delete: txn_abort: %s",
95 /* Get data from the did/name database.
96 * TODO Also handle did/macname, did/shortname, and did/longname. */
98 key.data = (char *)data.data + CNID_DEVINO_LEN;
99 key.size = data.size - CNID_DEVINO_LEN;
100 if ((rc = db->db_didname->del(db->db_didname, tid, &key, 0))) {
102 case DB_LOCK_DEADLOCK:
103 if ((rc = txn_abort(tid)) != 0) {
104 syslog(LOG_ERR, "cnid_delete: txn_abort: %s",
112 if ((rc = txn_abort(tid)) != 0) {
113 syslog(LOG_ERR, "cnid_delete: txn_abort: %s",
121 /* Now delete from the main CNID database. */
122 key.data = (cnid_t *)&id;
123 key.size = sizeof(id);
124 if ((rc = db->db_cnid->del(db->db_cnid, tid, &key, 0))) {
126 if ((ret = txn_abort(tid)) != 0) {
127 syslog(LOG_ERR, "cnid_delete: txn_abort: %s", db_strerror(ret));
131 case DB_LOCK_DEADLOCK:
139 syslog(LOG_INFO, "cnid_delete: Deleting CNID %u", ntohl(id));
141 if ((rc = txn_commit(tid, 0)) != 0) {
142 syslog(LOG_ERR, "cnid_delete: Failed to commit transaction: %s",
149 syslog(LOG_ERR, "cnid_delete: Unable to delete CNID %u: %s",
150 ntohl(id), db_strerror(rc));