internal override async Task <IntPtr> BindKerberosAsync(SafeHandle ld) { var task = Task.Factory.StartNew(() => { var rc = 0; var msgid = 0; var result = IntPtr.Zero; var rmech = IntPtr.Zero; var saslDefaults = GetSaslDefaults(ld); var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(saslDefaults)); Marshal.StructureToPtr(saslDefaults, ptr, false); do { rc = NativeMethodsOsx.ldap_sasl_interactive_bind(ld, null, Native.LdapAuthMechanism.GSSAPI, IntPtr.Zero, IntPtr.Zero, (uint)Native.LdapInteractionFlags.LDAP_SASL_QUIET, SaslInteractProc, ptr, result, ref rmech, ref msgid); if (rc != (int)Native.ResultCode.SaslBindInProgress) { break; } NativeMethodsOsx.ldap_msgfree(result); if (NativeMethodsOsx.ldap_result(ld, msgid, 0, IntPtr.Zero, ref result) == Native.LdapResultType.LDAP_ERROR) { ThrowIfError(rc, nameof(NativeMethodsOsx.ldap_sasl_interactive_bind)); } if (result == IntPtr.Zero) { throw new LdapException("Result is not initialized", nameof(NativeMethodsOsx.ldap_sasl_interactive_bind), 1); } } while (rc == (int)Native.ResultCode.SaslBindInProgress); ThrowIfError(ld, rc, nameof(NativeMethodsOsx.ldap_sasl_interactive_bind), new Dictionary <string, string> { [nameof(saslDefaults)] = saslDefaults.ToString() }); return(result); }); return(await task.ConfigureAwait(false)); }
internal override void ldap_msgfree(IntPtr message) => NativeMethodsOsx.ldap_msgfree(message);