summaryrefslogtreecommitdiff
path: root/src/process.cpp
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2007-11-23 22:58:19 +0000
committerMike Buland <eichlan@xagasoft.com>2007-11-23 22:58:19 +0000
commitcd215f0da23e16c3f1a7200f2b9f67f23c9b4be7 (patch)
treeef4b144cbc9a68110c1ea6a0b2eb73be2cbd02bb /src/process.cpp
parentb5b68088f28b2593bfbf910a46fd52775007e8b3 (diff)
downloadlibbu++-cd215f0da23e16c3f1a7200f2b9f67f23c9b4be7.tar.gz
libbu++-cd215f0da23e16c3f1a7200f2b9f67f23c9b4be7.tar.bz2
libbu++-cd215f0da23e16c3f1a7200f2b9f67f23c9b4be7.tar.xz
libbu++-cd215f0da23e16c3f1a7200f2b9f67f23c9b4be7.zip
Added the Process stream class, this will allow us to do some really cool stuff
coming up...it's just like popen only cool and managed, and streamey.
Diffstat (limited to 'src/process.cpp')
-rw-r--r--src/process.cpp146
1 files changed, 146 insertions, 0 deletions
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