Add 'ops/mq_cli/' from commit 'df29b08bffc90cfd4f2d963a8e48d89f7a86308d'
git-subtree-dir: ops/mq_cli git-subtree-mainline:b59c7e693c
git-subtree-split:df29b08bff
This commit is contained in:
commit
4bc3196c9a
8 changed files with 537 additions and 0 deletions
4
ops/mq_cli/.gitignore
vendored
Normal file
4
ops/mq_cli/.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
/target/
|
||||||
|
**/*.rs.bk
|
||||||
|
.idea/
|
||||||
|
*.iml
|
3
ops/mq_cli/.travis.yml
Normal file
3
ops/mq_cli/.travis.yml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
language: rust
|
||||||
|
rust:
|
||||||
|
- stable
|
20
ops/mq_cli/CODE_OF_CONDUCT.md
Normal file
20
ops/mq_cli/CODE_OF_CONDUCT.md
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
A SERMON ON ETHICS AND LOVE
|
||||||
|
===========================
|
||||||
|
|
||||||
|
One day Mal-2 asked the messenger spirit Saint Gulik to approach the Goddess and request Her presence for some desperate advice. Shortly afterwards the radio came on by itself, and an ethereal female Voice said **YES?**
|
||||||
|
|
||||||
|
"O! Eris! Blessed Mother of Man! Queen of Chaos! Daughter of Discord! Concubine of Confusion! O! Exquisite Lady, I beseech You to lift a heavy burden from my heart!"
|
||||||
|
|
||||||
|
**WHAT BOTHERS YOU, MAL? YOU DON'T SOUND WELL.**
|
||||||
|
|
||||||
|
"I am filled with fear and tormented with terrible visions of pain. Everywhere people are hurting one another, the planet is rampant with injustices, whole societies plunder groups of their own people, mothers imprison sons, children perish while brothers war. O, woe."
|
||||||
|
|
||||||
|
**WHAT IS THE MATTER WITH THAT, IF IT IS WHAT YOU WANT TO DO?**
|
||||||
|
|
||||||
|
"But nobody Wants it! Everybody hates it."
|
||||||
|
|
||||||
|
**OH. WELL, THEN *STOP*.**
|
||||||
|
|
||||||
|
At which moment She turned herself into an aspirin commercial and left The Polyfather stranded alone with his species.
|
||||||
|
|
||||||
|
SINISTER DEXTER HAS A BROKEN SPIROMETER.
|
225
ops/mq_cli/Cargo.lock
generated
Normal file
225
ops/mq_cli/Cargo.lock
generated
Normal file
|
@ -0,0 +1,225 @@
|
||||||
|
[[package]]
|
||||||
|
name = "ansi_term"
|
||||||
|
version = "0.11.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "atty"
|
||||||
|
version = "0.2.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "0.9.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "byteorder"
|
||||||
|
version = "1.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bytes"
|
||||||
|
version = "0.4.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg-if"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap"
|
||||||
|
version = "2.31.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"atty 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gcc"
|
||||||
|
version = "0.3.54"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "iovec"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.39"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mq"
|
||||||
|
version = "1.0.0"
|
||||||
|
dependencies = [
|
||||||
|
"clap 2.31.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"nix 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"posix_mq 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nix"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nix"
|
||||||
|
version = "0.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "posix_mq"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"nix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "redox_syscall"
|
||||||
|
version = "0.1.37"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "redox_termios"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "strsim"
|
||||||
|
version = "0.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "termion"
|
||||||
|
version = "1.5.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "textwrap"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-width"
|
||||||
|
version = "0.1.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "vec_map"
|
||||||
|
version = "0.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "void"
|
||||||
|
version = "1.0.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi"
|
||||||
|
version = "0.2.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi"
|
||||||
|
version = "0.3.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-i686-pc-windows-gnu"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-x86_64-pc-windows-gnu"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[metadata]
|
||||||
|
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
|
||||||
|
"checksum atty 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "af80143d6f7608d746df1520709e5d141c96f240b0e62b0aa41bdfb53374d9d4"
|
||||||
|
"checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
|
||||||
|
"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf"
|
||||||
|
"checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23"
|
||||||
|
"checksum bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1b7db437d718977f6dc9b2e3fd6fc343c02ac6b899b73fdd2179163447bd9ce9"
|
||||||
|
"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de"
|
||||||
|
"checksum clap 2.31.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5dc18f6f4005132120d9711636b32c46a233fad94df6217fa1d81c5e97a9f200"
|
||||||
|
"checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb"
|
||||||
|
"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08"
|
||||||
|
"checksum libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)" = "f54263ad99207254cf58b5f701ecb432c717445ea2ee8af387334bdd1a03fdff"
|
||||||
|
"checksum nix 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fd5681d13fda646462cfbd4e5f2051279a89a544d50eb98c365b507246839f"
|
||||||
|
"checksum nix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a2c5afeb0198ec7be8569d666644b574345aad2e95a53baf3a532da3e0f3fb32"
|
||||||
|
"checksum posix_mq 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9a4e85a6efabe224decbdf47ff9e9d56cd44c91470734ffddb28351351f03f"
|
||||||
|
"checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd"
|
||||||
|
"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
|
||||||
|
"checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550"
|
||||||
|
"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
|
||||||
|
"checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693"
|
||||||
|
"checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f"
|
||||||
|
"checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c"
|
||||||
|
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
|
||||||
|
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
||||||
|
"checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3"
|
||||||
|
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||||
|
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
10
ops/mq_cli/Cargo.toml
Normal file
10
ops/mq_cli/Cargo.toml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
[package]
|
||||||
|
name = "mq"
|
||||||
|
version = "1.0.0"
|
||||||
|
authors = ["Vincent Ambo <vincent@aprila.no>"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
clap = "2.31"
|
||||||
|
libc = "0.2"
|
||||||
|
nix = "0.10"
|
||||||
|
posix_mq = "0.1.2"
|
21
ops/mq_cli/LICENSE
Normal file
21
ops/mq_cli/LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2017 Langler AS
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
31
ops/mq_cli/README.md
Normal file
31
ops/mq_cli/README.md
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
mq-cli
|
||||||
|
======
|
||||||
|
|
||||||
|
This project provides a very simple CLI interface to [POSIX message queues][].
|
||||||
|
|
||||||
|
It can be used to create and inspect queues, as well as send and
|
||||||
|
receive messages from them.
|
||||||
|
|
||||||
|
```
|
||||||
|
1.0.0
|
||||||
|
Administrate and inspect POSIX message queues
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
mq <SUBCOMMAND>
|
||||||
|
|
||||||
|
FLAGS:
|
||||||
|
-h, --help Prints help information
|
||||||
|
-V, --version Prints version information
|
||||||
|
|
||||||
|
SUBCOMMANDS:
|
||||||
|
create Create a new queue
|
||||||
|
help Prints this message or the help of the given subcommand(s)
|
||||||
|
inspect inspect details about a queue
|
||||||
|
ls list message queues
|
||||||
|
receive Receive a message from a queue
|
||||||
|
rlimit Get the message queue rlimit
|
||||||
|
send Send a message to a queue
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
[POSIX message queues]: https://linux.die.net/man/7/mq_overview
|
223
ops/mq_cli/src/main.rs
Normal file
223
ops/mq_cli/src/main.rs
Normal file
|
@ -0,0 +1,223 @@
|
||||||
|
extern crate clap;
|
||||||
|
extern crate posix_mq;
|
||||||
|
extern crate libc;
|
||||||
|
extern crate nix;
|
||||||
|
|
||||||
|
use clap::{App, SubCommand, Arg, ArgMatches, AppSettings};
|
||||||
|
use posix_mq::{Name, Queue, Message};
|
||||||
|
use std::fs::{read_dir, File};
|
||||||
|
use std::io::{self, Read, Write};
|
||||||
|
use std::process::exit;
|
||||||
|
|
||||||
|
fn run_ls() {
|
||||||
|
let mqueues = read_dir("/dev/mqueue")
|
||||||
|
.expect("Could not read message queues");
|
||||||
|
|
||||||
|
for queue in mqueues {
|
||||||
|
let path = queue.unwrap().path();
|
||||||
|
let status = {
|
||||||
|
let mut file = File::open(&path)
|
||||||
|
.expect("Could not open queue file");
|
||||||
|
|
||||||
|
let mut content = String::new();
|
||||||
|
file.read_to_string(&mut content).expect("Could not read queue file");
|
||||||
|
|
||||||
|
content
|
||||||
|
};
|
||||||
|
|
||||||
|
let queue_name = path.components().last().unwrap()
|
||||||
|
.as_os_str()
|
||||||
|
.to_string_lossy();
|
||||||
|
|
||||||
|
println!("/{}: {}", queue_name, status)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_inspect(queue_name: &str) {
|
||||||
|
let name = Name::new(queue_name).expect("Invalid queue name");
|
||||||
|
let queue = Queue::open(name).expect("Could not open queue");
|
||||||
|
|
||||||
|
println!("Queue {}:\n", queue_name);
|
||||||
|
println!("Max. message size: {} bytes", queue.max_size());
|
||||||
|
println!("Max. # of pending messages: {}", queue.max_pending());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_create(cmd: &ArgMatches) {
|
||||||
|
if let Some(rlimit) = cmd.value_of("rlimit") {
|
||||||
|
set_rlimit(rlimit.parse().expect("Invalid rlimit value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
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) => {
|
||||||
|
writeln!(io::stderr(), "Could not create queue: {}", e).ok();
|
||||||
|
exit(1);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_receive(queue_name: &str) {
|
||||||
|
let name = Name::new(queue_name).expect("Invalid queue name");
|
||||||
|
let queue = Queue::open(name).expect("Could not open queue");
|
||||||
|
|
||||||
|
let message = match queue.receive() {
|
||||||
|
Ok(msg) => msg,
|
||||||
|
Err(e) => {
|
||||||
|
writeln!(io::stderr(), "Failed to receive message: {}", e).ok();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attempt to write the message out as a string, but write out raw bytes if it turns out to not
|
||||||
|
// be UTF-8 encoded data.
|
||||||
|
match String::from_utf8(message.data.clone()) {
|
||||||
|
Ok(string) => println!("{}", string),
|
||||||
|
Err(_) => {
|
||||||
|
writeln!(io::stderr(), "Message not UTF-8 encoded!").ok();
|
||||||
|
io::stdout().write(message.data.as_ref()).ok();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_send(queue_name: &str, content: &str) {
|
||||||
|
let name = Name::new(queue_name).expect("Invalid queue name");
|
||||||
|
let queue = Queue::open(name).expect("Could not open queue");
|
||||||
|
|
||||||
|
let message = Message {
|
||||||
|
data: content.as_bytes().to_vec(),
|
||||||
|
priority: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
match queue.send(&message) {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(e) => {
|
||||||
|
writeln!(io::stderr(), "Could not send message: {}", e).ok();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_rlimit() {
|
||||||
|
let mut rlimit = libc::rlimit {
|
||||||
|
rlim_cur: 0,
|
||||||
|
rlim_max: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut errno = 0;
|
||||||
|
unsafe {
|
||||||
|
let res = libc::getrlimit(libc::RLIMIT_MSGQUEUE, &mut rlimit);
|
||||||
|
if res != 0 {
|
||||||
|
errno = nix::errno::errno();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if errno != 0 {
|
||||||
|
writeln!(io::stderr(), "Could not get message queue rlimit: {}", errno).ok();
|
||||||
|
} else {
|
||||||
|
println!("Message queue rlimit:");
|
||||||
|
println!("Current limit: {}", rlimit.rlim_cur);
|
||||||
|
println!("Maximum limit: {}", rlimit.rlim_max);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_rlimit(new_limit: u64) {
|
||||||
|
let rlimit = libc::rlimit {
|
||||||
|
rlim_cur: new_limit,
|
||||||
|
rlim_max: new_limit,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut errno: i32 = 0;
|
||||||
|
unsafe {
|
||||||
|
let res = libc::setrlimit(libc::RLIMIT_MSGQUEUE, &rlimit);
|
||||||
|
if res != 0 {
|
||||||
|
errno = nix::errno::errno();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
match errno {
|
||||||
|
0 => println!("Set RLIMIT_MSGQUEUE hard limit to {}", new_limit),
|
||||||
|
_ => {
|
||||||
|
// Not mapping these error codes to messages for now, the user can
|
||||||
|
// look up the meaning in setrlimit(2).
|
||||||
|
panic!("Could not set hard limit: {}", errno);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let ls = SubCommand::with_name("ls").about("list message queues");
|
||||||
|
|
||||||
|
let queue_arg = Arg::with_name("queue").required(true).takes_value(true);
|
||||||
|
|
||||||
|
let rlimit_arg = Arg::with_name("rlimit")
|
||||||
|
.help("RLIMIT_MSGQUEUE to set for this command")
|
||||||
|
.long("rlimit")
|
||||||
|
.takes_value(true);
|
||||||
|
|
||||||
|
let inspect = SubCommand::with_name("inspect")
|
||||||
|
.about("inspect details about a queue")
|
||||||
|
.arg(&queue_arg);
|
||||||
|
|
||||||
|
let create = SubCommand::with_name("create")
|
||||||
|
.about("Create a new queue")
|
||||||
|
.arg(&queue_arg)
|
||||||
|
.arg(&rlimit_arg)
|
||||||
|
.arg(Arg::with_name("max-size")
|
||||||
|
.help("maximum message size (in kB)")
|
||||||
|
.long("max-size")
|
||||||
|
.required(true)
|
||||||
|
.takes_value(true))
|
||||||
|
.arg(Arg::with_name("max-pending")
|
||||||
|
.help("maximum # of pending messages")
|
||||||
|
.long("max-pending")
|
||||||
|
.required(true)
|
||||||
|
.takes_value(true));
|
||||||
|
|
||||||
|
let receive = SubCommand::with_name("receive")
|
||||||
|
.about("Receive a message from a queue")
|
||||||
|
.arg(&queue_arg);
|
||||||
|
|
||||||
|
let send = SubCommand::with_name("send")
|
||||||
|
.about("Send a message to a queue")
|
||||||
|
.arg(&queue_arg)
|
||||||
|
.arg(Arg::with_name("message")
|
||||||
|
.help("the message to send")
|
||||||
|
.required(true));
|
||||||
|
|
||||||
|
let rlimit = SubCommand::with_name("rlimit")
|
||||||
|
.about("Get the message queue rlimit")
|
||||||
|
.setting(AppSettings::SubcommandRequiredElseHelp);
|
||||||
|
|
||||||
|
let matches = App::new("mq")
|
||||||
|
.setting(AppSettings::SubcommandRequiredElseHelp)
|
||||||
|
.version("1.0.0")
|
||||||
|
.about("Administrate and inspect POSIX message queues")
|
||||||
|
.subcommand(ls)
|
||||||
|
.subcommand(inspect)
|
||||||
|
.subcommand(create)
|
||||||
|
.subcommand(receive)
|
||||||
|
.subcommand(send)
|
||||||
|
.subcommand(rlimit)
|
||||||
|
.get_matches();
|
||||||
|
|
||||||
|
match matches.subcommand() {
|
||||||
|
("ls", _) => run_ls(),
|
||||||
|
("inspect", Some(cmd)) => run_inspect(cmd.value_of("queue").unwrap()),
|
||||||
|
("create", Some(cmd)) => run_create(cmd),
|
||||||
|
("receive", Some(cmd)) => run_receive(cmd.value_of("queue").unwrap()),
|
||||||
|
("send", Some(cmd)) => run_send(
|
||||||
|
cmd.value_of("queue").unwrap(),
|
||||||
|
cmd.value_of("message").unwrap()
|
||||||
|
),
|
||||||
|
("rlimit", _) => run_rlimit(),
|
||||||
|
_ => unimplemented!(),
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue