summaryrefslogtreecommitdiff
path: root/libopie2
Side-by-side diff
Diffstat (limited to 'libopie2') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/oprocess.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/libopie2/opiecore/oprocess.cpp b/libopie2/opiecore/oprocess.cpp
index 5cfcf32..83677aa 100644
--- a/libopie2/opiecore/oprocess.cpp
+++ b/libopie2/opiecore/oprocess.cpp
@@ -751,195 +751,195 @@ void OProcess::commClose()
{
if ( NoCommunication != communication )
{
bool b_in = ( communication & Stdin );
bool b_out = ( communication & Stdout );
bool b_err = ( communication & Stderr );
if ( b_in )
delete innot;
if ( b_out || b_err )
{
// If both channels are being read we need to make sure that one socket buffer
// doesn't fill up whilst we are waiting for data on the other (causing a deadlock).
// Hence we need to use select.
// Once one or other of the channels has reached EOF (or given an error) go back
// to the usual mechanism.
int fds_ready = 1;
fd_set rfds;
int max_fd = 0;
if ( b_out )
{
fcntl( out[ 0 ], F_SETFL, O_NONBLOCK );
if ( out[ 0 ] > max_fd )
max_fd = out[ 0 ];
delete outnot;
outnot = 0;
}
if ( b_err )
{
fcntl( err[ 0 ], F_SETFL, O_NONBLOCK );
if ( err[ 0 ] > max_fd )
max_fd = err[ 0 ];
delete errnot;
errnot = 0;
}
while ( b_out || b_err )
{
// * If the process is still running we block until we
// receive data. (p_timeout = 0, no timeout)
// * If the process has already exited, we only check
// the available data, we don't wait for more.
// (p_timeout = &timeout, timeout immediately)
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
struct timeval *p_timeout = runs ? 0 : &timeout;
FD_ZERO( &rfds );
if ( b_out )
FD_SET( out[ 0 ], &rfds );
if ( b_err )
FD_SET( err[ 0 ], &rfds );
fds_ready = select( max_fd + 1, &rfds, 0, 0, p_timeout );
if ( fds_ready <= 0 )
break;
if ( b_out && FD_ISSET( out[ 0 ], &rfds ) )
{
int ret = 1;
while ( ret > 0 )
ret = childOutput( out[ 0 ] );
if ( ( ret == -1 && errno != EAGAIN ) || ret == 0 )
b_out = false;
}
if ( b_err && FD_ISSET( err[ 0 ], &rfds ) )
{
int ret = 1;
while ( ret > 0 )
ret = childError( err[ 0 ] );
if ( ( ret == -1 && errno != EAGAIN ) || ret == 0 )
b_err = false;
}
}
}
if ( b_in )
{
communication = ( Communication ) ( communication & ~Stdin );
close( in[ 1 ] );
}
if ( b_out )
{
communication = ( Communication ) ( communication & ~Stdout );
close( out[ 0 ] );
}
if ( b_err )
{
communication = ( Communication ) ( communication & ~Stderr );
close( err[ 0 ] );
}
}
}
void OProcess::setUseShell( bool useShell, const char *shell )
{
if ( !d )
d = new OProcessPrivate;
d->useShell = useShell;
d->shell = shell;
if ( d->shell.isEmpty() )
d->shell = searchShell();
}
QString OProcess::quote( const QString &arg )
{
QString res = arg;
res.replace( QRegExp( QString::fromLatin1( "\'" ) ),
QString::fromLatin1( "'\"'\"'" ) );
res.prepend( '\'' );
res.append( '\'' );
return res;
}
QCString OProcess::searchShell()
{
QCString tmpShell = QCString( getenv( "SHELL" ) ).stripWhiteSpace();
if ( !isExecutable( tmpShell ) )
{
tmpShell = "/bin/sh";
}
return tmpShell;
}
bool OProcess::isExecutable( const QCString &filename )
{
struct stat fileinfo;
if ( filename.isEmpty() )
return false;
// CC: we've got a valid filename, now let's see whether we can execute that file
if ( -1 == stat( filename.data(), &fileinfo ) )
return false;
// CC: return false if the file does not exist
// CC: anyway, we cannot execute directories, block/character devices, fifos or sockets
if ( ( S_ISDIR( fileinfo.st_mode ) ) ||
( S_ISCHR( fileinfo.st_mode ) ) ||
( S_ISBLK( fileinfo.st_mode ) ) ||
#ifdef S_ISSOCK
// CC: SYSVR4 systems don't have that macro
( S_ISSOCK( fileinfo.st_mode ) ) ||
#endif
( S_ISFIFO( fileinfo.st_mode ) ) ||
( S_ISDIR( fileinfo.st_mode ) ) )
{
return false;
}
// CC: now check for permission to execute the file
if ( access( filename.data(), X_OK ) != 0 )
return false;
// CC: we've passed all the tests...
return true;
}
int OProcess::processPID( const QString& process )
{
QString line;
QDir d = QDir( "/proc" );
QStringList dirs = d.entryList( QDir::Dirs );
QStringList::Iterator it;
for ( it = dirs.begin(); it != dirs.end(); ++it )
{
//qDebug( "next entry: %s", (const char*) *it );
QFile file( "/proc/"+*it+"/cmdline" );
file.open( IO_ReadOnly );
if ( !file.isOpen() ) continue;
QTextStream t( &file );
line = t.readLine();
//qDebug( "cmdline = %s", (const char*) line );
if ( line.contains( process ) ) break; //FIXME: That may find also other process, if the name is not long enough ;)
}
if ( line.contains( process ) )
{
//qDebug( "found process id #%d", (*it).toInt() );
return (*it).toInt();
}
else
{
//qDebug( "process '%s' not found", (const char*) process );
- return -1;
+ return 0;
}
}