aboutsummaryrefslogtreecommitdiff
path: root/modules/computer/os.c
diff options
context:
space:
mode:
authorSimon Quigley <tsimonq2@ubuntu.com>2017-06-19 15:19:47 -0500
committerSimon Quigley <tsimonq2@ubuntu.com>2017-06-19 15:19:47 -0500
commit79c11b29d78a70ae1b04af3b7ca4ec9bb12dd8d7 (patch)
treec4577e59ae13a8031f937991dcc3a63f68d18db5 /modules/computer/os.c
parent62eb92d94fa902b4a34dafce45547680a2655b40 (diff)
parent7aacc9f2510901c9e97b30fa9bcb550bb7f99c03 (diff)
Merge tag 'upstream/0.5.1+git20170605'
Upstream version 0.5.1+git20170605
Diffstat (limited to 'modules/computer/os.c')
-rw-r--r--modules/computer/os.c258
1 files changed, 258 insertions, 0 deletions
diff --git a/modules/computer/os.c b/modules/computer/os.c
new file mode 100644
index 00000000..3caf6c26
--- /dev/null
+++ b/modules/computer/os.c
@@ -0,0 +1,258 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <string.h>
+#include <sys/utsname.h>
+#include "hardinfo.h"
+#include "computer.h"
+
+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:
+ return g_strdup(_("Unknown"));
+}
+
+#include <gdk/gdkx.h>
+
+void
+detect_desktop_environment(OperatingSystem * os)
+{
+ const gchar *tmp = g_getenv("GNOME_DESKTOP_SESSION_ID");
+ FILE *version;
+ char vers[16];
+
+ 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"));
+ }
+ }
+ }
+}
+
+gchar *
+computer_get_entropy_avail(void)
+{
+ 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);
+}
+
+OperatingSystem *
+computer_get_os(void)
+{
+ struct utsname utsbuf;
+ OperatingSystem *os;
+ int i;
+
+ os = g_new0(OperatingSystem, 1);
+
+ /* 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];
+
+ release = popen("lsb_release -d", "r");
+ if (release) {
+ (void)fgets(buffer, 128, release);
+ pclose(release);
+
+ os->distro = buffer;
+ os->distro = g_strdup(os->distro + strlen("Description:\t"));
+ }
+ } 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;
+ }
+ }
+ }
+
+ os->distro = g_strstrip(os->distro);
+
+ /* Kernel and hostname info */
+ uname(&utsbuf);
+ os->kernel_version = g_strdup(utsbuf.version);
+ 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->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->entropy_avail = computer_get_entropy_avail();
+
+ return os;
+}