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

Reply via email to