1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-25 04:16:38 +02:00

core/plugins: Use res_init before getaddrinfo.

With weechat, if the network changes in anyway that causes resolv.conf
to be updated, that is not picked up, resulting in

    irc: connecting to server XXXX.com/1026 (SSL)...
    irc: address "XXX.com" not found
    irc: error: Name or service not known
    irc: reconnecting to server in 30 seconds

This happens, especially when one connects to an irc server behind a
VPN.

This can also happen when there is no network connectivity weechat was started
but later network is connected to.

The fix is simple, it relies on calling  res_init (3) before getaddrinfo in
network_connect_child and other places.

res_init reloads the resolv.conf and getaddrinfo does not fail with
address resolution error.
This commit is contained in:
Raghavendra Prabhu
2016-08-06 01:52:06 +01:00
committed by Raghavendra D Prabhu
parent eff8d3f3fb
commit 761c5e2d11
3 changed files with 14 additions and 2 deletions
+8 -1
View File
@@ -43,6 +43,7 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <resolv.h>
#include <errno.h>
#include <gcrypt.h>
#include <sys/time.h>
@@ -311,6 +312,9 @@ network_resolve (const char *hostname, char *ip, int *version)
res = NULL;
if (res_init() != 0)
return 0;
if (getaddrinfo (hostname, NULL, NULL, &res) != 0)
return 0;
@@ -696,6 +700,8 @@ network_connect_to (const char *proxy, struct sockaddr *address,
hints.ai_flags = AI_NUMERICSERV;
snprintf (str_port, sizeof (str_port), "%d",
CONFIG_INTEGER(ptr_proxy->options[PROXY_OPTION_PORT]));
if (res_init() != 0)
goto error;
if (getaddrinfo (CONFIG_STRING(ptr_proxy->options[PROXY_OPTION_ADDRESS]),
str_port, &hints, &proxy_addrinfo) != 0)
{
@@ -806,7 +812,8 @@ network_connect_child (struct t_hook *hook_connect)
#ifdef AI_ADDRCONFIG
hints.ai_flags = AI_ADDRCONFIG;
#endif /* AI_ADDRCONFIG */
if (ptr_proxy)
rc = res_init();
if (!rc && ptr_proxy)
{
hints.ai_family = (CONFIG_BOOLEAN(ptr_proxy->options[PROXY_OPTION_IPV6])) ?
AF_UNSPEC : AF_INET;
+3 -1
View File
@@ -38,6 +38,7 @@
#endif /* _WIN32 */
#include <sys/types.h>
#include <netdb.h>
#include <resolv.h>
#include <arpa/inet.h>
#include <netinet/in.h>
@@ -5132,7 +5133,8 @@ irc_server_xfer_send_ready_cb (const void *pointer, void *data,
"local_address");
if (local_address)
{
rc = getaddrinfo (local_address, NULL, NULL, &ainfo);
if ((rc = res_init()) == 0)
rc = getaddrinfo (local_address, NULL, NULL, &ainfo);
if ((rc == 0) && ainfo && ainfo->ai_addr)
{
if (ainfo->ai_family == AF_INET)
+3
View File
@@ -30,6 +30,7 @@
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <resolv.h>
#include <gcrypt.h>
#include <arpa/inet.h>
@@ -966,6 +967,8 @@ xfer_resolve_addr (const char *str_address, const char *str_port,
hints.ai_addr = NULL;
hints.ai_next = NULL;
if (res_init() != 0)
return 0;
rc = getaddrinfo (str_address, str_port, &hints, &ainfo);
if ((rc == 0) && ainfo && ainfo->ai_addr)
{