1
0
mirror of https://github.com/irssi/irssi.git synced 2024-12-04 14:46:39 -05:00

"Temporary error in nameserver" shouldn't remove server reconnections.

git-svn-id: http://svn.irssi.org/repos/irssi/trunk@412 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Timo Sirainen 2000-07-02 11:56:38 +00:00 committed by cras
parent c15f655bca
commit 2f97b822fb
3 changed files with 24 additions and 8 deletions

View File

@ -340,7 +340,7 @@ int net_gethostbyname(const char *addr, IPADDR *ip)
freeaddrinfo(ai); freeaddrinfo(ai);
#else #else
hp = gethostbyname(addr); hp = gethostbyname(addr);
if (hp == NULL) return -1; if (hp == NULL) return h_errno;
ip->family = AF_INET; ip->family = AF_INET;
memcpy(&ip->addr, hp->h_addr, 4); memcpy(&ip->addr, hp->h_addr, 4);
@ -467,7 +467,7 @@ const char *net_gethosterror(int error)
return gai_strerror(error); return gai_strerror(error);
#else #else
switch (h_errno) { switch (error) {
case HOST_NOT_FOUND: case HOST_NOT_FOUND:
return _("Host not found"); return _("Host not found");
case NO_ADDRESS: case NO_ADDRESS:
@ -483,6 +483,17 @@ const char *net_gethosterror(int error)
#endif #endif
} }
/* return TRUE if host lookup failed because it didn't exist (ie. not
some error with name server) */
int net_hosterror_notfound(int error)
{
#ifdef HAVE_IPV6
return error != 1 && (error == EAI_NONAME || error == EAI_NODATA);
#else
return error == HOST_NOT_FOUND || error == NO_ADDRESS;
#endif
}
int is_ipv4_address(const char *host) int is_ipv4_address(const char *host)
{ {
while (*host != '\0') { while (*host != '\0') {

View File

@ -58,6 +58,9 @@ int net_gethostbyname(const char *addr, IPADDR *ip);
int net_gethostbyaddr(IPADDR *ip, char **name); int net_gethostbyaddr(IPADDR *ip, char **name);
/* get error of net_gethostname() */ /* get error of net_gethostname() */
const char *net_gethosterror(int error); const char *net_gethosterror(int error);
/* return TRUE if host lookup failed because it didn't exist (ie. not
some error with name server) */
int net_hosterror_notfound(int error);
/* Get socket address/port */ /* Get socket address/port */
int net_getsockname(int handle, IPADDR *addr, int *port); int net_getsockname(int handle, IPADDR *addr, int *port);

View File

@ -141,20 +141,22 @@ static void server_connect_callback_readpipe(SERVER_REC *server, int handle)
server->connect_pipe[1] = -1; server->connect_pipe[1] = -1;
conn = server->connrec; conn = server->connrec;
server->handle = iprec.error == -1 ? -1 : server->handle = iprec.error != 0 ? -1 :
net_connect_ip(&iprec.ip, conn->proxy != NULL ? net_connect_ip(&iprec.ip, conn->proxy != NULL ?
conn->proxy_port : conn->port, conn->proxy_port : conn->port,
conn->own_ip != NULL ? conn->own_ip : NULL); conn->own_ip != NULL ? conn->own_ip : NULL);
if (server->handle == -1) { if (server->handle == -1) {
/* failed */ /* failed */
if (iprec.error != -1) { if (iprec.error == 0 || !net_hosterror_notfound(iprec.error)) {
/* reconnect only if connect() was the one that /* reconnect back only if either
failed, if host lookup failed we most probably 1) connect() failed
don't want to try reconnecting back. */ 2) host name lookup failed not because the host
wasn't found, but because there was some
other error in nameserver */
server->connection_lost = TRUE; server->connection_lost = TRUE;
} }
server_cant_connect(server, server_cant_connect(server,
iprec.error != -1 ? g_strerror(errno) : /* connect() failed */ iprec.error == 0 ? g_strerror(errno) : /* connect() failed */
(iprec.errorstr != NULL ? iprec.errorstr : "Host lookup failed")); /* gethostbyname() failed */ (iprec.errorstr != NULL ? iprec.errorstr : "Host lookup failed")); /* gethostbyname() failed */
g_free_not_null(iprec.errorstr); g_free_not_null(iprec.errorstr);
return; return;