Skip site navigation (1)Skip section navigation (2)
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>