1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
[]
# The crate is `zond-cli`; the binary it installs is `zond`. `zond` on crates.io
# is an unrelated crate somebody else owns, so the package cannot have that name
# — but nothing about what a user types changes, because the name that reaches
# their PATH is the `[[bin]]` one below.
= "zond-cli"
# The engine's line, so that `zond --version` and the engine it wraps are one
# number a person can compare. Not the same field as the dependency requirement
# below, which is what actually decides which engine is built against.
= "0.12.0"
= "2024"
# The engine's minimum, because this crate cannot compile on a toolchain that
# cannot compile what it wraps. Raising it here without raising it there would
# be a promise about a dependency this crate does not control.
= "1.93"
= "AGPL-3.0-or-later"
= "https://github.com/zond-rs/zond"
# Neither is code, and both would otherwise ride along in every published
# tarball. The engine excludes the same two.
= ["audit/", ".github/"]
= "The official command-line interface to the Zond network scanner."
= ["network", "scanner", "portscan", "discovery", "security"]
= ["command-line-utilities", "network-programming"]
= "README.md"
# What a user types, and deliberately not the package name. `cargo install
# zond-cli` puts `zond` on the PATH.
[[]]
= "zond"
= "src/main.rs"
[]
= { = "0.12.0", = "../zond-engine", = ["import-settings"] }
= { = "4.5", = ["derive", "wrap_help"] }
# Only the runtime and the signal handler. The engine brings the rest of tokio
# with it; naming `full` here would say this crate needs it, and it does not.
= { = "1.53", = ["rt-multi-thread", "macros", "signal"] }
= "0.1"
# No `fmt`, no `ansi`, no `env-filter`. The engine's diagnostics carry a
# `verbosity` field that decides whether a line is shown at all, and no
# off-the-shelf formatter knows that convention — so `diagnostics` writes its
# own layer and needs only the registry to hang it on.
= { = "0.3", = false, = ["std", "registry"] }
= "2.0"
# This crate's own settings document. The engine reads its file with the same
# crate; parsing two files with two TOML implementations would mean two answers
# about what a comment or an escape means.
= "1.1"
= { = "1.0", = ["derive"] }
# Reading a single keypress means taking the terminal out of line-buffered mode,
# which is a `tcsetattr` call. `rustix` wraps it safely, so this crate keeps
# `unsafe_code = "forbid"`; the alternative was raw `libc` and an exception to
# that rule. Unix only, because the termios call is: on anything else the key
# watcher is compiled out and Ctrl-C remains the way to stop a scan.
[]
= { = "1.1", = ["termios", "stdio"] }
[]
= "warn"
= "forbid"
[]
= { = "warn", = -1 }
= { = "warn", = -1 }
# Every public error type here is `#[non_exhaustive]`-shaped prose already, and
# the module docs carry the failure modes. Demanding an `# Errors` heading on
# each function repeats them without adding anything.
= "allow"
# Protocol names are words. `ICMPv6`, `ARP` and `DNS` in a sentence are the
# nouns this program is about, not identifiers, and backticking them turns
# ordinary prose into a wall of code spans.
= "allow"