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>
This commit is contained in:
Ian Campbell committed 2013-10-03 13:39:53 +01:00
1 parent a7fa7a4fd6
commit 6ea993cbb1
2 files changed
+33 -2

No files matched your search

+1 -1
View File
@@ -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;
+32 -1
View File
@@ -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;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.