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

Reply via email to