sig
  type pam_error =
      Pam_Abort
    | Pam_Session_Err
    | Pam_Authtok_Err
    | Pam_Authtok_Recover_Err
    | Pam_Authtok_Lock_Busy
    | Pam_Authtok_Disable_Aging
    | Pam_Try_Again
    | Pam_Acct_Expired
    | Pam_New_Authtok_Reqd
    | Pam_Perm_Denied
    | Pam_Cred_Err
    | Pam_Cred_Expired
    | Pam_Cred_Unavail
    | Pam_Auth_Err
    | Pam_Cred_Insufficient
    | Pam_Authinfo_Unavail
    | Pam_Maxtries
    | Pam_User_Unknown
    | Pam_Buf_Err
    | Pam_System_Err
    | Pam_Bad_Item
  exception Pam_Error of Pam.pam_error
  type pam_handle
  type pam_conv_type =
      Pam_Prompt_Echo_Off
    | Pam_Prompt_Echo_On
    | Pam_Error_Msg
    | Pam_Text_Info
  type pam_conv = Pam.pam_conv_type -> string -> string
  type pam_auth_flags = Pam_Disallow_Null_Authtok
  type pam_fail_delay = int -> int -> unit
  type pam_credentials =
      Pam_Establish_Cred
    | Pam_Delete_Cred
    | Pam_Reinitialize_Cred
    | Pam_Refresh_Cred
  type pam_token_flags = Pam_Change_Expired_Authtok
  type pam_item =
      Pam_Service of string
    | Pam_User of string
    | Pam_User_Prompt of string
    | Pam_Tty of string
    | Pam_RUser of string
    | Pam_RHost of string
    | Pam_AuthTok of string
    | Pam_OldAuthTok of string
    | Pam_Conv of Pam.pam_conv
    | Pam_Fail_Delay of Pam.pam_fail_delay
  val pam_item_service : Pam.pam_item
  val pam_item_user : Pam.pam_item
  val pam_item_user_prompt : Pam.pam_item
  val pam_item_tty : Pam.pam_item
  val pam_item_ruser : Pam.pam_item
  val pam_item_rhost : Pam.pam_item
  val pam_item_authtok : Pam.pam_item
  val pam_item_oldauthtok : Pam.pam_item
  val pam_item_conv : Pam.pam_item
  val pam_item_fail_delay : Pam.pam_item
  type pam_functions = {
    pam_end : unit -> bool;
    pam_set_item : Pam.pam_item -> unit;
    pam_get_item : Pam.pam_item -> Pam.pam_item;
    pam_fail_delay : int -> unit;
    pam_authenticate : Pam.pam_auth_flags list -> ?silent:bool -> unit;
    pam_setcred : Pam.pam_credentials -> ?silent:bool -> unit;
    pam_acct_mgmt : Pam.pam_auth_flags list -> ?silent:bool -> unit;
    pam_chauthtok : Pam.pam_token_flags list -> ?silent:bool -> unit;
    pam_open_session : ?silent:bool -> unit -> unit;
    pam_close_session : ?silent:bool -> unit -> unit;
    pam_putenv : string -> unit;
    pam_getenv : string -> string option;
    pam_getenvlist : unit -> string list;
  }
  val pam_start_ex :
    string -> ?user:string -> Pam.pam_conv -> Pam.pam_functions
  val pam_start : string -> ?user:string -> Pam.pam_conv -> Pam.pam_handle
  val pam_end : Pam.pam_handle -> bool
  val pam_set_item : Pam.pam_handle -> Pam.pam_item -> unit
  val pam_get_item : Pam.pam_handle -> Pam.pam_item -> Pam.pam_item
  val pam_fail_delay : Pam.pam_handle -> int -> unit
  val pam_authenticate :
    Pam.pam_handle -> Pam.pam_auth_flags list -> ?silent:bool -> unit
  val pam_setcred :
    Pam.pam_handle -> Pam.pam_credentials -> ?silent:bool -> unit
  val pam_acct_mgmt :
    Pam.pam_handle -> Pam.pam_auth_flags list -> ?silent:bool -> unit
  val pam_chauthtok :
    Pam.pam_handle -> Pam.pam_token_flags list -> ?silent:bool -> unit
  val pam_open_session : Pam.pam_handle -> ?silent:bool -> unit
  val pam_close_session : Pam.pam_handle -> ?silent:bool -> unit
  val pam_putenv : Pam.pam_handle -> string -> unit
  val pam_getenv : Pam.pam_handle -> string -> string option
  val pam_getenvlist : Pam.pam_handle -> string list
end