The main problem is that sudo cannot be killed when it prompts password, as it's run by root, so the correct way out is to close the write fd.
89 lines
2.0 KiB
Plaintext
89 lines
2.0 KiB
Plaintext
$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;
|