$OpenBSD: patch-kdesu_su_cpp,v 1.1 2002/05/15 17:19:44 espie Exp $ --- kdesu/su.cpp.orig Sat May 11 11:13:25 2002 +++ kdesu/su.cpp Wed May 15 12:02:01 2002 @@ -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,20 @@ int SuProcess::exec(const char *password setTerminal(true); QCStringList args; + if (d->m_useSudo) + { + args += "-S"; + 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 +112,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 +121,8 @@ int SuProcess::exec(const char *password if (ret == 1) { kill(m_Pid, SIGTERM); + close(m_Fd); + m_Fd = -1; waitForChild(); } return ret;