Thanks, Paul! I've applied that patch. Paul Eggert <[EMAIL PROTECTED]> wrote: >> Date: Fri, 8 Feb 2002 10:37:55 -0800 >> From: Jim Hill <[EMAIL PROTECTED]> > >> I'll note that neither GNU's head nor FreeBSD's will work properly with >> David Korn's example: GNU head uses `read(fd,buff,BUFSIZE)` and doesn't >> lseek at the end; and FreeBSD's uses a getc-putc loop and doesn't >> fflush() at the end. > > Here's a patch to GNU head to fix that bug. > > Note to textutils maintainer: David Korn's example: > `(head -n 5 >/dev/null;cat) < file' > would successfully behead the first 5 lines of file. See: > > >http://www.opengroup.org/sophocles/show_mail.tpl?source=L&listname=austin-group-l&id=3609 > > > 2002-02-08 Paul Eggert <[EMAIL PROTECTED]> > > * src/head.c (head_lines): If we have read too much data, try > to seek back to the position we would have gotten to had we > been reading one byte at a time. POSIX currently doesn't > require this, but it's easy to do and some software relies on > it. > > --- src/head.c-orig Sat Dec 1 09:29:26 2001 > +++ src/head.c Fri Feb 8 14:29:20 2002 > @@ -175,7 +175,16 @@ head_lines (const char *filename, int fd > break; > while (bytes_to_write < bytes_read) > if (buffer[bytes_to_write++] == '\n' && --lines_to_write == 0) > - break; > + { > + if (lseek (fd, bytes_to_write - bytes_read, SEEK_CUR) < 0) > + { > + int e = errno; > + struct stat st; > + if (fstat (fd, &st) != 0 || S_ISREG (st.st_mode)) > + error (0, e, _("lseek error")); > + } > + break; > + } > if (fwrite (buffer, 1, bytes_to_write, stdout) == 0) > error (EXIT_FAILURE, errno, _("write error")); > } >
_______________________________________________ Bug-textutils mailing list [EMAIL PROTECTED] http://mail.gnu.org/mailman/listinfo/bug-textutils