WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 6 of 9] libxl/xl: exec xenconsole in current process,

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH 6 of 9] libxl/xl: exec xenconsole in current process, defer decision to fork to caller
From: Ian Campbell <ian.campbell@xxxxxxxxxx>
Date: Mon, 12 Jul 2010 15:01:42 +0100
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Mon, 12 Jul 2010 07:11:03 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1278943296@xxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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>

diff -r 4b41b5e7532c -r bcea013ddd5a tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Mon Jul 12 14:56:37 2010 +0100
+++ b/tools/libxl/libxl.c       Mon Jul 12 14:56:37 2010 +0100
@@ -786,12 +786,12 @@
     return 0;
 }
 
-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)
 {
-    char *cmd = libxl_sprintf(
-        ctx, "%s/xenconsole %d --num %d",
-        libxl_private_bindir_path(), domid, cons_num);
-    return (system(cmd) != 0) ? ERROR_FAIL : 0;
+    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 4b41b5e7532c -r bcea013ddd5a tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Mon Jul 12 14:56:37 2010 +0100
+++ b/tools/libxl/libxl.h       Mon Jul 12 14:56:37 2010 +0100
@@ -358,7 +358,7 @@
 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 4b41b5e7532c -r bcea013ddd5a tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c  Mon Jul 12 14:56:37 2010 +0100
+++ b/tools/libxl/xl_cmdimpl.c  Mon Jul 12 14:56:37 2010 +0100
@@ -931,12 +931,45 @@
     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 @@
         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 @@
     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 opt = 0, cons_num = 0;
-    char *p = NULL;
 
     while ((opt = getopt(argc, argv, "hn:")) != -1) {
         switch (opt) {
@@ -1592,10 +1624,10 @@
         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 @@
     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 @@
     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-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel