mach_sys/
kern_return.rs

1//! This module corresponds to `mach/kern_return.h`.
2
3#![allow(non_camel_case_types)]
4
5use crate::NONCE_RANDOM;
6use crate::ffi::c_int;
7
8/// ...Except for this particular type, which is taken from
9/// 1. `mach/i386/kern_return.h` (x86-based CPUs).
10/// 2. `mach/arm/kern_return.h`  (arm-based CPUs).
11/// 
12/// it is the same type in both header files.
13pub type kern_return_t = c_int;
14
15#[derive(
16    Copy, Clone,
17    Hash,
18    PartialEq, Eq,
19    PartialOrd, Ord,
20)]
21/// the enum for all error code returned from mach kernel.
22/// this allows double-ended query: converting from integer to enum, and reverse mapping from enum to integer.
23///
24/// **NOTE: the inner enum value (isize) is randomly generated by each compile. it is NOT ACTUAL kernel return code. it must not to be used from down-stream projects. this internal value just used for `PartialOrd & Ord` for compare between two enum instances.**
25pub enum KERN_RETURN {
26    KERN_SUCCESS = (NONCE_RANDOM%0xff_ff_ff_f) as isize,
27    KERN_INVALID_ADDRESS,
28    KERN_PROTECTION_FAILURE,
29    KERN_NO_SPACE,
30    KERN_INVALID_ARGUMENT,
31    KERN_FAILURE,
32    KERN_RESOURCE_SHORTAGE,
33    KERN_NOT_RECEIVER,
34    KERN_NO_ACCESS,
35    KERN_MEMORY_FAILURE,
36    KERN_MEMORY_ERROR,
37    KERN_ALREADY_IN_SET,
38    KERN_NOT_IN_SET,
39    KERN_NAME_EXISTS,
40    KERN_ABORTED,
41    KERN_INVALID_NAME,
42    KERN_INVALID_TASK,
43    KERN_INVALID_RIGHT,
44    KERN_INVALID_VALUE,
45    KERN_UREFS_OVERFLOW,
46    KERN_INVALID_CAPABILITY,
47    KERN_RIGHT_EXISTS,
48    KERN_INVALID_HOST,
49    KERN_MEMORY_PRESENT,
50    KERN_MEMORY_DATA_MOVED,
51    KERN_MEMORY_RESTART_COPY,
52    KERN_INVALID_PROCESSOR_SET,
53    KERN_POLICY_LIMIT,
54    KERN_INVALID_POLICY,
55    KERN_INVALID_OBJECT,
56    KERN_ALREADY_WAITING,
57    KERN_DEFAULT_SET,
58    KERN_EXCEPTION_PROTECTED,
59    KERN_INVALID_LEDGER,
60    KERN_INVALID_MEMORY_CONTROL,
61    KERN_INVALID_SECURITY,
62    KERN_NOT_DEPRESSED,
63    KERN_TERMINATED,
64    KERN_LOCK_SET_DESTROYED,
65    KERN_LOCK_UNSTABLE,
66    KERN_LOCK_OWNED,
67    KERN_LOCK_OWNED_SELF,
68    KERN_SEMAPHORE_DESTROYED,
69    KERN_RPC_SERVER_TERMINATED,
70    KERN_RPC_TERMINATE_ORPHAN,
71    KERN_RPC_CONTINUE_ORPHAN,
72    KERN_NOT_SUPPORTED,
73    KERN_NODE_DOWN,
74    KERN_NOT_WAITING,
75    KERN_OPERATION_TIMED_OUT,
76    KERN_CODESIGN_ERROR,
77    KERN_POLICY_STATIC,
78    KERN_RETURN_MAX,
79}
80
81impl core::fmt::Display for KERN_RETURN {
82    fn fmt(&self, f: &mut core::fmt::Formatter)
83        -> Result<(), core::fmt::Error>
84    {
85        f.write_str(self.stringify())
86    }
87}
88impl core::fmt::Debug for KERN_RETURN {
89    fn fmt(&self, f: &mut core::fmt::Formatter)
90        -> Result<(), core::fmt::Error>
91    {
92        f.write_str(self.stringify())
93    }
94}
95
96impl KERN_RETURN {
97    pub const fn stringify(&self) -> &'static str {
98        match self {
99            Self::KERN_SUCCESS => "KERN_SUCCESS(0)",
100            Self::KERN_INVALID_ADDRESS => "KERN_INVALID_ADDRESS(1)",
101            Self::KERN_PROTECTION_FAILURE => "KERN_PROTECTION_FAILURE(2)",
102            Self::KERN_NO_SPACE => "KERN_NO_SPACE(3)",
103            Self::KERN_INVALID_ARGUMENT => "KERN_INVALID_ARGUMENT(4)",
104            Self::KERN_FAILURE => "KERN_FAILURE(5)",                Self::KERN_RESOURCE_SHORTAGE => "KERN_RESOURCE_SHORTAGE(6)",                                                    Self::KERN_NOT_RECEIVER => "KERN_NOT_RECEIVER(7)",                                                              Self::KERN_NO_ACCESS => "KERN_NO_ACCESS(8)",
105            Self::KERN_MEMORY_FAILURE => "KERN_MEMORY_FAILURE(9)",
106            Self::KERN_MEMORY_ERROR => "KERN_MEMORY_ERROR(10)",
107            Self::KERN_ALREADY_IN_SET => "KERN_ALREADY_IN_SET(11)",
108            Self::KERN_NOT_IN_SET => "KERN_NOT_IN_SET(12)",
109            Self::KERN_NAME_EXISTS => "KERN_NAME_EXISTS(13)",
110            Self::KERN_ABORTED => "KERN_ABORTED(14)",
111            Self::KERN_INVALID_NAME => "KERN_INVALID_NAME(15)",
112            Self::KERN_INVALID_TASK => "KERN_INVALID_TASK(16)",
113            Self::KERN_INVALID_RIGHT => "KERN_INVALID_RIGHT(17)",
114            Self::KERN_INVALID_VALUE => "KERN_INVALID_VALUE(18)",
115            Self::KERN_UREFS_OVERFLOW => "KERN_UREFS_OVERFLOW(19)",
116            Self::KERN_INVALID_CAPABILITY => "KERN_INVALID_CAPABILITY(20)",
117            Self::KERN_RIGHT_EXISTS => "KERN_RIGHT_EXISTS(21)",
118            Self::KERN_INVALID_HOST => "KERN_INVALID_HOST(22)",
119            Self::KERN_MEMORY_PRESENT => "KERN_MEMORY_PRESENT(23)",
120            Self::KERN_MEMORY_DATA_MOVED => "KERN_MEMORY_DATA_MOVED(24)",
121            Self::KERN_MEMORY_RESTART_COPY => "KERN_MEMORY_RESTART_COPY(25)",
122            Self::KERN_INVALID_PROCESSOR_SET => "KERN_INVALID_PROCESSOR_SET(26)",
123            Self::KERN_POLICY_LIMIT => "KERN_POLICY_LIMIT(27)",
124            Self::KERN_INVALID_POLICY => "KERN_INVALID_POLICY(28)",
125            Self::KERN_INVALID_OBJECT => "KERN_INVALID_OBJECT(29)",
126            Self::KERN_ALREADY_WAITING => "KERN_ALREADY_WAITING(30)",
127            Self::KERN_DEFAULT_SET => "KERN_DEFAULT_SET(31)",
128            Self::KERN_EXCEPTION_PROTECTED => "KERN_EXCEPTION_PROTECTED(32)",
129            Self::KERN_INVALID_LEDGER => "KERN_INVALID_LEDGER(33)",
130            Self::KERN_INVALID_MEMORY_CONTROL => "KERN_INVALID_MEMORY_CONTROL(34)",
131            Self::KERN_INVALID_SECURITY => "KERN_INVALID_SECURITY(35)",
132            Self::KERN_NOT_DEPRESSED => "KERN_NOT_DEPRESSED(36)",
133            Self::KERN_TERMINATED => "KERN_TERMINATED(37)",
134            Self::KERN_LOCK_SET_DESTROYED => "KERN_LOCK_SET_DESTROYED(38)",
135            Self::KERN_LOCK_UNSTABLE => "KERN_LOCK_UNSTABLE(39)",
136            Self::KERN_LOCK_OWNED => "KERN_LOCK_OWNED(40)",
137            Self::KERN_LOCK_OWNED_SELF => "KERN_LOCK_OWNED_SELF(41)",
138            Self::KERN_SEMAPHORE_DESTROYED => "KERN_SEMAPHORE_DESTROYED(42)",
139            Self::KERN_RPC_SERVER_TERMINATED => "KERN_RPC_SERVER_TERMINATED(43)",
140            Self::KERN_RPC_TERMINATE_ORPHAN => "KERN_RPC_TERMINATE_ORPHAN(44)",
141            Self::KERN_RPC_CONTINUE_ORPHAN => "KERN_RPC_CONTINUE_ORPHAN(45)",
142            Self::KERN_NOT_SUPPORTED => "KERN_NOT_SUPPORTED(46)",
143            Self::KERN_NODE_DOWN => "KERN_NODE_DOWN(47)",
144            Self::KERN_NOT_WAITING => "KERN_NOT_WAITING(48)",
145            Self::KERN_OPERATION_TIMED_OUT => "KERN_OPERATION_TIMED_OUT(49)",
146            Self::KERN_CODESIGN_ERROR => "KERN_CODESIGN_ERROR(50)",
147            Self::KERN_POLICY_STATIC => "KERN_POLICY_STATIC(51)",
148            Self::KERN_RETURN_MAX => "KERN_RETURN_MAX(256)",
149        }
150    }
151
152    pub const fn is_ok(&self) -> bool {
153        match self {
154            Self::KERN_SUCCESS => true,
155            _                  => false,
156        }
157    }
158    pub const fn is_err(&self) -> bool {
159        ! self.is_ok()
160    }
161
162    pub const fn is_success(&self) -> bool {
163        self.is_ok()
164    }
165    pub const fn is_failed(&self) -> bool {
166        self.is_err()
167    }
168
169    pub const fn to_int(&self) -> kern_return_t {
170        match self {
171            Self::KERN_SUCCESS                => 0,
172            Self::KERN_INVALID_ADDRESS        => 1,
173            Self::KERN_PROTECTION_FAILURE     => 2,
174            Self::KERN_NO_SPACE               => 3,
175            Self::KERN_INVALID_ARGUMENT       => 4,
176            Self::KERN_FAILURE                => 5,
177            Self::KERN_RESOURCE_SHORTAGE      => 6,
178            Self::KERN_NOT_RECEIVER           => 7,
179            Self::KERN_NO_ACCESS              => 8,
180            Self::KERN_MEMORY_FAILURE         => 9,
181            Self::KERN_MEMORY_ERROR           => 10,
182            Self::KERN_ALREADY_IN_SET         => 11,
183            Self::KERN_NOT_IN_SET             => 12,
184            Self::KERN_NAME_EXISTS            => 13,
185            Self::KERN_ABORTED                => 14,
186            Self::KERN_INVALID_NAME           => 15,
187            Self::KERN_INVALID_TASK           => 16,
188            Self::KERN_INVALID_RIGHT          => 17,
189            Self::KERN_INVALID_VALUE          => 18,
190            Self::KERN_UREFS_OVERFLOW         => 19,
191            Self::KERN_INVALID_CAPABILITY     => 20,
192            Self::KERN_RIGHT_EXISTS           => 21,
193            Self::KERN_INVALID_HOST           => 22,
194            Self::KERN_MEMORY_PRESENT         => 23,
195            Self::KERN_MEMORY_DATA_MOVED      => 24,
196            Self::KERN_MEMORY_RESTART_COPY    => 25,
197            Self::KERN_INVALID_PROCESSOR_SET  => 26,
198            Self::KERN_POLICY_LIMIT           => 27,
199            Self::KERN_INVALID_POLICY         => 28,
200            Self::KERN_INVALID_OBJECT         => 29,
201            Self::KERN_ALREADY_WAITING        => 30,
202            Self::KERN_DEFAULT_SET            => 31,
203            Self::KERN_EXCEPTION_PROTECTED    => 32,
204            Self::KERN_INVALID_LEDGER         => 33,
205            Self::KERN_INVALID_MEMORY_CONTROL => 34,
206            Self::KERN_INVALID_SECURITY       => 35,
207            Self::KERN_NOT_DEPRESSED          => 36,
208            Self::KERN_TERMINATED             => 37,
209            Self::KERN_LOCK_SET_DESTROYED     => 38,
210            Self::KERN_LOCK_UNSTABLE          => 39,
211            Self::KERN_LOCK_OWNED             => 40,
212            Self::KERN_LOCK_OWNED_SELF        => 41,
213            Self::KERN_SEMAPHORE_DESTROYED    => 42,
214            Self::KERN_RPC_SERVER_TERMINATED  => 43,
215            Self::KERN_RPC_TERMINATE_ORPHAN   => 44,
216            Self::KERN_RPC_CONTINUE_ORPHAN    => 45,
217            Self::KERN_NOT_SUPPORTED          => 46,
218            Self::KERN_NODE_DOWN              => 47,
219            Self::KERN_NOT_WAITING            => 48,
220            Self::KERN_OPERATION_TIMED_OUT    => 49,
221            Self::KERN_CODESIGN_ERROR         => 50,
222            Self::KERN_POLICY_STATIC          => 51,
223            Self::KERN_RETURN_MAX             => 256,
224        }
225    }
226
227    pub const fn from_int(val: kern_return_t) -> Self {
228        match Self::try_from_int(val) {
229            Ok(v) => v,
230            _ => {
231                panic!(
232                    "provided kern_return_t is invalid!"
233                );
234            }
235        }
236    }
237
238    pub const fn try_from_int(val: kern_return_t)
239        -> Result<Self, kern_return_t>
240    {
241        match val {
242            0   => Ok(Self::KERN_SUCCESS),
243            1   => Ok(Self::KERN_INVALID_ADDRESS),
244            2   => Ok(Self::KERN_PROTECTION_FAILURE),
245            3   => Ok(Self::KERN_NO_SPACE),
246            4   => Ok(Self::KERN_INVALID_ARGUMENT),
247            5   => Ok(Self::KERN_FAILURE),
248            6   => Ok(Self::KERN_RESOURCE_SHORTAGE),
249            7   => Ok(Self::KERN_NOT_RECEIVER),
250            8   => Ok(Self::KERN_NO_ACCESS),
251            9   => Ok(Self::KERN_MEMORY_FAILURE),
252            10  => Ok(Self::KERN_MEMORY_ERROR),
253            11  => Ok(Self::KERN_ALREADY_IN_SET),
254            12  => Ok(Self::KERN_NOT_IN_SET),
255            13  => Ok(Self::KERN_NAME_EXISTS),
256            14  => Ok(Self::KERN_ABORTED),
257            15  => Ok(Self::KERN_INVALID_NAME),
258            16  => Ok(Self::KERN_INVALID_TASK),
259            17  => Ok(Self::KERN_INVALID_RIGHT),
260            18  => Ok(Self::KERN_INVALID_VALUE),
261            19  => Ok(Self::KERN_UREFS_OVERFLOW),
262            20  => Ok(Self::KERN_INVALID_CAPABILITY),
263            21  => Ok(Self::KERN_RIGHT_EXISTS),
264            22  => Ok(Self::KERN_INVALID_HOST),
265            23  => Ok(Self::KERN_MEMORY_PRESENT),
266            24  => Ok(Self::KERN_MEMORY_DATA_MOVED),
267            25  => Ok(Self::KERN_MEMORY_RESTART_COPY),
268            26  => Ok(Self::KERN_INVALID_PROCESSOR_SET),
269            27  => Ok(Self::KERN_POLICY_LIMIT),
270            28  => Ok(Self::KERN_INVALID_POLICY),
271            29  => Ok(Self::KERN_INVALID_OBJECT),
272            30  => Ok(Self::KERN_ALREADY_WAITING),
273            31  => Ok(Self::KERN_DEFAULT_SET),
274            32  => Ok(Self::KERN_EXCEPTION_PROTECTED),
275            33  => Ok(Self::KERN_INVALID_LEDGER),
276            34  => Ok(Self::KERN_INVALID_MEMORY_CONTROL),
277            35  => Ok(Self::KERN_INVALID_SECURITY),
278            36  => Ok(Self::KERN_NOT_DEPRESSED),
279            37  => Ok(Self::KERN_TERMINATED),
280            38  => Ok(Self::KERN_LOCK_SET_DESTROYED),
281            39  => Ok(Self::KERN_LOCK_UNSTABLE),
282            40  => Ok(Self::KERN_LOCK_OWNED),
283            41  => Ok(Self::KERN_LOCK_OWNED_SELF),
284            42  => Ok(Self::KERN_SEMAPHORE_DESTROYED),
285            43  => Ok(Self::KERN_RPC_SERVER_TERMINATED),
286            44  => Ok(Self::KERN_RPC_TERMINATE_ORPHAN),
287            45  => Ok(Self::KERN_RPC_CONTINUE_ORPHAN),
288            46  => Ok(Self::KERN_NOT_SUPPORTED),
289            47  => Ok(Self::KERN_NODE_DOWN),
290            48  => Ok(Self::KERN_NOT_WAITING),
291            49  => Ok(Self::KERN_OPERATION_TIMED_OUT),
292            50  => Ok(Self::KERN_CODESIGN_ERROR),
293            51  => Ok(Self::KERN_POLICY_STATIC),
294            256 => Ok(Self::KERN_RETURN_MAX),
295
296            _   => Err(val),
297        }
298    }
299}
300
301macro_rules! _enum_int_impl {
302    ($t:ty) => {
303        impl core::convert::TryFrom<$t> for KERN_RETURN
304        {
305            type Error = $t;
306            fn try_from(val: $t)
307                -> Result<KERN_RETURN, $t>
308            {
309                KERN_RETURN::try_from_int(
310                    val as kern_return_t
311                ).map_err(|_|{ val })
312            }
313        }
314
315        impl From<KERN_RETURN> for $t {
316            fn from(val: KERN_RETURN) -> $t {
317                val.to_int() as $t
318            }
319        }
320
321        impl PartialEq<$t> for KERN_RETURN {
322            fn eq(&self, other: &$t) -> bool {
323                (self.to_int() as $t) == (*other)
324            }
325        }
326        impl PartialEq<KERN_RETURN> for $t {
327            fn eq(&self, other: &KERN_RETURN) -> bool {
328                (other.to_int() as $t) == (*self)
329            }
330        }
331    }
332}
333
334
335// _enum_int_impl!(kern_return_t);
336//
337// NOTE: this is not required, due to `kern_return_t` always equal to c_int = i32.
338// 
339//      (even in future, if 32-bit CPUs has deprecated completely...)
340//      (so 32-bit no long exists in the IT world, c_int changed to i64, this case will be covered.)
341//
342//      (in fact it works in all type of integer that Rust-supprted.)
343//      (so if one day, may or may not happen: in far future, if all CPUs has been replaced by 128-bit, it also supported.)
344//
345
346_enum_int_impl!(usize); _enum_int_impl!(isize);
347_enum_int_impl!(u8);    _enum_int_impl!(i8);
348_enum_int_impl!(u16);   _enum_int_impl!(i16);
349_enum_int_impl!(u32);   _enum_int_impl!(i32);
350_enum_int_impl!(u64);   _enum_int_impl!(i64);
351_enum_int_impl!(u128);  _enum_int_impl!(i128);
352
353/* this provide compatible for programs that early-written before the OOP changes */
354
355pub const KERN_SUCCESS: kern_return_t =
356    KERN_RETURN::KERN_SUCCESS.to_int();
357
358pub const KERN_INVALID_ADDRESS: kern_return_t =
359    KERN_RETURN::KERN_INVALID_ADDRESS.to_int();
360
361pub const KERN_PROTECTION_FAILURE: kern_return_t =
362    KERN_RETURN::KERN_PROTECTION_FAILURE.to_int();
363
364pub const KERN_NO_SPACE: kern_return_t =
365    KERN_RETURN::KERN_NO_SPACE.to_int();
366
367pub const KERN_INVALID_ARGUMENT: kern_return_t =
368    KERN_RETURN::KERN_INVALID_ARGUMENT.to_int();
369
370pub const KERN_FAILURE: kern_return_t =
371    KERN_RETURN::KERN_FAILURE.to_int();
372
373pub const KERN_RESOURCE_SHORTAGE: kern_return_t =
374    KERN_RETURN::KERN_RESOURCE_SHORTAGE.to_int();
375
376pub const KERN_NOT_RECEIVER: kern_return_t =
377    KERN_RETURN::KERN_NOT_RECEIVER.to_int();
378
379pub const KERN_NO_ACCESS: kern_return_t =
380    KERN_RETURN::KERN_NO_ACCESS.to_int();
381
382pub const KERN_MEMORY_FAILURE: kern_return_t =
383    KERN_RETURN::KERN_MEMORY_FAILURE.to_int();
384
385pub const KERN_MEMORY_ERROR: kern_return_t =
386    KERN_RETURN::KERN_MEMORY_ERROR.to_int();
387
388pub const KERN_ALREADY_IN_SET: kern_return_t =
389    KERN_RETURN::KERN_ALREADY_IN_SET.to_int();
390
391pub const KERN_NOT_IN_SET: kern_return_t =
392    KERN_RETURN::KERN_NOT_IN_SET.to_int();
393
394pub const KERN_NAME_EXISTS: kern_return_t =
395    KERN_RETURN::KERN_NAME_EXISTS.to_int();
396
397pub const KERN_ABORTED: kern_return_t =
398    KERN_RETURN::KERN_ABORTED.to_int();
399
400pub const KERN_INVALID_NAME: kern_return_t =
401    KERN_RETURN::KERN_INVALID_NAME.to_int();
402
403pub const KERN_INVALID_TASK: kern_return_t =
404    KERN_RETURN::KERN_INVALID_TASK.to_int();
405
406pub const KERN_INVALID_RIGHT: kern_return_t =
407    KERN_RETURN::KERN_INVALID_RIGHT.to_int();
408
409pub const KERN_INVALID_VALUE: kern_return_t =
410    KERN_RETURN::KERN_INVALID_VALUE.to_int();
411
412pub const KERN_UREFS_OVERFLOW: kern_return_t =
413    KERN_RETURN::KERN_UREFS_OVERFLOW.to_int();
414
415pub const KERN_INVALID_CAPABILITY: kern_return_t =
416    KERN_RETURN::KERN_INVALID_CAPABILITY.to_int();
417
418pub const KERN_RIGHT_EXISTS: kern_return_t =
419    KERN_RETURN::KERN_RIGHT_EXISTS.to_int();
420
421pub const KERN_INVALID_HOST: kern_return_t =
422    KERN_RETURN::KERN_INVALID_HOST.to_int();
423
424pub const KERN_MEMORY_PRESENT: kern_return_t =
425    KERN_RETURN::KERN_MEMORY_PRESENT.to_int();
426
427pub const KERN_MEMORY_DATA_MOVED: kern_return_t =
428    KERN_RETURN::KERN_MEMORY_DATA_MOVED.to_int();
429
430pub const KERN_MEMORY_RESTART_COPY: kern_return_t =
431    KERN_RETURN::KERN_MEMORY_RESTART_COPY.to_int();
432
433pub const KERN_INVALID_PROCESSOR_SET: kern_return_t =
434    KERN_RETURN::KERN_INVALID_PROCESSOR_SET.to_int();
435
436pub const KERN_POLICY_LIMIT: kern_return_t =
437    KERN_RETURN::KERN_POLICY_LIMIT.to_int();
438
439pub const KERN_INVALID_POLICY: kern_return_t =
440    KERN_RETURN::KERN_INVALID_POLICY.to_int();
441
442pub const KERN_INVALID_OBJECT: kern_return_t =
443    KERN_RETURN::KERN_INVALID_OBJECT.to_int();
444
445pub const KERN_ALREADY_WAITING: kern_return_t =
446    KERN_RETURN::KERN_ALREADY_WAITING.to_int();
447
448pub const KERN_DEFAULT_SET: kern_return_t =
449    KERN_RETURN::KERN_DEFAULT_SET.to_int();
450
451pub const KERN_EXCEPTION_PROTECTED: kern_return_t =
452    KERN_RETURN::KERN_EXCEPTION_PROTECTED.to_int();
453
454pub const KERN_INVALID_LEDGER: kern_return_t =
455    KERN_RETURN::KERN_INVALID_LEDGER.to_int();
456
457pub const KERN_INVALID_MEMORY_CONTROL: kern_return_t =
458    KERN_RETURN::KERN_INVALID_MEMORY_CONTROL.to_int();
459
460pub const KERN_INVALID_SECURITY: kern_return_t =
461    KERN_RETURN::KERN_INVALID_SECURITY.to_int();
462
463pub const KERN_NOT_DEPRESSED: kern_return_t =
464    KERN_RETURN::KERN_NOT_DEPRESSED.to_int();
465
466pub const KERN_TERMINATED: kern_return_t =
467    KERN_RETURN::KERN_TERMINATED.to_int();
468
469pub const KERN_LOCK_SET_DESTROYED: kern_return_t =
470    KERN_RETURN::KERN_LOCK_SET_DESTROYED.to_int();
471
472pub const KERN_LOCK_UNSTABLE: kern_return_t =
473    KERN_RETURN::KERN_LOCK_UNSTABLE.to_int();
474
475pub const KERN_LOCK_OWNED: kern_return_t =
476    KERN_RETURN::KERN_LOCK_OWNED.to_int();
477
478pub const KERN_LOCK_OWNED_SELF: kern_return_t =
479    KERN_RETURN::KERN_LOCK_OWNED_SELF.to_int();
480
481pub const KERN_SEMAPHORE_DESTROYED: kern_return_t =
482    KERN_RETURN::KERN_SEMAPHORE_DESTROYED.to_int();
483
484pub const KERN_RPC_SERVER_TERMINATED: kern_return_t =
485    KERN_RETURN::KERN_RPC_SERVER_TERMINATED.to_int();
486
487pub const KERN_RPC_TERMINATE_ORPHAN: kern_return_t =
488    KERN_RETURN::KERN_RPC_TERMINATE_ORPHAN.to_int();
489
490pub const KERN_RPC_CONTINUE_ORPHAN: kern_return_t =
491    KERN_RETURN::KERN_RPC_CONTINUE_ORPHAN.to_int();
492
493pub const KERN_NOT_SUPPORTED: kern_return_t =
494    KERN_RETURN::KERN_NOT_SUPPORTED.to_int();
495
496pub const KERN_NODE_DOWN: kern_return_t =
497    KERN_RETURN::KERN_NODE_DOWN.to_int();
498
499pub const KERN_NOT_WAITING: kern_return_t =
500    KERN_RETURN::KERN_NOT_WAITING.to_int();
501
502pub const KERN_OPERATION_TIMED_OUT: kern_return_t =
503    KERN_RETURN::KERN_OPERATION_TIMED_OUT.to_int();
504
505pub const KERN_CODESIGN_ERROR: kern_return_t =
506    KERN_RETURN::KERN_CODESIGN_ERROR.to_int();
507
508pub const KERN_POLICY_STATIC: kern_return_t =
509    KERN_RETURN::KERN_POLICY_STATIC.to_int();
510
511pub const KERN_RETURN_MAX: kern_return_t =
512    KERN_RETURN::KERN_RETURN_MAX.to_int();
513
514#[cfg(test)]
515mod test {
516    use super::*;
517
518    #[test]
519    fn kern_return_const_correction() {
520        assert!(0 == KERN_SUCCESS);
521        assert!(1 == KERN_INVALID_ADDRESS);
522        assert!(2 == KERN_PROTECTION_FAILURE);
523        assert!(3 == KERN_NO_SPACE);
524        assert!(4 == KERN_INVALID_ARGUMENT);
525        assert!(5 == KERN_FAILURE);
526        assert!(6 == KERN_RESOURCE_SHORTAGE);
527        assert!(7 == KERN_NOT_RECEIVER);
528        assert!(8 == KERN_NO_ACCESS);
529        assert!(9 == KERN_MEMORY_FAILURE);
530        assert!(10 == KERN_MEMORY_ERROR);
531        assert!(11 == KERN_ALREADY_IN_SET);
532        assert!(12 == KERN_NOT_IN_SET);
533        assert!(13 == KERN_NAME_EXISTS);
534        assert!(14 == KERN_ABORTED);
535        assert!(15 == KERN_INVALID_NAME);
536        assert!(16 == KERN_INVALID_TASK);
537        assert!(17 == KERN_INVALID_RIGHT);
538        assert!(18 == KERN_INVALID_VALUE);
539        assert!(19 == KERN_UREFS_OVERFLOW);
540        assert!(20 == KERN_INVALID_CAPABILITY);
541        assert!(21 == KERN_RIGHT_EXISTS);
542        assert!(22 == KERN_INVALID_HOST);
543        assert!(23 == KERN_MEMORY_PRESENT);
544        assert!(24 == KERN_MEMORY_DATA_MOVED);
545        assert!(25 == KERN_MEMORY_RESTART_COPY);
546        assert!(26 == KERN_INVALID_PROCESSOR_SET);
547        assert!(27 == KERN_POLICY_LIMIT);
548        assert!(28 == KERN_INVALID_POLICY);
549        assert!(29 == KERN_INVALID_OBJECT);
550        assert!(30 == KERN_ALREADY_WAITING);
551        assert!(31 == KERN_DEFAULT_SET);
552        assert!(32 == KERN_EXCEPTION_PROTECTED);
553        assert!(33 == KERN_INVALID_LEDGER);
554        assert!(34 == KERN_INVALID_MEMORY_CONTROL);
555        assert!(35 == KERN_INVALID_SECURITY);
556        assert!(36 == KERN_NOT_DEPRESSED);
557        assert!(37 == KERN_TERMINATED);
558        assert!(38 == KERN_LOCK_SET_DESTROYED);
559        assert!(39 == KERN_LOCK_UNSTABLE);
560        assert!(40 == KERN_LOCK_OWNED);
561        assert!(41 == KERN_LOCK_OWNED_SELF);
562        assert!(42 == KERN_SEMAPHORE_DESTROYED);
563        assert!(43 == KERN_RPC_SERVER_TERMINATED);
564        assert!(44 == KERN_RPC_TERMINATE_ORPHAN);
565        assert!(45 == KERN_RPC_CONTINUE_ORPHAN);
566        assert!(46 == KERN_NOT_SUPPORTED);
567        assert!(47 == KERN_NODE_DOWN);
568        assert!(48 == KERN_NOT_WAITING);
569        assert!(49 == KERN_OPERATION_TIMED_OUT);
570        assert!(50 == KERN_CODESIGN_ERROR);
571        assert!(51 == KERN_POLICY_STATIC);
572        assert!(256 == KERN_RETURN_MAX);
573    }
574
575    fn kern_return_enum_double_mapping() {
576        assert!(KERN_RETURN::from_int(0) == KERN_SUCCESS);
577        assert!(KERN_RETURN::from_int(1) == KERN_INVALID_ADDRESS);
578        assert!(KERN_RETURN::from_int(2) == KERN_PROTECTION_FAILURE);
579        assert!(KERN_RETURN::from_int(3) == KERN_NO_SPACE);                                                             assert!(KERN_RETURN::from_int(4) == KERN_INVALID_ARGUMENT);                                                     assert!(KERN_RETURN::from_int(5) == KERN_FAILURE);                                                              assert!(KERN_RETURN::from_int(6) == KERN_RESOURCE_SHORTAGE);                                                    assert!(KERN_RETURN::from_int(7) == KERN_NOT_RECEIVER);
580        assert!(KERN_RETURN::from_int(8) == KERN_NO_ACCESS);
581        assert!(KERN_RETURN::from_int(9) == KERN_MEMORY_FAILURE);
582        assert!(KERN_RETURN::from_int(10) == KERN_MEMORY_ERROR);
583        assert!(KERN_RETURN::from_int(11) == KERN_ALREADY_IN_SET);
584        assert!(KERN_RETURN::from_int(12) == KERN_NOT_IN_SET);
585        assert!(KERN_RETURN::from_int(13) == KERN_NAME_EXISTS);
586        assert!(KERN_RETURN::from_int(14) == KERN_ABORTED);
587        assert!(KERN_RETURN::from_int(15) == KERN_INVALID_NAME);
588        assert!(KERN_RETURN::from_int(16) == KERN_INVALID_TASK);
589        assert!(KERN_RETURN::from_int(17) == KERN_INVALID_RIGHT);
590        assert!(KERN_RETURN::from_int(18) == KERN_INVALID_VALUE);
591        assert!(KERN_RETURN::from_int(19) == KERN_UREFS_OVERFLOW);
592        assert!(KERN_RETURN::from_int(20) == KERN_INVALID_CAPABILITY);
593        assert!(KERN_RETURN::from_int(21) == KERN_RIGHT_EXISTS);
594        assert!(KERN_RETURN::from_int(22) == KERN_INVALID_HOST);
595        assert!(KERN_RETURN::from_int(23) == KERN_MEMORY_PRESENT);
596        assert!(KERN_RETURN::from_int(24) == KERN_MEMORY_DATA_MOVED);
597        assert!(KERN_RETURN::from_int(25) == KERN_MEMORY_RESTART_COPY);
598        assert!(KERN_RETURN::from_int(26) == KERN_INVALID_PROCESSOR_SET);
599        assert!(KERN_RETURN::from_int(27) == KERN_POLICY_LIMIT);
600        assert!(KERN_RETURN::from_int(28) == KERN_INVALID_POLICY);
601        assert!(KERN_RETURN::from_int(29) == KERN_INVALID_OBJECT);
602        assert!(KERN_RETURN::from_int(30) == KERN_ALREADY_WAITING);
603        assert!(KERN_RETURN::from_int(31) == KERN_DEFAULT_SET);
604        assert!(KERN_RETURN::from_int(32) == KERN_EXCEPTION_PROTECTED);
605        assert!(KERN_RETURN::from_int(33) == KERN_INVALID_LEDGER);
606        assert!(KERN_RETURN::from_int(34) == KERN_INVALID_MEMORY_CONTROL);
607        assert!(KERN_RETURN::from_int(35) == KERN_INVALID_SECURITY);
608        assert!(KERN_RETURN::from_int(36) == KERN_NOT_DEPRESSED);
609        assert!(KERN_RETURN::from_int(37) == KERN_TERMINATED);
610        assert!(KERN_RETURN::from_int(38) == KERN_LOCK_SET_DESTROYED);                                                  assert!(KERN_RETURN::from_int(39) == KERN_LOCK_UNSTABLE);
611        assert!(KERN_RETURN::from_int(40) == KERN_LOCK_OWNED);                                                          assert!(KERN_RETURN::from_int(41) == KERN_LOCK_OWNED_SELF);                                                     assert!(KERN_RETURN::from_int(42) == KERN_SEMAPHORE_DESTROYED);
612        assert!(KERN_RETURN::from_int(43) == KERN_RPC_SERVER_TERMINATED);
613        assert!(KERN_RETURN::from_int(44) == KERN_RPC_TERMINATE_ORPHAN);
614        assert!(KERN_RETURN::from_int(45) == KERN_RPC_CONTINUE_ORPHAN);
615        assert!(KERN_RETURN::from_int(46) == KERN_NOT_SUPPORTED);
616        assert!(KERN_RETURN::from_int(47) == KERN_NODE_DOWN);
617        assert!(KERN_RETURN::from_int(48) == KERN_NOT_WAITING);
618        assert!(KERN_RETURN::from_int(49) == KERN_OPERATION_TIMED_OUT);
619        assert!(KERN_RETURN::from_int(50) == KERN_CODESIGN_ERROR);
620        assert!(KERN_RETURN::from_int(51) == KERN_POLICY_STATIC);
621        assert!(KERN_RETURN::from_int(256) == KERN_RETURN_MAX);
622
623        assert!(0 == KERN_RETURN::KERN_SUCCESS.to_int());
624        assert!(1 == KERN_RETURN::KERN_INVALID_ADDRESS.to_int());
625        assert!(2 == KERN_RETURN::KERN_PROTECTION_FAILURE.to_int());
626        assert!(3 == KERN_RETURN::KERN_NO_SPACE.to_int());
627        assert!(4 == KERN_RETURN::KERN_INVALID_ARGUMENT.to_int());
628        assert!(5 == KERN_RETURN::KERN_FAILURE.to_int());
629        assert!(6 == KERN_RETURN::KERN_RESOURCE_SHORTAGE.to_int());
630        assert!(7 == KERN_RETURN::KERN_NOT_RECEIVER.to_int());
631        assert!(8 == KERN_RETURN::KERN_NO_ACCESS.to_int());
632        assert!(9 == KERN_RETURN::KERN_MEMORY_FAILURE.to_int());                                                        assert!(10 == KERN_RETURN::KERN_MEMORY_ERROR.to_int());                                                         assert!(11 == KERN_RETURN::KERN_ALREADY_IN_SET.to_int());
633        assert!(12 == KERN_RETURN::KERN_NOT_IN_SET.to_int());
634        assert!(13 == KERN_RETURN::KERN_NAME_EXISTS.to_int());
635        assert!(14 == KERN_RETURN::KERN_ABORTED.to_int());
636        assert!(15 == KERN_RETURN::KERN_INVALID_NAME.to_int());
637        assert!(16 == KERN_RETURN::KERN_INVALID_TASK.to_int());
638        assert!(17 == KERN_RETURN::KERN_INVALID_RIGHT.to_int());
639        assert!(18 == KERN_RETURN::KERN_INVALID_VALUE.to_int());
640        assert!(19 == KERN_RETURN::KERN_UREFS_OVERFLOW.to_int());
641        assert!(20 == KERN_RETURN::KERN_INVALID_CAPABILITY.to_int());                                                   assert!(21 == KERN_RETURN::KERN_RIGHT_EXISTS.to_int());                                                         assert!(22 == KERN_RETURN::KERN_INVALID_HOST.to_int());                                                         assert!(23 == KERN_RETURN::KERN_MEMORY_PRESENT.to_int());                                                       assert!(24 == KERN_RETURN::KERN_MEMORY_DATA_MOVED.to_int());                                                    assert!(25 == KERN_RETURN::KERN_MEMORY_RESTART_COPY.to_int());                                                  assert!(26 == KERN_RETURN::KERN_INVALID_PROCESSOR_SET.to_int());                                                assert!(27 == KERN_RETURN::KERN_POLICY_LIMIT.to_int());                                                         assert!(28 == KERN_RETURN::KERN_INVALID_POLICY.to_int());                                                       assert!(29 == KERN_RETURN::KERN_INVALID_OBJECT.to_int());                                                       assert!(30 == KERN_RETURN::KERN_ALREADY_WAITING.to_int());                                                      assert!(31 == KERN_RETURN::KERN_DEFAULT_SET.to_int());                                                          assert!(32 == KERN_RETURN::KERN_EXCEPTION_PROTECTED.to_int());                                                  assert!(33 == KERN_RETURN::KERN_INVALID_LEDGER.to_int());                                                       assert!(34 == KERN_RETURN::KERN_INVALID_MEMORY_CONTROL.to_int());                                               assert!(35 == KERN_RETURN::KERN_INVALID_SECURITY.to_int());                                                     assert!(36 == KERN_RETURN::KERN_NOT_DEPRESSED.to_int());                                                        assert!(37 == KERN_RETURN::KERN_TERMINATED.to_int());                                                           assert!(38 == KERN_RETURN::KERN_LOCK_SET_DESTROYED.to_int());                                                   assert!(39 == KERN_RETURN::KERN_LOCK_UNSTABLE.to_int());                                                        assert!(40 == KERN_RETURN::KERN_LOCK_OWNED.to_int());                                                           assert!(41 == KERN_RETURN::KERN_LOCK_OWNED_SELF.to_int());
642        assert!(42 == KERN_RETURN::KERN_SEMAPHORE_DESTROYED.to_int());
643        assert!(43 == KERN_RETURN::KERN_RPC_SERVER_TERMINATED.to_int());
644        assert!(44 == KERN_RETURN::KERN_RPC_TERMINATE_ORPHAN.to_int());
645        assert!(45 == KERN_RETURN::KERN_RPC_CONTINUE_ORPHAN.to_int());
646        assert!(46 == KERN_RETURN::KERN_NOT_SUPPORTED.to_int());
647        assert!(47 == KERN_RETURN::KERN_NODE_DOWN.to_int());
648        assert!(48 == KERN_RETURN::KERN_NOT_WAITING.to_int());
649        assert!(49 == KERN_RETURN::KERN_OPERATION_TIMED_OUT.to_int());                                                  assert!(50 == KERN_RETURN::KERN_CODESIGN_ERROR.to_int());
650        assert!(51 == KERN_RETURN::KERN_POLICY_STATIC.to_int());
651        assert!(256 == KERN_RETURN::KERN_RETURN_MAX.to_int());
652    }
653
654    fn kern_return_3_int_enum_const() {
655        assert!(0 == KERN_SUCCESS == KERN_RETURN::KERN_SUCCESS.to_int());
656        assert!(1 == KERN_INVALID_ADDRESS == KERN_RETURN::KERN_INVALID_ADDRESS.to_int());
657        assert!(2 == KERN_PROTECTION_FAILURE == KERN_RETURN::KERN_PROTECTION_FAILURE.to_int());
658        assert!(3 == KERN_NO_SPACE == KERN_RETURN::KERN_NO_SPACE.to_int());
659        assert!(4 == KERN_INVALID_ARGUMENT == KERN_RETURN::KERN_INVALID_ARGUMENT.to_int());
660        assert!(5 == KERN_FAILURE == KERN_RETURN::KERN_FAILURE.to_int());
661        assert!(6 == KERN_RESOURCE_SHORTAGE == KERN_RETURN::KERN_RESOURCE_SHORTAGE.to_int());
662        assert!(7 == KERN_NOT_RECEIVER == KERN_RETURN::KERN_NOT_RECEIVER.to_int());
663        assert!(8 == KERN_NO_ACCESS == KERN_RETURN::KERN_NO_ACCESS.to_int());
664        assert!(9 == KERN_MEMORY_FAILURE == KERN_RETURN::KERN_MEMORY_FAILURE.to_int());
665        assert!(10 == KERN_MEMORY_ERROR == KERN_RETURN::KERN_MEMORY_ERROR.to_int());
666        assert!(11 == KERN_ALREADY_IN_SET == KERN_RETURN::KERN_ALREADY_IN_SET.to_int());
667        assert!(12 == KERN_NOT_IN_SET == KERN_RETURN::KERN_NOT_IN_SET.to_int());
668        assert!(13 == KERN_NAME_EXISTS == KERN_RETURN::KERN_NAME_EXISTS.to_int());
669        assert!(14 == KERN_ABORTED == KERN_RETURN::KERN_ABORTED.to_int());
670        assert!(15 == KERN_INVALID_NAME == KERN_RETURN::KERN_INVALID_NAME.to_int());
671        assert!(16 == KERN_INVALID_TASK == KERN_RETURN::KERN_INVALID_TASK.to_int());
672        assert!(17 == KERN_INVALID_RIGHT == KERN_RETURN::KERN_INVALID_RIGHT.to_int());
673        assert!(18 == KERN_INVALID_VALUE == KERN_RETURN::KERN_INVALID_VALUE.to_int());
674        assert!(19 == KERN_UREFS_OVERFLOW == KERN_RETURN::KERN_UREFS_OVERFLOW.to_int());
675        assert!(20 == KERN_INVALID_CAPABILITY == KERN_RETURN::KERN_INVALID_CAPABILITY.to_int());
676        assert!(21 == KERN_RIGHT_EXISTS == KERN_RETURN::KERN_RIGHT_EXISTS.to_int());
677        assert!(22 == KERN_INVALID_HOST == KERN_RETURN::KERN_INVALID_HOST.to_int());
678        assert!(23 == KERN_MEMORY_PRESENT == KERN_RETURN::KERN_MEMORY_PRESENT.to_int());
679        assert!(24 == KERN_MEMORY_DATA_MOVED == KERN_RETURN::KERN_MEMORY_DATA_MOVED.to_int());
680        assert!(25 == KERN_MEMORY_RESTART_COPY == KERN_RETURN::KERN_MEMORY_RESTART_COPY.to_int());
681        assert!(26 == KERN_INVALID_PROCESSOR_SET == KERN_RETURN::KERN_INVALID_PROCESSOR_SET.to_int());
682        assert!(27 == KERN_POLICY_LIMIT == KERN_RETURN::KERN_POLICY_LIMIT.to_int());
683        assert!(28 == KERN_INVALID_POLICY == KERN_RETURN::KERN_INVALID_POLICY.to_int());
684        assert!(29 == KERN_INVALID_OBJECT == KERN_RETURN::KERN_INVALID_OBJECT.to_int());
685        assert!(30 == KERN_ALREADY_WAITING == KERN_RETURN::KERN_ALREADY_WAITING.to_int());
686        assert!(31 == KERN_DEFAULT_SET == KERN_RETURN::KERN_DEFAULT_SET.to_int());
687        assert!(32 == KERN_EXCEPTION_PROTECTED == KERN_RETURN::KERN_EXCEPTION_PROTECTED.to_int());
688        assert!(33 == KERN_INVALID_LEDGER == KERN_RETURN::KERN_INVALID_LEDGER.to_int());
689        assert!(34 == KERN_INVALID_MEMORY_CONTROL == KERN_RETURN::KERN_INVALID_MEMORY_CONTROL.to_int());
690        assert!(35 == KERN_INVALID_SECURITY == KERN_RETURN::KERN_INVALID_SECURITY.to_int());
691        assert!(36 == KERN_NOT_DEPRESSED == KERN_RETURN::KERN_NOT_DEPRESSED.to_int());
692        assert!(37 == KERN_TERMINATED == KERN_RETURN::KERN_TERMINATED.to_int());
693        assert!(38 == KERN_LOCK_SET_DESTROYED == KERN_RETURN::KERN_LOCK_SET_DESTROYED.to_int());
694        assert!(39 == KERN_LOCK_UNSTABLE == KERN_RETURN::KERN_LOCK_UNSTABLE.to_int());
695        assert!(40 == KERN_LOCK_OWNED == KERN_RETURN::KERN_LOCK_OWNED.to_int());
696        assert!(41 == KERN_LOCK_OWNED_SELF == KERN_RETURN::KERN_LOCK_OWNED_SELF.to_int());
697        assert!(42 == KERN_SEMAPHORE_DESTROYED == KERN_RETURN::KERN_SEMAPHORE_DESTROYED.to_int());
698        assert!(43 == KERN_RPC_SERVER_TERMINATED == KERN_RETURN::KERN_RPC_SERVER_TERMINATED.to_int());
699        assert!(44 == KERN_RPC_TERMINATE_ORPHAN == KERN_RETURN::KERN_RPC_TERMINATE_ORPHAN.to_int());
700        assert!(45 == KERN_RPC_CONTINUE_ORPHAN == KERN_RETURN::KERN_RPC_CONTINUE_ORPHAN.to_int());
701        assert!(46 == KERN_NOT_SUPPORTED == KERN_RETURN::KERN_NOT_SUPPORTED.to_int());
702        assert!(47 == KERN_NODE_DOWN == KERN_RETURN::KERN_NODE_DOWN.to_int());
703        assert!(48 == KERN_NOT_WAITING == KERN_RETURN::KERN_NOT_WAITING.to_int());
704        assert!(49 == KERN_OPERATION_TIMED_OUT == KERN_RETURN::KERN_OPERATION_TIMED_OUT.to_int());
705        assert!(50 == KERN_CODESIGN_ERROR == KERN_RETURN::KERN_CODESIGN_ERROR.to_int());
706        assert!(51 == KERN_POLICY_STATIC == KERN_RETURN::KERN_POLICY_STATIC.to_int());
707        assert!(256 == KERN_RETURN_MAX == KERN_RETURN::KERN_RETURN_MAX.to_int());
708    }
709}