Source Code (Use browser search to find items of interest.)
Class Index
kdelibs'KDEsuClient (./kdelibs/kdesu/client.h:27)
class KDEsuClient {
public:
KDEsuClient();
~KDEsuClient();
/**
* Execute a command through kdesud. If a password is already set, the
* command and password are stored and the command can be executed later
* on without having to supply a password.
*
* @param command The command to execute.
* @return Zero on success, -1 on failure.
*/
int exec(QCString command);
/**
* Set root's password, lasts one session.
*
* @param pass Root's password.
* @param timeout The time that a password will live.
* @return Zero on success, -1 on failure.
*/
int setPass(const char *pass, int timeout);
/**
* Set the target user.
*/
int setUser(QCString user);
/**
* Set the target host (optional).
*/
int setHost(QCString host);
/**
* Set the desired priority, see @ref #StubProcess.
*/
int setPriority(int priority);
/**
* Set the desired scheduler, see @ref #StubProcess.
*/
int setScheduler(int scheduler);
/**
* Remove a command and it's password from kdesud.
* @param command The command to remove.
* @return zero on success, -1 on an error
*/
int delCommand(QCString command);
/**
* Set a persistent variable.
* @param key The name of the variable.
* @param value Its value.
*/
int setVar(QCString key, QCString value);
/**
* Get a persistent variable.
* @param key The name of the variable.
* @return Its value.
*/
QCString getVar(QCString key);
/**
* Ping kdesud. This can be used for diagnostics.
* @return Zero on success, -1 on failure
*/
int ping();
/**
* Stop the daemon.
*/
int stopServer();
/**
* Try to start up kdesud
*/
int startServer();
/**
* re(connect) to kdesud
*/
int connect();
private:
class KDEsuClientPrivate;
KDEsuClientPrivate *d;
int sockfd;
QCString sock;
int command(QCString cmd, QCString *result=0L);
QCString escape(QCString str);
};
kdelibs'KDEsuClient::KDEsuClient() (./kdelibs/kdesu/client.cpp:47)
KDEsuClient::KDEsuClient()
{
sockfd = -1;
char *dpy = getenv("DISPLAY");
if (dpy == 0L) {
kDebugWarning("%s: $DISPLAY is not set", ID);
return;
}
sock.sprintf("/tmp/kdesud_%d_%s", (int) getuid(), dpy);
connect();
}
kdelibs'KDEsuClient::~KDEsuClient() (./kdelibs/kdesu/client.cpp:60)
KDEsuClient::~KDEsuClient()
{
if (sockfd >= 0)
close(sockfd);
}
kdelibs'KDEsuClient::connect() (./kdelibs/kdesu/client.cpp:67)
int KDEsuClient::connect()
{
if (sockfd >= 0)
close(sockfd);
if (access(sock, R_OK|W_OK)) {
sockfd = -1;
return -1;
}
sockfd = socket(PF_UNIX, SOCK_STREAM, 0);
if (sockfd < 0) {
kDebugWarning("%s: socket(): %m", ID);
return -1;
}
struct sockaddr_un addr;
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, sock);
if (::connect(sockfd, (struct sockaddr *) &addr, SUN_LEN(&addr)) < 0) {
kDebugWarning("%s: connect(): %m", ID);
close(sockfd); sockfd = -1;
return -1;
}
return 0;
}
kdelibs'KDEsuClient::escape() (./kdelibs/kdesu/client.cpp:94)
QCString KDEsuClient::escape(QCString str)
{
QCString copy = str;
int n = 0;
while ((n = copy.find("\\", n)) != -1) {
copy.insert(n, '\\');
n += 2;
}
n = 0;
while ((n = copy.find("\"", n)) != -1) {
copy.insert(n, '\\');
n += 2;
}
copy.prepend("\"");
copy.append("\"");
return copy;
}
kdelibs'KDEsuClient::command() (./kdelibs/kdesu/client.cpp:116)
int KDEsuClient::command(QCString cmd, QCString *result)
{
if (sockfd < 0)
return -1;
if (send(sockfd, cmd, cmd.length(), 0) != (int) cmd.length())
return -1;
char buf[200];
int nbytes = recv(sockfd, buf, 199, 0);
if (nbytes <= 0) {
kDebugWarning("%s: no reply from daemon", ID);
return -1;
}
buf[nbytes] = '\000';
QCString reply = buf;
if (reply.left(2) != "OK")
return -1;
if (result)
*result = reply.mid(2).stripWhiteSpace();
return 0;
}
kdelibs'KDEsuClient::setPass() (./kdelibs/kdesu/client.cpp:142)
int KDEsuClient::setPass(const char *pass, int timeout)
{
QCString cmd = "PASS ";
cmd += escape(pass);
cmd += " ";
cmd += QCString().setNum(timeout);
cmd += "\n";
return command(cmd);
}
kdelibs'KDEsuClient::exec() (./kdelibs/kdesu/client.cpp:153)
int KDEsuClient::exec(QCString key)
{
QCString cmd;
cmd = "EXEC ";
cmd += escape(key);
cmd += "\n";
return command(cmd);
}
kdelibs'KDEsuClient::setUser() (./kdelibs/kdesu/client.cpp:163)
int KDEsuClient::setUser(QCString user)
{
QCString cmd = "USER ";
cmd += escape(user);
cmd += "\n";
return command(cmd);
}
kdelibs'KDEsuClient::setHost() (./kdelibs/kdesu/client.cpp:172)
int KDEsuClient::setHost(QCString host)
{
QCString cmd = "HOST ";
cmd += escape(host);
cmd += "\n";
return command(cmd);
}
kdelibs'KDEsuClient::setPriority() (./kdelibs/kdesu/client.cpp:181)
int KDEsuClient::setPriority(int prio)
{
QCString cmd;
cmd.sprintf("PRIO %d\n", prio);
return command(cmd);
}
kdelibs'KDEsuClient::setScheduler() (./kdelibs/kdesu/client.cpp:189)
int KDEsuClient::setScheduler(int sched)
{
QCString cmd;
cmd.sprintf("SCHD %d\n", sched);
return command(cmd);
}
kdelibs'KDEsuClient::delCommand() (./kdelibs/kdesu/client.cpp:197)
int KDEsuClient::delCommand(QCString key)
{
QCString cmd = "DEL ";
cmd += escape(key);
cmd += "\n";
return command(cmd);
}
kdelibs'KDEsuClient::setVar() (./kdelibs/kdesu/client.cpp:206)
int KDEsuClient::setVar(QCString key, QCString value)
{
QCString cmd = "SET ";
cmd += escape(key);
cmd += " ";
cmd += escape(value);
cmd += "\n";
return command(cmd);
}
kdelibs'KDEsuClient::getVar() (./kdelibs/kdesu/client.cpp:217)
QCString KDEsuClient::getVar(QCString key)
{
QCString cmd = "GET ";
cmd += escape(key);
cmd += "\n";
QCString reply;
command(cmd, &reply);
return reply;
}
kdelibs'KDEsuClient::ping() (./kdelibs/kdesu/client.cpp:228)
int KDEsuClient::ping()
{
return command("PING\n");
}
kdelibs'KDEsuClient::stopServer() (./kdelibs/kdesu/client.cpp:234)
int KDEsuClient::stopServer()
{
return command("STOP\n");
}
kdelibs'KDEsuClient::startServer() (./kdelibs/kdesu/client.cpp:239)
int KDEsuClient::startServer()
{
QString daemon = KStandardDirs::findExe("kdesud");
if (daemon.isEmpty())
return -1;
struct stat sbuf;
if (stat(daemon.latin1(), &sbuf) < 0) {
kDebugWarning("%s: stat(): %m", ID);
return -1;
}
if (!(sbuf.st_mode & S_ISGID)) {
kDebugWarning("%s: kdesud not setgid: not using it", ID);
return -1;
}
return system("kdesud");
}