]> git.ipfire.org Git - ipfire-3.x.git/blobdiff - compat-gdbm/patches/gdbm-1.8.3-shortread.patch
gdbm: Update to 1.10.
[ipfire-3.x.git] / compat-gdbm / patches / gdbm-1.8.3-shortread.patch
diff --git a/compat-gdbm/patches/gdbm-1.8.3-shortread.patch b/compat-gdbm/patches/gdbm-1.8.3-shortread.patch
new file mode 100644 (file)
index 0000000..5b6455b
--- /dev/null
@@ -0,0 +1,113 @@
+05_handle-short-read.patch
+
+diff -urNad a/bucket.c b/bucket.c
+--- a/bucket.c 1999-05-19 01:16:05.000000000 +0100
++++ b/bucket.c 2006-04-24 03:18:01.000000000 +0100
+@@ -31,7 +31,7 @@
+ #include "autoconf.h"
+ #include "gdbmdefs.h"
+-
++#include <errno.h>
+ /* Initializing a new hash buckets sets all bucket entries to -1 hash value. */
+ void
+@@ -68,7 +68,8 @@
+      int dir_index;
+ {
+   off_t bucket_adr;   /* The address of the correct hash bucket.  */
+-  int   num_bytes;    /* The number of bytes read. */
++  int   num_bytes = 0; /* The total number of bytes read. */
++  int   bytes_read;    /* Number of bytes read in this syscall */
+   off_t       file_pos;       /* The return address for lseek. */
+   register int index; /* Loop index. */
+@@ -111,7 +112,12 @@
+       if (file_pos != bucket_adr)
+       _gdbm_fatal (dbf, "lseek error");
+-      num_bytes = read (dbf->desc, dbf->bucket, dbf->header->bucket_size);
++      do
++        {
++          bytes_read = read (dbf->desc, dbf->bucket+num_bytes, dbf->header->bucket_size-num_bytes);
++          if (bytes_read > 0) num_bytes += bytes_read;
++        }
++      while ((bytes_read > 0 || (bytes_read == -1 && errno == EINTR)) && num_bytes < dbf->header->bucket_size);
+       if (num_bytes != dbf->header->bucket_size)
+       _gdbm_fatal (dbf, "read error");
+     }
+diff -urNad a/falloc.c b/falloc.c
+--- a/falloc.c 2006-04-24 03:17:54.000000000 +0100
++++ b/falloc.c 2006-04-24 03:18:01.000000000 +0100
+@@ -31,7 +31,7 @@
+ #include "autoconf.h"
+ #include "gdbmdefs.h"
+-
++#include <errno.h>
+ /* The forward definitions for this file.  See the functions for
+    the definition of the function. */
+@@ -174,7 +174,8 @@
+ pop_avail_block (dbf)
+      gdbm_file_info *dbf;
+ {
+-  int  num_bytes;             /* For use with the read system call. */
++  int  num_bytes = 0;          /* For use with the read system call. */
++  int  bytes_read;             /* For use with the read system call. */
+   off_t file_pos;             /* For use with the lseek system call. */
+   avail_elem new_el;
+   avail_block *new_blk;
+@@ -199,7 +200,12 @@
+   /* Read the block. */
+   file_pos = lseek (dbf->desc, new_el.av_adr, L_SET);
+   if (file_pos != new_el.av_adr)  _gdbm_fatal (dbf, "lseek error");
+-  num_bytes = read (dbf->desc, new_blk, new_el.av_size);
++  do
++    {
++      bytes_read = read (dbf->desc, new_blk+num_bytes, new_el.av_size-num_bytes);
++      if (bytes_read > 0) num_bytes += bytes_read;
++    }
++  while ((bytes_read > 0 || (bytes_read == -1 && errno == EINTR)) && num_bytes < new_el.av_size);
+   if (num_bytes != new_el.av_size) _gdbm_fatal (dbf, "read error");
+   /* Add the elements from the new block to the header. */
+diff -urNad a/findkey.c b/findkey.c
+--- a/findkey.c        1999-05-19 01:16:06.000000000 +0100
++++ b/findkey.c        2006-04-24 03:18:01.000000000 +0100
+@@ -31,6 +31,7 @@
+ #include "autoconf.h"
+ #include "gdbmdefs.h"
++#include <errno.h>
+ /* Read the data found in bucket entry ELEM_LOC in file DBF and
+@@ -41,11 +42,12 @@
+      gdbm_file_info *dbf;
+      int elem_loc;
+ {
+-  int num_bytes;              /* For seeking and reading. */
++  int num_bytes = 0;           /* For seeking and reading. */
+   int key_size;
+   int data_size;
+   off_t file_pos;
+   data_cache_elem *data_ca;
++  int bytes_read;
+   /* Is it already in the cache? */
+   if (dbf->cache_entry->ca_data.elem_loc == elem_loc)
+@@ -74,7 +76,12 @@
+                   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->desc, data_ca->dptr, key_size+data_size);
++  do
++    {
++      bytes_read = read (dbf->desc, data_ca->dptr+num_bytes, key_size+data_size-num_bytes);
++      if (bytes_read > 0) num_bytes += bytes_read;
++    }
++  while ((bytes_read > 0 || (bytes_read == -1 && errno == EINTR)) && num_bytes < key_size+data_size);
+   if (num_bytes != key_size+data_size) _gdbm_fatal (dbf, "read error");
+   
+   return data_ca->dptr;