[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3 of 9 v2] libxl: add libxl__forkexec function to libxl_exec
On Fri, 2011-11-18 at 11:59 +0000, Roger Pau Monne wrote: > # HG changeset patch > # User Roger Pau Monne <roger.pau@xxxxxxxxxxxxx> > # Date 1321609614 -3600 > # Node ID ec94a7e4983ad6338db20fa0777a85507b582607 > # Parent 9e8abd626484f82a95d0edc07834ae287bc9467a > libxl: add libxl__forkexec function to libxl_exec > > Add a new function to libxl_exec that performs a fork and executes > the passed arguments using libxl__exec. > > Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx> > > diff -r 9e8abd626484 -r ec94a7e4983a tools/libxl/libxl_exec.c > --- a/tools/libxl/libxl_exec.c Fri Sep 30 14:38:55 2011 +0200 > +++ b/tools/libxl/libxl_exec.c Fri Nov 18 10:46:54 2011 +0100 > @@ -450,6 +450,40 @@ int libxl__spawn_check(libxl__gc *gc, li > return ERROR_FAIL; > } > > +int libxl__forkexec(libxl__gc *gc, int stdinfd, int stdoutfd, > + int stderrfd, char **args) > +{ > + libxl_ctx *ctx = libxl__gc_owner(gc); > + int status; > + int rc = 0; > + pid_t pid = fork(); > + > + switch (pid) { > + case -1: > + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "fork failed\n"); > + rc = -1; > + break; > + case 0: > + libxl__exec(stdinfd, stdoutfd, stderrfd, args[0], args); > + /* libxl__exec never returns */ > + default: > + while (waitpid(pid, &status, 0) < 0) { > + if (errno != EINTR) { > + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "waitpid failed\n"); > + rc = -1; > + break; > + } > + } > + if (WIFEXITED(status)) { > + rc = WEXITSTATUS(status); > + } else { > + rc = -1; > + } > + break; > + } > + return rc; > +} > + > /* > * Local variables: > * mode: C > diff -r 9e8abd626484 -r ec94a7e4983a tools/libxl/libxl_internal.h > --- a/tools/libxl/libxl_internal.h Fri Sep 30 14:38:55 2011 +0200 > +++ b/tools/libxl/libxl_internal.h Fri Nov 18 10:46:54 2011 +0100 > @@ -400,6 +400,20 @@ _hidden int libxl__spawn_check(libxl__gc > _hidden void libxl__exec(int stdinfd, int stdoutfd, int stderrfd, > const char *arg0, char **args); // logs errors, never returns > > +/* > + * libxl__forkexec - Executes a file synchronously > + * gc: allocation pool > + * stdinfd, stdoutfd, stderrfd: fds to pass to libxl__exec > + * args: file to execute and arguments to pass in the following format > + * args[0]: file to execute > + * args[1]: first argument to pass to the called program > + * args[n]: nth argument to pass to the called program args[n] must be NULL, right? > + * > + * Returns 0 on success, and < 0 on error. > + */ > +_hidden int libxl__forkexec(libxl__gc *gc, int stdinfd, int stdoutfd, > + int stderrfd, char **args); > + > /* from xl_create */ > _hidden int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info > *info, uint32_t *domid); > _hidden int libxl__domain_build(libxl__gc *gc, > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |