diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-07-01 10:08:55 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-07-01 10:19:36 +0300 |
commit | 030e685eb9df82f63d73a1bf206da84b7aa52374 (patch) | |
tree | dcfc6693121e332d2cdb7c579e65ed0f397dc78e | |
parent | d6fe3b45bc669a6bc3f21e4bda69c6a052d78482 (diff) | |
download | gdbm-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-- | NEWS | 10 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | doc/gdbm.3 | 10 | ||||
-rw-r--r-- | doc/gdbm.texi | 16 | ||||
-rw-r--r-- | src/gdbm.h.in | 10 | ||||
-rw-r--r-- | src/gdbmclose.c | 16 | ||||
-rw-r--r-- | src/gdbmerrno.c | 8 | ||||
-rw-r--r-- | src/gdbmsync.c | 5 | ||||
-rw-r--r-- | src/mmap.c | 14 | ||||
-rw-r--r-- | src/proto.h | 11 | ||||
-rw-r--r-- | tests/Makefile.am | 2 | ||||
-rw-r--r-- | tests/closerr.at | 5 | ||||
-rw-r--r-- | tests/closerr.c | 56 | ||||
-rw-r--r-- | tests/gtdel.c | 8 | ||||
-rw-r--r-- | tests/gtdump.c | 8 | ||||
-rw-r--r-- | tests/gtfetch.c | 8 | ||||
-rw-r--r-- | tests/gtload.c | 7 | ||||
-rw-r--r-- | tests/gtopt.c | 8 | ||||
-rw-r--r-- | tests/gtrecover.c | 8 | ||||
-rw-r--r-- | tests/testsuite.at | 2 |
20 files changed, 178 insertions, 36 deletions
@@ -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) @@ -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); } @@ -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)]) |