diff --git a/lib/tar_cstruct.ml b/lib/tar_cstruct.ml index e2055d5..186ffba 100644 --- a/lib/tar_cstruct.ml +++ b/lib/tar_cstruct.ml @@ -20,6 +20,12 @@ module Cstruct_io = struct let check_available ch len = min (Cstruct.length ch.data - ch.pos) len + let read_zerocopy ic len = + if check_available ic len <> len then raise End_of_file; + let r = Cstruct.sub ic.data ic.pos len in + ic.pos <- ic.pos + len; + r + let really_read ic buf = let len = Cstruct.length buf in if check_available ic len <> len then raise End_of_file; diff --git a/lib/tar_cstruct.mli b/lib/tar_cstruct.mli index 979f421..c93e5ed 100644 --- a/lib/tar_cstruct.mli +++ b/lib/tar_cstruct.mli @@ -19,6 +19,10 @@ val really_read : in_channel -> Cstruct.t -> unit (** [really_read ic buf] fills [buf] with data from [ic] or raises {!Stdlib.End_of_file} *) +val read_zerocopy : in_channel -> int -> Cstruct.t +(** [read_zerocopy ic len] updates the position and returns a sub cstruct of + [ic] or raises {!Stdlib.End_of_file} *) + val skip : in_channel -> int -> unit val really_write : out_channel -> Cstruct.t -> unit