summaryrefslogtreecommitdiff
path: root/libopie2
Unidiff
Diffstat (limited to 'libopie2') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/oprocess.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/libopie2/opiecore/oprocess.cpp b/libopie2/opiecore/oprocess.cpp
index 5cfcf32..83677aa 100644
--- a/libopie2/opiecore/oprocess.cpp
+++ b/libopie2/opiecore/oprocess.cpp
@@ -751,195 +751,195 @@ void OProcess::commClose()
751{ 751{
752 if ( NoCommunication != communication ) 752 if ( NoCommunication != communication )
753 { 753 {
754 bool b_in = ( communication & Stdin ); 754 bool b_in = ( communication & Stdin );
755 bool b_out = ( communication & Stdout ); 755 bool b_out = ( communication & Stdout );
756 bool b_err = ( communication & Stderr ); 756 bool b_err = ( communication & Stderr );
757 if ( b_in ) 757 if ( b_in )
758 delete innot; 758 delete innot;
759 759
760 if ( b_out || b_err ) 760 if ( b_out || b_err )
761 { 761 {
762 // If both channels are being read we need to make sure that one socket buffer 762 // If both channels are being read we need to make sure that one socket buffer
763 // doesn't fill up whilst we are waiting for data on the other (causing a deadlock). 763 // doesn't fill up whilst we are waiting for data on the other (causing a deadlock).
764 // Hence we need to use select. 764 // Hence we need to use select.
765 765
766 // Once one or other of the channels has reached EOF (or given an error) go back 766 // Once one or other of the channels has reached EOF (or given an error) go back
767 // to the usual mechanism. 767 // to the usual mechanism.
768 768
769 int fds_ready = 1; 769 int fds_ready = 1;
770 fd_set rfds; 770 fd_set rfds;
771 771
772 int max_fd = 0; 772 int max_fd = 0;
773 if ( b_out ) 773 if ( b_out )
774 { 774 {
775 fcntl( out[ 0 ], F_SETFL, O_NONBLOCK ); 775 fcntl( out[ 0 ], F_SETFL, O_NONBLOCK );
776 if ( out[ 0 ] > max_fd ) 776 if ( out[ 0 ] > max_fd )
777 max_fd = out[ 0 ]; 777 max_fd = out[ 0 ];
778 delete outnot; 778 delete outnot;
779 outnot = 0; 779 outnot = 0;
780 } 780 }
781 if ( b_err ) 781 if ( b_err )
782 { 782 {
783 fcntl( err[ 0 ], F_SETFL, O_NONBLOCK ); 783 fcntl( err[ 0 ], F_SETFL, O_NONBLOCK );
784 if ( err[ 0 ] > max_fd ) 784 if ( err[ 0 ] > max_fd )
785 max_fd = err[ 0 ]; 785 max_fd = err[ 0 ];
786 delete errnot; 786 delete errnot;
787 errnot = 0; 787 errnot = 0;
788 } 788 }
789 789
790 790
791 while ( b_out || b_err ) 791 while ( b_out || b_err )
792 { 792 {
793 // * If the process is still running we block until we 793 // * If the process is still running we block until we
794 // receive data. (p_timeout = 0, no timeout) 794 // receive data. (p_timeout = 0, no timeout)
795 // * If the process has already exited, we only check 795 // * If the process has already exited, we only check
796 // the available data, we don't wait for more. 796 // the available data, we don't wait for more.
797 // (p_timeout = &timeout, timeout immediately) 797 // (p_timeout = &timeout, timeout immediately)
798 struct timeval timeout; 798 struct timeval timeout;
799 timeout.tv_sec = 0; 799 timeout.tv_sec = 0;
800 timeout.tv_usec = 0; 800 timeout.tv_usec = 0;
801 struct timeval *p_timeout = runs ? 0 : &timeout; 801 struct timeval *p_timeout = runs ? 0 : &timeout;
802 802
803 FD_ZERO( &rfds ); 803 FD_ZERO( &rfds );
804 if ( b_out ) 804 if ( b_out )
805 FD_SET( out[ 0 ], &rfds ); 805 FD_SET( out[ 0 ], &rfds );
806 806
807 if ( b_err ) 807 if ( b_err )
808 FD_SET( err[ 0 ], &rfds ); 808 FD_SET( err[ 0 ], &rfds );
809 809
810 fds_ready = select( max_fd + 1, &rfds, 0, 0, p_timeout ); 810 fds_ready = select( max_fd + 1, &rfds, 0, 0, p_timeout );
811 if ( fds_ready <= 0 ) 811 if ( fds_ready <= 0 )
812 break; 812 break;
813 813
814 if ( b_out && FD_ISSET( out[ 0 ], &rfds ) ) 814 if ( b_out && FD_ISSET( out[ 0 ], &rfds ) )
815 { 815 {
816 int ret = 1; 816 int ret = 1;
817 while ( ret > 0 ) 817 while ( ret > 0 )
818 ret = childOutput( out[ 0 ] ); 818 ret = childOutput( out[ 0 ] );
819 if ( ( ret == -1 && errno != EAGAIN ) || ret == 0 ) 819 if ( ( ret == -1 && errno != EAGAIN ) || ret == 0 )
820 b_out = false; 820 b_out = false;
821 } 821 }
822 822
823 if ( b_err && FD_ISSET( err[ 0 ], &rfds ) ) 823 if ( b_err && FD_ISSET( err[ 0 ], &rfds ) )
824 { 824 {
825 int ret = 1; 825 int ret = 1;
826 while ( ret > 0 ) 826 while ( ret > 0 )
827 ret = childError( err[ 0 ] ); 827 ret = childError( err[ 0 ] );
828 if ( ( ret == -1 && errno != EAGAIN ) || ret == 0 ) 828 if ( ( ret == -1 && errno != EAGAIN ) || ret == 0 )
829 b_err = false; 829 b_err = false;
830 } 830 }
831 } 831 }
832 } 832 }
833 833
834 if ( b_in ) 834 if ( b_in )
835 { 835 {
836 communication = ( Communication ) ( communication & ~Stdin ); 836 communication = ( Communication ) ( communication & ~Stdin );
837 close( in[ 1 ] ); 837 close( in[ 1 ] );
838 } 838 }
839 if ( b_out ) 839 if ( b_out )
840 { 840 {
841 communication = ( Communication ) ( communication & ~Stdout ); 841 communication = ( Communication ) ( communication & ~Stdout );
842 close( out[ 0 ] ); 842 close( out[ 0 ] );
843 } 843 }
844 if ( b_err ) 844 if ( b_err )
845 { 845 {
846 communication = ( Communication ) ( communication & ~Stderr ); 846 communication = ( Communication ) ( communication & ~Stderr );
847 close( err[ 0 ] ); 847 close( err[ 0 ] );
848 } 848 }
849 } 849 }
850} 850}
851 851
852void OProcess::setUseShell( bool useShell, const char *shell ) 852void OProcess::setUseShell( bool useShell, const char *shell )
853{ 853{
854 if ( !d ) 854 if ( !d )
855 d = new OProcessPrivate; 855 d = new OProcessPrivate;
856 d->useShell = useShell; 856 d->useShell = useShell;
857 d->shell = shell; 857 d->shell = shell;
858 if ( d->shell.isEmpty() ) 858 if ( d->shell.isEmpty() )
859 d->shell = searchShell(); 859 d->shell = searchShell();
860} 860}
861 861
862QString OProcess::quote( const QString &arg ) 862QString OProcess::quote( const QString &arg )
863{ 863{
864 QString res = arg; 864 QString res = arg;
865 res.replace( QRegExp( QString::fromLatin1( "\'" ) ), 865 res.replace( QRegExp( QString::fromLatin1( "\'" ) ),
866 QString::fromLatin1( "'\"'\"'" ) ); 866 QString::fromLatin1( "'\"'\"'" ) );
867 res.prepend( '\'' ); 867 res.prepend( '\'' );
868 res.append( '\'' ); 868 res.append( '\'' );
869 return res; 869 return res;
870} 870}
871 871
872QCString OProcess::searchShell() 872QCString OProcess::searchShell()
873{ 873{
874 QCString tmpShell = QCString( getenv( "SHELL" ) ).stripWhiteSpace(); 874 QCString tmpShell = QCString( getenv( "SHELL" ) ).stripWhiteSpace();
875 if ( !isExecutable( tmpShell ) ) 875 if ( !isExecutable( tmpShell ) )
876 { 876 {
877 tmpShell = "/bin/sh"; 877 tmpShell = "/bin/sh";
878 } 878 }
879 879
880 return tmpShell; 880 return tmpShell;
881} 881}
882 882
883bool OProcess::isExecutable( const QCString &filename ) 883bool OProcess::isExecutable( const QCString &filename )
884{ 884{
885 struct stat fileinfo; 885 struct stat fileinfo;
886 886
887 if ( filename.isEmpty() ) 887 if ( filename.isEmpty() )
888 return false; 888 return false;
889 889
890 // CC: we've got a valid filename, now let's see whether we can execute that file 890 // CC: we've got a valid filename, now let's see whether we can execute that file
891 891
892 if ( -1 == stat( filename.data(), &fileinfo ) ) 892 if ( -1 == stat( filename.data(), &fileinfo ) )
893 return false; 893 return false;
894 // CC: return false if the file does not exist 894 // CC: return false if the file does not exist
895 895
896 // CC: anyway, we cannot execute directories, block/character devices, fifos or sockets 896 // CC: anyway, we cannot execute directories, block/character devices, fifos or sockets
897 if ( ( S_ISDIR( fileinfo.st_mode ) ) || 897 if ( ( S_ISDIR( fileinfo.st_mode ) ) ||
898 ( S_ISCHR( fileinfo.st_mode ) ) || 898 ( S_ISCHR( fileinfo.st_mode ) ) ||
899 ( S_ISBLK( fileinfo.st_mode ) ) || 899 ( S_ISBLK( fileinfo.st_mode ) ) ||
900#ifdef S_ISSOCK 900#ifdef S_ISSOCK
901 // CC: SYSVR4 systems don't have that macro 901 // CC: SYSVR4 systems don't have that macro
902 ( S_ISSOCK( fileinfo.st_mode ) ) || 902 ( S_ISSOCK( fileinfo.st_mode ) ) ||
903#endif 903#endif
904 ( S_ISFIFO( fileinfo.st_mode ) ) || 904 ( S_ISFIFO( fileinfo.st_mode ) ) ||
905 ( S_ISDIR( fileinfo.st_mode ) ) ) 905 ( S_ISDIR( fileinfo.st_mode ) ) )
906 { 906 {
907 return false; 907 return false;
908 } 908 }
909 909
910 // CC: now check for permission to execute the file 910 // CC: now check for permission to execute the file
911 if ( access( filename.data(), X_OK ) != 0 ) 911 if ( access( filename.data(), X_OK ) != 0 )
912 return false; 912 return false;
913 913
914 // CC: we've passed all the tests... 914 // CC: we've passed all the tests...
915 return true; 915 return true;
916} 916}
917 917
918int OProcess::processPID( const QString& process ) 918int OProcess::processPID( const QString& process )
919{ 919{
920 QString line; 920 QString line;
921 QDir d = QDir( "/proc" ); 921 QDir d = QDir( "/proc" );
922 QStringList dirs = d.entryList( QDir::Dirs ); 922 QStringList dirs = d.entryList( QDir::Dirs );
923 QStringList::Iterator it; 923 QStringList::Iterator it;
924 for ( it = dirs.begin(); it != dirs.end(); ++it ) 924 for ( it = dirs.begin(); it != dirs.end(); ++it )
925 { 925 {
926 //qDebug( "next entry: %s", (const char*) *it ); 926 //qDebug( "next entry: %s", (const char*) *it );
927 QFile file( "/proc/"+*it+"/cmdline" ); 927 QFile file( "/proc/"+*it+"/cmdline" );
928 file.open( IO_ReadOnly ); 928 file.open( IO_ReadOnly );
929 if ( !file.isOpen() ) continue; 929 if ( !file.isOpen() ) continue;
930 QTextStream t( &file ); 930 QTextStream t( &file );
931 line = t.readLine(); 931 line = t.readLine();
932 //qDebug( "cmdline = %s", (const char*) line ); 932 //qDebug( "cmdline = %s", (const char*) line );
933 if ( line.contains( process ) ) break; //FIXME: That may find also other process, if the name is not long enough ;) 933 if ( line.contains( process ) ) break; //FIXME: That may find also other process, if the name is not long enough ;)
934 } 934 }
935 if ( line.contains( process ) ) 935 if ( line.contains( process ) )
936 { 936 {
937 //qDebug( "found process id #%d", (*it).toInt() ); 937 //qDebug( "found process id #%d", (*it).toInt() );
938 return (*it).toInt(); 938 return (*it).toInt();
939 } 939 }
940 else 940 else
941 { 941 {
942 //qDebug( "process '%s' not found", (const char*) process ); 942 //qDebug( "process '%s' not found", (const char*) process );
943 return -1; 943 return 0;
944 } 944 }
945} 945}