]> git.proxmox.com Git - mirror_qemu.git/commitdiff
Change the usb-serial product ID to a more widely recognised value (Samuel Thibault).
authorbalrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 19 Jan 2008 13:00:43 +0000 (13:00 +0000)
committerbalrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 19 Jan 2008 13:00:43 +0000 (13:00 +0000)
Implement chr_close callback for "stdio" so that it can be closed and reopened.
Free chr devices after they're closed.

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3927 c046a42c-6fe2-441c-8c8c-71466251a162

hw/usb-serial.c
qemu-doc.texi
vl.c

index 378d75126078ac15c3b63cbd62f8fce65c69e148..b666c99be78664f31674b1b8901cceb7f6fd7410 100644 (file)
@@ -486,7 +486,7 @@ USBDevice *usb_serial_init(const char *filename)
 {
     USBSerialState *s;
     CharDriverState *cdrv;
-    unsigned short vendorid = 0x0403, productid = 0xFF00;
+    unsigned short vendorid = 0x0403, productid = 0x6001;
 
     while (*filename && *filename != ':') {
         const char *p;
index 6fe79454863df7dea319b1b8c396076e6b0a4c63..4b9ea606dbab4e9a8949e5053b878963c63b8e62 100644 (file)
@@ -1594,7 +1594,7 @@ Standard USB keyboard.  Will override the PS/2 keyboard (if present).
 Serial converter. This emulates an FTDI FT232BM chip connected to host character
 device @var{dev}. The available character devices are the same as for the
 @code{-serial} option. The @code{vendorid} and @code{productid} options can be
-used to override the default 0403:FF00. For instance, 
+used to override the default 0403:6001. For instance, 
 @example
 usb_add serial:productid=FA00:tcp:192.168.0.2:4444
 @end example
diff --git a/vl.c b/vl.c
index 8cbcd38c21ab3d6593195bc7a5c6fb2790d52db3..19cd928d766a03b3b7f5d20d501ed769c623c4bc 100644 (file)
--- a/vl.c
+++ b/vl.c
@@ -2050,6 +2050,20 @@ static void fd_chr_update_read_handler(CharDriverState *chr)
     }
 }
 
+static void fd_chr_close(struct CharDriverState *chr)
+{
+    FDCharDriver *s = chr->opaque;
+
+    if (s->fd_in >= 0) {
+        if (nographic && s->fd_in == 0) {
+        } else {
+            qemu_set_fd_handler2(s->fd_in, NULL, NULL, NULL, NULL);
+        }
+    }
+
+    qemu_free(s);
+}
+
 /* open a character device to a unix fd */
 static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
 {
@@ -2069,6 +2083,7 @@ static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
     chr->opaque = s;
     chr->chr_write = fd_chr_write;
     chr->chr_update_read_handler = fd_chr_update_read_handler;
+    chr->chr_close = fd_chr_close;
 
     qemu_chr_reset(chr);
 
@@ -2155,6 +2170,7 @@ static void stdio_read(void *opaque)
 /* init terminal so that we can grab keys */
 static struct termios oldtty;
 static int old_fd0_flags;
+static int term_atexit_done;
 
 static void term_exit(void)
 {
@@ -2184,11 +2200,20 @@ static void term_init(void)
 
     tcsetattr (0, TCSANOW, &tty);
 
-    atexit(term_exit);
+    if (!term_atexit_done++)
+        atexit(term_exit);
 
     fcntl(0, F_SETFL, O_NONBLOCK);
 }
 
+static void qemu_chr_close_stdio(struct CharDriverState *chr)
+{
+    term_exit();
+    stdio_nb_clients--;
+    qemu_set_fd_handler2(0, NULL, NULL, NULL, NULL);
+    fd_chr_close(chr);
+}
+
 static CharDriverState *qemu_chr_open_stdio(void)
 {
     CharDriverState *chr;
@@ -2196,6 +2221,7 @@ static CharDriverState *qemu_chr_open_stdio(void)
     if (stdio_nb_clients >= STDIO_MAX_CLIENTS)
         return NULL;
     chr = qemu_chr_open_fd(0, 1);
+    chr->chr_close = qemu_chr_close_stdio;
     qemu_set_fd_handler2(0, stdio_read_poll, stdio_read, NULL, chr);
     stdio_nb_clients++;
     term_init();
@@ -3418,6 +3444,7 @@ void qemu_chr_close(CharDriverState *chr)
 {
     if (chr->chr_close)
         chr->chr_close(chr);
+    qemu_free(chr);
 }
 
 /***********************************************************/