diff options
Diffstat (limited to 'ext/socket/ipsocket.c')
-rw-r--r-- | ext/socket/ipsocket.c | 70 |
1 files changed, 42 insertions, 28 deletions
diff --git a/ext/socket/ipsocket.c b/ext/socket/ipsocket.c index 9530dac482..86a4f2659b 100644 --- a/ext/socket/ipsocket.c +++ b/ext/socket/ipsocket.c @@ -1087,6 +1087,48 @@ init_fast_fallback_inetsock_internal(VALUE v) status = wait_arg.status = 0; } + if (!resolution_store.is_all_finised) { + if (!resolution_store.v6.finished && arg->getaddrinfo_entries[IPV6_ENTRY_POS]->has_syserr) { + resolution_store.v6.finished = true; + + if (arg->getaddrinfo_entries[IPV6_ENTRY_POS]->err) { + last_error.type = RESOLUTION_ERROR; + last_error.ecode = arg->getaddrinfo_entries[IPV6_ENTRY_POS]->err; + syscall = "getaddrinfo(3)"; + resolution_store.v6.has_error = true; + } else { + resolution_store.v6.ai = arg->getaddrinfo_entries[IPV6_ENTRY_POS]->ai; + } + + if (resolution_store.v4.finished) { + resolution_store.is_all_finised = true; + resolution_delay_expires_at = NULL; + user_specified_resolv_timeout_at = NULL; + } + } + if (!resolution_store.v4.finished && arg->getaddrinfo_entries[IPV4_ENTRY_POS]->has_syserr) { + resolution_store.v4.finished = true; + + if (arg->getaddrinfo_entries[IPV4_ENTRY_POS]->err) { + last_error.type = RESOLUTION_ERROR; + last_error.ecode = arg->getaddrinfo_entries[IPV4_ENTRY_POS]->err; + syscall = "getaddrinfo(3)"; + resolution_store.v4.has_error = true; + } else { + resolution_store.v4.ai = arg->getaddrinfo_entries[IPV4_ENTRY_POS]->ai; + } + + if (resolution_store.v6.finished) { + resolution_store.is_all_finised = true; + resolution_delay_expires_at = NULL; + user_specified_resolv_timeout_at = NULL; + } else { + set_timeout_tv(&resolution_delay_storage, 50, now); + resolution_delay_expires_at = &resolution_delay_storage; + } + } + } + if (!any_addrinfos(&resolution_store)) { if (!in_progress_fds(arg->connection_attempt_fds_size) && resolution_store.is_all_finised) { @@ -1113,34 +1155,6 @@ init_fast_fallback_inetsock_internal(VALUE v) rb_raise(etimedout_error, "user specified timeout"); } } - - if (!resolution_store.is_all_finised) { - if (!resolution_store.v6.finished && arg->getaddrinfo_entries[IPV6_ENTRY_POS]->has_syserr) { - resolution_store.v6.ai = arg->getaddrinfo_entries[IPV6_ENTRY_POS]->ai; - resolution_store.v6.finished = true; - - if (resolution_store.v4.finished) { - resolution_store.is_all_finised = true; - wait_arg.readfds = NULL; - resolution_delay_expires_at = NULL; - user_specified_resolv_timeout_at = NULL; - } - } - if (!resolution_store.v4.finished && arg->getaddrinfo_entries[IPV4_ENTRY_POS]->has_syserr) { - resolution_store.v4.ai = arg->getaddrinfo_entries[IPV4_ENTRY_POS]->ai; - resolution_store.v4.finished = true; - - if (resolution_store.v6.finished) { - resolution_store.is_all_finised = true; - wait_arg.readfds = NULL; - resolution_delay_expires_at = NULL; - user_specified_resolv_timeout_at = NULL; - } else { - set_timeout_tv(&resolution_delay_storage, 50, now); - resolution_delay_expires_at = &resolution_delay_storage; - } - } - } } rb_thread_check_ints(); |