exit_code/lib.rs
1//! Common exit codes for applications.
2//!
3//! # Example
4//! ```
5//! extern crate exit_code;
6//!
7//! ::std::process::exit(exit_code::SUCCESS);
8//! ```
9
10/// Successful termination.
11pub const SUCCESS: i32 = 0;
12
13/// Unsuccessful termination. This is a catch-all error code that should only
14/// be used by processes if the reason for the failure is unknown.
15pub const FAILURE: i32 = 1;
16
17/// The command was used incorrectly, e.g., with the wrong number of arguments,
18/// a bad flag, a bad syntax in a parameter, or whatever.
19pub const USAGE_ERROR: i32 = 64;
20
21/// The input data was incorrect in some way. This should only be used for
22/// user’s data and not system file.
23pub const DATA_ERROR: i32 = 65;
24
25/// An input file (not a system file) did not exist or was not readable. This
26/// could also include errors like “No message” to a mailer (if it cared to
27/// catch it).
28pub const NO_INPUT: i32 = 66;
29
30/// The user specified did not exist. This might be used for mail addresses or
31/// remote logins.
32pub const NO_USER: i32 = 67;
33
34/// The host specified did not exist. This is used in mail addresses of network
35/// requests.
36pub const NO_HOST: i32 = 68;
37
38/// A service is unavailable. This can occur if a support program or file does
39/// not exist. This can also be used as a catchall message when something you
40/// wanted to do doesn’t work, but you don’t know why.
41pub const SERVICE_UNAVAILABLE: i32 = 69;
42
43/// An internal software error has been detected. This should be limited to
44/// non-operating system related errors.
45pub const SOFTWARE_ERROR: i32 = 70;
46
47/// An operating system error has been detected. This is intended to be used
48/// for such things as “cannot fork”, “cannot create pipe”, or the like. It
49/// includes things like `getuid` returning a user that does not exist in the
50/// `passwd` file.
51pub const OS_ERROR: i32 = 71;
52
53/// Some system file (e.g., `/etc/passwd`, `/var/run/utmp`, etc.) does not
54/// exist, cannot be opened, or has some sort of error (e.g., syntax error).
55pub const OS_FILE_ERROR: i32 = 72;
56
57/// A (user specified) output file cannot be created.
58pub const CANNOT_CREATE: i32 = 73;
59
60/// An error occurred while doing I/O on some file.
61pub const IO_ERROR: i32 = 74;
62
63/// Temporary failure, indicating something that is not really an error. In
64/// `sendmail`, this means that a mailer (e.g.) could not create a connection,
65/// and the request should be reattempted later.
66pub const TEMPORARY_FAILURE: i32 = 75;
67
68/// The remote system returned something that was “not possible” during a
69/// protocol exchanged.
70pub const PROTOCOL_ERROR: i32 = 76;
71
72/// Insufficient permissions to perform an operation. This is not intended for
73/// file system problems, which should use `NO_INPUT` or `CANNOT_CREATE`, but
74/// rather for higher level permissions.
75pub const NO_PERMISSION: i32 = 77;
76
77/// Something was found in an unconfigured or misconfigured state.
78pub const CONFIG_ERROR: i32 = 78;
79
80/// Check if the given exit code is reserved and has a special meaning in a
81/// shells.
82///
83/// |-----------|----------------------------------------------------------|
84/// | Exit Code | Meaning |
85/// |-----------|----------------------------------------------------------|
86/// | 0 | Success |
87/// | 1 | Catchall for general errors |
88/// | 2 | Misuse of shell built-ins |
89/// | 64 | Usage Error |
90/// | 65 | Data Error |
91/// | 66 | No Input |
92/// | 67 | No User |
93/// | 68 | No Host |
94/// | 69 | Service Unavailable |
95/// | 70 | Software Error |
96/// | 71 | OS Error |
97/// | 72 | OS File Error |
98/// | 73 | Cannot Create |
99/// | 74 | IO Error |
100/// | 75 | Temporary Failure |
101/// | 76 | Protocol Error |
102/// | 77 | No Permission |
103/// | 78 | Config Error |
104/// | 126 | Command invoked cannot execute |
105/// | 127 | Command not found |
106/// | 128 | Invalid argument to `exit` |
107/// | 128–137 | Fatal error signal (`kill -n` where `n` is added to 128) |
108/// | 256+ | Exit status out of range |
109/// |-----------|----------------------------------------------------------|
110pub fn is_reserved(c: i32) -> bool {
111 (0 <= c && c <= 2) || (64 <= c && c <= 78) || (126 <= c && c <= 137)
112}
113
114/// Check if the given exit code is in [0..256].
115pub fn is_valid(c: i32) -> bool {
116 0 <= c && c <= 255
117}