qemu/util/qemu-sockets.c
<<
>>
Prefs
   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#ifdef CONFIG_AF_VSOCK
  21#include <linux/vm_sockets.h>
  22#endif /* CONFIG_AF_VSOCK */
  23
  24#include "monitor/monitor.h"
  25#include "qapi/clone-visitor.h"
  26#include "qapi/error.h"
  27#include "qapi/qapi-visit-sockets.h"
  28#include "qemu/sockets.h"
  29#include "qemu/main-loop.h"
  30#include "qapi/qobject-input-visitor.h"
  31#include "qapi/qobject-output-visitor.h"
  32#include "qemu/cutils.h"
  33
  34#ifndef AI_ADDRCONFIG
  35# define AI_ADDRCONFIG 0
  36#endif
  37
  38#ifndef AI_V4MAPPED
  39# define AI_V4MAPPED 0
  40#endif
  41
  42#ifndef AI_NUMERICSERV
  43# define AI_NUMERICSERV 0
  44#endif
  45
  46
  47static int inet_getport(struct addrinfo *e)
  48{
  49    struct sockaddr_in *i4;
  50    struct sockaddr_in6 *i6;
  51
  52    switch (e->ai_family) {
  53    case PF_INET6:
  54        i6 = (void*)e->ai_addr;
  55        return ntohs(i6->sin6_port);
  56    case PF_INET:
  57        i4 = (void*)e->ai_addr;
  58        return ntohs(i4->sin_port);
  59    default:
  60        return 0;
  61    }
  62}
  63
  64static void inet_setport(struct addrinfo *e, int port)
  65{
  66    struct sockaddr_in *i4;
  67    struct sockaddr_in6 *i6;
  68
  69    switch (e->ai_family) {
  70    case PF_INET6:
  71        i6 = (void*)e->ai_addr;
  72        i6->sin6_port = htons(port);
  73        break;
  74    case PF_INET:
  75        i4 = (void*)e->ai_addr;
  76        i4->sin_port = htons(port);
  77        break;
  78    }
  79}
  80
  81NetworkAddressFamily inet_netfamily(int family)
  82{
  83    switch (family) {
  84    case PF_INET6: return NETWORK_ADDRESS_FAMILY_IPV6;
  85    case PF_INET:  return NETWORK_ADDRESS_FAMILY_IPV4;
  86    case PF_UNIX:  return NETWORK_ADDRESS_FAMILY_UNIX;
  87#ifdef CONFIG_AF_VSOCK
  88    case PF_VSOCK: return NETWORK_ADDRESS_FAMILY_VSOCK;
  89#endif /* CONFIG_AF_VSOCK */
  90    }
  91    return NETWORK_ADDRESS_FAMILY_UNKNOWN;
  92}
  93
  94bool fd_is_socket(int fd)
  95{
  96    int optval;
  97    socklen_t optlen = sizeof(optval);
  98    return !qemu_getsockopt(fd, SOL_SOCKET, SO_TYPE, &optval, &optlen);
  99}
 100
 101
 102/*
 103 * Matrix we're trying to apply
 104 *
 105 *  ipv4  ipv6   family
 106 *   -     -       PF_UNSPEC
 107 *   -     f       PF_INET
 108 *   -     t       PF_INET6
 109 *   f     -       PF_INET6
 110 *   f     f       <error>
 111 *   f     t       PF_INET6
 112 *   t     -       PF_INET
 113 *   t     f       PF_INET
 114 *   t     t       PF_INET6/PF_UNSPEC
 115 *
 116 * NB, this matrix is only about getting the necessary results
 117 * from getaddrinfo(). Some of the cases require further work
 118 * after reading results from getaddrinfo in order to fully
 119 * apply the logic the end user wants.
 120 *
 121 * In the first and last cases, we must set IPV6_V6ONLY=0
 122 * when binding, to allow a single listener to potentially
 123 * accept both IPv4+6 addresses.
 124 */
 125int inet_ai_family_from_address(InetSocketAddress *addr,
 126                                Error **errp)
 127{
 128    if (addr->has_ipv6 && addr->has_ipv4 &&
 129        !addr->ipv6 && !addr->ipv4) {
 130        error_setg(errp, "Cannot disable IPv4 and IPv6 at same time");
 131        return PF_UNSPEC;
 132    }
 133    if ((addr->has_ipv6 && addr->ipv6) && (addr->has_ipv4 && addr->ipv4)) {
 134        /*
 135         * Some backends can only do a single listener. In that case
 136         * we want empty hostname to resolve to "::" and then use the
 137         * flag IPV6_V6ONLY==0 to get both protocols on 1 socket. This
 138         * doesn't work for addresses other than "", so they're just
 139         * inevitably broken until multiple listeners can be used,
 140         * and thus we honour getaddrinfo automatic protocol detection
 141         * Once all backends do multi-listener, remove the PF_INET6
 142         * branch entirely.
 143         */
 144        if (!addr->host || g_str_equal(addr->host, "")) {
 145            return PF_INET6;
 146        } else {
 147            return PF_UNSPEC;
 148        }
 149    }
 150    if ((addr->has_ipv6 && addr->ipv6) || (addr->has_ipv4 && !addr->ipv4)) {
 151        return PF_INET6;
 152    }
 153    if ((addr->has_ipv4 && addr->ipv4) || (addr->has_ipv6 && !addr->ipv6)) {
 154        return PF_INET;
 155    }
 156    return PF_UNSPEC;
 157}
 158
 159static int create_fast_reuse_socket(struct addrinfo *e)
 160{
 161    int slisten = qemu_socket(e->ai_family, e->ai_socktype, e->ai_protocol);
 162    if (slisten < 0) {
 163        return -1;
 164    }
 165    socket_set_fast_reuse(slisten);
 166    return slisten;
 167}
 168
 169static int try_bind(int socket, InetSocketAddress *saddr, struct addrinfo *e)
 170{
 171#ifndef IPV6_V6ONLY
 172    return bind(socket, e->ai_addr, e->ai_addrlen);
 173#else
 174    /*
 175     * Deals with first & last cases in matrix in comment
 176     * for inet_ai_family_from_address().
 177     */
 178    int v6only =
 179        ((!saddr->has_ipv4 && !saddr->has_ipv6) ||
 180         (saddr->has_ipv4 && saddr->ipv4 &&
 181          saddr->has_ipv6 && saddr->ipv6)) ? 0 : 1;
 182    int stat;
 183
 184 rebind:
 185    if (e->ai_family == PF_INET6) {
 186        qemu_setsockopt(socket, IPPROTO_IPV6, IPV6_V6ONLY, &v6only,
 187                        sizeof(v6only));
 188    }
 189
 190    stat = bind(socket, e->ai_addr, e->ai_addrlen);
 191    if (!stat) {
 192        return 0;
 193    }
 194
 195    /* If we got EADDRINUSE from an IPv6 bind & v6only is unset,
 196     * it could be that the IPv4 port is already claimed, so retry
 197     * with v6only set
 198     */
 199    if (e->ai_family == PF_INET6 && errno == EADDRINUSE && !v6only) {
 200        v6only = 1;
 201        goto rebind;
 202    }
 203    return stat;
 204#endif
 205}
 206
 207static int inet_listen_saddr(InetSocketAddress *saddr,
 208                             int port_offset,
 209                             Error **errp)
 210{
 211    struct addrinfo ai,*res,*e;
 212    char port[33];
 213    char uaddr[INET6_ADDRSTRLEN+1];
 214    char uport[33];
 215    int rc, port_min, port_max, p;
 216    int slisten = -1;
 217    int saved_errno = 0;
 218    bool socket_created = false;
 219    Error *err = NULL;
 220
 221    memset(&ai,0, sizeof(ai));
 222    ai.ai_flags = AI_PASSIVE;
 223    if (saddr->has_numeric && saddr->numeric) {
 224        ai.ai_flags |= AI_NUMERICHOST | AI_NUMERICSERV;
 225    }
 226    ai.ai_family = inet_ai_family_from_address(saddr, &err);
 227    ai.ai_socktype = SOCK_STREAM;
 228
 229    if (err) {
 230        error_propagate(errp, err);
 231        return -1;
 232    }
 233
 234    if (saddr->host == NULL) {
 235        error_setg(errp, "host not specified");
 236        return -1;
 237    }
 238    if (saddr->port != NULL) {
 239        pstrcpy(port, sizeof(port), saddr->port);
 240    } else {
 241        port[0] = '\0';
 242    }
 243
 244    /* lookup */
 245    if (port_offset) {
 246        unsigned long long baseport;
 247        if (strlen(port) == 0) {
 248            error_setg(errp, "port not specified");
 249            return -1;
 250        }
 251        if (parse_uint_full(port, &baseport, 10) < 0) {
 252            error_setg(errp, "can't convert to a number: %s", port);
 253            return -1;
 254        }
 255        if (baseport > 65535 ||
 256            baseport + port_offset > 65535) {
 257            error_setg(errp, "port %s out of range", port);
 258            return -1;
 259        }
 260        snprintf(port, sizeof(port), "%d", (int)baseport + port_offset);
 261    }
 262    rc = getaddrinfo(strlen(saddr->host) ? saddr->host : NULL,
 263                     strlen(port) ? port : NULL, &ai, &res);
 264    if (rc != 0) {
 265        error_setg(errp, "address resolution failed for %s:%s: %s",
 266                   saddr->host, port, gai_strerror(rc));
 267        return -1;
 268    }
 269
 270    /* create socket + bind/listen */
 271    for (e = res; e != NULL; e = e->ai_next) {
 272        getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen,
 273                        uaddr,INET6_ADDRSTRLEN,uport,32,
 274                        NI_NUMERICHOST | NI_NUMERICSERV);
 275
 276        port_min = inet_getport(e);
 277        port_max = saddr->has_to ? saddr->to + port_offset : port_min;
 278        for (p = port_min; p <= port_max; p++) {
 279            inet_setport(e, p);
 280
 281            slisten = create_fast_reuse_socket(e);
 282            if (slisten < 0) {
 283                /* First time we expect we might fail to create the socket
 284                 * eg if 'e' has AF_INET6 but ipv6 kmod is not loaded.
 285                 * Later iterations should always succeed if first iteration
 286                 * worked though, so treat that as fatal.
 287                 */
 288                if (p == port_min) {
 289                    continue;
 290                } else {
 291                    error_setg_errno(errp, errno,
 292                                     "Failed to recreate failed listening socket");
 293                    goto listen_failed;
 294                }
 295            }
 296            socket_created = true;
 297
 298            rc = try_bind(slisten, saddr, e);
 299            if (rc < 0) {
 300                if (errno != EADDRINUSE) {
 301                    error_setg_errno(errp, errno, "Failed to bind socket");
 302                    goto listen_failed;
 303                }
 304            } else {
 305                if (!listen(slisten, 1)) {
 306                    goto listen_ok;
 307                }
 308                if (errno != EADDRINUSE) {
 309                    error_setg_errno(errp, errno, "Failed to listen on socket");
 310                    goto listen_failed;
 311                }
 312            }
 313            /* Someone else managed to bind to the same port and beat us
 314             * to listen on it! Socket semantics does not allow us to
 315             * recover from this situation, so we need to recreate the
 316             * socket to allow bind attempts for subsequent ports:
 317             */
 318            closesocket(slisten);
 319            slisten = -1;
 320        }
 321    }
 322    error_setg_errno(errp, errno,
 323                     socket_created ?
 324                     "Failed to find an available port" :
 325                     "Failed to create a socket");
 326listen_failed:
 327    saved_errno = errno;
 328    if (slisten >= 0) {
 329        closesocket(slisten);
 330    }
 331    freeaddrinfo(res);
 332    errno = saved_errno;
 333    return -1;
 334
 335listen_ok:
 336    freeaddrinfo(res);
 337    return slisten;
 338}
 339
 340#ifdef _WIN32
 341#define QEMU_SOCKET_RC_INPROGRESS(rc) \
 342    ((rc) == -EINPROGRESS || (rc) == -EWOULDBLOCK || (rc) == -WSAEALREADY)
 343#else
 344#define QEMU_SOCKET_RC_INPROGRESS(rc) \
 345    ((rc) == -EINPROGRESS)
 346#endif
 347
 348static int inet_connect_addr(struct addrinfo *addr, Error **errp);
 349
 350static int inet_connect_addr(struct addrinfo *addr, Error **errp)
 351{
 352    int sock, rc;
 353
 354    sock = qemu_socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
 355    if (sock < 0) {
 356        error_setg_errno(errp, errno, "Failed to create socket");
 357        return -1;
 358    }
 359    socket_set_fast_reuse(sock);
 360
 361    /* connect to peer */
 362    do {
 363        rc = 0;
 364        if (connect(sock, addr->ai_addr, addr->ai_addrlen) < 0) {
 365            rc = -errno;
 366        }
 367    } while (rc == -EINTR);
 368
 369    if (rc < 0) {
 370        error_setg_errno(errp, errno, "Failed to connect socket");
 371        closesocket(sock);
 372        return -1;
 373    }
 374
 375    return sock;
 376}
 377
 378static struct addrinfo *inet_parse_connect_saddr(InetSocketAddress *saddr,
 379                                                 Error **errp)
 380{
 381    struct addrinfo ai, *res;
 382    int rc;
 383    Error *err = NULL;
 384    static int useV4Mapped = 1;
 385
 386    memset(&ai, 0, sizeof(ai));
 387
 388    ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
 389    if (atomic_read(&useV4Mapped)) {
 390        ai.ai_flags |= AI_V4MAPPED;
 391    }
 392    ai.ai_family = inet_ai_family_from_address(saddr, &err);
 393    ai.ai_socktype = SOCK_STREAM;
 394
 395    if (err) {
 396        error_propagate(errp, err);
 397        return NULL;
 398    }
 399
 400    if (saddr->host == NULL || saddr->port == NULL) {
 401        error_setg(errp, "host and/or port not specified");
 402        return NULL;
 403    }
 404
 405    /* lookup */
 406    rc = getaddrinfo(saddr->host, saddr->port, &ai, &res);
 407
 408    /* At least FreeBSD and OS-X 10.6 declare AI_V4MAPPED but
 409     * then don't implement it in their getaddrinfo(). Detect
 410     * this and retry without the flag since that's preferrable
 411     * to a fatal error
 412     */
 413    if (rc == EAI_BADFLAGS &&
 414        (ai.ai_flags & AI_V4MAPPED)) {
 415        atomic_set(&useV4Mapped, 0);
 416        ai.ai_flags &= ~AI_V4MAPPED;
 417        rc = getaddrinfo(saddr->host, saddr->port, &ai, &res);
 418    }
 419    if (rc != 0) {
 420        error_setg(errp, "address resolution failed for %s:%s: %s",
 421                   saddr->host, saddr->port, gai_strerror(rc));
 422        return NULL;
 423    }
 424    return res;
 425}
 426
 427/**
 428 * Create a socket and connect it to an address.
 429 *
 430 * @saddr: Inet socket address specification
 431 * @errp: set on error
 432 *
 433 * Returns: -1 on error, file descriptor on success.
 434 */
 435int inet_connect_saddr(InetSocketAddress *saddr, Error **errp)
 436{
 437    Error *local_err = NULL;
 438    struct addrinfo *res, *e;
 439    int sock = -1;
 440
 441    res = inet_parse_connect_saddr(saddr, errp);
 442    if (!res) {
 443        return -1;
 444    }
 445
 446    for (e = res; e != NULL; e = e->ai_next) {
 447        error_free(local_err);
 448        local_err = NULL;
 449        sock = inet_connect_addr(e, &local_err);
 450        if (sock >= 0) {
 451            break;
 452        }
 453    }
 454
 455    if (sock < 0) {
 456        error_propagate(errp, local_err);
 457    }
 458
 459    freeaddrinfo(res);
 460    return sock;
 461}
 462
 463static 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
 550err:
 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 */
 565static int inet_parse_flag(const char *flagname, const char *optstr, bool *val,
 566                           Error **errp)
 567{
 568    char *end;
 569    size_t len;
 570
 571    end = strstr(optstr, ",");
 572    if (end) {
 573        if (end[1] == ',') { /* Reject 'ipv6=on,,foo' */
 574            error_setg(errp, "error parsing '%s' flag '%s'", flagname, optstr);
 575            return -1;
 576        }
 577        len = end - optstr;
 578    } else {
 579        len = strlen(optstr);
 580    }
 581    if (len == 0 || (len == 3 && strncmp(optstr, "=on", len) == 0)) {
 582        *val = true;
 583    } else if (len == 4 && strncmp(optstr, "=off", len) == 0) {
 584        *val = false;
 585    } else {
 586        error_setg(errp, "error parsing '%s' flag '%s'", flagname, optstr);
 587        return -1;
 588    }
 589    return 0;
 590}
 591
 592int inet_parse(InetSocketAddress *addr, const char *str, Error **errp)
 593{
 594    const char *optstr, *h;
 595    char host[65];
 596    char port[33];
 597    int to;
 598    int pos;
 599    char *begin;
 600
 601    memset(addr, 0, sizeof(*addr));
 602
 603    /* parse address */
 604    if (str[0] == ':') {
 605        /* no host given */
 606        host[0] = '\0';
 607        if (sscanf(str, ":%32[^,]%n", port, &pos) != 1) {
 608            error_setg(errp, "error parsing port in address '%s'", str);
 609            return -1;
 610        }
 611    } else if (str[0] == '[') {
 612        /* IPv6 addr */
 613        if (sscanf(str, "[%64[^]]]:%32[^,]%n", host, port, &pos) != 2) {
 614            error_setg(errp, "error parsing IPv6 address '%s'", str);
 615            return -1;
 616        }
 617    } else {
 618        /* hostname or IPv4 addr */
 619        if (sscanf(str, "%64[^:]:%32[^,]%n", host, port, &pos) != 2) {
 620            error_setg(errp, "error parsing address '%s'", str);
 621            return -1;
 622        }
 623    }
 624
 625    addr->host = g_strdup(host);
 626    addr->port = g_strdup(port);
 627
 628    /* parse options */
 629    optstr = str + pos;
 630    h = strstr(optstr, ",to=");
 631    if (h) {
 632        h += 4;
 633        if (sscanf(h, "%d%n", &to, &pos) != 1 ||
 634            (h[pos] != '\0' && h[pos] != ',')) {
 635            error_setg(errp, "error parsing to= argument");
 636            return -1;
 637        }
 638        addr->has_to = true;
 639        addr->to = to;
 640    }
 641    begin = strstr(optstr, ",ipv4");
 642    if (begin) {
 643        if (inet_parse_flag("ipv4", begin + 5, &addr->ipv4, errp) < 0) {
 644            return -1;
 645        }
 646        addr->has_ipv4 = true;
 647    }
 648    begin = strstr(optstr, ",ipv6");
 649    if (begin) {
 650        if (inet_parse_flag("ipv6", begin + 5, &addr->ipv6, errp) < 0) {
 651            return -1;
 652        }
 653        addr->has_ipv6 = true;
 654    }
 655    return 0;
 656}
 657
 658
 659/**
 660 * Create a blocking socket and connect it to an address.
 661 *
 662 * @str: address string
 663 * @errp: set in case of an error
 664 *
 665 * Returns -1 in case of error, file descriptor on success
 666 **/
 667int inet_connect(const char *str, Error **errp)
 668{
 669    int sock = -1;
 670    InetSocketAddress *addr = g_new(InetSocketAddress, 1);
 671
 672    if (!inet_parse(addr, str, errp)) {
 673        sock = inet_connect_saddr(addr, errp);
 674    }
 675    qapi_free_InetSocketAddress(addr);
 676    return sock;
 677}
 678
 679#ifdef CONFIG_AF_VSOCK
 680static bool vsock_parse_vaddr_to_sockaddr(const VsockSocketAddress *vaddr,
 681                                          struct sockaddr_vm *svm,
 682                                          Error **errp)
 683{
 684    unsigned long long val;
 685
 686    memset(svm, 0, sizeof(*svm));
 687    svm->svm_family = AF_VSOCK;
 688
 689    if (parse_uint_full(vaddr->cid, &val, 10) < 0 ||
 690        val > UINT32_MAX) {
 691        error_setg(errp, "Failed to parse cid '%s'", vaddr->cid);
 692        return false;
 693    }
 694    svm->svm_cid = val;
 695
 696    if (parse_uint_full(vaddr->port, &val, 10) < 0 ||
 697        val > UINT32_MAX) {
 698        error_setg(errp, "Failed to parse port '%s'", vaddr->port);
 699        return false;
 700    }
 701    svm->svm_port = val;
 702
 703    return true;
 704}
 705
 706static int vsock_connect_addr(const struct sockaddr_vm *svm, Error **errp)
 707{
 708    int sock, rc;
 709
 710    sock = qemu_socket(AF_VSOCK, SOCK_STREAM, 0);
 711    if (sock < 0) {
 712        error_setg_errno(errp, errno, "Failed to create socket");
 713        return -1;
 714    }
 715
 716    /* connect to peer */
 717    do {
 718        rc = 0;
 719        if (connect(sock, (const struct sockaddr *)svm, sizeof(*svm)) < 0) {
 720            rc = -errno;
 721        }
 722    } while (rc == -EINTR);
 723
 724    if (rc < 0) {
 725        error_setg_errno(errp, errno, "Failed to connect socket");
 726        closesocket(sock);
 727        return -1;
 728    }
 729
 730    return sock;
 731}
 732
 733static int vsock_connect_saddr(VsockSocketAddress *vaddr, Error **errp)
 734{
 735    struct sockaddr_vm svm;
 736    int sock = -1;
 737
 738    if (!vsock_parse_vaddr_to_sockaddr(vaddr, &svm, errp)) {
 739        return -1;
 740    }
 741
 742    sock = vsock_connect_addr(&svm, errp);
 743
 744    return sock;
 745}
 746
 747static int vsock_listen_saddr(VsockSocketAddress *vaddr,
 748                              Error **errp)
 749{
 750    struct sockaddr_vm svm;
 751    int slisten;
 752
 753    if (!vsock_parse_vaddr_to_sockaddr(vaddr, &svm, errp)) {
 754        return -1;
 755    }
 756
 757    slisten = qemu_socket(AF_VSOCK, SOCK_STREAM, 0);
 758    if (slisten < 0) {
 759        error_setg_errno(errp, errno, "Failed to create socket");
 760        return -1;
 761    }
 762
 763    if (bind(slisten, (const struct sockaddr *)&svm, sizeof(svm)) != 0) {
 764        error_setg_errno(errp, errno, "Failed to bind socket");
 765        closesocket(slisten);
 766        return -1;
 767    }
 768
 769    if (listen(slisten, 1) != 0) {
 770        error_setg_errno(errp, errno, "Failed to listen on socket");
 771        closesocket(slisten);
 772        return -1;
 773    }
 774    return slisten;
 775}
 776
 777static int vsock_parse(VsockSocketAddress *addr, const char *str,
 778                       Error **errp)
 779{
 780    char cid[33];
 781    char port[33];
 782    int n;
 783
 784    if (sscanf(str, "%32[^:]:%32[^,]%n", cid, port, &n) != 2) {
 785        error_setg(errp, "error parsing address '%s'", str);
 786        return -1;
 787    }
 788    if (str[n] != '\0') {
 789        error_setg(errp, "trailing characters in address '%s'", str);
 790        return -1;
 791    }
 792
 793    addr->cid = g_strdup(cid);
 794    addr->port = g_strdup(port);
 795    return 0;
 796}
 797#else
 798static void vsock_unsupported(Error **errp)
 799{
 800    error_setg(errp, "socket family AF_VSOCK unsupported");
 801}
 802
 803static int vsock_connect_saddr(VsockSocketAddress *vaddr, Error **errp)
 804{
 805    vsock_unsupported(errp);
 806    return -1;
 807}
 808
 809static int vsock_listen_saddr(VsockSocketAddress *vaddr,
 810                              Error **errp)
 811{
 812    vsock_unsupported(errp);
 813    return -1;
 814}
 815
 816static int vsock_parse(VsockSocketAddress *addr, const char *str,
 817                        Error **errp)
 818{
 819    vsock_unsupported(errp);
 820    return -1;
 821}
 822#endif /* CONFIG_AF_VSOCK */
 823
 824#ifndef _WIN32
 825
 826static int unix_listen_saddr(UnixSocketAddress *saddr,
 827                             Error **errp)
 828{
 829    struct sockaddr_un un;
 830    int sock, fd;
 831    char *pathbuf = NULL;
 832    const char *path;
 833
 834    sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
 835    if (sock < 0) {
 836        error_setg_errno(errp, errno, "Failed to create Unix socket");
 837        return -1;
 838    }
 839
 840    if (saddr->path && saddr->path[0]) {
 841        path = saddr->path;
 842    } else {
 843        const char *tmpdir = getenv("TMPDIR");
 844        tmpdir = tmpdir ? tmpdir : "/tmp";
 845        path = pathbuf = g_strdup_printf("%s/qemu-socket-XXXXXX", tmpdir);
 846    }
 847
 848    if (strlen(path) > sizeof(un.sun_path)) {
 849        error_setg(errp, "UNIX socket path '%s' is too long", path);
 850        error_append_hint(errp, "Path must be less than %zu bytes\n",
 851                          sizeof(un.sun_path));
 852        goto err;
 853    }
 854
 855    if (pathbuf != NULL) {
 856        /*
 857         * This dummy fd usage silences the mktemp() unsecure warning.
 858         * Using mkstemp() doesn't make things more secure here
 859         * though.  bind() complains about existing files, so we have
 860         * to unlink first and thus re-open the race window.  The
 861         * worst case possible is bind() failing, i.e. a DoS attack.
 862         */
 863        fd = mkstemp(pathbuf);
 864        if (fd < 0) {
 865            error_setg_errno(errp, errno,
 866                             "Failed to make a temporary socket %s", pathbuf);
 867            goto err;
 868        }
 869        close(fd);
 870    }
 871
 872    if (unlink(path) < 0 && errno != ENOENT) {
 873        error_setg_errno(errp, errno,
 874                         "Failed to unlink socket %s", path);
 875        goto err;
 876    }
 877
 878    memset(&un, 0, sizeof(un));
 879    un.sun_family = AF_UNIX;
 880    strncpy(un.sun_path, path, sizeof(un.sun_path));
 881
 882    if (bind(sock, (struct sockaddr*) &un, sizeof(un)) < 0) {
 883        error_setg_errno(errp, errno, "Failed to bind socket to %s", path);
 884        goto err;
 885    }
 886    if (listen(sock, 1) < 0) {
 887        error_setg_errno(errp, errno, "Failed to listen on socket");
 888        goto err;
 889    }
 890
 891    g_free(pathbuf);
 892    return sock;
 893
 894err:
 895    g_free(pathbuf);
 896    closesocket(sock);
 897    return -1;
 898}
 899
 900static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
 901{
 902    struct sockaddr_un un;
 903    int sock, rc;
 904
 905    if (saddr->path == NULL) {
 906        error_setg(errp, "unix connect: no path specified");
 907        return -1;
 908    }
 909
 910    sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
 911    if (sock < 0) {
 912        error_setg_errno(errp, errno, "Failed to create socket");
 913        return -1;
 914    }
 915
 916    if (strlen(saddr->path) > sizeof(un.sun_path)) {
 917        error_setg(errp, "UNIX socket path '%s' is too long", saddr->path);
 918        error_append_hint(errp, "Path must be less than %zu bytes\n",
 919                          sizeof(un.sun_path));
 920        goto err;
 921    }
 922
 923    memset(&un, 0, sizeof(un));
 924    un.sun_family = AF_UNIX;
 925    strncpy(un.sun_path, saddr->path, sizeof(un.sun_path));
 926
 927    /* connect to peer */
 928    do {
 929        rc = 0;
 930        if (connect(sock, (struct sockaddr *) &un, sizeof(un)) < 0) {
 931            rc = -errno;
 932        }
 933    } while (rc == -EINTR);
 934
 935    if (rc < 0) {
 936        error_setg_errno(errp, -rc, "Failed to connect socket %s",
 937                         saddr->path);
 938        goto err;
 939    }
 940
 941    return sock;
 942
 943 err:
 944    close(sock);
 945    return -1;
 946}
 947
 948#else
 949
 950static int unix_listen_saddr(UnixSocketAddress *saddr,
 951                             Error **errp)
 952{
 953    error_setg(errp, "unix sockets are not available on windows");
 954    errno = ENOTSUP;
 955    return -1;
 956}
 957
 958static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
 959{
 960    error_setg(errp, "unix sockets are not available on windows");
 961    errno = ENOTSUP;
 962    return -1;
 963}
 964#endif
 965
 966/* compatibility wrapper */
 967int unix_listen(const char *str, Error **errp)
 968{
 969    char *path, *optstr;
 970    int sock, len;
 971    UnixSocketAddress *saddr;
 972
 973    saddr = g_new0(UnixSocketAddress, 1);
 974
 975    optstr = strchr(str, ',');
 976    if (optstr) {
 977        len = optstr - str;
 978        if (len) {
 979            path = g_malloc(len+1);
 980            snprintf(path, len+1, "%.*s", len, str);
 981            saddr->path = path;
 982        }
 983    } else {
 984        saddr->path = g_strdup(str);
 985    }
 986
 987    sock = unix_listen_saddr(saddr, errp);
 988
 989    qapi_free_UnixSocketAddress(saddr);
 990    return sock;
 991}
 992
 993int unix_connect(const char *path, Error **errp)
 994{
 995    UnixSocketAddress *saddr;
 996    int sock;
 997
 998    saddr = g_new0(UnixSocketAddress, 1);
 999    saddr->path = g_strdup(path);
1000    sock = unix_connect_saddr(saddr, errp);
1001    qapi_free_UnixSocketAddress(saddr);
1002    return sock;
1003}
1004
1005
1006SocketAddress *socket_parse(const char *str, Error **errp)
1007{
1008    SocketAddress *addr;
1009
1010    addr = g_new0(SocketAddress, 1);
1011    if (strstart(str, "unix:", NULL)) {
1012        if (str[5] == '\0') {
1013            error_setg(errp, "invalid Unix socket address");
1014            goto fail;
1015        } else {
1016            addr->type = SOCKET_ADDRESS_TYPE_UNIX;
1017            addr->u.q_unix.path = g_strdup(str + 5);
1018        }
1019    } else if (strstart(str, "fd:", NULL)) {
1020        if (str[3] == '\0') {
1021            error_setg(errp, "invalid file descriptor address");
1022            goto fail;
1023        } else {
1024            addr->type = SOCKET_ADDRESS_TYPE_FD;
1025            addr->u.fd.str = g_strdup(str + 3);
1026        }
1027    } else if (strstart(str, "vsock:", NULL)) {
1028        addr->type = SOCKET_ADDRESS_TYPE_VSOCK;
1029        if (vsock_parse(&addr->u.vsock, str + strlen("vsock:"), errp)) {
1030            goto fail;
1031        }
1032    } else {
1033        addr->type = SOCKET_ADDRESS_TYPE_INET;
1034        if (inet_parse(&addr->u.inet, str, errp)) {
1035            goto fail;
1036        }
1037    }
1038    return addr;
1039
1040fail:
1041    qapi_free_SocketAddress(addr);
1042    return NULL;
1043}
1044
1045static int socket_get_fd(const char *fdstr, Error **errp)
1046{
1047    int fd;
1048    if (cur_mon) {
1049        fd = monitor_get_fd(cur_mon, fdstr, errp);
1050        if (fd < 0) {
1051            return -1;
1052        }
1053    } else {
1054        if (qemu_strtoi(fdstr, NULL, 10, &fd) < 0) {
1055            error_setg_errno(errp, errno,
1056                             "Unable to parse FD number %s",
1057                             fdstr);
1058            return -1;
1059        }
1060    }
1061    if (!fd_is_socket(fd)) {
1062        error_setg(errp, "File descriptor '%s' is not a socket", fdstr);
1063        close(fd);
1064        return -1;
1065    }
1066    return fd;
1067}
1068
1069int socket_connect(SocketAddress *addr, Error **errp)
1070{
1071    int fd;
1072
1073    switch (addr->type) {
1074    case SOCKET_ADDRESS_TYPE_INET:
1075        fd = inet_connect_saddr(&addr->u.inet, errp);
1076        break;
1077
1078    case SOCKET_ADDRESS_TYPE_UNIX:
1079        fd = unix_connect_saddr(&addr->u.q_unix, errp);
1080        break;
1081
1082    case SOCKET_ADDRESS_TYPE_FD:
1083        fd = socket_get_fd(addr->u.fd.str, errp);
1084        break;
1085
1086    case SOCKET_ADDRESS_TYPE_VSOCK:
1087        fd = vsock_connect_saddr(&addr->u.vsock, errp);
1088        break;
1089
1090    default:
1091        abort();
1092    }
1093    return fd;
1094}
1095
1096int socket_listen(SocketAddress *addr, Error **errp)
1097{
1098    int fd;
1099
1100    switch (addr->type) {
1101    case SOCKET_ADDRESS_TYPE_INET:
1102        fd = inet_listen_saddr(&addr->u.inet, 0, errp);
1103        break;
1104
1105    case SOCKET_ADDRESS_TYPE_UNIX:
1106        fd = unix_listen_saddr(&addr->u.q_unix, errp);
1107        break;
1108
1109    case SOCKET_ADDRESS_TYPE_FD:
1110        fd = socket_get_fd(addr->u.fd.str, errp);
1111        break;
1112
1113    case SOCKET_ADDRESS_TYPE_VSOCK:
1114        fd = vsock_listen_saddr(&addr->u.vsock, errp);
1115        break;
1116
1117    default:
1118        abort();
1119    }
1120    return fd;
1121}
1122
1123void socket_listen_cleanup(int fd, Error **errp)
1124{
1125    SocketAddress *addr;
1126
1127    addr = socket_local_address(fd, errp);
1128    if (!addr) {
1129        return;
1130    }
1131
1132    if (addr->type == SOCKET_ADDRESS_TYPE_UNIX
1133        && addr->u.q_unix.path) {
1134        if (unlink(addr->u.q_unix.path) < 0 && errno != ENOENT) {
1135            error_setg_errno(errp, errno,
1136                             "Failed to unlink socket %s",
1137                             addr->u.q_unix.path);
1138        }
1139    }
1140
1141    qapi_free_SocketAddress(addr);
1142}
1143
1144int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp)
1145{
1146    int fd;
1147
1148    /*
1149     * TODO SOCKET_ADDRESS_TYPE_FD when fd is AF_INET or AF_INET6
1150     * (although other address families can do SOCK_DGRAM, too)
1151     */
1152    switch (remote->type) {
1153    case SOCKET_ADDRESS_TYPE_INET:
1154        fd = inet_dgram_saddr(&remote->u.inet,
1155                              local ? &local->u.inet : NULL, errp);
1156        break;
1157
1158    default:
1159        error_setg(errp, "socket type unsupported for datagram");
1160        fd = -1;
1161    }
1162    return fd;
1163}
1164
1165
1166static SocketAddress *
1167socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
1168                                socklen_t salen,
1169                                Error **errp)
1170{
1171    char host[NI_MAXHOST];
1172    char serv[NI_MAXSERV];
1173    SocketAddress *addr;
1174    InetSocketAddress *inet;
1175    int ret;
1176
1177    ret = getnameinfo((struct sockaddr *)sa, salen,
1178                      host, sizeof(host),
1179                      serv, sizeof(serv),
1180                      NI_NUMERICHOST | NI_NUMERICSERV);
1181    if (ret != 0) {
1182        error_setg(errp, "Cannot format numeric socket address: %s",
1183                   gai_strerror(ret));
1184        return NULL;
1185    }
1186
1187    addr = g_new0(SocketAddress, 1);
1188    addr->type = SOCKET_ADDRESS_TYPE_INET;
1189    inet = &addr->u.inet;
1190    inet->host = g_strdup(host);
1191    inet->port = g_strdup(serv);
1192    if (sa->ss_family == AF_INET) {
1193        inet->has_ipv4 = inet->ipv4 = true;
1194    } else {
1195        inet->has_ipv6 = inet->ipv6 = true;
1196    }
1197
1198    return addr;
1199}
1200
1201
1202#ifndef WIN32
1203static SocketAddress *
1204socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
1205                                socklen_t salen,
1206                                Error **errp)
1207{
1208    SocketAddress *addr;
1209    struct sockaddr_un *su = (struct sockaddr_un *)sa;
1210
1211    addr = g_new0(SocketAddress, 1);
1212    addr->type = SOCKET_ADDRESS_TYPE_UNIX;
1213    if (su->sun_path[0]) {
1214        addr->u.q_unix.path = g_strndup(su->sun_path, sizeof(su->sun_path));
1215    }
1216
1217    return addr;
1218}
1219#endif /* WIN32 */
1220
1221#ifdef CONFIG_AF_VSOCK
1222static SocketAddress *
1223socket_sockaddr_to_address_vsock(struct sockaddr_storage *sa,
1224                                 socklen_t salen,
1225                                 Error **errp)
1226{
1227    SocketAddress *addr;
1228    VsockSocketAddress *vaddr;
1229    struct sockaddr_vm *svm = (struct sockaddr_vm *)sa;
1230
1231    addr = g_new0(SocketAddress, 1);
1232    addr->type = SOCKET_ADDRESS_TYPE_VSOCK;
1233    vaddr = &addr->u.vsock;
1234    vaddr->cid = g_strdup_printf("%u", svm->svm_cid);
1235    vaddr->port = g_strdup_printf("%u", svm->svm_port);
1236
1237    return addr;
1238}
1239#endif /* CONFIG_AF_VSOCK */
1240
1241SocketAddress *
1242socket_sockaddr_to_address(struct sockaddr_storage *sa,
1243                           socklen_t salen,
1244                           Error **errp)
1245{
1246    switch (sa->ss_family) {
1247    case AF_INET:
1248    case AF_INET6:
1249        return socket_sockaddr_to_address_inet(sa, salen, errp);
1250
1251#ifndef WIN32
1252    case AF_UNIX:
1253        return socket_sockaddr_to_address_unix(sa, salen, errp);
1254#endif /* WIN32 */
1255
1256#ifdef CONFIG_AF_VSOCK
1257    case AF_VSOCK:
1258        return socket_sockaddr_to_address_vsock(sa, salen, errp);
1259#endif
1260
1261    default:
1262        error_setg(errp, "socket family %d unsupported",
1263                   sa->ss_family);
1264        return NULL;
1265    }
1266    return 0;
1267}
1268
1269
1270SocketAddress *socket_local_address(int fd, Error **errp)
1271{
1272    struct sockaddr_storage ss;
1273    socklen_t sslen = sizeof(ss);
1274
1275    if (getsockname(fd, (struct sockaddr *)&ss, &sslen) < 0) {
1276        error_setg_errno(errp, errno, "%s",
1277                         "Unable to query local socket address");
1278        return NULL;
1279    }
1280
1281    return socket_sockaddr_to_address(&ss, sslen, errp);
1282}
1283
1284
1285SocketAddress *socket_remote_address(int fd, Error **errp)
1286{
1287    struct sockaddr_storage ss;
1288    socklen_t sslen = sizeof(ss);
1289
1290    if (getpeername(fd, (struct sockaddr *)&ss, &sslen) < 0) {
1291        error_setg_errno(errp, errno, "%s",
1292                         "Unable to query remote socket address");
1293        return NULL;
1294    }
1295
1296    return socket_sockaddr_to_address(&ss, sslen, errp);
1297}
1298
1299
1300SocketAddress *socket_address_flatten(SocketAddressLegacy *addr_legacy)
1301{
1302    SocketAddress *addr;
1303
1304    if (!addr_legacy) {
1305        return NULL;
1306    }
1307
1308    addr = g_new(SocketAddress, 1);
1309
1310    switch (addr_legacy->type) {
1311    case SOCKET_ADDRESS_LEGACY_KIND_INET:
1312        addr->type = SOCKET_ADDRESS_TYPE_INET;
1313        QAPI_CLONE_MEMBERS(InetSocketAddress, &addr->u.inet,
1314                           addr_legacy->u.inet.data);
1315        break;
1316    case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
1317        addr->type = SOCKET_ADDRESS_TYPE_UNIX;
1318        QAPI_CLONE_MEMBERS(UnixSocketAddress, &addr->u.q_unix,
1319                           addr_legacy->u.q_unix.data);
1320        break;
1321    case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
1322        addr->type = SOCKET_ADDRESS_TYPE_VSOCK;
1323        QAPI_CLONE_MEMBERS(VsockSocketAddress, &addr->u.vsock,
1324                           addr_legacy->u.vsock.data);
1325        break;
1326    case SOCKET_ADDRESS_LEGACY_KIND_FD:
1327        addr->type = SOCKET_ADDRESS_TYPE_FD;
1328        QAPI_CLONE_MEMBERS(String, &addr->u.fd, addr_legacy->u.fd.data);
1329        break;
1330    default:
1331        abort();
1332    }
1333
1334    return addr;
1335}
1336