• Skip to content
  • Skip to link menu
KDE 4.1 API Reference
  • KDE API Reference
  • kdelibs
  • Sitemap
  • Contact Us
 

KDEsu

stub.cpp

Go to the documentation of this file.
00001 /* vi: ts=8 sts=4 sw=4
00002  *
00003  * This file is part of the KDE project, module kdesu.
00004  * Copyright (C) 1999,2000 Geert Jansen <jansen@kde.org>
00005  *
00006  * This is free software; you can use this library under the GNU Library
00007  * General Public License, version 2. See the file "COPYING.LIB" for the
00008  * exact licensing terms.
00009  *
00010  * stub.cpp: Conversation with kdesu_stub.
00011  */
00012 
00013 #include "stub.h"
00014 #include "kcookie.h"
00015 
00016 #include <config.h>
00017 #include <stdlib.h>
00018 #include <unistd.h>
00019 
00020 #include <QtCore/QBool>
00021 
00022 #include <kapplication.h>
00023 #include <kdebug.h>
00024 
00025 namespace KDESu { 
00026     
00027 using namespace KDESuPrivate;
00028 
00029 StubProcess::StubProcess()
00030     : d(0)
00031 {
00032     m_User = "root";
00033     m_Scheduler = SchedNormal;
00034     m_Priority = 50;
00035     m_pCookie = new KCookie;
00036     m_bXOnly = true;
00037 }
00038 
00039 
00040 StubProcess::~StubProcess()
00041 {
00042     delete m_pCookie;
00043 }
00044 
00045 
00046 void StubProcess::setCommand(const QByteArray &command)
00047 {
00048     m_Command = command;
00049 }
00050 
00051 
00052 void StubProcess::setUser(const QByteArray &user)
00053 {
00054     m_User = user;
00055 }
00056 
00057 
00058 void StubProcess::setXOnly(bool xonly)
00059 {
00060     m_bXOnly = xonly;
00061 }
00062 
00063 
00064 void StubProcess::setPriority(int prio)
00065 {
00066     if (prio > 100)
00067     m_Priority = 100;
00068     else if (prio < 0)
00069     m_Priority = 0;
00070     else
00071     m_Priority = prio;
00072 }
00073 
00074 
00075 void StubProcess::setScheduler(int sched)
00076 {
00077     m_Scheduler = sched;
00078 }
00079 
00080 
00081 QByteArray StubProcess::commaSeparatedList(const QList<QByteArray> &lst)
00082 {
00083     QByteArray str;
00084     for (int i = 0; i < lst.count(); ++i) {
00085         str += ',';
00086         str += lst.at(i);
00087     }
00088     return str;
00089 }
00090 
00091 /* 
00092  * Map pid_t to a signed integer type that makes sense for QByteArray;
00093  * only the most common sizes 16 bit and 32 bit are special-cased.
00094  */
00095 template<int T> struct PIDType { typedef pid_t PID_t; } ;
00096 template<> struct PIDType<2> { typedef qint16 PID_t; } ;
00097 template<> struct PIDType<4> { typedef qint32 PID_t; } ;
00098 
00099 /*
00100  * Conversation with kdesu_stub. This is how we pass the authentication
00101  * tokens (X11) and other stuff to kdesu_stub.
00102  * return values: -1 = error, 0 = ok, 1 = kill me
00103  */
00104 
00105 int StubProcess::ConverseStub(int check)
00106 {
00107     QByteArray line, tmp;
00108     while (1)
00109     {
00110     line = readLine();
00111     if (line.isNull())
00112         return -1;
00113 
00114     if (line == "kdesu_stub")
00115     {
00116         // This makes parsing a lot easier.
00117         enableLocalEcho(false);
00118         if (check) writeLine("stop");
00119         else writeLine("ok");
00120     } else if (line == "display") {
00121         writeLine(display());
00122     } else if (line == "display_auth") {
00123 #ifdef Q_WS_X11
00124         writeLine(displayAuth());
00125 #else
00126         writeLine("");
00127 #endif
00128     } else if (line == "command") {
00129         writeLine(m_Command);
00130     } else if (line == "path") {
00131         QByteArray path = qgetenv("PATH");
00132             if (!path.isEmpty() && path[0] == ':')
00133                 path = path.mid(1);
00134         if (m_User == "root") {
00135         if (!path.isEmpty())
00136             path = "/sbin:/bin:/usr/sbin:/usr/bin:" + path;
00137         else
00138             path = "/sbin:/bin:/usr/sbin:/usr/bin";
00139             }
00140         writeLine(path);
00141     } else if (line == "user") {
00142         writeLine(m_User);
00143     } else if (line == "priority") {
00144         tmp.setNum(m_Priority);
00145         writeLine(tmp);
00146     } else if (line == "scheduler") {
00147         if (m_Scheduler == SchedRealtime) writeLine("realtime");
00148         else writeLine("normal");
00149     } else if (line == "xwindows_only") {
00150         if (m_bXOnly) writeLine("no");
00151         else writeLine("yes");
00152     } else if (line == "app_startup_id") {
00153         QList<QByteArray> env = environment();
00154         QByteArray tmp;
00155         for(int i = 0; i < env.count(); ++i)
00156         {
00157                 const char startup_env[] = "DESKTOP_STARTUP_ID=";
00158                 if (env.at(i).startsWith(startup_env))
00159                     tmp = env.at(i).mid(sizeof(startup_env) - 1);
00160         }
00161         if( tmp.isEmpty())
00162         tmp = "0";
00163         writeLine(tmp);
00164     } else if (line == "app_start_pid") { // obsolete
00165         // Force the pid_t returned from getpid() into
00166         // something QByteArray understands; avoids ambiguity
00167         // between short and unsigned short in particular.
00168         tmp.setNum((PIDType<sizeof(pid_t)>::PID_t)(getpid()));
00169         writeLine(tmp);
00170     } else if (line == "environment") { // additional env vars
00171         QList<QByteArray> env = environment();
00172             for (int i = 0; i < env.count(); ++i)
00173                 writeLine(env.at(i));
00174         writeLine( "" );
00175     } else if (line == "end") {
00176         return 0;
00177     } else
00178     {
00179         kWarning(900) << k_lineinfo << "Unknown request: -->" << line 
00180                    << "<--\n";
00181         return 1;
00182     }
00183     }
00184 
00185     return 0;
00186 }
00187 
00188 
00189 QByteArray StubProcess::display()
00190 {
00191     return m_pCookie->display();
00192 }
00193 
00194 
00195 #ifdef Q_WS_X11
00196 QByteArray StubProcess::displayAuth()
00197 {
00198     return m_pCookie->displayAuth();
00199 }
00200 #endif
00201 
00202 
00203 void StubProcess::virtual_hook( int id, void* data )
00204 { PtyProcess::virtual_hook( id, data ); }
00205 
00206 }

KDEsu

Skip menu "KDEsu"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • KIO
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • Kross
  • KUtils
  • Nepomuk
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal