@@ -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
@@ -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)
);
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> --- tools/ocaml/xenstored/store.ml | 8 +++++++- tools/ocaml/xenstored/xenstored.ml | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-)