- for (;;) {
- size_t size = sizeof(buffer);
- if (limit && limit < size)
- size = limit;
- size_t got = fd.read(buffer, size);
- total += got;
- if (fd.atEnd())
- break;
- handle(buffer, got);
- if (limit && (limit -= got) == 0)
- break;
+ unsigned char *buffer = NULL;
+
+ try {
+ fd.fstat(st);
+ size_t bufSize = MAX(64 * 1024, st.st_blksize);
+ buffer = (unsigned char *)valloc(bufSize);
+ if (!buffer)
+ return 0;
+
+ for (;;) {
+ size_t size = bufSize;
+ if (limit && limit < size)
+ size = limit;
+ size_t got = fd.read(buffer, size);
+ total += got;
+ if (fd.atEnd())
+ break;
+ handle(buffer, got);
+ if (limit && (limit -= got) == 0)
+ break;
+ }