aboutsummaryrefslogtreecommitdiff
path: root/src/findkey.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-10-05 13:06:15 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2011-10-05 13:06:15 +0000
commitd74b094cdcd25b5ce493640873d910a3b788fafe (patch)
tree6b952a6032b11dee04cec340af54d03ad63cce6e /src/findkey.c
parente0db2284c372ca8be529dec2ea3e78842e5486f3 (diff)
downloadgdbm-d74b094cdcd25b5ce493640873d910a3b788fafe.tar.gz
gdbm-d74b094cdcd25b5ce493640873d910a3b788fafe.tar.bz2
Fix bug #150.
Tolerate I/O operations returning less bytes than expected. Retry I/O if possible. * src/fullio.c: New file. * src/Makefile.am (libgdbm_la_SOURCES): Add fullio.c * src/proto.h (_gdbm_full_read) (_gdbm_full_write): New protos. * src/gdbmerrno.c (gdbm_errlist): Add entry for GDBM_FILE_EOF. * src/bucket.c: Use _gdbm_full_{read|write}. * src/falloc.c: Likewise. * src/findkey.c: Likewise. * src/gdbmopen.c: Likewise. * src/gdbmstore.c: Likewise. * src/testgdbm.c: Likewise. * src/update.c: Likewise.
Diffstat (limited to 'src/findkey.c')
-rw-r--r--src/findkey.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/findkey.c b/src/findkey.c
index 7933c2f..a375cb4 100644
--- a/src/findkey.c
+++ b/src/findkey.c
@@ -29,7 +29,7 @@
char *
_gdbm_read_entry (GDBM_FILE dbf, int elem_loc)
{
- int num_bytes; /* For seeking and reading. */
+ int rc;
int key_size;
int data_size;
off_t file_pos;
@@ -61,8 +61,9 @@ _gdbm_read_entry (GDBM_FILE dbf, int elem_loc)
file_pos = __lseek (dbf, dbf->bucket->h_table[elem_loc].data_pointer, L_SET);
if (file_pos != dbf->bucket->h_table[elem_loc].data_pointer)
_gdbm_fatal (dbf, _("lseek error"));
- num_bytes = __read (dbf, data_ca->dptr, key_size+data_size);
- if (num_bytes != key_size+data_size) _gdbm_fatal (dbf, _("read error"));
+ rc = _gdbm_full_read (dbf, data_ca->dptr, key_size+data_size);
+ if (rc)
+ _gdbm_fatal (dbf, gdbm_strerror (rc));
return data_ca->dptr;
}

Return to:

Send suggestions and report system problems to the System administrator.