feat: Add create command

Adds a command to create message queues with custom parameters.
This commit is contained in:
Vincent Ambo 2017-10-20 13:03:00 +02:00 committed by Karl Erik Asbjørnsen
parent 10dcab6365
commit 44e72884a6

View file

@ -1,18 +1,18 @@
extern crate clap; extern crate clap;
extern crate posix_mq; extern crate posix_mq;
use clap::{App, SubCommand, Arg, AppSettings}; use clap::{App, SubCommand, Arg, ArgMatches, AppSettings};
use posix_mq::{Name, Queue}; use posix_mq::{Name, Queue};
use std::fs::{read_dir, File};
use std::io::Read;
use std::process::exit;
fn run_ls() { fn run_ls() {
use std::fs::{read_dir, File};
use std::io::Read;
let mqueues = read_dir("/dev/mqueue") let mqueues = read_dir("/dev/mqueue")
.expect("Could not read message queues"); .expect("Could not read message queues");
mqueues.for_each(|queue| { mqueues.for_each(|queue| {
//let queue_name = (&queue.unwrap().file_name()).into_string().unwrap();
let path = queue.unwrap().path(); let path = queue.unwrap().path();
let status = { let status = {
let mut file = File::open(&path) let mut file = File::open(&path)
@ -38,6 +38,24 @@ fn run_inspect(queue_name: &str) {
println!("Max. # of pending messages: {}", queue.max_pending()); println!("Max. # of pending messages: {}", queue.max_pending());
} }
fn run_create(cmd: &ArgMatches) {
let name = Name::new(cmd.value_of("queue").unwrap())
.expect("Invalid queue name");
let max_pending: i64 = cmd.value_of("max-pending").unwrap().parse().unwrap();
let max_size: i64 = cmd.value_of("max-size").unwrap().parse().unwrap();
let queue = Queue::create(name, max_pending, max_size * 1024);
match queue {
Ok(_) => println!("Queue created successfully"),
Err(e) => {
println!("Could not create queue: {}", e);
exit(1);
},
};
}
fn main() { fn main() {
let ls = SubCommand::with_name("ls").about("list message queues"); let ls = SubCommand::with_name("ls").about("list message queues");
let inspect = SubCommand::with_name("inspect") let inspect = SubCommand::with_name("inspect")
@ -47,6 +65,20 @@ fn main() {
.required(true) .required(true)
.takes_value(true)); .takes_value(true));
let create = SubCommand::with_name("create")
.about("Create a new queue")
.arg(Arg::with_name("queue")
.required(true)
.takes_value(true))
.arg(Arg::with_name("max-size")
.help("maximum message size (in kB)")
.required(true)
.takes_value(true))
.arg(Arg::with_name("max-pending")
.help("maximum # of pending messages")
.required(true)
.takes_value(true));
let matches = App::new("mq") let matches = App::new("mq")
.setting(AppSettings::SubcommandRequiredElseHelp) .setting(AppSettings::SubcommandRequiredElseHelp)
@ -54,11 +86,13 @@ fn main() {
.about("Administrate and inspect POSIX message queues") .about("Administrate and inspect POSIX message queues")
.subcommand(ls) .subcommand(ls)
.subcommand(inspect) .subcommand(inspect)
.subcommand(create)
.get_matches(); .get_matches();
match matches.subcommand() { match matches.subcommand() {
("ls", _) => run_ls(), ("ls", _) => run_ls(),
("inspect", Some(cmd)) => run_inspect(cmd.value_of("queue").unwrap()), ("inspect", Some(cmd)) => run_inspect(cmd.value_of("queue").unwrap()),
("create", Some(cmd)) => run_create(cmd),
_ => unimplemented!(), _ => unimplemented!(),
} }
} }