char: move win chardev base class in its own file
[qemu/ar7.git] / chardev / char.c
blobb80fcae028b35f9710ef6ea32108e34154e9ea3e
1 /*
2 * QEMU System Emulator
4 * Copyright (c) 2003-2008 Fabrice Bellard
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
24 #include "qemu/osdep.h"
25 #include "qemu-common.h"
26 #include "qemu/cutils.h"
27 #include "monitor/monitor.h"
28 #include "sysemu/sysemu.h"
29 #include "sysemu/block-backend.h"
30 #include "qemu/error-report.h"
31 #include "qemu/timer.h"
32 #include "sysemu/char.h"
33 #include "hw/usb.h"
34 #include "qmp-commands.h"
35 #include "qapi/clone-visitor.h"
36 #include "qapi-visit.h"
37 #include "qemu/base64.h"
38 #include "io/channel-socket.h"
39 #include "io/channel-file.h"
40 #include "io/channel-tls.h"
41 #include "sysemu/replay.h"
42 #include "qemu/help_option.h"
44 #include <zlib.h>
46 #ifndef _WIN32
47 #include <sys/times.h>
48 #include <sys/wait.h>
49 #include <termios.h>
50 #include <sys/ioctl.h>
51 #include <sys/resource.h>
52 #include <sys/socket.h>
53 #include <netinet/in.h>
54 #include <net/if.h>
55 #include <arpa/inet.h>
56 #include <netdb.h>
57 #include <sys/select.h>
58 #ifdef CONFIG_BSD
59 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
60 #include <dev/ppbus/ppi.h>
61 #include <dev/ppbus/ppbconf.h>
62 #elif defined(__DragonFly__)
63 #include <dev/misc/ppi/ppi.h>
64 #include <bus/ppbus/ppbconf.h>
65 #endif
66 #else
67 #ifdef __linux__
68 #include <linux/ppdev.h>
69 #include <linux/parport.h>
70 #endif
71 #ifdef __sun__
72 #include <sys/ethernet.h>
73 #include <sys/sockio.h>
74 #include <netinet/arp.h>
75 #include <netinet/in.h>
76 #include <netinet/in_systm.h>
77 #include <netinet/ip.h>
78 #include <netinet/ip_icmp.h> // must come after ip.h
79 #include <netinet/udp.h>
80 #include <netinet/tcp.h>
81 #endif
82 #endif
83 #endif
85 #include "qemu/sockets.h"
86 #include "ui/qemu-spice.h"
88 #include "char-mux.h"
89 #include "char-fd.h"
90 #include "char-io.h"
91 #ifdef _WIN32
92 #include "char-win.h"
93 #endif
95 #define TCP_MAX_FDS 16
97 /***********************************************************/
98 /* Socket address helpers */
100 static char *SocketAddress_to_str(const char *prefix, SocketAddress *addr,
101 bool is_listen, bool is_telnet)
103 switch (addr->type) {
104 case SOCKET_ADDRESS_KIND_INET:
105 return g_strdup_printf("%s%s:%s:%s%s", prefix,
106 is_telnet ? "telnet" : "tcp",
107 addr->u.inet.data->host,
108 addr->u.inet.data->port,
109 is_listen ? ",server" : "");
110 break;
111 case SOCKET_ADDRESS_KIND_UNIX:
112 return g_strdup_printf("%sunix:%s%s", prefix,
113 addr->u.q_unix.data->path,
114 is_listen ? ",server" : "");
115 break;
116 case SOCKET_ADDRESS_KIND_FD:
117 return g_strdup_printf("%sfd:%s%s", prefix, addr->u.fd.data->str,
118 is_listen ? ",server" : "");
119 break;
120 default:
121 abort();
125 static char *sockaddr_to_str(struct sockaddr_storage *ss, socklen_t ss_len,
126 struct sockaddr_storage *ps, socklen_t ps_len,
127 bool is_listen, bool is_telnet)
129 char shost[NI_MAXHOST], sserv[NI_MAXSERV];
130 char phost[NI_MAXHOST], pserv[NI_MAXSERV];
131 const char *left = "", *right = "";
133 switch (ss->ss_family) {
134 #ifndef _WIN32
135 case AF_UNIX:
136 return g_strdup_printf("unix:%s%s",
137 ((struct sockaddr_un *)(ss))->sun_path,
138 is_listen ? ",server" : "");
139 #endif
140 case AF_INET6:
141 left = "[";
142 right = "]";
143 /* fall through */
144 case AF_INET:
145 getnameinfo((struct sockaddr *) ss, ss_len, shost, sizeof(shost),
146 sserv, sizeof(sserv), NI_NUMERICHOST | NI_NUMERICSERV);
147 getnameinfo((struct sockaddr *) ps, ps_len, phost, sizeof(phost),
148 pserv, sizeof(pserv), NI_NUMERICHOST | NI_NUMERICSERV);
149 return g_strdup_printf("%s:%s%s%s:%s%s <-> %s%s%s:%s",
150 is_telnet ? "telnet" : "tcp",
151 left, shost, right, sserv,
152 is_listen ? ",server" : "",
153 left, phost, right, pserv);
155 default:
156 return g_strdup_printf("unknown");
160 /***********************************************************/
161 /* character device */
163 static QTAILQ_HEAD(ChardevHead, Chardev) chardevs =
164 QTAILQ_HEAD_INITIALIZER(chardevs);
166 void qemu_chr_be_event(Chardev *s, int event)
168 CharBackend *be = s->be;
170 /* Keep track if the char device is open */
171 switch (event) {
172 case CHR_EVENT_OPENED:
173 s->be_open = 1;
174 break;
175 case CHR_EVENT_CLOSED:
176 s->be_open = 0;
177 break;
180 if (!be || !be->chr_event) {
181 return;
184 be->chr_event(be->opaque, event);
187 void qemu_chr_be_generic_open(Chardev *s)
189 qemu_chr_be_event(s, CHR_EVENT_OPENED);
193 /* Not reporting errors from writing to logfile, as logs are
194 * defined to be "best effort" only */
195 static void qemu_chr_fe_write_log(Chardev *s,
196 const uint8_t *buf, size_t len)
198 size_t done = 0;
199 ssize_t ret;
201 if (s->logfd < 0) {
202 return;
205 while (done < len) {
206 retry:
207 ret = write(s->logfd, buf + done, len - done);
208 if (ret == -1 && errno == EAGAIN) {
209 g_usleep(100);
210 goto retry;
213 if (ret <= 0) {
214 return;
216 done += ret;
220 static int qemu_chr_fe_write_buffer(Chardev *s,
221 const uint8_t *buf, int len, int *offset)
223 ChardevClass *cc = CHARDEV_GET_CLASS(s);
224 int res = 0;
225 *offset = 0;
227 qemu_mutex_lock(&s->chr_write_lock);
228 while (*offset < len) {
229 retry:
230 res = cc->chr_write(s, buf + *offset, len - *offset);
231 if (res < 0 && errno == EAGAIN) {
232 g_usleep(100);
233 goto retry;
236 if (res <= 0) {
237 break;
240 *offset += res;
242 if (*offset > 0) {
243 qemu_chr_fe_write_log(s, buf, *offset);
245 qemu_mutex_unlock(&s->chr_write_lock);
247 return res;
250 static bool qemu_chr_replay(Chardev *chr)
252 return qemu_chr_has_feature(chr, QEMU_CHAR_FEATURE_REPLAY);
255 int qemu_chr_fe_write(CharBackend *be, const uint8_t *buf, int len)
257 Chardev *s = be->chr;
258 ChardevClass *cc;
259 int ret;
261 if (!s) {
262 return 0;
265 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_PLAY) {
266 int offset;
267 replay_char_write_event_load(&ret, &offset);
268 assert(offset <= len);
269 qemu_chr_fe_write_buffer(s, buf, offset, &offset);
270 return ret;
273 cc = CHARDEV_GET_CLASS(s);
274 qemu_mutex_lock(&s->chr_write_lock);
275 ret = cc->chr_write(s, buf, len);
277 if (ret > 0) {
278 qemu_chr_fe_write_log(s, buf, ret);
281 qemu_mutex_unlock(&s->chr_write_lock);
283 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_RECORD) {
284 replay_char_write_event_save(ret, ret < 0 ? 0 : ret);
287 return ret;
290 int qemu_chr_write_all(Chardev *s, const uint8_t *buf, int len)
292 int offset;
293 int res;
295 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_PLAY) {
296 replay_char_write_event_load(&res, &offset);
297 assert(offset <= len);
298 qemu_chr_fe_write_buffer(s, buf, offset, &offset);
299 return res;
302 res = qemu_chr_fe_write_buffer(s, buf, len, &offset);
304 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_RECORD) {
305 replay_char_write_event_save(res, offset);
308 if (res < 0) {
309 return res;
311 return offset;
314 int qemu_chr_fe_write_all(CharBackend *be, const uint8_t *buf, int len)
316 Chardev *s = be->chr;
318 if (!s) {
319 return 0;
322 return qemu_chr_write_all(s, buf, len);
325 int qemu_chr_fe_read_all(CharBackend *be, uint8_t *buf, int len)
327 Chardev *s = be->chr;
328 int offset = 0, counter = 10;
329 int res;
331 if (!s || !CHARDEV_GET_CLASS(s)->chr_sync_read) {
332 return 0;
335 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_PLAY) {
336 return replay_char_read_all_load(buf);
339 while (offset < len) {
340 retry:
341 res = CHARDEV_GET_CLASS(s)->chr_sync_read(s, buf + offset,
342 len - offset);
343 if (res == -1 && errno == EAGAIN) {
344 g_usleep(100);
345 goto retry;
348 if (res == 0) {
349 break;
352 if (res < 0) {
353 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_RECORD) {
354 replay_char_read_all_save_error(res);
356 return res;
359 offset += res;
361 if (!counter--) {
362 break;
366 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_RECORD) {
367 replay_char_read_all_save_buf(buf, offset);
369 return offset;
372 int qemu_chr_fe_ioctl(CharBackend *be, int cmd, void *arg)
374 Chardev *s = be->chr;
375 int res;
377 if (!s || !CHARDEV_GET_CLASS(s)->chr_ioctl || qemu_chr_replay(s)) {
378 res = -ENOTSUP;
379 } else {
380 res = CHARDEV_GET_CLASS(s)->chr_ioctl(s, cmd, arg);
383 return res;
386 int qemu_chr_be_can_write(Chardev *s)
388 CharBackend *be = s->be;
390 if (!be || !be->chr_can_read) {
391 return 0;
394 return be->chr_can_read(be->opaque);
397 void qemu_chr_be_write_impl(Chardev *s, uint8_t *buf, int len)
399 CharBackend *be = s->be;
401 if (be && be->chr_read) {
402 be->chr_read(be->opaque, buf, len);
406 void qemu_chr_be_write(Chardev *s, uint8_t *buf, int len)
408 if (qemu_chr_replay(s)) {
409 if (replay_mode == REPLAY_MODE_PLAY) {
410 return;
412 replay_chr_be_write(s, buf, len);
413 } else {
414 qemu_chr_be_write_impl(s, buf, len);
418 int qemu_chr_fe_get_msgfd(CharBackend *be)
420 Chardev *s = be->chr;
421 int fd;
422 int res = (qemu_chr_fe_get_msgfds(be, &fd, 1) == 1) ? fd : -1;
423 if (s && qemu_chr_replay(s)) {
424 error_report("Replay: get msgfd is not supported "
425 "for serial devices yet");
426 exit(1);
428 return res;
431 int qemu_chr_fe_get_msgfds(CharBackend *be, int *fds, int len)
433 Chardev *s = be->chr;
435 if (!s) {
436 return -1;
439 return CHARDEV_GET_CLASS(s)->get_msgfds ?
440 CHARDEV_GET_CLASS(s)->get_msgfds(s, fds, len) : -1;
443 int qemu_chr_fe_set_msgfds(CharBackend *be, int *fds, int num)
445 Chardev *s = be->chr;
447 if (!s) {
448 return -1;
451 return CHARDEV_GET_CLASS(s)->set_msgfds ?
452 CHARDEV_GET_CLASS(s)->set_msgfds(s, fds, num) : -1;
455 int qemu_chr_add_client(Chardev *s, int fd)
457 return CHARDEV_GET_CLASS(s)->chr_add_client ?
458 CHARDEV_GET_CLASS(s)->chr_add_client(s, fd) : -1;
461 void qemu_chr_fe_accept_input(CharBackend *be)
463 Chardev *s = be->chr;
465 if (!s) {
466 return;
469 if (CHARDEV_GET_CLASS(s)->chr_accept_input) {
470 CHARDEV_GET_CLASS(s)->chr_accept_input(s);
472 qemu_notify_event();
475 void qemu_chr_fe_printf(CharBackend *be, const char *fmt, ...)
477 char buf[CHR_READ_BUF_LEN];
478 va_list ap;
479 va_start(ap, fmt);
480 vsnprintf(buf, sizeof(buf), fmt, ap);
481 /* XXX this blocks entire thread. Rewrite to use
482 * qemu_chr_fe_write and background I/O callbacks */
483 qemu_chr_fe_write_all(be, (uint8_t *)buf, strlen(buf));
484 va_end(ap);
487 static void qemu_char_open(Chardev *chr, ChardevBackend *backend,
488 bool *be_opened, Error **errp)
490 ChardevClass *cc = CHARDEV_GET_CLASS(chr);
491 /* Any ChardevCommon member would work */
492 ChardevCommon *common = backend ? backend->u.null.data : NULL;
494 if (common && common->has_logfile) {
495 int flags = O_WRONLY | O_CREAT;
496 if (common->has_logappend &&
497 common->logappend) {
498 flags |= O_APPEND;
499 } else {
500 flags |= O_TRUNC;
502 chr->logfd = qemu_open(common->logfile, flags, 0666);
503 if (chr->logfd < 0) {
504 error_setg_errno(errp, errno,
505 "Unable to open logfile %s",
506 common->logfile);
507 return;
511 if (cc->open) {
512 cc->open(chr, backend, be_opened, errp);
516 static void char_init(Object *obj)
518 Chardev *chr = CHARDEV(obj);
520 chr->logfd = -1;
521 qemu_mutex_init(&chr->chr_write_lock);
524 static int null_chr_write(Chardev *chr, const uint8_t *buf, int len)
526 return len;
529 static void char_class_init(ObjectClass *oc, void *data)
531 ChardevClass *cc = CHARDEV_CLASS(oc);
533 cc->chr_write = null_chr_write;
536 static void char_finalize(Object *obj)
538 Chardev *chr = CHARDEV(obj);
540 if (chr->be) {
541 chr->be->chr = NULL;
543 g_free(chr->filename);
544 g_free(chr->label);
545 if (chr->logfd != -1) {
546 close(chr->logfd);
548 qemu_mutex_destroy(&chr->chr_write_lock);
551 static const TypeInfo char_type_info = {
552 .name = TYPE_CHARDEV,
553 .parent = TYPE_OBJECT,
554 .instance_size = sizeof(Chardev),
555 .instance_init = char_init,
556 .instance_finalize = char_finalize,
557 .abstract = true,
558 .class_size = sizeof(ChardevClass),
559 .class_init = char_class_init,
563 * Called after processing of default and command-line-specified
564 * chardevs to deliver CHR_EVENT_OPENED events to any FEs attached
565 * to a mux chardev. This is done here to ensure that
566 * output/prompts/banners are only displayed for the FE that has
567 * focus when initial command-line processing/machine init is
568 * completed.
570 * After this point, any new FE attached to any new or existing
571 * mux will receive CHR_EVENT_OPENED notifications for the BE
572 * immediately.
574 static void muxes_realize_done(Notifier *notifier, void *unused)
576 Chardev *chr;
578 QTAILQ_FOREACH(chr, &chardevs, next) {
579 if (CHARDEV_IS_MUX(chr)) {
580 MuxChardev *d = MUX_CHARDEV(chr);
581 int i;
583 /* send OPENED to all already-attached FEs */
584 for (i = 0; i < d->mux_cnt; i++) {
585 mux_chr_send_event(d, i, CHR_EVENT_OPENED);
587 /* mark mux as OPENED so any new FEs will immediately receive
588 * OPENED event
590 qemu_chr_be_generic_open(chr);
593 muxes_realized = true;
596 static Notifier muxes_realize_notify = {
597 .notify = muxes_realize_done,
600 Chardev *qemu_chr_fe_get_driver(CharBackend *be)
602 return be->chr;
605 bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp)
607 int tag = 0;
609 if (CHARDEV_IS_MUX(s)) {
610 MuxChardev *d = MUX_CHARDEV(s);
612 if (d->mux_cnt >= MAX_MUX) {
613 goto unavailable;
616 d->backends[d->mux_cnt] = b;
617 tag = d->mux_cnt++;
618 } else if (s->be) {
619 goto unavailable;
620 } else {
621 s->be = b;
624 b->fe_open = false;
625 b->tag = tag;
626 b->chr = s;
627 return true;
629 unavailable:
630 error_setg(errp, QERR_DEVICE_IN_USE, s->label);
631 return false;
634 static bool qemu_chr_is_busy(Chardev *s)
636 if (CHARDEV_IS_MUX(s)) {
637 MuxChardev *d = MUX_CHARDEV(s);
638 return d->mux_cnt >= 0;
639 } else {
640 return s->be != NULL;
644 void qemu_chr_fe_deinit(CharBackend *b)
646 assert(b);
648 if (b->chr) {
649 qemu_chr_fe_set_handlers(b, NULL, NULL, NULL, NULL, NULL, true);
650 if (b->chr->be == b) {
651 b->chr->be = NULL;
653 if (CHARDEV_IS_MUX(b->chr)) {
654 MuxChardev *d = MUX_CHARDEV(b->chr);
655 d->backends[b->tag] = NULL;
657 b->chr = NULL;
661 void qemu_chr_fe_set_handlers(CharBackend *b,
662 IOCanReadHandler *fd_can_read,
663 IOReadHandler *fd_read,
664 IOEventHandler *fd_event,
665 void *opaque,
666 GMainContext *context,
667 bool set_open)
669 Chardev *s;
670 ChardevClass *cc;
671 int fe_open;
673 s = b->chr;
674 if (!s) {
675 return;
678 cc = CHARDEV_GET_CLASS(s);
679 if (!opaque && !fd_can_read && !fd_read && !fd_event) {
680 fe_open = 0;
681 remove_fd_in_watch(s);
682 } else {
683 fe_open = 1;
685 b->chr_can_read = fd_can_read;
686 b->chr_read = fd_read;
687 b->chr_event = fd_event;
688 b->opaque = opaque;
689 if (cc->chr_update_read_handler) {
690 cc->chr_update_read_handler(s, context);
693 if (set_open) {
694 qemu_chr_fe_set_open(b, fe_open);
697 if (fe_open) {
698 qemu_chr_fe_take_focus(b);
699 /* We're connecting to an already opened device, so let's make sure we
700 also get the open event */
701 if (s->be_open) {
702 qemu_chr_be_generic_open(s);
706 if (CHARDEV_IS_MUX(s)) {
707 mux_chr_set_handlers(s, context);
711 void qemu_chr_fe_take_focus(CharBackend *b)
713 if (!b->chr) {
714 return;
717 if (CHARDEV_IS_MUX(b->chr)) {
718 mux_set_focus(b->chr, b->tag);
722 #ifndef _WIN32
723 static void qemu_chr_open_pipe(Chardev *chr,
724 ChardevBackend *backend,
725 bool *be_opened,
726 Error **errp)
728 ChardevHostdev *opts = backend->u.pipe.data;
729 int fd_in, fd_out;
730 char *filename_in;
731 char *filename_out;
732 const char *filename = opts->device;
734 filename_in = g_strdup_printf("%s.in", filename);
735 filename_out = g_strdup_printf("%s.out", filename);
736 TFR(fd_in = qemu_open(filename_in, O_RDWR | O_BINARY));
737 TFR(fd_out = qemu_open(filename_out, O_RDWR | O_BINARY));
738 g_free(filename_in);
739 g_free(filename_out);
740 if (fd_in < 0 || fd_out < 0) {
741 if (fd_in >= 0)
742 close(fd_in);
743 if (fd_out >= 0)
744 close(fd_out);
745 TFR(fd_in = fd_out = qemu_open(filename, O_RDWR | O_BINARY));
746 if (fd_in < 0) {
747 error_setg_file_open(errp, errno, filename);
748 return;
751 qemu_chr_open_fd(chr, fd_in, fd_out);
754 /* init terminal so that we can grab keys */
755 static struct termios oldtty;
756 static int old_fd0_flags;
757 static bool stdio_in_use;
758 static bool stdio_allow_signal;
759 static bool stdio_echo_state;
761 static void qemu_chr_set_echo_stdio(Chardev *chr, bool echo);
763 static void term_exit(void)
765 tcsetattr (0, TCSANOW, &oldtty);
766 fcntl(0, F_SETFL, old_fd0_flags);
769 static void term_stdio_handler(int sig)
771 /* restore echo after resume from suspend. */
772 qemu_chr_set_echo_stdio(NULL, stdio_echo_state);
775 static void qemu_chr_set_echo_stdio(Chardev *chr, bool echo)
777 struct termios tty;
779 stdio_echo_state = echo;
780 tty = oldtty;
781 if (!echo) {
782 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
783 |INLCR|IGNCR|ICRNL|IXON);
784 tty.c_oflag |= OPOST;
785 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
786 tty.c_cflag &= ~(CSIZE|PARENB);
787 tty.c_cflag |= CS8;
788 tty.c_cc[VMIN] = 1;
789 tty.c_cc[VTIME] = 0;
791 if (!stdio_allow_signal)
792 tty.c_lflag &= ~ISIG;
794 tcsetattr (0, TCSANOW, &tty);
797 static void char_stdio_finalize(Object *obj)
799 term_exit();
802 static void qemu_chr_open_stdio(Chardev *chr,
803 ChardevBackend *backend,
804 bool *be_opened,
805 Error **errp)
807 ChardevStdio *opts = backend->u.stdio.data;
808 struct sigaction act;
810 if (is_daemonized()) {
811 error_setg(errp, "cannot use stdio with -daemonize");
812 return;
815 if (stdio_in_use) {
816 error_setg(errp, "cannot use stdio by multiple character devices");
817 return;
820 stdio_in_use = true;
821 old_fd0_flags = fcntl(0, F_GETFL);
822 tcgetattr(0, &oldtty);
823 qemu_set_nonblock(0);
824 atexit(term_exit);
826 memset(&act, 0, sizeof(act));
827 act.sa_handler = term_stdio_handler;
828 sigaction(SIGCONT, &act, NULL);
830 qemu_chr_open_fd(chr, 0, 1);
832 if (opts->has_signal) {
833 stdio_allow_signal = opts->signal;
835 qemu_chr_set_echo_stdio(chr, false);
838 #if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
839 || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) \
840 || defined(__GLIBC__)
842 #define HAVE_CHARDEV_SERIAL 1
843 #define HAVE_CHARDEV_PTY 1
845 typedef struct {
846 Chardev parent;
847 QIOChannel *ioc;
848 int read_bytes;
850 /* Protected by the Chardev chr_write_lock. */
851 int connected;
852 guint timer_tag;
853 guint open_tag;
854 } PtyChardev;
856 #define PTY_CHARDEV(obj) OBJECT_CHECK(PtyChardev, (obj), TYPE_CHARDEV_PTY)
858 static void pty_chr_update_read_handler_locked(Chardev *chr);
859 static void pty_chr_state(Chardev *chr, int connected);
861 static gboolean pty_chr_timer(gpointer opaque)
863 struct Chardev *chr = CHARDEV(opaque);
864 PtyChardev *s = PTY_CHARDEV(opaque);
866 qemu_mutex_lock(&chr->chr_write_lock);
867 s->timer_tag = 0;
868 s->open_tag = 0;
869 if (!s->connected) {
870 /* Next poll ... */
871 pty_chr_update_read_handler_locked(chr);
873 qemu_mutex_unlock(&chr->chr_write_lock);
874 return FALSE;
877 /* Called with chr_write_lock held. */
878 static void pty_chr_rearm_timer(Chardev *chr, int ms)
880 PtyChardev *s = PTY_CHARDEV(chr);
881 char *name;
883 if (s->timer_tag) {
884 g_source_remove(s->timer_tag);
885 s->timer_tag = 0;
888 if (ms == 1000) {
889 name = g_strdup_printf("pty-timer-secs-%s", chr->label);
890 s->timer_tag = g_timeout_add_seconds(1, pty_chr_timer, chr);
891 } else {
892 name = g_strdup_printf("pty-timer-ms-%s", chr->label);
893 s->timer_tag = g_timeout_add(ms, pty_chr_timer, chr);
895 g_source_set_name_by_id(s->timer_tag, name);
896 g_free(name);
899 /* Called with chr_write_lock held. */
900 static void pty_chr_update_read_handler_locked(Chardev *chr)
902 PtyChardev *s = PTY_CHARDEV(chr);
903 GPollFD pfd;
904 int rc;
905 QIOChannelFile *fioc = QIO_CHANNEL_FILE(s->ioc);
907 pfd.fd = fioc->fd;
908 pfd.events = G_IO_OUT;
909 pfd.revents = 0;
910 do {
911 rc = g_poll(&pfd, 1, 0);
912 } while (rc == -1 && errno == EINTR);
913 assert(rc >= 0);
915 if (pfd.revents & G_IO_HUP) {
916 pty_chr_state(chr, 0);
917 } else {
918 pty_chr_state(chr, 1);
922 static void pty_chr_update_read_handler(Chardev *chr,
923 GMainContext *context)
925 qemu_mutex_lock(&chr->chr_write_lock);
926 pty_chr_update_read_handler_locked(chr);
927 qemu_mutex_unlock(&chr->chr_write_lock);
930 /* Called with chr_write_lock held. */
931 static int char_pty_chr_write(Chardev *chr, const uint8_t *buf, int len)
933 PtyChardev *s = PTY_CHARDEV(chr);
935 if (!s->connected) {
936 /* guest sends data, check for (re-)connect */
937 pty_chr_update_read_handler_locked(chr);
938 if (!s->connected) {
939 return 0;
942 return io_channel_send(s->ioc, buf, len);
945 static GSource *pty_chr_add_watch(Chardev *chr, GIOCondition cond)
947 PtyChardev *s = PTY_CHARDEV(chr);
948 if (!s->connected) {
949 return NULL;
951 return qio_channel_create_watch(s->ioc, cond);
954 static int pty_chr_read_poll(void *opaque)
956 Chardev *chr = CHARDEV(opaque);
957 PtyChardev *s = PTY_CHARDEV(opaque);
959 s->read_bytes = qemu_chr_be_can_write(chr);
960 return s->read_bytes;
963 static gboolean pty_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
965 Chardev *chr = CHARDEV(opaque);
966 PtyChardev *s = PTY_CHARDEV(opaque);
967 gsize len;
968 uint8_t buf[CHR_READ_BUF_LEN];
969 ssize_t ret;
971 len = sizeof(buf);
972 if (len > s->read_bytes)
973 len = s->read_bytes;
974 if (len == 0) {
975 return TRUE;
977 ret = qio_channel_read(s->ioc, (char *)buf, len, NULL);
978 if (ret <= 0) {
979 pty_chr_state(chr, 0);
980 return FALSE;
981 } else {
982 pty_chr_state(chr, 1);
983 qemu_chr_be_write(chr, buf, ret);
985 return TRUE;
988 static gboolean qemu_chr_be_generic_open_func(gpointer opaque)
990 Chardev *chr = CHARDEV(opaque);
991 PtyChardev *s = PTY_CHARDEV(opaque);
993 s->open_tag = 0;
994 qemu_chr_be_generic_open(chr);
995 return FALSE;
998 /* Called with chr_write_lock held. */
999 static void pty_chr_state(Chardev *chr, int connected)
1001 PtyChardev *s = PTY_CHARDEV(chr);
1003 if (!connected) {
1004 if (s->open_tag) {
1005 g_source_remove(s->open_tag);
1006 s->open_tag = 0;
1008 remove_fd_in_watch(chr);
1009 s->connected = 0;
1010 /* (re-)connect poll interval for idle guests: once per second.
1011 * We check more frequently in case the guests sends data to
1012 * the virtual device linked to our pty. */
1013 pty_chr_rearm_timer(chr, 1000);
1014 } else {
1015 if (s->timer_tag) {
1016 g_source_remove(s->timer_tag);
1017 s->timer_tag = 0;
1019 if (!s->connected) {
1020 g_assert(s->open_tag == 0);
1021 s->connected = 1;
1022 s->open_tag = g_idle_add(qemu_chr_be_generic_open_func, chr);
1024 if (!chr->fd_in_tag) {
1025 chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
1026 pty_chr_read_poll,
1027 pty_chr_read,
1028 chr, NULL);
1033 static void char_pty_finalize(Object *obj)
1035 Chardev *chr = CHARDEV(obj);
1036 PtyChardev *s = PTY_CHARDEV(obj);
1038 qemu_mutex_lock(&chr->chr_write_lock);
1039 pty_chr_state(chr, 0);
1040 object_unref(OBJECT(s->ioc));
1041 if (s->timer_tag) {
1042 g_source_remove(s->timer_tag);
1043 s->timer_tag = 0;
1045 qemu_mutex_unlock(&chr->chr_write_lock);
1046 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
1049 static void char_pty_open(Chardev *chr,
1050 ChardevBackend *backend,
1051 bool *be_opened,
1052 Error **errp)
1054 PtyChardev *s;
1055 int master_fd, slave_fd;
1056 char pty_name[PATH_MAX];
1057 char *name;
1059 master_fd = qemu_openpty_raw(&slave_fd, pty_name);
1060 if (master_fd < 0) {
1061 error_setg_errno(errp, errno, "Failed to create PTY");
1062 return;
1065 close(slave_fd);
1066 qemu_set_nonblock(master_fd);
1068 chr->filename = g_strdup_printf("pty:%s", pty_name);
1069 error_report("char device redirected to %s (label %s)",
1070 pty_name, chr->label);
1072 s = PTY_CHARDEV(chr);
1073 s->ioc = QIO_CHANNEL(qio_channel_file_new_fd(master_fd));
1074 name = g_strdup_printf("chardev-pty-%s", chr->label);
1075 qio_channel_set_name(QIO_CHANNEL(s->ioc), name);
1076 g_free(name);
1077 s->timer_tag = 0;
1078 *be_opened = false;
1081 static void char_pty_class_init(ObjectClass *oc, void *data)
1083 ChardevClass *cc = CHARDEV_CLASS(oc);
1085 cc->open = char_pty_open;
1086 cc->chr_write = char_pty_chr_write;
1087 cc->chr_update_read_handler = pty_chr_update_read_handler;
1088 cc->chr_add_watch = pty_chr_add_watch;
1091 static const TypeInfo char_pty_type_info = {
1092 .name = TYPE_CHARDEV_PTY,
1093 .parent = TYPE_CHARDEV,
1094 .instance_size = sizeof(PtyChardev),
1095 .instance_finalize = char_pty_finalize,
1096 .class_init = char_pty_class_init,
1099 static void tty_serial_init(int fd, int speed,
1100 int parity, int data_bits, int stop_bits)
1102 struct termios tty;
1103 speed_t spd;
1105 #if 0
1106 printf("tty_serial_init: speed=%d parity=%c data=%d stop=%d\n",
1107 speed, parity, data_bits, stop_bits);
1108 #endif
1109 tcgetattr (fd, &tty);
1111 #define check_speed(val) if (speed <= val) { spd = B##val; break; }
1112 speed = speed * 10 / 11;
1113 do {
1114 check_speed(50);
1115 check_speed(75);
1116 check_speed(110);
1117 check_speed(134);
1118 check_speed(150);
1119 check_speed(200);
1120 check_speed(300);
1121 check_speed(600);
1122 check_speed(1200);
1123 check_speed(1800);
1124 check_speed(2400);
1125 check_speed(4800);
1126 check_speed(9600);
1127 check_speed(19200);
1128 check_speed(38400);
1129 /* Non-Posix values follow. They may be unsupported on some systems. */
1130 check_speed(57600);
1131 check_speed(115200);
1132 #ifdef B230400
1133 check_speed(230400);
1134 #endif
1135 #ifdef B460800
1136 check_speed(460800);
1137 #endif
1138 #ifdef B500000
1139 check_speed(500000);
1140 #endif
1141 #ifdef B576000
1142 check_speed(576000);
1143 #endif
1144 #ifdef B921600
1145 check_speed(921600);
1146 #endif
1147 #ifdef B1000000
1148 check_speed(1000000);
1149 #endif
1150 #ifdef B1152000
1151 check_speed(1152000);
1152 #endif
1153 #ifdef B1500000
1154 check_speed(1500000);
1155 #endif
1156 #ifdef B2000000
1157 check_speed(2000000);
1158 #endif
1159 #ifdef B2500000
1160 check_speed(2500000);
1161 #endif
1162 #ifdef B3000000
1163 check_speed(3000000);
1164 #endif
1165 #ifdef B3500000
1166 check_speed(3500000);
1167 #endif
1168 #ifdef B4000000
1169 check_speed(4000000);
1170 #endif
1171 spd = B115200;
1172 } while (0);
1174 cfsetispeed(&tty, spd);
1175 cfsetospeed(&tty, spd);
1177 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1178 |INLCR|IGNCR|ICRNL|IXON);
1179 tty.c_oflag |= OPOST;
1180 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN|ISIG);
1181 tty.c_cflag &= ~(CSIZE|PARENB|PARODD|CRTSCTS|CSTOPB);
1182 switch(data_bits) {
1183 default:
1184 case 8:
1185 tty.c_cflag |= CS8;
1186 break;
1187 case 7:
1188 tty.c_cflag |= CS7;
1189 break;
1190 case 6:
1191 tty.c_cflag |= CS6;
1192 break;
1193 case 5:
1194 tty.c_cflag |= CS5;
1195 break;
1197 switch(parity) {
1198 default:
1199 case 'N':
1200 break;
1201 case 'E':
1202 tty.c_cflag |= PARENB;
1203 break;
1204 case 'O':
1205 tty.c_cflag |= PARENB | PARODD;
1206 break;
1208 if (stop_bits == 2)
1209 tty.c_cflag |= CSTOPB;
1211 tcsetattr (fd, TCSANOW, &tty);
1214 static int tty_serial_ioctl(Chardev *chr, int cmd, void *arg)
1216 FDChardev *s = FD_CHARDEV(chr);
1217 QIOChannelFile *fioc = QIO_CHANNEL_FILE(s->ioc_in);
1219 switch(cmd) {
1220 case CHR_IOCTL_SERIAL_SET_PARAMS:
1222 QEMUSerialSetParams *ssp = arg;
1223 tty_serial_init(fioc->fd,
1224 ssp->speed, ssp->parity,
1225 ssp->data_bits, ssp->stop_bits);
1227 break;
1228 case CHR_IOCTL_SERIAL_SET_BREAK:
1230 int enable = *(int *)arg;
1231 if (enable) {
1232 tcsendbreak(fioc->fd, 1);
1235 break;
1236 case CHR_IOCTL_SERIAL_GET_TIOCM:
1238 int sarg = 0;
1239 int *targ = (int *)arg;
1240 ioctl(fioc->fd, TIOCMGET, &sarg);
1241 *targ = 0;
1242 if (sarg & TIOCM_CTS)
1243 *targ |= CHR_TIOCM_CTS;
1244 if (sarg & TIOCM_CAR)
1245 *targ |= CHR_TIOCM_CAR;
1246 if (sarg & TIOCM_DSR)
1247 *targ |= CHR_TIOCM_DSR;
1248 if (sarg & TIOCM_RI)
1249 *targ |= CHR_TIOCM_RI;
1250 if (sarg & TIOCM_DTR)
1251 *targ |= CHR_TIOCM_DTR;
1252 if (sarg & TIOCM_RTS)
1253 *targ |= CHR_TIOCM_RTS;
1255 break;
1256 case CHR_IOCTL_SERIAL_SET_TIOCM:
1258 int sarg = *(int *)arg;
1259 int targ = 0;
1260 ioctl(fioc->fd, TIOCMGET, &targ);
1261 targ &= ~(CHR_TIOCM_CTS | CHR_TIOCM_CAR | CHR_TIOCM_DSR
1262 | CHR_TIOCM_RI | CHR_TIOCM_DTR | CHR_TIOCM_RTS);
1263 if (sarg & CHR_TIOCM_CTS)
1264 targ |= TIOCM_CTS;
1265 if (sarg & CHR_TIOCM_CAR)
1266 targ |= TIOCM_CAR;
1267 if (sarg & CHR_TIOCM_DSR)
1268 targ |= TIOCM_DSR;
1269 if (sarg & CHR_TIOCM_RI)
1270 targ |= TIOCM_RI;
1271 if (sarg & CHR_TIOCM_DTR)
1272 targ |= TIOCM_DTR;
1273 if (sarg & CHR_TIOCM_RTS)
1274 targ |= TIOCM_RTS;
1275 ioctl(fioc->fd, TIOCMSET, &targ);
1277 break;
1278 default:
1279 return -ENOTSUP;
1281 return 0;
1283 #endif /* __linux__ || __sun__ */
1285 #if defined(__linux__)
1287 #define HAVE_CHARDEV_PARPORT 1
1289 typedef struct {
1290 Chardev parent;
1291 int fd;
1292 int mode;
1293 } ParallelChardev;
1295 #define PARALLEL_CHARDEV(obj) \
1296 OBJECT_CHECK(ParallelChardev, (obj), TYPE_CHARDEV_PARALLEL)
1298 static int pp_hw_mode(ParallelChardev *s, uint16_t mode)
1300 if (s->mode != mode) {
1301 int m = mode;
1302 if (ioctl(s->fd, PPSETMODE, &m) < 0)
1303 return 0;
1304 s->mode = mode;
1306 return 1;
1309 static int pp_ioctl(Chardev *chr, int cmd, void *arg)
1311 ParallelChardev *drv = PARALLEL_CHARDEV(chr);
1312 int fd = drv->fd;
1313 uint8_t b;
1315 switch(cmd) {
1316 case CHR_IOCTL_PP_READ_DATA:
1317 if (ioctl(fd, PPRDATA, &b) < 0)
1318 return -ENOTSUP;
1319 *(uint8_t *)arg = b;
1320 break;
1321 case CHR_IOCTL_PP_WRITE_DATA:
1322 b = *(uint8_t *)arg;
1323 if (ioctl(fd, PPWDATA, &b) < 0)
1324 return -ENOTSUP;
1325 break;
1326 case CHR_IOCTL_PP_READ_CONTROL:
1327 if (ioctl(fd, PPRCONTROL, &b) < 0)
1328 return -ENOTSUP;
1329 /* Linux gives only the lowest bits, and no way to know data
1330 direction! For better compatibility set the fixed upper
1331 bits. */
1332 *(uint8_t *)arg = b | 0xc0;
1333 break;
1334 case CHR_IOCTL_PP_WRITE_CONTROL:
1335 b = *(uint8_t *)arg;
1336 if (ioctl(fd, PPWCONTROL, &b) < 0)
1337 return -ENOTSUP;
1338 break;
1339 case CHR_IOCTL_PP_READ_STATUS:
1340 if (ioctl(fd, PPRSTATUS, &b) < 0)
1341 return -ENOTSUP;
1342 *(uint8_t *)arg = b;
1343 break;
1344 case CHR_IOCTL_PP_DATA_DIR:
1345 if (ioctl(fd, PPDATADIR, (int *)arg) < 0)
1346 return -ENOTSUP;
1347 break;
1348 case CHR_IOCTL_PP_EPP_READ_ADDR:
1349 if (pp_hw_mode(drv, IEEE1284_MODE_EPP|IEEE1284_ADDR)) {
1350 struct ParallelIOArg *parg = arg;
1351 int n = read(fd, parg->buffer, parg->count);
1352 if (n != parg->count) {
1353 return -EIO;
1356 break;
1357 case CHR_IOCTL_PP_EPP_READ:
1358 if (pp_hw_mode(drv, IEEE1284_MODE_EPP)) {
1359 struct ParallelIOArg *parg = arg;
1360 int n = read(fd, parg->buffer, parg->count);
1361 if (n != parg->count) {
1362 return -EIO;
1365 break;
1366 case CHR_IOCTL_PP_EPP_WRITE_ADDR:
1367 if (pp_hw_mode(drv, IEEE1284_MODE_EPP|IEEE1284_ADDR)) {
1368 struct ParallelIOArg *parg = arg;
1369 int n = write(fd, parg->buffer, parg->count);
1370 if (n != parg->count) {
1371 return -EIO;
1374 break;
1375 case CHR_IOCTL_PP_EPP_WRITE:
1376 if (pp_hw_mode(drv, IEEE1284_MODE_EPP)) {
1377 struct ParallelIOArg *parg = arg;
1378 int n = write(fd, parg->buffer, parg->count);
1379 if (n != parg->count) {
1380 return -EIO;
1383 break;
1384 default:
1385 return -ENOTSUP;
1387 return 0;
1390 static void qemu_chr_open_pp_fd(Chardev *chr,
1391 int fd,
1392 bool *be_opened,
1393 Error **errp)
1395 ParallelChardev *drv = PARALLEL_CHARDEV(chr);
1397 if (ioctl(fd, PPCLAIM) < 0) {
1398 error_setg_errno(errp, errno, "not a parallel port");
1399 close(fd);
1400 return;
1403 drv->fd = fd;
1404 drv->mode = IEEE1284_MODE_COMPAT;
1406 #endif /* __linux__ */
1408 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
1410 #define HAVE_CHARDEV_PARPORT 1
1412 typedef struct {
1413 Chardev parent;
1414 int fd;
1415 } ParallelChardev;
1417 #define PARALLEL_CHARDEV(obj) \
1418 OBJECT_CHECK(ParallelChardev, (obj), TYPE_CHARDEV_PARALLEL)
1420 static int pp_ioctl(Chardev *chr, int cmd, void *arg)
1422 ParallelChardev *drv = PARALLEL_CHARDEV(chr);
1423 uint8_t b;
1425 switch (cmd) {
1426 case CHR_IOCTL_PP_READ_DATA:
1427 if (ioctl(drv->fd, PPIGDATA, &b) < 0) {
1428 return -ENOTSUP;
1430 *(uint8_t *)arg = b;
1431 break;
1432 case CHR_IOCTL_PP_WRITE_DATA:
1433 b = *(uint8_t *)arg;
1434 if (ioctl(drv->fd, PPISDATA, &b) < 0) {
1435 return -ENOTSUP;
1437 break;
1438 case CHR_IOCTL_PP_READ_CONTROL:
1439 if (ioctl(drv->fd, PPIGCTRL, &b) < 0) {
1440 return -ENOTSUP;
1442 *(uint8_t *)arg = b;
1443 break;
1444 case CHR_IOCTL_PP_WRITE_CONTROL:
1445 b = *(uint8_t *)arg;
1446 if (ioctl(drv->fd, PPISCTRL, &b) < 0) {
1447 return -ENOTSUP;
1449 break;
1450 case CHR_IOCTL_PP_READ_STATUS:
1451 if (ioctl(drv->fd, PPIGSTATUS, &b) < 0) {
1452 return -ENOTSUP;
1454 *(uint8_t *)arg = b;
1455 break;
1456 default:
1457 return -ENOTSUP;
1459 return 0;
1462 static void qemu_chr_open_pp_fd(Chardev *chr,
1463 int fd,
1464 bool *be_opened,
1465 Error **errp)
1467 ParallelChardev *drv = PARALLEL_CHARDEV(chr);
1468 drv->fd = fd;
1469 *be_opened = false;
1471 #endif
1473 #else /* _WIN32 */
1475 #define HAVE_CHARDEV_SERIAL 1
1477 typedef struct {
1478 Chardev parent;
1479 HANDLE hStdIn;
1480 HANDLE hInputReadyEvent;
1481 HANDLE hInputDoneEvent;
1482 HANDLE hInputThread;
1483 uint8_t win_stdio_buf;
1484 } WinStdioChardev;
1486 #define TYPE_CHARDEV_WIN_STDIO "chardev-win-stdio"
1487 #define WIN_STDIO_CHARDEV(obj) \
1488 OBJECT_CHECK(WinStdioChardev, (obj), TYPE_CHARDEV_WIN_STDIO)
1490 #define MAXCONNECT 1
1491 #define NTIMEOUT 5000
1493 static int win_chr_pipe_init(Chardev *chr, const char *filename,
1494 Error **errp)
1496 WinChardev *s = WIN_CHARDEV(chr);
1497 OVERLAPPED ov;
1498 int ret;
1499 DWORD size;
1500 char *openname;
1502 s->fpipe = TRUE;
1504 s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
1505 if (!s->hsend) {
1506 error_setg(errp, "Failed CreateEvent");
1507 goto fail;
1509 s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
1510 if (!s->hrecv) {
1511 error_setg(errp, "Failed CreateEvent");
1512 goto fail;
1515 openname = g_strdup_printf("\\\\.\\pipe\\%s", filename);
1516 s->hcom = CreateNamedPipe(openname, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
1517 PIPE_TYPE_BYTE | PIPE_READMODE_BYTE |
1518 PIPE_WAIT,
1519 MAXCONNECT, NSENDBUF, NRECVBUF, NTIMEOUT, NULL);
1520 g_free(openname);
1521 if (s->hcom == INVALID_HANDLE_VALUE) {
1522 error_setg(errp, "Failed CreateNamedPipe (%lu)", GetLastError());
1523 s->hcom = NULL;
1524 goto fail;
1527 ZeroMemory(&ov, sizeof(ov));
1528 ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
1529 ret = ConnectNamedPipe(s->hcom, &ov);
1530 if (ret) {
1531 error_setg(errp, "Failed ConnectNamedPipe");
1532 goto fail;
1535 ret = GetOverlappedResult(s->hcom, &ov, &size, TRUE);
1536 if (!ret) {
1537 error_setg(errp, "Failed GetOverlappedResult");
1538 if (ov.hEvent) {
1539 CloseHandle(ov.hEvent);
1540 ov.hEvent = NULL;
1542 goto fail;
1545 if (ov.hEvent) {
1546 CloseHandle(ov.hEvent);
1547 ov.hEvent = NULL;
1549 qemu_add_polling_cb(win_chr_pipe_poll, chr);
1550 return 0;
1552 fail:
1553 return -1;
1557 static void qemu_chr_open_pipe(Chardev *chr,
1558 ChardevBackend *backend,
1559 bool *be_opened,
1560 Error **errp)
1562 ChardevHostdev *opts = backend->u.pipe.data;
1563 const char *filename = opts->device;
1565 if (win_chr_pipe_init(chr, filename, errp) < 0) {
1566 return;
1570 static void qemu_chr_open_win_con(Chardev *chr,
1571 ChardevBackend *backend,
1572 bool *be_opened,
1573 Error **errp)
1575 qemu_chr_open_win_file(chr, GetStdHandle(STD_OUTPUT_HANDLE));
1578 static void char_console_class_init(ObjectClass *oc, void *data)
1580 ChardevClass *cc = CHARDEV_CLASS(oc);
1582 cc->open = qemu_chr_open_win_con;
1585 static const TypeInfo char_console_type_info = {
1586 .name = TYPE_CHARDEV_CONSOLE,
1587 .parent = TYPE_CHARDEV_WIN,
1588 .class_init = char_console_class_init,
1591 static int win_stdio_write(Chardev *chr, const uint8_t *buf, int len)
1593 HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
1594 DWORD dwSize;
1595 int len1;
1597 len1 = len;
1599 while (len1 > 0) {
1600 if (!WriteFile(hStdOut, buf, len1, &dwSize, NULL)) {
1601 break;
1603 buf += dwSize;
1604 len1 -= dwSize;
1607 return len - len1;
1610 static void win_stdio_wait_func(void *opaque)
1612 Chardev *chr = CHARDEV(opaque);
1613 WinStdioChardev *stdio = WIN_STDIO_CHARDEV(opaque);
1614 INPUT_RECORD buf[4];
1615 int ret;
1616 DWORD dwSize;
1617 int i;
1619 ret = ReadConsoleInput(stdio->hStdIn, buf, ARRAY_SIZE(buf), &dwSize);
1621 if (!ret) {
1622 /* Avoid error storm */
1623 qemu_del_wait_object(stdio->hStdIn, NULL, NULL);
1624 return;
1627 for (i = 0; i < dwSize; i++) {
1628 KEY_EVENT_RECORD *kev = &buf[i].Event.KeyEvent;
1630 if (buf[i].EventType == KEY_EVENT && kev->bKeyDown) {
1631 int j;
1632 if (kev->uChar.AsciiChar != 0) {
1633 for (j = 0; j < kev->wRepeatCount; j++) {
1634 if (qemu_chr_be_can_write(chr)) {
1635 uint8_t c = kev->uChar.AsciiChar;
1636 qemu_chr_be_write(chr, &c, 1);
1644 static DWORD WINAPI win_stdio_thread(LPVOID param)
1646 WinStdioChardev *stdio = WIN_STDIO_CHARDEV(param);
1647 int ret;
1648 DWORD dwSize;
1650 while (1) {
1652 /* Wait for one byte */
1653 ret = ReadFile(stdio->hStdIn, &stdio->win_stdio_buf, 1, &dwSize, NULL);
1655 /* Exit in case of error, continue if nothing read */
1656 if (!ret) {
1657 break;
1659 if (!dwSize) {
1660 continue;
1663 /* Some terminal emulator returns \r\n for Enter, just pass \n */
1664 if (stdio->win_stdio_buf == '\r') {
1665 continue;
1668 /* Signal the main thread and wait until the byte was eaten */
1669 if (!SetEvent(stdio->hInputReadyEvent)) {
1670 break;
1672 if (WaitForSingleObject(stdio->hInputDoneEvent, INFINITE)
1673 != WAIT_OBJECT_0) {
1674 break;
1678 qemu_del_wait_object(stdio->hInputReadyEvent, NULL, NULL);
1679 return 0;
1682 static void win_stdio_thread_wait_func(void *opaque)
1684 Chardev *chr = CHARDEV(opaque);
1685 WinStdioChardev *stdio = WIN_STDIO_CHARDEV(opaque);
1687 if (qemu_chr_be_can_write(chr)) {
1688 qemu_chr_be_write(chr, &stdio->win_stdio_buf, 1);
1691 SetEvent(stdio->hInputDoneEvent);
1694 static void qemu_chr_set_echo_win_stdio(Chardev *chr, bool echo)
1696 WinStdioChardev *stdio = WIN_STDIO_CHARDEV(chr);
1697 DWORD dwMode = 0;
1699 GetConsoleMode(stdio->hStdIn, &dwMode);
1701 if (echo) {
1702 SetConsoleMode(stdio->hStdIn, dwMode | ENABLE_ECHO_INPUT);
1703 } else {
1704 SetConsoleMode(stdio->hStdIn, dwMode & ~ENABLE_ECHO_INPUT);
1708 static void char_win_stdio_finalize(Object *obj)
1710 WinStdioChardev *stdio = WIN_STDIO_CHARDEV(obj);
1712 if (stdio->hInputReadyEvent != INVALID_HANDLE_VALUE) {
1713 CloseHandle(stdio->hInputReadyEvent);
1715 if (stdio->hInputDoneEvent != INVALID_HANDLE_VALUE) {
1716 CloseHandle(stdio->hInputDoneEvent);
1718 if (stdio->hInputThread != INVALID_HANDLE_VALUE) {
1719 TerminateThread(stdio->hInputThread, 0);
1723 static const TypeInfo char_win_stdio_type_info = {
1724 .name = TYPE_CHARDEV_WIN_STDIO,
1725 .parent = TYPE_CHARDEV,
1726 .instance_size = sizeof(WinStdioChardev),
1727 .instance_finalize = char_win_stdio_finalize,
1728 .abstract = true,
1731 static void qemu_chr_open_stdio(Chardev *chr,
1732 ChardevBackend *backend,
1733 bool *be_opened,
1734 Error **errp)
1736 WinStdioChardev *stdio = WIN_STDIO_CHARDEV(chr);
1737 DWORD dwMode;
1738 int is_console = 0;
1740 stdio->hStdIn = GetStdHandle(STD_INPUT_HANDLE);
1741 if (stdio->hStdIn == INVALID_HANDLE_VALUE) {
1742 error_setg(errp, "cannot open stdio: invalid handle");
1743 return;
1746 is_console = GetConsoleMode(stdio->hStdIn, &dwMode) != 0;
1748 if (is_console) {
1749 if (qemu_add_wait_object(stdio->hStdIn,
1750 win_stdio_wait_func, chr)) {
1751 error_setg(errp, "qemu_add_wait_object: failed");
1752 goto err1;
1754 } else {
1755 DWORD dwId;
1757 stdio->hInputReadyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
1758 stdio->hInputDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
1759 if (stdio->hInputReadyEvent == INVALID_HANDLE_VALUE
1760 || stdio->hInputDoneEvent == INVALID_HANDLE_VALUE) {
1761 error_setg(errp, "cannot create event");
1762 goto err2;
1764 if (qemu_add_wait_object(stdio->hInputReadyEvent,
1765 win_stdio_thread_wait_func, chr)) {
1766 error_setg(errp, "qemu_add_wait_object: failed");
1767 goto err2;
1769 stdio->hInputThread = CreateThread(NULL, 0, win_stdio_thread,
1770 chr, 0, &dwId);
1772 if (stdio->hInputThread == INVALID_HANDLE_VALUE) {
1773 error_setg(errp, "cannot create stdio thread");
1774 goto err3;
1778 dwMode |= ENABLE_LINE_INPUT;
1780 if (is_console) {
1781 /* set the terminal in raw mode */
1782 /* ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS */
1783 dwMode |= ENABLE_PROCESSED_INPUT;
1786 SetConsoleMode(stdio->hStdIn, dwMode);
1788 qemu_chr_set_echo_win_stdio(chr, false);
1790 return;
1792 err3:
1793 qemu_del_wait_object(stdio->hInputReadyEvent, NULL, NULL);
1794 err2:
1795 CloseHandle(stdio->hInputReadyEvent);
1796 CloseHandle(stdio->hInputDoneEvent);
1797 err1:
1798 qemu_del_wait_object(stdio->hStdIn, NULL, NULL);
1800 #endif /* !_WIN32 */
1802 /***********************************************************/
1803 /* UDP Net console */
1805 typedef struct {
1806 Chardev parent;
1807 QIOChannel *ioc;
1808 uint8_t buf[CHR_READ_BUF_LEN];
1809 int bufcnt;
1810 int bufptr;
1811 int max_size;
1812 } UdpChardev;
1814 #define UDP_CHARDEV(obj) OBJECT_CHECK(UdpChardev, (obj), TYPE_CHARDEV_UDP)
1816 /* Called with chr_write_lock held. */
1817 static int udp_chr_write(Chardev *chr, const uint8_t *buf, int len)
1819 UdpChardev *s = UDP_CHARDEV(chr);
1821 return qio_channel_write(
1822 s->ioc, (const char *)buf, len, NULL);
1825 static int udp_chr_read_poll(void *opaque)
1827 Chardev *chr = CHARDEV(opaque);
1828 UdpChardev *s = UDP_CHARDEV(opaque);
1830 s->max_size = qemu_chr_be_can_write(chr);
1832 /* If there were any stray characters in the queue process them
1833 * first
1835 while (s->max_size > 0 && s->bufptr < s->bufcnt) {
1836 qemu_chr_be_write(chr, &s->buf[s->bufptr], 1);
1837 s->bufptr++;
1838 s->max_size = qemu_chr_be_can_write(chr);
1840 return s->max_size;
1843 static gboolean udp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
1845 Chardev *chr = CHARDEV(opaque);
1846 UdpChardev *s = UDP_CHARDEV(opaque);
1847 ssize_t ret;
1849 if (s->max_size == 0) {
1850 return TRUE;
1852 ret = qio_channel_read(
1853 s->ioc, (char *)s->buf, sizeof(s->buf), NULL);
1854 if (ret <= 0) {
1855 remove_fd_in_watch(chr);
1856 return FALSE;
1858 s->bufcnt = ret;
1860 s->bufptr = 0;
1861 while (s->max_size > 0 && s->bufptr < s->bufcnt) {
1862 qemu_chr_be_write(chr, &s->buf[s->bufptr], 1);
1863 s->bufptr++;
1864 s->max_size = qemu_chr_be_can_write(chr);
1867 return TRUE;
1870 static void udp_chr_update_read_handler(Chardev *chr,
1871 GMainContext *context)
1873 UdpChardev *s = UDP_CHARDEV(chr);
1875 remove_fd_in_watch(chr);
1876 if (s->ioc) {
1877 chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
1878 udp_chr_read_poll,
1879 udp_chr_read, chr,
1880 context);
1884 static void char_udp_finalize(Object *obj)
1886 Chardev *chr = CHARDEV(obj);
1887 UdpChardev *s = UDP_CHARDEV(obj);
1889 remove_fd_in_watch(chr);
1890 if (s->ioc) {
1891 object_unref(OBJECT(s->ioc));
1893 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
1896 /***********************************************************/
1897 /* TCP Net console */
1899 typedef struct {
1900 Chardev parent;
1901 QIOChannel *ioc; /* Client I/O channel */
1902 QIOChannelSocket *sioc; /* Client master channel */
1903 QIOChannelSocket *listen_ioc;
1904 guint listen_tag;
1905 QCryptoTLSCreds *tls_creds;
1906 int connected;
1907 int max_size;
1908 int do_telnetopt;
1909 int do_nodelay;
1910 int is_unix;
1911 int *read_msgfds;
1912 size_t read_msgfds_num;
1913 int *write_msgfds;
1914 size_t write_msgfds_num;
1916 SocketAddress *addr;
1917 bool is_listen;
1918 bool is_telnet;
1920 guint reconnect_timer;
1921 int64_t reconnect_time;
1922 bool connect_err_reported;
1923 } SocketChardev;
1925 #define SOCKET_CHARDEV(obj) \
1926 OBJECT_CHECK(SocketChardev, (obj), TYPE_CHARDEV_SOCKET)
1928 static gboolean socket_reconnect_timeout(gpointer opaque);
1930 static void qemu_chr_socket_restart_timer(Chardev *chr)
1932 SocketChardev *s = SOCKET_CHARDEV(chr);
1933 char *name;
1935 assert(s->connected == 0);
1936 s->reconnect_timer = g_timeout_add_seconds(s->reconnect_time,
1937 socket_reconnect_timeout, chr);
1938 name = g_strdup_printf("chardev-socket-reconnect-%s", chr->label);
1939 g_source_set_name_by_id(s->reconnect_timer, name);
1940 g_free(name);
1943 static void check_report_connect_error(Chardev *chr,
1944 Error *err)
1946 SocketChardev *s = SOCKET_CHARDEV(chr);
1948 if (!s->connect_err_reported) {
1949 error_report("Unable to connect character device %s: %s",
1950 chr->label, error_get_pretty(err));
1951 s->connect_err_reported = true;
1953 qemu_chr_socket_restart_timer(chr);
1956 static gboolean tcp_chr_accept(QIOChannel *chan,
1957 GIOCondition cond,
1958 void *opaque);
1960 /* Called with chr_write_lock held. */
1961 static int tcp_chr_write(Chardev *chr, const uint8_t *buf, int len)
1963 SocketChardev *s = SOCKET_CHARDEV(chr);
1965 if (s->connected) {
1966 int ret = io_channel_send_full(s->ioc, buf, len,
1967 s->write_msgfds,
1968 s->write_msgfds_num);
1970 /* free the written msgfds, no matter what */
1971 if (s->write_msgfds_num) {
1972 g_free(s->write_msgfds);
1973 s->write_msgfds = 0;
1974 s->write_msgfds_num = 0;
1977 return ret;
1978 } else {
1979 /* XXX: indicate an error ? */
1980 return len;
1984 static int tcp_chr_read_poll(void *opaque)
1986 Chardev *chr = CHARDEV(opaque);
1987 SocketChardev *s = SOCKET_CHARDEV(opaque);
1988 if (!s->connected)
1989 return 0;
1990 s->max_size = qemu_chr_be_can_write(chr);
1991 return s->max_size;
1994 #define IAC 255
1995 #define IAC_BREAK 243
1996 static void tcp_chr_process_IAC_bytes(Chardev *chr,
1997 SocketChardev *s,
1998 uint8_t *buf, int *size)
2000 /* Handle any telnet client's basic IAC options to satisfy char by
2001 * char mode with no echo. All IAC options will be removed from
2002 * the buf and the do_telnetopt variable will be used to track the
2003 * state of the width of the IAC information.
2005 * IAC commands come in sets of 3 bytes with the exception of the
2006 * "IAC BREAK" command and the double IAC.
2009 int i;
2010 int j = 0;
2012 for (i = 0; i < *size; i++) {
2013 if (s->do_telnetopt > 1) {
2014 if ((unsigned char)buf[i] == IAC && s->do_telnetopt == 2) {
2015 /* Double IAC means send an IAC */
2016 if (j != i)
2017 buf[j] = buf[i];
2018 j++;
2019 s->do_telnetopt = 1;
2020 } else {
2021 if ((unsigned char)buf[i] == IAC_BREAK && s->do_telnetopt == 2) {
2022 /* Handle IAC break commands by sending a serial break */
2023 qemu_chr_be_event(chr, CHR_EVENT_BREAK);
2024 s->do_telnetopt++;
2026 s->do_telnetopt++;
2028 if (s->do_telnetopt >= 4) {
2029 s->do_telnetopt = 1;
2031 } else {
2032 if ((unsigned char)buf[i] == IAC) {
2033 s->do_telnetopt = 2;
2034 } else {
2035 if (j != i)
2036 buf[j] = buf[i];
2037 j++;
2041 *size = j;
2044 static int tcp_get_msgfds(Chardev *chr, int *fds, int num)
2046 SocketChardev *s = SOCKET_CHARDEV(chr);
2048 int to_copy = (s->read_msgfds_num < num) ? s->read_msgfds_num : num;
2050 assert(num <= TCP_MAX_FDS);
2052 if (to_copy) {
2053 int i;
2055 memcpy(fds, s->read_msgfds, to_copy * sizeof(int));
2057 /* Close unused fds */
2058 for (i = to_copy; i < s->read_msgfds_num; i++) {
2059 close(s->read_msgfds[i]);
2062 g_free(s->read_msgfds);
2063 s->read_msgfds = 0;
2064 s->read_msgfds_num = 0;
2067 return to_copy;
2070 static int tcp_set_msgfds(Chardev *chr, int *fds, int num)
2072 SocketChardev *s = SOCKET_CHARDEV(chr);
2074 /* clear old pending fd array */
2075 g_free(s->write_msgfds);
2076 s->write_msgfds = NULL;
2077 s->write_msgfds_num = 0;
2079 if (!s->connected ||
2080 !qio_channel_has_feature(s->ioc,
2081 QIO_CHANNEL_FEATURE_FD_PASS)) {
2082 return -1;
2085 if (num) {
2086 s->write_msgfds = g_new(int, num);
2087 memcpy(s->write_msgfds, fds, num * sizeof(int));
2090 s->write_msgfds_num = num;
2092 return 0;
2095 static ssize_t tcp_chr_recv(Chardev *chr, char *buf, size_t len)
2097 SocketChardev *s = SOCKET_CHARDEV(chr);
2098 struct iovec iov = { .iov_base = buf, .iov_len = len };
2099 int ret;
2100 size_t i;
2101 int *msgfds = NULL;
2102 size_t msgfds_num = 0;
2104 if (qio_channel_has_feature(s->ioc, QIO_CHANNEL_FEATURE_FD_PASS)) {
2105 ret = qio_channel_readv_full(s->ioc, &iov, 1,
2106 &msgfds, &msgfds_num,
2107 NULL);
2108 } else {
2109 ret = qio_channel_readv_full(s->ioc, &iov, 1,
2110 NULL, NULL,
2111 NULL);
2114 if (ret == QIO_CHANNEL_ERR_BLOCK) {
2115 errno = EAGAIN;
2116 ret = -1;
2117 } else if (ret == -1) {
2118 errno = EIO;
2121 if (msgfds_num) {
2122 /* close and clean read_msgfds */
2123 for (i = 0; i < s->read_msgfds_num; i++) {
2124 close(s->read_msgfds[i]);
2127 if (s->read_msgfds_num) {
2128 g_free(s->read_msgfds);
2131 s->read_msgfds = msgfds;
2132 s->read_msgfds_num = msgfds_num;
2135 for (i = 0; i < s->read_msgfds_num; i++) {
2136 int fd = s->read_msgfds[i];
2137 if (fd < 0) {
2138 continue;
2141 /* O_NONBLOCK is preserved across SCM_RIGHTS so reset it */
2142 qemu_set_block(fd);
2144 #ifndef MSG_CMSG_CLOEXEC
2145 qemu_set_cloexec(fd);
2146 #endif
2149 return ret;
2152 static GSource *tcp_chr_add_watch(Chardev *chr, GIOCondition cond)
2154 SocketChardev *s = SOCKET_CHARDEV(chr);
2155 return qio_channel_create_watch(s->ioc, cond);
2158 static void tcp_chr_free_connection(Chardev *chr)
2160 SocketChardev *s = SOCKET_CHARDEV(chr);
2161 int i;
2163 if (!s->connected) {
2164 return;
2167 if (s->read_msgfds_num) {
2168 for (i = 0; i < s->read_msgfds_num; i++) {
2169 close(s->read_msgfds[i]);
2171 g_free(s->read_msgfds);
2172 s->read_msgfds = NULL;
2173 s->read_msgfds_num = 0;
2176 tcp_set_msgfds(chr, NULL, 0);
2177 remove_fd_in_watch(chr);
2178 object_unref(OBJECT(s->sioc));
2179 s->sioc = NULL;
2180 object_unref(OBJECT(s->ioc));
2181 s->ioc = NULL;
2182 g_free(chr->filename);
2183 chr->filename = NULL;
2184 s->connected = 0;
2187 static void tcp_chr_disconnect(Chardev *chr)
2189 SocketChardev *s = SOCKET_CHARDEV(chr);
2191 if (!s->connected) {
2192 return;
2195 tcp_chr_free_connection(chr);
2197 if (s->listen_ioc) {
2198 s->listen_tag = qio_channel_add_watch(
2199 QIO_CHANNEL(s->listen_ioc), G_IO_IN, tcp_chr_accept, chr, NULL);
2201 chr->filename = SocketAddress_to_str("disconnected:", s->addr,
2202 s->is_listen, s->is_telnet);
2203 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
2204 if (s->reconnect_time) {
2205 qemu_chr_socket_restart_timer(chr);
2209 static gboolean tcp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
2211 Chardev *chr = CHARDEV(opaque);
2212 SocketChardev *s = SOCKET_CHARDEV(opaque);
2213 uint8_t buf[CHR_READ_BUF_LEN];
2214 int len, size;
2216 if (!s->connected || s->max_size <= 0) {
2217 return TRUE;
2219 len = sizeof(buf);
2220 if (len > s->max_size)
2221 len = s->max_size;
2222 size = tcp_chr_recv(chr, (void *)buf, len);
2223 if (size == 0 || size == -1) {
2224 /* connection closed */
2225 tcp_chr_disconnect(chr);
2226 } else if (size > 0) {
2227 if (s->do_telnetopt)
2228 tcp_chr_process_IAC_bytes(chr, s, buf, &size);
2229 if (size > 0)
2230 qemu_chr_be_write(chr, buf, size);
2233 return TRUE;
2236 static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len)
2238 SocketChardev *s = SOCKET_CHARDEV(chr);
2239 int size;
2241 if (!s->connected) {
2242 return 0;
2245 size = tcp_chr_recv(chr, (void *) buf, len);
2246 if (size == 0) {
2247 /* connection closed */
2248 tcp_chr_disconnect(chr);
2251 return size;
2254 static void tcp_chr_connect(void *opaque)
2256 Chardev *chr = CHARDEV(opaque);
2257 SocketChardev *s = SOCKET_CHARDEV(opaque);
2259 g_free(chr->filename);
2260 chr->filename = sockaddr_to_str(
2261 &s->sioc->localAddr, s->sioc->localAddrLen,
2262 &s->sioc->remoteAddr, s->sioc->remoteAddrLen,
2263 s->is_listen, s->is_telnet);
2265 s->connected = 1;
2266 if (s->ioc) {
2267 chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
2268 tcp_chr_read_poll,
2269 tcp_chr_read,
2270 chr, NULL);
2272 qemu_chr_be_generic_open(chr);
2275 static void tcp_chr_update_read_handler(Chardev *chr,
2276 GMainContext *context)
2278 SocketChardev *s = SOCKET_CHARDEV(chr);
2280 if (!s->connected) {
2281 return;
2284 remove_fd_in_watch(chr);
2285 if (s->ioc) {
2286 chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
2287 tcp_chr_read_poll,
2288 tcp_chr_read, chr,
2289 context);
2293 typedef struct {
2294 Chardev *chr;
2295 char buf[12];
2296 size_t buflen;
2297 } TCPChardevTelnetInit;
2299 static gboolean tcp_chr_telnet_init_io(QIOChannel *ioc,
2300 GIOCondition cond G_GNUC_UNUSED,
2301 gpointer user_data)
2303 TCPChardevTelnetInit *init = user_data;
2304 ssize_t ret;
2306 ret = qio_channel_write(ioc, init->buf, init->buflen, NULL);
2307 if (ret < 0) {
2308 if (ret == QIO_CHANNEL_ERR_BLOCK) {
2309 ret = 0;
2310 } else {
2311 tcp_chr_disconnect(init->chr);
2312 return FALSE;
2315 init->buflen -= ret;
2317 if (init->buflen == 0) {
2318 tcp_chr_connect(init->chr);
2319 return FALSE;
2322 memmove(init->buf, init->buf + ret, init->buflen);
2324 return TRUE;
2327 static void tcp_chr_telnet_init(Chardev *chr)
2329 SocketChardev *s = SOCKET_CHARDEV(chr);
2330 TCPChardevTelnetInit *init = g_new0(TCPChardevTelnetInit, 1);
2331 size_t n = 0;
2333 init->chr = chr;
2334 init->buflen = 12;
2336 #define IACSET(x, a, b, c) \
2337 do { \
2338 x[n++] = a; \
2339 x[n++] = b; \
2340 x[n++] = c; \
2341 } while (0)
2343 /* Prep the telnet negotion to put telnet in binary,
2344 * no echo, single char mode */
2345 IACSET(init->buf, 0xff, 0xfb, 0x01); /* IAC WILL ECHO */
2346 IACSET(init->buf, 0xff, 0xfb, 0x03); /* IAC WILL Suppress go ahead */
2347 IACSET(init->buf, 0xff, 0xfb, 0x00); /* IAC WILL Binary */
2348 IACSET(init->buf, 0xff, 0xfd, 0x00); /* IAC DO Binary */
2350 #undef IACSET
2352 qio_channel_add_watch(
2353 s->ioc, G_IO_OUT,
2354 tcp_chr_telnet_init_io,
2355 init, NULL);
2359 static void tcp_chr_tls_handshake(QIOTask *task,
2360 gpointer user_data)
2362 Chardev *chr = user_data;
2363 SocketChardev *s = user_data;
2365 if (qio_task_propagate_error(task, NULL)) {
2366 tcp_chr_disconnect(chr);
2367 } else {
2368 if (s->do_telnetopt) {
2369 tcp_chr_telnet_init(chr);
2370 } else {
2371 tcp_chr_connect(chr);
2377 static void tcp_chr_tls_init(Chardev *chr)
2379 SocketChardev *s = SOCKET_CHARDEV(chr);
2380 QIOChannelTLS *tioc;
2381 Error *err = NULL;
2382 gchar *name;
2384 if (s->is_listen) {
2385 tioc = qio_channel_tls_new_server(
2386 s->ioc, s->tls_creds,
2387 NULL, /* XXX Use an ACL */
2388 &err);
2389 } else {
2390 tioc = qio_channel_tls_new_client(
2391 s->ioc, s->tls_creds,
2392 s->addr->u.inet.data->host,
2393 &err);
2395 if (tioc == NULL) {
2396 error_free(err);
2397 tcp_chr_disconnect(chr);
2398 return;
2400 name = g_strdup_printf("chardev-tls-%s-%s",
2401 s->is_listen ? "server" : "client",
2402 chr->label);
2403 qio_channel_set_name(QIO_CHANNEL(tioc), name);
2404 g_free(name);
2405 object_unref(OBJECT(s->ioc));
2406 s->ioc = QIO_CHANNEL(tioc);
2408 qio_channel_tls_handshake(tioc,
2409 tcp_chr_tls_handshake,
2410 chr,
2411 NULL);
2415 static void tcp_chr_set_client_ioc_name(Chardev *chr,
2416 QIOChannelSocket *sioc)
2418 SocketChardev *s = SOCKET_CHARDEV(chr);
2419 char *name;
2420 name = g_strdup_printf("chardev-tcp-%s-%s",
2421 s->is_listen ? "server" : "client",
2422 chr->label);
2423 qio_channel_set_name(QIO_CHANNEL(sioc), name);
2424 g_free(name);
2428 static int tcp_chr_new_client(Chardev *chr, QIOChannelSocket *sioc)
2430 SocketChardev *s = SOCKET_CHARDEV(chr);
2432 if (s->ioc != NULL) {
2433 return -1;
2436 s->ioc = QIO_CHANNEL(sioc);
2437 object_ref(OBJECT(sioc));
2438 s->sioc = sioc;
2439 object_ref(OBJECT(sioc));
2441 qio_channel_set_blocking(s->ioc, false, NULL);
2443 if (s->do_nodelay) {
2444 qio_channel_set_delay(s->ioc, false);
2446 if (s->listen_tag) {
2447 g_source_remove(s->listen_tag);
2448 s->listen_tag = 0;
2451 if (s->tls_creds) {
2452 tcp_chr_tls_init(chr);
2453 } else {
2454 if (s->do_telnetopt) {
2455 tcp_chr_telnet_init(chr);
2456 } else {
2457 tcp_chr_connect(chr);
2461 return 0;
2465 static int tcp_chr_add_client(Chardev *chr, int fd)
2467 int ret;
2468 QIOChannelSocket *sioc;
2470 sioc = qio_channel_socket_new_fd(fd, NULL);
2471 if (!sioc) {
2472 return -1;
2474 tcp_chr_set_client_ioc_name(chr, sioc);
2475 ret = tcp_chr_new_client(chr, sioc);
2476 object_unref(OBJECT(sioc));
2477 return ret;
2480 static gboolean tcp_chr_accept(QIOChannel *channel,
2481 GIOCondition cond,
2482 void *opaque)
2484 Chardev *chr = CHARDEV(opaque);
2485 QIOChannelSocket *sioc;
2487 sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(channel),
2488 NULL);
2489 if (!sioc) {
2490 return TRUE;
2493 tcp_chr_new_client(chr, sioc);
2495 object_unref(OBJECT(sioc));
2497 return TRUE;
2500 static int tcp_chr_wait_connected(Chardev *chr, Error **errp)
2502 SocketChardev *s = SOCKET_CHARDEV(chr);
2503 QIOChannelSocket *sioc;
2505 /* It can't wait on s->connected, since it is set asynchronously
2506 * in TLS and telnet cases, only wait for an accepted socket */
2507 while (!s->ioc) {
2508 if (s->is_listen) {
2509 error_report("QEMU waiting for connection on: %s",
2510 chr->filename);
2511 qio_channel_set_blocking(QIO_CHANNEL(s->listen_ioc), true, NULL);
2512 tcp_chr_accept(QIO_CHANNEL(s->listen_ioc), G_IO_IN, chr);
2513 qio_channel_set_blocking(QIO_CHANNEL(s->listen_ioc), false, NULL);
2514 } else {
2515 sioc = qio_channel_socket_new();
2516 tcp_chr_set_client_ioc_name(chr, sioc);
2517 if (qio_channel_socket_connect_sync(sioc, s->addr, errp) < 0) {
2518 object_unref(OBJECT(sioc));
2519 return -1;
2521 tcp_chr_new_client(chr, sioc);
2522 object_unref(OBJECT(sioc));
2526 return 0;
2529 static int qemu_chr_wait_connected(Chardev *chr, Error **errp)
2531 ChardevClass *cc = CHARDEV_GET_CLASS(chr);
2533 if (cc->chr_wait_connected) {
2534 return cc->chr_wait_connected(chr, errp);
2537 return 0;
2540 int qemu_chr_fe_wait_connected(CharBackend *be, Error **errp)
2542 if (!be->chr) {
2543 error_setg(errp, "missing associated backend");
2544 return -1;
2547 return qemu_chr_wait_connected(be->chr, errp);
2550 static void char_socket_finalize(Object *obj)
2552 Chardev *chr = CHARDEV(obj);
2553 SocketChardev *s = SOCKET_CHARDEV(obj);
2555 tcp_chr_free_connection(chr);
2557 if (s->reconnect_timer) {
2558 g_source_remove(s->reconnect_timer);
2559 s->reconnect_timer = 0;
2561 qapi_free_SocketAddress(s->addr);
2562 if (s->listen_tag) {
2563 g_source_remove(s->listen_tag);
2564 s->listen_tag = 0;
2566 if (s->listen_ioc) {
2567 object_unref(OBJECT(s->listen_ioc));
2569 if (s->tls_creds) {
2570 object_unref(OBJECT(s->tls_creds));
2573 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
2577 static void qemu_chr_socket_connected(QIOTask *task, void *opaque)
2579 QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task));
2580 Chardev *chr = CHARDEV(opaque);
2581 SocketChardev *s = SOCKET_CHARDEV(chr);
2582 Error *err = NULL;
2584 if (qio_task_propagate_error(task, &err)) {
2585 check_report_connect_error(chr, err);
2586 error_free(err);
2587 goto cleanup;
2590 s->connect_err_reported = false;
2591 tcp_chr_new_client(chr, sioc);
2593 cleanup:
2594 object_unref(OBJECT(sioc));
2598 QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename)
2600 char host[65], port[33], width[8], height[8];
2601 int pos;
2602 const char *p;
2603 QemuOpts *opts;
2604 Error *local_err = NULL;
2606 opts = qemu_opts_create(qemu_find_opts("chardev"), label, 1, &local_err);
2607 if (local_err) {
2608 error_report_err(local_err);
2609 return NULL;
2612 if (strstart(filename, "mon:", &p)) {
2613 filename = p;
2614 qemu_opt_set(opts, "mux", "on", &error_abort);
2615 if (strcmp(filename, "stdio") == 0) {
2616 /* Monitor is muxed to stdio: do not exit on Ctrl+C by default
2617 * but pass it to the guest. Handle this only for compat syntax,
2618 * for -chardev syntax we have special option for this.
2619 * This is what -nographic did, redirecting+muxing serial+monitor
2620 * to stdio causing Ctrl+C to be passed to guest. */
2621 qemu_opt_set(opts, "signal", "off", &error_abort);
2625 if (strcmp(filename, "null") == 0 ||
2626 strcmp(filename, "pty") == 0 ||
2627 strcmp(filename, "msmouse") == 0 ||
2628 strcmp(filename, "braille") == 0 ||
2629 strcmp(filename, "testdev") == 0 ||
2630 strcmp(filename, "stdio") == 0) {
2631 qemu_opt_set(opts, "backend", filename, &error_abort);
2632 return opts;
2634 if (strstart(filename, "vc", &p)) {
2635 qemu_opt_set(opts, "backend", "vc", &error_abort);
2636 if (*p == ':') {
2637 if (sscanf(p+1, "%7[0-9]x%7[0-9]", width, height) == 2) {
2638 /* pixels */
2639 qemu_opt_set(opts, "width", width, &error_abort);
2640 qemu_opt_set(opts, "height", height, &error_abort);
2641 } else if (sscanf(p+1, "%7[0-9]Cx%7[0-9]C", width, height) == 2) {
2642 /* chars */
2643 qemu_opt_set(opts, "cols", width, &error_abort);
2644 qemu_opt_set(opts, "rows", height, &error_abort);
2645 } else {
2646 goto fail;
2649 return opts;
2651 if (strcmp(filename, "con:") == 0) {
2652 qemu_opt_set(opts, "backend", "console", &error_abort);
2653 return opts;
2655 if (strstart(filename, "COM", NULL)) {
2656 qemu_opt_set(opts, "backend", "serial", &error_abort);
2657 qemu_opt_set(opts, "path", filename, &error_abort);
2658 return opts;
2660 if (strstart(filename, "file:", &p)) {
2661 qemu_opt_set(opts, "backend", "file", &error_abort);
2662 qemu_opt_set(opts, "path", p, &error_abort);
2663 return opts;
2665 if (strstart(filename, "pipe:", &p)) {
2666 qemu_opt_set(opts, "backend", "pipe", &error_abort);
2667 qemu_opt_set(opts, "path", p, &error_abort);
2668 return opts;
2670 if (strstart(filename, "tcp:", &p) ||
2671 strstart(filename, "telnet:", &p)) {
2672 if (sscanf(p, "%64[^:]:%32[^,]%n", host, port, &pos) < 2) {
2673 host[0] = 0;
2674 if (sscanf(p, ":%32[^,]%n", port, &pos) < 1)
2675 goto fail;
2677 qemu_opt_set(opts, "backend", "socket", &error_abort);
2678 qemu_opt_set(opts, "host", host, &error_abort);
2679 qemu_opt_set(opts, "port", port, &error_abort);
2680 if (p[pos] == ',') {
2681 qemu_opts_do_parse(opts, p+pos+1, NULL, &local_err);
2682 if (local_err) {
2683 error_report_err(local_err);
2684 goto fail;
2687 if (strstart(filename, "telnet:", &p))
2688 qemu_opt_set(opts, "telnet", "on", &error_abort);
2689 return opts;
2691 if (strstart(filename, "udp:", &p)) {
2692 qemu_opt_set(opts, "backend", "udp", &error_abort);
2693 if (sscanf(p, "%64[^:]:%32[^@,]%n", host, port, &pos) < 2) {
2694 host[0] = 0;
2695 if (sscanf(p, ":%32[^@,]%n", port, &pos) < 1) {
2696 goto fail;
2699 qemu_opt_set(opts, "host", host, &error_abort);
2700 qemu_opt_set(opts, "port", port, &error_abort);
2701 if (p[pos] == '@') {
2702 p += pos + 1;
2703 if (sscanf(p, "%64[^:]:%32[^,]%n", host, port, &pos) < 2) {
2704 host[0] = 0;
2705 if (sscanf(p, ":%32[^,]%n", port, &pos) < 1) {
2706 goto fail;
2709 qemu_opt_set(opts, "localaddr", host, &error_abort);
2710 qemu_opt_set(opts, "localport", port, &error_abort);
2712 return opts;
2714 if (strstart(filename, "unix:", &p)) {
2715 qemu_opt_set(opts, "backend", "socket", &error_abort);
2716 qemu_opts_do_parse(opts, p, "path", &local_err);
2717 if (local_err) {
2718 error_report_err(local_err);
2719 goto fail;
2721 return opts;
2723 if (strstart(filename, "/dev/parport", NULL) ||
2724 strstart(filename, "/dev/ppi", NULL)) {
2725 qemu_opt_set(opts, "backend", "parport", &error_abort);
2726 qemu_opt_set(opts, "path", filename, &error_abort);
2727 return opts;
2729 if (strstart(filename, "/dev/", NULL)) {
2730 qemu_opt_set(opts, "backend", "tty", &error_abort);
2731 qemu_opt_set(opts, "path", filename, &error_abort);
2732 return opts;
2735 fail:
2736 qemu_opts_del(opts);
2737 return NULL;
2740 void qemu_chr_parse_common(QemuOpts *opts, ChardevCommon *backend)
2742 const char *logfile = qemu_opt_get(opts, "logfile");
2744 backend->has_logfile = logfile != NULL;
2745 backend->logfile = logfile ? g_strdup(logfile) : NULL;
2747 backend->has_logappend = true;
2748 backend->logappend = qemu_opt_get_bool(opts, "logappend", false);
2752 static void qemu_chr_parse_file_out(QemuOpts *opts, ChardevBackend *backend,
2753 Error **errp)
2755 const char *path = qemu_opt_get(opts, "path");
2756 ChardevFile *file;
2758 backend->type = CHARDEV_BACKEND_KIND_FILE;
2759 if (path == NULL) {
2760 error_setg(errp, "chardev: file: no filename given");
2761 return;
2763 file = backend->u.file.data = g_new0(ChardevFile, 1);
2764 qemu_chr_parse_common(opts, qapi_ChardevFile_base(file));
2765 file->out = g_strdup(path);
2767 file->has_append = true;
2768 file->append = qemu_opt_get_bool(opts, "append", false);
2771 static void qemu_chr_parse_stdio(QemuOpts *opts, ChardevBackend *backend,
2772 Error **errp)
2774 ChardevStdio *stdio;
2776 backend->type = CHARDEV_BACKEND_KIND_STDIO;
2777 stdio = backend->u.stdio.data = g_new0(ChardevStdio, 1);
2778 qemu_chr_parse_common(opts, qapi_ChardevStdio_base(stdio));
2779 stdio->has_signal = true;
2780 stdio->signal = qemu_opt_get_bool(opts, "signal", true);
2783 static void char_stdio_class_init(ObjectClass *oc, void *data)
2785 ChardevClass *cc = CHARDEV_CLASS(oc);
2787 cc->parse = qemu_chr_parse_stdio;
2788 cc->open = qemu_chr_open_stdio;
2789 #ifdef _WIN32
2790 cc->chr_write = win_stdio_write;
2791 cc->chr_set_echo = qemu_chr_set_echo_win_stdio;
2792 #else
2793 cc->chr_set_echo = qemu_chr_set_echo_stdio;
2794 #endif
2797 static const TypeInfo char_stdio_type_info = {
2798 .name = TYPE_CHARDEV_STDIO,
2799 #ifdef _WIN32
2800 .parent = TYPE_CHARDEV_WIN_STDIO,
2801 #else
2802 .parent = TYPE_CHARDEV_FD,
2803 .instance_finalize = char_stdio_finalize,
2804 #endif
2805 .class_init = char_stdio_class_init,
2808 #ifdef HAVE_CHARDEV_SERIAL
2809 static void qemu_chr_parse_serial(QemuOpts *opts, ChardevBackend *backend,
2810 Error **errp)
2812 const char *device = qemu_opt_get(opts, "path");
2813 ChardevHostdev *serial;
2815 backend->type = CHARDEV_BACKEND_KIND_SERIAL;
2816 if (device == NULL) {
2817 error_setg(errp, "chardev: serial/tty: no device path given");
2818 return;
2820 serial = backend->u.serial.data = g_new0(ChardevHostdev, 1);
2821 qemu_chr_parse_common(opts, qapi_ChardevHostdev_base(serial));
2822 serial->device = g_strdup(device);
2824 #endif
2826 #ifdef HAVE_CHARDEV_PARPORT
2827 static void qemu_chr_parse_parallel(QemuOpts *opts, ChardevBackend *backend,
2828 Error **errp)
2830 const char *device = qemu_opt_get(opts, "path");
2831 ChardevHostdev *parallel;
2833 backend->type = CHARDEV_BACKEND_KIND_PARALLEL;
2834 if (device == NULL) {
2835 error_setg(errp, "chardev: parallel: no device path given");
2836 return;
2838 parallel = backend->u.parallel.data = g_new0(ChardevHostdev, 1);
2839 qemu_chr_parse_common(opts, qapi_ChardevHostdev_base(parallel));
2840 parallel->device = g_strdup(device);
2842 #endif
2844 static void qemu_chr_parse_pipe(QemuOpts *opts, ChardevBackend *backend,
2845 Error **errp)
2847 const char *device = qemu_opt_get(opts, "path");
2848 ChardevHostdev *dev;
2850 backend->type = CHARDEV_BACKEND_KIND_PIPE;
2851 if (device == NULL) {
2852 error_setg(errp, "chardev: pipe: no device path given");
2853 return;
2855 dev = backend->u.pipe.data = g_new0(ChardevHostdev, 1);
2856 qemu_chr_parse_common(opts, qapi_ChardevHostdev_base(dev));
2857 dev->device = g_strdup(device);
2860 static void char_pipe_class_init(ObjectClass *oc, void *data)
2862 ChardevClass *cc = CHARDEV_CLASS(oc);
2864 cc->parse = qemu_chr_parse_pipe;
2865 cc->open = qemu_chr_open_pipe;
2868 static const TypeInfo char_pipe_type_info = {
2869 .name = TYPE_CHARDEV_PIPE,
2870 #ifdef _WIN32
2871 .parent = TYPE_CHARDEV_WIN,
2872 #else
2873 .parent = TYPE_CHARDEV_FD,
2874 #endif
2875 .class_init = char_pipe_class_init,
2878 static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
2879 Error **errp)
2881 bool is_listen = qemu_opt_get_bool(opts, "server", false);
2882 bool is_waitconnect = is_listen && qemu_opt_get_bool(opts, "wait", true);
2883 bool is_telnet = qemu_opt_get_bool(opts, "telnet", false);
2884 bool do_nodelay = !qemu_opt_get_bool(opts, "delay", true);
2885 int64_t reconnect = qemu_opt_get_number(opts, "reconnect", 0);
2886 const char *path = qemu_opt_get(opts, "path");
2887 const char *host = qemu_opt_get(opts, "host");
2888 const char *port = qemu_opt_get(opts, "port");
2889 const char *tls_creds = qemu_opt_get(opts, "tls-creds");
2890 SocketAddress *addr;
2891 ChardevSocket *sock;
2893 backend->type = CHARDEV_BACKEND_KIND_SOCKET;
2894 if (!path) {
2895 if (!host) {
2896 error_setg(errp, "chardev: socket: no host given");
2897 return;
2899 if (!port) {
2900 error_setg(errp, "chardev: socket: no port given");
2901 return;
2903 } else {
2904 if (tls_creds) {
2905 error_setg(errp, "TLS can only be used over TCP socket");
2906 return;
2910 sock = backend->u.socket.data = g_new0(ChardevSocket, 1);
2911 qemu_chr_parse_common(opts, qapi_ChardevSocket_base(sock));
2913 sock->has_nodelay = true;
2914 sock->nodelay = do_nodelay;
2915 sock->has_server = true;
2916 sock->server = is_listen;
2917 sock->has_telnet = true;
2918 sock->telnet = is_telnet;
2919 sock->has_wait = true;
2920 sock->wait = is_waitconnect;
2921 sock->has_reconnect = true;
2922 sock->reconnect = reconnect;
2923 sock->tls_creds = g_strdup(tls_creds);
2925 addr = g_new0(SocketAddress, 1);
2926 if (path) {
2927 UnixSocketAddress *q_unix;
2928 addr->type = SOCKET_ADDRESS_KIND_UNIX;
2929 q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
2930 q_unix->path = g_strdup(path);
2931 } else {
2932 addr->type = SOCKET_ADDRESS_KIND_INET;
2933 addr->u.inet.data = g_new(InetSocketAddress, 1);
2934 *addr->u.inet.data = (InetSocketAddress) {
2935 .host = g_strdup(host),
2936 .port = g_strdup(port),
2937 .has_to = qemu_opt_get(opts, "to"),
2938 .to = qemu_opt_get_number(opts, "to", 0),
2939 .has_ipv4 = qemu_opt_get(opts, "ipv4"),
2940 .ipv4 = qemu_opt_get_bool(opts, "ipv4", 0),
2941 .has_ipv6 = qemu_opt_get(opts, "ipv6"),
2942 .ipv6 = qemu_opt_get_bool(opts, "ipv6", 0),
2945 sock->addr = addr;
2948 static void qemu_chr_parse_udp(QemuOpts *opts, ChardevBackend *backend,
2949 Error **errp)
2951 const char *host = qemu_opt_get(opts, "host");
2952 const char *port = qemu_opt_get(opts, "port");
2953 const char *localaddr = qemu_opt_get(opts, "localaddr");
2954 const char *localport = qemu_opt_get(opts, "localport");
2955 bool has_local = false;
2956 SocketAddress *addr;
2957 ChardevUdp *udp;
2959 backend->type = CHARDEV_BACKEND_KIND_UDP;
2960 if (host == NULL || strlen(host) == 0) {
2961 host = "localhost";
2963 if (port == NULL || strlen(port) == 0) {
2964 error_setg(errp, "chardev: udp: remote port not specified");
2965 return;
2967 if (localport == NULL || strlen(localport) == 0) {
2968 localport = "0";
2969 } else {
2970 has_local = true;
2972 if (localaddr == NULL || strlen(localaddr) == 0) {
2973 localaddr = "";
2974 } else {
2975 has_local = true;
2978 udp = backend->u.udp.data = g_new0(ChardevUdp, 1);
2979 qemu_chr_parse_common(opts, qapi_ChardevUdp_base(udp));
2981 addr = g_new0(SocketAddress, 1);
2982 addr->type = SOCKET_ADDRESS_KIND_INET;
2983 addr->u.inet.data = g_new(InetSocketAddress, 1);
2984 *addr->u.inet.data = (InetSocketAddress) {
2985 .host = g_strdup(host),
2986 .port = g_strdup(port),
2987 .has_ipv4 = qemu_opt_get(opts, "ipv4"),
2988 .ipv4 = qemu_opt_get_bool(opts, "ipv4", 0),
2989 .has_ipv6 = qemu_opt_get(opts, "ipv6"),
2990 .ipv6 = qemu_opt_get_bool(opts, "ipv6", 0),
2992 udp->remote = addr;
2994 if (has_local) {
2995 udp->has_local = true;
2996 addr = g_new0(SocketAddress, 1);
2997 addr->type = SOCKET_ADDRESS_KIND_INET;
2998 addr->u.inet.data = g_new(InetSocketAddress, 1);
2999 *addr->u.inet.data = (InetSocketAddress) {
3000 .host = g_strdup(localaddr),
3001 .port = g_strdup(localport),
3003 udp->local = addr;
3007 static const ChardevClass *char_get_class(const char *driver, Error **errp)
3009 ObjectClass *oc;
3010 const ChardevClass *cc;
3011 char *typename = g_strdup_printf("chardev-%s", driver);
3013 oc = object_class_by_name(typename);
3014 g_free(typename);
3016 if (!object_class_dynamic_cast(oc, TYPE_CHARDEV)) {
3017 error_setg(errp, "'%s' is not a valid char driver name", driver);
3018 return NULL;
3021 if (object_class_is_abstract(oc)) {
3022 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "driver",
3023 "abstract device type");
3024 return NULL;
3027 cc = CHARDEV_CLASS(oc);
3028 if (cc->internal) {
3029 error_setg(errp, "'%s' is not a valid char driver name", driver);
3030 return NULL;
3033 return cc;
3036 static Chardev *qemu_chardev_add(const char *id, const char *typename,
3037 ChardevBackend *backend, Error **errp)
3039 Chardev *chr;
3041 chr = qemu_chr_find(id);
3042 if (chr) {
3043 error_setg(errp, "Chardev '%s' already exists", id);
3044 return NULL;
3047 chr = qemu_chardev_new(id, typename, backend, errp);
3048 if (!chr) {
3049 return NULL;
3052 QTAILQ_INSERT_TAIL(&chardevs, chr, next);
3053 return chr;
3056 static const struct ChardevAlias {
3057 const char *typename;
3058 const char *alias;
3059 } chardev_alias_table[] = {
3060 #ifdef HAVE_CHARDEV_PARPORT
3061 { "parallel", "parport" },
3062 #endif
3063 #ifdef HAVE_CHARDEV_SERIAL
3064 { "serial", "tty" },
3065 #endif
3068 typedef struct ChadevClassFE {
3069 void (*fn)(const char *name, void *opaque);
3070 void *opaque;
3071 } ChadevClassFE;
3073 static void
3074 chardev_class_foreach(ObjectClass *klass, void *opaque)
3076 ChadevClassFE *fe = opaque;
3078 assert(g_str_has_prefix(object_class_get_name(klass), "chardev-"));
3079 if (CHARDEV_CLASS(klass)->internal) {
3080 return;
3083 fe->fn(object_class_get_name(klass) + 8, fe->opaque);
3086 static void
3087 chardev_name_foreach(void (*fn)(const char *name, void *opaque), void *opaque)
3089 ChadevClassFE fe = { .fn = fn, .opaque = opaque };
3090 int i;
3092 object_class_foreach(chardev_class_foreach, TYPE_CHARDEV, false, &fe);
3094 for (i = 0; i < ARRAY_SIZE(chardev_alias_table); i++) {
3095 fn(chardev_alias_table[i].alias, opaque);
3099 static void
3100 help_string_append(const char *name, void *opaque)
3102 GString *str = opaque;
3104 g_string_append_printf(str, "\n%s", name);
3107 Chardev *qemu_chr_new_from_opts(QemuOpts *opts,
3108 Error **errp)
3110 Error *local_err = NULL;
3111 const ChardevClass *cc;
3112 Chardev *chr;
3113 int i;
3114 ChardevBackend *backend = NULL;
3115 const char *name = qemu_opt_get(opts, "backend");
3116 const char *id = qemu_opts_id(opts);
3117 char *bid = NULL;
3119 if (name == NULL) {
3120 error_setg(errp, "chardev: \"%s\" missing backend",
3121 qemu_opts_id(opts));
3122 return NULL;
3125 if (is_help_option(name)) {
3126 GString *str = g_string_new("");
3128 chardev_name_foreach(help_string_append, str);
3130 error_report("Available chardev backend types: %s", str->str);
3131 g_string_free(str, true);
3132 exit(0);
3135 if (id == NULL) {
3136 error_setg(errp, "chardev: no id specified");
3137 return NULL;
3140 for (i = 0; i < ARRAY_SIZE(chardev_alias_table); i++) {
3141 if (g_strcmp0(chardev_alias_table[i].alias, name) == 0) {
3142 name = chardev_alias_table[i].typename;
3143 break;
3147 cc = char_get_class(name, errp);
3148 if (cc == NULL) {
3149 return NULL;
3152 backend = g_new0(ChardevBackend, 1);
3153 backend->type = CHARDEV_BACKEND_KIND_NULL;
3155 if (qemu_opt_get_bool(opts, "mux", 0)) {
3156 bid = g_strdup_printf("%s-base", id);
3159 chr = NULL;
3160 if (cc->parse) {
3161 cc->parse(opts, backend, &local_err);
3162 if (local_err) {
3163 error_propagate(errp, local_err);
3164 goto out;
3166 } else {
3167 ChardevCommon *ccom = g_new0(ChardevCommon, 1);
3168 qemu_chr_parse_common(opts, ccom);
3169 backend->u.null.data = ccom; /* Any ChardevCommon member would work */
3172 chr = qemu_chardev_add(bid ? bid : id,
3173 object_class_get_name(OBJECT_CLASS(cc)),
3174 backend, errp);
3175 if (chr == NULL) {
3176 goto out;
3179 if (bid) {
3180 Chardev *mux;
3181 qapi_free_ChardevBackend(backend);
3182 backend = g_new0(ChardevBackend, 1);
3183 backend->type = CHARDEV_BACKEND_KIND_MUX;
3184 backend->u.mux.data = g_new0(ChardevMux, 1);
3185 backend->u.mux.data->chardev = g_strdup(bid);
3186 mux = qemu_chardev_add(id, TYPE_CHARDEV_MUX, backend, errp);
3187 if (mux == NULL) {
3188 qemu_chr_delete(chr);
3189 chr = NULL;
3190 goto out;
3192 chr = mux;
3195 out:
3196 qapi_free_ChardevBackend(backend);
3197 g_free(bid);
3198 return chr;
3201 Chardev *qemu_chr_new_noreplay(const char *label, const char *filename)
3203 const char *p;
3204 Chardev *chr;
3205 QemuOpts *opts;
3206 Error *err = NULL;
3208 if (strstart(filename, "chardev:", &p)) {
3209 return qemu_chr_find(p);
3212 opts = qemu_chr_parse_compat(label, filename);
3213 if (!opts)
3214 return NULL;
3216 chr = qemu_chr_new_from_opts(opts, &err);
3217 if (err) {
3218 error_report_err(err);
3220 if (chr && qemu_opt_get_bool(opts, "mux", 0)) {
3221 monitor_init(chr, MONITOR_USE_READLINE);
3223 qemu_opts_del(opts);
3224 return chr;
3227 Chardev *qemu_chr_new(const char *label, const char *filename)
3229 Chardev *chr;
3230 chr = qemu_chr_new_noreplay(label, filename);
3231 if (chr) {
3232 if (replay_mode != REPLAY_MODE_NONE) {
3233 qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_REPLAY);
3235 if (qemu_chr_replay(chr) && CHARDEV_GET_CLASS(chr)->chr_ioctl) {
3236 error_report("Replay: ioctl is not supported "
3237 "for serial devices yet");
3239 replay_register_char_driver(chr);
3241 return chr;
3244 void qemu_chr_fe_set_echo(CharBackend *be, bool echo)
3246 Chardev *chr = be->chr;
3248 if (chr && CHARDEV_GET_CLASS(chr)->chr_set_echo) {
3249 CHARDEV_GET_CLASS(chr)->chr_set_echo(chr, echo);
3253 void qemu_chr_fe_set_open(CharBackend *be, int fe_open)
3255 Chardev *chr = be->chr;
3257 if (!chr) {
3258 return;
3261 if (be->fe_open == fe_open) {
3262 return;
3264 be->fe_open = fe_open;
3265 if (CHARDEV_GET_CLASS(chr)->chr_set_fe_open) {
3266 CHARDEV_GET_CLASS(chr)->chr_set_fe_open(chr, fe_open);
3270 guint qemu_chr_fe_add_watch(CharBackend *be, GIOCondition cond,
3271 GIOFunc func, void *user_data)
3273 Chardev *s = be->chr;
3274 GSource *src;
3275 guint tag;
3277 if (!s || CHARDEV_GET_CLASS(s)->chr_add_watch == NULL) {
3278 return 0;
3281 src = CHARDEV_GET_CLASS(s)->chr_add_watch(s, cond);
3282 if (!src) {
3283 return 0;
3286 g_source_set_callback(src, (GSourceFunc)func, user_data, NULL);
3287 tag = g_source_attach(src, NULL);
3288 g_source_unref(src);
3290 return tag;
3293 void qemu_chr_fe_disconnect(CharBackend *be)
3295 Chardev *chr = be->chr;
3297 if (chr && CHARDEV_GET_CLASS(chr)->chr_disconnect) {
3298 CHARDEV_GET_CLASS(chr)->chr_disconnect(chr);
3302 void qemu_chr_delete(Chardev *chr)
3304 QTAILQ_REMOVE(&chardevs, chr, next);
3305 object_unref(OBJECT(chr));
3308 ChardevInfoList *qmp_query_chardev(Error **errp)
3310 ChardevInfoList *chr_list = NULL;
3311 Chardev *chr;
3313 QTAILQ_FOREACH(chr, &chardevs, next) {
3314 ChardevInfoList *info = g_malloc0(sizeof(*info));
3315 info->value = g_malloc0(sizeof(*info->value));
3316 info->value->label = g_strdup(chr->label);
3317 info->value->filename = g_strdup(chr->filename);
3318 info->value->frontend_open = chr->be && chr->be->fe_open;
3320 info->next = chr_list;
3321 chr_list = info;
3324 return chr_list;
3327 static void
3328 qmp_prepend_backend(const char *name, void *opaque)
3330 ChardevBackendInfoList **list = opaque;
3331 ChardevBackendInfoList *info = g_malloc0(sizeof(*info));
3333 info->value = g_malloc0(sizeof(*info->value));
3334 info->value->name = g_strdup(name);
3335 info->next = *list;
3336 *list = info;
3339 ChardevBackendInfoList *qmp_query_chardev_backends(Error **errp)
3341 ChardevBackendInfoList *backend_list = NULL;
3343 chardev_name_foreach(qmp_prepend_backend, &backend_list);
3345 return backend_list;
3348 Chardev *qemu_chr_find(const char *name)
3350 Chardev *chr;
3352 QTAILQ_FOREACH(chr, &chardevs, next) {
3353 if (strcmp(chr->label, name) != 0)
3354 continue;
3355 return chr;
3357 return NULL;
3360 QemuOptsList qemu_chardev_opts = {
3361 .name = "chardev",
3362 .implied_opt_name = "backend",
3363 .head = QTAILQ_HEAD_INITIALIZER(qemu_chardev_opts.head),
3364 .desc = {
3366 .name = "backend",
3367 .type = QEMU_OPT_STRING,
3369 .name = "path",
3370 .type = QEMU_OPT_STRING,
3372 .name = "host",
3373 .type = QEMU_OPT_STRING,
3375 .name = "port",
3376 .type = QEMU_OPT_STRING,
3378 .name = "localaddr",
3379 .type = QEMU_OPT_STRING,
3381 .name = "localport",
3382 .type = QEMU_OPT_STRING,
3384 .name = "to",
3385 .type = QEMU_OPT_NUMBER,
3387 .name = "ipv4",
3388 .type = QEMU_OPT_BOOL,
3390 .name = "ipv6",
3391 .type = QEMU_OPT_BOOL,
3393 .name = "wait",
3394 .type = QEMU_OPT_BOOL,
3396 .name = "server",
3397 .type = QEMU_OPT_BOOL,
3399 .name = "delay",
3400 .type = QEMU_OPT_BOOL,
3402 .name = "reconnect",
3403 .type = QEMU_OPT_NUMBER,
3405 .name = "telnet",
3406 .type = QEMU_OPT_BOOL,
3408 .name = "tls-creds",
3409 .type = QEMU_OPT_STRING,
3411 .name = "width",
3412 .type = QEMU_OPT_NUMBER,
3414 .name = "height",
3415 .type = QEMU_OPT_NUMBER,
3417 .name = "cols",
3418 .type = QEMU_OPT_NUMBER,
3420 .name = "rows",
3421 .type = QEMU_OPT_NUMBER,
3423 .name = "mux",
3424 .type = QEMU_OPT_BOOL,
3426 .name = "signal",
3427 .type = QEMU_OPT_BOOL,
3429 .name = "name",
3430 .type = QEMU_OPT_STRING,
3432 .name = "debug",
3433 .type = QEMU_OPT_NUMBER,
3435 .name = "size",
3436 .type = QEMU_OPT_SIZE,
3438 .name = "chardev",
3439 .type = QEMU_OPT_STRING,
3441 .name = "append",
3442 .type = QEMU_OPT_BOOL,
3444 .name = "logfile",
3445 .type = QEMU_OPT_STRING,
3447 .name = "logappend",
3448 .type = QEMU_OPT_BOOL,
3450 { /* end of list */ }
3454 #ifdef _WIN32
3456 static void qmp_chardev_open_file(Chardev *chr,
3457 ChardevBackend *backend,
3458 bool *be_opened,
3459 Error **errp)
3461 ChardevFile *file = backend->u.file.data;
3462 HANDLE out;
3463 DWORD accessmode;
3464 DWORD flags;
3466 if (file->has_in) {
3467 error_setg(errp, "input file not supported");
3468 return;
3471 if (file->has_append && file->append) {
3472 /* Append to file if it already exists. */
3473 accessmode = FILE_GENERIC_WRITE & ~FILE_WRITE_DATA;
3474 flags = OPEN_ALWAYS;
3475 } else {
3476 /* Truncate file if it already exists. */
3477 accessmode = GENERIC_WRITE;
3478 flags = CREATE_ALWAYS;
3481 out = CreateFile(file->out, accessmode, FILE_SHARE_READ, NULL, flags,
3482 FILE_ATTRIBUTE_NORMAL, NULL);
3483 if (out == INVALID_HANDLE_VALUE) {
3484 error_setg(errp, "open %s failed", file->out);
3485 return;
3488 qemu_chr_open_win_file(chr, out);
3491 static void qmp_chardev_open_serial(Chardev *chr,
3492 ChardevBackend *backend,
3493 bool *be_opened,
3494 Error **errp)
3496 ChardevHostdev *serial = backend->u.serial.data;
3498 win_chr_init(chr, serial->device, errp);
3501 #else /* WIN32 */
3503 static void qmp_chardev_open_file(Chardev *chr,
3504 ChardevBackend *backend,
3505 bool *be_opened,
3506 Error **errp)
3508 ChardevFile *file = backend->u.file.data;
3509 int flags, in = -1, out;
3511 flags = O_WRONLY | O_CREAT | O_BINARY;
3512 if (file->has_append && file->append) {
3513 flags |= O_APPEND;
3514 } else {
3515 flags |= O_TRUNC;
3518 out = qmp_chardev_open_file_source(file->out, flags, errp);
3519 if (out < 0) {
3520 return;
3523 if (file->has_in) {
3524 flags = O_RDONLY;
3525 in = qmp_chardev_open_file_source(file->in, flags, errp);
3526 if (in < 0) {
3527 qemu_close(out);
3528 return;
3532 qemu_chr_open_fd(chr, in, out);
3535 #ifdef HAVE_CHARDEV_SERIAL
3536 static void qmp_chardev_open_serial(Chardev *chr,
3537 ChardevBackend *backend,
3538 bool *be_opened,
3539 Error **errp)
3541 ChardevHostdev *serial = backend->u.serial.data;
3542 int fd;
3544 fd = qmp_chardev_open_file_source(serial->device, O_RDWR, errp);
3545 if (fd < 0) {
3546 return;
3548 qemu_set_nonblock(fd);
3549 tty_serial_init(fd, 115200, 'N', 8, 1);
3551 qemu_chr_open_fd(chr, fd, fd);
3553 #endif
3555 #ifdef HAVE_CHARDEV_PARPORT
3556 static void qmp_chardev_open_parallel(Chardev *chr,
3557 ChardevBackend *backend,
3558 bool *be_opened,
3559 Error **errp)
3561 ChardevHostdev *parallel = backend->u.parallel.data;
3562 int fd;
3564 fd = qmp_chardev_open_file_source(parallel->device, O_RDWR, errp);
3565 if (fd < 0) {
3566 return;
3568 qemu_chr_open_pp_fd(chr, fd, be_opened, errp);
3571 static void char_parallel_class_init(ObjectClass *oc, void *data)
3573 ChardevClass *cc = CHARDEV_CLASS(oc);
3575 cc->parse = qemu_chr_parse_parallel;
3576 cc->open = qmp_chardev_open_parallel;
3577 #if defined(__linux__)
3578 cc->chr_ioctl = pp_ioctl;
3579 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
3580 cc->chr_ioctl = pp_ioctl;
3581 #endif
3584 static void char_parallel_finalize(Object *obj)
3586 #if defined(__linux__)
3587 Chardev *chr = CHARDEV(obj);
3588 ParallelChardev *drv = PARALLEL_CHARDEV(chr);
3589 int fd = drv->fd;
3591 pp_hw_mode(drv, IEEE1284_MODE_COMPAT);
3592 ioctl(fd, PPRELEASE);
3593 close(fd);
3594 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
3595 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
3596 /* FIXME: close fd? */
3597 #endif
3600 static const TypeInfo char_parallel_type_info = {
3601 .name = TYPE_CHARDEV_PARALLEL,
3602 .parent = TYPE_CHARDEV,
3603 .instance_size = sizeof(ParallelChardev),
3604 .instance_finalize = char_parallel_finalize,
3605 .class_init = char_parallel_class_init,
3607 #endif
3609 #endif /* WIN32 */
3611 static void char_file_class_init(ObjectClass *oc, void *data)
3613 ChardevClass *cc = CHARDEV_CLASS(oc);
3615 cc->parse = qemu_chr_parse_file_out;
3616 cc->open = qmp_chardev_open_file;
3619 static const TypeInfo char_file_type_info = {
3620 .name = TYPE_CHARDEV_FILE,
3621 #ifdef _WIN32
3622 .parent = TYPE_CHARDEV_WIN,
3623 #else
3624 .parent = TYPE_CHARDEV_FD,
3625 #endif
3626 .class_init = char_file_class_init,
3629 #ifdef HAVE_CHARDEV_SERIAL
3631 static void char_serial_class_init(ObjectClass *oc, void *data)
3633 ChardevClass *cc = CHARDEV_CLASS(oc);
3635 cc->parse = qemu_chr_parse_serial;
3636 cc->open = qmp_chardev_open_serial;
3637 #ifndef _WIN32
3638 cc->chr_ioctl = tty_serial_ioctl;
3639 #endif
3642 static const TypeInfo char_serial_type_info = {
3643 .name = TYPE_CHARDEV_SERIAL,
3644 #ifdef _WIN32
3645 .parent = TYPE_CHARDEV_WIN,
3646 #else
3647 .parent = TYPE_CHARDEV_FD,
3648 #endif
3649 .class_init = char_serial_class_init,
3651 #endif
3653 static gboolean socket_reconnect_timeout(gpointer opaque)
3655 Chardev *chr = CHARDEV(opaque);
3656 SocketChardev *s = SOCKET_CHARDEV(opaque);
3657 QIOChannelSocket *sioc;
3659 s->reconnect_timer = 0;
3661 if (chr->be_open) {
3662 return false;
3665 sioc = qio_channel_socket_new();
3666 tcp_chr_set_client_ioc_name(chr, sioc);
3667 qio_channel_socket_connect_async(sioc, s->addr,
3668 qemu_chr_socket_connected,
3669 chr, NULL);
3671 return false;
3674 static void qmp_chardev_open_socket(Chardev *chr,
3675 ChardevBackend *backend,
3676 bool *be_opened,
3677 Error **errp)
3679 SocketChardev *s = SOCKET_CHARDEV(chr);
3680 ChardevSocket *sock = backend->u.socket.data;
3681 SocketAddress *addr = sock->addr;
3682 bool do_nodelay = sock->has_nodelay ? sock->nodelay : false;
3683 bool is_listen = sock->has_server ? sock->server : true;
3684 bool is_telnet = sock->has_telnet ? sock->telnet : false;
3685 bool is_waitconnect = sock->has_wait ? sock->wait : false;
3686 int64_t reconnect = sock->has_reconnect ? sock->reconnect : 0;
3687 QIOChannelSocket *sioc = NULL;
3689 s->is_unix = addr->type == SOCKET_ADDRESS_KIND_UNIX;
3690 s->is_listen = is_listen;
3691 s->is_telnet = is_telnet;
3692 s->do_nodelay = do_nodelay;
3693 if (sock->tls_creds) {
3694 Object *creds;
3695 creds = object_resolve_path_component(
3696 object_get_objects_root(), sock->tls_creds);
3697 if (!creds) {
3698 error_setg(errp, "No TLS credentials with id '%s'",
3699 sock->tls_creds);
3700 goto error;
3702 s->tls_creds = (QCryptoTLSCreds *)
3703 object_dynamic_cast(creds,
3704 TYPE_QCRYPTO_TLS_CREDS);
3705 if (!s->tls_creds) {
3706 error_setg(errp, "Object with id '%s' is not TLS credentials",
3707 sock->tls_creds);
3708 goto error;
3710 object_ref(OBJECT(s->tls_creds));
3711 if (is_listen) {
3712 if (s->tls_creds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_SERVER) {
3713 error_setg(errp, "%s",
3714 "Expected TLS credentials for server endpoint");
3715 goto error;
3717 } else {
3718 if (s->tls_creds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_CLIENT) {
3719 error_setg(errp, "%s",
3720 "Expected TLS credentials for client endpoint");
3721 goto error;
3726 s->addr = QAPI_CLONE(SocketAddress, sock->addr);
3728 qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE);
3729 if (s->is_unix) {
3730 qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS);
3733 /* be isn't opened until we get a connection */
3734 *be_opened = false;
3736 chr->filename = SocketAddress_to_str("disconnected:",
3737 addr, is_listen, is_telnet);
3739 if (is_listen) {
3740 if (is_telnet) {
3741 s->do_telnetopt = 1;
3743 } else if (reconnect > 0) {
3744 s->reconnect_time = reconnect;
3747 if (s->reconnect_time) {
3748 sioc = qio_channel_socket_new();
3749 tcp_chr_set_client_ioc_name(chr, sioc);
3750 qio_channel_socket_connect_async(sioc, s->addr,
3751 qemu_chr_socket_connected,
3752 chr, NULL);
3753 } else {
3754 if (s->is_listen) {
3755 char *name;
3756 sioc = qio_channel_socket_new();
3758 name = g_strdup_printf("chardev-tcp-listener-%s", chr->label);
3759 qio_channel_set_name(QIO_CHANNEL(sioc), name);
3760 g_free(name);
3762 if (qio_channel_socket_listen_sync(sioc, s->addr, errp) < 0) {
3763 goto error;
3765 s->listen_ioc = sioc;
3766 if (is_waitconnect &&
3767 qemu_chr_wait_connected(chr, errp) < 0) {
3768 return;
3770 if (!s->ioc) {
3771 s->listen_tag = qio_channel_add_watch(
3772 QIO_CHANNEL(s->listen_ioc), G_IO_IN,
3773 tcp_chr_accept, chr, NULL);
3775 } else if (qemu_chr_wait_connected(chr, errp) < 0) {
3776 goto error;
3780 return;
3782 error:
3783 if (sioc) {
3784 object_unref(OBJECT(sioc));
3788 static void char_socket_class_init(ObjectClass *oc, void *data)
3790 ChardevClass *cc = CHARDEV_CLASS(oc);
3792 cc->parse = qemu_chr_parse_socket;
3793 cc->open = qmp_chardev_open_socket;
3794 cc->chr_wait_connected = tcp_chr_wait_connected;
3795 cc->chr_write = tcp_chr_write;
3796 cc->chr_sync_read = tcp_chr_sync_read;
3797 cc->chr_disconnect = tcp_chr_disconnect;
3798 cc->get_msgfds = tcp_get_msgfds;
3799 cc->set_msgfds = tcp_set_msgfds;
3800 cc->chr_add_client = tcp_chr_add_client;
3801 cc->chr_add_watch = tcp_chr_add_watch;
3802 cc->chr_update_read_handler = tcp_chr_update_read_handler;
3805 static const TypeInfo char_socket_type_info = {
3806 .name = TYPE_CHARDEV_SOCKET,
3807 .parent = TYPE_CHARDEV,
3808 .instance_size = sizeof(SocketChardev),
3809 .instance_finalize = char_socket_finalize,
3810 .class_init = char_socket_class_init,
3813 static void qmp_chardev_open_udp(Chardev *chr,
3814 ChardevBackend *backend,
3815 bool *be_opened,
3816 Error **errp)
3818 ChardevUdp *udp = backend->u.udp.data;
3819 QIOChannelSocket *sioc = qio_channel_socket_new();
3820 char *name;
3821 UdpChardev *s = UDP_CHARDEV(chr);
3823 if (qio_channel_socket_dgram_sync(sioc,
3824 udp->local, udp->remote,
3825 errp) < 0) {
3826 object_unref(OBJECT(sioc));
3827 return;
3830 name = g_strdup_printf("chardev-udp-%s", chr->label);
3831 qio_channel_set_name(QIO_CHANNEL(sioc), name);
3832 g_free(name);
3834 s->ioc = QIO_CHANNEL(sioc);
3835 /* be isn't opened until we get a connection */
3836 *be_opened = false;
3839 static void char_udp_class_init(ObjectClass *oc, void *data)
3841 ChardevClass *cc = CHARDEV_CLASS(oc);
3843 cc->parse = qemu_chr_parse_udp;
3844 cc->open = qmp_chardev_open_udp;
3845 cc->chr_write = udp_chr_write;
3846 cc->chr_update_read_handler = udp_chr_update_read_handler;
3849 static const TypeInfo char_udp_type_info = {
3850 .name = TYPE_CHARDEV_UDP,
3851 .parent = TYPE_CHARDEV,
3852 .instance_size = sizeof(UdpChardev),
3853 .instance_finalize = char_udp_finalize,
3854 .class_init = char_udp_class_init,
3857 bool qemu_chr_has_feature(Chardev *chr,
3858 ChardevFeature feature)
3860 return test_bit(feature, chr->features);
3863 void qemu_chr_set_feature(Chardev *chr,
3864 ChardevFeature feature)
3866 return set_bit(feature, chr->features);
3869 Chardev *qemu_chardev_new(const char *id, const char *typename,
3870 ChardevBackend *backend, Error **errp)
3872 Chardev *chr = NULL;
3873 Error *local_err = NULL;
3874 bool be_opened = true;
3876 assert(g_str_has_prefix(typename, "chardev-"));
3878 chr = CHARDEV(object_new(typename));
3879 chr->label = g_strdup(id);
3881 qemu_char_open(chr, backend, &be_opened, &local_err);
3882 if (local_err) {
3883 error_propagate(errp, local_err);
3884 object_unref(OBJECT(chr));
3885 return NULL;
3888 if (!chr->filename) {
3889 chr->filename = g_strdup(typename + 8);
3891 if (be_opened) {
3892 qemu_chr_be_event(chr, CHR_EVENT_OPENED);
3895 return chr;
3898 ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
3899 Error **errp)
3901 const ChardevClass *cc;
3902 ChardevReturn *ret;
3903 Chardev *chr;
3905 cc = char_get_class(ChardevBackendKind_lookup[backend->type], errp);
3906 if (!cc) {
3907 return NULL;
3910 chr = qemu_chardev_add(id, object_class_get_name(OBJECT_CLASS(cc)),
3911 backend, errp);
3912 if (!chr) {
3913 return NULL;
3916 ret = g_new0(ChardevReturn, 1);
3917 if (CHARDEV_IS_PTY(chr)) {
3918 ret->pty = g_strdup(chr->filename + 4);
3919 ret->has_pty = true;
3922 return ret;
3925 void qmp_chardev_remove(const char *id, Error **errp)
3927 Chardev *chr;
3929 chr = qemu_chr_find(id);
3930 if (chr == NULL) {
3931 error_setg(errp, "Chardev '%s' not found", id);
3932 return;
3934 if (qemu_chr_is_busy(chr)) {
3935 error_setg(errp, "Chardev '%s' is busy", id);
3936 return;
3938 if (qemu_chr_replay(chr)) {
3939 error_setg(errp,
3940 "Chardev '%s' cannot be unplugged in record/replay mode", id);
3941 return;
3943 qemu_chr_delete(chr);
3946 void qemu_chr_cleanup(void)
3948 Chardev *chr, *tmp;
3950 QTAILQ_FOREACH_SAFE(chr, &chardevs, next, tmp) {
3951 qemu_chr_delete(chr);
3955 static void register_types(void)
3957 type_register_static(&char_type_info);
3958 #ifdef _WIN32
3959 type_register_static(&char_win_stdio_type_info);
3960 #endif
3961 type_register_static(&char_socket_type_info);
3962 type_register_static(&char_udp_type_info);
3963 type_register_static(&char_file_type_info);
3964 type_register_static(&char_stdio_type_info);
3965 #ifdef HAVE_CHARDEV_SERIAL
3966 type_register_static(&char_serial_type_info);
3967 #endif
3968 #ifdef HAVE_CHARDEV_PARPORT
3969 type_register_static(&char_parallel_type_info);
3970 #endif
3971 #ifdef HAVE_CHARDEV_PTY
3972 type_register_static(&char_pty_type_info);
3973 #endif
3974 #ifdef _WIN32
3975 type_register_static(&char_console_type_info);
3976 #endif
3977 type_register_static(&char_pipe_type_info);
3979 /* this must be done after machine init, since we register FEs with muxes
3980 * as part of realize functions like serial_isa_realizefn when -nographic
3981 * is specified
3983 qemu_add_machine_init_done_notifier(&muxes_realize_notify);
3986 type_init(register_types);