]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
(wc): Eliminate fstat call -- using lseek is sufficient.
authorJim Meyering <jim@meyering.net>
Fri, 10 Feb 1995 05:53:54 +0000 (05:53 +0000)
committerJim Meyering <jim@meyering.net>
Fri, 10 Feb 1995 05:53:54 +0000 (05:53 +0000)
Detect/handle case in which CURR position > EOF.

src/wc.c

index 34b3e0872e722e59379f5e1b3e86cbfa641f961a..4d307cd18ec45dc4eaf59d30cf666df9d09c3295 100644 (file)
--- a/src/wc.c
+++ b/src/wc.c
@@ -216,14 +216,15 @@ wc (fd, file)
 
   if (print_chars && !print_words && !print_lines)
     {
-      struct stat stats;
       off_t current_pos, end_pos;
 
-      if (fstat (fd, &stats) == 0 && S_ISREG (stats.st_mode)
-         && (current_pos = lseek (fd, (off_t)0, SEEK_CUR)) != -1
-         && (end_pos  = lseek (fd, (off_t)0, SEEK_END)) != -1)
+      if ((current_pos = lseek (fd, (off_t) 0, SEEK_CUR)) != -1
+         && (end_pos  = lseek (fd, (off_t) 0, SEEK_END)) != -1)
        {
-         chars = end_pos - current_pos;
+         off_t diff;
+         /* Be careful here.  The current position may actually be
+            beyond the end of the file.  As in the example above.  */
+         chars = (diff = end_pos - current_pos) < 0 ? 0 : diff;
        }
       else
        {