X-Git-Url: http://git.onelab.eu/?p=vsys.git;a=blobdiff_plain;f=frontend.ml;h=ad36172c0087d9116c5087a2de2972ef4230e60d;hp=39467369ab385c5ad57ab7e42ab0078d6d27e3b2;hb=2b608078f42cc629a62b64149bc620a227c8831f;hpb=87c0dc3957634fe643267904d0cedfed80a03f68 diff --git a/frontend.ml b/frontend.ml index 3946736..ad36172 100644 --- a/frontend.ml +++ b/frontend.ml @@ -3,7 +3,7 @@ open Printf open Unix open Globals -open Fifowatcher +open Directfifowatcher (** frontendhandler class: Methods to create and unlink pipes and directories @param root_dir vsys directory inside a slice @@ -18,55 +18,79 @@ object(this) @param abspath Absolute path of the entry @param perm Permissions of the entry at the frontend *) method mkentry (rp:relpath) abspath perm = - let realperm = perm land (lnot 0o111) in - match rp with Relpath(rel) -> - let fqp = String.concat "/" [root_dir;rel] in - let res = Fifowatcher.mkentry fqp abspath realperm slice_name in - match res with - | Success -> - Fifowatcher.openentry fqp (abspath,slice_name) realperm - | _ -> () + let realperm = perm land (lnot 0o111) in + match rp with Relpath(rel) -> + let fqp = String.concat "/" [root_dir;rel] in + let res = Directfifowatcher.mkentry fqp abspath realperm slice_name in + match res with + | Success -> + Directfifowatcher.openentry root_dir fqp (abspath,slice_name) + | _ -> () (** A new directory was created at the backend, make a corresponding directory at the frontend. Refer to mkentry for parameters *) method mkdir rp perm = match rp with Relpath(rel) -> - let fqp = String.concat "/" [root_dir;rel] in - try - let s = Unix.stat fqp in - if (s.st_kind<>S_DIR) then - begin - Unix.unlink fqp; - Unix.mkdir fqp perm - end - else if (s.st_perm <> perm) then - begin - fprintf logfd "Removing directory %s\n" fqp; - flush logfd; - Unix.rmdir fqp; - Unix.mkdir fqp perm - end - with Unix.Unix_error(_,_,_) -> - Unix.mkdir fqp perm + let fqp = String.concat "/" [root_dir;rel] in + try + let s = Unix.stat fqp in + if (s.st_kind<>S_DIR) then + begin + Unix.unlink fqp; + Unix.mkdir fqp perm + end + else if (s.st_perm <> perm) then + begin + Unix.rmdir fqp; + Unix.mkdir fqp perm + end; + with Unix.Unix_error(_,_,_) -> + Unix.mkdir fqp perm; + Directfifowatcher.add_dir_watch fqp (** Functions corresponding to file deletion/directory removal *) (** *) method unlink rp = match rp with Relpath(rel) -> - let fqp1 = String.concat "/" [root_dir;rel;".in"] in - let fqp2 = String.concat "/" [root_dir;rel;".out"] in - try - Unix.unlink fqp1; - Unix.unlink fqp2 - with _ -> - fprintf logfd "Hm. %s disappeared. Looks like slice %s shot itself in the foot\n" fqp1 (this#get_slice_name ());flush logfd + let fqp = String.concat "/" [root_dir;rel] in + let fqp_in = String.concat "." [fqp;"in"] in + let fqp_out = String.concat "." [fqp;"out"] in + Directfifowatcher.closeentry fqp; + try + Unix.unlink fqp_in; + Unix.unlink fqp_out + with _ -> + logprint "Hm. %s disappeared. Looks like slice %s shot itself in the foot\n" fqp (this#get_slice_name ()) method rmdir rp = match rp with Relpath(rel) -> - let fqp = String.concat "/" [root_dir;rel] in - try - Unix.rmdir fqp - with _ -> - fprintf logfd "Hm. %s disappeared. Looks like slice %s shot itself in the foot\n" fqp (this#get_slice_name ());flush logfd + let fqp = String.concat "/" [root_dir;rel] in + Directfifowatcher.del_dir_watch fqp; + try + Unix.rmdir fqp + with _ -> + logprint "Hm. %s disappeared or not empty. Looks like slice %s shot itself in the foot\n" fqp (this#get_slice_name ()) + + initializer + ( + try + let s = Unix.stat root_dir in + if (s.st_kind<>S_DIR) then + begin + Unix.unlink root_dir; + Unix.mkdir root_dir 0o700 + end + else if (s.st_perm <> 0o700) then + begin + Unix.rmdir root_dir; + Unix.mkdir root_dir 0o700 + end; + with Unix.Unix_error(_,_,_) -> + begin + try + Unix.mkdir root_dir 0o700; + with _ -> (); + end); + Directfifowatcher.add_dir_watch root_dir end