summaryrefslogtreecommitdiff
path: root/src/process.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/process.cpp')
-rw-r--r--src/process.cpp56
1 files changed, 54 insertions, 2 deletions
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
13Bu::Process::Process( const char *sName, char *const argv[] ) 16Bu::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
68void Bu::Process::close() 81void Bu::Process::close()
@@ -71,7 +84,46 @@ void Bu::Process::close()
71 84
72size_t Bu::Process::read( void *pBuf, size_t nBytes ) 85size_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
124size_t Bu::Process::readErr( void *pBuf, size_t nBytes )
125{
126 return ::read( iStdErr, pBuf, nBytes );
75} 127}
76 128
77size_t Bu::Process::write( const void *pBuf, size_t nBytes ) 129size_t Bu::Process::write( const void *pBuf, size_t nBytes )