xref: /openbmc/qemu/util/qemu-sockets.c (revision 5b262bb6)
1 /*
2  *  inet and unix socket functions for qemu
3  *
4  *  (c) 2008 Gerd Hoffmann <kraxel@redhat.com>
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; under version 2 of the License.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  * Contributions after 2012-01-13 are licensed under the terms of the
16  * GNU GPL, version 2 or (at your option) any later version.
17  */
18 #include "qemu/osdep.h"
19 
20 #include "monitor/monitor.h"
21 #include "qapi/error.h"
22 #include "qemu/sockets.h"
23 #include "qemu/main-loop.h"
24 #include "qapi/qmp-input-visitor.h"
25 #include "qapi/qmp-output-visitor.h"
26 #include "qapi-visit.h"
27 #include "qemu/cutils.h"
28 
29 #ifndef AI_ADDRCONFIG
30 # define AI_ADDRCONFIG 0
31 #endif
32 
33 #ifndef AI_V4MAPPED
34 # define AI_V4MAPPED 0
35 #endif
36 
37 
38 static int inet_getport(struct addrinfo *e)
39 {
40     struct sockaddr_in *i4;
41     struct sockaddr_in6 *i6;
42 
43     switch (e->ai_family) {
44     case PF_INET6:
45         i6 = (void*)e->ai_addr;
46         return ntohs(i6->sin6_port);
47     case PF_INET:
48         i4 = (void*)e->ai_addr;
49         return ntohs(i4->sin_port);
50     default:
51         return 0;
52     }
53 }
54 
55 static void inet_setport(struct addrinfo *e, int port)
56 {
57     struct sockaddr_in *i4;
58     struct sockaddr_in6 *i6;
59 
60     switch (e->ai_family) {
61     case PF_INET6:
62         i6 = (void*)e->ai_addr;
63         i6->sin6_port = htons(port);
64         break;
65     case PF_INET:
66         i4 = (void*)e->ai_addr;
67         i4->sin_port = htons(port);
68         break;
69     }
70 }
71 
72 NetworkAddressFamily inet_netfamily(int family)
73 {
74     switch (family) {
75     case PF_INET6: return NETWORK_ADDRESS_FAMILY_IPV6;
76     case PF_INET:  return NETWORK_ADDRESS_FAMILY_IPV4;
77     case PF_UNIX:  return NETWORK_ADDRESS_FAMILY_UNIX;
78     }
79     return NETWORK_ADDRESS_FAMILY_UNKNOWN;
80 }
81 
82 /*
83  * Matrix we're trying to apply
84  *
85  *  ipv4  ipv6   family
86  *   -     -       PF_UNSPEC
87  *   -     f       PF_INET
88  *   -     t       PF_INET6
89  *   f     -       PF_INET6
90  *   f     f       <error>
91  *   f     t       PF_INET6
92  *   t     -       PF_INET
93  *   t     f       PF_INET
94  *   t     t       PF_INET6
95  *
96  * NB, this matrix is only about getting the necessary results
97  * from getaddrinfo(). Some of the cases require further work
98  * after reading results from getaddrinfo in order to fully
99  * apply the logic the end user wants. eg with the last case
100  * ipv4=t + ipv6=t + PF_INET6, getaddrinfo alone can only
101  * guarantee the ipv6=t part of the request - we need more
102  * checks to provide ipv4=t part of the guarantee. This is
103  * outside scope of this method and not currently handled by
104  * callers at all.
105  */
106 static int inet_ai_family_from_address(InetSocketAddress *addr,
107                                        Error **errp)
108 {
109     if (addr->has_ipv6 && addr->has_ipv4 &&
110         !addr->ipv6 && !addr->ipv4) {
111         error_setg(errp, "Cannot disable IPv4 and IPv6 at same time");
112         return PF_UNSPEC;
113     }
114     if ((addr->has_ipv6 && addr->ipv6) || (addr->has_ipv4 && !addr->ipv4)) {
115         return PF_INET6;
116     }
117     if ((addr->has_ipv4 && addr->ipv4) || (addr->has_ipv6 && !addr->ipv6)) {
118         return PF_INET;
119     }
120     return PF_UNSPEC;
121 }
122 
123 static int inet_listen_saddr(InetSocketAddress *saddr,
124                              int port_offset,
125                              bool update_addr,
126                              Error **errp)
127 {
128     struct addrinfo ai,*res,*e;
129     char port[33];
130     char uaddr[INET6_ADDRSTRLEN+1];
131     char uport[33];
132     int slisten, rc, port_min, port_max, p;
133     Error *err = NULL;
134 
135     memset(&ai,0, sizeof(ai));
136     ai.ai_flags = AI_PASSIVE;
137     ai.ai_family = inet_ai_family_from_address(saddr, &err);
138     ai.ai_socktype = SOCK_STREAM;
139 
140     if (err) {
141         error_propagate(errp, err);
142         return -1;
143     }
144 
145     if (saddr->host == NULL) {
146         error_setg(errp, "host not specified");
147         return -1;
148     }
149     if (saddr->port != NULL) {
150         pstrcpy(port, sizeof(port), saddr->port);
151     } else {
152         port[0] = '\0';
153     }
154 
155     /* lookup */
156     if (port_offset) {
157         unsigned long long baseport;
158         if (strlen(port) == 0) {
159             error_setg(errp, "port not specified");
160             return -1;
161         }
162         if (parse_uint_full(port, &baseport, 10) < 0) {
163             error_setg(errp, "can't convert to a number: %s", port);
164             return -1;
165         }
166         if (baseport > 65535 ||
167             baseport + port_offset > 65535) {
168             error_setg(errp, "port %s out of range", port);
169             return -1;
170         }
171         snprintf(port, sizeof(port), "%d", (int)baseport + port_offset);
172     }
173     rc = getaddrinfo(strlen(saddr->host) ? saddr->host : NULL,
174                      strlen(port) ? port : NULL, &ai, &res);
175     if (rc != 0) {
176         error_setg(errp, "address resolution failed for %s:%s: %s",
177                    saddr->host, port, gai_strerror(rc));
178         return -1;
179     }
180 
181     /* create socket + bind */
182     for (e = res; e != NULL; e = e->ai_next) {
183         getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen,
184 		        uaddr,INET6_ADDRSTRLEN,uport,32,
185 		        NI_NUMERICHOST | NI_NUMERICSERV);
186         slisten = qemu_socket(e->ai_family, e->ai_socktype, e->ai_protocol);
187         if (slisten < 0) {
188             if (!e->ai_next) {
189                 error_setg_errno(errp, errno, "Failed to create socket");
190             }
191             continue;
192         }
193 
194         socket_set_fast_reuse(slisten);
195 #ifdef IPV6_V6ONLY
196         if (e->ai_family == PF_INET6) {
197             /* listen on both ipv4 and ipv6 */
198             const int off = 0;
199             qemu_setsockopt(slisten, IPPROTO_IPV6, IPV6_V6ONLY, &off,
200                             sizeof(off));
201         }
202 #endif
203 
204         port_min = inet_getport(e);
205         port_max = saddr->has_to ? saddr->to + port_offset : port_min;
206         for (p = port_min; p <= port_max; p++) {
207             inet_setport(e, p);
208             if (bind(slisten, e->ai_addr, e->ai_addrlen) == 0) {
209                 goto listen;
210             }
211             if (p == port_max) {
212                 if (!e->ai_next) {
213                     error_setg_errno(errp, errno, "Failed to bind socket");
214                 }
215             }
216         }
217         closesocket(slisten);
218     }
219     freeaddrinfo(res);
220     return -1;
221 
222 listen:
223     if (listen(slisten,1) != 0) {
224         error_setg_errno(errp, errno, "Failed to listen on socket");
225         closesocket(slisten);
226         freeaddrinfo(res);
227         return -1;
228     }
229     if (update_addr) {
230         g_free(saddr->host);
231         saddr->host = g_strdup(uaddr);
232         g_free(saddr->port);
233         saddr->port = g_strdup_printf("%d",
234                                       inet_getport(e) - port_offset);
235         saddr->has_ipv6 = saddr->ipv6 = e->ai_family == PF_INET6;
236         saddr->has_ipv4 = saddr->ipv4 = e->ai_family != PF_INET6;
237     }
238     freeaddrinfo(res);
239     return slisten;
240 }
241 
242 #ifdef _WIN32
243 #define QEMU_SOCKET_RC_INPROGRESS(rc) \
244     ((rc) == -EINPROGRESS || (rc) == -EWOULDBLOCK || (rc) == -WSAEALREADY)
245 #else
246 #define QEMU_SOCKET_RC_INPROGRESS(rc) \
247     ((rc) == -EINPROGRESS)
248 #endif
249 
250 /* Struct to store connect state for non blocking connect */
251 typedef struct ConnectState {
252     int fd;
253     struct addrinfo *addr_list;
254     struct addrinfo *current_addr;
255     NonBlockingConnectHandler *callback;
256     void *opaque;
257 } ConnectState;
258 
259 static int inet_connect_addr(struct addrinfo *addr, bool *in_progress,
260                              ConnectState *connect_state, Error **errp);
261 
262 static void wait_for_connect(void *opaque)
263 {
264     ConnectState *s = opaque;
265     int val = 0, rc = 0;
266     socklen_t valsize = sizeof(val);
267     bool in_progress;
268     Error *err = NULL;
269 
270     qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
271 
272     do {
273         rc = qemu_getsockopt(s->fd, SOL_SOCKET, SO_ERROR, &val, &valsize);
274     } while (rc == -1 && errno == EINTR);
275 
276     /* update rc to contain error */
277     if (!rc && val) {
278         rc = -1;
279         errno = val;
280     }
281 
282     /* connect error */
283     if (rc < 0) {
284         error_setg_errno(&err, errno, "Error connecting to socket");
285         closesocket(s->fd);
286         s->fd = rc;
287     }
288 
289     /* try to connect to the next address on the list */
290     if (s->current_addr) {
291         while (s->current_addr->ai_next != NULL && s->fd < 0) {
292             s->current_addr = s->current_addr->ai_next;
293             s->fd = inet_connect_addr(s->current_addr, &in_progress, s, NULL);
294             if (s->fd < 0) {
295                 error_free(err);
296                 err = NULL;
297                 error_setg_errno(&err, errno, "Unable to start socket connect");
298             }
299             /* connect in progress */
300             if (in_progress) {
301                 goto out;
302             }
303         }
304 
305         freeaddrinfo(s->addr_list);
306     }
307 
308     if (s->callback) {
309         s->callback(s->fd, err, s->opaque);
310     }
311     g_free(s);
312 out:
313     error_free(err);
314 }
315 
316 static int inet_connect_addr(struct addrinfo *addr, bool *in_progress,
317                              ConnectState *connect_state, Error **errp)
318 {
319     int sock, rc;
320 
321     *in_progress = false;
322 
323     sock = qemu_socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
324     if (sock < 0) {
325         error_setg_errno(errp, errno, "Failed to create socket");
326         return -1;
327     }
328     socket_set_fast_reuse(sock);
329     if (connect_state != NULL) {
330         qemu_set_nonblock(sock);
331     }
332     /* connect to peer */
333     do {
334         rc = 0;
335         if (connect(sock, addr->ai_addr, addr->ai_addrlen) < 0) {
336             rc = -errno;
337         }
338     } while (rc == -EINTR);
339 
340     if (connect_state != NULL && QEMU_SOCKET_RC_INPROGRESS(rc)) {
341         connect_state->fd = sock;
342         qemu_set_fd_handler(sock, NULL, wait_for_connect, connect_state);
343         *in_progress = true;
344     } else if (rc < 0) {
345         error_setg_errno(errp, errno, "Failed to connect socket");
346         closesocket(sock);
347         return -1;
348     }
349     return sock;
350 }
351 
352 static struct addrinfo *inet_parse_connect_saddr(InetSocketAddress *saddr,
353                                                  Error **errp)
354 {
355     struct addrinfo ai, *res;
356     int rc;
357     Error *err = NULL;
358     static int useV4Mapped = 1;
359 
360     memset(&ai, 0, sizeof(ai));
361 
362     ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
363     if (atomic_read(&useV4Mapped)) {
364         ai.ai_flags |= AI_V4MAPPED;
365     }
366     ai.ai_family = inet_ai_family_from_address(saddr, &err);
367     ai.ai_socktype = SOCK_STREAM;
368 
369     if (err) {
370         error_propagate(errp, err);
371         return NULL;
372     }
373 
374     if (saddr->host == NULL || saddr->port == NULL) {
375         error_setg(errp, "host and/or port not specified");
376         return NULL;
377     }
378 
379     /* lookup */
380     rc = getaddrinfo(saddr->host, saddr->port, &ai, &res);
381 
382     /* At least FreeBSD and OS-X 10.6 declare AI_V4MAPPED but
383      * then don't implement it in their getaddrinfo(). Detect
384      * this and retry without the flag since that's preferrable
385      * to a fatal error
386      */
387     if (rc == EAI_BADFLAGS &&
388         (ai.ai_flags & AI_V4MAPPED)) {
389         atomic_set(&useV4Mapped, 0);
390         ai.ai_flags &= ~AI_V4MAPPED;
391         rc = getaddrinfo(saddr->host, saddr->port, &ai, &res);
392     }
393     if (rc != 0) {
394         error_setg(errp, "address resolution failed for %s:%s: %s",
395                    saddr->host, saddr->port, gai_strerror(rc));
396         return NULL;
397     }
398     return res;
399 }
400 
401 /**
402  * Create a socket and connect it to an address.
403  *
404  * @saddr: Inet socket address specification
405  * @errp: set on error
406  * @callback: callback function for non-blocking connect
407  * @opaque: opaque for callback function
408  *
409  * Returns: -1 on error, file descriptor on success.
410  *
411  * If @callback is non-null, the connect is non-blocking.  If this
412  * function succeeds, callback will be called when the connection
413  * completes, with the file descriptor on success, or -1 on error.
414  */
415 static int inet_connect_saddr(InetSocketAddress *saddr, Error **errp,
416                               NonBlockingConnectHandler *callback, void *opaque)
417 {
418     Error *local_err = NULL;
419     struct addrinfo *res, *e;
420     int sock = -1;
421     bool in_progress;
422     ConnectState *connect_state = NULL;
423 
424     res = inet_parse_connect_saddr(saddr, errp);
425     if (!res) {
426         return -1;
427     }
428 
429     if (callback != NULL) {
430         connect_state = g_malloc0(sizeof(*connect_state));
431         connect_state->addr_list = res;
432         connect_state->callback = callback;
433         connect_state->opaque = opaque;
434     }
435 
436     for (e = res; e != NULL; e = e->ai_next) {
437         error_free(local_err);
438         local_err = NULL;
439         if (connect_state != NULL) {
440             connect_state->current_addr = e;
441         }
442         sock = inet_connect_addr(e, &in_progress, connect_state, &local_err);
443         if (sock >= 0) {
444             break;
445         }
446     }
447 
448     if (sock < 0) {
449         error_propagate(errp, local_err);
450     } else if (in_progress) {
451         /* wait_for_connect() will do the rest */
452         return sock;
453     } else {
454         if (callback) {
455             callback(sock, NULL, opaque);
456         }
457     }
458     g_free(connect_state);
459     freeaddrinfo(res);
460     return sock;
461 }
462 
463 static int inet_dgram_saddr(InetSocketAddress *sraddr,
464                             InetSocketAddress *sladdr,
465                             Error **errp)
466 {
467     struct addrinfo ai, *peer = NULL, *local = NULL;
468     const char *addr;
469     const char *port;
470     int sock = -1, rc;
471     Error *err = NULL;
472 
473     /* lookup peer addr */
474     memset(&ai,0, sizeof(ai));
475     ai.ai_flags = AI_CANONNAME | AI_V4MAPPED | AI_ADDRCONFIG;
476     ai.ai_family = inet_ai_family_from_address(sraddr, &err);
477     ai.ai_socktype = SOCK_DGRAM;
478 
479     if (err) {
480         error_propagate(errp, err);
481         goto err;
482     }
483 
484     addr = sraddr->host;
485     port = sraddr->port;
486     if (addr == NULL || strlen(addr) == 0) {
487         addr = "localhost";
488     }
489     if (port == NULL || strlen(port) == 0) {
490         error_setg(errp, "remote port not specified");
491         goto err;
492     }
493 
494     if ((rc = getaddrinfo(addr, port, &ai, &peer)) != 0) {
495         error_setg(errp, "address resolution failed for %s:%s: %s", addr, port,
496                    gai_strerror(rc));
497         goto err;
498     }
499 
500     /* lookup local addr */
501     memset(&ai,0, sizeof(ai));
502     ai.ai_flags = AI_PASSIVE;
503     ai.ai_family = peer->ai_family;
504     ai.ai_socktype = SOCK_DGRAM;
505 
506     if (sladdr) {
507         addr = sladdr->host;
508         port = sladdr->port;
509         if (addr == NULL || strlen(addr) == 0) {
510             addr = NULL;
511         }
512         if (!port || strlen(port) == 0) {
513             port = "0";
514         }
515     } else {
516         addr = NULL;
517         port = "0";
518     }
519 
520     if ((rc = getaddrinfo(addr, port, &ai, &local)) != 0) {
521         error_setg(errp, "address resolution failed for %s:%s: %s", addr, port,
522                    gai_strerror(rc));
523         goto err;
524     }
525 
526     /* create socket */
527     sock = qemu_socket(peer->ai_family, peer->ai_socktype, peer->ai_protocol);
528     if (sock < 0) {
529         error_setg_errno(errp, errno, "Failed to create socket");
530         goto err;
531     }
532     socket_set_fast_reuse(sock);
533 
534     /* bind socket */
535     if (bind(sock, local->ai_addr, local->ai_addrlen) < 0) {
536         error_setg_errno(errp, errno, "Failed to bind socket");
537         goto err;
538     }
539 
540     /* connect to peer */
541     if (connect(sock,peer->ai_addr,peer->ai_addrlen) < 0) {
542         error_setg_errno(errp, errno, "Failed to connect socket");
543         goto err;
544     }
545 
546     freeaddrinfo(local);
547     freeaddrinfo(peer);
548     return sock;
549 
550 err:
551     if (sock != -1) {
552         closesocket(sock);
553     }
554     if (local) {
555         freeaddrinfo(local);
556     }
557     if (peer) {
558         freeaddrinfo(peer);
559     }
560 
561     return -1;
562 }
563 
564 /* compatibility wrapper */
565 InetSocketAddress *inet_parse(const char *str, Error **errp)
566 {
567     InetSocketAddress *addr;
568     const char *optstr, *h;
569     char host[65];
570     char port[33];
571     int to;
572     int pos;
573 
574     addr = g_new0(InetSocketAddress, 1);
575 
576     /* parse address */
577     if (str[0] == ':') {
578         /* no host given */
579         host[0] = '\0';
580         if (sscanf(str, ":%32[^,]%n", port, &pos) != 1) {
581             error_setg(errp, "error parsing port in address '%s'", str);
582             goto fail;
583         }
584     } else if (str[0] == '[') {
585         /* IPv6 addr */
586         if (sscanf(str, "[%64[^]]]:%32[^,]%n", host, port, &pos) != 2) {
587             error_setg(errp, "error parsing IPv6 address '%s'", str);
588             goto fail;
589         }
590         addr->ipv6 = addr->has_ipv6 = true;
591     } else {
592         /* hostname or IPv4 addr */
593         if (sscanf(str, "%64[^:]:%32[^,]%n", host, port, &pos) != 2) {
594             error_setg(errp, "error parsing address '%s'", str);
595             goto fail;
596         }
597         if (host[strspn(host, "0123456789.")] == '\0') {
598             addr->ipv4 = addr->has_ipv4 = true;
599         }
600     }
601 
602     addr->host = g_strdup(host);
603     addr->port = g_strdup(port);
604 
605     /* parse options */
606     optstr = str + pos;
607     h = strstr(optstr, ",to=");
608     if (h) {
609         h += 4;
610         if (sscanf(h, "%d%n", &to, &pos) != 1 ||
611             (h[pos] != '\0' && h[pos] != ',')) {
612             error_setg(errp, "error parsing to= argument");
613             goto fail;
614         }
615         addr->has_to = true;
616         addr->to = to;
617     }
618     if (strstr(optstr, ",ipv4")) {
619         addr->ipv4 = addr->has_ipv4 = true;
620     }
621     if (strstr(optstr, ",ipv6")) {
622         addr->ipv6 = addr->has_ipv6 = true;
623     }
624     return addr;
625 
626 fail:
627     qapi_free_InetSocketAddress(addr);
628     return NULL;
629 }
630 
631 
632 /**
633  * Create a blocking socket and connect it to an address.
634  *
635  * @str: address string
636  * @errp: set in case of an error
637  *
638  * Returns -1 in case of error, file descriptor on success
639  **/
640 int inet_connect(const char *str, Error **errp)
641 {
642     int sock = -1;
643     InetSocketAddress *addr;
644 
645     addr = inet_parse(str, errp);
646     if (addr != NULL) {
647         sock = inet_connect_saddr(addr, errp, NULL, NULL);
648         qapi_free_InetSocketAddress(addr);
649     }
650     return sock;
651 }
652 
653 #ifndef _WIN32
654 
655 static int unix_listen_saddr(UnixSocketAddress *saddr,
656                              bool update_addr,
657                              Error **errp)
658 {
659     struct sockaddr_un un;
660     int sock, fd;
661 
662     sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
663     if (sock < 0) {
664         error_setg_errno(errp, errno, "Failed to create Unix socket");
665         return -1;
666     }
667 
668     memset(&un, 0, sizeof(un));
669     un.sun_family = AF_UNIX;
670     if (saddr->path && strlen(saddr->path)) {
671         snprintf(un.sun_path, sizeof(un.sun_path), "%s", saddr->path);
672     } else {
673         const char *tmpdir = getenv("TMPDIR");
674         tmpdir = tmpdir ? tmpdir : "/tmp";
675         if (snprintf(un.sun_path, sizeof(un.sun_path), "%s/qemu-socket-XXXXXX",
676                      tmpdir) >= sizeof(un.sun_path)) {
677             error_setg_errno(errp, errno,
678                              "TMPDIR environment variable (%s) too large", tmpdir);
679             goto err;
680         }
681 
682         /*
683          * This dummy fd usage silences the mktemp() unsecure warning.
684          * Using mkstemp() doesn't make things more secure here
685          * though.  bind() complains about existing files, so we have
686          * to unlink first and thus re-open the race window.  The
687          * worst case possible is bind() failing, i.e. a DoS attack.
688          */
689         fd = mkstemp(un.sun_path);
690         if (fd < 0) {
691             error_setg_errno(errp, errno,
692                              "Failed to make a temporary socket name in %s", tmpdir);
693             goto err;
694         }
695         close(fd);
696         if (update_addr) {
697             g_free(saddr->path);
698             saddr->path = g_strdup(un.sun_path);
699         }
700     }
701 
702     if (unlink(un.sun_path) < 0 && errno != ENOENT) {
703         error_setg_errno(errp, errno,
704                          "Failed to unlink socket %s", un.sun_path);
705         goto err;
706     }
707     if (bind(sock, (struct sockaddr*) &un, sizeof(un)) < 0) {
708         error_setg_errno(errp, errno, "Failed to bind socket to %s", un.sun_path);
709         goto err;
710     }
711     if (listen(sock, 1) < 0) {
712         error_setg_errno(errp, errno, "Failed to listen on socket");
713         goto err;
714     }
715 
716     return sock;
717 
718 err:
719     closesocket(sock);
720     return -1;
721 }
722 
723 static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp,
724                               NonBlockingConnectHandler *callback, void *opaque)
725 {
726     struct sockaddr_un un;
727     ConnectState *connect_state = NULL;
728     int sock, rc;
729 
730     if (saddr->path == NULL) {
731         error_setg(errp, "unix connect: no path specified");
732         return -1;
733     }
734 
735     sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
736     if (sock < 0) {
737         error_setg_errno(errp, errno, "Failed to create socket");
738         return -1;
739     }
740     if (callback != NULL) {
741         connect_state = g_malloc0(sizeof(*connect_state));
742         connect_state->callback = callback;
743         connect_state->opaque = opaque;
744         qemu_set_nonblock(sock);
745     }
746 
747     memset(&un, 0, sizeof(un));
748     un.sun_family = AF_UNIX;
749     snprintf(un.sun_path, sizeof(un.sun_path), "%s", saddr->path);
750 
751     /* connect to peer */
752     do {
753         rc = 0;
754         if (connect(sock, (struct sockaddr *) &un, sizeof(un)) < 0) {
755             rc = -errno;
756         }
757     } while (rc == -EINTR);
758 
759     if (connect_state != NULL && QEMU_SOCKET_RC_INPROGRESS(rc)) {
760         connect_state->fd = sock;
761         qemu_set_fd_handler(sock, NULL, wait_for_connect, connect_state);
762         return sock;
763     } else if (rc >= 0) {
764         /* non blocking socket immediate success, call callback */
765         if (callback != NULL) {
766             callback(sock, NULL, opaque);
767         }
768     }
769 
770     if (rc < 0) {
771         error_setg_errno(errp, -rc, "Failed to connect socket");
772         close(sock);
773         sock = -1;
774     }
775 
776     g_free(connect_state);
777     return sock;
778 }
779 
780 #else
781 
782 static int unix_listen_saddr(UnixSocketAddress *saddr,
783                              bool update_addr,
784                              Error **errp)
785 {
786     error_setg(errp, "unix sockets are not available on windows");
787     errno = ENOTSUP;
788     return -1;
789 }
790 
791 static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp,
792                               NonBlockingConnectHandler *callback, void *opaque)
793 {
794     error_setg(errp, "unix sockets are not available on windows");
795     errno = ENOTSUP;
796     return -1;
797 }
798 #endif
799 
800 /* compatibility wrapper */
801 int unix_listen(const char *str, char *ostr, int olen, Error **errp)
802 {
803     char *path, *optstr;
804     int sock, len;
805     UnixSocketAddress *saddr;
806 
807     saddr = g_new0(UnixSocketAddress, 1);
808 
809     optstr = strchr(str, ',');
810     if (optstr) {
811         len = optstr - str;
812         if (len) {
813             path = g_malloc(len+1);
814             snprintf(path, len+1, "%.*s", len, str);
815             saddr->path = path;
816         }
817     } else {
818         saddr->path = g_strdup(str);
819     }
820 
821     sock = unix_listen_saddr(saddr, true, errp);
822 
823     if (sock != -1 && ostr) {
824         snprintf(ostr, olen, "%s%s", saddr->path, optstr ? optstr : "");
825     }
826 
827     qapi_free_UnixSocketAddress(saddr);
828     return sock;
829 }
830 
831 int unix_connect(const char *path, Error **errp)
832 {
833     UnixSocketAddress *saddr;
834     int sock;
835 
836     saddr = g_new0(UnixSocketAddress, 1);
837     saddr->path = g_strdup(path);
838     sock = unix_connect_saddr(saddr, errp, NULL, NULL);
839     qapi_free_UnixSocketAddress(saddr);
840     return sock;
841 }
842 
843 
844 SocketAddress *socket_parse(const char *str, Error **errp)
845 {
846     SocketAddress *addr;
847 
848     addr = g_new0(SocketAddress, 1);
849     if (strstart(str, "unix:", NULL)) {
850         if (str[5] == '\0') {
851             error_setg(errp, "invalid Unix socket address");
852             goto fail;
853         } else {
854             addr->type = SOCKET_ADDRESS_KIND_UNIX;
855             addr->u.q_unix.data = g_new(UnixSocketAddress, 1);
856             addr->u.q_unix.data->path = g_strdup(str + 5);
857         }
858     } else if (strstart(str, "fd:", NULL)) {
859         if (str[3] == '\0') {
860             error_setg(errp, "invalid file descriptor address");
861             goto fail;
862         } else {
863             addr->type = SOCKET_ADDRESS_KIND_FD;
864             addr->u.fd.data = g_new(String, 1);
865             addr->u.fd.data->str = g_strdup(str + 3);
866         }
867     } else {
868         addr->type = SOCKET_ADDRESS_KIND_INET;
869         addr->u.inet.data = inet_parse(str, errp);
870         if (addr->u.inet.data == NULL) {
871             goto fail;
872         }
873     }
874     return addr;
875 
876 fail:
877     qapi_free_SocketAddress(addr);
878     return NULL;
879 }
880 
881 int socket_connect(SocketAddress *addr, Error **errp,
882                    NonBlockingConnectHandler *callback, void *opaque)
883 {
884     int fd;
885 
886     switch (addr->type) {
887     case SOCKET_ADDRESS_KIND_INET:
888         fd = inet_connect_saddr(addr->u.inet.data, errp, callback, opaque);
889         break;
890 
891     case SOCKET_ADDRESS_KIND_UNIX:
892         fd = unix_connect_saddr(addr->u.q_unix.data, errp, callback, opaque);
893         break;
894 
895     case SOCKET_ADDRESS_KIND_FD:
896         fd = monitor_get_fd(cur_mon, addr->u.fd.data->str, errp);
897         if (fd >= 0 && callback) {
898             qemu_set_nonblock(fd);
899             callback(fd, NULL, opaque);
900         }
901         break;
902 
903     default:
904         abort();
905     }
906     return fd;
907 }
908 
909 int socket_listen(SocketAddress *addr, Error **errp)
910 {
911     int fd;
912 
913     switch (addr->type) {
914     case SOCKET_ADDRESS_KIND_INET:
915         fd = inet_listen_saddr(addr->u.inet.data, 0, false, errp);
916         break;
917 
918     case SOCKET_ADDRESS_KIND_UNIX:
919         fd = unix_listen_saddr(addr->u.q_unix.data, false, errp);
920         break;
921 
922     case SOCKET_ADDRESS_KIND_FD:
923         fd = monitor_get_fd(cur_mon, addr->u.fd.data->str, errp);
924         break;
925 
926     default:
927         abort();
928     }
929     return fd;
930 }
931 
932 void socket_listen_cleanup(int fd, Error **errp)
933 {
934     SocketAddress *addr;
935 
936     addr = socket_local_address(fd, errp);
937 
938     if (addr->type == SOCKET_ADDRESS_KIND_UNIX
939         && addr->u.q_unix.data->path) {
940         if (unlink(addr->u.q_unix.data->path) < 0 && errno != ENOENT) {
941             error_setg_errno(errp, errno,
942                              "Failed to unlink socket %s",
943                              addr->u.q_unix.data->path);
944         }
945     }
946 
947     qapi_free_SocketAddress(addr);
948 }
949 
950 int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp)
951 {
952     int fd;
953 
954     switch (remote->type) {
955     case SOCKET_ADDRESS_KIND_INET:
956         fd = inet_dgram_saddr(remote->u.inet.data,
957                               local ? local->u.inet.data : NULL, errp);
958         break;
959 
960     default:
961         error_setg(errp, "socket type unsupported for datagram");
962         fd = -1;
963     }
964     return fd;
965 }
966 
967 
968 static SocketAddress *
969 socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
970                                 socklen_t salen,
971                                 Error **errp)
972 {
973     char host[NI_MAXHOST];
974     char serv[NI_MAXSERV];
975     SocketAddress *addr;
976     InetSocketAddress *inet;
977     int ret;
978 
979     ret = getnameinfo((struct sockaddr *)sa, salen,
980                       host, sizeof(host),
981                       serv, sizeof(serv),
982                       NI_NUMERICHOST | NI_NUMERICSERV);
983     if (ret != 0) {
984         error_setg(errp, "Cannot format numeric socket address: %s",
985                    gai_strerror(ret));
986         return NULL;
987     }
988 
989     addr = g_new0(SocketAddress, 1);
990     addr->type = SOCKET_ADDRESS_KIND_INET;
991     inet = addr->u.inet.data = g_new0(InetSocketAddress, 1);
992     inet->host = g_strdup(host);
993     inet->port = g_strdup(serv);
994     if (sa->ss_family == AF_INET) {
995         inet->has_ipv4 = inet->ipv4 = true;
996     } else {
997         inet->has_ipv6 = inet->ipv6 = true;
998     }
999 
1000     return addr;
1001 }
1002 
1003 
1004 #ifndef WIN32
1005 static SocketAddress *
1006 socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
1007                                 socklen_t salen,
1008                                 Error **errp)
1009 {
1010     SocketAddress *addr;
1011     struct sockaddr_un *su = (struct sockaddr_un *)sa;
1012 
1013     addr = g_new0(SocketAddress, 1);
1014     addr->type = SOCKET_ADDRESS_KIND_UNIX;
1015     addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
1016     if (su->sun_path[0]) {
1017         addr->u.q_unix.data->path = g_strndup(su->sun_path,
1018                                               sizeof(su->sun_path));
1019     }
1020 
1021     return addr;
1022 }
1023 #endif /* WIN32 */
1024 
1025 SocketAddress *
1026 socket_sockaddr_to_address(struct sockaddr_storage *sa,
1027                            socklen_t salen,
1028                            Error **errp)
1029 {
1030     switch (sa->ss_family) {
1031     case AF_INET:
1032     case AF_INET6:
1033         return socket_sockaddr_to_address_inet(sa, salen, errp);
1034 
1035 #ifndef WIN32
1036     case AF_UNIX:
1037         return socket_sockaddr_to_address_unix(sa, salen, errp);
1038 #endif /* WIN32 */
1039 
1040     default:
1041         error_setg(errp, "socket family %d unsupported",
1042                    sa->ss_family);
1043         return NULL;
1044     }
1045     return 0;
1046 }
1047 
1048 
1049 SocketAddress *socket_local_address(int fd, Error **errp)
1050 {
1051     struct sockaddr_storage ss;
1052     socklen_t sslen = sizeof(ss);
1053 
1054     if (getsockname(fd, (struct sockaddr *)&ss, &sslen) < 0) {
1055         error_setg_errno(errp, errno, "%s",
1056                          "Unable to query local socket address");
1057         return NULL;
1058     }
1059 
1060     return socket_sockaddr_to_address(&ss, sslen, errp);
1061 }
1062 
1063 
1064 SocketAddress *socket_remote_address(int fd, Error **errp)
1065 {
1066     struct sockaddr_storage ss;
1067     socklen_t sslen = sizeof(ss);
1068 
1069     if (getpeername(fd, (struct sockaddr *)&ss, &sslen) < 0) {
1070         error_setg_errno(errp, errno, "%s",
1071                          "Unable to query remote socket address");
1072         return NULL;
1073     }
1074 
1075     return socket_sockaddr_to_address(&ss, sslen, errp);
1076 }
1077 
1078 char *socket_address_to_string(struct SocketAddress *addr, Error **errp)
1079 {
1080     char *buf;
1081     InetSocketAddress *inet;
1082     char host_port[INET6_ADDRSTRLEN + 5 + 4];
1083 
1084     switch (addr->type) {
1085     case SOCKET_ADDRESS_KIND_INET:
1086         inet = addr->u.inet.data;
1087         if (strchr(inet->host, ':') == NULL) {
1088             snprintf(host_port, sizeof(host_port), "%s:%s", inet->host,
1089                     inet->port);
1090             buf = g_strdup(host_port);
1091         } else {
1092             snprintf(host_port, sizeof(host_port), "[%s]:%s", inet->host,
1093                     inet->port);
1094             buf = g_strdup(host_port);
1095         }
1096         break;
1097 
1098     case SOCKET_ADDRESS_KIND_UNIX:
1099         buf = g_strdup(addr->u.q_unix.data->path);
1100         break;
1101 
1102     case SOCKET_ADDRESS_KIND_FD:
1103         buf = g_strdup(addr->u.fd.data->str);
1104         break;
1105 
1106     default:
1107         error_setg(errp, "socket family %d unsupported",
1108                    addr->type);
1109         return NULL;
1110     }
1111     return buf;
1112 }
1113