view src/environ.rs @ 143:ebb71a412b58

Turn everything into OsString and Just Walk Out! for strings with nul. To reduce the hazard surface of the API, this replaces most uses of &str with &OsStr (and likewise with String/OsString). Also, I've decided that instead of dealing with callers putting `\0` in their parameters, I'm going to follow the example of std::env and Just Walk Out! (i.e., panic!()). This makes things a lot less annoying for both me and (hopefully) users.
author Paul Fisher <paul@pfish.zone>
date Sat, 05 Jul 2025 22:12:46 -0400
parents a508a69c068a
children
line wrap: on
line source

//! Traits and stuff for managing the environment of a PAM handle.
//!
//! PAM modules can set environment variables to apply to a user session.
//! This module manages the interface for doing all of that.

use std::ffi::{OsStr, OsString};

/// A key/value map for environment variables, as [`OsString`]s.
///
/// This is a limited subset of what [`HashMap`](std::collections::HashMap)
/// can do. Notably, we do *not* support mutable iteration.
pub trait EnvironMap<'a> {
    /// Gets the environment variable of the given key.
    fn get(&self, key: impl AsRef<OsStr>) -> Option<OsString>;

    /// Iterates over the key/value pairs of the environment.
    fn iter(&self) -> impl Iterator<Item = (OsString, OsString)>;
}

pub trait EnvironMapMut<'a>: EnvironMap<'a> {
    /// Sets the environment variable with the given key,
    /// returning the old one if present.
    fn insert(&mut self, key: impl AsRef<OsStr>, val: impl AsRef<OsStr>) -> Option<OsString>;

    /// Removes the environment variable from the map, returning its old value
    /// if present.
    fn remove(&mut self, key: impl AsRef<OsStr>) -> Option<OsString>;
}