aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2018-07-01 10:08:55 +0300
committerSergey Poznyakoff <gray@gnu.org>2018-07-01 10:19:36 +0300
commit030e685eb9df82f63d73a1bf206da84b7aa52374 (patch)
treedcfc6693121e332d2cdb7c579e65ed0f397dc78e
parentd6fe3b45bc669a6bc3f21e4bda69c6a052d78482 (diff)
downloadgdbm-030e685eb9df82f63d73a1bf206da84b7aa52374.tar.gz
gdbm-030e685eb9df82f63d73a1bf206da84b7aa52374.tar.bz2
Change return value of gdbm_close and gdbm_sync
* src/gdbm.h.in (gdbm_close, gdbm_sync): Return int (GDBM_FILE_CLOSE_ERROR, GDBM_FILE_SYNC_ERROR): New error codes. * src/gdbmclose.c (gdbm_close): Return 0 on success, -1 on failure. Set gdbm_errno and errno. * src/gdbmsync.c (gdbm_sync): Likewise. * src/gdbmerrno.c: Handle new error codes. * src/mmap.c (_gdbm_mapped_sync): Set gdbm_errno. * src/proto.h (gdbm_file_sync): Set gdbm_errno. * doc/gdbm.3: Document changes. * doc/gdbm.texi: Document changes. * NEWS: Document changes. * configure.ac: Set patchlevel. * tests/Makefile.am: Add new test. * tests/testsuite.at: Add new test. * tests/closerr.at: New test case. * tests/closerr.c: New test program. * tests/gtdel.c: Check gdbm_close return. * tests/gtdump.c: Likewise. * tests/gtfetch.c: Likewise. * tests/gtload.c: Likewise. * tests/gtopt.c: Likewise. * tests/gtrecover.c: Likewise.
-rw-r--r--NEWS10
-rw-r--r--configure.ac2
-rw-r--r--doc/gdbm.310
-rw-r--r--doc/gdbm.texi16
-rw-r--r--src/gdbm.h.in10
-rw-r--r--src/gdbmclose.c16
-rw-r--r--src/gdbmerrno.c8
-rw-r--r--src/gdbmsync.c5
-rw-r--r--src/mmap.c14
-rw-r--r--src/proto.h11
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/closerr.at5
-rw-r--r--tests/closerr.c56
-rw-r--r--tests/gtdel.c8
-rw-r--r--tests/gtdump.c8
-rw-r--r--tests/gtfetch.c8
-rw-r--r--tests/gtload.c7
-rw-r--r--tests/gtopt.c8
-rw-r--r--tests/gtrecover.c8
-rw-r--r--tests/testsuite.at2
20 files changed, 178 insertions, 36 deletions
diff --git a/NEWS b/NEWS
index 3093d10..f81a442 100644
--- a/NEWS
+++ b/NEWS
@@ -1,12 +1,20 @@
-GNU dbm NEWS -- history of user-visible changes. 2018-06-27
+GNU dbm NEWS -- history of user-visible changes. 2018-07-01
Copyright (C) 1990-2018 Free Software Foundation, Inc.
See the end of file for copying conditions.
Please send gdbm bug reports to <bug-gdbm@gnu.org>.
+Version 1.16.90 (Git)
+
+* int gdbm_close and gdbm_sync
+
+Both functions now return 0 on success. On error, they return -1
+and set gdbm_errno and errno to the appropriate error codes.
+
+
Version 1.16 - 2018-06-27
* Maintain sorting order of the available block list after coalescing
This is a very long-standing bug, dated back to the time when optional
coalescing of available blocks with the newly released block was
diff --git a/configure.ac b/configure.ac
index 4306bcd..3ca6252 100644
--- a/configure.ac
+++ b/configure.ac
@@ -14,13 +14,13 @@
#
# You should have received a copy of the GNU General Public License
# along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
m4_define([_GDBM_VERSION_MAJOR], 1)
m4_define([_GDBM_VERSION_MINOR], 16)
-dnl m4_define([_GDBM_VERSION_PATCH], 0)
+m4_define([_GDBM_VERSION_PATCH], 90)
AC_INIT([gdbm],
_GDBM_VERSION_MAJOR._GDBM_VERSION_MINOR[]m4_ifdef([_GDBM_VERSION_PATCH],._GDBM_VERSION_PATCH),
[bug-gdbm@gnu.org],,
[http://www.gnu.org/software/gdbm])
AC_PREREQ(2.69)
diff --git a/doc/gdbm.3 b/doc/gdbm.3
index 6107d9a..d803748 100644
--- a/doc/gdbm.3
+++ b/doc/gdbm.3
@@ -10,13 +10,13 @@
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
.\" GNU General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public License
.\" along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
-.TH GDBM 3 "July 8, 2016" "GDBM" "GDBM User Reference"
+.TH GDBM 3 "July 1, 2018" "GDBM" "GDBM User Reference"
.SH NAME
GDBM \- The GNU database manager. Includes \fBdbm\fR and \fBndbm\fR
compatibility.
.SH SYNOPSIS
.nf
.B #include <gdbm.h>
@@ -28,13 +28,13 @@ compatibility.
.BI "GDBM_FILE gdbm_open (const char *" name ", int " block_size ", "
.ti +21
.BI "int " flags ", int " mode ", "
.ti +21
.BI "void (*" fatal_func ")(const char *))";
.br
-.BI "void gdbm_close (GDBM_FILE " dbf ");"
+.BI "int gdbm_close (GDBM_FILE " dbf ");"
.br
.BI "int gdbm_store (GDBM_FILE " dbf ", datum " key ", datum " content ", int " flag );
.br
.BI "datum gdbm_fetch (GDBM_FILE " dbf ", datum " key );
.br
.BI "int gdbm_delete (GDBM_FILE " dbf ", datum " key );
@@ -42,13 +42,13 @@ compatibility.
.BI "datum gdbm_firstkey (GDBM_FILE " dbf ");"
.br
.BI "datum gdbm_nextkey (GDBM_FILE " dbf ", datum " key );
.br
.BI "int gdbm_reorganize (GDBM_FILE " dbf ");"
.br
-.BI "void gdbm_sync (GDBM_FILE " dbf ");"
+.BI "int gdbm_sync (GDBM_FILE " dbf ");"
.br
.BI "int gdbm_exists (GDBM_FILE " dbf ", datum " key );
.br
.BI "const char *gdbm_strerror (gdbm_error " errno );
.br
.BI "int gdbm_setopt (GDBM_FILE " dbf ", int " option ", int " value ", int " size );
@@ -180,13 +180,13 @@ gdbmerrno.h.)
In all of the following calls, the parameter \fIdbf\fR refers to the pointer
returned from \fBgdbm_open\fR.
It is important that every file opened is also closed. This is needed to
update the reader/writer count on the file. This is done by:
-.BI "void gdbm_close (GDBM_FILE " dbf ");"
+.BI "int gdbm_close (GDBM_FILE " dbf ");"
The database is used by 3 primary routines. The first stores data in the
database.
.BI "int gdbm_store (GDBM_FILE " dbf ", datum " key ", datum " content ", int " flag );
@@ -305,13 +305,13 @@ using this reorganization. (Deleted file space will be reused.)
Unless your database was opened with the \fBGDBM_SYNC\fR flag, \fBgdbm\fR does not
wait for writes to be flushed to the disk before continuing.
The following routine can be used to guarantee that the database is
physically written to the disk file.
-.BI "void gdbm_sync (GDBM_FILE " dbf ");"
+.BI "int gdbm_sync (GDBM_FILE " dbf ");"
It will not return until the disk file state is syncronized with the
in-memory state of the database.
To convert a \fBgdbm\fR error code into English text, use this routine:
diff --git a/doc/gdbm.texi b/doc/gdbm.texi
index b5ba53d..4a0b1a7 100644
--- a/doc/gdbm.texi
+++ b/doc/gdbm.texi
@@ -212,20 +212,20 @@ library. The include file @code{gdbm.h}, that can be included by the user,
contains a definition of these functions.
@example
#include <gdbm.h>
GDBM_FILE gdbm_open(name, block_size, flags, mode, fatal_func);
-void gdbm_close(dbf);
+int gdbm_close(dbf);
int gdbm_store(dbf, key, content, flag);
datum gdbm_fetch(dbf, key);
int gdbm_delete(dbf, key);
datum gdbm_firstkey(dbf);
datum gdbm_nextkey(dbf, key);
int gdbm_reorganize(dbf);
-void gdbm_sync(dbf);
+int gdbm_sync(dbf);
int gdbm_exists(dbf, key);
char *gdbm_strerror(errno);
int gdbm_setopt(dbf, option, value, size);
int gdbm_fdesc(dbf);
int gdbm_export (GDBM_FILE, const char *, int, int);
int gdbm_export_to_file (GDBM_FILE dbf, FILE *fp);
@@ -366,20 +366,24 @@ Copy file ownership and mode from @var{src} to @var{dst}.
@cindex closing database
@cindex database, closing
It is important that every file opened is also closed. This is needed to
update the reader/writer count on the file:
-@deftypefn {gdbm interface} void gdbm_close (GDBM_FILE @var{dbf})
+@deftypefn {gdbm interface} int gdbm_close (GDBM_FILE @var{dbf})
This function closes the @code{gdbm} file and frees all memory
associated with it. The parameter is:
@table @var
@item dbf
The pointer returned by @code{gdbm_open}.
@end table
+
+@code{Gdbm_close} returns 0 on success. On error, it sets
+@code{gdbm_errno} and system @code{errno} variables to the codes
+describing the error and returns -1.
@end deftypefn
@node Count
@chapter Number of Records
@cindex number of records
@deftypefn {gdbm interface} int gdbm_count (GDBM_FILE @var{dbf}, @
@@ -675,21 +679,25 @@ Unless your database was opened with the @samp{GDBM_SYNC} flag,
continuing. This allows for faster writing of databases at the risk
of having a corrupted database if the application terminates in an
abnormal fashion. The following function allows the programmer to
make sure the disk version of the database has been completely updated
with all changes to the current time.
-@deftypefn {gdbm interface} void gdbm_sync (GDBM_FILE @var{dbf})
+@deftypefn {gdbm interface} int gdbm_sync (GDBM_FILE @var{dbf})
Synchronizes the changes in @var{dbf} with its disk file. The
parameter is a pointer returned by @code{gdbm_open}.
This function would usually be called after a complete set of changes
have been made to the database and before some long waiting time.
The @code{gdbm_close} function automatically calls the equivalent of
@code{gdbm_sync} so no call is needed if the database is to be closed
immediately after the set of changes have been made.
+
+@code{Gdbm_sync} returns 0 on success. On error, it sets
+@code{gdbm_errno} and system @code{errno} variables to the codes
+describing the error and returns -1.
@end deftypefn
@node Flat files
@chapter Export and Import
@cindex Flat file format
@cindex export
diff --git a/src/gdbm.h.in b/src/gdbm.h.in
index e6bdc58..6318ad8 100644
--- a/src/gdbm.h.in
+++ b/src/gdbm.h.in
@@ -110,21 +110,21 @@ extern int const gdbm_version_number[3];
/* GDBM external functions. */
extern GDBM_FILE gdbm_fd_open (int fd, const char *file_name, int block_size,
int flags, void (*fatal_func) (const char *));
extern GDBM_FILE gdbm_open (const char *, int, int, int,
void (*)(const char *));
-extern void gdbm_close (GDBM_FILE);
+extern int gdbm_close (GDBM_FILE);
extern int gdbm_store (GDBM_FILE, datum, datum, int);
extern datum gdbm_fetch (GDBM_FILE, datum);
extern int gdbm_delete (GDBM_FILE, datum);
extern datum gdbm_firstkey (GDBM_FILE);
extern datum gdbm_nextkey (GDBM_FILE, datum);
extern int gdbm_reorganize (GDBM_FILE);
-extern void gdbm_sync (GDBM_FILE);
+extern int gdbm_sync (GDBM_FILE);
extern int gdbm_exists (GDBM_FILE, datum);
extern int gdbm_setopt (GDBM_FILE, int, void *, int);
extern int gdbm_fdesc (GDBM_FILE);
extern int gdbm_export (GDBM_FILE, const char *, int, int);
extern int gdbm_export_to_file (GDBM_FILE dbf, FILE *fp);
@@ -222,15 +222,17 @@ extern int gdbm_copy_meta (GDBM_FILE dst, GDBM_FILE src);
# define GDBM_DIR_OVERFLOW 31
# define GDBM_BAD_BUCKET 32
# define GDBM_BAD_HEADER 33
# define GDBM_BAD_AVAIL 34
# define GDBM_BAD_HASH_TABLE 35
# define GDBM_BAD_DIR_ENTRY 36
-
+# define GDBM_FILE_CLOSE_ERROR 37
+# define GDBM_FILE_SYNC_ERROR 38
+
# define _GDBM_MIN_ERRNO 0
-# define _GDBM_MAX_ERRNO GDBM_BAD_DIR_ENTRY
+# define _GDBM_MAX_ERRNO GDBM_FILE_SYNC_ERROR
/* This one was never used and will be removed in the future */
# define GDBM_UNKNOWN_UPDATE GDBM_UNKNOWN_ERROR
typedef int gdbm_error;
extern int *gdbm_errno_location (void);
diff --git a/src/gdbmclose.c b/src/gdbmclose.c
index ead9187..c438ec1 100644
--- a/src/gdbmclose.c
+++ b/src/gdbmclose.c
@@ -23,16 +23,19 @@
#include "gdbmdefs.h"
/* Close the dbm file and free all memory associated with the file DBF.
Before freeing members of DBF, check and make sure that they were
allocated. */
-void
+int
gdbm_close (GDBM_FILE dbf)
{
int index; /* For freeing the bucket cache. */
+ int syserrno;
+
+ gdbm_set_errno (dbf, GDBM_NO_ERROR, FALSE);
if (dbf->desc != -1)
{
/* Make sure the database is all on disk. */
if (dbf->read_write != GDBM_READER)
gdbm_file_sync (dbf);
@@ -41,15 +44,18 @@ gdbm_close (GDBM_FILE dbf)
#if HAVE_MMAP
_gdbm_mapped_unmap (dbf);
#endif
if (dbf->file_locking)
_gdbm_unlock_file (dbf);
- close (dbf->desc);
+ if (close (dbf->desc))
+ GDBM_SET_ERRNO (dbf, GDBM_FILE_CLOSE_ERROR, FALSE);
}
+ syserrno = gdbm_last_syserr (dbf);
+
gdbm_clear_error (dbf);
free (dbf->name);
free (dbf->dir);
if (dbf->bucket_cache != NULL)
@@ -60,7 +66,13 @@ gdbm_close (GDBM_FILE dbf)
free (dbf->bucket_cache[index].ca_data.dptr);
}
free (dbf->bucket_cache);
}
free (dbf->header);
free (dbf);
+ if (gdbm_errno)
+ {
+ errno = syserrno;
+ return -1;
+ }
+ return 0;
}
diff --git a/src/gdbmerrno.c b/src/gdbmerrno.c
index 8e24b82..4ce7f9d 100644
--- a/src/gdbmerrno.c
+++ b/src/gdbmerrno.c
@@ -133,13 +133,15 @@ const char * const gdbm_errlist[_GDBM_MAX_ERRNO+1] = {
[GDBM_BACKUP_FAILED] = N_("Failed to create backup copy"),
[GDBM_DIR_OVERFLOW] = N_("Bucket directory overflow"),
[GDBM_BAD_BUCKET] = N_("Malformed bucket header"),
[GDBM_BAD_HEADER] = N_("Malformed database file header"),
[GDBM_BAD_AVAIL] = N_("Malformed avail_block"),
[GDBM_BAD_HASH_TABLE] = N_("Malformed hash table"),
- [GDBM_BAD_DIR_ENTRY] = N_("Invalid directory entry")
+ [GDBM_BAD_DIR_ENTRY] = N_("Invalid directory entry"),
+ [GDBM_FILE_CLOSE_ERROR] = N_("Error closing file"),
+ [GDBM_FILE_SYNC_ERROR] = N_("Error synchronizing file")
};
const char *
gdbm_strerror (gdbm_error error)
{
if (error < _GDBM_MIN_ERRNO || error > _GDBM_MAX_ERRNO)
@@ -175,13 +177,15 @@ gdbm_db_strerror (GDBM_FILE dbf)
int const gdbm_syserr[_GDBM_MAX_ERRNO+1] = {
[GDBM_FILE_OPEN_ERROR] = 1,
[GDBM_FILE_WRITE_ERROR] = 1,
[GDBM_FILE_SEEK_ERROR] = 1,
[GDBM_FILE_READ_ERROR] = 1,
[GDBM_FILE_STAT_ERROR] = 1,
- [GDBM_BACKUP_FAILED] = 1
+ [GDBM_BACKUP_FAILED] = 1,
+ [GDBM_FILE_CLOSE_ERROR] = 1,
+ [GDBM_FILE_SYNC_ERROR] = 1
};
/* Returns true if system errno value is meaningful for GDBM error
code N. */
int
gdbm_check_syserr (gdbm_error n)
diff --git a/src/gdbmsync.c b/src/gdbmsync.c
index 5d94cbe..a8d1002 100644
--- a/src/gdbmsync.c
+++ b/src/gdbmsync.c
@@ -21,19 +21,18 @@
#include "autoconf.h"
#include "gdbmdefs.h"
/* Make sure the database is all on disk. */
-void
+int
gdbm_sync (GDBM_FILE dbf)
{
/* Return immediately if the database needs recovery */
GDBM_ASSERT_CONSISTENCY (dbf, );
/* Initialize the gdbm_errno variable. */
gdbm_set_errno (dbf, GDBM_NO_ERROR, FALSE);
/* Do the sync on the file. */
- gdbm_file_sync (dbf);
-
+ return gdbm_file_sync (dbf);
}
diff --git a/src/mmap.c b/src/mmap.c
index 008a0f8..48e84ae 100644
--- a/src/mmap.c
+++ b/src/mmap.c
@@ -389,15 +389,19 @@ _gdbm_mapped_lseek (GDBM_FILE dbf, off_t offset, int whence)
}
/* Sync the mapped region to disk. */
int
_gdbm_mapped_sync (GDBM_FILE dbf)
{
+ int rc;
+
if (dbf->mapped_region)
- {
- return msync (dbf->mapped_region, dbf->mapped_size,
- MS_SYNC | MS_INVALIDATE);
- }
- return fsync (dbf->desc);
+ rc = msync (dbf->mapped_region, dbf->mapped_size,
+ MS_SYNC | MS_INVALIDATE);
+ else
+ rc = fsync (dbf->desc);
+ if (rc)
+ GDBM_SET_ERRNO (dbf, GDBM_FILE_SYNC_ERROR, TRUE);
+ return rc;
}
#endif
diff --git a/src/proto.h b/src/proto.h
index 22f29e4..02f6f9b 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -112,19 +112,24 @@ gdbm_file_seek (GDBM_FILE dbf, off_t off, int whence)
return _gdbm_mapped_lseek (dbf, off, whence);
#else
return lseek (dbf->desc, off, whence);
#endif
}
-static inline void
+static inline int
gdbm_file_sync (GDBM_FILE dbf)
{
#if HAVE_MMAP
- _gdbm_mapped_sync (dbf);
+ return _gdbm_mapped_sync (dbf);
#elif HAVE_FSYNC
- fsync (dbf->desc);
+ if (fsync (dbf->desc))
+ {
+ GDBM_SET_ERRNO (dbf, GDBM_FILE_SYNC_ERROR, TRUE);
+ return 1;
+ }
#else
sync ();
sync ();
+ return 0;
#endif
}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 827af58..dbe17dd 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -51,12 +51,13 @@ TESTSUITE_AT = \
blocksize01.at\
blocksize02.at\
cloexec00.at\
cloexec01.at\
cloexec02.at\
cloexec03.at\
+ closerr.at\
dbmcreate00.at\
dbmdel00.at\
dbmdel01.at\
dbmdel02.at\
dbmcvt.at\
dbmfetch00.at\
@@ -105,12 +106,13 @@ check-local: atconfig atlocal $(TESTSUITE)
if COMPAT_OPT
DBMINCLUDES = -I$(top_srcdir)/compat
DBMPROGS = dtload dtdump dtfetch dtdel d_creat_ce
endif
check_PROGRAMS = \
+ closerr\
fdop\
g_open_ce\
g_reorg_ce\
gtdel\
gtdump\
gtfetch\
diff --git a/tests/closerr.at b/tests/closerr.at
new file mode 100644
index 0000000..5f5e208
--- /dev/null
+++ b/tests/closerr.at
@@ -0,0 +1,5 @@
+# This file is part of GDBM testsuite. -*- autoconf -*-
+AT_SETUP([gdbm_close error])
+AT_KEYWORDS([close])
+AT_CHECK(closerr,1,[],[ignore])
+AT_CLEANUP
diff --git a/tests/closerr.c b/tests/closerr.c
new file mode 100644
index 0000000..5bc8fdc
--- /dev/null
+++ b/tests/closerr.c
@@ -0,0 +1,56 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 2018 Free Software Foundation, Inc.
+
+ GDBM is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GDBM is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GDBM. If not, see <http://www.gnu.org/licenses/>.
+*/
+#include "autoconf.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include "gdbm.h"
+
+int
+main (int argc, char **argv)
+{
+ GDBM_FILE dbf;
+ char dbname[] = "junk.gdbm";
+ int rc;
+
+ assert (argc == 1);
+
+ dbf = gdbm_open (dbname, 0, GDBM_NEWDB, 0600, NULL);
+ if (!dbf)
+ {
+ fprintf (stderr, "gdbm_open: %s; %s\n", gdbm_strerror (gdbm_errno),
+ strerror (errno));
+ return 1;
+ }
+ if (close (gdbm_fdesc (dbf)))
+ {
+ perror ("close");
+ return 77;
+ }
+
+ if (gdbm_close (dbf))
+ {
+ fprintf (stderr, "gdbm_close: %s; %s\n", gdbm_strerror (gdbm_errno),
+ strerror (errno));
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/tests/gtdel.c b/tests/gtdel.c
index 729086c..d0c711d 100644
--- a/tests/gtdel.c
+++ b/tests/gtdel.c
@@ -15,12 +15,13 @@
along with GDBM. If not, see <http://www.gnu.org/licenses/>.
*/
#include "autoconf.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
#include "gdbm.h"
#include "progname.h"
int
main (int argc, char **argv)
{
@@ -90,9 +91,14 @@ main (int argc, char **argv)
{
fprintf (stderr, "%s: cannot delete %s: %s\n",
progname, arg, gdbm_strerror (gdbm_errno));
rc = 2;
}
}
- gdbm_close (dbf);
+ if (gdbm_close (dbf))
+ {
+ fprintf (stderr, "gdbm_close: %s; %s\n", gdbm_strerror (gdbm_errno),
+ strerror (errno));
+ rc = 3;
+ }
exit (rc);
}
diff --git a/tests/gtdump.c b/tests/gtdump.c
index dcc27ac..fb27997 100644
--- a/tests/gtdump.c
+++ b/tests/gtdump.c
@@ -15,12 +15,13 @@
along with GDBM. If not, see <http://www.gnu.org/licenses/>.
*/
#include "autoconf.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
#include "gdbm.h"
#include "progname.h"
int
main (int argc, char **argv)
{
@@ -112,9 +113,14 @@ main (int argc, char **argv)
if (gdbm_errno != GDBM_ITEM_NOT_FOUND)
{
fprintf (stderr, "unexpected error: %s\n", gdbm_strerror (gdbm_errno));
exit (1);
}
- gdbm_close (dbf);
+ if (gdbm_close (dbf))
+ {
+ fprintf (stderr, "gdbm_close: %s; %s\n", gdbm_strerror (gdbm_errno),
+ strerror (errno));
+ exit (3);
+ }
exit (0);
}
diff --git a/tests/gtfetch.c b/tests/gtfetch.c
index c1ea45e..5070fcc 100644
--- a/tests/gtfetch.c
+++ b/tests/gtfetch.c
@@ -15,12 +15,13 @@
along with GDBM. If not, see <http://www.gnu.org/licenses/>.
*/
#include "autoconf.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
#include "gdbm.h"
#include "progname.h"
void
print_key (FILE *fp, datum key, int delim)
{
@@ -127,9 +128,14 @@ main (int argc, char **argv)
fwrite (data.dptr, data.dsize - !!data_z, 1, stdout);
free (data.dptr);
fputc ('\n', stdout);
}
- gdbm_close (dbf);
+ if (gdbm_close (dbf))
+ {
+ fprintf (stderr, "gdbm_close: %s; %s\n", gdbm_strerror (gdbm_errno),
+ strerror (errno));
+ rc = 3;
+ }
exit (rc);
}
diff --git a/tests/gtload.c b/tests/gtload.c
index 21c89b2..1493236 100644
--- a/tests/gtload.c
+++ b/tests/gtload.c
@@ -284,9 +284,14 @@ main (int argc, char **argv)
else
{
exit (1);
}
}
}
- gdbm_close (dbf);
+ if (gdbm_close (dbf))
+ {
+ fprintf (stderr, "gdbm_close: %s; %s\n", gdbm_strerror (gdbm_errno),
+ strerror (errno));
+ exit (3);
+ }
exit (0);
}
diff --git a/tests/gtopt.c b/tests/gtopt.c
index b461d56..236ae92 100644
--- a/tests/gtopt.c
+++ b/tests/gtopt.c
@@ -403,12 +403,18 @@ main (int argc, char **argv)
rc = op->test (op->valptr);
assert (rc >= 0 && rc < _res_max);
puts (resstr[rc]);
}
}
- gdbm_close (dbf);
+ if (gdbm_close (dbf))
+ {
+ fprintf (stderr, "gdbm_close: %s; %s\n", gdbm_strerror (gdbm_errno),
+ strerror (errno));
+ exit (3);
+ }
+
exit (0);
}
diff --git a/tests/gtrecover.c b/tests/gtrecover.c
index 0527c53..f5e6f97 100644
--- a/tests/gtrecover.c
+++ b/tests/gtrecover.c
@@ -16,12 +16,13 @@
*/
#include "autoconf.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
+#include <errno.h>
#include "gdbm.h"
#include "progname.h"
#include <assert.h>
const char *progname;
@@ -116,9 +117,14 @@ main (int argc, char **argv)
fprintf (stderr, "gdbm_open failed: %s\n", gdbm_strerror (gdbm_errno));
exit (1);
}
rc = gdbm_recover (dbf, &rcvr, rcvr_flags);
- gdbm_close (dbf);
+ if (gdbm_close (dbf))
+ {
+ fprintf (stderr, "gdbm_close: %s; %s\n", gdbm_strerror (gdbm_errno),
+ strerror (errno));
+ rc = 3;
+ }
exit (rc);
}
diff --git a/tests/testsuite.at b/tests/testsuite.at
index b7b1e4e..efc2705 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -40,12 +40,14 @@ m4_include([fetch00.at])
m4_include([fetch01.at])
m4_include([delete00.at])
m4_include([delete01.at])
m4_include([delete02.at])
+m4_include([closerr.at])
+
AT_BANNER([Block size selection])
m4_include([blocksize00.at])
m4_include([blocksize01.at])
m4_include([blocksize02.at])
AT_BANNER([Compatibility library (dbm/ndbm)])

Return to:

Send suggestions and report system problems to the System administrator.