On Tue, Dec 11, 2007 at 12:19:02PM +0100, Enrico Forestieri wrote:
> >  
> >     process.setReadChannel(QProcess::StandardOutput);
> > -   process.start(cmd.c_str(), QStringList(), QIODevice::ReadOnly);
> > +   process.start(toqstr(cmd), QStringList(), QIODevice::ReadOnly);
> 
> The problem is right here. This is doubly broken. First of all
> 
>         process.start(toqstr(cmd), QIODevice::ReadOnly);
> 
> should be used. Secondly, cmd is a command whose arguments are
> quoted for being processed by a shell, but this is not so. Hence
> when calling
> 
>    latex 'newfile1.tex'
> 
> latex is passed the filename 'newfile1.tex' *literally*, and of course
> only newfile1.tex exists. On Windows it works because double quotes
> are used and the API functions expect the quotes.
> 
> Then, I think that it is better to use the QStringList version of
> start(), but the first argument should only contain the program name,
> while the arguments should be passed through the QStringList.
> This is the same as the execv family of system calls.
> This also means that some overhaul is needed, but I think it is
> unavoidable if one wants a robust implementation (using the system()
> like version of start() may become a nightmare as regards quoting).

This is an accurate description of the problem.

The overhaul would be a bit tedious though: There are cases where we
seem to use shell redirection in the command (see e.g. the default

 \converter lyx lyx15x "python -tt $$s/lyx2lyx/lyx2lyx -t 276 $$i > $$o"  ""

converter entry), and there are cases when arguments are already quoted,
e.g.

  configure_command_ = os::python() + ' ' +
      quoteName(configure_script.toFilesystemEncoding()) +
      with_version_suffix();

Andre'

Reply via email to