diff --git a/Cargo.lock b/Cargo.lock index dc36e4c..3c4a517 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.51" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b26702f315f53b6071259e15dd9d64528213b44d61de1ec926eca7715d62203" +checksum = "15af2628f6890fe2609a3b91bef4c83450512802e59489f9c1cb1fa5df064a61" [[package]] name = "atty" @@ -42,9 +42,9 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "cc" -version = "1.0.72" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" [[package]] name = "cfg-if" @@ -67,9 +67,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.0.0-beta.5" +version = "3.0.0-beta.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feff3878564edb93745d58cf63e17b63f24142506e7a20c87a5521ed7bfb1d63" +checksum = "4bd1061998a501ee7d4b6d449020df3266ca3124b941ec56cf2005c3779ca142" dependencies = [ "atty", "bitflags", @@ -80,14 +80,15 @@ dependencies = [ "strsim", "termcolor", "textwrap", - "unicase", + "unicode-width", + "vec_map", ] [[package]] name = "clap_derive" -version = "3.0.0-beta.5" +version = "3.0.0-beta.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b15c6b4f786ffb6192ffe65a36855bc1fc2444bcd0945ae16748dcd6ed7d0d3" +checksum = "370f715b81112975b1b69db93e0b56ea4cd4e5002ac43b2da8474106a54096a1" dependencies = [ "heck", "proc-macro-error", @@ -157,9 +158,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.108" +version = "0.2.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8521a1b57e76b1ec69af7599e75e38e7b7fad6610f037db8c79b127201b5d119" +checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" [[package]] name = "log" @@ -172,9 +173,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.4.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" [[package]] name = "memoffset" @@ -201,9 +202,9 @@ dependencies = [ [[package]] name = "nix" -version = "0.21.2" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77d9f3521ea8e0641a153b3cddaf008dcbf26acd4ed739a2517295e0760d12c7" +checksum = "5c3728fec49d363a50a8828a190b379a446cc5cf085c06259bbbeb34447e4ec7" dependencies = [ "bitflags", "cc", @@ -233,12 +234,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "4.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addaa943333a514159c80c97ff4a93306530d965d27e139188283cd13e06a799" -dependencies = [ - "memchr", -] +checksum = "afb2e1c3ee07430c2cf76151675e583e0f19985fa6efae47d6848a3e2c824f85" [[package]] name = "posixmq" @@ -275,18 +273,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.32" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ "unicode-xid", ] [[package]] name = "quote" -version = "1.0.10" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ "proc-macro2", ] @@ -316,9 +314,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.82" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" dependencies = [ "proc-macro2", "quote", @@ -345,27 +343,27 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.14.2" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80" +checksum = "203008d98caf094106cfaba70acfed15e18ed3ddb7d94e49baec153a2b462789" dependencies = [ "unicode-width", ] [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" dependencies = [ "proc-macro2", "quote", @@ -383,15 +381,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-segmentation" version = "1.8.0" @@ -400,9 +389,9 @@ checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" [[package]] name = "unicode-width" -version = "0.1.9" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" [[package]] name = "unicode-xid" @@ -410,6 +399,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "version_check" version = "0.9.3" diff --git a/Cargo.toml b/Cargo.toml index f8005b0..edbaea8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,11 +2,11 @@ name = "mqrs" version = "0.1.1" authors = ["finga "] -edition = "2021" +edition = "2018" repository = "https://git.onders.org/finga/mqrs" license = "GPL-3.0-or-later" readme = "README.md" -description = "A CLI program for interacting with different kinds of message queues." +description = "A CLI program for interacting with Posix Message Queues." keywords = ["message_queue", "mq", "mqueue", "queue"] categories = ["command-line-utilities"] @@ -24,7 +24,7 @@ sysvmq = { path = "sysvmq" } members = ["sysvmq"] [package.metadata.deb] -extended-description = "`mqrs` is a small cli application to handle different kinds of message queues." +extended-description = "`mqrs` is a small cli application to handle POSIX message queues." assets = [ ["target/release/mqrs", "usr/bin/", "755"], ["README.md", "usr/share/doc/cargo-deb/README.md", "644"], diff --git a/README.md b/README.md index 9e73663..e7251f7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # mqrs -`mqrs` is a small cli application to handle different kinds of message -queues. +`mqrs` is a small cli application to handle POSIX message queues. ## Install `mqrs` For information about how to build, install and run `mqrs` please see @@ -9,8 +8,8 @@ For information about how to build, install and run `mqrs` please see ## Using `mqrs` Depending on which backend you want to use there are different subsets of subcommands. Following backends are supported: -- `posix`: Use POSIX message queues -- `sysv`: Use SysV IPC message queues +- `posix`: Uses POSIX message queues +- `sysv`: Uses SysV IPC message queues If a command is clearly distinguishable from all the others, it does not have to be completed further. @@ -67,16 +66,6 @@ queue. Following optional arguments are supported: - `-m`, `--mode`: Permissions (octal) to create the queue with. Default: 0644. -#### Print information about a message queue -Use the `info` command to print further information about a message -queue. Exactly of the following arguments is mandatory: -- `-i`, `--id id`: Id of the queue -- `-k`, `--key key`: Key of the queue - -#### List all message queues -Use the `list` command to print a list of all message queues. No -further arguments are supported. - #### Delete a message queue Use the `unlink` command to delete a message queue. This can either be done by providing a `key` or an `id` of the queue: diff --git a/mqrs.1 b/mqrs.1 index ce48a87..eb7b912 100644 --- a/mqrs.1 +++ b/mqrs.1 @@ -41,7 +41,7 @@ The POSIX backend supports six commands: and .B recv . -.SS posix create [FLAGS] [OPTIONS] \fI\fP +.SS create [FLAGS] [OPTIONS] \fI\fP Create a new POSIX message queue. .TP 8 .SS ARGS @@ -72,7 +72,7 @@ Message size in bytes .B \-m, \-\-mode \fI\fP Permissions (octal) to create the queue with .RE -.SS posix help [SUBCOMMAND] +.SS help [SUBCOMMAND] Prints this message or the help of the given subcommand. .TP 8 .SS ARGS @@ -81,7 +81,7 @@ Prints this message or the help of the given subcommand. .B \fI\fP Show help for \fISUBCOMMAND\fP .RE -.SS posix info [FLAGS] \fI\fP +.SS info [FLAGS] \fI\fP Print further information about an existing message queue. .TP 8 .SS ARGS @@ -100,7 +100,7 @@ Prints help information .B \-v, \-\-verbose Produce verbose output .RE -.SS posix list [FLAGS] +.SS list [FLAGS] Print a list of all existing POSIX message queues. .TP 8 .SS FLAGS @@ -115,7 +115,7 @@ Produce verbose output .B \-a, \-\-all Print all available information .RE -.SS posix recv [FLAGS] [OPTIONS] \fI\fP +.SS recv [FLAGS] [OPTIONS] \fI\fP Receive and print one or more messages message from a message queue. .TP 8 .SS ARGS @@ -153,7 +153,7 @@ Deadline until messages are received (format: "%Y-%m-%d %H:%M:%S") .B \-o, \-\-timeout \fI\fP Timeout as for example in "5h 23min 42ms" .RE -.SS posix send [FLAGS] [OPTIONS] \fI\fP \fI\fP +.SS send [FLAGS] [OPTIONS] \fI\fP \fI\fP Send a message to a message queue. .TP 8 .SS ARGS @@ -191,7 +191,7 @@ Set a different priority than default, priority >= 0 [default: 0] .B \-o, \-\-timeout \fI\fP Timeout as for example in "5h 23min 42ms" .RE -.SS posix unlink [FLAGS] \fI\fP +.SS unlink [FLAGS] \fI\fP Delete an existing POSIX message queue. .TP 8 .SS ARGS @@ -211,16 +211,12 @@ Prints help information Produce verbose output .RE .SH SYSV IPC MESSAGE QUEUE SUBCOMMANDS -The SysV IPC backend supports four commands: +The SysV IPC backend supports two commands: .B create\ -, -.B info\ -, -.B list and .B unlink\ . -.SS sysv create [FLAGS] [OPTIONS] \fI\fP +.SS create [FLAGS] [OPTIONS] \fI\fP Create a new SysV IPC message queue. .TP 8 .SS ARGS @@ -245,51 +241,7 @@ Produce verbose output .B \-m, \-\-mode \fI\fP Permissions (octal) to create the queue with (default: 0644) .RE -.SS sysv help [SUBCOMMAND] -Prints this message or the help of the given subcommand. -.TP 8 -.SS ARGS -.RS -.TP 8 -.B \fI\fP -Show help for \fISUBCOMMAND\fP -.RE -.SS sysv info [FLAGS] [OPTIONS] -Print further information about an existing message queue. Exactly of -the OPTION arguments is mandatory. -.TP 8 -.SS FLAGS -.RS -.TP 8 -.B \-h, \-\-help -Prints help information -.TP 8 -.B \-v, \-\-verbose -Produce verbose output -.RE -.TP 8 -.SS OPTIONS -.RS -.TP 8 -.B \-i, \-\-id \fI\fP -Id of the queue -.TP 8 -.B \-k, \-\-key \fI\fP -Key of the queue -.RE -.SS sysv list [FLAGS] -Print a list of all existing SysV IPC message queues. -.TP 8 -.SS FLAGS -.RS -.TP 8 -.B \-h, \-\-help -Prints help information -.TP 8 -.B \-v, \-\-verbose -Produce verbose output -.RE -.SS sysv unlink [FLAGS] [OPTIONS] +.SS unlink [FLAGS] [OPTIONS] Delete an existing SysV IPC message queue. It is mandatory to pass exactly one OPTION. .TP 8 @@ -319,7 +271,7 @@ Id of the queue Key of the queue .RE .SH SEE ALSO -mq_overview(7), sysvipc(7) +mq_overview(7) .SH BUGS No known bugs. .SH AUTHOR diff --git a/src/main.rs b/src/main.rs index c4b0787..5e4db83 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,20 +1,18 @@ use anyhow::Result; -use clap::{crate_authors, crate_version, AppSettings, Parser}; +use clap::{crate_authors, crate_version, AppSettings, Clap}; mod posix; mod sysv; -#[derive(Debug, Parser)] +#[derive(Clap, Debug)] enum Backend { /// Handle POSIX message queues - #[clap(subcommand)] Posix(PosixCommand), /// Handle SysV message queues - #[clap(subcommand)] Sysv(SysvCommand), } -#[derive(Debug, Parser)] +#[derive(Clap, Debug)] enum PosixCommand { Create(posix::Create), Info(posix::Info), @@ -24,20 +22,18 @@ enum PosixCommand { Recv(posix::Recv), } -#[derive(Debug, Parser)] +#[derive(Clap, Debug)] enum SysvCommand { Create(sysv::Create), - Info(sysv::Info), - List(sysv::List), Unlink(sysv::Unlink), } -#[derive(Debug, Parser)] +#[derive(Clap, Debug)] #[clap( version = crate_version!(), author = crate_authors!(", "), setting = AppSettings::SubcommandRequiredElseHelp, - global_setting = AppSettings::PropagateVersion, + global_setting = AppSettings::VersionlessSubcommands, global_setting = AppSettings::InferSubcommands, )] struct Opts { @@ -73,8 +69,6 @@ fn main() -> Result<()> { }, Backend::Sysv(s) => match s { SysvCommand::Create(c) => c.run()?, - SysvCommand::Info(i) => i.run()?, - SysvCommand::List(l) => l.run()?, SysvCommand::Unlink(u) => u.run()?, }, } diff --git a/src/posix/mod.rs b/src/posix.rs similarity index 100% rename from src/posix/mod.rs rename to src/posix.rs diff --git a/src/posix/create.rs b/src/posix/create.rs index cceabde..be4606b 100644 --- a/src/posix/create.rs +++ b/src/posix/create.rs @@ -1,11 +1,11 @@ use anyhow::Result; -use clap::Parser; +use clap::Clap; use log::{info, log_enabled, Level::Info}; use posixmq::PosixMq; use std::fs; /// Create a POSIX message queue -#[derive(Debug, Parser)] +#[derive(Clap, Debug)] pub struct Create { /// Permissions (octal) to create the queue with #[clap(short, long)] @@ -40,7 +40,7 @@ impl Create { let mq = &mut posixmq::OpenOptions::readonly(); if let Some(m) = &self.mode { - mq.mode(u32::from_str_radix(m, 8)?); + mq.mode(u32::from_str_radix(&m, 8)?); } mq.max_msg_len(self.msgsize.unwrap_or_else(msgsize_default)) @@ -53,10 +53,10 @@ impl Create { let attributes = mq.attributes()?; info!("Created message queue: {} with attributes msgsize: {}, capacity: {}, current_messages: {}", - self.queue, - attributes.max_msg_len, - attributes.capacity, - attributes.current_messages); + &self.queue, + &attributes.max_msg_len, + &attributes.capacity, + &attributes.current_messages); } Ok(()) diff --git a/src/posix/info.rs b/src/posix/info.rs index 2a95f6b..0fd1e76 100644 --- a/src/posix/info.rs +++ b/src/posix/info.rs @@ -1,13 +1,13 @@ use anyhow::Result; -use clap::Parser; +use clap::Clap; use posixmq::PosixMq; /// Print information about an existing message queue -#[derive(Debug, Parser)] +#[derive(Clap, Debug)] pub struct Info { /// Name of the queue #[clap(value_name = "QUEUE")] - queue: String, + pub queue: String, } impl Info { @@ -16,7 +16,7 @@ impl Info { println!( "Message queue: {}, msg_max: {}, msgsize_max: {}, current_messages: {}", - self.queue, attrs.capacity, attrs.max_msg_len, attrs.current_messages + &self.queue, &attrs.capacity, &attrs.max_msg_len, &attrs.current_messages ); Ok(()) diff --git a/src/posix/list.rs b/src/posix/list.rs index 57fa45d..54c031a 100644 --- a/src/posix/list.rs +++ b/src/posix/list.rs @@ -1,11 +1,11 @@ use anyhow::{anyhow, Result}; use chrono::{DateTime, Local}; -use clap::Parser; +use clap::Clap; use log::warn; use std::{fs, os::unix::fs::PermissionsExt}; -/// Print a list of existing message queues -#[derive(Debug, Parser)] +/// Print information about an existing message queue +#[derive(Clap, Debug)] pub struct List { /// Show all parameters #[clap(short, long)] diff --git a/src/posix/recv.rs b/src/posix/recv.rs index c3abb66..0b8563a 100644 --- a/src/posix/recv.rs +++ b/src/posix/recv.rs @@ -1,32 +1,32 @@ use anyhow::Result; use chrono::{DateTime, Local}; -use clap::Parser; +use clap::Clap; use humantime::Duration; use log::info; use posixmq::PosixMq; use std::str; /// Receive and print a message from a message queue -#[derive(Debug, Parser)] +#[derive(Clap, Debug)] pub struct Recv { /// Do not block #[clap(short, long)] - non_blocking: bool, + pub non_blocking: bool, /// Print messages as they are received #[clap(short, long)] - follow: bool, + pub follow: bool, /// Print a timestamp before each message #[clap(short, long)] - timestamp: bool, + pub timestamp: bool, /// Timeout, example "5h 23min 42ms" #[clap(short = 'o', long, conflicts_with = "deadline")] - timeout: Option, + pub timeout: Option, /// Deadline until messages are received (format: "%Y-%m-%d %H:%M:%S") #[clap(short, long, conflicts_with = "timeout")] - deadline: Option, + pub deadline: Option, /// Name of the queue #[clap(value_name = "QUEUE")] - queue: String, + pub queue: String, } fn print_message(priority: u32, length: usize, timestamp: bool, msg: &str) { diff --git a/src/posix/send.rs b/src/posix/send.rs index 6dd70de..917679b 100644 --- a/src/posix/send.rs +++ b/src/posix/send.rs @@ -1,30 +1,30 @@ use anyhow::Result; use chrono::DateTime; -use clap::Parser; +use clap::Clap; use humantime::Duration; use log::info; /// Send a message to a message queue -#[derive(Debug, Parser)] +#[derive(Clap, Debug)] pub struct Send { /// Set a different priority, priority >= 0 #[clap(short, long, default_value = "0")] - priority: u32, + pub priority: u32, /// Do not block #[clap(short, long)] - non_blocking: bool, + pub non_blocking: bool, /// Timeout, example "5h 23min 42ms" #[clap(short = 'o', long, conflicts_with = "deadline")] - timeout: Option, + pub timeout: Option, /// Deadline until messages are sent (format: "%Y-%m-%d %H:%M:%S") #[clap(short, long, conflicts_with = "timeout")] - deadline: Option, + pub deadline: Option, /// Name of the queue #[clap(value_name = "QUEUE")] - queue: String, + pub queue: String, /// Message to be sent to the queue #[clap(value_name = "MESSAGE")] - msg: String, + pub msg: String, } impl Send { @@ -38,24 +38,24 @@ impl Send { if let Some(timeout) = &self.timeout { mq.open(&self.queue)?.send_timeout( self.priority, - self.msg.as_bytes(), + &self.msg.as_bytes(), *timeout.parse::()?, )?; - info!("Sent message: \"{}\" to queue: {}", self.msg, self.queue); + info!("Sent message: \"{}\" to queue: {}", &self.msg, &self.queue); } else if let Some(deadline) = &self.deadline { mq.open(&self.queue)?.send_deadline( self.priority, - self.msg.as_bytes(), + &self.msg.as_bytes(), DateTime::parse_from_str(deadline, "%Y-%m-%d %H:%M:%S")?.into(), )?; - info!("Sent message: \"{}\" to queue: {}", self.msg, self.queue); + info!("Sent message: \"{}\" to queue: {}", &self.msg, &self.queue); } else { mq.open(&self.queue)? - .send(self.priority, self.msg.as_bytes())?; + .send(self.priority, &self.msg.as_bytes())?; - info!("Sent message: \"{}\" to queue: {}", self.msg, self.queue); + info!("Sent message: \"{}\" to queue: {}", &self.msg, &self.queue); } Ok(()) diff --git a/src/posix/unlink.rs b/src/posix/unlink.rs index 75a8bd2..4b89a27 100644 --- a/src/posix/unlink.rs +++ b/src/posix/unlink.rs @@ -1,9 +1,9 @@ use anyhow::Result; -use clap::Parser; +use clap::Clap; use log::info; /// Delete a message queue -#[derive(Debug, Parser)] +#[derive(Clap, Debug)] pub struct Unlink { /// Name of the queue #[clap(value_name = "QUEUE")] @@ -14,7 +14,7 @@ impl Unlink { pub fn run(&self) -> Result<()> { posixmq::remove_queue(&self.queue)?; - info!("Removed message queue: {}", self.queue); + info!("Removed message queue: {}", &self.queue); Ok(()) } diff --git a/src/sysv/mod.rs b/src/sysv.rs similarity index 54% rename from src/sysv/mod.rs rename to src/sysv.rs index 7270e78..91ee1a5 100644 --- a/src/sysv/mod.rs +++ b/src/sysv.rs @@ -1,9 +1,5 @@ mod create; -mod info; -mod list; mod unlink; pub use create::Create; -pub use info::Info; -pub use list::List; pub use unlink::Unlink; diff --git a/src/sysv/create.rs b/src/sysv/create.rs index 4adad77..e4b03a6 100644 --- a/src/sysv/create.rs +++ b/src/sysv/create.rs @@ -1,10 +1,10 @@ use anyhow::Result; -use clap::Parser; +use clap::Clap; use log::info; use sysvmq::SysvMq; /// Create a SysV message queue -#[derive(Debug, Parser)] +#[derive(Clap, Debug)] pub struct Create { /// Permissions (octal) to create the queue with (default: 0644) #[clap(short, long)] @@ -19,7 +19,7 @@ impl Create { let mut mq = SysvMq::::new(); if let Some(m) = &self.mode { - mq.mode(i32::from_str_radix(m, 8)?); + mq.mode(i32::from_str_radix(&m, 8)?); } mq.create(self.key)?; diff --git a/src/sysv/info.rs b/src/sysv/info.rs deleted file mode 100644 index 77d4b3e..0000000 --- a/src/sysv/info.rs +++ /dev/null @@ -1,53 +0,0 @@ -use anyhow::Result; -use clap::Parser; -use std::{ - fs::File, - io::{BufRead, BufReader}, -}; - -/// Print information about an existing message queue -#[derive(Debug, Parser)] -pub struct Info { - /// Id of the queue - #[clap(short, long, required_unless_present_any = &["key"], conflicts_with = "key")] - id: Option, - /// Key of the queue - #[clap(short, long, required_unless_present_any = &["id"], conflicts_with = "id")] - key: Option, -} - -fn print_line(line: &str) { - for field in line.split_whitespace().collect::>() { - print!("{0: <10}", field); - } - - println!(); -} - -impl Info { - pub fn run(&self) -> Result<()> { - let mut lines = BufReader::new(File::open("/proc/sysvipc/msg")?).lines(); - - print_line(&lines.next().unwrap_or_else(|| Ok(String::new()))?); - - for line in lines { - let line = line?; - - if let Some(id) = self.id { - if id == line.split_whitespace().collect::>()[1].parse::()? { - print_line(&line); - - break; - } - } else if let Some(key) = self.key { - if key == line.split_whitespace().collect::>()[0].parse::()? { - print_line(&line); - - break; - } - } - } - - Ok(()) - } -} diff --git a/src/sysv/list.rs b/src/sysv/list.rs deleted file mode 100644 index 7c12f16..0000000 --- a/src/sysv/list.rs +++ /dev/null @@ -1,24 +0,0 @@ -use anyhow::Result; -use clap::Parser; -use std::{ - fs::File, - io::{BufRead, BufReader}, -}; - -/// Print a list of existing message queues -#[derive(Debug, Parser)] -pub struct List {} - -impl List { - 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); - } - - println!(); - } - - Ok(()) - } -} diff --git a/src/sysv/unlink.rs b/src/sysv/unlink.rs index 9b4b998..277edb6 100644 --- a/src/sysv/unlink.rs +++ b/src/sysv/unlink.rs @@ -1,21 +1,21 @@ use anyhow::Result; -use clap::Parser; +use clap::Clap; use log::info; /// Delete a message queue -#[derive(Debug, Parser)] +#[derive(Clap, Debug)] pub struct Unlink { /// Id of the queue #[clap( - short, long, + short, required_unless_present_any = &["key"], conflicts_with = "key" )] - id: Option, + pub id: Option, /// Key of the queue - #[clap(short, long, required_unless_present_any = &["id"], conflicts_with = "id")] - key: Option, + #[clap(long, short, required_unless_present_any = &["id"], conflicts_with = "id")] + pub key: Option, } impl Unlink { @@ -25,11 +25,9 @@ impl Unlink { info!("Removed message queue with id: {}", id); } else if let Some(key) = self.key { - let id = sysvmq::id_from_key(key)?; + sysvmq::unlink_key(key)?; - sysvmq::unlink_id(id)?; - - info!("Removed message queue key: {} (id: {})", key, id); + info!("Removed message queue key: {}", key); } Ok(()) diff --git a/sysvmq/src/lib.rs b/sysvmq/src/lib.rs index 298a48e..bb2c21d 100644 --- a/sysvmq/src/lib.rs +++ b/sysvmq/src/lib.rs @@ -1,15 +1,21 @@ 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_EXCL, IPC_INFO, IPC_NOWAIT, IPC_PRIVATE, IPC_RMID, + IPC_SET, IPC_STAT, MSG_COPY, MSG_EXCEPT, MSG_INFO, MSG_NOERROR, MSG_STAT, }; use nix::errno::{errno, Errno}; -use std::{marker::PhantomData, mem::MaybeUninit, ptr}; +use std::{marker::PhantomData, num::ParseIntError, ptr}; use thiserror::Error; #[derive(Debug, Error)] pub enum SysvMqError { #[error("SysV message queue: {0}")] ErrnoError(&'static str), + #[error("No message queue found with key {0}")] + KeyNotFound(i32), + #[error("IO Error: {0}")] + IoError(#[from] std::io::Error), + #[error("Parse Error: {0}")] + ParserError(#[from] ParseIntError), } /// IPC bit flags @@ -63,63 +69,10 @@ pub fn unlink_id(id: i32) -> Result<(), SysvMqError> { } } -pub fn id_from_key(key: i32) -> Result { +pub fn unlink_key(key: i32) -> Result<(), SysvMqError> { let id = unsafe { msgget(key, 0) }; - match id { - -1 => Err(SysvMqError::ErrnoError(Errno::from_i32(errno()).desc())), - id => Ok(id), - } -} - -pub fn ipc_info(id: i32) -> Result<(), SysvMqError> { - let mut msginfo = MaybeUninit::::uninit(); - - unsafe { - msgctl( - id, - ControlCommands::IpcInfo as i32, - msginfo.as_mut_ptr() as *mut msqid_ds, - ); - } - - let msginfo = unsafe { msginfo.assume_init() }; - - println!("info: {:?}", msginfo); - - Ok(()) -} - -pub fn stat_info(id: i32) -> Result<(), SysvMqError> { - let mut msginfo = MaybeUninit::::uninit(); - - unsafe { - msgctl(id, ControlCommands::Stat as i32, msginfo.as_mut_ptr()); - } - - let msginfo = unsafe { msginfo.assume_init() }; - - println!("info: {:?}", msginfo); - - Ok(()) -} - -pub fn msg_info(id: i32) -> Result<(), SysvMqError> { - let mut msginfo = MaybeUninit::::uninit(); - - unsafe { - msgctl( - id, - ControlCommands::MsgInfo as i32, - msginfo.as_mut_ptr() as *mut msqid_ds, - ); - } - - let msginfo = unsafe { msginfo.assume_init() }; - - println!("info: {:?}", msginfo); - - Ok(()) + unlink_id(id) } pub struct SysvMq {