[stgt] [PATCH 1/5] Prepare run_ext_program() for getting stdout to the caller
Chandra Seetharaman
sekharan at us.ibm.com
Tue Sep 7 22:41:32 CEST 2010
On Tue, 2010-09-07 at 09:49 +0900, FUJITA Tomonori wrote:
> 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?
I will add the flags argument now (and delay the implementation of
asynchronization support to later, when needed)
>
>
> > {
> > 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