/** * Parse the first line of C<qemu_help> into the major and minor * version of qemu, but don't fail if parsing is not possible. */ static void parse_qemu_version (guestfs_h *g, const char *qemu_help, struct version *qemu_version) { CLEANUP_FREE char *major_s = NULL, *minor_s = NULL; int major_i, minor_i; version_init_null (qemu_version); if (!match2 (g, qemu_help, re_major_minor, &major_s, &minor_s)) { parse_failed: debug (g, "%s: failed to parse qemu version string from the first line of the output of '%s -help'. When reporting this bug please include the -help output.", __func__, g->hv); return; } major_i = guestfs_int_parse_unsigned_int (g, major_s); if (major_i == -1) goto parse_failed; minor_i = guestfs_int_parse_unsigned_int (g, minor_s); if (minor_i == -1) goto parse_failed; guestfs_int_version_from_values (qemu_version, major_i, minor_i, 0); debug (g, "qemu version %d.%d", major_i, minor_i); }
/* Parse generic MAJOR.MINOR from the fs->product_name string. */ int guestfs_int_parse_major_minor (guestfs_h *g, struct inspect_fs *fs) { char *major, *minor; if (match2 (g, fs->product_name, re_major_minor, &major, &minor)) { fs->major_version = guestfs_int_parse_unsigned_int (g, major); free (major); if (fs->major_version == -1) { free (minor); return -1; } fs->minor_version = guestfs_int_parse_unsigned_int (g, minor); free (minor); if (fs->minor_version == -1) return -1; } return 0; }
static int parse_version (guestfs_h *g, xmlNodePtr node, struct osinfo *osinfo) { CLEANUP_FREE char *content = NULL; CLEANUP_FREE char *major = NULL, *minor = NULL; content = (char *) xmlNodeGetContent (node); if (content) { if (match2 (g, content, re_major_minor, &major, &minor)) { osinfo->major_version = guestfs_int_parse_unsigned_int (g, major); if (osinfo->major_version == -1) return -1; osinfo->minor_version = guestfs_int_parse_unsigned_int (g, minor); if (osinfo->minor_version == -1) return -1; } } 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_int_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_int_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); } r = guestfs_int_first_egrep_of_file (g, "/.treeinfo", "^family = Oracle Linux Server$", 0, &str); if (r == -1) return -1; if (r > 0) { fs->distro = OS_DISTRO_ORACLE_LINUX; free (str); } /* XXX should do major.minor before this */ r = guestfs_int_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_int_parse_unsigned_int_ignore_trailing (g, v); free (str); if (fs->major_version == -1) return -1; } r = guestfs_int_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_int_first_egrep_of_file (g, "/.treeinfo", "^discnum = [[:digit:]]+$", 0, &str); if (r == -1) return -1; if (r > 0) { v = find_value (str); discnum = guestfs_int_parse_unsigned_int (g, v); free (str); if (discnum == -1) return -1; } r = guestfs_int_first_egrep_of_file (g, "/.treeinfo", "^totaldiscs = [[:digit:]]+$", 0, &str); if (r == -1) return -1; if (r > 0) { v = find_value (str); totaldiscs = guestfs_int_parse_unsigned_int (g, v); free (str); if (totaldiscs == -1) return -1; } fs->is_multipart_disk = totaldiscs > 1; /* and what about discnum? */ return 0; }