|
|
@ -73,26 +73,56 @@ static KCmdLineOptions options[] =
|
|
|
|
{ "dontlock", I18N_NOOP("Only start screensaver"), 0 },
|
|
|
|
{ "dontlock", I18N_NOOP("Only start screensaver"), 0 },
|
|
|
|
{ "securedialog", I18N_NOOP("Launch the secure dialog"), 0 },
|
|
|
|
{ "securedialog", I18N_NOOP("Launch the secure dialog"), 0 },
|
|
|
|
{ "blank", I18N_NOOP("Only use the blank screensaver"), 0 },
|
|
|
|
{ "blank", I18N_NOOP("Only use the blank screensaver"), 0 },
|
|
|
|
|
|
|
|
{ "internal <pid>", I18N_NOOP("TDE internal command for background process loading"), 0 },
|
|
|
|
KCmdLineLastOption
|
|
|
|
KCmdLineLastOption
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void sigusr1_handler(int)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
signalled_forcelock = TRUE;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void sigusr2_handler(int)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
signalled_dontlock = TRUE;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void sigusr3_handler(int)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
signalled_securedialog = TRUE;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void sigusr4_handler(int)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
signalled_blank = TRUE;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void sigusr5_handler(int)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
signalled_run = TRUE;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
int main( int argc, char **argv )
|
|
|
|
int main( int argc, char **argv )
|
|
|
|
{
|
|
|
|
{
|
|
|
|
KLocale::setMainCatalogue("kdesktop");
|
|
|
|
KLocale::setMainCatalogue("kdesktop");
|
|
|
|
|
|
|
|
|
|
|
|
KCmdLineArgs::init( argc, argv, "kdesktop_lock", I18N_NOOP("KDesktop Locker"), I18N_NOOP("Session Locker for KDesktop"), "2.0" );
|
|
|
|
KCmdLineArgs::init( argc, argv, "kdesktop_lock", I18N_NOOP("KDesktop Locker"), I18N_NOOP("Session Locker for KDesktop"), "2.1" );
|
|
|
|
KCmdLineArgs::addCmdLineOptions( options );
|
|
|
|
KCmdLineArgs::addCmdLineOptions( options );
|
|
|
|
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
|
|
|
|
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
|
|
|
|
|
|
|
|
|
|
|
|
if (args->isSet( "forcelock" ))
|
|
|
|
|
|
|
|
trinity_desktop_lock_forced = TRUE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
putenv(strdup("SESSION_MANAGER="));
|
|
|
|
putenv(strdup("SESSION_MANAGER="));
|
|
|
|
|
|
|
|
|
|
|
|
KApplication::disableAutoDcopRegistration(); // not needed
|
|
|
|
KApplication::disableAutoDcopRegistration(); // not needed
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (1 == 1) {
|
|
|
|
|
|
|
|
signalled_forcelock = FALSE;
|
|
|
|
|
|
|
|
signalled_dontlock = FALSE;
|
|
|
|
|
|
|
|
signalled_securedialog = FALSE;
|
|
|
|
|
|
|
|
signalled_blank = FALSE;
|
|
|
|
|
|
|
|
signalled_run = FALSE;
|
|
|
|
|
|
|
|
|
|
|
|
int kdesktop_screen_number = 0;
|
|
|
|
int kdesktop_screen_number = 0;
|
|
|
|
int starting_screen = 0;
|
|
|
|
int starting_screen = 0;
|
|
|
|
|
|
|
|
|
|
|
@ -168,7 +198,61 @@ int main( int argc, char **argv )
|
|
|
|
trinity_desktop_lock_delay_screensaver_start = KDesktopSettings::delaySaverStart();
|
|
|
|
trinity_desktop_lock_delay_screensaver_start = KDesktopSettings::delaySaverStart();
|
|
|
|
trinity_desktop_lock_use_sak = KDesktopSettings::useTDESAK();
|
|
|
|
trinity_desktop_lock_use_sak = KDesktopSettings::useTDESAK();
|
|
|
|
|
|
|
|
|
|
|
|
LockProcess process(child, args->isSet( "blank" ));
|
|
|
|
if (args->isSet( "internal" )) {
|
|
|
|
|
|
|
|
while (signalled_run == FALSE) {
|
|
|
|
|
|
|
|
sigset_t new_mask;
|
|
|
|
|
|
|
|
struct sigaction act;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
in_internal_mode = TRUE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// handle SIGUSR1
|
|
|
|
|
|
|
|
act.sa_handler= sigusr1_handler;
|
|
|
|
|
|
|
|
sigemptyset(&(act.sa_mask));
|
|
|
|
|
|
|
|
sigaddset(&(act.sa_mask), SIGUSR1);
|
|
|
|
|
|
|
|
act.sa_flags = 0;
|
|
|
|
|
|
|
|
sigaction(SIGUSR1, &act, 0L);
|
|
|
|
|
|
|
|
// handle SIGUSR2
|
|
|
|
|
|
|
|
act.sa_handler= sigusr2_handler;
|
|
|
|
|
|
|
|
sigemptyset(&(act.sa_mask));
|
|
|
|
|
|
|
|
sigaddset(&(act.sa_mask), SIGUSR2);
|
|
|
|
|
|
|
|
act.sa_flags = 0;
|
|
|
|
|
|
|
|
sigaction(SIGUSR2, &act, 0L);
|
|
|
|
|
|
|
|
// handle SIGWINCH (an ersatz SIGUSR3)
|
|
|
|
|
|
|
|
act.sa_handler= sigusr3_handler;
|
|
|
|
|
|
|
|
sigemptyset(&(act.sa_mask));
|
|
|
|
|
|
|
|
sigaddset(&(act.sa_mask), SIGWINCH);
|
|
|
|
|
|
|
|
act.sa_flags = 0;
|
|
|
|
|
|
|
|
sigaction(SIGWINCH, &act, 0L);
|
|
|
|
|
|
|
|
// handle SIGTTIN (an ersatz SIGUSR4)
|
|
|
|
|
|
|
|
act.sa_handler= sigusr4_handler;
|
|
|
|
|
|
|
|
sigemptyset(&(act.sa_mask));
|
|
|
|
|
|
|
|
sigaddset(&(act.sa_mask), SIGTTIN);
|
|
|
|
|
|
|
|
act.sa_flags = 0;
|
|
|
|
|
|
|
|
sigaction(SIGTTIN, &act, 0L);
|
|
|
|
|
|
|
|
// handle SIGTTOU (an ersatz SIGUSR5)
|
|
|
|
|
|
|
|
act.sa_handler= sigusr5_handler;
|
|
|
|
|
|
|
|
sigemptyset(&(act.sa_mask));
|
|
|
|
|
|
|
|
sigaddset(&(act.sa_mask), SIGTTOU);
|
|
|
|
|
|
|
|
act.sa_flags = 0;
|
|
|
|
|
|
|
|
sigaction(SIGTTOU, &act, 0L);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// initialize the signal masks
|
|
|
|
|
|
|
|
sigfillset(&new_mask);
|
|
|
|
|
|
|
|
sigdelset(&new_mask,SIGUSR1);
|
|
|
|
|
|
|
|
sigdelset(&new_mask,SIGUSR2);
|
|
|
|
|
|
|
|
sigdelset(&new_mask,SIGWINCH);
|
|
|
|
|
|
|
|
sigdelset(&new_mask,SIGTTIN);
|
|
|
|
|
|
|
|
sigdelset(&new_mask,SIGTTOU);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// wait for SIGUSR1, SIGUSR2, SIGWINCH, SIGTTIN, or SIGTTOU
|
|
|
|
|
|
|
|
sigsuspend(&new_mask);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (args->isSet( "forcelock" ) || (signalled_forcelock == TRUE))
|
|
|
|
|
|
|
|
trinity_desktop_lock_forced = TRUE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LockProcess process(child, (args->isSet( "blank" ) || (signalled_blank == TRUE)));
|
|
|
|
if (!child)
|
|
|
|
if (!child)
|
|
|
|
process.setChildren(child_sockets);
|
|
|
|
process.setChildren(child_sockets);
|
|
|
|
else
|
|
|
|
else
|
|
|
@ -176,21 +260,21 @@ int main( int argc, char **argv )
|
|
|
|
|
|
|
|
|
|
|
|
bool rt;
|
|
|
|
bool rt;
|
|
|
|
bool sig = false;
|
|
|
|
bool sig = false;
|
|
|
|
if( !child && args->isSet( "forcelock" ))
|
|
|
|
if( !child && (args->isSet( "forcelock" ) || (signalled_forcelock == TRUE)))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
rt = process.lock();
|
|
|
|
rt = process.lock();
|
|
|
|
sig = true;
|
|
|
|
sig = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if( child || args->isSet( "dontlock" )) {
|
|
|
|
else if( child || (args->isSet( "dontlock" ) || (signalled_dontlock == TRUE))) {
|
|
|
|
rt = process.dontLock();
|
|
|
|
rt = process.dontLock();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if( child || args->isSet( "securedialog" )) {
|
|
|
|
else if( child || (args->isSet( "securedialog" ) || (signalled_securedialog == TRUE))) {
|
|
|
|
int retcode = tde_sak_verify_calling_process();
|
|
|
|
int retcode = tde_sak_verify_calling_process();
|
|
|
|
if (retcode == 0) {
|
|
|
|
if (retcode == 0) {
|
|
|
|
rt = process.runSecureDialog();
|
|
|
|
rt = process.runSecureDialog();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
return 0;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
else {
|
|
|
@ -206,7 +290,24 @@ int main( int argc, char **argv )
|
|
|
|
ref.send( "saverLockReady" );
|
|
|
|
ref.send( "saverLockReady" );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (in_internal_mode == FALSE) {
|
|
|
|
return app.exec();
|
|
|
|
return app.exec();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
pid_t kdesktop_pid = atoi(args->getOption( "internal" ));
|
|
|
|
|
|
|
|
app.exec();
|
|
|
|
|
|
|
|
if (kill(kdesktop_pid, SIGUSR1) < 0) {
|
|
|
|
|
|
|
|
// The controlling kdesktop process probably died. Commit suicide...
|
|
|
|
|
|
|
|
return 12;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// FIXME
|
|
|
|
|
|
|
|
// We should not have to return (restart) at all,
|
|
|
|
|
|
|
|
// but it seems that some X11 connections are left active,
|
|
|
|
|
|
|
|
// preventing the lock process from restarting properly in the while() loop above.
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#include "main.moc"
|
|
|
|
#include "main.moc"
|
|
|
|