X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=src%2Finspect.c;h=e7408b692704609cf1007b2e6001c313cbb69c41;hb=faa0c22cce27c418d1474ad745be5d00bb08ffd0;hp=09ef2b141f69cf0d548fbbdea9a364f0f6c4b762;hpb=e3bb27af94641d1bed26574724ce46df73d2340e;p=libguestfs.git diff --git a/src/inspect.c b/src/inspect.c index 09ef2b1..e7408b6 100644 --- a/src/inspect.c +++ b/src/inspect.c @@ -228,7 +228,7 @@ static int check_windows_root (guestfs_h *g, struct inspect_fs *fs); static int check_windows_arch (guestfs_h *g, struct inspect_fs *fs); static int check_windows_software_registry (guestfs_h *g, struct inspect_fs *fs); static int check_windows_system_registry (guestfs_h *g, struct inspect_fs *fs); -static char *resolve_windows_path_silently (guestfs_h *g, const char *); +static char *case_sensitive_path_silently (guestfs_h *g, const char *); static int is_file_nocase (guestfs_h *g, const char *); static int is_dir_nocase (guestfs_h *g, const char *); static int extend_fses (guestfs_h *g); @@ -353,12 +353,16 @@ check_filesystem (guestfs_h *g, const char *device) guestfs_is_dir (g, "/run") > 0 && guestfs_is_dir (g, "/spool") > 0) fs->content = FS_CONTENT_LINUX_VAR; - /* Windows root? */ + /* Windows root? + * Note that if a Windows guest has multiple disks and applications + * are installed on those other disks, then those other disks will + * contain "/Program Files" and "/System Volume Information". Those + * would *not* be Windows root disks. (RHBZ#674130) + */ else if (is_file_nocase (g, "/AUTOEXEC.BAT") > 0 || - is_dir_nocase (g, "/Program Files") > 0 || - is_dir_nocase (g, "/WINDOWS") > 0 || - is_dir_nocase (g, "/WIN32") > 0 || - is_dir_nocase (g, "/WINNT") > 0 || + is_dir_nocase (g, "/WINDOWS/SYSTEM32") > 0 || + is_dir_nocase (g, "/WIN32/SYSTEM32") > 0 || + is_dir_nocase (g, "/WINNT/SYSTEM32") > 0 || is_file_nocase (g, "/boot.ini") > 0 || is_file_nocase (g, "/ntldr") > 0) { fs->is_root = 1; @@ -366,6 +370,13 @@ check_filesystem (guestfs_h *g, const char *device) if (check_windows_root (g, fs) == -1) return -1; } + /* Windows volume with installed applications (but not root)? */ + else if (is_dir_nocase (g, "/System Volume Information") > 0 && + is_dir_nocase (g, "/Program Files") > 0) + fs->content = FS_CONTENT_WINDOWS_VOLUME_WITH_APPS; + /* Windows volume (but not root)? */ + else if (is_dir_nocase (g, "/System Volume Information") > 0) + fs->content = FS_CONTENT_WINDOWS_VOLUME; return 0; } @@ -1023,7 +1034,7 @@ check_windows_root (guestfs_h *g, struct inspect_fs *fs) for (i = 0; systemroot == NULL && i < sizeof systemroots / sizeof systemroots[0]; ++i) { - systemroot = resolve_windows_path_silently (g, systemroots[i]); + systemroot = case_sensitive_path_silently (g, systemroots[i]); } if (!systemroot) { @@ -1061,7 +1072,7 @@ check_windows_arch (guestfs_h *g, struct inspect_fs *fs) char cmd_exe[len]; snprintf (cmd_exe, len, "%s/system32/cmd.exe", fs->windows_systemroot); - char *cmd_exe_path = resolve_windows_path_silently (g, cmd_exe); + char *cmd_exe_path = case_sensitive_path_silently (g, cmd_exe); if (!cmd_exe_path) return 0; @@ -1088,7 +1099,7 @@ check_windows_software_registry (guestfs_h *g, struct inspect_fs *fs) snprintf (software, len, "%s/system32/config/software", fs->windows_systemroot); - char *software_path = resolve_windows_path_silently (g, software); + char *software_path = case_sensitive_path_silently (g, software); if (!software_path) /* If the software hive doesn't exist, just accept that we cannot * find product_name etc. @@ -1197,7 +1208,7 @@ check_windows_system_registry (guestfs_h *g, struct inspect_fs *fs) snprintf (system, len, "%s/system32/config/system", fs->windows_systemroot); - char *system_path = resolve_windows_path_silently (g, system); + char *system_path = case_sensitive_path_silently (g, system); if (!system_path) /* If the system hive doesn't exist, just accept that we cannot * find hostname etc. @@ -1272,7 +1283,7 @@ check_windows_system_registry (guestfs_h *g, struct inspect_fs *fs) } static char * -resolve_windows_path_silently (guestfs_h *g, const char *path) +case_sensitive_path_silently (guestfs_h *g, const char *path) { guestfs_error_handler_cb old_error_cb = g->error_cb; g->error_cb = NULL; @@ -1287,7 +1298,7 @@ is_file_nocase (guestfs_h *g, const char *path) char *p; int r; - p = resolve_windows_path_silently (g, path); + p = case_sensitive_path_silently (g, path); if (!p) return 0; r = guestfs_is_file (g, p); @@ -1301,7 +1312,7 @@ is_dir_nocase (guestfs_h *g, const char *path) char *p; int r; - p = resolve_windows_path_silently (g, path); + p = case_sensitive_path_silently (g, path); if (!p) return 0; r = guestfs_is_dir (g, p); @@ -1991,12 +2002,12 @@ list_applications_windows (guestfs_h *g, struct inspect_fs *fs) snprintf (software, len, "%s/system32/config/software", fs->windows_systemroot); - char *software_path = resolve_windows_path_silently (g, software); - if (!software_path) - /* If the software hive doesn't exist, just accept that we cannot - * find product_name etc. - */ - return 0; + char *software_path = case_sensitive_path_silently (g, software); + if (!software_path) { + /* Missing software hive is a problem. */ + error (g, "no HKLM\\SOFTWARE hive found in the guest"); + return NULL; + } struct guestfs_application_list *apps = NULL, *ret = NULL; hive_h *h = NULL;