Index: head/net/openldap24-server/Makefile =================================================================== --- head/net/openldap24-server/Makefile (revision 451424) +++ head/net/openldap24-server/Makefile (revision 451425) @@ -1,631 +1,641 @@ # Created by: Xin LI # $FreeBSD$ PORTNAME= openldap DISTVERSION= 2.4.45 PORTREVISION= ${OPENLDAP_PORTREVISION} CATEGORIES= net databases MASTER_SITES= ftp://ftp.OpenLDAP.org/pub/OpenLDAP/%SUBDIR%/ \ ftp://gd.tuwien.ac.at/infosys/network/OpenLDAP/%SUBDIR%/ \ ftp://ftp.ntua.gr/mirror/OpenLDAP/%SUBDIR%/ \ ftp://ftp.u-aizu.ac.jp/pub/net/openldap/%SUBDIR%/ \ ftp://ftp.nl.uu.net/pub/unix/db/openldap/%SUBDIR%/ \ ftp://sunsite.cnlab-switch.ch/mirror/OpenLDAP/%SUBDIR%/ \ http://www.openldap.org/software/download/OpenLDAP/%SUBDIR%/ MASTER_SITE_SUBDIR= openldap-release .if defined(CLIENT_ONLY) .if ${CLIENT_ONLY} == sasl PKGNAMESUFFIX= -sasl-client .else PKGNAMESUFFIX= -client .endif .else PKGNAMESUFFIX?= -server .endif MAINTAINER= delphij@FreeBSD.org .if defined(CLIENT_ONLY) .if ${CLIENT_ONLY} == sasl COMMENT= Open source LDAP client implementation with SASL2 support .else COMMENT= Open source LDAP client implementation .endif .else COMMENT= Open source LDAP server implementation .endif LICENSE= OPENLDAP LICENSE_NAME= OpenLDAP Public License LICENSE_FILE= ${WRKSRC}/LICENSE LICENSE_PERMS= dist-mirror dist-sell pkg-mirror pkg-sell auto-accept .if defined(CLIENT_ONLY) .if ${CLIENT_ONLY} == sasl CONFLICTS= ${PKGNAMEPREFIX}${PORTNAME}-client-2.* \ ${PKGNAMEPREFIX}${PORTNAME}-sasl-client-2.[0-3].* .else CONFLICTS= ${PKGNAMEPREFIX}${PORTNAME}-client-2.[0-3].* \ ${PKGNAMEPREFIX}${PORTNAME}-sasl-client-2.* .endif .endif GNU_CONFIGURE= yes # :keepla because port uses lt_dlopen USES= cpe libtool:keepla ssl tar:tgz .if !defined(CLIENT_ONLY) USERS= ldap GROUPS= ldap LDAP_USER?= ldap LDAP_GROUP?= ldap .endif WANT_OPENLDAP_VER?= 24 .if ${WANT_OPENLDAP_VER} != 24 BROKEN= incompatible OpenLDAP version: ${WANT_OPENLDAP_VER} .endif PORTREVISION_CLIENT= 0 -PORTREVISION_SERVER= 1 +PORTREVISION_SERVER= 2 OPENLDAP_SHLIB_MAJOR= 2 OPENLDAP_SHLIB_MINOR= 10.8 OPENLDAP_MAJOR= ${DISTVERSION:R} OPTIONS_DEFINE= DEBUG FETCH GSSAPI FETCH_DESC= Enable fetch(3) support GSSAPI_DESC= With GSSAPI support (implies SASL support) .if !defined(CLIENT_ONLY) OPTIONS_DEFINE+= DYNACL ACI BDB MDB DNSSRV PASSWD PERL RELAY SHELL OPTIONS_DEFINE+= SOCK ODBC RLOOKUPS SLP SLAPI TCP_WRAPPERS OPTIONS_DEFINE+= ACCESSLOG AUDITLOG COLLECT CONSTRAINT DDS OPTIONS_DEFINE+= DEREF DYNGROUP DYNLIST MEMBEROF PPOLICY PROXYCACHE OPTIONS_DEFINE+= REFINT RETCODE RWM SEQMOD SSSVLV SYNCPROV TRANSLUCENT OPTIONS_DEFINE+= UNIQUE VALSORT SMBPWD SHA2 DYNAMIC_BACKENDS SASL OPTIONS_DEFINE+= LMPASSWD OPTIONS_DEFINE+= OUTLOOK OPTIONS_DEFINE+= LASTBIND +OPTIONS_DEFINE+= KQUEUE OPTIONS_DEFAULT= MDB SYNCPROV DYNAMIC_BACKENDS DYNACL_DESC= Run-time loadable ACL (experimental) ACI_DESC= Per-object ACI (experimental) BDB_DESC= With BerkeleyDB backend (DEPRECATED) MDB_DESC= With Memory-Mapped DB backend DNSSRV_DESC= With Dnssrv backend PASSWD_DESC= With Passwd backend PERL_DESC= With Perl backend RELAY_DESC= With Relay backend SHELL_DESC= With Shell backend (disables threading) SOCK_DESC= With Sock backend ODBC_DESC= With SQL backend RLOOKUPS_DESC= With reverse lookups of client hostnames SLP_DESC= With SLPv2 (RFC 2608) support SLAPI_DESC= With Netscape SLAPI plugin API (experimental) TCP_WRAPPERS_DESC= With tcp wrapper support ACCESSLOG_DESC= With In-Directory Access Logging overlay AUDITLOG_DESC= With Audit Logging overlay COLLECT_DESC= With Collect overy Services overlay CONSTRAINT_DESC= With Attribute Constraint overlay DDS_DESC= With Dynamic Directory Services overlay DEREF_DESC= With Dereference overlay DYNGROUP_DESC= With Dynamic Group overlay DYNLIST_DESC= With Dynamic List overlay MEMBEROF_DESC= With Reverse Group Membership overlay PPOLICY_DESC= With Password Policy overlay PROXYCACHE_DESC= With Proxy Cache overlay REFINT_DESC= With Referential Integrity overlay RETCODE_DESC= With Return Code testing overlay RWM_DESC= With Rewrite/Remap overlay SASL_DESC= With (Cyrus) SASL2 support SEQMOD_DESC= With Sequential Modify overlay SSSVLV_DESC= With ServerSideSort/VLV overlay SYNCPROV_DESC= With Syncrepl Provider overlay TRANSLUCENT_DESC= With Translucent Proxy overlay UNIQUE_DESC= With attribute Uniqueness overlay VALSORT_DESC= With Value Sorting overlay SMBPWD_DESC= With Samba Password hashes overlay SHA2_DESC= With SHA2 Password hashes overlay LMPASSWD_DESC= With LM hash password support (DEPRECATED) DYNAMIC_BACKENDS_DESC= Build dynamic backends OUTLOOK_DESC= Force caseIgnoreOrderingMatch on name attribute (experimental) LASTBIND_DESC= With lastbind overlay +KQUEUE_DESC= With kqueue support (experimental) .endif .if defined(CLIENT_ONLY) OPENLDAP_PORTREVISION= ${PORTREVISION_CLIENT} OPENLDAP_PKGFILESUFX= .client .else OPENLDAP_PORTREVISION= ${PORTREVISION_SERVER} OPENLDAP_PKGFILESUFX= .endif CONFIGURE_SED= -e 's,uuid/uuid.h,xxuuid/uuid.h,g' .include .if defined(CLIENT_ONLY) PORTDOCS= CHANGES drafts rfc .if ${CLIENT_ONLY} == sasl PORT_OPTIONS+= SASL .endif .if defined(USE_OPENLDAP) BROKEN= you have USE_OPENLDAP variable defined either in environment or in make(1) arguments; please undefine and try again .endif .else USE_OPENLDAP= yes WANT_OPENLDAP_VER= 24 +LIB_DEPENDS+= libicudata.so:devel/icu + .if ${PORT_OPTIONS:MGSSAPI} && empty(PORT_OPTIONS:MSASL) PORT_OPTIONS+= SASL .endif .if ${PORT_OPTIONS:MSASL} WANT_OPENLDAP_SASL= yes CONFLICTS= ${PKGNAMEPREFIX}${PORTNAME}-client-2.* PKGNAMESUFFIX= -sasl-server .if ${PORT_OPTIONS:MGSSAPI} RUN_DEPENDS+= cyrus-sasl-gssapi>0:security/cyrus-sasl2-gssapi .endif .else CONFLICTS= ${PKGNAMEPREFIX}${PORTNAME}-sasl-client-2.* .endif .endif DESCR= ${PKGDIR}/pkg-descr${OPENLDAP_PKGFILESUFX} PLIST= ${PKGDIR}/pkg-plist${OPENLDAP_PKGFILESUFX} SCHEMATA= collective corba core cosine duaconf dyngroup \ inetorgperson java misc \ nis openldap pmi ppolicy LDAP_RUN_DIR?= /var/run/openldap LOCALSTATEDIR?= /var/db DATABASEDIR?= ${LOCALSTATEDIR}/openldap-data SUB_LIST+= LDAP_RUN_DIR=${LDAP_RUN_DIR} \ LDAP_USER=${LDAP_USER} \ LDAP_GROUP=${LDAP_GROUP} \ DATABASEDIR=${DATABASEDIR} \ PKGNAME=${PKGNAME} CONFIGURE_ARGS= --with-threads=posix \ --with-tls=openssl \ --disable-dependency-tracking \ --enable-dynamic -# XXX FreeBSD does not implement O_DSYNC and fdatasync at this time. +.if ${OSVERSION} < 1101000 CFLAGS+= -DMDB_DSYNC=O_SYNC -Dfdatasync=fsync +.endif .if ${PORT_OPTIONS:MSASL} LIB_DEPENDS+= libsasl2.so:security/cyrus-sasl2 CONFIGURE_ARGS+= --with-cyrus-sasl .else CONFIGURE_ARGS+= --without-cyrus-sasl .endif .if defined(CLIENT_ONLY) # client specific configuration CONFIGURE_ARGS+= --disable-slapd \ --disable-monitor \ --disable-bdb \ --disable-relay \ --disable-syncprov SUB_FILES+= pkg-message.client PKGMESSAGE= ${WRKSRC}/pkg-message.client USE_LDCONFIG= yes .else # server specific configuration USE_LDCONFIG= ${PREFIX}/libexec/openldap SUB_FILES+= pkg-message pkg-deinstall USE_RC_SUBR= slapd EXTRA_PATCHES+= ${FILESDIR}/extrapatch-Makefile.in .if ${PORT_OPTIONS:MDYNAMIC_BACKENDS} || ${PORT_OPTIONS:MSLAPI} LIB_DEPENDS+= libltdl.so:devel/libltdl CONFIGURE_ARGS+= --enable-modules PLIST_SUB+= MODULES="" .else PLIST_SUB+= MODULES="@comment " .endif SED_MODULES= -e 's/\(moduleload[ ]*back_[a-z]*\)\.la/\1/' .if ${PORT_OPTIONS:MDYNAMIC_BACKENDS} BACKEND_ENABLE= "mod" BACKEND_PLIST= "" SED_MODULES+= -e 's/\# *\(modulepath\)/\1/' \ -e 's/\# *\(moduleload[ ]*back_bdb\)/\1/' .else BACKEND_ENABLE= "yes" BACKEND_PLIST= "@comment " .endif OVERLAY_ENABLE= yes CONFIGURE_ARGS+= --localstatedir=${LOCALSTATEDIR} \ --enable-crypt \ --enable-ldap=${BACKEND_ENABLE} \ --enable-meta=${BACKEND_ENABLE} \ --enable-rewrite \ --enable-null=${BACKEND_ENABLE} \ --enable-monitor=${BACKEND_ENABLE} PLIST_SUB+= BACKEND=${BACKEND_PLIST} .if ${PORT_OPTIONS:MACCESSLOG} CONFIGURE_ARGS+= --enable-accesslog=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MAUDITLOG} CONFIGURE_ARGS+= --enable-auditlog=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MCOLLECT} CONFIGURE_ARGS+= --enable-collect=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MCONSTRAINT} CONFIGURE_ARGS+= --enable-constraint=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MDDS} CONFIGURE_ARGS+= --enable-dds=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MDEBUG} CONFIGURE_ARGS+= --enable-debug=yes .endif MAKE_ENV+= STRIP=${STRIP} .if ${PORT_OPTIONS:MDEREF} CONFIGURE_ARGS+= --enable-deref=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MDYNGROUP} CONFIGURE_ARGS+= --enable-dyngroup=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MDYNLIST} CONFIGURE_ARGS+= --enable-dynlist=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MLMPASSWD} CONFIGURE_ARGS+= --enable-lmpasswd .endif .if ${PORT_OPTIONS:MMEMBEROF} CONFIGURE_ARGS+= --enable-memberof=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MPPOLICY} CONFIGURE_ARGS+= --enable-ppolicy=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MPROXYCACHE} CONFIGURE_ARGS+= --enable-proxycache=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MREFINT} CONFIGURE_ARGS+= --enable-refint=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MRETCODE} CONFIGURE_ARGS+= --enable-retcode=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MRWM} CONFIGURE_ARGS+= --enable-rwm=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MSEQMOD} CONFIGURE_ARGS+= --enable-seqmod=${OVERLAY_ENABLE} .else CONFIGURE_ARGS+= --disable-seqmod .endif .if ${PORT_OPTIONS:MSSSVLV} CONFIGURE_ARGS+= --enable-sssvlv=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MSYNCPROV} CONFIGURE_ARGS+= --enable-syncprov=${OVERLAY_ENABLE} .else CONFIGURE_ARGS+= --disable-syncprov .endif .if ${PORT_OPTIONS:MTRANSLUCENT} CONFIGURE_ARGS+= --enable-translucent=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MUNIQUE} CONFIGURE_ARGS+= --enable-unique=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MVALSORT} CONFIGURE_ARGS+= --enable-valsort=${OVERLAY_ENABLE} .endif .if ${PORT_OPTIONS:MACI} CONFIGURE_ARGS+= --enable-aci .endif .if ${PORT_OPTIONS:MDYNACL} CONFIGURE_ARGS+= --enable-dynacl .endif .if ${PORT_OPTIONS:MLASTBIND} CONFIGURE_ARGS+= --enable-lastbind .endif .if !${PORT_OPTIONS:MBDB} CONFIGURE_ARGS+= --disable-bdb \ --disable-hdb PLIST_SUB+= BACK_BDB="@comment " \ BACK_HDB="@comment " .else USES+= bdb INVALID_BDB_VER= 6 CONFIGURE_ARGS+= --enable-bdb=${BACKEND_ENABLE} \ --enable-hdb=${BACKEND_ENABLE} PLIST_SUB+= BACK_BDB=${BACKEND_PLIST} \ BACK_HDB=${BACKEND_PLIST} CPPFLAGS+= -I${BDB_INCLUDE_DIR} LDFLAGS+= -L${BDB_LIB_DIR} CONFIGURE_SED+= -e 's,ol_DB_LIB=$$,&-l${BDB_LIB_NAME:R},' \ -e 's,(ol_cv_lib_db=)yes$$,\1-l${BDB_LIB_NAME:R},' .endif .if ${PORT_OPTIONS:MDNSSRV} CONFIGURE_ARGS+= --enable-dnssrv=${BACKEND_ENABLE} PLIST_SUB+= BACK_DNSSRV=${BACKEND_PLIST} .else PLIST_SUB+= BACK_DNSSRV="@comment " .endif .if ${PORT_OPTIONS:MMDB} CONFIGURE_ARGS+= --enable-mdb=${BACKEND_ENABLE} PLIST_SUB+= BACK_MDB=${BACKEND_PLIST} .else PLIST_SUB+= BACK_MDB="@comment " .endif .if ${PORT_OPTIONS:MPASSWD} CONFIGURE_ARGS+= --enable-passwd=${BACKEND_ENABLE} PLIST_SUB+= BACK_PASSWD=${BACKEND_PLIST} .else PLIST_SUB+= BACK_PASSWD="@comment " .endif .if ${PORT_OPTIONS:MRELAY} CONFIGURE_ARGS+= --enable-relay=${BACKEND_ENABLE} PLIST_SUB+= BACK_RELAY=${BACKEND_PLIST} .else PLIST_SUB+= BACK_RELAY="@comment " .endif .if ${PORT_OPTIONS:MSHELL} CONFIGURE_ARGS+= --without-threads --enable-shell=${BACKEND_ENABLE} PLIST_SUB+= BACK_SHELL=${BACKEND_PLIST} .else PLIST_SUB+= BACK_SHELL="@comment " WANT_OPENLDAP_THREADS= yes .endif .if ${PORT_OPTIONS:MSOCK} CONFIGURE_ARGS+= --enable-sock=${BACKEND_ENABLE} PLIST_SUB+= BACK_SOCK=${BACKEND_PLIST} .else PLIST_SUB+= BACK_SOCK="@comment " .endif .if ${PORT_OPTIONS:MPERL} USES+= perl5 CONFIGURE_ARGS+= --enable-perl=${BACKEND_ENABLE} CONFIGURE_ENV+= PERLBIN="${PERL}" PLIST_SUB+= BACK_PERL=${BACKEND_PLIST} .else PLIST_SUB+= BACK_PERL="@comment " .endif .if ${PORT_OPTIONS:MSASL} CONFIGURE_ARGS+= --enable-spasswd .endif .if ${PORT_OPTIONS:MODBC} CONFIGURE_ARGS+= --enable-sql=${BACKEND_ENABLE} PLIST_SUB+= BACK_SQL=${BACKEND_PLIST} LIB_DEPENDS+= libodbc.so:databases/unixODBC LDFLAGS+= -L${LOCALBASE}/lib .else PLIST_SUB+= BACK_SQL="@comment " .endif .if ${PORT_OPTIONS:MSMBPWD} PLIST_SUB+= SMBPWD="" .else PLIST_SUB+= SMBPWD="@comment " .endif .if ${PORT_OPTIONS:MSHA2} PLIST_SUB+= SHA2="" .else PLIST_SUB+= SHA2="@comment " .endif .if ${PORT_OPTIONS:MLASTBIND} PLIST_SUB+= LASTBIND="" .else PLIST_SUB+= LASTBIND="@comment " .endif .if ${PORT_OPTIONS:MRLOOKUPS} CONFIGURE_ARGS+= --enable-rlookups PLIST_SUB+= RLOOKUPS="" .else PLIST_SUB+= RLOOKUPS="@comment " .endif .if ${PORT_OPTIONS:MSLAPI} CONFIGURE_ARGS+= --enable-slapi PLIST_SUB+= SLAPI="" USE_LDCONFIG= yes .else PLIST_SUB+= SLAPI="@comment " .endif .if ${PORT_OPTIONS:MSLP} CONFIGURE_ARGS+= --enable-slp LIB_DEPENDS+= libslp.so:net/openslp .endif # Include tcp-wrapper support .if ${PORT_OPTIONS:MTCP_WRAPPERS} CONFIGURE_ARGS+= --enable-wrappers .endif # Force using caseIgnoreOrderingMatch on 'name' attribute. # This may be a violation of RFC 4519 2.18 definition. # See http://www.openldap.org/lists/openldap-technical/201211/msg00175.html .if ${PORT_OPTIONS:MOUTLOOK} EXTRA_PATCHES+= ${FILESDIR}/extrapatch-outlook-servers__slapd__schema_prep.c +.endif + +.if ${PORT_OPTIONS:MKQUEUE} +EXTRA_PATCHES+= ${FILESDIR}/extrapatch-ITS6300 +USE_AUTOTOOLS= autoconf .endif # end of client/server specific configuration .endif .if defined(WITH_CLDAP) CPPFLAGS+= -DLDAP_CONNECTIONLESS .endif CPPFLAGS+= -I${LOCALBASE}/include LIBS+= -L${LOCALBASE}/lib .if defined(CLIENT_ONLY) .else SUB_LIST+= RC_DIR=${PREFIX} \ LDAP_RUN_DIR=${LDAP_RUN_DIR} \ DATABASEDIR=${DATABASEDIR} .endif PLIST_SUB+= ${SUB_LIST} PLIST_SUB+= SHLIB_MAJOR=${OPENLDAP_SHLIB_MAJOR} PLIST_SUB+= SHLIB_MINOR=${OPENLDAP_SHLIB_MINOR} PLIST_SUB+= OPENLDAP_MAJOR=${OPENLDAP_MAJOR} .include .if ${SSL_DEFAULT:Mopenssl-devel} BROKEN= Does not build with openssl-devel .endif .if !${PORT_OPTIONS:MFETCH} CONFIGURE_ARGS+= --without-fetch .else . if defined(OPENSSL_INSTALLED) && ${OPENSSL_INSTALLED} != "" || ${SSL_DEFAULT} != base BROKEN= using OpenSSL from ports and OPTION FETCH together is not supported . endif .endif post-patch: @${REINPLACE_CMD} -e 's|%LOCALSTATEDIR%/run/|${LDAP_RUN_DIR}/|g' \ ${SED_MODULES} ${WRKSRC}/servers/slapd/slapd.conf @${REINPLACE_CMD} -e 's|^OPT =.*|OPT = ${CFLAGS}|g' \ -e 's|^CC =.*|CC = ${CC}|g' \ ${SED_MODULES} ${WRKSRC}/contrib/slapd-modules/*/Makefile \ ${WRKSRC}/contrib/slapd-modules/*/*/Makefile .if defined(CONFIGURE_SED) @${REINPLACE_CMD} -E ${CONFIGURE_SED} \ ${CONFIGURE_WRKSRC}/${CONFIGURE_SCRIPT} .endif pre-configure: @if [ -n "`${PKG_INFO} -xI '^bind\(84\)\{0,1\}-base-8\.' 2>/dev/null`" ]; then \ ${ECHO_CMD} "${PKGNAME}: bind installed with PORT_REPLACES_BASE_BIND causes build problems."; \ ${FALSE}; \ fi .if !defined(CLIENT_ONLY) test: build @(cd ${BUILD_WRKSRC} && ${SETENV} ${MAKE_ENV} \ ${MAKE_CMD} ${MAKE_FLAGS} ${MAKEFILE} ${MAKE_ARGS} test) post-build: @${DO_NADA} .if ${PORT_OPTIONS:MSMBPWD} @(cd ${BUILD_WRKSRC}/contrib/slapd-modules/smbk5pwd && \ ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_FLAGS} ${MAKEFILE} \ ${MAKE_ARGS} DEFS="-DDO_SAMBA" prefix="${PREFIX}" all) .endif .if ${PORT_OPTIONS:MSHA2} @(cd ${BUILD_WRKSRC}/contrib/slapd-modules/passwd/sha2 && \ ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_FLAGS} ${MAKEFILE} \ ${MAKE_ARGS} prefix="${PREFIX}" all) .endif .if ${PORT_OPTIONS:MLASTBIND} @(cd ${BUILD_WRKSRC}/contrib/slapd-modules/lastbind && \ ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_FLAGS} ${MAKEFILE} \ ${MAKE_ARGS} prefix="${PREFIX}" all) .endif .endif pre-install: .if !defined(CLIENT_ONLY) ${MKDIR} ${STAGEDIR}${DATABASEDIR} .endif post-install: .if defined(CLIENT_ONLY) ${MKDIR} ${STAGEDIR}${DOCSDIR} ${INSTALL_DATA} ${WRKSRC}/CHANGES ${STAGEDIR}${DOCSDIR} for dir in drafts rfc; do \ ${MKDIR} ${STAGEDIR}${DOCSDIR}/$${dir}; \ ${INSTALL_DATA} ${WRKSRC}/doc/$${dir}/* ${STAGEDIR}${DOCSDIR}/$${dir}; \ done for prog in ldapcompare ldapdelete ldapexop ldapmodify ldapmodrdn ldappasswd ldapsearch ldapurl ldapwhoami; do\ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/$${prog}; \ done for library in lber ldap ldap_r; do \ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/lib$${library}-${OPENLDAP_MAJOR}.so.${OPENLDAP_SHLIB_MAJOR}; \ done .else ${MKDIR} ${STAGEDIR}${LDAP_RUN_DIR} .if ${PORT_OPTIONS:MSMBPWD} (cd ${WRKSRC}/contrib/slapd-modules/smbk5pwd && \ ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_FLAGS} ${MAKEFILE} \ ${MAKE_ARGS} prefix="${PREFIX}" install) ${RM} ${STAGEDIR}${PREFIX}/libexec/openldap/smbk5pwd.a .endif .if ${PORT_OPTIONS:MSHA2} (cd ${WRKSRC}/contrib/slapd-modules/passwd/sha2 && \ ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_FLAGS} ${MAKEFILE} \ ${MAKE_ARGS} prefix="${PREFIX}" install) ${RM} ${STAGEDIR}${PREFIX}/libexec/openldap/pw-sha2.a .endif .if ${PORT_OPTIONS:MLASTBIND} (cd ${WRKSRC}/contrib/slapd-modules/lastbind && \ ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_FLAGS} ${MAKEFILE} \ ${MAKE_ARGS} prefix="${PREFIX}" install) ${RM} ${STAGEDIR}${PREFIX}/libexec/openldap/lastbind.a .endif .if ${PORT_OPTIONS:MDYNAMIC_BACKENDS} || ${PORT_OPTIONS:MSMBPWD} || ${PORT_OPTIONS:MSHA2} ${STRIP_CMD} ${STAGEDIR}${PREFIX}/libexec/openldap/*.so .endif .if ${PORT_OPTIONS:MDYNAMIC_BACKENDS} || ${PORT_OPTIONS:MSLAPI} ${MKDIR} ${STAGEDIR}${PREFIX}/libexec/openldap .endif .endif # defined(CLIENT_ONLY) .include Index: head/net/openldap24-server/files/extrapatch-ITS6300 =================================================================== --- head/net/openldap24-server/files/extrapatch-ITS6300 (nonexistent) +++ head/net/openldap24-server/files/extrapatch-ITS6300 (revision 451425) @@ -0,0 +1,406 @@ +--- configure.in.orig 2017-06-01 20:01:07 UTC ++++ configure.in +@@ -978,6 +978,18 @@ if test "${ac_cv_header_sys_epoll_h}" = yes; then + fi + + dnl ---------------------------------------------------------------- ++AC_CHECK_HEADERS( sys/event.h ) ++if test "${ac_cv_header_sys_event_h}" = yes; then ++AC_MSG_CHECKING(for kqueue system call) ++AC_RUN_IFELSE([AC_LANG_SOURCE([[int main(int argc, char **argv) ++{ ++ int kqfd = kqueue(); ++ exit (kqfd == -1 ? 1 : 0); ++}]])],[AC_MSG_RESULT(yes) ++AC_DEFINE(HAVE_KQUEUE,1, [define if your system supports kqueue])],[AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)]) ++fi ++ ++dnl ---------------------------------------------------------------- + AC_CHECK_HEADERS( sys/devpoll.h ) + dnl "/dev/poll" needs as well... + if test "${ac_cv_header_sys_devpoll_h}" = yes \ +--- include/portable.hin.orig 2017-06-01 20:01:07 UTC ++++ include/portable.hin +@@ -280,6 +280,9 @@ + /* Define to 1 if you have the header file. */ + #undef HAVE_IO_H + ++/* define if your system supports kqueue */ ++#undef HAVE_KQUEUE ++ + /* Define to 1 if you have the `gen' library (-lgen). */ + #undef HAVE_LIBGEN + +@@ -664,6 +667,9 @@ + + /* Define to 1 if you have the header file. */ + #undef HAVE_SYS_ERRNO_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_SYS_EVENT_H + + /* Define to 1 if you have the header file. */ + #undef HAVE_SYS_FILE_H +--- servers/slapd/daemon.c.orig 2017-06-01 20:01:07 UTC ++++ servers/slapd/daemon.c +@@ -41,14 +41,18 @@ + + #include "ldap_rq.h" + +-#if defined(HAVE_SYS_EPOLL_H) && defined(HAVE_EPOLL) ++#ifdef HAVE_KQUEUE ++# include ++# include ++# include ++#elif defined(HAVE_SYS_EPOLL_H) && defined(HAVE_EPOLL) + # include + #elif defined(SLAP_X_DEVPOLL) && defined(HAVE_SYS_DEVPOLL_H) && defined(HAVE_DEVPOLL) + # include + # include + # include + # include +-#endif /* ! epoll && ! /dev/poll */ ++#endif /* ! kqueue && ! epoll && ! /dev/poll */ + + #ifdef HAVE_TCPD + int allow_severity = LOG_INFO; +@@ -89,7 +93,7 @@ static volatile sig_atomic_t listening = 1; /* 0 when + static ldap_pvt_thread_t *listener_tid; + + #ifndef SLAPD_LISTEN_BACKLOG +-#define SLAPD_LISTEN_BACKLOG 1024 ++#define SLAPD_LISTEN_BACKLOG 2048 + #endif /* ! SLAPD_LISTEN_BACKLOG */ + + #define DAEMON_ID(fd) (fd & slapd_daemon_mask) +@@ -138,7 +142,21 @@ typedef struct slap_daemon_st { + int sd_nwriters; + int sd_nfds; + +-#if defined(HAVE_EPOLL) ++#if defined(HAVE_KQUEUE) ++ uint8_t* sd_fdmodes; /* indexed by fd */ ++ Listener** sd_l; /* indexed by fd */ ++ /* Double buffer the kqueue changes to avoid holding the sd_mutex \ ++ * during a kevent() call. \ ++ */ ++ struct kq_change { ++ struct kevent* sd_changes; ++ int sd_nchanges; ++ int sd_maxchanges; ++ } sd_kqc[2]; ++ int sd_changeidx; /* index to current change buffer */ ++ int sd_kq; ++#elif defined(HAVE_EPOLL) ++ + struct epoll_event *sd_epolls; + int *sd_index; + int sd_epfd; +@@ -148,7 +166,7 @@ typedef struct slap_daemon_st { + int *sd_index; + Listener **sd_l; + int sd_dpfd; +-#else /* ! epoll && ! /dev/poll */ ++#else /* ! kqueue && ! epoll && ! /dev/poll */ + #ifdef HAVE_WINSOCK + char *sd_flags; + char *sd_rflags; +@@ -157,7 +175,7 @@ typedef struct slap_daemon_st { + fd_set sd_readers; + fd_set sd_writers; + #endif /* ! HAVE_WINSOCK */ +-#endif /* ! epoll && ! /dev/poll */ ++#endif /* ! kqueue && ! epoll && ! /dev/poll */ + } slap_daemon_st; + + static slap_daemon_st slap_daemon[SLAPD_MAX_DAEMON_THREADS]; +@@ -169,11 +187,220 @@ static slap_daemon_st slap_daemon[SLAPD_MAX_DAEMON_THR + * with file descriptors and events respectively + * + * - SLAP__* for private interface; type by now is one of +- * EPOLL, DEVPOLL, SELECT ++ * EPOLL, DEVPOLL, SELECT, KQUEUE + * + * private interface should not be used in the code. + */ +-#if defined(HAVE_EPOLL) ++#ifdef HAVE_KQUEUE ++# define SLAP_EVENT_FNAME "kqueue" ++# define SLAP_EVENTS_ARE_INDEXED 0 ++# define SLAP_EVENT_MAX(t) (2 * dtblsize) /* each fd can have a read & a write event */ ++ ++# define SLAP_EVENT_DECL \ ++ static struct kevent* events = NULL ++ ++# define SLAP_EVENT_INIT(t) do {\ ++ if (!events) { \ ++ events = ch_malloc(sizeof(*events) * SLAP_EVENT_MAX(t)); \ ++ if (!events) { \ ++ Debug(LDAP_DEBUG_ANY, \ ++ "daemon: SLAP_EVENT_INIT: ch_malloc of events failed, wanted %d bytes\n", \ ++ sizeof(*events) * SLAP_EVENT_MAX(t), 0, 0); \ ++ slapd_shutdown = 2; \ ++ } \ ++ } \ ++} while (0) ++ ++# define SLAP_SOCK_INIT(t) do { \ ++ int kq_i; \ ++ size_t kq_nbytes; \ ++ Debug(LDAP_DEBUG_ANY, "daemon: SLAP_SOCK_INIT: dtblsize=%d\n", dtblsize, 0, 0); \ ++ slap_daemon[t].sd_nfds = 0; \ ++ slap_daemon[t].sd_changeidx = 0; \ ++ for (kq_i = 0; kq_i < 2; kq_i++) { \ ++ struct kq_change* kqc = &slap_daemon[t].sd_kqc[kq_i]; \ ++ kqc->sd_nchanges = 0; \ ++ kqc->sd_maxchanges = 256; /* will grow as needed */ \ ++ kq_nbytes = sizeof(*kqc->sd_changes) * kqc->sd_maxchanges; \ ++ kqc->sd_changes = ch_calloc(1, kq_nbytes); \ ++ if (!kqc->sd_changes) { \ ++ Debug(LDAP_DEBUG_ANY, \ ++ "daemon: SLAP_SOCK_INIT: ch_calloc of slap_daemon.sd_changes[%d] failed, wanted %d bytes, shutting down\n", \ ++ kq_i, kq_nbytes, 0); \ ++ slapd_shutdown = 2; \ ++ } \ ++ } \ ++ kq_nbytes = sizeof(*slap_daemon[t].sd_fdmodes) * dtblsize; \ ++ slap_daemon[t].sd_fdmodes = ch_calloc(1, kq_nbytes); \ ++ if (!slap_daemon[t].sd_fdmodes) { \ ++ Debug(LDAP_DEBUG_ANY, \ ++ "daemon: SLAP_SOCK_INIT: ch_calloc of slap_daemon.sd_fdmodes failed, wanted %d bytes, shutting down\n", \ ++ kq_nbytes, 0, 0); \ ++ slapd_shutdown = 2; \ ++ } \ ++ kq_nbytes = sizeof(*slap_daemon[t].sd_l) * dtblsize; \ ++ slap_daemon[t].sd_l = ch_calloc(1, kq_nbytes); \ ++ if (!slap_daemon[t].sd_l) { \ ++ Debug(LDAP_DEBUG_ANY, \ ++ "daemon: SLAP_SOCK_INIT: ch_calloc of slap_daemon.sd_l failed, wanted %d bytes, shutting down\n", \ ++ kq_nbytes, 0, 0); \ ++ slapd_shutdown = 2; \ ++ } \ ++ slap_daemon[t].sd_kq = kqueue(); \ ++ if (slap_daemon[t].sd_kq < 0) { \ ++ Debug(LDAP_DEBUG_ANY, "daemon: SLAP_SOCK_INIT: kqueue() failed, errno=%d, shutting down\n", errno, 0, 0); \ ++ slapd_shutdown = 2; \ ++ } \ ++} while (0) ++ ++# define SLAP_SOCK_DESTROY(t) do { \ ++ int kq_i; \ ++ if (slap_daemon[t].sd_kq > 0) { \ ++ close(slap_daemon[t].sd_kq); \ ++ slap_daemon[t].sd_kq = -1; \ ++ } \ ++ for (kq_i = 0; kq_i < 2; kq_i++) { \ ++ if (slap_daemon[t].sd_kqc[kq_i].sd_changes != NULL) { \ ++ ch_free(slap_daemon[t].sd_kqc[kq_i].sd_changes); \ ++ slap_daemon[t].sd_kqc[kq_i].sd_changes = NULL; \ ++ } \ ++ slap_daemon[t].sd_kqc[kq_i].sd_nchanges = 0; \ ++ slap_daemon[t].sd_kqc[kq_i].sd_maxchanges = 0; \ ++ } \ ++ if (slap_daemon[t].sd_l != NULL) { \ ++ ch_free(slap_daemon[t].sd_l); \ ++ slap_daemon[t].sd_l = NULL; \ ++ } \ ++ if (slap_daemon[t].sd_fdmodes != NULL) { \ ++ ch_free(slap_daemon[t].sd_fdmodes); \ ++ slap_daemon[t].sd_fdmodes = NULL; \ ++ } \ ++ slap_daemon[t].sd_nfds = 0; \ ++} while (0) ++ ++# define SLAP_KQUEUE_SOCK_ACTIVE 0x01 ++# define SLAP_KQUEUE_SOCK_READ_ENABLED 0x02 ++# define SLAP_KQUEUE_SOCK_WRITE_ENABLED 0x04 ++ ++# define SLAP_SOCK_IS_ACTIVE(t,s) (slap_daemon[t].sd_fdmodes[(s)] != 0) ++# define SLAP_SOCK_NOT_ACTIVE(t,s) (slap_daemon[t].sd_fdmodes[(s)] == 0) ++# define SLAP_SOCK_IS_READ(t,s) (slap_daemon[t].sd_fdmodes[(s)] & SLAP_KQUEUE_SOCK_READ_ENABLED) ++# define SLAP_SOCK_IS_WRITE(t,s) (slap_daemon[t].sd_fdmodes[(s)] & SLAP_KQUEUE_SOCK_WRITE_ENABLED) ++ ++/* ++ * SLAP_SOCK_SET_* & SLAP_SOCK_CLR_* get called a _lot_. Since kevent() ++ * processes changes before it looks for events, batch up the changes which ++ * will get submitted the next time kevent() is called for events. ++ */ ++ ++# define SLAP_KQUEUE_CHANGE(t, s, filter, flag) do { \ ++ /* If maxchanges is reached, have to realloc to make room for more. \ ++ * Ideally we'd call kevent(), but the daemon thread could be sitting \ ++ * in kevent() waiting for events. \ ++ */ \ ++ struct kq_change* kqc = &slap_daemon[t].sd_kqc[slap_daemon[t].sd_changeidx]; \ ++ if (kqc->sd_nchanges == kqc->sd_maxchanges) { \ ++ /* Don't want to do this very often. Double the size. */ \ ++ size_t kq_nbytes; \ ++ Debug(LDAP_DEBUG_CONNS, \ ++ "daemon: SLAP_KQUEUE_CHANGE: increasing slap_daemon.sd_kqc[%d].maxchanges from %d to %d\n", \ ++ slap_daemon[t].sd_changeidx, kqc->sd_maxchanges, 2*kqc->sd_maxchanges); \ ++ kqc->sd_maxchanges += kqc->sd_maxchanges; \ ++ kq_nbytes = sizeof(*kqc->sd_changes) * kqc->sd_maxchanges; \ ++ kqc->sd_changes = ch_realloc(kqc->sd_changes, kq_nbytes); \ ++ if (!kqc->sd_changes) { \ ++ Debug(LDAP_DEBUG_ANY, \ ++ "daemon: SLAP_KQUEUE_CHANGE: ch_realloc of slap_daemon.sd_kqc[%d].sd_changes failed, wanted %d bytes, shutting down\n", \ ++ slap_daemon[t].sd_changeidx, kq_nbytes, 0); \ ++ slapd_shutdown = 2; \ ++ break; /* Don't want to do the EV_SET if sd_changes is NULL */ \ ++ } \ ++ } \ ++ EV_SET(&kqc->sd_changes[kqc->sd_nchanges++], \ ++ (s), (filter), (flag), 0, 0, slap_daemon[t].sd_l[(s)]); \ ++} while (0) ++ ++# define SLAP_KQUEUE_SOCK_SET(t, s, filter, mode) do { \ ++ if ((slap_daemon[t].sd_fdmodes[(s)] & (mode)) != (mode)) { \ ++ slap_daemon[t].sd_fdmodes[(s)] |= (mode); \ ++ SLAP_KQUEUE_CHANGE(t, (s), (filter), EV_ENABLE); \ ++ } \ ++} while (0) ++ ++# define SLAP_KQUEUE_SOCK_CLR(t, s, filter, mode) do { \ ++ if (slap_daemon[t].sd_fdmodes[(s)] & (mode)) { \ ++ slap_daemon[t].sd_fdmodes[(s)] &= ~(mode); \ ++ SLAP_KQUEUE_CHANGE(t, (s), (filter), EV_DISABLE); \ ++ } \ ++} while (0) ++ ++# define SLAP_SOCK_SET_READ(t, s) SLAP_KQUEUE_SOCK_SET(t, (s), EVFILT_READ, SLAP_KQUEUE_SOCK_READ_ENABLED) ++# define SLAP_SOCK_SET_WRITE(t, s) SLAP_KQUEUE_SOCK_SET(t, (s), EVFILT_WRITE, SLAP_KQUEUE_SOCK_WRITE_ENABLED) ++# define SLAP_SOCK_CLR_READ(t, s) SLAP_KQUEUE_SOCK_CLR(t, (s), EVFILT_READ, SLAP_KQUEUE_SOCK_READ_ENABLED) ++# define SLAP_SOCK_CLR_WRITE(t, s) SLAP_KQUEUE_SOCK_CLR(t, (s), EVFILT_WRITE, SLAP_KQUEUE_SOCK_WRITE_ENABLED) ++ ++/* kqueue doesn't need to do anything to clear the event. */ ++# define SLAP_EVENT_CLR_READ(i) do {} while (0) ++# define SLAP_EVENT_CLR_WRITE(i) do {} while (0) ++ ++# define SLAP_SOCK_ADD(t, s, l) do { \ ++ assert( s < dtblsize ); \ ++ slap_daemon[t].sd_l[(s)] = (l); \ ++ slap_daemon[t].sd_fdmodes[(s)] = SLAP_KQUEUE_SOCK_ACTIVE | SLAP_KQUEUE_SOCK_READ_ENABLED; \ ++ ++slap_daemon[t].sd_nfds; \ ++ SLAP_KQUEUE_CHANGE(t, (s), EVFILT_READ, EV_ADD); \ ++ SLAP_KQUEUE_CHANGE(t, (s), EVFILT_WRITE, EV_ADD | EV_DISABLE); \ ++} while (0) ++ ++# define SLAP_SOCK_DEL(t, s) do { \ ++ SLAP_KQUEUE_CHANGE(t, (s), EVFILT_READ, EV_DELETE); \ ++ SLAP_KQUEUE_CHANGE(t, (s), EVFILT_WRITE, EV_DELETE); \ ++ slap_daemon[t].sd_l[(s)] = NULL; \ ++ slap_daemon[t].sd_fdmodes[(s)] = 0; \ ++ --slap_daemon[t].sd_nfds; \ ++} while (0) ++ ++# define SLAP_EVENT_FD(t, i) (events[(i)].ident) ++ ++# define SLAP_EVENT_IS_READ(t, i) \ ++ (events[(i)].filter == EVFILT_READ && SLAP_SOCK_IS_READ(t, SLAP_EVENT_FD(0, i))) ++ ++# define SLAP_EVENT_IS_WRITE(t, i) \ ++ (events[(i)].filter == EVFILT_WRITE && SLAP_SOCK_IS_WRITE(t, SLAP_EVENT_FD(0, i))) ++ ++# define SLAP_EVENT_IS_LISTENER(t, i) \ ++ (events[(i)].udata && SLAP_SOCK_IS_READ(t, SLAP_EVENT_FD(t, i))) ++ ++# define SLAP_EVENT_LISTENER(t, i) ((Listener*)(events[(i)].udata)) ++ ++# define SLAP_EVENT_WAIT(t, tvp, nsp) do { \ ++ struct timespec kq_ts; \ ++ struct timespec* kq_tsp; \ ++ int kq_idx; \ ++ if (tvp) { \ ++ TIMEVAL_TO_TIMESPEC((tvp), &kq_ts); \ ++ kq_tsp = &kq_ts; \ ++ } else { \ ++ kq_tsp = NULL; \ ++ } \ ++ /* Save the change buffer index for use when the mutex is unlocked, \ ++ * then switch the index so new changes go to the other buffer. \ ++ */ \ ++ ldap_pvt_thread_mutex_lock( &slap_daemon[t].sd_mutex ); \ ++ kq_idx = slap_daemon[t].sd_changeidx; \ ++ slap_daemon[t].sd_changeidx ^= 1; \ ++ ldap_pvt_thread_mutex_unlock( &slap_daemon[t].sd_mutex ); \ ++ *(nsp) = kevent(slap_daemon[t].sd_kq, \ ++ slap_daemon[t].sd_kqc[kq_idx].sd_nchanges \ ++ ? slap_daemon[t].sd_kqc[kq_idx].sd_changes : NULL, \ ++ slap_daemon[t].sd_kqc[kq_idx].sd_nchanges, \ ++ events, SLAP_EVENT_MAX(t), kq_tsp); \ ++ slap_daemon[t].sd_kqc[kq_idx].sd_nchanges = 0; \ ++} while(0) ++ ++/*-------------------------------------------------------------------------------*/ ++ ++#elif defined(HAVE_EPOLL) + /*************************************** + * Use epoll infrastructure - epoll(4) * + ***************************************/ +@@ -486,7 +713,7 @@ static slap_daemon_st slap_daemon[SLAPD_MAX_DAEMON_THR + *(nsp) = ioctl( slap_daemon[t].sd_dpfd, DP_POLL, &sd_dvpoll ); \ + } while (0) + +-#else /* ! epoll && ! /dev/poll */ ++#else /* ! kqueue && ! epoll && ! /dev/poll */ + # ifdef HAVE_WINSOCK + # define SLAP_EVENT_FNAME "WSselect" + /* Winsock provides a "select" function but its fd_sets are +@@ -674,7 +901,7 @@ static slap_daemon_st slap_daemon[SLAPD_MAX_DAEMON_THR + nwriters > 0 ? &writefds : NULL, NULL, (tvp) ); \ + } while (0) + # endif /* !HAVE_WINSOCK */ +-#endif /* ! epoll && ! /dev/poll */ ++#endif /* ! kqueue && ! epoll && ! /dev/poll */ + + #ifdef HAVE_SLP + /* +@@ -2733,8 +2960,13 @@ loop: + /* Don't log internal wake events */ + if ( fd == wake_sds[tid][0] ) continue; + ++#ifdef HAVE_KQUEUE ++ r = SLAP_EVENT_IS_READ( tid, i ); ++ w = SLAP_EVENT_IS_WRITE( tid, i ); ++#else + r = SLAP_EVENT_IS_READ( i ); + w = SLAP_EVENT_IS_WRITE( i ); ++#endif /* HAVE_KQUEUE */ + if ( r || w ) { + Debug( LDAP_DEBUG_CONNS, " %d%s%s", fd, + r ? "r" : "", w ? "w" : "" ); +@@ -2765,7 +2997,11 @@ loop: + continue; + } + ++#ifdef HAVE_KQUEUE ++ if ( SLAP_EVENT_IS_WRITE( tid, i ) ) { ++#else + if ( SLAP_EVENT_IS_WRITE( i ) ) { ++#endif /* HAVE_KQUEUE */ + Debug( LDAP_DEBUG_CONNS, + "daemon: write active on %d\n", + fd, 0, 0 ); +@@ -2784,7 +3020,11 @@ loop: + } + } + /* If event is a read */ ++#ifdef HAVE_KQUEUE ++ if ( SLAP_EVENT_IS_READ( tid, i )) { ++#else + if ( SLAP_EVENT_IS_READ( i )) { ++#endif /* HAVE_KQUEUE */ + r = 1; + Debug( LDAP_DEBUG_CONNS, + "daemon: read active on %d\n", +@@ -2841,6 +3081,10 @@ loop: + slapd_abrupt_shutdown = 1; + connections_shutdown(); + } ++ ++#ifdef HAVE_KQUEUE ++ close( slap_daemon[tid].sd_kq ); ++#endif + + if ( LogTest( LDAP_DEBUG_ANY )) { + int t = ldap_pvt_thread_pool_backload( &connection_pool ); Property changes on: head/net/openldap24-server/files/extrapatch-ITS6300 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property