diff options
-rw-r--r-- | modules/computer/os.c | 90 |
1 files changed, 52 insertions, 38 deletions
diff --git a/modules/computer/os.c b/modules/computer/os.c index 0de41a57..26427c38 100644 --- a/modules/computer/os.c +++ b/modules/computer/os.c @@ -24,50 +24,64 @@ static gchar * get_libc_version(void) { - FILE *testp; - gchar buf[256], *p, *ver_str = NULL, *ret = NULL; - - struct { - const char *test_cmd; - const char *match_str; - const char *lib_name; - int try_ver_str; + static const struct { + const char *test_cmd; + const char *match_str; + const char *lib_name; + gboolean try_ver_str; + gboolean use_stderr; } libs[] = { - { "ldconfig -V", "GLIBC", "GNU C Library", 1 }, - { "ldconfig -v", "uClibc", "uClibc or uClibc-ng", 0 }, - { "diet 2>&1", "diet version", "diet libc", 1 }, - { NULL, NULL, NULL, 0 }, + { "ldconfig -V", "GLIBC", "GNU C Library", TRUE, FALSE}, + { "ldconfig -V", "GNU libc", "GNU C Library", TRUE, FALSE}, + { "ldconfig -v", "uClibc", "uClibc or uClibc-ng", FALSE, FALSE}, + { "diet", "diet version", "diet libc", TRUE, TRUE}, + { NULL, NULL, NULL, 0}, }; - int i = 0; - while (libs[i].test_cmd != NULL) { - memset(buf, 0, 256); - testp = popen(libs[i].test_cmd, "r"); - if (testp) { - (void)fgets(buf, 255, testp); - pclose(testp); - - /* limit to first line */ - p = strstr(buf, "\n"); if (p) *p = 0; - - if ( strstr(buf, libs[i].match_str) ) { - if (libs[i].try_ver_str) { - ver_str = strstr(buf, " "); /* skip the first word, likely "ldconfig" or name of utility */ - if (ver_str) ver_str++; - } - break; - } + gchar *ver_str = NULL, *to_free = NULL, *ret; + int i; + + for (i = 0; libs[i].test_cmd; i++) { + gboolean spawned; + gchar *out, *err, *p; + + spawned = g_spawn_command_line_sync(libs[i].test_cmd, + &out, &err, NULL, NULL); + if (!spawned) + continue; + + if (libs[i].use_stderr) { + p = strend(err, '\n'); + g_free(out); + to_free = err; + } else { + p = strend(out, '\n'); + g_free(err); + to_free = out; + } + + if (!strstr(p, libs[i].match_str)) { + g_free(to_free); + continue; + } + + if (libs[i].try_ver_str) { + /* skip the first word, likely "ldconfig" or name of utility */ + ver_str = strstr(p, " "); + if (ver_str) + ver_str++; } - i++; + + break; } if (libs[i].try_ver_str && ver_str) - ret = g_strdup_printf("%s / %s", libs[i].lib_name, ver_str ); - else { - if (libs[i].lib_name != NULL) - ret = g_strdup(libs[i].lib_name); - else - ret = g_strdup(_("Unknown")); - } + ret = g_strdup_printf("%s / %s", libs[i].lib_name, ver_str); + else if (libs[i].lib_name) + ret = g_strdup(libs[i].lib_name); + else + ret = g_strdup(_("Unknown")); + + g_free(to_free); return ret; } |