summaryrefslogtreecommitdiff
authorkergoth <kergoth>2003-03-14 19:22:43 (UTC)
committer kergoth <kergoth>2003-03-14 19:22:43 (UTC)
commit4f483f13e3c624a0ce6161e6ddd6923b4d101f0e (patch) (unidiff)
tree40598ac7ae56246fd2875967345f6eccb13339b7
parent52c72efc3bcc6b57c6960b5da3393b57182b5ee6 (diff)
downloadopie-4f483f13e3c624a0ce6161e6ddd6923b4d101f0e.zip
opie-4f483f13e3c624a0ce6161e6ddd6923b4d101f0e.tar.gz
opie-4f483f13e3c624a0ce6161e6ddd6923b4d101f0e.tar.bz2
Two bugs fixed:
1) We werent checking for failure on execlp() of shutdown 2) We assumed that /sbin was in the PATH, as otherwise one cannot execute shutdown. This is a flawed assumption, particularly in the case of running Opie as a nonroot user. In the case of OZ 3.1rc3.1, /etc/profile no longer puts the sbin dirs in the PATH (it never should have in the first place), and opie doesnt source $HOME/.profile in its startup script, which resulted in the shutdown app failing to reboot or shutdown. Fixed by using execle rather than execlp, and specifying /sbin and /usr/sbin as the executed path for shutdown.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/desktop.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/core/launcher/desktop.cpp b/core/launcher/desktop.cpp
index 03a23dc..4c239a6 100644
--- a/core/launcher/desktop.cpp
+++ b/core/launcher/desktop.cpp
@@ -1,68 +1,70 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#include <syslog.h>
22
21#include "desktop.h" 23#include "desktop.h"
22#include "info.h" 24#include "info.h"
23#include "launcher.h" 25#include "launcher.h"
24#include "qcopbridge.h" 26#include "qcopbridge.h"
25#include "shutdownimpl.h" 27#include "shutdownimpl.h"
26#include "startmenu.h" 28#include "startmenu.h"
27#include "taskbar.h" 29#include "taskbar.h"
28#include "transferserver.h" 30#include "transferserver.h"
29#include "irserver.h" 31#include "irserver.h"
30#include "packageslave.h" 32#include "packageslave.h"
31#include "screensaver.h" 33#include "screensaver.h"
32 34
33#include <qpe/applnk.h> 35#include <qpe/applnk.h>
34#include <qpe/mimetype.h> 36#include <qpe/mimetype.h>
35#include <qpe/password.h> 37#include <qpe/password.h>
36#include <qpe/config.h> 38#include <qpe/config.h>
37#include <qpe/power.h> 39#include <qpe/power.h>
38#include <qpe/timeconversion.h> 40#include <qpe/timeconversion.h>
39#include <qpe/qcopenvelope_qws.h> 41#include <qpe/qcopenvelope_qws.h>
40#include <qpe/network.h> 42#include <qpe/network.h>
41#include <qpe/global.h> 43#include <qpe/global.h>
42 44
43#if defined( QT_QWS_SHARP ) || defined( QT_QWS_IPAQ ) 45#if defined( QT_QWS_SHARP ) || defined( QT_QWS_IPAQ )
44#include <qpe/custom.h> 46#include <qpe/custom.h>
45#endif 47#endif
46 48
47#include <opie/odevice.h> 49#include <opie/odevice.h>
48 50
49#include <qgfx_qws.h> 51#include <qgfx_qws.h>
50#include <qmainwindow.h> 52#include <qmainwindow.h>
51#include <qmessagebox.h> 53#include <qmessagebox.h>
52#include <qtimer.h> 54#include <qtimer.h>
53#include <qwindowsystem_qws.h> 55#include <qwindowsystem_qws.h>
54 56
55#include <qvaluelist.h> 57#include <qvaluelist.h>
56 58
57#include <stdlib.h> 59#include <stdlib.h>
58#include <unistd.h> 60#include <unistd.h>
59#include <fcntl.h> 61#include <fcntl.h>
60 62
61 63
62using namespace Opie; 64using namespace Opie;
63 65
64class QCopKeyRegister 66class QCopKeyRegister
65{ 67{
66public: 68public:
67 QCopKeyRegister() : keyCode( 0 ) 69 QCopKeyRegister() : keyCode( 0 )
68 { } 70 { }
@@ -693,102 +695,110 @@ void Desktop::togglePower()
693 695
694 excllock = false; 696 excllock = false;
695} 697}
696 698
697void Desktop::toggleLight() 699void Desktop::toggleLight()
698{ 700{
699 QCopEnvelope e( "QPE/System", "setBacklight(int)" ); 701 QCopEnvelope e( "QPE/System", "setBacklight(int)" );
700 e << -2; // toggle 702 e << -2; // toggle
701} 703}
702 704
703void Desktop::toggleSymbolInput() 705void Desktop::toggleSymbolInput()
704{ 706{
705 tb->toggleSymbolInput(); 707 tb->toggleSymbolInput();
706} 708}
707 709
708void Desktop::toggleNumLockState() 710void Desktop::toggleNumLockState()
709{ 711{
710 tb->toggleNumLockState(); 712 tb->toggleNumLockState();
711} 713}
712 714
713void Desktop::toggleCapsLockState() 715void Desktop::toggleCapsLockState()
714{ 716{
715 tb->toggleCapsLockState(); 717 tb->toggleCapsLockState();
716} 718}
717 719
718void Desktop::styleChange( QStyle &s ) 720void Desktop::styleChange( QStyle &s )
719{ 721{
720 QWidget::styleChange( s ); 722 QWidget::styleChange( s );
721 int displayw = qApp->desktop() ->width(); 723 int displayw = qApp->desktop() ->width();
722 int displayh = qApp->desktop() ->height(); 724 int displayh = qApp->desktop() ->height();
723 725
724 QSize sz = tb->sizeHint(); 726 QSize sz = tb->sizeHint();
725 727
726 tb->setGeometry( 0, displayh - sz.height(), displayw, sz.height() ); 728 tb->setGeometry( 0, displayh - sz.height(), displayw, sz.height() );
727} 729}
728 730
729void DesktopApplication::shutdown() 731void DesktopApplication::shutdown()
730{ 732{
731 if ( type() != GuiServer ) 733 if ( type() != GuiServer )
732 return ; 734 return ;
733 ShutdownImpl *sd = new ShutdownImpl( 0, 0, WDestructiveClose ); 735 ShutdownImpl *sd = new ShutdownImpl( 0, 0, WDestructiveClose );
734 connect( sd, SIGNAL( shutdown( ShutdownImpl::Type ) ), 736 connect( sd, SIGNAL( shutdown( ShutdownImpl::Type ) ),
735 this, SLOT( shutdown( ShutdownImpl::Type ) ) ); 737 this, SLOT( shutdown( ShutdownImpl::Type ) ) );
736 sd->showMaximized(); 738 sd->showMaximized();
737} 739}
738 740
739void DesktopApplication::shutdown( ShutdownImpl::Type t ) 741void DesktopApplication::shutdown( ShutdownImpl::Type t )
740{ 742{
743
744 char *opt = 0;
745
741 switch ( t ) { 746 switch ( t ) {
742 case ShutdownImpl::ShutdownSystem: 747 case ShutdownImpl::ShutdownSystem:
743 execlp( "shutdown", "shutdown", "-h", "now", ( void* ) 0 ); 748 opt = "-h";
744 break; 749 // fall through
745 case ShutdownImpl::RebootSystem: 750 case ShutdownImpl::RebootSystem:
746 execlp( "shutdown", "shutdown", "-r", "now", ( void* ) 0 ); 751 if ( opt == 0 )
752 opt = "-r";
753
754 if ( execle( "shutdown", "shutdown", opt, "now", ( void* ) 0, "/sbin", "/usr/sbin", ( void* ) 0 ) < 0 )
755 ::syslog ( LOG_ERR, "Erroring execing shutdown\n" );
756
747 break; 757 break;
748 case ShutdownImpl::RestartDesktop: 758 case ShutdownImpl::RestartDesktop:
749 restart(); 759 restart();
750 break; 760 break;
751 case ShutdownImpl::TerminateDesktop: 761 case ShutdownImpl::TerminateDesktop:
752 prepareForTermination( FALSE ); 762 prepareForTermination( FALSE );
753 763
754 // This is a workaround for a Qt bug 764 // This is a workaround for a Qt bug
755 // clipboard applet has to stop its poll timer, or Qt/E 765 // clipboard applet has to stop its poll timer, or Qt/E
756 // will hang on quit() right before it emits aboutToQuit() 766 // will hang on quit() right before it emits aboutToQuit()
757 emit aboutToQuit ( ); 767 emit aboutToQuit ( );
758 768
759 quit(); 769 quit();
760 break; 770 break;
761 } 771 }
762} 772}
763 773
764void DesktopApplication::restart() 774void DesktopApplication::restart()
765{ 775{
766 prepareForTermination( TRUE ); 776 prepareForTermination( TRUE );
767 777
768#ifdef Q_WS_QWS 778#ifdef Q_WS_QWS
769 779
770 for ( int fd = 3; fd < 100; fd++ ) 780 for ( int fd = 3; fd < 100; fd++ )
771 close( fd ); 781 close( fd );
772#if defined(QT_DEMO_SINGLE_FLOPPY) 782#if defined(QT_DEMO_SINGLE_FLOPPY)
773 783
774 execl( "/sbin/init", "qpe", 0 ); 784 execl( "/sbin/init", "qpe", 0 );
775#elif defined(QT_QWS_CASSIOPEIA) 785#elif defined(QT_QWS_CASSIOPEIA)
776 786
777 execl( "/bin/sh", "sh", 0 ); 787 execl( "/bin/sh", "sh", 0 );
778#else 788#else
779 789
780 execl( ( qpeDir() + "/bin/qpe" ).latin1(), "qpe", 0 ); 790 execl( ( qpeDir() + "/bin/qpe" ).latin1(), "qpe", 0 );
781#endif 791#endif
782 792
783 exit( 1 ); 793 exit( 1 );
784#endif 794#endif
785} 795}
786 796
787void Desktop::startTransferServer() 797void Desktop::startTransferServer()
788{ 798{
789 // start qcop bridge server 799 // start qcop bridge server
790 qcopBridge = new QCopBridge( 4243 ); 800 qcopBridge = new QCopBridge( 4243 );
791 if ( !qcopBridge->ok() ) { 801 if ( !qcopBridge->ok() ) {
792 delete qcopBridge; 802 delete qcopBridge;
793 qcopBridge = 0; 803 qcopBridge = 0;
794 } 804 }