char-win: close file handle except with console
authorMarc-André Lureau <marcandre.lureau@redhat.com>
Wed, 4 Jan 2017 20:34:42 +0000 (21:34 +0100)
committerMarc-André Lureau <marcandre.lureau@redhat.com>
Fri, 2 Jun 2017 07:33:52 +0000 (11:33 +0400)
Only the console handle shouldn't be closed, however, the "file" handle
should.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
chardev/char-console.c
chardev/char-file.c
chardev/char-win.c
chardev/char-win.h

index c824937fe6cfca396c9be1ba7bcfee865222e2de..8d972c150690a45961611eb62ed8aa6b8c8bf81d 100644 (file)
@@ -29,7 +29,7 @@ static void qemu_chr_open_win_con(Chardev *chr,
                                   bool *be_opened,
                                   Error **errp)
 {
-    qemu_chr_open_win_file(chr, GetStdHandle(STD_OUTPUT_HANDLE));
+    win_chr_set_file(chr, GetStdHandle(STD_OUTPUT_HANDLE), true);
 }
 
 static void char_console_class_init(ObjectClass *oc, void *data)
index 8bae25350dda6a6b3e9e8db47c1b84dcb0b5a0f2..aed4ae15693315ade0a501bbde421c44720b7603 100644 (file)
@@ -65,7 +65,7 @@ static void qmp_chardev_open_file(Chardev *chr,
         return;
     }
 
-    qemu_chr_open_win_file(chr, out);
+    win_chr_set_file(chr, out, false);
 #else
     int flags, in = -1, out;
 
index a7e3296909c885a8566d7f56408b9d643dd53eca..ec9a731be95305c96cb1f9df2cc495d2cc2bc05b 100644 (file)
@@ -192,17 +192,13 @@ static void char_win_finalize(Object *obj)
     Chardev *chr = CHARDEV(obj);
     WinChardev *s = WIN_CHARDEV(chr);
 
-    if (s->skip_free) {
-        return;
-    }
-
     if (s->hsend) {
         CloseHandle(s->hsend);
     }
     if (s->hrecv) {
         CloseHandle(s->hrecv);
     }
-    if (s->file) {
+    if (!s->keep_open && s->file) {
         CloseHandle(s->file);
     }
     if (s->fpipe) {
@@ -214,12 +210,12 @@ static void char_win_finalize(Object *obj)
     qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
 }
 
-void qemu_chr_open_win_file(Chardev *chr, HANDLE fd_out)
+void win_chr_set_file(Chardev *chr, HANDLE file, bool keep_open)
 {
     WinChardev *s = WIN_CHARDEV(chr);
 
-    s->skip_free = true;
-    s->file = fd_out;
+    s->keep_open = keep_open;
+    s->file = file;
 }
 
 static void char_win_class_init(ObjectClass *oc, void *data)
index 888be2b3ca38a2ea48ed6c6a1453d5b8158a1500..4994425e9efc622f2f37990861f2c6520bea5753 100644 (file)
 typedef struct {
     Chardev parent;
 
+    bool keep_open; /* console do not close file */
     HANDLE file, hrecv, hsend;
     OVERLAPPED orecv;
     BOOL fpipe;
 
     /* Protected by the Chardev chr_write_lock.  */
     OVERLAPPED osend;
-    /* FIXME: file/console do not finalize */
-    bool skip_free;
 } WinChardev;
 
 #define NSENDBUF 2048
@@ -45,7 +44,7 @@ typedef struct {
 #define TYPE_CHARDEV_WIN "chardev-win"
 #define WIN_CHARDEV(obj) OBJECT_CHECK(WinChardev, (obj), TYPE_CHARDEV_WIN)
 
-void qemu_chr_open_win_file(Chardev *chr, HANDLE fd_out);
+void win_chr_set_file(Chardev *chr, HANDLE file, bool keep_open);
 int win_chr_serial_init(Chardev *chr, const char *filename, Error **errp);
 int win_chr_pipe_poll(void *opaque);