aboutsummaryrefslogtreecommitdiff
path: root/miscutils/less.c
diff options
context:
space:
mode:
Diffstat (limited to 'miscutils/less.c')
-rw-r--r--miscutils/less.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/miscutils/less.c b/miscutils/less.c
index 8fd0874e2..91a933a3a 100644
--- a/miscutils/less.c
+++ b/miscutils/less.c
@@ -167,7 +167,8 @@ enum { pattern_valid = 0 };
167 167
168enum { 168enum {
169 READING_FILE = -1, 169 READING_FILE = -1,
170 READING_STDIN = -2 170 READING_STDIN = -2,
171 READING_NONREG = -3
171}; 172};
172 173
173struct globals { 174struct globals {
@@ -615,15 +616,16 @@ static void update_num_lines(void)
615 int count, fd; 616 int count, fd;
616 ssize_t len, i; 617 ssize_t len, i;
617 char buf[4096]; 618 char buf[4096];
618 struct stat stbuf;
619 619
620 /* only do this for regular files */
620 if (num_lines == READING_FILE) { 621 if (num_lines == READING_FILE) {
621 count = 0; 622 count = 0;
622 fd = open(filename, O_RDONLY); 623 fd = open(filename, O_RDONLY);
623 if (fd < 0) 624 if (fd < 0) {
624 goto skip; 625 /* somebody stole my file! */
625 if (fstat(fd, &stbuf) != 0 || !S_ISREG(stbuf.st_mode)) 626 num_lines = READING_NONREG;
626 goto do_close; 627 return;
628 }
627 while ((len = safe_read(fd, buf, sizeof(buf))) > 0) { 629 while ((len = safe_read(fd, buf, sizeof(buf))) > 0) {
628 for (i = 0; i < len; ++i) { 630 for (i = 0; i < len; ++i) {
629 if (buf[i] == '\n' && ++count == MAXLINES) 631 if (buf[i] == '\n' && ++count == MAXLINES)
@@ -632,9 +634,7 @@ static void update_num_lines(void)
632 } 634 }
633 done: 635 done:
634 num_lines = count; 636 num_lines = count;
635 do_close:
636 close(fd); 637 close(fd);
637 skip: ;
638 } 638 }
639} 639}
640 640
@@ -943,6 +943,13 @@ static void buffer_line(int linenum)
943static void open_file_and_read_lines(void) 943static void open_file_and_read_lines(void)
944{ 944{
945 if (filename) { 945 if (filename) {
946#if ENABLE_FEATURE_LESS_FLAGS
947 struct stat stbuf;
948
949 xstat(filename, &stbuf);
950 if (!S_ISREG(stbuf.st_mode))
951 num_lines = READING_NONREG;
952#endif
946 xmove_fd(xopen(filename, O_RDONLY), STDIN_FILENO); 953 xmove_fd(xopen(filename, O_RDONLY), STDIN_FILENO);
947 } else { 954 } else {
948 /* "less" with no arguments in argv[] */ 955 /* "less" with no arguments in argv[] */