X-Git-Url: http://git.onelab.eu/?p=vsys.git;a=blobdiff_plain;f=dirwatcher.ml;h=53c4c1cddfac4b57d6e00801cf84221738c3cd25;hp=41310238ae7a07250e9b4710a039114964f15d2d;hb=HEAD;hpb=16c8bb31dd971b7fab00dbb17a75bb08cee463c6 diff --git a/dirwatcher.ml b/dirwatcher.ml index 4131023..53c4c1c 100644 --- a/dirwatcher.ml +++ b/dirwatcher.ml @@ -9,7 +9,6 @@ open Globals * leaks - fix implementation of rmdir accordingly *) let wdmap = Hashtbl.create 1024 -let masks = Hashtbl.create 1024 let fd = Inotify.init () @@ -18,36 +17,22 @@ let rec list_check lst elt = | [] -> false | car::cdr -> if (car==elt) then true else list_check cdr elt +let pevlist evlist = + List.iter + (fun e -> + logprint "Event: %s\n" (string_of_event e)) + evlist + let handle_dir_event dirname evlist str = let fname = String.concat "/" [dirname;str] in - fprintf logfd "File: %s. " fname;List.iter - (fun e -> - fprintf logfd "Event: %s\n" (string_of_event e)) - evlist; - flush logfd + logprint "File: %s. " fname; + pevlist evlist let add_watch dir events handler = - let evcheck = list_check events in - let oneshot = if (evcheck S_Oneshot) then true else false - in let wd = Inotify.add_watch fd dir events in - Hashtbl.add masks dir (wd,handler); - Hashtbl.add wdmap wd (dir,Some(handler),oneshot) - -let mask_watch dir = - try - let wd,_ = Hashtbl.find masks dir in - Inotify.rm_watch fd wd; - Hashtbl.remove wdmap wd - with _ -> - () - -let unmask_watch dir events = - let _,handler = Hashtbl.find masks dir in - try - Hashtbl.remove masks dir; - add_watch dir events handler - with Not_found -> () + Hashtbl.add wdmap wd (dir,Some(handler)) + (* Ignore the possibility that the whole directory can disappear and come + * back while it is masked *) let asciiz s = let rec findfirstnul str idx len = @@ -65,19 +50,21 @@ let receive_event (eventdescriptor:fname_and_fd) (bla:fname_and_fd) = List.iter (fun x-> match x with | (wd,evlist,_,Some(str)) -> - let purestr = asciiz(str) in - let (dirname,handler,oneshot) = - try Hashtbl.find wdmap wd with Not_found->("",None,false) - in - printf "Received event: %s " dirname; - List.iter (fun l->printf "%s " (string_of_event l)) evlist; - printf "\n";flush Pervasives.stdout; - if (oneshot) then Hashtbl.remove wdmap wd; - ( - match handler with - | None->fprintf logfd "Unhandled watch descriptor\n";flush logfd - | Some(handler)->handler wd dirname evlist purestr - ) + begin + let purestr = asciiz(str) in + let (dirname,handler) = + try Hashtbl.find wdmap wd with Not_found->("",None) + in + match handler with + | None-> + logprint "Unhandled watch descriptor\n" + | Some(handler)-> + let fqp = String.concat "/" [dirname;purestr] in + begin + handler wd dirname evlist + purestr + end + end | _ -> ()) evs