9 let delete_prefix prefix str =
10 let len = String.length str in
11 let plen = String.length prefix in
12 if (String.sub str 0 plen <> prefix)
16 Relpath(String.sub str (plen+1) (len-plen-1))
18 let rec list_check lst elt =
21 | car::cdr -> if (car==elt) then true else list_check cdr elt
25 * One backendHandler class for each
26 * backend. Builds the initial
27 * tree for the frontend and
28 * watches for directory
32 class backendHandler dir_root (frontend_lst: frontendHandler list) =
33 let mk_rel_path = delete_prefix dir_root in object(this)
35 val file_regexp = ref (Str.regexp "[a-zA-Z][a-zA-Z0-9_-'.']*")
37 method new_dir fqp func =
38 let s = Unix.stat fqp in
41 frontend#mkdir (mk_rel_path fqp) (s.st_perm);
42 Dirwatcher.add_watch fqp [S_Create;S_Delete] (Some(func)))
45 method new_script fqp =
46 let s = Unix.stat fqp in
47 List.iter (fun frontend->
48 frontend#mkentry (mk_rel_path fqp) fqp (s.st_perm)) frontend_lst
50 val dir_regexp = Str.regexp "^dir_";
52 method handle_dir_event dirname evlist fname =
53 let fqp = String.concat "/" [dirname;fname] in
54 if (Str.string_match !file_regexp fname 0) then
56 let is_event = list_check evlist in
57 if (is_event Create) then
59 if (is_event Isdir) then
61 this#new_dir fqp this#handle_dir_event
64 (* It's a new script *)
67 if (Str.string_match dir_regexp fname 0) then
68 let fqp = String.concat "/" [dirname;String.sub fname 4 ((String.length fname)-4+1)] in
69 let real_fqp = String.concat "/" [dirname;fname] in
70 this#new_dir fqp this#handle_spool_event;
71 Hashtbl.add spools fqp real_fqp
76 else if (is_event Delete) then
78 if (is_event Isdir) then
80 (*this#rm_watch fqp;*)
81 List.iter (fun frontend->
82 frontend#rmdir (mk_rel_path fqp)) frontend_lst
84 else List.iter (fun frontend ->
85 frontend#unlink (mk_rel_path fqp)) frontend_lst
88 else (* regex not matched *)
92 let rec build_initial_tree dir =
93 let dir_handle = opendir dir in
94 let cont = ref true in
97 let curfile = readdir dir_handle in
98 let fqp = String.concat "/" [dir;curfile] in
99 if (Str.string_match !file_regexp curfile 0) then
100 let s = Unix.stat fqp in
104 this#new_dir fqp this#handle_dir_event;
105 build_initial_tree fqp;
109 printf "Don't know what to do with %s\n" curfile;flush Pervasives.stdout
116 build_initial_tree dir_root;
117 Dirwatcher.add_watch dir_root [S_Create;S_Delete] (Some(this#handle_dir_event));