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). */ {