let dir_entries ?prefix dir =
(*
  prerr_endline (Printf.sprintf "dir_entries: prefix=%s dir=%s"
                   (match prefix with None -> "" | Some s -> s)
                   dir);
*)

  let d = fail_if_unix_error Unix.opendir dir in
  let rec iter acc =
    let name_opt =
      try Some (Unix.readdir d)
      with End_of_file ->
        Unix.closedir d;
        None
    in
    match name_opt with
      None -> List.rev acc
    | Some name ->
        let acc =
          match prefix with
            None -> name::acc
          | Some s ->
              if is_prefix name s then
                name :: acc
              else
                acc
        in
        iter acc
  in
  iter []