]> git.proxmox.com Git - mirror_qemu.git/blame - qemu-char.c
char: use a feature bit for replay
[mirror_qemu.git] / qemu-char.c
CommitLineData
6f97dba0
AL
1/*
2 * QEMU System Emulator
3 *
4 * Copyright (c) 2003-2008 Fabrice Bellard
5 *
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:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
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.
23 */
d38ea87a 24#include "qemu/osdep.h"
6f97dba0 25#include "qemu-common.h"
f348b6d1 26#include "qemu/cutils.h"
83c9089e 27#include "monitor/monitor.h"
9c17d615 28#include "sysemu/sysemu.h"
da31d594 29#include "sysemu/block-backend.h"
d49b6836 30#include "qemu/error-report.h"
1de7afc9 31#include "qemu/timer.h"
dccfcd0e 32#include "sysemu/char.h"
cf3ebac7 33#include "hw/usb.h"
c5a415a0 34#include "qmp-commands.h"
37f9e0a2 35#include "qapi/clone-visitor.h"
cfb429cb 36#include "qapi-visit.h"
e9cf2fe0 37#include "qemu/base64.h"
9894dc0c
DB
38#include "io/channel-socket.h"
39#include "io/channel-file.h"
a8fb5427 40#include "io/channel-tls.h"
33577b47 41#include "sysemu/replay.h"
517b3d40 42#include "qemu/help_option.h"
6f97dba0 43
6f97dba0
AL
44#include <zlib.h>
45
46#ifndef _WIN32
47#include <sys/times.h>
48#include <sys/wait.h>
49#include <termios.h>
6f97dba0 50#include <sys/ioctl.h>
24646c7e 51#include <sys/resource.h>
6f97dba0
AL
52#include <sys/socket.h>
53#include <netinet/in.h>
24646c7e 54#include <net/if.h>
24646c7e 55#include <arpa/inet.h>
6f97dba0
AL
56#include <netdb.h>
57#include <sys/select.h>
71e72a19 58#ifdef CONFIG_BSD
3294ce18
MT
59#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
60#include <dev/ppbus/ppi.h>
61#include <dev/ppbus/ppbconf.h>
c5e97233 62#elif defined(__DragonFly__)
c5e97233
BS
63#include <dev/misc/ppi/ppi.h>
64#include <bus/ppbus/ppbconf.h>
6f97dba0 65#endif
bbe813a2 66#else
6f97dba0 67#ifdef __linux__
6f97dba0
AL
68#include <linux/ppdev.h>
69#include <linux/parport.h>
70#endif
71#ifdef __sun__
6f97dba0
AL
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>
6f97dba0
AL
81#endif
82#endif
83#endif
84
1de7afc9 85#include "qemu/sockets.h"
cbcc6336 86#include "ui/qemu-spice.h"
6f97dba0 87
9bd7854e 88#define READ_BUF_LEN 4096
7b0bfdf5 89#define READ_RETRIES 10
c4095726 90#define TCP_MAX_FDS 16
9bd7854e 91
6dfa8298
MAL
92typedef struct MuxDriver MuxDriver;
93
cfb429cb
CM
94/***********************************************************/
95/* Socket address helpers */
cfb429cb 96
0ff0fad2
DB
97static char *SocketAddress_to_str(const char *prefix, SocketAddress *addr,
98 bool is_listen, bool is_telnet)
16cc4ffe 99{
130257dc 100 switch (addr->type) {
16cc4ffe 101 case SOCKET_ADDRESS_KIND_INET:
0ff0fad2 102 return g_strdup_printf("%s%s:%s:%s%s", prefix,
32bafa8f
EB
103 is_telnet ? "telnet" : "tcp",
104 addr->u.inet.data->host,
105 addr->u.inet.data->port,
106 is_listen ? ",server" : "");
16cc4ffe
CM
107 break;
108 case SOCKET_ADDRESS_KIND_UNIX:
0ff0fad2 109 return g_strdup_printf("%sunix:%s%s", prefix,
32bafa8f 110 addr->u.q_unix.data->path,
0ff0fad2 111 is_listen ? ",server" : "");
16cc4ffe
CM
112 break;
113 case SOCKET_ADDRESS_KIND_FD:
32bafa8f 114 return g_strdup_printf("%sfd:%s%s", prefix, addr->u.fd.data->str,
0ff0fad2 115 is_listen ? ",server" : "");
16cc4ffe
CM
116 break;
117 default:
118 abort();
119 }
120}
121
0ff0fad2
DB
122static char *sockaddr_to_str(struct sockaddr_storage *ss, socklen_t ss_len,
123 struct sockaddr_storage *ps, socklen_t ps_len,
124 bool is_listen, bool is_telnet)
16cc4ffe 125{
01ca519f
CM
126 char shost[NI_MAXHOST], sserv[NI_MAXSERV];
127 char phost[NI_MAXHOST], pserv[NI_MAXSERV];
16cc4ffe
CM
128 const char *left = "", *right = "";
129
130 switch (ss->ss_family) {
131#ifndef _WIN32
132 case AF_UNIX:
0ff0fad2
DB
133 return g_strdup_printf("unix:%s%s",
134 ((struct sockaddr_un *)(ss))->sun_path,
135 is_listen ? ",server" : "");
16cc4ffe
CM
136#endif
137 case AF_INET6:
138 left = "[";
139 right = "]";
140 /* fall through */
141 case AF_INET:
01ca519f
CM
142 getnameinfo((struct sockaddr *) ss, ss_len, shost, sizeof(shost),
143 sserv, sizeof(sserv), NI_NUMERICHOST | NI_NUMERICSERV);
144 getnameinfo((struct sockaddr *) ps, ps_len, phost, sizeof(phost),
145 pserv, sizeof(pserv), NI_NUMERICHOST | NI_NUMERICSERV);
0ff0fad2
DB
146 return g_strdup_printf("%s:%s%s%s:%s%s <-> %s%s%s:%s",
147 is_telnet ? "telnet" : "tcp",
148 left, shost, right, sserv,
149 is_listen ? ",server" : "",
150 left, phost, right, pserv);
16cc4ffe
CM
151
152 default:
0ff0fad2 153 return g_strdup_printf("unknown");
16cc4ffe
CM
154 }
155}
156
6f97dba0
AL
157/***********************************************************/
158/* character device */
159
72cf2d4f
BS
160static QTAILQ_HEAD(CharDriverStateHead, CharDriverState) chardevs =
161 QTAILQ_HEAD_INITIALIZER(chardevs);
2970a6c9 162
d0d7708b
DB
163static void qemu_chr_free_common(CharDriverState *chr);
164
b68e956a
MAL
165CharDriverState *qemu_chr_alloc(const CharDriver *driver,
166 ChardevCommon *backend, Error **errp)
db39fcf1
PB
167{
168 CharDriverState *chr = g_malloc0(sizeof(CharDriverState));
f3db17b9 169 qemu_mutex_init(&chr->chr_write_lock);
d0d7708b 170
b68e956a
MAL
171 assert(driver);
172 assert(driver->chr_write);
173
d0d7708b
DB
174 if (backend->has_logfile) {
175 int flags = O_WRONLY | O_CREAT;
176 if (backend->has_logappend &&
177 backend->logappend) {
178 flags |= O_APPEND;
179 } else {
180 flags |= O_TRUNC;
181 }
182 chr->logfd = qemu_open(backend->logfile, flags, 0666);
183 if (chr->logfd < 0) {
184 error_setg_errno(errp, errno,
185 "Unable to open logfile %s",
186 backend->logfile);
187 g_free(chr);
188 return NULL;
189 }
190 } else {
191 chr->logfd = -1;
192 }
b68e956a 193 chr->driver = driver;
d0d7708b 194
db39fcf1
PB
195 return chr;
196}
197
a425d23f 198void qemu_chr_be_event(CharDriverState *s, int event)
6f97dba0 199{
a4afa548
MAL
200 CharBackend *be = s->be;
201
73cdf3f2
AG
202 /* Keep track if the char device is open */
203 switch (event) {
204 case CHR_EVENT_OPENED:
16665b94 205 s->be_open = 1;
73cdf3f2
AG
206 break;
207 case CHR_EVENT_CLOSED:
16665b94 208 s->be_open = 0;
73cdf3f2
AG
209 break;
210 }
211
a4afa548 212 if (!be || !be->chr_event) {
6f97dba0 213 return;
a4afa548
MAL
214 }
215
216 be->chr_event(be->opaque, event);
6f97dba0
AL
217}
218
fee204fd 219void qemu_chr_be_generic_open(CharDriverState *s)
6f97dba0 220{
bd5c51ee 221 qemu_chr_be_event(s, CHR_EVENT_OPENED);
6f97dba0
AL
222}
223
d0d7708b
DB
224
225/* Not reporting errors from writing to logfile, as logs are
226 * defined to be "best effort" only */
227static void qemu_chr_fe_write_log(CharDriverState *s,
228 const uint8_t *buf, size_t len)
229{
230 size_t done = 0;
231 ssize_t ret;
232
233 if (s->logfd < 0) {
234 return;
235 }
236
237 while (done < len) {
53628efb
DB
238 retry:
239 ret = write(s->logfd, buf + done, len - done);
240 if (ret == -1 && errno == EAGAIN) {
241 g_usleep(100);
242 goto retry;
243 }
d0d7708b
DB
244
245 if (ret <= 0) {
246 return;
247 }
248 done += ret;
249 }
250}
251
33577b47
PD
252static int qemu_chr_fe_write_buffer(CharDriverState *s, const uint8_t *buf, int len, int *offset)
253{
254 int res = 0;
255 *offset = 0;
256
257 qemu_mutex_lock(&s->chr_write_lock);
258 while (*offset < len) {
53628efb 259 retry:
b68e956a 260 res = s->driver->chr_write(s, buf + *offset, len - *offset);
53628efb
DB
261 if (res < 0 && errno == EAGAIN) {
262 g_usleep(100);
263 goto retry;
264 }
33577b47
PD
265
266 if (res <= 0) {
267 break;
268 }
269
270 *offset += res;
271 }
272 if (*offset > 0) {
273 qemu_chr_fe_write_log(s, buf, *offset);
274 }
275 qemu_mutex_unlock(&s->chr_write_lock);
276
277 return res;
278}
279
5ebd6703
MAL
280static bool qemu_chr_replay(CharDriverState *chr)
281{
282 return qemu_chr_has_feature(chr, QEMU_CHAR_FEATURE_REPLAY);
283}
284
5345fdb4 285int qemu_chr_fe_write(CharBackend *be, const uint8_t *buf, int len)
6f97dba0 286{
5345fdb4 287 CharDriverState *s = be->chr;
9005b2a7
PB
288 int ret;
289
fa394ed6
MAL
290 if (!s) {
291 return 0;
292 }
293
5ebd6703 294 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_PLAY) {
33577b47
PD
295 int offset;
296 replay_char_write_event_load(&ret, &offset);
297 assert(offset <= len);
298 qemu_chr_fe_write_buffer(s, buf, offset, &offset);
299 return ret;
300 }
301
9005b2a7 302 qemu_mutex_lock(&s->chr_write_lock);
b68e956a 303 ret = s->driver->chr_write(s, buf, len);
d0d7708b
DB
304
305 if (ret > 0) {
306 qemu_chr_fe_write_log(s, buf, ret);
307 }
308
9005b2a7 309 qemu_mutex_unlock(&s->chr_write_lock);
33577b47 310
5ebd6703 311 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_RECORD) {
33577b47
PD
312 replay_char_write_event_save(ret, ret < 0 ? 0 : ret);
313 }
314
9005b2a7 315 return ret;
6f97dba0
AL
316}
317
5345fdb4 318static int qemu_chr_write_all(CharDriverState *s, const uint8_t *buf, int len)
cd18720a 319{
33577b47
PD
320 int offset;
321 int res;
cd18720a 322
5ebd6703 323 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_PLAY) {
33577b47
PD
324 replay_char_write_event_load(&res, &offset);
325 assert(offset <= len);
326 qemu_chr_fe_write_buffer(s, buf, offset, &offset);
327 return res;
328 }
cd18720a 329
33577b47 330 res = qemu_chr_fe_write_buffer(s, buf, len, &offset);
cd18720a 331
5ebd6703 332 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_RECORD) {
33577b47 333 replay_char_write_event_save(res, offset);
cd18720a
AL
334 }
335
9005b2a7
PB
336 if (res < 0) {
337 return res;
338 }
cd18720a
AL
339 return offset;
340}
341
5345fdb4 342int qemu_chr_fe_write_all(CharBackend *be, const uint8_t *buf, int len)
7b0bfdf5 343{
5345fdb4
MAL
344 CharDriverState *s = be->chr;
345
fa394ed6
MAL
346 if (!s) {
347 return 0;
348 }
349
5345fdb4
MAL
350 return qemu_chr_write_all(s, buf, len);
351}
352
353int qemu_chr_fe_read_all(CharBackend *be, uint8_t *buf, int len)
354{
355 CharDriverState *s = be->chr;
7b0bfdf5
NN
356 int offset = 0, counter = 10;
357 int res;
358
b68e956a 359 if (!s || !s->driver->chr_sync_read) {
7b0bfdf5
NN
360 return 0;
361 }
fa394ed6 362
5ebd6703 363 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_PLAY) {
33577b47
PD
364 return replay_char_read_all_load(buf);
365 }
7b0bfdf5
NN
366
367 while (offset < len) {
53628efb 368 retry:
b68e956a 369 res = s->driver->chr_sync_read(s, buf + offset, len - offset);
53628efb
DB
370 if (res == -1 && errno == EAGAIN) {
371 g_usleep(100);
372 goto retry;
373 }
7b0bfdf5
NN
374
375 if (res == 0) {
376 break;
377 }
378
379 if (res < 0) {
5ebd6703 380 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_RECORD) {
33577b47
PD
381 replay_char_read_all_save_error(res);
382 }
7b0bfdf5
NN
383 return res;
384 }
385
386 offset += res;
387
388 if (!counter--) {
389 break;
390 }
391 }
392
5ebd6703 393 if (qemu_chr_replay(s) && replay_mode == REPLAY_MODE_RECORD) {
33577b47
PD
394 replay_char_read_all_save_buf(buf, offset);
395 }
7b0bfdf5
NN
396 return offset;
397}
398
5345fdb4 399int qemu_chr_fe_ioctl(CharBackend *be, int cmd, void *arg)
6f97dba0 400{
5345fdb4 401 CharDriverState *s = be->chr;
33577b47 402 int res;
fa394ed6 403
5ebd6703 404 if (!s || !s->driver->chr_ioctl || qemu_chr_replay(s)) {
33577b47
PD
405 res = -ENOTSUP;
406 } else {
b68e956a 407 res = s->driver->chr_ioctl(s, cmd, arg);
33577b47
PD
408 }
409
410 return res;
6f97dba0
AL
411}
412
909cda12 413int qemu_chr_be_can_write(CharDriverState *s)
6f97dba0 414{
a4afa548
MAL
415 CharBackend *be = s->be;
416
417 if (!be || !be->chr_can_read) {
6f97dba0 418 return 0;
a4afa548
MAL
419 }
420
421 return be->chr_can_read(be->opaque);
6f97dba0
AL
422}
423
33577b47 424void qemu_chr_be_write_impl(CharDriverState *s, uint8_t *buf, int len)
6f97dba0 425{
a4afa548
MAL
426 CharBackend *be = s->be;
427
428 if (be && be->chr_read) {
429 be->chr_read(be->opaque, buf, len);
ac310734 430 }
6f97dba0
AL
431}
432
33577b47
PD
433void qemu_chr_be_write(CharDriverState *s, uint8_t *buf, int len)
434{
5ebd6703 435 if (qemu_chr_replay(s)) {
33577b47
PD
436 if (replay_mode == REPLAY_MODE_PLAY) {
437 return;
438 }
439 replay_chr_be_write(s, buf, len);
440 } else {
441 qemu_chr_be_write_impl(s, buf, len);
442 }
443}
444
5345fdb4 445int qemu_chr_fe_get_msgfd(CharBackend *be)
7d174059 446{
5345fdb4 447 CharDriverState *s = be->chr;
c76bf6bb 448 int fd;
5345fdb4 449 int res = (qemu_chr_fe_get_msgfds(be, &fd, 1) == 1) ? fd : -1;
5ebd6703 450 if (s && qemu_chr_replay(s)) {
33577b47
PD
451 fprintf(stderr,
452 "Replay: get msgfd is not supported for serial devices yet\n");
453 exit(1);
454 }
455 return res;
c76bf6bb
NN
456}
457
5345fdb4 458int qemu_chr_fe_get_msgfds(CharBackend *be, int *fds, int len)
c76bf6bb 459{
5345fdb4
MAL
460 CharDriverState *s = be->chr;
461
fa394ed6
MAL
462 if (!s) {
463 return -1;
464 }
465
b68e956a 466 return s->driver->get_msgfds ? s->driver->get_msgfds(s, fds, len) : -1;
7d174059
MM
467}
468
5345fdb4 469int qemu_chr_fe_set_msgfds(CharBackend *be, int *fds, int num)
d39aac7a 470{
5345fdb4
MAL
471 CharDriverState *s = be->chr;
472
fa394ed6
MAL
473 if (!s) {
474 return -1;
475 }
476
b68e956a 477 return s->driver->set_msgfds ? s->driver->set_msgfds(s, fds, num) : -1;
d39aac7a
NN
478}
479
13661089
DB
480int qemu_chr_add_client(CharDriverState *s, int fd)
481{
b68e956a 482 return s->driver->chr_add_client ? s->driver->chr_add_client(s, fd) : -1;
13661089
DB
483}
484
5345fdb4 485void qemu_chr_fe_accept_input(CharBackend *be)
6f97dba0 486{
5345fdb4
MAL
487 CharDriverState *s = be->chr;
488
fa394ed6
MAL
489 if (!s) {
490 return;
491 }
492
b68e956a
MAL
493 if (s->driver->chr_accept_input) {
494 s->driver->chr_accept_input(s);
495 }
98c8ee1d 496 qemu_notify_event();
6f97dba0
AL
497}
498
5345fdb4 499void qemu_chr_fe_printf(CharBackend *be, const char *fmt, ...)
6f97dba0 500{
9bd7854e 501 char buf[READ_BUF_LEN];
6f97dba0
AL
502 va_list ap;
503 va_start(ap, fmt);
504 vsnprintf(buf, sizeof(buf), fmt, ap);
90f998f5
DB
505 /* XXX this blocks entire thread. Rewrite to use
506 * qemu_chr_fe_write and background I/O callbacks */
5345fdb4 507 qemu_chr_fe_write_all(be, (uint8_t *)buf, strlen(buf));
6f97dba0
AL
508 va_end(ap);
509}
510
386a5a1e 511static void remove_fd_in_watch(CharDriverState *chr);
6dfa8298 512static void mux_chr_set_handlers(CharDriverState *chr, GMainContext *context);
fb5e19d2 513static void mux_set_focus(CharDriverState *chr, int focus);
6dfa8298 514
6f97dba0
AL
515static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
516{
517 return len;
518}
519
b68e956a
MAL
520static CharDriverState *qemu_chr_open_null(const CharDriver *driver,
521 const char *id,
0d64992b
PB
522 ChardevBackend *backend,
523 ChardevReturn *ret,
82878dac 524 bool *be_opened,
0d64992b 525 Error **errp)
6f97dba0
AL
526{
527 CharDriverState *chr;
32bafa8f 528 ChardevCommon *common = backend->u.null.data;
6f97dba0 529
b68e956a 530 chr = qemu_chr_alloc(driver, common, errp);
d0d7708b
DB
531 if (!chr) {
532 return NULL;
533 }
82878dac 534 *be_opened = false;
1f51470d 535 return chr;
6f97dba0
AL
536}
537
b68e956a
MAL
538static const CharDriver null_driver = {
539 .kind = CHARDEV_BACKEND_KIND_NULL,
540 .create = qemu_chr_open_null,
541 .chr_write = null_chr_write,
542};
543
6f97dba0 544/* MUX driver for serial I/O splitting */
6f97dba0
AL
545#define MAX_MUX 4
546#define MUX_BUFFER_SIZE 32 /* Must be a power of 2. */
547#define MUX_BUFFER_MASK (MUX_BUFFER_SIZE - 1)
6dfa8298 548struct MuxDriver {
a4afa548 549 CharBackend *backends[MAX_MUX];
ecb672d1 550 CharBackend chr;
799f1f23 551 int focus;
6f97dba0
AL
552 int mux_cnt;
553 int term_got_escape;
554 int max_size;
a80bf99f
AL
555 /* Intermediate input buffer allows to catch escape sequences even if the
556 currently active device is not accepting any input - but only until it
557 is full as well. */
558 unsigned char buffer[MAX_MUX][MUX_BUFFER_SIZE];
559 int prod[MAX_MUX];
560 int cons[MAX_MUX];
2d22959d 561 int timestamps;
9005b2a7
PB
562
563 /* Protected by the CharDriverState chr_write_lock. */
4ab312f7 564 int linestart;
2d22959d 565 int64_t timestamps_start;
6dfa8298 566};
6f97dba0 567
9005b2a7 568/* Called with chr_write_lock held. */
6f97dba0
AL
569static int mux_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
570{
571 MuxDriver *d = chr->opaque;
572 int ret;
2d22959d 573 if (!d->timestamps) {
5345fdb4 574 ret = qemu_chr_fe_write(&d->chr, buf, len);
6f97dba0
AL
575 } else {
576 int i;
577
578 ret = 0;
4ab312f7
JK
579 for (i = 0; i < len; i++) {
580 if (d->linestart) {
6f97dba0
AL
581 char buf1[64];
582 int64_t ti;
583 int secs;
584
bc72ad67 585 ti = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
2d22959d
JK
586 if (d->timestamps_start == -1)
587 d->timestamps_start = ti;
588 ti -= d->timestamps_start;
a4bb1db8 589 secs = ti / 1000;
6f97dba0
AL
590 snprintf(buf1, sizeof(buf1),
591 "[%02d:%02d:%02d.%03d] ",
592 secs / 3600,
593 (secs / 60) % 60,
594 secs % 60,
a4bb1db8 595 (int)(ti % 1000));
90f998f5
DB
596 /* XXX this blocks entire thread. Rewrite to use
597 * qemu_chr_fe_write and background I/O callbacks */
5345fdb4
MAL
598 qemu_chr_fe_write_all(&d->chr,
599 (uint8_t *)buf1, strlen(buf1));
4ab312f7
JK
600 d->linestart = 0;
601 }
5345fdb4 602 ret += qemu_chr_fe_write(&d->chr, buf + i, 1);
4ab312f7
JK
603 if (buf[i] == '\n') {
604 d->linestart = 1;
6f97dba0
AL
605 }
606 }
607 }
608 return ret;
609}
610
611static const char * const mux_help[] = {
612 "% h print this help\n\r",
613 "% x exit emulator\n\r",
614 "% s save disk data back to file (if -snapshot)\n\r",
86d10328 615 "% t toggle console timestamps\n\r",
6f97dba0
AL
616 "% b send break (magic sysrq)\n\r",
617 "% c switch between console and monitor\n\r",
618 "% % sends %\n\r",
619 NULL
620};
621
622int term_escape_char = 0x01; /* ctrl-a is used for escape */
623static void mux_print_help(CharDriverState *chr)
624{
625 int i, j;
626 char ebuf[15] = "Escape-Char";
627 char cbuf[50] = "\n\r";
628
629 if (term_escape_char > 0 && term_escape_char < 26) {
630 snprintf(cbuf, sizeof(cbuf), "\n\r");
631 snprintf(ebuf, sizeof(ebuf), "C-%c", term_escape_char - 1 + 'a');
632 } else {
633 snprintf(cbuf, sizeof(cbuf),
634 "\n\rEscape-Char set to Ascii: 0x%02x\n\r\n\r",
635 term_escape_char);
636 }
90f998f5
DB
637 /* XXX this blocks entire thread. Rewrite to use
638 * qemu_chr_fe_write and background I/O callbacks */
5345fdb4 639 qemu_chr_write_all(chr, (uint8_t *)cbuf, strlen(cbuf));
6f97dba0
AL
640 for (i = 0; mux_help[i] != NULL; i++) {
641 for (j=0; mux_help[i][j] != '\0'; j++) {
642 if (mux_help[i][j] == '%')
5345fdb4 643 qemu_chr_write_all(chr, (uint8_t *)ebuf, strlen(ebuf));
6f97dba0 644 else
5345fdb4 645 qemu_chr_write_all(chr, (uint8_t *)&mux_help[i][j], 1);
6f97dba0
AL
646 }
647 }
648}
649
2724b180
AL
650static void mux_chr_send_event(MuxDriver *d, int mux_nr, int event)
651{
a4afa548
MAL
652 CharBackend *be = d->backends[mux_nr];
653
654 if (be && be->chr_event) {
655 be->chr_event(be->opaque, event);
656 }
2724b180
AL
657}
658
6f97dba0
AL
659static int mux_proc_byte(CharDriverState *chr, MuxDriver *d, int ch)
660{
661 if (d->term_got_escape) {
662 d->term_got_escape = 0;
663 if (ch == term_escape_char)
664 goto send_char;
665 switch(ch) {
666 case '?':
667 case 'h':
668 mux_print_help(chr);
669 break;
670 case 'x':
671 {
672 const char *term = "QEMU: Terminated\n\r";
5345fdb4 673 qemu_chr_write_all(chr, (uint8_t *)term, strlen(term));
6f97dba0
AL
674 exit(0);
675 break;
676 }
677 case 's':
da31d594 678 blk_commit_all();
6f97dba0
AL
679 break;
680 case 'b':
a425d23f 681 qemu_chr_be_event(chr, CHR_EVENT_BREAK);
6f97dba0
AL
682 break;
683 case 'c':
6dfa8298 684 assert(d->mux_cnt > 0); /* handler registered with first fe */
6f97dba0 685 /* Switch to the next registered device */
fb5e19d2 686 mux_set_focus(chr, (d->focus + 1) % d->mux_cnt);
6f97dba0 687 break;
2d22959d
JK
688 case 't':
689 d->timestamps = !d->timestamps;
690 d->timestamps_start = -1;
4ab312f7 691 d->linestart = 0;
2d22959d 692 break;
6f97dba0
AL
693 }
694 } else if (ch == term_escape_char) {
695 d->term_got_escape = 1;
696 } else {
697 send_char:
698 return 1;
699 }
700 return 0;
701}
702
703static void mux_chr_accept_input(CharDriverState *chr)
704{
6f97dba0 705 MuxDriver *d = chr->opaque;
799f1f23 706 int m = d->focus;
a4afa548 707 CharBackend *be = d->backends[m];
6f97dba0 708
a4afa548
MAL
709 while (be && d->prod[m] != d->cons[m] &&
710 be->chr_can_read && be->chr_can_read(be->opaque)) {
711 be->chr_read(be->opaque,
712 &d->buffer[m][d->cons[m]++ & MUX_BUFFER_MASK], 1);
6f97dba0
AL
713 }
714}
715
716static int mux_chr_can_read(void *opaque)
717{
718 CharDriverState *chr = opaque;
719 MuxDriver *d = chr->opaque;
799f1f23 720 int m = d->focus;
a4afa548 721 CharBackend *be = d->backends[m];
6f97dba0 722
a4afa548 723 if ((d->prod[m] - d->cons[m]) < MUX_BUFFER_SIZE) {
6f97dba0 724 return 1;
a4afa548
MAL
725 }
726
727 if (be && be->chr_can_read) {
728 return be->chr_can_read(be->opaque);
729 }
730
6f97dba0
AL
731 return 0;
732}
733
734static void mux_chr_read(void *opaque, const uint8_t *buf, int size)
735{
736 CharDriverState *chr = opaque;
737 MuxDriver *d = chr->opaque;
799f1f23 738 int m = d->focus;
a4afa548 739 CharBackend *be = d->backends[m];
6f97dba0
AL
740 int i;
741
a4afa548 742 mux_chr_accept_input(opaque);
6f97dba0 743
a4afa548 744 for (i = 0; i < size; i++)
6f97dba0 745 if (mux_proc_byte(chr, d, buf[i])) {
a80bf99f 746 if (d->prod[m] == d->cons[m] &&
a4afa548
MAL
747 be && be->chr_can_read &&
748 be->chr_can_read(be->opaque))
749 be->chr_read(be->opaque, &buf[i], 1);
6f97dba0 750 else
a80bf99f 751 d->buffer[m][d->prod[m]++ & MUX_BUFFER_MASK] = buf[i];
6f97dba0
AL
752 }
753}
754
fffbd9cf
PB
755static bool muxes_realized;
756
6f97dba0
AL
757static void mux_chr_event(void *opaque, int event)
758{
759 CharDriverState *chr = opaque;
760 MuxDriver *d = chr->opaque;
761 int i;
762
fffbd9cf
PB
763 if (!muxes_realized) {
764 return;
765 }
766
6f97dba0
AL
767 /* Send the event to all registered listeners */
768 for (i = 0; i < d->mux_cnt; i++)
2724b180 769 mux_chr_send_event(d, i, event);
6f97dba0
AL
770}
771
7b7ab18d
MR
772/**
773 * Called after processing of default and command-line-specified
774 * chardevs to deliver CHR_EVENT_OPENED events to any FEs attached
775 * to a mux chardev. This is done here to ensure that
776 * output/prompts/banners are only displayed for the FE that has
777 * focus when initial command-line processing/machine init is
778 * completed.
779 *
780 * After this point, any new FE attached to any new or existing
781 * mux will receive CHR_EVENT_OPENED notifications for the BE
782 * immediately.
783 */
784static void muxes_realize_done(Notifier *notifier, void *unused)
785{
786 CharDriverState *chr;
787
788 QTAILQ_FOREACH(chr, &chardevs, next) {
ad5c679c 789 if (qemu_chr_get_kind(chr) == CHARDEV_BACKEND_KIND_MUX) {
7b7ab18d
MR
790 MuxDriver *d = chr->opaque;
791 int i;
792
793 /* send OPENED to all already-attached FEs */
794 for (i = 0; i < d->mux_cnt; i++) {
795 mux_chr_send_event(d, i, CHR_EVENT_OPENED);
796 }
797 /* mark mux as OPENED so any new FEs will immediately receive
798 * OPENED event
799 */
800 qemu_chr_be_generic_open(chr);
801 }
802 }
803 muxes_realized = true;
804}
805
806static Notifier muxes_realize_notify = {
807 .notify = muxes_realize_done,
808};
809
3f0838ab
KB
810static GSource *mux_chr_add_watch(CharDriverState *s, GIOCondition cond)
811{
812 MuxDriver *d = s->opaque;
5345fdb4
MAL
813 CharDriverState *chr = qemu_chr_fe_get_driver(&d->chr);
814
b68e956a
MAL
815 if (!chr->driver->chr_add_watch) {
816 return NULL;
817 }
818
819 return chr->driver->chr_add_watch(chr, cond);
3f0838ab
KB
820}
821
72ac8762 822static void mux_chr_free(struct CharDriverState *chr)
1371a369
MAL
823{
824 MuxDriver *d = chr->opaque;
a4afa548 825 int i;
1371a369 826
a4afa548
MAL
827 for (i = 0; i < d->mux_cnt; i++) {
828 CharBackend *be = d->backends[i];
829 if (be) {
830 be->chr = NULL;
831 }
832 }
c39860e6 833 qemu_chr_fe_deinit(&d->chr);
1371a369
MAL
834 g_free(d);
835}
836
6dfa8298
MAL
837static void mux_chr_set_handlers(CharDriverState *chr, GMainContext *context)
838{
839 MuxDriver *d = chr->opaque;
840
841 /* Fix up the real driver with mux routines */
ecb672d1
MAL
842 qemu_chr_fe_set_handlers(&d->chr,
843 mux_chr_can_read,
844 mux_chr_read,
845 mux_chr_event,
846 chr,
39ab61c6 847 context, true);
6dfa8298
MAL
848}
849
fb5e19d2 850static void mux_set_focus(CharDriverState *chr, int focus)
6dfa8298 851{
fb5e19d2
MAL
852 MuxDriver *d = chr->opaque;
853
6dfa8298
MAL
854 assert(focus >= 0);
855 assert(focus < d->mux_cnt);
856
857 if (d->focus != -1) {
858 mux_chr_send_event(d, d->focus, CHR_EVENT_MUX_OUT);
859 }
860
861 d->focus = focus;
fb5e19d2 862 chr->be = d->backends[focus];
6dfa8298
MAL
863 mux_chr_send_event(d, d->focus, CHR_EVENT_MUX_IN);
864}
865
b68e956a
MAL
866static CharDriverState *qemu_chr_open_mux(const CharDriver *driver,
867 const char *id,
3c0e5a4a 868 ChardevBackend *backend,
82878dac
MAL
869 ChardevReturn *ret,
870 bool *be_opened,
871 Error **errp)
6f97dba0 872{
32bafa8f 873 ChardevMux *mux = backend->u.mux.data;
3c0e5a4a 874 CharDriverState *chr, *drv;
6f97dba0 875 MuxDriver *d;
f194a1ae 876 ChardevCommon *common = qapi_ChardevMux_base(mux);
6f97dba0 877
3c0e5a4a
PB
878 drv = qemu_chr_find(mux->chardev);
879 if (drv == NULL) {
880 error_setg(errp, "mux: base chardev %s not found", mux->chardev);
881 return NULL;
882 }
883
b68e956a 884 chr = qemu_chr_alloc(driver, common, errp);
d0d7708b
DB
885 if (!chr) {
886 return NULL;
887 }
2d528d45 888 d = g_new0(MuxDriver, 1);
6f97dba0
AL
889
890 chr->opaque = d;
799f1f23 891 d->focus = -1;
7b7ab18d
MR
892 /* only default to opened state if we've realized the initial
893 * set of muxes
894 */
82878dac 895 *be_opened = muxes_realized;
5345fdb4 896 if (!qemu_chr_fe_init(&d->chr, drv, errp)) {
ecb672d1
MAL
897 qemu_chr_free(chr);
898 return NULL;
899 }
73cdf3f2 900
6f97dba0
AL
901 return chr;
902}
903
94a40fc5
MAL
904CharDriverState *qemu_chr_fe_get_driver(CharBackend *be)
905{
906 return be->chr;
907}
908
909bool qemu_chr_fe_init(CharBackend *b, CharDriverState *s, Error **errp)
910{
911 int tag = 0;
912
ad5c679c 913 if (qemu_chr_get_kind(s) == CHARDEV_BACKEND_KIND_MUX) {
3aef23d7
MAL
914 MuxDriver *d = s->opaque;
915
916 if (d->mux_cnt >= MAX_MUX) {
917 goto unavailable;
94a40fc5 918 }
3aef23d7
MAL
919
920 d->backends[d->mux_cnt] = b;
921 tag = d->mux_cnt++;
922 } else if (s->be) {
923 goto unavailable;
a4afa548
MAL
924 } else {
925 s->be = b;
94a40fc5
MAL
926 }
927
830896af 928 b->fe_open = false;
94a40fc5
MAL
929 b->tag = tag;
930 b->chr = s;
94a40fc5 931 return true;
3aef23d7
MAL
932
933unavailable:
934 error_setg(errp, QERR_DEVICE_IN_USE, s->label);
935 return false;
94a40fc5
MAL
936}
937
a4afa548
MAL
938static bool qemu_chr_is_busy(CharDriverState *s)
939{
ad5c679c 940 if (qemu_chr_get_kind(s) == CHARDEV_BACKEND_KIND_MUX) {
a4afa548
MAL
941 MuxDriver *d = s->opaque;
942 return d->mux_cnt >= 0;
943 } else {
944 return s->be != NULL;
945 }
946}
947
c39860e6
MAL
948void qemu_chr_fe_deinit(CharBackend *b)
949{
950 assert(b);
951
952 if (b->chr) {
39ab61c6 953 qemu_chr_fe_set_handlers(b, NULL, NULL, NULL, NULL, NULL, true);
fb5e19d2
MAL
954 if (b->chr->be == b) {
955 b->chr->be = NULL;
956 }
ad5c679c 957 if (qemu_chr_get_kind(b->chr) == CHARDEV_BACKEND_KIND_MUX) {
a4afa548
MAL
958 MuxDriver *d = b->chr->opaque;
959 d->backends[b->tag] = NULL;
960 }
c39860e6
MAL
961 b->chr = NULL;
962 }
963}
964
94a40fc5
MAL
965void qemu_chr_fe_set_handlers(CharBackend *b,
966 IOCanReadHandler *fd_can_read,
967 IOReadHandler *fd_read,
968 IOEventHandler *fd_event,
969 void *opaque,
39ab61c6
MAL
970 GMainContext *context,
971 bool set_open)
94a40fc5 972{
386f07d1
MAL
973 CharDriverState *s;
974 int fe_open;
975
976 s = b->chr;
977 if (!s) {
94a40fc5
MAL
978 return;
979 }
980
386f07d1
MAL
981 if (!opaque && !fd_can_read && !fd_read && !fd_event) {
982 fe_open = 0;
983 remove_fd_in_watch(s);
984 } else {
985 fe_open = 1;
986 }
a4afa548
MAL
987 b->chr_can_read = fd_can_read;
988 b->chr_read = fd_read;
989 b->chr_event = fd_event;
990 b->opaque = opaque;
b68e956a
MAL
991 if (s->driver->chr_update_read_handler) {
992 s->driver->chr_update_read_handler(s, context);
386f07d1
MAL
993 }
994
39ab61c6 995 if (set_open) {
386f07d1
MAL
996 qemu_chr_fe_set_open(b, fe_open);
997 }
94a40fc5 998
386f07d1
MAL
999 if (fe_open) {
1000 qemu_chr_fe_take_focus(b);
1001 /* We're connecting to an already opened device, so let's make sure we
1002 also get the open event */
1003 if (s->be_open) {
1004 qemu_chr_be_generic_open(s);
1005 }
1006 }
1007
ad5c679c 1008 if (qemu_chr_get_kind(s) == CHARDEV_BACKEND_KIND_MUX) {
386f07d1 1009 mux_chr_set_handlers(s, context);
94a40fc5
MAL
1010 }
1011}
1012
1013void qemu_chr_fe_take_focus(CharBackend *b)
1014{
fa394ed6
MAL
1015 if (!b->chr) {
1016 return;
1017 }
1018
ad5c679c 1019 if (qemu_chr_get_kind(b->chr) == CHARDEV_BACKEND_KIND_MUX) {
fb5e19d2 1020 mux_set_focus(b->chr, b->tag);
94a40fc5
MAL
1021 }
1022}
6f97dba0 1023
96c63847
AL
1024typedef struct IOWatchPoll
1025{
d185c094
PB
1026 GSource parent;
1027
9894dc0c 1028 QIOChannel *ioc;
96c63847 1029 GSource *src;
96c63847
AL
1030
1031 IOCanReadHandler *fd_can_read;
1e885b25 1032 GSourceFunc fd_read;
96c63847 1033 void *opaque;
e92aa36a 1034 GMainContext *context;
96c63847
AL
1035} IOWatchPoll;
1036
96c63847
AL
1037static IOWatchPoll *io_watch_poll_from_source(GSource *source)
1038{
d185c094 1039 return container_of(source, IOWatchPoll, parent);
96c63847
AL
1040}
1041
e92aa36a
ZC
1042static gboolean io_watch_poll_prepare(GSource *source,
1043 gint *timeout_)
96c63847
AL
1044{
1045 IOWatchPoll *iwp = io_watch_poll_from_source(source);
d185c094 1046 bool now_active = iwp->fd_can_read(iwp->opaque) > 0;
1e885b25 1047 bool was_active = iwp->src != NULL;
d185c094 1048 if (was_active == now_active) {
96c63847
AL
1049 return FALSE;
1050 }
1051
d185c094 1052 if (now_active) {
9894dc0c
DB
1053 iwp->src = qio_channel_create_watch(
1054 iwp->ioc, G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL);
1e885b25 1055 g_source_set_callback(iwp->src, iwp->fd_read, iwp->opaque, NULL);
e92aa36a 1056 g_source_attach(iwp->src, iwp->context);
d185c094 1057 } else {
1e885b25
PB
1058 g_source_destroy(iwp->src);
1059 g_source_unref(iwp->src);
1060 iwp->src = NULL;
d185c094
PB
1061 }
1062 return FALSE;
96c63847
AL
1063}
1064
1065static gboolean io_watch_poll_check(GSource *source)
1066{
d185c094 1067 return FALSE;
96c63847
AL
1068}
1069
1070static gboolean io_watch_poll_dispatch(GSource *source, GSourceFunc callback,
1071 gpointer user_data)
1072{
d185c094 1073 abort();
96c63847
AL
1074}
1075
1076static void io_watch_poll_finalize(GSource *source)
1077{
2b316774
PB
1078 /* Due to a glib bug, removing the last reference to a source
1079 * inside a finalize callback causes recursive locking (and a
1080 * deadlock). This is not a problem inside other callbacks,
1081 * including dispatch callbacks, so we call io_remove_watch_poll
1082 * to remove this source. At this point, iwp->src must
1083 * be NULL, or we would leak it.
1084 *
1085 * This would be solved much more elegantly by child sources,
1086 * but we support older glib versions that do not have them.
1087 */
96c63847 1088 IOWatchPoll *iwp = io_watch_poll_from_source(source);
2b316774 1089 assert(iwp->src == NULL);
96c63847
AL
1090}
1091
1092static GSourceFuncs io_watch_poll_funcs = {
1093 .prepare = io_watch_poll_prepare,
1094 .check = io_watch_poll_check,
1095 .dispatch = io_watch_poll_dispatch,
1096 .finalize = io_watch_poll_finalize,
1097};
1098
1099/* Can only be used for read */
e93a68e1
DB
1100static guint io_add_watch_poll(CharDriverState *chr,
1101 QIOChannel *ioc,
96c63847 1102 IOCanReadHandler *fd_can_read,
9894dc0c 1103 QIOChannelFunc fd_read,
e92aa36a
ZC
1104 gpointer user_data,
1105 GMainContext *context)
96c63847
AL
1106{
1107 IOWatchPoll *iwp;
0ca5aa4f 1108 int tag;
e93a68e1 1109 char *name;
96c63847 1110
e92aa36a
ZC
1111 iwp = (IOWatchPoll *) g_source_new(&io_watch_poll_funcs,
1112 sizeof(IOWatchPoll));
96c63847
AL
1113 iwp->fd_can_read = fd_can_read;
1114 iwp->opaque = user_data;
9894dc0c 1115 iwp->ioc = ioc;
1e885b25
PB
1116 iwp->fd_read = (GSourceFunc) fd_read;
1117 iwp->src = NULL;
e92aa36a 1118 iwp->context = context;
96c63847 1119
e93a68e1
DB
1120 name = g_strdup_printf("chardev-iowatch-%s", chr->label);
1121 g_source_set_name((GSource *)iwp, name);
1122 g_free(name);
1123
e92aa36a 1124 tag = g_source_attach(&iwp->parent, context);
0ca5aa4f
PB
1125 g_source_unref(&iwp->parent);
1126 return tag;
96c63847
AL
1127}
1128
2b316774
PB
1129static void io_remove_watch_poll(guint tag)
1130{
1131 GSource *source;
1132 IOWatchPoll *iwp;
1133
1134 g_return_if_fail (tag > 0);
1135
1136 source = g_main_context_find_source_by_id(NULL, tag);
1137 g_return_if_fail (source != NULL);
1138
1139 iwp = io_watch_poll_from_source(source);
1140 if (iwp->src) {
1141 g_source_destroy(iwp->src);
1142 g_source_unref(iwp->src);
1143 iwp->src = NULL;
1144 }
1145 g_source_destroy(&iwp->parent);
1146}
1147
26da70c7
AS
1148static void remove_fd_in_watch(CharDriverState *chr)
1149{
1150 if (chr->fd_in_tag) {
1151 io_remove_watch_poll(chr->fd_in_tag);
1152 chr->fd_in_tag = 0;
1153 }
1154}
1155
96c63847 1156
9894dc0c
DB
1157static int io_channel_send_full(QIOChannel *ioc,
1158 const void *buf, size_t len,
1159 int *fds, size_t nfds)
76a9644b 1160{
9894dc0c 1161 size_t offset = 0;
76a9644b 1162
9894dc0c
DB
1163 while (offset < len) {
1164 ssize_t ret = 0;
1165 struct iovec iov = { .iov_base = (char *)buf + offset,
1166 .iov_len = len - offset };
1167
1168 ret = qio_channel_writev_full(
1169 ioc, &iov, 1,
1170 fds, nfds, NULL);
1171 if (ret == QIO_CHANNEL_ERR_BLOCK) {
9894dc0c
DB
1172 if (offset) {
1173 return offset;
1174 }
76a9644b 1175
e046fb44
DB
1176 errno = EAGAIN;
1177 return -1;
1178 } else if (ret < 0) {
9894dc0c
DB
1179 errno = EINVAL;
1180 return -1;
1181 }
76a9644b 1182
9894dc0c
DB
1183 offset += ret;
1184 }
76a9644b 1185
9894dc0c 1186 return offset;
76a9644b
AL
1187}
1188
9894dc0c 1189
0ff0fad2 1190#ifndef _WIN32
9894dc0c 1191static int io_channel_send(QIOChannel *ioc, const void *buf, size_t len)
96c63847 1192{
9894dc0c 1193 return io_channel_send_full(ioc, buf, len, NULL, 0);
96c63847 1194}
96c63847 1195
44ab9ed4 1196
a29753f8
AL
1197typedef struct FDCharDriver {
1198 CharDriverState *chr;
9894dc0c 1199 QIOChannel *ioc_in, *ioc_out;
6f97dba0
AL
1200 int max_size;
1201} FDCharDriver;
1202
9005b2a7 1203/* Called with chr_write_lock held. */
6f97dba0
AL
1204static int fd_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1205{
1206 FDCharDriver *s = chr->opaque;
a29753f8 1207
9894dc0c 1208 return io_channel_send(s->ioc_out, buf, len);
6f97dba0
AL
1209}
1210
9894dc0c 1211static gboolean fd_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
6f97dba0
AL
1212{
1213 CharDriverState *chr = opaque;
1214 FDCharDriver *s = chr->opaque;
a29753f8 1215 int len;
9bd7854e 1216 uint8_t buf[READ_BUF_LEN];
9894dc0c 1217 ssize_t ret;
6f97dba0
AL
1218
1219 len = sizeof(buf);
a29753f8 1220 if (len > s->max_size) {
6f97dba0 1221 len = s->max_size;
a29753f8
AL
1222 }
1223 if (len == 0) {
cdbf6e16 1224 return TRUE;
a29753f8
AL
1225 }
1226
9894dc0c
DB
1227 ret = qio_channel_read(
1228 chan, (gchar *)buf, len, NULL);
1229 if (ret == 0) {
26da70c7 1230 remove_fd_in_watch(chr);
a425d23f 1231 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
a29753f8 1232 return FALSE;
6f97dba0 1233 }
9894dc0c
DB
1234 if (ret > 0) {
1235 qemu_chr_be_write(chr, buf, ret);
6f97dba0 1236 }
a29753f8
AL
1237
1238 return TRUE;
1239}
1240
1241static int fd_chr_read_poll(void *opaque)
1242{
1243 CharDriverState *chr = opaque;
1244 FDCharDriver *s = chr->opaque;
1245
1246 s->max_size = qemu_chr_be_can_write(chr);
1247 return s->max_size;
6f97dba0
AL
1248}
1249
23673ca7
AL
1250static GSource *fd_chr_add_watch(CharDriverState *chr, GIOCondition cond)
1251{
1252 FDCharDriver *s = chr->opaque;
9894dc0c 1253 return qio_channel_create_watch(s->ioc_out, cond);
23673ca7
AL
1254}
1255
e92aa36a 1256static void fd_chr_update_read_handler(CharDriverState *chr,
a4afa548 1257 GMainContext *context)
6f97dba0
AL
1258{
1259 FDCharDriver *s = chr->opaque;
1260
26da70c7 1261 remove_fd_in_watch(chr);
9894dc0c 1262 if (s->ioc_in) {
e93a68e1 1263 chr->fd_in_tag = io_add_watch_poll(chr, s->ioc_in,
9894dc0c 1264 fd_chr_read_poll,
e92aa36a
ZC
1265 fd_chr_read, chr,
1266 context);
6f97dba0
AL
1267 }
1268}
1269
72ac8762 1270static void fd_chr_free(struct CharDriverState *chr)
6f97dba0
AL
1271{
1272 FDCharDriver *s = chr->opaque;
1273
26da70c7 1274 remove_fd_in_watch(chr);
9894dc0c
DB
1275 if (s->ioc_in) {
1276 object_unref(OBJECT(s->ioc_in));
a29753f8 1277 }
9894dc0c
DB
1278 if (s->ioc_out) {
1279 object_unref(OBJECT(s->ioc_out));
6f97dba0
AL
1280 }
1281
7267c094 1282 g_free(s);
a425d23f 1283 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
6f97dba0
AL
1284}
1285
1286/* open a character device to a unix fd */
b68e956a
MAL
1287static CharDriverState *qemu_chr_open_fd(const CharDriver *driver,
1288 int fd_in, int fd_out,
d0d7708b 1289 ChardevCommon *backend, Error **errp)
6f97dba0
AL
1290{
1291 CharDriverState *chr;
1292 FDCharDriver *s;
e93a68e1 1293 char *name;
6f97dba0 1294
b68e956a 1295 chr = qemu_chr_alloc(driver, backend, errp);
d0d7708b
DB
1296 if (!chr) {
1297 return NULL;
1298 }
2d528d45 1299 s = g_new0(FDCharDriver, 1);
9894dc0c 1300 s->ioc_in = QIO_CHANNEL(qio_channel_file_new_fd(fd_in));
e93a68e1
DB
1301 name = g_strdup_printf("chardev-file-in-%s", chr->label);
1302 qio_channel_set_name(QIO_CHANNEL(s->ioc_in), name);
1303 g_free(name);
9894dc0c 1304 s->ioc_out = QIO_CHANNEL(qio_channel_file_new_fd(fd_out));
e93a68e1
DB
1305 name = g_strdup_printf("chardev-file-out-%s", chr->label);
1306 qio_channel_set_name(QIO_CHANNEL(s->ioc_out), name);
1307 g_free(name);
4ff12bdb 1308 qemu_set_nonblock(fd_out);
a29753f8 1309 s->chr = chr;
6f97dba0 1310 chr->opaque = s;
6f97dba0 1311
6f97dba0
AL
1312 return chr;
1313}
1314
b68e956a
MAL
1315static CharDriverState *qemu_chr_open_pipe(const CharDriver *driver,
1316 const char *id,
20cbe7a2
PB
1317 ChardevBackend *backend,
1318 ChardevReturn *ret,
82878dac 1319 bool *be_opened,
20cbe7a2 1320 Error **errp)
6f97dba0 1321{
32bafa8f 1322 ChardevHostdev *opts = backend->u.pipe.data;
6f97dba0 1323 int fd_in, fd_out;
0ff0fad2
DB
1324 char *filename_in;
1325 char *filename_out;
548cbb36 1326 const char *filename = opts->device;
f194a1ae 1327 ChardevCommon *common = qapi_ChardevHostdev_base(opts);
7d31544f 1328
0ff0fad2
DB
1329
1330 filename_in = g_strdup_printf("%s.in", filename);
1331 filename_out = g_strdup_printf("%s.out", filename);
40ff6d7e
KW
1332 TFR(fd_in = qemu_open(filename_in, O_RDWR | O_BINARY));
1333 TFR(fd_out = qemu_open(filename_out, O_RDWR | O_BINARY));
0ff0fad2
DB
1334 g_free(filename_in);
1335 g_free(filename_out);
6f97dba0
AL
1336 if (fd_in < 0 || fd_out < 0) {
1337 if (fd_in >= 0)
1338 close(fd_in);
1339 if (fd_out >= 0)
1340 close(fd_out);
b181e047 1341 TFR(fd_in = fd_out = qemu_open(filename, O_RDWR | O_BINARY));
a89dd6c3 1342 if (fd_in < 0) {
20cbe7a2 1343 error_setg_file_open(errp, errno, filename);
1f51470d 1344 return NULL;
a89dd6c3 1345 }
6f97dba0 1346 }
b68e956a 1347 return qemu_chr_open_fd(driver, fd_in, fd_out, common, errp);
6f97dba0
AL
1348}
1349
6f97dba0
AL
1350/* init terminal so that we can grab keys */
1351static struct termios oldtty;
1352static int old_fd0_flags;
c88930a6 1353static bool stdio_in_use;
bb002513 1354static bool stdio_allow_signal;
e76d4420
GH
1355static bool stdio_echo_state;
1356
1357static void qemu_chr_set_echo_stdio(CharDriverState *chr, bool echo);
6f97dba0
AL
1358
1359static void term_exit(void)
1360{
1361 tcsetattr (0, TCSANOW, &oldtty);
1362 fcntl(0, F_SETFL, old_fd0_flags);
1363}
1364
e76d4420
GH
1365static void term_stdio_handler(int sig)
1366{
1367 /* restore echo after resume from suspend. */
1368 qemu_chr_set_echo_stdio(NULL, stdio_echo_state);
1369}
1370
bb002513 1371static void qemu_chr_set_echo_stdio(CharDriverState *chr, bool echo)
6f97dba0
AL
1372{
1373 struct termios tty;
1374
e76d4420 1375 stdio_echo_state = echo;
0369364b 1376 tty = oldtty;
bb002513
PB
1377 if (!echo) {
1378 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
6f97dba0 1379 |INLCR|IGNCR|ICRNL|IXON);
bb002513
PB
1380 tty.c_oflag |= OPOST;
1381 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1382 tty.c_cflag &= ~(CSIZE|PARENB);
1383 tty.c_cflag |= CS8;
1384 tty.c_cc[VMIN] = 1;
1385 tty.c_cc[VTIME] = 0;
1386 }
bb002513 1387 if (!stdio_allow_signal)
6f97dba0 1388 tty.c_lflag &= ~ISIG;
6f97dba0
AL
1389
1390 tcsetattr (0, TCSANOW, &tty);
6f97dba0
AL
1391}
1392
72ac8762 1393static void qemu_chr_free_stdio(struct CharDriverState *chr)
6f97dba0
AL
1394{
1395 term_exit();
72ac8762 1396 fd_chr_free(chr);
6f97dba0
AL
1397}
1398
b68e956a
MAL
1399static CharDriverState *qemu_chr_open_stdio(const CharDriver *driver,
1400 const char *id,
8c84b25d
PB
1401 ChardevBackend *backend,
1402 ChardevReturn *ret,
82878dac 1403 bool *be_opened,
8c84b25d 1404 Error **errp)
6f97dba0 1405{
32bafa8f 1406 ChardevStdio *opts = backend->u.stdio.data;
6f97dba0 1407 CharDriverState *chr;
e76d4420 1408 struct sigaction act;
f194a1ae 1409 ChardevCommon *common = qapi_ChardevStdio_base(opts);
6f97dba0 1410
ab51b1d5 1411 if (is_daemonized()) {
8c84b25d 1412 error_setg(errp, "cannot use stdio with -daemonize");
ab51b1d5
MT
1413 return NULL;
1414 }
c88930a6
LL
1415
1416 if (stdio_in_use) {
8c84b25d
PB
1417 error_setg(errp, "cannot use stdio by multiple character devices");
1418 return NULL;
c88930a6
LL
1419 }
1420
1421 stdio_in_use = true;
ed7a1540 1422 old_fd0_flags = fcntl(0, F_GETFL);
c88930a6 1423 tcgetattr(0, &oldtty);
4ff12bdb 1424 qemu_set_nonblock(0);
ed7a1540 1425 atexit(term_exit);
0369364b 1426
e76d4420
GH
1427 memset(&act, 0, sizeof(act));
1428 act.sa_handler = term_stdio_handler;
1429 sigaction(SIGCONT, &act, NULL);
1430
b68e956a 1431 chr = qemu_chr_open_fd(driver, 0, 1, common, errp);
71200fb9
LM
1432 if (!chr) {
1433 return NULL;
1434 }
7c358031
GH
1435 if (opts->has_signal) {
1436 stdio_allow_signal = opts->signal;
1437 }
5345fdb4 1438 qemu_chr_set_echo_stdio(chr, false);
6f97dba0 1439
1f51470d 1440 return chr;
6f97dba0
AL
1441}
1442
6f97dba0 1443#if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
a167ba50
AJ
1444 || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) \
1445 || defined(__GLIBC__)
6f97dba0 1446
d809ab95
PB
1447#define HAVE_CHARDEV_SERIAL 1
1448#define HAVE_CHARDEV_PTY 1
e551498e 1449
6f97dba0 1450typedef struct {
9894dc0c 1451 QIOChannel *ioc;
6f97dba0 1452 int read_bytes;
9005b2a7
PB
1453
1454 /* Protected by the CharDriverState chr_write_lock. */
1455 int connected;
8aa33caf 1456 guint timer_tag;
7b3621f4 1457 guint open_tag;
6f97dba0
AL
1458} PtyCharDriver;
1459
9005b2a7 1460static void pty_chr_update_read_handler_locked(CharDriverState *chr);
6f97dba0
AL
1461static void pty_chr_state(CharDriverState *chr, int connected);
1462
8aa33caf
AL
1463static gboolean pty_chr_timer(gpointer opaque)
1464{
1465 struct CharDriverState *chr = opaque;
1466 PtyCharDriver *s = chr->opaque;
1467
9005b2a7 1468 qemu_mutex_lock(&chr->chr_write_lock);
79f20075 1469 s->timer_tag = 0;
7b3621f4 1470 s->open_tag = 0;
b0d768c3
GH
1471 if (!s->connected) {
1472 /* Next poll ... */
9005b2a7 1473 pty_chr_update_read_handler_locked(chr);
b0d768c3 1474 }
9005b2a7 1475 qemu_mutex_unlock(&chr->chr_write_lock);
8aa33caf
AL
1476 return FALSE;
1477}
1478
9005b2a7 1479/* Called with chr_write_lock held. */
8aa33caf
AL
1480static void pty_chr_rearm_timer(CharDriverState *chr, int ms)
1481{
1482 PtyCharDriver *s = chr->opaque;
e93a68e1 1483 char *name;
8aa33caf
AL
1484
1485 if (s->timer_tag) {
1486 g_source_remove(s->timer_tag);
1487 s->timer_tag = 0;
1488 }
1489
1490 if (ms == 1000) {
e93a68e1 1491 name = g_strdup_printf("pty-timer-secs-%s", chr->label);
8aa33caf
AL
1492 s->timer_tag = g_timeout_add_seconds(1, pty_chr_timer, chr);
1493 } else {
e93a68e1 1494 name = g_strdup_printf("pty-timer-ms-%s", chr->label);
8aa33caf
AL
1495 s->timer_tag = g_timeout_add(ms, pty_chr_timer, chr);
1496 }
e93a68e1
DB
1497 g_source_set_name_by_id(s->timer_tag, name);
1498 g_free(name);
8aa33caf
AL
1499}
1500
9005b2a7
PB
1501/* Called with chr_write_lock held. */
1502static void pty_chr_update_read_handler_locked(CharDriverState *chr)
1bb7fe72
PB
1503{
1504 PtyCharDriver *s = chr->opaque;
1505 GPollFD pfd;
c1f24489 1506 int rc;
9894dc0c 1507 QIOChannelFile *fioc = QIO_CHANNEL_FILE(s->ioc);
1bb7fe72 1508
9894dc0c 1509 pfd.fd = fioc->fd;
1bb7fe72
PB
1510 pfd.events = G_IO_OUT;
1511 pfd.revents = 0;
c1f24489
PB
1512 do {
1513 rc = g_poll(&pfd, 1, 0);
1514 } while (rc == -1 && errno == EINTR);
1515 assert(rc >= 0);
1516
1bb7fe72
PB
1517 if (pfd.revents & G_IO_HUP) {
1518 pty_chr_state(chr, 0);
1519 } else {
1520 pty_chr_state(chr, 1);
1521 }
1522}
1523
e92aa36a 1524static void pty_chr_update_read_handler(CharDriverState *chr,
a4afa548 1525 GMainContext *context)
9005b2a7
PB
1526{
1527 qemu_mutex_lock(&chr->chr_write_lock);
1528 pty_chr_update_read_handler_locked(chr);
1529 qemu_mutex_unlock(&chr->chr_write_lock);
1530}
1531
1532/* Called with chr_write_lock held. */
6f97dba0
AL
1533static int pty_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1534{
1535 PtyCharDriver *s = chr->opaque;
1536
1537 if (!s->connected) {
1538 /* guest sends data, check for (re-)connect */
9005b2a7 1539 pty_chr_update_read_handler_locked(chr);
cf7330c7
ST
1540 if (!s->connected) {
1541 return 0;
1542 }
6f97dba0 1543 }
9894dc0c 1544 return io_channel_send(s->ioc, buf, len);
6f97dba0
AL
1545}
1546
e6a87ed8
AL
1547static GSource *pty_chr_add_watch(CharDriverState *chr, GIOCondition cond)
1548{
1549 PtyCharDriver *s = chr->opaque;
62c339c5
PB
1550 if (!s->connected) {
1551 return NULL;
1552 }
9894dc0c 1553 return qio_channel_create_watch(s->ioc, cond);
e6a87ed8
AL
1554}
1555
6f97dba0
AL
1556static int pty_chr_read_poll(void *opaque)
1557{
1558 CharDriverState *chr = opaque;
1559 PtyCharDriver *s = chr->opaque;
1560
909cda12 1561 s->read_bytes = qemu_chr_be_can_write(chr);
6f97dba0
AL
1562 return s->read_bytes;
1563}
1564
9894dc0c 1565static gboolean pty_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
6f97dba0
AL
1566{
1567 CharDriverState *chr = opaque;
1568 PtyCharDriver *s = chr->opaque;
9894dc0c 1569 gsize len;
9bd7854e 1570 uint8_t buf[READ_BUF_LEN];
9894dc0c 1571 ssize_t ret;
6f97dba0
AL
1572
1573 len = sizeof(buf);
1574 if (len > s->read_bytes)
1575 len = s->read_bytes;
cdbf6e16
PB
1576 if (len == 0) {
1577 return TRUE;
1578 }
9894dc0c
DB
1579 ret = qio_channel_read(s->ioc, (char *)buf, len, NULL);
1580 if (ret <= 0) {
6f97dba0 1581 pty_chr_state(chr, 0);
093d3a20
AL
1582 return FALSE;
1583 } else {
6f97dba0 1584 pty_chr_state(chr, 1);
9894dc0c 1585 qemu_chr_be_write(chr, buf, ret);
6f97dba0 1586 }
093d3a20 1587 return TRUE;
6f97dba0
AL
1588}
1589
7b3621f4
PB
1590static gboolean qemu_chr_be_generic_open_func(gpointer opaque)
1591{
1592 CharDriverState *chr = opaque;
1593 PtyCharDriver *s = chr->opaque;
1594
1595 s->open_tag = 0;
1596 qemu_chr_be_generic_open(chr);
1597 return FALSE;
1598}
1599
9005b2a7 1600/* Called with chr_write_lock held. */
6f97dba0
AL
1601static void pty_chr_state(CharDriverState *chr, int connected)
1602{
1603 PtyCharDriver *s = chr->opaque;
1604
1605 if (!connected) {
7b3621f4
PB
1606 if (s->open_tag) {
1607 g_source_remove(s->open_tag);
1608 s->open_tag = 0;
1609 }
26da70c7 1610 remove_fd_in_watch(chr);
6f97dba0 1611 s->connected = 0;
6f97dba0
AL
1612 /* (re-)connect poll interval for idle guests: once per second.
1613 * We check more frequently in case the guests sends data to
1614 * the virtual device linked to our pty. */
8aa33caf 1615 pty_chr_rearm_timer(chr, 1000);
6f97dba0 1616 } else {
85a67692
PB
1617 if (s->timer_tag) {
1618 g_source_remove(s->timer_tag);
1619 s->timer_tag = 0;
1620 }
1621 if (!s->connected) {
7b3621f4 1622 g_assert(s->open_tag == 0);
85a67692 1623 s->connected = 1;
7b3621f4 1624 s->open_tag = g_idle_add(qemu_chr_be_generic_open_func, chr);
ac1b84dd
GH
1625 }
1626 if (!chr->fd_in_tag) {
e93a68e1 1627 chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
9894dc0c 1628 pty_chr_read_poll,
e92aa36a
ZC
1629 pty_chr_read,
1630 chr, NULL);
85a67692 1631 }
6f97dba0
AL
1632 }
1633}
1634
72ac8762 1635static void pty_chr_free(struct CharDriverState *chr)
6f97dba0
AL
1636{
1637 PtyCharDriver *s = chr->opaque;
1638
7b3621f4
PB
1639 qemu_mutex_lock(&chr->chr_write_lock);
1640 pty_chr_state(chr, 0);
9894dc0c 1641 object_unref(OBJECT(s->ioc));
8aa33caf
AL
1642 if (s->timer_tag) {
1643 g_source_remove(s->timer_tag);
910b6368 1644 s->timer_tag = 0;
8aa33caf 1645 }
7b3621f4 1646 qemu_mutex_unlock(&chr->chr_write_lock);
7267c094 1647 g_free(s);
a425d23f 1648 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
6f97dba0
AL
1649}
1650
b68e956a
MAL
1651static CharDriverState *qemu_chr_open_pty(const CharDriver *driver,
1652 const char *id,
c2e75a43
PB
1653 ChardevBackend *backend,
1654 ChardevReturn *ret,
82878dac 1655 bool *be_opened,
c2e75a43 1656 Error **errp)
6f97dba0
AL
1657{
1658 CharDriverState *chr;
1659 PtyCharDriver *s;
e68c5958 1660 int master_fd, slave_fd;
6f97dba0 1661 char pty_name[PATH_MAX];
32bafa8f 1662 ChardevCommon *common = backend->u.pty.data;
e93a68e1 1663 char *name;
6f97dba0 1664
4efeabbb
MT
1665 master_fd = qemu_openpty_raw(&slave_fd, pty_name);
1666 if (master_fd < 0) {
c2e75a43 1667 error_setg_errno(errp, errno, "Failed to create PTY");
1f51470d 1668 return NULL;
6f97dba0
AL
1669 }
1670
837a183f 1671 close(slave_fd);
fac6688a 1672 qemu_set_nonblock(master_fd);
6f97dba0 1673
b68e956a 1674 chr = qemu_chr_alloc(driver, common, errp);
d0d7708b
DB
1675 if (!chr) {
1676 close(master_fd);
1677 return NULL;
1678 }
a4e26048 1679
4efeabbb
MT
1680 chr->filename = g_strdup_printf("pty:%s", pty_name);
1681 ret->pty = g_strdup(pty_name);
e68c5958 1682 ret->has_pty = true;
58650218 1683
e68c5958 1684 fprintf(stderr, "char device redirected to %s (label %s)\n",
4efeabbb 1685 pty_name, id);
6f97dba0 1686
2d528d45 1687 s = g_new0(PtyCharDriver, 1);
6f97dba0 1688 chr->opaque = s;
82878dac 1689 *be_opened = false;
6f97dba0 1690
9894dc0c 1691 s->ioc = QIO_CHANNEL(qio_channel_file_new_fd(master_fd));
e93a68e1
DB
1692 name = g_strdup_printf("chardev-pty-%s", chr->label);
1693 qio_channel_set_name(QIO_CHANNEL(s->ioc), name);
1694 g_free(name);
8aa33caf 1695 s->timer_tag = 0;
6f97dba0 1696
1f51470d 1697 return chr;
6f97dba0
AL
1698}
1699
b68e956a
MAL
1700static const CharDriver pty_driver = {
1701 .kind = CHARDEV_BACKEND_KIND_PTY,
1702 .create = qemu_chr_open_pty,
1703 .chr_write = pty_chr_write,
1704 .chr_update_read_handler = pty_chr_update_read_handler,
1705 .chr_add_watch = pty_chr_add_watch,
1706 .chr_free = pty_chr_free,
1707};
1708
6f97dba0
AL
1709static void tty_serial_init(int fd, int speed,
1710 int parity, int data_bits, int stop_bits)
1711{
1712 struct termios tty;
1713 speed_t spd;
1714
1715#if 0
1716 printf("tty_serial_init: speed=%d parity=%c data=%d stop=%d\n",
1717 speed, parity, data_bits, stop_bits);
1718#endif
1719 tcgetattr (fd, &tty);
1720
45eea13b
SW
1721#define check_speed(val) if (speed <= val) { spd = B##val; break; }
1722 speed = speed * 10 / 11;
1723 do {
1724 check_speed(50);
1725 check_speed(75);
1726 check_speed(110);
1727 check_speed(134);
1728 check_speed(150);
1729 check_speed(200);
1730 check_speed(300);
1731 check_speed(600);
1732 check_speed(1200);
1733 check_speed(1800);
1734 check_speed(2400);
1735 check_speed(4800);
1736 check_speed(9600);
1737 check_speed(19200);
1738 check_speed(38400);
1739 /* Non-Posix values follow. They may be unsupported on some systems. */
1740 check_speed(57600);
1741 check_speed(115200);
1742#ifdef B230400
1743 check_speed(230400);
1744#endif
1745#ifdef B460800
1746 check_speed(460800);
1747#endif
1748#ifdef B500000
1749 check_speed(500000);
1750#endif
1751#ifdef B576000
1752 check_speed(576000);
1753#endif
1754#ifdef B921600
1755 check_speed(921600);
1756#endif
1757#ifdef B1000000
1758 check_speed(1000000);
1759#endif
1760#ifdef B1152000
1761 check_speed(1152000);
1762#endif
1763#ifdef B1500000
1764 check_speed(1500000);
1765#endif
1766#ifdef B2000000
1767 check_speed(2000000);
1768#endif
1769#ifdef B2500000
1770 check_speed(2500000);
1771#endif
1772#ifdef B3000000
1773 check_speed(3000000);
1774#endif
1775#ifdef B3500000
1776 check_speed(3500000);
1777#endif
1778#ifdef B4000000
1779 check_speed(4000000);
1780#endif
6f97dba0 1781 spd = B115200;
45eea13b 1782 } while (0);
6f97dba0
AL
1783
1784 cfsetispeed(&tty, spd);
1785 cfsetospeed(&tty, spd);
1786
1787 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1788 |INLCR|IGNCR|ICRNL|IXON);
1789 tty.c_oflag |= OPOST;
1790 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN|ISIG);
1791 tty.c_cflag &= ~(CSIZE|PARENB|PARODD|CRTSCTS|CSTOPB);
1792 switch(data_bits) {
1793 default:
1794 case 8:
1795 tty.c_cflag |= CS8;
1796 break;
1797 case 7:
1798 tty.c_cflag |= CS7;
1799 break;
1800 case 6:
1801 tty.c_cflag |= CS6;
1802 break;
1803 case 5:
1804 tty.c_cflag |= CS5;
1805 break;
1806 }
1807 switch(parity) {
1808 default:
1809 case 'N':
1810 break;
1811 case 'E':
1812 tty.c_cflag |= PARENB;
1813 break;
1814 case 'O':
1815 tty.c_cflag |= PARENB | PARODD;
1816 break;
1817 }
1818 if (stop_bits == 2)
1819 tty.c_cflag |= CSTOPB;
1820
1821 tcsetattr (fd, TCSANOW, &tty);
1822}
1823
1824static int tty_serial_ioctl(CharDriverState *chr, int cmd, void *arg)
1825{
1826 FDCharDriver *s = chr->opaque;
9894dc0c 1827 QIOChannelFile *fioc = QIO_CHANNEL_FILE(s->ioc_in);
6f97dba0
AL
1828
1829 switch(cmd) {
1830 case CHR_IOCTL_SERIAL_SET_PARAMS:
1831 {
1832 QEMUSerialSetParams *ssp = arg;
9894dc0c 1833 tty_serial_init(fioc->fd,
a29753f8 1834 ssp->speed, ssp->parity,
6f97dba0
AL
1835 ssp->data_bits, ssp->stop_bits);
1836 }
1837 break;
1838 case CHR_IOCTL_SERIAL_SET_BREAK:
1839 {
1840 int enable = *(int *)arg;
a29753f8 1841 if (enable) {
9894dc0c 1842 tcsendbreak(fioc->fd, 1);
a29753f8 1843 }
6f97dba0
AL
1844 }
1845 break;
1846 case CHR_IOCTL_SERIAL_GET_TIOCM:
1847 {
1848 int sarg = 0;
1849 int *targ = (int *)arg;
9894dc0c 1850 ioctl(fioc->fd, TIOCMGET, &sarg);
6f97dba0 1851 *targ = 0;
b4abdfa4 1852 if (sarg & TIOCM_CTS)
6f97dba0 1853 *targ |= CHR_TIOCM_CTS;
b4abdfa4 1854 if (sarg & TIOCM_CAR)
6f97dba0 1855 *targ |= CHR_TIOCM_CAR;
b4abdfa4 1856 if (sarg & TIOCM_DSR)
6f97dba0 1857 *targ |= CHR_TIOCM_DSR;
b4abdfa4 1858 if (sarg & TIOCM_RI)
6f97dba0 1859 *targ |= CHR_TIOCM_RI;
b4abdfa4 1860 if (sarg & TIOCM_DTR)
6f97dba0 1861 *targ |= CHR_TIOCM_DTR;
b4abdfa4 1862 if (sarg & TIOCM_RTS)
6f97dba0
AL
1863 *targ |= CHR_TIOCM_RTS;
1864 }
1865 break;
1866 case CHR_IOCTL_SERIAL_SET_TIOCM:
1867 {
1868 int sarg = *(int *)arg;
1869 int targ = 0;
9894dc0c 1870 ioctl(fioc->fd, TIOCMGET, &targ);
b4abdfa4
AJ
1871 targ &= ~(CHR_TIOCM_CTS | CHR_TIOCM_CAR | CHR_TIOCM_DSR
1872 | CHR_TIOCM_RI | CHR_TIOCM_DTR | CHR_TIOCM_RTS);
1873 if (sarg & CHR_TIOCM_CTS)
1874 targ |= TIOCM_CTS;
1875 if (sarg & CHR_TIOCM_CAR)
1876 targ |= TIOCM_CAR;
1877 if (sarg & CHR_TIOCM_DSR)
1878 targ |= TIOCM_DSR;
1879 if (sarg & CHR_TIOCM_RI)
1880 targ |= TIOCM_RI;
1881 if (sarg & CHR_TIOCM_DTR)
6f97dba0 1882 targ |= TIOCM_DTR;
b4abdfa4 1883 if (sarg & CHR_TIOCM_RTS)
6f97dba0 1884 targ |= TIOCM_RTS;
9894dc0c 1885 ioctl(fioc->fd, TIOCMSET, &targ);
6f97dba0
AL
1886 }
1887 break;
1888 default:
1889 return -ENOTSUP;
1890 }
1891 return 0;
1892}
1893
72ac8762 1894static void qemu_chr_free_tty(CharDriverState *chr)
4266a134 1895{
72ac8762 1896 fd_chr_free(chr);
4266a134 1897}
6f97dba0
AL
1898#endif /* __linux__ || __sun__ */
1899
1900#if defined(__linux__)
e551498e
GH
1901
1902#define HAVE_CHARDEV_PARPORT 1
1903
6f97dba0
AL
1904typedef struct {
1905 int fd;
1906 int mode;
1907} ParallelCharDriver;
1908
1909static int pp_hw_mode(ParallelCharDriver *s, uint16_t mode)
1910{
1911 if (s->mode != mode) {
1912 int m = mode;
1913 if (ioctl(s->fd, PPSETMODE, &m) < 0)
1914 return 0;
1915 s->mode = mode;
1916 }
1917 return 1;
1918}
1919
1920static int pp_ioctl(CharDriverState *chr, int cmd, void *arg)
1921{
1922 ParallelCharDriver *drv = chr->opaque;
1923 int fd = drv->fd;
1924 uint8_t b;
1925
1926 switch(cmd) {
1927 case CHR_IOCTL_PP_READ_DATA:
1928 if (ioctl(fd, PPRDATA, &b) < 0)
1929 return -ENOTSUP;
1930 *(uint8_t *)arg = b;
1931 break;
1932 case CHR_IOCTL_PP_WRITE_DATA:
1933 b = *(uint8_t *)arg;
1934 if (ioctl(fd, PPWDATA, &b) < 0)
1935 return -ENOTSUP;
1936 break;
1937 case CHR_IOCTL_PP_READ_CONTROL:
1938 if (ioctl(fd, PPRCONTROL, &b) < 0)
1939 return -ENOTSUP;
1940 /* Linux gives only the lowest bits, and no way to know data
1941 direction! For better compatibility set the fixed upper
1942 bits. */
1943 *(uint8_t *)arg = b | 0xc0;
1944 break;
1945 case CHR_IOCTL_PP_WRITE_CONTROL:
1946 b = *(uint8_t *)arg;
1947 if (ioctl(fd, PPWCONTROL, &b) < 0)
1948 return -ENOTSUP;
1949 break;
1950 case CHR_IOCTL_PP_READ_STATUS:
1951 if (ioctl(fd, PPRSTATUS, &b) < 0)
1952 return -ENOTSUP;
1953 *(uint8_t *)arg = b;
1954 break;
1955 case CHR_IOCTL_PP_DATA_DIR:
1956 if (ioctl(fd, PPDATADIR, (int *)arg) < 0)
1957 return -ENOTSUP;
1958 break;
1959 case CHR_IOCTL_PP_EPP_READ_ADDR:
1960 if (pp_hw_mode(drv, IEEE1284_MODE_EPP|IEEE1284_ADDR)) {
1961 struct ParallelIOArg *parg = arg;
1962 int n = read(fd, parg->buffer, parg->count);
1963 if (n != parg->count) {
1964 return -EIO;
1965 }
1966 }
1967 break;
1968 case CHR_IOCTL_PP_EPP_READ:
1969 if (pp_hw_mode(drv, IEEE1284_MODE_EPP)) {
1970 struct ParallelIOArg *parg = arg;
1971 int n = read(fd, parg->buffer, parg->count);
1972 if (n != parg->count) {
1973 return -EIO;
1974 }
1975 }
1976 break;
1977 case CHR_IOCTL_PP_EPP_WRITE_ADDR:
1978 if (pp_hw_mode(drv, IEEE1284_MODE_EPP|IEEE1284_ADDR)) {
1979 struct ParallelIOArg *parg = arg;
1980 int n = write(fd, parg->buffer, parg->count);
1981 if (n != parg->count) {
1982 return -EIO;
1983 }
1984 }
1985 break;
1986 case CHR_IOCTL_PP_EPP_WRITE:
1987 if (pp_hw_mode(drv, IEEE1284_MODE_EPP)) {
1988 struct ParallelIOArg *parg = arg;
1989 int n = write(fd, parg->buffer, parg->count);
1990 if (n != parg->count) {
1991 return -EIO;
1992 }
1993 }
1994 break;
1995 default:
1996 return -ENOTSUP;
1997 }
1998 return 0;
1999}
2000
72ac8762 2001static void pp_free(CharDriverState *chr)
6f97dba0
AL
2002{
2003 ParallelCharDriver *drv = chr->opaque;
2004 int fd = drv->fd;
2005
2006 pp_hw_mode(drv, IEEE1284_MODE_COMPAT);
2007 ioctl(fd, PPRELEASE);
2008 close(fd);
7267c094 2009 g_free(drv);
a425d23f 2010 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
6f97dba0
AL
2011}
2012
b68e956a
MAL
2013static CharDriverState *qemu_chr_open_pp_fd(const CharDriver *driver,
2014 int fd,
d0d7708b 2015 ChardevCommon *backend,
82878dac 2016 bool *be_opened,
d0d7708b 2017 Error **errp)
6f97dba0
AL
2018{
2019 CharDriverState *chr;
2020 ParallelCharDriver *drv;
6f97dba0
AL
2021
2022 if (ioctl(fd, PPCLAIM) < 0) {
38bfb1a6 2023 error_setg_errno(errp, errno, "not a parallel port");
6f97dba0 2024 close(fd);
1f51470d 2025 return NULL;
6f97dba0
AL
2026 }
2027
b68e956a 2028 chr = qemu_chr_alloc(driver, backend, errp);
d0d7708b
DB
2029 if (!chr) {
2030 return NULL;
2031 }
27ef9cb0
PB
2032
2033 drv = g_new0(ParallelCharDriver, 1);
2034 chr->opaque = drv;
27ef9cb0
PB
2035
2036 drv->fd = fd;
2037 drv->mode = IEEE1284_MODE_COMPAT;
6f97dba0 2038
1f51470d 2039 return chr;
6f97dba0
AL
2040}
2041#endif /* __linux__ */
2042
a167ba50 2043#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
e551498e
GH
2044
2045#define HAVE_CHARDEV_PARPORT 1
2046
6972f935
BS
2047static int pp_ioctl(CharDriverState *chr, int cmd, void *arg)
2048{
e0efb993 2049 int fd = (int)(intptr_t)chr->opaque;
6972f935
BS
2050 uint8_t b;
2051
2052 switch(cmd) {
2053 case CHR_IOCTL_PP_READ_DATA:
2054 if (ioctl(fd, PPIGDATA, &b) < 0)
2055 return -ENOTSUP;
2056 *(uint8_t *)arg = b;
2057 break;
2058 case CHR_IOCTL_PP_WRITE_DATA:
2059 b = *(uint8_t *)arg;
2060 if (ioctl(fd, PPISDATA, &b) < 0)
2061 return -ENOTSUP;
2062 break;
2063 case CHR_IOCTL_PP_READ_CONTROL:
2064 if (ioctl(fd, PPIGCTRL, &b) < 0)
2065 return -ENOTSUP;
2066 *(uint8_t *)arg = b;
2067 break;
2068 case CHR_IOCTL_PP_WRITE_CONTROL:
2069 b = *(uint8_t *)arg;
2070 if (ioctl(fd, PPISCTRL, &b) < 0)
2071 return -ENOTSUP;
2072 break;
2073 case CHR_IOCTL_PP_READ_STATUS:
2074 if (ioctl(fd, PPIGSTATUS, &b) < 0)
2075 return -ENOTSUP;
2076 *(uint8_t *)arg = b;
2077 break;
2078 default:
2079 return -ENOTSUP;
2080 }
2081 return 0;
2082}
2083
b68e956a
MAL
2084static CharDriverState *qemu_chr_open_pp_fd(const CharDriver *driver,
2085 int fd,
0850d49c 2086 ChardevCommon *backend,
82878dac 2087 bool *be_opened,
d0d7708b 2088 Error **errp)
6972f935
BS
2089{
2090 CharDriverState *chr;
6972f935 2091
b68e956a 2092 chr = qemu_chr_alloc(driver, backend, errp);
d0d7708b
DB
2093 if (!chr) {
2094 return NULL;
2095 }
e0efb993 2096 chr->opaque = (void *)(intptr_t)fd;
82878dac 2097 *be_opened = false;
1f51470d 2098 return chr;
6972f935
BS
2099}
2100#endif
2101
6f97dba0
AL
2102#else /* _WIN32 */
2103
d809ab95
PB
2104#define HAVE_CHARDEV_SERIAL 1
2105
6f97dba0
AL
2106typedef struct {
2107 int max_size;
2108 HANDLE hcom, hrecv, hsend;
9005b2a7 2109 OVERLAPPED orecv;
6f97dba0
AL
2110 BOOL fpipe;
2111 DWORD len;
9005b2a7
PB
2112
2113 /* Protected by the CharDriverState chr_write_lock. */
2114 OVERLAPPED osend;
6f97dba0
AL
2115} WinCharState;
2116
db418a0a
FC
2117typedef struct {
2118 HANDLE hStdIn;
2119 HANDLE hInputReadyEvent;
2120 HANDLE hInputDoneEvent;
2121 HANDLE hInputThread;
2122 uint8_t win_stdio_buf;
2123} WinStdioCharState;
2124
6f97dba0
AL
2125#define NSENDBUF 2048
2126#define NRECVBUF 2048
2127#define MAXCONNECT 1
2128#define NTIMEOUT 5000
2129
2130static int win_chr_poll(void *opaque);
2131static int win_chr_pipe_poll(void *opaque);
2132
72ac8762 2133static void win_chr_free(CharDriverState *chr)
6f97dba0
AL
2134{
2135 WinCharState *s = chr->opaque;
2136
2137 if (s->hsend) {
2138 CloseHandle(s->hsend);
2139 s->hsend = NULL;
2140 }
2141 if (s->hrecv) {
2142 CloseHandle(s->hrecv);
2143 s->hrecv = NULL;
2144 }
2145 if (s->hcom) {
2146 CloseHandle(s->hcom);
2147 s->hcom = NULL;
2148 }
2149 if (s->fpipe)
2150 qemu_del_polling_cb(win_chr_pipe_poll, chr);
2151 else
2152 qemu_del_polling_cb(win_chr_poll, chr);
793cbfb5 2153
a425d23f 2154 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
6f97dba0
AL
2155}
2156
6511d396 2157static int win_chr_init(CharDriverState *chr, const char *filename, Error **errp)
6f97dba0
AL
2158{
2159 WinCharState *s = chr->opaque;
2160 COMMCONFIG comcfg;
2161 COMMTIMEOUTS cto = { 0, 0, 0, 0, 0};
2162 COMSTAT comstat;
2163 DWORD size;
2164 DWORD err;
2165
2166 s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
2167 if (!s->hsend) {
6511d396 2168 error_setg(errp, "Failed CreateEvent");
6f97dba0
AL
2169 goto fail;
2170 }
2171 s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
2172 if (!s->hrecv) {
6511d396 2173 error_setg(errp, "Failed CreateEvent");
6f97dba0
AL
2174 goto fail;
2175 }
2176
2177 s->hcom = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL,
2178 OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
2179 if (s->hcom == INVALID_HANDLE_VALUE) {
6511d396 2180 error_setg(errp, "Failed CreateFile (%lu)", GetLastError());
6f97dba0
AL
2181 s->hcom = NULL;
2182 goto fail;
2183 }
2184
2185 if (!SetupComm(s->hcom, NRECVBUF, NSENDBUF)) {
6511d396 2186 error_setg(errp, "Failed SetupComm");
6f97dba0
AL
2187 goto fail;
2188 }
2189
2190 ZeroMemory(&comcfg, sizeof(COMMCONFIG));
2191 size = sizeof(COMMCONFIG);
2192 GetDefaultCommConfig(filename, &comcfg, &size);
2193 comcfg.dcb.DCBlength = sizeof(DCB);
2194 CommConfigDialog(filename, NULL, &comcfg);
2195
2196 if (!SetCommState(s->hcom, &comcfg.dcb)) {
6511d396 2197 error_setg(errp, "Failed SetCommState");
6f97dba0
AL
2198 goto fail;
2199 }
2200
2201 if (!SetCommMask(s->hcom, EV_ERR)) {
6511d396 2202 error_setg(errp, "Failed SetCommMask");
6f97dba0
AL
2203 goto fail;
2204 }
2205
2206 cto.ReadIntervalTimeout = MAXDWORD;
2207 if (!SetCommTimeouts(s->hcom, &cto)) {
6511d396 2208 error_setg(errp, "Failed SetCommTimeouts");
6f97dba0
AL
2209 goto fail;
2210 }
2211
2212 if (!ClearCommError(s->hcom, &err, &comstat)) {
6511d396 2213 error_setg(errp, "Failed ClearCommError");
6f97dba0
AL
2214 goto fail;
2215 }
2216 qemu_add_polling_cb(win_chr_poll, chr);
2217 return 0;
2218
2219 fail:
72ac8762 2220 win_chr_free(chr);
6f97dba0
AL
2221 return -1;
2222}
2223
9005b2a7 2224/* Called with chr_write_lock held. */
6f97dba0
AL
2225static int win_chr_write(CharDriverState *chr, const uint8_t *buf, int len1)
2226{
2227 WinCharState *s = chr->opaque;
2228 DWORD len, ret, size, err;
2229
2230 len = len1;
2231 ZeroMemory(&s->osend, sizeof(s->osend));
2232 s->osend.hEvent = s->hsend;
2233 while (len > 0) {
2234 if (s->hsend)
2235 ret = WriteFile(s->hcom, buf, len, &size, &s->osend);
2236 else
2237 ret = WriteFile(s->hcom, buf, len, &size, NULL);
2238 if (!ret) {
2239 err = GetLastError();
2240 if (err == ERROR_IO_PENDING) {
2241 ret = GetOverlappedResult(s->hcom, &s->osend, &size, TRUE);
2242 if (ret) {
2243 buf += size;
2244 len -= size;
2245 } else {
2246 break;
2247 }
2248 } else {
2249 break;
2250 }
2251 } else {
2252 buf += size;
2253 len -= size;
2254 }
2255 }
2256 return len1 - len;
2257}
2258
2259static int win_chr_read_poll(CharDriverState *chr)
2260{
2261 WinCharState *s = chr->opaque;
2262
909cda12 2263 s->max_size = qemu_chr_be_can_write(chr);
6f97dba0
AL
2264 return s->max_size;
2265}
2266
2267static void win_chr_readfile(CharDriverState *chr)
2268{
2269 WinCharState *s = chr->opaque;
2270 int ret, err;
9bd7854e 2271 uint8_t buf[READ_BUF_LEN];
6f97dba0
AL
2272 DWORD size;
2273
2274 ZeroMemory(&s->orecv, sizeof(s->orecv));
2275 s->orecv.hEvent = s->hrecv;
2276 ret = ReadFile(s->hcom, buf, s->len, &size, &s->orecv);
2277 if (!ret) {
2278 err = GetLastError();
2279 if (err == ERROR_IO_PENDING) {
2280 ret = GetOverlappedResult(s->hcom, &s->orecv, &size, TRUE);
2281 }
2282 }
2283
2284 if (size > 0) {
fa5efccb 2285 qemu_chr_be_write(chr, buf, size);
6f97dba0
AL
2286 }
2287}
2288
2289static void win_chr_read(CharDriverState *chr)
2290{
2291 WinCharState *s = chr->opaque;
2292
2293 if (s->len > s->max_size)
2294 s->len = s->max_size;
2295 if (s->len == 0)
2296 return;
2297
2298 win_chr_readfile(chr);
2299}
2300
2301static int win_chr_poll(void *opaque)
2302{
2303 CharDriverState *chr = opaque;
2304 WinCharState *s = chr->opaque;
2305 COMSTAT status;
2306 DWORD comerr;
2307
2308 ClearCommError(s->hcom, &comerr, &status);
2309 if (status.cbInQue > 0) {
2310 s->len = status.cbInQue;
2311 win_chr_read_poll(chr);
2312 win_chr_read(chr);
2313 return 1;
2314 }
2315 return 0;
2316}
2317
6f97dba0
AL
2318static int win_chr_pipe_poll(void *opaque)
2319{
2320 CharDriverState *chr = opaque;
2321 WinCharState *s = chr->opaque;
2322 DWORD size;
2323
2324 PeekNamedPipe(s->hcom, NULL, 0, NULL, &size, NULL);
2325 if (size > 0) {
2326 s->len = size;
2327 win_chr_read_poll(chr);
2328 win_chr_read(chr);
2329 return 1;
2330 }
2331 return 0;
2332}
2333
20cbe7a2
PB
2334static int win_chr_pipe_init(CharDriverState *chr, const char *filename,
2335 Error **errp)
6f97dba0
AL
2336{
2337 WinCharState *s = chr->opaque;
2338 OVERLAPPED ov;
2339 int ret;
2340 DWORD size;
0ff0fad2 2341 char *openname;
6f97dba0
AL
2342
2343 s->fpipe = TRUE;
2344
2345 s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
2346 if (!s->hsend) {
20cbe7a2 2347 error_setg(errp, "Failed CreateEvent");
6f97dba0
AL
2348 goto fail;
2349 }
2350 s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
2351 if (!s->hrecv) {
20cbe7a2 2352 error_setg(errp, "Failed CreateEvent");
6f97dba0
AL
2353 goto fail;
2354 }
2355
0ff0fad2 2356 openname = g_strdup_printf("\\\\.\\pipe\\%s", filename);
6f97dba0
AL
2357 s->hcom = CreateNamedPipe(openname, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
2358 PIPE_TYPE_BYTE | PIPE_READMODE_BYTE |
2359 PIPE_WAIT,
2360 MAXCONNECT, NSENDBUF, NRECVBUF, NTIMEOUT, NULL);
0ff0fad2 2361 g_free(openname);
6f97dba0 2362 if (s->hcom == INVALID_HANDLE_VALUE) {
20cbe7a2 2363 error_setg(errp, "Failed CreateNamedPipe (%lu)", GetLastError());
6f97dba0
AL
2364 s->hcom = NULL;
2365 goto fail;
2366 }
2367
2368 ZeroMemory(&ov, sizeof(ov));
2369 ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
2370 ret = ConnectNamedPipe(s->hcom, &ov);
2371 if (ret) {
20cbe7a2 2372 error_setg(errp, "Failed ConnectNamedPipe");
6f97dba0
AL
2373 goto fail;
2374 }
2375
2376 ret = GetOverlappedResult(s->hcom, &ov, &size, TRUE);
2377 if (!ret) {
20cbe7a2 2378 error_setg(errp, "Failed GetOverlappedResult");
6f97dba0
AL
2379 if (ov.hEvent) {
2380 CloseHandle(ov.hEvent);
2381 ov.hEvent = NULL;
2382 }
2383 goto fail;
2384 }
2385
2386 if (ov.hEvent) {
2387 CloseHandle(ov.hEvent);
2388 ov.hEvent = NULL;
2389 }
2390 qemu_add_polling_cb(win_chr_pipe_poll, chr);
2391 return 0;
2392
2393 fail:
72ac8762 2394 win_chr_free(chr);
6f97dba0
AL
2395 return -1;
2396}
2397
2398
b68e956a
MAL
2399static CharDriverState *qemu_chr_open_pipe(const CharDriver *driver,
2400 const char *id,
20cbe7a2
PB
2401 ChardevBackend *backend,
2402 ChardevReturn *ret,
82878dac 2403 bool *be_opened,
20cbe7a2 2404 Error **errp)
6f97dba0 2405{
32bafa8f 2406 ChardevHostdev *opts = backend->u.pipe.data;
548cbb36 2407 const char *filename = opts->device;
6f97dba0
AL
2408 CharDriverState *chr;
2409 WinCharState *s;
f194a1ae 2410 ChardevCommon *common = qapi_ChardevHostdev_base(opts);
6f97dba0 2411
b68e956a 2412 chr = qemu_chr_alloc(driver, common, errp);
d0d7708b
DB
2413 if (!chr) {
2414 return NULL;
2415 }
2d528d45 2416 s = g_new0(WinCharState, 1);
6f97dba0 2417 chr->opaque = s;
6f97dba0 2418
20cbe7a2 2419 if (win_chr_pipe_init(chr, filename, errp) < 0) {
2e02e18b 2420 g_free(s);
d0d7708b 2421 qemu_chr_free_common(chr);
1f51470d 2422 return NULL;
6f97dba0 2423 }
1f51470d 2424 return chr;
6f97dba0
AL
2425}
2426
b68e956a
MAL
2427static CharDriverState *qemu_chr_open_win_file(const CharDriver *driver,
2428 HANDLE fd_out,
d0d7708b
DB
2429 ChardevCommon *backend,
2430 Error **errp)
6f97dba0
AL
2431{
2432 CharDriverState *chr;
2433 WinCharState *s;
2434
b68e956a 2435 chr = qemu_chr_alloc(driver, backend, errp);
d0d7708b
DB
2436 if (!chr) {
2437 return NULL;
2438 }
2d528d45 2439 s = g_new0(WinCharState, 1);
6f97dba0
AL
2440 s->hcom = fd_out;
2441 chr->opaque = s;
1f51470d 2442 return chr;
6f97dba0
AL
2443}
2444
b68e956a
MAL
2445static CharDriverState *qemu_chr_open_win_con(const CharDriver *driver,
2446 const char *id,
122e5ed4
PB
2447 ChardevBackend *backend,
2448 ChardevReturn *ret,
82878dac 2449 bool *be_opened,
122e5ed4 2450 Error **errp)
6f97dba0 2451{
32bafa8f 2452 ChardevCommon *common = backend->u.console.data;
b68e956a
MAL
2453 return qemu_chr_open_win_file(driver,
2454 GetStdHandle(STD_OUTPUT_HANDLE),
d0d7708b 2455 common, errp);
6f97dba0
AL
2456}
2457
b68e956a
MAL
2458static const CharDriver console_driver = {
2459 .kind = CHARDEV_BACKEND_KIND_CONSOLE,
2460 .create = qemu_chr_open_win_con,
2461 .chr_write = win_chr_write,
2462};
2463
db418a0a
FC
2464static int win_stdio_write(CharDriverState *chr, const uint8_t *buf, int len)
2465{
2466 HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
2467 DWORD dwSize;
2468 int len1;
2469
2470 len1 = len;
2471
2472 while (len1 > 0) {
2473 if (!WriteFile(hStdOut, buf, len1, &dwSize, NULL)) {
2474 break;
2475 }
2476 buf += dwSize;
2477 len1 -= dwSize;
2478 }
2479
2480 return len - len1;
2481}
2482
2483static void win_stdio_wait_func(void *opaque)
2484{
2485 CharDriverState *chr = opaque;
2486 WinStdioCharState *stdio = chr->opaque;
2487 INPUT_RECORD buf[4];
2488 int ret;
2489 DWORD dwSize;
2490 int i;
2491
dff7424d 2492 ret = ReadConsoleInput(stdio->hStdIn, buf, ARRAY_SIZE(buf), &dwSize);
db418a0a
FC
2493
2494 if (!ret) {
2495 /* Avoid error storm */
2496 qemu_del_wait_object(stdio->hStdIn, NULL, NULL);
2497 return;
2498 }
2499
2500 for (i = 0; i < dwSize; i++) {
2501 KEY_EVENT_RECORD *kev = &buf[i].Event.KeyEvent;
2502
2503 if (buf[i].EventType == KEY_EVENT && kev->bKeyDown) {
2504 int j;
2505 if (kev->uChar.AsciiChar != 0) {
2506 for (j = 0; j < kev->wRepeatCount; j++) {
2507 if (qemu_chr_be_can_write(chr)) {
2508 uint8_t c = kev->uChar.AsciiChar;
2509 qemu_chr_be_write(chr, &c, 1);
2510 }
2511 }
2512 }
2513 }
2514 }
2515}
2516
2517static DWORD WINAPI win_stdio_thread(LPVOID param)
2518{
2519 CharDriverState *chr = param;
2520 WinStdioCharState *stdio = chr->opaque;
2521 int ret;
2522 DWORD dwSize;
2523
2524 while (1) {
2525
2526 /* Wait for one byte */
2527 ret = ReadFile(stdio->hStdIn, &stdio->win_stdio_buf, 1, &dwSize, NULL);
2528
2529 /* Exit in case of error, continue if nothing read */
2530 if (!ret) {
2531 break;
2532 }
2533 if (!dwSize) {
2534 continue;
2535 }
2536
2537 /* Some terminal emulator returns \r\n for Enter, just pass \n */
2538 if (stdio->win_stdio_buf == '\r') {
2539 continue;
2540 }
2541
2542 /* Signal the main thread and wait until the byte was eaten */
2543 if (!SetEvent(stdio->hInputReadyEvent)) {
2544 break;
2545 }
2546 if (WaitForSingleObject(stdio->hInputDoneEvent, INFINITE)
2547 != WAIT_OBJECT_0) {
2548 break;
2549 }
2550 }
2551
2552 qemu_del_wait_object(stdio->hInputReadyEvent, NULL, NULL);
2553 return 0;
2554}
2555
2556static void win_stdio_thread_wait_func(void *opaque)
2557{
2558 CharDriverState *chr = opaque;
2559 WinStdioCharState *stdio = chr->opaque;
2560
2561 if (qemu_chr_be_can_write(chr)) {
2562 qemu_chr_be_write(chr, &stdio->win_stdio_buf, 1);
2563 }
2564
2565 SetEvent(stdio->hInputDoneEvent);
2566}
2567
2568static void qemu_chr_set_echo_win_stdio(CharDriverState *chr, bool echo)
2569{
2570 WinStdioCharState *stdio = chr->opaque;
2571 DWORD dwMode = 0;
2572
2573 GetConsoleMode(stdio->hStdIn, &dwMode);
2574
2575 if (echo) {
2576 SetConsoleMode(stdio->hStdIn, dwMode | ENABLE_ECHO_INPUT);
2577 } else {
2578 SetConsoleMode(stdio->hStdIn, dwMode & ~ENABLE_ECHO_INPUT);
2579 }
2580}
2581
72ac8762 2582static void win_stdio_free(CharDriverState *chr)
db418a0a
FC
2583{
2584 WinStdioCharState *stdio = chr->opaque;
2585
2586 if (stdio->hInputReadyEvent != INVALID_HANDLE_VALUE) {
2587 CloseHandle(stdio->hInputReadyEvent);
2588 }
2589 if (stdio->hInputDoneEvent != INVALID_HANDLE_VALUE) {
2590 CloseHandle(stdio->hInputDoneEvent);
2591 }
2592 if (stdio->hInputThread != INVALID_HANDLE_VALUE) {
2593 TerminateThread(stdio->hInputThread, 0);
2594 }
2595
2596 g_free(chr->opaque);
db418a0a
FC
2597}
2598
b68e956a
MAL
2599static CharDriverState *qemu_chr_open_stdio(const CharDriver *driver,
2600 const char *id,
8c84b25d
PB
2601 ChardevBackend *backend,
2602 ChardevReturn *ret,
82878dac 2603 bool *be_opened,
8c84b25d 2604 Error **errp)
db418a0a
FC
2605{
2606 CharDriverState *chr;
2607 WinStdioCharState *stdio;
2608 DWORD dwMode;
2609 int is_console = 0;
32bafa8f 2610 ChardevCommon *common = qapi_ChardevStdio_base(backend->u.stdio.data);
db418a0a 2611
b68e956a 2612 chr = qemu_chr_alloc(driver, common, errp);
d0d7708b
DB
2613 if (!chr) {
2614 return NULL;
2615 }
2d528d45 2616 stdio = g_new0(WinStdioCharState, 1);
db418a0a
FC
2617
2618 stdio->hStdIn = GetStdHandle(STD_INPUT_HANDLE);
2619 if (stdio->hStdIn == INVALID_HANDLE_VALUE) {
8c84b25d
PB
2620 error_setg(errp, "cannot open stdio: invalid handle");
2621 return NULL;
db418a0a
FC
2622 }
2623
2624 is_console = GetConsoleMode(stdio->hStdIn, &dwMode) != 0;
2625
2626 chr->opaque = stdio;
db418a0a 2627
ed7a1540
AL
2628 if (is_console) {
2629 if (qemu_add_wait_object(stdio->hStdIn,
2630 win_stdio_wait_func, chr)) {
8c84b25d
PB
2631 error_setg(errp, "qemu_add_wait_object: failed");
2632 goto err1;
ed7a1540
AL
2633 }
2634 } else {
2635 DWORD dwId;
2636
2637 stdio->hInputReadyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
2638 stdio->hInputDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
8c84b25d 2639 if (stdio->hInputReadyEvent == INVALID_HANDLE_VALUE
ed7a1540 2640 || stdio->hInputDoneEvent == INVALID_HANDLE_VALUE) {
8c84b25d
PB
2641 error_setg(errp, "cannot create event");
2642 goto err2;
ed7a1540
AL
2643 }
2644 if (qemu_add_wait_object(stdio->hInputReadyEvent,
2645 win_stdio_thread_wait_func, chr)) {
8c84b25d
PB
2646 error_setg(errp, "qemu_add_wait_object: failed");
2647 goto err2;
2648 }
2649 stdio->hInputThread = CreateThread(NULL, 0, win_stdio_thread,
2650 chr, 0, &dwId);
2651
2652 if (stdio->hInputThread == INVALID_HANDLE_VALUE) {
2653 error_setg(errp, "cannot create stdio thread");
2654 goto err3;
db418a0a
FC
2655 }
2656 }
2657
2658 dwMode |= ENABLE_LINE_INPUT;
2659
ed7a1540 2660 if (is_console) {
db418a0a
FC
2661 /* set the terminal in raw mode */
2662 /* ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS */
2663 dwMode |= ENABLE_PROCESSED_INPUT;
2664 }
2665
2666 SetConsoleMode(stdio->hStdIn, dwMode);
2667
5345fdb4 2668 qemu_chr_set_echo_win_stdio(chr, false);
db418a0a 2669
1f51470d 2670 return chr;
8c84b25d
PB
2671
2672err3:
2673 qemu_del_wait_object(stdio->hInputReadyEvent, NULL, NULL);
2674err2:
2675 CloseHandle(stdio->hInputReadyEvent);
2676 CloseHandle(stdio->hInputDoneEvent);
2677err1:
2678 qemu_del_wait_object(stdio->hStdIn, NULL, NULL);
2679 return NULL;
db418a0a 2680}
6f97dba0
AL
2681#endif /* !_WIN32 */
2682
2683/***********************************************************/
2684/* UDP Net console */
2685
2686typedef struct {
9894dc0c 2687 QIOChannel *ioc;
9bd7854e 2688 uint8_t buf[READ_BUF_LEN];
6f97dba0
AL
2689 int bufcnt;
2690 int bufptr;
2691 int max_size;
2692} NetCharDriver;
2693
9005b2a7 2694/* Called with chr_write_lock held. */
6f97dba0
AL
2695static int udp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
2696{
2697 NetCharDriver *s = chr->opaque;
76a9644b 2698
9894dc0c
DB
2699 return qio_channel_write(
2700 s->ioc, (const char *)buf, len, NULL);
6f97dba0
AL
2701}
2702
2703static int udp_chr_read_poll(void *opaque)
2704{
2705 CharDriverState *chr = opaque;
2706 NetCharDriver *s = chr->opaque;
2707
909cda12 2708 s->max_size = qemu_chr_be_can_write(chr);
6f97dba0
AL
2709
2710 /* If there were any stray characters in the queue process them
2711 * first
2712 */
2713 while (s->max_size > 0 && s->bufptr < s->bufcnt) {
fa5efccb 2714 qemu_chr_be_write(chr, &s->buf[s->bufptr], 1);
6f97dba0 2715 s->bufptr++;
909cda12 2716 s->max_size = qemu_chr_be_can_write(chr);
6f97dba0
AL
2717 }
2718 return s->max_size;
2719}
2720
9894dc0c 2721static gboolean udp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
6f97dba0
AL
2722{
2723 CharDriverState *chr = opaque;
2724 NetCharDriver *s = chr->opaque;
9894dc0c 2725 ssize_t ret;
6f97dba0 2726
cdbf6e16
PB
2727 if (s->max_size == 0) {
2728 return TRUE;
2729 }
9894dc0c
DB
2730 ret = qio_channel_read(
2731 s->ioc, (char *)s->buf, sizeof(s->buf), NULL);
2732 if (ret <= 0) {
26da70c7 2733 remove_fd_in_watch(chr);
76a9644b
AL
2734 return FALSE;
2735 }
9894dc0c 2736 s->bufcnt = ret;
6f97dba0
AL
2737
2738 s->bufptr = 0;
2739 while (s->max_size > 0 && s->bufptr < s->bufcnt) {
fa5efccb 2740 qemu_chr_be_write(chr, &s->buf[s->bufptr], 1);
6f97dba0 2741 s->bufptr++;
909cda12 2742 s->max_size = qemu_chr_be_can_write(chr);
6f97dba0 2743 }
76a9644b
AL
2744
2745 return TRUE;
6f97dba0
AL
2746}
2747
e92aa36a 2748static void udp_chr_update_read_handler(CharDriverState *chr,
a4afa548 2749 GMainContext *context)
6f97dba0
AL
2750{
2751 NetCharDriver *s = chr->opaque;
2752
26da70c7 2753 remove_fd_in_watch(chr);
9894dc0c 2754 if (s->ioc) {
e93a68e1 2755 chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
9894dc0c 2756 udp_chr_read_poll,
e92aa36a
ZC
2757 udp_chr_read, chr,
2758 context);
6f97dba0
AL
2759 }
2760}
2761
72ac8762 2762static void udp_chr_free(CharDriverState *chr)
819f56b7
AL
2763{
2764 NetCharDriver *s = chr->opaque;
26da70c7
AS
2765
2766 remove_fd_in_watch(chr);
9894dc0c
DB
2767 if (s->ioc) {
2768 object_unref(OBJECT(s->ioc));
819f56b7 2769 }
7267c094 2770 g_free(s);
a425d23f 2771 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
819f56b7
AL
2772}
2773
6f97dba0
AL
2774/***********************************************************/
2775/* TCP Net console */
2776
2777typedef struct {
a8fb5427
DB
2778 QIOChannel *ioc; /* Client I/O channel */
2779 QIOChannelSocket *sioc; /* Client master channel */
9894dc0c 2780 QIOChannelSocket *listen_ioc;
7ba9addc 2781 guint listen_tag;
a8fb5427 2782 QCryptoTLSCreds *tls_creds;
6f97dba0
AL
2783 int connected;
2784 int max_size;
2785 int do_telnetopt;
2786 int do_nodelay;
2787 int is_unix;
c76bf6bb 2788 int *read_msgfds;
9894dc0c 2789 size_t read_msgfds_num;
d39aac7a 2790 int *write_msgfds;
9894dc0c 2791 size_t write_msgfds_num;
cfb429cb
CM
2792
2793 SocketAddress *addr;
2794 bool is_listen;
2795 bool is_telnet;
5dd1f02b
CM
2796
2797 guint reconnect_timer;
2798 int64_t reconnect_time;
5008e5b7 2799 bool connect_err_reported;
6f97dba0
AL
2800} TCPCharDriver;
2801
5dd1f02b
CM
2802static gboolean socket_reconnect_timeout(gpointer opaque);
2803
2804static void qemu_chr_socket_restart_timer(CharDriverState *chr)
2805{
2806 TCPCharDriver *s = chr->opaque;
e93a68e1 2807 char *name;
5dd1f02b
CM
2808 assert(s->connected == 0);
2809 s->reconnect_timer = g_timeout_add_seconds(s->reconnect_time,
2810 socket_reconnect_timeout, chr);
e93a68e1
DB
2811 name = g_strdup_printf("chardev-socket-reconnect-%s", chr->label);
2812 g_source_set_name_by_id(s->reconnect_timer, name);
2813 g_free(name);
5dd1f02b
CM
2814}
2815
5008e5b7
CM
2816static void check_report_connect_error(CharDriverState *chr,
2817 Error *err)
2818{
2819 TCPCharDriver *s = chr->opaque;
2820
2821 if (!s->connect_err_reported) {
2822 error_report("Unable to connect character device %s: %s",
2823 chr->label, error_get_pretty(err));
2824 s->connect_err_reported = true;
2825 }
2826 qemu_chr_socket_restart_timer(chr);
2827}
2828
9894dc0c
DB
2829static gboolean tcp_chr_accept(QIOChannel *chan,
2830 GIOCondition cond,
2831 void *opaque);
d39aac7a 2832
9005b2a7 2833/* Called with chr_write_lock held. */
6f97dba0
AL
2834static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
2835{
2836 TCPCharDriver *s = chr->opaque;
2837 if (s->connected) {
9894dc0c
DB
2838 int ret = io_channel_send_full(s->ioc, buf, len,
2839 s->write_msgfds,
2840 s->write_msgfds_num);
2841
2842 /* free the written msgfds, no matter what */
2843 if (s->write_msgfds_num) {
2844 g_free(s->write_msgfds);
2845 s->write_msgfds = 0;
2846 s->write_msgfds_num = 0;
d39aac7a 2847 }
9894dc0c
DB
2848
2849 return ret;
455aa1e0 2850 } else {
6db0fdce 2851 /* XXX: indicate an error ? */
455aa1e0 2852 return len;
6f97dba0
AL
2853 }
2854}
2855
2856static int tcp_chr_read_poll(void *opaque)
2857{
2858 CharDriverState *chr = opaque;
2859 TCPCharDriver *s = chr->opaque;
2860 if (!s->connected)
2861 return 0;
909cda12 2862 s->max_size = qemu_chr_be_can_write(chr);
6f97dba0
AL
2863 return s->max_size;
2864}
2865
2866#define IAC 255
2867#define IAC_BREAK 243
2868static void tcp_chr_process_IAC_bytes(CharDriverState *chr,
2869 TCPCharDriver *s,
2870 uint8_t *buf, int *size)
2871{
2872 /* Handle any telnet client's basic IAC options to satisfy char by
2873 * char mode with no echo. All IAC options will be removed from
2874 * the buf and the do_telnetopt variable will be used to track the
2875 * state of the width of the IAC information.
2876 *
2877 * IAC commands come in sets of 3 bytes with the exception of the
2878 * "IAC BREAK" command and the double IAC.
2879 */
2880
2881 int i;
2882 int j = 0;
2883
2884 for (i = 0; i < *size; i++) {
2885 if (s->do_telnetopt > 1) {
2886 if ((unsigned char)buf[i] == IAC && s->do_telnetopt == 2) {
2887 /* Double IAC means send an IAC */
2888 if (j != i)
2889 buf[j] = buf[i];
2890 j++;
2891 s->do_telnetopt = 1;
2892 } else {
2893 if ((unsigned char)buf[i] == IAC_BREAK && s->do_telnetopt == 2) {
2894 /* Handle IAC break commands by sending a serial break */
a425d23f 2895 qemu_chr_be_event(chr, CHR_EVENT_BREAK);
6f97dba0
AL
2896 s->do_telnetopt++;
2897 }
2898 s->do_telnetopt++;
2899 }
2900 if (s->do_telnetopt >= 4) {
2901 s->do_telnetopt = 1;
2902 }
2903 } else {
2904 if ((unsigned char)buf[i] == IAC) {
2905 s->do_telnetopt = 2;
2906 } else {
2907 if (j != i)
2908 buf[j] = buf[i];
2909 j++;
2910 }
2911 }
2912 }
2913 *size = j;
2914}
2915
c76bf6bb 2916static int tcp_get_msgfds(CharDriverState *chr, int *fds, int num)
7d174059
MM
2917{
2918 TCPCharDriver *s = chr->opaque;
c76bf6bb
NN
2919 int to_copy = (s->read_msgfds_num < num) ? s->read_msgfds_num : num;
2920
c4095726
MT
2921 assert(num <= TCP_MAX_FDS);
2922
c76bf6bb 2923 if (to_copy) {
d2fc39b4
SH
2924 int i;
2925
c76bf6bb
NN
2926 memcpy(fds, s->read_msgfds, to_copy * sizeof(int));
2927
d2fc39b4
SH
2928 /* Close unused fds */
2929 for (i = to_copy; i < s->read_msgfds_num; i++) {
2930 close(s->read_msgfds[i]);
2931 }
2932
c76bf6bb
NN
2933 g_free(s->read_msgfds);
2934 s->read_msgfds = 0;
2935 s->read_msgfds_num = 0;
2936 }
2937
2938 return to_copy;
7d174059
MM
2939}
2940
d39aac7a
NN
2941static int tcp_set_msgfds(CharDriverState *chr, int *fds, int num)
2942{
2943 TCPCharDriver *s = chr->opaque;
2944
2945 /* clear old pending fd array */
ef1e1e07 2946 g_free(s->write_msgfds);
869a58af 2947 s->write_msgfds = NULL;
5b498459 2948 s->write_msgfds_num = 0;
d39aac7a 2949
5c7eaabf
MAL
2950 if (!s->connected ||
2951 !qio_channel_has_feature(s->ioc,
2952 QIO_CHANNEL_FEATURE_FD_PASS)) {
2953 return -1;
2954 }
2955
d39aac7a 2956 if (num) {
2d528d45 2957 s->write_msgfds = g_new(int, num);
d39aac7a
NN
2958 memcpy(s->write_msgfds, fds, num * sizeof(int));
2959 }
2960
2961 s->write_msgfds_num = num;
2962
2963 return 0;
2964}
2965
9894dc0c 2966static ssize_t tcp_chr_recv(CharDriverState *chr, char *buf, size_t len)
7d174059
MM
2967{
2968 TCPCharDriver *s = chr->opaque;
9894dc0c
DB
2969 struct iovec iov = { .iov_base = buf, .iov_len = len };
2970 int ret;
2971 size_t i;
2972 int *msgfds = NULL;
2973 size_t msgfds_num = 0;
2974
2975 if (qio_channel_has_feature(s->ioc, QIO_CHANNEL_FEATURE_FD_PASS)) {
2976 ret = qio_channel_readv_full(s->ioc, &iov, 1,
2977 &msgfds, &msgfds_num,
2978 NULL);
2979 } else {
2980 ret = qio_channel_readv_full(s->ioc, &iov, 1,
2981 NULL, NULL,
2982 NULL);
2983 }
7d174059 2984
b6572b4f
MAL
2985 if (ret == QIO_CHANNEL_ERR_BLOCK) {
2986 errno = EAGAIN;
2987 ret = -1;
2988 } else if (ret == -1) {
2989 errno = EIO;
2990 }
2991
9894dc0c 2992 if (msgfds_num) {
c76bf6bb
NN
2993 /* close and clean read_msgfds */
2994 for (i = 0; i < s->read_msgfds_num; i++) {
2995 close(s->read_msgfds[i]);
2996 }
9b938c72 2997
c76bf6bb
NN
2998 if (s->read_msgfds_num) {
2999 g_free(s->read_msgfds);
3000 }
3001
9894dc0c
DB
3002 s->read_msgfds = msgfds;
3003 s->read_msgfds_num = msgfds_num;
7d174059 3004 }
7d174059 3005
9894dc0c
DB
3006 for (i = 0; i < s->read_msgfds_num; i++) {
3007 int fd = s->read_msgfds[i];
3008 if (fd < 0) {
3009 continue;
3010 }
9977c894 3011
9894dc0c
DB
3012 /* O_NONBLOCK is preserved across SCM_RIGHTS so reset it */
3013 qemu_set_block(fd);
7d174059 3014
9894dc0c
DB
3015#ifndef MSG_CMSG_CLOEXEC
3016 qemu_set_cloexec(fd);
06138651 3017#endif
06138651 3018 }
9977c894 3019
7d174059 3020 return ret;
9977c894 3021}
9977c894 3022
d3cc5bc4
AS
3023static GSource *tcp_chr_add_watch(CharDriverState *chr, GIOCondition cond)
3024{
3025 TCPCharDriver *s = chr->opaque;
9894dc0c 3026 return qio_channel_create_watch(s->ioc, cond);
d3cc5bc4
AS
3027}
3028
5b498459 3029static void tcp_chr_free_connection(CharDriverState *chr)
7b0bfdf5
NN
3030{
3031 TCPCharDriver *s = chr->opaque;
5b498459 3032 int i;
7b0bfdf5 3033
342f7a9d
MAL
3034 if (!s->connected) {
3035 return;
3036 }
3037
5b498459
MAL
3038 if (s->read_msgfds_num) {
3039 for (i = 0; i < s->read_msgfds_num; i++) {
3040 close(s->read_msgfds[i]);
3041 }
3042 g_free(s->read_msgfds);
3043 s->read_msgfds = NULL;
3044 s->read_msgfds_num = 0;
7b0bfdf5 3045 }
5b498459 3046
6167ebbd 3047 tcp_set_msgfds(chr, NULL, 0);
7b0bfdf5 3048 remove_fd_in_watch(chr);
a8fb5427
DB
3049 object_unref(OBJECT(s->sioc));
3050 s->sioc = NULL;
9894dc0c
DB
3051 object_unref(OBJECT(s->ioc));
3052 s->ioc = NULL;
0ff0fad2 3053 g_free(chr->filename);
5b498459
MAL
3054 chr->filename = NULL;
3055 s->connected = 0;
3056}
3057
3058static void tcp_chr_disconnect(CharDriverState *chr)
3059{
3060 TCPCharDriver *s = chr->opaque;
3061
3062 if (!s->connected) {
3063 return;
3064 }
3065
3066 tcp_chr_free_connection(chr);
3067
3068 if (s->listen_ioc) {
3069 s->listen_tag = qio_channel_add_watch(
3070 QIO_CHANNEL(s->listen_ioc), G_IO_IN, tcp_chr_accept, chr, NULL);
3071 }
0ff0fad2
DB
3072 chr->filename = SocketAddress_to_str("disconnected:", s->addr,
3073 s->is_listen, s->is_telnet);
7b0bfdf5 3074 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
5dd1f02b
CM
3075 if (s->reconnect_time) {
3076 qemu_chr_socket_restart_timer(chr);
3077 }
7b0bfdf5
NN
3078}
3079
9894dc0c 3080static gboolean tcp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
6f97dba0
AL
3081{
3082 CharDriverState *chr = opaque;
3083 TCPCharDriver *s = chr->opaque;
9bd7854e 3084 uint8_t buf[READ_BUF_LEN];
6f97dba0
AL
3085 int len, size;
3086
2ea5a7af 3087 if (!s->connected || s->max_size <= 0) {
cdbf6e16 3088 return TRUE;
2ea5a7af 3089 }
6f97dba0
AL
3090 len = sizeof(buf);
3091 if (len > s->max_size)
3092 len = s->max_size;
9977c894 3093 size = tcp_chr_recv(chr, (void *)buf, len);
9894dc0c 3094 if (size == 0 || size == -1) {
6f97dba0 3095 /* connection closed */
7b0bfdf5 3096 tcp_chr_disconnect(chr);
6f97dba0
AL
3097 } else if (size > 0) {
3098 if (s->do_telnetopt)
3099 tcp_chr_process_IAC_bytes(chr, s, buf, &size);
3100 if (size > 0)
fa5efccb 3101 qemu_chr_be_write(chr, buf, size);
6f97dba0 3102 }
2ea5a7af
AL
3103
3104 return TRUE;
6f97dba0
AL
3105}
3106
7b0bfdf5
NN
3107static int tcp_chr_sync_read(CharDriverState *chr, const uint8_t *buf, int len)
3108{
3109 TCPCharDriver *s = chr->opaque;
3110 int size;
3111
3112 if (!s->connected) {
3113 return 0;
3114 }
3115
3116 size = tcp_chr_recv(chr, (void *) buf, len);
3117 if (size == 0) {
3118 /* connection closed */
3119 tcp_chr_disconnect(chr);
3120 }
3121
3122 return size;
3123}
3124
6f97dba0
AL
3125static void tcp_chr_connect(void *opaque)
3126{
3127 CharDriverState *chr = opaque;
3128 TCPCharDriver *s = chr->opaque;
16cc4ffe 3129
0ff0fad2 3130 g_free(chr->filename);
a8fb5427
DB
3131 chr->filename = sockaddr_to_str(
3132 &s->sioc->localAddr, s->sioc->localAddrLen,
3133 &s->sioc->remoteAddr, s->sioc->remoteAddrLen,
3134 s->is_listen, s->is_telnet);
6f97dba0
AL
3135
3136 s->connected = 1;
9894dc0c 3137 if (s->ioc) {
e93a68e1 3138 chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
9894dc0c 3139 tcp_chr_read_poll,
e92aa36a
ZC
3140 tcp_chr_read,
3141 chr, NULL);
bbdd2ad0 3142 }
fee204fd 3143 qemu_chr_be_generic_open(chr);
6f97dba0
AL
3144}
3145
e92aa36a 3146static void tcp_chr_update_read_handler(CharDriverState *chr,
a4afa548 3147 GMainContext *context)
ac1b84dd
GH
3148{
3149 TCPCharDriver *s = chr->opaque;
3150
1e94f23d
DB
3151 if (!s->connected) {
3152 return;
3153 }
3154
ac1b84dd 3155 remove_fd_in_watch(chr);
9894dc0c 3156 if (s->ioc) {
e93a68e1 3157 chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
9894dc0c 3158 tcp_chr_read_poll,
e92aa36a
ZC
3159 tcp_chr_read, chr,
3160 context);
ac1b84dd
GH
3161 }
3162}
3163
f2001a7e
DB
3164typedef struct {
3165 CharDriverState *chr;
3166 char buf[12];
3167 size_t buflen;
3168} TCPCharDriverTelnetInit;
3169
3170static gboolean tcp_chr_telnet_init_io(QIOChannel *ioc,
3171 GIOCondition cond G_GNUC_UNUSED,
3172 gpointer user_data)
6f97dba0 3173{
f2001a7e
DB
3174 TCPCharDriverTelnetInit *init = user_data;
3175 ssize_t ret;
3176
3177 ret = qio_channel_write(ioc, init->buf, init->buflen, NULL);
3178 if (ret < 0) {
3179 if (ret == QIO_CHANNEL_ERR_BLOCK) {
3180 ret = 0;
3181 } else {
3182 tcp_chr_disconnect(init->chr);
3183 return FALSE;
3184 }
3185 }
3186 init->buflen -= ret;
3187
3188 if (init->buflen == 0) {
3189 tcp_chr_connect(init->chr);
3190 return FALSE;
3191 }
3192
3193 memmove(init->buf, init->buf + ret, init->buflen);
3194
3195 return TRUE;
3196}
3197
3198static void tcp_chr_telnet_init(CharDriverState *chr)
3199{
3200 TCPCharDriver *s = chr->opaque;
3201 TCPCharDriverTelnetInit *init =
3202 g_new0(TCPCharDriverTelnetInit, 1);
3203 size_t n = 0;
3204
3205 init->chr = chr;
3206 init->buflen = 12;
3207
3208#define IACSET(x, a, b, c) \
3209 do { \
3210 x[n++] = a; \
3211 x[n++] = b; \
3212 x[n++] = c; \
3213 } while (0)
3214
3215 /* Prep the telnet negotion to put telnet in binary,
3216 * no echo, single char mode */
3217 IACSET(init->buf, 0xff, 0xfb, 0x01); /* IAC WILL ECHO */
3218 IACSET(init->buf, 0xff, 0xfb, 0x03); /* IAC WILL Suppress go ahead */
3219 IACSET(init->buf, 0xff, 0xfb, 0x00); /* IAC WILL Binary */
3220 IACSET(init->buf, 0xff, 0xfd, 0x00); /* IAC DO Binary */
3221
3222#undef IACSET
3223
3224 qio_channel_add_watch(
3225 s->ioc, G_IO_OUT,
3226 tcp_chr_telnet_init_io,
3227 init, NULL);
6f97dba0
AL
3228}
3229
a8fb5427 3230
60e705c5 3231static void tcp_chr_tls_handshake(QIOTask *task,
a8fb5427
DB
3232 gpointer user_data)
3233{
3234 CharDriverState *chr = user_data;
3235 TCPCharDriver *s = chr->opaque;
3236
60e705c5 3237 if (qio_task_propagate_error(task, NULL)) {
a8fb5427
DB
3238 tcp_chr_disconnect(chr);
3239 } else {
3240 if (s->do_telnetopt) {
3241 tcp_chr_telnet_init(chr);
3242 } else {
3243 tcp_chr_connect(chr);
3244 }
3245 }
3246}
3247
3248
3249static void tcp_chr_tls_init(CharDriverState *chr)
3250{
3251 TCPCharDriver *s = chr->opaque;
3252 QIOChannelTLS *tioc;
3253 Error *err = NULL;
e93a68e1 3254 gchar *name;
a8fb5427
DB
3255
3256 if (s->is_listen) {
3257 tioc = qio_channel_tls_new_server(
3258 s->ioc, s->tls_creds,
3259 NULL, /* XXX Use an ACL */
3260 &err);
3261 } else {
3262 tioc = qio_channel_tls_new_client(
3263 s->ioc, s->tls_creds,
32bafa8f 3264 s->addr->u.inet.data->host,
a8fb5427
DB
3265 &err);
3266 }
3267 if (tioc == NULL) {
3268 error_free(err);
3269 tcp_chr_disconnect(chr);
660a2d83 3270 return;
a8fb5427 3271 }
e93a68e1
DB
3272 name = g_strdup_printf("chardev-tls-%s-%s",
3273 s->is_listen ? "server" : "client",
3274 chr->label);
3275 qio_channel_set_name(QIO_CHANNEL(tioc), name);
3276 g_free(name);
a8fb5427
DB
3277 object_unref(OBJECT(s->ioc));
3278 s->ioc = QIO_CHANNEL(tioc);
3279
3280 qio_channel_tls_handshake(tioc,
3281 tcp_chr_tls_handshake,
3282 chr,
3283 NULL);
3284}
3285
3286
e93a68e1
DB
3287static void tcp_chr_set_client_ioc_name(CharDriverState *chr,
3288 QIOChannelSocket *sioc)
3289{
3290 TCPCharDriver *s = chr->opaque;
3291 char *name;
3292 name = g_strdup_printf("chardev-tcp-%s-%s",
3293 s->is_listen ? "server" : "client",
3294 chr->label);
3295 qio_channel_set_name(QIO_CHANNEL(sioc), name);
3296 g_free(name);
3297
3298}
3299
9894dc0c 3300static int tcp_chr_new_client(CharDriverState *chr, QIOChannelSocket *sioc)
13661089
DB
3301{
3302 TCPCharDriver *s = chr->opaque;
9894dc0c 3303 if (s->ioc != NULL) {
13661089 3304 return -1;
9894dc0c 3305 }
13661089 3306
9894dc0c
DB
3307 s->ioc = QIO_CHANNEL(sioc);
3308 object_ref(OBJECT(sioc));
a8fb5427
DB
3309 s->sioc = sioc;
3310 object_ref(OBJECT(sioc));
9894dc0c 3311
64c800f8
DB
3312 qio_channel_set_blocking(s->ioc, false, NULL);
3313
9894dc0c
DB
3314 if (s->do_nodelay) {
3315 qio_channel_set_delay(s->ioc, false);
3316 }
910b6368
PB
3317 if (s->listen_tag) {
3318 g_source_remove(s->listen_tag);
3319 s->listen_tag = 0;
3320 }
f2001a7e 3321
a8fb5427
DB
3322 if (s->tls_creds) {
3323 tcp_chr_tls_init(chr);
f2001a7e 3324 } else {
a8fb5427
DB
3325 if (s->do_telnetopt) {
3326 tcp_chr_telnet_init(chr);
3327 } else {
3328 tcp_chr_connect(chr);
3329 }
f2001a7e 3330 }
13661089
DB
3331
3332 return 0;
3333}
3334
9894dc0c
DB
3335
3336static int tcp_chr_add_client(CharDriverState *chr, int fd)
3337{
3338 int ret;
3339 QIOChannelSocket *sioc;
3340
3341 sioc = qio_channel_socket_new_fd(fd, NULL);
3342 if (!sioc) {
3343 return -1;
3344 }
e93a68e1 3345 tcp_chr_set_client_ioc_name(chr, sioc);
9894dc0c
DB
3346 ret = tcp_chr_new_client(chr, sioc);
3347 object_unref(OBJECT(sioc));
3348 return ret;
3349}
3350
3351static gboolean tcp_chr_accept(QIOChannel *channel,
3352 GIOCondition cond,
3353 void *opaque)
6f97dba0
AL
3354{
3355 CharDriverState *chr = opaque;
9894dc0c 3356 QIOChannelSocket *sioc;
6f97dba0 3357
9894dc0c
DB
3358 sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(channel),
3359 NULL);
3360 if (!sioc) {
3361 return TRUE;
6f97dba0 3362 }
9894dc0c 3363
9894dc0c
DB
3364 tcp_chr_new_client(chr, sioc);
3365
3366 object_unref(OBJECT(sioc));
2ea5a7af
AL
3367
3368 return TRUE;
6f97dba0
AL
3369}
3370
d7a04fd7
MAL
3371static int tcp_chr_wait_connected(CharDriverState *chr, Error **errp)
3372{
3373 TCPCharDriver *s = chr->opaque;
3374 QIOChannelSocket *sioc;
3375
1dc8a669
MAL
3376 /* It can't wait on s->connected, since it is set asynchronously
3377 * in TLS and telnet cases, only wait for an accepted socket */
3378 while (!s->ioc) {
d7a04fd7
MAL
3379 if (s->is_listen) {
3380 fprintf(stderr, "QEMU waiting for connection on: %s\n",
3381 chr->filename);
3382 qio_channel_set_blocking(QIO_CHANNEL(s->listen_ioc), true, NULL);
3383 tcp_chr_accept(QIO_CHANNEL(s->listen_ioc), G_IO_IN, chr);
3384 qio_channel_set_blocking(QIO_CHANNEL(s->listen_ioc), false, NULL);
3385 } else {
3386 sioc = qio_channel_socket_new();
e93a68e1 3387 tcp_chr_set_client_ioc_name(chr, sioc);
d7a04fd7
MAL
3388 if (qio_channel_socket_connect_sync(sioc, s->addr, errp) < 0) {
3389 object_unref(OBJECT(sioc));
3390 return -1;
3391 }
3392 tcp_chr_new_client(chr, sioc);
3393 object_unref(OBJECT(sioc));
3394 }
3395 }
3396
3397 return 0;
3398}
3399
5345fdb4 3400static int qemu_chr_wait_connected(CharDriverState *chr, Error **errp)
6b6723c3 3401{
b68e956a
MAL
3402 if (chr->driver->chr_wait_connected) {
3403 return chr->driver->chr_wait_connected(chr, errp);
6b6723c3
MAL
3404 }
3405
3406 return 0;
3407}
3408
5345fdb4
MAL
3409int qemu_chr_fe_wait_connected(CharBackend *be, Error **errp)
3410{
fa394ed6
MAL
3411 if (!be->chr) {
3412 error_setg(errp, "missing associated backend");
3413 return -1;
3414 }
3415
5345fdb4
MAL
3416 return qemu_chr_wait_connected(be->chr, errp);
3417}
3418
72ac8762 3419static void tcp_chr_free(CharDriverState *chr)
6f97dba0
AL
3420{
3421 TCPCharDriver *s = chr->opaque;
5b498459
MAL
3422
3423 tcp_chr_free_connection(chr);
cfb429cb 3424
5dd1f02b
CM
3425 if (s->reconnect_timer) {
3426 g_source_remove(s->reconnect_timer);
3427 s->reconnect_timer = 0;
3428 }
cfb429cb 3429 qapi_free_SocketAddress(s->addr);
9894dc0c
DB
3430 if (s->listen_tag) {
3431 g_source_remove(s->listen_tag);
3432 s->listen_tag = 0;
3433 }
3434 if (s->listen_ioc) {
3435 object_unref(OBJECT(s->listen_ioc));
819f56b7 3436 }
a8fb5427
DB
3437 if (s->tls_creds) {
3438 object_unref(OBJECT(s->tls_creds));
3439 }
7267c094 3440 g_free(s);
a425d23f 3441 qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
6f97dba0
AL
3442}
3443
43ded1a0 3444
60e705c5 3445static void qemu_chr_socket_connected(QIOTask *task, void *opaque)
5dd1f02b 3446{
60e705c5 3447 QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task));
5dd1f02b 3448 CharDriverState *chr = opaque;
5008e5b7 3449 TCPCharDriver *s = chr->opaque;
60e705c5 3450 Error *err = NULL;
5dd1f02b 3451
60e705c5 3452 if (qio_task_propagate_error(task, &err)) {
5008e5b7 3453 check_report_connect_error(chr, err);
60e705c5
DB
3454 error_free(err);
3455 goto cleanup;
5dd1f02b
CM
3456 }
3457
5008e5b7 3458 s->connect_err_reported = false;
f50dfe45 3459 tcp_chr_new_client(chr, sioc);
60e705c5
DB
3460
3461 cleanup:
f50dfe45 3462 object_unref(OBJECT(sioc));
5dd1f02b
CM
3463}
3464
f6bd5d6e 3465
51767e7c 3466/*********************************************************/
3949e594 3467/* Ring buffer chardev */
51767e7c
LL
3468
3469typedef struct {
3470 size_t size;
3471 size_t prod;
3472 size_t cons;
3473 uint8_t *cbuf;
3949e594 3474} RingBufCharDriver;
51767e7c 3475
3949e594 3476static size_t ringbuf_count(const CharDriverState *chr)
51767e7c 3477{
3949e594 3478 const RingBufCharDriver *d = chr->opaque;
51767e7c 3479
5c230105 3480 return d->prod - d->cons;
51767e7c
LL
3481}
3482
9005b2a7 3483/* Called with chr_write_lock held. */
3949e594 3484static int ringbuf_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
51767e7c 3485{
3949e594 3486 RingBufCharDriver *d = chr->opaque;
51767e7c
LL
3487 int i;
3488
3489 if (!buf || (len < 0)) {
3490 return -1;
3491 }
3492
3493 for (i = 0; i < len; i++ ) {
5c230105
MA
3494 d->cbuf[d->prod++ & (d->size - 1)] = buf[i];
3495 if (d->prod - d->cons > d->size) {
51767e7c
LL
3496 d->cons = d->prod - d->size;
3497 }
3498 }
3499
5c936a83 3500 return len;
51767e7c
LL
3501}
3502
3949e594 3503static int ringbuf_chr_read(CharDriverState *chr, uint8_t *buf, int len)
51767e7c 3504{
3949e594 3505 RingBufCharDriver *d = chr->opaque;
51767e7c
LL
3506 int i;
3507
9005b2a7 3508 qemu_mutex_lock(&chr->chr_write_lock);
5c230105
MA
3509 for (i = 0; i < len && d->cons != d->prod; i++) {
3510 buf[i] = d->cbuf[d->cons++ & (d->size - 1)];
51767e7c 3511 }
9005b2a7 3512 qemu_mutex_unlock(&chr->chr_write_lock);
51767e7c
LL
3513
3514 return i;
3515}
3516
72ac8762 3517static void ringbuf_chr_free(struct CharDriverState *chr)
51767e7c 3518{
3949e594 3519 RingBufCharDriver *d = chr->opaque;
51767e7c
LL
3520
3521 g_free(d->cbuf);
3522 g_free(d);
3523 chr->opaque = NULL;
3524}
3525
b68e956a
MAL
3526static CharDriverState *qemu_chr_open_ringbuf(const CharDriver *driver,
3527 const char *id,
479f09a1
PB
3528 ChardevBackend *backend,
3529 ChardevReturn *ret,
82878dac 3530 bool *be_opened,
4f57378f 3531 Error **errp)
51767e7c 3532{
32bafa8f 3533 ChardevRingbuf *opts = backend->u.ringbuf.data;
f194a1ae 3534 ChardevCommon *common = qapi_ChardevRingbuf_base(opts);
51767e7c 3535 CharDriverState *chr;
3949e594 3536 RingBufCharDriver *d;
51767e7c 3537
b68e956a 3538 chr = qemu_chr_alloc(driver, common, errp);
d0d7708b
DB
3539 if (!chr) {
3540 return NULL;
3541 }
51767e7c
LL
3542 d = g_malloc(sizeof(*d));
3543
1da48c65 3544 d->size = opts->has_size ? opts->size : 65536;
51767e7c
LL
3545
3546 /* The size must be power of 2 */
3547 if (d->size & (d->size - 1)) {
4f57378f 3548 error_setg(errp, "size of ringbuf chardev must be power of two");
51767e7c
LL
3549 goto fail;
3550 }
3551
3552 d->prod = 0;
3553 d->cons = 0;
3554 d->cbuf = g_malloc0(d->size);
3555
3556 chr->opaque = d;
51767e7c
LL
3557
3558 return chr;
3559
3560fail:
3561 g_free(d);
d0d7708b 3562 qemu_chr_free_common(chr);
51767e7c
LL
3563 return NULL;
3564}
3565
ad5c679c 3566ChardevBackendKind qemu_chr_get_kind(const CharDriverState *chr)
1f590cf9 3567{
ad5c679c 3568 return chr->driver->kind;
1f590cf9
LL
3569}
3570
3949e594 3571void qmp_ringbuf_write(const char *device, const char *data,
82e59a67 3572 bool has_format, enum DataFormat format,
1f590cf9
LL
3573 Error **errp)
3574{
3575 CharDriverState *chr;
c4f331b6 3576 const uint8_t *write_data;
1f590cf9 3577 int ret;
3d1bba20 3578 gsize write_count;
1f590cf9
LL
3579
3580 chr = qemu_chr_find(device);
3581 if (!chr) {
1a69278e 3582 error_setg(errp, "Device '%s' not found", device);
1f590cf9
LL
3583 return;
3584 }
3585
ad5c679c 3586 if (!qemu_chr_is_ringbuf(chr)) {
3949e594 3587 error_setg(errp,"%s is not a ringbuf device", device);
1f590cf9
LL
3588 return;
3589 }
3590
1f590cf9 3591 if (has_format && (format == DATA_FORMAT_BASE64)) {
e9cf2fe0
DB
3592 write_data = qbase64_decode(data, -1,
3593 &write_count,
3594 errp);
3595 if (!write_data) {
3596 return;
3597 }
1f590cf9
LL
3598 } else {
3599 write_data = (uint8_t *)data;
82e59a67 3600 write_count = strlen(data);
1f590cf9
LL
3601 }
3602
3949e594 3603 ret = ringbuf_chr_write(chr, write_data, write_count);
1f590cf9 3604
13289fb5
MA
3605 if (write_data != (uint8_t *)data) {
3606 g_free((void *)write_data);
3607 }
3608
1f590cf9
LL
3609 if (ret < 0) {
3610 error_setg(errp, "Failed to write to device %s", device);
3611 return;
3612 }
3613}
3614
3949e594 3615char *qmp_ringbuf_read(const char *device, int64_t size,
3ab651fc
MA
3616 bool has_format, enum DataFormat format,
3617 Error **errp)
49b6d722
LL
3618{
3619 CharDriverState *chr;
c4f331b6 3620 uint8_t *read_data;
49b6d722 3621 size_t count;
3ab651fc 3622 char *data;
49b6d722
LL
3623
3624 chr = qemu_chr_find(device);
3625 if (!chr) {
1a69278e 3626 error_setg(errp, "Device '%s' not found", device);
49b6d722
LL
3627 return NULL;
3628 }
3629
ad5c679c 3630 if (!qemu_chr_is_ringbuf(chr)) {
3949e594 3631 error_setg(errp,"%s is not a ringbuf device", device);
49b6d722
LL
3632 return NULL;
3633 }
3634
3635 if (size <= 0) {
3636 error_setg(errp, "size must be greater than zero");
3637 return NULL;
3638 }
3639
3949e594 3640 count = ringbuf_count(chr);
49b6d722 3641 size = size > count ? count : size;
44f3bcd2 3642 read_data = g_malloc(size + 1);
49b6d722 3643
3949e594 3644 ringbuf_chr_read(chr, read_data, size);
49b6d722
LL
3645
3646 if (has_format && (format == DATA_FORMAT_BASE64)) {
3ab651fc 3647 data = g_base64_encode(read_data, size);
13289fb5 3648 g_free(read_data);
49b6d722 3649 } else {
3949e594
MA
3650 /*
3651 * FIXME should read only complete, valid UTF-8 characters up
3652 * to @size bytes. Invalid sequences should be replaced by a
3653 * suitable replacement character. Except when (and only
3654 * when) ring buffer lost characters since last read, initial
3655 * continuation characters should be dropped.
3656 */
44f3bcd2 3657 read_data[size] = 0;
3ab651fc 3658 data = (char *)read_data;
49b6d722
LL
3659 }
3660
3ab651fc 3661 return data;
49b6d722
LL
3662}
3663
33521634 3664QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename)
191bc01b 3665{
6ea314d9 3666 char host[65], port[33], width[8], height[8];
aeb2c47a 3667 int pos;
7d31544f 3668 const char *p;
191bc01b 3669 QemuOpts *opts;
8be7e7e4 3670 Error *local_err = NULL;
191bc01b 3671
8be7e7e4 3672 opts = qemu_opts_create(qemu_find_opts("chardev"), label, 1, &local_err);
84d18f06 3673 if (local_err) {
33394884 3674 error_report_err(local_err);
191bc01b 3675 return NULL;
8be7e7e4 3676 }
191bc01b 3677
7591c5c1
GH
3678 if (strstart(filename, "mon:", &p)) {
3679 filename = p;
f43e47db 3680 qemu_opt_set(opts, "mux", "on", &error_abort);
02c4bdf1
PB
3681 if (strcmp(filename, "stdio") == 0) {
3682 /* Monitor is muxed to stdio: do not exit on Ctrl+C by default
3683 * but pass it to the guest. Handle this only for compat syntax,
3684 * for -chardev syntax we have special option for this.
3685 * This is what -nographic did, redirecting+muxing serial+monitor
3686 * to stdio causing Ctrl+C to be passed to guest. */
f43e47db 3687 qemu_opt_set(opts, "signal", "off", &error_abort);
02c4bdf1 3688 }
7591c5c1
GH
3689 }
3690
f0457e8d
GH
3691 if (strcmp(filename, "null") == 0 ||
3692 strcmp(filename, "pty") == 0 ||
3693 strcmp(filename, "msmouse") == 0 ||
dc1c21e6 3694 strcmp(filename, "braille") == 0 ||
5692399f 3695 strcmp(filename, "testdev") == 0 ||
f0457e8d 3696 strcmp(filename, "stdio") == 0) {
f43e47db 3697 qemu_opt_set(opts, "backend", filename, &error_abort);
191bc01b
GH
3698 return opts;
3699 }
6ea314d9 3700 if (strstart(filename, "vc", &p)) {
f43e47db 3701 qemu_opt_set(opts, "backend", "vc", &error_abort);
6ea314d9 3702 if (*p == ':') {
49aa4058 3703 if (sscanf(p+1, "%7[0-9]x%7[0-9]", width, height) == 2) {
6ea314d9 3704 /* pixels */
f43e47db
MA
3705 qemu_opt_set(opts, "width", width, &error_abort);
3706 qemu_opt_set(opts, "height", height, &error_abort);
49aa4058 3707 } else if (sscanf(p+1, "%7[0-9]Cx%7[0-9]C", width, height) == 2) {
6ea314d9 3708 /* chars */
f43e47db
MA
3709 qemu_opt_set(opts, "cols", width, &error_abort);
3710 qemu_opt_set(opts, "rows", height, &error_abort);
6ea314d9
GH
3711 } else {
3712 goto fail;
3713 }
3714 }
3715 return opts;
3716 }
d6c983cd 3717 if (strcmp(filename, "con:") == 0) {
f43e47db 3718 qemu_opt_set(opts, "backend", "console", &error_abort);
d6c983cd
GH
3719 return opts;
3720 }
48b76496 3721 if (strstart(filename, "COM", NULL)) {
f43e47db
MA
3722 qemu_opt_set(opts, "backend", "serial", &error_abort);
3723 qemu_opt_set(opts, "path", filename, &error_abort);
48b76496
GH
3724 return opts;
3725 }
7d31544f 3726 if (strstart(filename, "file:", &p)) {
f43e47db
MA
3727 qemu_opt_set(opts, "backend", "file", &error_abort);
3728 qemu_opt_set(opts, "path", p, &error_abort);
7d31544f
GH
3729 return opts;
3730 }
3731 if (strstart(filename, "pipe:", &p)) {
f43e47db
MA
3732 qemu_opt_set(opts, "backend", "pipe", &error_abort);
3733 qemu_opt_set(opts, "path", p, &error_abort);
7d31544f
GH
3734 return opts;
3735 }
aeb2c47a
GH
3736 if (strstart(filename, "tcp:", &p) ||
3737 strstart(filename, "telnet:", &p)) {
3738 if (sscanf(p, "%64[^:]:%32[^,]%n", host, port, &pos) < 2) {
3739 host[0] = 0;
3740 if (sscanf(p, ":%32[^,]%n", port, &pos) < 1)
3741 goto fail;
3742 }
f43e47db
MA
3743 qemu_opt_set(opts, "backend", "socket", &error_abort);
3744 qemu_opt_set(opts, "host", host, &error_abort);
3745 qemu_opt_set(opts, "port", port, &error_abort);
aeb2c47a 3746 if (p[pos] == ',') {
dc523cd3
MA
3747 qemu_opts_do_parse(opts, p+pos+1, NULL, &local_err);
3748 if (local_err) {
3749 error_report_err(local_err);
aeb2c47a 3750 goto fail;
dc523cd3 3751 }
aeb2c47a
GH
3752 }
3753 if (strstart(filename, "telnet:", &p))
f43e47db 3754 qemu_opt_set(opts, "telnet", "on", &error_abort);
aeb2c47a
GH
3755 return opts;
3756 }
7e1b35b4 3757 if (strstart(filename, "udp:", &p)) {
f43e47db 3758 qemu_opt_set(opts, "backend", "udp", &error_abort);
7e1b35b4
GH
3759 if (sscanf(p, "%64[^:]:%32[^@,]%n", host, port, &pos) < 2) {
3760 host[0] = 0;
39324ca4 3761 if (sscanf(p, ":%32[^@,]%n", port, &pos) < 1) {
7e1b35b4
GH
3762 goto fail;
3763 }
3764 }
f43e47db
MA
3765 qemu_opt_set(opts, "host", host, &error_abort);
3766 qemu_opt_set(opts, "port", port, &error_abort);
7e1b35b4
GH
3767 if (p[pos] == '@') {
3768 p += pos + 1;
3769 if (sscanf(p, "%64[^:]:%32[^,]%n", host, port, &pos) < 2) {
3770 host[0] = 0;
3771 if (sscanf(p, ":%32[^,]%n", port, &pos) < 1) {
7e1b35b4
GH
3772 goto fail;
3773 }
3774 }
f43e47db
MA
3775 qemu_opt_set(opts, "localaddr", host, &error_abort);
3776 qemu_opt_set(opts, "localport", port, &error_abort);
7e1b35b4
GH
3777 }
3778 return opts;
3779 }
aeb2c47a 3780 if (strstart(filename, "unix:", &p)) {
f43e47db 3781 qemu_opt_set(opts, "backend", "socket", &error_abort);
dc523cd3
MA
3782 qemu_opts_do_parse(opts, p, "path", &local_err);
3783 if (local_err) {
3784 error_report_err(local_err);
aeb2c47a 3785 goto fail;
dc523cd3 3786 }
aeb2c47a
GH
3787 return opts;
3788 }
48b76496
GH
3789 if (strstart(filename, "/dev/parport", NULL) ||
3790 strstart(filename, "/dev/ppi", NULL)) {
f43e47db
MA
3791 qemu_opt_set(opts, "backend", "parport", &error_abort);
3792 qemu_opt_set(opts, "path", filename, &error_abort);
48b76496
GH
3793 return opts;
3794 }
3795 if (strstart(filename, "/dev/", NULL)) {
f43e47db
MA
3796 qemu_opt_set(opts, "backend", "tty", &error_abort);
3797 qemu_opt_set(opts, "path", filename, &error_abort);
48b76496
GH
3798 return opts;
3799 }
191bc01b 3800
aeb2c47a 3801fail:
191bc01b
GH
3802 qemu_opts_del(opts);
3803 return NULL;
3804}
3805
21a933ea 3806void qemu_chr_parse_common(QemuOpts *opts, ChardevCommon *backend)
d0d7708b
DB
3807{
3808 const char *logfile = qemu_opt_get(opts, "logfile");
3809
3810 backend->has_logfile = logfile != NULL;
3811 backend->logfile = logfile ? g_strdup(logfile) : NULL;
3812
3813 backend->has_logappend = true;
3814 backend->logappend = qemu_opt_get_bool(opts, "logappend", false);
3815}
3816
3817
846e2e49
GH
3818static void qemu_chr_parse_file_out(QemuOpts *opts, ChardevBackend *backend,
3819 Error **errp)
3820{
3821 const char *path = qemu_opt_get(opts, "path");
f194a1ae 3822 ChardevFile *file;
846e2e49
GH
3823
3824 if (path == NULL) {
3825 error_setg(errp, "chardev: file: no filename given");
3826 return;
3827 }
32bafa8f 3828 file = backend->u.file.data = g_new0(ChardevFile, 1);
f194a1ae
EB
3829 qemu_chr_parse_common(opts, qapi_ChardevFile_base(file));
3830 file->out = g_strdup(path);
31e38a22 3831
f194a1ae
EB
3832 file->has_append = true;
3833 file->append = qemu_opt_get_bool(opts, "append", false);
846e2e49
GH
3834}
3835
7c358031
GH
3836static void qemu_chr_parse_stdio(QemuOpts *opts, ChardevBackend *backend,
3837 Error **errp)
3838{
f194a1ae
EB
3839 ChardevStdio *stdio;
3840
32bafa8f 3841 stdio = backend->u.stdio.data = g_new0(ChardevStdio, 1);
f194a1ae
EB
3842 qemu_chr_parse_common(opts, qapi_ChardevStdio_base(stdio));
3843 stdio->has_signal = true;
3844 stdio->signal = qemu_opt_get_bool(opts, "signal", true);
7c358031
GH
3845}
3846
b68e956a
MAL
3847static const CharDriver stdio_driver = {
3848 .kind = CHARDEV_BACKEND_KIND_STDIO,
3849 .parse = qemu_chr_parse_stdio,
3850 .create = qemu_chr_open_stdio,
3851#ifdef _WIN32
3852 .chr_write = win_stdio_write,
3853 .chr_set_echo = qemu_chr_set_echo_win_stdio,
3854 .chr_free = win_stdio_free,
3855#else
3856 .chr_add_watch = fd_chr_add_watch,
3857 .chr_write = fd_chr_write,
3858 .chr_update_read_handler = fd_chr_update_read_handler,
3859 .chr_set_echo = qemu_chr_set_echo_stdio,
3860 .chr_free = qemu_chr_free_stdio,
3861#endif
3862};
3863
6511d396 3864#ifdef HAVE_CHARDEV_SERIAL
0f1cb51d
GH
3865static void qemu_chr_parse_serial(QemuOpts *opts, ChardevBackend *backend,
3866 Error **errp)
3867{
3868 const char *device = qemu_opt_get(opts, "path");
f194a1ae 3869 ChardevHostdev *serial;
0f1cb51d
GH
3870
3871 if (device == NULL) {
3872 error_setg(errp, "chardev: serial/tty: no device path given");
3873 return;
3874 }
32bafa8f 3875 serial = backend->u.serial.data = g_new0(ChardevHostdev, 1);
f194a1ae
EB
3876 qemu_chr_parse_common(opts, qapi_ChardevHostdev_base(serial));
3877 serial->device = g_strdup(device);
0f1cb51d 3878}
6511d396 3879#endif
0f1cb51d 3880
38bfb1a6 3881#ifdef HAVE_CHARDEV_PARPORT
dc375097
GH
3882static void qemu_chr_parse_parallel(QemuOpts *opts, ChardevBackend *backend,
3883 Error **errp)
3884{
3885 const char *device = qemu_opt_get(opts, "path");
f194a1ae 3886 ChardevHostdev *parallel;
dc375097
GH
3887
3888 if (device == NULL) {
3889 error_setg(errp, "chardev: parallel: no device path given");
3890 return;
3891 }
32bafa8f 3892 parallel = backend->u.parallel.data = g_new0(ChardevHostdev, 1);
f194a1ae
EB
3893 qemu_chr_parse_common(opts, qapi_ChardevHostdev_base(parallel));
3894 parallel->device = g_strdup(device);
dc375097 3895}
38bfb1a6 3896#endif
dc375097 3897
548cbb36
GH
3898static void qemu_chr_parse_pipe(QemuOpts *opts, ChardevBackend *backend,
3899 Error **errp)
3900{
3901 const char *device = qemu_opt_get(opts, "path");
f194a1ae 3902 ChardevHostdev *dev;
548cbb36
GH
3903
3904 if (device == NULL) {
3905 error_setg(errp, "chardev: pipe: no device path given");
3906 return;
3907 }
32bafa8f 3908 dev = backend->u.pipe.data = g_new0(ChardevHostdev, 1);
f194a1ae
EB
3909 qemu_chr_parse_common(opts, qapi_ChardevHostdev_base(dev));
3910 dev->device = g_strdup(device);
548cbb36
GH
3911}
3912
b68e956a
MAL
3913static const CharDriver pipe_driver = {
3914 .kind = CHARDEV_BACKEND_KIND_PIPE,
3915 .parse = qemu_chr_parse_pipe,
3916 .create = qemu_chr_open_pipe,
3917#ifdef _WIN32
3918 .chr_write = win_chr_write,
3919 .chr_free = win_chr_free,
3920#else
3921 .chr_add_watch = fd_chr_add_watch,
3922 .chr_write = fd_chr_write,
3923 .chr_update_read_handler = fd_chr_update_read_handler,
3924 .chr_free = fd_chr_free,
3925#endif
3926};
3927
4f57378f
MA
3928static void qemu_chr_parse_ringbuf(QemuOpts *opts, ChardevBackend *backend,
3929 Error **errp)
1da48c65
GH
3930{
3931 int val;
f194a1ae 3932 ChardevRingbuf *ringbuf;
1da48c65 3933
32bafa8f 3934 ringbuf = backend->u.ringbuf.data = g_new0(ChardevRingbuf, 1);
f194a1ae 3935 qemu_chr_parse_common(opts, qapi_ChardevRingbuf_base(ringbuf));
1da48c65 3936
0f953051 3937 val = qemu_opt_get_size(opts, "size", 0);
1da48c65 3938 if (val != 0) {
f194a1ae
EB
3939 ringbuf->has_size = true;
3940 ringbuf->size = val;
1da48c65
GH
3941 }
3942}
3943
b68e956a
MAL
3944static const CharDriver ringbuf_driver = {
3945 .kind = CHARDEV_BACKEND_KIND_RINGBUF,
3946 .parse = qemu_chr_parse_ringbuf,
3947 .create = qemu_chr_open_ringbuf,
3948 .chr_write = ringbuf_chr_write,
3949 .chr_free = ringbuf_chr_free,
3950};
3951
3952/* Bug-compatibility: */
3953static const CharDriver memory_driver = {
3954 .kind = CHARDEV_BACKEND_KIND_MEMORY,
3955 .parse = qemu_chr_parse_ringbuf,
3956 .create = qemu_chr_open_ringbuf,
3957 .chr_write = ringbuf_chr_write,
3958 .chr_free = ringbuf_chr_free,
3959};
3960
bb6fb7c0
GH
3961static void qemu_chr_parse_mux(QemuOpts *opts, ChardevBackend *backend,
3962 Error **errp)
3963{
3964 const char *chardev = qemu_opt_get(opts, "chardev");
f194a1ae 3965 ChardevMux *mux;
bb6fb7c0
GH
3966
3967 if (chardev == NULL) {
3968 error_setg(errp, "chardev: mux: no chardev given");
3969 return;
3970 }
32bafa8f 3971 mux = backend->u.mux.data = g_new0(ChardevMux, 1);
f194a1ae
EB
3972 qemu_chr_parse_common(opts, qapi_ChardevMux_base(mux));
3973 mux->chardev = g_strdup(chardev);
bb6fb7c0
GH
3974}
3975
b68e956a
MAL
3976static const CharDriver mux_driver = {
3977 .kind = CHARDEV_BACKEND_KIND_MUX,
3978 .parse = qemu_chr_parse_mux,
3979 .create = qemu_chr_open_mux,
3980 .chr_free = mux_chr_free,
3981 .chr_write = mux_chr_write,
3982 .chr_accept_input = mux_chr_accept_input,
3983 .chr_add_watch = mux_chr_add_watch,
3984};
3985
dafd325d
PM
3986static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
3987 Error **errp)
3988{
3989 bool is_listen = qemu_opt_get_bool(opts, "server", false);
3990 bool is_waitconnect = is_listen && qemu_opt_get_bool(opts, "wait", true);
3991 bool is_telnet = qemu_opt_get_bool(opts, "telnet", false);
3992 bool do_nodelay = !qemu_opt_get_bool(opts, "delay", true);
5dd1f02b 3993 int64_t reconnect = qemu_opt_get_number(opts, "reconnect", 0);
dafd325d
PM
3994 const char *path = qemu_opt_get(opts, "path");
3995 const char *host = qemu_opt_get(opts, "host");
3996 const char *port = qemu_opt_get(opts, "port");
a8fb5427 3997 const char *tls_creds = qemu_opt_get(opts, "tls-creds");
dafd325d 3998 SocketAddress *addr;
f194a1ae 3999 ChardevSocket *sock;
dafd325d
PM
4000
4001 if (!path) {
4002 if (!host) {
4003 error_setg(errp, "chardev: socket: no host given");
4004 return;
4005 }
4006 if (!port) {
4007 error_setg(errp, "chardev: socket: no port given");
4008 return;
4009 }
a8fb5427
DB
4010 } else {
4011 if (tls_creds) {
4012 error_setg(errp, "TLS can only be used over TCP socket");
4013 return;
4014 }
dafd325d
PM
4015 }
4016
32bafa8f 4017 sock = backend->u.socket.data = g_new0(ChardevSocket, 1);
f194a1ae 4018 qemu_chr_parse_common(opts, qapi_ChardevSocket_base(sock));
dafd325d 4019
f194a1ae
EB
4020 sock->has_nodelay = true;
4021 sock->nodelay = do_nodelay;
4022 sock->has_server = true;
4023 sock->server = is_listen;
4024 sock->has_telnet = true;
4025 sock->telnet = is_telnet;
4026 sock->has_wait = true;
4027 sock->wait = is_waitconnect;
4028 sock->has_reconnect = true;
4029 sock->reconnect = reconnect;
4030 sock->tls_creds = g_strdup(tls_creds);
dafd325d
PM
4031
4032 addr = g_new0(SocketAddress, 1);
4033 if (path) {
0399293e 4034 UnixSocketAddress *q_unix;
130257dc 4035 addr->type = SOCKET_ADDRESS_KIND_UNIX;
32bafa8f 4036 q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
0399293e 4037 q_unix->path = g_strdup(path);
dafd325d 4038 } else {
130257dc 4039 addr->type = SOCKET_ADDRESS_KIND_INET;
32bafa8f
EB
4040 addr->u.inet.data = g_new(InetSocketAddress, 1);
4041 *addr->u.inet.data = (InetSocketAddress) {
0399293e
EB
4042 .host = g_strdup(host),
4043 .port = g_strdup(port),
4044 .has_to = qemu_opt_get(opts, "to"),
4045 .to = qemu_opt_get_number(opts, "to", 0),
4046 .has_ipv4 = qemu_opt_get(opts, "ipv4"),
4047 .ipv4 = qemu_opt_get_bool(opts, "ipv4", 0),
4048 .has_ipv6 = qemu_opt_get(opts, "ipv6"),
4049 .ipv6 = qemu_opt_get_bool(opts, "ipv6", 0),
4050 };
dafd325d 4051 }
f194a1ae 4052 sock->addr = addr;
dafd325d
PM
4053}
4054
90a14bfe
PM
4055static void qemu_chr_parse_udp(QemuOpts *opts, ChardevBackend *backend,
4056 Error **errp)
4057{
4058 const char *host = qemu_opt_get(opts, "host");
4059 const char *port = qemu_opt_get(opts, "port");
4060 const char *localaddr = qemu_opt_get(opts, "localaddr");
4061 const char *localport = qemu_opt_get(opts, "localport");
4062 bool has_local = false;
4063 SocketAddress *addr;
f194a1ae 4064 ChardevUdp *udp;
90a14bfe
PM
4065
4066 if (host == NULL || strlen(host) == 0) {
4067 host = "localhost";
4068 }
4069 if (port == NULL || strlen(port) == 0) {
4070 error_setg(errp, "chardev: udp: remote port not specified");
4071 return;
4072 }
4073 if (localport == NULL || strlen(localport) == 0) {
4074 localport = "0";
4075 } else {
4076 has_local = true;
4077 }
4078 if (localaddr == NULL || strlen(localaddr) == 0) {
4079 localaddr = "";
4080 } else {
4081 has_local = true;
4082 }
4083
32bafa8f 4084 udp = backend->u.udp.data = g_new0(ChardevUdp, 1);
f194a1ae 4085 qemu_chr_parse_common(opts, qapi_ChardevUdp_base(udp));
90a14bfe
PM
4086
4087 addr = g_new0(SocketAddress, 1);
130257dc 4088 addr->type = SOCKET_ADDRESS_KIND_INET;
32bafa8f
EB
4089 addr->u.inet.data = g_new(InetSocketAddress, 1);
4090 *addr->u.inet.data = (InetSocketAddress) {
0399293e
EB
4091 .host = g_strdup(host),
4092 .port = g_strdup(port),
4093 .has_ipv4 = qemu_opt_get(opts, "ipv4"),
4094 .ipv4 = qemu_opt_get_bool(opts, "ipv4", 0),
4095 .has_ipv6 = qemu_opt_get(opts, "ipv6"),
4096 .ipv6 = qemu_opt_get_bool(opts, "ipv6", 0),
4097 };
f194a1ae 4098 udp->remote = addr;
90a14bfe
PM
4099
4100 if (has_local) {
f194a1ae 4101 udp->has_local = true;
90a14bfe 4102 addr = g_new0(SocketAddress, 1);
130257dc 4103 addr->type = SOCKET_ADDRESS_KIND_INET;
32bafa8f
EB
4104 addr->u.inet.data = g_new(InetSocketAddress, 1);
4105 *addr->u.inet.data = (InetSocketAddress) {
0399293e
EB
4106 .host = g_strdup(localaddr),
4107 .port = g_strdup(localport),
4108 };
f194a1ae 4109 udp->local = addr;
90a14bfe
PM
4110 }
4111}
4112
a1698bf1 4113static const CharDriver *backends[CHARDEV_BACKEND_KIND__MAX];
d654f34e 4114
0b812f31 4115void register_char_driver(const CharDriver *driver)
2c5f4882 4116{
a1698bf1 4117 backends[driver->kind] = driver;
2c5f4882
GH
4118}
4119
f69554b9 4120CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
b4948be9 4121 Error **errp)
191bc01b 4122{
0aff637e 4123 Error *local_err = NULL;
a1698bf1 4124 const CharDriver *cd = NULL;
191bc01b 4125 CharDriverState *chr;
a1698bf1 4126 int i;
a61ae7f8
PM
4127 ChardevReturn *ret = NULL;
4128 ChardevBackend *backend;
0b812f31 4129 const char *name = qemu_opt_get(opts, "backend");
a61ae7f8
PM
4130 const char *id = qemu_opts_id(opts);
4131 char *bid = NULL;
191bc01b 4132
0b812f31 4133 if (name == NULL) {
312fd5f2 4134 error_setg(errp, "chardev: \"%s\" missing backend",
bd2d80b2 4135 qemu_opts_id(opts));
2274ae9d 4136 goto err;
1bbd185f 4137 }
517b3d40 4138
0b812f31 4139 if (is_help_option(name)) {
517b3d40 4140 fprintf(stderr, "Available chardev backend types:\n");
a1698bf1
MAL
4141 for (i = 0; i < ARRAY_SIZE(backends); i++) {
4142 cd = backends[i];
4143 if (cd) {
4144 fprintf(stderr, "%s\n", ChardevBackendKind_lookup[cd->kind]);
4145 if (cd->alias) {
4146 fprintf(stderr, "%s\n", cd->alias);
4147 }
0b812f31 4148 }
517b3d40 4149 }
0b812f31 4150 exit(0);
517b3d40
LM
4151 }
4152
4153 if (id == NULL) {
4154 error_setg(errp, "chardev: no id specified");
4155 goto err;
4156 }
4157
a1698bf1
MAL
4158 for (i = 0; i < ARRAY_SIZE(backends); i++) {
4159 cd = backends[i];
4160 if (!cd) {
4161 continue;
4162 }
0b812f31
MAL
4163 if (g_strcmp0(ChardevBackendKind_lookup[cd->kind], name) == 0 ||
4164 g_strcmp0(cd->alias, name) == 0) {
191bc01b 4165 break;
d654f34e 4166 }
191bc01b 4167 }
a1698bf1 4168 if (i == ARRAY_SIZE(backends)) {
0b812f31 4169 error_setg(errp, "chardev: backend \"%s\" not found", name);
e668287d 4170 goto err;
191bc01b
GH
4171 }
4172
a61ae7f8 4173 backend = g_new0(ChardevBackend, 1);
edb2fb3c 4174
a61ae7f8
PM
4175 if (qemu_opt_get_bool(opts, "mux", 0)) {
4176 bid = g_strdup_printf("%s-base", id);
4177 }
2c5f4882 4178
a61ae7f8 4179 chr = NULL;
130257dc 4180 backend->type = cd->kind;
a61ae7f8
PM
4181 if (cd->parse) {
4182 cd->parse(opts, backend, &local_err);
4183 if (local_err) {
4184 error_propagate(errp, local_err);
2c5f4882
GH
4185 goto qapi_out;
4186 }
d0d7708b
DB
4187 } else {
4188 ChardevCommon *cc = g_new0(ChardevCommon, 1);
4189 qemu_chr_parse_common(opts, cc);
32bafa8f 4190 backend->u.null.data = cc; /* Any ChardevCommon member would work */
2c5f4882 4191 }
d0d7708b 4192
a61ae7f8
PM
4193 ret = qmp_chardev_add(bid ? bid : id, backend, errp);
4194 if (!ret) {
4195 goto qapi_out;
191bc01b
GH
4196 }
4197
a61ae7f8
PM
4198 if (bid) {
4199 qapi_free_ChardevBackend(backend);
4200 qapi_free_ChardevReturn(ret);
4201 backend = g_new0(ChardevBackend, 1);
32bafa8f 4202 backend->u.mux.data = g_new0(ChardevMux, 1);
130257dc 4203 backend->type = CHARDEV_BACKEND_KIND_MUX;
32bafa8f 4204 backend->u.mux.data->chardev = g_strdup(bid);
a61ae7f8
PM
4205 ret = qmp_chardev_add(id, backend, errp);
4206 if (!ret) {
4207 chr = qemu_chr_find(bid);
4208 qemu_chr_delete(chr);
4209 chr = NULL;
4210 goto qapi_out;
4211 }
bd5c51ee 4212 }
7591c5c1 4213
a61ae7f8 4214 chr = qemu_chr_find(id);
a61ae7f8
PM
4215
4216qapi_out:
4217 qapi_free_ChardevBackend(backend);
4218 qapi_free_ChardevReturn(ret);
4219 g_free(bid);
191bc01b 4220 return chr;
2274ae9d
GH
4221
4222err:
2274ae9d 4223 return NULL;
191bc01b
GH
4224}
4225
b4948be9 4226CharDriverState *qemu_chr_new_noreplay(const char *label, const char *filename)
6f97dba0
AL
4227{
4228 const char *p;
4229 CharDriverState *chr;
191bc01b 4230 QemuOpts *opts;
bd2d80b2 4231 Error *err = NULL;
191bc01b 4232
c845f401
GH
4233 if (strstart(filename, "chardev:", &p)) {
4234 return qemu_chr_find(p);
4235 }
4236
191bc01b 4237 opts = qemu_chr_parse_compat(label, filename);
7e1b35b4
GH
4238 if (!opts)
4239 return NULL;
6f97dba0 4240
b4948be9 4241 chr = qemu_chr_new_from_opts(opts, &err);
84d18f06 4242 if (err) {
565f65d2 4243 error_report_err(err);
bd2d80b2 4244 }
7e1b35b4
GH
4245 if (chr && qemu_opt_get_bool(opts, "mux", 0)) {
4246 monitor_init(chr, MONITOR_USE_READLINE);
6f97dba0 4247 }
0a73336d 4248 qemu_opts_del(opts);
6f97dba0
AL
4249 return chr;
4250}
4251
b4948be9 4252CharDriverState *qemu_chr_new(const char *label, const char *filename)
33577b47
PD
4253{
4254 CharDriverState *chr;
b4948be9 4255 chr = qemu_chr_new_noreplay(label, filename);
33577b47 4256 if (chr) {
5ebd6703
MAL
4257 if (replay_mode != REPLAY_MODE_NONE) {
4258 qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_REPLAY);
4259 }
4260 if (qemu_chr_replay(chr) && chr->driver->chr_ioctl) {
33577b47
PD
4261 fprintf(stderr,
4262 "Replay: ioctl is not supported for serial devices yet\n");
4263 }
4264 replay_register_char_driver(chr);
4265 }
4266 return chr;
4267}
4268
5345fdb4 4269void qemu_chr_fe_set_echo(CharBackend *be, bool echo)
c48855e1 4270{
5345fdb4
MAL
4271 CharDriverState *chr = be->chr;
4272
b68e956a
MAL
4273 if (chr && chr->driver->chr_set_echo) {
4274 chr->driver->chr_set_echo(chr, echo);
c48855e1
PB
4275 }
4276}
4277
5345fdb4 4278void qemu_chr_fe_set_open(CharBackend *be, int fe_open)
7c32c4fe 4279{
5345fdb4
MAL
4280 CharDriverState *chr = be->chr;
4281
fa394ed6
MAL
4282 if (!chr) {
4283 return;
4284 }
4285
830896af 4286 if (be->fe_open == fe_open) {
c0c4bd2c
HG
4287 return;
4288 }
830896af 4289 be->fe_open = fe_open;
b68e956a
MAL
4290 if (chr->driver->chr_set_fe_open) {
4291 chr->driver->chr_set_fe_open(chr, fe_open);
7c32c4fe
HG
4292 }
4293}
4294
5345fdb4 4295guint qemu_chr_fe_add_watch(CharBackend *be, GIOCondition cond,
6f1de6b7 4296 GIOFunc func, void *user_data)
23673ca7 4297{
5345fdb4 4298 CharDriverState *s = be->chr;
23673ca7
AL
4299 GSource *src;
4300 guint tag;
4301
b68e956a 4302 if (!s || s->driver->chr_add_watch == NULL) {
6f1de6b7 4303 return 0;
23673ca7
AL
4304 }
4305
b68e956a 4306 src = s->driver->chr_add_watch(s, cond);
62c339c5 4307 if (!src) {
6f1de6b7 4308 return 0;
62c339c5
PB
4309 }
4310
23673ca7
AL
4311 g_source_set_callback(src, (GSourceFunc)func, user_data, NULL);
4312 tag = g_source_attach(src, NULL);
4313 g_source_unref(src);
4314
4315 return tag;
4316}
4317
5345fdb4 4318void qemu_chr_fe_disconnect(CharBackend *be)
7d9d17f7 4319{
5345fdb4
MAL
4320 CharDriverState *chr = be->chr;
4321
b68e956a
MAL
4322 if (chr && chr->driver->chr_disconnect) {
4323 chr->driver->chr_disconnect(chr);
7d9d17f7
TM
4324 }
4325}
4326
d0d7708b 4327static void qemu_chr_free_common(CharDriverState *chr)
6f97dba0 4328{
a4afa548
MAL
4329 if (chr->be) {
4330 chr->be->chr = NULL;
4331 }
7267c094
AL
4332 g_free(chr->filename);
4333 g_free(chr->label);
d0d7708b
DB
4334 if (chr->logfd != -1) {
4335 close(chr->logfd);
4336 }
fefd749c 4337 qemu_mutex_destroy(&chr->chr_write_lock);
7267c094 4338 g_free(chr);
6f97dba0
AL
4339}
4340
d0d7708b
DB
4341void qemu_chr_free(CharDriverState *chr)
4342{
b68e956a
MAL
4343 if (chr->driver->chr_free) {
4344 chr->driver->chr_free(chr);
d0d7708b
DB
4345 }
4346 qemu_chr_free_common(chr);
4347}
4348
1ad78ea5
MAL
4349void qemu_chr_delete(CharDriverState *chr)
4350{
4351 QTAILQ_REMOVE(&chardevs, chr, next);
4352 qemu_chr_free(chr);
4353}
4354
c5a415a0 4355ChardevInfoList *qmp_query_chardev(Error **errp)
6f97dba0 4356{
c5a415a0 4357 ChardevInfoList *chr_list = NULL;
6f97dba0
AL
4358 CharDriverState *chr;
4359
72cf2d4f 4360 QTAILQ_FOREACH(chr, &chardevs, next) {
c5a415a0
LC
4361 ChardevInfoList *info = g_malloc0(sizeof(*info));
4362 info->value = g_malloc0(sizeof(*info->value));
4363 info->value->label = g_strdup(chr->label);
4364 info->value->filename = g_strdup(chr->filename);
830896af 4365 info->value->frontend_open = chr->be && chr->be->fe_open;
c5a415a0
LC
4366
4367 info->next = chr_list;
4368 chr_list = info;
6f97dba0 4369 }
588b3832 4370
c5a415a0 4371 return chr_list;
6f97dba0 4372}
c845f401 4373
0b812f31
MAL
4374static ChardevBackendInfoList *
4375qmp_prepend_backend(ChardevBackendInfoList *list, const char *name)
4376{
4377 ChardevBackendInfoList *info = g_malloc0(sizeof(*info));
4378 info->value = g_malloc0(sizeof(*info->value));
4379 info->value->name = g_strdup(name);
4380 info->next = list;
4381 return info;
4382}
4383
77d1c3c6
MK
4384ChardevBackendInfoList *qmp_query_chardev_backends(Error **errp)
4385{
4386 ChardevBackendInfoList *backend_list = NULL;
a1698bf1
MAL
4387 const CharDriver *c;
4388 int i;
4389
4390 for (i = 0; i < ARRAY_SIZE(backends); i++) {
4391 c = backends[i];
4392 if (!c) {
4393 continue;
4394 }
77d1c3c6 4395
0b812f31
MAL
4396 backend_list = qmp_prepend_backend(backend_list,
4397 ChardevBackendKind_lookup[c->kind]);
4398 if (c->alias) {
4399 backend_list = qmp_prepend_backend(backend_list, c->alias);
4400 }
77d1c3c6
MK
4401 }
4402
4403 return backend_list;
4404}
4405
c845f401
GH
4406CharDriverState *qemu_chr_find(const char *name)
4407{
4408 CharDriverState *chr;
4409
72cf2d4f 4410 QTAILQ_FOREACH(chr, &chardevs, next) {
c845f401
GH
4411 if (strcmp(chr->label, name) != 0)
4412 continue;
4413 return chr;
4414 }
4415 return NULL;
4416}
0beb4942 4417
4d454574
PB
4418QemuOptsList qemu_chardev_opts = {
4419 .name = "chardev",
4420 .implied_opt_name = "backend",
4421 .head = QTAILQ_HEAD_INITIALIZER(qemu_chardev_opts.head),
4422 .desc = {
4423 {
4424 .name = "backend",
4425 .type = QEMU_OPT_STRING,
4426 },{
4427 .name = "path",
4428 .type = QEMU_OPT_STRING,
4429 },{
4430 .name = "host",
4431 .type = QEMU_OPT_STRING,
4432 },{
4433 .name = "port",
4434 .type = QEMU_OPT_STRING,
4435 },{
4436 .name = "localaddr",
4437 .type = QEMU_OPT_STRING,
4438 },{
4439 .name = "localport",
4440 .type = QEMU_OPT_STRING,
4441 },{
4442 .name = "to",
4443 .type = QEMU_OPT_NUMBER,
4444 },{
4445 .name = "ipv4",
4446 .type = QEMU_OPT_BOOL,
4447 },{
4448 .name = "ipv6",
4449 .type = QEMU_OPT_BOOL,
4450 },{
4451 .name = "wait",
4452 .type = QEMU_OPT_BOOL,
4453 },{
4454 .name = "server",
4455 .type = QEMU_OPT_BOOL,
4456 },{
4457 .name = "delay",
4458 .type = QEMU_OPT_BOOL,
5dd1f02b
CM
4459 },{
4460 .name = "reconnect",
4461 .type = QEMU_OPT_NUMBER,
4d454574
PB
4462 },{
4463 .name = "telnet",
4464 .type = QEMU_OPT_BOOL,
a8fb5427
DB
4465 },{
4466 .name = "tls-creds",
4467 .type = QEMU_OPT_STRING,
4d454574
PB
4468 },{
4469 .name = "width",
4470 .type = QEMU_OPT_NUMBER,
4471 },{
4472 .name = "height",
4473 .type = QEMU_OPT_NUMBER,
4474 },{
4475 .name = "cols",
4476 .type = QEMU_OPT_NUMBER,
4477 },{
4478 .name = "rows",
4479 .type = QEMU_OPT_NUMBER,
4480 },{
4481 .name = "mux",
4482 .type = QEMU_OPT_BOOL,
4483 },{
4484 .name = "signal",
4485 .type = QEMU_OPT_BOOL,
4486 },{
4487 .name = "name",
4488 .type = QEMU_OPT_STRING,
4489 },{
4490 .name = "debug",
4491 .type = QEMU_OPT_NUMBER,
51767e7c 4492 },{
3949e594 4493 .name = "size",
de1cc36e 4494 .type = QEMU_OPT_SIZE,
bb6fb7c0
GH
4495 },{
4496 .name = "chardev",
4497 .type = QEMU_OPT_STRING,
31e38a22
OK
4498 },{
4499 .name = "append",
4500 .type = QEMU_OPT_BOOL,
d0d7708b
DB
4501 },{
4502 .name = "logfile",
4503 .type = QEMU_OPT_STRING,
4504 },{
4505 .name = "logappend",
4506 .type = QEMU_OPT_BOOL,
4d454574
PB
4507 },
4508 { /* end of list */ }
4509 },
4510};
f1a1a356 4511
ffbdbe59
GH
4512#ifdef _WIN32
4513
b68e956a
MAL
4514static CharDriverState *qmp_chardev_open_file(const CharDriver *driver,
4515 const char *id,
fd5b036c
PB
4516 ChardevBackend *backend,
4517 ChardevReturn *ret,
82878dac 4518 bool *be_opened,
fd5b036c 4519 Error **errp)
ffbdbe59 4520{
32bafa8f 4521 ChardevFile *file = backend->u.file.data;
f194a1ae 4522 ChardevCommon *common = qapi_ChardevFile_base(file);
ffbdbe59 4523 HANDLE out;
c025f689
SW
4524 DWORD accessmode;
4525 DWORD flags;
ffbdbe59 4526
e859eda5 4527 if (file->has_in) {
ffbdbe59
GH
4528 error_setg(errp, "input file not supported");
4529 return NULL;
4530 }
4531
c025f689
SW
4532 if (file->has_append && file->append) {
4533 /* Append to file if it already exists. */
4534 accessmode = FILE_GENERIC_WRITE & ~FILE_WRITE_DATA;
4535 flags = OPEN_ALWAYS;
4536 } else {
4537 /* Truncate file if it already exists. */
4538 accessmode = GENERIC_WRITE;
4539 flags = CREATE_ALWAYS;
4540 }
4541
4542 out = CreateFile(file->out, accessmode, FILE_SHARE_READ, NULL, flags,
4543 FILE_ATTRIBUTE_NORMAL, NULL);
ffbdbe59
GH
4544 if (out == INVALID_HANDLE_VALUE) {
4545 error_setg(errp, "open %s failed", file->out);
4546 return NULL;
4547 }
b68e956a 4548 return qemu_chr_open_win_file(driver, out, common, errp);
ffbdbe59
GH
4549}
4550
b68e956a
MAL
4551static CharDriverState *qmp_chardev_open_serial(const CharDriver *driver,
4552 const char *id,
6511d396
PB
4553 ChardevBackend *backend,
4554 ChardevReturn *ret,
82878dac 4555 bool *be_opened,
d36b2b90 4556 Error **errp)
d59044ef 4557{
32bafa8f 4558 ChardevHostdev *serial = backend->u.serial.data;
f194a1ae 4559 ChardevCommon *common = qapi_ChardevHostdev_base(serial);
acbfbe4a
MAL
4560 CharDriverState *chr;
4561 WinCharState *s;
4562
4563 chr = qemu_chr_alloc(driver, common, errp);
4564 if (!chr) {
4565 return NULL;
4566 }
b68e956a 4567
acbfbe4a
MAL
4568 s = g_new0(WinCharState, 1);
4569 chr->opaque = s;
4570 if (win_chr_init(chr, serial->device, errp) < 0) {
4571 g_free(s);
4572 qemu_chr_free_common(chr);
4573 return NULL;
4574 }
4575
4576 return chr;
d36b2b90
MA
4577}
4578
ffbdbe59
GH
4579#else /* WIN32 */
4580
4581static int qmp_chardev_open_file_source(char *src, int flags,
4582 Error **errp)
4583{
4584 int fd = -1;
4585
4586 TFR(fd = qemu_open(src, flags, 0666));
4587 if (fd == -1) {
20c39760 4588 error_setg_file_open(errp, errno, src);
ffbdbe59
GH
4589 }
4590 return fd;
4591}
4592
b68e956a
MAL
4593static CharDriverState *qmp_chardev_open_file(const CharDriver *driver,
4594 const char *id,
fd5b036c
PB
4595 ChardevBackend *backend,
4596 ChardevReturn *ret,
82878dac 4597 bool *be_opened,
fd5b036c 4598 Error **errp)
ffbdbe59 4599{
32bafa8f 4600 ChardevFile *file = backend->u.file.data;
f194a1ae 4601 ChardevCommon *common = qapi_ChardevFile_base(file);
5f758366 4602 int flags, in = -1, out;
ffbdbe59 4603
31e38a22
OK
4604 flags = O_WRONLY | O_CREAT | O_BINARY;
4605 if (file->has_append && file->append) {
4606 flags |= O_APPEND;
4607 } else {
4608 flags |= O_TRUNC;
4609 }
4610
ffbdbe59 4611 out = qmp_chardev_open_file_source(file->out, flags, errp);
5f758366 4612 if (out < 0) {
ffbdbe59
GH
4613 return NULL;
4614 }
4615
e859eda5 4616 if (file->has_in) {
ffbdbe59
GH
4617 flags = O_RDONLY;
4618 in = qmp_chardev_open_file_source(file->in, flags, errp);
5f758366 4619 if (in < 0) {
ffbdbe59
GH
4620 qemu_close(out);
4621 return NULL;
4622 }
4623 }
4624
b68e956a 4625 return qemu_chr_open_fd(driver, in, out, common, errp);
ffbdbe59
GH
4626}
4627
d809ab95 4628#ifdef HAVE_CHARDEV_SERIAL
b68e956a
MAL
4629static CharDriverState *qmp_chardev_open_serial(const CharDriver *driver,
4630 const char *id,
6511d396
PB
4631 ChardevBackend *backend,
4632 ChardevReturn *ret,
82878dac 4633 bool *be_opened,
d36b2b90 4634 Error **errp)
d59044ef 4635{
32bafa8f 4636 ChardevHostdev *serial = backend->u.serial.data;
f194a1ae 4637 ChardevCommon *common = qapi_ChardevHostdev_base(serial);
d36b2b90
MA
4638 int fd;
4639
4640 fd = qmp_chardev_open_file_source(serial->device, O_RDWR, errp);
5f758366 4641 if (fd < 0) {
d36b2b90 4642 return NULL;
39099991 4643 }
f9e8cacc 4644 qemu_set_nonblock(fd);
acbfbe4a 4645 tty_serial_init(fd, 115200, 'N', 8, 1);
b68e956a 4646
acbfbe4a 4647 return qemu_chr_open_fd(driver, fd, fd, common, errp);
d36b2b90 4648}
6511d396 4649#endif
d36b2b90 4650
d809ab95 4651#ifdef HAVE_CHARDEV_PARPORT
b68e956a
MAL
4652static CharDriverState *qmp_chardev_open_parallel(const CharDriver *driver,
4653 const char *id,
38bfb1a6
PB
4654 ChardevBackend *backend,
4655 ChardevReturn *ret,
82878dac 4656 bool *be_opened,
d36b2b90
MA
4657 Error **errp)
4658{
32bafa8f 4659 ChardevHostdev *parallel = backend->u.parallel.data;
f194a1ae 4660 ChardevCommon *common = qapi_ChardevHostdev_base(parallel);
d36b2b90
MA
4661 int fd;
4662
4663 fd = qmp_chardev_open_file_source(parallel->device, O_RDWR, errp);
5f758366 4664 if (fd < 0) {
d59044ef
GH
4665 return NULL;
4666 }
b68e956a 4667 return qemu_chr_open_pp_fd(driver, fd, common, be_opened, errp);
d59044ef 4668}
b68e956a
MAL
4669
4670static const CharDriver parallel_driver = {
4671 .kind = CHARDEV_BACKEND_KIND_PARALLEL,
4672 .alias = "parport",
4673 .parse = qemu_chr_parse_parallel,
4674 .create = qmp_chardev_open_parallel,
4675#if defined(__linux__)
4676 .chr_write = null_chr_write,
4677 .chr_ioctl = pp_ioctl,
4678 .chr_free = pp_free,
4679#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
4680 .chr_write = null_chr_write,
4681 .chr_ioctl = pp_ioctl,
4682 /* FIXME: no chr_free */
4683#endif
4684};
d809ab95 4685#endif
d59044ef 4686
ffbdbe59
GH
4687#endif /* WIN32 */
4688
b68e956a
MAL
4689static const CharDriver file_driver = {
4690 .kind = CHARDEV_BACKEND_KIND_FILE,
4691 .parse = qemu_chr_parse_file_out,
4692 .create = qmp_chardev_open_file,
4693#ifdef _WIN32
4694 .chr_write = win_chr_write,
4695 /* FIXME: no chr_free */
4696#else
4697 .chr_add_watch = fd_chr_add_watch,
4698 .chr_write = fd_chr_write,
4699 .chr_update_read_handler = fd_chr_update_read_handler,
4700 .chr_free = fd_chr_free,
4701#endif
4702};
4703
4704#ifdef HAVE_CHARDEV_SERIAL
4705static const CharDriver serial_driver = {
4706 .kind = CHARDEV_BACKEND_KIND_SERIAL,
4707 .alias = "tty",
4708 .parse = qemu_chr_parse_serial,
4709 .create = qmp_chardev_open_serial,
4710#ifdef _WIN32
4711 .chr_write = win_chr_write,
4712 .chr_free = win_chr_free,
4713#else
4714 .chr_add_watch = fd_chr_add_watch,
4715 .chr_write = fd_chr_write,
4716 .chr_update_read_handler = fd_chr_update_read_handler,
4717 .chr_ioctl = tty_serial_ioctl,
4718 .chr_free = qemu_chr_free_tty,
4719#endif
4720};
4721#endif
4722
5dd1f02b
CM
4723static gboolean socket_reconnect_timeout(gpointer opaque)
4724{
4725 CharDriverState *chr = opaque;
4726 TCPCharDriver *s = chr->opaque;
317856ca 4727 QIOChannelSocket *sioc;
5dd1f02b
CM
4728
4729 s->reconnect_timer = 0;
4730
4731 if (chr->be_open) {
4732 return false;
4733 }
4734
317856ca 4735 sioc = qio_channel_socket_new();
e93a68e1 4736 tcp_chr_set_client_ioc_name(chr, sioc);
317856ca
DB
4737 qio_channel_socket_connect_async(sioc, s->addr,
4738 qemu_chr_socket_connected,
4739 chr, NULL);
5dd1f02b
CM
4740
4741 return false;
4742}
4743
b68e956a
MAL
4744static CharDriverState *qmp_chardev_open_socket(const CharDriver *driver,
4745 const char *id,
dbba8d1b
PB
4746 ChardevBackend *backend,
4747 ChardevReturn *ret,
82878dac 4748 bool *be_opened,
f6bd5d6e
GH
4749 Error **errp)
4750{
43ded1a0
CM
4751 CharDriverState *chr;
4752 TCPCharDriver *s;
32bafa8f 4753 ChardevSocket *sock = backend->u.socket.data;
f6bd5d6e
GH
4754 SocketAddress *addr = sock->addr;
4755 bool do_nodelay = sock->has_nodelay ? sock->nodelay : false;
4756 bool is_listen = sock->has_server ? sock->server : true;
4757 bool is_telnet = sock->has_telnet ? sock->telnet : false;
4758 bool is_waitconnect = sock->has_wait ? sock->wait : false;
5dd1f02b 4759 int64_t reconnect = sock->has_reconnect ? sock->reconnect : 0;
f194a1ae 4760 ChardevCommon *common = qapi_ChardevSocket_base(sock);
317856ca 4761 QIOChannelSocket *sioc = NULL;
43ded1a0 4762
b68e956a 4763 chr = qemu_chr_alloc(driver, common, errp);
d0d7708b
DB
4764 if (!chr) {
4765 return NULL;
4766 }
2d528d45 4767 s = g_new0(TCPCharDriver, 1);
43ded1a0 4768
130257dc 4769 s->is_unix = addr->type == SOCKET_ADDRESS_KIND_UNIX;
cfb429cb
CM
4770 s->is_listen = is_listen;
4771 s->is_telnet = is_telnet;
43ded1a0 4772 s->do_nodelay = do_nodelay;
a8fb5427
DB
4773 if (sock->tls_creds) {
4774 Object *creds;
4775 creds = object_resolve_path_component(
4776 object_get_objects_root(), sock->tls_creds);
4777 if (!creds) {
4778 error_setg(errp, "No TLS credentials with id '%s'",
4779 sock->tls_creds);
4780 goto error;
4781 }
4782 s->tls_creds = (QCryptoTLSCreds *)
4783 object_dynamic_cast(creds,
4784 TYPE_QCRYPTO_TLS_CREDS);
4785 if (!s->tls_creds) {
4786 error_setg(errp, "Object with id '%s' is not TLS credentials",
4787 sock->tls_creds);
4788 goto error;
4789 }
4790 object_ref(OBJECT(s->tls_creds));
4791 if (is_listen) {
4792 if (s->tls_creds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_SERVER) {
4793 error_setg(errp, "%s",
4794 "Expected TLS credentials for server endpoint");
4795 goto error;
4796 }
4797 } else {
4798 if (s->tls_creds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_CLIENT) {
4799 error_setg(errp, "%s",
4800 "Expected TLS credentials for client endpoint");
4801 goto error;
4802 }
4803 }
4804 }
4805
37f9e0a2 4806 s->addr = QAPI_CLONE(SocketAddress, sock->addr);
43ded1a0 4807
0a73336d
DB
4808 qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE);
4809 if (s->is_unix) {
4810 qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS);
4811 }
4812
43ded1a0 4813 chr->opaque = s;
43ded1a0 4814 /* be isn't opened until we get a connection */
82878dac 4815 *be_opened = false;
43ded1a0 4816
0ff0fad2
DB
4817 chr->filename = SocketAddress_to_str("disconnected:",
4818 addr, is_listen, is_telnet);
f6bd5d6e
GH
4819
4820 if (is_listen) {
43ded1a0
CM
4821 if (is_telnet) {
4822 s->do_telnetopt = 1;
4823 }
5dd1f02b
CM
4824 } else if (reconnect > 0) {
4825 s->reconnect_time = reconnect;
f6bd5d6e 4826 }
43ded1a0 4827
5008e5b7 4828 if (s->reconnect_time) {
d7a04fd7 4829 sioc = qio_channel_socket_new();
e93a68e1 4830 tcp_chr_set_client_ioc_name(chr, sioc);
317856ca
DB
4831 qio_channel_socket_connect_async(sioc, s->addr,
4832 qemu_chr_socket_connected,
4833 chr, NULL);
08b758b4 4834 } else {
d7a04fd7 4835 if (s->is_listen) {
e93a68e1 4836 char *name;
d7a04fd7 4837 sioc = qio_channel_socket_new();
e93a68e1
DB
4838
4839 name = g_strdup_printf("chardev-tcp-listener-%s", chr->label);
4840 qio_channel_set_name(QIO_CHANNEL(sioc), name);
4841 g_free(name);
4842
d7a04fd7
MAL
4843 if (qio_channel_socket_listen_sync(sioc, s->addr, errp) < 0) {
4844 goto error;
4845 }
4846 s->listen_ioc = sioc;
4847 if (is_waitconnect &&
4848 qemu_chr_wait_connected(chr, errp) < 0) {
4849 goto error;
4850 }
4851 if (!s->ioc) {
4852 s->listen_tag = qio_channel_add_watch(
4853 QIO_CHANNEL(s->listen_ioc), G_IO_IN,
4854 tcp_chr_accept, chr, NULL);
4855 }
4856 } else if (qemu_chr_wait_connected(chr, errp) < 0) {
08b758b4
DB
4857 goto error;
4858 }
43ded1a0
CM
4859 }
4860
4861 return chr;
a8fb5427
DB
4862
4863 error:
08b758b4
DB
4864 if (sioc) {
4865 object_unref(OBJECT(sioc));
4866 }
a8fb5427
DB
4867 if (s->tls_creds) {
4868 object_unref(OBJECT(s->tls_creds));
4869 }
4870 g_free(s);
4871 qemu_chr_free_common(chr);
4872 return NULL;
f6bd5d6e
GH
4873}
4874
b68e956a
MAL
4875static const CharDriver socket_driver = {
4876 .kind = CHARDEV_BACKEND_KIND_SOCKET,
4877 .parse = qemu_chr_parse_socket,
4878 .create = qmp_chardev_open_socket,
4879 .chr_wait_connected = tcp_chr_wait_connected,
4880 .chr_write = tcp_chr_write,
4881 .chr_sync_read = tcp_chr_sync_read,
4882 .chr_disconnect = tcp_chr_disconnect,
4883 .get_msgfds = tcp_get_msgfds,
4884 .set_msgfds = tcp_set_msgfds,
4885 .chr_add_client = tcp_chr_add_client,
4886 .chr_add_watch = tcp_chr_add_watch,
4887 .chr_update_read_handler = tcp_chr_update_read_handler,
4888 .chr_free = tcp_chr_free,
4889};
4890
4891static CharDriverState *qmp_chardev_open_udp(const CharDriver *driver,
4892 const char *id,
e79b80da
PB
4893 ChardevBackend *backend,
4894 ChardevReturn *ret,
82878dac 4895 bool *be_opened,
08d0ab3f 4896 Error **errp)
3ecc059d 4897{
32bafa8f 4898 ChardevUdp *udp = backend->u.udp.data;
f194a1ae 4899 ChardevCommon *common = qapi_ChardevUdp_base(udp);
9894dc0c 4900 QIOChannelSocket *sioc = qio_channel_socket_new();
e93a68e1
DB
4901 char *name;
4902 CharDriverState *chr;
acbfbe4a 4903 NetCharDriver *s;
3ecc059d 4904
9894dc0c 4905 if (qio_channel_socket_dgram_sync(sioc,
150dcd1a 4906 udp->local, udp->remote,
9894dc0c
DB
4907 errp) < 0) {
4908 object_unref(OBJECT(sioc));
3ecc059d
GH
4909 return NULL;
4910 }
b68e956a 4911
acbfbe4a
MAL
4912 chr = qemu_chr_alloc(driver, common, errp);
4913 if (!chr) {
4914 return NULL;
4915 }
e93a68e1
DB
4916
4917 name = g_strdup_printf("chardev-udp-%s", chr->label);
4918 qio_channel_set_name(QIO_CHANNEL(sioc), name);
4919 g_free(name);
4920
acbfbe4a
MAL
4921 s = g_new0(NetCharDriver, 1);
4922 s->ioc = QIO_CHANNEL(sioc);
4923 chr->opaque = s;
4924 /* be isn't opened until we get a connection */
4925 *be_opened = false;
4926
e93a68e1 4927 return chr;
3ecc059d
GH
4928}
4929
b68e956a
MAL
4930static const CharDriver udp_driver = {
4931 .kind = CHARDEV_BACKEND_KIND_UDP,
4932 .parse = qemu_chr_parse_udp,
4933 .create = qmp_chardev_open_udp,
4934 .chr_write = udp_chr_write,
4935 .chr_update_read_handler = udp_chr_update_read_handler,
4936 .chr_free = udp_chr_free,
4937};
0a73336d
DB
4938
4939bool qemu_chr_has_feature(CharDriverState *chr,
4940 CharDriverFeature feature)
4941{
4942 return test_bit(feature, chr->features);
4943}
4944
4945void qemu_chr_set_feature(CharDriverState *chr,
4946 CharDriverFeature feature)
4947{
4948 return set_bit(feature, chr->features);
4949}
4950
f1a1a356
GH
4951ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
4952 Error **errp)
4953{
4954 ChardevReturn *ret = g_new0(ChardevReturn, 1);
3c0e5a4a 4955 CharDriverState *chr = NULL;
a1698bf1 4956 const CharDriver *cd;
eaeba653 4957 Error *local_err = NULL;
82878dac 4958 bool be_opened = true;
f1a1a356
GH
4959
4960 chr = qemu_chr_find(id);
4961 if (chr) {
4962 error_setg(errp, "Chardev '%s' already exists", id);
ebf4c54d 4963 goto out_error;
f1a1a356
GH
4964 }
4965
a1698bf1
MAL
4966 cd = (int)backend->type >= 0 && backend->type < ARRAY_SIZE(backends) ?
4967 backends[backend->type] : NULL;
4968 if (cd == NULL) {
4969 error_setg(errp, "chardev backend not available");
4970 goto out_error;
4ca17281
PB
4971 }
4972
b68e956a 4973 chr = cd->create(cd, id, backend, ret, &be_opened, &local_err);
a1698bf1
MAL
4974 if (local_err) {
4975 error_propagate(errp, local_err);
1c3af0f4 4976 goto out_error;
eaeba653
PB
4977 }
4978
4979 chr->label = g_strdup(id);
eaeba653 4980 if (!chr->filename) {
130257dc 4981 chr->filename = g_strdup(ChardevBackendKind_lookup[backend->type]);
f1a1a356 4982 }
82878dac 4983 if (be_opened) {
eaeba653
PB
4984 qemu_chr_be_event(chr, CHR_EVENT_OPENED);
4985 }
4986 QTAILQ_INSERT_TAIL(&chardevs, chr, next);
4987 return ret;
4988
4989out_error:
4990 g_free(ret);
4991 return NULL;
f1a1a356
GH
4992}
4993
4994void qmp_chardev_remove(const char *id, Error **errp)
4995{
4996 CharDriverState *chr;
4997
4998 chr = qemu_chr_find(id);
8108fd3e 4999 if (chr == NULL) {
f1a1a356
GH
5000 error_setg(errp, "Chardev '%s' not found", id);
5001 return;
5002 }
a4afa548 5003 if (qemu_chr_is_busy(chr)) {
f1a1a356
GH
5004 error_setg(errp, "Chardev '%s' is busy", id);
5005 return;
5006 }
5ebd6703 5007 if (qemu_chr_replay(chr)) {
33577b47
PD
5008 error_setg(errp,
5009 "Chardev '%s' cannot be unplugged in record/replay mode", id);
5010 return;
5011 }
f1a1a356
GH
5012 qemu_chr_delete(chr);
5013}
d654f34e 5014
aa5cb7f5 5015void qemu_chr_cleanup(void)
c1111a24
MAL
5016{
5017 CharDriverState *chr, *tmp;
5018
5019 QTAILQ_FOREACH_SAFE(chr, &chardevs, next, tmp) {
5020 qemu_chr_delete(chr);
5021 }
5022}
5023
d654f34e
AL
5024static void register_types(void)
5025{
b68e956a
MAL
5026 static const CharDriver *drivers[] = {
5027 &null_driver,
5028 &socket_driver,
5029 &udp_driver,
5030 &ringbuf_driver,
5031 &file_driver,
5032 &stdio_driver,
5033#ifdef HAVE_CHARDEV_SERIAL
5034 &serial_driver,
6511d396 5035#endif
38bfb1a6 5036#ifdef HAVE_CHARDEV_PARPORT
b68e956a 5037 &parallel_driver,
38bfb1a6 5038#endif
c2e75a43 5039#ifdef HAVE_CHARDEV_PTY
b68e956a 5040 &pty_driver,
c2e75a43 5041#endif
122e5ed4 5042#ifdef _WIN32
b68e956a 5043 &console_driver,
122e5ed4 5044#endif
b68e956a
MAL
5045 &pipe_driver,
5046 &mux_driver,
5047 &memory_driver
0b812f31 5048 };
b68e956a 5049 int i;
0b812f31
MAL
5050
5051 for (i = 0; i < ARRAY_SIZE(drivers); i++) {
b68e956a 5052 register_char_driver(drivers[i]);
0b812f31
MAL
5053 }
5054
7b7ab18d
MR
5055 /* this must be done after machine init, since we register FEs with muxes
5056 * as part of realize functions like serial_isa_realizefn when -nographic
5057 * is specified
5058 */
5059 qemu_add_machine_init_done_notifier(&muxes_realize_notify);
d654f34e
AL
5060}
5061
5062type_init(register_types);