summaryrefslogtreecommitdiff
path: root/core/opie-login/main.cpp
authorsandman <sandman>2002-10-14 00:59:28 (UTC)
committer sandman <sandman>2002-10-14 00:59:28 (UTC)
commit62c946c5a92ab11b5ad9495ff0bab158d38bce48 (patch) (side-by-side diff)
tree01375a50aace755e808eef3103d3c4395530b4f1 /core/opie-login/main.cpp
parent72c07a1db3bad19fa227fc6fb482afe517d18095 (diff)
downloadopie-62c946c5a92ab11b5ad9495ff0bab158d38bce48.zip
opie-62c946c5a92ab11b5ad9495ff0bab158d38bce48.tar.gz
opie-62c946c5a92ab11b5ad9495ff0bab158d38bce48.tar.bz2
- last login name is saved
- wait image should be displayed right now - the qApp object is destroyed before the launcher is started -- this should prevent some semaphore permission problems - added a (very basic) crash handler - added a simple "respawned too fast" detection in case of qt/e fb problems - if opie-login is started with -a <user> or --autologin <user> it doesn't prompt for a username/password - instead it loads qpe directly using the specified user account So even if you are not running multiuser, you should now start qpe with: opie-login --autologin=root
Diffstat (limited to 'core/opie-login/main.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/opie-login/main.cpp126
1 files changed, 112 insertions, 14 deletions
diff --git a/core/opie-login/main.cpp b/core/opie-login/main.cpp
index df9451d..91610af 100644
--- a/core/opie-login/main.cpp
+++ b/core/opie-login/main.cpp
@@ -1,12 +1,17 @@
+#define _GNU_SOURCE
+
+#include <sys/types.h>
+#include <time.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <syslog.h>
-#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
+#include <getopt.h>
+#include <string.h>
#include <qpe/qpeapplication.h>
#include <qpe/qcopenvelope_qws.h>
@@ -16,17 +21,24 @@
#include <opie/odevice.h>
#include <qwindowsystem_qws.h>
-#include <qfile.h>
+#include <qmessagebox.h>
+#include <qlabel.h>
+#include <qtimer.h>
+#include "loginapplication.h"
#include "loginwindowimpl.h"
#include "calibrate.h"
using namespace Opie;
int login_main ( int argc, char **argv );
-void sigusr1 ( int sig );
+void sigterm ( int sig );
void exit_closelog ( );
+static struct option long_options [] = {
+ { "autologin", 1, 0, 'a' },
+ { 0, 0, 0, 0 }
+};
int main ( int argc, char **argv )
@@ -35,6 +47,21 @@ int main ( int argc, char **argv )
::fprintf ( stderr, "%s can only be executed by root. (or chmod +s)", argv [0] );
return 1;
}
+ if ( ::getuid ( ) != 0 ) // qt doesn't really like SUID and
+ ::setuid ( 0 ); // messes up things like config files
+
+ char *autolog = 0;
+ int c;
+ while (( c = ::getopt_long ( argc, argv, "a:", long_options, 0 )) != -1 ) {
+ switch ( c ) {
+ case 'a':
+ autolog = optarg;
+ break;
+ default:
+ ::fprintf ( stderr, "Usage: %s [-a|--autologin=<user>]\n", argv [0] );
+ return 2;
+ }
+ }
// struct rlimit rl;
// ::getrlimit ( RLIMIT_NOFILE, &rl );
@@ -45,7 +72,7 @@ int main ( int argc, char **argv )
::setpgid ( 0, 0 );
::setsid ( );
- ::signal ( SIGUSR1, sigusr1 );
+ ::signal ( SIGTERM, sigterm );
::openlog ( "opie-login", LOG_CONS, LOG_AUTHPRIV );
::atexit ( exit_closelog );
@@ -54,27 +81,82 @@ int main ( int argc, char **argv )
pid_t child = ::fork ( );
if ( child < 0 ) {
- ::syslog ( LOG_ERR, "Could not fork process" );
+ ::syslog ( LOG_ERR, "Could not fork GUI process\n" );
break;
-
}
else if ( child > 0 ) {
int status = 0;
+ time_t started = ::time ( 0 );
while ( ::waitpid ( child, &status, 0 ) < 0 ) { }
+
+ if (( ::time ( 0 ) - started ) < 3 ) {
+ if ( autolog ) {
+ ::syslog ( LOG_ERR, "Respawning too fast -- disabling auto-login\n" );
+ autolog = 0;
+ }
+ else {
+ ::syslog ( LOG_ERR, "Respawning too fast -- going down\n" );
+ break;
+ }
+ }
+ int killedbysig = 0;
+
+ if ( WIFSIGNALED( status )) {
+ switch ( WTERMSIG( status )) {
+ case SIGINT :
+ case SIGTERM:
+ case SIGKILL:
+ break;
+
+ default :
+ killedbysig = WTERMSIG( status );
+ break;
+ }
+ }
+ if ( killedbysig ) { // qpe was killed by an uncaught signal
+ qApp = 0;
+
+ QWSServer::setDesktopBackground ( QImage ( ));
+ QApplication *app = new QApplication ( argc, argv, QApplication::GuiServer );
+ app-> setFont ( QFont ( "Helvetica", 10 ));
+ app-> setStyle ( new QPEStyle ( ));
+
+ const char *sig = ::strsignal ( killedbysig );
+ QLabel *l = new QLabel ( 0, "sig", Qt::WStyle_Customize | Qt::WStyle_NoBorder | Qt::WStyle_Tool );
+ l-> setText ( LoginWindowImpl::tr( "OPIE was terminated\nby an uncaught signal\n(%1)\n" ). arg ( sig ));
+ l-> setAlignment ( Qt::AlignCenter );
+ l-> move ( 0, 0 );
+ l-> resize ( app-> desktop ( )-> width ( ), app-> desktop ( )-> height ( ));
+ l-> show ( );
+ QTimer::singleShot ( 3000, app, SLOT( quit ( )));
+ app-> exec ( );
+ delete app;
+ qApp = 0;
+ }
}
else {
- ::exit ( login_main ( argc, argv ));
+ if ( autolog ) {
+ LoginApplication::setLoginAs ( autolog );
+
+ if ( LoginApplication::changeIdentity ( ))
+ ::exit ( LoginApplication::login ( ));
+ else
+ ::exit ( 0 );
+ }
+ else
+ ::exit ( login_main ( argc, argv ));
}
}
return 0;
}
-void sigusr1 ( int /*sig*/ )
+void sigterm ( int /*sig*/ )
{
::exit ( 0 );
}
+
void exit_closelog ( )
{
::closelog ( );
@@ -181,13 +263,14 @@ private:
+
int login_main ( int argc, char **argv )
{
QWSServer::setDesktopBackground( QImage() );
- QPEApplication app ( argc, argv, QApplication::GuiServer );
+ LoginApplication *app = new LoginApplication ( argc, argv );
- app. setFont ( QFont ( "Helvetica", 10 ));
- app. setStyle ( new QPEStyle ( ));
+ app-> setFont ( QFont ( "Helvetica", 10 ));
+ app-> setStyle ( new QPEStyle ( ));
ODevice::inst ( )-> setSoftSuspend ( true );
@@ -208,14 +291,29 @@ int login_main ( int argc, char **argv )
LoginWindowImpl *lw = new LoginWindowImpl ( );
- app. setMainWidget ( lw );
- lw-> setGeometry ( 0, 0, app. desktop ( )-> width ( ), app. desktop ( )-> height ( ));
+ app-> setMainWidget ( lw );
+ lw-> setGeometry ( 0, 0, app-> desktop ( )-> width ( ), app-> desktop ( )-> height ( ));
lw-> show ( );
- int rc = app. exec ( );
+ int rc = app-> exec ( );
ODevice::inst ( )-> setSoftSuspend ( false );
+ if ( app-> loginAs ( )) {
+ if ( app-> changeIdentity ( )) {
+ app-> login ( );
+
+ // if login succeeds, it never comes back
+
+ QMessageBox::critical ( 0, LoginWindowImpl::tr( "Failure" ), LoginWindowImpl::tr( "Could not start OPIE." ));
+ rc = 1;
+ }
+ else {
+ QMessageBox::critical ( 0, LoginWindowImpl::tr( "Failure" ), LoginWindowImpl::tr( "Could not switch to new user identity" ));
+ rc = 2;
+ }
+
+ }
return rc;
}