summaryrefslogtreecommitdiff
authormickeyl <mickeyl>2004-11-12 13:51:35 (UTC)
committer mickeyl <mickeyl>2004-11-12 13:51:35 (UTC)
commitde558d6f0bc31f58ffaa894a0236f0d9cb5d73e0 (patch) (side-by-side diff)
tree55f7c2ec8c1e93983d41c962e557f3651db39b03
parentee67d61c20b6840f3fb353e314d16a90c0438e7c (diff)
downloadopie-de558d6f0bc31f58ffaa894a0236f0d9cb5d73e0.zip
opie-de558d6f0bc31f58ffaa894a0236f0d9cb5d73e0.tar.gz
opie-de558d6f0bc31f58ffaa894a0236f0d9cb5d73e0.tar.bz2
handle more signals and don't kill the process @ end
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/launcher/main.cpp44
1 files changed, 13 insertions, 31 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
@@ -49,244 +49,226 @@ using namespace Opie::Core;
#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 );
}
}
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";
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";
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 );
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 );
}
if ( !needFirstUse )
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;
}
ODevice::inst ( )-> setSoftSuspend ( true );
{
QCopEnvelope e("QPE/System", "setBacklight(int)" );
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;
if (( f = ::fopen ( pidfile_path, "w" ))) {
::fprintf ( f, "%d", getpid ( ));
::fclose ( f );
}
}
void remove_pidfile ( )
{
::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( SIGSEGV, handle_sigterm );
+ ::signal( SIGBUS, handle_sigterm );
+ ::signal( SIGILL, handle_sigterm );
::signal ( SIGTERM, handle_sigterm );
::signal ( SIGINT, handle_sigterm );
-
::setsid ( );
::setpgid ( 0, 0 );
::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 )
+ if ( ServerApplication::doRestart )
{
- int retVal = initApplication( argc, argv );
-
- if ( DesktopApplication::doRestart ) {
- odebug << "Trying to restart" << oendl;
- execl( (QPEApplication::qpeDir()+"bin\\qpe").latin1(), "qpe", 0 );
+ for ( int fd = 3; fd < 100; fd++ ) close( fd );
+ execl( (QPEApplication::qpeDir()+"bin/qpe").latin1(), "qpe", 0 );
}
return retVal;
}
-
-#endif
-