• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • dcop
 

dcop

dcopserver_shutdown_win.cpp
00001 /*
00002   This file is part of the KDE libraries
00003   Copyright (c) 1999 Waldo Bastian <bastian@kde.org>
00004             (c) 1999 Mario Weilguni <mweilguni@sime.com>
00005             (c) 2001 Lubos Lunak <l.lunak@kde.org>
00006 
00007   This library is free software; you can redistribute it and/or
00008   modify it under the terms of the GNU Library General Public
00009   License version 2 as published by the Free Software Foundation.
00010 
00011   This library is distributed in the hope that it will be useful,
00012   but WITHOUT ANY WARRANTY; without even the implied warranty of
00013   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014   Library General Public License for more details.
00015 
00016   You should have received a copy of the GNU Library General Public License
00017   along with this library; see the file COPYING.LIB.  If not, write to
00018   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00019   Boston, MA 02110-1301, USA.
00020 */
00021 
00022 #ifdef HAVE_CONFIG_H
00023 #include <config.h>
00024 #endif
00025 
00026 #ifdef HAVE_SYS_TYPES_H
00027 #include <sys/types.h>
00028 #endif
00029 
00030 #include <sys/socket.h>
00031 #include <stdlib.h>
00032 #if 0
00033 #include <sys/select.h>
00034 #include <sys/time.h>
00035 #include <sys/types.h>
00036 #include <sys/param.h>
00037 #include <sys/time.h>
00038 #include <sys/stat.h>
00039 #include <sys/un.h>
00040 
00041 #include <errno.h>
00042 #include <string.h>
00043 #include <stdio.h>
00044 #include <stdlib.h>
00045 #include <unistd.h>
00046 #include <pwd.h>
00047 #include <signal.h>
00048 #endif
00049 
00050 #include <tqfile.h>
00051 
00052 #include <dcopclient.h>
00053 
00054 #define BUFFER_SIZE 4096
00055 
00056 extern TQCString dcopServerFile(const TQCString &hostname, bool old);
00057 
00058 static char *getDisplay()
00059 {
00060    const char *display;
00061    char *result;
00062    char *screen;
00063    char *colon;
00064 /*
00065  don't test for a value from tqglobal.h but instead distinguish
00066  Qt/X11 from Qt/Embedded by the fact that Qt/E apps have -DQWS
00067  on the commandline (which in tqglobal.h however triggers Q_WS_QWS,
00068  but we don't want to include that here) (Simon)
00069 #ifdef Q_WS_X11
00070  */
00071 #if !defined(QWS)
00072    display = getenv("DISPLAY");
00073 #else
00074    display = getenv("QWS_DISPLAY");
00075 #endif
00076    if (!display || !*display)
00077    {
00078       display = "NODISPLAY";
00079    }
00080    result = (char*)malloc(strlen(display)+1);
00081    if (result == NULL)
00082       return NULL;
00083    strcpy(result, display);
00084    screen = strrchr(result, '.');
00085    colon = strrchr(result, ':');
00086    if (screen && (screen > colon))
00087       *screen = '\0';
00088    return result;
00089 }
00090 
00091 static void cleanupDCOPsocket(const char *socketfile)
00092 {
00093    char cmd[BUFFER_SIZE];
00094    char buffer[BUFFER_SIZE];
00095    const char *socket_file;
00096    int l; 
00097 
00098    l = strlen(socketfile);
00099    if (!l)
00100       return;
00101    strncpy(buffer,socketfile,l);
00102    buffer[l-1] = '\0'; /* strip LF */
00103 
00104    socket_file = strchr(buffer, ':');
00105    if (socket_file)
00106      socket_file++;
00107 
00108    if (socket_file)
00109       unlink(socket_file);
00110 
00111    snprintf(cmd, BUFFER_SIZE, "iceauth remove netid='%s'", buffer);
00112    system(cmd);
00113 }
00114 
00115 #ifdef Q_OS_WIN
00116 static void killDCOPWin(pid_t pid)
00117 {
00118     char    sz[256];
00119     sprintf(sz,"dcopserver%i",pid);
00120     HANDLE hEvent = CreateEventA(NULL,TRUE,FALSE,(LPCSTR)sz);
00121     DWORD dwError = GetLastError();
00122     printf("Signal event %s %p, %i\n",sz,hEvent,dwError);
00123     if(hEvent != NULL)
00124     {
00125         SetEvent(hEvent);
00126         CloseHandle(hEvent);
00127     }
00128 }
00129 #endif
00130 
00131 static void cleanupDCOP(int dont_kill_dcop, int wait_for_exit)
00132 {
00133     TQCString host;
00134     TQCString strDCOPServer = DCOPClient::dcopServerFile(host);
00135 
00136     if(strDCOPServer.isEmpty())
00137     {
00138             printf("no server file\n");
00139         return;
00140     }
00141     printf("server file %s\n",(const char *)strDCOPServer);
00142 
00143     pid_t   pid = 0;
00144     TQFile f(strDCOPServer);
00145     if(f.open(IO_ReadOnly))
00146     {
00147         TQString str;
00148         while(f.readLine(str,2048))
00149         {
00150             pid = str.toULong();
00151             if (pid)
00152                 break;
00153             cleanupDCOPsocket(str.ascii());
00154         }
00155     }
00156     f.close();
00157     /* Clean up .DCOPserver file */
00158     TQFile::remove(strDCOPServer);
00159     printf("remove server file %s\n",(const char *)strDCOPServer);
00160 
00161     if(pid)
00162     {
00163         if(!dont_kill_dcop)
00164         {
00165 #ifdef Q_OS_WIN
00166             killDCOPWin(pid);
00167 #else
00168             kill(pid, SIGTERM);
00169 #endif
00170         }
00171         else
00172         {
00173 #ifdef Q_OS_WIN
00174             killDCOPWin(pid);
00175 #endif
00176         }
00177     }
00178 
00179 #ifdef Q_OS_WIN
00180     if(wait_for_exit)
00181     {
00182         HANDLE hProcess = OpenProcess(SYNCHRONIZE,FALSE,(DWORD)pid);
00183         if(hProcess)
00184         {
00185             WaitForSingleObject(hProcess,INFINITE);
00186             CloseHandle(hProcess);
00187         }
00188     }
00189 #else
00190     while(wait_for_exit && (kill(pid, 0) == 0))
00191     {
00192         struct timeval tv;
00193         tv.tv_sec = 0;
00194         tv.tv_usec = 100000;
00195         select(0,0,0,0,&tv);
00196     }
00197 #endif
00198 }
00199 
00200 int main(int argc, char **argv)
00201 {
00202     TQCString host;
00203     
00204    int dont_kill_dcop = (argc == 2) && (strcmp(argv[1], "--nokill") == 0);
00205    int wait_for_exit = (argc == 2) && (strcmp(argv[1], "--wait") == 0);
00206 
00207    cleanupDCOP(dont_kill_dcop, wait_for_exit);
00208    return 0;
00209 }

dcop

Skip menu "dcop"
  • Main Page
  • Modules
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

dcop

Skip menu "dcop"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for dcop by doxygen 1.7.6.1
This website is maintained by Timothy Pearson.