sig
  exception Server_error of string
  type connection_id = int
  type backendInfo = {
    bi_op_bind :
      (Ldap_funserver.connection_id ->
       Ldap_types.ldap_message -> Ldap_types.ldap_message)
      option;
    bi_op_unbind :
      (Ldap_funserver.connection_id -> Ldap_types.ldap_message -> unit)
      option;
    bi_op_search :
      (Ldap_funserver.connection_id ->
       Ldap_types.ldap_message -> unit -> Ldap_types.ldap_message)
      option;
    bi_op_compare :
      (Ldap_funserver.connection_id ->
       Ldap_types.ldap_message -> Ldap_types.ldap_message)
      option;
    bi_op_modify :
      (Ldap_funserver.connection_id ->
       Ldap_types.ldap_message -> Ldap_types.ldap_message)
      option;
    bi_op_modrdn :
      (Ldap_funserver.connection_id ->
       Ldap_types.ldap_message -> Ldap_types.ldap_message)
      option;
    bi_op_add :
      (Ldap_funserver.connection_id ->
       Ldap_types.ldap_message -> Ldap_types.ldap_message)
      option;
    bi_op_delete :
      (Ldap_funserver.connection_id ->
       Ldap_types.ldap_message -> Ldap_types.ldap_message)
      option;
    bi_op_abandon :
      (Ldap_funserver.connection_id -> Ldap_types.ldap_message -> unit)
      option;
    bi_op_extended :
      (Ldap_funserver.connection_id ->
       Ldap_types.ldap_message -> Ldap_types.ldap_message)
      option;
    bi_init : (unit -> unit) option;
    bi_close : (unit -> unit) option;
  }
  type log_level = [ `CONNECTION | `ERROR | `GENERAL | `OPERATIONS | `TRACE ]
  type server_info
  val init :
    ?log:(Ldap_funserver.log_level -> string -> unit) ->
    ?port:int -> Ldap_funserver.backendInfo -> Ldap_funserver.server_info
  val shutdown : Ldap_funserver.server_info -> unit
  val run : Ldap_funserver.server_info -> unit
end