7 #include <atalk/cnid.h>
9 #include "cnid_private.h"
11 void cnid_close(void *CNID)
18 /* flush the transaction log and delete the log file if we can. */
19 if ((db->lockfd > -1) && ((db->flags & CNIDFLAG_DB_RO) == 0)) {
22 lock.l_type = F_WRLCK;
23 lock.l_whence = SEEK_SET;
24 lock.l_start = lock.l_len = 0;
25 if (fcntl(db->lockfd, F_SETLK, &lock) == 0) {
29 txnp = db->dbenv.tx_info;
30 errno = txn_checkpoint(txnp, 0, 0);
31 while (errno == DB_INCOMPLETE)
32 errno = txn_checkpoint(txnp, 0, 0);
34 /* we've checkpointed, so clean up the log files.
35 * NOTE: any real problems will make log_archive return an error. */
36 chdir(db->dbenv.db_log_dir ? db->dbenv.db_log_dir : db->dbenv.db_home);
37 if (!log_archive(db->dbenv.lg_info, &first, DB_ARCH_LOG, NULL)) {
40 if (truncate(*list, 0) < 0)
41 syslog(LOG_INFO, "cnid_close: failed to truncate %s: %m", *list);
49 db->db_didname->close(db->db_didname, 0);
50 db->db_devino->close(db->db_devino, 0);
51 db->db_cnid->close(db->db_cnid, 0);
52 db_appexit(&db->dbenv);
54 close(db->lockfd); /* this will also close any lock we have. */
55 ad_close(&db->rootinfo, ADFLAGS_HF);