diff --git a/Cargo.lock b/Cargo.lock index 623bdab9..84bdda72 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1139,6 +1139,7 @@ checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" name = "plib" version = "0.2.0" dependencies = [ + "cfg-if", "libc", ] diff --git a/file/find.rs b/file/find.rs index b96b190a..9ff16214 100644 --- a/file/find.rs +++ b/file/find.rs @@ -149,8 +149,8 @@ fn parse_expression(tokens: &mut Vec<&str>) -> Vec { "-size" => { tokens.pop(); if let Some(size) = tokens.pop() { - let (size, in_bytes) = if size.ends_with('c') { - (size[..size.len() - 1].parse::().unwrap_or(0), true) + let (size, in_bytes) = if let Some(st) = size.strip_suffix('c') { + (st.parse::().unwrap_or(0), true) } else { (size.parse::().unwrap_or(0), false) }; @@ -250,15 +250,15 @@ fn evaluate_expression( match expression { Expr::Not(inner) => { let i: Vec = vec![f_path.clone(), *inner.clone()]; - not_res = evaluate_expression(&i.as_slice(), files.clone(), root_dev)?; + not_res = evaluate_expression(i.as_slice(), files.clone(), root_dev)?; } Expr::Or(inner) => { let i: Vec = vec![f_path.clone(), *inner.clone()]; - or_res = evaluate_expression(&i.as_slice(), files.clone(), root_dev)?; + or_res = evaluate_expression(i.as_slice(), files.clone(), root_dev)?; } Expr::And(inner) => { let i: Vec = vec![f_path.clone(), *inner.clone()]; - and_res = evaluate_expression(&i.as_slice(), files.clone(), root_dev)?; + and_res = evaluate_expression(i.as_slice(), files.clone(), root_dev)?; } _ => {} } @@ -307,7 +307,7 @@ fn evaluate_expression( FileType::Fifo => file_type.is_fifo(), FileType::File => file_type.is_file(), FileType::Socket => file_type.is_socket(), - FileType::Unknown => return Err(format!("Unknown argument to -type")), + FileType::Unknown => return Err("Unknown argument to -type".to_owned()), }; if !r { c_files.remove(file.path()); @@ -316,7 +316,7 @@ fn evaluate_expression( Expr::NoUser => { if let Ok(metadata) = file.metadata() { let uid = metadata.uid(); - if !users::get_user_by_uid(uid).is_none() { + if users::get_user_by_uid(uid).is_some() { c_files.remove(file.path()); } } @@ -324,7 +324,7 @@ fn evaluate_expression( Expr::NoGroup => { if let Ok(metadata) = file.metadata() { let gid = metadata.gid(); - if !users::get_group_by_gid(gid).is_none() { + if users::get_group_by_gid(gid).is_some() { c_files.remove(file.path()); } } diff --git a/ftw/src/lib.rs b/ftw/src/lib.rs index e7871b73..61f1df30 100644 --- a/ftw/src/lib.rs +++ b/ftw/src/lib.rs @@ -422,7 +422,7 @@ enum ProcessFileResult { } fn process_file( - path_stack: &Vec>, + path_stack: &[Rc<[libc::c_char]>], dir_fd: &FileDescriptor, entry_filename: Rc<[libc::c_char]>, follow_symlinks: bool, @@ -439,7 +439,7 @@ where Ok(md) => md, Err(e) => { err_reporter( - Entry::new(dir_fd, &path_stack, &entry_filename, None), + Entry::new(dir_fd, path_stack, &entry_filename, None), Error::new(e, ErrorKind::Stat), ); return ProcessFileResult::NotProcessed; @@ -583,7 +583,7 @@ where Err(e) => { if let Some(path_stack) = &path_stack { err_reporter( - Entry::new(&starting_dir, &path_stack, &filename, None), + Entry::new(&starting_dir, path_stack, &filename, None), Error::new(e, ErrorKind::Open), ); } diff --git a/gettext-rs/src/lib.rs b/gettext-rs/src/lib.rs index 78f4fd31..7e7138d3 100644 --- a/gettext-rs/src/lib.rs +++ b/gettext-rs/src/lib.rs @@ -18,7 +18,7 @@ pub fn textdomain>>(domainname: T) -> Result, std::io::E } pub fn gettext>(msgid: T) -> String { - return msgid.into(); + msgid.into() } #[macro_export] diff --git a/m4/test-manager/src/main.rs b/m4/test-manager/src/main.rs index 46668371..67a96c51 100644 --- a/m4/test-manager/src/main.rs +++ b/m4/test-manager/src/main.rs @@ -68,7 +68,7 @@ fn update_snapshots(args: &Args, update: &UpdateSnapshots) { return false; } - if let Some(name) = update.test_case_name.as_ref().map(|s| s.as_str()) { + if let Some(name) = update.test_case_name.as_deref() { if name != entry.path().file_stem().unwrap().to_str().unwrap() { return false; } diff --git a/plib/Cargo.toml b/plib/Cargo.toml index 427c657b..29b4bc6e 100644 --- a/plib/Cargo.toml +++ b/plib/Cargo.toml @@ -7,6 +7,7 @@ license = "MIT" repository = "https://github.com/rustcoreutils/posixutils-rs.git" [dependencies] +cfg-if = "1.0" libc.workspace = true [lib] diff --git a/plib/src/io.rs b/plib/src/io.rs index 17199a0b..55d32b7e 100644 --- a/plib/src/io.rs +++ b/plib/src/io.rs @@ -13,22 +13,21 @@ use std::path::PathBuf; pub fn input_stream(pathname: &PathBuf, dashed_stdin: bool) -> io::Result> { // open file, or stdin - let file: Box; let path_str = pathname.as_os_str(); - if dashed_stdin && path_str == "-" { - file = Box::new(io::stdin().lock()); - } else if !dashed_stdin && path_str == "" { - file = Box::new(io::stdin().lock()); - } else { - file = Box::new(fs::File::open(pathname)?); - } + + let file: Box = + if (dashed_stdin && path_str == "-") || (!dashed_stdin && path_str.is_empty()) { + Box::new(io::stdin().lock()) + } else { + Box::new(fs::File::open(pathname)?) + }; Ok(file) } pub fn input_stream_opt(pathname: &Option) -> io::Result> { match pathname { - Some(path) => input_stream(&path, false), + Some(path) => input_stream(path, false), None => input_stream(&PathBuf::new(), false), } } diff --git a/plib/src/lib.rs b/plib/src/lib.rs index beab1774..4ad8f1ad 100644 --- a/plib/src/lib.rs +++ b/plib/src/lib.rs @@ -12,6 +12,7 @@ pub mod group; pub mod io; pub mod lzw; pub mod modestr; +pub mod platform; pub mod sccsfile; pub mod testing; pub mod utmpx; diff --git a/plib/src/platform.rs b/plib/src/platform.rs new file mode 100644 index 00000000..866d7232 --- /dev/null +++ b/plib/src/platform.rs @@ -0,0 +1,58 @@ +// TODO +// Avoid restating local alias names +cfg_if::cfg_if! { + if #[cfg(target_env = "musl")] { + // https://git.musl-libc.org/cgit/musl/tree/include/utmpx.h?id=1e7f0fcd7ff2096904fd93a2ee6d12a2392be392 + pub const EMPTY: libc::c_short = 0_i16; + pub const RUN_LVL: libc::c_short = 1_i16; + pub const BOOT_TIME: libc::c_short = 2_i16; + pub const NEW_TIME: libc::c_short = 3_i16; + pub const OLD_TIME: libc::c_short = 4_i16; + pub const INIT_PROCESS: libc::c_short = 5_i16; + pub const LOGIN_PROCESS: libc::c_short = 6_i16; + pub const USER_PROCESS: libc::c_short = 7_i16; + pub const DEAD_PROCESS: libc::c_short = 8_i16; + + // Remove when https://github.com/rust-lang/libc/issues/3190 is resolved + // https://github.com/rust-lang/libc/commit/e3caaf6b0ea08ae294e25a861022c256a7535ec4#diff-5822a2981791fb0bb7689a921abdc2133cc73116ee125eabefad3a9374056b7a + extern "C" { + pub fn getutxent() -> *mut libc::utmpx; + pub fn getutxid(ut: *const libc::utmpx) -> *mut libc::utmpx; + pub fn getutxline(ut: *const libc::utmpx) -> *mut libc::utmpx; + pub fn pututxline(ut: *const libc::utmpx) -> *mut libc::utmpx; + pub fn setutxent(); + pub fn endutxent(); + } + + type LocalPIoctlOp = libc::c_int; + type LocalPPriorityWhichT = libc::c_int; + } else { + pub use libc::{ + endutxent, + getutxent, + setutxent, + BOOT_TIME, + DEAD_PROCESS, + EMPTY, + INIT_PROCESS, + LOGIN_PROCESS, + NEW_TIME, + OLD_TIME, + RUN_LVL, + USER_PROCESS, + }; + + type LocalPIoctlOp = libc::c_ulong; + + cfg_if::cfg_if! { + if #[cfg(target_os = "macos")] { + type LocalPPriorityWhichT = libc::c_int; + } else { + type LocalPPriorityWhichT = libc::__priority_which_t; + } + } + } +} + +pub type PIoctlOp = LocalPIoctlOp; +pub type PPriorityWhichT = LocalPPriorityWhichT; diff --git a/plib/src/sccsfile.rs b/plib/src/sccsfile.rs index c521da55..d5c916b2 100644 --- a/plib/src/sccsfile.rs +++ b/plib/src/sccsfile.rs @@ -167,8 +167,8 @@ fn parse_deltas(lines: &[&str]) -> Result, &'static str> { comments: String::new(), }); } else if in_delta_section { - if line.starts_with("c ") { - current_comments.push_str(&line[2..]); + if let Some(st) = line.strip_prefix("c ") { + current_comments.push_str(st); current_comments.push('\n'); } else if line.starts_with("e") { if let Some(last_delta) = deltas.last_mut() { diff --git a/plib/src/utmpx.rs b/plib/src/utmpx.rs index 42922dd5..d383a2ca 100644 --- a/plib/src/utmpx.rs +++ b/plib/src/utmpx.rs @@ -8,7 +8,7 @@ // extern crate libc; -use libc::{endutxent, getutxent, setutxent}; +use crate::platform::{self, endutxent, getutxent, setutxent}; use std::ffi::CStr; #[derive(Debug)] @@ -24,15 +24,15 @@ pub struct Utmpx { pub fn ut_type_str(typ: libc::c_short) -> &'static str { match typ { - libc::BOOT_TIME => "BOOT_TIME", - libc::DEAD_PROCESS => "DEAD_PROCESS", - libc::EMPTY => "EMPTY", - libc::INIT_PROCESS => "INIT_PROCESS", - libc::LOGIN_PROCESS => "LOGIN_PROCESS", - libc::NEW_TIME => "NEW_TIME", - libc::OLD_TIME => "OLD_TIME", - libc::RUN_LVL => "RUN_LVL", - libc::USER_PROCESS => "USER_PROCESS", + platform::BOOT_TIME => "BOOT_TIME", + platform::DEAD_PROCESS => "DEAD_PROCESS", + platform::EMPTY => "EMPTY", + platform::INIT_PROCESS => "INIT_PROCESS", + platform::LOGIN_PROCESS => "LOGIN_PROCESS", + platform::NEW_TIME => "NEW_TIME", + platform::OLD_TIME => "OLD_TIME", + platform::RUN_LVL => "RUN_LVL", + platform::USER_PROCESS => "USER_PROCESS", _ => "(unknown)", } diff --git a/process/renice.rs b/process/renice.rs index 4100aa43..7fea22d5 100644 --- a/process/renice.rs +++ b/process/renice.rs @@ -15,6 +15,7 @@ use clap::Parser; use errno::{errno, set_errno}; use gettextrs::{bind_textdomain_codeset, setlocale, textdomain, LocaleCategory}; use libc::{getpwnam, passwd}; +use plib::platform::PPriorityWhichT; use plib::PROJECT_NAME; use std::ffi::CString; use std::io; @@ -82,11 +83,7 @@ fn parse_id(which: u32, input: &str) -> Result { fn xgetpriority(which: u32, id: u32) -> io::Result { set_errno(errno::Errno(0)); - #[cfg(not(target_os = "macos"))] - let res = unsafe { libc::getpriority(which, id) }; - - #[cfg(target_os = "macos")] - let res = unsafe { libc::getpriority(which as i32, id) }; + let res = unsafe { libc::getpriority(which as PPriorityWhichT, id) }; let errno_res = errno().0; if errno_res == 0 { @@ -99,11 +96,7 @@ fn xgetpriority(which: u32, id: u32) -> io::Result { } fn xsetpriority(which: u32, id: u32, prio: i32) -> io::Result<()> { - #[cfg(not(target_os = "macos"))] - let res = unsafe { libc::setpriority(which, id, prio) }; - - #[cfg(target_os = "macos")] - let res = unsafe { libc::setpriority(which as i32, id, prio) }; + let res = unsafe { libc::setpriority(which as PPriorityWhichT, id, prio) }; if res < 0 { let e = io::Error::last_os_error(); diff --git a/sys/ipcrm.rs b/sys/ipcrm.rs index 13b7d287..ef4e3a21 100644 --- a/sys/ipcrm.rs +++ b/sys/ipcrm.rs @@ -126,6 +126,7 @@ fn sem_key_lookup(semkey: i32) -> io::Result { } // Define the union semun as per your requirements +#[cfg(not(target_env = "musl"))] #[repr(C)] union semun { val: c_int, // for SETVAL @@ -134,6 +135,7 @@ union semun { // Depending on your platform, you might need to add other fields as well } +#[cfg(not(target_env = "musl"))] fn sem_rm(semid: i32) -> io::Result { let arg = semun { val: 0 }; @@ -146,6 +148,7 @@ fn sem_rm(semid: i32) -> io::Result { } } +#[cfg(not(target_env = "musl"))] fn remove_ipcs(args: &Args) -> io::Result<()> { // remove semaphores if let Some(semkey) = args.semkey { @@ -180,6 +183,12 @@ fn remove_ipcs(args: &Args) -> io::Result<()> { Ok(()) } +#[cfg(target_env = "musl")] +fn remove_ipcs(_args: &Args) -> io::Result<()> { + // TODO + unimplemented!(); +} + fn main() -> Result<(), Box> { // parse command line arguments let args = Args::parse(); diff --git a/sys/ipcs.rs b/sys/ipcs.rs index de0645f3..75f12e9f 100644 --- a/sys/ipcs.rs +++ b/sys/ipcs.rs @@ -90,7 +90,18 @@ fn display_message_queues(_args: &Args) { break; } - let key = msg_ds.msg_perm.__key; // Ensure the correct field name for your system + let key = { + #[cfg(not(target_env = "musl"))] + { + msg_ds.msg_perm.__key // Ensure the correct field name for your system + } + + // TODO: What placeholder value should go here? + #[cfg(target_env = "musl")] + { + 0_i32 + } + }; let mode = msg_ds.msg_perm.mode; let uid = msg_ds.msg_perm.uid; let gid = msg_ds.msg_perm.gid; @@ -154,10 +165,24 @@ fn display_shared_memory(_args: &Args) { continue; } - #[cfg(target_os = "macos")] - let key = shmbuf.shm_perm._key; // Check for the correct field name on your system - #[cfg(not(target_os = "macos"))] - let key = shmbuf.shm_perm.__key; // Check for the correct field name on your system + // Prevent accidental shadowing by using a block + let key = { + #[cfg(target_os = "macos")] + { + shmbuf.shm_perm._key // Check for the correct field name on your system + } + + #[cfg(all(not(target_os = "macos"), not(target_env = "musl")))] + { + shmbuf.shm_perm.__key // Check for the correct field name on your system + } + + // TODO: What placeholder value should go here? + #[cfg(all(not(target_os = "macos"), target_env = "musl"))] + { + 0_i32 + } + }; let mode = shmbuf.shm_perm.mode; let uid = shmbuf.shm_perm.uid; let gid = shmbuf.shm_perm.gid; @@ -187,6 +212,7 @@ fn display_shared_memory(_args: &Args) { } } +#[cfg(not(target_env = "musl"))] fn display_semaphores(_args: &Args) { use libc::{semctl, semid_ds, IPC_STAT}; use std::ffi::CStr; @@ -238,6 +264,12 @@ fn display_semaphores(_args: &Args) { } } +#[cfg(target_env = "musl")] +fn display_semaphores(_args: &Args) { + // TODO + unimplemented!(); +} + fn get_current_date() -> String { // Retrieve the current date and time in a human-readable format let now = Local::now(); @@ -245,6 +277,8 @@ fn get_current_date() -> String { } fn display_ipc_status(args: &Args) { + // TODO: + // - add source println!("IPC status from {} as of {}", "source", get_current_date()); if args.message_queues { diff --git a/sys/who.rs b/sys/who.rs index ed69d6c9..06e5ec46 100644 --- a/sys/who.rs +++ b/sys/who.rs @@ -17,7 +17,7 @@ extern crate plib; use clap::Parser; use gettextrs::{bind_textdomain_codeset, gettext, setlocale, textdomain, LocaleCategory}; -use plib::PROJECT_NAME; +use plib::{platform, PROJECT_NAME}; use std::path::PathBuf; /// who - display who is on the system @@ -112,8 +112,8 @@ fn print_fmt_term(entry: &plib::utmpx::Utmpx, line: &str) { fn current_terminal() -> String { let s = plib::curuser::tty(); - if s.starts_with("/dev/") { - s[5..].to_string() + if let Some(st) = s.strip_prefix("/dev/") { + st.to_owned() } else { s } @@ -129,12 +129,12 @@ fn print_entry(args: &Args, entry: &plib::utmpx::Utmpx) { } let mut selected = false; - if (args.boot && entry.typ == libc::BOOT_TIME) - || (args.userproc && entry.typ == libc::USER_PROCESS) - || (args.dead && entry.typ == libc::DEAD_PROCESS) - || (args.login && entry.typ == libc::LOGIN_PROCESS) - || (args.runlevel && entry.typ == libc::RUN_LVL) - || (args.process && entry.typ == libc::INIT_PROCESS) + if (args.boot && entry.typ == platform::BOOT_TIME) + || (args.userproc && entry.typ == platform::USER_PROCESS) + || (args.dead && entry.typ == platform::DEAD_PROCESS) + || (args.login && entry.typ == platform::LOGIN_PROCESS) + || (args.runlevel && entry.typ == platform::RUN_LVL) + || (args.process && entry.typ == platform::INIT_PROCESS) { selected = true; } @@ -144,7 +144,7 @@ fn print_entry(args: &Args, entry: &plib::utmpx::Utmpx) { } let line = match entry.typ { - libc::BOOT_TIME => "system boot", + platform::BOOT_TIME => "system boot", _ => entry.line.as_str(), }; @@ -167,15 +167,15 @@ fn show_utmpx_entries(args: &Args) { let entries = plib::utmpx::load(); for entry in &entries { - print_entry(&args, entry); + print_entry(args, entry); } } fn show_utmpx_summary() { - let mut count = 0; + let mut count = 0_u32; let entries = plib::utmpx::load(); for entry in &entries { - if entry.user.len() > 0 { + if !entry.user.is_empty() { println!("{}", entry.user); count += 1; } @@ -192,7 +192,7 @@ fn main() -> Result<(), Box> { // parse command line arguments; if "who am i", use special args let mut args = { if am_i { - Args::parse_from(&["who", "-m"]) + Args::parse_from(["who", "-m"]) } else { Args::parse() } diff --git a/text/nl.rs b/text/nl.rs index 25442122..f1b36093 100644 --- a/text/nl.rs +++ b/text/nl.rs @@ -299,7 +299,7 @@ fn nl_main(args: &Args) -> io::Result<()> { line_number = args.starting_line_number; line_number_overflowed = false; } - println!(""); + println!(); } } else { break; diff --git a/text/paste.rs b/text/paste.rs index 44969b77..cf72cbfd 100644 --- a/text/paste.rs +++ b/text/paste.rs @@ -156,7 +156,7 @@ fn paste_files_serial(mut info: PasteInfo, mut dinfo: DelimInfo) -> io::Result<( // if EOF, output line terminator and end inner loop if n_read == 0 { - println!(""); + println!(); break; // output line segment diff --git a/text/pr.rs b/text/pr.rs index a1e009a7..b5378fd6 100644 --- a/text/pr.rs +++ b/text/pr.rs @@ -20,10 +20,10 @@ use std::process::ExitCode; use self::pr_util::{line_transform, Args, PageIterator, Parameters}; -const FORM_FEED: char = 12 as char; +const FORM_FEED: char = 12_u8 as char; const TAB: char = '\t'; -const BACKSPACE: char = 8 as char; -const ALERT: char = 7 as char; +const BACKSPACE: char = 8_u8 as char; +const ALERT: char = 7_u8 as char; const CARRIAGE_RETURN: char = '\r'; const DATE_TIME_FORMAT: &str = "%b %d %H:%M %Y"; @@ -110,7 +110,7 @@ fn print_footer(form_feed_as_page_separator: bool) { if form_feed_as_page_separator { print!("{FORM_FEED}"); } else { - println!(""); + println!(); } } @@ -254,7 +254,7 @@ fn pr_serial(path: &PathBuf, params: &Parameters) -> io::Result<()> { if !params.omit_header { print_header( &dt, - &*path.to_string_lossy(), + &path.to_string_lossy(), page_number, params.header.as_deref(), params.page_width, @@ -343,7 +343,7 @@ fn pr_serial(path: &PathBuf, params: &Parameters) -> io::Result<()> { if !params.omit_header { print_header( &dt, - &*path.to_string_lossy(), + &path.to_string_lossy(), page_number, params.header.as_deref(), params.page_width, diff --git a/text/pr_util/line_iterator.rs b/text/pr_util/line_iterator.rs index 3bdf0eba..f9ef4584 100644 --- a/text/pr_util/line_iterator.rs +++ b/text/pr_util/line_iterator.rs @@ -36,15 +36,15 @@ impl LineBreakIterator { self.buf.clear(); let num_bytes_read = self.reader.read_until(b'\n', &mut self.buf)?; - if self.buf.ends_with(&[b'\n']) { + if self.buf.ends_with(b"\n") { self.buf.pop(); - if self.buf.ends_with(&[b'\r']) { + if self.buf.ends_with(b"\r") { self.buf.pop(); } } - if self.buf.len() == 0 && num_bytes_read > 0 { + if self.buf.is_empty() && num_bytes_read > 0 { self.lines.push_back(Line { line: String::new(), ends_on_form_feed: false, diff --git a/tree/ls.rs b/tree/ls.rs index f09ec41b..fa8c81ce 100644 --- a/tree/ls.rs +++ b/tree/ls.rs @@ -11,7 +11,7 @@ mod ls_util; use clap::{CommandFactory, FromArgMatches, Parser}; use gettextrs::{bind_textdomain_codeset, gettext, setlocale, textdomain, LocaleCategory}; -use plib::PROJECT_NAME; +use plib::{platform::PIoctlOp, PROJECT_NAME}; use std::collections::HashMap; use std::ffi::{CStr, CString, OsStr, OsString}; use std::fs; @@ -584,7 +584,7 @@ fn get_terminal_width() -> usize { let mut winsize: MaybeUninit = MaybeUninit::zeroed(); let ret = libc::ioctl( libc::STDOUT_FILENO, - winsize_request_code(), + winsize_request_code() as PIoctlOp, winsize.as_mut_ptr(), ); @@ -898,7 +898,7 @@ fn display_entries(entries: &mut [Entry], config: &Config, dir_path: Option<&str } } } - println!(""); + println!(); } } OutputFormat::MultiColumnAcross => { @@ -924,7 +924,7 @@ fn display_entries(entries: &mut [Entry], config: &Config, dir_path: Option<&str { if col_idx == last_col_idx { entry.print_multi_column(padding); - println!(""); + println!(); } else { entry.print_multi_column(padding); print!("{:COLUMN_SPACING$}", ""); @@ -934,7 +934,7 @@ fn display_entries(entries: &mut [Entry], config: &Config, dir_path: Option<&str // If the last entry does not end up on the bottom right of // the grid if entries.len() % num_columns != 0 { - println!(""); + println!(); } } OutputFormat::StreamOutputFormat => { @@ -1006,7 +1006,7 @@ fn display_entries(entries: &mut [Entry], config: &Config, dir_path: Option<&str for entry in entries.iter() { entry.print_multi_column(padding); - println!(""); + println!(); } } } diff --git a/users/write.rs b/users/write.rs index 17d81b1c..df98930e 100644 --- a/users/write.rs +++ b/users/write.rs @@ -13,7 +13,7 @@ extern crate plib; use chrono::Local; use clap::Parser; use gettextrs::{bind_textdomain_codeset, gettext, setlocale, textdomain, LocaleCategory}; -use plib::PROJECT_NAME; +use plib::{platform, PROJECT_NAME}; use std::fs; use std::fs::OpenOptions; use std::io::{self, BufRead, Write}; @@ -46,7 +46,7 @@ fn select_terminal(user_name: &str) -> String { // Filter the entries to find terminals for the specified user let user_entries: Vec<_> = entries .into_iter() - .filter(|entry| entry.user == user_name && entry.typ == libc::USER_PROCESS) + .filter(|entry| entry.user == user_name && entry.typ == platform::USER_PROCESS) .collect(); if user_entries.is_empty() {