Implement printing a list of SysV IPC mqs

What could be improved is when printing the information to use a
better human readable format.

As usual the readme and the man page are both updated.
This commit is contained in:
finga 2021-07-08 14:46:10 +02:00
parent f4796e7da6
commit 4c82d41f8e
5 changed files with 46 additions and 0 deletions

View file

@ -67,6 +67,10 @@ queue. Following optional arguments are supported:
- `-m`, `--mode`: Permissions (octal) to create the queue
with. Default: 0644.
#### 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:

12
mqrs.1
View file

@ -241,6 +241,18 @@ Produce verbose output
.B \-m, \-\-mode \fI<mode>\fP
Permissions (octal) to create the queue with (default: 0644)
.RE
.SS 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 unlink [FLAGS] [OPTIONS]
Delete an existing SysV IPC message queue. It is mandatory to pass
exactly one OPTION.

View file

@ -25,6 +25,7 @@ enum PosixCommand {
#[derive(Clap, Debug)]
enum SysvCommand {
Create(sysv::Create),
List(sysv::List),
Unlink(sysv::Unlink),
}
@ -69,6 +70,7 @@ fn main() -> Result<()> {
},
Backend::Sysv(s) => match s {
SysvCommand::Create(c) => c.run()?,
SysvCommand::List(l) => l.run()?,
SysvCommand::Unlink(u) => u.run()?,
},
}

View file

@ -1,5 +1,7 @@
mod create;
mod list;
mod unlink;
pub use create::Create;
pub use list::List;
pub use unlink::Unlink;

26
src/sysv/list.rs Normal file
View file

@ -0,0 +1,26 @@
use anyhow::Result;
use clap::Clap;
use std::{
fs::File,
io::{BufRead, BufReader},
};
/// Print a list of existing message queues
#[derive(Clap, Debug)]
pub struct List {}
impl List {
pub fn run(&self) -> Result<()> {
let file = BufReader::new(File::open("/proc/sysvipc/msg")?);
for line in file.lines() {
for field in line?.split_whitespace().collect::<Vec<&str>>() {
print!("{0: <10}", field);
}
println!();
}
Ok(())
}
}