|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 03 of 13 RFC] libxl: add libxl__forkexec function to libxl_exec
# HG changeset patch
# User Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>
# Date 1326564288 -3600
# Node ID 74c7175a9bcfb48e4db3ad9e92bdb5eaf4f05c31
# Parent b9a79fd1b93d44cf7b9ccf288c9f5df169adeb4d
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 b9a79fd1b93d -r 74c7175a9bcf tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c Mon Dec 26 22:25:02 2011 +0100
+++ b/tools/libxl/libxl_exec.c Sat Jan 14 19:04:48 2012 +0100
@@ -454,6 +454,42 @@ int libxl__spawn_check(libxl__gc *gc, li
return ERROR_FAIL;
}
+int libxl__forkexec(libxl__gc *gc, int stdinfd, int stdoutfd,
+ int stderrfd, const char *arg0, char **args,
+ char **env, const char *what)
+{
+ 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, arg0, args, env);
+ /* libxl__exec never returns */
+ default:
+ while (waitpid(pid, &status, 0) < 0) {
+ if (errno != EINTR) {
+ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
+ "waitpid failed for %s\n",
+ what);
+ rc = -1;
+ break;
+ }
+ }
+ if (status)
+ libxl_report_child_exitstatus(ctx, LIBXL__LOG_ERROR,
+ what, pid, status);
+ rc = status;
+ break;
+ }
+ return rc;
+}
+
/*
* Local variables:
* mode: C
diff -r b9a79fd1b93d -r 74c7175a9bcf tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h Mon Dec 26 22:25:02 2011 +0100
+++ b/tools/libxl/libxl_internal.h Sat Jan 14 19:04:48 2012 +0100
@@ -453,6 +453,21 @@ _hidden int libxl__spawn_check(libxl__gc
_hidden void libxl__exec(int stdinfd, int stdoutfd, int stderrfd,
const char *arg0, char **args, char **env); // logs errors,
never returns
+/*
+ * libxl__forkexec - Executes a file synchronously
+ * argv0: file name associated with the file being executed.
+ * args: list of arguments. See execvp(3) man page for more info.
+ * env: environment variables. See execvp(3) man page for more info.
+ *
+ * Returns -1 if the execution fails or the exit status, as reported
+ * by waitpid, on success.
+ *
+ * Logs errors.
+ */
+_hidden int libxl__forkexec(libxl__gc *gc, int stdinfd, int stdoutfd,
+ int stderrfd, const char *arg0, char **args,
+ char **env, const char *what);
+
/* 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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |