2
* $Id: cnid_close.c,v 1.25.2.2 2003/03/19 11:50:18 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));
87
(void)remove(db->lock_file);
89
#endif /* CNID_DB_CDB */
91
db->db_didname->close(db->db_didname, 0);
92
db->db_devino->close(db->db_devino, 0);
93
db->db_cnid->close(db->db_cnid, 0);
95
db->db_mangle->close(db->db_mangle, 0);
96
#endif /* FILE_MANGLING */
97
db->dbenv->close(db->dbenv, 0);
100
if (db->lockfd > -1) {
101
close(db->lockfd); /* This will also release any locks we have. */
103
#endif /* CNID_DB_CDB */