0 | module System.Linux.Signalfd.Struct
  1 |
  2 | import Data.C.Ptr
  3 | import System.Linux.Signalfd.Flags
  4 | import System.Posix.File.FileDesc
  5 | import System.Posix.Signal.Struct
  6 | import System.Posix.Signal.Types
  7 |
  8 | %default total
  9 |
 10 | %foreign "C:li_ssi_signo, linux-idris"
 11 | prim__ssi_signo : AnyPtr -> PrimIO Bits32
 12 |
 13 | %foreign "C:li_ssi_errno, linux-idris"
 14 | prim__ssi_errno : AnyPtr -> PrimIO Int32
 15 |
 16 | %foreign "C:li_ssi_code, linux-idris"
 17 | prim__ssi_code : AnyPtr -> PrimIO Int32
 18 |
 19 | %foreign "C:li_ssi_pid, linux-idris"
 20 | prim__ssi_pid : AnyPtr -> PrimIO PidT
 21 |
 22 | %foreign "C:li_ssi_uid, linux-idris"
 23 | prim__ssi_uid : AnyPtr -> PrimIO UidT
 24 |
 25 | %foreign "C:li_ssi_fd, linux-idris"
 26 | prim__ssi_fd : AnyPtr -> PrimIO Bits32
 27 |
 28 | %foreign "C:li_ssi_tid, linux-idris"
 29 | prim__ssi_tid : AnyPtr -> PrimIO Bits32
 30 |
 31 | %foreign "C:li_ssi_band, linux-idris"
 32 | prim__ssi_band : AnyPtr -> PrimIO Bits32
 33 |
 34 | %foreign "C:li_ssi_overrun, linux-idris"
 35 | prim__ssi_overrun : AnyPtr -> PrimIO Bits32
 36 |
 37 | %foreign "C:li_ssi_trapno, linux-idris"
 38 | prim__ssi_trapno : AnyPtr -> PrimIO Bits32
 39 |
 40 | %foreign "C:li_ssi_status, linux-idris"
 41 | prim__ssi_status : AnyPtr -> PrimIO Int32
 42 |
 43 | %foreign "C:li_ssi_status, linux-idris"
 44 | prim__ssi_int : AnyPtr -> PrimIO Int32
 45 |
 46 | %foreign "C:li_ssi_ptr, linux-idris"
 47 | prim__ssi_ptr : AnyPtr -> PrimIO Bits64
 48 |
 49 | %foreign "C:li_ssi_utime, linux-idris"
 50 | prim__ssi_utime : AnyPtr -> PrimIO Bits64
 51 |
 52 | %foreign "C:li_ssi_stime, linux-idris"
 53 | prim__ssi_stime : AnyPtr -> PrimIO Bits64
 54 |
 55 | %foreign "C:li_ssi_addr, linux-idris"
 56 | prim__ssi_addr : AnyPtr -> PrimIO Bits64
 57 |
 58 | %foreign "C:li_ssi_addr_lsb, linux-idris"
 59 | prim__ssi_addr_lsb : AnyPtr -> PrimIO Bits16
 60 |
 61 | --------------------------------------------------------------------------------
 62 | -- API
 63 | --------------------------------------------------------------------------------
 64 |
 65 | ||| A file descriptor for signal handling.
 66 | |||
 67 | ||| This can be used for synchronous signal handling using
 68 | ||| (blocking) `readSignalfd` directly, or for asynchronous signal handling
 69 | ||| using `epoll`.
 70 | export
 71 | record Signalfd where
 72 |   constructor SFD
 73 |   fd : Bits32
 74 |
 75 | export %inline
 76 | Cast Signalfd Fd where cast = MkFd . fd
 77 |
 78 | export %inline
 79 | Cast Bits32 Signalfd where cast = SFD
 80 |
 81 | export %inline
 82 | Cast CInt Signalfd where cast = SFD . cast
 83 |
 84 | ||| Result type when reading from a `Signalfd`.
 85 | export
 86 | record SSiginfo where
 87 |   constructor SSI
 88 |   ptr : AnyPtr
 89 |
 90 | export %inline
 91 | Deref SSiginfo where deref = pure . SSI
 92 |
 93 | public export %inline
 94 | SizeOf SSiginfo where sizeof_ = signalfd_siginfo_size
 95 |
 96 | export
 97 | siginfo : SSiginfo -> PrimIO Siginfo
 98 | siginfo (SSI p) w =
 99 |   let MkIORes sig w := prim__ssi_signo p w
100 |       MkIORes cod w := prim__ssi_code p w
101 |       MkIORes pid w := prim__ssi_pid p w
102 |       MkIORes uid w := prim__ssi_uid p w
103 |       MkIORes stt w := prim__ssi_status p w
104 |       MkIORes val w := prim__ssi_int p w
105 |    in MkIORes (SI (S sig) cod pid uid stt (cast val)) w
106 |