]> arthur.barton.de Git - netatalk.git/blob - libatalk/cnid/cnid_close.c
Initial revision
[netatalk.git] / libatalk / cnid / cnid_close.c
1 #include <unistd.h>
2 #include <fcntl.h>
3 #include <syslog.h>
4 #include <db.h>
5 #include <errno.h>
6
7 #include <atalk/cnid.h>
8
9 #include "cnid_private.h"
10
11 void cnid_close(void *CNID)
12 {
13   CNID_private *db;
14
15   if (!(db = CNID))
16     return;
17
18   /* flush the transaction log and delete the log file if we can. */
19   if ((db->lockfd > -1) && ((db->flags & CNIDFLAG_DB_RO) == 0)) {
20     struct flock lock;
21
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) {
26       DB_TXNMGR *txnp;
27       char **list, **first;
28       
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);
33       
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)) {
38         list = first;
39         while (*list) {
40           if (truncate(*list, 0) < 0)
41             syslog(LOG_INFO, "cnid_close: failed to truncate %s: %m", *list);
42           list++;
43         }
44         free(first); 
45       }
46     }
47   }
48
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);
53   if (db->lockfd > -1)
54     close(db->lockfd); /* this will also close any lock we have. */
55   ad_close(&db->rootinfo, ADFLAGS_HF);
56   free(db);
57 }