3#include <zypp-core/zyppng/base/EventDispatcher>
5#include <zypp-core/zyppng/io/AsyncDataSource>
51 return std::shared_ptr<Process>(
new Process() );
57 if ( d->_spawnEngine->pid() >= 0 ) {
59 DBG <<
"Process destroyed while still running removing from EventLoop." << std::endl;
68 ERR <<
"A valid EventDispatcher needs to be registered before starting a Process" << std::endl;
82 d->_sigFailedToStart.emit();
88 d->_sigFailedToStart.emit();
93 std::optional<Pipe> stderrPipe;
97 d->_sigFailedToStart.emit();
100 stderr_fd = stderrPipe->writeFd;
102 stderr_fd = stdoutPipe->writeFd;
105 if ( d->_spawnEngine->start( argv, stdinPipe->readFd, stdoutPipe->writeFd, stderr_fd ) ) {
108 const auto pid = d->_spawnEngine->pid( );
113 d->_spawnEngine->notifyExited( status );
114 d->_sigFinished.emit( d->_spawnEngine->exitStatus() );
118 d->_stdinFd = std::move( stdinPipe->writeFd );
119 d->_stdoutFd = std::move( stdoutPipe->readFd );
121 std::vector<int> rFds { d->_stdoutFd };
123 d->_stderrFd = std::move( stderrPipe->readFd );
124 rFds.push_back( d->_stderrFd.value() );
127 if ( !
openFds( rFds, d->_stdinFd ) ) {
132 d->_sigStarted.emit();
135 d->_sigFailedToStart.emit();
143 ::kill( d->_spawnEngine->pid(), signal );
150 return ( d->_spawnEngine->pid() > -1 );
164 if ( d->_spawnEngine->isRunning() ) {
168 d->_spawnEngine->isRunning(
true );
181 return d_func()->_spawnEngine->executedCommand();
186 return d_func()->_spawnEngine->execError();
191 return d_func()->_spawnEngine->chroot();
196 return d_func()->_spawnEngine->setChroot(
chroot );
201 return d_func()->_spawnEngine->useDefaultLocale();
206 return d_func()->_spawnEngine->setUseDefaultLocale( defaultLocale );
211 return d_func()->_spawnEngine->environment();
216 return d_func()->_spawnEngine->setEnvironment(
env );
221 return d_func()->_spawnEngine->pid();
226 return d_func()->_spawnEngine->exitStatus();
231 return d_func()->_spawnEngine->dieWithParent();
236 return d_func()->_spawnEngine->setDieWithParent( enabled );
241 return d_func()->_spawnEngine->switchPgid();
246 return d_func()->_spawnEngine->setSwitchPgid( enabled );
251 return d_func()->_spawnEngine->workingDirectory();
256 return d_func()->_spawnEngine->setWorkingDirectory( wd );
261 return d_func()->_spawnEngine->fdsToMap();
266 return d_func()->_spawnEngine->addFd( fd );
271 return d_func()->_stdinFd;
276 return d_func()->_stdoutFd;
281 return d_func()->_stderrFd;
286 return d_func()->_sigStarted;
291 return d_func()->_sigFailedToStart;
296 return d_func()->_sigFinished;
static std::unique_ptr< zyppng::AbstractSpawnEngine > createDefaultEngine()
AsyncDataSourcePrivate(AsyncDataSource &pub)
bool openFds(const std::vector< int > &readFds, int writeFd=-1)
virtual void closeWriteChannel()
static std::shared_ptr< EventDispatcher > instance()
std::unique_ptr< AbstractSpawnEngine > _spawnEngine
Signal< void()> _sigFailedToStart
ProcessPrivate(Process &p)
Process::OutputChannel _currentChannel
Process::OutputChannelMode _channelMode
MemSignal< Process, void(int)> _sigFinished
Signal< void()> _sigStarted
OutputChannelMode outputChannelMode() const
std::map< std::string, std::string > Environment
For passing additional environment variables to set.
zypp::Pathname chroot() const
bool dieWithParent() const
void setEnvironment(const Environment &environment)
void stop(int signal=SIGTERM)
void closeWriteChannel() override
const std::string & executedCommand() const
bool start(const char *const *argv)
bool useDefaultLocale() const
void setWorkingDirectory(const zypp::Pathname &workingDirectory)
SignalProxy< void()> sigStarted()
const std::vector< int > & fdsToMap() const
void setUseDefaultLocale(bool defaultLocale)
void setSwitchPgid(bool enabled)
void setChroot(const zypp::Pathname &chroot)
void setOutputChannelMode(const OutputChannelMode &outputChannelMode)
zypp::Pathname workingDirectory() const
void setDieWithParent(bool enabled)
SignalProxy< void()> sigFailedToStart()
SignalProxy< void(int)> sigFinished()
Environment environment() const
const std::string & execError() const
Namespace intended to collect all environment variables we use.
AutoDispose<int> calling close
static std::optional< Pipe > create(int flags=0)
#define ZYPP_IMPL_PRIVATE(Class)