# HG changeset patch # User Matthias Görgens # Date 1268698897 0 # Node ID 0d301fc13f242965c17ab18461d5c16787d26786 # Parent 795ac4c3776bc0716c54e5c382c79a22bf7ede6b stdext/Os: A simple module for running stuff on the command line. diff -r 795ac4c3776b -r 0d301fc13f24 stdext/Makefile --- a/stdext/Makefile +++ b/stdext/Makefile @@ -22,7 +22,7 @@ STDEXT_OBJS = fun listext filenameext stringext arrayext hashtblext pervasiveext threadext ring \ qring fring opt bigbuffer unixext range vIO trie config date encodings fe fecomms \ - forkhelpers gzip sha1sum zerocheck base64 backtrace tar mapext + forkhelpers gzip sha1sum zerocheck base64 backtrace tar mapext os INTF = $(foreach obj, $(STDEXT_OBJS),$(obj).cmi) LIBS = stdext.cma stdext.cmxa diff -r 795ac4c3776b -r 0d301fc13f24 stdext/os.ml --- /dev/null +++ b/stdext/os.ml @@ -0,0 +1,30 @@ +let check_exit_status = function + | Unix.WEXITED 0 -> true + | Unix.WEXITED r -> Printf.eprintf "warning: the process terminated with exit code (%d)\n%!" r; false + | Unix.WSIGNALED n -> Printf.eprintf "warning: the process was killed by a signal (number: %d)\n%!" n; false + | Unix.WSTOPPED n -> Printf.eprintf "warning: the process was stopped by a signal (number: %d)\n%!" n; false +;; + +let was_successful = function + | Unix.WEXITED 0 -> true + | Unix.WEXITED r -> false + | Unix.WSIGNALED n -> false + | Unix.WSTOPPED n -> false + +let syscall : ?env:string array -> string -> string * string * Unix.process_status = fun ?(env=[| |]) cmd -> + print_endline cmd; + let ic, oc, ec = Unix.open_process_full cmd env in + let buf1 = Buffer.create 96 + and buf2 = Buffer.create 48 in + (try + while true do Buffer.add_channel buf1 ic 1 done + with End_of_file -> ()); + (try + while true do Buffer.add_channel buf2 ec 1 done + with End_of_file -> ()); + let exit_status = Unix.close_process_full (ic, oc, ec) in + check_exit_status exit_status; + ( Buffer.contents buf1 + , Buffer.contents buf2 + , exit_status + ) diff -r 795ac4c3776b -r 0d301fc13f24 stdext/os.mli --- /dev/null +++ b/stdext/os.mli @@ -0,0 +1,3 @@ +val check_exit_status : Unix.process_status -> bool +val was_successful : Unix.process_status -> bool +val syscall : ?env:string array -> string -> string * string * Unix.process_status