This change is the result of a code audit. The changes are not drastic, but should...
[vsys.git] / dirwatcher.ml
index 4131023..3122642 100644 (file)
@@ -28,27 +28,25 @@ let handle_dir_event dirname evlist str =
 
 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) || 
@@ -65,19 +63,18 @@ 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->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