On Fri, Jul 16, 2010 at 10:22:54AM +0200, Peter Kümmel wrote:
> Enrico Forestieri wrote:
>
> >> -SystemcallPrivate::SystemcallPrivate(const std::string& of) :
> >> +SystemcallPrivate::SystemcallPrivate(const std::string& of) :
> >> proc_(new QProcess), outindex_(0),
> >> errindex_(0),
> >> - outfile(of), showout_(false),
> >> showerr_(false), process_events(false)
> >> + outfile(of),
> >> +
> >> terminalOutExists_(os::is_terminal(os::STDOUT)),
> >> +
> >> terminalErrExists_(os::is_terminal(os::STDERR)),
> >> + process_events(false)
> >> {
> >> if (!outfile.empty()) {
> >> // Check whether we have to simply throw away the output.
> >> if (outfile != os::nulldev())
> >> proc_->setStandardOutputFile(toqstr(outfile));
> >> - } else if (os::is_terminal(os::STDOUT))
> >> - setShowOut(true);
> >
> > This is wrong. You are going to output to a terminal whenever one exists.
> > That was not the logic of what you changed. Output to a terminal should
> > be avoided when there isn't a terminal *or* when stdout is redirected
> > to a file. Imagine you have "pnmtopng foo.pnm > foo.png", which produces
> > binary output. With your change the terminal will be flooded by binary
> > data, possibly putting it in a strange state, because in the binary stream
> > something interpretable as an escape sequence may be present.
> >
>
> I never panned to understand this redirecting ;)
>
> So, is this patch correct:
>
> Index: Systemcall.cpp
> ===================================================================
> --- Systemcall.cpp (Revision 34914)
> +++ Systemcall.cpp (Arbeitskopie)
> @@ -246,7 +246,7 @@
> out_index_(0),
> err_index_(0),
> out_file_(of),
> -
> terminal_out_exists_(os::is_terminal(os::STDOUT)),
> + terminal_out_exists_(false),
>
> terminal_err_exists_(os::is_terminal(os::STDERR)),
> process_events_(false)
> {
> @@ -254,6 +254,8 @@
> // Check whether we have to simply throw away the output.
> if (out_file_ != os::nulldev())
> process_->setStandardOutputFile(toqstr(out_file_));
> + } else if (os::is_terminal(os::STDOUT)) {
> + terminal_out_exists_ = true;
> }
The following would be more concise:
@@ -254,6 +254,8 @@
// Check whether we have to simply throw away the output.
if (out_file_ != os::nulldev())
process_->setStandardOutputFile(toqstr(out_file_));
+ // Don't output to terminal if stdout is redirected
+ terminal_out_exists_ = false;
}
Then, are you sure that sending binary data also to the progress
interface doesn't cause any harm?
--
Enrico