libzypp 17.32.5
ExternalProgram.h
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
13#ifndef ZYPP_EXTERNALPROGRAM_H
14#define ZYPP_EXTERNALPROGRAM_H
15
16#include <unistd.h>
17
18#include <map>
19#include <string>
20#include <vector>
21#include <optional>
22
23#include <zypp-core/Globals.h>
25#include <zypp-core/Pathname.h>
26
27namespace zyppng {
28 class AbstractSpawnEngine;
29}
30
31namespace zypp {
32
64 class ExternalProgram : public zypp::externalprogram::ExternalDataSource
65 {
66
67 public:
69 using Arguments = std::vector<std::string>;
70
80 };
81
85 using Environment = std::map<std::string, std::string>;
86
95 ExternalProgram (const std::string& commandline,
97 bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
98 const Pathname& root = "");
99
123
126 bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
127 const Pathname& root = "");
128
129 ExternalProgram (const Arguments &argv, const Environment & environment,
131 bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
132 const Pathname& root = "");
133
134 ExternalProgram (const char *const *argv,
136 bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
137 const Pathname& root = "");
138
139 ExternalProgram (const char *const *argv, const Environment & environment,
141 bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
142 const Pathname& root = "");
143
144 ExternalProgram (const char *binpath, const char *const *argv_1,
145 bool use_pty = false);
146
147
148 ExternalProgram (const char *binpath, const char *const *argv_1, const Environment & environment,
149 bool use_pty = false);
150
151
152 ~ExternalProgram() override;
153
154#ifdef __cpp_lib_optional // YAST/PK explicitly use c++11 until 15-SP3
163 bool waitForExit ( std::optional<uint64_t> timeout = {} );
164#endif
165
167 int close() override;
168
172 bool kill();
173
177 bool kill( int sig );
178
182 bool running();
183
187 pid_t getpid();
188
190 const std::string & command() const;
191
201 const std::string & execError() const;
202
206 static void renumber_fd (int origfd, int newfd);
207
208 public:
209
228 std::ostream & operator>>( std::ostream & out_r );
229
230 private:
231 std::unique_ptr<zyppng::AbstractSpawnEngine> _backend;
232
233 protected:
234
235 void start_program (const char *const *argv, const Environment & environment,
237 int stderr_fd = -1, bool default_locale = false,
238 const char* root = NULL, bool switch_pgid = false, bool die_with_parent = false, bool usePty = false );
239
240 };
241
242
243 namespace externalprogram
244 {
250 struct EarlyPipe
252 enum { R=0, W=1 };
253 EarlyPipe();
255 void closeW() { if ( _fds[W] != -1 ) { ::close( _fds[W] ); _fds[W] = -1; } }
256 FILE * fStdErr() { return _stderr; }
257 protected:
258 FILE * _stderr;
259 int _fds[2];
260 };
261 } // namespace externalprogram
262
267 {
271 { _initStdErr(); }
275 {}
279 { _initStdErr(); }
283 {}
284 public:
287
292 bool stderrGetUpTo( std::string & retval_r, const char delim_r, bool returnDelim_r = false );
293
297 bool stderrGetline( std::string & retval_r, bool returnDelim_r = false )
298 { return stderrGetUpTo( retval_r, '\n', returnDelim_r ); }
299
300 private:
302 void _initStdErr()
303 { closeW(); }
304
305 private:
306 std::string _buffer;
307 };
308
313 {
314 public:
315 ExternalProgramWithSeperatePgid (const char *const *argv,
316 Stderr_Disposition stderr_disp = Normal_Stderr,
317 int stderr_fd = -1, bool default_locale = false,
318 const Pathname& root = "") : ExternalProgram()
319 {
320 start_program( argv, Environment(), stderr_disp, stderr_fd, default_locale, root.c_str(), true );
321 }
322
323 };
324
325} // namespace zypp
326
327#endif // ZYPP_EXTERNALPROGRAM_H
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
Definition AutoDispose.h:95
ExternalProgram extended to change the progress group ID after forking.
ExternalProgram extended to offer reading programs stderr.
bool stderrGetUpTo(std::string &retval_r, const char delim_r, bool returnDelim_r=false)
Read data up to delim_r from stderr (nonblocking).
ExternalProgramWithStderr(const Arguments &argv_r, bool defaultLocale_r=false, const Pathname &root_r="")
void _initStdErr()
Close write end of the pipe (childs end).
bool stderrGetline(std::string &retval_r, bool returnDelim_r=false)
Read next complete line from stderr (nonblocking).
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
ExternalProgram()
Start an external program by giving the arguments as an arry of char *pointers.
int close() override
Wait for the progamm to complete.
const std::string & command() const
The command we're executing.
std::ostream & operator>>(std::ostream &out_r)
Redirect all command output to an ostream.
void start_program(const char *const *argv, const Environment &environment, Stderr_Disposition stderr_disp=Normal_Stderr, int stderr_fd=-1, bool default_locale=false, const char *root=NULL, bool switch_pgid=false, bool die_with_parent=false, bool usePty=false)
std::vector< std::string > Arguments
static void renumber_fd(int origfd, int newfd)
origfd will be accessible as newfd and closed (unless they were equal)
std::map< std::string, std::string > Environment
For passing additional environment variables to set.
bool kill()
Kill the program.
pid_t getpid()
return pid
const std::string & execError() const
Some detail telling why the execution failed, if it failed.
bool running()
Return whether program is running.
Stderr_Disposition
Define symbols for different policies on the handling of stderr.
std::unique_ptr< zyppng::AbstractSpawnEngine > _backend
Bidirectional stream to external data.
Easy-to use interface to the ZYPP dependency resolver.
Helper providing pipe FDs for ExternalProgramWithStderr.
#define ZYPP_LOCAL
Definition Globals.h:59