diff --git a/lib/bind/configure.in b/lib/bind/configure.in index d1dc69f3f7..23447a348f 100644 --- a/lib/bind/configure.in +++ b/lib/bind/configure.in @@ -18,7 +18,7 @@ AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl esyscmd([sed "s/^/# /" COPYRIGHT])dnl AC_DIVERT_POP()dnl -AC_REVISION($Revision: 1.67 $) +AC_REVISION($Revision: 1.68 $) AC_INIT(resolv/herror.c) AC_PREREQ(2.13) @@ -1515,6 +1515,7 @@ HOST_R_COPY_ARGS="#define HOST_R_COPY_ARGS char *buf, int buflen" HOST_R_ERRNO="#define HOST_R_ERRNO *h_errnop = h_errno" HOST_R_OK="#define HOST_R_OK hptr" HOST_R_RETURN="#define HOST_R_RETURN struct hostent *" +HOST_R_SETANSWER=#undef HOST_R_SETANSWER" HOSTENT_DATA="#undef HOSTENT_DATA" ] , @@ -1531,9 +1532,29 @@ HOST_R_COPY_ARGS="#define HOST_R_COPY_ARGS HOST_R_ARGS" HOST_R_ERRNO="#define HOST_R_ERRNO NULL" HOST_R_OK="#define HOST_R_OK 0" HOST_R_RETURN="#define HOST_R_RETURN int" +HOST_R_SETANSWER=#undef HOST_R_SETANSWER" HOSTENT_DATA="#define HOSTENT_DATA 1" ], -)) +AC_TRY_COMPILE([ +#define __USE_MISC +#include +extern int gethostbyname_r __P ((__const char *, + struct hostent *, + char *, size_t, + struct hostent **, + int *)); +],,[ +HOST_R_ARGS="#define HOST_R_ARGS char *buf, int buflen, struct hostent **answerp, int *h_errnop" +HOST_R_BAD="#define HOST_R_BAD ERANGE" +HOST_R_COPY="#define HOST_R_COPY buf, buflen" +HOST_R_COPY_ARGS="#define HOST_R_COPY_ARGS char *buf, int buflen" +HOST_R_ERRNO="#define HOST_R_ERRNO *h_errnop = h_errno" +HOST_R_OK="#define HOST_R_OK 0" +HOST_R_RETURN="#define HOST_R_RETURN int" +HOST_R_SETANSWER=#define HOST_R_SETANSWER 1" +HOSTENT_DATA="#undef HOSTENT_DATA" +], +))) , HOST_R_ARGS="#define HOST_R_ARGS char *buf, int buflen, int *h_errnop" HOST_R_BAD="#define HOST_R_BAD NULL" @@ -1542,6 +1563,7 @@ HOST_R_COPY_ARGS="#define HOST_R_COPY_ARGS char *buf, int buflen" HOST_R_ERRNO="#define HOST_R_ERRNO *h_errnop = h_errno" HOST_R_OK="#define HOST_R_OK hptr" HOST_R_RETURN="#define HOST_R_RETURN struct hostent *" +HOST_R_SETANSWER=#undef HOST_R_SETANSWER" HOSTENT_DATA="#undef HOSTENT_DATA" ) AC_SUBST(HOST_R_ARGS) @@ -1551,6 +1573,7 @@ AC_SUBST(HOST_R_COPY_ARGS) AC_SUBST(HOST_R_ERRNO) AC_SUBST(HOST_R_OK) AC_SUBST(HOST_R_RETURN) +AC_SUBST(HOST_R_SETANSWER) AC_SUBST(HOSTENT_DATA) AC_CHECK_FUNC(endhostent_r, @@ -1888,6 +1911,21 @@ SERV_R_OK="#define SERV_R_OK sptr" SERV_R_RETURN="#define SERV_R_RETURN struct servent *" ] , +AC_TRY_COMPILE([ +#include +struct servent * +getservent_r __P ((struct servent *, char *, size_t, struct servent **)); +],[return (0);], +[ +SERV_R_ARGS="#define SERV_R_ARGS char *buf, int buflen, struct servent **answer" +SERV_R_BAD="#define SERV_R_BAD (-1)" +SERV_R_COPY="#define SERV_R_COPY buf, buflen" +SERV_R_COPY_ARGS="#define SERV_R_COPY_ARGS SERV_R_ARGS" +SERV_R_OK="#define SERV_R_OK (0)" +SERV_R_RETURN="#define SERV_R_RETURN 1" +] +, +) ) , SERV_R_ARGS="#define SERV_R_ARGS char *buf, int buflen" diff --git a/lib/bind/irs/gethostent_r.c b/lib/bind/irs/gethostent_r.c index 100948ede3..d05e0ef135 100644 --- a/lib/bind/irs/gethostent_r.c +++ b/lib/bind/irs/gethostent_r.c @@ -16,7 +16,7 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: gethostent_r.c,v 1.3 2001/07/15 23:29:43 marka Exp $"; +static const char rcsid[] = "$Id: gethostent_r.c,v 1.4 2001/07/16 04:23:00 marka Exp $"; #endif /* LIBC_SCCS and not lint */ #include @@ -40,26 +40,50 @@ copy_hostent(struct hostent *, struct hostent *, HOST_R_COPY_ARGS); HOST_R_RETURN gethostbyname_r(const char *name, struct hostent *hptr, HOST_R_ARGS) { struct hostent *he = gethostbyname(name); +#ifdef HOST_R_SETANSWER + int n = 0; +#endif HOST_R_ERRNO; +#ifdef HOST_R_SETANSWER + if (he == NULL || (n = copy_hostent(he, hptr, HOST_R_COPY)) == 0) + *answerp = NULL; + else + *answerp = hptr; + + return (n); +#else if (he == NULL) return (HOST_R_BAD); return (copy_hostent(he, hptr, HOST_R_COPY)); +#endif } HOST_R_RETURN gethostbyaddr_r(const char *addr, int len, int type, struct hostent *hptr, HOST_R_ARGS) { struct hostent *he = gethostbyaddr(addr, len, type); +#ifdef HOST_R_SETANSWER + int n = 0; +#endif HOST_R_ERRNO; +#ifdef HOST_R_SETANSWER + if (he == NULL || (n = copy_hostent(he, hptr, HOST_R_COPY)) == 0) + *answerp = NULL; + else + *answerp = hptr; + + return (n); +#else if (he == NULL) return (HOST_R_BAD); return (copy_hostent(he, hptr, HOST_R_COPY)); +#endif } /* @@ -71,13 +95,25 @@ gethostbyaddr_r(const char *addr, int len, int type, HOST_R_RETURN gethostent_r(struct hostent *hptr, HOST_R_ARGS) { struct hostent *he = gethostent(); +#ifdef HOST_R_SETANSWER + int n = 0; +#endif HOST_R_ERRNO; +#ifdef HOST_R_SETANSWER + if (he == NULL || (n = copy_hostent(he, hptr, HOST_R_COPY)) == 0) + *answerp = NULL; + else + *answerp = hptr; + + return (n); +#else if (he == NULL) return (HOST_R_BAD); return (copy_hostent(he, hptr, HOST_R_COPY)); +#endif } HOST_R_SET_RETURN