Pass a threadsafe ctx into fr_connection_pool create callback
[freeradius.git] / src / modules / rlm_ldap / ldap.h
index 9757433..50bcb87 100644 (file)
 #include       <freeradius-devel/modules.h>
 #include       <ldap.h>
 
+/*
+ *      For compatibility with other LDAP libraries
+ */
+#if !defined(LDAP_SCOPE_BASE) && defined(LDAP_SCOPE_BASEOBJECT)
+#  define LDAP_SCOPE_BASE LDAP_SCOPE_BASEOBJECT
+#endif
+
+#if !defined(LDAP_SCOPE_ONE) && defined(LDAP_SCOPE_ONELEVEL)
+#  define LDAP_SCOPE_ONE LDAP_SCOPE_ONELEVEL
+#endif
+
+#if !defined(LDAP_SCOPE_SUB) && defined(LDAP_SCOPE_SUBTREE)
+#  define LDAP_SCOPE_SUB LDAP_SCOPE_SUBTREE
+#endif
+
+#if !defined(LDAP_OPT_RESULT_CODE) && defined(LDAP_OPT_ERROR_NUMBER)
+#  define LDAP_OPT_RESULT_CODE LDAP_OPT_ERROR_NUMBER
+#endif
+
+#ifndef LDAP_CONST
+#  define LDAP_CONST
+#endif
+
 #define LDAP_MAX_ATTRMAP               128             //!< Maximum number of mappings between LDAP and
                                                        //!< FreeRADIUS attributes.
 #define LDAP_MAP_RESERVED              4               //!< Number of additional items to allocate in expanded
@@ -49,6 +72,9 @@ typedef struct ldap_instance {
                                                        //!< directory.
        char const      *password;                      //!< Password used in administrative bind.
 
+       char const      *dereference_str;               //!< When to dereference (never, searching, finding, always)
+       int             dereference;                    //!< libldap value specifying dereferencing behaviour.
+
        bool            chase_referrals;                //!< If the LDAP server returns a referral to another server
                                                        //!< or point in the tree, follow it, establishing new
                                                        //!< connections and binding where necessary.
@@ -111,6 +137,12 @@ typedef struct ldap_instance {
                                                        //!< resolution necessary to determine the DNs of those groups,
                                                        //!< then right them to the control list (LDAP-GroupDN).
 
+       char const      *cache_attribute;               //!< Sets the attribute we use when creating and retrieving
+                                                       //!< cached group memberships.
+
+       DICT_ATTR const *cache_da;                      //!< The DA associated with this specific version of the
+                                                       //!< rlm_ldap module.
+
        DICT_ATTR const *group_da;                      //!< The DA associated with this specific version of the
                                                        //!< rlm_ldap module.
 
@@ -229,8 +261,9 @@ typedef struct rlm_ldap_map_xlat {
 } rlm_ldap_map_xlat_t;
 
 typedef struct rlm_ldap_result {
-       char    **values;
-       int     count;
+       struct berval   **values;                       //!< libldap struct containing bv_val (char *)
+                                                       //!< and length bv_len.
+       int             count;                          //!< Number of values.
 } rlm_ldap_result_t;
 
 typedef enum {
@@ -291,7 +324,7 @@ int rlm_ldap_is_dn(char const *str);
 ssize_t rlm_ldap_xlat_filter(REQUEST *request, char const **sub, size_t sublen, char *out, size_t outlen);
 
 ldap_rcode_t rlm_ldap_bind(ldap_instance_t const *inst, REQUEST *request, ldap_handle_t **pconn, char const *dn,
-                         char const *password, int retry);
+                         char const *password, bool retry);
 
 char const *rlm_ldap_error_str(ldap_handle_t const *conn);
 
@@ -313,9 +346,7 @@ void rlm_ldap_check_reply(ldap_instance_t const *inst, REQUEST *request);
 /*
  *     ldap.c - Callbacks for the connection pool API.
  */
-void *mod_conn_create(void *ctx);
-
-int mod_conn_delete(UNUSED void *instance, void *handle);
+void *mod_conn_create(TALLOC_CTX *ctx, void *instance);
 
 ldap_handle_t *rlm_ldap_get_socket(ldap_instance_t const *inst, REQUEST *request);