summaryrefslogtreecommitdiffstats
path: root/kdesu/process.h
diff options
context:
space:
mode:
Diffstat (limited to 'kdesu/process.h')
-rw-r--r--kdesu/process.h188
1 files changed, 188 insertions, 0 deletions
diff --git a/kdesu/process.h b/kdesu/process.h
new file mode 100644
index 000000000..8a2004d92
--- /dev/null
+++ b/kdesu/process.h
@@ -0,0 +1,188 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * $Id$
+ *
+ * This file is part of the KDE project, module kdesu.
+ * Copyright (C) 1999,2000 Geert Jansen <jansen@kde.org>
+ *
+ * This is free software; you can use this library under the GNU Library
+ * General Public License, version 2. See the file "COPYING.LIB" for the
+ * exact licensing terms.
+ */
+
+#ifndef __Process_h_Included__
+#define __Process_h_Included__
+
+#include <sys/types.h>
+
+#include <qcstring.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qvaluelist.h>
+
+#include <kdelibs_export.h>
+
+class PTY;
+typedef QValueList<QCString> QCStringList;
+
+/**
+ * Synchronous communication with tty programs.
+ *
+ * PtyProcess provides synchronous communication with tty based programs.
+ * The communications channel used is a pseudo tty (as opposed to a pipe)
+ * This means that programs which require a terminal will work.
+ */
+
+class KDESU_EXPORT PtyProcess
+{
+public:
+ PtyProcess();
+ virtual ~PtyProcess();
+
+ /**
+ * Forks off and execute a command. The command's standard in and output
+ * are connected to the pseudo tty. They are accessible with readLine
+ * and writeLine.
+ * @param command The command to execute.
+ * @param args The arguments to the command.
+ */
+ int exec(const QCString &command, const QCStringList &args);
+
+ /**
+ * Reads a line from the program's standard out. Depending on the @em block
+ * parameter, this call blocks until a single, full line is read.
+ * @param block Block until a full line is read?
+ * @return The output string.
+ */
+ QCString readLine(bool block=true);
+ /**
+ * Read all available output from the program's standard out.
+ * @param block If no output is in the buffer, should the function block
+ * @return The output.
+ */
+ QCString readAll(bool block=true);
+
+ /**
+ * Writes a line of text to the program's standard in.
+ * @param line The text to write.
+ * @param addNewline Adds a '\n' to the line.
+ */
+ void writeLine(const QCString &line, bool addNewline=true);
+
+ /**
+ * Puts back a line of input.
+ * @param line The line to put back.
+ * @param addNewline Adds a '\n' to the line.
+ */
+ void unreadLine(const QCString &line, bool addNewline=true);
+
+ /**
+ * Sets the exit string. If a line of program output matches this,
+ * waitForChild() will terminate the program and return.
+ */
+ void setExitString(const QCString &exit) { m_Exit = exit; }
+
+ /**
+ * Waits for the child to exit. See also setExitString.
+ */
+ int waitForChild();
+
+ /**
+ * Waits until the pty has cleared the ECHO flag. This is useful
+ * when programs write a password prompt before they disable ECHO.
+ * Disabling it might flush any input that was written.
+ */
+ int WaitSlave();
+
+ /**
+ * Enables/disables local echo on the pseudo tty.
+ */
+ int enableLocalEcho(bool enable=true);
+
+ /**
+ * Enables/disables terminal output. Relevant only to some subclasses.
+ */
+ void setTerminal(bool terminal) { m_bTerminal = terminal; }
+
+ /**
+ * Overwrites the password as soon as it is used. Relevant only to
+ * some subclasses.
+ */
+ void setErase(bool erase) { m_bErase = erase; }
+
+ /**
+ * Set additinal environment variables.
+ */
+ void setEnvironment( const QCStringList &env );
+
+ /**
+ * Returns the filedescriptor of the process.
+ */
+ int fd() {return m_Fd;}
+
+ /**
+ * Returns the pid of the process.
+ */
+ int pid() {return m_Pid;}
+
+public: /* static */
+ /*
+ ** This is a collection of static functions that can be
+ ** used for process control inside kdesu. I'd suggest
+ ** against using this publicly. There are probably
+ ** nicer Qt based ways to do what you want.
+ */
+
+ /**
+ ** Wait @p ms miliseconds (ie. 1/10th of a second is 100ms),
+ ** using @p fd as a filedescriptor to wait on. Returns
+ ** select(2)'s result, which is -1 on error, 0 on timeout,
+ ** or positive if there is data on one of the selected fd's.
+ **
+ ** @p ms must be in the range 0..999 (ie. the maximum wait
+ ** duration is 999ms, almost one second).
+ */
+ static int waitMS(int fd,int ms);
+
+
+ /**
+ ** Basic check for the existence of @p pid.
+ ** Returns true iff @p pid is an extant process,
+ ** (one you could kill - see man kill(2) for signal 0).
+ */
+ static bool checkPid(pid_t pid);
+
+ /**
+ ** Check process exit status for process @p pid.
+ ** On error (no child, no exit), return -1.
+ ** If child @p pid has exited, return its exit status,
+ ** (which may be zero).
+ ** If child @p has not exited, return -2.
+ */
+ enum checkPidStatus { Error=-1, NotExited=-2, Killed=-3 } ;
+ static int checkPidExited(pid_t pid);
+
+
+protected:
+ const QCStringList& environment() const;
+
+ bool m_bErase, m_bTerminal;
+ int m_Pid, m_Fd;
+ QCString m_Command, m_Exit;
+
+private:
+ int init();
+ int SetupTTY(int fd);
+
+ PTY *m_pPTY;
+ QCString m_Inbuf, m_TTY;
+
+protected:
+ virtual void virtual_hook( int id, void* data );
+private:
+ class PtyProcessPrivate;
+ PtyProcessPrivate *d;
+};
+
+
+#endif