1/* gdbmclose.c - Close a previously opened dbm file. */
2
3/*  This file is part of GDBM, the GNU data base manager, by Philip A. Nelson.
4    Copyright (C) 1990, 1991, 1993  Free Software Foundation, Inc.
5
6    GDBM is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    GDBM is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with GDBM; see the file COPYING.  If not, write to
18    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
19
20    You may contact the author by:
21       e-mail:  phil@cs.wwu.edu
22      us-mail:  Philip A. Nelson
23                Computer Science Department
24                Western Washington University
25                Bellingham, WA 98226
26
27*************************************************************************/
28
29
30/* include system configuration before all else. */
31#include "autoconf.h"
32
33#include "gdbmdefs.h"
34
35/* Close the dbm file and free all memory associated with the file DBF.
36   Before freeing members of DBF, check and make sure that they were
37   allocated.  */
38
39void
40gdbm_close (dbf)
41     gdbm_file_info *dbf;
42{
43  register int index;	/* For freeing the bucket cache. */
44
45  /* Make sure the database is all on disk. */
46  if (dbf->read_write != GDBM_READER)
47    fsync (dbf->desc);
48
49  /* Close the file and free all malloced memory. */
50  if (dbf->file_locking)
51    {
52      UNLOCK_FILE(dbf);
53    }
54  close (dbf->desc);
55  free (dbf->name);
56  if (dbf->dir != NULL) free (dbf->dir);
57
58  if (dbf->bucket_cache != NULL) {
59    for (index = 0; index < dbf->cache_size; index++) {
60      if (dbf->bucket_cache[index].ca_bucket != NULL)
61	free (dbf->bucket_cache[index].ca_bucket);
62      if (dbf->bucket_cache[index].ca_data.dptr != NULL)
63	free (dbf->bucket_cache[index].ca_data.dptr);
64    }
65    free (dbf->bucket_cache);
66  }
67  if ( dbf->header != NULL ) free (dbf->header);
68  free (dbf);
69}
70