|
@@ -162,7 +162,7 @@
|
|
|
#define ALIAS_DIM (2 + MAX_ALIASES + 1)
|
|
|
|
|
|
#undef DEBUG
|
|
|
-/*#define DEBUG*/
|
|
|
+/* #define DEBUG */
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
#define DPRINTF(X,args...) fprintf(stderr, X, ##args)
|
|
@@ -788,8 +788,8 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip,
|
|
|
goto tryall;
|
|
|
}
|
|
|
|
|
|
- i = recv(fd, packet, 512, 0);
|
|
|
- if (i < HFIXEDSZ) {
|
|
|
+ len = recv(fd, packet, 512, 0);
|
|
|
+ if (len < HFIXEDSZ) {
|
|
|
/* too short ! */
|
|
|
goto again;
|
|
|
}
|
|
@@ -857,7 +857,7 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip,
|
|
|
else
|
|
|
free(packet);
|
|
|
free(lookup);
|
|
|
- return (0); /* success! */
|
|
|
+ return (len); /* success! */
|
|
|
|
|
|
tryall:
|
|
|
/* if there are other nameservers, give them a go,
|
|
@@ -904,6 +904,7 @@ fail:
|
|
|
free(lookup);
|
|
|
if (packet)
|
|
|
free(packet);
|
|
|
+ h_errno = NETDB_INTERNAL;
|
|
|
return -1;
|
|
|
}
|
|
|
#endif
|
|
@@ -938,7 +939,8 @@ int __open_nameservers()
|
|
|
}
|
|
|
|
|
|
if ((fp = fopen("/etc/resolv.conf", "r")) ||
|
|
|
- (fp = fopen("/etc/config/resolv.conf", "r"))) {
|
|
|
+ (fp = fopen("/etc/config/resolv.conf", "r")))
|
|
|
+ {
|
|
|
|
|
|
while (fgets(szBuffer, sizeof(szBuffer), fp) != NULL) {
|
|
|
|
|
@@ -975,12 +977,14 @@ int __open_nameservers()
|
|
|
}
|
|
|
}
|
|
|
fclose(fp);
|
|
|
- } else {
|
|
|
- DPRINTF("failed to open %s\n", "resolv.conf");
|
|
|
+ DPRINTF("nameservers = %d\n", __nameservers);
|
|
|
+ BIGUNLOCK;
|
|
|
+ return 0;
|
|
|
}
|
|
|
- DPRINTF("nameservers = %d\n", __nameservers);
|
|
|
+ DPRINTF("failed to open %s\n", "resolv.conf");
|
|
|
+ h_errno = NO_RECOVERY;
|
|
|
BIGUNLOCK;
|
|
|
- return 0;
|
|
|
+ return -1;
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -1055,7 +1059,9 @@ int res_init(void)
|
|
|
struct __res_state *rp = &(_res);
|
|
|
|
|
|
__close_nameservers();
|
|
|
- __open_nameservers();
|
|
|
+ if (__open_nameservers()) {
|
|
|
+ return(-1);
|
|
|
+ }
|
|
|
rp->retrans = RES_TIMEOUT;
|
|
|
rp->retry = 4;
|
|
|
rp->options = RES_INIT;
|
|
@@ -1119,10 +1125,10 @@ int res_query(const char *dname, int class, int type,
|
|
|
int __nameserversXX;
|
|
|
char ** __nameserverXX;
|
|
|
|
|
|
- __open_nameservers();
|
|
|
-
|
|
|
- if (!dname || class != 1 /* CLASS_IN */)
|
|
|
+ if (__open_nameservers() || !dname || class != 1 /* CLASS_IN */) {
|
|
|
+ h_errno = NO_RECOVERY;
|
|
|
return(-1);
|
|
|
+ }
|
|
|
|
|
|
memset((char *) &a, '\0', sizeof(a));
|
|
|
|
|
@@ -1132,21 +1138,23 @@ int res_query(const char *dname, int class, int type,
|
|
|
BIGUNLOCK;
|
|
|
i = __dns_lookup(dname, type, __nameserversXX, __nameserverXX, &packet, &a);
|
|
|
|
|
|
- if (i < 0)
|
|
|
+ if (i < 0) {
|
|
|
+ h_errno = TRY_AGAIN;
|
|
|
return(-1);
|
|
|
+ }
|
|
|
|
|
|
free(a.dotted);
|
|
|
|
|
|
if (a.atype == type) { /* CNAME*/
|
|
|
- if (anslen && answer)
|
|
|
- memcpy(answer, a.rdata, MIN(anslen, a.rdlength));
|
|
|
+ int len = MIN(anslen, i);
|
|
|
+ memcpy(answer, packet, len);
|
|
|
if (packet)
|
|
|
free(packet);
|
|
|
- return(MIN(anslen, a.rdlength));
|
|
|
+ return(len);
|
|
|
}
|
|
|
if (packet)
|
|
|
free(packet);
|
|
|
- return 0;
|
|
|
+ return i;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1167,10 +1175,7 @@ int res_search(name, class, type, answer, anslen)
|
|
|
int trailing_dot, ret, saved_herrno;
|
|
|
int got_nodata = 0, got_servfail = 0, tried_as_is = 0;
|
|
|
|
|
|
- if (!name || !answer)
|
|
|
- return(-1);
|
|
|
-
|
|
|
- if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
|
|
|
+ if ((!name || !answer) || ((_res.options & RES_INIT) == 0 && res_init() == -1)) {
|
|
|
h_errno = NETDB_INTERNAL;
|
|
|
return (-1);
|
|
|
}
|
|
@@ -1303,13 +1308,11 @@ int res_querydomain(name, domain, class, type, answer, anslen)
|
|
|
const char *longname = nbuf;
|
|
|
size_t n, d;
|
|
|
|
|
|
- if (!name || !answer)
|
|
|
- return(-1);
|
|
|
-
|
|
|
- if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
|
|
|
+ if ((!name || !answer) || ((_res.options & RES_INIT) == 0 && res_init() == -1)) {
|
|
|
h_errno = NETDB_INTERNAL;
|
|
|
return (-1);
|
|
|
}
|
|
|
+
|
|
|
#ifdef DEBUG
|
|
|
if (_res.options & RES_DEBUG)
|
|
|
printf(";; res_querydomain(%s, %s, %d, %d)\n",
|
|
@@ -1854,7 +1857,9 @@ int gethostbyname_r(const char * name,
|
|
|
int __nameserversXX;
|
|
|
char ** __nameserverXX;
|
|
|
|
|
|
- __open_nameservers();
|
|
|
+ if (__open_nameservers()) {
|
|
|
+ return(-1);
|
|
|
+ }
|
|
|
|
|
|
*result=NULL;
|
|
|
if (!name)
|
|
@@ -2010,7 +2015,9 @@ int gethostbyname2_r(const char *name, int family,
|
|
|
if (family != AF_INET6)
|
|
|
return EINVAL;
|
|
|
|
|
|
- __open_nameservers();
|
|
|
+ if (__open_nameservers()) {
|
|
|
+ return(-1);
|
|
|
+ }
|
|
|
|
|
|
*result=NULL;
|
|
|
if (!name)
|
|
@@ -2178,7 +2185,9 @@ int gethostbyaddr_r (const void *addr, socklen_t len, int type,
|
|
|
return i;
|
|
|
}
|
|
|
|
|
|
- __open_nameservers();
|
|
|
+ if (__open_nameservers()) {
|
|
|
+ return(-1);
|
|
|
+ }
|
|
|
|
|
|
#ifdef __UCLIBC_HAS_IPV6__
|
|
|
qp=buf;
|