aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hw/usb-serial.c2
-rw-r--r--qemu-doc.texi2
-rw-r--r--vl.c29
3 files changed, 30 insertions, 3 deletions
diff --git a/hw/usb-serial.c b/hw/usb-serial.c
index 378d751260..b666c99be7 100644
--- a/hw/usb-serial.c
+++ b/hw/usb-serial.c
@@ -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;
diff --git a/qemu-doc.texi b/qemu-doc.texi
index 6fe7945486..4b9ea606db 100644
--- a/qemu-doc.texi
+++ b/qemu-doc.texi
@@ -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 8cbcd38c21..19cd928d76 100644
--- 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);
}
/***********************************************************/