diff libpam-sys/src/ffi.rs @ 133:32b2a545ca3e

Add functions and constants from openpam.h.
author Paul Fisher <paul@pfish.zone>
date Wed, 02 Jul 2025 03:33:09 -0400
parents a632a8874131
children 6c1e1bdb4164
line wrap: on
line diff
--- a/libpam-sys/src/ffi.rs	Wed Jul 02 02:34:29 2025 -0400
+++ b/libpam-sys/src/ffi.rs	Wed Jul 02 03:33:09 2025 -0400
@@ -66,7 +66,7 @@
     appdata: *mut AppData,
 ) -> c_int;
 
-/// Alias for the callback to [`pam_set_data`](crate::pam_set_data).
+/// Alias for the callback to [`pam_set_data`](pam_set_data).
 ///
 /// ```no_run
 /// # use std::ffi::CString;
@@ -148,6 +148,32 @@
     is_dropped: c_int,
 }
 
+#[cfg(_hack_impl = "OpenPam")]
+pub type pam_func_t = unsafe extern "C" fn(
+    handle: *mut pam_handle,
+    flags: c_int,
+    argc: c_int,
+    argv: *const *const c_char,
+) -> c_int;
+
+#[cfg(_hack_impl = "OpenPam")]
+#[derive(Debug)]
+#[repr(C)]
+pub struct pam_module {
+    path: *mut c_char,
+    func: [pam_func_t; 6],
+    dlh: *mut c_void,
+}
+
+#[cfg(_hack_impl = "OpenPam")]
+#[derive(Debug)]
+#[repr(C)]
+pub struct pam_repository {
+    typ: *mut c_char,
+    scope: *mut c_void,
+    scope_len: usize,
+}
+
 // These are the functions specified in X/SSO. Everybody exports them.
 extern "C" {
     /// Account validation.
@@ -259,6 +285,15 @@
         authtok: *mut *const c_char,
         prompt: *const c_char,
     ) -> c_int;
+
+    pub fn pam_prompt(
+        pamh: *const pam_handle,
+        style: c_int,
+        response: *mut *mut c_char,
+        fmt: *const c_char,
+        ...
+    ) -> c_int;
+
 }
 
 #[cfg(_hack_impl = "LinuxPam")]
@@ -278,14 +313,6 @@
 
     pub fn pam_syslog(pamh: *const pam_handle, priority: c_int, fmt: *const c_char, ...);
 
-    pub fn pam_prompt(
-        pamh: *const pam_handle,
-        style: c_int,
-        response: *mut *mut c_char,
-        fmt: *const c_char,
-        ...
-    ) -> c_int;
-
     pub fn pam_get_authtok_noverify(
         pamh: *const pam_handle,
         authtok: *mut *const c_char,
@@ -373,3 +400,114 @@
         key: *const c_char,
     ) -> *mut c_char;
 }
+
+#[cfg(_hack_impl = "OpenPam")]
+extern "C" {
+    pub fn openpam_borrow_cred(pamh: *mut pam_handle, passwd: *const libc::passwd) -> c_int;
+
+    pub fn openpam_subst(
+        pamh: *const pam_handle,
+        buf: *mut c_char,
+        _bufsize: *mut usize,
+        _template: *const c_char,
+    ) -> c_int;
+
+    pub fn openpam_free_data(pamh: *mut pam_handle, data: *mut c_void, status: c_int);
+
+    pub fn openpam_free_envlist(_envlist: *mut *mut c_char);
+
+    pub fn openpam_get_option(_pamh: *mut pam_handle, _option: *const c_char) -> *const c_char;
+
+    pub fn openpam_restore_cred(pamh: *mut pam_handle) -> c_int;
+
+    pub fn openpam_set_option(
+        _pamh: *mut pam_handle,
+        _option: *const c_char,
+        _value: *const c_char,
+    ) -> c_int;
+
+    pub fn pam_error(pamh: *const pam_handle, _fmt: *const c_char, ...) -> c_int;
+
+    pub fn pam_info(_pamh: *const pam_handle, _fmt: *const c_char, ...) -> c_int;
+
+    pub fn openpam_readline(
+        _f: *mut libc::FILE,
+        _lineno: *mut c_int,
+        _lenp: *mut usize,
+    ) -> *mut c_char;
+
+    pub fn openpam_readlinev(
+        _f: *mut libc::FILE,
+        _lineno: *mut c_int,
+        _lenp: *mut c_int,
+    ) -> *mut *mut c_char;
+
+    pub fn openpam_readword(
+        _f: *mut libc::FILE,
+        _lineno: *mut c_int,
+        _lenp: *mut usize,
+    ) -> *mut c_char;
+
+    pub fn openpam_straddch(
+        _str: *mut *mut c_char,
+        _sizep: *mut usize,
+        _lenp: *mut usize,
+        ch: c_int,
+    ) -> c_int;
+
+    pub fn openpam_set_feature(_feature: c_int, _onoff: c_int) -> c_int;
+
+    pub fn openpam_get_feature(_feature: c_int, _onoff: *mut c_int) -> c_int;
+
+    pub fn _openpam_log(_level: c_int, _func: *const c_char, _fmt: *const c_char, ...);
+
+    /// A premade conversation function that talks to the TTY.
+    ///
+    /// ```no_run
+    /// # use std::ffi::CString;
+    /// # use std::ptr;
+    /// use libpam_sys::*;
+    /// # let service = CString::new("whatever").unwrap();
+    /// # let user = CString::new("whatever").unwrap();
+    /// let mut handle: *mut pam_handle = ptr::null_mut();
+    /// let mut conv = pam_conv{
+    ///     conv: openpam_ttyconv,
+    ///     appdata_ptr: ptr::null_mut(),
+    /// };
+    /// let result = unsafe { pam_start(
+    ///     service.as_ptr(), user.as_ptr(), &mut conv, &mut handle
+    /// ) };
+    /// ```
+    pub fn openpam_ttyconv(
+        n: c_int,
+        _msg: *const *const pam_message,
+        _resp: *mut *mut pam_response,
+        _data: *mut AppData,
+    ) -> c_int;
+
+    pub static mut openpam_ttyconv_timeout: c_int;
+
+    /// A null conversation function.
+    ///
+    /// ```no_run
+    /// # use std::ffi::CString;
+    /// # use std::ptr;
+    /// use libpam_sys::*;
+    /// # let service = CString::new("whatever").unwrap();
+    /// # let user = CString::new("whatever").unwrap();
+    /// let mut handle: *mut pam_handle = ptr::null_mut();
+    /// let mut conv = pam_conv{
+    ///     conv: openpam_nullconv,
+    ///     appdata_ptr: ptr::null_mut(),
+    /// };
+    /// let result = unsafe { pam_start(
+    ///     service.as_ptr(), user.as_ptr(), &mut conv, &mut handle
+    /// ) };
+    /// ```
+    pub fn openpam_nullconv(
+        n: c_int,
+        _msg: *const *const pam_message,
+        _resp: *mut *mut pam_response,
+        _data: *mut AppData,
+    ) -> c_int;
+}