Subject: Re: Possible ZSH bug with IO direction
From: Roger Qiu <[email-masked]>
To: Bart Schaefer <[email-masked]>, [email-masked]
Date: Mon, 25 Apr 2016 03:08:00 +1000
List-Id: Zsh Workers List <zsh-workers.zsh.org>

Thanks, the workaround did work. But I've never seen read & write 
redirection at the interactive prompt. Does that make the STDIN for the 
program I'm running readable and writable? How does that work? Can the 
program then rewind that descriptor, and write to `input.jpg`?

Also since Bash doesn't suffer from this problem, will this be fixed 
eventually?

On 24/04/2016 8:14 AM, Bart Schaefer wrote:
> On Apr 24,  4:30am, Roger Qiu wrote:
> }
> }  > gm convert -compress JPEG - - < input.jpg > output.jpg
> } gm convert: Corrupt JPEG data: 873 extraneous bytes before marker 0xd9
> } (/tmp/gmo1fx92).
>
> I suspect you are encountering the issue that "gm" wants input.jpg in
> binary mode, but zsh's input redirection operator has forced it to text
> mode.  A lengthy comment in Src/main.c (copypasted below) explains this.
>
> There's [intended to be] an easy workaround, which is to open the file
> for both read and write even though you're only going to read it:
>
>      gm convert -compress JPEG - - <> input.jpg > output.jpg
>
> However, it's been years since I had a Cygwin system or the time/patience
> to care to set one up, so I haven't tested the workaround.
>
> Aside:  The zsh/system module "sysopen" doesn't recognize O_BINARY or
> O_TEXT modes; that should probably be corrected if someone can compile
> on a system that has them, but of course the comment below indicates
> that O_BINARY would be overridden anyway.
>
>
>   * Peter A. Castro <[email-masked]>
>   *
>   * Cygwin supports the notion of binary or text mode access to files
>   * based on the mount attributes of the filesystem.  If a file is on
>   * a binary mounted filesystem, you get exactly what's in the file, CRLF's
>   * and all.  If it's on a text mounted filesystem, Cygwin will strip out
>   * the CRs.  This presents a problem because zsh code doesn't allow for
>   * CRLF's as line terminators.  So, we must force all open files to be
>   * in text mode reguardless of the underlying filesystem attributes.
>   * However, we only want to do this for reading, not writing as we still
>   * want to write files in the mode of the filesystem.  To do this,
>   * we have two options: augment all {f}open() calls to have O_TEXT added to
>   * the list of file mode options, or have the Cygwin runtime do it for us.
>   * I choose the latter. :)
>   *
>   * Cygwin's runtime provides pre-execution hooks which allow you to set
>   * various attributes for the process which effect how the process functions.
>   * One of these attributes controls how files are opened.  I've set
>   * it up so that all files opened RDONLY will have the O_TEXT option set,
>   * thus forcing line termination manipulation.  This seems to solve the
>   * problem (at least the Test suite runs clean :).
>   *
>   * Note: this may not work in later implementations.  This will override
>   * all mode options passed into open().  Cygwin (really Windows) doesn't
>   * support all that much in options, so for now this is OK, but later on
>   * it may not, in which case O_TEXT will have to be added to all opens calls
>   * appropriately.
>

-- 
Founder of Matrix AI
https://matrix.ai/
+61420925975