view src/pam_ffi/mod.rs @ 74:c7c596e6388f

Make conversations type-safe (last big reorg) (REAL) (NOT CLICKBAIT) In previous versions of Conversation, you could send messages and then return messages of the wrong type or in the wrong order or whatever. The receiver would then have to make sure that there were the right number of messages and that each message was the right type. That's annoying. This change makes the `Message` enum a two-way channel, where the asker puts their question into it, and then the answerer (the conversation) puts the answer in and returns control to the asker. The asker then only has to pull the Answer of the type they wanted out of the message.
author Paul Fisher <paul@pfish.zone>
date Fri, 06 Jun 2025 22:21:17 -0400
parents ac6881304c78
children
line wrap: on
line source

//! The PAM library FFI and helpers for managing it.
//!
//! This includes the functions provided by PAM and the data structures
//! used by PAM, as well as a few low-level abstractions for dealing with
//! those data structures.
//!
//! Everything in here is hazmat.
//!

#![allow(dead_code)]

mod conversation;
mod handle;
mod memory;
mod message;
mod module;
mod response;

pub use handle::{LibPamHandle, OwnedLibPamHandle};
use std::ffi::{c_char, c_int, c_void};

#[link(name = "pam")]
extern "C" {
    fn pam_get_data(
        pamh: *mut LibPamHandle,
        module_data_name: *const c_char,
        data: &mut *const c_void,
    ) -> c_int;

    fn pam_set_data(
        pamh: *mut LibPamHandle,
        module_data_name: *const c_char,
        data: *const c_void,
        cleanup: extern "C" fn(pamh: *const c_void, data: *mut c_void, error_status: c_int),
    ) -> c_int;

    fn pam_get_item(pamh: *mut LibPamHandle, item_type: c_int, item: &mut *const c_void) -> c_int;

    fn pam_set_item(pamh: *mut LibPamHandle, item_type: c_int, item: *const c_void) -> c_int;

    fn pam_get_user(
        pamh: *mut LibPamHandle,
        user: &mut *const c_char,
        prompt: *const c_char,
    ) -> c_int;

    fn pam_get_authtok(
        pamh: *mut LibPamHandle,
        item_type: c_int,
        data: &mut *const c_char,
        prompt: *const c_char,
    ) -> c_int;

    fn pam_end(pamh: *mut LibPamHandle, status: c_int) -> c_int;

    // TODO: pam_authenticate - app
    //       pam_setcred - app
    //       pam_acct_mgmt - app
    //       pam_chauthtok - app
    //       pam_open_session - app
    //       pam_close_session - app
    //       pam_putenv - shared
    //       pam_getenv - shared
    //       pam_getenvlist - shared
}