--- /dev/null
+! Copyright (C) 2007 Elie CHAFTARI
+! See http://factorcode.org/license.txt for BSD license.
+!
+! Tested with OpenLDAP 2.2.7.0.21 on Mac OS X 10.4.9 PowerPC
+
+USING: alien alien.c-types assocs continuations hashtables io kernel
+ldap.libldap math namespaces sequences ;
+
+IN: ldap
+
+SYMBOL: message
+SYMBOL: ldp
+
+! =========================================================
+! Error interpretation routines
+! =========================================================
+
+: result-to-error ( ld res freeit -- num )
+ ldap_result2error ;
+
+: err-to-string ( err -- str )
+ ldap_err2string ;
+
+: check-result ( result -- )
+ dup zero? [ drop ] [
+ err-to-string throw
+ ] if ;
+
+: result-type ( result -- )
+ result-types >hashtable at print ;
+
+! =========================================================
+! Initialization routines
+! =========================================================
+
+! deprecated in favor of ldap_initialize
+: open ( host port -- ld )
+ ldap_open ;
+
+! deprecated in favor of ldap_initialize
+: init ( host port -- ld )
+ ldap_init ;
+
+: initialize ( ld url -- )
+ dupd ldap_initialize swap *void* ldp set check-result ;
+
+: get-option ( ld option outvalue -- )
+ ldap_get_option check-result ;
+
+: set-option ( ld option invalue -- )
+ ldap_set_option check-result ;
+
+! =========================================================
+! Bind operations
+! =========================================================
+
+: simple-bind ( ld who passwd -- id )
+ ldap_simple_bind ;
+
+: simple-bind-s ( ld who passwd -- )
+ ldap_simple_bind_s check-result ;
+
+: unbind-s ( ld -- )
+ ldap_unbind_s check-result ;
+
+: with-bind ( ld who passwd quot -- )
+ -roll [ simple-bind-s [ ldp get unbind-s ] [ ] cleanup ] with-scope ; inline
+
+! =========================================================
+! Search operations
+! =========================================================
+
+: search ( ld base scope filter attrs attrsonly -- id )
+ ldap_search ;
+
+: search-s ( ld base scope filter attrs attrsonly res -- )
+ ldap_search_s check-result ;
+
+! =========================================================
+! Return results of asynchronous operation routines
+! =========================================================
+
+: result ( ld msgid all timeout result -- )
+ [ ldap_result ] keep *void* message set result-type ;
+
+: parse-result ( ld result errcodep matcheddnp errmsgp referralsp serverctrlsp freeit -- )
+ ldap_parse_result check-result ;
+
+: count-messages ( ld result -- count )
+ ldap_count_messages ;
+
+: first-message ( ld result -- message )
+ ldap_first_message ;
+
+: next-message ( ld message -- message )
+ ldap_next_message ;
+
+: msgtype ( msg -- num )
+ ldap_msgtype ;
+
+: msgid ( msg -- num )
+ ldap_msgid ;
+
+: count-entries ( ld result -- count )
+ ldap_count_entries ;
+
+: first-entry ( ld result -- entry )
+ ldap_first_entry ;
+
+: next-entry ( ld entry -- entry )
+ ldap_next_entry ;
+
+: first-attribute ( ld entry berptr -- str )
+ ldap_first_attribute ;
+
+: next-attribute ( ld entry ber -- str )
+ ldap_next_attribute ;
+
+: get-values ( ld entry attr -- values )
+ ldap_get_values ;
+
+: get-dn ( ld entry -- str )
+ ldap_get_dn ;
+
+! =========================================================
+! Public routines
+! =========================================================
+
+: get-message ( -- message )
+ message get ;
+
+: get-ldp ( -- ldp )
+ ldp get ;