From owner-freebsd-hackers Fri Sep 13 12:51:28 2002 Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6142A37B400 for ; Fri, 13 Sep 2002 12:51:16 -0700 (PDT) Received: from boris.st.hmc.edu (boris.ST.HMC.Edu [134.173.63.11]) by mx1.FreeBSD.org (Postfix) with ESMTP id A889143E42 for ; Fri, 13 Sep 2002 12:51:15 -0700 (PDT) (envelope-from jeff@unixconsults.com) Received: from boris.st.hmc.edu (localhost [127.0.0.1]) by boris.st.hmc.edu (8.12.3/8.12.3) with ESMTP id g8DJpDgS083144; Fri, 13 Sep 2002 12:51:13 -0700 (PDT) Received: from localhost (jeff@localhost) by boris.st.hmc.edu (8.12.3/8.12.3/Submit) with ESMTP id g8DJpDRF083141; Fri, 13 Sep 2002 12:51:13 -0700 (PDT) (envelope-from jeff@unixconsults.com) X-Authentication-Warning: boris.st.hmc.edu: jeff owned process doing -bs Date: Fri, 13 Sep 2002 12:51:13 -0700 (PDT) From: Jeff Jirsa X-X-Sender: jeff@boris.st.hmc.edu To: Jev Cc: hackers@FreeBSD.ORG Subject: Re: gethostbyname_r() fbsd equiv? In-Reply-To: <20020913164315.GA42832@ecad.org> Message-ID: <20020913123217.V83028-100000@boris.st.hmc.edu> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Virus-Scanned: by amavisd-milter on boris.st.hmc.edu Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG On Fri, 13 Sep 2002, Jev wrote: > On Fri, Sep 13, 2002 at 09:34:31AM -0700, Jeff Jirsa wrote: > [snip] > > An alternative that you may which to consider is the vocal suite from > > vovida.org. The license is similar to a BSD style license, will compile on > > FreeBSD out of the box (use gmake rather than make), and likely has much > > more 'features' than you'll ever want to use. I _think_ it requires the > > GNU sip implementation (from http://www.gnu.org/software/osip/ ), but I'm > > not 100% certain. It's likely that the vocal package will give you a firm > > groundwork to expand, but unlikely that you'll want to use it "as-is" in > > its present state. > > > > > Im allready using vocal 1.4.0 on a freebsd box :) And it is working > pretty well, tho seems slightly bloated. I wanted to look at partysip to > see what it was like, and port it while I was at it. > > I don't think it uses osip, but like you, im not 100% certain. > You can use the LGPL'd libcext_lgpl library from the vocal contrib to supplement gethostbyname. Try the patch below to /ppl/unix/ You'll (perhaps I should, I don't really know) probably need to copy over some of the LGPL/GPL license (http://www.gnu.org/copyleft/lesser.txt) to keep from breaking the respective licenses, but you can worry about that if/when you distribute it. Keep in touch, let me know if this works. Good luck, - Jeff Jirsa --- ppldns.c.bak Fri Sep 13 12:30:34 2002 +++ ppldns.c Fri Sep 13 12:30:08 2002 @@ -27,6 +27,16 @@ #include #include +#include +#include +#include +#include "netdb_r.h" + +#ifdef __sparc__ +#define NEED_ALIGNED_ACCESS +#endif + + fifo_t *dns_entries; /* list of domain or FQDN strings to resolv */ smutex_t *m_dns_result; ppl_dns_entry_t *dns_results; @@ -668,12 +678,13 @@ /* Jay changed according to TRU64 plateform */ /* #if defined(HAVE_FUNC_GETHOSTBYNAME_R_3) */ + #if defined(_OSF_SOURCE)||defined(HAVE_FUNC_GETHOSTBYNAME_R_3) gethostbyname_r (hostname, /* the FQDN */ &result_buffer, /* the result buffer */ &result); /* #elif defined(HAVE_FUNC_GETHOSTBYNAME_R_5) */ -#elif defined(__sun__)||defined(HAVE_FUNC_GETHOSTBYNAME_R_5) +#elif defined(__sun__)||defined(HAVE_FUNC_GETHOSTBYNAME_R_5)||defined(__FreeBSD__) result = gethostbyname_r (hostname, /* the FQDN */ &result_buffer, /* the result buffer */ tmp, GETHOSTBYNAME_BUFLEN - 1, &my_error); @@ -690,6 +701,7 @@ #error -DHAVE_FUNC_GETHOSTBYNAME_R_6 (3 arguments) #endif + if (!result) return my_error; @@ -822,14 +834,13 @@ int my_error; /* Jay changed according to TRU64 plateform */ - /* #if defined(HAVE_FUNC_GETHOSTBYNAME_R_3) */ #if defined(_OSF_SOURCE)||defined(HAVE_FUNC_GETHOSTBYNAME_R_3) gethostbyname_r (hostname, /* the FQDN */ &result_buffer, /* the result buffer */ &result); /* #elif defined(HAVE_FUNC_GETHOSTBYNAME_R_5) */ -#elif defined(__sun__)||defined(HAVE_FUNC_GETHOSTBYNAME_R_5) +#elif defined(__sun__)||defined(HAVE_FUNC_GETHOSTBYNAME_R_5)||defined(__FreeBSD__) result = gethostbyname_r (hostname, &result_buffer, tmp, GETHOSTBYNAME_BUFLEN - 1, &my_error); @@ -987,3 +998,162 @@ #endif #endif + + +static pthread_mutex_t gethostby_mutex = PTHREAD_MUTEX_INITIALIZER; + +static int +convert (struct hostent *host, struct hostent *result, + char *buf, int buflen, int *h_errnop) +{ + int len, i; + + if (!buf || !h_errnop) return -1; + *h_errnop = h_errno; + + *result = *host; + result->h_name = (char *) buf; + /* This is the size. */ + len = strlen (host->h_name) + 1; + if (len > buflen) return -1; + buflen -= len; + buf += len; + strcpy ((char *) result->h_name, host->h_name); + + /* How many aliases and how big the buffer should be? There + is always a NULL pointer. */ + for (len = sizeof (char *), i = 0; host->h_aliases [i]; i++) + { + /* It should be size of (char *) and the length of string + plus 1. */ + len += strlen (host->h_aliases [i]) + 1 + sizeof (char *); + } + if (len > buflen) return -1; + buflen -= len; + + /* This is an array of char * for h_aliases. */ +#ifdef NEED_ALIGNED_ACCESS + { + int extra; + extra = 4 - (((unsigned long) buf) & 3); + if (extra != 4) { + if (buflen < extra) + return -1; + buf = (char *) buf + extra; + } + } +#endif + result->h_aliases = (char **) buf; + buf += (i + 1) * sizeof (char *); + + /* We copy the aliases now. */ + for (i = 0; host->h_aliases [i]; i++) + { + result->h_aliases [i] = (char *) buf; + strcpy (result->h_aliases [i], host->h_aliases [i]); + buf += strlen (host->h_aliases [i]) + 1; + } + /* This is the last one */ + result->h_aliases [i] = NULL; + +#if BSD >= 43 || defined(h_addr) + for (len = sizeof (char *), i = 0; host->h_addr_list [i]; i++) + { + /* It should be size of (char *) and the length of string + plus 1. */ + len += host->h_length + sizeof (char *); + } + if (len > buflen) return -1; + + /* This is an array of char * for h_addr_list. */ +#ifdef NEED_ALIGNED_ACCESS + { + int extra; + extra = 4 - (((unsigned long) buf) & 0x3); + if (extra != 4) { + if (buflen < extra) + return -1; + buf = ((char *) buf) + extra; + } + } +#endif + result->h_addr_list = (char **) buf; + buf += (i + 1) * sizeof (char *); + + /* We copy the h_addr_list now. */ + for (i = 0; host->h_addr_list [i]; i++) + { + result->h_addr_list [i] = (char *) buf; + memcpy (result->h_addr_list [i], host->h_addr_list [i], host->h_length); + buf += host->h_length; + } + /* This is the last one */ + result->h_addr_list [i] = NULL; +#else + len = strlen (host->h_addr) + 1 + sizeof (char *); + if (len > buflen) return -1; + + result->h_addr = (char *) buf; + strcpy (result->h_addr, host->h_addr); +#endif + return 0; +} + +struct hostent * +gethostbyaddr_r (const char *addr, int length, int type, + struct hostent *result, char *buffer, int buflen, + int *h_errnop) +{ + struct hostent *host; + + pthread_mutex_lock (&gethostby_mutex); + + host = gethostbyaddr (addr, length, type); + if (!host || + convert (host, result, buffer, buflen, h_errnop) != 0) + { + result = NULL; + } + + pthread_mutex_unlock (&gethostby_mutex); + return result; +} + +struct hostent * +gethostbyname_r (const char *name, + struct hostent *result, char *buffer, int buflen, + int *h_errnop) +{ + struct hostent *host; + + pthread_mutex_lock (&gethostby_mutex); + + host = gethostbyname (name); + if (!host || + convert (host, result, buffer, buflen, h_errnop) != 0) + { + result = NULL; + } + + pthread_mutex_unlock (&gethostby_mutex); + return result; +} + +struct hostent * +gethostent_r (struct hostent *result, char *buffer, int buflen, + int *h_errnop) +{ + struct hostent *host; + + pthread_mutex_lock (&gethostby_mutex); + + host = gethostent (); + if (!host || + convert (host, result, buffer, buflen, h_errnop) != 0) + { + result = NULL; + } + + pthread_mutex_unlock (&gethostby_mutex); + return result; +} +++ netdb_r.h Fri Sep 13 12:45:40 2002 @@ -0,0 +1,22 @@ +#ifdef __cplusplus +extern "C" { +#endif + +struct hostent * +gethostbyaddr_r (const char *addr, int length, int type, + struct hostent *result, char *buffer, int buflen, + int *h_errnop); + +struct hostent * +gethostbyname_r (const char *name, + struct hostent *result, char *buffer, int buflen, + int *h_errnop); + +struct hostent * +gethostent_r (struct hostent *result, char *buffer, int buflen, + int *h_errnop); + +#ifdef __cplusplus +} +#endif + To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message