[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#32943: grep pattern < fifo fails on Cygwin (and MinGW), but not on L

From: Houder
Subject: bug#32943: grep pattern < fifo fails on Cygwin (and MinGW), but not on Linux
Date: Mon, 08 Oct 2018 09:35:40 +0200
User-agent: XS4ALL Webmail

On 2018-10-06 22:12, Paul Eggert wrote:

My guess is that you've got an old version of grep on Cygwin, and need
to upgrade to the current version. If you still have problems with the
latest version, please investigate via GDB and/or other means exactly
why grep is failing for you ...

Hi Paul,

I have found what causes grep to fail. (after building v3.1 of grep)

But in order not to mislead others reading this thread, I must correct what I wrote in my initial post. There I wrote: "as far as I can tell, the code that is executed on Cygwin is not the same as the one that is executed on Linux".

Wrong. My "strace-ing" misled me.

Returning to grep's failure on Gygwin:

grep terminates with an error on Cygwin because lseek() on Cygwin fails to
ascertain that it is applied to a FIFO.

As result Cygwin's executive returns EINVAL in errno, in stead of ESPIPE, as
required (my interpretation after reading "man 2 lseek").

ESPIPE is expected in reset() (src/grep.c), after lseek() has been applied to
stdin (which points to a FIFO here).

Until v2.26 of grep, a call to S_ISREG(st->st_mode) circumvented the call to lseek() (and the call to suppressible_error()) and made reset() return true.

Version v2.27 of grep removed the call to S_ISREG(st->st_mode). As result of
that lseek() is invoked.

lseek() fails, but an exception is made for errno == ESPIPE. For this reason
grep does not fail on Linux (reset() returns true).

However on Cygwin, suppressible_error() is called and reset() returns false,
which makes grep fail on Cygwin.

You can see for yourself in the attached logfiles (GDB sessions).

To what did I apply GDB?

- downloaded the tarball (grep-3.1.tar.xz) from http://ftp.gnu.org/gnu/grep/
 - build grep using "make CFLAG='-O -g3'", both on Linux and Cygwin


Attachment: gdb-cygwin.log
Description: Text document

Attachment: gdb-linux.log
Description: Text document

reply via email to

[Prev in Thread] Current Thread [Next in Thread]