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.
## Using `mqrs`
`mqrs` supports five commands: `create`, `info`, `unlink`, `send` and
`recv`. 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 completed further.
Depending on which backend you want to use there are different subsets
of subcommands. Following backends are supported:
- `posix`: Uses POSIX message queues
- `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
optional arguments are supported:
- `-c`, `--capacity`: Maximum number of messages in the queue
- `-p`, `--permissions`: Permissions (octal) to create the queue with
- `-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
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.
### 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
optional arguments are supported:
- `-n`, `--non-blocking`: Do not block
@ -75,7 +87,7 @@ optional arguments are supported:
default, priority >= 0 [default: 0]
- `-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
queue. Following optional arguments are supported:
- `-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
(format: `%Y-%m-%d %H:%M:%S`)
- `-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
.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
mqrs \- Handle POSIX message queues
.SH SYNOPSIS
.B mqrs [\-h] [\-\-help] [\-v] [\-\-verbose] [\-V] [\-\-version] [SUBCOMMAND]
.SH DESCRIPTION
.B mqrs
is a small cli program to handle POSIX message queues. Supported commands are
.B create\
,
.B info\
,
.B unlink\
,
.B send
is a small cli program to handle message queues. Depending on which
backend you want to use there are different subsets of
subcommands. Following backends are supported:
.B posix\
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
completed further.
If a command is clearly distinguishable from all the others, it does
not have to be completed further.
.SH OPTIONS
.TP 8
.B \-h, \-\-help
@ -31,7 +27,20 @@ Produce verbose output, multiple -v options increase the verbosity
.TP 8
.B \-V, \-\-version
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
Create a new POSIX message queue.
.TP 8
@ -90,6 +99,21 @@ Prints help information
.B \-v, \-\-verbose
Produce verbose output
.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
Receive and print one or more messages message from a message queue.
.TP 8
@ -185,6 +209,8 @@ Prints help information
.B \-v, \-\-verbose
Produce verbose output
.RE
.SH SYSV IPC MESSAGE QUEUE SUBCOMMANDS
The SysV IPC backend supports no commands yet.
.SH SEE ALSO
mq_overview(7)
.SH BUGS

View file

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

View file

@ -1,11 +1,13 @@
mod create;
mod info;
mod list;
mod recv;
mod send;
mod unlink;
pub use create::Create;
pub use info::Info;
pub use list::List;
pub use recv::Recv;
pub use send::Send;
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(())
}
}