Commit 5db5f44c authored by Orit Wasserman's avatar Orit Wasserman Committed by Anthony Liguori
Browse files

Separate inet_connect into inet_connect (blocking) and inet_nonblocking_connect



No need to add non blocking parameters to the blocking inet_connect
add block parameter for inet_connect_opts instead of using QemuOpt "block".

Signed-off-by: default avatarOrit Wasserman <owasserm@redhat.com>
Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parent 05bc1d8a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -88,7 +88,7 @@ int tcp_start_outgoing_migration(MigrationState *s, const char *host_port,
    s->write = socket_write;
    s->close = tcp_close;

    s->fd = inet_connect(host_port, false, &in_progress, errp);
    s->fd = inet_nonblocking_connect(host_port, &in_progress, errp);
    if (error_is_set(errp)) {
        migrate_fd_error(s);
        return -1;
+1 −1
Original line number Diff line number Diff line
@@ -208,7 +208,7 @@ int tcp_socket_outgoing(const char *address, uint16_t port)

int tcp_socket_outgoing_spec(const char *address_and_port)
{
    return inet_connect(address_and_port, true, NULL, NULL);
    return inet_connect(address_and_port, NULL);
}

int tcp_socket_incoming(const char *address, uint16_t port)
+1 −1
Original line number Diff line number Diff line
@@ -2456,7 +2456,7 @@ static CharDriverState *qemu_chr_open_socket(QemuOpts *opts)
        if (is_listen) {
            fd = inet_listen_opts(opts, 0, NULL);
        } else {
            fd = inet_connect_opts(opts, NULL, NULL);
            fd = inet_connect_opts(opts, true, NULL, NULL);
        }
    }
    if (fd < 0) {
+48 −10
Original line number Diff line number Diff line
@@ -54,9 +54,6 @@ static QemuOptsList dummy_opts = {
        },{
            .name = "ipv6",
            .type = QEMU_OPT_BOOL,
        },{
            .name = "block",
            .type = QEMU_OPT_BOOL,
        },
        { /* end if list */ }
    },
@@ -294,11 +291,22 @@ static struct addrinfo *inet_parse_connect_opts(QemuOpts *opts, Error **errp)
    return res;
}

int inet_connect_opts(QemuOpts *opts, bool *in_progress, Error **errp)
/**
 * Create a socket and connect it to an address.
 *
 * @opts: QEMU options, recognized parameters strings "host" and "port",
 *        bools "ipv4" and "ipv6".
 * @block: set true for blocking socket
 * @in_progress: set to true in case of ongoing connect
 * @errp: set on error
 *
 * Returns: -1 on error, file descriptor on success.
 */
int inet_connect_opts(QemuOpts *opts, bool block, bool *in_progress,
                      Error **errp)
{
    struct addrinfo *res, *e;
    int sock = -1;
    bool block = qemu_opt_get_bool(opts, "block", 0);

    res = inet_parse_connect_opts(opts, errp);
    if (!res) {
@@ -515,17 +523,47 @@ int inet_listen(const char *str, char *ostr, int olen,
    return sock;
}

int inet_connect(const char *str, bool block, bool *in_progress, Error **errp)
/**
 * Create a blocking socket and connect it to an address.
 *
 * @str: address string
 * @errp: set in case of an error
 *
 * Returns -1 in case of error, file descriptor on success
 **/
int inet_connect(const char *str, Error **errp)
{
    QemuOpts *opts;
    int sock = -1;

    opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL);
    if (inet_parse(opts, str) == 0) {
        if (block) {
            qemu_opt_set(opts, "block", "on");
        sock = inet_connect_opts(opts, true, NULL, errp);
    } else {
        error_set(errp, QERR_SOCKET_CREATE_FAILED);
    }
        sock = inet_connect_opts(opts, in_progress, errp);
    qemu_opts_del(opts);
    return sock;
}

/**
 * Create a non-blocking socket and connect it to an address.
 *
 * @str: address string
 * @in_progress: set to true in case of ongoing connect
 * @errp: set in case of an error
 *
 * Returns: -1 on error, file descriptor on success.
 **/
int inet_nonblocking_connect(const char *str, bool *in_progress,
                             Error **errp)
{
    QemuOpts *opts;
    int sock = -1;

    opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL);
    if (inet_parse(opts, str) == 0) {
        sock = inet_connect_opts(opts, false, in_progress, errp);
    } else {
        error_set(errp, QERR_SOCKET_CREATE_FAILED);
    }
+5 −2
Original line number Diff line number Diff line
@@ -42,8 +42,11 @@ int send_all(int fd, const void *buf, int len1);
int inet_listen_opts(QemuOpts *opts, int port_offset, Error **errp);
int inet_listen(const char *str, char *ostr, int olen,
                int socktype, int port_offset, Error **errp);
int inet_connect_opts(QemuOpts *opts, bool *in_progress, Error **errp);
int inet_connect(const char *str, bool block, bool *in_progress, Error **errp);
int inet_connect_opts(QemuOpts *opts, bool block, bool *in_progress,
                      Error **errp);
int inet_connect(const char *str, Error **errp);
int inet_nonblocking_connect(const char *str, bool *in_progress,
                             Error **errp);
int inet_dgram_opts(QemuOpts *opts);
const char *inet_strfamily(int family);

Loading