author | llornkcor <llornkcor> | 2005-08-04 07:22:40 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2005-08-04 07:22:40 (UTC) |
commit | 77825e5455872ef0c6def793b38bc767a3838bc0 (patch) (side-by-side diff) | |
tree | adff22adfee3d6a17dd9e0a76ccc51f2a2a20a1f | |
parent | 32743ebb00d374ad18afbed69ab3e94b03699a57 (diff) | |
download | opie-77825e5455872ef0c6def793b38bc767a3838bc0.zip opie-77825e5455872ef0c6def793b38bc767a3838bc0.tar.gz opie-77825e5455872ef0c6def793b38bc767a3838bc0.tar.bz2 |
apply patch in # 0001662, fixes build with uclibc
-rw-r--r-- | core/opie-login/main.cpp | 5 | ||||
-rw-r--r-- | noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp | 4 | ||||
-rw-r--r-- | noncore/settings/sysinfo/benchmarkinfo.cpp | 2 |
3 files changed, 9 insertions, 2 deletions
diff --git a/core/opie-login/main.cpp b/core/opie-login/main.cpp index 554efd3..3f1077c 100644 --- a/core/opie-login/main.cpp +++ b/core/opie-login/main.cpp @@ -26,258 +26,261 @@ */ #include "loginapplication.h" #include "loginwindowimpl.h" #include "calibrate.h" /* OPIE */ #include <opie2/odevice.h> #include <qpe/qpestyle.h> #include <qpe/power.h> #include <qpe/config.h> /* QT */ #include <qwindowsystem_qws.h> #include <qmessagebox.h> #include <qlabel.h> #include <qtimer.h> #include <qfile.h> /* STD */ #include <sys/types.h> #include <time.h> #include <sys/time.h> #include <sys/resource.h> #include <unistd.h> #include <syslog.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <getopt.h> #include <string.h> using namespace Opie::Core; int login_main ( int argc, char **argv, pid_t ppid ); void sigterm ( int sig ); void sigint ( int sig ); void exit_closelog ( ); int main ( int argc, char **argv ) { int userExited = 0; pid_t ppid = ::getpid ( ); if ( ::geteuid ( ) != 0 ) { ::fprintf ( stderr, "%s can only be executed by root. (or chmod +s)\n", argv [0] ); return 1; } if ( ::getuid ( ) != 0 ) // qt doesn't really like SUID and ::setuid ( 0 ); // messes up things like config files // struct rlimit rl; // ::getrlimit ( RLIMIT_NOFILE, &rl ); // for ( unsigned int i = 0; i < rl. rlim_cur; i++ ) // ::close ( i ); ::setpgid ( 0, 0 ); ::setsid ( ); ::signal ( SIGTERM, sigterm ); ::signal ( SIGINT, sigterm ); ::openlog ( "opie-login", LOG_CONS, LOG_AUTHPRIV ); ::atexit ( exit_closelog ); const char* autolog = 0; Config c( "opie-login" ); c.setGroup( "autologin" ); QString entry = c.readEntry( "user", "" ); if ( !entry.isEmpty() ) autolog = ::strdup( (const char*) entry ); while ( true ) { pid_t child = ::fork ( ); if ( child < 0 ) { ::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 ) { } LoginApplication::logout ( ); 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; userExited=0; if (WIFEXITED(status)!=0 ) { if (WEXITSTATUS(status)==137) { userExited=1; } } if ( WIFSIGNALED( status )) { switch ( WTERMSIG( status )) { case SIGTERM: case SIGINT : case SIGKILL: break; default : killedbysig = WTERMSIG( status ); break; } } if ( killedbysig ) { // qpe was killed by an uncaught signal qApp = 0; ::syslog ( LOG_ERR, "Opie was killed by a signal #%d", killedbysig ); 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 ); +#ifndef __UCLIBC__ const char *sig = ::sys_siglist[killedbysig]; +#else + const char *sig = ::strsignal ( killedbysig ); +#endif 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 { if ( !autolog ) { QString confFile=QPEApplication::qpeDir() + "etc/opie-login.conf"; Config cfg ( confFile, Config::File ); cfg. setGroup ( "General" ); QString user = cfg. readEntry ( "AutoLogin" ); if ( !user. isEmpty ( )) autolog = ::strdup ( user. latin1 ( )); } if ( autolog && !userExited ) { QWSServer::setDesktopBackground( QImage() ); ODevice::inst()->setDisplayStatus( true ); LoginApplication *app = new LoginApplication ( argc, argv, ppid ); LoginApplication::setLoginAs( autolog ); if ( LoginApplication::changeIdentity ( )) ::exit ( LoginApplication::login ( )); else ::exit ( 0 ); } else { ::exit ( login_main ( argc, argv, ppid )); } } } return 0; } void sigterm ( int /*sig*/ ) { ::exit ( 0 ); } void exit_closelog ( ) { ::closelog ( ); } class LoginScreenSaver : public QWSScreenSaver { public: LoginScreenSaver ( ) { m_lcd_status = true; m_backlight_bright = -1; m_backlight_forcedoff = false; // Make sure the LCD is in fact on, (if opie was killed while the LCD is off it would still be off) ODevice::inst ( )-> setDisplayStatus ( true ); } void restore() { if ( !m_lcd_status ) // We must have turned it off ODevice::inst ( ) -> setDisplayStatus ( true ); setBacklight ( -3 ); } bool save( int level ) { switch ( level ) { case 0: if ( backlight() > 1 ) setBacklight( 1 ); // lowest non-off return true; break; case 1: setBacklight( 0 ); // off return true; break; case 2: // We're going to suspend the whole machine if ( PowerStatusManager::readStatus().acStatus() != PowerStatus::Online ) { QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE ); return true; } break; } return false; } private: public: void setIntervals( int i1 = 30, int i2 = 20, int i3 = 60 ) { int v [4]; v [ 0 ] = QMAX( 1000 * i1, 100 ); v [ 1 ] = QMAX( 1000 * i2, 100 ); v [ 2 ] = QMAX( 1000 * i3, 100 ); v [ 3 ] = 0; if ( !i1 && !i2 && !i3 ) QWSServer::setScreenSaverInterval ( 0 ); else QWSServer::setScreenSaverIntervals ( v ); } int backlight ( ) { if ( m_backlight_bright == -1 ) m_backlight_bright = 255; return m_backlight_bright; } void setBacklight ( int bright ) { if ( bright == -3 ) { // Forced on diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp b/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp index 09605bd..ff06551 100644 --- a/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp +++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp @@ -1,130 +1,134 @@ #include "ProcessInvoker.h" +#ifndef PIPE_BUF // uClibc or similar +#include <linux/limits.h> +#endif + static ProcessInvoker* g_this; /* ------------------------------------------------------------------------ */ /* static functions */ /* ------------------------------------------------------------------------ */ static Sigfunc* setSignalHandler(int signo, Sigfunc* handler) { struct sigaction act,oact; act.sa_handler = handler; ::sigemptyset(&act.sa_mask); act.sa_flags = 0; #ifdef SA_RESTART act.sa_flags |= SA_RESTART; #endif if(::sigaction(signo, &act, &oact) < 0){ return(NULL); } return(oact.sa_handler); } static void childHandler(int /*signo*/) { pid_t pid; int status; while((pid = ::waitpid(-1, &status, WNOHANG)) > 0){ if(pid == g_this->m_child){ g_this->notifyFinish(status); } } } /* ------------------------------------------------------------------------ */ /* ProcessInvoker Class : parent process */ /* ------------------------------------------------------------------------ */ ProcessInvoker::ProcessInvoker() { g_this = this; m_isRunning = false; m_child = 0; m_defChildHandler = SIG_DFL; m_pTimer = new QTimer(this); m_stdfd[0] = m_stdfd[1] = -1; m_errfd[0] = m_errfd[1] = -1; connect(m_pTimer, SIGNAL(timeout()), this, SLOT(readOutputs())); } ProcessInvoker::~ProcessInvoker() { qDebug("ProcessInvoker::~ProcessInvoker()"); } bool ProcessInvoker::openPipe() { if(m_stdfd[0] >= 0) closePipe(m_stdfd, 0); if(m_stdfd[1] >= 0) closePipe(m_stdfd, 1); if(::pipe(m_stdfd) < 0){ return(false); } if(m_errfd[0] >= 0) closePipe(m_errfd, 0); if(m_errfd[1] >= 0) closePipe(m_errfd, 1); if(::pipe(m_errfd) < 0){ closePipe(m_stdfd); return(false); } m_maxfdp1 = m_stdfd[0]; if(m_errfd[0] > m_maxfdp1){ m_maxfdp1 = m_errfd[0]; } m_maxfdp1++; return(true); } void ProcessInvoker::closePipe(int fd[], int n) { if(fd == NULL){ closePipe(m_stdfd, n); closePipe(m_errfd, n); } else { if(n != 1 && fd[0] >= 0){ ::close(fd[0]); fd[0] = -1; } if(n != 0 && fd[1] >= 0){ ::close(fd[1]); fd[1] = -1; } } } void ProcessInvoker::setRunning(int pid) { m_child = pid; m_isRunning = true; } bool ProcessInvoker::run(const QString& args) { //setArguments(KHUtil::parseArgs(args)); setArguments(StringParser::split(' ', args)); return(run()); } bool ProcessInvoker::run() { if(m_isRunning){ return(false); } m_isRunning = true; if(m_arguments.isEmpty()){ m_isRunning = false; return(false); } if(m_arguments[0][0] != '/'){ m_isRunning = false; return(false); } for(QStringList::Iterator it=m_arguments.begin(); it!=m_arguments.end(); ++it){ qDebug("arguments[%s]", (*it).ascii()); } /* open pipe */ if(openPipe() == false){ m_isRunning = false; return(false); diff --git a/noncore/settings/sysinfo/benchmarkinfo.cpp b/noncore/settings/sysinfo/benchmarkinfo.cpp index ac6e1fa..8de9aa1 100644 --- a/noncore/settings/sysinfo/benchmarkinfo.cpp +++ b/noncore/settings/sysinfo/benchmarkinfo.cpp @@ -1,181 +1,181 @@ /********************************************************************** ** BenchmarkInfo ** ** A benchmark widget for Qt/Embedded ** ** Copyright (C) 2004 Michael Lauer <mickey@vanille.de> ** Inspired by ZBench (C) 2002 Satoshi <af230533@im07.alpha-net.ne.jp> ** ** 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. ** **********************************************************************/ #include "benchmarkinfo.h" /* OPIE */ #include <opie2/odebug.h> #include <opie2/ostorageinfo.h> #include <opie2/olistview.h> #include <opie2/oresource.h> #include <qpe/qpeapplication.h> #include <qpe/qcopenvelope_qws.h> #include <qpe/qpedecoration_qws.h> #include <qpe/config.h> using namespace Opie::Core; using namespace Opie::Ui; /* QT */ #include <qclipboard.h> #include <qcolor.h> #include <qcombobox.h> #include <qdirectpainter_qws.h> #include <qfile.h> #include <qtextstream.h> #include <qfiledialog.h> #include <qlabel.h> #include <qlayout.h> #include <qpainter.h> #include <qpushbutton.h> #include <qtimer.h> #include <qwhatsthis.h> /* STD */ #include <time.h> #include <stdio.h> #include <stdlib.h> #include <math.h> -#if defined (__GNUC__) && (__GNUC__ < 3) +#if (defined (__GNUC__) && (__GNUC__ < 3)) || defined(__UCLIBC__) #define round qRound #endif extern "C" { void BenchFFT( void ); double dhry_main( int ); } #define DHRYSTONE_RUNS 20000000 #define TEST_DURATION 3 //=========================================================================== class BenchmarkPaintWidget : public QWidget { public: BenchmarkPaintWidget() : QWidget( 0, "Benchmark Paint Widget", WStyle_Customize|WStyle_StaysOnTop|WPaintUnclipped|WPaintClever ) { resize( QApplication::desktop()->size() ); show(); p.begin( this ); }; ~BenchmarkPaintWidget() { p.end(); hide(); }; QPainter p; }; //=========================================================================== BenchmarkInfo::BenchmarkInfo( QWidget *parent, const char *name, int wFlags ) : QWidget( parent, name, wFlags ) { setMinimumSize( 200, 150 ); QVBoxLayout* vb = new QVBoxLayout( this ); vb->setSpacing( 4 ); vb->setMargin( 4 ); tests = new OListView( this ); QWhatsThis::add( tests->viewport(), tr( "This area shows the available tests, the results for which the tests " "have been performed, and comparison values for one selected device. " "Use the checkboxes to define which tests you want to perform." ) ); tests->setMargin( 0 ); tests->addColumn( tr( "Tests" ) ); tests->addColumn( tr( "Results" ) ); tests->addColumn( tr( "Comparison" ) ); tests->setShowSortIndicator( true ); test_alu = new OCheckListItem( tests, tr( "1. Integer Arithmetic " ), OCheckListItem::CheckBox ); test_fpu = new OCheckListItem( tests, tr( "2. Floating Point Unit " ), OCheckListItem::CheckBox ); test_txt = new OCheckListItem( tests, tr( "3. Text Rendering " ), OCheckListItem::CheckBox ); test_gfx = new OCheckListItem( tests, tr( "4. Gfx Rendering " ), OCheckListItem::CheckBox ); test_ram = new OCheckListItem( tests, tr( "5. RAM Performance " ), OCheckListItem::CheckBox ); #ifndef QT_QWS_RAMSES test_sd = new OCheckListItem( tests, tr( "6. SD Card Performance " ), OCheckListItem::CheckBox ); test_cf = new OCheckListItem( tests, tr( "7. CF Card Performance " ), OCheckListItem::CheckBox ); #endif test_alu->setText( 1, "n/a" ); test_fpu->setText( 1, "n/a" ); test_txt->setText( 1, "n/a" ); test_gfx->setText( 1, "n/a" ); test_ram->setText( 1, "n/a" ); #ifndef QT_QWS_RAMSES test_sd->setText( 1, "n/a" ); test_cf->setText( 1, "n/a" ); #endif test_alu->setText( 2, "n/a" ); test_fpu->setText( 2, "n/a" ); test_txt->setText( 2, "n/a" ); test_gfx->setText( 2, "n/a" ); test_ram->setText( 2, "n/a" ); #ifndef QT_QWS_RAMSES test_sd->setText( 2, "n/a" ); test_cf->setText( 2, "n/a" ); #endif startButton = new QPushButton( tr( "&Start Tests!" ), this ); QWhatsThis::add( startButton, tr( "Click here to perform the selected tests." ) ); connect( startButton, SIGNAL( clicked() ), this, SLOT( run() ) ); vb->addWidget( tests, 2 ); QHBoxLayout* hb = new QHBoxLayout( vb ); hb->addWidget( startButton, 2 ); QFile f( QPEApplication::qpeDir() + "share/sysinfo/results" ); if ( f.open( IO_ReadOnly ) ) { machineCombo = new QComboBox( this ); QWhatsThis::add( machineCombo, tr( "Choose a model to compare your results with." ) ); QTextStream ts( &f ); while( !ts.eof() ) { QString machline = ts.readLine(); odebug << "sysinfo: parsing benchmark results for '" << machline << "'" << oendl; QString resline = ts.readLine(); machines.insert( machline, new QStringList( QStringList::split( ",", resline ) ) ); machineCombo->insertItem( machline ); } hb->addWidget( machineCombo, 2 ); connect( machineCombo, SIGNAL( activated(int) ), this, SLOT( machineActivated(int) ) ); } } BenchmarkInfo::~BenchmarkInfo() {} void BenchmarkInfo::machineActivated( int index ) { QStringList* results = machines[ machineCombo->text( index ) ]; if ( !results ) { odebug << "sysinfo: no results available." << oendl; return; } QStringList::Iterator it = results->begin(); test_alu->setText( 2, *(it++) ); test_fpu->setText( 2, *(it++) ); test_txt->setText( 2, *(it++) ); |