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/

Reply via email to