f9a9597163eb2121ba01dab6315637f834b0db5c
galt
  Fri Aug 26 17:20:12 2011 -0700
using a loop is needed when request size exceeds 2GB
diff --git src/lib/common.c src/lib/common.c
index 24058ea..98df2f3 100644
--- src/lib/common.c
+++ src/lib/common.c
@@ -2502,37 +2502,42 @@
 	modeName = " to create";
     else if ((flags & O_WRONLY) == O_WRONLY)
 	modeName = " to write";
     else if ((flags & O_RDWR) == O_RDWR)
 	modeName = " to append";
     else
 	modeName = " to read";
     errnoAbort("Can't open %s%s", fileName, modeName);
     }
 return fd;
 }
 
 void mustReadFd(int fd, void *buf, size_t size)
 /* Read size bytes from a file or squawk and die. */
 {
-long long actualSize;
-if (size != 0 && (actualSize = read(fd, buf, size)) != size)
+ssize_t actualSize;
+char *cbuf = buf;
+// using a loop because linux was not returning all data in a single request when request size exceeded 2GB.
+while (size > 0) 
     {
+    actualSize = read(fd, cbuf, size);
     if (actualSize < 0)
 	errnoAbort("Error reading %lld bytes", (long long)size);
-    else
-	errAbort("End of file reading %lld bytes (got %lld)", (long long)size, actualSize);
+    if (actualSize == 0)
+	errAbort("End of file reading %llu bytes (got %lld)", (unsigned long long)size, (long long)actualSize);
+    cbuf += actualSize;
+    size -= actualSize;
     }
 }
 
 void mustWriteFd(int fd, void *buf, size_t size)
 /* Write size bytes to file descriptor fd or die.  (See man 2 write.) */
 {
 ssize_t result = write(fd, buf, size);
 if (result < size)
     errAbort("mustWriteFd: write failed: %s", strerror(errno));
 }
 
 off_t mustLseek(int fd, off_t offset, int whence)
 /* Seek to given offset, relative to whence (see man lseek) in file descriptor fd or errAbort.
  * Return final offset (e.g. if this is just an (fd, 0, SEEK_CUR) query for current position). */
 {