[GRASS5] G_done_msg(), stderr, and fileno()

Hi,

G_done_msg() does some figuring on where to send the output:
        if (isatty(1))
                out = stdout;
        else if (isatty(2))
                out = stderr;

for one thing, shouldn't that use fileno(stdout) instead of "1", and
for another shouldn't it try to send to stderr first? always?

G_message(), G_warning(), and G_fatal_error() all send exclusively to
stderr, with the bell getting a isatty(fileno(stderr)) test.

I've written a script which calls a module which uses G_done_msg().
I'd like to pipe the stdout to a file, but currently the output of
G_done_msg() is polluting matters.

?,
Hamish

Hello Hamish
On Tue, 25 Oct 2005, Hamish wrote:

Hi,

G_done_msg() does some figuring on where to send the output:
       if (isatty(1))
               out = stdout;
       else if (isatty(2))
               out = stderr;

for one thing, shouldn't that use fileno(stdout) instead of "1", and
for another shouldn't it try to send to stderr first? always?

I think it should. Shouldn't even bother checking.

G_message(), G_warning(), and G_fatal_error() all send exclusively to
stderr, with the bell getting a isatty(fileno(stderr)) test.

I've written a script which calls a module which uses G_done_msg().
I'd like to pipe the stdout to a file, but currently the output of
G_done_msg() is polluting matters.

Yes exactly. We had a discussion a while ago about r.proj printing a message to say when it was finished or something and the suggestion was to use G_done_msg(...) instead of fprintf(stderr, ...). I looked at the source of G_done_msg() and thought that would be a bad idea so didn't change anything. Meant to bring it up on the list but didn't get round to it.

There must be a reason for the current logic in G_done_msg() though.

but in general, I feel the "output to stderr to stdout?" issue has been quite confused in GRASS for a long time until we decided that anything that was part of the results/analysis output of the module should go to stdout, while informative user messages should go to stderr.

So probably most of what's in G_done_msg() should be stripped out and simplified, IMHO.

Paul