diff options
author | Eric Andersen <andersen@codepoet.org> | 2002-06-20 05:22:17 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2002-06-20 05:22:17 +0000 |
commit | 76c03cedb9a3f496a0e4fc5580ea1324c28815d2 (patch) | |
tree | 6fe536d7b926829e1072b2bb7ae782fa2c028016 /libc | |
parent | cc07250e5667753212a5dc4d695fbf5ceb8bd07b (diff) |
Fix DNS resolution so that it once again works. I'd broken it
when adding some locking code.
-Erik
Diffstat (limited to 'libc')
-rw-r--r-- | libc/inet/resolv.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c index e45154d3f..66bc8df69 100644 --- a/libc/inet/resolv.c +++ b/libc/inet/resolv.c @@ -344,7 +344,7 @@ int encode_question(struct resolv_question *q, int decode_question(unsigned char *message, int offset, struct resolv_question *q) { - char temp[BUFSIZ]; + char temp[256]; int i; i = decode_dotted(message, offset, temp, sizeof(temp)); @@ -409,7 +409,7 @@ int encode_answer(struct resolv_answer *a, unsigned char *dest, int maxlen) int decode_answer(unsigned char *message, int offset, struct resolv_answer *a) { - char temp[BUFSIZ]; + char temp[256]; int i; i = decode_dotted(message, offset, temp, sizeof(temp)); @@ -531,10 +531,25 @@ int form_query(int id, const char *name, int type, unsigned char *packet, #ifdef L_dnslookup +#ifdef __UCLIBC_HAS_THREADS__ +#include <pthread.h> +static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER; +# define LOCK pthread_mutex_lock(&mylock) +# define UNLOCK pthread_mutex_unlock(&mylock); +#else +# define LOCK +# define UNLOCK +#endif + +/* Just for the record, having to lock dns_lookup() just for these two globals + * is pretty lame. Sometime I should work on making the locking a bit more + * careful to avoid needless blocking... */ +static int ns=0, id=1; + int dns_lookup(const char *name, int type, int nscount, char **nsip, unsigned char **outpacket, struct resolv_answer *a) { - int i, j, len, fd, pos, id, ns; + int i, j, len, fd, pos; struct sockaddr_in sa; #ifdef __UCLIBC_HAS_IPV6__ struct sockaddr_in6 sa6; @@ -558,6 +573,7 @@ int dns_lookup(const char *name, int type, int nscount, char **nsip, DPRINTF("Looking up type %d answer for '%s'\n", type, name); + LOCK; ns %= nscount; while (retries++ < MAX_RETRIES) { @@ -580,8 +596,7 @@ int dns_lookup(const char *name, int type, int nscount, char **nsip, memset(packet, 0, PACKETSZ); memset(&h, 0, sizeof(h)); - id = (int) random(); - h.id = id; + h.id = ++id; h.qdcount = 1; h.rd = 1; @@ -721,6 +736,7 @@ int dns_lookup(const char *name, int type, int nscount, char **nsip, else free(packet); free(lookup); + UNLOCK; return (0); /* success! */ tryall: @@ -743,6 +759,7 @@ int dns_lookup(const char *name, int type, int nscount, char **nsip, } fail: + UNLOCK; if (fd != -1) close(fd); if (lookup) |