mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Rich Felker <dalias@aerifal.cx>
To: musl@lists.openwall.com
Subject: Re: SoX & pipe rewinding
Date: Fri, 14 Dec 2012 16:21:22 -0500	[thread overview]
Message-ID: <20121214212121.GO20323@brightrain.aerifal.cx> (raw)
In-Reply-To: <50CB95FA.8030109@ojab.ru>

On Sat, Dec 15, 2012 at 01:11:22AM +0400, ojab wrote:
> On 14.12.2012 23:09, Rich Felker wrote:
> >On Fri, Dec 14, 2012 at 05:51:40PM +0400, ojab wrote:
> >
> >There's intentionally no musl-specific #define. Some people have
> >complained about that, but if there had been one, the state of musl
> >compatibility would be a ton worse right now, because lots of software
> >would be crippling itself by using #ifdef __musl__ or similar to
> >disable features that musl 0.6.x didn't have...
> >
> >The right solution to using optional features is to test for their
> >existence, but in this case, sox is not using an extension feature but
> >poking at the internals of some known implementations and throwing
> >#error for everything else. This is just really bad behavior. The
> >default case should be portable, i.e. should just silently omit the
> >non-portable pipe rewinding code.
> 
> Filled https://sourceforge.net/tracker/?func=detail&aid=3596097&group_id=10706&atid=110706

Thanks. It might be nice to also add a link to this thread, which
makes it clear that our position is that the layout of the FILE
structure and the buffering behavior of musl's stdio are both
considered opaque to applications; hacks to detect musl and poke at
the current version of the internals, which possible, would not
necessarily be compatible with future versions of musl, i.e. it would
result in a binary that might break/crash horribly when libc.so is
upgraded.

BTW, there is one 100% safe way to _attempt_ rewinding a pipe:
repeatedly call ungetc() for each character you read. The C standard
does not guarantee more than 1 byte of pushback, but most
implementations allow more under most circumstances, and the C
standard does require that the implementation report the success or
failure of ungetc() to push back a byte. This approach would always
work with the current stdio implementation in musl, and if any
internal changes prevented it from working in the future, the
application would at least see the failure (in the form of a failure
return from ungetc()) and would be able to react appropriately rather
than crashing due to corrupted internal stdio state. However, to use
this approach, I think the sox rewind-pipe function would have to be
improved to take a pointer to the header block that was read for
probing purposes, so that it could push-back these bytes one at a
time.

Rich


  reply	other threads:[~2012-12-14 21:21 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-14 13:35 ojab
2012-12-14 13:40 ` Rich Felker
2012-12-14 13:51   ` ojab
2012-12-14 16:47     ` John Spencer
2012-12-14 17:57       ` ojab
2012-12-14 19:09     ` Rich Felker
2012-12-14 21:11       ` ojab
2012-12-14 21:21         ` Rich Felker [this message]
2012-12-14 22:17   ` Rob Landley
2012-12-15  0:05     ` Rich Felker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20121214212121.GO20323@brightrain.aerifal.cx \
    --to=dalias@aerifal.cx \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).