summaryrefslogtreecommitdiff
path: root/libc/inet/resolv.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/inet/resolv.c')
-rw-r--r--libc/inet/resolv.c185
1 files changed, 96 insertions, 89 deletions
diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c
index 70db2b738..5b39e3ffa 100644
--- a/libc/inet/resolv.c
+++ b/libc/inet/resolv.c
@@ -483,7 +483,6 @@ int attribute_hidden __length_dotted(const unsigned char * const data, int offse
return -1;
while ((l = data[offset++])) {
-
if ((l & 0xc0) == (0xc0)) {
offset++;
break;
@@ -534,7 +533,8 @@ int attribute_hidden __decode_question(const unsigned char * const message, int
offset += i;
- q->dotted = strdup(temp); /* TODO: what if this fails? */
+ q->dotted = strdup(temp);
+//TODO: what if this fails?
q->qtype = (message[offset + 0] << 8) | message[offset + 1];
q->qclass = (message[offset + 2] << 8) | message[offset + 3];
@@ -626,11 +626,11 @@ int __encode_packet(struct resolv_header *h,
struct resolv_answer **ar,
unsigned char *dest, int maxlen) attribute_hidden;
int __encode_packet(struct resolv_header *h,
- struct resolv_question **q,
- struct resolv_answer **an,
- struct resolv_answer **ns,
- struct resolv_answer **ar,
- unsigned char *dest, int maxlen)
+ struct resolv_question **q,
+ struct resolv_answer **an,
+ struct resolv_answer **ns,
+ struct resolv_answer **ar,
+ unsigned char *dest, int maxlen)
{
int i, total = 0;
unsigned j;
@@ -745,7 +745,7 @@ int attribute_hidden __dns_lookup(const char *name, int type, int nscount, char
struct resolv_answer ma;
bool first_answer = 1;
unsigned retries = 0;
- unsigned char * packet = malloc(PACKETSZ);
+ unsigned char *packet = malloc(PACKETSZ);
char *dns, *lookup = malloc(MAXDNAME);
int variant = -1; /* search domain to append, -1 - none */
int local_ns = -1, local_id = -1;
@@ -1259,13 +1259,13 @@ int res_query(const char *dname, int class, int type,
int __nameserversXX;
char ** __nameserverXX;
- __open_nameservers();
if (!dname || class != 1 /* CLASS_IN */) {
h_errno = NO_RECOVERY;
return -1;
}
memset(&a, '\0', sizeof(a));
+ __open_nameservers();
__UCLIBC_MUTEX_LOCK(__resolv_lock);
__nameserversXX = __nameservers;
@@ -1359,8 +1359,8 @@ int res_search(const char *name, int class, int type, u_char *answer,
bool done = 0;
for (domain = (const char * const *)_res_dnsrch;
- *domain && !done;
- domain++) {
+ *domain && !done;
+ domain++) {
ret = res_querydomain(name, *domain, class, type,
answer, anslen);
@@ -1882,8 +1882,9 @@ BAD_FAM:
else
#endif
#ifdef __UCLIBC_HAS_IPV4__
- h = gethostbyaddr ((const void *) &(((const struct sockaddr_in *)sa)->sin_addr),
- sizeof(struct in_addr), AF_INET);
+ h = gethostbyaddr ((const void *)
+ &(((const struct sockaddr_in *)sa)->sin_addr),
+ sizeof(struct in_addr), AF_INET);
#endif /* __UCLIBC_HAS_IPV4__ */
if (h) {
@@ -1895,81 +1896,78 @@ BAD_FAM:
strncpy (host, h->h_name,
min(hostlen, (size_t) (c - h->h_name)));
host[min(hostlen - 1, (size_t) (c - h->h_name))] = '\0';
- ok = 1;
} else {
strncpy (host, h->h_name, hostlen);
- ok = 1;
}
- }
+ ok = 1;
+ }
}
if (!ok) {
+ const char *c;
+
if (flags & NI_NAMEREQD) {
errno = serrno;
return EAI_NONAME;
- } else {
- const char *c;
+ }
#ifdef __UCLIBC_HAS_IPV6__
- if (sa->sa_family == AF_INET6) {
- const struct sockaddr_in6 *sin6p;
-
- sin6p = (const struct sockaddr_in6 *) sa;
+ if (sa->sa_family == AF_INET6) {
+ const struct sockaddr_in6 *sin6p;
- c = inet_ntop (AF_INET6,
- (const void *) &sin6p->sin6_addr, host, hostlen);
+ sin6p = (const struct sockaddr_in6 *) sa;
+ c = inet_ntop (AF_INET6,
+ (const void *) &sin6p->sin6_addr, host, hostlen);
#if 0
- /* Does scope id need to be supported? */
- uint32_t scopeid;
- scopeid = sin6p->sin6_scope_id;
- if (scopeid != 0) {
- /* Buffer is >= IFNAMSIZ+1. */
- char scopebuf[IFNAMSIZ + 1];
- char *scopeptr;
- int ni_numericscope = 0;
- size_t real_hostlen = strnlen (host, hostlen);
- size_t scopelen = 0;
-
- scopebuf[0] = SCOPE_DELIMITER;
- scopebuf[1] = '\0';
- scopeptr = &scopebuf[1];
-
- if (IN6_IS_ADDR_LINKLOCAL (&sin6p->sin6_addr)
- || IN6_IS_ADDR_MC_LINKLOCAL (&sin6p->sin6_addr)) {
- if (if_indextoname (scopeid, scopeptr) == NULL)
- ++ni_numericscope;
- else
- scopelen = strlen (scopebuf);
- } else {
+ /* Does scope id need to be supported? */
+ uint32_t scopeid;
+ scopeid = sin6p->sin6_scope_id;
+ if (scopeid != 0) {
+ /* Buffer is >= IFNAMSIZ+1. */
+ char scopebuf[IFNAMSIZ + 1];
+ char *scopeptr;
+ int ni_numericscope = 0;
+ size_t real_hostlen = strnlen (host, hostlen);
+ size_t scopelen = 0;
+
+ scopebuf[0] = SCOPE_DELIMITER;
+ scopebuf[1] = '\0';
+ scopeptr = &scopebuf[1];
+
+ if (IN6_IS_ADDR_LINKLOCAL (&sin6p->sin6_addr)
+ || IN6_IS_ADDR_MC_LINKLOCAL (&sin6p->sin6_addr)) {
+ if (if_indextoname (scopeid, scopeptr) == NULL)
++ni_numericscope;
- }
-
- if (ni_numericscope)
- scopelen = 1 + snprintf (scopeptr,
- (scopebuf
- + sizeof scopebuf
- - scopeptr),
- "%u", scopeid);
-
- if (real_hostlen + scopelen + 1 > hostlen)
- return EAI_SYSTEM;
- memcpy (host + real_hostlen, scopebuf, scopelen + 1);
+ else
+ scopelen = strlen (scopebuf);
+ } else {
+ ++ni_numericscope;
}
-#endif
+
+ if (ni_numericscope)
+ scopelen = 1 + snprintf (scopeptr,
+ (scopebuf
+ + sizeof scopebuf
+ - scopeptr),
+ "%u", scopeid);
+
+ if (real_hostlen + scopelen + 1 > hostlen)
+ return EAI_SYSTEM;
+ memcpy (host + real_hostlen, scopebuf, scopelen + 1);
}
+#endif
+ }
#endif /* __UCLIBC_HAS_IPV6__ */
#if defined __UCLIBC_HAS_IPV6__ && defined __UCLIBC_HAS_IPV4__
- else
+ else
#endif /* __UCLIBC_HAS_IPV6__ && defined __UCLIBC_HAS_IPV4__ */
#if defined __UCLIBC_HAS_IPV4__
- c = inet_ntop (AF_INET, (const void *)
- &(((const struct sockaddr_in *) sa)->sin_addr),
- host, hostlen);
+ c = inet_ntop (AF_INET, (const void *)
+ &(((const struct sockaddr_in *) sa)->sin_addr),
+ host, hostlen);
#endif /* __UCLIBC_HAS_IPV4__ */
-
- if (c == NULL) {
- errno = serrno;
- return EAI_SYSTEM;
- }
+ if (c == NULL) {
+ errno = serrno;
+ return EAI_SYSTEM;
}
ok = 1;
}
@@ -1992,8 +1990,8 @@ BAD_FAM:
strncpy (host, "localhost", hostlen);
break;
-
-/*Already checked above default:
+/* Already checked above
+ default:
return EAI_FAMILY;
*/
}
@@ -2044,18 +2042,17 @@ int gethostbyname_r(const char * name,
int __nameserversXX;
char ** __nameserverXX;
- __open_nameservers();
*result = NULL;
if (!name)
return EINVAL;
/* do /etc/hosts first */
{
- int old_errno = errno; /* Save the old errno and reset errno */
- __set_errno(0); /* to check for missing /etc/hosts. */
-
- if ((i = __get_hosts_byname_r(name, AF_INET, result_buf,
- buf, buflen, result, h_errnop)) == 0)
+ int old_errno = errno; /* save the old errno and reset errno */
+ __set_errno(0); /* to check for missing /etc/hosts. */
+ i = __get_hosts_byname_r(name, AF_INET, result_buf,
+ buf, buflen, result, h_errnop);
+ if (i == 0)
return i;
switch (*h_errnop) {
case HOST_NOT_FOUND:
@@ -2124,7 +2121,10 @@ int gethostbyname_r(const char * name,
return NETDB_SUCCESS;
}
- for (;;) {
+ __open_nameservers();
+
+ /*for (;;)*/ {
+//FIXME: why was it a loop? It never loops...
__UCLIBC_MUTEX_LOCK(__resolv_lock);
__nameserversXX = __nameservers;
__nameserverXX = __nameserver;
@@ -2146,7 +2146,9 @@ int gethostbyname_r(const char * name,
*h_errnop = NETDB_INTERNAL;
DPRINTF("buffer too small for all addresses\n");
return ERANGE;
- } else if (a.add_count > 0) {
+ }
+
+ if (a.add_count > 0) {
memmove(buf - sizeof(struct in_addr*)*2, buf, a.add_count * a.rdlength);
addr_list = (struct in_addr**)(buf + a.add_count * a.rdlength);
addr_list[0] = in;
@@ -2171,17 +2173,20 @@ int gethostbyname_r(const char * name,
#endif
result_buf->h_aliases = alias; /* TODO: generate the full list */
free(packet);
- break;
- } else {
- free(packet);
- *h_errnop = HOST_NOT_FOUND;
- return TRY_AGAIN;
+ /*was: break;*/
+ *result = result_buf;
+ *h_errnop = NETDB_SUCCESS;
+ return NETDB_SUCCESS;
}
+ free(packet);
+ *h_errnop = HOST_NOT_FOUND;
+ return TRY_AGAIN;
}
-
+/*
*result = result_buf;
*h_errnop = NETDB_SUCCESS;
return NETDB_SUCCESS;
+*/
}
libc_hidden_def(gethostbyname_r)
#endif
@@ -2506,7 +2511,9 @@ int gethostbyaddr_r(const void *addr, socklen_t len, int type,
return -1;
}
continue;
- } else if (a.atype == T_PTR) { /* ADDRESS */
+ }
+
+ if (a.atype == T_PTR) { /* ADDRESS */
i = __decode_dotted(packet, a.rdoffset, buf, buflen);
free(packet);
@@ -2524,11 +2531,11 @@ int gethostbyaddr_r(const void *addr, socklen_t len, int type,
result_buf->h_addr_list = (char **) addr_list;
result_buf->h_aliases = alias;
break;
- } else {
- free(packet);
- *h_errnop = NO_ADDRESS;
- return TRY_AGAIN;
}
+
+ free(packet);
+ *h_errnop = NO_ADDRESS;
+ return TRY_AGAIN;
}
*result = result_buf;