1use super::format_message_utf8;
2use core::slice;
3
4extern "C" {
5 #[cfg(any(
6 target_os = "linux",
7 target_os = "redox",
8 target_os = "dragonfly",
9 target_os = "fuchsia"
10 ))]
11 #[link_name = "__errno_location"]
12 fn errno_location() -> *mut i32;
13
14 #[cfg(any(target_os = "android", target_os = "netbsd", target_os = "openbsd"))]
15 #[link_name = "__errno"]
16 fn errno_location() -> *mut i32;
17
18 #[cfg(any(target_os = "ios", target_os = "macos", target_os = "freebsd"))]
19 #[link_name = "__error"]
20 fn errno_location() -> *mut i32;
21
22 #[cfg(any(target_os = "illumos", target_os = "solaris"))]
23 #[link_name = "___errno"]
24 fn errno_location() -> *mut i32;
25
26 #[cfg(target_os = "haiku")]
27 #[link_name = "_errnop"]
28 fn errno_location() -> *mut i32;
29
30 #[cfg(all(target_os = "windows", target_env = "gnu"))]
32 #[link_name = "_errno"]
33 fn errno_location() -> *mut i32;
34
35 fn strerror(errno: i32) -> *const u8;
36 fn strlen(s: *const u8) -> usize;
37}
38
39pub fn errno() -> i32 {
40 unsafe { *errno_location() }
43}
44
45pub fn set_errno(errno: i32) {
46 unsafe { *errno_location() = errno };
49}
50
51pub fn errmsg(errno: i32, msg: &mut [u8]) -> &str {
52 let s = unsafe { strerror(errno) };
53 let len = unsafe { strlen(s) };
54 let info = unsafe { slice::from_raw_parts(s, len) };
55 return format_message_utf8(info, msg);
56}
57
58#[cfg(unix)]
59mod errors {
60 pub const EPERM: i32 = 1; pub const ENOENT: i32 = 2; pub const ESRCH: i32 = 3; pub const EINTR: i32 = 4; pub const EIO: i32 = 5; pub const ENXIO: i32 = 6; pub const E2BIG: i32 = 7; pub const ENOEXEC: i32 = 8; pub const EBADF: i32 = 9; pub const ECHILD: i32 = 10; pub const EAGAIN: i32 = 11; pub const ENOMEM: i32 = 12; pub const EACCES: i32 = 13; pub const EFAULT: i32 = 14; pub const ENOTBLK: i32 = 15; pub const EBUSY: i32 = 16; pub const EEXIST: i32 = 17; pub const EXDEV: i32 = 18; pub const ENODEV: i32 = 19; pub const ENOTDIR: i32 = 20; pub const EISDIR: i32 = 21; pub const EINVAL: i32 = 22; pub const ENFILE: i32 = 23; pub const EMFILE: i32 = 24; pub const ENOTTY: i32 = 25; pub const ETXTBSY: i32 = 26; pub const EFBIG: i32 = 27; pub const ENOSPC: i32 = 28; pub const ESPIPE: i32 = 29; pub const EROFS: i32 = 30; pub const EMLINK: i32 = 31; pub const EPIPE: i32 = 32; pub const EDOM: i32 = 33; pub const ERANGE: i32 = 34; pub const EDEADLK: i32 = 35; pub const ENAMETOOLONG: i32 = 36; pub const ENOLCK: i32 = 37; pub const ENOSYS: i32 = 38; pub const ENOTEMPTY: i32 = 39; pub const ELOOP: i32 = 40; pub const EWOULDBLOCK: i32 = EAGAIN; pub const ENOMSG: i32 = 42; pub const EIDRM: i32 = 43; pub const ECHRNG: i32 = 44; pub const EL2NSYNC: i32 = 45; pub const EL3HLT: i32 = 46; pub const EL3RST: i32 = 47; pub const ELNRNG: i32 = 48; pub const EUNATCH: i32 = 49; pub const ENOCSI: i32 = 50; pub const EL2HLT: i32 = 51; pub const EBADE: i32 = 52; pub const EBADR: i32 = 53; pub const EXFULL: i32 = 54; pub const ENOANO: i32 = 55; pub const EBADRQC: i32 = 56; pub const EBADSLT: i32 = 57; pub const EDEADLOCK: i32 = EDEADLK;
128
129 pub const EBFONT: i32 = 59; pub const ENOSTR: i32 = 60; pub const ENODATA: i32 = 61; pub const ETIME: i32 = 62; pub const ENOSR: i32 = 63; pub const ENONET: i32 = 64; pub const ENOPKG: i32 = 65; pub const EREMOTE: i32 = 66; pub const ENOLINK: i32 = 67; pub const EADV: i32 = 68; pub const ESRMNT: i32 = 69; pub const ECOMM: i32 = 70; pub const EPROTO: i32 = 71; pub const EMULTIHOP: i32 = 72; pub const EDOTDOT: i32 = 73; pub const EBADMSG: i32 = 74; pub const EOVERFLOW: i32 = 75; pub const ENOTUNIQ: i32 = 76; pub const EBADFD: i32 = 77; pub const EREMCHG: i32 = 78; pub const ELIBACC: i32 = 79; pub const ELIBBAD: i32 = 80; pub const ELIBSCN: i32 = 81; pub const ELIBMAX: i32 = 82; pub const ELIBEXEC: i32 = 83; pub const EILSEQ: i32 = 84; pub const ERESTART: i32 = 85; pub const ESTRPIPE: i32 = 86; pub const EUSERS: i32 = 87; pub const ENOTSOCK: i32 = 88; pub const EDESTADDRREQ: i32 = 89; pub const EMSGSIZE: i32 = 90; pub const EPROTOTYPE: i32 = 91; pub const ENOPROTOOPT: i32 = 92; pub const EPROTONOSUPPORT: i32 = 93; pub const ESOCKTNOSUPPORT: i32 = 94; pub const EOPNOTSUPP: i32 = 95; pub const EPFNOSUPPORT: i32 = 96; pub const EAFNOSUPPORT: i32 = 97; pub const EADDRINUSE: i32 = 98; pub const EADDRNOTAVAIL: i32 = 99; pub const ENETDOWN: i32 = 100; pub const ENETUNREACH: i32 = 101; pub const ENETRESET: i32 = 102; pub const ECONNABORTED: i32 = 103; pub const ECONNRESET: i32 = 104; pub const ENOBUFS: i32 = 105; pub const EISCONN: i32 = 106; pub const ENOTCONN: i32 = 107; pub const ESHUTDOWN: i32 = 108; pub const ETOOMANYREFS: i32 = 109; pub const ETIMEDOUT: i32 = 110; pub const ECONNREFUSED: i32 = 111; pub const EHOSTDOWN: i32 = 112; pub const EHOSTUNREACH: i32 = 113; pub const EALREADY: i32 = 114; pub const EINPROGRESS: i32 = 115; pub const ESTALE: i32 = 116; pub const EUCLEAN: i32 = 117; pub const ENOTNAM: i32 = 118; pub const ENAVAIL: i32 = 119; pub const EISNAM: i32 = 120; pub const EREMOTEIO: i32 = 121; pub const EDQUOT: i32 = 122; pub const ENOMEDIUM: i32 = 123; pub const EMEDIUMTYPE: i32 = 124; pub const ECANCELED: i32 = 125; pub const ENOKEY: i32 = 126; pub const EKEYEXPIRED: i32 = 127; pub const EKEYREVOKED: i32 = 128; pub const EKEYREJECTED: i32 = 129; pub const EOWNERDEAD: i32 = 130; pub const ENOTRECOVERABLE: i32 = 131; pub const ERFKILL: i32 = 132; pub const EHWPOISON: i32 = 133; }
209
210#[cfg(all(target_os = "windows", target_env = "gnu"))]
211mod errors {
212 pub const EPERM: i32 = 1;
213 pub const ENOENT: i32 = 2;
214 pub const ENOFILE: i32 = ENOENT;
215 pub const ESRCH: i32 = 3;
216 pub const EINTR: i32 = 4;
217 pub const EIO: i32 = 5;
218 pub const ENXIO: i32 = 6;
219 pub const E2BIG: i32 = 7;
220 pub const ENOEXEC: i32 = 8;
221 pub const EBADF: i32 = 9;
222 pub const ECHILD: i32 = 10;
223 pub const EAGAIN: i32 = 11;
224 pub const ENOMEM: i32 = 12;
225 pub const EACCES: i32 = 13;
226 pub const EFAULT: i32 = 14;
227 pub const EBUSY: i32 = 16;
228 pub const EEXIST: i32 = 17;
229 pub const EXDEV: i32 = 18;
230 pub const ENODEV: i32 = 19;
231 pub const ENOTDIR: i32 = 20;
232 pub const EISDIR: i32 = 21;
233 pub const ENFILE: i32 = 23;
234 pub const EMFILE: i32 = 24;
235 pub const ENOTTY: i32 = 25;
236 pub const EFBIG: i32 = 27;
237 pub const ENOSPC: i32 = 28;
238 pub const ESPIPE: i32 = 29;
239 pub const EROFS: i32 = 30;
240 pub const EMLINK: i32 = 31;
241 pub const EPIPE: i32 = 32;
242 pub const EDOM: i32 = 33;
243 pub const EDEADLK: i32 = 36;
244 pub const EDEADLOCK: i32 = EDEADLK;
245 pub const ENAMETOOLONG: i32 = 38;
246 pub const ENOLCK: i32 = 39;
247 pub const ENOSYS: i32 = 40;
248 pub const ENOTEMPTY: i32 = 41;
249 pub const EINVAL: i32 = 22;
250 pub const ERANGE: i32 = 34;
251 pub const EILSEQ: i32 = 42;
252 pub const ENOTSUP: i32 = 129;
253 pub const EAFNOSUPPORT: i32 = 102;
254 pub const EADDRINUSE: i32 = 100;
255 pub const EADDRNOTAVAIL: i32 = 101;
256 pub const EISCONN: i32 = 113;
257 pub const ENOBUFS: i32 = 119;
258 pub const ECONNABORTED: i32 = 106;
259 pub const EALREADY: i32 = 103;
260 pub const ECONNREFUSED: i32 = 107;
261 pub const ECONNRESET: i32 = 108;
262 pub const EDESTADDRREQ: i32 = 109;
263 pub const EHOSTUNREACH: i32 = 110;
264 pub const EMSGSIZE: i32 = 115;
265 pub const ENETDOWN: i32 = 116;
266 pub const ENETRESET: i32 = 117;
267 pub const ENETUNREACH: i32 = 118;
268 pub const ENOPROTOOPT: i32 = 123;
269 pub const ENOTSOCK: i32 = 128;
270 pub const ENOTCONN: i32 = 126;
271 pub const ECANCELED: i32 = 105;
272 pub const EINPROGRESS: i32 = 112;
273 pub const EOPNOTSUPP: i32 = 130;
274 pub const EWOULDBLOCK: i32 = 140;
275 pub const EOWNERDEAD: i32 = 133;
276 pub const EPROTO: i32 = 134;
277 pub const EPROTONOSUPPORT: i32 = 135;
278 pub const EBADMSG: i32 = 104;
279 pub const EIDRM: i32 = 111;
280 pub const ENODATA: i32 = 120;
281 pub const ENOLINK: i32 = 121;
282 pub const ENOMSG: i32 = 122;
283 pub const ENOSR: i32 = 124;
284 pub const ENOSTR: i32 = 125;
285 pub const ENOTRECOVERABLE: i32 = 127;
286 pub const ETIME: i32 = 137;
287 pub const ETXTBSY: i32 = 139;
288 pub const ETIMEDOUT: i32 = 138;
289 pub const ELOOP: i32 = 114;
290 pub const EPROTOTYPE: i32 = 136;
291 pub const EOVERFLOW: i32 = 132;
292}
293
294pub use errors::*;