diff options
author | Ian Campbell <ian.campbell@citrix.com> | 2013-09-27 11:16:22 +0100 |
---|---|---|
committer | Ian Campbell <ian.campbell@citrix.com> | 2013-10-03 13:39:53 +0100 |
commit | 6ea993cbb173bbc4bb5f8095724735aa6439d164 (patch) | |
tree | 76cbb8d2ce5021d8f07d81c8c2d09ab1830d8257 | |
parent | a7fa7a4fd6b94c2ace19774ba4ba9f0185c2f2c1 (diff) | |
download | xen-6ea993cbb173bbc4bb5f8095724735aa6439d164.tar.gz xen-6ea993cbb173bbc4bb5f8095724735aa6439d164.tar.bz2 xen-6ea993cbb173bbc4bb5f8095724735aa6439d164.zip |
xl: fork before execing vncviewer
Otherwise we don't daemonize to monitor the domain.
Heavily cargo-culted from autoconnect-console and only compile tested.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Tested-by: Olaf Hering <olaf@aepfle.de>
-rw-r--r-- | tools/libxl/xl.h | 2 | ||||
-rw-r--r-- | tools/libxl/xl_cmdimpl.c | 33 |
2 files changed, 33 insertions, 2 deletions
diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h index e72a7d2127..e005c393da 100644 --- a/tools/libxl/xl.h +++ b/tools/libxl/xl.h @@ -128,7 +128,7 @@ typedef struct { } xlchild; typedef enum { - child_console, child_waitdaemon, child_migration, + child_console, child_waitdaemon, child_migration, child_vncviewer, child_max } xlchildnum; diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 642b130864..a91b42744c 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -194,6 +194,37 @@ static int vncviewer(uint32_t domid, int autopass) return 1; } +static void vncviewer_child_report(void) +{ + if (xl_child_pid(child_vncviewer)) { + int status; + pid_t got = xl_waitpid(child_vncviewer, &status, 0); + if (got < 0) + perror("xl: warning, failed to waitpid for vncviewer child"); + else if (status) + libxl_report_child_exitstatus(ctx, XTL_ERROR, "vncviewer child", + xl_child_pid(child_vncviewer), status); + } +} + +static void autoconnect_vncviewer(uint32_t domid, int autopass) +{ + vncviewer_child_report(); + + pid_t pid = xl_fork(child_vncviewer); + if (pid < 0) { + perror("unable to fork vncviewer"); + return; + } else if (pid > 0) + return; + + postfork(); + + sleep(1); + vncviewer(domid, autopass); + _exit(1); +} + static int acquire_lock(void) { int rc; @@ -2093,7 +2124,7 @@ start: goto out; if (dom_info->vnc) - vncviewer(domid, vncautopass); + autoconnect_vncviewer(domid, vncautopass); if (need_daemon) { char *fullname, *name; |