From 09d7092ebfe489c211c5e128f0b1fcef9309dffc Mon Sep 17 00:00:00 2001 From: asau Date: Sun, 1 Jun 2014 19:38:10 +0000 Subject: FreeBSD uses NetBSD-derived nsdispatch. Cram FreeBSD support in with some force using some knowledge picked from FreeBSD ports collection. Not yet tested in field. --- databases/nss_ldap/Makefile | 18 +- databases/nss_ldap/distinfo | 8 +- databases/nss_ldap/files/freebsd.c | 219 +++++++++++++++++++++++++ databases/nss_ldap/patches/patch-af | 12 +- databases/nss_ldap/patches/patch-ag | 7 +- databases/nss_ldap/patches/patch-ldap-ethers.c | 15 ++ databases/nss_ldap/patches/patch-ldap-pwd.c | 11 ++ 7 files changed, 276 insertions(+), 14 deletions(-) create mode 100644 databases/nss_ldap/files/freebsd.c create mode 100644 databases/nss_ldap/patches/patch-ldap-ethers.c create mode 100644 databases/nss_ldap/patches/patch-ldap-pwd.c (limited to 'databases/nss_ldap') diff --git a/databases/nss_ldap/Makefile b/databases/nss_ldap/Makefile index 6b37938a67e..8d576e32d7c 100644 --- a/databases/nss_ldap/Makefile +++ b/databases/nss_ldap/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.28 2014/02/12 23:17:39 tron Exp $ +# $NetBSD: Makefile,v 1.29 2014/06/01 19:38:10 asau Exp $ DISTNAME= nss_ldap-265 PKGREVISION= 5 @@ -11,7 +11,7 @@ COMMENT= LDAP client for nsswitch LICENSE= gnu-lgpl-v2 # needs nsswitch -ONLY_FOR_PLATFORM= NetBSD-[3-9]*-* +ONLY_FOR_PLATFORM= NetBSD-[3-9]*-* FreeBSD-*-* USE_TOOLS+= gmake GNU_CONFIGURE= yes @@ -21,6 +21,8 @@ CONFIGURE_ARGS+= --with-ldap-lib=openldap CONFIGURE_ARGS+= --with-ldap-dir=${BUILDLINK_PREFIX.openldap-client} CONFIGURE_ARGS+= --with-ldap-conf-file=${PKG_SYSCONFDIR}/ldap.conf CONFIGURE_ARGS+= --with-ldap-secret-file=${PKG_SYSCONFDIR}/ldap.secret +CFLAGS.FreeBSD+= -DUID_NOBODY=65534 -DGID_NOBODY=65534 # see +CONFIGURE_ENV+= ac_cv_header_nsswitch_h=no MAKE_FLAGS+= INST_UID=${BINOWN} INST_GID=${BINGRP} # shared with security/pam-ldap @@ -29,9 +31,19 @@ CONF_FILES= ${EGDIR}/ldap.conf ${PKG_SYSCONFDIR}/ldap.conf INSTALL_MAKE_FLAGS= ${MAKE_FLAGS} sysconfdir=${EGDIR} +SUBST_CLASSES+= fix-opsys +SUBST_STAGE.fix-opsys= pre-configure +SUBST_MESSAGE.fix-opsys= Fixing system name. +SUBST_FILES.fix-opsys= Makefile.in +SUBST_SED.fix-opsys= -e 's,@OPSYS@,${OPSYS:tl},g' + +.include "../../mk/bsd.prefs.mk" + pre-build: - ${CP} ${FILESDIR}/netbsd.c ${FILESDIR}/netbsd.h ${WRKSRC} + ${CP} ${FILESDIR}/netbsd.c ${FILESDIR}/netbsd.h ${FILESDIR}/freebsd.c ${WRKSRC} +.if ${OPSYS} == "NetBSD" ${LN} -fs /usr/include/nsswitch.h ${BUILDLINK_DIR}/include/nss.h +.endif .include "options.mk" diff --git a/databases/nss_ldap/distinfo b/databases/nss_ldap/distinfo index dbdea44c1ba..d3e00cbeaa4 100644 --- a/databases/nss_ldap/distinfo +++ b/databases/nss_ldap/distinfo @@ -1,8 +1,10 @@ -$NetBSD: distinfo,v 1.7 2010/11/03 11:39:07 adam Exp $ +$NetBSD: distinfo,v 1.8 2014/06/01 19:38:10 asau Exp $ SHA1 (nss_ldap-265.tar.gz) = 743581914fc8c9b4d33955c2cc7acd0c3c44a430 RMD160 (nss_ldap-265.tar.gz) = 0513f1b62aface531145f739ec8e9867c77eb3ce Size (nss_ldap-265.tar.gz) = 280976 bytes SHA1 (patch-ab) = 418fca750b9b6f40dd3a904af84fababf8c55022 -SHA1 (patch-af) = 27fa5ff0bbff4340ce92e109b35d900369e31a53 -SHA1 (patch-ag) = 880b8867b610b9602fc428beebdeb85dee215816 +SHA1 (patch-af) = 7a09ee93a903dc7df256a50d9e904b74e6e5747f +SHA1 (patch-ag) = 4fa04f6b577b7c5a6977403dae3e91a3faab4152 +SHA1 (patch-ldap-ethers.c) = 0e4e27e4f03e7e8a821aaddabb91c443f5d1db22 +SHA1 (patch-ldap-pwd.c) = 5d4720aaa88e2e7b46d1c1cde9648466b82598e1 diff --git a/databases/nss_ldap/files/freebsd.c b/databases/nss_ldap/files/freebsd.c new file mode 100644 index 00000000000..8b1601454ac --- /dev/null +++ b/databases/nss_ldap/files/freebsd.c @@ -0,0 +1,219 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern enum nss_status _nss_ldap_getgrent_r(struct group *, char *, size_t, + int *); +extern enum nss_status _nss_ldap_getgrnam_r(const char *, struct group *, + char *, size_t, int *); +extern enum nss_status _nss_ldap_getgrgid_r(gid_t gid, struct group *, char *, + size_t, int *); +extern enum nss_status _nss_ldap_setgrent(void); +extern enum nss_status _nss_ldap_endgrent(void); +extern enum nss_status _nss_ldap_initgroups_dyn(const char *, gid_t, long int *, + long int *, gid_t **, long int, int *); + +extern enum nss_status _nss_ldap_getpwent_r(struct passwd *, char *, size_t, + int *); +extern enum nss_status _nss_ldap_getpwnam_r(const char *, struct passwd *, + char *, size_t, int *); +extern enum nss_status _nss_ldap_getpwuid_r(gid_t gid, struct passwd *, char *, + size_t, int *); +extern enum nss_status _nss_ldap_setpwent(void); +extern enum nss_status _nss_ldap_endpwent(void); + +extern enum nss_status _nss_ldap_gethostbyname_r (const char *name, struct hostent * result, + char *buffer, size_t buflen, int *errnop, + int *h_errnop); + +extern enum nss_status _nss_ldap_gethostbyname2_r (const char *name, int af, struct hostent * result, + char *buffer, size_t buflen, int *errnop, + int *h_errnop); +extern enum nss_status _nss_ldap_gethostbyaddr_r (struct in_addr * addr, int len, int type, + struct hostent * result, char *buffer, + size_t buflen, int *errnop, int *h_errnop); + +NSS_METHOD_PROTOTYPE(__nss_compat_getgrnam_r); +NSS_METHOD_PROTOTYPE(__nss_compat_getgrgid_r); +NSS_METHOD_PROTOTYPE(__nss_compat_getgrent_r); +NSS_METHOD_PROTOTYPE(__nss_compat_setgrent); +NSS_METHOD_PROTOTYPE(__nss_compat_endgrent); +static NSS_METHOD_PROTOTYPE(__freebsd_getgroupmembership); + +NSS_METHOD_PROTOTYPE(__nss_compat_getpwnam_r); +NSS_METHOD_PROTOTYPE(__nss_compat_getpwuid_r); +NSS_METHOD_PROTOTYPE(__nss_compat_getpwent_r); +NSS_METHOD_PROTOTYPE(__nss_compat_setpwent); +NSS_METHOD_PROTOTYPE(__nss_compat_endpwent); + +NSS_METHOD_PROTOTYPE(__nss_compat_gethostbyname); +NSS_METHOD_PROTOTYPE(__nss_compat_gethostbyname2); +NSS_METHOD_PROTOTYPE(__nss_compat_gethostbyaddr); + +static ns_mtab methods[] = { +{ NSDB_GROUP, "getgrnam_r", __nss_compat_getgrnam_r, _nss_ldap_getgrnam_r }, +{ NSDB_GROUP, "getgrgid_r", __nss_compat_getgrgid_r, _nss_ldap_getgrgid_r }, +{ NSDB_GROUP, "getgrent_r", __nss_compat_getgrent_r, _nss_ldap_getgrent_r }, +{ NSDB_GROUP, "setgrent", __nss_compat_setgrent, _nss_ldap_setgrent }, +{ NSDB_GROUP, "endgrent", __nss_compat_endgrent, _nss_ldap_endgrent }, +{ NSDB_GROUP, "getgroupmembership", __freebsd_getgroupmembership, NULL }, + +{ NSDB_PASSWD, "getpwnam_r", __nss_compat_getpwnam_r, _nss_ldap_getpwnam_r }, +{ NSDB_PASSWD, "getpwuid_r", __nss_compat_getpwuid_r, _nss_ldap_getpwuid_r }, +{ NSDB_PASSWD, "getpwent_r", __nss_compat_getpwent_r, _nss_ldap_getpwent_r }, +{ NSDB_PASSWD, "setpwent", __nss_compat_setpwent, _nss_ldap_setpwent }, +{ NSDB_PASSWD, "endpwent", __nss_compat_endpwent, _nss_ldap_endpwent }, + +{ NSDB_HOSTS, "gethostbyname", __nss_compat_gethostbyname, _nss_ldap_gethostbyname_r }, +{ NSDB_HOSTS, "gethostbyaddr", __nss_compat_gethostbyaddr, _nss_ldap_gethostbyaddr_r }, +{ NSDB_HOSTS, "gethostbyname2", __nss_compat_gethostbyname2, _nss_ldap_gethostbyname2_r }, + +{ NSDB_GROUP_COMPAT, "getgrnam_r", __nss_compat_getgrnam_r, _nss_ldap_getgrnam_r }, +{ NSDB_GROUP_COMPAT, "getgrgid_r", __nss_compat_getgrgid_r, _nss_ldap_getgrgid_r }, +{ NSDB_GROUP_COMPAT, "getgrent_r", __nss_compat_getgrent_r, _nss_ldap_getgrent_r }, +{ NSDB_GROUP_COMPAT, "setgrent", __nss_compat_setgrent, _nss_ldap_setgrent }, +{ NSDB_GROUP_COMPAT, "endgrent", __nss_compat_endgrent, _nss_ldap_endgrent }, + +{ NSDB_PASSWD_COMPAT, "getpwnam_r", __nss_compat_getpwnam_r, _nss_ldap_getpwnam_r }, +{ NSDB_PASSWD_COMPAT, "getpwuid_r", __nss_compat_getpwuid_r, _nss_ldap_getpwuid_r }, +{ NSDB_PASSWD_COMPAT, "getpwent_r", __nss_compat_getpwent_r, _nss_ldap_getpwent_r }, +{ NSDB_PASSWD_COMPAT, "setpwent", __nss_compat_setpwent, _nss_ldap_setpwent }, +{ NSDB_PASSWD_COMPAT, "endpwent", __nss_compat_endpwent, _nss_ldap_endpwent }, + +}; + + +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); +} + +int __nss_compat_gethostbyname(void *retval, void *mdata, va_list ap) +{ + enum nss_status (*fn)(const char *, struct hostent *, char *, size_t, int *, int *); + const char *name; + struct hostent *result; + char buffer[1024]; + size_t buflen = 1024; + int errnop; + int h_errnop; + int af; + enum nss_status status; + fn = mdata; + name = va_arg(ap, const char*); + af = va_arg(ap,int); + result = va_arg(ap,struct hostent *); + status = fn(name, result, buffer, buflen, &errnop, &h_errnop); + status = __nss_compat_result(status,errnop); + h_errno = h_errnop; + return (status); +} + +int __nss_compat_gethostbyname2(void *retval, void *mdata, va_list ap) +{ + enum nss_status (*fn)(const char *, struct hostent *, char *, size_t, int *, int *); + const char *name; + struct hostent *result; + char buffer[1024]; + size_t buflen = 1024; + int errnop; + int h_errnop; + int af; + enum nss_status status; + fn = mdata; + name = va_arg(ap, const char*); + af = va_arg(ap,int); + result = va_arg(ap,struct hostent *); + status = fn(name, result, buffer, buflen, &errnop, &h_errnop); + status = __nss_compat_result(status,errnop); + h_errno = h_errnop; + return (status); +} + +int __nss_compat_gethostbyaddr(void *retval, void *mdata, va_list ap) +{ + struct in_addr *addr; + int len; + int type; + struct hostent *result; + char buffer[1024]; + size_t buflen = 1024; + int errnop; + int h_errnop; + enum nss_status (*fn)(struct in_addr *, int, int, struct hostent *, char *, size_t, int *, int *); + enum nss_status status; + fn = mdata; + addr = va_arg(ap, struct in_addr*); + len = va_arg(ap,int); + type = va_arg(ap,int); + result = va_arg(ap, struct hostent*); + status = fn(addr, len, type, result, buffer, buflen, &errnop, &h_errnop); + status = __nss_compat_result(status,errnop); + h_errno = h_errnop; + return (status); +} + +static int +__gr_addgid(gid_t gid, gid_t *groups, int maxgrp, int *groupc) +{ + int ret, dupc; + + /* skip duplicates */ + for (dupc = 0; dupc < MIN(maxgrp, *groupc); dupc++) { + if (groups[dupc] == gid) + return 1; + } + + ret = 1; + if (*groupc < maxgrp) /* add this gid */ + groups[*groupc] = gid; + else + ret = 0; + (*groupc)++; + return ret; +} + +static int __freebsd_getgroupmembership(void *retval, void *mdata, va_list ap) +{ + int err; + enum nss_status s; + const char *user = va_arg(ap, const char *); + gid_t group = va_arg(ap, gid_t); + gid_t *groups = va_arg(ap, gid_t *); + int limit = va_arg(ap, int); + int *size = va_arg(ap, int*); + gid_t *tmpgroups; + long int lstart, lsize; + int i; + + tmpgroups = malloc(limit * sizeof(gid_t)); + if (tmpgroups == NULL) + return NS_TRYAGAIN; + + /* insert primary membership */ + __gr_addgid(group, groups, limit, size); + + lstart = 0; + lsize = limit; + s = _nss_ldap_initgroups_dyn(user, group, &lstart, &lsize, + &tmpgroups, 0, &err); + if (s == NSS_STATUS_SUCCESS) { + for (i = 0; i < lstart; i++) + __gr_addgid(tmpgroups[i], groups, limit, size); + s = NSS_STATUS_NOTFOUND; + } + + free(tmpgroups); + + return __nss_compat_result(s, err); +} diff --git a/databases/nss_ldap/patches/patch-af b/databases/nss_ldap/patches/patch-af index e1e8488fa5d..3d1645b8c6d 100644 --- a/databases/nss_ldap/patches/patch-af +++ b/databases/nss_ldap/patches/patch-af @@ -1,4 +1,4 @@ -$NetBSD: patch-af,v 1.6 2010/11/03 11:39:08 adam Exp $ +$NetBSD: patch-af,v 1.7 2014/06/01 19:38:10 asau Exp $ --- Makefile.in.orig 2009-11-06 10:28:08.000000000 +0000 +++ Makefile.in @@ -7,7 +7,7 @@ $NetBSD: patch-af,v 1.6 2010/11/03 11:39:08 adam Exp $ resolve.$(OBJEXT) dnsconfig.$(OBJEXT) irs-nss.$(OBJEXT) \ pagectrl.$(OBJEXT) aix_authmeth.$(OBJEXT) \ - ldap-init-krb5-cache.$(OBJEXT) vers.$(OBJEXT) -+ ldap-init-krb5-cache.$(OBJEXT) netbsd.$(OBJEXT) ++ ldap-init-krb5-cache.$(OBJEXT) @OPSYS@.$(OBJEXT) NSS_LDAP_OBJECTS = $(am_NSS_LDAP_OBJECTS) NSS_LDAP_LDADD = $(LDADD) am_nss_ldap_so_OBJECTS = ldap-nss.$(OBJEXT) ldap-pwd.$(OBJEXT) \ @@ -16,7 +16,7 @@ $NetBSD: patch-af,v 1.6 2010/11/03 11:39:08 adam Exp $ snprintf.$(OBJEXT) resolve.$(OBJEXT) dnsconfig.$(OBJEXT) \ irs-nss.$(OBJEXT) pagectrl.$(OBJEXT) ldap-sldap.$(OBJEXT) \ - ldap-init-krb5-cache.$(OBJEXT) vers.$(OBJEXT) -+ ldap-init-krb5-cache.$(OBJEXT) netbsd.$(OBJEXT) ++ ldap-init-krb5-cache.$(OBJEXT) @OPSYS@.$(OBJEXT) nss_ldap_so_OBJECTS = $(am_nss_ldap_so_OBJECTS) nss_ldap_so_LDADD = $(LDADD) DEFAULT_INCLUDES = -I. -I$(srcdir) -I. @@ -34,12 +34,12 @@ $NetBSD: patch-af,v 1.6 2010/11/03 11:39:08 adam Exp $ ldap-bp.c ldap-automount.c util.c ltf.c snprintf.c resolve.c \ dnsconfig.c irs-nss.c pagectrl.c ldap-sldap.c ldap-init-krb5-cache.c \ - vers.c -+ netbsd.c ++ @OPSYS@.c NSS_LDAP_SOURCES = ldap-nss.c ldap-grp.c ldap-pwd.c ldap-netgrp.c ldap-schema.c \ util.c ltf.c snprintf.c resolve.c dnsconfig.c \ - irs-nss.c pagectrl.c aix_authmeth.c ldap-init-krb5-cache.c vers.c -+ irs-nss.c pagectrl.c aix_authmeth.c ldap-init-krb5-cache.c netbsd.c ++ irs-nss.c pagectrl.c aix_authmeth.c ldap-init-krb5-cache.c @OPSYS@.c @GCC_FALSE@MULTI_OS_DIRECTORY = . #INCLUDES = -I$(top_builddir) -I$(srcdir) @@ -48,7 +48,7 @@ $NetBSD: patch-af,v 1.6 2010/11/03 11:39:08 adam Exp $ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snprintf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vers.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netbsd.Po@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/@OPSYS@.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ diff --git a/databases/nss_ldap/patches/patch-ag b/databases/nss_ldap/patches/patch-ag index 87e2eb9a393..76cae715941 100644 --- a/databases/nss_ldap/patches/patch-ag +++ b/databases/nss_ldap/patches/patch-ag @@ -1,8 +1,8 @@ -$NetBSD: patch-ag,v 1.2 2010/10/29 13:47:12 adam Exp $ +$NetBSD: patch-ag,v 1.3 2014/06/01 19:38:10 asau Exp $ --- config.h.in.orig 2009-11-06 10:28:08.000000000 +0000 +++ config.h.in -@@ -345,3 +345,7 @@ +@@ -345,3 +345,10 @@ /* Version number of package */ #undef VERSION @@ -10,3 +10,6 @@ $NetBSD: patch-ag,v 1.2 2010/10/29 13:47:12 adam Exp $ +#ifdef __NetBSD__ +#include "netbsd.h" +#endif ++#ifdef __FreeBSD__ ++#include "nss.h" ++#endif diff --git a/databases/nss_ldap/patches/patch-ldap-ethers.c b/databases/nss_ldap/patches/patch-ldap-ethers.c new file mode 100644 index 00000000000..55d1836cc47 --- /dev/null +++ b/databases/nss_ldap/patches/patch-ldap-ethers.c @@ -0,0 +1,15 @@ +$NetBSD: patch-ldap-ethers.c,v 1.1 2014/06/01 19:38:10 asau Exp $ + +--- ldap-ethers.c.orig 2009-11-06 10:28:08.000000000 +0000 ++++ ldap-ethers.c +@@ -96,6 +96,10 @@ static char *ether_ntoa (const struct et + static ent_context_t *ether_context = NULL; + #endif + ++#ifdef __FreeBSD__ ++#define ether_addr_octet octet ++#endif ++ + static NSS_STATUS + _nss_ldap_parse_ether (LDAPMessage * e, + ldap_state_t * pvt, diff --git a/databases/nss_ldap/patches/patch-ldap-pwd.c b/databases/nss_ldap/patches/patch-ldap-pwd.c new file mode 100644 index 00000000000..40ed498d8a0 --- /dev/null +++ b/databases/nss_ldap/patches/patch-ldap-pwd.c @@ -0,0 +1,11 @@ +$NetBSD: patch-ldap-pwd.c,v 1.1 2014/06/01 19:38:10 asau Exp $ + +--- ldap-pwd.c.orig 2009-11-06 10:28:08.000000000 +0000 ++++ ldap-pwd.c +@@ -23,2 +23,6 @@ static char rcsId[] = + ++#if defined(__FreeBSD__) ++#include ++#include ++#endif + #include "config.h" -- cgit v1.2.3