0 | module System.Posix.Process.Prim
2 | import System.Posix.File
3 | import System.Posix.Signal
4 | import public Data.C.Ptr
5 | import public System.Posix.Errno
6 | import public System.Posix.Process.Flags
7 | import public System.Posix.Process.ProcStatus
15 | export %foreign "C:getpid, posix-idris"
16 | getpid : PrimIO PidT
18 | export %foreign "C:getppid, posix-idris"
19 | getppid : PrimIO PidT
21 | export %foreign "C:getuid, posix-idris"
22 | getuid : PrimIO UidT
24 | export %foreign "C:geteuid, posix-idris"
25 | geteuid : PrimIO UidT
27 | export %foreign "C:getgid, posix-idris"
28 | getgid : PrimIO GidT
30 | export %foreign "C:getegid, posix-idris"
31 | getegid : PrimIO GidT
33 | %foreign "C:li_setuid, posix-idris"
34 | prim__setuid : UidT -> PrimIO CInt
36 | %foreign "C:li_seteuid, posix-idris"
37 | prim__seteuid : UidT -> PrimIO CInt
39 | %foreign "C:li_setgid, posix-idris"
40 | prim__setgid : GidT -> PrimIO CInt
42 | %foreign "C:li_setegid, posix-idris"
43 | prim__setegid : GidT -> PrimIO CInt
45 | %foreign "C:li_fork, posix-idris"
46 | prim__fork : PrimIO PidT
48 | %foreign "C:li_wait, posix-idris"
49 | prim__wait : AnyPtr -> PrimIO PidT
51 | %foreign "C:li_waitpid, posix-idris"
52 | prim__waitpid : PidT -> AnyPtr -> Bits32 -> PrimIO PidT
54 | %foreign "C:li_waitid, posix-idris"
55 | prim__waitid : Bits8 -> PidT -> AnyPtr -> Bits32 -> PrimIO PidT
57 | %foreign "C:li_execve, posix-idris"
58 | prim__execve : String -> AnyPtr -> AnyPtr -> PrimIO CInt
60 | %foreign "C:li_execvp, posix-idris"
61 | prim__execvp : String -> AnyPtr -> PrimIO CInt
63 | %foreign "C:li_execv, posix-idris"
64 | prim__execv : String -> AnyPtr -> PrimIO CInt
66 | %foreign "C:li_system, posix-idris"
67 | prim__system : String -> PrimIO CInt
75 | setuid : UidT -> EPrim ()
76 | setuid uid = toUnit $
prim__setuid uid
80 | seteuid : UidT -> EPrim ()
81 | seteuid uid = toUnit $
prim__seteuid uid
85 | setgid : GidT -> EPrim ()
86 | setgid gid = toUnit $
prim__setgid gid
90 | setegid : GidT -> EPrim ()
91 | setegid gid = toUnit $
prim__setegid gid
101 | fork = toPidT Process.Prim.prim__fork
113 | -> (args : CArrayIO m (Maybe String))
114 | -> (env : CArrayIO n (Maybe String))
116 | execve s a e = toUnit $
prim__execve s (unsafeUnwrap a) (unsafeUnwrap e)
121 | execle : String -> List String -> List (String,String) -> EPrim ()
123 | let args # t := ioToF1 (fromList (map Just a ++ [Nothing])) t
124 | env # t := ioToF1 (fromList (map envpair e ++ [Nothing])) t
125 | R res t := execve s args env t | E x t => E x t
126 | _ # t := free1 args t
127 | _ # t := free1 env t
131 | envpair : (String,String) -> Maybe String
132 | envpair (n,v) = Just "\{n}=\{v}"
136 | execv : String -> CArrayIO m (Maybe String) -> EPrim ()
137 | execv s a = toUnit $
prim__execv s (unsafeUnwrap a)
142 | execvp : String -> CArrayIO m (Maybe String) -> EPrim ()
143 | execvp s a = toUnit $
prim__execvp s (unsafeUnwrap a)
148 | execlp : String -> List String -> EPrim ()
150 | let args # t := ioToF1 (fromList (map Just a ++ [Nothing])) t
151 | R res t := execvp s args t | E x t => E x t
152 | _ # t := free1 args t
161 | system : (cmd : String) -> EPrim ProcStatus
162 | system cmd = toVal procStatus $
prim__system cmd
171 | wait_ : IOBox CInt -> EPrim PidT
172 | wait_ s = toPidT $
prim__wait (unsafeUnwrap s)
180 | waitpid_ : PidT -> IOBox CInt -> WaitFlags -> EPrim PidT
181 | waitpid_ chld s (F f) = toPidT $
prim__waitpid chld (unsafeUnwrap s) f
187 | waitid_ : IdType -> PidT -> SiginfoT -> WaitFlags -> EPrim ()
188 | waitid_ t chld s (F f) =
189 | toUnit $
prim__waitid (idtypeCode t) chld (unwrap s) f
197 | wait : EPrim (PidT, ProcStatus)
199 | withBox CInt $
\box,t =>
200 | let R r t := wait_ box t | E x r => E x r
201 | c # t := unbox box t
202 | in R (r, procStatus c) t
206 | waitpid : PidT -> WaitFlags -> EPrim (PidT, ProcStatus)
207 | waitpid pid flags =
208 | withBox CInt $
\box,t =>
209 | let R r t := waitpid_ pid box flags t | E x r => E x r
210 | c # t := unbox box t
211 | in R (r, procStatus c) t
215 | waitid : IdType -> PidT -> WaitFlags -> EPrim Siginfo
217 | withStruct SSiginfoT $
\ss,t =>
218 | let R _ t := waitid_ it pid ss fs t | E x t => E x t
219 | si # t := siginfo ss t