Compare commits

..

2 commits

Author SHA1 Message Date
9aae14feae Refactor commands to support different backends
Therefore also the `sysv` backend is intoduced to prepare for future
support. The man page and the readme are updated so far.
2021-07-07 19:19:19 +02:00
4020f062ef Add new subcommand list
Also add it to the readme and manpage.
2021-07-07 18:27:41 +02:00
5 changed files with 151 additions and 31 deletions

View file

@ -46,26 +46,38 @@ from `target/{debug,release}/mqrs` depending on which
one you built. one you built.
## Using `mqrs` ## Using `mqrs`
`mqrs` supports five commands: `create`, `info`, `unlink`, `send` and Depending on which backend you want to use there are different subsets
`recv`. All commands do not have to be specified fully. If the of subcommands. Following backends are supported:
command is clearly distinguishable from all the others, it does not - `posix`: Uses POSIX message queues
have to be completed further. - `sysv`: Uses SysV IPC message queues
### Create a message queue If a command is clearly distinguishable from all the others,
it does not have to be completed further.
### POSIX message queues
The POSIX backend supports six commands: `create`, `info`, `list`,
`unlink`, `send` and `recv`.
#### Create a message queue
Use the `create` command to create a new POSIX message queue. Following Use the `create` command to create a new POSIX message queue. Following
optional arguments are supported: optional arguments are supported:
- `-c`, `--capacity`: Maximum number of messages in the queue - `-c`, `--capacity`: Maximum number of messages in the queue
- `-p`, `--permissions`: Permissions (octal) to create the queue with - `-p`, `--permissions`: Permissions (octal) to create the queue with
- `-s`, `--msgsize`: Message size in bytes - `-s`, `--msgsize`: Message size in bytes
### Print information about a message queue #### Print information about a message queue
Use the `info` command to print further information about a message Use the `info` command to print further information about a message
queue. queue.
### Delete a message queue #### List all message queues
Use the `list` command to print a list of all message
queues. Following option argument is supported:
- `-a`, `--all`: Print all available information
#### Delete a message queue
Use the `unlink` command to delete a message queue. Use the `unlink` command to delete a message queue.
### Send a message to a queue #### Send a message to a queue
Use the `send` command to send a message to a message queue. Following Use the `send` command to send a message to a message queue. Following
optional arguments are supported: optional arguments are supported:
- `-n`, `--non-blocking`: Do not block - `-n`, `--non-blocking`: Do not block
@ -75,7 +87,7 @@ optional arguments are supported:
default, priority >= 0 [default: 0] default, priority >= 0 [default: 0]
- `-o`, `--timeout <timeout>`: As for example in "5h 23min 42ms" - `-o`, `--timeout <timeout>`: As for example in "5h 23min 42ms"
### Receive a message from a queue #### Receive a message from a queue
Use the `recv` command to receive one or more messages from a message Use the `recv` command to receive one or more messages from a message
queue. Following optional arguments are supported: queue. Following optional arguments are supported:
- `-f`, `--follow`: Print messages as they are received - `-f`, `--follow`: Print messages as they are received
@ -84,3 +96,6 @@ queue. Following optional arguments are supported:
- `-d`, `--deadline <deadline>`: Deadline until messages are received - `-d`, `--deadline <deadline>`: Deadline until messages are received
(format: `%Y-%m-%d %H:%M:%S`) (format: `%Y-%m-%d %H:%M:%S`)
- `-o,` `--timeout <timeout>`: As for example in "5h 23min 42ms" - `-o,` `--timeout <timeout>`: As for example in "5h 23min 42ms"
### SysV IPC message queues
The SysV IPC backend supports no commands yet.

54
mqrs.1
View file

@ -1,25 +1,21 @@
.\" Manpage for mqrs .\" Manpage for mqrs
.TH man 1 "27 June 2021" "0.1.1" "mqrs man page" .TH man 1 "7 July 2021" "0.1.1" "mqrs man page"
.SH NAME .SH NAME
mqrs \- Handle POSIX message queues mqrs \- Handle POSIX message queues
.SH SYNOPSIS .SH SYNOPSIS
.B mqrs [\-h] [\-\-help] [\-v] [\-\-verbose] [\-V] [\-\-version] [SUBCOMMAND] .B mqrs [\-h] [\-\-help] [\-v] [\-\-verbose] [\-V] [\-\-version] [SUBCOMMAND]
.SH DESCRIPTION .SH DESCRIPTION
.B mqrs .B mqrs
is a small cli program to handle POSIX message queues. Supported commands are is a small cli program to handle message queues. Depending on which
.B create\ backend you want to use there are different subsets of
, subcommands. Following backends are supported:
.B info\ .B posix\
,
.B unlink\
,
.B send
and and
.B recv .B sysv\
. .
All commands do not have to be specified fully. If the command is
clearly distinguishable from all the others, it does not have to be If a command is clearly distinguishable from all the others, it does
completed further. not have to be completed further.
.SH OPTIONS .SH OPTIONS
.TP 8 .TP 8
.B \-h, \-\-help .B \-h, \-\-help
@ -31,7 +27,20 @@ Produce verbose output, multiple -v options increase the verbosity
.TP 8 .TP 8
.B \-V, \-\-version .B \-V, \-\-version
Prints version information Prints version information
.SH SUBCOMMANDS .SH POSIX MESSAGE QUEUE SUBCOMMANDS
The POSIX backend supports six commands:
.B create\
,
.B info\
,
.B list\
,
.B unlink\
,
.B send
and
.B recv
.
.SS create [FLAGS] [OPTIONS] \fI<QUEUE>\fP .SS create [FLAGS] [OPTIONS] \fI<QUEUE>\fP
Create a new POSIX message queue. Create a new POSIX message queue.
.TP 8 .TP 8
@ -90,6 +99,21 @@ Prints help information
.B \-v, \-\-verbose .B \-v, \-\-verbose
Produce verbose output Produce verbose output
.RE .RE
.SS list [FLAGS]
Print a list of all existing POSIX message queues.
.TP 8
.SS FLAGS
.RS
.TP 8
.B \-h, \-\-help
Prints help information
.TP 8
.B \-v, \-\-verbose
Produce verbose output
.TP 8
.B \-a, \-\-all
Print all available information
.RE
.SS recv [FLAGS] [OPTIONS] \fI<QUEUE>\fP .SS recv [FLAGS] [OPTIONS] \fI<QUEUE>\fP
Receive and print one or more messages message from a message queue. Receive and print one or more messages message from a message queue.
.TP 8 .TP 8
@ -185,6 +209,8 @@ Prints help information
.B \-v, \-\-verbose .B \-v, \-\-verbose
Produce verbose output Produce verbose output
.RE .RE
.SH SYSV IPC MESSAGE QUEUE SUBCOMMANDS
The SysV IPC backend supports no commands yet.
.SH SEE ALSO .SH SEE ALSO
mq_overview(7) mq_overview(7)
.SH BUGS .SH BUGS

View file

@ -4,14 +4,27 @@ use clap::{crate_authors, crate_version, AppSettings, Clap};
mod posix; mod posix;
#[derive(Clap, Debug)] #[derive(Clap, Debug)]
enum Command { enum Backend {
/// Handle POSIX message queues
Posix(PosixCommand),
/// Handle SysV message queues
Sysv(SysvCommand),
}
#[derive(Clap, Debug)]
enum PosixCommand {
Create(posix::Create), Create(posix::Create),
Info(posix::Info), Info(posix::Info),
List(posix::List),
Unlink(posix::Unlink), Unlink(posix::Unlink),
Send(posix::Send), Send(posix::Send),
Recv(posix::Recv), Recv(posix::Recv),
} }
#[derive(Clap, Debug)]
enum SysvCommand {
}
#[derive(Clap, Debug)] #[derive(Clap, Debug)]
#[clap( #[clap(
version = crate_version!(), version = crate_version!(),
@ -24,8 +37,9 @@ struct Opts {
/// Produce verbose output, multiple -v options increase the verbosity (max. 3) /// Produce verbose output, multiple -v options increase the verbosity (max. 3)
#[clap(short, long, global = true, parse(from_occurrences))] #[clap(short, long, global = true, parse(from_occurrences))]
verbose: u32, verbose: u32,
/// Backend to be used
#[clap(subcommand)] #[clap(subcommand)]
command: Command, backend: Backend,
} }
fn main() -> Result<()> { fn main() -> Result<()> {
@ -41,12 +55,17 @@ fn main() -> Result<()> {
)) ))
.init(); .init();
match opts.command { match opts.backend {
Command::Create(c) => c.run()?, Backend::Posix(p) => match p {
Command::Info(i) => i.run()?, PosixCommand::Create(c) => c.run()?,
Command::Unlink(u) => u.run()?, PosixCommand::Info(i) => i.run()?,
Command::Send(s) => s.run()?, PosixCommand::List(l) => l.run()?,
Command::Recv(r) => r.run()?, PosixCommand::Unlink(u) => u.run()?,
PosixCommand::Send(s) => s.run()?,
PosixCommand::Recv(r) => r.run()?,
},
Backend::Sysv(s) => match s {
},
} }
Ok(()) Ok(())

View file

@ -1,11 +1,13 @@
mod create; mod create;
mod info; mod info;
mod list;
mod recv; mod recv;
mod send; mod send;
mod unlink; mod unlink;
pub use create::Create; pub use create::Create;
pub use info::Info; pub use info::Info;
pub use list::List;
pub use recv::Recv; pub use recv::Recv;
pub use send::Send; pub use send::Send;
pub use unlink::Unlink; pub use unlink::Unlink;

58
src/posix/list.rs Normal file
View file

@ -0,0 +1,58 @@
use anyhow::{anyhow, Result};
use chrono::{DateTime, Local};
use clap::Clap;
use log::warn;
use std::{fs, os::unix::fs::PermissionsExt};
/// Print information about an existing message queue
#[derive(Clap, Debug)]
pub struct List {
/// Show all parameters
#[clap(short, long)]
all: bool,
}
impl List {
pub fn run(&self) -> Result<()> {
match self.all {
false => println!("Name"),
true => println!(
"{0: <10} {1: <10} {2: <12} {3: <26} {4: <26}",
"Name", "Size", "Permissions", "Modified", "Accessed",
),
}
for mq in fs::read_dir("/dev/mqueue")? {
match mq {
Ok(mq) => {
print!(
"/{0: <10}",
mq.file_name().into_string().map_err(|e| anyhow!(
"Could not convert queue name to string: {:?}",
e
))?
);
if self.all {
let metadata = mq.metadata()?;
let modified: DateTime<Local> = metadata.modified()?.into();
let accessed: DateTime<Local> = metadata.accessed()?.into();
print!(
"{0: <10} {1: <12o} {2: <26} {3: <26}",
metadata.len(),
metadata.permissions().mode(),
modified,
accessed,
);
}
println!();
}
Err(e) => warn!("Could not read file: {:?}", e),
}
}
Ok(())
}
}