aboutsummaryrefslogtreecommitdiff
path: root/chardev/char-fe.c
diff options
context:
space:
mode:
Diffstat (limited to 'chardev/char-fe.c')
-rw-r--r--chardev/char-fe.c69
1 files changed, 40 insertions, 29 deletions
diff --git a/chardev/char-fe.c b/chardev/char-fe.c
index a8931f7afd..b214ba3802 100644
--- a/chardev/char-fe.c
+++ b/chardev/char-fe.c
@@ -24,12 +24,11 @@
#include "qemu/osdep.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
-#include "qapi/qmp/qerror.h"
#include "sysemu/replay.h"
#include "chardev/char-fe.h"
#include "chardev/char-io.h"
-#include "chardev/char-mux.h"
+#include "chardev-internal.h"
int qemu_chr_fe_write(CharBackend *be, const uint8_t *buf, int len)
{
@@ -199,26 +198,27 @@ bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp)
MuxChardev *d = MUX_CHARDEV(s);
if (d->mux_cnt >= MAX_MUX) {
- goto unavailable;
+ error_setg(errp,
+ "too many uses of multiplexed chardev '%s'"
+ " (maximum is " stringify(MAX_MUX) ")",
+ s->label);
+ return false;
}
d->backends[d->mux_cnt] = b;
tag = d->mux_cnt++;
} else if (s->be) {
- goto unavailable;
+ error_setg(errp, "chardev '%s' is already in use", s->label);
+ return false;
} else {
s->be = b;
}
}
- b->fe_open = false;
+ b->fe_is_open = false;
b->tag = tag;
b->chr = s;
return true;
-
-unavailable:
- error_setg(errp, QERR_DEVICE_IN_USE, s->label);
- return false;
}
void qemu_chr_fe_deinit(CharBackend *b, bool del)
@@ -246,17 +246,18 @@ void qemu_chr_fe_deinit(CharBackend *b, bool del)
}
}
-void qemu_chr_fe_set_handlers(CharBackend *b,
- IOCanReadHandler *fd_can_read,
- IOReadHandler *fd_read,
- IOEventHandler *fd_event,
- BackendChangeHandler *be_change,
- void *opaque,
- GMainContext *context,
- bool set_open)
+void qemu_chr_fe_set_handlers_full(CharBackend *b,
+ IOCanReadHandler *fd_can_read,
+ IOReadHandler *fd_read,
+ IOEventHandler *fd_event,
+ BackendChangeHandler *be_change,
+ void *opaque,
+ GMainContext *context,
+ bool set_open,
+ bool sync_state)
{
Chardev *s;
- int fe_open;
+ bool fe_open;
s = b->chr;
if (!s) {
@@ -264,10 +265,10 @@ void qemu_chr_fe_set_handlers(CharBackend *b,
}
if (!opaque && !fd_can_read && !fd_read && !fd_event) {
- fe_open = 0;
+ fe_open = false;
remove_fd_in_watch(s);
} else {
- fe_open = 1;
+ fe_open = true;
}
b->chr_can_read = fd_can_read;
b->chr_read = fd_read;
@@ -285,14 +286,24 @@ void qemu_chr_fe_set_handlers(CharBackend *b,
qemu_chr_fe_take_focus(b);
/* We're connecting to an already opened device, so let's make sure we
also get the open event */
- if (s->be_open) {
+ if (sync_state && s->be_open) {
qemu_chr_be_event(s, CHR_EVENT_OPENED);
}
}
+}
- if (CHARDEV_IS_MUX(s)) {
- mux_chr_set_handlers(s, context);
- }
+void qemu_chr_fe_set_handlers(CharBackend *b,
+ IOCanReadHandler *fd_can_read,
+ IOReadHandler *fd_read,
+ IOEventHandler *fd_event,
+ BackendChangeHandler *be_change,
+ void *opaque,
+ GMainContext *context,
+ bool set_open)
+{
+ qemu_chr_fe_set_handlers_full(b, fd_can_read, fd_read, fd_event, be_change,
+ opaque, context, set_open,
+ true);
}
void qemu_chr_fe_take_focus(CharBackend *b)
@@ -325,7 +336,7 @@ void qemu_chr_fe_set_echo(CharBackend *be, bool echo)
}
}
-void qemu_chr_fe_set_open(CharBackend *be, int fe_open)
+void qemu_chr_fe_set_open(CharBackend *be, bool is_open)
{
Chardev *chr = be->chr;
@@ -333,17 +344,17 @@ void qemu_chr_fe_set_open(CharBackend *be, int fe_open)
return;
}
- if (be->fe_open == fe_open) {
+ if (be->fe_is_open == is_open) {
return;
}
- be->fe_open = fe_open;
+ be->fe_is_open = is_open;
if (CHARDEV_GET_CLASS(chr)->chr_set_fe_open) {
- CHARDEV_GET_CLASS(chr)->chr_set_fe_open(chr, fe_open);
+ CHARDEV_GET_CLASS(chr)->chr_set_fe_open(chr, is_open);
}
}
guint qemu_chr_fe_add_watch(CharBackend *be, GIOCondition cond,
- GIOFunc func, void *user_data)
+ FEWatchFunc func, void *user_data)
{
Chardev *s = be->chr;
GSource *src;