diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2011-03-23 16:00:48 +0000 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2011-03-23 16:00:48 +0000 |
commit | 3f1e3223c491aa057d02c1da418ed896d09fff7c (patch) | |
tree | 7859c338e4264acaa5656adc2ab67156de794c51 | |
parent | 0daf7e81a659bcdc1ce327151cc1207b124a35a1 (diff) | |
download | libguestfs-3f1e3223c491aa057d02c1da418ed896d09fff7c.tar.gz libguestfs-3f1e3223c491aa057d02c1da418ed896d09fff7c.tar.xz libguestfs-3f1e3223c491aa057d02c1da418ed896d09fff7c.zip |
New API: guestfs_inspect_get_product_variant
This returns a product variant for inspected operating systems. In
practice this is a useful way to distinguish between consumer and
enterprise/server versions of Windows that otherwise have the same
version number.
Notes
Notes:
Labels: feature
-rw-r--r-- | generator/generator_actions.ml | 32 | ||||
-rwxr-xr-x | images/guest-aux/windows-software | bin | 12288 -> 12288 bytes | |||
-rw-r--r-- | images/guest-aux/windows-software.reg | 1 | ||||
-rw-r--r-- | inspector/example-windows.xml | 2 | ||||
-rw-r--r-- | inspector/virt-inspector.c | 9 | ||||
-rwxr-xr-x | inspector/virt-inspector.pod | 3 | ||||
-rw-r--r-- | inspector/virt-inspector.rng | 1 | ||||
-rw-r--r-- | src/guestfs-internal.h | 1 | ||||
-rw-r--r-- | src/inspect.c | 25 |
9 files changed, 71 insertions, 3 deletions
diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index e085fb6b..11144e80 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -1,5 +1,5 @@ (* libguestfs - * Copyright (C) 2009-2010 Red Hat Inc. + * Copyright (C) 2009-2011 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 @@ -1417,6 +1417,36 @@ L<guestfs(3)/ATTACHING TO RUNNING DAEMONS>. "\ Return the current attach method. See C<guestfs_set_attach_method>."); + ("inspect_get_product_variant", (RString "variant", [Device "root"], []), -1, [], + [], + "get product variant of inspected operating system", + "\ +This function should only be called with a root device string +as returned by C<guestfs_inspect_os>. + +This returns the product variant of the inspected operating +system. + +For Windows guests, this returns the contents of the Registry key +C<HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion> +C<InstallationType> which is usually a string such as +C<Client> or C<Server> (other values are possible). This +can be used to distinguish consumer and enterprise versions +of Windows that have the same version number (for example, +Windows 7 and Windows 2008 Server are both version 6.1, +but the former is C<Client> and the latter is C<Server>). + +For enterprise Linux guests, in future we intend this to return +the product variant such as C<Desktop>, C<Server> and so on. But +this is not implemented at present. + +If the product variant could not be determined, then the +string C<unknown> is returned. + +Please read L<guestfs(3)/INSPECTION> for more details. +See also C<guestfs_inspect_get_product_name>, +C<guestfs_inspect_get_major_version>."); + ] (* daemon_functions are any functions which cause some action diff --git a/images/guest-aux/windows-software b/images/guest-aux/windows-software Binary files differindex 1091c13e..e9358860 100755 --- a/images/guest-aux/windows-software +++ b/images/guest-aux/windows-software diff --git a/images/guest-aux/windows-software.reg b/images/guest-aux/windows-software.reg index 984cbe42..e2efda61 100644 --- a/images/guest-aux/windows-software.reg +++ b/images/guest-aux/windows-software.reg @@ -5,6 +5,7 @@ [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion] "ProductName"=str(1):"Microsoft Windows 7 Phony Edition" "CurrentVersion"=str(1):"6.1" +"InstallationType"=str(1):"Client" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows] diff --git a/inspector/example-windows.xml b/inspector/example-windows.xml index 346b2ed2..12c69560 100644 --- a/inspector/example-windows.xml +++ b/inspector/example-windows.xml @@ -6,9 +6,11 @@ <arch>i386</arch> <distro>windows</distro> <product_name>Microsoft Windows 7 Phony Edition</product_name> + <product_variant>Client</product_variant> <major_version>6</major_version> <minor_version>1</minor_version> <windows_systemroot>/Windows</windows_systemroot> + <format>installed</format> <mountpoints> <mountpoint dev="/dev/sda2">/</mountpoint> </mountpoints> diff --git a/inspector/virt-inspector.c b/inspector/virt-inspector.c index e7db5b9b..4d8e3adc 100644 --- a/inspector/virt-inspector.c +++ b/inspector/virt-inspector.c @@ -1,5 +1,5 @@ /* virt-inspector - * Copyright (C) 2010 Red Hat Inc. + * Copyright (C) 2010-2011 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 @@ -373,6 +373,13 @@ output_root (xmlTextWriterPtr xo, char *root) xmlTextWriterWriteElement (xo, BAD_CAST "product_name", BAD_CAST str)); free (str); + str = guestfs_inspect_get_product_variant (g, root); + if (!str) exit (EXIT_FAILURE); + if (STRNEQ (str, "unknown")) + XMLERROR (-1, + xmlTextWriterWriteElement (xo, BAD_CAST "product_variant", BAD_CAST str)); + free (str); + i = guestfs_inspect_get_major_version (g, root); snprintf (buf, sizeof buf, "%d", i); XMLERROR (-1, diff --git a/inspector/virt-inspector.pod b/inspector/virt-inspector.pod index cd0e6175..26c61263 100755 --- a/inspector/virt-inspector.pod +++ b/inspector/virt-inspector.pod @@ -165,6 +165,7 @@ describe the operating system, its architecture, the descriptive <arch>i386</arch> <distro>windows</distro> <product_name>Windows 7 Enterprise</product_name> + <product_variant>Client</product_variant> <major_version>6</major_version> <minor_version>1</minor_version> <windows_systemroot>/Windows</windows_systemroot> @@ -317,7 +318,7 @@ Matthew Booth L<mbooth@redhat.com> =head1 COPYRIGHT -Copyright (C) 2010 Red Hat Inc. +Copyright (C) 2010-2011 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 diff --git a/inspector/virt-inspector.rng b/inspector/virt-inspector.rng index 973bc3cc..8d54facd 100644 --- a/inspector/virt-inspector.rng +++ b/inspector/virt-inspector.rng @@ -33,6 +33,7 @@ <optional><element name="arch"><text/></element></optional> <optional><element name="distro"><text/></element></optional> <optional><element name="product_name"><text/></element></optional> + <optional><element name="product_variant"><text/></element></optional> <element name="major_version"><text/></element> <element name="minor_version"><text/></element> <optional><element name="windows_systemroot"><text/></element></optional> diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h index d0dcf235..155763d8 100644 --- a/src/guestfs-internal.h +++ b/src/guestfs-internal.h @@ -244,6 +244,7 @@ struct inspect_fs { enum inspect_os_package_format package_format; enum inspect_os_package_management package_management; char *product_name; + char *product_variant; int major_version; int minor_version; char *arch; diff --git a/src/inspect.c b/src/inspect.c index 1129a53d..b4acf177 100644 --- a/src/inspect.c +++ b/src/inspect.c @@ -1558,6 +1558,14 @@ check_windows_software_registry (guestfs_h *g, struct inspect_fs *fs) free (version); } + else if (STRCASEEQ (key, "InstallationType")) { + fs->product_variant = hivex_value_string (h, values[i]); + if (!fs->product_variant) { + perrorf (g, "hivex_value_string"); + free (key); + goto out; + } + } free (key); } @@ -1966,6 +1974,16 @@ guestfs__inspect_get_product_name (guestfs_h *g, const char *root) } char * +guestfs__inspect_get_product_variant (guestfs_h *g, const char *root) +{ + struct inspect_fs *fs = search_for_root (g, root); + if (!fs) + return NULL; + + return safe_strdup (g, fs->product_variant ? : "unknown"); +} + +char * guestfs__inspect_get_windows_systemroot (guestfs_h *g, const char *root) { struct inspect_fs *fs = search_for_root (g, root); @@ -2850,6 +2868,12 @@ guestfs__inspect_get_product_name (guestfs_h *g, const char *root) } char * +guestfs__inspect_get_product_variant (guestfs_h *g, const char *root) +{ + NOT_IMPL(NULL); +} + +char * guestfs__inspect_get_windows_systemroot (guestfs_h *g, const char *root) { NOT_IMPL(NULL); @@ -2924,6 +2948,7 @@ guestfs___free_inspect_info (guestfs_h *g) for (i = 0; i < g->nr_fses; ++i) { free (g->fses[i].device); free (g->fses[i].product_name); + free (g->fses[i].product_variant); free (g->fses[i].arch); free (g->fses[i].hostname); free (g->fses[i].windows_systemroot); |