⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 support-xm-console

📁 xen虚拟机源代码安装包
💻
字号:
Index: ioemu/vl.c===================================================================--- ioemu.orig/vl.c	2007-05-03 19:12:00.000000000 +0100+++ ioemu/vl.c	2007-05-03 19:14:57.000000000 +0100@@ -1671,26 +1671,108 @@     return chr; } +/*+ * Create a store entry for a device (e.g., monitor, serial/parallel lines).+ * The entry is <domain-path><storeString>/tty and the value is the name+ * of the pty associated with the device.+ */+static int store_dev_info(char *devName, int domid,+                          CharDriverState *cState, char *storeString)+{+    int xc_handle;+    struct xs_handle *xs;+    char *path;+    char *newpath;+    FDCharDriver *s;+    char *pts;++    /* Check for valid arguments (at least, prevent segfaults). */+    if ((devName == NULL) || (cState == NULL) || (storeString == NULL)) {+        fprintf(logfile, "%s - invalid arguments\n", __FUNCTION__);+        return EINVAL;+    }++    /*+     * Only continue if we're talking to a pty+     * Actually, the following code works for any CharDriverState using+     * FDCharDriver, but we really only care about pty's here+     */+    if (strcmp(devName, "pty"))+        return 0;++    s = cState->opaque;+    if (s == NULL) {+        fprintf(logfile, "%s - unable to retrieve fd for '%s'/'%s'\n",+                __FUNCTION__, storeString, devName);+        return EBADF;+    }++    pts = ptsname(s->fd_in);+    if (pts == NULL) {+        fprintf(logfile, "%s - unable to determine ptsname '%s'/'%s', "+                "error %d (%s)\n",+                __FUNCTION__, storeString, devName, errno, strerror(errno));+        return errno;+    }++    /* We now have everything we need to set the xenstore entry. */+    xs = xs_daemon_open();+    if (xs == NULL) {+        fprintf(logfile, "Could not contact XenStore\n");+        return -1;+    }++    xc_handle = xc_interface_open();+    if (xc_handle == -1) {+        fprintf(logfile, "xc_interface_open() error\n");+        return -1;+    }++    path = xs_get_domain_path(xs, domid);+    if (path == NULL) {+        fprintf(logfile, "xs_get_domain_path() error\n");+        return -1;+    }+    newpath = realloc(path, (strlen(path) + strlen(storeString) ++                             strlen("/tty") + 1));+    if (newpath == NULL) {+        free(path); /* realloc errors leave old block */+        fprintf(logfile, "realloc error\n");+        return -1;+    }+    path = newpath;++    strcat(path, storeString);+    strcat(path, "/tty");+    if (!xs_write(xs, XBT_NULL, path, pts, strlen(pts))) {+        fprintf(logfile, "xs_write for '%s' fail", storeString);+        return -1;+    }++    free(path);+    xs_daemon_close(xs);+    close(xc_handle);++    return 0;+}+ #if defined(__linux__) static CharDriverState *qemu_chr_open_pty(void) {     struct termios tty;-    char slave_name[1024];     int master_fd, slave_fd;          /* Not satisfying */-    if (openpty(&master_fd, &slave_fd, slave_name, NULL, NULL) < 0) {+    if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) < 0) {         return NULL;     }     -    /* Disabling local echo and line-buffered output */-    tcgetattr (master_fd, &tty);-    tty.c_lflag &= ~(ECHO|ICANON|ISIG);-    tty.c_cc[VMIN] = 1;-    tty.c_cc[VTIME] = 0;-    tcsetattr (master_fd, TCSAFLUSH, &tty);+    /* Set raw attributes on the pty. */+    cfmakeraw(&tty);+    tcsetattr(slave_fd, TCSAFLUSH, &tty);+    +    fprintf(stderr, "char device redirected to %s\n", ptsname(master_fd)); -    fprintf(stderr, "char device redirected to %s\n", slave_name);     return qemu_chr_open_fd(master_fd, master_fd); } @@ -6799,7 +6881,9 @@                 break;             case QEMU_OPTION_nographic:                 pstrcpy(monitor_device, sizeof(monitor_device), "stdio");-                pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "stdio");+                if(!strcmp(serial_devices[0], "vc"))+                    pstrcpy(serial_devices[0], sizeof(serial_devices[0]),+                            "stdio");                 nographic = 1;                 break;             case QEMU_OPTION_kernel:@@ -7365,17 +7449,24 @@         fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);         exit(1);     }+    store_dev_info(monitor_device, domid, monitor_hd, "/monitor");     monitor_init(monitor_hd, !nographic);      for(i = 0; i < MAX_SERIAL_PORTS; i++) {         const char *devname = serial_devices[i];         if (devname[0] != '\0' && strcmp(devname, "none")) {+            char buf[16];             serial_hds[i] = qemu_chr_open(devname);             if (!serial_hds[i]) {                 fprintf(stderr, "qemu: could not open serial device '%s'\n",                          devname);                 exit(1);             }+            snprintf(buf, sizeof(buf), "/serial/%d", i);+            store_dev_info(serial_devices[i], domid, serial_hds[i], buf);+            if (i == 0) /* serial 0 is also called the console */+                store_dev_info(serial_devices[i], domid,+                               serial_hds[i], "/console");             if (!strcmp(devname, "vc"))                 qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);         }@@ -7384,12 +7475,15 @@     for(i = 0; i < MAX_PARALLEL_PORTS; i++) {         const char *devname = parallel_devices[i];         if (devname[0] != '\0' && strcmp(devname, "none")) {+            char buf[16];             parallel_hds[i] = qemu_chr_open(devname);             if (!parallel_hds[i]) {                 fprintf(stderr, "qemu: could not open parallel device '%s'\n",                          devname);                 exit(1);             }+            snprintf(buf, sizeof(buf), "/parallel/%d", i);+            store_dev_info(parallel_devices[i], domid, parallel_hds[i], buf);             if (!strcmp(devname, "vc"))                 qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);         }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -