424424module rec Dir : sig
425425 include Eio.Fs.Pi. DIR
426426
427- val v : label :string -> Low_level .dir_fd -> t
427+ val v : label :string -> path : string -> Low_level .dir_fd -> t
428428
429429 val close : t -> unit
430430
@@ -433,9 +433,10 @@ end = struct
433433 type t = {
434434 fd : Low_level .dir_fd ;
435435 label : string ;
436+ path : string ;
436437 }
437438
438- let v ~label fd = { fd; label }
439+ let v ~label ~ path fd = { fd; label; path }
439440
440441 let open_in t ~sw path =
441442 let fd = Low_level. openat ~sw t.fd path
@@ -461,14 +462,23 @@ end = struct
461462 in
462463 (flow fd :> Eio.File.rw_ty r )
463464
465+ let native_internal t path =
466+ if Filename. is_relative path then (
467+ let p = Filename. concat t.path path in
468+ if p = " " then " ."
469+ else if p = " ." then p
470+ else if Filename. is_implicit p then " ./" ^ p
471+ else p
472+ ) else path
473+
464474 let open_dir t ~sw path =
465475 let fd = Low_level. openat ~sw ~seekable: false t.fd (if path = " " then " ." else path)
466476 ~access: `R
467477 ~flags: Uring.Open_flags. (cloexec + path + directory)
468478 ~perm: 0
469479 in
470480 let label = Filename. basename path in
471- let d = v ~label (Low_level. FD fd) in
481+ let d = v ~label ~path: (native_internal t path) (Low_level. FD fd) in
472482 Eio.Resource. T (d, Dir_handler. v)
473483
474484 let mkdir t ~perm path = Low_level. mkdir_beneath ~perm t.fd path
@@ -494,6 +504,9 @@ end = struct
494504 let pp f t = Fmt. string f (String. escaped t.label)
495505
496506 let fd t = t.fd
507+
508+ let native t path =
509+ Some (native_internal t path)
497510end
498511and Dir_handler : sig
499512 val v : (Dir .t , [`Dir | `Close ]) Eio.Resource .handler
@@ -505,7 +518,7 @@ end = struct
505518 ]
506519end
507520
508- let dir ~label fd = Eio.Resource. T (Dir. v ~label fd, Dir_handler. v)
521+ let dir ~label ~ path fd = Eio.Resource. T (Dir. v ~label ~path fd, Dir_handler. v)
509522
510523module Secure_random = struct
511524 type t = unit
@@ -521,8 +534,8 @@ let stdenv ~run_event_loop =
521534 let stdin = source Eio_unix.Fd. stdin in
522535 let stdout = sink Eio_unix.Fd. stdout in
523536 let stderr = sink Eio_unix.Fd. stderr in
524- let fs = (dir ~label: " fs" Fs , " " ) in
525- let cwd = (dir ~label: " cwd" Cwd , " " ) in
537+ let fs = (dir ~label: " fs" ~path: " " Fs , " " ) in
538+ let cwd = (dir ~label: " cwd" ~path: " " Cwd , " " ) in
526539 object (_ : stdenv )
527540 method stdin = stdin
528541 method stdout = stdout
0 commit comments