2 * $Id: cnid_delete.c,v 1.14 2002-08-30 03:12:52 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"
29 #endif /* CNID_DB_CDB */
31 int cnid_delete(void *CNID, const cnid_t id) {
36 #endif /* CNID_DB_CDB */
39 if (!(db = CNID) || !id || (db->flags & CNIDFLAG_DB_RO)) {
43 memset(&key, 0, sizeof(key));
44 memset(&data, 0, sizeof(data));
46 /* Get from ain CNID database. */
47 key.data = (cnid_t *)&id;
48 key.size = sizeof(id);
50 rc = db->db_cnid->get(db->db_cnid, NULL, &key, &data, 0);
56 case DB_LOCK_DEADLOCK:
58 #endif /* CNID_DB_CDB */
61 LOG(log_info, logtype_default, "cnid_delete: CNID %u not in database",
66 LOG(log_error, logtype_default, "cnid_delete: Unable to delete entry: %s",
74 if ((rc = txn_begin(db->dbenv, NULL, &tid, 0)) != 0) {
75 LOG(log_error, logtype_default, "cnid_delete: Failed to begin transaction: %s",
79 #endif /* CNID_DB_CDB */
81 /* Now delete from the main CNID database. */
82 key.data = (cnid_t *)&id;
83 key.size = sizeof(id);
84 if ((rc = db->db_cnid->del(db->db_cnid, tid, &key, 0))) {
87 if ((ret = txn_abort(tid)) != 0) {
88 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s", db_strerror(ret));
92 case DB_LOCK_DEADLOCK:
95 #endif /* CNID_DB_CDB */
99 #endif /* CNID_DB_CDB */
102 /* Now delete from dev/ino database. */
103 key.data = data.data;
104 key.size = CNID_DEVINO_LEN;
105 if ((rc = db->db_devino->del(db->db_devino, tid, &key, 0))) {
108 case DB_LOCK_DEADLOCK:
109 if ((rc = txn_abort(tid)) != 0) {
110 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
115 #endif /* CNID_DB_CDB */
117 /* Quietly fall through if the entry isn't found. */
121 if ((rc = txn_abort(tid)) != 0) {
122 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
126 #endif /* CNID_DB_CDB */
131 /* Get data from the did/name database.
132 * TODO Also handle did/macname, did/shortname, and did/longname. */
133 key.data = (char *)data.data + CNID_DEVINO_LEN;
134 key.size = data.size - CNID_DEVINO_LEN;
135 if ((rc = db->db_didname->del(db->db_didname, tid, &key, 0))) {
138 case DB_LOCK_DEADLOCK:
139 if ((rc = txn_abort(tid)) != 0) {
140 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
145 #endif /* CNID_DB_CDB */
150 if ((rc = txn_abort(tid)) != 0) {
151 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
155 #endif /* CNID_DB_CDB */
161 LOG(log_info, logtype_default, "cnid_delete: Deleting CNID %u", ntohl(id));
164 if ((rc = txn_commit(tid, 0)) != 0) {
165 LOG(log_error, logtype_default, "cnid_delete: Failed to commit transaction: %s",
169 #endif /* CNID_DB_CDB */
173 LOG(log_error, logtype_default, "cnid_delete: Unable to delete CNID %u: %s",
174 ntohl(id), db_strerror(rc));