[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] libxl, xl: exec xenconsole in current process, defer decision to fork to caller
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |