[Pkg-libvirt-commits] [libguestfs] 27/266: mllib: Add regedit mini-library.

Hilko Bengen bengen at moszumanska.debian.org
Fri Oct 3 14:41:35 UTC 2014


This is an automated email from the git hooks/post-receive script.

bengen pushed a commit to annotated tag debian/1%1.27.35-1
in repository libguestfs.

commit 199fa269508ac9ae2de32927e04996834af149d4
Author: Richard W.M. Jones <rjones at redhat.com>
Date:   Tue Jul 8 21:41:58 2014 +0100

    mllib: Add regedit mini-library.
    
    This library replaces Win::Hivex::Regedit, or at least enough for us
    to be able to make the simple Registry modifications needed for
    installing firstboot scripts.
---
 mllib/Makefile.am |   5 ++-
 mllib/regedit.ml  | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mllib/regedit.mli |  64 ++++++++++++++++++++++++++++++++++
 po/POTFILES-ml    |   1 +
 4 files changed, 170 insertions(+), 1 deletion(-)

diff --git a/mllib/Makefile.am b/mllib/Makefile.am
index 2528e72..af0fe85 100644
--- a/mllib/Makefile.am
+++ b/mllib/Makefile.am
@@ -40,6 +40,8 @@ SOURCES = \
 	progress-c.c \
 	progress.mli \
 	progress.ml \
+	regedit.mli \
+	regedit.ml \
 	tty-c.c \
 	tTY.mli \
 	tTY.ml \
@@ -62,7 +64,8 @@ ocaml_modules = config \
 	progress \
 	uRI \
 	mkdtemp \
-	planner
+	planner \
+	regedit
 
 OBJECTS = \
 	$(top_builddir)/fish/guestfish-progress.o \
diff --git a/mllib/regedit.ml b/mllib/regedit.ml
new file mode 100644
index 0000000..673b215
--- /dev/null
+++ b/mllib/regedit.ml
@@ -0,0 +1,101 @@
+(* virt-v2v
+ * Copyright (C) 2014 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *)
+
+open Common_utils
+open Common_gettext.Gettext
+
+type regedits = regedit list
+and regedit = regkeypath * regvalues
+and regkeypath = string list
+and regvalues = regvalue list
+and regvalue = string * regtype
+and regtype =
+| REG_NONE
+| REG_SZ of string
+| REG_EXPAND_SZ of string
+| REG_BINARY of string
+| REG_DWORD of int32
+
+(* Take a 7 bit ASCII string and encode it as UTF16LE. *)
+let encode_utf16le str =
+  let len = String.length str in
+  let copy = String.make (len*2) '\000' in
+  for i = 0 to len-1 do
+    String.unsafe_set copy (i*2) (String.unsafe_get str i)
+  done;
+  copy
+
+(* Take a UTF16LE string and decode it to UTF-8.  Actually this
+ * fails if the string is not 7 bit ASCII.  XXX Use iconv here.
+ *)
+let decode_utf16le ~prog str =
+  let len = String.length str in
+  if len mod 2 <> 0 then
+    error ~prog (f_"decode_utf16le: Windows string does not appear to be in UTF16-LE encoding.  This could be a bug in %s.") prog;
+  let copy = String.create (len/2) in
+  for i = 0 to (len/2)-1 do
+    let cl = String.unsafe_get str (i*2) in
+    let ch = String.unsafe_get str ((i*2)+1) in
+    if ch != '\000' || Char.code cl >= 127 then
+      error ~prog (f_"decode_utf16le: Windows UTF16-LE string contains non-7-bit characters.  This is a bug in %s, please report it.") prog;
+    String.unsafe_set copy i cl
+  done;
+  copy
+
+let rec import_key (g : Guestfs.guestfs) root (path, values) =
+  (* Create the path starting at the root node. *)
+  let node =
+    let rec loop parent = function
+      | [] -> parent
+      | x :: xs ->
+        let node =
+          match g#hivex_node_get_child parent x with
+          | 0L -> g#hivex_node_add_child parent x (* not found, create *)
+          | node -> node in
+        loop node xs
+    in
+    loop root path in
+
+  (* Delete any existing values in this node. *)
+  (* g#hivex_node_set_values ...
+     XXX Or at least, it would be nice to do this, but there is no
+     binding for it in libguestfs.  I'm not sure how much this matters. *)
+
+  (* Create the values. *)
+  import_values g node values
+
+and import_values g node = List.iter (import_value g node)
+
+and import_value g node = function
+  | key, REG_NONE -> g#hivex_node_set_value node key 0L ""
+  (* All string registry fields have a terminating NUL, which in
+   * UTF-16LE means they have 3 zero bytes -- the first is the high
+   * byte from the last character, and the second and third are the
+   * UTF-16LE encoding of ASCII NUL.  So we have to add two zero
+   * bytes at the end of string fields.
+   *)
+  | key, REG_SZ s ->
+    g#hivex_node_set_value node key 1L (encode_utf16le s ^ "\000\000")
+  | key, REG_EXPAND_SZ s ->
+    g#hivex_node_set_value node key 2L (encode_utf16le s ^ "\000\000")
+  | key, REG_BINARY bin ->
+    g#hivex_node_set_value node key 3L bin
+  | key, REG_DWORD dw ->
+    g#hivex_node_set_value node key 4L (le32_of_int (Int64.of_int32 dw))
+
+let reg_import g root = List.iter (import_key g root)
diff --git a/mllib/regedit.mli b/mllib/regedit.mli
new file mode 100644
index 0000000..1f43cdd
--- /dev/null
+++ b/mllib/regedit.mli
@@ -0,0 +1,64 @@
+(* virt-v2v
+ * Copyright (C) 2014 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *)
+
+(** A simple registry editor.
+
+    This uses the libguestfs hivex bindings to implement a simple
+    registry editor in the style of [regedit] / [hivexregedit].  We have
+    to write this because the [Win::Hivex::Regedit] APIs are Perl-only.
+
+    It has a large number of limitations compared to
+    [Win::Hivex::Regedit].  It's just enough code to allow us to
+    implement virt-v2v and firstboot functionality, and no more.  In
+    particular it can only add keys, not delete or edit them. *)
+
+type regedits = regedit list
+(** A list of registry "edits" (although only adding keys is supported). *)
+
+and regedit = regkeypath * regvalues
+(** A single key ([regkeypath]) is added, with a list of values for that key. *)
+
+and regkeypath = string list
+(** Path to the new key, starting from the root node.  New path elements
+    are created as required. *)
+
+and regvalues = regvalue list
+
+and regvalue = string * regtype
+
+and regtype =
+| REG_NONE
+| REG_SZ of string                      (** String. *)
+| REG_EXPAND_SZ of string               (** String with %env% *)
+| REG_BINARY of string                  (** Blob of binary data *)
+| REG_DWORD of int32                    (** Little endian 32 bit integer *)
+(* There are more types in the Registry, but we don't support them here... *)
+(** Registry value type and data.
+
+    Note that strings are automatically converted from UTF-8 to
+    UTF-16LE, and integers are automatically packed and
+    byte-swapped. *)
+
+val reg_import : Guestfs.guestfs -> int64 -> regedits -> unit
+(** Import the edits in [regedits] into the currently opened hive. *)
+
+val encode_utf16le : string -> string
+(** Helper: Take a 7 bit ASCII string and encode it as UTF-16LE. *)
+
+val decode_utf16le : prog:string -> string -> string
+(** Helper: Take a UTF-16LE string and decode it to UTF-8. *)
diff --git a/po/POTFILES-ml b/po/POTFILES-ml
index 4a6cd9c..fe6f169 100644
--- a/po/POTFILES-ml
+++ b/po/POTFILES-ml
@@ -34,6 +34,7 @@ mllib/libdir.ml
 mllib/mkdtemp.ml
 mllib/planner.ml
 mllib/progress.ml
+mllib/regedit.ml
 mllib/tTY.ml
 mllib/uRI.ml
 resize/resize.ml

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-libvirt/libguestfs.git



More information about the Pkg-libvirt-commits mailing list