use right-side buttons to goto_nth_marker()
[ardour.git] / libs / pbd / pbd / system_exec.h
index 0ca523085ae05991e590f37ad64a410663230d0c..a8a30ba18dc0b6af05faac7aacc5f68cd4f1b76b 100644 (file)
 #undef interface // VKamyshniy: to avoid "include/giomm-2.4/giomm/dbusmessage.h:270:94: error: expected ',' or '...' before 'struct'"
 #endif
 
+#else // posix
+#include <sys/types.h>
+#include <sys/wait.h> /* WNOHANG is part of the exposed API */
 #endif
 
 #include <string>
 #include <pthread.h>
 #include <signal.h>
+#include <map>
+
 #ifdef NOPBD  /* unit-test outside ardour */
 #include <sigc++/bind.h>
 #include <sigc++/signal.h>
@@ -94,8 +99,27 @@ class LIBPBD_API SystemExec
                 *
                 */
                SystemExec (std::string c, char ** a);
+
+               /** similar to \ref SystemExec but expects a whole command line, and
+                * handles some simple escape sequences.
+                *
+                * @param command complete command-line to be executed
+                * @param subs a map of <char, std::string> listing the % substitutions to
+                *             be made.
+                *
+                * creates an argv array from the given command string, splitting into
+                * parameters at spaces.
+                * "\ " is non-splitting space, "\\" (and "\" at end of command) as "\",
+                * for "%<char>", <char> is looked up in subs and the corresponding string
+                * substituted. "%%" (and "%" at end of command)
+                * returns an argv array suitable for creating a new SystemExec with
+                */
+               SystemExec (std::string command, const std::map<char, std::string> subs);
+
                virtual ~SystemExec ();
 
+               std::string to_s() const;
+
                /** fork and execute the given program
                 *
                 * @param stderr_mode select what to do with program's standard error
@@ -107,7 +131,7 @@ class LIBPBD_API SystemExec
                 * @return If the process is already running or was launched successfully
                 * the function returns zero (0). A negative number indicates an error.
                 */
-               int start (int stderr_mode = 1);
+               int start (int stderr_mode, const char *_vfork_exec_wrapper);
                /** kill running child-process
                 *
                 * if a child process exists trt to shut it down by closing its STDIN.
@@ -182,6 +206,7 @@ class LIBPBD_API SystemExec
                int nicelevel; ///< process nice level - defaults to 0
 
                void make_argp(std::string);
+               void make_argp_escaped(std::string command, const std::map<char, std::string> subs);
                void make_envp();
 
                char **argp;
@@ -198,9 +223,9 @@ class LIBPBD_API SystemExec
 #else
                pid_t pid;
 #endif
+               void init ();
                pthread_mutex_t write_lock;
 
-               int fdin; ///< file-descriptor for writing to child's STDIN. This variable is identical to pin[1] but also used as status check if the stdin pipe is open: <0 means closed.
                int pok[2];
                int pin[2];
                int pout[2];