Browse thread
[Caml-list] uname for Ocaml
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2003-01-21 (22:38) |
From: | Issac Trotts <ijtrotts@u...> |
Subject: | Re: [Caml-list] uname for Ocaml |
On Tue, Jan 21, 2003 at 09:53:12PM +0100, Basile STARYNKEVITCH wrote: > > Issac cited me after his reply - I put it in the right order. > > >>>>> "Issac" == Issac Trotts <ijtrotts@ucdavis.edu> writes: > > > > Issac> On Tue, Jan 21, 2003 at 04:23:03PM +0100, Basile > Issac> STARYNKEVITCH wrote: > >> Dear All, > >> > >> If you need to call uname(2) from some Ocaml program you can > >> steal my tiny code in util.ml util.mli util_ml.c on > >> > >> http://www2.poesia-filter.org:8000/cgi-bin/cvsweb.cgi/PoesiaSoft/PoesiaMonIcap/ > >> > >> I actually wish that uname(2) will be incorporated in the Unix > >> module. > >> > > > Issac> An alternative would be to use #load "unix.cma" > > I agree with Issac, but I still wish that most (or perhaps all) of the > standard Posix system calls should be callable from Unix module! > > Issac> let uname() = let (inc, outc) = Unix.open_process "uname" > Issac> in let name = input_line inc in close_in inc; close_out > Issac> outc; name;; > > Won't work if the (malicious) user have an unrelated uname in his > path. I suggest at least using the "/bin/uname" which should be a > POSIX standard IIRC. Also, forking a shell process for each system > call might be not optimal (and not robust). > > Also, my code return the equivalent of /bin/uname -a > > Issac> Here's a more general way to capture the stdout of a Unix > Issac> call: > > Issac> let syscall cmd = let (inc, outc) = Unix.open_process cmd > Issac> in let buf = Buffer.create 16 in (try while true do > Issac> Buffer.add_channel buf inc 1 done with _ -> ()); close_in > Issac> inc; close_out outc; Buffer.contents buf;; > > Thanks for this suggestion, but why not use Unix.open_process_in in > this and similar cases? You're right: it's shorter to say let sys_call cmd = let inc = Unix.open_process_in cmd in let buf = Buffer.create 16 in (try while true do Buffer.add_channel buf inc 1 done with _ -> ()); close_in inc; Buffer.contents buf;; Or we can break the call results into lines: let rec input_lines file = try let ln = input_line file in ln :: input_lines file with End_of_file -> [];; let sys_lines cmd = let pipe = Unix.open_process_in cmd in let lines = input_lines pipe in close_in f; lines;; Sometimes it would be better to iterate a function over the lines: let sys_iter f cmd = let pipe = Unix.open_process_in cmd in (try while true do f (input_line pipe) done with _ -> ()); close_in pipe;; This can be used for things like sys_iter print_endline "ls";; Issac -- ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners