+(** Watches directories for events. Agnostic to vsys semantics of backends and
+frontends *)
open Inotify
open Fdwatcher
open Printf
* leaks - fix implementation of rmdir accordingly
*)
+type 'a handlertype = Nohandler | Activehandler of 'a | Maskedhandler of 'a
+
let wdmap = Hashtbl.create 1024
let fd = Inotify.init ()
let handle_dir_event dirname evlist str =
let fname = String.concat "/" [dirname;str] in
- printf "File: %s. " fname;List.iter
+ fprintf logfd "File: %s. " fname;List.iter
(fun e ->
- printf "Event: %s\n" (string_of_event e))
+ fprintf logfd "Event: %s\n" (string_of_event e))
evlist;
- flush Pervasives.stdout
+ flush logfd
let add_watch dir events handler =
- printf "Adding watch for %s\n" dir;flush Pervasives.stdout;
let wd = Inotify.add_watch fd dir events in
- Hashtbl.add wdmap wd (dir,handler)
+ Hashtbl.add wdmap wd (dir,Activehandler(handler))
+
+let mask_events wd =
+ let (dirname,handler) = try Hashtbl.find wdmap wd with Not_found->("",Nohandler)
+ in
+ match handler with
+ | Activehandler(func)->
+ Hashtbl.replace wdmap wd (dirname,Maskedhandler(func))
+ | _ ->
+ ()
+
+let unmask_events wd =
+ let (dirname,handler) = try Hashtbl.find wdmap wd with Not_found->("",Nohandler)
+ in
+ match handler with
+ | Maskedhandler(func)->
+ Hashtbl.replace wdmap wd (dirname,Activehandler(func))
+ | _ ->
+ ()
+
+
+ (* XXX
+let del_watch dir =
+ fprintf logfd "Removing watch for %s\n" dir;flush logfd;
+ let wd = Inotify.rm_watch fd dir in
+ Hashtbl.remove wdmap wd
+ *)
let asciiz s =
let rec findfirstnul str idx len =
| (wd,evlist,_,Some(str)) ->
let purestr = asciiz(str) in
let (dirname,handler) =
- try Hashtbl.find wdmap wd with Not_found->printf "Unknown watch descriptor\n";raise Not_found
+ try Hashtbl.find wdmap wd with Not_found->("",Nohandler)
in
(
match handler with
- | None->handle_dir_event dirname evlist purestr
- | Some(handler)->handler dirname evlist purestr
+ | Nohandler->fprintf logfd "Unhandled watch descriptor\n";flush logfd
+ | Activehandler(handler)->handler wd dirname evlist purestr
+ | Maskedhandler(_)->()
)
| _ -> ())
evs