Ian Puleston wrote:
Hi,
I'm trying to use the new LDAP_OPT_CONNECT_ASYNC with OpenLDAP 2.4.23 client
and I can't see how it can be done.
After creating the connection structure via ldap_initialize() I then call
ldap_sasl_bind() to do the bind. That calls down to ldap_new_connection()
(ldap_sasl_bind -> ldap_send_initial_request -> ldap_open_defconn ->
ldap_new_connection) and that implements the asynchronous connect, setting the
lconn_status to LDAP_CONNST_CONNECTING and not calling ldap_int_poll() in
ldap_pvt_connect().
So far so good. But ldap_send_initial_request() then gets a good return code
from ldap_open_defconn(), and so it goes on to call ldap_send_server_request()
to send the bind, and that then calls ldap_int_poll() which waits for the
connect to complete, making the whole operation synchronous.
It seems to me that for this to work asynchronously, either:
1. ldap_send_initial_request() should check for lconn_status to
LDAP_CONNST_CONNECTING on return from ldap_open_defconn(), and if it is then
return, probably with error LDAP_X_CONNECTING. It should then be possible to
re-call ldap_sasl_bind() when the connect has completed.
2. Establish the connection via ldap_new_connection() before calling
ldap_sasl_bind(). But the functions to do that don't appear to be available on
the API. ldap_open() could have probably done it, but it is now deprecated. So
this would appear to require a new API function that would simply call
ldap_open_defconn() and return LDAP_X_CONNECTING.
Or is there some other way to achieve this?
Since ldap_open_defconn() is not named ldap_int_xxx or ldap_pvt_xxx I'd guess
you should just use that. Another alternative is to simply use your own code
to create a connection, and call ldap_init_fd() when you're ready.
--
-- Howard Chu
CTO, Symas Corp. http://www.symas.com
Director, Highland Sun http://highlandsun.com/hyc/
Chief Architect, OpenLDAP http://www.openldap.org/project/