summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2014-09-17 12:53:17 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2014-09-17 20:37:48 -0700
commitf6de00f6cec3831b8f334de7dbd1b59115627457 (patch)
tree55cc1c94acb4b4a17d7b91782ef1795b322204c0
parent1b76ead152e0a14b3c4b8469d74f44dad60617ae (diff)
downloadgrep-f6de00f6cec3831b8f334de7dbd1b59115627457.tar.gz
grep: speed up processing of holes before EOF on Solaris
* src/grep.c (fillbuf): If SEEK_DATA fails with errno == ENXIO, skip over the hole at EOF.
-rw-r--r--src/grep.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/grep.c b/src/grep.c
index a08fa412..35d33586 100644
--- a/src/grep.c
+++ b/src/grep.c
@@ -720,7 +720,12 @@ fillbuf (size_t save, struct stat const *st)
if (SEEK_DATA != SEEK_SET && !seek_data_failed)
{
+ /* Solaris SEEK_DATA fails with errno == ENXIO in a hole at EOF. */
off_t data_start = lseek (bufdesc, bufoffset, SEEK_DATA);
+ if (data_start < 0 && errno == ENXIO
+ && usable_st_size (st) && bufoffset < st->st_size)
+ data_start = lseek (bufdesc, 0, SEEK_END);
+
if (data_start < 0)
seek_data_failed = true;
else