diff --git a/CHANGELOG.md b/CHANGELOG.md index 197ad70..a22a21b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,5 +10,7 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Changed +- Fix several clippy findings in preperation to enable several lint + groups. - Update to the latest version of **clap**. - Update all dependencies that should not break SemVer. diff --git a/src/posix/create.rs b/src/posix/create.rs index cceabde..d0c5462 100644 --- a/src/posix/create.rs +++ b/src/posix/create.rs @@ -22,17 +22,13 @@ pub struct Create { } fn msgsize_default() -> usize { - match fs::read_to_string("/proc/sys/fs/mqueue/msgsize_default") { - Ok(m) => m.trim().parse::().expect("can never fail"), - _ => 8192, - } + fs::read_to_string("/proc/sys/fs/mqueue/msgsize_default") + .map_or(8192, |m| m.trim().parse::().expect("can never fail")) } fn msg_default() -> usize { - match fs::read_to_string("/proc/sys/fs/mqueue/msg_default") { - Ok(m) => m.trim().parse::().expect("can never fail"), - _ => 10, - } + fs::read_to_string("/proc/sys/fs/mqueue/msg_default") + .map_or(10, |m| m.trim().parse::().expect("can never fail")) } impl Create { diff --git a/src/posix/list.rs b/src/posix/list.rs index 57fa45d..dec0a48 100644 --- a/src/posix/list.rs +++ b/src/posix/list.rs @@ -14,12 +14,13 @@ pub struct List { impl List { pub fn run(&self) -> Result<()> { - match self.all { - false => println!("Name"), - true => println!( + if self.all { + println!( "{0: <10} {1: <10} {2: <12} {3: <26} {4: <26}", "Name", "Size", "Permissions", "Modified", "Accessed", - ), + ); + } else { + println!("Name"); } for mq in fs::read_dir("/dev/mqueue")? { diff --git a/src/posix/recv.rs b/src/posix/recv.rs index c3abb66..bb1ac51 100644 --- a/src/posix/recv.rs +++ b/src/posix/recv.rs @@ -36,7 +36,7 @@ fn print_message(priority: u32, length: usize, timestamp: bool, msg: &str) { println!("{}", Local::now()); } - println!("{}", msg); + println!("{msg}"); } impl Recv { diff --git a/src/sysv/create.rs b/src/sysv/create.rs index 4adad77..6417e6c 100644 --- a/src/sysv/create.rs +++ b/src/sysv/create.rs @@ -3,7 +3,8 @@ use clap::Parser; use log::info; use sysvmq::SysvMq; -/// Create a SysV message queue +#[allow(clippy::doc_markdown)] +/// Create a SysV IPC message queue #[derive(Debug, Parser)] pub struct Create { /// Permissions (octal) to create the queue with (default: 0644) diff --git a/src/sysv/info.rs b/src/sysv/info.rs index 77d4b3e..890f1f1 100644 --- a/src/sysv/info.rs +++ b/src/sysv/info.rs @@ -17,8 +17,8 @@ pub struct Info { } fn print_line(line: &str) { - for field in line.split_whitespace().collect::>() { - print!("{0: <10}", field); + for field in line.split_whitespace() { + print!("{field: <10}"); } println!(); diff --git a/src/sysv/list.rs b/src/sysv/list.rs index 7c12f16..831ed6f 100644 --- a/src/sysv/list.rs +++ b/src/sysv/list.rs @@ -10,10 +10,11 @@ use std::{ pub struct List {} impl List { + #[allow(clippy::unused_self)] pub fn run(&self) -> Result<()> { for line in BufReader::new(File::open("/proc/sysvipc/msg")?).lines() { - for field in line?.split_whitespace().collect::>() { - print!("{0: <10}", field); + for field in line?.split_whitespace() { + print!("{field: <10}"); } println!(); diff --git a/sysvmq/CHANGELOG.md b/sysvmq/CHANGELOG.md new file mode 100644 index 0000000..eb9a1f0 --- /dev/null +++ b/sysvmq/CHANGELOG.md @@ -0,0 +1,14 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a +Changelog](https://keepachangelog.com/en/1.0.0/), and this project +adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Changed + +- Fix several clippy findings in preperation to enable several lint + groups. diff --git a/sysvmq/Cargo.toml b/sysvmq/Cargo.toml index a2cee0f..1b7f1a1 100644 --- a/sysvmq/Cargo.toml +++ b/sysvmq/Cargo.toml @@ -5,6 +5,9 @@ edition = "2018" authors = ["finga "] repository = "https://git.onders.org/finga/mqrs" license = "GPL-3.0-or-later" +description = "A simple API for SysV IPC message queues." +keywords = ["message_queue", "mq", "mqueue", "queue", "sysv", "ipc"] +categories = ["os"] [dependencies] libc = "0.2.98" diff --git a/sysvmq/src/lib.rs b/sysvmq/src/lib.rs index 298a48e..7bd6cfb 100644 --- a/sysvmq/src/lib.rs +++ b/sysvmq/src/lib.rs @@ -1,6 +1,5 @@ use libc::{ - msgctl, msgget, msginfo, msqid_ds, IPC_CREAT, IPC_EXCL, IPC_INFO, IPC_NOWAIT, IPC_PRIVATE, - IPC_RMID, IPC_SET, IPC_STAT, MSG_COPY, MSG_EXCEPT, MSG_INFO, MSG_NOERROR, MSG_STAT, + msgctl, msgget, msqid_ds, IPC_CREAT, IPC_INFO, IPC_NOWAIT, IPC_RMID, MSG_INFO,g MSG_STAT, }; use nix::errno::{errno, Errno}; use std::{marker::PhantomData, mem::MaybeUninit, ptr}; @@ -12,50 +11,15 @@ pub enum SysvMqError { ErrnoError(&'static str), } -/// IPC bit flags -#[repr(i32)] -pub enum Flags { - /// Create key if key does not exist. - CreateKey = IPC_CREAT, - /// Fail if key exists. - Exclusive = IPC_EXCL, - /// Return error on wait. - NoWait = IPC_NOWAIT, - /// No error if message is too big. - NoError = MSG_NOERROR, - /// Receive any message except of specified type. - Except = MSG_EXCEPT, - /// Copy (not remove) all queue messages. - Copy = MSG_COPY, - /// Private key (Special key value). - Private = IPC_PRIVATE, -} - -/// Commands for `msgctl()` -#[repr(i32)] -pub enum ControlCommands { - /// Remove identifier (Control command for `msgctl`, `semctl`, and `shmctl`). - Remove = IPC_RMID, - /// Set `ipc_perm` options (Control command for `msgctl`, `semctl`, and `shmctl`). - SetPerm = IPC_SET, - /// Get `ipc_perm` options (Control command for `msgctl`, `semctl`, and `shmctl`). - GetPerm = IPC_STAT, - /// See ipcs (Control command for `msgctl`, `semctl`, and `shmctl`). - IpcInfo = IPC_INFO, - /// IPCS control command. - Stat = MSG_STAT, - /// IPCS control command. - MsgInfo = MSG_INFO, -} - +#[allow(clippy::doc_markdown)] +/// Unlink (delete) an existing SysV IPC message queue. +/// +/// # Errors +/// +/// Return an `SysvMqError` when no queue with the given key can be +/// found. pub fn unlink_id(id: i32) -> Result<(), SysvMqError> { - let res = unsafe { - msgctl( - id, - ControlCommands::Remove as i32, - ptr::null::() as *mut msqid_ds, - ) - }; + let res = unsafe { msgctl(id, IPC_RMID, ptr::null::().cast_mut()) }; match res { -1 => Err(SysvMqError::ErrnoError(Errno::from_i32(errno()).desc())), @@ -63,6 +27,14 @@ pub fn unlink_id(id: i32) -> Result<(), SysvMqError> { } } +#[allow(clippy::doc_markdown)] +/// Get the id of an existing SysV IPC message queue by passing its +/// key. +/// +/// # Errors +/// +/// Return an `SysvMqError` when no queue with the given key can be +/// found. pub fn id_from_key(key: i32) -> Result { let id = unsafe { msgget(key, 0) }; @@ -72,54 +44,43 @@ pub fn id_from_key(key: i32) -> Result { } } -pub fn ipc_info(id: i32) -> Result<(), SysvMqError> { - let mut msginfo = MaybeUninit::::uninit(); +#[allow(clippy::doc_markdown)] +/// Get the info about an existing SysV IPC message queue. +pub fn ipc_info(id: i32) { + let mut ipc_info = MaybeUninit::::uninit(); - unsafe { - msgctl( - id, - ControlCommands::IpcInfo as i32, - msginfo.as_mut_ptr() as *mut msqid_ds, - ); - } + let ipc_info = unsafe { + msgctl(id, IPC_INFO, ipc_info.as_mut_ptr()); + ipc_info.assume_init() + }; - let msginfo = unsafe { msginfo.assume_init() }; - - println!("info: {:?}", msginfo); - - Ok(()) + println!("info: {ipc_info:?}"); } -pub fn stat_info(id: i32) -> Result<(), SysvMqError> { - let mut msginfo = MaybeUninit::::uninit(); +#[allow(clippy::doc_markdown)] +/// Get the stats about an existing SysV IPC message queue. +pub fn stat_info(id: i32) { + let mut stat_info = MaybeUninit::::uninit(); - unsafe { - msgctl(id, ControlCommands::Stat as i32, msginfo.as_mut_ptr()); - } + let stat_info = unsafe { + msgctl(id, MSG_STAT, stat_info.as_mut_ptr()); + stat_info.assume_init() + }; - let msginfo = unsafe { msginfo.assume_init() }; - - println!("info: {:?}", msginfo); - - Ok(()) + println!("info: {stat_info:?}"); } -pub fn msg_info(id: i32) -> Result<(), SysvMqError> { - let mut msginfo = MaybeUninit::::uninit(); +#[allow(clippy::doc_markdown)] +/// Get the message info about an existing SysV IPC message queue. +pub fn msg_info(id: i32) { + let mut msg_info = MaybeUninit::::uninit(); - unsafe { - msgctl( - id, - ControlCommands::MsgInfo as i32, - msginfo.as_mut_ptr() as *mut msqid_ds, - ); - } + let msg_info = unsafe { + msgctl(id, MSG_INFO, msg_info.as_mut_ptr()); + msg_info.assume_init() + }; - let msginfo = unsafe { msginfo.assume_init() }; - - println!("info: {:?}", msginfo); - - Ok(()) + println!("info: {msg_info:?}"); } pub struct SysvMq { @@ -131,9 +92,15 @@ pub struct SysvMq { } impl SysvMq { + /// Create a new message queye with the given key. + /// + /// # Errors + /// + /// Return an `SysvMqError` when no queue with the given key can be + /// created. pub fn create(&mut self, key: i32) -> Result<&Self, SysvMqError> { self.key = key; - self.id = unsafe { msgget(self.key, Flags::CreateKey as i32 | self.mode) }; + self.id = unsafe { msgget(self.key, IPC_CREAT | self.mode) }; match self.id { -1 => Err(SysvMqError::ErrnoError(Errno::from_i32(errno()).desc())), @@ -141,6 +108,12 @@ impl SysvMq { } } + /// Open an existing message queye with the given key. + /// + /// # Errors + /// + /// Return an `SysvMqError` when no queue with the given key can be + /// found. pub fn open(mut self, key: i32) -> Result { self.key = key; self.id = unsafe { msgget(self.key, self.mode) }; @@ -157,12 +130,13 @@ impl SysvMq { } pub fn nonblocking(&mut self) -> &Self { - self.message_mask |= Flags::NoWait as i32; + self.message_mask |= IPC_NOWAIT; self } - pub fn new() -> Self { - SysvMq { + #[must_use] + pub const fn new() -> Self { + Self { id: -1, key: 0, message_mask: 0,