@@ -631,6 +631,12 @@ let wait_read ch =
631631
632632external stub_read : Unix .file_descr -> Bytes .t -> int -> int -> int = " lwt_unix_read"
633633external read_job : Unix .file_descr -> Bytes .t -> int -> int -> int job = " lwt_unix_read_job"
634+ external stub_pread :
635+ Unix .file_descr -> Bytes .t -> file_offset :int -> int -> int -> int =
636+ " lwt_unix_pread"
637+ external pread_job :
638+ Unix .file_descr -> Bytes .t -> file_offset :int -> int -> int -> int job =
639+ " lwt_unix_pread_job"
634640
635641let read ch buf pos len =
636642 if pos < 0 || len < 0 || pos > Bytes. length buf - len then
@@ -643,6 +649,17 @@ let read ch buf pos len =
643649 | false ->
644650 wrap_syscall Read ch (fun () -> stub_read ch.fd buf pos len)
645651
652+ let pread ch buf ~file_offset pos len =
653+ if pos < 0 || len < 0 || pos > Bytes. length buf - len then
654+ invalid_arg " Lwt_unix.pread"
655+ else
656+ Lazy. force ch.blocking >> = function
657+ | true ->
658+ wait_read ch >> = fun () ->
659+ run_job (pread_job ch.fd buf ~file_offset pos len)
660+ | false ->
661+ wrap_syscall Read ch (fun () -> stub_pread ch.fd buf ~file_offset pos len)
662+
646663external stub_read_bigarray :
647664 Unix .file_descr -> bigarray -> int -> int -> int = " lwt_unix_bytes_read"
648665external read_bigarray_job :
@@ -672,6 +689,12 @@ let wait_write ch =
672689
673690external stub_write : Unix .file_descr -> Bytes .t -> int -> int -> int = " lwt_unix_write"
674691external write_job : Unix .file_descr -> Bytes .t -> int -> int -> int job = " lwt_unix_write_job"
692+ external stub_pwrite :
693+ Unix .file_descr -> Bytes .t -> file_offset :int -> int -> int -> int =
694+ " lwt_unix_pwrite"
695+ external pwrite_job :
696+ Unix .file_descr -> Bytes .t -> file_offset :int -> int -> int -> int job =
697+ " lwt_unix_pwrite_job"
675698
676699let write ch buf pos len =
677700 if pos < 0 || len < 0 || pos > Bytes. length buf - len then
@@ -684,10 +707,25 @@ let write ch buf pos len =
684707 | false ->
685708 wrap_syscall Write ch (fun () -> stub_write ch.fd buf pos len)
686709
710+ let pwrite ch buf ~file_offset pos len =
711+ if pos < 0 || len < 0 || pos > Bytes. length buf - len then
712+ invalid_arg " Lwt_unix.pwrite"
713+ else
714+ Lazy. force ch.blocking >> = function
715+ | true ->
716+ wait_write ch >> = fun () ->
717+ run_job (pwrite_job ch.fd buf ~file_offset pos len)
718+ | false ->
719+ wrap_syscall Write ch (fun () -> stub_pwrite ch.fd buf ~file_offset pos len)
720+
687721let write_string ch buf pos len =
688722 let buf = Bytes. unsafe_of_string buf in
689723 write ch buf pos len
690724
725+ let pwrite_string ch buf ~file_offset pos len =
726+ let buf = Bytes. unsafe_of_string buf in
727+ pwrite ch buf ~file_offset pos len
728+
691729external stub_write_bigarray :
692730 Unix .file_descr -> bigarray -> int -> int -> int = " lwt_unix_bytes_write"
693731external write_bigarray_job :
0 commit comments