Skip to content

Commit 6787e82

Browse files
committed
Initial commit
0 parents  commit 6787e82

File tree

5 files changed

+78
-0
lines changed

5 files changed

+78
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/target

Cargo.lock

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[package]
2+
name = "iprev"
3+
version = "0.1.0"
4+
authors = ["Wes Roberts <g0r6p@a.zinc.email>"]
5+
edition = "2018"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# iprev
2+
3+
Reverse IP utility.
4+
5+
Allows you to easily reverse IPs in your UNIX workflow for PTR or RBL
6+
lookups.
7+
8+
## Example
9+
10+
```bash
11+
iprev 185.143.223.168
12+
```
13+
14+
Will produce
15+
16+
```
17+
168.223.143.185.in-addr.arpa
18+
```

src/main.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
use std::env;
2+
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
3+
use std::process;
4+
5+
fn ip_reverse(ip: &IpAddr) -> String {
6+
match ip {
7+
IpAddr::V4(ip4) => ip4_reverse(ip4, "in-addr.arpa"),
8+
IpAddr::V6(ip6) => ip6_reverse(ip6, "ip6.arpa"),
9+
}
10+
}
11+
12+
fn ip4_reverse(ip: &Ipv4Addr, suffix: &str) -> String {
13+
let mut rev = String::with_capacity(16 + suffix.len());
14+
for oct in ip.octets().iter().rev() {
15+
rev.push_str(format!("{}.", oct).as_str());
16+
}
17+
rev.push_str(suffix);
18+
rev
19+
}
20+
21+
fn ip6_reverse(ip: &Ipv6Addr, suffix: &str) -> String {
22+
let mut rev = String::with_capacity(64 + suffix.len());
23+
for oct in ip.octets().iter().rev() {
24+
rev.push_str(format!("{:x}.", oct & 0x0fu8).as_str());
25+
// Rust gets mad about right-shifting set bits, so we need to mask + shift
26+
rev.push_str(format!("{:x}.", (oct & 0xf0u8) >> 4u8).as_str());
27+
}
28+
rev.push_str(suffix);
29+
rev
30+
}
31+
32+
fn main() {
33+
let args: Vec<String> = env::args().collect();
34+
for arg in args[1..].iter() {
35+
let ip: Result<IpAddr, _> = arg.parse();
36+
let rev = match ip {
37+
Ok(ip) => ip_reverse(&ip),
38+
Err(e) => {
39+
eprintln!("Unable to parse arguments: {}", e);
40+
process::exit(1);
41+
}
42+
};
43+
println!("{}", rev);
44+
}
45+
}

0 commit comments

Comments
 (0)