diff --git a/src/uu/users/src/platform/mod.rs b/src/uu/users/src/platform/mod.rs new file mode 100644 index 000000000..e0e87dca1 --- /dev/null +++ b/src/uu/users/src/platform/mod.rs @@ -0,0 +1,14 @@ +// This file is part of the uutils coreutils package. +// +// For the full copyright and license information, please view the LICENSE +// file that was distributed with this source code. + +#[cfg(not(target_os = "openbsd"))] +mod unix; +#[cfg(not(target_os = "openbsd"))] +pub use self::unix::*; + +#[cfg(target_os = "openbsd")] +mod openbsd; +#[cfg(target_os = "openbsd")] +pub use self::openbsd::*; diff --git a/src/uu/users/src/platform/openbsd.rs b/src/uu/users/src/platform/openbsd.rs new file mode 100644 index 000000000..7e6970c1f --- /dev/null +++ b/src/uu/users/src/platform/openbsd.rs @@ -0,0 +1,17 @@ +// This file is part of the uutils coreutils package. +// +// For the full copyright and license information, please view the LICENSE +// file that was distributed with this source code. + +// Specific implementation for OpenBSD: tool unsupported (utmpx not supported) + +use crate::uu_app; + +use uucore::error::UResult; + +pub fn uumain(args: impl uucore::Args) -> UResult<()> { + let _matches = uu_app().try_get_matches_from(args)?; + + println!("unsupported command on OpenBSD"); + Ok(()) +} diff --git a/src/uu/users/src/platform/unix.rs b/src/uu/users/src/platform/unix.rs new file mode 100644 index 000000000..99c9ce776 --- /dev/null +++ b/src/uu/users/src/platform/unix.rs @@ -0,0 +1,53 @@ +// This file is part of the uutils coreutils package. +// +// For the full copyright and license information, please view the LICENSE +// file that was distributed with this source code. + +// spell-checker:ignore (paths) wtmp + +use crate::uu_app; + +use std::ffi::OsString; +use std::path::Path; + +use uucore::error::UResult; +use uucore::utmpx::{self, Utmpx}; + +static ARG_FILES: &str = "files"; + +fn get_long_usage() -> String { + format!( + "Output who is currently logged in according to FILE. +If FILE is not specified, use {}. /var/log/wtmp as FILE is common.", + utmpx::DEFAULT_FILE + ) +} + +pub fn uumain(args: impl uucore::Args) -> UResult<()> { + let matches = uu_app() + .after_help(get_long_usage()) + .try_get_matches_from(args)?; + + let files: Vec<&Path> = matches + .get_many::(ARG_FILES) + .map(|v| v.map(AsRef::as_ref).collect()) + .unwrap_or_default(); + + let filename = if files.is_empty() { + utmpx::DEFAULT_FILE.as_ref() + } else { + files[0] + }; + + let mut users = Utmpx::iter_all_records_from(filename) + .filter(Utmpx::is_user_process) + .map(|ut| ut.user()) + .collect::>(); + + if !users.is_empty() { + users.sort(); + println!("{}", users.join(" ")); + } + + Ok(()) +} diff --git a/src/uu/users/src/users.rs b/src/uu/users/src/users.rs index 199882b7e..d299399f3 100644 --- a/src/uu/users/src/users.rs +++ b/src/uu/users/src/users.rs @@ -5,57 +5,19 @@ // spell-checker:ignore (paths) wtmp -use std::ffi::OsString; -use std::path::Path; - use clap::builder::ValueParser; use clap::{crate_version, Arg, Command}; -use uucore::error::UResult; -use uucore::utmpx::{self, Utmpx}; use uucore::{format_usage, help_about, help_usage}; +mod platform; + const ABOUT: &str = help_about!("users.md"); const USAGE: &str = help_usage!("users.md"); static ARG_FILES: &str = "files"; -fn get_long_usage() -> String { - format!( - "Output who is currently logged in according to FILE. -If FILE is not specified, use {}. /var/log/wtmp as FILE is common.", - utmpx::DEFAULT_FILE - ) -} - #[uucore::main] -pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let matches = uu_app() - .after_help(get_long_usage()) - .try_get_matches_from(args)?; - - let files: Vec<&Path> = matches - .get_many::(ARG_FILES) - .map(|v| v.map(AsRef::as_ref).collect()) - .unwrap_or_default(); - - let filename = if files.is_empty() { - utmpx::DEFAULT_FILE.as_ref() - } else { - files[0] - }; - - let mut users = Utmpx::iter_all_records_from(filename) - .filter(Utmpx::is_user_process) - .map(|ut| ut.user()) - .collect::>(); - - if !users.is_empty() { - users.sort(); - println!("{}", users.join(" ")); - } - - Ok(()) -} +use platform::uumain; pub fn uu_app() -> Command { Command::new(uucore::util_name())