diff options
-rw-r--r-- | src/fstring.h | 33 | ||||
-rw-r--r-- | src/process.cpp | 56 | ||||
-rw-r--r-- | src/process.h | 1 | ||||
-rw-r--r-- | src/tests/procs.cpp | 6 |
4 files changed, 93 insertions, 3 deletions
diff --git a/src/fstring.h b/src/fstring.h index 666480c..82e8b34 100644 --- a/src/fstring.h +++ b/src/fstring.h | |||
@@ -731,6 +731,39 @@ namespace Bu | |||
731 | } | 731 | } |
732 | return -1; | 732 | return -1; |
733 | } | 733 | } |
734 | |||
735 | /** | ||
736 | * Find the index of the first occurrance of cChar | ||
737 | *@param sText (const chr *) The string to search for. | ||
738 | *@returns (long) The index of the first occurrance. -1 for not found. | ||
739 | */ | ||
740 | long find( long iStart, const chr cChar ) const | ||
741 | { | ||
742 | flatten(); | ||
743 | for( long j = iStart; j < pFirst->nLength; j++ ) | ||
744 | { | ||
745 | if( pFirst->pData[j] == cChar ) | ||
746 | return j; | ||
747 | } | ||
748 | return -1; | ||
749 | } | ||
750 | |||
751 | /** | ||
752 | * Find the index of the first occurrance of sText | ||
753 | *@param cChar (const chr) The character to search for. | ||
754 | *@returns (long) The index of the first occurrance. -1 for not found. | ||
755 | */ | ||
756 | long find( long iStart, const chr *sText ) const | ||
757 | { | ||
758 | long nTLen = strlen( sText ); | ||
759 | flatten(); | ||
760 | for( long j = iStart; j < pFirst->nLength-nTLen; j++ ) | ||
761 | { | ||
762 | if( !strncmp( sText, pFirst->pData+j, nTLen ) ) | ||
763 | return j; | ||
764 | } | ||
765 | return -1; | ||
766 | } | ||
734 | 767 | ||
735 | /** | 768 | /** |
736 | * Do a reverse search for (sText) | 769 | * Do a reverse search for (sText) |
diff --git a/src/process.cpp b/src/process.cpp index 8fe98f3..c554e1a 100644 --- a/src/process.cpp +++ b/src/process.cpp | |||
@@ -7,8 +7,11 @@ | |||
7 | 7 | ||
8 | #include "process.h" | 8 | #include "process.h" |
9 | #include <sys/types.h> | 9 | #include <sys/types.h> |
10 | #include <sys/wait.h> | ||
10 | #include <unistd.h> | 11 | #include <unistd.h> |
11 | #include <stdarg.h> | 12 | #include <stdarg.h> |
13 | #include <signal.h> | ||
14 | #include <fcntl.h> | ||
12 | 15 | ||
13 | Bu::Process::Process( const char *sName, char *const argv[] ) | 16 | Bu::Process::Process( const char *sName, char *const argv[] ) |
14 | { | 17 | { |
@@ -22,12 +25,17 @@ Bu::Process::Process( const char *sName, const char *argv, ...) | |||
22 | va_start( ap, argv ); | 25 | va_start( ap, argv ); |
23 | for(; va_arg( ap, const char *); iCnt++ ); | 26 | for(; va_arg( ap, const char *); iCnt++ ); |
24 | va_end( ap ); | 27 | va_end( ap ); |
28 | printf("Params: %d\n", iCnt ); | ||
25 | 29 | ||
26 | char const **list = new char const *[iCnt+2]; | 30 | char const **list = new char const *[iCnt+2]; |
27 | va_start( ap, argv ); | 31 | va_start( ap, argv ); |
28 | list[0] = argv; | 32 | list[0] = argv; |
29 | for( int j = 1; j < iCnt; j++ ) | 33 | printf("list[0] = \"%s\"\n", argv ); |
34 | for( int j = 1; j <= iCnt; j++ ) | ||
35 | { | ||
30 | list[j] = va_arg( ap, const char *); | 36 | list[j] = va_arg( ap, const char *); |
37 | printf("list[%d] = \"%s\"\n", j, list[j] ); | ||
38 | } | ||
31 | list[iCnt+1] = NULL; | 39 | list[iCnt+1] = NULL; |
32 | va_end( ap ); | 40 | va_end( ap ); |
33 | 41 | ||
@@ -52,6 +60,8 @@ void Bu::Process::gexec( const char *sName, char *const argv[] ) | |||
52 | iStdOut = iaStdOut[0]; | 60 | iStdOut = iaStdOut[0]; |
53 | iStdErr = iaStdErr[0]; | 61 | iStdErr = iaStdErr[0]; |
54 | 62 | ||
63 | // fcntl( iStdOut, F_SETFL, fcntl( iStdOut, F_GETFL, 0 )|O_NONBLOCK ); | ||
64 | |||
55 | iPid = fork(); | 65 | iPid = fork(); |
56 | if( iPid == 0 ) | 66 | if( iPid == 0 ) |
57 | { | 67 | { |
@@ -63,6 +73,9 @@ void Bu::Process::gexec( const char *sName, char *const argv[] ) | |||
63 | dup2( iaStdErr[1], 2 ); | 73 | dup2( iaStdErr[1], 2 ); |
64 | execvp( sName, argv ); | 74 | execvp( sName, argv ); |
65 | } | 75 | } |
76 | ::close( iaStdIn[0] ); | ||
77 | ::close( iaStdOut[1] ); | ||
78 | ::close( iaStdErr[1] ); | ||
66 | } | 79 | } |
67 | 80 | ||
68 | void Bu::Process::close() | 81 | void Bu::Process::close() |
@@ -71,7 +84,46 @@ void Bu::Process::close() | |||
71 | 84 | ||
72 | size_t Bu::Process::read( void *pBuf, size_t nBytes ) | 85 | size_t Bu::Process::read( void *pBuf, size_t nBytes ) |
73 | { | 86 | { |
74 | return ::read( iStdOut, pBuf, nBytes ); | 87 | size_t iTotal = 0; |
88 | for(;;) | ||
89 | { | ||
90 | size_t iRet = ::read( iStdOut, (char *)pBuf+iTotal, nBytes-iTotal ); | ||
91 | if( iRet == 0 ) | ||
92 | return iTotal; | ||
93 | printf("--read=%d / %d--\n", iRet, iTotal+iRet ); | ||
94 | iTotal += iRet; | ||
95 | if( iTotal == nBytes ) | ||
96 | return iTotal; | ||
97 | } | ||
98 | /* | ||
99 | size_t iTotal = 0; | ||
100 | fd_set rfs; | ||
101 | FD_ZERO( &rfs ); | ||
102 | for(;;) | ||
103 | { | ||
104 | if( waitpid( iPid, NULL, WNOHANG ) ) | ||
105 | { | ||
106 | printf("!!!wait failed!\n"); | ||
107 | size_t iRet = ::read( iStdOut, (char *)pBuf+iTotal, | ||
108 | nBytes-iTotal ); | ||
109 | iTotal += iRet; | ||
110 | return iTotal; | ||
111 | } | ||
112 | |||
113 | FD_SET( iStdOut, &rfs ); | ||
114 | select( iStdOut+1, &rfs, NULL, &rfs, NULL ); | ||
115 | size_t iRet = ::read( iStdOut, (char *)pBuf+iTotal, nBytes-iTotal ); | ||
116 | printf("--read=%d / %d--\n", iRet, iTotal+iRet ); | ||
117 | iTotal += iRet; | ||
118 | if( iTotal == nBytes ) | ||
119 | return iTotal; | ||
120 | } | ||
121 | */ | ||
122 | } | ||
123 | |||
124 | size_t Bu::Process::readErr( void *pBuf, size_t nBytes ) | ||
125 | { | ||
126 | return ::read( iStdErr, pBuf, nBytes ); | ||
75 | } | 127 | } |
76 | 128 | ||
77 | size_t Bu::Process::write( const void *pBuf, size_t nBytes ) | 129 | size_t Bu::Process::write( const void *pBuf, size_t nBytes ) |
diff --git a/src/process.h b/src/process.h index dbf1553..025b295 100644 --- a/src/process.h +++ b/src/process.h | |||
@@ -30,6 +30,7 @@ namespace Bu | |||
30 | 30 | ||
31 | virtual void close(); | 31 | virtual void close(); |
32 | virtual size_t read( void *pBuf, size_t nBytes ); | 32 | virtual size_t read( void *pBuf, size_t nBytes ); |
33 | virtual size_t readErr( void *pBuf, size_t nBytes ); | ||
33 | virtual size_t write( const void *pBuf, size_t nBytes ); | 34 | virtual size_t write( const void *pBuf, size_t nBytes ); |
34 | 35 | ||
35 | virtual long tell(); | 36 | virtual long tell(); |
diff --git a/src/tests/procs.cpp b/src/tests/procs.cpp index 53e5142..c233040 100644 --- a/src/tests/procs.cpp +++ b/src/tests/procs.cpp | |||
@@ -4,12 +4,16 @@ | |||
4 | 4 | ||
5 | int main( int agrc, char *argv[] ) | 5 | int main( int agrc, char *argv[] ) |
6 | { | 6 | { |
7 | Bu::Process p( argv[1], argv+1 ); | 7 | //Bu::Process p( argv[1], argv+1 ); |
8 | Bu::Process p("mplayer", "mplayer", "dvd://", "-framedrop", | ||
9 | "-ao", "null", "-nosound", "-vf", "framestep=I,cropdetect" "-sstep", | ||
10 | "197", NULL ); | ||
8 | 11 | ||
9 | char buf[1000]; | 12 | char buf[1000]; |
10 | for(;;) | 13 | for(;;) |
11 | { | 14 | { |
12 | int iSize = p.read( buf, 1000 ); | 15 | int iSize = p.read( buf, 1000 ); |
16 | printf("::read=%d::\n", iSize ); | ||
13 | if( iSize == 0 ) | 17 | if( iSize == 0 ) |
14 | break; | 18 | break; |
15 | fwrite( buf, iSize, 1, stdout ); | 19 | fwrite( buf, iSize, 1, stdout ); |