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