mirror of
https://github.com/irssi/irssi.git
synced 2026-08-21 01:22:26 +02:00
Merge pull request #1607 from ailin-nemui/gio-resolver-fixes
GResolver fixes
This commit is contained in:
commit
80b8875fea
3 changed files with 49 additions and 11 deletions
|
|
@ -408,16 +408,43 @@ static RESOLVED_IP_REC *net_gethostbyname(const char *addr, GResolverNameLookupF
|
||||||
GResolver *resolver;
|
GResolver *resolver;
|
||||||
RESOLVED_IP_REC *iprec;
|
RESOLVED_IP_REC *iprec;
|
||||||
|
|
||||||
#ifdef HAVE_CAPSICUM
|
|
||||||
if (capsicum_enabled())
|
|
||||||
return (capsicum_net_gethostbyname(addr, flags));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
g_return_val_if_fail(addr != NULL, NULL);
|
g_return_val_if_fail(addr != NULL, NULL);
|
||||||
|
|
||||||
error = NULL;
|
error = NULL;
|
||||||
resolver = g_resolver_get_default();
|
resolver = g_resolver_get_default();
|
||||||
|
#if GLIB_CHECK_VERSION(2, 59, 0)
|
||||||
ailist = g_resolver_lookup_by_name_with_flags(resolver, addr, flags, NULL, &error);
|
ailist = g_resolver_lookup_by_name_with_flags(resolver, addr, flags, NULL, &error);
|
||||||
|
#else
|
||||||
|
/* compatibility code for old GLib */
|
||||||
|
ailist = g_resolver_lookup_by_name(resolver, addr, NULL, &error);
|
||||||
|
if (error == NULL && flags) {
|
||||||
|
GList *ll, *lll;
|
||||||
|
|
||||||
|
for (ll = ailist; ll != NULL; ll = lll) {
|
||||||
|
GInetAddress *address;
|
||||||
|
GSocketFamily family;
|
||||||
|
|
||||||
|
address = G_INET_ADDRESS(ll->data);
|
||||||
|
family = g_inet_address_get_family(address);
|
||||||
|
lll = ll->next;
|
||||||
|
|
||||||
|
if ((flags == G_RESOLVER_NAME_LOOKUP_FLAGS_IPV4_ONLY &&
|
||||||
|
family == G_SOCKET_FAMILY_IPV6) ||
|
||||||
|
(flags == G_RESOLVER_NAME_LOOKUP_FLAGS_IPV6_ONLY &&
|
||||||
|
family == G_SOCKET_FAMILY_IPV4)) {
|
||||||
|
g_object_unref(address);
|
||||||
|
ailist = g_list_delete_link(ailist, ll);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ailist == NULL) {
|
||||||
|
g_set_error(&error, G_RESOLVER_ERROR, G_RESOLVER_ERROR_NOT_FOUND,
|
||||||
|
flags == G_RESOLVER_NAME_LOOKUP_FLAGS_IPV4_ONLY ?
|
||||||
|
"IPv4 address not found for host" :
|
||||||
|
"IPv6 address not found for host");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
iprec = g_new0(RESOLVED_IP_REC, 1);
|
iprec = g_new0(RESOLVED_IP_REC, 1);
|
||||||
if (error != NULL) {
|
if (error != NULL) {
|
||||||
iprec->error = error;
|
iprec->error = error;
|
||||||
|
|
@ -435,11 +462,16 @@ int net_gethostbyname_first_ips(const char *addr, GResolverNameLookupFlags flags
|
||||||
{
|
{
|
||||||
RESOLVED_IP_REC *iprec;
|
RESOLVED_IP_REC *iprec;
|
||||||
|
|
||||||
|
#ifdef HAVE_CAPSICUM
|
||||||
|
if (capsicum_enabled())
|
||||||
|
return (capsicum_net_gethostbyname(addr, ip4, ip6));
|
||||||
|
#endif
|
||||||
|
|
||||||
iprec = net_gethostbyname(addr, flags);
|
iprec = net_gethostbyname(addr, flags);
|
||||||
if (iprec->error == NULL) {
|
if (iprec->error == NULL) {
|
||||||
GList *curr;
|
GList *curr;
|
||||||
|
|
||||||
for (curr = iprec->ailist; curr->next; curr = curr->next) {
|
for (curr = iprec->ailist; curr; curr = curr->next) {
|
||||||
unsigned short family;
|
unsigned short family;
|
||||||
GInetAddress *addr;
|
GInetAddress *addr;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,9 +70,9 @@ static void get_source_host_ip(void)
|
||||||
net_gethostbyname_first_ips(hostname, G_RESOLVER_NAME_LOOKUP_FLAGS_DEFAULT,
|
net_gethostbyname_first_ips(hostname, G_RESOLVER_NAME_LOOKUP_FLAGS_DEFAULT,
|
||||||
&ip4, &ip6) == 0;
|
&ip4, &ip6) == 0;
|
||||||
|
|
||||||
if (source_host_ok)
|
if (source_host_ok) {
|
||||||
save_ips(&ip4, &ip6, &source_host_ip4, &source_host_ip6);
|
save_ips(&ip4, &ip6, &source_host_ip4, &source_host_ip6);
|
||||||
else {
|
} else {
|
||||||
g_free_and_null(source_host_ip4);
|
g_free_and_null(source_host_ip4);
|
||||||
g_free_and_null(source_host_ip6);
|
g_free_and_null(source_host_ip6);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -338,16 +338,22 @@ static void server_connect_use_resolved(SERVER_REC *server)
|
||||||
|
|
||||||
resolved_ip_unref(iprec);
|
resolved_ip_unref(iprec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_free(ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void server_connect_callback_resolved(RESOLVED_IP_REC *iprec, SERVER_REC *server)
|
static void server_connect_callback_resolved(RESOLVED_IP_REC *iprec, SERVER_REC *server)
|
||||||
{
|
{
|
||||||
|
if (server->connect_cancellable != NULL) {
|
||||||
|
g_object_unref(server->connect_cancellable);
|
||||||
server->connect_cancellable = NULL;
|
server->connect_cancellable = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (server->connrec->resolved_host != NULL) {
|
if (server->connrec->resolved_host != NULL) {
|
||||||
resolved_ip_unref(server->connrec->resolved_host);
|
resolved_ip_unref(server->connrec->resolved_host);
|
||||||
}
|
}
|
||||||
server->connrec->resolved_host = iprec;
|
server->connrec->resolved_host = iprec;
|
||||||
|
|
||||||
if (iprec->error == NULL && iprec->ailist == NULL) {
|
if (iprec->error == NULL && iprec->ailist == NULL) {
|
||||||
server->connection_lost = TRUE;
|
server->connection_lost = TRUE;
|
||||||
server->dns_error = TRUE;
|
server->dns_error = TRUE;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue