diff options
| author | Eric Andersen <andersen@codepoet.org> | 2002-06-17 21:15:35 +0000 | 
|---|---|---|
| committer | Eric Andersen <andersen@codepoet.org> | 2002-06-17 21:15:35 +0000 | 
| commit | 3aabbb4ab12be066b20c5fe8e5fc25c1ff084564 (patch) | |
| tree | 98c78666dcffa6e9338bce667fc80eda6bda984d /libc | |
| parent | cdb3c81f36283df4b53f24a374d78c695e9d8b06 (diff) | |
Make things more re-entrany, kill some cruft.
 -Erik
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/inet/addr.c | 12 | ||||
| -rw-r--r-- | libc/inet/getnetent.c | 160 | ||||
| -rw-r--r-- | libc/inet/getproto.c | 170 | ||||
| -rw-r--r-- | libc/inet/getservice.c | 257 | ||||
| -rw-r--r-- | libc/inet/resolv.c | 226 | 
5 files changed, 385 insertions, 440 deletions
diff --git a/libc/inet/addr.c b/libc/inet/addr.c index 6b143c6ba..9abf7c44d 100644 --- a/libc/inet/addr.c +++ b/libc/inet/addr.c @@ -85,12 +85,8 @@ const char *cp;  #endif  #ifdef L_inet_ntoa - -char *inet_ntoa(in) -struct in_addr in; +char *inet_ntoa_r(struct in_addr in, char buf[16])  { -	static char buf[16];		/* max 12 digits + 3 '.'s + 1 nul */ -  	unsigned long addr = ntohl(in.s_addr);  	int i;  	char *p, *q; @@ -108,6 +104,12 @@ struct in_addr in;  	return p+1;  } + +char *inet_ntoa(struct in_addr in) +{ +	static char buf[16];		/* max 12 digits + 3 '.'s + 1 nul */ +	return(inet_ntoa_r(in, buf)); +}  #endif  #ifdef L_inet_makeaddr diff --git a/libc/inet/getnetent.c b/libc/inet/getnetent.c index 39aab1a97..0b4c36dcb 100644 --- a/libc/inet/getnetent.c +++ b/libc/inet/getnetent.c @@ -21,98 +21,114 @@  #include <netdb.h>  #include <arpa/inet.h> -#define	MAXALIASES	35 +#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 + + + +#define	MAXALIASES	35  static const char NETDB[] = _PATH_NETWORKS;  static FILE *netf = NULL;  static char line[BUFSIZ+1];  static struct netent net;  static char *net_aliases[MAXALIASES]; -static char *any(char *, char *);  int _net_stayopen; -void -setnetent(f) -	int f; +void setnetent(int f)  { -	if (netf == NULL) -		netf = fopen(NETDB, "r" ); -	else -		rewind(netf); -	_net_stayopen |= f; +    LOCK; +    if (netf == NULL) +	netf = fopen(NETDB, "r" ); +    else +	rewind(netf); +    _net_stayopen |= f; +    UNLOCK; +    return;  } -void -endnetent() +void endnetent(void)  { -	if (netf) { -		fclose(netf); -		netf = NULL; -	} -	_net_stayopen = 0; +    LOCK; +    if (netf) { +	fclose(netf); +	netf = NULL; +    } +    _net_stayopen = 0; +    UNLOCK;  } -struct netent * -getnetent() +static char * any(register char *cp, char *match)  { -	char *p; -	register char *cp, **q; +    register char *mp, c; -	if (netf == NULL && (netf = fopen(NETDB, "r" )) == NULL) -		return (NULL); -again: -	p = fgets(line, BUFSIZ, netf); -	if (p == NULL) -		return (NULL); -	if (*p == '#') -		goto again; -	cp = any(p, "#\n"); -	if (cp == NULL) -		goto again; -	*cp = '\0'; -	net.n_name = p; -	cp = any(p, " \t"); -	if (cp == NULL) -		goto again; -	*cp++ = '\0'; -	while (*cp == ' ' || *cp == '\t') -		cp++; -	p = any(cp, " \t"); -	if (p != NULL) -		*p++ = '\0'; -	net.n_net = inet_network(cp); -	net.n_addrtype = AF_INET; -	q = net.n_aliases = net_aliases; -	if (p != NULL)  -		cp = p; -	while (cp && *cp) { -		if (*cp == ' ' || *cp == '\t') { -			cp++; -			continue; -		} -		if (q < &net_aliases[MAXALIASES - 1]) -			*q++ = cp; -		cp = any(cp, " \t"); -		if (cp != NULL) -			*cp++ = '\0'; -	} -	*q = NULL; -	return (&net); +    while ((c = *cp)) { +	for (mp = match; *mp; mp++) +	    if (*mp == c) +		return (cp); +	cp++; +    } +    return ((char *)0);  } -static char * -any(cp, match) -	register char *cp; -	char *match; +struct netent * getnetent(void)  { -	register char *mp, c; +    char *p; +    register char *cp, **q; -	while ((c = *cp)) { -		for (mp = match; *mp; mp++) -			if (*mp == c) -				return (cp); -		cp++; +    LOCK; +    if (netf == NULL && (netf = fopen(NETDB, "r" )) == NULL) { +	UNLOCK; +	return (NULL); +    } +again: +    p = fgets(line, BUFSIZ, netf); +    if (p == NULL) { +	UNLOCK; +	return (NULL); +    } +    if (*p == '#') +	goto again; +    cp = any(p, "#\n"); +    if (cp == NULL) +	goto again; +    *cp = '\0'; +    net.n_name = p; +    cp = any(p, " \t"); +    if (cp == NULL) +	goto again; +    *cp++ = '\0'; +    while (*cp == ' ' || *cp == '\t') +	cp++; +    p = any(cp, " \t"); +    if (p != NULL) +	*p++ = '\0'; +    net.n_net = inet_network(cp); +    net.n_addrtype = AF_INET; +    q = net.n_aliases = net_aliases; +    if (p != NULL)  +	cp = p; +    while (cp && *cp) { +	if (*cp == ' ' || *cp == '\t') { +	    cp++; +	    continue;  	} -	return ((char *)0); +	if (q < &net_aliases[MAXALIASES - 1]) +	    *q++ = cp; +	cp = any(cp, " \t"); +	if (cp != NULL) +	    *cp++ = '\0'; +    } +    *q = NULL; +    UNLOCK; +    return (&net);  } + diff --git a/libc/inet/getproto.c b/libc/inet/getproto.c index e5c6d9068..0f145ead4 100644 --- a/libc/inet/getproto.c +++ b/libc/inet/getproto.c @@ -52,6 +52,7 @@  */  #define __FORCE_GLIBC +#define _GNU_SOURCE  #include <features.h>  #include <sys/types.h>  #include <sys/socket.h> @@ -60,6 +61,18 @@  #include <stdlib.h>  #include <string.h> +#ifdef __UCLIBC_HAS_THREADS__ +#include <pthread.h> +static pthread_mutex_t mylock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; +# define LOCK	pthread_mutex_lock(&mylock) +# define UNLOCK	pthread_mutex_unlock(&mylock); +#else +# define LOCK +# define UNLOCK +#endif + + +  #define	MAXALIASES	35  static FILE *protof = NULL; @@ -70,97 +83,112 @@ static int proto_stayopen;  void setprotoent(int f)  { -	if (protof == NULL) -		protof = fopen(_PATH_PROTOCOLS, "r" ); -	else -		rewind(protof); -	proto_stayopen |= f; +    LOCK; +    if (protof == NULL) +	protof = fopen(_PATH_PROTOCOLS, "r" ); +    else +	rewind(protof); +    proto_stayopen |= f; +    UNLOCK;  }  void endprotoent(void)  { -	if (protof) { -		fclose(protof); -		protof = NULL; -	} -	proto_stayopen = 0; +    LOCK; +    if (protof) { +	fclose(protof); +	protof = NULL; +    } +    proto_stayopen = 0; +    UNLOCK;  }  struct protoent * getprotoent(void)  { -	char *p; -	register char *cp, **q; +    char *p; +    register char *cp, **q; -	if (protof == NULL && (protof = fopen(_PATH_PROTOCOLS, "r" )) == NULL) -		return (NULL); +    LOCK; +    if (protof == NULL && (protof = fopen(_PATH_PROTOCOLS, "r" )) == NULL) { +	UNLOCK; +	return (NULL); +    }  again: -	if ((p = fgets(line, BUFSIZ, protof)) == NULL) -		return (NULL); -	if (*p == '#') -		goto again; -	cp = strpbrk(p, "#\n"); -	if (cp == NULL) -		goto again; -	*cp = '\0'; -	proto.p_name = p; -	cp = strpbrk(p, " \t"); -	if (cp == NULL) -		goto again; -	*cp++ = '\0'; -	while (*cp == ' ' || *cp == '\t') +    if ((p = fgets(line, BUFSIZ, protof)) == NULL) { +	UNLOCK; +	return (NULL); +    } + +    if (*p == '#') +	goto again; +    cp = strpbrk(p, "#\n"); +    if (cp == NULL) +	goto again; +    *cp = '\0'; +    proto.p_name = p; +    cp = strpbrk(p, " \t"); +    if (cp == NULL) +	goto again; +    *cp++ = '\0'; +    while (*cp == ' ' || *cp == '\t') +	cp++; +    p = strpbrk(cp, " \t"); +    if (p != NULL) +	*p++ = '\0'; +    proto.p_proto = atoi(cp); +    q = proto.p_aliases = proto_aliases; +    if (p != NULL) { +	cp = p; +	while (cp && *cp) { +	    if (*cp == ' ' || *cp == '\t') {  		cp++; -	p = strpbrk(cp, " \t"); -	if (p != NULL) -		*p++ = '\0'; -	proto.p_proto = atoi(cp); -	q = proto.p_aliases = proto_aliases; -	if (p != NULL) { -		cp = p; -		while (cp && *cp) { -			if (*cp == ' ' || *cp == '\t') { -				cp++; -				continue; -			} -			if (q < &proto_aliases[MAXALIASES - 1]) -				*q++ = cp; -			cp = strpbrk(cp, " \t"); -			if (cp != NULL) -				*cp++ = '\0'; -		} +		continue; +	    } +	    if (q < &proto_aliases[MAXALIASES - 1]) +		*q++ = cp; +	    cp = strpbrk(cp, " \t"); +	    if (cp != NULL) +		*cp++ = '\0';  	} -	*q = NULL; -	return (&proto); +    } +    *q = NULL; +    UNLOCK; +    return (&proto);  }  struct protoent * getprotobyname(const char *name)  { -	register struct protoent *p; -	register char **cp; - -	setprotoent(proto_stayopen); -	while ((p = getprotoent()) != NULL) { -		if (strcmp(p->p_name, name) == 0) -			break; -		for (cp = p->p_aliases; *cp != 0; cp++) -			if (strcmp(*cp, name) == 0) -				goto found; -	} +    register struct protoent *p; +    register char **cp; + +    LOCK; +    setprotoent(proto_stayopen); +    while ((p = getprotoent()) != NULL) { +	if (strcmp(p->p_name, name) == 0) +	    break; +	for (cp = p->p_aliases; *cp != 0; cp++) +	    if (strcmp(*cp, name) == 0) +		goto found; +    }  found: -	if (!proto_stayopen) -		endprotoent(); -	return (p); +    if (!proto_stayopen) +	endprotoent(); +    UNLOCK; +    return (p);  }  struct protoent * getprotobynumber(int proto)  { -	register struct protoent *p; - -	setprotoent(proto_stayopen); -	while ((p = getprotoent()) != NULL) -		if (p->p_proto == proto) -			break; -	if (!proto_stayopen) -		endprotoent(); -	return (p); +    register struct protoent *p; + +    LOCK; +    setprotoent(proto_stayopen); +    while ((p = getprotoent()) != NULL) +	if (p->p_proto == proto) +	    break; +    if (!proto_stayopen) +	endprotoent(); +    UNLOCK; +    return (p);  } diff --git a/libc/inet/getservice.c b/libc/inet/getservice.c index 0625a46e1..5e90f8198 100644 --- a/libc/inet/getservice.c +++ b/libc/inet/getservice.c @@ -53,6 +53,7 @@  #define __FORCE_GLIBC +#define _GNU_SOURCE  #include <features.h>  #include <sys/types.h>  #include <sys/socket.h> @@ -64,6 +65,21 @@  #include <arpa/inet.h>  #include <errno.h> + + +#ifdef __UCLIBC_HAS_THREADS__ +#include <pthread.h> +static pthread_mutex_t mylock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; +# define LOCK	pthread_mutex_lock(&mylock) +# define UNLOCK	pthread_mutex_unlock(&mylock); +#else +# define LOCK +# define UNLOCK +#endif + + + +  #define	MAXALIASES	35  static FILE *servf = NULL; @@ -73,156 +89,169 @@ static int serv_stayopen;  void setservent(int f)  { -	if (servf == NULL) -		servf = fopen(_PATH_SERVICES, "r" ); -	else -		rewind(servf); -	serv_stayopen |= f; +    LOCK; +    if (servf == NULL) +	servf = fopen(_PATH_SERVICES, "r" ); +    else +	rewind(servf); +    serv_stayopen |= f; +    UNLOCK;  }  void endservent(void)  { -	if (servf) { -		fclose(servf); -		servf = NULL; -	} -	serv_stayopen = 0; +    LOCK; +    if (servf) { +	fclose(servf); +	servf = NULL; +    } +    serv_stayopen = 0; +    UNLOCK;  }  struct servent * getservent(void)  { -	struct servent *result; -	getservent_r(&serv, buf, sizeof(buf), &result); -	return result; +    struct servent *result; +    getservent_r(&serv, buf, sizeof(buf), &result); +    return result;  }  struct servent *getservbyname(const char *name, const char *proto)  { -	struct servent *result; -	getservbyname_r(name, proto, &serv, buf, sizeof(buf), &result); -	return result; +    struct servent *result; +    getservbyname_r(name, proto, &serv, buf, sizeof(buf), &result); +    return result;  }  struct servent * getservbyport(int port, const char *proto)  { -	struct servent *result; -	getservbyport_r(port, proto, &serv, buf, sizeof(buf), &result); -	return result; +    struct servent *result; +    getservbyport_r(port, proto, &serv, buf, sizeof(buf), &result); +    return result;  }  int getservent_r(struct servent * result_buf,  		 char * buf, size_t buflen,  		 struct servent ** result)  { -	char *p; -	register char *cp, **q; -	char **serv_aliases; -	char *line; +    char *p; +    register char *cp, **q; +    char **serv_aliases; +    char *line; -	*result=NULL; +    *result=NULL; -	if (buflen < sizeof(*serv_aliases)*MAXALIASES) { -		errno=ERANGE; -		return errno; -	} -	serv_aliases=(char **)buf; -	buf+=sizeof(*serv_aliases)*MAXALIASES; -	buflen-=sizeof(*serv_aliases)*MAXALIASES; -	 -	if (buflen < BUFSIZ+1) { -		errno=ERANGE; -		return errno; -	} -	line=buf; -	buf+=BUFSIZ+1; -	buflen-=BUFSIZ+1; +    if (buflen < sizeof(*serv_aliases)*MAXALIASES) { +	errno=ERANGE; +	return errno; +    } +    LOCK; +    serv_aliases=(char **)buf; +    buf+=sizeof(*serv_aliases)*MAXALIASES; +    buflen-=sizeof(*serv_aliases)*MAXALIASES; + +    if (buflen < BUFSIZ+1) { +	UNLOCK; +	errno=ERANGE; +	return errno; +    } +    line=buf; +    buf+=BUFSIZ+1; +    buflen-=BUFSIZ+1; -	if (servf == NULL && (servf = fopen(_PATH_SERVICES, "r" )) == NULL) -		return errno; +    if (servf == NULL && (servf = fopen(_PATH_SERVICES, "r" )) == NULL) { +	UNLOCK; +	return errno; +    }  again: -	if ((p = fgets(line, BUFSIZ, servf)) == NULL) -		return TRY_AGAIN; -	if (*p == '#') -		goto again; -	cp = strpbrk(p, "#\n"); -	if (cp == NULL) -		goto again; -	*cp = '\0'; -	result_buf->s_name = p; -	p = strpbrk(p, " \t"); -	if (p == NULL) -		goto again; -	*p++ = '\0'; -	while (*p == ' ' || *p == '\t') -		p++; -	cp = strpbrk(p, ",/"); -	if (cp == NULL) -		goto again; +    if ((p = fgets(line, BUFSIZ, servf)) == NULL) { +	UNLOCK; +	return TRY_AGAIN; +    } +    if (*p == '#') +	goto again; +    cp = strpbrk(p, "#\n"); +    if (cp == NULL) +	goto again; +    *cp = '\0'; +    result_buf->s_name = p; +    p = strpbrk(p, " \t"); +    if (p == NULL) +	goto again; +    *p++ = '\0'; +    while (*p == ' ' || *p == '\t') +	p++; +    cp = strpbrk(p, ",/"); +    if (cp == NULL) +	goto again; +    *cp++ = '\0'; +    result_buf->s_port = htons((u_short)atoi(p)); +    result_buf->s_proto = cp; +    q = result_buf->s_aliases = serv_aliases; +    cp = strpbrk(cp, " \t"); +    if (cp != NULL)  	*cp++ = '\0'; -	result_buf->s_port = htons((u_short)atoi(p)); -	result_buf->s_proto = cp; -	q = result_buf->s_aliases = serv_aliases; +    while (cp && *cp) { +	if (*cp == ' ' || *cp == '\t') { +	    cp++; +	    continue; +	} +	if (q < &serv_aliases[MAXALIASES - 1]) +	    *q++ = cp;  	cp = strpbrk(cp, " \t");  	if (cp != NULL) -		*cp++ = '\0'; -	while (cp && *cp) { -		if (*cp == ' ' || *cp == '\t') { -			cp++; -			continue; -		} -		if (q < &serv_aliases[MAXALIASES - 1]) -			*q++ = cp; -		cp = strpbrk(cp, " \t"); -		if (cp != NULL) -			*cp++ = '\0'; -	} -	*q = NULL; -	*result=result_buf; -	return 0; +	    *cp++ = '\0'; +    } +    *q = NULL; +    *result=result_buf; +    UNLOCK; +    return 0;  } -int getservbyname_r(const char *name, const char *proto, -			    struct servent * result_buf, -			    char * buf, size_t buflen, -			    struct servent ** result) +int getservbyname_r(const char *name, const char *proto,  +	struct servent * result_buf, char * buf, size_t buflen,  +	struct servent ** result)  { -	register char **cp; -	int ret; - -	setservent(serv_stayopen); -	while (!(ret=getservent_r(result_buf, buf, buflen, result))) { -		if (strcmp(name, result_buf->s_name) == 0) -			goto gotname; -		for (cp = result_buf->s_aliases; *cp; cp++) -			if (strcmp(name, *cp) == 0) -				goto gotname; -		continue; +    register char **cp; +    int ret; + +    LOCK; +    setservent(serv_stayopen); +    while (!(ret=getservent_r(result_buf, buf, buflen, result))) { +	if (strcmp(name, result_buf->s_name) == 0) +	    goto gotname; +	for (cp = result_buf->s_aliases; *cp; cp++) +	    if (strcmp(name, *cp) == 0) +		goto gotname; +	continue;  gotname: -		if (proto == 0 || strcmp(result_buf->s_proto, proto) == 0) -			break; -	} -	if (!serv_stayopen) -		endservent(); -	return *result?0:ret; +	if (proto == 0 || strcmp(result_buf->s_proto, proto) == 0) +	    break; +    } +    if (!serv_stayopen) +	endservent(); +    UNLOCK; +    return *result?0:ret;  } -int getservbyport_r(int port, const char *proto, -			    struct servent * result_buf, -			    char * buf, size_t buflen, -			    struct servent ** result) +int getservbyport_r(int port, const char *proto,  +	struct servent * result_buf, char * buf,  +	size_t buflen, struct servent ** result)  { -	int ret; - -	setservent(serv_stayopen); -	while (!(ret=getservent_r(result_buf, buf, buflen, result))) { -		if (result_buf->s_port != port) -			continue; -		if (proto == 0 || strcmp(result_buf->s_proto, proto) == 0) -			break; -	} -	if (!serv_stayopen) -		endservent(); -	return *result?0:ret; +    int ret; + +    LOCK; +    setservent(serv_stayopen); +    while (!(ret=getservent_r(result_buf, buf, buflen, result))) { +	if (result_buf->s_port != port) +	    continue; +	if (proto == 0 || strcmp(result_buf->s_proto, proto) == 0) +	    break; +    } +    if (!serv_stayopen) +	endservent(); +    UNLOCK; +    return *result?0:ret;  } diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c index 3fd9b81cd..e45154d3f 100644 --- a/libc/inet/resolv.c +++ b/libc/inet/resolv.c @@ -82,6 +82,15 @@  #endif /* DEBUG */ +/* Global stuff... */ +extern int nameservers; +extern char * nameserver[MAX_SERVERS]; +extern int searchdomains; +extern char * searchdomain[MAX_SEARCH]; + + + +/* Structs */  struct resolv_header {  	int id;  	int qr,opcode,aa,tc,rd,ra,rcode; @@ -113,11 +122,7 @@ enum etc_hosts_action {      GET_HOSTS_BYADDR,  }; - -extern int nameservers; -extern char * nameserver[MAX_SERVERS]; -extern int searchdomains; -extern char * searchdomain[MAX_SEARCH]; +/* function prototypes */  extern int get_hosts_byname_r(const char * name, int type,  			      struct hostent * result_buf,  			      char * buf, size_t buflen, @@ -135,28 +140,24 @@ extern int read_etc_hosts_r(FILE *fp, const char * name, int type,  			    char * buf, size_t buflen,  			    struct hostent ** result,  			    int * h_errnop); -extern int resolve_address(const char * address, int nscount,  -	char ** nsip, struct in_addr * in); -extern int resolve_mailbox(const char * address, int nscount,  -	char ** nsip, struct in_addr * in);  extern int dns_lookup(const char * name, int type, int nscount,   	char ** nsip, unsigned char ** outpacket, struct resolv_answer * a); -int encode_dotted(const char * dotted, unsigned char * dest, int maxlen); -int decode_dotted(const unsigned char * message, int offset,  +extern int encode_dotted(const char * dotted, unsigned char * dest, int maxlen); +extern int decode_dotted(const unsigned char * message, int offset,   	char * dest, int maxlen); -int length_dotted(const unsigned char * message, int offset); -int encode_header(struct resolv_header * h, unsigned char * dest, int maxlen); -int decode_header(unsigned char * data, struct resolv_header * h); -int encode_question(struct resolv_question * q, +extern int length_dotted(const unsigned char * message, int offset); +extern int encode_header(struct resolv_header * h, unsigned char * dest, int maxlen); +extern int decode_header(unsigned char * data, struct resolv_header * h); +extern int encode_question(struct resolv_question * q,  	unsigned char * dest, int maxlen); -int decode_question(unsigned char * message, int offset, +extern int decode_question(unsigned char * message, int offset,  	struct resolv_question * q); -int encode_answer(struct resolv_answer * a, +extern int encode_answer(struct resolv_answer * a,  	unsigned char * dest, int maxlen); -int decode_answer(unsigned char * message, int offset, +extern int decode_answer(unsigned char * message, int offset,  	struct resolv_answer * a); -int length_question(unsigned char * message, int offset); +extern int length_question(unsigned char * message, int offset);  extern int open_nameservers(void); @@ -343,7 +344,7 @@ int encode_question(struct resolv_question *q,  int decode_question(unsigned char *message, int offset,  					struct resolv_question *q)  { -	char temp[256]; +	char temp[BUFSIZ];  	int i;  	i = decode_dotted(message, offset, temp, sizeof(temp)); @@ -408,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[256]; +	char temp[BUFSIZ];  	int i;  	i = decode_dotted(message, offset, temp, sizeof(temp)); @@ -533,9 +534,7 @@ int form_query(int id, const char *name, int type, unsigned char *packet,  int dns_lookup(const char *name, int type, int nscount, char **nsip,  			   unsigned char **outpacket, struct resolv_answer *a)  { -	static int id = 1; -	int i, j, len, fd, pos; -	static int ns = 0; +	int i, j, len, fd, pos, id, ns;  	struct sockaddr_in sa;  #ifdef __UCLIBC_HAS_IPV6__  	struct sockaddr_in6 sa6; @@ -581,7 +580,8 @@ int dns_lookup(const char *name, int type, int nscount, char **nsip,  		memset(packet, 0, PACKETSZ);  		memset(&h, 0, sizeof(h)); -		h.id = ++id; +		id = (int) random(); +		h.id = id;  		h.qdcount = 1;  		h.rd = 1; @@ -753,116 +753,6 @@ fail:  }  #endif -#ifdef L_resolveaddress - -int resolve_address(const char *address, int nscount,  -	char **nsip, struct in_addr *in) -{ -	unsigned char *packet; -	struct resolv_answer a; -	char temp[256]; -	int i; -	int nest = 0; - -	if (!address || !in) -		return -1; - -	strncpy(temp, address, sizeof(temp)); - -	for (;;) { - -		i = dns_lookup(temp, T_A, nscount, nsip, &packet, &a); - -		if (i < 0) -			return -1; - -		free(a.dotted); - -		if (a.atype == T_CNAME) {		/* CNAME */ -			DPRINTF("Got a CNAME in resolve_address()\n"); -			i = decode_dotted(packet, a.rdoffset, temp, sizeof(temp)); -			free(packet); - -			if (i < 0) -				return -1; -			if (++nest > MAX_RECURSE) -				return -1; -			continue; -		} else if (a.atype == T_A) {	/* ADDRESS */ -			free(packet); -			break; -		} else { -			free(packet); -			return -1; -		} -	} - -	if (in) -	    memcpy(in, a.rdata, INADDRSZ); /* IPv4 T_A */ - -	return 0; -} -#endif - -#ifdef L_resolvemailbox - -int resolve_mailbox(const char *address, int nscount,  -	char **nsip, struct in_addr *in) -{ -	struct resolv_answer a; -	unsigned char *packet; -	char temp[256]; -	int nest = 0; -	int i; - -	if (!address || !in) -		return -1; - -	/* look up mail exchange */ -	i = dns_lookup(address, T_MX, nscount, nsip, &packet, &a); - -	strncpy(temp, address, sizeof(temp)); - -	if (i >= 0) { -		i = decode_dotted(packet, a.rdoffset+2, temp, sizeof(temp)); -		free(packet); -	} - -	for (;;) { - -		i = dns_lookup(temp, T_A, nscount, nsip, &packet, &a); - -		if (i < 0) -			return -1; - -		free(a.dotted); - -		if (a.atype == T_CNAME) {		/* CNAME */ -			DPRINTF("Got a CNAME in resolve_mailbox()\n"); -			i = decode_dotted(packet, a.rdoffset, temp, sizeof(temp)); -			free(packet); -			if (i < 0) -				return i; -			if (++nest > MAX_RECURSE) -				return -1; -			continue; -		} else if (a.atype == T_A) {	/* ADDRESS */ -			free(packet); -			break; -		} else { -			free(packet); -			return -1; -		} -	} - -	if (in) -		memcpy(in, a.rdata, INADDRSZ); /* IPv4 */ - -	return 0; -} -#endif - -  #ifdef L_opennameservers  int nameservers; @@ -948,38 +838,6 @@ void close_nameservers(void)  }  #endif - -#ifdef L_resolvename - -const char *resolve_name(const char *name, int mailbox) -{ -	struct in_addr in; -	int i; - -	/* shortcut: is it a valid IP address to begin with? */ -	if (inet_aton(name, &in)) -		return name; - -	open_nameservers(); - -	DPRINTF("looking up '%s', mailbox=%d, nameservers=%d\n", -			name, mailbox, nameservers); - -	if (mailbox) -		i = resolve_mailbox(name, nameservers, nameserver, &in); -	else -		i = resolve_address(name, nameservers, nameserver, &in); - -	if (i < 0) -		return 0; - -	DPRINTF("success = '%s'\n", inet_ntoa(in)); - -	return inet_ntoa(in); -} -#endif - -  #ifdef L_gethostbyname  struct hostent *gethostbyname(const char *name) @@ -1322,33 +1180,42 @@ int read_etc_hosts_r(FILE * fp, const char * name, int type,  #endif -#ifdef L_endhostent -extern int __stay_open; -extern FILE * __gethostent_fp; +#ifdef L_gethostent + +#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 + +static int __stay_open; +static FILE * __gethostent_fp; +  void endhostent (void)  { +    LOCK;      __stay_open = 0;      if (__gethostent_fp) {  	fclose(__gethostent_fp);      } +    UNLOCK;  } -#endif -#ifdef L_sethostent -extern int __stay_open;  void sethostent (int stay_open)  { +    LOCK;      __stay_open = stay_open; +    UNLOCK;  } -#endif -#ifdef L_gethostent -int __stay_open; -FILE * __gethostent_fp;  struct hostent *gethostent (void)  { -    static struct hostent	h; +    static struct hostent h;      static char buf[  #ifndef __UCLIBC_HAS_IPV6__  	    sizeof(struct in_addr) + sizeof(struct in_addr *)*2 + @@ -1358,9 +1225,11 @@ struct hostent *gethostent (void)  	    80/*namebuffer*/ + 2/* margin */];      struct hostent *host; +    LOCK;      if (__gethostent_fp == NULL) {  	__open_etc_hosts(&__gethostent_fp);  	if (__gethostent_fp == NULL) { +	    UNLOCK;  	    return((struct hostent *)NULL);  	}      } @@ -1370,6 +1239,7 @@ struct hostent *gethostent (void)      if (__stay_open==0) {  	fclose(__gethostent_fp);      } +    UNLOCK;      return(host);  }  #endif  | 
