Merge "Support gethostbyname_r_ERANGE."

This commit is contained in:
Yabin Cui 2014-12-19 22:53:25 +00:00 committed by Gerrit Code Review
commit e28a186491
3 changed files with 18 additions and 3 deletions

View file

@ -1208,7 +1208,7 @@ _dns_gethtbyname(void *rv, void *cb_data, va_list ap)
free(buf);
__res_put_state(res);
if (hp == NULL)
switch (h_errno) {
switch (*info->he) {
case HOST_NOT_FOUND:
return NS_NOTFOUND;
case TRY_AGAIN:
@ -1326,6 +1326,7 @@ _dns_gethtbyaddr(void *rv, void *cb_data, va_list ap)
*info->he = NETDB_SUCCESS;
return NS_SUCCESS;
nospc:
errno = ENOSPC;
*info->he = NETDB_INTERNAL;
return NS_UNAVAIL;
}

View file

@ -71,6 +71,7 @@
#include <sys/cdefs.h>
#include <assert.h>
#include <errno.h>
#include <nsswitch.h>
#include <stdarg.h>
#include <strings.h>
@ -133,6 +134,10 @@ nsdispatch(void *retval, const ns_dtab disp_tab[], const char *database,
continue;
if (result & srclist[i].flags)
break;
/* Stop trying next resolver when there is a memory space fatal error. */
if ((result & NS_UNAVAIL) != 0 && errno == ENOSPC) {
break;
}
}
}
result &= NS_STATUSMASK; /* clear private flags in result */

View file

@ -116,7 +116,9 @@ _hf_gethtbyname(void *rv, void *cb_data, va_list ap)
hp = _hf_gethtbyname2(name, af, info);
#endif
if (hp == NULL) {
*info->he = HOST_NOT_FOUND;
if (*info->he == NETDB_INTERNAL && errno == ENOSPC) {
return NS_UNAVAIL;
}
return NS_NOTFOUND;
}
return NS_SUCCESS;
@ -159,8 +161,12 @@ _hf_gethtbyname2(const char *name, int af, struct getnamaddr *info)
hp = netbsd_gethostent_r(hf, info->hp, info->buf, info->buflen,
info->he);
if (hp == NULL)
if (hp == NULL) {
if (*info->he == NETDB_INTERNAL && errno == ENOSPC) {
goto nospc;
}
break;
}
if (strcasecmp(hp->h_name, name) != 0) {
char **cp;
@ -259,6 +265,9 @@ _hf_gethtbyaddr(void *rv, void *cb_data, va_list ap)
endhostent_r(&hf);
if (hp == NULL) {
if (errno == ENOSPC) {
return NS_UNAVAIL;
}
*info->he = HOST_NOT_FOUND;
return NS_NOTFOUND;
}