/* Linux with /isolinux/isolinux.cfg. * * This file is not easily parsable so we have to do our best. * Look for the "menu title" line which contains: * menu title Welcome to Fedora 14! # since at least Fedora 10 * menu title Welcome to Red Hat Enterprise Linux 6.0! * menu title Welcome to RHEL6.2-20111117.0-Workstation-x! */ static int check_isolinux_installer_root (guestfs_h *g, struct inspect_fs *fs) { char *str; int r; fs->type = OS_TYPE_LINUX; r = guestfs___first_egrep_of_file (g, "/isolinux/isolinux.cfg", "^menu title Welcome to Fedora [[:digit:]]+", 0, &str); if (r == -1) return -1; if (r > 0) { fs->distro = OS_DISTRO_FEDORA; fs->major_version = guestfs___parse_unsigned_int_ignore_trailing (g, &str[29]); free (str); if (fs->major_version == -1) return -1; } /* XXX parse major.minor */ r = guestfs___first_egrep_of_file (g, "/isolinux/isolinux.cfg", "^menu title Welcome to Red Hat Enterprise Linux [[:digit:]]+", 0, &str); if (r == -1) return -1; if (r > 0) { fs->distro = OS_DISTRO_RHEL; fs->major_version = guestfs___parse_unsigned_int_ignore_trailing (g, &str[47]); free (str); if (fs->major_version == -1) return -1; } /* XXX parse major.minor */ r = guestfs___first_egrep_of_file (g, "/isolinux/isolinux.cfg", "^menu title Welcome to RHEL[[:digit:]]+", 0, &str); if (r == -1) return -1; if (r > 0) { fs->distro = OS_DISTRO_RHEL; fs->major_version = guestfs___parse_unsigned_int_ignore_trailing (g, &str[26]); free (str); if (fs->major_version == -1) return -1; } return 0; }
static int check_w2k3_installer_root (guestfs_h *g, struct inspect_fs *fs, const char *txtsetup) { char *str; const char *v; int r; fs->type = OS_TYPE_WINDOWS; fs->distro = OS_DISTRO_WINDOWS; r = guestfs___first_egrep_of_file (g, txtsetup, "^productname[[:space:]]*=[[:space:]]*\"", 1, &str); if (r == -1) return -1; if (r > 0) { trim_cr (str); trim_quot (str); v = find_value (str); fs->product_name = safe_strdup (g, v+1); free (str); } r = guestfs___first_egrep_of_file (g, txtsetup, "^majorversion[[:space:]]*=[[:space:]]*[[:digit:]]+", 1, &str); if (r == -1) return -1; if (r > 0) { trim_cr (str); v = find_value (str); fs->major_version = guestfs___parse_unsigned_int_ignore_trailing (g, v); free (str); if (fs->major_version == -1) return -1; } r = guestfs___first_egrep_of_file (g, txtsetup, "^minorversion[[:space:]]*=[[:space:]]*[[:digit:]]+", 1, &str); if (r == -1) return -1; if (r > 0) { trim_cr (str); v = find_value (str); fs->minor_version = guestfs___parse_unsigned_int_ignore_trailing (g, v); free (str); if (fs->minor_version == -1) return -1; } /* This is the windows systemroot that would be chosen on * installation by default, although not necessarily the one that * the user will finally choose. */ r = guestfs___first_egrep_of_file (g, txtsetup, "^defaultpath[[:space:]]*=[[:space:]]*", 1, &str); if (r == -1) return -1; if (r > 0) { trim_cr (str); v = find_value (str); fs->windows_systemroot = safe_strdup (g, v); free (str); } return 0; }
/* Fedora CDs and DVD (not netinst). The /.treeinfo file contains * an initial section somewhat like this: * * [general] * version = 14 * arch = x86_64 * family = Fedora * variant = Fedora * discnum = 1 * totaldiscs = 1 */ static int check_fedora_installer_root (guestfs_h *g, struct inspect_fs *fs) { char *str; const char *v; int r; int discnum = 0, totaldiscs = 0; fs->type = OS_TYPE_LINUX; r = guestfs___first_egrep_of_file (g, "/.treeinfo", "^family = Fedora$", 0, &str); if (r == -1) return -1; if (r > 0) { fs->distro = OS_DISTRO_FEDORA; free (str); } r = guestfs___first_egrep_of_file (g, "/.treeinfo", "^family = Red Hat Enterprise Linux$", 0, &str); if (r == -1) return -1; if (r > 0) { fs->distro = OS_DISTRO_RHEL; free (str); } /* XXX should do major.minor before this */ r = guestfs___first_egrep_of_file (g, "/.treeinfo", "^version = [[:digit:]]+", 0, &str); if (r == -1) return -1; if (r > 0) { v = find_value (str); fs->major_version = guestfs___parse_unsigned_int_ignore_trailing (g, v); free (str); if (fs->major_version == -1) return -1; } r = guestfs___first_egrep_of_file (g, "/.treeinfo", "^arch = [-_[:alnum:]]+$", 0, &str); if (r == -1) return -1; if (r > 0) { v = find_value (str); fs->arch = safe_strdup (g, v); free (str); } r = guestfs___first_egrep_of_file (g, "/.treeinfo", "^discnum = [[:digit:]]+$", 0, &str); if (r == -1) return -1; if (r > 0) { v = find_value (str); discnum = guestfs___parse_unsigned_int (g, v); free (str); if (discnum == -1) return -1; } r = guestfs___first_egrep_of_file (g, "/.treeinfo", "^totaldiscs = [[:digit:]]+$", 0, &str); if (r == -1) return -1; if (r > 0) { v = find_value (str); totaldiscs = guestfs___parse_unsigned_int (g, v); free (str); if (totaldiscs == -1) return -1; } fs->is_multipart_disk = totaldiscs > 0; /* and what about discnum? */ return 0; }