On Wed, Jun 15, 2011 at 12:29:00AM +0200, Enrico Forestieri wrote:
> On Tue, Jun 14, 2011 at 08:58:08PM +0200, Andre Poenitz wrote:
> > On Tue, Jun 14, 2011 at 08:16:49PM +0200, Enrico Forestieri wrote:
> > > No, I didn't find anything specific but it is clear that using the QtCore
> > > library is not advisable for this task.
> > > 
> > > > PS I can do the recommit to branch, once it's in trunk.
> > > 
> > > I committed the fix at r39049. However, I think that the reversion of
> > > r38746 was not necessary given that a patch had been already devised.
> > 
> > I wonder whether it might be possible for you to file
> > a proper bug report for that, i.e. some minimal, but
> > complete, reproducible example that exhibits that problem
> > on bugreports.qt.nokia.com, product "Qt", component
> > "core: i/o" (or whatever is close).
> 
> I don't have an account (and don't want to have one), so I cannot report
> the bug. Maybe someone with an account could do that.

I guess I could do that.

> I attach here a simple test case exhibiting the problem.
> 
> Problem: When setting the environment of QProcess, a script without
> a shebang line fails to execute.
> 
> How to reproduce:
> 1) Save the myprog perl script and test-env.cpp in the same directory.
> 2) Make executable myprog by "chmod 755 myprog".
> 3) Compile test-env.cpp without defining SETENV.
> 4) Launch the just compiled executable and verify that the the script is
>    actually executed.
> 5) Now compile test-env.cpp by using -DSETENV.
> 6) Launch again the executable and verify that it now fails to execute.
> 
> -- 
> Enrico

> eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' && eval 'exec perl -S 
> $0 $argv:q'
>   if 0;
> 
> print "it works";
> exit(0);
>
> #include <QProcess>
> #include <QDebug>
> #include <QtCore>
> 
> int main()
> {
>     QProcess *proc = new QProcess();
> #ifdef SETENV
>     proc->setEnvironment(QProcess::systemEnvironment());
> #endif
>     proc->setProcessChannelMode(QProcess::MergedChannels);
>     proc->start("./myprog");
>     if (proc->waitForFinished())
>       qDebug() << "Output:" << proc->readAll();
>     else
>       qDebug() << "Fail:" << proc->errorString();
>     proc->close();
>     delete proc;
>     return 0;
> }

Ok, that would certainly be detailed enough for a bug report.

The path with environment ends up in execve(), the other one in
execvp(). execve() requires a shebang line or a binary, execvp()
is more forgiving. I admit that this is ... underdocumented.

The visible difference here seems to be triggered by the "missing"
"shebang line" in the script. Is that intentional?

Andre'

Reply via email to