/*
* call-seq:
* conn.search_ext(base_dn, scope, filter, attrs=nil, attrsonly=false,
* sctrls, cctrls, sec=0, usec=0, s_attr=nil, s_proc=nil)
* { |entry| } => self
*
* Perform a search, with the base DN +base_dn+, a scope of +scope+ and a
* search filter of +filter+.
*
* If +attrs+ is present, it should be an array of the attributes that the
* search should return. By default, all attributes are returned, which is the
* same as specifying an empty array or *nil*. Alternatively, +attrs+ may be a
* single string, in which case it will be treated as a single element array.
*
* If +attrsonly+ is *true*, attributes will be returned, but not their values.
*
* +sctrls+ is an array of server controls, whilst +cctrls+ is an array of
* client controls.
*
* If +sec+ and/or +usec+ are given, they define the time-out for the search in
* seconds and microseconds, respectively.
*
* If +s_attr+ is given, it specifies the attribute on which to sort the
* entries returned by the server. If +s_proc+ is given, it specifies a Proc
* object that will be used to sort the entries returned by the server.
*
* Note that not all results may be returned by this method. If a
* size limit has been set for the number of results to be returned and this
* limit is exceeded, the results set will be truncated. You can check for
* this by calling LDAP::Conn#err immediately after this method and comparing
* the result to LDAP::LDAP_SIZELIMIT_EXCEEDED.
*/
VALUE
rb_ldap_conn_search_ext_s (int argc, VALUE argv[], VALUE self)
{
RB_LDAP_DATA *ldapdata;
LDAPMessage *cmsg;
LDAP *cldap;
rb_ldap_conn_search_ext_i (argc, argv, self, &ldapdata, &cmsg);
cldap = ldapdata->ldap;
if (ldapdata->err == LDAP_SUCCESS
|| ldapdata->err == LDAP_SIZELIMIT_EXCEEDED)
{
void *pass_data[] = { (void *) cldap, (void *) cmsg };
rb_ensure (rb_ldap_conn_search_b, (VALUE) pass_data,
rb_ldap_msgfree, (VALUE) cmsg);
};
return self;
}