/* * call-seq: * conn.bind(dn=nil, password=nil, method=LDAP::LDAP_AUTH_SIMPLE) * => self * conn.bind(dn=nil, password=nil, method=LDAP::LDAP_AUTH_SIMPLE) * { |conn| } => nil * * Bind an LDAP connection, using the DN, +dn+, the credential, +password+, * and the bind method, +method+. If a block is given, +self+ is yielded to * the block. */ VALUE rb_ldap_conn_bind_s (int argc, VALUE argv[], VALUE self) { RB_LDAP_DATA *ldapdata; VALUE arg1, arg2, arg3; char *dn = NULL; char *passwd = NULL; int method = LDAP_AUTH_SIMPLE; Data_Get_Struct (self, RB_LDAP_DATA, ldapdata); if (!ldapdata->ldap) { if (rb_iv_get (self, "@args") != Qnil) { rb_ldap_conn_rebind (self); GET_LDAP_DATA (self, ldapdata); } else { rb_raise (rb_eLDAP_InvalidDataError, "The LDAP handler has already unbound."); } } if (ldapdata->bind) { rb_raise (rb_eLDAP_Error, "already bound."); }; switch (rb_scan_args (argc, argv, "03", &arg1, &arg2, &arg3)) { case 0: break; case 1: dn = StringValueCStr (arg1); break; case 2: dn = StringValueCStr (arg1); passwd = StringValueCStr (arg2); break; case 3: dn = StringValueCStr (arg1); passwd = StringValueCStr (arg2); method = NUM2INT (arg3); break; default: rb_bug ("rb_ldap_conn_bind_s"); } ldapdata->err = ldap_bind_s (ldapdata->ldap, dn, passwd, method); Check_LDAP_Result (ldapdata->err); ldapdata->bind = 1; if (rb_block_given_p ()) { rb_ensure (rb_yield, self, rb_ldap_conn_unbind, self); return Qnil; } else { return self; }; }