X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=lib%2Fprocess%2Fprocess.h;fp=lib%2Fprocess%2Fprocess.h;h=9473a0d492b00e0e644b4e957fa78f1f8599764a;hp=003ff8ed1329d282942b03bc7a56962d683e4192;hb=51fb307dfdbb8f238d15520a74e33ef4fea52e4d;hpb=214de247193d14a2de014e5e4cad1ab3df956c13 diff --git a/lib/process/process.h b/lib/process/process.h index 003ff8e..9473a0d 100644 --- a/lib/process/process.h +++ b/lib/process/process.h @@ -27,6 +27,11 @@ 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; @@ -63,13 +68,24 @@ struct process *process_create(void *ctx); */ 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