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
@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 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
- printf "Removing directory %s\n" fqp;
- flush Pervasives.stdout;
- 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 _ ->
- printf "Hm. %s disappeared. Looks like slice %s shot itself in the foot\n" fqp1 (this#get_slice_name ());flush Pervasives.stdout
+ 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 _ ->
- printf "Hm. %s disappeared. Looks like slice %s shot itself in the foot\n" fqp (this#get_slice_name ());flush Pervasives.stdout
+ 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