summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/fstring.h2
-rw-r--r--src/process.cpp146
-rw-r--r--src/process.h64
-rw-r--r--src/tests/procs.cpp22
4 files changed, 234 insertions, 0 deletions
diff --git a/src/fstring.h b/src/fstring.h
index ee6be28..8cccd5c 100644
--- a/src/fstring.h
+++ b/src/fstring.h
@@ -246,6 +246,8 @@ namespace Bu
246 { 246 {
247 if( nLength == nNewSize ) 247 if( nLength == nNewSize )
248 return; 248 return;
249 if( nNewSize < 0 )
250 nNewSize = 0;
249 251
250 flatten(); 252 flatten();
251 253
diff --git a/src/process.cpp b/src/process.cpp
new file mode 100644
index 0000000..8fe98f3
--- /dev/null
+++ b/src/process.cpp
@@ -0,0 +1,146 @@
1/*
2 * Copyright (C) 2007 Xagasoft, All rights reserved.
3 *
4 * This file is part of the libbu++ library and is released under the
5 * terms of the license contained in the file LICENSE.
6 */
7
8#include "process.h"
9#include <sys/types.h>
10#include <unistd.h>
11#include <stdarg.h>
12
13Bu::Process::Process( const char *sName, char *const argv[] )
14{
15 gexec( sName, argv );
16}
17
18Bu::Process::Process( const char *sName, const char *argv, ...)
19{
20 int iCnt = 0;
21 va_list ap;
22 va_start( ap, argv );
23 for(; va_arg( ap, const char *); iCnt++ );
24 va_end( ap );
25
26 char const **list = new char const *[iCnt+2];
27 va_start( ap, argv );
28 list[0] = argv;
29 for( int j = 1; j < iCnt; j++ )
30 list[j] = va_arg( ap, const char *);
31 list[iCnt+1] = NULL;
32 va_end( ap );
33
34 gexec( sName, (char *const *)list );
35 delete[] list;
36}
37
38Bu::Process::~Process()
39{
40}
41
42void Bu::Process::gexec( const char *sName, char *const argv[] )
43{
44 int iaStdIn[2];
45 int iaStdOut[2];
46 int iaStdErr[2];
47 pipe( iaStdIn );
48 pipe( iaStdOut );
49 pipe( iaStdErr );
50
51 iStdIn = iaStdIn[1];
52 iStdOut = iaStdOut[0];
53 iStdErr = iaStdErr[0];
54
55 iPid = fork();
56 if( iPid == 0 )
57 {
58 ::close( iaStdIn[1] );
59 ::close( iaStdOut[0] );
60 ::close( iaStdErr[0] );
61 dup2( iaStdIn[0], 0 );
62 dup2( iaStdOut[1], 1 );
63 dup2( iaStdErr[1], 2 );
64 execvp( sName, argv );
65 }
66}
67
68void Bu::Process::close()
69{
70}
71
72size_t Bu::Process::read( void *pBuf, size_t nBytes )
73{
74 return ::read( iStdOut, pBuf, nBytes );
75}
76
77size_t Bu::Process::write( const void *pBuf, size_t nBytes )
78{
79 return ::write( iStdIn, pBuf, nBytes );
80}
81
82long Bu::Process::tell()
83{
84 return 0;
85}
86
87void Bu::Process::seek( long offset )
88{
89}
90
91void Bu::Process::setPos( long pos )
92{
93}
94
95void Bu::Process::setPosEnd( long pos )
96{
97}
98
99bool Bu::Process::isEOS()
100{
101 return false;
102}
103
104bool Bu::Process::isOpen()
105{
106 return true;
107}
108
109void Bu::Process::flush()
110{
111}
112
113bool Bu::Process::canRead()
114{
115 return true;
116}
117
118bool Bu::Process::canWrite()
119{
120 return true;
121}
122
123bool Bu::Process::isReadable()
124{
125 return true;
126}
127
128bool Bu::Process::isWritable()
129{
130 return true;
131}
132
133bool Bu::Process::isSeekable()
134{
135 return false;
136}
137
138bool Bu::Process::isBlocking()
139{
140 return true;
141}
142
143void Bu::Process::setBlocking( bool bBlocking )
144{
145}
146
diff --git a/src/process.h b/src/process.h
new file mode 100644
index 0000000..dbf1553
--- /dev/null
+++ b/src/process.h
@@ -0,0 +1,64 @@
1/*
2 * Copyright (C) 2007 Xagasoft, All rights reserved.
3 *
4 * This file is part of the libbu++ library and is released under the
5 * terms of the license contained in the file LICENSE.
6 */
7
8#ifndef BU_PROCESS_H
9#define BU_PROCESS_H
10
11#include <stdint.h>
12#include <sys/types.h>
13
14#include "bu/stream.h"
15#include "bu/fstring.h"
16
17namespace Bu
18{
19 /**
20 * Runs a program and attaches streams to it's stdin, stdout, and stderr.
21 * Reading from a Bu::Process will read from the program's standard output,
22 * writing to a Bu::Process will write to the program's standard input.
23 */
24 class Process : public Bu::Stream
25 {
26 public:
27 Process( const char *sName, char *const argv[] );
28 Process( const char *sName, const char *argv, ...);
29 virtual ~Process();
30
31 virtual void close();
32 virtual size_t read( void *pBuf, size_t nBytes );
33 virtual size_t write( const void *pBuf, size_t nBytes );
34
35 virtual long tell();
36 virtual void seek( long offset );
37 virtual void setPos( long pos );
38 virtual void setPosEnd( long pos );
39 virtual bool isEOS();
40 virtual bool isOpen();
41
42 virtual void flush();
43
44 virtual bool canRead();
45 virtual bool canWrite();
46
47 virtual bool isReadable();
48 virtual bool isWritable();
49 virtual bool isSeekable();
50
51 virtual bool isBlocking();
52 virtual void setBlocking( bool bBlocking=true );
53
54 private:
55 int iStdIn;
56 int iStdOut;
57 int iStdErr;
58 pid_t iPid;
59
60 void gexec( const char *sName, char *const argv[] );
61 };
62}
63
64#endif
diff --git a/src/tests/procs.cpp b/src/tests/procs.cpp
new file mode 100644
index 0000000..53e5142
--- /dev/null
+++ b/src/tests/procs.cpp
@@ -0,0 +1,22 @@
1#include "bu/process.h"
2
3#include <stdio.h>
4
5int main( int agrc, char *argv[] )
6{
7 Bu::Process p( argv[1], argv+1 );
8
9 char buf[1000];
10 for(;;)
11 {
12 int iSize = p.read( buf, 1000 );
13 if( iSize == 0 )
14 break;
15 fwrite( buf, iSize, 1, stdout );
16 if( iSize < 1000 )
17 break;
18 }
19
20 return 0;
21}
22