summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authordrochner <drochner>2006-07-10 17:35:30 +0000
committerdrochner <drochner>2006-07-10 17:35:30 +0000
commit78c2fc307b9bb3cf6ca389ddda517a32c6393ab6 (patch)
tree95d7f3c4852a44363129273c2f50cd8b4eec44ba /net
parentd5fd570e831fd50d0ca9cca7d8ce593801d2dc95 (diff)
downloadpkgsrc-78c2fc307b9bb3cf6ca389ddda517a32c6393ab6.tar.gz
Build the mdns hostname resolution nsswitch plugin which comes with
mDNSResponder. (NetBSD-3.x only for now.)
Diffstat (limited to 'net')
-rw-r--r--net/mDNSResponder-nss/DESCR2
-rw-r--r--net/mDNSResponder-nss/Makefile33
-rw-r--r--net/mDNSResponder-nss/PLIST5
-rw-r--r--net/mDNSResponder-nss/distinfo6
-rw-r--r--net/mDNSResponder-nss/files/netbsd.c143
-rw-r--r--net/mDNSResponder-nss/files/netbsd.h11
-rw-r--r--net/mDNSResponder-nss/patches/patch-aa411
7 files changed, 611 insertions, 0 deletions
diff --git a/net/mDNSResponder-nss/DESCR b/net/mDNSResponder-nss/DESCR
new file mode 100644
index 00000000000..b47243bd160
--- /dev/null
+++ b/net/mDNSResponder-nss/DESCR
@@ -0,0 +1,2 @@
+This is a nsswitch plugin from Apple's mDNSResponder code, adapted for
+NetBSD's nsswitch.
diff --git a/net/mDNSResponder-nss/Makefile b/net/mDNSResponder-nss/Makefile
new file mode 100644
index 00000000000..6cd23501cca
--- /dev/null
+++ b/net/mDNSResponder-nss/Makefile
@@ -0,0 +1,33 @@
+# $NetBSD: Makefile,v 1.1.1.1 2006/07/10 17:35:30 drochner Exp $
+
+DISTNAME= mDNSResponder-108
+PKGNAME= mDNSResponder-nss-108
+CATEGORIES= net
+MASTER_SITES= http://darwinsource.opendarwin.org/tarballs/apsl/
+
+MAINTAINER= pkgsrc-users@NetBSD.org
+HOMEPAGE= http://developer.apple.com/darwin/projects/bonjour/
+COMMENT= Apple's mDNS responder - NetBSD nsswitch module
+
+# needs nsswitch
+ONLY_FOR_PLATFORM= NetBSD-3.*-*
+
+post-extract:
+ ${CP} ${FILESDIR}/netbsd.c ${FILESDIR}/netbsd.h ${WRKSRC}/mDNSPosix
+
+do-build:
+ (cd ${WRKSRC}/mDNSPosix && ${CC} -c -fPIC -I. -I${LOCALBASE}/include \
+ nss_mdns.c netbsd.c)
+ (cd ${WRKSRC}/mDNSPosix && ${LD} -shared *.o -o nss_mdns.so.0 \
+ -L${LOCALBASE}/lib -Wl,-R${LOCALBASE}/lib -ldns_sd)
+
+do-install:
+ ${INSTALL_DATA} ${WRKSRC}/mDNSPosix/nss_mdns.so.0 ${PREFIX}/lib
+ ${INSTALL_DATA_DIR} ${PREFIX}/share/examples/nss_mdns
+ ${INSTALL_DATA} ${WRKSRC}/mDNSPosix/nss_mdns.conf \
+ ${PREFIX}/share/examples/nss_mdns
+ ${INSTALL_MAN} ${WRKSRC}/mDNSPosix/nss_mdns.conf.5 ${PREFIX}/man/man5
+
+.include "../../net/mDNSResponder/buildlink3.mk"
+.include "../../mk/pthread.buildlink3.mk"
+.include "../../mk/bsd.pkg.mk"
diff --git a/net/mDNSResponder-nss/PLIST b/net/mDNSResponder-nss/PLIST
new file mode 100644
index 00000000000..16fe1fad380
--- /dev/null
+++ b/net/mDNSResponder-nss/PLIST
@@ -0,0 +1,5 @@
+@comment $NetBSD: PLIST,v 1.1.1.1 2006/07/10 17:35:30 drochner Exp $
+lib/nss_mdns.so.0
+man/man5/nss_mdns.conf.5
+share/examples/nss_mdns/nss_mdns.conf
+@dirrm share/examples/nss_mdns
diff --git a/net/mDNSResponder-nss/distinfo b/net/mDNSResponder-nss/distinfo
new file mode 100644
index 00000000000..abc01e316ee
--- /dev/null
+++ b/net/mDNSResponder-nss/distinfo
@@ -0,0 +1,6 @@
+$NetBSD: distinfo,v 1.1.1.1 2006/07/10 17:35:30 drochner Exp $
+
+SHA1 (mDNSResponder-108.tar.gz) = d51509077be75ec8ba49c805fef701c3370428fc
+RMD160 (mDNSResponder-108.tar.gz) = 3a1961f3267bcf009b52c8d8ce234ee6045aeed2
+Size (mDNSResponder-108.tar.gz) = 1362840 bytes
+SHA1 (patch-aa) = 17dc96e6671c974df086d1cb9143163b22309fd7
diff --git a/net/mDNSResponder-nss/files/netbsd.c b/net/mDNSResponder-nss/files/netbsd.c
new file mode 100644
index 00000000000..55399982fc3
--- /dev/null
+++ b/net/mDNSResponder-nss/files/netbsd.c
@@ -0,0 +1,143 @@
+/* $NetBSD: netbsd.c,v 1.1.1.1 2006/07/10 17:35:30 drochner Exp $ */
+
+#include <sys/param.h>
+#include <nsswitch.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+
+#include "netbsd.h"
+typedef enum nss_status NSS_STATUS;
+
+extern NSS_STATUS _nss_mdns_gethostbyname2_r(const char *,
+ int, struct hostent *, char *, size_t, int *, int *);
+static int netbsd_gethostbyname(void *, void *, va_list);
+static int netbsd_getaddrinfo(void *, void *, va_list);
+extern NSS_STATUS _nss_mdns_gethostbyaddr_r(const void *, socklen_t,
+ int, struct hostent *, char *, size_t, int *, int *);
+static int netbsd_gethostbyaddr(void *, void *, va_list);
+
+static int nss2netbsderr[] = {
+ NS_SUCCESS, NS_NOTFOUND, NS_UNAVAIL, NS_TRYAGAIN, NS_RETURN
+};
+
+static struct hostent host;
+static char hostbuf[8*1024];
+
+static ns_mtab methods[] = {
+ { NSDB_HOSTS, "gethostbyname", netbsd_gethostbyname, 0 },
+ { NSDB_HOSTS, "getaddrinfo", netbsd_getaddrinfo, 0 },
+ { NSDB_HOSTS, "gethostbyaddr", netbsd_gethostbyaddr, 0 },
+};
+
+static int
+netbsd_gethostbyname(void *rv, void *cb_data, va_list ap)
+{
+ NSS_STATUS s;
+ int err, herr;
+ const char *name = va_arg(ap, char *);
+ size_t namlen = va_arg(ap, size_t);
+ int af = va_arg(ap, int);
+
+ s = _nss_mdns_gethostbyname2_r(name, af, &host,
+ hostbuf, sizeof(hostbuf), &err, &herr);
+
+ if (s == NSS_STATUS_SUCCESS)
+ *(struct hostent **)rv = &host;
+ else {
+ h_errno = HOST_NOT_FOUND;
+ *(struct hostent **)rv = 0;
+ }
+ return nss2netbsderr[s];
+}
+
+static void
+aiforaf(const char *name, int af, struct addrinfo *pai, struct addrinfo **aip)
+{
+ NSS_STATUS s;
+ int err, herr;
+ char **addrp;
+ char addrstr[INET6_ADDRSTRLEN];
+ struct addrinfo hints, *res0, *res;
+
+ s = _nss_mdns_gethostbyname2_r(name, af, &host,
+ hostbuf, sizeof(hostbuf), &err, &herr);
+ if (s != NSS_STATUS_SUCCESS)
+ return;
+
+ for (addrp = host.h_addr_list; *addrp; addrp++) {
+ /* XXX this sucks, but get_ai is not public */
+ if (!inet_ntop(host.h_addrtype, *addrp,
+ addrstr, sizeof(addrstr)))
+ continue;
+ hints = *pai;
+ hints.ai_flags = AI_NUMERICHOST;
+ hints.ai_family = af;
+ if (getaddrinfo(addrstr, NULL, &hints, &res0))
+ continue;
+ for (res = res0; res; res = res->ai_next)
+ res->ai_flags = pai->ai_flags;
+
+ (*aip)->ai_next = res0;
+ while ((*aip)->ai_next)
+ *aip = (*aip)->ai_next;
+ }
+}
+
+static int
+netbsd_getaddrinfo(void *rv, void *cb_data, va_list ap)
+{
+ struct addrinfo sentinel, *cur;
+ const char *name = va_arg(ap, char *);
+ struct addrinfo *ai = va_arg(ap, struct addrinfo *);
+
+ memset(&sentinel, 0, sizeof(sentinel));
+ cur = &sentinel;
+
+ if ((ai->ai_family == AF_UNSPEC) || (ai->ai_family == AF_INET6))
+ aiforaf(name, AF_INET6, ai, &cur);
+ if ((ai->ai_family == AF_UNSPEC) || (ai->ai_family == AF_INET))
+ aiforaf(name, AF_INET, ai, &cur);
+
+ if (!sentinel.ai_next) {
+ h_errno = HOST_NOT_FOUND;
+ return NS_NOTFOUND;
+ }
+ *((struct addrinfo **)rv) = sentinel.ai_next;
+ return NS_SUCCESS;
+}
+
+static int
+netbsd_gethostbyaddr(void *rv, void *cb_data, va_list ap)
+{
+ int err, herr;
+ NSS_STATUS s;
+ const unsigned char *addr = va_arg(ap, unsigned char *);
+ socklen_t addrlen = va_arg(ap, socklen_t);
+ int af = va_arg(ap, int);
+
+ s = _nss_mdns_gethostbyaddr_r(addr, addrlen, af, &host,
+ hostbuf, sizeof(hostbuf), &err, &herr);
+
+ if (s == NSS_STATUS_SUCCESS)
+ *(struct hostent **)rv = &host;
+ else {
+ h_errno = HOST_NOT_FOUND;
+ *(struct hostent **)rv = 0;
+ }
+ return nss2netbsderr[s];
+}
+
+ns_mtab *
+nss_module_register(const char *source, unsigned int *mtabsize,
+ nss_module_unregister_fn *unreg)
+{
+
+ *mtabsize = sizeof(methods)/sizeof(methods[0]);
+ *unreg = NULL;
+ return (methods);
+}
diff --git a/net/mDNSResponder-nss/files/netbsd.h b/net/mDNSResponder-nss/files/netbsd.h
new file mode 100644
index 00000000000..585d480ccf9
--- /dev/null
+++ b/net/mDNSResponder-nss/files/netbsd.h
@@ -0,0 +1,11 @@
+/* $NetBSD: netbsd.h,v 1.1.1.1 2006/07/10 17:35:30 drochner Exp $ */
+
+#include <nsswitch.h>
+
+enum nss_status {
+ NSS_STATUS_SUCCESS,
+ NSS_STATUS_NOTFOUND,
+ NSS_STATUS_UNAVAIL,
+ NSS_STATUS_TRYAGAIN,
+ NSS_STATUS_RETURN
+};
diff --git a/net/mDNSResponder-nss/patches/patch-aa b/net/mDNSResponder-nss/patches/patch-aa
new file mode 100644
index 00000000000..4af51bea264
--- /dev/null
+++ b/net/mDNSResponder-nss/patches/patch-aa
@@ -0,0 +1,411 @@
+$NetBSD: patch-aa,v 1.1.1.1 2006/07/10 17:35:30 drochner Exp $
+
+--- mDNSPosix/nss_mdns.c.orig 2006-07-10 13:43:18.000000000 +0200
++++ mDNSPosix/nss_mdns.c
+@@ -96,7 +96,7 @@ b. in the case of services:
+ /*
+ Count the number of dots in a name string.
+ */
+-int
++static int
+ count_dots (const char * name);
+
+
+@@ -107,7 +107,7 @@ count_dots (const char * name);
+ 1 if name ends with ".local" or ".local."
+ 0 otherwise
+ */
+-int
++static int
+ islocal (const char * name);
+
+
+@@ -126,7 +126,7 @@ islocal (const char * name);
+ Pointer to (first character of) output buffer,
+ or NULL on error.
+ */
+-char *
++static char *
+ format_reverse_addr (int af, const void * addr, int prefixlen, char * buf);
+
+
+@@ -145,7 +145,7 @@ format_reverse_addr (int af, const void
+ Pointer to (first character of) output buffer,
+ or NULL on error.
+ */
+-char *
++static char *
+ format_reverse_addr_in (
+ const struct in_addr * addr,
+ int prefixlen,
+@@ -168,7 +168,7 @@ format_reverse_addr_in (
+ Pointer to (first character of) output buffer,
+ or NULL on error.
+ */
+-char *
++static char *
+ format_reverse_addr_in6 (
+ const struct in6_addr * addr,
+ int prefixlen,
+@@ -189,7 +189,7 @@ format_reverse_addr_in6 (
+ 0 on failure (no match)
+ < 0 on error
+ */
+-int
++static int
+ cmp_dns_suffix (const char * name, const char * domain);
+ enum
+ {
+@@ -213,7 +213,7 @@ typedef int ns_class_t;
+ Appropriate AF code (from socket.h), or AF_UNSPEC if an appropriate
+ mapping couldn't be determined
+ */
+-int
++static int
+ rr_to_af (ns_type_t rrtype);
+
+
+@@ -227,7 +227,7 @@ rr_to_af (ns_type_t rrtype);
+ Appropriate RR code (from nameser.h), or ns_t_invalid if an appropriate
+ mapping couldn't be determined
+ */
+-ns_type_t
++static ns_type_t
+ af_to_rr (int af);
+
+
+@@ -237,7 +237,7 @@ af_to_rr (int af);
+ Returns
+ Matching AF code, or AF_UNSPEC if no match found.
+ */
+-int
++static int
+ str_to_af (const char * str);
+
+
+@@ -247,7 +247,7 @@ str_to_af (const char * str);
+ Returns
+ Matching ns_class_t, or ns_c_invalid if no match found.
+ */
+-ns_class_t
++static ns_class_t
+ str_to_ns_class (const char * str);
+
+
+@@ -257,7 +257,7 @@ str_to_ns_class (const char * str);
+ Returns
+ Matching ns_type_t, or ns_t_invalid if no match found.
+ */
+-ns_type_t
++static ns_type_t
+ str_to_ns_type (const char * str);
+
+
+@@ -268,7 +268,7 @@ str_to_ns_type (const char * str);
+ String representation of AF,
+ or NULL if address family unrecognised or invalid.
+ */
+-const char *
++static const char *
+ af_to_str (int in);
+
+
+@@ -279,7 +279,7 @@ af_to_str (int in);
+ String representation of ns_class_t,
+ or NULL if ns_class_t unrecognised or invalid.
+ */
+-const char *
++static const char *
+ ns_class_to_str (ns_class_t in);
+
+
+@@ -290,7 +290,7 @@ ns_class_to_str (ns_class_t in);
+ String representation of ns_type_t,
+ or NULL if ns_type_t unrecognised or invalid.
+ */
+-const char *
++static const char *
+ ns_type_to_str (ns_type_t in);
+
+
+@@ -320,7 +320,7 @@ ns_type_to_str (ns_type_t in);
+ < 0 on error.
+ A return of 0 implies the empty domain.
+ */
+-int
++static int
+ dns_rdata_to_name (const char * rdata, int rdlen, char * name, int name_len);
+ enum
+ {
+@@ -359,7 +359,7 @@ typedef int errcode_t;
+ 0 failure
+ -1 error, check errno
+ */
+-int
++static int
+ config_is_mdns_suffix (const char * name);
+
+
+@@ -373,13 +373,17 @@ config_is_mdns_suffix (const char * name
+ 0 configuration ready
+ non-zero configuration error code
+ */
+-errcode_t
+-init_config ();
++static errcode_t
++init_config (void);
+
+ #define ENTNAME hostent
+ #define DATABASE "hosts"
+
++#ifdef __NetBSD__
++#include "netbsd.h"
++#else
+ #include <nss.h>
++#endif
+ // For nss_status
+ #include <netdb.h>
+ // For hostent
+@@ -600,7 +604,7 @@ mdns_lookup_callback_t
+ void *context
+ );
+
+-mdns_lookup_callback_t mdns_lookup_callback;
++static mdns_lookup_callback_t mdns_lookup_callback;
+
+
+ static int
+@@ -1070,7 +1074,7 @@ handle_events (DNSServiceRef sdref, resu
+ Examine incoming data and add to relevant fields in result structure.
+ This routine is called from DNSServiceProcessResult where appropriate.
+ */
+-void
++static void
+ mdns_lookup_callback
+ (
+ DNSServiceRef sdref,
+@@ -1700,14 +1704,14 @@ is_applicable_addr (
+ //----------
+ // Types and Constants
+
+-const char * k_conf_file = "/etc/nss_mdns.conf";
++static const char * k_conf_file = "/etc/nss_mdns.conf";
+ #define CONF_LINE_SIZE 1024
+
+-const char k_comment_char = '#';
++static const char k_comment_char = '#';
+
+-const char * k_keyword_domain = "domain";
++static const char * k_keyword_domain = "domain";
+
+-const char * k_default_domains [] =
++static const char * k_default_domains [] =
+ {
+ "local",
+ "254.169.in-addr.arpa",
+@@ -1731,7 +1735,7 @@ typedef struct
+ domain_entry_t * domains;
+ } config_t;
+
+-const config_t k_empty_config =
++static const config_t k_empty_config =
+ {
+ NULL
+ };
+@@ -1780,7 +1784,7 @@ contains_domain_suffix (const config_t *
+ static config_t * g_config = NULL;
+ // Configuration info
+
+-pthread_mutex_t g_config_mutex =
++static pthread_mutex_t g_config_mutex =
+ #ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
+ PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
+ #else
+@@ -1799,7 +1803,7 @@ pthread_mutex_t g_config_mutex =
+ 0 success
+ non-zero error code on failure
+ */
+-errcode_t
++static errcode_t
+ init_config ()
+ {
+ if (g_config)
+@@ -1872,7 +1876,7 @@ init_config ()
+ }
+
+
+-int
++static int
+ config_is_mdns_suffix (const char * name)
+ {
+ int errcode = init_config ();
+@@ -2025,7 +2029,7 @@ get_next_word (char * input, char **next
+ char * curr = input;
+ char * result;
+
+- while (isspace (*curr))
++ while (isspace ((unsigned)*curr))
+ {
+ curr ++;
+ }
+@@ -2036,7 +2040,7 @@ get_next_word (char * input, char **next
+ }
+
+ result = curr;
+- while (*curr && ! isspace (*curr))
++ while (*curr && ! isspace ((unsigned)*curr))
+ {
+ curr++;
+ }
+@@ -2254,7 +2258,7 @@ table_index_value (const table_entry_t t
+ //----------
+ // Util functions
+
+-int
++static int
+ count_dots (const char * name)
+ {
+ int count = 0;
+@@ -2269,14 +2273,14 @@ count_dots (const char * name)
+ }
+
+
+-int
++static int
+ islocal (const char * name)
+ {
+ return cmp_dns_suffix (name, k_local_suffix) > 0;
+ }
+
+
+-int
++static int
+ rr_to_af (ns_type_t rrtype)
+ {
+ switch (rrtype)
+@@ -2293,7 +2297,7 @@ rr_to_af (ns_type_t rrtype)
+ }
+
+
+-ns_type_t
++static ns_type_t
+ af_to_rr (int af)
+ {
+ switch (af)
+@@ -2311,7 +2315,7 @@ af_to_rr (int af)
+ }
+
+
+-int
++static int
+ str_to_af (const char * str)
+ {
+ int result =
+@@ -2323,7 +2327,7 @@ str_to_af (const char * str)
+ }
+
+
+-ns_class_t
++static ns_class_t
+ str_to_ns_class (const char * str)
+ {
+ return (ns_class_t)
+@@ -2331,7 +2335,7 @@ str_to_ns_class (const char * str)
+ }
+
+
+-ns_type_t
++static ns_type_t
+ str_to_ns_type (const char * str)
+ {
+ return (ns_type_t)
+@@ -2339,7 +2343,7 @@ str_to_ns_type (const char * str)
+ }
+
+
+-const char *
++static const char *
+ af_to_str (int in)
+ {
+ int result =
+@@ -2351,7 +2355,7 @@ af_to_str (int in)
+ }
+
+
+-const char *
++static const char *
+ ns_class_to_str (ns_class_t in)
+ {
+ if (in < k_table_ns_class_size)
+@@ -2361,7 +2365,7 @@ ns_class_to_str (ns_class_t in)
+ }
+
+
+-const char *
++static const char *
+ ns_type_to_str (ns_type_t in)
+ {
+ if (in < k_table_ns_type_size)
+@@ -2371,7 +2375,7 @@ ns_type_to_str (ns_type_t in)
+ }
+
+
+-char *
++static char *
+ format_reverse_addr_in (
+ const struct in_addr * addr,
+ int prefixlen,
+@@ -2402,7 +2406,7 @@ format_reverse_addr_in (
+ }
+
+
+-char *
++static char *
+ format_reverse_addr_in6 (
+ const struct in6_addr * addr,
+ int prefixlen,
+@@ -2444,7 +2448,7 @@ format_reverse_addr_in6 (
+ }
+
+
+-char *
++static char *
+ format_reverse_addr (
+ int af,
+ const void * addr,
+@@ -2474,7 +2478,7 @@ format_reverse_addr (
+ }
+
+
+-int
++static int
+ cmp_dns_suffix (const char * name, const char * domain)
+ {
+ const char * nametail;
+@@ -2534,7 +2538,7 @@ cmp_dns_suffix (const char * name, const
+ while (
+ nametail >= name
+ && domaintail >= domain
+- && tolower(*nametail) == tolower(*domaintail))
++ && tolower((unsigned)*nametail) == tolower((unsigned)*domaintail))
+ {
+ nametail--;
+ domaintail--;
+@@ -2565,7 +2569,7 @@ cmp_dns_suffix (const char * name, const
+ }
+
+
+-int
++static int
+ dns_rdata_to_name (const char * rdata, int rdlen, char * name, int name_len)
+ {
+ int i = 0;
+@@ -2573,7 +2577,7 @@ dns_rdata_to_name (const char * rdata, i
+ const char * rdata_curr = rdata;
+
+ // drop any leading whitespace rubbish
+- while (isspace (*rdata_curr))
++ while (isspace ((unsigned)*rdata_curr))
+ {
+ rdata_curr ++;
+ if (rdata_curr > rdata + rdlen)