(* TEST
   include unix;
   hasunix;
   {
     bytecode;
   }{
     native;
   }
*)

let str = "Hello, OCaml!"

let append () =
  let fd =
    Unix.openfile "append.txt"
      [ Unix.O_WRONLY; Unix.O_CREAT; Unix.O_APPEND ]
      0o644
  in
  let len = String.length str in
  let rec f = function
    | 0 -> ()
    | rem ->
        let n = Unix.write_substring fd str (len - rem) rem in
        f (rem - n)
  in
  f len;
  Unix.close fd

let () =
  append ();
  append ();
  let fd = Unix.openfile "append.txt" [ Unix.O_RDONLY ] 0o644 in
  let buf = Buffer.create 10 in
  let b = Bytes.create 10 in
  let rec f () =
    let n = Unix.read fd b 0 10 in
    Buffer.add_subbytes buf b 0 n;
    if n <> 0 then f ()
  in
  f ();
  Unix.close fd;
  Sys.remove "append.txt";
  assert (Buffer.contents buf = str ^ str)
