struct process;
struct procset;
+struct process_info;
typedef void (*process_exit_cb)(struct process *);
+struct process_stdout {
+ size_t len;
+ char *buf;
+};
+
struct process {
/* caller-provided configuration */
const char *path;
const char **argv;
bool keep_stdout;
bool add_stderr;
+ bool raw_stdout;
process_exit_cb exit_cb;
void *data;
+ waiter_cb stdout_cb;
+ void *stdout_data;
+ char *pipe_stdin;
/* runtime data */
pid_t pid;
/* post-execution information */
int exit_status;
+ bool cancelled;
};
/* Process management system init. process_init must be called before
*/
void process_release(struct process *process);
-/* Synchronous interface. These functions will all block while waiting for
- * the process to exit.
+/* Synchronous interface. The process_run_sync, process_run_simple and
+ * process_get_stdout functions will all block while waiting for the child
+ * process to exit. Calls to the variadic versions must have a NULL terminating
+ * argument. For the process_get_stdout calls stderr will go to the log.
*/
int process_run_sync(struct process *process);
-int process_run_simple_argv(void *ctx, const char *argv[]);
-int process_run_simple(void *ctx, const char *name, ...)
- __attribute__((sentinel(0)));
+int process_get_stdout_argv(void *ctx, struct process_stdout **stdout,
+ const char *argv[]);
+int process_get_stdout(void *ctx, struct process_stdout **stdout,
+ const char *path, ...) __attribute__((sentinel(0)));
+
+static inline int process_run_simple_argv(void *ctx, const char *argv[])
+{
+ return process_get_stdout_argv(ctx, NULL, argv);
+}
+#define process_run_simple(_ctx, _path, args...) \
+ process_get_stdout(_ctx, NULL, _path, args)
+
/* Asynchronous interface. When a process is run with process_run_async, the
* function returns without wait()ing for the child process to exit. If the
int process_run_async(struct process *process);
void process_stop_async(struct process *process);
+void process_stop_async_all(void);
/* helper function to determine if a process exited cleanly, with a non-zero
* exit status */
bool process_exit_ok(struct process *process);
+/* Functions to assist callers using a custom stdout callback */
+struct process *procinfo_get_process(struct process_info *procinfo);
+int process_process_stdout(struct process_info *procinfo, char **line);
+
#endif /* PROCESS_H */