/* check the version of winpcap */ static update_info_t * update_check_winpcap(const char *local_file) { FILE *pf; update_info_t * update_info = update_info_new(); GString *pcap_version_tmp; char *pcap_version = NULL; char *pcap_vstart; char *pcap_vend; update_info->prefix = "winpcap."; pf = ws_fopen(local_file, "r"); if(pf != NULL) { /* read in update_info of WinPcap */ read_prefs_file(local_file, pf, update_pref, update_info); fclose(pf); /* get WinPcap version */ /* XXX - what's the "approved" method to get the WinPcap version? */ pcap_version_tmp = g_string_new(""); get_runtime_pcap_version(pcap_version_tmp); /* cut out real version from "combined" version string */ pcap_vstart = strstr(pcap_version_tmp->str, "with WinPcap version "); if(pcap_vstart != NULL) { pcap_vstart += sizeof("with WinPcap version"); pcap_vend = strstr(pcap_vstart, " "); if(pcap_vend != NULL) { pcap_vend[0] = 0; pcap_version = g_strdup(pcap_vstart); } } update_info->version_installed = g_strdup(pcap_version); if(pcap_version && update_info->version_recommended && strcmp(pcap_version, update_info->version_recommended) != 0) { update_info->needs_update = TRUE; } } else { g_warning("Could not open %s", local_file); } g_string_free(pcap_version_tmp, TRUE); g_free(pcap_version); return update_info; }
/* * Get various library run-time versions, and the OS version, and append * them to the specified GString. */ void get_runtime_version_info(GString *str, void (*additional_info)(GString *)) { #ifndef _WIN32 gchar *lang; #endif g_string_append(str, "on "); get_os_version_info(str); #ifndef _WIN32 /* Locale */ if ((lang = getenv ("LANG")) != NULL) g_string_append_printf(str, ", with locale %s", lang); else g_string_append(str, ", without locale"); #endif /* Libpcap */ g_string_append(str, ", "); get_runtime_pcap_version(str); /* zlib */ #if defined(HAVE_LIBZ) && !defined(_WIN32) g_string_append_printf(str, ", with libz %s", zlibVersion()); #endif /* Additional application-dependent information */ if (additional_info) (*additional_info)(str); g_string_append(str, "."); /* Compiler info */ /* * See https://sourceforge.net/apps/mediawiki/predef/index.php?title=Compilers * information on various defined strings. * * GCC's __VERSION__ is a nice text string for humans to * read. The page at sourceforge.net largely describes * numeric #defines that encode the version; if the compiler * doesn't also offer a nice printable string, we try prettifying * the number somehow. */ #if defined(__GNUC__) && defined(__VERSION__) /* * Clang and llvm-gcc also define __GNUC__ and __VERSION__; * distinguish between them. */ #if defined(__clang__) g_string_append_printf(str, "\n\nBuilt using clang %s.\n", __VERSION__); #elif defined(__llvm__) g_string_append_printf(str, "\n\nBuilt using llvm-gcc %s.\n", __VERSION__); #else /* boring old GCC */ g_string_append_printf(str, "\n\nBuilt using gcc %s.\n", __VERSION__); #endif /* llvm */ #elif defined(__HP_aCC) g_string_append_printf(str, "\n\nBuilt using HP aCC %d.\n", __HP_aCC); #elif defined(__xlC__) g_string_append_printf(str, "\n\nBuilt using IBM XL C %d.%d\n", (__xlC__ >> 8) & 0xFF, __xlC__ & 0xFF); #ifdef __IBMC__ if ((__IBMC__ % 10) != 0) g_string_append_printf(str, " patch %d", __IBMC__ % 10); #endif /* __IBMC__ */ g_string_append_printf(str, "\n"); #elif defined(__INTEL_COMPILER) g_string_append_printf(str, "\n\nBuilt using Intel C %d.%d", __INTEL_COMPILER / 100, (__INTEL_COMPILER / 10) % 10); if ((__INTEL_COMPILER % 10) != 0) g_string_append_printf(str, " patch %d", __INTEL_COMPILER % 10); #ifdef __INTEL_COMPILER_BUILD_DATE g_string_sprinta(str, ", compiler built %04d-%02d-%02d", __INTEL_COMPILER_BUILD_DATE / 10000, (__INTEL_COMPILER_BUILD_DATE / 100) % 100, __INTEL_COMPILER_BUILD_DATE % 100); #endif /* __INTEL_COMPILER_BUILD_DATE */ g_string_append_printf(str, "\n"); #elif defined(_MSC_FULL_VER) # if _MSC_FULL_VER > 99999999 g_string_append_printf(str, "\n\nBuilt using Microsoft Visual C++ %d.%d", (_MSC_FULL_VER / 10000000) - 6, (_MSC_FULL_VER / 100000) % 100); # if (_MSC_FULL_VER % 100000) != 0 g_string_append_printf(str, " build %d", _MSC_FULL_VER % 100000); # endif # else g_string_append_printf(str, "\n\nBuilt using Microsoft Visual C++ %d.%d", (_MSC_FULL_VER / 1000000) - 6, (_MSC_FULL_VER / 10000) % 100); # if (_MSC_FULL_VER % 10000) != 0 g_string_append_printf(str, " build %d", _MSC_FULL_VER % 10000); # endif # endif g_string_append_printf(str, "\n"); #elif defined(_MSC_VER) /* _MSC_FULL_VER not defined, but _MSC_VER defined */ g_string_append_printf(str, "\n\nBuilt using Microsoft Visual C++ %d.%d\n", (_MSC_VER / 100) - 6, _MSC_VER % 100); #elif defined(__SUNPRO_C) g_string_append_printf(str, "\n\nBuilt using Sun C %d.%d", (__SUNPRO_C >> 8) & 0xF, (__SUNPRO_C >> 4) & 0xF); if ((__SUNPRO_C & 0xF) != 0) g_string_append_printf(str, " patch %d", __SUNPRO_C & 0xF); g_string_append_printf(str, "\n"); #endif end_string(str); }