]> xenbits.xensource.com Git - people/royger/xen.git/commitdiff
oxenstored: avoid leading slash in paths in saved store state
authorJonathan Davies <jonathan.davies@citrix.com>
Fri, 7 Apr 2017 13:27:19 +0000 (14:27 +0100)
committerWei Liu <wei.liu2@citrix.com>
Mon, 10 Apr 2017 13:46:21 +0000 (14:46 +0100)
Internally, paths are represented as lists of strings, where
  * path "/" is represented by []
  * path "/local/domain/0" is represented by ["local"; "domain"; "0"]
(see comment for Store.Path.t).

However, the traversal function generated paths like
    [""; "local"; "domain"; "0"]
because the name of the root node is "". Change it to generate paths
correctly.

Furthermore, the function passed to Store.dump_fct would render the node
"foo" under the path [] as "//foo". Change this to return "/foo".

Signed-off-by: Jonathan Davies <jonathan.davies@citrix.com>
Reviewed-by: Wei Liu <wei.liu2@citrix.com>
Reviewed-by: Christian Lindig <christian.lindig@citrix.com>
Release-acked-by: Julien Grall <julien.grall@arm.com>
tools/ocaml/xenstored/store.ml
tools/ocaml/xenstored/xenstored.ml

index 9f619b8fd5470a9a8da9f48d7453ae3accdab7f7..13cf3b5bf459531cb8ec47385a6c9473835b1018 100644 (file)
@@ -122,6 +122,11 @@ let of_string s =
                | "" :: path when is_valid path -> path
                | _ -> raise Define.Invalid_path
 
+let of_path_and_name path name =
+       match path, name with
+       | [], "" -> []
+       | _ -> path @ [name]
+
 let create path connection_path =
        of_string (Utils.path_validate path connection_path)
 
@@ -343,7 +348,8 @@ let path_exists store path =
 let traversal root_node f =
        let rec _traversal path node =
                f path node;
-               List.iter (_traversal (path @ [ Symbol.to_string node.Node.name ])) node.Node.children
+               let node_path = Path.of_path_and_name path (Symbol.to_string node.Node.name) in
+               List.iter (_traversal node_path) node.Node.children
                in
        _traversal [] root_node
 
index 09da25715078a09cb84243cc5e7204b8a3414a6f..77fd9e3bacbe5de3b743c2aa157c871e393ed168 100644 (file)
@@ -213,7 +213,7 @@ let to_channel store cons chan =
        (* dump the store *)
        Store.dump_fct store (fun path node ->
                let name, perms, value = Store.Node.unpack node in
-               let fullpath = (Store.Path.to_string path) ^ "/" ^ name in
+               let fullpath = Store.Path.to_string (Store.Path.of_path_and_name path name) in
                let permstr = Perms.Node.to_string perms in
                fprintf chan "store,%s,%s,%s\n" (hexify fullpath) (hexify permstr) (hexify value)
        );