author | mickeyl <mickeyl> | 2004-11-12 13:51:35 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2004-11-12 13:51:35 (UTC) |
commit | de558d6f0bc31f58ffaa894a0236f0d9cb5d73e0 (patch) (side-by-side diff) | |
tree | 55f7c2ec8c1e93983d41c962e557f3651db39b03 | |
parent | ee67d61c20b6840f3fb353e314d16a90c0438e7c (diff) | |
download | opie-de558d6f0bc31f58ffaa894a0236f0d9cb5d73e0.zip opie-de558d6f0bc31f58ffaa894a0236f0d9cb5d73e0.tar.gz opie-de558d6f0bc31f58ffaa894a0236f0d9cb5d73e0.tar.bz2 |
handle more signals and don't kill the process @ end
-rw-r--r-- | core/launcher/main.cpp | 92 |
1 files changed, 37 insertions, 55 deletions
diff --git a/core/launcher/main.cpp b/core/launcher/main.cpp index b119399..aa0dfdf 100644 --- a/core/launcher/main.cpp +++ b/core/launcher/main.cpp @@ -1,292 +1,274 @@ /********************************************************************** ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** ** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef QTOPIA_INTERNAL_FILEOPERATIONS #define QTOPIA_INTERNAL_FILEOPERATIONS #endif #ifdef QT_QWS_LOGIN #include "../login/qdmdialogimpl.h" #endif #include "calibrate.h" #include "server.h" #include "serverapp.h" #include "stabmon.h" #include "firstuse.h" /* OPIE */ #include <opie2/odebug.h> #include <opie2/odevice.h> #include <opie2/oglobal.h> #include <qtopia/network.h> #include <qtopia/alarmserver.h> using namespace Opie::Core; /* QT */ #include <qdir.h> #include <qmessagebox.h> #ifdef QWS #include <qwindowsystem_qws.h> #include <qtopia/qcopenvelope_qws.h> #endif #ifdef Q_WS_QWS #include <qkeyboard_qws.h> #endif /* STD */ #include <stdlib.h> #include <stdio.h> #include <signal.h> #ifndef Q_OS_WIN32 #include <unistd.h> #else #include <process.h> #endif static void cleanup() { QDir dir( "/tmp", "qcop-msg-*" ); QStringList stale = dir.entryList(); QStringList::Iterator it; for ( it = stale.begin(); it != stale.end(); ++it ) { - dir.remove( *it ); + dir.remove( *it ); } } static void refreshTimeZoneConfig() { /* ### FIXME timezone handling for qtopia */ } void initEnvironment() { #ifdef Q_OS_WIN32 // Config file requires HOME dir which uses QDir which needs the winver qt_init_winver(); #endif Config config("locale"); config.setGroup( "Location" ); QString tz = config.readEntry( "Timezone", getenv("TZ") ).stripWhiteSpace(); // if not timezone set, pick New York if (tz.isNull() || tz.isEmpty()) - tz = "America/New_York"; + tz = "America/New_York"; setenv( "TZ", tz, 1 ); config.writeEntry( "Timezone", tz); config.setGroup( "Language" ); QString lang = config.readEntry( "Language", getenv("LANG") ).stripWhiteSpace(); if( lang.isNull() || lang.isEmpty()) - lang = "en_US"; + lang = "en_US"; setenv( "LANG", lang, 1 ); config.writeEntry("Language", lang); config.write(); QString env(getenv("QWS_DISPLAY")); if (env.contains("Transformed")) { int rot; // transformed driver default rotation is controlled by the hardware. Config config("qpe"); config.setGroup( "Rotation" ); if ( ( rot = config.readNumEntry( "Rot", -1 ) ) == -1 ) rot = ODevice::inst ( )-> rotation ( ) * 90; setenv("QWS_DISPLAY", QString("Transformed:Rot%1:0").arg(rot), 1); QPEApplication::defaultRotation ( ); /* to ensure deforient matches reality */ } } static void initKeyboard() { Config config("qpe"); config.setGroup( "Keyboard" ); int ard = config.readNumEntry( "RepeatDelay" ); int arp = config.readNumEntry( "RepeatPeriod" ); if ( ard > 0 && arp > 0 ) - qwsSetKeyboardAutoRepeat( ard, arp ); + qwsSetKeyboardAutoRepeat( ard, arp ); QString layout = config.readEntry( "Layout", "us101" ); Server::setKeyboardLayout( layout ); } static bool firstUse() { bool needFirstUse = FALSE; if ( QWSServer::mouseHandler() && QWSServer::mouseHandler() ->inherits("QCalibratedMouseHandler") ) { if ( !QFile::exists( "/etc/pointercal" ) ) needFirstUse = TRUE; } { - Config config( "qpe" ); - config.setGroup( "Startup" ); - needFirstUse |= config.readBoolEntry( "FirstUse", TRUE ); + Config config( "qpe" ); + config.setGroup( "Startup" ); + needFirstUse |= config.readBoolEntry( "FirstUse", TRUE ); } if ( !needFirstUse ) - return FALSE; + return FALSE; FirstUse *fu = new FirstUse(); fu->exec(); bool rs = fu->restartNeeded(); delete fu; return rs; } int initApplication( int argc, char ** argv ) { cleanup(); initEnvironment(); //Don't flicker at startup: #ifdef QWS QWSServer::setDesktopBackground( QImage() ); #endif ServerApplication a( argc, argv, QApplication::GuiServer ); refreshTimeZoneConfig(); initKeyboard(); // Don't use first use under Windows if ( firstUse() ) { - a.restart(); - return 0; + a.restart(); + return 0; } ODevice::inst ( )-> setSoftSuspend ( true ); { QCopEnvelope e("QPE/System", "setBacklight(int)" ); - e << -3; // Forced on + e << -3; // Forced on } AlarmServer::initialize(); Server *s = new Server(); (void)new SysFileMonitor(s); #ifdef QWS Network::createServer(s); #endif s->show(); /* THE ARM rtc has problem holdings the time on reset */ if ( QDate::currentDate ( ). year ( ) < 2000 ) { if ( QMessageBox::information ( 0, ServerApplication::tr( "Information" ), ServerApplication::tr( "<p>The system date doesn't seem to be valid.\n(%1)</p><p>Do you want to correct the clock ?</p>" ). arg( TimeString::dateString ( QDate::currentDate ( ))), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) { QCopEnvelope e ( "QPE/Application/systemtime", "setDocument(QString)" ); e << QString ( ); } } int rv = a.exec(); odebug << "exiting..." << oendl; delete s; #ifndef Q_OS_MACX ODevice::inst()->setSoftSuspend( false ); #endif return rv; } static const char *pidfile_path = "/var/run/opie.pid"; void create_pidfile ( ) { - FILE *f; + FILE *f; - if (( f = ::fopen ( pidfile_path, "w" ))) { - ::fprintf ( f, "%d", getpid ( )); - ::fclose ( f ); - } + if (( f = ::fopen ( pidfile_path, "w" ))) { + ::fprintf ( f, "%d", getpid ( )); + ::fclose ( f ); + } } void remove_pidfile ( ) { - ::unlink ( pidfile_path ); + ::unlink ( pidfile_path ); } void handle_sigterm ( int /* sig */ ) { - if ( qApp ) - qApp-> quit ( ); + ::signal( SIGCHLD, SIG_IGN ); + ::signal( SIGSEGV, SIG_IGN ); + ::signal( SIGBUS, SIG_IGN ); + ::signal( SIGILL, SIG_IGN ); + ::signal( SIGTERM, SIG_IGN ); + ::signal ( SIGINT, SIG_IGN ); + if ( qApp ) qApp->quit(); } -#ifndef Q_OS_WIN32 int main( int argc, char ** argv ) { - - ::signal ( SIGCHLD, SIG_IGN ); - - ::signal ( SIGTERM, handle_sigterm ); + ::signal( SIGCHLD, SIG_IGN ); + ::signal( SIGSEGV, handle_sigterm ); + ::signal( SIGBUS, handle_sigterm ); + ::signal( SIGILL, handle_sigterm ); + ::signal( SIGTERM, handle_sigterm ); ::signal ( SIGINT, handle_sigterm ); + ::setsid(); + ::setpgid( 0, 0 ); - ::setsid ( ); - ::setpgid ( 0, 0 ); - - ::atexit ( remove_pidfile ); - create_pidfile ( ); + ::atexit( remove_pidfile ); + create_pidfile(); int retVal = initApplication( argc, argv ); // Have we been asked to restart? - if ( ServerApplication::doRestart ) { - for ( int fd = 3; fd < 100; fd++ ) - close( fd ); - - execl( (QPEApplication::qpeDir()+"bin/qpe").latin1(), "qpe", 0 ); - } - - // Kill them. Kill them all. - ::kill ( 0, SIGTERM ); - ::sleep ( 1 ); - ::kill ( 0, SIGKILL ); - - return retVal; -} -#else - -int main( int argc, char ** argv ) -{ - int retVal = initApplication( argc, argv ); - - if ( DesktopApplication::doRestart ) { - odebug << "Trying to restart" << oendl; - execl( (QPEApplication::qpeDir()+"bin\\qpe").latin1(), "qpe", 0 ); + if ( ServerApplication::doRestart ) + { + for ( int fd = 3; fd < 100; fd++ ) close( fd ); + execl( (QPEApplication::qpeDir()+"bin/qpe").latin1(), "qpe", 0 ); } return retVal; } - -#endif - |