38 #ifndef BLOCXX_EXEC_HPP_INCLUDE_GUARD_
39 #define BLOCXX_EXEC_HPP_INCLUDE_GUARD_
41 #include "blocxx/BLOCXX_config.h"
45 #ifdef BLOCXX_ENABLE_TEST_HOOKS
87 template <
typename SA1,
typename SA2>
93 return system(sa_command.sarr, sa_envVars.sarr, timeout);
105 class BLOCXX_COMMON_API PreExec
108 typedef ::BLOCXX_NAMESPACE::UnnamedPipe* pipe_pointer_t;
110 PreExec(
bool precompute_max_descriptors =
false);
122 virtual bool keepStd(
int d)
const = 0;
126 enum { MAX_MSG_LEN = 64 };
127 char message[MAX_MSG_LEN + 1];
166 void closeDescriptorsOnExec(std::vector<bool>
const & keep);
172 static void resetSignals();
189 static void setupStandardDescriptors(
pipe_pointer_t const pparr[]);
197 static void setNewProcessGroup();
200 long m_max_descriptors;
230 char const * exec_path,
231 char const *
const argv[],
char const *
const envp[],
246 template <
typename S,
typename SA1,
typename SA2>
248 S
const & exec_path, SA1
const & argv, SA2
const & envp,
255 return spawn(s_exec_path, sa_argv.sarr, sa_envp.sarr, pre_exec);
261 char const *
const argv[],
char const *
const envp[]
271 template <
typename SA1,
typename SA2>
273 SA1
const & argv, SA2
const & envp
278 return spawn(sa_argv.sarr, sa_envp.sarr);
281 template <
typename SA1>
324 class BLOCXX_COMMON_API OutputCallback
327 virtual ~OutputCallback();
328 void handleData(
const char* data,
size_t dataLen,
EOutputSource outputSource,
const ProcessRef& theProc,
size_t streamIndex, Array<char>& inputBuffer);
334 virtual void doHandleData(
const char* data,
size_t dataLen,
EOutputSource outputSource,
const ProcessRef& theProc,
size_t streamIndex, Array<char>& inputBuffer) = 0;
337 class BLOCXX_COMMON_API InputCallback
340 virtual ~InputCallback();
341 void getData(Array<char>& inputBuffer,
const ProcessRef& theProc,
size_t streamIndex);
343 virtual void doGetData(Array<char>& inputBuffer,
const ProcessRef& theProc,
size_t streamIndex) = 0;
357 : m_running(E_PROCESS_RUNNING)
362 explicit ProcessStatus(
int status)
363 : m_running(E_PROCESS_EXITED)
368 bool hasExited()
const
370 return m_running == E_PROCESS_EXITED;
373 const int& getStatus()
const
378 EProcessRunning m_running;
495 int outputLimit = -1,
529 char const *
const command[],
String& output,
char const *
const envVars[],
531 char const * input = 0);
566 char const *
const command[],
String& output,
String& erroutput,
567 char const *
const envVars[],
569 char const * input = 0);
575 template <
typename SA1,
typename S1,
typename S2>
577 SA1
const & command, S1& output,
578 const Timeout& timeout,
int outputlimit, S2
const& input)
591 output = tmpOutput.
c_str();
594 output = tmpOutput.
c_str();
603 template <
typename SA1,
typename S1,
typename S2>
605 SA1
const & command, S1& output, S1& erroutput,
606 const Timeout& timeout,
int outputlimit, S2
const& input)
609 String tmpOutput, tmpErrOut;
619 output = tmpOutput.
c_str();
620 erroutput = tmpErrOut.
c_str();
623 output = tmpOutput.
c_str();
624 erroutput = tmpErrOut.
c_str();
632 template <
typename SA1,
typename S1>
634 SA1
const & command, S1& output,
647 output = tmpOutput.
c_str();
650 output = tmpOutput.
c_str();
659 template <
typename SA1,
typename S1>
661 SA1
const & command, S1& output, S1& erroutput,
665 String tmpOutput, tmpErrOut;
675 output = tmpOutput.
c_str();
676 erroutput = tmpErrOut.
c_str();
679 output = tmpOutput.
c_str();
680 erroutput = tmpErrOut.
c_str();
697 template <
typename SA1,
typename S1,
typename SA2,
typename S2>
699 SA1
const & command, S1& output, SA2
const & envp,
700 const Timeout& timeout,
int outputlimit, S2
const& input)
710 timeout, outputlimit, sInput);
714 output = tmpOutput.
c_str();
717 output = tmpOutput.
c_str();
735 template <
typename SA1,
typename S1,
typename SA2,
typename S2>
737 SA1
const & command, S1& output, S1& erroutput, SA2
const & envp,
738 const Timeout& timeout,
int outputlimit, S2
const& input)
740 Cstr::CstrArr<SA1> sa_command(command);
741 Cstr::CstrArr<SA2> sa_envp(envp);
742 String tmpOutput, tmpErrOut;
748 tmpErrOut, sa_envp.sarr, timeout, outputlimit, sInput);
752 output = tmpOutput.c_str();
753 erroutput = tmpErrOut.c_str();
756 output = tmpOutput.c_str();
757 erroutput = tmpErrOut.c_str();
765 template <
typename SA1,
typename S1,
typename SA2>
767 SA1
const & command, S1& output, S1& erroutput, SA2
const & envp,
771 timeout, outputlimit,
String());
777 String& output,
int& processstatus,
778 int timeoutsecs = -1,
int outputlimit = -1,
800 #ifdef BLOCXX_ENABLE_TEST_HOOKS
801 typedef GlobalPtr<ExecMockObject, Impl::NullFactory> ExecMockObject_t;