xref: /openbmc/qemu/chardev/char-socket.c (revision 9af2398977a78d37bf184d6ff6bd04c72bfbf006)
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  */
24 
25 #include "qemu/osdep.h"
26 #include "chardev/char.h"
27 #include "io/channel-socket.h"
28 #include "io/channel-tls.h"
29 #include "io/net-listener.h"
30 #include "qemu/error-report.h"
31 #include "qemu/option.h"
32 #include "qapi/error.h"
33 #include "qapi/clone-visitor.h"
34 #include "qapi/qapi-visit-sockets.h"
35 
36 #include "chardev/char-io.h"
37 
38 /***********************************************************/
39 /* TCP Net console */
40 
41 #define TCP_MAX_FDS 16
42 
43 typedef struct {
44     Chardev parent;
45     QIOChannel *ioc; /* Client I/O channel */
46     QIOChannelSocket *sioc; /* Client master channel */
47     QIONetListener *listener;
48     GSource *hup_source;
49     QCryptoTLSCreds *tls_creds;
50     int connected;
51     int max_size;
52     int do_telnetopt;
53     int do_nodelay;
54     int *read_msgfds;
55     size_t read_msgfds_num;
56     int *write_msgfds;
57     size_t write_msgfds_num;
58 
59     SocketAddress *addr;
60     bool is_listen;
61     bool is_telnet;
62     bool is_tn3270;
63 
64     GSource *reconnect_timer;
65     int64_t reconnect_time;
66     bool connect_err_reported;
67 } SocketChardev;
68 
69 #define SOCKET_CHARDEV(obj)                                     \
70     OBJECT_CHECK(SocketChardev, (obj), TYPE_CHARDEV_SOCKET)
71 
72 static gboolean socket_reconnect_timeout(gpointer opaque);
73 
74 static void tcp_chr_reconn_timer_cancel(SocketChardev *s)
75 {
76     if (s->reconnect_timer) {
77         g_source_destroy(s->reconnect_timer);
78         g_source_unref(s->reconnect_timer);
79         s->reconnect_timer = NULL;
80     }
81 }
82 
83 static void qemu_chr_socket_restart_timer(Chardev *chr)
84 {
85     SocketChardev *s = SOCKET_CHARDEV(chr);
86     char *name;
87 
88     assert(s->connected == 0);
89     name = g_strdup_printf("chardev-socket-reconnect-%s", chr->label);
90     s->reconnect_timer = qemu_chr_timeout_add_ms(chr,
91                                                  s->reconnect_time * 1000,
92                                                  socket_reconnect_timeout,
93                                                  chr);
94     g_source_set_name(s->reconnect_timer, name);
95     g_free(name);
96 }
97 
98 static void check_report_connect_error(Chardev *chr,
99                                        Error *err)
100 {
101     SocketChardev *s = SOCKET_CHARDEV(chr);
102 
103     if (!s->connect_err_reported) {
104         error_report("Unable to connect character device %s: %s",
105                      chr->label, error_get_pretty(err));
106         s->connect_err_reported = true;
107     }
108     qemu_chr_socket_restart_timer(chr);
109 }
110 
111 static void tcp_chr_accept(QIONetListener *listener,
112                            QIOChannelSocket *cioc,
113                            void *opaque);
114 
115 static int tcp_chr_read_poll(void *opaque);
116 static void tcp_chr_disconnect(Chardev *chr);
117 
118 /* Called with chr_write_lock held.  */
119 static int tcp_chr_write(Chardev *chr, const uint8_t *buf, int len)
120 {
121     SocketChardev *s = SOCKET_CHARDEV(chr);
122 
123     if (s->connected) {
124         int ret =  io_channel_send_full(s->ioc, buf, len,
125                                         s->write_msgfds,
126                                         s->write_msgfds_num);
127 
128         /* free the written msgfds, no matter what */
129         if (s->write_msgfds_num) {
130             g_free(s->write_msgfds);
131             s->write_msgfds = 0;
132             s->write_msgfds_num = 0;
133         }
134 
135         if (ret < 0 && errno != EAGAIN) {
136             if (tcp_chr_read_poll(chr) <= 0) {
137                 tcp_chr_disconnect(chr);
138                 return len;
139             } /* else let the read handler finish it properly */
140         }
141 
142         return ret;
143     } else {
144         /* XXX: indicate an error ? */
145         return len;
146     }
147 }
148 
149 static int tcp_chr_read_poll(void *opaque)
150 {
151     Chardev *chr = CHARDEV(opaque);
152     SocketChardev *s = SOCKET_CHARDEV(opaque);
153     if (!s->connected) {
154         return 0;
155     }
156     s->max_size = qemu_chr_be_can_write(chr);
157     return s->max_size;
158 }
159 
160 static void tcp_chr_process_IAC_bytes(Chardev *chr,
161                                       SocketChardev *s,
162                                       uint8_t *buf, int *size)
163 {
164     /* Handle any telnet or tn3270 client's basic IAC options.
165      * For telnet options, it satisfies char by char mode with no echo.
166      * For tn3270 options, it satisfies binary mode with EOR.
167      * All IAC options will be removed from the buf and the do_opt
168      * pointer will be used to track the state of the width of the
169      * IAC information.
170      *
171      * RFC854: "All TELNET commands consist of at least a two byte sequence.
172      * The commands dealing with option negotiation are three byte sequences,
173      * the third byte being the code for the option referenced."
174      * "IAC BREAK", "IAC IP", "IAC NOP" and the double IAC are two bytes.
175      * "IAC SB", "IAC SE" and "IAC EOR" are saved to split up data boundary
176      * for tn3270.
177      * NOP, Break and Interrupt Process(IP) might be encountered during a TN3270
178      * session, and NOP and IP need to be done later.
179      */
180 
181     int i;
182     int j = 0;
183 
184     for (i = 0; i < *size; i++) {
185         if (s->do_telnetopt > 1) {
186             if ((unsigned char)buf[i] == IAC && s->do_telnetopt == 2) {
187                 /* Double IAC means send an IAC */
188                 if (j != i) {
189                     buf[j] = buf[i];
190                 }
191                 j++;
192                 s->do_telnetopt = 1;
193             } else {
194                 if ((unsigned char)buf[i] == IAC_BREAK
195                     && s->do_telnetopt == 2) {
196                     /* Handle IAC break commands by sending a serial break */
197                     qemu_chr_be_event(chr, CHR_EVENT_BREAK);
198                     s->do_telnetopt++;
199                 } else if (s->is_tn3270 && ((unsigned char)buf[i] == IAC_EOR
200                            || (unsigned char)buf[i] == IAC_SB
201                            || (unsigned char)buf[i] == IAC_SE)
202                            && s->do_telnetopt == 2) {
203                     buf[j++] = IAC;
204                     buf[j++] = buf[i];
205                     s->do_telnetopt++;
206                 } else if (s->is_tn3270 && ((unsigned char)buf[i] == IAC_IP
207                            || (unsigned char)buf[i] == IAC_NOP)
208                            && s->do_telnetopt == 2) {
209                     /* TODO: IP and NOP need to be implemented later. */
210                     s->do_telnetopt++;
211                 }
212                 s->do_telnetopt++;
213             }
214             if (s->do_telnetopt >= 4) {
215                 s->do_telnetopt = 1;
216             }
217         } else {
218             if ((unsigned char)buf[i] == IAC) {
219                 s->do_telnetopt = 2;
220             } else {
221                 if (j != i) {
222                     buf[j] = buf[i];
223                 }
224                 j++;
225             }
226         }
227     }
228     *size = j;
229 }
230 
231 static int tcp_get_msgfds(Chardev *chr, int *fds, int num)
232 {
233     SocketChardev *s = SOCKET_CHARDEV(chr);
234 
235     int to_copy = (s->read_msgfds_num < num) ? s->read_msgfds_num : num;
236 
237     assert(num <= TCP_MAX_FDS);
238 
239     if (to_copy) {
240         int i;
241 
242         memcpy(fds, s->read_msgfds, to_copy * sizeof(int));
243 
244         /* Close unused fds */
245         for (i = to_copy; i < s->read_msgfds_num; i++) {
246             close(s->read_msgfds[i]);
247         }
248 
249         g_free(s->read_msgfds);
250         s->read_msgfds = 0;
251         s->read_msgfds_num = 0;
252     }
253 
254     return to_copy;
255 }
256 
257 static int tcp_set_msgfds(Chardev *chr, int *fds, int num)
258 {
259     SocketChardev *s = SOCKET_CHARDEV(chr);
260 
261     /* clear old pending fd array */
262     g_free(s->write_msgfds);
263     s->write_msgfds = NULL;
264     s->write_msgfds_num = 0;
265 
266     if (!s->connected ||
267         !qio_channel_has_feature(s->ioc,
268                                  QIO_CHANNEL_FEATURE_FD_PASS)) {
269         return -1;
270     }
271 
272     if (num) {
273         s->write_msgfds = g_new(int, num);
274         memcpy(s->write_msgfds, fds, num * sizeof(int));
275     }
276 
277     s->write_msgfds_num = num;
278 
279     return 0;
280 }
281 
282 static ssize_t tcp_chr_recv(Chardev *chr, char *buf, size_t len)
283 {
284     SocketChardev *s = SOCKET_CHARDEV(chr);
285     struct iovec iov = { .iov_base = buf, .iov_len = len };
286     int ret;
287     size_t i;
288     int *msgfds = NULL;
289     size_t msgfds_num = 0;
290 
291     if (qio_channel_has_feature(s->ioc, QIO_CHANNEL_FEATURE_FD_PASS)) {
292         ret = qio_channel_readv_full(s->ioc, &iov, 1,
293                                      &msgfds, &msgfds_num,
294                                      NULL);
295     } else {
296         ret = qio_channel_readv_full(s->ioc, &iov, 1,
297                                      NULL, NULL,
298                                      NULL);
299     }
300 
301     if (ret == QIO_CHANNEL_ERR_BLOCK) {
302         errno = EAGAIN;
303         ret = -1;
304     } else if (ret == -1) {
305         errno = EIO;
306     }
307 
308     if (msgfds_num) {
309         /* close and clean read_msgfds */
310         for (i = 0; i < s->read_msgfds_num; i++) {
311             close(s->read_msgfds[i]);
312         }
313 
314         if (s->read_msgfds_num) {
315             g_free(s->read_msgfds);
316         }
317 
318         s->read_msgfds = msgfds;
319         s->read_msgfds_num = msgfds_num;
320     }
321 
322     for (i = 0; i < s->read_msgfds_num; i++) {
323         int fd = s->read_msgfds[i];
324         if (fd < 0) {
325             continue;
326         }
327 
328         /* O_NONBLOCK is preserved across SCM_RIGHTS so reset it */
329         qemu_set_block(fd);
330 
331 #ifndef MSG_CMSG_CLOEXEC
332         qemu_set_cloexec(fd);
333 #endif
334     }
335 
336     return ret;
337 }
338 
339 static GSource *tcp_chr_add_watch(Chardev *chr, GIOCondition cond)
340 {
341     SocketChardev *s = SOCKET_CHARDEV(chr);
342     return qio_channel_create_watch(s->ioc, cond);
343 }
344 
345 static void tcp_chr_free_connection(Chardev *chr)
346 {
347     SocketChardev *s = SOCKET_CHARDEV(chr);
348     int i;
349 
350     if (s->read_msgfds_num) {
351         for (i = 0; i < s->read_msgfds_num; i++) {
352             close(s->read_msgfds[i]);
353         }
354         g_free(s->read_msgfds);
355         s->read_msgfds = NULL;
356         s->read_msgfds_num = 0;
357     }
358 
359     if (s->hup_source != NULL) {
360         g_source_destroy(s->hup_source);
361         g_source_unref(s->hup_source);
362         s->hup_source = NULL;
363     }
364 
365     tcp_set_msgfds(chr, NULL, 0);
366     remove_fd_in_watch(chr);
367     object_unref(OBJECT(s->sioc));
368     s->sioc = NULL;
369     object_unref(OBJECT(s->ioc));
370     s->ioc = NULL;
371     g_free(chr->filename);
372     chr->filename = NULL;
373     s->connected = 0;
374 }
375 
376 static char *SocketAddress_to_str(const char *prefix, SocketAddress *addr,
377                                   bool is_listen, bool is_telnet)
378 {
379     switch (addr->type) {
380     case SOCKET_ADDRESS_TYPE_INET:
381         return g_strdup_printf("%s%s:%s:%s%s", prefix,
382                                is_telnet ? "telnet" : "tcp",
383                                addr->u.inet.host,
384                                addr->u.inet.port,
385                                is_listen ? ",server" : "");
386         break;
387     case SOCKET_ADDRESS_TYPE_UNIX:
388         return g_strdup_printf("%sunix:%s%s", prefix,
389                                addr->u.q_unix.path,
390                                is_listen ? ",server" : "");
391         break;
392     case SOCKET_ADDRESS_TYPE_FD:
393         return g_strdup_printf("%sfd:%s%s", prefix, addr->u.fd.str,
394                                is_listen ? ",server" : "");
395         break;
396     case SOCKET_ADDRESS_TYPE_VSOCK:
397         return g_strdup_printf("%svsock:%s:%s", prefix,
398                                addr->u.vsock.cid,
399                                addr->u.vsock.port);
400     default:
401         abort();
402     }
403 }
404 
405 static void update_disconnected_filename(SocketChardev *s)
406 {
407     Chardev *chr = CHARDEV(s);
408 
409     g_free(chr->filename);
410     chr->filename = SocketAddress_to_str("disconnected:", s->addr,
411                                          s->is_listen, s->is_telnet);
412 }
413 
414 /* NB may be called even if tcp_chr_connect has not been
415  * reached, due to TLS or telnet initialization failure,
416  * so can *not* assume s->connected == true
417  */
418 static void tcp_chr_disconnect(Chardev *chr)
419 {
420     SocketChardev *s = SOCKET_CHARDEV(chr);
421     bool emit_close = s->connected;
422 
423     tcp_chr_free_connection(chr);
424 
425     if (s->listener) {
426         qio_net_listener_set_client_func(s->listener, tcp_chr_accept,
427                                          chr, NULL);
428     }
429     update_disconnected_filename(s);
430     if (emit_close) {
431         qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
432     }
433     if (s->reconnect_time) {
434         qemu_chr_socket_restart_timer(chr);
435     }
436 }
437 
438 static gboolean tcp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
439 {
440     Chardev *chr = CHARDEV(opaque);
441     SocketChardev *s = SOCKET_CHARDEV(opaque);
442     uint8_t buf[CHR_READ_BUF_LEN];
443     int len, size;
444 
445     if (!s->connected || s->max_size <= 0) {
446         return TRUE;
447     }
448     len = sizeof(buf);
449     if (len > s->max_size) {
450         len = s->max_size;
451     }
452     size = tcp_chr_recv(chr, (void *)buf, len);
453     if (size == 0 || size == -1) {
454         /* connection closed */
455         tcp_chr_disconnect(chr);
456     } else if (size > 0) {
457         if (s->do_telnetopt) {
458             tcp_chr_process_IAC_bytes(chr, s, buf, &size);
459         }
460         if (size > 0) {
461             qemu_chr_be_write(chr, buf, size);
462         }
463     }
464 
465     return TRUE;
466 }
467 
468 static gboolean tcp_chr_hup(QIOChannel *channel,
469                                GIOCondition cond,
470                                void *opaque)
471 {
472     Chardev *chr = CHARDEV(opaque);
473     tcp_chr_disconnect(chr);
474     return G_SOURCE_REMOVE;
475 }
476 
477 static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len)
478 {
479     SocketChardev *s = SOCKET_CHARDEV(chr);
480     int size;
481 
482     if (!s->connected) {
483         return 0;
484     }
485 
486     qio_channel_set_blocking(s->ioc, true, NULL);
487     size = tcp_chr_recv(chr, (void *) buf, len);
488     qio_channel_set_blocking(s->ioc, false, NULL);
489     if (size == 0) {
490         /* connection closed */
491         tcp_chr_disconnect(chr);
492     }
493 
494     return size;
495 }
496 
497 static char *sockaddr_to_str(struct sockaddr_storage *ss, socklen_t ss_len,
498                              struct sockaddr_storage *ps, socklen_t ps_len,
499                              bool is_listen, bool is_telnet)
500 {
501     char shost[NI_MAXHOST], sserv[NI_MAXSERV];
502     char phost[NI_MAXHOST], pserv[NI_MAXSERV];
503     const char *left = "", *right = "";
504 
505     switch (ss->ss_family) {
506 #ifndef _WIN32
507     case AF_UNIX:
508         return g_strdup_printf("unix:%s%s",
509                                ((struct sockaddr_un *)(ss))->sun_path,
510                                is_listen ? ",server" : "");
511 #endif
512     case AF_INET6:
513         left  = "[";
514         right = "]";
515         /* fall through */
516     case AF_INET:
517         getnameinfo((struct sockaddr *) ss, ss_len, shost, sizeof(shost),
518                     sserv, sizeof(sserv), NI_NUMERICHOST | NI_NUMERICSERV);
519         getnameinfo((struct sockaddr *) ps, ps_len, phost, sizeof(phost),
520                     pserv, sizeof(pserv), NI_NUMERICHOST | NI_NUMERICSERV);
521         return g_strdup_printf("%s:%s%s%s:%s%s <-> %s%s%s:%s",
522                                is_telnet ? "telnet" : "tcp",
523                                left, shost, right, sserv,
524                                is_listen ? ",server" : "",
525                                left, phost, right, pserv);
526 
527     default:
528         return g_strdup_printf("unknown");
529     }
530 }
531 
532 static void tcp_chr_connect(void *opaque)
533 {
534     Chardev *chr = CHARDEV(opaque);
535     SocketChardev *s = SOCKET_CHARDEV(opaque);
536 
537     g_free(chr->filename);
538     chr->filename = sockaddr_to_str(
539         &s->sioc->localAddr, s->sioc->localAddrLen,
540         &s->sioc->remoteAddr, s->sioc->remoteAddrLen,
541         s->is_listen, s->is_telnet);
542 
543     s->connected = 1;
544     if (s->ioc) {
545         chr->gsource = io_add_watch_poll(chr, s->ioc,
546                                            tcp_chr_read_poll,
547                                            tcp_chr_read,
548                                            chr, chr->gcontext);
549     }
550 
551     s->hup_source = qio_channel_create_watch(s->ioc, G_IO_HUP);
552     g_source_set_callback(s->hup_source, (GSourceFunc)tcp_chr_hup,
553                           chr, NULL);
554     g_source_attach(s->hup_source, chr->gcontext);
555 
556     qemu_chr_be_event(chr, CHR_EVENT_OPENED);
557 }
558 
559 static void tcp_chr_update_read_handler(Chardev *chr)
560 {
561     SocketChardev *s = SOCKET_CHARDEV(chr);
562 
563     if (!s->connected) {
564         return;
565     }
566 
567     remove_fd_in_watch(chr);
568     if (s->ioc) {
569         chr->gsource = io_add_watch_poll(chr, s->ioc,
570                                            tcp_chr_read_poll,
571                                            tcp_chr_read, chr,
572                                            chr->gcontext);
573     }
574 }
575 
576 typedef struct {
577     Chardev *chr;
578     char buf[21];
579     size_t buflen;
580 } TCPChardevTelnetInit;
581 
582 static gboolean tcp_chr_telnet_init_io(QIOChannel *ioc,
583                                        GIOCondition cond G_GNUC_UNUSED,
584                                        gpointer user_data)
585 {
586     TCPChardevTelnetInit *init = user_data;
587     ssize_t ret;
588 
589     ret = qio_channel_write(ioc, init->buf, init->buflen, NULL);
590     if (ret < 0) {
591         if (ret == QIO_CHANNEL_ERR_BLOCK) {
592             ret = 0;
593         } else {
594             tcp_chr_disconnect(init->chr);
595             return FALSE;
596         }
597     }
598     init->buflen -= ret;
599 
600     if (init->buflen == 0) {
601         tcp_chr_connect(init->chr);
602         return FALSE;
603     }
604 
605     memmove(init->buf, init->buf + ret, init->buflen);
606 
607     return TRUE;
608 }
609 
610 static void tcp_chr_telnet_init(Chardev *chr)
611 {
612     SocketChardev *s = SOCKET_CHARDEV(chr);
613     TCPChardevTelnetInit *init = g_new0(TCPChardevTelnetInit, 1);
614     size_t n = 0;
615 
616 #define IACSET(x, a, b, c)                      \
617     do {                                        \
618         x[n++] = a;                             \
619         x[n++] = b;                             \
620         x[n++] = c;                             \
621     } while (0)
622 
623     init->chr = chr;
624     if (!s->is_tn3270) {
625         init->buflen = 12;
626         /* Prep the telnet negotion to put telnet in binary,
627          * no echo, single char mode */
628         IACSET(init->buf, 0xff, 0xfb, 0x01);  /* IAC WILL ECHO */
629         IACSET(init->buf, 0xff, 0xfb, 0x03);  /* IAC WILL Suppress go ahead */
630         IACSET(init->buf, 0xff, 0xfb, 0x00);  /* IAC WILL Binary */
631         IACSET(init->buf, 0xff, 0xfd, 0x00);  /* IAC DO Binary */
632     } else {
633         init->buflen = 21;
634         /* Prep the TN3270 negotion based on RFC1576 */
635         IACSET(init->buf, 0xff, 0xfd, 0x19);  /* IAC DO EOR */
636         IACSET(init->buf, 0xff, 0xfb, 0x19);  /* IAC WILL EOR */
637         IACSET(init->buf, 0xff, 0xfd, 0x00);  /* IAC DO BINARY */
638         IACSET(init->buf, 0xff, 0xfb, 0x00);  /* IAC WILL BINARY */
639         IACSET(init->buf, 0xff, 0xfd, 0x18);  /* IAC DO TERMINAL TYPE */
640         IACSET(init->buf, 0xff, 0xfa, 0x18);  /* IAC SB TERMINAL TYPE */
641         IACSET(init->buf, 0x01, 0xff, 0xf0);  /* SEND IAC SE */
642     }
643 
644 #undef IACSET
645 
646     qio_channel_add_watch(
647         s->ioc, G_IO_OUT,
648         tcp_chr_telnet_init_io,
649         init, NULL);
650 }
651 
652 
653 static void tcp_chr_tls_handshake(QIOTask *task,
654                                   gpointer user_data)
655 {
656     Chardev *chr = user_data;
657     SocketChardev *s = user_data;
658 
659     if (qio_task_propagate_error(task, NULL)) {
660         tcp_chr_disconnect(chr);
661     } else {
662         /* tn3270 does not support TLS yet */
663         if (s->do_telnetopt && !s->is_tn3270) {
664             tcp_chr_telnet_init(chr);
665         } else {
666             tcp_chr_connect(chr);
667         }
668     }
669 }
670 
671 
672 static void tcp_chr_tls_init(Chardev *chr)
673 {
674     SocketChardev *s = SOCKET_CHARDEV(chr);
675     QIOChannelTLS *tioc;
676     Error *err = NULL;
677     gchar *name;
678 
679     if (s->is_listen) {
680         tioc = qio_channel_tls_new_server(
681             s->ioc, s->tls_creds,
682             NULL, /* XXX Use an ACL */
683             &err);
684     } else {
685         tioc = qio_channel_tls_new_client(
686             s->ioc, s->tls_creds,
687             s->addr->u.inet.host,
688             &err);
689     }
690     if (tioc == NULL) {
691         error_free(err);
692         tcp_chr_disconnect(chr);
693         return;
694     }
695     name = g_strdup_printf("chardev-tls-%s-%s",
696                            s->is_listen ? "server" : "client",
697                            chr->label);
698     qio_channel_set_name(QIO_CHANNEL(tioc), name);
699     g_free(name);
700     object_unref(OBJECT(s->ioc));
701     s->ioc = QIO_CHANNEL(tioc);
702 
703     qio_channel_tls_handshake(tioc,
704                               tcp_chr_tls_handshake,
705                               chr,
706                               NULL);
707 }
708 
709 
710 static void tcp_chr_set_client_ioc_name(Chardev *chr,
711                                         QIOChannelSocket *sioc)
712 {
713     SocketChardev *s = SOCKET_CHARDEV(chr);
714     char *name;
715     name = g_strdup_printf("chardev-tcp-%s-%s",
716                            s->is_listen ? "server" : "client",
717                            chr->label);
718     qio_channel_set_name(QIO_CHANNEL(sioc), name);
719     g_free(name);
720 
721 }
722 
723 static int tcp_chr_new_client(Chardev *chr, QIOChannelSocket *sioc)
724 {
725     SocketChardev *s = SOCKET_CHARDEV(chr);
726 
727     if (s->ioc != NULL) {
728         return -1;
729     }
730 
731     s->ioc = QIO_CHANNEL(sioc);
732     object_ref(OBJECT(sioc));
733     s->sioc = sioc;
734     object_ref(OBJECT(sioc));
735 
736     qio_channel_set_blocking(s->ioc, false, NULL);
737 
738     if (s->do_nodelay) {
739         qio_channel_set_delay(s->ioc, false);
740     }
741     if (s->listener) {
742         qio_net_listener_set_client_func(s->listener, NULL, NULL, NULL);
743     }
744 
745     if (s->tls_creds) {
746         tcp_chr_tls_init(chr);
747     } else {
748         if (s->do_telnetopt) {
749             tcp_chr_telnet_init(chr);
750         } else {
751             tcp_chr_connect(chr);
752         }
753     }
754 
755     return 0;
756 }
757 
758 
759 static int tcp_chr_add_client(Chardev *chr, int fd)
760 {
761     int ret;
762     QIOChannelSocket *sioc;
763 
764     sioc = qio_channel_socket_new_fd(fd, NULL);
765     if (!sioc) {
766         return -1;
767     }
768     tcp_chr_set_client_ioc_name(chr, sioc);
769     ret = tcp_chr_new_client(chr, sioc);
770     object_unref(OBJECT(sioc));
771     return ret;
772 }
773 
774 static void tcp_chr_accept(QIONetListener *listener,
775                            QIOChannelSocket *cioc,
776                            void *opaque)
777 {
778     Chardev *chr = CHARDEV(opaque);
779 
780     tcp_chr_set_client_ioc_name(chr, cioc);
781     tcp_chr_new_client(chr, cioc);
782 }
783 
784 static int tcp_chr_wait_connected(Chardev *chr, Error **errp)
785 {
786     SocketChardev *s = SOCKET_CHARDEV(chr);
787     QIOChannelSocket *sioc;
788 
789     /* It can't wait on s->connected, since it is set asynchronously
790      * in TLS and telnet cases, only wait for an accepted socket */
791     while (!s->ioc) {
792         if (s->is_listen) {
793             info_report("QEMU waiting for connection on: %s",
794                         chr->filename);
795             sioc = qio_net_listener_wait_client(s->listener);
796             tcp_chr_set_client_ioc_name(chr, sioc);
797             tcp_chr_new_client(chr, sioc);
798             object_unref(OBJECT(sioc));
799         } else {
800             sioc = qio_channel_socket_new();
801             tcp_chr_set_client_ioc_name(chr, sioc);
802             if (qio_channel_socket_connect_sync(sioc, s->addr, errp) < 0) {
803                 object_unref(OBJECT(sioc));
804                 return -1;
805             }
806             tcp_chr_new_client(chr, sioc);
807             object_unref(OBJECT(sioc));
808         }
809     }
810 
811     return 0;
812 }
813 
814 static void char_socket_finalize(Object *obj)
815 {
816     Chardev *chr = CHARDEV(obj);
817     SocketChardev *s = SOCKET_CHARDEV(obj);
818 
819     tcp_chr_free_connection(chr);
820     tcp_chr_reconn_timer_cancel(s);
821     qapi_free_SocketAddress(s->addr);
822     if (s->listener) {
823         qio_net_listener_set_client_func(s->listener, NULL, NULL, NULL);
824         object_unref(OBJECT(s->listener));
825     }
826     if (s->tls_creds) {
827         object_unref(OBJECT(s->tls_creds));
828     }
829 
830     qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
831 }
832 
833 static void qemu_chr_socket_connected(QIOTask *task, void *opaque)
834 {
835     QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task));
836     Chardev *chr = CHARDEV(opaque);
837     SocketChardev *s = SOCKET_CHARDEV(chr);
838     Error *err = NULL;
839 
840     if (qio_task_propagate_error(task, &err)) {
841         check_report_connect_error(chr, err);
842         error_free(err);
843         goto cleanup;
844     }
845 
846     s->connect_err_reported = false;
847     tcp_chr_new_client(chr, sioc);
848 
849 cleanup:
850     object_unref(OBJECT(sioc));
851 }
852 
853 static gboolean socket_reconnect_timeout(gpointer opaque)
854 {
855     Chardev *chr = CHARDEV(opaque);
856     SocketChardev *s = SOCKET_CHARDEV(opaque);
857     QIOChannelSocket *sioc;
858 
859     g_source_unref(s->reconnect_timer);
860     s->reconnect_timer = NULL;
861 
862     if (chr->be_open) {
863         return false;
864     }
865 
866     sioc = qio_channel_socket_new();
867     tcp_chr_set_client_ioc_name(chr, sioc);
868     qio_channel_socket_connect_async(sioc, s->addr,
869                                      qemu_chr_socket_connected,
870                                      chr, NULL);
871 
872     return false;
873 }
874 
875 static void qmp_chardev_open_socket(Chardev *chr,
876                                     ChardevBackend *backend,
877                                     bool *be_opened,
878                                     Error **errp)
879 {
880     SocketChardev *s = SOCKET_CHARDEV(chr);
881     ChardevSocket *sock = backend->u.socket.data;
882     bool do_nodelay     = sock->has_nodelay ? sock->nodelay : false;
883     bool is_listen      = sock->has_server  ? sock->server  : true;
884     bool is_telnet      = sock->has_telnet  ? sock->telnet  : false;
885     bool is_tn3270      = sock->has_tn3270  ? sock->tn3270  : false;
886     bool is_waitconnect = sock->has_wait    ? sock->wait    : false;
887     int64_t reconnect   = sock->has_reconnect ? sock->reconnect : 0;
888     QIOChannelSocket *sioc = NULL;
889     SocketAddress *addr;
890 
891     s->is_listen = is_listen;
892     s->is_telnet = is_telnet;
893     s->is_tn3270 = is_tn3270;
894     s->do_nodelay = do_nodelay;
895     if (sock->tls_creds) {
896         Object *creds;
897         creds = object_resolve_path_component(
898             object_get_objects_root(), sock->tls_creds);
899         if (!creds) {
900             error_setg(errp, "No TLS credentials with id '%s'",
901                        sock->tls_creds);
902             goto error;
903         }
904         s->tls_creds = (QCryptoTLSCreds *)
905             object_dynamic_cast(creds,
906                                 TYPE_QCRYPTO_TLS_CREDS);
907         if (!s->tls_creds) {
908             error_setg(errp, "Object with id '%s' is not TLS credentials",
909                        sock->tls_creds);
910             goto error;
911         }
912         object_ref(OBJECT(s->tls_creds));
913         if (is_listen) {
914             if (s->tls_creds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_SERVER) {
915                 error_setg(errp, "%s",
916                            "Expected TLS credentials for server endpoint");
917                 goto error;
918             }
919         } else {
920             if (s->tls_creds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_CLIENT) {
921                 error_setg(errp, "%s",
922                            "Expected TLS credentials for client endpoint");
923                 goto error;
924             }
925         }
926     }
927 
928     s->addr = addr = socket_address_flatten(sock->addr);
929 
930     qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE);
931     /* TODO SOCKET_ADDRESS_FD where fd has AF_UNIX */
932     if (addr->type == SOCKET_ADDRESS_TYPE_UNIX) {
933         qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS);
934     }
935 
936     /* be isn't opened until we get a connection */
937     *be_opened = false;
938 
939     update_disconnected_filename(s);
940 
941     if (is_listen) {
942         if (is_telnet || is_tn3270) {
943             s->do_telnetopt = 1;
944         }
945     } else if (reconnect > 0) {
946         s->reconnect_time = reconnect;
947     }
948 
949     if (s->reconnect_time) {
950         sioc = qio_channel_socket_new();
951         tcp_chr_set_client_ioc_name(chr, sioc);
952         qio_channel_socket_connect_async(sioc, s->addr,
953                                          qemu_chr_socket_connected,
954                                          chr, NULL);
955     } else {
956         if (s->is_listen) {
957             char *name;
958             s->listener = qio_net_listener_new();
959 
960             name = g_strdup_printf("chardev-tcp-listener-%s", chr->label);
961             qio_net_listener_set_name(s->listener, name);
962             g_free(name);
963 
964             if (qio_net_listener_open_sync(s->listener, s->addr, errp) < 0) {
965                 object_unref(OBJECT(s->listener));
966                 s->listener = NULL;
967                 goto error;
968             }
969 
970             qapi_free_SocketAddress(s->addr);
971             s->addr = socket_local_address(s->listener->sioc[0]->fd, errp);
972             update_disconnected_filename(s);
973 
974             if (is_waitconnect &&
975                 qemu_chr_wait_connected(chr, errp) < 0) {
976                 return;
977             }
978             if (!s->ioc) {
979                 qio_net_listener_set_client_func(s->listener, tcp_chr_accept,
980                                                  chr, NULL);
981             }
982         } else if (qemu_chr_wait_connected(chr, errp) < 0) {
983             goto error;
984         }
985     }
986 
987     return;
988 
989 error:
990     if (sioc) {
991         object_unref(OBJECT(sioc));
992     }
993 }
994 
995 static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
996                                   Error **errp)
997 {
998     bool is_listen      = qemu_opt_get_bool(opts, "server", false);
999     bool is_waitconnect = is_listen && qemu_opt_get_bool(opts, "wait", true);
1000     bool is_telnet      = qemu_opt_get_bool(opts, "telnet", false);
1001     bool is_tn3270      = qemu_opt_get_bool(opts, "tn3270", false);
1002     bool do_nodelay     = !qemu_opt_get_bool(opts, "delay", true);
1003     int64_t reconnect   = qemu_opt_get_number(opts, "reconnect", 0);
1004     const char *path = qemu_opt_get(opts, "path");
1005     const char *host = qemu_opt_get(opts, "host");
1006     const char *port = qemu_opt_get(opts, "port");
1007     const char *tls_creds = qemu_opt_get(opts, "tls-creds");
1008     SocketAddressLegacy *addr;
1009     ChardevSocket *sock;
1010 
1011     backend->type = CHARDEV_BACKEND_KIND_SOCKET;
1012     if (!path) {
1013         if (!host) {
1014             error_setg(errp, "chardev: socket: no host given");
1015             return;
1016         }
1017         if (!port) {
1018             error_setg(errp, "chardev: socket: no port given");
1019             return;
1020         }
1021     } else {
1022         if (tls_creds) {
1023             error_setg(errp, "TLS can only be used over TCP socket");
1024             return;
1025         }
1026     }
1027 
1028     sock = backend->u.socket.data = g_new0(ChardevSocket, 1);
1029     qemu_chr_parse_common(opts, qapi_ChardevSocket_base(sock));
1030 
1031     sock->has_nodelay = true;
1032     sock->nodelay = do_nodelay;
1033     sock->has_server = true;
1034     sock->server = is_listen;
1035     sock->has_telnet = true;
1036     sock->telnet = is_telnet;
1037     sock->has_tn3270 = true;
1038     sock->tn3270 = is_tn3270;
1039     sock->has_wait = true;
1040     sock->wait = is_waitconnect;
1041     sock->has_reconnect = true;
1042     sock->reconnect = reconnect;
1043     sock->tls_creds = g_strdup(tls_creds);
1044 
1045     addr = g_new0(SocketAddressLegacy, 1);
1046     if (path) {
1047         UnixSocketAddress *q_unix;
1048         addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
1049         q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
1050         q_unix->path = g_strdup(path);
1051     } else {
1052         addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
1053         addr->u.inet.data = g_new(InetSocketAddress, 1);
1054         *addr->u.inet.data = (InetSocketAddress) {
1055             .host = g_strdup(host),
1056             .port = g_strdup(port),
1057             .has_to = qemu_opt_get(opts, "to"),
1058             .to = qemu_opt_get_number(opts, "to", 0),
1059             .has_ipv4 = qemu_opt_get(opts, "ipv4"),
1060             .ipv4 = qemu_opt_get_bool(opts, "ipv4", 0),
1061             .has_ipv6 = qemu_opt_get(opts, "ipv6"),
1062             .ipv6 = qemu_opt_get_bool(opts, "ipv6", 0),
1063         };
1064     }
1065     sock->addr = addr;
1066 }
1067 
1068 static void
1069 char_socket_get_addr(Object *obj, Visitor *v, const char *name,
1070                      void *opaque, Error **errp)
1071 {
1072     SocketChardev *s = SOCKET_CHARDEV(obj);
1073 
1074     visit_type_SocketAddress(v, name, &s->addr, errp);
1075 }
1076 
1077 static bool
1078 char_socket_get_connected(Object *obj, Error **errp)
1079 {
1080     SocketChardev *s = SOCKET_CHARDEV(obj);
1081 
1082     return s->connected;
1083 }
1084 
1085 static void char_socket_class_init(ObjectClass *oc, void *data)
1086 {
1087     ChardevClass *cc = CHARDEV_CLASS(oc);
1088 
1089     cc->parse = qemu_chr_parse_socket;
1090     cc->open = qmp_chardev_open_socket;
1091     cc->chr_wait_connected = tcp_chr_wait_connected;
1092     cc->chr_write = tcp_chr_write;
1093     cc->chr_sync_read = tcp_chr_sync_read;
1094     cc->chr_disconnect = tcp_chr_disconnect;
1095     cc->get_msgfds = tcp_get_msgfds;
1096     cc->set_msgfds = tcp_set_msgfds;
1097     cc->chr_add_client = tcp_chr_add_client;
1098     cc->chr_add_watch = tcp_chr_add_watch;
1099     cc->chr_update_read_handler = tcp_chr_update_read_handler;
1100 
1101     object_class_property_add(oc, "addr", "SocketAddress",
1102                               char_socket_get_addr, NULL,
1103                               NULL, NULL, &error_abort);
1104 
1105     object_class_property_add_bool(oc, "connected", char_socket_get_connected,
1106                                    NULL, &error_abort);
1107 }
1108 
1109 static const TypeInfo char_socket_type_info = {
1110     .name = TYPE_CHARDEV_SOCKET,
1111     .parent = TYPE_CHARDEV,
1112     .instance_size = sizeof(SocketChardev),
1113     .instance_finalize = char_socket_finalize,
1114     .class_init = char_socket_class_init,
1115 };
1116 
1117 static void register_types(void)
1118 {
1119     type_register_static(&char_socket_type_info);
1120 }
1121 
1122 type_init(register_types);
1123