0 | module System.File.Process
2 | import public System.Escape
3 | import public System.File.Error
4 | import public System.File.Mode
6 | import System.File.Support
7 | import public System.File.Types
9 | %foreign "C:fflush,libc 6"
11 | prim__flush : FilePtr -> PrimIO Int
12 | %foreign supportC "idris2_popen"
14 | prim__popen : String -> String -> PrimIO FilePtr
15 | %foreign supportC "idris2_pclose"
16 | supportNode "pclose"
17 | prim__pclose : FilePtr -> PrimIO Int
19 | data Popen2Result : Type where [external]
21 | %foreign supportC "idris2_popen2"
22 | prim__popen2 : String -> PrimIO (Ptr Popen2Result)
24 | %foreign supportC "idris2_popen2WaitByPid"
26 | prim__popen2WaitByPid : Int -> PrimIO Int
27 | %foreign supportC "idris2_popen2WaitByHandler"
29 | prim__popen2WaitByHandler : AnyPtr -> PrimIO Int
31 | %foreign supportC "idris2_popen2ChildPid"
32 | prim__popen2ChildPid : Ptr Popen2Result -> PrimIO Int
34 | %foreign supportC "idris2_popen2ChildHandler"
35 | prim__popen2ChildHandler : Ptr Popen2Result -> PrimIO AnyPtr
37 | %foreign supportC "idris2_popen2FileIn"
38 | prim__popen2FileIn : Ptr Popen2Result -> PrimIO FilePtr
40 | %foreign supportC "idris2_popen2FileOut"
41 | prim__popen2FileOut : Ptr Popen2Result -> PrimIO FilePtr
47 | fflush : HasIO io => (h : File) -> io ()
49 | = ignore $
primIO (prim__flush f)
63 | popen : HasIO io => (cmd : String) -> (m : Mode) -> io (Either FileError File)
65 | ptr <- primIO (prim__popen cmd (modeStr m))
66 | if prim__nullAnyPtr ptr /= 0
68 | else pure (Right (FHandle ptr))
75 | pclose : HasIO io => (fh : File) -> io Int
76 | pclose (FHandle h) = primIO (prim__pclose h)
80 | record SubProcess where
81 | constructor MkSubProcess
103 | popen2 : HasIO io => (cmd : String) -> io (Either FileError SubProcess)
105 | ptr <- primIO (prim__popen2 cmd)
106 | if prim__nullPtr ptr /= 0
109 | pid <- primIO (prim__popen2ChildPid ptr)
110 | handle <- primIO (prim__popen2ChildHandler ptr)
111 | input <- primIO (prim__popen2FileIn ptr)
112 | output <- primIO (prim__popen2FileOut ptr)
113 | free (prim__forgetPtr ptr)
114 | pure $
Right (MkSubProcess pid handle (FHandle input) (FHandle output))
125 | popen2Wait : HasIO io => SubProcess -> io Int
126 | popen2Wait sp = primIO $
127 | if prim__nullAnyPtr sp.handler /= 0
128 | then prim__popen2WaitByPid sp.pid
129 | else prim__popen2WaitByHandler sp.handler
133 | popen : HasIO io => (cmd : List String) -> (m : Mode) -> io (Either FileError File)
134 | popen = popen . escapeCmd
137 | popen2 : HasIO io => (cmd : List String) -> io (Either FileError SubProcess)
138 | popen2 = popen2 . escapeCmd