summaryrefslogtreecommitdiff
path: root/modules/computer
diff options
context:
space:
mode:
authorSimon Quigley <tsimonq2@ubuntu.com>2017-08-16 04:32:39 -0500
committerSimon Quigley <tsimonq2@ubuntu.com>2017-08-16 04:32:39 -0500
commit9a9db98089717990cd5e0eef529f6bb0819ebe46 (patch)
treea9afaabce984d5fe552fa8bf1a9405db9bdd2699 /modules/computer
parent69a2124e9a081518297951256eb5c8d72d93361f (diff)
New upstream version 0.5.1+git20170815
Diffstat (limited to 'modules/computer')
-rw-r--r--modules/computer/alsa.c28
-rw-r--r--modules/computer/boots.c19
-rw-r--r--modules/computer/environment.c10
-rw-r--r--modules/computer/filesystem.c114
-rw-r--r--modules/computer/languages.c96
-rw-r--r--modules/computer/memory.c27
-rw-r--r--modules/computer/modules.c80
-rw-r--r--modules/computer/os.c511
-rw-r--r--modules/computer/uptime.c43
-rw-r--r--modules/computer/users.c21
10 files changed, 558 insertions, 391 deletions
diff --git a/modules/computer/alsa.c b/modules/computer/alsa.c
index e1e7b946..00c1fceb 100644
--- a/modules/computer/alsa.c
+++ b/modules/computer/alsa.c
@@ -23,16 +23,16 @@ gchar *
computer_get_alsacards(Computer * computer)
{
GSList *p;
- gchar *tmp = g_strdup(_("[Audio Devices]\n"));
+ gchar *tmp = g_strdup_printf("[%s]\n", _("Audio Devices"));
gint n = 0;
if (computer->alsa) {
- for (p = computer->alsa->cards; p; p = p->next) {
- AlsaCard *ac = (AlsaCard *) p->data;
+ for (p = computer->alsa->cards; p; p = p->next) {
+ AlsaCard *ac = (AlsaCard *) p->data;
- tmp = h_strdup_cprintf(_("Audio Adapter#%d=%s\n"),
- tmp, ++n, ac->friendly_name);
- }
+ tmp = h_strdup_cprintf("%s#%d=%s\n", tmp,
+ _("Audio Adapter"), ++n, ac->friendly_name);
+ }
}
return tmp;
@@ -48,22 +48,22 @@ computer_get_alsainfo(void)
cards = fopen("/proc/asound/cards", "r");
if (!cards)
- return NULL;
+ return NULL;
ai = g_new0(AlsaInfo, 1);
while (fgets(buffer, 128, cards)) {
- gchar **tmp;
+ gchar **tmp;
- ac = g_new0(AlsaCard, 1);
+ ac = g_new0(AlsaCard, 1);
- tmp = g_strsplit(buffer, ":", 0);
+ tmp = g_strsplit(buffer, ":", 0);
- ac->friendly_name = g_strdup(tmp[1]);
- ai->cards = g_slist_append(ai->cards, ac);
+ ac->friendly_name = g_strdup(tmp[1]);
+ ai->cards = g_slist_append(ai->cards, ac);
- g_strfreev(tmp);
- (void)fgets(buffer, 128, cards); /* skip next line */
+ g_strfreev(tmp);
+ (void)fgets(buffer, 128, cards); /* skip next line */
}
fclose(cards);
diff --git a/modules/computer/boots.c b/modules/computer/boots.c
index 478e89ac..d8a6d32a 100644
--- a/modules/computer/boots.c
+++ b/modules/computer/boots.c
@@ -30,22 +30,22 @@ scan_boots_real(void)
scan_os(FALSE);
if (!computer->os->boots)
- computer->os->boots = g_strdup(_("[Boots]\n"));
+ computer->os->boots = g_strdup_printf("[%s]\n", _("Boots"));
else
return;
-
+
last = popen("last", "r");
if (last) {
while (fgets(buffer, 256, last)) {
if (strstr(buffer, "system boot")) {
gchar **tmp, *buf = buffer;
-
+
strend(buffer, '\n');
-
+
while (*buf) {
if (*buf == ' ' && *(buf + 1) == ' ') {
memmove(buf, buf + 1, strlen(buf) + 1);
-
+
buf--;
} else {
buf++;
@@ -53,13 +53,14 @@ scan_boots_real(void)
}
tmp = g_strsplit(buffer, " ", 0);
- computer->os->boots = h_strdup_cprintf("\n%s %s %s %s=%s|%s",
- computer->os->boots,
- tmp[4], tmp[5], tmp[6], tmp[7], tmp[3], tmp[8]);
+ computer->os->boots =
+ h_strdup_cprintf("\n%s %s %s %s=%s|%s",
+ computer->os->boots,
+ tmp[4], tmp[5], tmp[6], tmp[7], tmp[3], tmp[8]);
g_strfreev(tmp);
}
}
-
+
pclose(last);
}
}
diff --git a/modules/computer/environment.c b/modules/computer/environment.c
index 2a8d235c..dc0fb6f3 100644
--- a/modules/computer/environment.c
+++ b/modules/computer/environment.c
@@ -23,19 +23,19 @@ static gchar *_env = NULL;
void scan_env_var(gboolean reload)
{
SCAN_START();
-
+
gchar **envlist;
gint i;
-
+
g_free(_env);
-
- _env = g_strdup(_("[Environment Variables]\n"));
+
+ _env = g_strdup_printf("[%s]\n", _("Environment Variables") );
for (i = 0, envlist = g_listenv(); envlist[i]; i++) {
_env = h_strdup_cprintf("%s=%s\n", _env,
envlist[i], g_getenv(envlist[i]));
}
g_strfreev(envlist);
-
+
SCAN_END();
}
diff --git a/modules/computer/filesystem.c b/modules/computer/filesystem.c
index a7162777..397dc636 100644
--- a/modules/computer/filesystem.c
+++ b/modules/computer/filesystem.c
@@ -16,8 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Some code from xfce4-mount-plugin, version 0.4.3
- * Copyright (C) 2005 Jean-Baptiste jb_dul@yahoo.com
- * Distributed under the terms of GNU GPL 2.
+ * Copyright (C) 2005 Jean-Baptiste jb_dul@yahoo.com
+ * Distributed under the terms of GNU GPL 2.
*/
#include <string.h>
@@ -41,62 +41,64 @@ scan_filesystems(void)
mtab = fopen("/etc/mtab", "r");
if (!mtab)
- return;
+ return;
while (fgets(buf, 1024, mtab)) {
- gfloat size, used, avail;
- gchar **tmp;
-
- tmp = g_strsplit(buf, " ", 0);
- if (!statfs(tmp[1], &sfs)) {
- gfloat use_ratio;
-
- size = (float) sfs.f_bsize * (float) sfs.f_blocks;
- avail = (float) sfs.f_bsize * (float) sfs.f_bavail;
- used = size - avail;
-
- if (size == 0.0f) {
- continue;
- }
-
- if (avail == 0.0f) {
- use_ratio = 100.0f;
- } else {
- use_ratio = 100.0f * (used / size);
- }
-
- gchar *strsize = size_human_readable(size),
- *stravail = size_human_readable(avail),
- *strused = size_human_readable(used);
-
- gchar *strhash;
-
- strreplacechr(tmp[0], "#", '_');
- strhash = g_strdup_printf("[%s]\n"
- "Filesystem=%s\n"
- "Mounted As=%s\n"
- "Mount Point=%s\n"
- "Size=%s\n"
- "Used=%s\n"
- "Available=%s\n",
- tmp[0],
- tmp[2],
- strstr(tmp[3], "rw") ? "Read-Write" :
- "Read-Only", tmp[1], strsize, strused,
- stravail);
- gchar *key = g_strdup_printf("FS%d", ++count);
- moreinfo_add_with_prefix("COMP", key, strhash);
- g_free(key);
-
- fs_list = h_strdup_cprintf("$FS%d$%s=%.2f %% (%s of %s)|%s\n",
- fs_list,
- count, tmp[0], use_ratio, stravail, strsize, tmp[1]);
-
- g_free(strsize);
- g_free(stravail);
- g_free(strused);
- }
- g_strfreev(tmp);
+ gfloat size, used, avail;
+ gchar **tmp;
+
+ tmp = g_strsplit(buf, " ", 0);
+ if (!statfs(tmp[1], &sfs)) {
+ gfloat use_ratio;
+
+ size = (float) sfs.f_bsize * (float) sfs.f_blocks;
+ avail = (float) sfs.f_bsize * (float) sfs.f_bavail;
+ used = size - avail;
+
+ if (size == 0.0f) {
+ continue;
+ }
+
+ if (avail == 0.0f) {
+ use_ratio = 100.0f;
+ } else {
+ use_ratio = 100.0f * (used / size);
+ }
+
+ gchar *strsize = size_human_readable(size),
+ *stravail = size_human_readable(avail),
+ *strused = size_human_readable(used);
+
+ gchar *strhash;
+
+ strreplacechr(tmp[0], "#", '_');
+ strhash = g_strdup_printf("[%s]\n"
+ "%s=%s\n"
+ "%s=%s\n"
+ "%s=%s\n"
+ "%s=%s\n"
+ "%s=%s\n"
+ "%s=%s\n",
+ tmp[0], /* path */
+ _("Filesystem"), tmp[2],
+ _("Mounted As"), ( strstr(tmp[3], "rw") != NULL) ? _("Read-Write") : _("Read-Only"),
+ _("Mount Point"), tmp[1],
+ _("Size"), strsize,
+ _("Used"), strused,
+ _("Available"), stravail);
+ gchar *key = g_strdup_printf("FS%d", ++count);
+ moreinfo_add_with_prefix("COMP", key, strhash);
+ g_free(key);
+
+ fs_list = h_strdup_cprintf("$FS%d$%s=%.2f %% (%s of %s)|%s\n",
+ fs_list,
+ count, tmp[0], use_ratio, stravail, strsize, tmp[1]);
+
+ g_free(strsize);
+ g_free(stravail);
+ g_free(strused);
+ }
+ g_strfreev(tmp);
}
fclose(mtab);
diff --git a/modules/computer/languages.c b/modules/computer/languages.c
index 5877c41c..d4681839 100644
--- a/modules/computer/languages.c
+++ b/modules/computer/languages.c
@@ -20,6 +20,7 @@
#include "hardinfo.h"
#include "computer.h"
+#include "cpu_util.h" /* for UNKIFNULL() */
void
scan_languages(OperatingSystem * os)
@@ -67,43 +68,64 @@ scan_languages(OperatingSystem * os)
g_strfreev(tmp);
} else {
- gchar *currlocale;
-
- retval = h_strdup_cprintf("$%s$%s=%s\n", retval, name, name, title);
-
-#define FIELD(f) f ? f : "(Unknown)"
- currlocale = g_strdup_printf("[Locale Information]\n"
- "Name=%s (%s)\n"
- "Source=%s\n"
- "Address=%s\n"
- "Email=%s\n"
- "Language=%s\n"
- "Territory=%s\n"
- "Revision=%s\n"
- "Date=%s\n"
- "Codeset=%s\n",
- name, FIELD(title),
- FIELD(source), FIELD(address),
- FIELD(email), FIELD(language),
- FIELD(territory), FIELD(revision),
- FIELD(date), FIELD(codeset));
-#undef FIELD
-
- moreinfo_add_with_prefix("COMP", name, currlocale);
-
- g_free(title);
- g_free(source);
- g_free(address);
- g_free(email);
- g_free(language);
- g_free(territory);
- g_free(revision);
- g_free(date);
- g_free(codeset);
-
- title = source = address = email = language = territory = \
- revision = date = codeset = NULL;
- }
+ gchar *currlocale;
+
+ retval = h_strdup_cprintf("$%s$%s=%s\n", retval, name, name, title);
+
+ UNKIFNULL(title);
+ UNKIFNULL(source);
+ UNKIFNULL(address);
+ UNKIFNULL(email);
+ UNKIFNULL(language);
+ UNKIFNULL(territory);
+ UNKIFNULL(revision);
+ UNKIFNULL(date);
+ UNKIFNULL(codeset);
+
+ /* values may have & */
+ title = hardinfo_clean_value(title, 1);
+ source = hardinfo_clean_value(source, 1);
+ address = hardinfo_clean_value(address, 1);
+ email = hardinfo_clean_value(email, 1);
+ language = hardinfo_clean_value(language, 1);
+ territory = hardinfo_clean_value(territory, 1);
+
+ currlocale = g_strdup_printf("[%s]\n"
+ /* Name */ "%s=%s (%s)\n"
+ /* Source */ "%s=%s\n"
+ /* Address */ "%s=%s\n"
+ /* Email */ "%s=%s\n"
+ /* Language */ "%s=%s\n"
+ /* Territory */"%s=%s\n"
+ /* Revision */ "%s=%s\n"
+ /* Date */ "%s=%s\n"
+ /* Codeset */ "%s=%s\n",
+ _("Locale Information"),
+ _("Name"), name, title,
+ _("Source"), source,
+ _("Address"), address,
+ _("E-mail"), email,
+ _("Language"), language,
+ _("Territory"), territory,
+ _("Revision"), revision,
+ _("Date"), date,
+ _("Codeset"), codeset );
+
+ moreinfo_add_with_prefix("COMP", name, currlocale);
+
+ g_free(title);
+ g_free(source);
+ g_free(address);
+ g_free(email);
+ g_free(language);
+ g_free(territory);
+ g_free(revision);
+ g_free(date);
+ g_free(codeset);
+
+ title = source = address = email = language = territory = \
+ revision = date = codeset = NULL;
+ }
}
fclose(locale);
diff --git a/modules/computer/memory.c b/modules/computer/memory.c
index 3d320e8a..dc8599c2 100644
--- a/modules/computer/memory.c
+++ b/modules/computer/memory.c
@@ -28,23 +28,26 @@ computer_get_memory(void)
procmem = fopen("/proc/meminfo", "r");
if (!procmem)
- return NULL;
+ return NULL;
mi = g_new0(MemoryInfo, 1);
while (fgets(buffer, 128, procmem)) {
- gchar **tmp = g_strsplit(buffer, ":", 2);
-
- tmp[0] = g_strstrip(tmp[0]);
- tmp[1] = g_strstrip(tmp[1]);
-
- get_int("MemTotal", mi->total);
- get_int("MemFree", mi->free);
- get_int("Cached", mi->cached);
-
- g_strfreev(tmp);
+ gchar **tmp = g_strsplit(buffer, ":", 2);
+ if (tmp[1] == NULL) {
+ g_strfreev(tmp);
+ continue;
+ }
+ tmp[0] = g_strstrip(tmp[0]);
+ tmp[1] = g_strstrip(tmp[1]);
+
+ get_int("MemTotal", mi->total);
+ get_int("MemFree", mi->free);
+ get_int("Cached", mi->cached);
+
+ g_strfreev(tmp);
}
fclose(procmem);
-
+
mi->used = mi->total - mi->free;
mi->total /= 1000;
diff --git a/modules/computer/modules.c b/modules/computer/modules.c
index bbc05f42..df876e3a 100644
--- a/modules/computer/modules.c
+++ b/modules/computer/modules.c
@@ -20,6 +20,7 @@
#include "hardinfo.h"
#include "computer.h"
+#include "cpu_util.h" /* for STRIFNULL() */
#define GET_STR(field_name,ptr) \
if (!ptr && strstr(tmp[0], field_name)) { \
@@ -42,7 +43,7 @@ scan_modules_do(void)
}
g_free(module_list);
-
+
module_list = NULL;
moreinfo_del_with_prefix("COMP:MOD");
@@ -51,7 +52,7 @@ scan_modules_do(void)
return;
lsmod = popen(lsmod_path, "r");
if (!lsmod) {
- g_free(lsmod_path);
+ g_free(lsmod_path);
return;
}
@@ -99,7 +100,7 @@ scan_modules_do(void)
remove_quotes(license); */
/* old modutils displays <none> when there's no value for a
- given field; this is not desirable in the module name
+ given field; this is not desirable in the module name
display, so change it to an empty string */
if (description && g_str_equal(description, "&lt;none&gt;")) {
g_free(description);
@@ -121,38 +122,45 @@ scan_modules_do(void)
modname,
description ? description : "");
-#define NONE_IF_NULL(var) (var) ? (var) : "N/A"
-
- /* create the module information string */
- strmodule = g_strdup_printf("[Module Information]\n"
- "Path=%s\n"
- "Used Memory=%.2fKiB\n"
- "[Description]\n"
- "Name=%s\n"
- "Description=%s\n"
- "Version Magic=%s\n"
- "[Copyright]\n"
- "Author=%s\n"
- "License=%s\n",
- NONE_IF_NULL(filename),
- memory / 1024.0,
- modname,
- NONE_IF_NULL(description),
- NONE_IF_NULL(vermagic),
- NONE_IF_NULL(author),
- NONE_IF_NULL(license));
-
- /* if there are dependencies, append them to that string */
- if (deps && strlen(deps)) {
- gchar **tmp = g_strsplit(deps, ",", 0);
-
- strmodule = h_strconcat(strmodule,
- "\n[Dependencies]\n",
- g_strjoinv("=\n", tmp),
- "=\n", NULL);
- g_strfreev(tmp);
- g_free(deps);
- }
+ STRIFNULL(filename, _("(Not available)") );
+ STRIFNULL(description, _("(Not available)") );
+ STRIFNULL(vermagic, _("(Not available)") );
+ STRIFNULL(author, _("(Not available)") );
+ STRIFNULL(license, _("(Not available)") );
+
+ /* create the module information string */
+ strmodule = g_strdup_printf("[%s]\n"
+ "%s=%s\n"
+ "%s=%.2f %s\n"
+ "[%s]\n"
+ "%s=%s\n"
+ "%s=%s\n"
+ "%s=%s\n"
+ "[%s]\n"
+ "%s=%s\n"
+ "%s=%s\n",
+ _("Module Information"),
+ _("Path"), filename,
+ _("Used Memory"), memory / 1024.0, _("KiB"),
+ _("Description"),
+ _("Name"), modname,
+ _("Description"), description,
+ _("Version Magic"), vermagic,
+ _("Copyright"),
+ _("Author"), author,
+ _("License"), license );
+
+ /* if there are dependencies, append them to that string */
+ if (deps && strlen(deps)) {
+ gchar **tmp = g_strsplit(deps, ",", 0);
+
+ strmodule = h_strconcat(strmodule,
+ "\n[", _("Dependencies"), "]\n",
+ g_strjoinv("=\n", tmp),
+ "=\n", NULL);
+ g_strfreev(tmp);
+ g_free(deps);
+ }
moreinfo_add_with_prefix("COMP", hashkey, strmodule);
g_free(hashkey);
@@ -164,6 +172,6 @@ scan_modules_do(void)
g_free(filename);
}
pclose(lsmod);
-
+
g_free(lsmod_path);
}
diff --git a/modules/computer/os.c b/modules/computer/os.c
index 3caf6c26..a8886f64 100644
--- a/modules/computer/os.c
+++ b/modules/computer/os.c
@@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <gdk/gdkx.h>
#include <string.h>
#include <sys/utsname.h>
#include "hardinfo.h"
@@ -24,219 +25,350 @@
static gchar *
get_libc_version(void)
{
- FILE *libc;
- gchar buf[256], *tmp, *p;
- char *libc_paths[] = {
- "/lib/ld-uClibc.so.0", "/lib64/ld-uClibc.so.0",
- "/lib/libc.so.6", "/lib64/libc.so.6"
- };
- int i;
-
- for (i=0; i < 4; i++) {
- if (g_file_test(libc_paths[i], G_FILE_TEST_EXISTS)) break;
- }
- switch (i) {
- case 0: case 1: return g_strdup("uClibc Library");
- case 2: case 3: break; // gnu libc, continue processing
- default: goto err;
- }
-
- libc = popen(libc_paths[i], "r");
- if (!libc) goto err;
-
- (void)fgets(buf, 256, libc);
- if (pclose(libc)) goto err;
-
- tmp = strstr(buf, "version ");
- if (!tmp) goto err;
-
- p = strchr(tmp, ',');
- if (p) *p = '\0';
- else goto err;
-
- return g_strdup_printf(_("GNU C Library version %s (%sstable)"),
- strchr(tmp, ' ') + 1,
- strstr(buf, " stable ") ? "" : _("un"));
- err:
+ static const struct {
+ const char *test_cmd;
+ const char *match_str;
+ const char *lib_name;
+ gboolean try_ver_str;
+ gboolean use_stderr;
+ } libs[] = {
+ { "ldd --version", "GLIBC", N_("GNU C Library"), TRUE, FALSE},
+ { "ldd --version", "GNU libc", N_("GNU C Library"), TRUE, FALSE},
+ { "ldconfig -V", "GLIBC", N_("GNU C Library"), TRUE, FALSE},
+ { "ldconfig -V", "GNU libc", N_("GNU C Library"), TRUE, FALSE},
+ { "ldconfig -v", "uClibc", N_("uClibc or uClibc-ng"), FALSE, FALSE},
+ { "diet", "diet version", N_("diet libc"), TRUE, TRUE},
+ { NULL }
+ };
+ 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(idle_free(err), '\n');
+ g_free(out);
+ } else {
+ p = strend(idle_free(out), '\n');
+ g_free(err);
+ }
+
+ if (!p || !strstr(p, libs[i].match_str))
+ continue;
+
+ if (libs[i].try_ver_str) {
+ /* skip the first word, likely "ldconfig" or name of utility */
+ const gchar *ver_str = strchr(p, ' ');
+
+ if (ver_str) {
+ return g_strdup_printf("%s / %s", _(libs[i].lib_name),
+ ver_str + 1);
+ }
+ }
+
+ return g_strdup(_(libs[i].lib_name));
+ }
+
return g_strdup(_("Unknown"));
}
-#include <gdk/gdkx.h>
+static gchar *detect_kde_version(void)
+{
+ const gchar *cmd;
+ const gchar *tmp = g_getenv("KDE_SESSION_VERSION");
+ gchar *out;
+ gboolean spawned;
+
+ if (tmp && tmp[0] == '4') {
+ cmd = "kwin --version";
+ } else {
+ cmd = "kcontrol --version";
+ }
+
+ spawned = g_spawn_command_line_sync(cmd, &out, NULL, NULL, NULL);
+ if (!spawned)
+ return NULL;
+
+ tmp = strstr(idle_free(out), "KDE: ");
+ return tmp ? g_strdup(tmp + strlen("KDE: ")) : NULL;
+}
+
+static gchar *
+detect_gnome_version(void)
+{
+ gchar *tmp;
+ gchar *out;
+ gboolean spawned;
+
+ spawned = g_spawn_command_line_sync(
+ "gnome-shell --version", &out, NULL, NULL, NULL);
+ if (spawned) {
+ tmp = strstr(idle_free(out), _("GNOME Shell "));
+
+ if (tmp) {
+ tmp += strlen(_("GNOME Shell "));
+ return g_strdup_printf("GNOME %s", strend(tmp, '\n'));
+ }
+ }
+
+ spawned = g_spawn_command_line_sync(
+ "gnome-about --gnome-version", &out, NULL, NULL, NULL);
+ if (spawned) {
+ tmp = strstr(idle_free(out), _("Version: "));
+
+ if (tmp) {
+ tmp += strlen(_("Version: "));
+ return g_strdup_printf("GNOME %s", strend(tmp, '\n'));
+ }
+ }
+
+ return NULL;
+}
-void
-detect_desktop_environment(OperatingSystem * os)
+static gchar *
+detect_window_manager(void)
{
- const gchar *tmp = g_getenv("GNOME_DESKTOP_SESSION_ID");
- FILE *version;
- char vers[16];
+ GdkScreen *screen = gdk_screen_get_default();
+ const gchar *windowman;
+ const gchar *curdesktop;
+
+ if (!screen || !GDK_IS_SCREEN(screen))
+ return NULL;
+
+ windowman = gdk_x11_screen_get_window_manager_name(screen);
+ if (g_str_equal(windowman, "Xfwm4"))
+ return g_strdup("XFCE 4");
+
+ curdesktop = g_getenv("XDG_CURRENT_DESKTOP");
+ if (curdesktop) {
+ const gchar *desksession = g_getenv("DESKTOP_SESSION");
+
+ if (desksession && !g_str_equal(curdesktop, desksession))
+ return g_strdup(desksession);
+ }
+
+ return g_strdup_printf(_("Unknown (Window Manager: %s)"), windowman);
+}
+
+static gchar *
+desktop_with_session_type(const gchar *desktop_env)
+{
+ const char *tmp;
+
+ tmp = g_getenv("XDG_SESSION_TYPE");
if (tmp) {
- /* FIXME: this might not be true, as the gnome-panel in path
- may not be the one that's running.
- see where the user's running panel is and run *that* to
- obtain the version. */
- version = popen("gnome-about --gnome-version", "r");
- if (version) {
- (void)fscanf(version, _("Version: %s"), vers);
- if (pclose(version))
- goto unknown;
- } else {
- goto unknown;
- }
-
- os->desktop = g_strdup_printf("GNOME %s", vers);
- } else if (g_getenv("KDE_FULL_SESSION")) {
-
- if (g_getenv("KDE_SESSION_VERSION") && strstr(g_getenv("KDE_SESSION_VERSION"),(gchar *)"4")) {
- version = popen("kwin --version", "r");
- } else {
- version = popen("kcontrol --version", "r");
- }
-
- if (version) {
- char buf[32];
-
- (void)fgets(buf, 32, version);
-
- (void)fscanf(version, "KDE: %s", vers);
- if (pclose(version))
- goto unknown;
- } else {
- goto unknown;
- }
-
- os->desktop = g_strdup_printf("KDE %s", vers);
- } else {
- unknown:
- os->desktop = NULL;
-
- if (!g_getenv("DISPLAY")) {
- os->desktop = g_strdup(_("Terminal"));
- } else {
- GdkScreen *screen = gdk_screen_get_default();
-
- if (screen && GDK_IS_SCREEN(screen)) {
- const gchar *windowman;
-
- windowman = gdk_x11_screen_get_window_manager_name(screen);
- if (g_str_equal(windowman, "Xfwm4")) {
- /* FIXME: check if xprop -root | grep XFCE_DESKTOP_WINDOW is defined */
- os->desktop = g_strdup("XFCE 4");
- } else if ((tmp = g_getenv("XDG_CURRENT_DESKTOP"))) {
- os->desktop = g_strdup(tmp);
- if ((tmp = g_getenv("DESKTOP_SESSION")) && !g_str_equal(os->desktop, tmp)) {
- g_free(os->desktop);
- os->desktop = g_strdup(tmp);
- }
- }
-
- if (!os->desktop) {
- os->desktop = g_strdup_printf(_("Unknown (Window Manager: %s)"),
- windowman);
- }
- } else {
- os->desktop = g_strdup(_("Unknown"));
- }
- }
+ if (!g_str_equal(tmp, "unspecified"))
+ return g_strdup_printf(_(/*/{desktop environment} on {session type}*/ "%s on %s"), desktop_env, tmp);
+ }
+
+ return g_strdup(desktop_env);
+}
+
+static gchar *
+detect_xdg_environment(const gchar *env_var)
+{
+ const gchar *tmp;
+
+ tmp = g_getenv(env_var);
+ if (!tmp)
+ return NULL;
+
+ if (g_str_equal(tmp, "GNOME") || g_str_equal(tmp, "gnome")) {
+ gchar *maybe_gnome = detect_gnome_version();
+
+ if (maybe_gnome)
+ return maybe_gnome;
}
+ if (g_str_equal(tmp, "KDE") || g_str_equal(tmp, "kde")) {
+ gchar *maybe_kde = detect_kde_version();
+
+ if (maybe_kde)
+ return maybe_kde;
+ }
+
+ return g_strdup(tmp);
+}
+
+static gchar *
+detect_desktop_environment(void)
+{
+ const gchar *tmp;
+ gchar *windowman;
+
+ windowman = detect_xdg_environment("XDG_CURRENT_DESKTOP");
+ if (windowman)
+ return windowman;
+ windowman = detect_xdg_environment("XDG_SESSION_DESKTOP");
+ if (windowman)
+ return windowman;
+
+ tmp = g_getenv("KDE_FULL_SESSION");
+ if (tmp) {
+ gchar *maybe_kde = detect_kde_version();
+
+ if (maybe_kde)
+ return maybe_kde;
+ }
+ tmp = g_getenv("GNOME_DESKTOP_SESSION_ID");
+ if (tmp) {
+ gchar *maybe_gnome = detect_gnome_version();
+
+ if (maybe_gnome)
+ return maybe_gnome;
+ }
+
+ windowman = detect_window_manager();
+ if (windowman)
+ return windowman;
+
+ if (!g_getenv("DISPLAY"))
+ return g_strdup(_("Terminal"));
+
+ return g_strdup(_("Unknown"));
}
gchar *
computer_get_entropy_avail(void)
{
+ gchar tab_entropy_fstr[][32] = {
+ N_(/*/bits of entropy for rng (0)*/ "(None or not available)"),
+ N_(/*/bits of entropy for rng (low/poor value)*/ "%d bits (low)"),
+ N_(/*/bits of entropy for rng (medium value)*/ "%d bits (medium)"),
+ N_(/*/bits of entropy for rng (high/good value)*/ "%d bits (healthy)")
+ };
gint bits = h_sysfs_read_int("/proc/sys/kernel/random", "entropy_avail");
- if (bits < 200)
- return g_strdup_printf("%d bits (low)", bits);
- if (bits < 3000)
- return g_strdup_printf("%d bits (medium)", bits);
- return g_strdup_printf("%d bits (healthy)", bits);
+ if (bits > 3000) return g_strdup_printf(_(tab_entropy_fstr[3]), bits);
+ if (bits > 200) return g_strdup_printf(_(tab_entropy_fstr[2]), bits);
+ if (bits > 1) return g_strdup_printf(_(tab_entropy_fstr[1]), bits);
+ return g_strdup_printf(_(tab_entropy_fstr[0]), bits);
}
-OperatingSystem *
-computer_get_os(void)
+gchar *
+computer_get_language(void)
{
- struct utsname utsbuf;
- OperatingSystem *os;
+ gchar *tab_lang_env[] =
+ { "LANGUAGE", "LANG", "LC_ALL", "LC_MESSAGES", NULL };
+ gchar *lc = NULL, *env = NULL, *ret = NULL;
+ gint i = 0;
+
+ lc = setlocale(LC_ALL, NULL);
+
+ while (tab_lang_env[i] != NULL) {
+ env = g_strdup( g_getenv(tab_lang_env[i]) );
+ if (env != NULL) break;
+ i++;
+ }
+
+ if (env != NULL)
+ if (lc != NULL)
+ ret = g_strdup_printf("%s (%s)", lc, env);
+ else
+ ret = g_strdup_printf("%s", env);
+ else
+ if (lc != NULL)
+ ret = g_strdup_printf("%s", lc);
+
+ if (ret == NULL)
+ ret = g_strdup( _("(Unknown)") );
+
+ return ret;
+}
+
+static gchar *
+detect_distro(void)
+{
+ static const struct {
+ const gchar *file;
+ const gchar *codename;
+ const gchar *override;
+ } distro_db[] = {
+#define DB_PREFIX "/etc/"
+ { DB_PREFIX "arch-release", "arch", "Arch Linux" },
+ { DB_PREFIX "fatdog-version", "fatdog" },
+ { DB_PREFIX "debian_version", "deb" },
+ { DB_PREFIX "slackware-version", "slk" },
+ { DB_PREFIX "mandrake-release", "mdk" },
+ { DB_PREFIX "mandriva-release", "mdv" },
+ { DB_PREFIX "fedora-release", "fdra" },
+ { DB_PREFIX "coas", "coas" },
+ { DB_PREFIX "environment.corel", "corel"},
+ { DB_PREFIX "gentoo-release", "gnt" },
+ { DB_PREFIX "conectiva-release", "cnc" },
+ { DB_PREFIX "versão-conectiva", "cnc" },
+ { DB_PREFIX "turbolinux-release", "tl" },
+ { DB_PREFIX "yellowdog-release", "yd" },
+ { DB_PREFIX "sabayon-release", "sbn" },
+ { DB_PREFIX "arch-release", "arch" },
+ { DB_PREFIX "enlisy-release", "enlsy" },
+ { DB_PREFIX "SuSE-release", "suse" },
+ { DB_PREFIX "sun-release", "sun" },
+ { DB_PREFIX "zenwalk-version", "zen" },
+ { DB_PREFIX "DISTRO_SPECS", "ppy", "Puppy Linux" },
+ { DB_PREFIX "puppyversion", "ppy", "Puppy Linux" },
+ { DB_PREFIX "distro-release", "fl" },
+ { DB_PREFIX "vine-release", "vine" },
+ { DB_PREFIX "PartedMagic-version", "pmag" },
+ /*
+ * RedHat must be the *last* one to be checked, since
+ * some distros (like Mandrake) includes a redhat-relase
+ * file too.
+ */
+ { DB_PREFIX "redhat-release", "rh" },
+#undef DB_PREFIX
+ { NULL, NULL }
+ };
+ gchar *contents;
int i;
- os = g_new0(OperatingSystem, 1);
+ if (g_spawn_command_line_sync("lsb_release -d", &contents, NULL, NULL, NULL)) {
+ gchar *tmp = strstr(idle_free(contents), "Description:\t");
- /* Attempt to get the Distribution name; try using /etc/lsb-release first,
- then doing the legacy method (checking for /etc/$DISTRO-release files) */
- if (g_file_test("/etc/lsb-release", G_FILE_TEST_EXISTS)) {
- FILE *release;
- gchar buffer[128];
+ if (tmp)
+ return g_strdup(tmp + strlen("Description:\t"));
+ }
- release = popen("lsb_release -d", "r");
- if (release) {
- (void)fgets(buffer, 128, release);
- pclose(release);
+ for (i = 0; distro_db[i].file; i++) {
+ if (!g_file_get_contents(distro_db[i].file, &contents, NULL, NULL))
+ continue;
- os->distro = buffer;
- os->distro = g_strdup(os->distro + strlen("Description:\t"));
+ if (distro_db[i].override) {
+ g_free(contents);
+ return g_strdup(distro_db[i].override);
}
- } else if (g_file_test("/etc/arch-release", G_FILE_TEST_EXISTS)) {
- os->distrocode = g_strdup("arch");
- os->distro = g_strdup("Arch Linux");
- } else {
- for (i = 0;; i++) {
- if (distro_db[i].file == NULL) {
- os->distrocode = g_strdup("unk");
- os->distro = g_strdup(_("Unknown distribution"));
- break;
- }
- if (g_file_test(distro_db[i].file, G_FILE_TEST_EXISTS)) {
- FILE *distro_ver;
- char buf[128];
-
- distro_ver = fopen(distro_db[i].file, "r");
- if (distro_ver) {
- (void)fgets(buf, 128, distro_ver);
- fclose(distro_ver);
- } else {
- continue;
- }
-
- buf[strlen(buf) - 1] = 0;
-
- if (!os->distro) {
- /*
- * HACK: Some Debian systems doesn't include
- * the distribuition name in /etc/debian_release,
- * so add them here.
- */
- if (!strncmp(distro_db[i].codename, "deb", 3) &&
- ((buf[0] >= '0' && buf[0] <= '9') || buf[0] != 'D')) {
- os->distro = g_strdup_printf
- ("Debian GNU/Linux %s", buf);
- } else {
- os->distro = g_strdup(buf);
- }
- }
-
- if (g_str_equal(distro_db[i].codename, "ppy")) {
- gchar *tmp;
- tmp = g_strdup_printf("Puppy Linux");
- g_free(os->distro);
- os->distro = tmp;
- }
-
- if (g_str_equal(distro_db[i].codename, "fatdog")) {
- gchar *tmp;
- tmp = g_strdup_printf("Fatdog64 [%.10s]", os->distro);
- g_free(os->distro);
- os->distro = tmp;
- }
-
- os->distrocode = g_strdup(distro_db[i].codename);
-
- break;
- }
+ if (g_str_equal(distro_db[i].codename, "deb")) {
+ /* HACK: Some Debian systems doesn't include the distribuition
+ * name in /etc/debian_release, so add them here. */
+ if (isdigit(contents[0]) || contents[0] != 'D')
+ return g_strdup_printf("Debian GNU/Linux %s", (char*)idle_free(contents));
}
+
+ if (g_str_equal(distro_db[i].codename, "fatdog"))
+ return g_strdup_printf("Fatdog64 [%.10s]", (char*)idle_free(contents));
+
+ return contents;
}
- os->distro = g_strstrip(os->distro);
+ return g_strdup(_("Unknown"));
+}
+
+OperatingSystem *
+computer_get_os(void)
+{
+ struct utsname utsbuf;
+ OperatingSystem *os;
+ int i;
+
+ os = g_new0(OperatingSystem, 1);
+
+ os->distro = g_strstrip(detect_distro());
/* Kernel and hostname info */
uname(&utsbuf);
@@ -244,13 +376,16 @@ computer_get_os(void)
os->kernel = g_strdup_printf("%s %s (%s)", utsbuf.sysname,
utsbuf.release, utsbuf.machine);
os->hostname = g_strdup(utsbuf.nodename);
- os->language = g_strdup(g_getenv("LC_MESSAGES"));
+ os->language = computer_get_language();
os->homedir = g_strdup(g_get_home_dir());
os->username = g_strdup_printf("%s (%s)",
g_get_user_name(), g_get_real_name());
os->libc = get_libc_version();
scan_languages(os);
- detect_desktop_environment(os);
+
+ os->desktop = detect_desktop_environment();
+ if (os->desktop)
+ os->desktop = desktop_with_session_type(idle_free(os->desktop));
os->entropy_avail = computer_get_entropy_avail();
diff --git a/modules/computer/uptime.c b/modules/computer/uptime.c
index 8eb563fa..5f0f1942 100644
--- a/modules/computer/uptime.c
+++ b/modules/computer/uptime.c
@@ -26,11 +26,11 @@ computer_get_uptime(void)
gulong minutes;
if ((procuptime = fopen("/proc/uptime", "r")) != NULL) {
- (void)fscanf(procuptime, "%lu", &minutes);
- ui->minutes = minutes / 60;
- fclose(procuptime);
+ (void)fscanf(procuptime, "%lu", &minutes);
+ ui->minutes = minutes / 60;
+ fclose(procuptime);
} else {
- return NULL;
+ return NULL;
}
ui->hours = ui->minutes / 60;
@@ -45,32 +45,27 @@ gchar *
computer_get_formatted_uptime()
{
UptimeInfo *ui;
- gchar *tmp;
+ const gchar *days_fmt, *hours_fmt, *minutes_fmt;
+ gchar *full_fmt = NULL, *ret = NULL;
ui = computer_get_uptime();
- /* FIXME: Use ngettext */
-#define plural(x) ((x > 1) ? "s" : "")
+ days_fmt = ngettext("%d day", "%d days", ui->days);
+ hours_fmt = ngettext("%d hour", "%d hours", ui->hours);
+ minutes_fmt = ngettext("%d minute", "%d minutes", ui->minutes);
if (ui->days < 1) {
- if (ui->hours < 1) {
- tmp =
- g_strdup_printf("%d minute%s", ui->minutes,
- plural(ui->minutes));
- } else {
- tmp =
- g_strdup_printf("%d hour%s, %d minute%s", ui->hours,
- plural(ui->hours), ui->minutes,
- plural(ui->minutes));
- }
+ if (ui->hours < 1) {
+ ret = g_strdup_printf(minutes_fmt, ui->minutes);
+ } else {
+ full_fmt = g_strdup_printf("%s %s", hours_fmt, minutes_fmt);
+ ret = g_strdup_printf(full_fmt, ui->hours, ui->minutes);
+ }
} else {
- tmp =
- g_strdup_printf("%d day%s, %d hour%s and %d minute%s",
- ui->days, plural(ui->days), ui->hours,
- plural(ui->hours), ui->minutes,
- plural(ui->minutes));
+ full_fmt = g_strdup_printf("%s %s %s", days_fmt, hours_fmt, minutes_fmt);
+ ret = g_strdup_printf(full_fmt, ui->days, ui->hours, ui->minutes);
}
-
+ g_free(full_fmt);
g_free(ui);
- return tmp;
+ return ret;
}
diff --git a/modules/computer/users.c b/modules/computer/users.c
index e8f891ac..f47320bb 100644
--- a/modules/computer/users.c
+++ b/modules/computer/users.c
@@ -39,15 +39,16 @@ scan_users_do(void)
while (passwd_) {
gchar *key = g_strdup_printf("USER%s", passwd_->pw_name);
- gchar *val = g_strdup_printf("[User Information]\n"
- "User ID=%d\n"
- "Group ID=%d\n"
- "Home directory=%s\n"
- "Default shell=%s\n",
- (gint) passwd_->pw_uid,
- (gint) passwd_->pw_gid,
- passwd_->pw_dir,
- passwd_->pw_shell);
+ gchar *val = g_strdup_printf("[%s]\n"
+ "%s=%d\n"
+ "%s=%d\n"
+ "%s=%s\n"
+ "%s=%s\n",
+ _("User Information"),
+ _("User ID"), (gint) passwd_->pw_uid,
+ _("Group ID"), (gint) passwd_->pw_gid,
+ _("Home Directory"), passwd_->pw_dir,
+ _("Default Shell"), passwd_->pw_shell);
moreinfo_add_with_prefix("COMP", key, val);
strend(passwd_->pw_gecos, ',');
@@ -55,6 +56,6 @@ scan_users_do(void)
passwd_ = getpwent();
g_free(key);
}
-
+
endpwent();
}