openbsd-ports/x11/kde/libs3/patches/patch-kdesu_su_cpp
espie a868937d39 Add support for sudo in kdesu.
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.
2002-05-15 17:19:44 +00:00

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;