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 |