let find ?(follow=false) ?(maxdepth=1024) ?(kind='_') ?(name="") (root:string) : string list =
let result = ref [] in
let action = match (file_kind_of_char kind, name) with
| (None , "" ) -> fun p infos -> result := (p::!result)
| ((Some k), "" ) -> fun p infos -> if (infos.Unix.st_kind = k) then result := (p::!result);
| (None , n ) -> fun p infos -> if ((Filename.basename p) = n) then result := (p::!result)
| ((Some k), n ) -> fun p infos -> if (infos.Unix.st_kind = k) && ((Filename.basename p) = n)
then result := (p::!result); in
let action p infos = (action p infos; true) in
let on_error (e, b, c) = prerr_endline (c ^ ": " ^ Unix.error_message e) in
Unix.handle_unix_error (Findlib.find on_error action follow maxdepth) [root];
List.rev (!result)