[project @ 1996-01-08 20:28:12 by partain]
[ghc-hetmet.git] / ghc / misc / examples / posix / po012 / Main.hs
diff --git a/ghc/misc/examples/posix/po012/Main.hs b/ghc/misc/examples/posix/po012/Main.hs
new file mode 100644 (file)
index 0000000..d4eb384
--- /dev/null
@@ -0,0 +1,52 @@
+import LibPosix
+
+main =
+    createFile "po012.out" stdFileMode >>= \ fd ->
+    installHandler processStatusChanged (Catch (reap1 fd)) Nothing >>
+    ls >>
+    awaitSignal Nothing
+
+ls =
+    runProcess "ls" ["-l","po012.out"] Nothing Nothing Nothing Nothing Nothing
+
+reap1 fd =
+    getAnyProcessStatus True False >>
+    installHandler processStatusChanged (Catch (reap2 fd)) Nothing >>
+    writeChannel fd (take 666 (repeat 'x')) >>
+    ls >>
+    awaitSignal Nothing
+    
+reap2 fd =
+    getAnyProcessStatus True False >>
+    installHandler processStatusChanged (Catch (reap3 fd)) Nothing >>
+    setFileMode "po012.out" 
+       (foldr1 unionFileModes [ownerReadMode,ownerWriteMode,groupReadMode,otherReadMode]) >>
+    ls >>
+    awaitSignal Nothing
+    
+reap3 fd =
+    getAnyProcessStatus True False >>
+    installHandler processStatusChanged (Catch (reap4 fd)) Nothing >>
+    setFileTimes "po012.out" 0 0 >>
+    ls >>
+    awaitSignal Nothing
+    
+reap4 fd =
+    getAnyProcessStatus True False >>
+    installHandler processStatusChanged (Catch (reap5 fd)) Nothing >>
+    removeLink "po012.out" >>
+    ls >>
+    awaitSignal Nothing
+
+reap5 fd =
+    getAnyProcessStatus True False >>
+    seekChannel fd SeekFromEnd 0 >>= \ bytes ->
+    if bytes == 666 then
+       seekChannel fd AbsoluteSeek 0 >>
+       readChannel fd 1024 >>= \ (str, _) ->
+       if str == (take 666 (repeat 'x')) then
+           putStr "Okay\n"
+       else
+           putStr "Read failed\n"
+    else
+       putStr "Seek returned wrong size\n"