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");
}