Commit 02a08fef authored by Luiz Capitulino's avatar Luiz Capitulino
Browse files

net: inet_connect(), inet_connect_opts(): add in_progress argument



It's used to indicate the special case where a valid file-descriptor
is returned (ie. success) but the connection can't be completed
w/o blocking.

This is needed because QERR_SOCKET_CONNECT_IN_PROGRESS is not
treated like an error and a future commit will drop it.

Signed-off-by: default avatarLuiz Capitulino <lcapitulino@redhat.com>
Reviewed-by: default avatarMarkus Armbruster <armbru@redhat.com>
parent eef5ad10
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -86,7 +86,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, errp);
    s->fd = inet_connect(host_port, false, NULL, errp);

    if (!error_is_set(errp)) {
        migrate_fd_connect(s);
+1 −1
Original line number Diff line number Diff line
@@ -162,7 +162,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);
    return inet_connect(address_and_port, true, NULL, NULL);
}

int tcp_socket_incoming(const char *address, uint16_t port)
+1 −1
Original line number Diff line number Diff line
@@ -2446,7 +2446,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);
            fd = inet_connect_opts(opts, NULL, NULL);
        }
    }
    if (fd < 0) {
+11 −3
Original line number Diff line number Diff line
@@ -209,7 +209,7 @@ listen:
    return slisten;
}

int inet_connect_opts(QemuOpts *opts, Error **errp)
int inet_connect_opts(QemuOpts *opts, bool *in_progress, Error **errp)
{
    struct addrinfo ai,*res,*e;
    const char *addr;
@@ -224,6 +224,10 @@ int inet_connect_opts(QemuOpts *opts, Error **errp)
    ai.ai_family = PF_UNSPEC;
    ai.ai_socktype = SOCK_STREAM;

    if (in_progress) {
        *in_progress = false;
    }

    addr = qemu_opt_get(opts, "host");
    port = qemu_opt_get(opts, "port");
    block = qemu_opt_get_bool(opts, "block", 0);
@@ -277,6 +281,10 @@ int inet_connect_opts(QemuOpts *opts, Error **errp)
  #else
        if (!block && (rc == -EINPROGRESS)) {
  #endif
            if (in_progress) {
                *in_progress = true;
            }

            error_set(errp, QERR_SOCKET_CONNECT_IN_PROGRESS);
        } else if (rc < 0) {
            if (NULL == e->ai_next)
@@ -487,7 +495,7 @@ int inet_listen(const char *str, char *ostr, int olen,
    return sock;
}

int inet_connect(const char *str, bool block, Error **errp)
int inet_connect(const char *str, bool block, bool *in_progress, Error **errp)
{
    QemuOpts *opts;
    int sock = -1;
@@ -497,7 +505,7 @@ int inet_connect(const char *str, bool block, Error **errp)
        if (block) {
            qemu_opt_set(opts, "block", "on");
        }
        sock = inet_connect_opts(opts, errp);
        sock = inet_connect_opts(opts, in_progress, errp);
    } else {
        error_set(errp, QERR_SOCKET_CREATE_FAILED);
    }
+2 −2
Original line number Diff line number Diff line
@@ -42,8 +42,8 @@ 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, Error **errp);
int inet_connect(const char *str, bool block, 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_dgram_opts(QemuOpts *opts);
const char *inet_strfamily(int family);

Loading