00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "config.h"
00021
00022 #include <unistd.h>
00023 #include <fcntl.h>
00024
00025 #include "tdeapplication.h"
00026 #include "tdelauncher.h"
00027 #include "tdecmdlineargs.h"
00028 #include "kcrash.h"
00029 #include "kdebug.h"
00030 #include <stdio.h>
00031 #include <stdlib.h>
00032 #include <signal.h>
00033 #include <tqcstring.h>
00034 #include <tdelocale.h>
00035
00036 #include "tdelauncher_cmds.h"
00037
00038 static void sig_handler(int sig_num)
00039 {
00040
00041 signal( SIGHUP, SIG_IGN);
00042 signal( SIGTERM, SIG_IGN);
00043 fprintf(stderr, "[tdelauncher] Exiting on signal %d\n", sig_num);
00044 TDELauncher::destruct(255);
00045 }
00046
00047 static TDECmdLineOptions options[] =
00048 {
00049 { "new-startup", "Internal", 0 },
00050 TDECmdLineLastOption
00051 };
00052
00053 extern "C" KDE_EXPORT int kdemain( int argc, char**argv )
00054 {
00055
00056 if (fcntl(LAUNCHER_FD, F_GETFD) == -1)
00057 {
00058 fprintf(stderr, "%s", i18n("[tdelauncher] This program is not supposed to be started manually.\n"
00059 "[tdelauncher] It is started automatically by tdeinit.\n").local8Bit().data());
00060 return 1;
00061 }
00062
00063 TQCString cname = TDEApplication::launcher();
00064 char *name = cname.data();
00065 TDECmdLineArgs::init(argc, argv, name, "TDELauncher", "A service launcher.",
00066 "v1.0");
00067
00068 TDELauncher::addCmdLineOptions();
00069 TDECmdLineArgs::addCmdLineOptions( options );
00070
00071
00072 putenv(strdup("SESSION_MANAGER="));
00073
00074
00075 TDELocale::setMainCatalogue("tdelibs");
00076
00077 TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs();
00078
00079 int maxTry = 3;
00080 while(true)
00081 {
00082 TQCString dcopName = TDEApplication::dcopClient()->registerAs(name, false);
00083 if (dcopName.isEmpty())
00084 {
00085 kdWarning() << "[tdelauncher] DCOP communication problem!" << endl;
00086 return 1;
00087 }
00088 if (dcopName == cname)
00089 break;
00090
00091 if (--maxTry == 0)
00092 {
00093 kdWarning() << "[tdelauncher] Another instance of tdelauncher is already running!" << endl;
00094 return 1;
00095 }
00096
00097
00098 kdWarning() << "[tdelauncher] Waiting for already running tdelauncher to exit." << endl;
00099 sleep(1);
00100
00101
00102 }
00103
00104 TDELauncher *launcher = new TDELauncher(LAUNCHER_FD, args->isSet("new-startup"));
00105 launcher->dcopClient()->setDefaultObject( name );
00106 launcher->dcopClient()->setDaemonMode( true );
00107
00108 TDECrash::setEmergencySaveFunction(sig_handler);
00109 signal( SIGHUP, sig_handler);
00110 signal( SIGPIPE, SIG_IGN);
00111 signal( SIGTERM, sig_handler);
00112
00113 launcher->exec();
00114 return 0;
00115 }
00116