/* The currently mounted device may be a Hurd root. Hurd has distros * just like Linux. */ int guestfs___check_hurd_root (guestfs_h *g, struct inspect_fs *fs) { fs->type = OS_TYPE_HURD; if (guestfs_is_file_opts (g, "/etc/debian_version", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_DEBIAN; if (parse_release_file (g, fs, "/etc/debian_version") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } /* Arch Hurd also exists, but inconveniently it doesn't have * the normal /etc/arch-release file. XXX */ /* Determine the architecture. */ check_architecture (g, fs); /* XXX Check for /etc/fstab. */ /* Determine hostname. */ if (check_hostname_unix (g, fs) == -1) return -1; return 0; }
/* The currently mounted device is known to be a FreeBSD root. */ int guestfs___check_freebsd_root (guestfs_h *g, struct inspect_fs *fs) { fs->type = OS_TYPE_FREEBSD; /* FreeBSD has no authoritative version file. The version number is * in /etc/motd, which the system administrator might edit, but * we'll use that anyway. */ if (guestfs_is_file_opts (g, "/etc/motd", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { if (parse_release_file (g, fs, "/etc/motd") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } /* Determine the architecture. */ check_architecture (g, fs); /* We already know /etc/fstab exists because it's part of the test above. */ const char *configfiles[] = { "/etc/fstab", NULL }; if (inspect_with_augeas (g, fs, configfiles, check_fstab) == -1) return -1; /* Determine hostname. */ if (check_hostname_unix (g, fs) == -1) return -1; return 0; }
/* The currently mounted device is maybe to be a *BSD root. */ int guestfs___check_netbsd_root (guestfs_h *g, struct inspect_fs *fs) { if (guestfs_is_file_opts (g, "/etc/release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { char *major, *minor; if (parse_release_file (g, fs, "/etc/release") == -1) return -1; if (match2 (g, fs->product_name, re_netbsd, &major, &minor)) { fs->type = OS_TYPE_NETBSD; fs->major_version = guestfs___parse_unsigned_int (g, major); free (major); if (fs->major_version == -1) { free (minor); return -1; } fs->minor_version = guestfs___parse_unsigned_int (g, minor); free (minor); if (fs->minor_version == -1) return -1; } } else { return -1; } /* Determine the architecture. */ check_architecture (g, fs); /* We already know /etc/fstab exists because it's part of the test above. */ const char *configfiles[] = { "/etc/fstab", NULL }; if (inspect_with_augeas (g, fs, configfiles, check_fstab) == -1) return -1; /* Determine hostname. */ if (check_hostname_unix (g, fs) == -1) return -1; return 0; }
/* The currently mounted device is known to be a Linux root. Try to * determine from this the distro, version, etc. Also parse * /etc/fstab to determine the arrangement of mountpoints and * associated devices. */ int guestfs___check_linux_root (guestfs_h *g, struct inspect_fs *fs) { int r; fs->type = OS_TYPE_LINUX; if (guestfs_is_file_opts (g, "/etc/lsb-release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { r = parse_lsb_release (g, fs); if (r == -1) /* error */ return -1; if (r == 1) /* ok - detected the release from this file */ goto skip_release_checks; } if (guestfs_is_file_opts (g, "/etc/redhat-release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_REDHAT_BASED; /* Something generic Red Hat-like. */ if (parse_release_file (g, fs, "/etc/redhat-release") == -1) return -1; char *major, *minor; if ((major = match1 (g, fs->product_name, re_fedora)) != NULL) { fs->distro = OS_DISTRO_FEDORA; fs->major_version = guestfs___parse_unsigned_int (g, major); free (major); if (fs->major_version == -1) return -1; } else if (match2 (g, fs->product_name, re_rhel_old, &major, &minor) || match2 (g, fs->product_name, re_rhel, &major, &minor)) { fs->distro = OS_DISTRO_RHEL; fs->major_version = guestfs___parse_unsigned_int (g, major); free (major); if (fs->major_version == -1) { free (minor); return -1; } fs->minor_version = guestfs___parse_unsigned_int (g, minor); free (minor); if (fs->minor_version == -1) return -1; } else if ((major = match1 (g, fs->product_name, re_rhel_no_minor)) != NULL) { fs->distro = OS_DISTRO_RHEL; fs->major_version = guestfs___parse_unsigned_int (g, major); free (major); if (fs->major_version == -1) return -1; fs->minor_version = 0; } else if (match2 (g, fs->product_name, re_centos_old, &major, &minor) || match2 (g, fs->product_name, re_centos, &major, &minor)) { fs->distro = OS_DISTRO_CENTOS; fs->major_version = guestfs___parse_unsigned_int (g, major); free (major); if (fs->major_version == -1) { free (minor); return -1; } fs->minor_version = guestfs___parse_unsigned_int (g, minor); free (minor); if (fs->minor_version == -1) return -1; } else if ((major = match1 (g, fs->product_name, re_centos_no_minor)) != NULL) { fs->distro = OS_DISTRO_CENTOS; fs->major_version = guestfs___parse_unsigned_int (g, major); free (major); if (fs->major_version == -1) return -1; fs->minor_version = 0; } else if (match2 (g, fs->product_name, re_scientific_linux_old, &major, &minor) || match2 (g, fs->product_name, re_scientific_linux, &major, &minor)) { fs->distro = OS_DISTRO_SCIENTIFIC_LINUX; fs->major_version = guestfs___parse_unsigned_int (g, major); free (major); if (fs->major_version == -1) { free (minor); return -1; } fs->minor_version = guestfs___parse_unsigned_int (g, minor); free (minor); if (fs->minor_version == -1) return -1; } else if ((major = match1 (g, fs->product_name, re_scientific_linux_no_minor)) != NULL) { fs->distro = OS_DISTRO_SCIENTIFIC_LINUX; fs->major_version = guestfs___parse_unsigned_int (g, major); free (major); if (fs->major_version == -1) return -1; fs->minor_version = 0; } } else if (guestfs_is_file_opts (g, "/etc/debian_version", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_DEBIAN; if (parse_release_file (g, fs, "/etc/debian_version") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } else if (guestfs_is_file_opts (g, "/etc/pardus-release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_PARDUS; if (parse_release_file (g, fs, "/etc/pardus-release") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } else if (guestfs_is_file_opts (g, "/etc/arch-release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_ARCHLINUX; /* /etc/arch-release file is empty and I can't see a way to * determine the actual release or product string. */ } else if (guestfs_is_file_opts (g, "/etc/gentoo-release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_GENTOO; if (parse_release_file (g, fs, "/etc/gentoo-release") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } else if (guestfs_is_file_opts (g, "/etc/meego-release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_MEEGO; if (parse_release_file (g, fs, "/etc/meego-release") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } else if (guestfs_is_file_opts (g, "/etc/slackware-version", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_SLACKWARE; if (parse_release_file (g, fs, "/etc/slackware-version") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } else if (guestfs_is_file_opts (g, "/etc/ttylinux-target", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_TTYLINUX; if (parse_release_file (g, fs, "/etc/ttylinux-target") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } else if (guestfs_is_file_opts (g, "/etc/SuSE-release", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { fs->distro = OS_DISTRO_SUSE_BASED; if (parse_suse_release (g, fs, "/etc/SuSE-release") == -1) return -1; } /* Buildroot (http://buildroot.net) is an embedded Linux distro * toolkit. It is used by specific distros such as Cirros. */ else if (guestfs_is_file_opts (g, "/etc/br-version", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { if (guestfs_is_file_opts (g, "/usr/share/cirros/logo", GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) fs->distro = OS_DISTRO_CIRROS; else fs->distro = OS_DISTRO_BUILDROOT; /* /etc/br-version has the format YYYY.MM[-git/hg/svn release] */ if (parse_release_file (g, fs, "/etc/br-version") == -1) return -1; if (guestfs___parse_major_minor (g, fs) == -1) return -1; } skip_release_checks:; /* Determine the architecture. */ check_architecture (g, fs); /* We already know /etc/fstab exists because it's part of the test * for Linux root above. We must now parse this file to determine * which filesystems are used by the operating system and how they * are mounted. */ const char *configfiles[] = { "/etc/fstab", "/etc/mdadm.conf", NULL }; if (inspect_with_augeas (g, fs, configfiles, check_fstab) == -1) return -1; /* Determine hostname. */ if (check_hostname_unix (g, fs) == -1) return -1; return 0; }
int _tmain(int argc, TCHAR *targv[]) { int res = 1; char **argv; char dll[MAXIMUM_PATH]; int i; /* module + address per line */ char line[MAXIMUM_PATH*2]; size_t modoffs; /* options that can be local vars */ bool addr2sym = false; bool addr2sym_multi = false; bool sym2addr = false; bool enumerate = false; bool enumerate_all = false; bool search = false; bool searchall = false; bool enum_lines = false; #if defined(WINDOWS) && !defined(_UNICODE) # error _UNICODE must be defined #else /* Convert to UTF-8 if necessary */ if (drfront_convert_args((const TCHAR **)targv, &argv, argc) != DRFRONT_SUCCESS) { printf("ERROR: failed to process args\n"); return 1; } #endif for (i = 1; i < argc; i++) { if (_stricmp(argv[i], "-e") == 0) { bool is_readable; if (i+1 >= argc) { PRINT_USAGE(argv[0]); goto cleanup; } i++; if (drfront_get_absolute_path(argv[i], dll, BUFFER_SIZE_ELEMENTS(dll)) != DRFRONT_SUCCESS) { printf("ERROR: invalid path %s\n", argv[i]); goto cleanup; } if (drfront_access(dll, DRFRONT_READ, &is_readable) != DRFRONT_SUCCESS || !is_readable) { printf("ERROR: invalid path %s\n", argv[i]); goto cleanup; } } else if (_stricmp(argv[i], "-f") == 0) { show_func = true; } else if (_stricmp(argv[i], "-v") == 0) { verbose = true; } else if (_stricmp(argv[i], "-a") == 0 || _stricmp(argv[i], "-s") == 0) { if (i+1 >= argc) { PRINT_USAGE(argv[0]); goto cleanup; } if (_stricmp(argv[i], "-a") == 0) addr2sym = true; else sym2addr = true; i++; /* rest of args read below */ break; } else if (_stricmp(argv[i], "--lines") == 0) { enum_lines = true; } else if (_stricmp(argv[i], "-q") == 0) { addr2sym_multi = true; } else if (_stricmp(argv[i], "--enum") == 0) { enumerate = true; } else if (_stricmp(argv[i], "--list") == 0) { enumerate_all = true; } else if (_stricmp(argv[i], "--search") == 0) { search = true; } else if (_stricmp(argv[i], "--searchall") == 0) { search = true; searchall = true; } else { PRINT_USAGE(argv[0]); goto cleanup; } } if ((!addr2sym_multi && dll == NULL) || (addr2sym_multi && dll != NULL) || (!sym2addr && !addr2sym && !addr2sym_multi && !enumerate_all && !enum_lines)) { PRINT_USAGE(argv[0]); goto cleanup; } dr_standalone_init(); if (dll != NULL) { if (!check_architecture(dll, argv)) goto cleanup; } if (drsym_init(IF_WINDOWS_ELSE(NULL, 0)) != DRSYM_SUCCESS) { printf("ERROR: unable to initialize symbol library\n"); goto cleanup; } if (!addr2sym_multi) { if (enum_lines) enumerate_lines(dll); else if (enumerate_all) enumerate_symbols(dll, NULL, search, searchall); else { /* kind of a hack: assumes i hasn't changed and that -s/-a is last option */ for (; i < argc; i++) { if (addr2sym) { if (sscanf(argv[i], SIZE_FMT, &modoffs) == 1) symquery_lookup_address(dll, modoffs); else printf("ERROR: unknown input %s\n", argv[i]); } else if (enumerate || search) enumerate_symbols(dll, argv[i], search, searchall); else symquery_lookup_symbol(dll, argv[i]); } } } else { while (!feof(stdin)) { char modpath[MAXIMUM_PATH]; if (fgets(line, sizeof(line), stdin) == NULL || /* when postprocess.pl closes the pipe, fgets is not * returning, so using an alternative eof code */ strcmp(line, ";exit\n") == 0) break; /* Ensure we support spaces in paths by using ; to split. * Since ; separates PATH, no Windows dll will have ; in its name. */ if (sscanf(line, "%"MAX_PATH_STR"[^;];"SIZE_FMT, (char *)&modpath, &modoffs) == 2) { symquery_lookup_address(modpath, modoffs); fflush(stdout); /* ensure flush in case piped */ } else if (verbose) printf("Error: unknown input %s\n", line); } } if (drsym_exit() != DRSYM_SUCCESS) printf("WARNING: error cleaning up symbol library\n"); res = 0; cleanup: if (drfront_cleanup_args(argv, argc) != DRFRONT_SUCCESS) printf("WARNING: drfront_cleanup_args failed\n"); return res; }