nmh-workers
[Top] [All Lists]

Re: [Nmh-workers] Proposed solution to Debian Bug#143485

2005-08-26 09:46:59

Hi Harald,

Hm, I think if write(2, ...) fails, then we are out of luck anyway. We
can't give an error message about being unable to give an error
message.  I thought that a successful call of write won't manipulate
errno, but after rereading the documentation of errno it seems that
one can't rely on this.

That's correct.

On the other hand it says, that one can detect an error by explictely
setting errno=0 before the call and testing errno afterwards.

That's not true.  What wording does your man page have exactly?  It's
only meaningful to read errno when some other error indication has
occurred, e.g. write(2) returning -1.

It also says that errno is never set to zero by the library.

That's true.

    http://www.dinkumware.com/manuals/reader.aspx?b=c/&h=errno.html
    "Library functions store only values greater than zero."

So I'm now a bit confused about how write is allowed to change errno
on success...

A library call may do several things internally and one of them may
error but the overall call doesn't fail, e.g. printf() checking if
stdout is a tty can set errno to ENOTTY but the printf() succeeds.

    http://www.eskimo.com/~scs/C-faq/q12.24.html
    Why does errno contain ENOTTY after a call to printf?

write(2) may not do this, but the general convention holds.

Take strtod(3), it returns a double.

    "If the correct value would cause underflow, zero is returned and
    ERANGE is stored in errno."

If strtod() returns 0 we don't know if the string passed was "0" or
whether underflow has occurred;  we need to inspect errno.  But

    if (strtod(s) == 0 && errno == ERANGE) {

is incorrect since errno may be there from an earlier strtod(), or
something else.

    errno = 0;
    if (strtod(s) == 0 && errno == ERANGE) {

is the correct way.

Cheers,


Ralph.




_______________________________________________
Nmh-workers mailing list
Nmh-workers@nongnu.org
http://lists.nongnu.org/mailman/listinfo/nmh-workers

<Prev in Thread] Current Thread [Next in Thread>