These utility functions will be used in the OCaml inspection code. --- daemon/daemon_utils_tests.ml | 10 ++++++++++ daemon/utils.ml | 17 +++++++++++++++++ daemon/utils.mli | 11 +++++++++++ 3 files changed, 38 insertions(+)
diff --git a/daemon/daemon_utils_tests.ml b/daemon/daemon_utils_tests.ml index 892509d89..db94161a0 100644 --- a/daemon/daemon_utils_tests.ml +++ b/daemon/daemon_utils_tests.ml @@ -46,3 +46,13 @@ let () = let () = assert (proc_unmangle_path "\\040" = " "); assert (proc_unmangle_path "\\040\\040" = " ") + +(* Test unix_canonical_path. *) +let () = + assert (unix_canonical_path "/" = "/"); + assert (unix_canonical_path "/usr" = "/usr"); + assert (unix_canonical_path "/usr/" = "/usr"); + assert (unix_canonical_path "/usr/local" = "/usr/local"); + assert (unix_canonical_path "///" = "/"); + assert (unix_canonical_path "///usr//local//" = "/usr/local"); + assert (unix_canonical_path "/usr///" = "/usr") diff --git a/daemon/utils.ml b/daemon/utils.ml index ecf967966..d87ad75db 100644 --- a/daemon/utils.ml +++ b/daemon/utils.ml @@ -212,3 +212,20 @@ let proc_unmangle_path path = let is_small_file path = is_regular_file path && (stat path).st_size <= 2 * 1048 * 1024 + +let read_small_file filename = + if not (is_small_file filename) then ( + eprintf "%s: not a regular file or too large\n" filename; + None + ) + else ( + let content = read_whole_file filename in + let lines = String.nsplit "\n" content in + Some lines + ) + +let unix_canonical_path path = + let is_absolute = String.length path > 0 && path.[0] = '/' in + let path = String.nsplit "/" path in + let path = List.filter ((<>) "") path in + (if is_absolute then "/" else "") ^ String.concat "/" path diff --git a/daemon/utils.mli b/daemon/utils.mli index 9f9f91a49..f312bde41 100644 --- a/daemon/utils.mli +++ b/daemon/utils.mli @@ -86,5 +86,16 @@ val commandr : ?fold_stdout_on_stderr:bool -> string -> string list -> (int * st val is_small_file : string -> bool (** Return true if the path is a small regular file. *) +val read_small_file : string -> string list option +(** If [filename] is a small file (see {!is_small_file}) then read it + split into lines. Otherwise emits a debug message and returns + [None]. *) + +val unix_canonical_path : string -> string +(** Canonicalize a Unix path, so "///usr//local//" -> "/usr/local" + + The path is modified in place because the result is always + the same length or shorter than the argument passed. *) + (**/**) val get_verbose_flag : unit -> bool -- 2.13.2 _______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://www.redhat.com/mailman/listinfo/libguestfs