summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2010-10-27 16:47:33 +0100
committerRichard W.M. Jones <rjones@redhat.com>2010-10-28 15:16:15 +0100
commita51f56adb168ac7d4b65b98c7f0cdb07f266265f (patch)
tree804e1596c32f2064fc5f3bf504afbbb92c0cceea /src
parent40d58fe65e10aa692d056a573e21e5afdc9329c7 (diff)
downloadlibguestfs-a51f56adb168ac7d4b65b98c7f0cdb07f266265f.tar.gz
libguestfs-a51f56adb168ac7d4b65b98c7f0cdb07f266265f.tar.xz
libguestfs-a51f56adb168ac7d4b65b98c7f0cdb07f266265f.zip
New API: inspect-get-windows-systemroot to get systemroot.
We are already using heuristics in the C inspection code to determine the Windows %SYSTEMROOT% directory. This change just exposes this information through the API.
Diffstat (limited to 'src')
-rw-r--r--src/guestfs-internal.h1
-rw-r--r--src/inspect.c53
2 files changed, 31 insertions, 23 deletions
diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h
index a42375fc..6fc9412d 100644
--- a/src/guestfs-internal.h
+++ b/src/guestfs-internal.h
@@ -180,6 +180,7 @@ struct inspect_fs {
int major_version;
int minor_version;
char *arch;
+ char *windows_systemroot;
struct inspect_fstab_entry *fstab;
size_t nr_fstab;
};
diff --git a/src/inspect.c b/src/inspect.c
index 992573a6..5bd332fb 100644
--- a/src/inspect.c
+++ b/src/inspect.c
@@ -456,6 +456,7 @@ guestfs___free_inspect_info (guestfs_h *g)
free (g->fses[i].device);
free (g->fses[i].product_name);
free (g->fses[i].arch);
+ free (g->fses[i].windows_systemroot);
size_t j;
for (j = 0; j < g->fses[i].nr_fstab; ++j) {
free (g->fses[i].fstab[j].device);
@@ -502,10 +503,8 @@ static int check_filesystem (guestfs_h *g, const char *device);
static int check_linux_root (guestfs_h *g, struct inspect_fs *fs);
static int check_fstab (guestfs_h *g, struct inspect_fs *fs);
static int check_windows_root (guestfs_h *g, struct inspect_fs *fs);
-static int check_windows_arch (guestfs_h *g, struct inspect_fs *fs,
- const char *systemroot);
-static int check_windows_registry (guestfs_h *g, struct inspect_fs *fs,
- const char *systemroot);
+static int check_windows_arch (guestfs_h *g, struct inspect_fs *fs);
+static int check_windows_registry (guestfs_h *g, struct inspect_fs *fs);
static char *resolve_windows_path_silently (guestfs_h *g, const char *);
static int extend_fses (guestfs_h *g);
static int parse_unsigned_int (guestfs_h *g, const char *str);
@@ -962,34 +961,27 @@ check_windows_root (guestfs_h *g, struct inspect_fs *fs)
return -1;
}
- /* XXX There is a case for exposing systemroot and many variables
- * from the registry through the libguestfs API.
- */
-
if (g->verbose)
fprintf (stderr, "windows %%SYSTEMROOT%% = %s", systemroot);
- if (check_windows_arch (g, fs, systemroot) == -1) {
- free (systemroot);
+ /* Freed by guestfs___free_inspect_info. */
+ fs->windows_systemroot = systemroot;
+
+ if (check_windows_arch (g, fs) == -1)
return -1;
- }
- if (check_windows_registry (g, fs, systemroot) == -1) {
- free (systemroot);
+ if (check_windows_registry (g, fs) == -1)
return -1;
- }
- free (systemroot);
return 0;
}
static int
-check_windows_arch (guestfs_h *g, struct inspect_fs *fs,
- const char *systemroot)
+check_windows_arch (guestfs_h *g, struct inspect_fs *fs)
{
- size_t len = strlen (systemroot) + 32;
+ size_t len = strlen (fs->windows_systemroot) + 32;
char cmd_exe[len];
- snprintf (cmd_exe, len, "%s/system32/cmd.exe", systemroot);
+ snprintf (cmd_exe, len, "%s/system32/cmd.exe", fs->windows_systemroot);
char *cmd_exe_path = resolve_windows_path_silently (g, cmd_exe);
if (!cmd_exe_path)
@@ -1009,8 +1001,7 @@ check_windows_arch (guestfs_h *g, struct inspect_fs *fs,
* registry fields available to callers.
*/
static int
-check_windows_registry (guestfs_h *g, struct inspect_fs *fs,
- const char *systemroot)
+check_windows_registry (guestfs_h *g, struct inspect_fs *fs)
{
TMP_TEMPLATE_ON_STACK (dir);
#define dir_len (strlen (dir))
@@ -1019,9 +1010,10 @@ check_windows_registry (guestfs_h *g, struct inspect_fs *fs,
#define cmd_len (dir_len + 16)
char cmd[cmd_len];
- size_t len = strlen (systemroot) + 64;
+ size_t len = strlen (fs->windows_systemroot) + 64;
char software[len];
- snprintf (software, len, "%s/system32/config/software", systemroot);
+ snprintf (software, len, "%s/system32/config/software",
+ fs->windows_systemroot);
char *software_path = resolve_windows_path_silently (g, software);
if (!software_path)
@@ -1275,6 +1267,21 @@ guestfs__inspect_get_product_name (guestfs_h *g, const char *root)
return safe_strdup (g, fs->product_name ? : "unknown");
}
+char *
+guestfs__inspect_get_windows_systemroot (guestfs_h *g, const char *root)
+{
+ struct inspect_fs *fs = search_for_root (g, root);
+ if (!fs)
+ return NULL;
+
+ if (!fs->windows_systemroot) {
+ error (g, _("not a Windows guest, or systemroot could not be determined"));
+ return NULL;
+ }
+
+ return safe_strdup (g, fs->windows_systemroot);
+}
+
char **
guestfs__inspect_get_mountpoints (guestfs_h *g, const char *root)
{