From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id XAA29169; Tue, 21 Jan 2003 23:38:13 +0100 (MET) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id XAA28650 for ; Tue, 21 Jan 2003 23:38:12 +0100 (MET) Received: from pop9.ucdavis.edu (pop9.ucdavis.edu [169.237.105.19]) by concorde.inria.fr (8.11.1/8.11.1) with ESMTP id h0LMcBr09716 for ; Tue, 21 Jan 2003 23:38:11 +0100 (MET) Received: from beech ([128.120.141.217]) by pop9.ucdavis.edu (8.11.6/8.11.0/IT4.6.2) with ESMTP id h0LMc9a13185 for ; Tue, 21 Jan 2003 14:38:09 -0800 (PST) Received: from ijtrotts by beech with local (Exim 3.36 #1 (Debian)) id 18b75s-0002Kk-00 for ; Tue, 21 Jan 2003 14:42:08 -0800 Date: Tue, 21 Jan 2003 14:42:08 -0800 From: Issac Trotts To: OCaml Mailing List Subject: Re: [Caml-list] uname for Ocaml Message-ID: <20030121224208.GA8872@beech> References: <15917.26071.995917.528195@hector.lesours> <20030121202955.GA5938@beech> <15917.45880.856573.222243@hector.lesours> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <15917.45880.856573.222243@hector.lesours> User-Agent: Mutt/1.4i Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk 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 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