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)
+ Hashtbl.add wdmap wd (dir,Some(handler))
+ (* Ignore the possibility that the whole directory can disappear and come
+ * back while it is masked *)
-let mask_watch dir =
+let mask_watch dir file =
try
- let wd,_ = Hashtbl.find masks dir in
- Inotify.rm_watch fd wd;
- Hashtbl.remove wdmap wd
+ Hashtbl.replace masks (dir,file) true
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 -> ()
-
+let unmask_watch dir file =
+ if (Hashtbl.mem masks (dir,file)) then
+ begin
+ Hashtbl.remove masks (dir,file)
+ end
+ else
+ fprintf logfd "WARNING: %s,%s -- Unpaired unmask\n" dir file;flush logfd
+
let asciiz s =
let rec findfirstnul str idx len =
if ((idx==len) ||
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
- 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->fprintf logfd "Unhandled watch descriptor\n";flush logfd
+ | Some(handler)->
+ let mask_filter = Hashtbl.mem masks (dirname,purestr) in
+ if (not mask_filter) then
+ handler wd dirname evlist purestr
+ end
| _ -> ())
evs