diff options
| author | Mike Buland <eichlan@xagasoft.com> | 2011-08-15 17:06:31 +0000 |
|---|---|---|
| committer | Mike Buland <eichlan@xagasoft.com> | 2011-08-15 17:06:31 +0000 |
| commit | bc9e6678f6b917f67317a2987866bf1787a3e076 (patch) | |
| tree | 446a22eb59bbb8d27518a6404ae425513e4c0f1f | |
| parent | b307b8bb72b660be65a1dc5d8a05a4db32af7e67 (diff) | |
| download | libbu++-bc9e6678f6b917f67317a2987866bf1787a3e076.tar.gz libbu++-bc9e6678f6b917f67317a2987866bf1787a3e076.tar.bz2 libbu++-bc9e6678f6b917f67317a2987866bf1787a3e076.tar.xz libbu++-bc9e6678f6b917f67317a2987866bf1787a3e076.zip | |
Process now supports setuid for the child process. Really cool.
Diffstat (limited to '')
| -rw-r--r-- | src/process.cpp | 49 | ||||
| -rw-r--r-- | src/process.h | 18 |
2 files changed, 67 insertions, 0 deletions
diff --git a/src/process.cpp b/src/process.cpp index 8ea6ce3..b3f2801 100644 --- a/src/process.cpp +++ b/src/process.cpp | |||
| @@ -61,6 +61,51 @@ Bu::Process::Process( Flags eFlags, const char *sName, const char *argv, ...) : | |||
| 61 | delete[] list; | 61 | delete[] list; |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | Bu::Process::Process( Flags eFlags, const Bu::Process::Options &opt, const char *sName, char *const argv[] ) : | ||
| 65 | iStdIn( -1 ), | ||
| 66 | iStdOut( -1 ), | ||
| 67 | iStdErr( -1 ), | ||
| 68 | iPid( 0 ), | ||
| 69 | iProcStatus( 0 ), | ||
| 70 | bBlocking( true ), | ||
| 71 | bStdOutEos( true ), | ||
| 72 | bStdErrEos( true ), | ||
| 73 | opt( opt ) | ||
| 74 | { | ||
| 75 | gexec( eFlags, sName, argv ); | ||
| 76 | } | ||
| 77 | |||
| 78 | Bu::Process::Process( Flags eFlags, const Bu::Process::Options &opt, const char *sName, const char *argv, ...) : | ||
| 79 | iStdIn( -1 ), | ||
| 80 | iStdOut( -1 ), | ||
| 81 | iStdErr( -1 ), | ||
| 82 | iPid( 0 ), | ||
| 83 | iProcStatus( 0 ), | ||
| 84 | bBlocking( true ), | ||
| 85 | bStdOutEos( true ), | ||
| 86 | bStdErrEos( true ), | ||
| 87 | opt( opt ) | ||
| 88 | { | ||
| 89 | int iCnt = 0; | ||
| 90 | va_list ap; | ||
| 91 | va_start( ap, argv ); | ||
| 92 | for(; va_arg( ap, const char *); iCnt++ ) { } | ||
| 93 | va_end( ap ); | ||
| 94 | |||
| 95 | char const **list = new char const *[iCnt+2]; | ||
| 96 | va_start( ap, argv ); | ||
| 97 | list[0] = argv; | ||
| 98 | for( int j = 1; j <= iCnt; j++ ) | ||
| 99 | { | ||
| 100 | list[j] = va_arg( ap, const char *); | ||
| 101 | } | ||
| 102 | list[iCnt+1] = NULL; | ||
| 103 | va_end( ap ); | ||
| 104 | |||
| 105 | gexec( eFlags, sName, (char *const *)list ); | ||
| 106 | delete[] list; | ||
| 107 | } | ||
| 108 | |||
| 64 | Bu::Process::~Process() | 109 | Bu::Process::~Process() |
| 65 | { | 110 | { |
| 66 | close(); | 111 | close(); |
| @@ -109,6 +154,10 @@ void Bu::Process::gexec( Flags eFlags, const char *sName, char *const argv[] ) | |||
| 109 | ::close( iaStdErr[0] ); | 154 | ::close( iaStdErr[0] ); |
| 110 | dup2( iaStdErr[1], 2 ); | 155 | dup2( iaStdErr[1], 2 ); |
| 111 | } | 156 | } |
| 157 | if( (opt.eFlags&Options::SetUid) ) | ||
| 158 | { | ||
| 159 | setuid( opt.iUid ); | ||
| 160 | } | ||
| 112 | execvp( sName, argv ); | 161 | execvp( sName, argv ); |
| 113 | throw Bu::ExceptionBase("Hey, execvp failed!"); | 162 | throw Bu::ExceptionBase("Hey, execvp failed!"); |
| 114 | } | 163 | } |
diff --git a/src/process.h b/src/process.h index 4934408..f3d84b1 100644 --- a/src/process.h +++ b/src/process.h | |||
| @@ -33,8 +33,25 @@ namespace Bu | |||
| 33 | }; | 33 | }; |
| 34 | 34 | ||
| 35 | public: | 35 | public: |
| 36 | class Options | ||
| 37 | { | ||
| 38 | public: | ||
| 39 | enum OptFlags | ||
| 40 | { | ||
| 41 | None = 0x00, | ||
| 42 | SetUid = 0x01, | ||
| 43 | }; | ||
| 44 | |||
| 45 | Options() : eFlags( None ) {} | ||
| 46 | |||
| 47 | OptFlags eFlags; | ||
| 48 | int iUid; | ||
| 49 | }; | ||
| 50 | |||
| 36 | Process( Flags eFlags, const char *sName, char *const argv[] ); | 51 | Process( Flags eFlags, const char *sName, char *const argv[] ); |
| 37 | Process( Flags eFlags, const char *sName, const char *argv, ...); | 52 | Process( Flags eFlags, const char *sName, const char *argv, ...); |
| 53 | Process( Flags eFlags, const Options &opt, const char *sName, char *const argv[] ); | ||
| 54 | Process( Flags eFlags, const Options &opt, const char *sName, const char *argv, ...); | ||
| 38 | virtual ~Process(); | 55 | virtual ~Process(); |
| 39 | 56 | ||
| 40 | /** | 57 | /** |
| @@ -125,6 +142,7 @@ namespace Bu | |||
| 125 | 142 | ||
| 126 | void gexec( Flags eFlags, const char *sName, char *const argv[] ); | 143 | void gexec( Flags eFlags, const char *sName, char *const argv[] ); |
| 127 | void checkClose(); | 144 | void checkClose(); |
| 145 | Options opt; | ||
| 128 | }; | 146 | }; |
| 129 | } | 147 | } |
| 130 | 148 | ||
