2 * $Id: cnid_close.c,v 1.31 2003-06-26 02:15:21 didg Exp $
7 #endif /* HAVE_CONFIG_H */
12 #endif /* HAVE_UNISTD_H */
15 #endif /* HAVE_FCNTL_H */
17 #include <atalk/logger.h>
22 #include "cnid_private.h"
23 #include <atalk/cnid.h>
25 void cnid_close(void *CNID) {
34 /* Flush the transaction log and delete the log file if we can. */
35 if ((db->lockfd > -1) && ((db->flags & CNIDFLAG_DB_RO) == 0)) {
38 lock.l_type = F_WRLCK;
39 lock.l_whence = SEEK_SET;
40 lock.l_start = lock.l_len = 0;
41 if (fcntl(db->lockfd, F_SETLK, &lock) == 0) {
45 /* Checkpoint the databases until we can checkpoint no
47 #if DB_VERSION_MAJOR >= 4
48 #if DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 1
49 db->dbenv->txn_checkpoint(db->dbenv, 0, 0, 0);
51 rc = db->dbenv->txn_checkpoint(db->dbenv, 0, 0, 0);
52 #endif /* DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 1 */
54 rc = txn_checkpoint(db->dbenv, 0, 0, 0);
55 #endif /* DB_VERSION_MAJOR >= 4 */
56 #if DB_VERSION_MAJOR < 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR < 1)
57 while (rc == DB_INCOMPLETE) {
58 #if DB_VERSION_MAJOR >= 4
59 rc = db->dbenv->txn_checkpoint(db->dbenv, 0, 0, 0);
61 rc = txn_checkpoint(db->dbenv, 0, 0, 0);
62 #endif /* DB_VERSION_MAJOR >= 4 */
64 #endif /* DB_VERSION_MAJOR < 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR < 1) */
66 #if DB_VERSION_MAJOR >= 4
67 if ((rc = db->dbenv->log_archive(db->dbenv, &list, DB_ARCH_ABS)) != 0) {
68 #elif DB_VERSION_MINOR > 2
69 if ((rc = log_archive(db->dbenv, &list, DB_ARCH_ABS)) != 0) {
70 #else /* DB_VERSION_MINOR < 2 */
71 if ((rc = log_archive(db->dbenv, &list, DB_ARCH_ABS, NULL)) != 0) {
72 #endif /* DB_VERSION_MINOR */
73 LOG(log_error, logtype_default, "cnid_close: Unable to archive logfiles: %s", db_strerror(rc));
77 for (first = list; *list != NULL; ++list) {
78 if ((rc = remove(*list)) != 0) {
80 LOG(log_info, logtype_default, "cnid_close: failed to remove %s: %s", *list, strerror(rc));
88 #endif /* CNID_DB_CDB */
90 db->db_didname->sync(db->db_didname, 0);
91 db->db_didname->close(db->db_didname, 0);
92 db->db_devino->sync(db->db_devino, 0);
93 db->db_devino->close(db->db_devino, 0);
94 db->db_cnid->sync(db->db_cnid, 0);
95 db->db_cnid->close(db->db_cnid, 0);
97 db->db_mangle->sync(db->db_mangle, 0);
98 db->db_mangle->close(db->db_mangle, 0);
99 #endif /* FILE_MANGLING */
100 db->dbenv->close(db->dbenv, 0);
102 LOG (log_debug, logtype_default, "Database closed");
104 if ((db->lockfd > -1) && ((db->flags & CNIDFLAG_DB_RO) == 0)) {
107 lock.l_type = F_WRLCK;
108 lock.l_whence = SEEK_SET;
109 lock.l_start = lock.l_len = 0;
110 if (fcntl(db->lockfd, F_SETLK, &lock) == 0) {
111 (void)unlink(db->lock_file);
114 if ((db->lockfd > -1)) {
115 close(db->lockfd); /* This will also release any locks we have. */