add -fPIC option to the C compiler, required in f31
[vsys.git] / dirwatcher.ml
index 4131023..53c4c1c 100644 (file)
@@ -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