libraries/libldap/init.c     |    8 ++-
 libraries/libldap/ldap-int.h |  198 ++++++++++++++++++++++--------------------
 2 files changed, 110 insertions(+), 96 deletions(-)

diff --git a/libraries/libldap/init.c b/libraries/libldap/init.c
index 39292d2..9d37e64 100644
--- a/libraries/libldap/init.c
+++ b/libraries/libldap/init.c
@@ -36,7 +36,13 @@
 #include "lutil.h"
 
 struct ldapoptions ldap_int_global_options =
-	{ LDAP_UNINITIALIZED, LDAP_DEBUG_NONE LDAP_LDO_MUTEX_NULLARG };  
+	{ LDAP_UNINITIALIZED, LDAP_DEBUG_NONE
+		LDAP_LDO_NULLARG
+		LDAP_LDO_CONNECTIONLESS_NULLARG
+		LDAP_LDO_TLS_NULLARG
+		LDAP_LDO_SASL_NULLARG
+		LDAP_LDO_GSSAPI_NULLARG
+		LDAP_LDO_MUTEX_NULLARG };
 
 #define ATTR_NONE	0
 #define ATTR_BOOL	1
diff --git a/libraries/libldap/ldap-int.h b/libraries/libldap/ldap-int.h
index f8e6126..ac6c9e5 100644
--- a/libraries/libldap/ldap-int.h
+++ b/libraries/libldap/ldap-int.h
@@ -185,29 +185,59 @@ struct ldapoptions {
 #define LDAP_TRASHED_SESSION	0xFF
 	int   ldo_debug;
 
-#ifdef LDAP_R_COMPILE
-	ldap_pvt_thread_mutex_t	ldo_mutex;
-#define LDAP_LDO_MUTEX_NULLARG	, LDAP_PVT_MUTEX_NULL
-#else
-#define LDAP_LDO_MUTEX_NULLARG
-#endif
+	ber_int_t		ldo_version;
+	ber_int_t		ldo_deref;
+	ber_int_t		ldo_timelimit;
+	ber_int_t		ldo_sizelimit;
+
+	/* per API call timeout */
+	struct timeval		ldo_tm_api;
+	struct timeval		ldo_tm_net;
+
+	LDAPURLDesc *ldo_defludp;
+	int		ldo_defport;
+	char*	ldo_defbase;
+	char*	ldo_defbinddn;	/* bind dn */
+
+	/*
+	 * Per connection tcp-keepalive settings (Linux only,
+	 * ignored where unsupported)
+	 */
+	ber_int_t ldo_keepalive_idle;
+	ber_int_t ldo_keepalive_probes;
+	ber_int_t ldo_keepalive_interval;
+
+	int		ldo_refhoplimit;	/* limit on referral nesting */
+
+	/* LDAPv3 server and client controls */
+	LDAPControl	**ldo_sctrls;
+	LDAPControl **ldo_cctrls;
+
+	/* LDAP rebind callback function */
+	LDAP_REBIND_PROC *ldo_rebind_proc;
+	void *ldo_rebind_params;
+	LDAP_NEXTREF_PROC *ldo_nextref_proc;
+	void *ldo_nextref_params;
+	LDAP_URLLIST_PROC *ldo_urllist_proc;
+	void *ldo_urllist_params;
+
+	/* LDAP connection callback stack */
+	ldaplist *ldo_conn_cbs;
+
+	LDAP_BOOLEANS ldo_booleans;	/* boolean options */
+
+#define LDAP_LDO_NULLARG	,0,0,0,0 ,{0},{0} ,0,0,0,0, 0,0,0,0, 0,0, 0,0,0,0,0,0, 0, 0
 
 #ifdef LDAP_CONNECTIONLESS
 #define	LDAP_IS_UDP(ld)		((ld)->ld_options.ldo_is_udp)
 	void*			ldo_peer;	/* struct sockaddr* */
 	char*			ldo_cldapdn;
 	int			ldo_is_udp;
+#define	LDAP_LDO_CONNECTIONLESS_NULLARG	,0,0,0
+#else
+#define	LDAP_LDO_CONNECTIONLESS_NULLARG
 #endif
 
-	/* per API call timeout */
-	struct timeval		ldo_tm_api;
-	struct timeval		ldo_tm_net;
-
-	ber_int_t		ldo_version;
-	ber_int_t		ldo_deref;
-	ber_int_t		ldo_timelimit;
-	ber_int_t		ldo_sizelimit;
-
 #ifdef HAVE_TLS
    	/* tls context */
    	void		*ldo_tls_ctx;
@@ -226,16 +256,12 @@ struct ldapoptions {
    	int			ldo_tls_mode;
    	int			ldo_tls_require_cert;
 	int			ldo_tls_impl;
-#ifdef HAVE_OPENSSL_CRL
    	int			ldo_tls_crlcheck;
-#endif
+#define LDAP_LDO_TLS_NULLARG ,0,0,0,{0,0,0,0,0,0,0,0,0},0,0,0,0
+#else
+#define LDAP_LDO_TLS_NULLARG
 #endif
 
-	LDAPURLDesc *ldo_defludp;
-	int		ldo_defport;
-	char*	ldo_defbase;
-	char*	ldo_defbinddn;	/* bind dn */
-
 #ifdef HAVE_CYRUS_SASL
 	char*	ldo_def_sasl_mech;		/* SASL Mechanism(s) */
 	char*	ldo_def_sasl_realm;		/* SASL realm */
@@ -244,6 +270,9 @@ struct ldapoptions {
 
 	/* SASL Security Properties */
 	struct sasl_security_properties	ldo_sasl_secprops;
+#define LDAP_LDO_SASL_NULLARG ,0,0,0,0,{0}
+#else
+#define LDAP_LDO_SASL_NULLARG
 #endif
 
 #ifdef HAVE_GSSAPI
@@ -253,34 +282,17 @@ struct ldapoptions {
 #define LDAP_GSSAPI_OPT_DO_NOT_FREE_GSS_CONTEXT	0x0001
 #define LDAP_GSSAPI_OPT_ALLOW_REMOTE_PRINCIPAL	0x0002
 	unsigned ldo_gssapi_options;
+#define LDAP_LDO_GSSAPI_NULLARG ,0,0
+#else
+#define LDAP_LDO_GSSAPI_NULLARG
 #endif
 
-	/*
-	 * Per connection tcp-keepalive settings (Linux only,
-	 * ignored where unsupported)
-	 */
-	ber_int_t ldo_keepalive_idle;
-	ber_int_t ldo_keepalive_probes;
-	ber_int_t ldo_keepalive_interval;
-
-	int		ldo_refhoplimit;	/* limit on referral nesting */
-
-	/* LDAPv3 server and client controls */
-	LDAPControl	**ldo_sctrls;
-	LDAPControl **ldo_cctrls;
-
-	/* LDAP rebind callback function */
-	LDAP_REBIND_PROC *ldo_rebind_proc;
-	void *ldo_rebind_params;
-	LDAP_NEXTREF_PROC *ldo_nextref_proc;
-	void *ldo_nextref_params;
-	LDAP_URLLIST_PROC *ldo_urllist_proc;
-	void *ldo_urllist_params;
-
-	/* LDAP connection callback stack */
-	ldaplist *ldo_conn_cbs;
-
-	LDAP_BOOLEANS ldo_booleans;	/* boolean options */
+#ifdef LDAP_R_COMPILE
+	ldap_pvt_thread_mutex_t	ldo_mutex;
+#define LDAP_LDO_MUTEX_NULLARG	, LDAP_PVT_MUTEX_NULL
+#else
+#define LDAP_LDO_MUTEX_NULLARG
+#endif
 };
 
 
@@ -375,6 +387,46 @@ struct ldap_common {
 	Sockbuf		*ldc_sb;	/* socket descriptor & buffer */
 #define ld_sb			ldc->ldc_sb
 
+	unsigned short	ldc_lberoptions;
+#define	ld_lberoptions		ldc->ldc_lberoptions
+
+	/* protected by msgid_mutex */
+	ber_len_t		ldc_msgid;
+#define	ld_msgid		ldc->ldc_msgid
+
+	/* do not mess with these */
+	/* protected by req_mutex */
+	LDAPRequest	*ldc_requests;	/* list of outstanding requests */
+	/* protected by res_mutex */
+	LDAPMessage	*ldc_responses;	/* list of outstanding responses */
+#define	ld_requests		ldc->ldc_requests
+#define	ld_responses		ldc->ldc_responses
+
+	/* protected by abandon_mutex */
+	ber_len_t	ldc_nabandoned;
+	ber_int_t	*ldc_abandoned;	/* array of abandoned requests */
+#define	ld_nabandoned		ldc->ldc_nabandoned
+#define	ld_abandoned		ldc->ldc_abandoned
+
+	/* unused by libldap */
+	LDAPCache	*ldc_cache;	/* non-null if cache is initialized */
+#define	ld_cache		ldc->ldc_cache
+
+	/* do not mess with the rest though */
+
+	/* protected by conn_mutex */
+	LDAPConn	*ldc_defconn;	/* default connection */
+#define	ld_defconn		ldc->ldc_defconn
+	LDAPConn	*ldc_conns;	/* list of server connections */
+#define	ld_conns		ldc->ldc_conns
+	void		*ldc_selectinfo;/* platform specifics for select */
+#define	ld_selectinfo		ldc->ldc_selectinfo
+
+	/* ldap_common refcnt - free only if 0 */
+	/* protected by ldc_mutex */
+	unsigned int		ldc_refcnt;
+#define	ld_ldcrefcnt		ldc->ldc_refcnt
+
 	/* protected by ldo_mutex */
 	struct ldapoptions ldc_options;
 #define ld_options		ldc->ldc_options
@@ -403,66 +455,22 @@ struct ldap_common {
 #define ld_urllist_params	ld_options.ldo_urllist_params
 
 #define ld_version		ld_options.ldo_version
-#ifdef LDAP_R_COMPILE
-#define	ld_ldopts_mutex		ld_options.ldo_mutex
-#endif
-
-	unsigned short	ldc_lberoptions;
-#define	ld_lberoptions		ldc->ldc_lberoptions
-
-	/* protected by msgid_mutex */
-	ber_len_t		ldc_msgid;
-#define	ld_msgid		ldc->ldc_msgid
-
-	/* do not mess with these */
-	/* protected by req_mutex */
-	LDAPRequest	*ldc_requests;	/* list of outstanding requests */
-	/* protected by res_mutex */
-	LDAPMessage	*ldc_responses;	/* list of outstanding responses */
-#define	ld_requests		ldc->ldc_requests
-#define	ld_responses		ldc->ldc_responses
 
 #ifdef LDAP_R_COMPILE
+	ldap_pvt_thread_mutex_t	ldc_mutex;
 	ldap_pvt_thread_mutex_t	ldc_msgid_mutex;
 	ldap_pvt_thread_mutex_t	ldc_conn_mutex;
 	ldap_pvt_thread_mutex_t	ldc_req_mutex;
 	ldap_pvt_thread_mutex_t	ldc_res_mutex;
 	ldap_pvt_thread_mutex_t	ldc_abandon_mutex;
+#define	ld_ldopts_mutex		ld_options.ldo_mutex
+#define	ld_ldcmutex		ldc->ldc_mutex
 #define	ld_msgid_mutex		ldc->ldc_msgid_mutex
 #define	ld_conn_mutex		ldc->ldc_conn_mutex
 #define	ld_req_mutex		ldc->ldc_req_mutex
 #define	ld_res_mutex		ldc->ldc_res_mutex
 #define	ld_abandon_mutex	ldc->ldc_abandon_mutex
 #endif
-
-	/* protected by abandon_mutex */
-	ber_len_t	ldc_nabandoned;
-	ber_int_t	*ldc_abandoned;	/* array of abandoned requests */
-#define	ld_nabandoned		ldc->ldc_nabandoned
-#define	ld_abandoned		ldc->ldc_abandoned
-
-	/* unused by libldap */
-	LDAPCache	*ldc_cache;	/* non-null if cache is initialized */
-#define	ld_cache		ldc->ldc_cache
-
-	/* do not mess with the rest though */
-
-	/* protected by conn_mutex */
-	LDAPConn	*ldc_defconn;	/* default connection */
-#define	ld_defconn		ldc->ldc_defconn
-	LDAPConn	*ldc_conns;	/* list of server connections */
-#define	ld_conns		ldc->ldc_conns
-	void		*ldc_selectinfo;/* platform specifics for select */
-#define	ld_selectinfo		ldc->ldc_selectinfo
-
-	/* ldap_common refcnt - free only if 0 */
-#ifdef LDAP_R_COMPILE
-	ldap_pvt_thread_mutex_t	ldc_mutex;
-#define	ld_ldcmutex		ldc->ldc_mutex
-#endif
-	/* protected by ldc_mutex */
-	unsigned int		ldc_refcnt;
-#define	ld_ldcrefcnt		ldc->ldc_refcnt
 };
 
 struct ldap {