aboutsummaryrefslogtreecommitdiff
path: root/src/gdbmseq.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2016-07-09 11:40:19 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2016-07-09 12:11:20 +0300
commite8cad816f36b1cad11bb67c96f0ce878cf30844e (patch)
treec971d9de6369f9e340a3764d848c24d4a2ce96e8 /src/gdbmseq.c
parent0eafbb93c82a489204f54259593f2aaeb9cdbfc4 (diff)
downloadgdbm-e8cad816f36b1cad11bb67c96f0ce878cf30844e.tar.gz
gdbm-e8cad816f36b1cad11bb67c96f0ce878cf30844e.tar.bz2
Don't bail out on fatal errors, unless the user defines the fatal_err function
* src/bucket.c (_gdbm_get_bucket) (_gdbm_split_bucket, _gdbm_write_bucket): Return error code. All callers updated. * src/proto.h (_gdbm_get_bucket) (_gdbm_split_bucket, _gdbm_write_bucket): Update declarations * src/falloc.c (push_avail_block) (pop_avail_block): Return error code. All callers updated. * src/update.c (_gdbm_fatal): Exit only if the user defined fatal_err function. * src/gdbmerrno.c (gdbm_needs_recovery): New function. * src/gdbm.h.in (gdbm_needs_recovery): New proto. * compat/dbminit.c: Set gdbm_errno on fatal errors. * compat/dbmopen.c: Likewise. * src/findkey.c: Likewise. * src/gdbm_load.c: Likewise. * src/gdbmcount.c: Likewise. * src/gdbmdefs.h: Likewise. * src/gdbmdelete.c: Likewise. * src/gdbmdump.c: Likewise. * src/gdbmexists.c: Likewise. * src/gdbmexp.c: Likewise. * src/gdbmfetch.c: Likewise. * src/gdbmimp.c: Likewise. * src/gdbmload.c: Likewise. * src/gdbmopen.c: Likewise. * src/gdbmreorg.c: Likewise. * src/gdbmseq.c: Likewise. * src/gdbmsetopt.c: Likewise. * src/gdbmstore.c: Likewise. * src/gdbmsync.c: Likewise. * src/mmap.c: Likewise.
Diffstat (limited to 'src/gdbmseq.c')
-rw-r--r--src/gdbmseq.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/gdbmseq.c b/src/gdbmseq.c
index 831339a..4320366 100644
--- a/src/gdbmseq.c
+++ b/src/gdbmseq.c
@@ -22,10 +22,6 @@
#include "gdbmdefs.h"
-/* Special extern for this file. */
-extern char *_gdbm_read_entry (GDBM_FILE , int);
-
-
/* Find and read the next entry in the hash structure for DBF starting
at ELEM_LOC of the current bucket and using RETURN_VAL as the place to
put the data that is found.
@@ -61,11 +57,14 @@ get_next_key (GDBM_FILE dbf, int elem_loc, datum *return_val)
/* Check to see if there was a next bucket. */
if (dbf->bucket_dir < GDBM_DIR_COUNT (dbf))
- _gdbm_get_bucket (dbf, dbf->bucket_dir);
+ {
+ if (_gdbm_get_bucket (dbf, dbf->bucket_dir))
+ return;
+ }
else
{
/* No next key, just return. */
- gdbm_set_errno (dbf, GDBM_ITEM_NOT_FOUND, 0);
+ gdbm_set_errno (dbf, GDBM_ITEM_NOT_FOUND, FALSE);
return;
}
}
@@ -74,6 +73,8 @@ get_next_key (GDBM_FILE dbf, int elem_loc, datum *return_val)
/* Found the next key, read it into return_val. */
find_data = _gdbm_read_entry (dbf, elem_loc);
+ if (!find_data)
+ return;
return_val->dsize = dbf->bucket->h_table[elem_loc].key_size;
if (return_val->dsize == 0)
return_val->dptr = (char *) malloc (1);
@@ -82,7 +83,7 @@ get_next_key (GDBM_FILE dbf, int elem_loc, datum *return_val)
if (return_val->dptr == NULL)
{
return_val->dsize = 0;
- gdbm_set_errno (dbf, GDBM_MALLOC_ERROR, 0);
+ gdbm_set_errno (dbf, GDBM_MALLOC_ERROR, FALSE);
}
else
memcpy (return_val->dptr, find_data, return_val->dsize);
@@ -104,7 +105,7 @@ gdbm_firstkey (GDBM_FILE dbf)
GDBM_ASSERT_CONSISTENCY (dbf, return_val);
/* Initialize the gdbm_errno variable. */
- gdbm_set_errno (dbf, GDBM_NO_ERROR, 0);
+ gdbm_set_errno (dbf, GDBM_NO_ERROR, FALSE);
/* Get the first bucket. */
_gdbm_get_bucket (dbf, 0);
@@ -131,12 +132,12 @@ gdbm_nextkey (GDBM_FILE dbf, datum key)
GDBM_ASSERT_CONSISTENCY (dbf, return_val);
/* Initialize the gdbm_errno variable. */
- gdbm_set_errno (dbf, GDBM_NO_ERROR, 0);
+ gdbm_set_errno (dbf, GDBM_NO_ERROR, FALSE);
/* Do we have a valid key? */
if (key.dptr == NULL)
{
- gdbm_set_errno (dbf, GDBM_ITEM_NOT_FOUND, 0); /* FIXME: special error code perhaps */
+ gdbm_set_errno (dbf, GDBM_ITEM_NOT_FOUND, FALSE); /* FIXME: special error code perhaps */
return return_val;
}

Return to:

Send suggestions and report system problems to the System administrator.