From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by yquem.inria.fr (Postfix) with ESMTP id 37AECBC57 for ; Fri, 19 Nov 2010 17:31:06 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsgEAE415kxQW+UMgWdsb2JhbACiXBUBARYiIr07hUsEils X-IronPort-AV: E=Sophos;i="4.59,223,1288566000"; d="scan'208";a="79673546" Received: from lo.gmane.org ([80.91.229.12]) by mail4-smtp-sop.national.inria.fr with ESMTP; 19 Nov 2010 17:31:05 +0100 Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1PJTrZ-0006Ms-MG for caml-list@inria.fr; Fri, 19 Nov 2010 17:31:01 +0100 Received: from avelizy-155-1-94-54.w90-35.abo.wanadoo.fr ([90.35.89.54]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 19 Nov 2010 17:31:01 +0100 Received: from sylvain by avelizy-155-1-94-54.w90-35.abo.wanadoo.fr with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 19 Nov 2010 17:31:01 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: caml-list@inria.fr From: Sylvain Le Gall Subject: Re: Looking for stubs for sendmsg/recvmsg Date: Fri, 19 Nov 2010 16:30:47 +0000 (UTC) Message-ID: References: <87d3q21qe4.fsf@frosties.localnet> <87ipztl2ld.fsf@frosties.localnet> X-Complaints-To: usenet@dough.gmane.org X-Gmane-NNTP-Posting-Host: avelizy-155-1-94-54.w90-35.abo.wanadoo.fr User-Agent: slrn/pre1.0.0-18 (Linux) X-Spam: no; 0.00; le-gall:01 stubs:01 le-gall:01 stubs:01 const:01 struct:01 flags:01 struct:01 flags:01 finalizer:01 finalizer:01 val:01 stderr:01 hashtbl:01 hashtbl:01 Hello, On 19-11-2010, Goswin von Brederlow wrote: > Sylvain Le Gall writes: > >> On 18-11-2010, Goswin von Brederlow wrote: >>> Hi, >>> >>> I'm looking for stubs for >>> >>> ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); >>> ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags); >>> >>> Specifically I need those to send (among normal messages) an >>> Unix.file_descr over a Unix Domain Socket. >>> >>> Does anyone know of a module that has them? >>> >> >> If you don't find one and plan to write it yourself, this would be a >> good addition to extunix: >> http://extunix.forge.ocamlcore.org >> >> Regards, >> Sylvain Le Gall > > I'm thinking of changing Unix.file_descr from int to a custom block > (containing the FD) with finalizer. Unix.close would set the FD to -1 > and the finalizer gives an error if FD != -1 and closes it. > > Actually I want that tunable with 3 possible behaviours: > > type fd_leak_mode = Silent | Complain | Fail > val set_leak_mode : fd_leak_mode -> unit = > > Silent just closes the FD if it is still open, Complain (default) > outputs to stderr and closes it and Fail aborts. > > That would change most of the Unix module and mean a complete fork of it. Not that much, if you proceed in another way. I think what you are looking for is a fd leak detector? Here is a small modules that I have written for this purpose: File UnixExt.ml: (** Count open/close call *) IFNDEF NDBUG THEN let fd_opened = Hashtbl.create 13 ;; let fd_once_opened = Hashtbl.create 13 ;; let fd_open fd fn out = dbug_print (fun () -> Printf.sprintf "%s '%s'" (if out then "open-out" else "open-in") fn); Hashtbl.add fd_opened fd (fn, out) ;; let fd_close fd = try let (fn, out) as data = Hashtbl.find fd_opened fd in dbug_print (fun () -> Printf.sprintf "%s '%s'" (if out then "close-out" else "close-in") fn); Hashtbl.add fd_once_opened fd data; Hashtbl.remove fd_opened fd; with Not_found -> begin dbug_print (fun () -> let fn = try fst (Hashtbl.find fd_once_opened fd) with Not_found -> "unknown" in Printf.sprintf "Trying to close %s again" fn) end ;; let () = at_exit (fun () -> let exit_error = ref false in Hashtbl.iter (fun fd (fn, out) -> if fd <> Unix.stdin && fd <> Unix.stdout && fd <> Unix.stderr then begin Printf.eprintf "Not closed '%s' (out: %b)\n" fn out; exit_error := true end) fd_opened; Hashtbl.clear fd_opened; if !exit_error then exit 3 ) ;; let opened_files () = let lst = ref [] in Hashtbl.iter (fun _ e -> lst := e :: !lst) fd_opened; List.sort compare !lst; ELSE let fd_open _ _ _ = () ;; let fd_close _ = () ;; let opened_files () = [] ;; ENDIF (** See UnixExt.mli *) let to_file_descr_in fd = fd_open fd "" false; fd ;; (** See UnixExt.mli *) let to_file_descr_out fd = fd_open fd "" true; fd ;; (** See UnixExt.mli *) let close_in fd = Unix.close fd; fd_close fd ;; (** See UnixExt.mli *) let stdout = fd_open Unix.stdout "" true; Unix.stdout ;; [...override other functions that open/close fd...] Then in the modules using this features, you just have to open UnixExt after Unix... You can even probably design a library that will transparently hide Unix with a custom Unix module providing this feature. > > Would that be something for extunix too? > I don't think so. At least, this is not currently the purpose of extunix... Regards, Sylvain Le Gall