2 * $Id: cnid_close.c,v 1.15 2001-12-13 02:39:37 jmarcus Exp $
7 #endif /* HAVE_CONFIG_H */
12 #endif /* HAVE_UNISTD_H */
15 #endif /* HAVE_FCNTL_H */
22 #include <atalk/cnid.h>
24 #include "cnid_private.h"
26 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)) {
37 char wd[MAXPATHLEN + 1];
39 /* Save the current working directory so we can restore it
41 getcwd(wd, MAXPATHLEN);
43 lock.l_type = F_WRLCK;
44 lock.l_whence = SEEK_SET;
45 lock.l_start = lock.l_len = 0;
46 if (fcntl(db->lockfd, F_SETLK, &lock) == 0) {
49 /* Checkpoint the databases until we can checkpoint no
51 rc = txn_checkpoint(db->dbenv, 0, 0, 0);
52 while (rc == DB_INCOMPLETE) {
53 rc = txn_checkpoint(db->dbenv, 0, 0, 0);
56 chdir(db->dbenv->db_log_dir ? db->dbenv->db_log_dir : db->dbenv->db_home);
57 #if DB_VERSION_MINOR > 2
58 if ((rc = log_archive(db->dbenv, &list, DB_ARCH_LOG)) != 0) {
59 #else /* DB_VERSION_MINOR < 2 */
60 if ((rc = log_archive(db->dbenv, &list, DB_ARCH_LOG, NULL)) != 0) {
61 #endif /* DB_VERSION_MINOR */
62 syslog(LOG_ERR, "cnid_close: Unable to archive logfiles: %s",
67 for (first = list; *list != NULL; ++list) {
68 if ((rc = remove(*list)) != 0) {
70 syslog(LOG_INFO, "cnid_close: failed to remove %s: %s",
81 db->db_didname->close(db->db_didname, 0);
82 db->db_devino->close(db->db_devino, 0);
83 db->db_cnid->close(db->db_cnid, 0);
84 db->dbenv->close(db->dbenv, 0);
86 if (db->lockfd > -1) {
87 close(db->lockfd); /* This will also release any locks we have. */