diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-10-05 13:06:15 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-10-05 13:06:15 +0000 |
commit | d74b094cdcd25b5ce493640873d910a3b788fafe (patch) | |
tree | 6b952a6032b11dee04cec340af54d03ad63cce6e /src/findkey.c | |
parent | e0db2284c372ca8be529dec2ea3e78842e5486f3 (diff) | |
download | gdbm-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.c | 7 |
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; } |