stub.cpp
00001 /* vi: ts=8 sts=4 sw=4 00002 * 00003 * $Id: stub.cpp 474905 2005-10-27 16:18:03Z lunakl $ 00004 * 00005 * This file is part of the KDE project, module kdesu. 00006 * Copyright (C) 1999,2000 Geert Jansen <jansen@kde.org> 00007 * 00008 * This is free software; you can use this library under the GNU Library 00009 * General Public License, version 2. See the file "COPYING.LIB" for the 00010 * exact licensing terms. 00011 * 00012 * stub.cpp: Conversation with kdesu_stub. 00013 */ 00014 00015 #include <config.h> 00016 #include <stdlib.h> 00017 #include <unistd.h> 00018 00019 #include <qglobal.h> 00020 #include <qcstring.h> 00021 #include <kdatastream.h> 00022 00023 #include <kapplication.h> 00024 #include <kdebug.h> 00025 #include <dcopclient.h> 00026 00027 #include "stub.h" 00028 #include "kcookie.h" 00029 00030 00031 StubProcess::StubProcess() 00032 { 00033 m_User = "root"; 00034 m_Scheduler = SchedNormal; 00035 m_Priority = 50; 00036 m_pCookie = new KCookie; 00037 m_bXOnly = true; 00038 m_bDCOPForwarding = false; 00039 } 00040 00041 00042 StubProcess::~StubProcess() 00043 { 00044 delete m_pCookie; 00045 } 00046 00047 00048 void StubProcess::setPriority(int prio) 00049 { 00050 if (prio > 100) 00051 m_Priority = 100; 00052 else if (prio < 0) 00053 m_Priority = 0; 00054 else 00055 m_Priority = prio; 00056 } 00057 00058 00059 QCString StubProcess::commaSeparatedList(QCStringList lst) 00060 { 00061 if (lst.count() == 0) 00062 return QCString(""); 00063 00064 QCStringList::Iterator it = lst.begin(); 00065 QCString str = *it; 00066 for (it++; it!=lst.end(); it++) 00067 { 00068 str += ','; 00069 str += *it; 00070 } 00071 return str; 00072 } 00073 00074 /* 00075 * Conversation with kdesu_stub. This is how we pass the authentication 00076 * tokens (X11, DCOP) and other stuff to kdesu_stub. 00077 * return values: -1 = error, 0 = ok, 1 = kill me 00078 */ 00079 00080 int StubProcess::ConverseStub(int check) 00081 { 00082 QCString line, tmp; 00083 while (1) 00084 { 00085 line = readLine(); 00086 if (line.isNull()) 00087 return -1; 00088 00089 if (line == "kdesu_stub") 00090 { 00091 // This makes parsing a lot easier. 00092 enableLocalEcho(false); 00093 if (check) writeLine("stop"); 00094 else writeLine("ok"); 00095 } else if (line == "display") { 00096 writeLine(display()); 00097 } else if (line == "display_auth") { 00098 #ifdef Q_WS_X11 00099 writeLine(displayAuth()); 00100 #else 00101 writeLine(""); 00102 #endif 00103 } else if (line == "dcopserver") { 00104 if (m_bDCOPForwarding) 00105 writeLine(dcopServer()); 00106 else 00107 writeLine("no"); 00108 } else if (line == "dcop_auth") { 00109 if (m_bDCOPForwarding) 00110 writeLine(dcopAuth()); 00111 else 00112 writeLine("no"); 00113 } else if (line == "ice_auth") { 00114 if (m_bDCOPForwarding) 00115 writeLine(iceAuth()); 00116 else 00117 writeLine("no"); 00118 } else if (line == "command") { 00119 writeLine(m_Command); 00120 } else if (line == "path") { 00121 QCString path = getenv("PATH"); 00122 if (m_User == "root") 00123 if (!path.isEmpty()) 00124 path = "/sbin:/usr/sbin:" + path; 00125 else 00126 path = "/sbin:/usr/sbin"; 00127 writeLine(path); 00128 } else if (line == "user") { 00129 writeLine(m_User); 00130 } else if (line == "priority") { 00131 tmp.setNum(m_Priority); 00132 writeLine(tmp); 00133 } else if (line == "scheduler") { 00134 if (m_Scheduler == SchedRealtime) writeLine("realtime"); 00135 else writeLine("normal"); 00136 } else if (line == "xwindows_only") { 00137 if (m_bXOnly) writeLine("no"); 00138 else writeLine("yes"); 00139 } else if (line == "app_startup_id") { 00140 QCStringList env = environment(); 00141 QCString tmp; 00142 for( QCStringList::ConstIterator it = env.begin(); 00143 it != env.end(); 00144 ++it ) 00145 { 00146 if( (*it).find( "DESKTOP_STARTUP_ID=" ) == 0 ) 00147 tmp = (*it).mid( strlen( "DESKTOP_STARTUP_ID=" )); 00148 } 00149 if( tmp.isEmpty()) 00150 tmp = "0"; 00151 writeLine(tmp); 00152 } else if (line == "app_start_pid") { // obsolete 00153 tmp.setNum(getpid()); 00154 writeLine(tmp); 00155 } else if (line == "environment") { // additional env vars 00156 QCStringList env = environment(); 00157 for( QCStringList::ConstIterator it = env.begin(); 00158 it != env.end(); 00159 ++it ) 00160 writeLine( *it ); 00161 writeLine( "" ); 00162 } else if (line == "end") { 00163 return 0; 00164 } else 00165 { 00166 kdWarning(900) << k_lineinfo << "Unknown request: -->" << line 00167 << "<--\n"; 00168 return 1; 00169 } 00170 } 00171 00172 return 0; 00173 } 00174 00175 00176 void StubProcess::notifyTaskbar(const QString &) 00177 { 00178 kdWarning(900) << "Obsolete StubProcess::notifyTaskbar() called!" << endl; 00179 } 00180 00181 void StubProcess::virtual_hook( int id, void* data ) 00182 { PtyProcess::virtual_hook( id, data ); }