clippy: Fix several clippy issues

In order to enable several clippy lint groups fix several findings.
This commit is contained in:
finga 2023-10-14 12:29:14 +02:00
parent 33ccfd1004
commit ed4334061d
3 changed files with 78 additions and 87 deletions

14
CHANGELOG.md Normal file
View file

@ -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.

View file

@ -5,6 +5,9 @@ edition = "2018"
authors = ["finga <mqrs@onders.org>"] authors = ["finga <mqrs@onders.org>"]
repository = "https://git.onders.org/finga/mqrs" repository = "https://git.onders.org/finga/mqrs"
license = "GPL-3.0-or-later" 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] [dependencies]
libc = "0.2.98" libc = "0.2.98"

View file

@ -1,6 +1,5 @@
use libc::{ use libc::{
msgctl, msgget, msginfo, msqid_ds, IPC_CREAT, IPC_EXCL, IPC_INFO, IPC_NOWAIT, IPC_PRIVATE, msgctl, msgget, msqid_ds, IPC_CREAT, IPC_INFO, IPC_NOWAIT, IPC_RMID, MSG_INFO, MSG_STAT,
IPC_RMID, IPC_SET, IPC_STAT, MSG_COPY, MSG_EXCEPT, MSG_INFO, MSG_NOERROR, MSG_STAT,
}; };
use nix::errno::{errno, Errno}; use nix::errno::{errno, Errno};
use std::{marker::PhantomData, mem::MaybeUninit, ptr}; use std::{marker::PhantomData, mem::MaybeUninit, ptr};
@ -12,50 +11,15 @@ pub enum SysvMqError {
ErrnoError(&'static str), ErrnoError(&'static str),
} }
/// IPC bit flags #[allow(clippy::doc_markdown)]
#[repr(i32)] /// Unlink (delete) an existing SysV IPC message queue.
pub enum Flags { ///
/// Create key if key does not exist. /// # Errors
CreateKey = IPC_CREAT, ///
/// Fail if key exists. /// Return an `SysvMqError` when no queue with the given key can be
Exclusive = IPC_EXCL, /// found.
/// 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,
}
pub fn unlink_id(id: i32) -> Result<(), SysvMqError> { pub fn unlink_id(id: i32) -> Result<(), SysvMqError> {
let res = unsafe { let res = unsafe { msgctl(id, IPC_RMID, ptr::null::<msqid_ds>().cast_mut()) };
msgctl(
id,
ControlCommands::Remove as i32,
ptr::null::<msqid_ds>() as *mut msqid_ds,
)
};
match res { match res {
-1 => Err(SysvMqError::ErrnoError(Errno::from_i32(errno()).desc())), -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<i32, SysvMqError> { pub fn id_from_key(key: i32) -> Result<i32, SysvMqError> {
let id = unsafe { msgget(key, 0) }; let id = unsafe { msgget(key, 0) };
@ -72,54 +44,43 @@ pub fn id_from_key(key: i32) -> Result<i32, SysvMqError> {
} }
} }
pub fn ipc_info(id: i32) -> Result<(), SysvMqError> { #[allow(clippy::doc_markdown)]
let mut msginfo = MaybeUninit::<msginfo>::uninit(); /// Get the info about an existing SysV IPC message queue.
pub fn ipc_info(id: i32) {
let mut ipc_info = MaybeUninit::<msqid_ds>::uninit();
unsafe { let ipc_info = unsafe {
msgctl( msgctl(id, IPC_INFO, ipc_info.as_mut_ptr());
id, ipc_info.assume_init()
ControlCommands::IpcInfo as i32, };
msginfo.as_mut_ptr() as *mut msqid_ds,
);
}
let msginfo = unsafe { msginfo.assume_init() }; println!("info: {ipc_info:?}");
println!("info: {:?}", msginfo);
Ok(())
} }
pub fn stat_info(id: i32) -> Result<(), SysvMqError> { #[allow(clippy::doc_markdown)]
let mut msginfo = MaybeUninit::<msqid_ds>::uninit(); /// Get the stats about an existing SysV IPC message queue.
pub fn stat_info(id: i32) {
let mut stat_info = MaybeUninit::<msqid_ds>::uninit();
unsafe { let stat_info = unsafe {
msgctl(id, ControlCommands::Stat as i32, msginfo.as_mut_ptr()); msgctl(id, MSG_STAT, stat_info.as_mut_ptr());
} stat_info.assume_init()
};
let msginfo = unsafe { msginfo.assume_init() }; println!("info: {stat_info:?}");
println!("info: {:?}", msginfo);
Ok(())
} }
pub fn msg_info(id: i32) -> Result<(), SysvMqError> { #[allow(clippy::doc_markdown)]
let mut msginfo = MaybeUninit::<msginfo>::uninit(); /// Get the message info about an existing SysV IPC message queue.
pub fn msg_info(id: i32) {
let mut msg_info = MaybeUninit::<msqid_ds>::uninit();
unsafe { let msg_info = unsafe {
msgctl( msgctl(id, MSG_INFO, msg_info.as_mut_ptr());
id, msg_info.assume_init()
ControlCommands::MsgInfo as i32, };
msginfo.as_mut_ptr() as *mut msqid_ds,
);
}
let msginfo = unsafe { msginfo.assume_init() }; println!("info: {msg_info:?}");
println!("info: {:?}", msginfo);
Ok(())
} }
pub struct SysvMq<T> { pub struct SysvMq<T> {
@ -131,9 +92,15 @@ pub struct SysvMq<T> {
} }
impl<T> SysvMq<T> { impl<T> SysvMq<T> {
/// 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> { pub fn create(&mut self, key: i32) -> Result<&Self, SysvMqError> {
self.key = key; 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 { match self.id {
-1 => Err(SysvMqError::ErrnoError(Errno::from_i32(errno()).desc())), -1 => Err(SysvMqError::ErrnoError(Errno::from_i32(errno()).desc())),
@ -141,6 +108,12 @@ impl<T> SysvMq<T> {
} }
} }
/// 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, SysvMqError> { pub fn open(mut self, key: i32) -> Result<Self, SysvMqError> {
self.key = key; self.key = key;
self.id = unsafe { msgget(self.key, self.mode) }; self.id = unsafe { msgget(self.key, self.mode) };
@ -157,12 +130,13 @@ impl<T> SysvMq<T> {
} }
pub fn nonblocking(&mut self) -> &Self { pub fn nonblocking(&mut self) -> &Self {
self.message_mask |= Flags::NoWait as i32; self.message_mask |= IPC_NOWAIT;
self self
} }
pub fn new() -> Self { #[must_use]
SysvMq { pub const fn new() -> Self {
Self {
id: -1, id: -1,
key: 0, key: 0,
message_mask: 0, message_mask: 0,