2 * $Id: cnid_delete.c,v 1.13 2002-01-19 21:42:08 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 */
18 #include <atalk/logger.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));
40 /* Get from ain CNID database. */
41 key.data = (cnid_t *)&id;
42 key.size = sizeof(id);
44 rc = db->db_cnid->get(db->db_cnid, NULL, &key, &data, 0);
49 case DB_LOCK_DEADLOCK:
53 LOG(log_info, logtype_default, "cnid_delete: CNID %u not in database",
58 LOG(log_error, logtype_default, "cnid_delete: Unable to delete entry: %s",
65 if ((rc = txn_begin(db->dbenv, NULL, &tid, 0)) != 0) {
66 LOG(log_error, logtype_default, "cnid_delete: Failed to begin transaction: %s",
71 /* Now delete from the main CNID database. */
72 key.data = (cnid_t *)&id;
73 key.size = sizeof(id);
74 if ((rc = db->db_cnid->del(db->db_cnid, tid, &key, 0))) {
76 if ((ret = txn_abort(tid)) != 0) {
77 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s", db_strerror(ret));
81 case DB_LOCK_DEADLOCK:
88 /* Now delete from dev/ino database. */
90 key.size = CNID_DEVINO_LEN;
91 if ((rc = db->db_devino->del(db->db_devino, tid, &key, 0))) {
93 case DB_LOCK_DEADLOCK:
94 if ((rc = txn_abort(tid)) != 0) {
95 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
101 /* Quietly fall through if the entry isn't found. */
104 if ((rc = txn_abort(tid)) != 0) {
105 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
113 /* Get data from the did/name database.
114 * TODO Also handle did/macname, did/shortname, and did/longname. */
115 key.data = (char *)data.data + CNID_DEVINO_LEN;
116 key.size = data.size - CNID_DEVINO_LEN;
117 if ((rc = db->db_didname->del(db->db_didname, tid, &key, 0))) {
119 case DB_LOCK_DEADLOCK:
120 if ((rc = txn_abort(tid)) != 0) {
121 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
129 if ((rc = txn_abort(tid)) != 0) {
130 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
139 LOG(log_info, logtype_default, "cnid_delete: Deleting CNID %u", ntohl(id));
141 if ((rc = txn_commit(tid, 0)) != 0) {
142 LOG(log_error, logtype_default, "cnid_delete: Failed to commit transaction: %s",
149 LOG(log_error, logtype_default, "cnid_delete: Unable to delete CNID %u: %s",
150 ntohl(id), db_strerror(rc));