mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
char-win: close file handle except with console
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>
This commit is contained in:
parent
ef0f272f38
commit
541815ff7f
4 changed files with 8 additions and 13 deletions
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -29,14 +29,13 @@
|
|||
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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue