summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/applauncher.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/core/launcher/applauncher.cpp b/core/launcher/applauncher.cpp
index 0ac043b..0db99dd 100644
--- a/core/launcher/applauncher.cpp
+++ b/core/launcher/applauncher.cpp
@@ -563,156 +563,163 @@ bool AppLauncher::execute(const QString &c, const QString &docParam, bool noRais
563 QCopEnvelope e("QPE/System", "busy()"); 563 QCopEnvelope e("QPE/System", "busy()");
564 qlPid = 0; 564 qlPid = 0;
565 qlReady = FALSE; 565 qlReady = FALSE;
566 QTimer::singleShot( getuid() == 0 ? 800 : 1500, this, SLOT(createQuickLauncher()) ); 566 QTimer::singleShot( getuid() == 0 ? 800 : 1500, this, SLOT(createQuickLauncher()) );
567 } else { 567 } else {
568 int pid = ::vfork(); 568 int pid = ::vfork();
569 if ( !pid ) { 569 if ( !pid ) {
570 for ( int fd = 3; fd < 100; fd++ ) 570 for ( int fd = 3; fd < 100; fd++ )
571 ::close( fd ); 571 ::close( fd );
572 ::setpgid( ::getpid(), ::getppid() ); 572 ::setpgid( ::getpid(), ::getppid() );
573 // Try bindir first, so that foo/bar works too 573 // Try bindir first, so that foo/bar works too
574 ::execv( QPEApplication::qpeDir()+"bin/"+args[0], (char * const *)args ); 574 ::execv( QPEApplication::qpeDir()+"bin/"+args[0], (char * const *)args );
575 ::execvp( args[0], (char * const *)args ); 575 ::execvp( args[0], (char * const *)args );
576 _exit( -1 ); 576 _exit( -1 );
577 } 577 }
578 578
579 runningApps[pid] = QString(args[0]); 579 runningApps[pid] = QString(args[0]);
580 emit launched(pid, QString(args[0])); 580 emit launched(pid, QString(args[0]));
581 QCopEnvelope e("QPE/System", "busy()"); 581 QCopEnvelope e("QPE/System", "busy()");
582 } 582 }
583#else 583#else
584 QProcess *proc = new QProcess(this); 584 QProcess *proc = new QProcess(this);
585 if (proc){ 585 if (proc){
586 for (int i=0; i < slist.count(); i++) 586 for (int i=0; i < slist.count(); i++)
587 proc->addArgument(args[i]); 587 proc->addArgument(args[i]);
588 connect(proc, SIGNAL(processExited()), this, SLOT(processExited())); 588 connect(proc, SIGNAL(processExited()), this, SLOT(processExited()));
589 if (!proc->start()){ 589 if (!proc->start()){
590 qDebug("Unable to start application %s", args[0]); 590 qDebug("Unable to start application %s", args[0]);
591 }else{ 591 }else{
592 PROCESS_INFORMATION *procInfo = (PROCESS_INFORMATION *)proc->processIdentifier(); 592 PROCESS_INFORMATION *procInfo = (PROCESS_INFORMATION *)proc->processIdentifier();
593 if (procInfo){ 593 if (procInfo){
594 DWORD pid = procInfo->dwProcessId; 594 DWORD pid = procInfo->dwProcessId;
595 runningApps[pid] = QString(args[0]); 595 runningApps[pid] = QString(args[0]);
596 runningAppsProc.append(proc); 596 runningAppsProc.append(proc);
597 emit launched(pid, QString(args[0])); 597 emit launched(pid, QString(args[0]));
598 QCopEnvelope e("QPE/System", "busy()"); 598 QCopEnvelope e("QPE/System", "busy()");
599 }else{ 599 }else{
600 qDebug("Unable to read process inforation #1 for %s", args[0]); 600 qDebug("Unable to read process inforation #1 for %s", args[0]);
601 } 601 }
602 } 602 }
603 }else{ 603 }else{
604 qDebug("Unable to create process for application %s", args[0]); 604 qDebug("Unable to create process for application %s", args[0]);
605 return FALSE; 605 return FALSE;
606 } 606 }
607#endif 607#endif
608#endif //QT_NO_QWS_MULTIPROCESS 608#endif //QT_NO_QWS_MULTIPROCESS
609 609
610 delete [] args; 610 delete [] args;
611 return TRUE; 611 return TRUE;
612} 612}
613 613
614void AppLauncher::kill( int pid ) 614void AppLauncher::kill( int pid )
615{ 615{
616#ifndef Q_OS_WIN32 616#ifndef Q_OS_WIN32
617 ::kill( pid, SIGTERM ); 617 ::kill( pid, SIGTERM );
618#else 618#else
619 for ( QProcess *proc = runningAppsProc.first(); proc; proc = runningAppsProc.next() ) { 619 for ( QProcess *proc = runningAppsProc.first(); proc; proc = runningAppsProc.next() ) {
620 if ( proc->processIdentifier() == pid ) { 620 if ( proc->processIdentifier() == pid ) {
621 proc->kill(); 621 proc->kill();
622 break; 622 break;
623 } 623 }
624 } 624 }
625#endif 625#endif
626} 626}
627 627
628int AppLauncher::pidForName( const QString &appName ) 628int AppLauncher::pidForName( const QString &appName )
629{ 629{
630 int pid = -1; 630 int pid = -1;
631 631
632 QMap<int, QString>::Iterator it; 632 QMap<int, QString>::Iterator it;
633 for (it = runningApps.begin(); it!= runningApps.end(); ++it) { 633 for (it = runningApps.begin(); it!= runningApps.end(); ++it) {
634 if (*it == appName) { 634 if (*it == appName) {
635 pid = it.key(); 635 pid = it.key();
636 break; 636 break;
637 } 637 }
638 } 638 }
639 639
640 return pid; 640 return pid;
641} 641}
642 642
643void AppLauncher::createQuickLauncher() 643void AppLauncher::createQuickLauncher()
644{ 644{
645 static bool disabled = FALSE; 645 static bool disabled = FALSE;
646 if (disabled) 646 if (disabled)
647 return; 647 return;
648 648
649 qlReady = FALSE; 649 qlReady = FALSE;
650 qlPid = ::vfork(); 650 qlPid = ::vfork();
651 if ( !qlPid ) { 651 if ( !qlPid ) {
652 char **args = new char *[2]; 652 char **args = new char *[2];
653 args[0] = "quicklauncher"; 653 args[0] = "quicklauncher";
654 args[1] = 0; 654 args[1] = 0;
655 for ( int fd = 3; fd < 100; fd++ ) 655 for ( int fd = 3; fd < 100; fd++ )
656 ::close( fd ); 656 ::close( fd );
657 ::setpgid( ::getpid(), ::getppid() ); 657 ::setpgid( ::getpid(), ::getppid() );
658 // Try bindir first, so that foo/bar works too 658 // Try bindir first, so that foo/bar works too
659 setenv( "LD_BIND_NOW", "1", 1 ); 659 /*
660 * LD_BIND_NOW will change the behaviour of ld.so and dlopen
661 * RTLD_LAZY will be made RTLD_NOW which leads to problem
662 * with miscompiled libraries... if LD_BIND_NOW is set.. there
663 * is no way back.. We will wait for numbers from TT to see
664 * if using LD_BIND_NOW is worth it - zecke
665 */
666 //setenv( "LD_BIND_NOW", "1", 1 );
660 ::execv( QPEApplication::qpeDir()+"bin/quicklauncher", args ); 667 ::execv( QPEApplication::qpeDir()+"bin/quicklauncher", args );
661 ::execvp( "quicklauncher", args ); 668 ::execvp( "quicklauncher", args );
662 delete []args; 669 delete []args;
663 disabled = TRUE; 670 disabled = TRUE;
664 _exit( -1 ); 671 _exit( -1 );
665 } else if ( qlPid == -1 ) { 672 } else if ( qlPid == -1 ) {
666 qlPid = 0; 673 qlPid = 0;
667 } else { 674 } else {
668 if ( getuid() == 0 ) 675 if ( getuid() == 0 )
669 setpriority( PRIO_PROCESS, qlPid, 19 ); 676 setpriority( PRIO_PROCESS, qlPid, 19 );
670 } 677 }
671} 678}
672 679
673// Used only by Win32 680// Used only by Win32
674void AppLauncher::processExited() 681void AppLauncher::processExited()
675{ 682{
676#ifdef Q_OS_WIN32 683#ifdef Q_OS_WIN32
677 qDebug("AppLauncher::processExited()"); 684 qDebug("AppLauncher::processExited()");
678 bool found = FALSE; 685 bool found = FALSE;
679 QProcess *proc = (QProcess *) sender(); 686 QProcess *proc = (QProcess *) sender();
680 if (!proc){ 687 if (!proc){
681 qDebug("Interanl error NULL proc"); 688 qDebug("Interanl error NULL proc");
682 return; 689 return;
683 } 690 }
684 691
685 QString appName = proc->arguments()[0]; 692 QString appName = proc->arguments()[0];
686 qDebug("Removing application %s", appName.latin1()); 693 qDebug("Removing application %s", appName.latin1());
687 runningAppsProc.remove(proc); 694 runningAppsProc.remove(proc);
688 695
689 QMap<QString,int>::Iterator hbit = waitingHeartbeat.find(appName); 696 QMap<QString,int>::Iterator hbit = waitingHeartbeat.find(appName);
690 if ( hbit != waitingHeartbeat.end() ) { 697 if ( hbit != waitingHeartbeat.end() ) {
691 killTimer( *hbit ); 698 killTimer( *hbit );
692 waitingHeartbeat.remove( hbit ); 699 waitingHeartbeat.remove( hbit );
693 } 700 }
694 if ( appName == appKillerName ) { 701 if ( appName == appKillerName ) {
695 appKillerName = QString::null; 702 appKillerName = QString::null;
696 delete appKillerBox; 703 delete appKillerBox;
697 appKillerBox = 0; 704 appKillerBox = 0;
698 } 705 }
699 706
700 // Search for the app to find its PID 707 // Search for the app to find its PID
701 QMap<int, QString>::Iterator it; 708 QMap<int, QString>::Iterator it;
702 for (it = runningApps.begin(); it!= runningApps.end(); ++it){ 709 for (it = runningApps.begin(); it!= runningApps.end(); ++it){
703 if (it.data() == appName){ 710 if (it.data() == appName){
704 found = TRUE; 711 found = TRUE;
705 break; 712 break;
706 } 713 }
707 } 714 }
708 715
709 if (found){ 716 if (found){
710 emit terminated(it.key(), it.data()); 717 emit terminated(it.key(), it.data());
711 runningApps.remove(it.key()); 718 runningApps.remove(it.key());
712 }else{ 719 }else{
713 qDebug("Internal error application %s not listed as running", appName.latin1()); 720 qDebug("Internal error application %s not listed as running", appName.latin1());
714 } 721 }
715 722
716#endif 723#endif
717} 724}
718 725