[stgt] [PATCH 1/5] Prepare run_ext_program() for getting stdout to the caller
FUJITA Tomonori
fujita.tomonori at lab.ntt.co.jp
Tue Sep 7 02:49:44 CEST 2010
Sorry for the delay,
On Wed, 01 Sep 2010 17:45:51 -0700
Chandra Seetharaman <sekharan at us.ibm.com> wrote:
> int run_ext_program(const char *cmd,
> - void (*callback)(void *data, int result), void *data)
> + void (*callback)(void *data, int result), void *data,
> + char *output, int op_len)
We might want to run the program asynchronously? We don't need to
support the feature now but adding the flags argument for it might be
nice?
> {
> pid_t pid;
> - int fds[2], ret;
> - struct ext_prog_info *ex;
> - ssize_t ignored;
> -
> - ex = zalloc(sizeof(*ex));
> - if (!ex)
> - return -ENOMEM;
> + int fds[2], ret, i;
> + char *pos, arg[256];
> + char *argv[sizeof(arg) / 2];
> +
> + i = 0;
> + pos = arg;
> + str_spacecpy(&pos, cmd);
> + if (strchr(cmd, ' ')) {
> + while (pos != '\0')
> + argv[i++] = strsep(&pos, " ");
> + } else
> + argv[i++] = arg;
> + argv[i] = NULL;
>
> ret = pipe(fds);
> - if (ret < 0) {
> - free(ex);
> + if (ret < 0)
> return ret;
> - }
>
> eprintf("%d %d\n", fds[0], fds[1]);
>
> - ex->callback = callback;
> - ex->data = data;
> -
> - tgt_event_add(fds[0], EPOLLIN, run_ext_callback, ex);
> -
> pid = fork();
> if (pid < 0)
> return pid;
>
> if (!pid) {
> - ret = system(cmd);
> - ignored = write(fds[1], &ret, sizeof(ret));
> - return 0;
> + close(1);
> + dup(fds[1]);
> + close(fds[0]);
> + ret = execv(argv[0], argv);
> + exit(-1);
> + } else {
> + close(fds[1]);
> + waitpid(pid, &i, 0);
> + ret = read(fds[0], output, op_len);
> + if (ret < 0)
> + eprintf("failed to get the output from <%s>.", cmd);
> +
> + if (callback)
> + callback(data, WEXITSTATUS(i));
> + close(fds[0]);
> }
>
> - close(fds[1]);
> -
> return 0;
> }
>
> Index: tgt-1.0.8/usr/tgtd.h
> ===================================================================
> --- tgt-1.0.8.orig/usr/tgtd.h
> +++ tgt-1.0.8/usr/tgtd.h
> @@ -335,5 +335,8 @@ struct event_data {
> };
>
> int run_ext_program(const char *cmd,
> - void (*callback)(void *data, int result), void *data);
> + void (*callback)(void *data, int result), void *data,
> + char *output, int op_len);
> +#define call_program(cmd, output, len) \
> + run_ext_program(cmd, NULL, NULL, output, len)
> #endif
I think that you can simply rename the function since nobody uses
run_ext_program().
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the stgt
mailing list