# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1172757445 0
# Node ID 42aa0100574b665db9f4fa9dfe97b222acbab5eb
# Parent 780ef7701772f95205a5f08c4846b3dff5dc6b7a
hvm: Clean up console-information passing via xenstore.
Each serial, parallel and monitor device in qemu that is connected to
a pty creates a xenstore node of the form:
<domain-path>/monitor/tty
<domain-path>/serial/<n>/tty
<domain-path>/parallel/<n>/tty
In addition, serial/0 (com1) also registers its information at:
<domain-path>/console/tty
Also fix a realloc() failure memory leak.
Signed-off-by: Ben Thomas <ben@xxxxxxxxxxxxxxx>
---
tools/ioemu/vl.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 60 insertions(+), 7 deletions(-)
diff -r 780ef7701772 -r 42aa0100574b tools/ioemu/vl.c
--- a/tools/ioemu/vl.c Thu Mar 01 13:48:31 2007 +0000
+++ b/tools/ioemu/vl.c Thu Mar 01 13:57:25 2007 +0000
@@ -1565,12 +1565,51 @@ CharDriverState *qemu_chr_open_stdio(voi
return chr;
}
-int store_console_dev(int domid, char *pts)
+/*
+ * 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");
@@ -1588,14 +1627,19 @@ int store_console_dev(int domid, char *p
fprintf(logfile, "xs_get_domain_path() error\n");
return -1;
}
- path = realloc(path, strlen(path) + strlen("/console/tty") + 1);
- if (path == NULL) {
+ 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;
}
- strcat(path, "/console/tty");
+ path = newpath;
+
+ strcat(path, storeString);
+ strcat(path, "/tty");
if (!xs_write(xs, XBT_NULL, path, pts, strlen(pts))) {
- fprintf(logfile, "xs_write for console fail");
+ fprintf(logfile, "xs_write for '%s' fail", storeString);
return -1;
}
@@ -1622,7 +1666,6 @@ CharDriverState *qemu_chr_open_pty(void)
tcsetattr(slave_fd, TCSAFLUSH, &tty);
fprintf(stderr, "char device redirected to %s\n", ptsname(master_fd));
- store_console_dev(domid, ptsname(master_fd));
return qemu_chr_open_fd(master_fd, master_fd);
}
@@ -6694,16 +6737,23 @@ int main(int argc, char **argv)
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++) {
if (serial_devices[i][0] != '\0') {
+ char buf[16];
serial_hds[i] = qemu_chr_open(serial_devices[i]);
if (!serial_hds[i]) {
fprintf(stderr, "qemu: could not open serial device '%s'\n",
serial_devices[i]);
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(serial_devices[i], "vc"))
qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
}
@@ -6711,12 +6761,15 @@ int main(int argc, char **argv)
for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
if (parallel_devices[i][0] != '\0') {
+ char buf[16];
parallel_hds[i] = qemu_chr_open(parallel_devices[i]);
if (!parallel_hds[i]) {
fprintf(stderr, "qemu: could not open parallel device '%s'\n",
parallel_devices[i]);
exit(1);
}
+ snprintf(buf, sizeof(buf), "/parallel/%d", i);
+ store_dev_info(parallel_devices[i], domid, parallel_hds[i], buf);
if (!strcmp(parallel_devices[i], "vc"))
qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|