$OpenBSD: patch-kdesu_su_cpp,v 1.3 2003/04/05 14:53:39 espie Exp $ --- kdesu/su.cpp.orig Sun Mar 2 20:00:58 2003 +++ kdesu/su.cpp Sun Mar 30 16:24:08 2003 @@ -41,17 +41,33 @@ #ifndef __PATH_SU #define __PATH_SU "false" #endif +#ifndef __PATH_SUDO +#define __PATH_SUDO "false" +#endif +class SuProcess::SuProcessPrivate +{ +public: + bool m_useSudo; +}; SuProcess::SuProcess(const QCString &user, const QCString &command) { m_User = user; m_Command = command; + d = new SuProcess::SuProcessPrivate(); + d->m_useSudo = false; } SuProcess::~SuProcess() { + delete d; +} + +void SuProcess::setUseSudo(bool use_sudo) +{ + d->m_useSudo = use_sudo; } int SuProcess::checkInstall(const char *password) @@ -65,7 +81,7 @@ int SuProcess::checkNeedPassword() } /* - * Execute a command with su(1). + * Execute a command with su(1) or sudo */ int SuProcess::exec(const char *password, int check) @@ -74,14 +90,22 @@ int SuProcess::exec(const char *password setTerminal(true); QCStringList args; + if (d->m_useSudo) + { + args += "-S"; + args += "-p"; + args += "Password:"; + args += "-u"; + } if ((m_Scheduler != SchedNormal) || (m_Priority > 50)) args += "root"; else args += m_User; - args += "-c"; + if (!d->m_useSudo) + args += "-c"; args += QCString(__KDE_BINDIR) + "/kdesu_stub"; - if (StubProcess::exec(__PATH_SU, args) < 0) + if (StubProcess::exec(d->m_useSudo ? __PATH_SUDO : __PATH_SU, args) < 0) { return check ? SuNotFound : -1; } @@ -90,7 +114,8 @@ int SuProcess::exec(const char *password if (ret < 0) { if (!check) - kdError(900) << k_lineinfo << "Conversation with su failed\n"; + kdError(900) << k_lineinfo << "Conversation with " << + (d->m_useSudo ? "sudo" : "su") << " failed\n"; return ret; } if (check == 2) @@ -98,6 +123,8 @@ int SuProcess::exec(const char *password if (ret == 1) { kill(m_Pid, SIGTERM); + close(m_Fd); + m_Fd = -1; waitForChild(); } return ret; @@ -167,6 +194,9 @@ int SuProcess::ConverseSU(const char *pa return 0; } + if (d->m_useSudo && line != "Password:") + break; + // Match "Password: " with the regex ^[^:]+:[\w]*$. for (i=0,j=0,colon=0; im_useSudo && line == "Password:") + return -1; + // Read till we get "kdesu_stub" if (line == "kdesu_stub") {