Date: Mon, 09 Aug 1999 23:43:08 -0600 From: Wes Peters <wes@softweyr.com> To: ognir@humboldt1.com Cc: dan@trinsec.com, hackers@FreeBSD.ORG Subject: Re: gethostbyaddr() and threads. Message-ID: <37AFBBEC.7E078E26@softweyr.com> References: <199908100116.SAA02821@home.humboldt1.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Joe Groff wrote:
>
> ---Dan Moschuk said:
> >
> > | Well, I guess we might as well change the API, since everyone else does.
> > Unless
> > | someone comes up with a bettter idea, of course :)
> > |
> > | -Joe
> >
> > The API should not change. There is already enough descrepency between UNIXs
> > to warrant programs like autoconf, we should not introduce another.
> > We should introduce a gethostbyaddr_r function, which shouldn't be all that
> > though to implement.
> That's what I meant by an API change. Sorry for not being clearer.
> However, if you can roll in reentrancy without having to add the _r
> functions, that would save some sweat on the programmers' side.
No, it wouldn't, because any existing programs that already handle name
server queries within threads will already use the gethostby*_r APIs.
> >>From the code that I looked at today, the problems lie inside of glibc. It
> > declares globally a few static variables that are used by the gethost*
> > functions. Obviously in a threaded environment, this is bad.
> >
> > A nice fix would be to get rid of those variables entirely. A quicker fix
> > would be just to enclose those global variables in mutexes. Personally, I
> > like the nicer fix better, which will (unfortunately) involve rewriting most
> > of the frontends to the res_* functions.
> >
> > If no one has any objections, I'd like to start on this tomorrow.
> >
> Go for it! Someone needs to. :)
Here are the prototypes. Hosts:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
struct hostent *gethostbyname_r(const char *name,
struct hostent *result, char *buffer, int buflen,
int *h_errnop);
struct hostent *gethostbyaddr_r(const char *addr,
int length, int type, struct hostent *result,
char *buffer, int buflen, int *h_errnop);
struct hostent *gethostent_r(struct hostent *result,
char *buffer, int buflen, int *h_errnop);
Nets:
#include <netdb.h>
struct netent *getnetbyname_r(const char *name,
struct netent *result, char *buffer, int buflen);
struct netent *getnetbyaddr_r(long net, int type,
struct netent *result, char *buffer, int buflen);
struct netent *getnetent_r(struct netent *result,
char *buffer, int buflen);
Protocols:
#include <netdb.h>
struct protoent *getprotobyname_r(const char *name,
struct protoent *result, char *buffer, int buflen);
struct protoent *getprotobynumber_r(int proto,
struct protoent *result, char *buffer, int buflen);
struct protoent *getprotoent_r(struct protoent *result,
char *buffer, int buflen);
Services:
#include <netdb.h>
struct servent *getservbyname_r(const char *name,
const char *proto, struct servent *result,
char *buffer, int buflen);
struct servent *getservbyport_r(int port, const char *proto,
struct servent *result, char *buffer, int buflen);
struct servent *getservent_r(struct servent *result,
char *buffer, int buflen);
RPC services:
#include <rpc/rpcent.h>
struct rpcent *getrpcbyname_r(const char * name,
struct rpcent *result, char *buffer, int buflen);
struct rpcent *getrpcbynumber_r(const int number,
struct rpcent *result, char *buffer, int buflen);
struct rpcent *getrpcent_r(struct rpcent *result,
char *buffer, int buflen);
Any questions?
--
"Where am I, and what am I doing in this handbasket?"
Wes Peters Softweyr LLC
http://softweyr.com/ wes@softweyr.com
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?37AFBBEC.7E078E26>
