Lines Matching +full:mux +full:- +full:ctrl +full:- +full:list

4  * Copyright (c) 2003-2008 Fabrice Bellard
28 #include "monitor/qmp-helpers.h"
29 #include "qemu/config-file.h"
30 #include "qemu/error-report.h"
31 #include "qemu/qemu-print.h"
34 #include "qapi/qapi-commands-char.h"
44 #include "chardev-internal.h"
56 CharBackend *be = s->be; in chr_be_event()
58 if (!be || !be->chr_event) { in chr_be_event()
62 be->chr_event(be->opaque, event); in chr_be_event()
70 s->be_open = 1; in qemu_chr_be_event()
73 s->be_open = 0; in qemu_chr_be_event()
82 CHARDEV_GET_CLASS(s)->chr_be_event(s, event); in qemu_chr_be_event()
92 if (s->logfd < 0) { in qemu_chr_write_log()
98 ret = write(s->logfd, buf + done, len - done); in qemu_chr_write_log()
99 if (ret == -1 && errno == EAGAIN) { in qemu_chr_write_log()
119 qemu_mutex_lock(&s->chr_write_lock); in qemu_chr_write_buffer()
122 res = cc->chr_write(s, buf + *offset, len - *offset); in qemu_chr_write_buffer()
157 qemu_mutex_unlock(&s->chr_write_lock); in qemu_chr_write_buffer()
200 CharBackend *be = s->be; in qemu_chr_be_can_write()
202 if (!be || !be->chr_can_read) { in qemu_chr_be_can_write()
206 return be->chr_can_read(be->opaque); in qemu_chr_be_can_write()
211 CharBackend *be = s->be; in qemu_chr_be_write_impl()
213 if (be && be->chr_read) { in qemu_chr_be_write_impl()
214 be->chr_read(be->opaque, buf, len); in qemu_chr_be_write_impl()
237 s->gcontext = context; in qemu_chr_be_update_read_handlers()
238 if (cc->chr_update_read_handler) { in qemu_chr_be_update_read_handlers()
239 cc->chr_update_read_handler(s); in qemu_chr_be_update_read_handlers()
245 return CHARDEV_GET_CLASS(s)->chr_add_client ? in qemu_chr_add_client()
246 CHARDEV_GET_CLASS(s)->chr_add_client(s, fd) : -1; in qemu_chr_add_client()
254 ChardevCommon *common = backend ? backend->u.null.data : NULL; in qemu_char_open()
256 if (common && common->logfile) { in qemu_char_open()
258 if (common->has_logappend && in qemu_char_open()
259 common->logappend) { in qemu_char_open()
264 chr->logfd = qemu_create(common->logfile, flags, 0666, errp); in qemu_char_open()
265 if (chr->logfd < 0) { in qemu_char_open()
270 if (cc->open) { in qemu_char_open()
271 cc->open(chr, backend, be_opened, errp); in qemu_char_open()
279 chr->handover_yank_instance = false; in char_init()
280 chr->logfd = -1; in char_init()
281 qemu_mutex_init(&chr->chr_write_lock); in char_init()
287 if (CHARDEV_GET_CLASS(chr)->chr_update_read_handler) { in char_init()
302 cc->chr_write = null_chr_write; in char_class_init()
303 cc->chr_be_event = chr_be_event; in char_class_init()
310 if (chr->be) { in char_finalize()
311 chr->be->chr = NULL; in char_finalize()
313 g_free(chr->filename); in char_finalize()
314 g_free(chr->label); in char_finalize()
315 if (chr->logfd != -1) { in char_finalize()
316 close(chr->logfd); in char_finalize()
318 qemu_mutex_destroy(&chr->chr_write_lock); in char_finalize()
336 return d->mux_bitset != 0; in qemu_chr_is_busy()
338 return s->be != NULL; in qemu_chr_is_busy()
346 if (cc->chr_wait_connected) { in qemu_chr_wait_connected()
347 return cc->chr_wait_connected(chr, errp); in qemu_chr_wait_connected()
374 qemu_opt_set(opts, "mux", "on", &error_abort); in qemu_chr_parse_compat()
376 /* Monitor is muxed to stdio: do not exit on Ctrl+C by default in qemu_chr_parse_compat()
378 * for -chardev syntax we have special option for this. in qemu_chr_parse_compat()
379 * This is what -nographic did, redirecting+muxing serial+monitor in qemu_chr_parse_compat()
380 * to stdio causing Ctrl+C to be passed to guest. */ in qemu_chr_parse_compat()
398 if (sscanf(p+1, "%7[0-9]x%7[0-9]", width, height) == 2) { in qemu_chr_parse_compat()
402 } else if (sscanf(p+1, "%7[0-9]Cx%7[0-9]C", width, height) == 2) { in qemu_chr_parse_compat()
517 backend->logfile = g_strdup(logfile); in qemu_chr_parse_common()
518 backend->has_logappend = true; in qemu_chr_parse_common()
519 backend->logappend = qemu_opt_get_bool(opts, "logappend", false); in qemu_chr_parse_common()
526 char *typename = g_strdup_printf("chardev-%s", driver); in char_get_class()
538 "a non-abstract device type"); in char_get_class()
543 if (cc->internal) { in char_get_class()
561 assert(g_str_has_prefix(object_class_get_name(klass), "chardev-")); in chardev_class_foreach()
562 if (CHARDEV_CLASS(klass)->internal) { in chardev_class_foreach()
566 fe->fn(object_class_get_name(klass) + 8, fe->opaque); in chardev_class_foreach()
605 backend->type = CHARDEV_BACKEND_KIND_NULL; in qemu_chr_parse_opts()
607 if (cc->parse) { in qemu_chr_parse_opts()
608 cc->parse(opts, backend, &local_err); in qemu_chr_parse_opts()
617 backend->u.null.data = ccom; /* Any ChardevCommon member would work */ in qemu_chr_parse_opts()
626 if (CHARDEV_GET_CLASS(chr)->chr_ioctl) { in qemu_chardev_set_replay()
651 qemu_printf("Available chardev backend types: %s\n", str->str); in do_qemu_chr_new_from_opts()
671 if (qemu_opt_get_bool(opts, "mux", 0)) { in do_qemu_chr_new_from_opts()
672 bid = g_strdup_printf("%s-base", id); in do_qemu_chr_new_from_opts()
684 Chardev *mux; in do_qemu_chr_new_from_opts() local
687 backend->type = CHARDEV_BACKEND_KIND_MUX; in do_qemu_chr_new_from_opts()
688 backend->u.mux.data = g_new0(ChardevMux, 1); in do_qemu_chr_new_from_opts()
689 backend->u.mux.data->chardev = g_strdup(bid); in do_qemu_chr_new_from_opts()
690 mux = qemu_chardev_new(id, TYPE_CHARDEV_MUX, backend, context, errp); in do_qemu_chr_new_from_opts()
691 if (mux == NULL) { in do_qemu_chr_new_from_opts()
696 chr = mux; in do_qemu_chr_new_from_opts()
704 /* RR should be set on the base device, not the mux */ in do_qemu_chr_new_from_opts()
749 if (qemu_opt_get_bool(opts, "mux", 0)) { in qemu_chr_new_from_name()
796 ChardevInfoList **list = data; in qmp_query_chardev_foreach() local
799 value->label = g_strdup(chr->label); in qmp_query_chardev_foreach()
800 value->filename = g_strdup(chr->filename); in qmp_query_chardev_foreach()
801 value->frontend_open = chr->be && chr->be->fe_is_open; in qmp_query_chardev_foreach()
803 QAPI_LIST_PREPEND(*list, value); in qmp_query_chardev_foreach()
821 ChardevBackendInfoList **list = opaque; in qmp_prepend_backend() local
825 value->name = g_strdup(name); in qmp_prepend_backend()
826 QAPI_LIST_PREPEND(*list, value); in qmp_prepend_backend()
857 .name = "input-path",
899 .name = "reconnect-ms",
908 .name = "tls-creds",
911 .name = "tls-authz",
929 .name = "mux",
971 { /* end of list */ }
978 return test_bit(feature, chr->features); in qemu_chr_has_feature()
984 return set_bit(feature, chr->features); in qemu_chr_set_feature()
998 assert(g_str_has_prefix(typename, "chardev-")); in chardev_new()
1003 chr->handover_yank_instance = handover_yank_instance; in chardev_new()
1004 chr->label = g_strdup(id); in chardev_new()
1005 chr->gcontext = gcontext; in chardev_new()
1014 if (!chr->filename) { in chardev_new()
1015 chr->filename = g_strdup(typename + 8); in chardev_new()
1065 cc = char_get_class(ChardevBackendKind_str(backend->type), errp); in qmp_chardev_add()
1083 ret->pty = g_strdup(chr->filename + 4); in qmp_chardev_add()
1110 error_setg(errp, "Mux device hotswap not supported yet"); in qmp_chardev_change()
1120 be = chr->be; in qmp_chardev_change()
1127 if (!be->chr_be_change) { in qmp_chardev_change()
1133 cc_new = char_get_class(ChardevBackendKind_str(backend->type), errp); in qmp_chardev_change()
1142 handover_yank_instance = cc->supports_yank && cc_new->supports_yank; in qmp_chardev_change()
1145 backend, chr->gcontext, handover_yank_instance, errp); in qmp_chardev_change()
1150 if (chr->be_open && !chr_new->be_open) { in qmp_chardev_change()
1155 chr->be = NULL; in qmp_chardev_change()
1158 if (be->chr_be_change(be->opaque) < 0) { in qmp_chardev_change()
1159 error_setg(errp, "Chardev '%s' change failed", chr_new->label); in qmp_chardev_change()
1160 chr_new->be = NULL; in qmp_chardev_change()
1170 chr_new->handover_yank_instance = false; in qmp_chardev_change()
1176 chr->handover_yank_instance = handover_yank_instance; in qmp_chardev_change()
1179 object_property_add_child(get_chardevs_root(), chr_new->label, in qmp_chardev_change()
1185 ret->pty = g_strdup(chr_new->filename + 4); in qmp_chardev_change()
1254 g_source_attach(source, chr->gcontext); in qemu_chr_timeout_add_ms()