0 | module System.Posix.Process.ProcStatus
 1 |
 2 | import public Data.C.Ptr
 3 |
 4 | import Derive.Prelude
 5 | import System.Posix.Errno
 6 | import System.Posix.Signal
 7 |
 8 | %default total
 9 | %language ElabReflection
10 |
11 | %foreign "C:li_wifexited, posix-idris"
12 | exited : CInt -> Bits8
13 |
14 | %foreign "C:li_wexitstatus, posix-idris"
15 | exitstatus : CInt -> Bits8
16 |
17 | %foreign "C:li_wifsignaled, posix-idris"
18 | signaled : CInt -> Bits8
19 |
20 | %foreign "C:li_wtermsig, posix-idris"
21 | termsig : CInt -> Bits32
22 |
23 | %foreign "C:li_wcoredump, posix-idris"
24 | coredump : CInt -> Bits8
25 |
26 | %foreign "C:li_wifstopped, posix-idris"
27 | stopped : CInt -> Bits8
28 |
29 | %foreign "C:li_wstopsig, posix-idris"
30 | stopsig : CInt -> Bits32
31 |
32 | %foreign "C:li_wifcontinued, posix-idris"
33 | continued : CInt -> Bits8
34 |
35 | public export
36 | data ProcStatus : Type where
37 |   Exited    : Bits8 -> ProcStatus
38 |   Signaled  : Signal -> (coreDumped : Bool) -> ProcStatus
39 |   Stopped   : Signal -> ProcStatus
40 |   Continued : ProcStatus
41 |   Other     : CInt -> ProcStatus
42 |
43 | %runElab derive "ProcStatus" [Show,Eq]
44 |
45 | export
46 | procStatus : CInt -> ProcStatus
47 | procStatus i =
48 |   if      toBool $ exited    i then Exited (exitstatus i)
49 |   else if toBool $ signaled  i then Signaled (S $ termsig i) (toBool $ coredump i)
50 |   else if toBool $ stopped   i then Stopped (S $ stopsig i)
51 |   else if toBool $ continued i then Continued
52 |   else                              Other i
53 |