-rw-r--r-- | libopie2/opiecore/oprocess.cpp | 193 | ||||
-rw-r--r-- | libopie2/opiecore/oprocess.h | 80 |
2 files changed, 109 insertions, 164 deletions
diff --git a/libopie2/opiecore/oprocess.cpp b/libopie2/opiecore/oprocess.cpp index fb51bf9..f1a5f3b 100644 --- a/libopie2/opiecore/oprocess.cpp +++ b/libopie2/opiecore/oprocess.cpp @@ -1,71 +1,58 @@ /* - - $Id$ - - This file is part of the KDE libraries - Copyright (C) 1997 Christian Czezatke (e9025461@student.tuwien.ac.at) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + This file is part of the Opie Project + Copyright (C) 2002-2004 Holger Freyther <zecke@handhelds.org> + and The Opie Team <opie-devel@handhelds.org> + =. Based on KProcess (C) 1997 Christian Czezatke (e9025461@student.tuwien.ac.at) + .=l. + .>+-= +_;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software +- . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. +: = ...= . :.=- +-. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -// -// KPROCESS -- A class for handling child processes in KDE without -// having to take care of Un*x specific implementation details -// -// version 0.3.1, Jan 8th 1998 -// -// (C) Christian Czezatke -// e9025461@student.tuwien.ac.at -// -// Changes: -// -// March 2nd, 1998: Changed parameter list for KShellProcess: -// Arguments are now placed in a single string so that -// <shell> -c <commandstring> is passed to the shell -// to make the use of "operator<<" consistent with KProcess -// -// -// Ported by Holger Freyther -// <zekce> Harlekin: oprocess and say it was ported to Qt by the Opie developers an Qt 2 - - - -#include "oprocess.h" -#define _MAY_INCLUDE_KPROCESSCONTROLLER_ #include "oprocctrl.h" -//#include <config.h> +/* OPIE */ +#include <opie2/oprocess.h> + +/* QT */ +#include <qapplication.h> #include <qfile.h> -#include <qsocketnotifier.h> +#include <qmap.h> #include <qregexp.h> +#include <qsocketnotifier.h> -#include <sys/time.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/socket.h> - +/* STD */ #include <errno.h> #include <fcntl.h> +#include <pwd.h> #include <stdlib.h> #include <signal.h> #include <stdio.h> #include <string.h> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/socket.h> #include <unistd.h> #ifdef HAVE_SYS_SELECT_H #include <sys/select.h> @@ -73,20 +60,12 @@ #ifdef HAVE_INITGROUPS #include <grp.h> #endif -#include <pwd.h> - -#include <qapplication.h> -#include <qmap.h> -//#include <kdebug.h> - -///////////////////////////// -// public member functions // -///////////////////////////// class OProcessPrivate { public: - OProcessPrivate() : useShell(false) { } + OProcessPrivate() : useShell( false ) + { } bool useShell; QMap<QString,QString> env; @@ -143,24 +122,21 @@ void OProcess::init ( ) err[0] = err[1] = -1; } -void -OProcess::setEnvironment(const QString &name, const QString &value) +void OProcess::setEnvironment( const QString &name, const QString &value ) { if (!d) d = new OProcessPrivate; d->env.insert(name, value); } -void -OProcess::setWorkingDirectory(const QString &dir) +void OProcess::setWorkingDirectory( const QString &dir ) { if (!d) d = new OProcessPrivate; d->wd = dir; } -void -OProcess::setupEnvironment() +void OProcess::setupEnvironment() { if (d) { @@ -173,19 +149,16 @@ OProcess::setupEnvironment() } } -void -OProcess::setRunPrivileged(bool keepPrivileges) +void OProcess::setRunPrivileged( bool keepPrivileges ) { keepPrivs = keepPrivileges; } -bool -OProcess::runPrivileged() const +bool OProcess::runPrivileged() const { return keepPrivs; } - OProcess::~OProcess() { // destroying the OProcess instance sends a SIGKILL to the @@ -224,9 +197,11 @@ void OProcess::detach() bool OProcess::setExecutable(const QString& proc) { - if (runs) return false; + if ( runs ) + return false; - if (proc.isEmpty()) return false; + if ( proc.isEmpty() ) + return false; if (!arguments.isEmpty()) arguments.remove(arguments.begin()); @@ -316,6 +291,7 @@ bool OProcess::start(RunMode runmode, Communication comm) uid_t uid = getuid(); gid_t gid = getgid(); #ifdef HAVE_INITGROUPS + struct passwd *pw = getpwuid(uid); #endif @@ -341,9 +317,11 @@ bool OProcess::start(RunMode runmode, Communication comm) { setgid(gid); #if defined( HAVE_INITGROUPS) + if(pw) initgroups(pw->pw_name, pw->pw_gid); #endif + setuid(uid); } // The child process @@ -391,7 +369,8 @@ bool OProcess::start(RunMode runmode, Communication comm) input_data = 0; // Check whether client could be started. - if (fd[0]) for(;;) + if ( fd[ 0 ] ) + for ( ;; ) { char resultByte; int n = ::read(fd[0], &resultByte, 1); @@ -448,38 +427,28 @@ bool OProcess::kill(int signo) return rv; } - - bool OProcess::isRunning() const { return runs; } - - pid_t OProcess::pid() const { return pid_; } - - bool OProcess::normalExit() const { int _status = status; return (pid_ != 0) && (!runs) && (WIFEXITED((_status))); } - - int OProcess::exitStatus() const { int _status = status; return WEXITSTATUS((_status)); } - - bool OProcess::writeStdin(const char *buffer, int buflen) { bool rv; @@ -583,27 +552,18 @@ bool OProcess::closeStderr() return rv; } - -///////////////////////////// -// protected slots // -///////////////////////////// - - - void OProcess::slotChildOutput(int fdno) { if (!childOutput(fdno)) closeStdout(); } - void OProcess::slotChildError(int fdno) { if (!childError(fdno)) closeStderr(); } - void OProcess::slotSendData(int) { if (input_sent == input_total) @@ -616,14 +576,6 @@ void OProcess::slotSendData(int) input_sent += ::write(in[1], input_data+input_sent, input_total-input_sent); } - - -////////////////////////////// -// private member functions // -////////////////////////////// - - - void OProcess::processHasExited(int state) { if (runs) @@ -641,8 +593,6 @@ void OProcess::processHasExited(int state) } } - - int OProcess::childOutput(int fdno) { if (communication & NoRead) @@ -667,8 +617,6 @@ int OProcess::childOutput(int fdno) } } - - int OProcess::childError(int fdno) { char buffer[1024]; @@ -681,8 +629,6 @@ int OProcess::childError(int fdno) return len; } - - int OProcess::setupCommunication(Communication comm) { int ok; @@ -702,8 +648,6 @@ int OProcess::setupCommunication(Communication comm) return ok; } - - int OProcess::commSetupDoneP() { int ok = 1; @@ -719,7 +663,8 @@ int OProcess::commSetupDoneP() // Don't create socket notifiers and set the sockets non-blocking if // blocking is requested. - if (run_mode == Block) return ok; + if ( run_mode == Block ) + return ok; if (communication & Stdin) { @@ -754,8 +699,6 @@ int OProcess::commSetupDoneP() return ok; } - - int OProcess::commSetupDoneC() { int ok = 1; @@ -802,8 +745,6 @@ int OProcess::commSetupDoneC() return ok; } - - void OProcess::commClose() { if (NoCommunication != communication) @@ -865,12 +806,14 @@ void OProcess::commClose() FD_SET(err[0], &rfds); fds_ready = select(max_fd+1, &rfds, 0, 0, p_timeout); - if (fds_ready <= 0) break; + if ( fds_ready <= 0 ) + break; if (b_out && FD_ISSET(out[0], &rfds)) { int ret = 1; - while (ret > 0) ret = childOutput(out[0]); + while ( ret > 0 ) + ret = childOutput( out[ 0 ] ); if ((ret == -1 && errno != EAGAIN) || ret == 0) b_out = false; } @@ -878,7 +821,8 @@ void OProcess::commClose() if (b_err && FD_ISSET(err[0], &rfds)) { int ret = 1; - while (ret > 0) ret = childError(err[0]); + while ( ret > 0 ) + ret = childError( err[ 0 ] ); if ((ret == -1 && errno != EAGAIN) || ret == 0) b_err = false; } @@ -938,11 +882,13 @@ bool OProcess::isExecutable(const QCString &filename) { struct stat fileinfo; - if (filename.isEmpty()) return false; + 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; + 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 @@ -960,11 +906,10 @@ bool OProcess::isExecutable(const QCString &filename) } // CC: now check for permission to execute the file - if (access(filename.data(), X_OK) != 0) return false; + if ( access( filename.data(), X_OK ) != 0 ) + return false; // CC: we've passed all the tests... return true; } - - diff --git a/libopie2/opiecore/oprocess.h b/libopie2/opiecore/oprocess.h index 8dd19b5..352485b 100644 --- a/libopie2/opiecore/oprocess.h +++ b/libopie2/opiecore/oprocess.h @@ -1,42 +1,46 @@ -/* This file is part of the KDE libraries - Copyright (C) 1997 Christian Czezakte (e9025461@student.tuwien.ac.at) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +/* + This file is part of the Opie Project + Copyright (C) 2003-2004 Holger Freyther <zecke@handhelds.org> + Copyright (C) The Opie Team <opie-devel@handhelds.org> + =. Based on KProcess (C) 1997 Christian Czezatke (e9025461@student.tuwien.ac.at) + .=l. + .>+-= +_;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software +- . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. +: = ...= . :.=- +-. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -// -// KPROCESS -- A class for handling child processes in KDE without -// having to take care of Un*x specific implementation details -// -// version 0.3.1, Jan 8th 1998 -// -// (C) Christian Czezatke -// e9025461@student.tuwien.ac.at -// Ported by Holger Freyther to the Open Palmtop Integrated Environment -// -#ifndef __kprocess_h__ -#define __kprocess_h__ +#ifndef OPROCESS_H +#define OPROCESS_H + +/* QT */ +#include <qcstring.h> +#include <qobject.h> +#include <qvaluelist.h> +/* STD */ #include <sys/types.h> // for pid_t #include <sys/wait.h> #include <signal.h> #include <unistd.h> -#include <qvaluelist.h> -#include <qcstring.h> -#include <qobject.h> class QSocketNotifier; class OProcessPrivate; @@ -141,7 +145,7 @@ class OProcessPrivate; *client . * *@author Christian Czezakte e9025461@student.tuwien.ac.at - * + *@author Holger Freyther (Opie Port) * **/ class OProcess : public QObject @@ -395,7 +399,10 @@ public: * Lets you see what your arguments are for debugging. */ - const QValueList<QCString> &args() { return arguments; } + const QValueList<QCString> &args() + { + return arguments; + } /** * Controls whether the started process should drop any @@ -454,8 +461,6 @@ public: */ void detach(); - - signals: /** @@ -522,7 +527,6 @@ signals: **/ void wroteStdin(OProcess *proc); - protected slots: /** @@ -709,7 +713,6 @@ protected: */ friend class OProcessController; - private: /** * Searches for a valid shell. @@ -737,11 +740,8 @@ private: private: void init ( ); - OProcessPrivate *d; }; - - #endif |