diff --git a/example/load.ml b/example/load.ml index 46b930d..15edacd 100644 --- a/example/load.ml +++ b/example/load.ml @@ -1,8 +1,9 @@ +let ( / ) = Eio.Path.( / ) + let () = Eio_main.run @@ fun env -> - let to_load = Eio.Path.(env#fs / Sys.argv.(1)) in - Eio_mem.run @@ fun env -> - let in_mem = Eio_mem.Fs.load to_load in + Eio_mem.run @@ fun _ -> + let cwd = Eio.Stdenv.cwd env / "src" |> Eio_mem.Fs.load in Eio.traceln "The following filesystem has been loaded into memory: %a..." - Eio.Path.pp in_mem; - Eio_mem.Fs.tree ~depth:max_int Fmt.stdout Eio.Path.(env#fs / "/") + Eio.Path.pp cwd; + Eio_mem.Fs.tree ~depth:max_int Fmt.stdout cwd diff --git a/src/low_level.ml b/src/low_level.ml index bab7e26..0f34234 100644 --- a/src/low_level.ml +++ b/src/low_level.ml @@ -24,6 +24,10 @@ end type Eio.Exn.Backend.t += Eio_mem of string +(* Eio makes use of the empty string for paths so we can start + with "no path". Fpath does not allow that. *) +let check_path p = if String.equal p "" then "." else p + let () = let pp_eio_mem ppf = function | Eio_mem "" -> @@ -400,6 +404,7 @@ let close fd = | Some _ -> Fd_table.remove fd fds let openat ~mode:_ ~sw dir_fd path flags = + let path = check_path path in let is_create = Open_flags.(mem o_creat flags) in let is_excl = Open_flags.(mem o_excl flags) in let append = Open_flags.(mem o_append flags) in @@ -455,12 +460,14 @@ let openat ~mode:_ ~sw dir_fd path flags = (fd, fds)) let statat ~follow dir_fd path = + let path = check_path path in let f = Filesystem.lookup ~follow dir_fd path in Resource.stat !f let dir_base path = (Path.parent path, Path.basename path) let unlink dir_fd path = + let path = check_path path in let dir, base = dir_base path in let r = Filesystem.lookup ~follow:false dir_fd dir in let d = get_dir !r in @@ -470,6 +477,7 @@ let unlink dir_fd path = r := Resource.Dir { d with entries } let mkdirat dir_fd ~perm path = + let path = check_path path in let mkdir r name = let new_stat = make_new_stat ~kind:`Directory ~perm () in let d = get_dir !r in @@ -488,6 +496,7 @@ let mkdirat dir_fd ~perm path = mkdir r base let symlinkat ~link_to dir_fd path = + let path = check_path path in let symlink r name = let new_stat = make_new_stat ~kind:`Symbolic_link ~perm:0o644 () in let d = get_dir !r in @@ -502,12 +511,14 @@ let symlinkat ~link_to dir_fd path = symlink r base let read_link dir_fd path = + let path = check_path path in let r = Filesystem.lookup ~follow:false dir_fd path in match !r with | Symlink s -> s.link_to | r -> Error.err (Fmt.str "not a symlink: %a" Resource.pp r) let read_dir dir_fd path = + let path = check_path path in let r = Filesystem.lookup ~follow:true dir_fd path in match !r with | Resource.Dir dir ->