# HG changeset patch
# User Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
# Date 1279122033 -3600
# Node ID ad6448ee4bb6b318fa7e0231ddc0c42bf785ccbf
# Parent 5c3da88b457ac22bb4d5adcf7729269836fe30d9
libxl, xl: exec xenconsole in current process, defer decision to fork to caller
Use this to run xenconsole as the foreground process and move the
connection to the console in the "create -c" case early enough to be
able to view output from the bootloader. This behaviour is consistent
with how both "xm console" and "xm create -c" operate.
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
---
tools/libxl/libxl.c | 12 ++++-----
tools/libxl/libxl.h | 2 -
tools/libxl/xl_cmdimpl.c | 61 +++++++++++++++++++++++++++++++++--------------
3 files changed, 51 insertions(+), 24 deletions(-)
diff -r 5c3da88b457a -r ad6448ee4bb6 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c Wed Jul 14 16:40:09 2010 +0100
+++ b/tools/libxl/libxl.c Wed Jul 14 16:40:33 2010 +0100
@@ -786,12 +786,12 @@ int libxl_domain_destroy(struct libxl_ct
return 0;
}
-int libxl_console_attach(struct libxl_ctx *ctx, uint32_t domid, int cons_num)
-{
- char *cmd = libxl_sprintf(
- ctx, "%s/xenconsole %d --num %d",
- libxl_private_bindir_path(), domid, cons_num);
- return (system(cmd) != 0) ? ERROR_FAIL : 0;
+int libxl_console_exec(struct libxl_ctx *ctx, uint32_t domid, int cons_num)
+{
+ char *p = libxl_sprintf(ctx, "%s/xenconsole", libxl_private_bindir_path());
+ char *domid_s = libxl_sprintf(ctx, "%d", domid);
+ char *cons_num_s = libxl_sprintf(ctx, "%d", cons_num);
+ return execl(p, p, domid_s, "--num", cons_num_s, (void *)NULL) == 0 ? 0 :
ERROR_FAIL;
}
static char ** libxl_build_device_model_args(struct libxl_ctx *ctx,
diff -r 5c3da88b457a -r ad6448ee4bb6 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h Wed Jul 14 16:40:09 2010 +0100
+++ b/tools/libxl/libxl.h Wed Jul 14 16:40:33 2010 +0100
@@ -358,7 +358,7 @@ int libxl_domain_setmaxmem(struct libxl_
int libxl_domain_setmaxmem(struct libxl_ctx *ctx, uint32_t domid, uint32_t
target_memkb);
int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t
target_memkb, int enforce);
-int libxl_console_attach(struct libxl_ctx *ctx, uint32_t domid, int cons_num);
+int libxl_console_exec(struct libxl_ctx *ctx, uint32_t domid, int cons_num);
int libxl_domain_info(struct libxl_ctx*, struct libxl_dominfo *info_r,
uint32_t domid);
diff -r 5c3da88b457a -r ad6448ee4bb6 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c Wed Jul 14 16:40:09 2010 +0100
+++ b/tools/libxl/xl_cmdimpl.c Wed Jul 14 16:40:33 2010 +0100
@@ -931,12 +931,45 @@ static void *xrealloc(void *ptr, size_t
return r;
}
+int autoconnect_console(int cons_num)
+{
+ int status;
+ pid_t pid, r;
+
+ /*
+ * Fork for xenconsole. We exec xenconsole in the foreground
+ * process allowing it to retain the tty. xl continues in the
+ * child. The xenconsole client uses a xenstore watch to wait for
+ * the console to be setup so there is no race.
+ */
+ pid = fork();
+ if (pid < 0) {
+ perror("unable to fork xenconsole");
+ return ERROR_FAIL;
+ } else if (pid == 0)
+ return 0;
+
+ /*
+ * Catch failure of the create process.
+ */
+ sleep(1);
+ r = waitpid(pid, &status, WNOHANG);
+ if (r > 0 && WIFEXITED(status) && WEXITSTATUS(status) != 0)
+ _exit(WEXITSTATUS(status));
+
+ libxl_console_exec(&ctx, domid, cons_num);
+ /* Do not return. xl continued in child process */
+ fprintf(stderr, "Unable to attach console\n");
+ _exit(1);
+}
+
struct domain_create {
int debug;
int daemonize;
int paused;
int dryrun;
int quiet;
+ int console_autoconnect;
const char *config_file;
const char *extra_config; /* extra config string */
const char *restore_file;
@@ -1118,6 +1151,12 @@ start:
perror("cannot save config file");
ret = ERROR_FAIL;
goto error_out;
+ }
+
+ if (dom_info->console_autoconnect) {
+ ret = autoconnect_console(0);
+ if (ret)
+ goto error_out;
}
if (!restore_file || !need_daemon) {
@@ -1467,12 +1506,6 @@ int main_memset(int argc, char **argv)
exit(0);
}
-void console(char *p, int cons_num)
-{
- find_domain(p);
- libxl_console_attach(&ctx, domid, cons_num);
-}
-
void cd_insert(char *dom, char *virtdev, char *phys)
{
libxl_device_disk disk;
@@ -1570,7 +1603,6 @@ int main_console(int argc, char **argv)
int main_console(int argc, char **argv)
{
int opt = 0, cons_num = 0;
- char *p = NULL;
while ((opt = getopt(argc, argv, "hn:")) != -1) {
switch (opt) {
@@ -1592,10 +1624,10 @@ int main_console(int argc, char **argv)
exit(2);
}
- p = argv[optind];
-
- console(p, cons_num);
- exit(0);
+ find_domain(argv[optind]);
+ libxl_console_exec(&ctx, domid, 0);
+ fprintf(stderr, "Unable to attach console\n");
+ return 1;
}
void pcilist(char *dom)
@@ -2672,7 +2704,6 @@ int main_create(int argc, char **argv)
char *filename = NULL;
char *p, extra_config[1024];
struct domain_create dom_info;
- char dom[10]; /* long enough */
int paused = 0, debug = 0, daemonize = 1, console_autoconnect = 0,
dryrun = 0, quite = 0;
int opt, rc;
@@ -2747,15 +2778,11 @@ int main_create(int argc, char **argv)
dom_info.config_file = filename;
dom_info.extra_config = extra_config;
dom_info.migrate_fd = -1;
+ dom_info.console_autoconnect = console_autoconnect;
rc = create_domain(&dom_info);
if (rc < 0)
exit(-rc);
-
- if (console_autoconnect) {
- snprintf(dom, sizeof(dom), "%d", rc);
- console(dom, 0);
- }
exit(0);
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|