Add a new function to let caller do some tuning thanks to a callback before exec().
Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- include/io/channel-command.h | 18 ++++++++++++++++++ io/channel-command.c | 33 ++++++++++++++++++++++++++------- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/include/io/channel-command.h b/include/io/channel-command.h index 336d47fa5c..96c833daab 100644 --- a/include/io/channel-command.h +++ b/include/io/channel-command.h @@ -71,6 +71,24 @@ qio_channel_command_new_pid(int writefd, int readfd, pid_t pid); +/** + * qio_channel_command_new_spawn_with_pre_exec: + * @argv: the NULL terminated list of command arguments + * @flags: the I/O mode, one of O_RDONLY, O_WRONLY, O_RDWR + * @errp: pointer to a NULL-initialized error object + * + * Create a channel for performing I/O with the + * command to be spawned with arguments @argv. + * + * Returns: the command channel object, or NULL on error + */ +QIOChannelCommand * +qio_channel_command_new_spawn_with_pre_exec(const char *const argv[], + int flags, + void (*pre_exec_cb)(void *), + void *data, + Error **errp); + /** * qio_channel_command_new_spawn: * @argv: the NULL terminated list of command arguments diff --git a/io/channel-command.c b/io/channel-command.c index 3e7eb17eff..05903ff194 100644 --- a/io/channel-command.c +++ b/io/channel-command.c @@ -46,9 +46,12 @@ qio_channel_command_new_pid(int writefd, #ifndef WIN32 QIOChannelCommand * -qio_channel_command_new_spawn(const char *const argv[], - int flags, - Error **errp) +qio_channel_command_new_spawn_with_pre_exec(const char *const argv[], + int flags, + void (*pre_exec_cb)(void *), + void *data, + Error **errp) + { pid_t pid = -1; int stdinfd[2] = { -1, -1 }; @@ -104,6 +107,10 @@ qio_channel_command_new_spawn(const char *const argv[], close(devnull); } + if (pre_exec_cb) { + pre_exec_cb(data); + } + execv(argv[0], (char * const *)argv); _exit(1); } @@ -139,12 +146,13 @@ qio_channel_command_new_spawn(const char *const argv[], } return NULL; } - #else /* WIN32 */ QIOChannelCommand * -qio_channel_command_new_spawn(const char *const argv[], - int flags, - Error **errp) +qio_channel_command_new_spawn_with_pre_exec(const char *const argv[], + int flags, + void (*pre_exec_cb)(void *), + void *data, + Error **errp) { error_setg_errno(errp, ENOSYS, "Command spawn not supported on this platform"); @@ -152,6 +160,17 @@ qio_channel_command_new_spawn(const char *const argv[], } #endif /* WIN32 */ + +QIOChannelCommand * +qio_channel_command_new_spawn(const char *const argv[], + int flags, + Error **errp) +{ + return qio_channel_command_new_spawn_with_pre_exec(argv, flags, + NULL, NULL, errp); +} + + #ifndef WIN32 static int qio_channel_command_abort(QIOChannelCommand *ioc, Error **errp) -- 2.18.0.rc1