aboutsummaryrefslogtreecommitdiff
path: root/arch/linux
diff options
context:
space:
mode:
authorSimon Quigley <tsimonq2@ubuntu.com>2017-06-19 14:38:48 -0500
committerSimon Quigley <tsimonq2@ubuntu.com>2017-06-19 14:38:48 -0500
commit4979bb6cbbbe39eb44c32530cd13f86bf44e5d77 (patch)
tree614372cf2510ad45311ecea088012683635d0b76 /arch/linux
parentee6c3f9b4cf08a276c971dee66e1acdb32b3dff9 (diff)
Import Upstream version 0.5c
Diffstat (limited to 'arch/linux')
-rw-r--r--arch/linux/alpha/processor.h5
l---------arch/linux/alpha/resources.h1
-rw-r--r--arch/linux/armv4l/processor.h6
l---------arch/linux/armv4l/resources.h1
-rw-r--r--arch/linux/common/alsa.h2
-rw-r--r--arch/linux/common/battery.h84
-rw-r--r--arch/linux/common/boots.h9
-rw-r--r--arch/linux/common/devmemory.h2
-rw-r--r--arch/linux/common/dmi.h160
-rw-r--r--arch/linux/common/filesystem.h18
-rw-r--r--arch/linux/common/inputdevices.h18
-rw-r--r--arch/linux/common/loadavg.h2
-rw-r--r--arch/linux/common/memory.h2
-rw-r--r--arch/linux/common/modules.h30
-rw-r--r--arch/linux/common/net.h406
-rw-r--r--arch/linux/common/os.h57
-rw-r--r--arch/linux/common/pci.h56
-rw-r--r--arch/linux/common/resources.h103
-rw-r--r--arch/linux/common/samba.h2
-rw-r--r--arch/linux/common/sensors.h17
-rw-r--r--arch/linux/common/storage.h161
-rw-r--r--arch/linux/common/uptime.h2
-rw-r--r--arch/linux/common/usb.h213
-rw-r--r--arch/linux/ia64/processor.h6
l---------arch/linux/ia64/resources.h1
-rw-r--r--arch/linux/m68k/processor.h2
l---------arch/linux/m68k/resources.h1
-rw-r--r--arch/linux/mips/processor.h2
l---------arch/linux/mips/resources.h1
-rw-r--r--arch/linux/parisc/processor.h2
l---------arch/linux/parisc/resources.h1
-rw-r--r--arch/linux/ppc/processor.h2
l---------arch/linux/ppc/resources.h1
-rw-r--r--arch/linux/s390/processor.h6
l---------arch/linux/s390/resources.h1
l---------arch/linux/sh/alsa.h1
l---------arch/linux/sh/battery.h1
l---------arch/linux/sh/boots.h1
l---------arch/linux/sh/devmemory.h1
l---------arch/linux/sh/filesystem.h1
l---------arch/linux/sh/inputdevices.h1
l---------arch/linux/sh/loadavg.h1
l---------arch/linux/sh/memory.h1
l---------arch/linux/sh/modules.h1
l---------arch/linux/sh/net.h1
l---------arch/linux/sh/nfs.h1
l---------arch/linux/sh/os.h1
l---------arch/linux/sh/pci.h1
-rw-r--r--arch/linux/sh/processor.h78
l---------arch/linux/sh/resources.h1
l---------arch/linux/sh/samba.h1
l---------arch/linux/sh/sensors.h1
l---------arch/linux/sh/storage.h1
l---------arch/linux/sh/uptime.h1
l---------arch/linux/sh/usb.h1
-rw-r--r--arch/linux/sparc/processor.h5
l---------arch/linux/sparc/resources.h1
l---------arch/linux/x86/boots.h2
l---------arch/linux/x86/dmi.h1
l---------arch/linux/x86/net.h2
-rw-r--r--arch/linux/x86/processor.h182
l---------arch/linux/x86/resources.h1
62 files changed, 1362 insertions, 312 deletions
diff --git a/arch/linux/alpha/processor.h b/arch/linux/alpha/processor.h
index 081a4f7d..1e5b014c 100644
--- a/arch/linux/alpha/processor.h
+++ b/arch/linux/alpha/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -18,7 +18,7 @@
struct _Processor {
gchar *model_name;
- gfloat bogomips;
+ gfloat bogomips, cpu_mhz;
gchar *strmodel;
};
@@ -52,6 +52,7 @@ __scan_processors(void)
gchar *tmp = g_strconcat("Alpha ", processor->model_name, NULL);
g_free(processor->model_name);
processor->model_name = tmp;
+ processor->cpu_mhz = 0.0f;
fclose(cpuinfo);
diff --git a/arch/linux/alpha/resources.h b/arch/linux/alpha/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/alpha/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/armv4l/processor.h b/arch/linux/armv4l/processor.h
index d66d6f25..82b6be04 100644
--- a/arch/linux/armv4l/processor.h
+++ b/arch/linux/armv4l/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -19,7 +19,7 @@
struct _Processor {
gchar *model_name;
gchar *flags;
- gfloat bogomips;
+ gfloat bogomips, cpu_mhz;
gchar *has_fpu;
};
@@ -53,6 +53,8 @@ __scan_processors(void)
g_strfreev(tmp);
}
+ processor->cpu_mhz = 0.0f;
+
fclose(cpuinfo);
return g_slist_append(NULL, processor);
diff --git a/arch/linux/armv4l/resources.h b/arch/linux/armv4l/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/armv4l/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/common/alsa.h b/arch/linux/common/alsa.h
index 8f4cc2ac..5609471c 100644
--- a/arch/linux/common/alsa.h
+++ b/arch/linux/common/alsa.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
diff --git a/arch/linux/common/battery.h b/arch/linux/common/battery.h
index 4a38b842..7dfa5423 100644
--- a/arch/linux/common/battery.h
+++ b/arch/linux/common/battery.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -18,6 +18,82 @@
#include <time.h>
+const struct {
+ gchar *key, *name;
+} ups_fields[] = {
+ { "UPS Status", NULL },
+ { "STATUS", "Status" },
+ { "TIMELEFT", "Time Left" },
+ { "LINEV", "Line Voltage" },
+ { "LOADPCT", "Load Percent" },
+
+ { "UPS Battery Information", NULL },
+ { "BATTV", "Battery Voltage" },
+ { "BCHARGE", "Battery Charge" },
+ { "BATTDATE", "Battery Date" },
+
+ { "UPS Information", NULL },
+ { "APCMODEL", "Model" },
+ { "FIRMWARE", "Firmware Version" },
+ { "SERIALNO", "Serial Number" },
+ { "UPSMODE", "UPS Mode" },
+ { "CABLE", "Cable" },
+ { "UPSNAME", "UPS Name" },
+
+ { "UPS Nominal Values", NULL },
+ { "NOMINV", "Voltage" },
+ { "NOMBATTV", "Battery Voltage" },
+ { "NOMPOWER", "Power" }
+};
+
+
+static void
+__scan_battery_apcupsd(void)
+{
+ GHashTable *ups_data;
+ FILE *apcaccess;
+ char buffer[512], *apcaccess_path;
+ int i;
+
+ apcaccess_path = find_program("apcaccess");
+
+ if ((apcaccess = popen(apcaccess_path, "r"))) {
+ /* first line isn't important */
+ if (fgets(buffer, 512, apcaccess)) {
+ /* allocate the key, value hash table */
+ ups_data = g_hash_table_new(g_str_hash, g_str_equal);
+
+ /* read up all the apcaccess' output, saving it in the key, value hash table */
+ while (fgets(buffer, 512, apcaccess)) {
+ buffer[9] = '\0';
+
+ g_hash_table_insert(ups_data,
+ g_strdup(g_strstrip(buffer)),
+ g_strdup(g_strstrip(buffer + 10)));
+ }
+
+ /* builds the ups info string, respecting the field order as found in ups_fields */
+ for (i = 0; i < G_N_ELEMENTS(ups_fields); i++) {
+ if (!ups_fields[i].name) {
+ /* there's no name: make a group with the key as its name */
+ battery_list = h_strdup_cprintf("[%s]\n", battery_list, ups_fields[i].key);
+ } else {
+ /* there's a name: adds a line */
+ battery_list = h_strdup_cprintf("%s=%s\n", battery_list,
+ ups_fields[i].name,
+ g_hash_table_lookup(ups_data, ups_fields[i].key));
+ }
+ }
+
+ g_hash_table_destroy(ups_data);
+ }
+
+ pclose(apcaccess);
+ }
+
+ g_free(apcaccess_path);
+}
+
static void
__scan_battery_acpi(void)
{
@@ -31,11 +107,6 @@ __scan_battery_acpi(void)
gchar *state = NULL, *rate = NULL;
gchar *remaining = NULL;
- if (battery_list) {
- g_free(battery_list);
- }
- battery_list = g_strdup("");
-
acpi_path = g_strdup("/proc/acpi/battery");
if (g_file_test(acpi_path, G_FILE_TEST_EXISTS)) {
GDir *acpi;
@@ -209,6 +280,7 @@ __scan_battery(void)
__scan_battery_acpi();
__scan_battery_apm();
+ __scan_battery_apcupsd();
if (*battery_list == '\0') {
g_free(battery_list);
diff --git a/arch/linux/common/boots.h b/arch/linux/common/boots.h
index d3428ea9..8a3c11fa 100644
--- a/arch/linux/common/boots.h
+++ b/arch/linux/common/boots.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 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
@@ -47,11 +47,10 @@ scan_boots_real(void)
}
}
- tmp = g_strsplit(buffer, " ", 5);
- computer->os->boots = h_strdup_cprintf("\n%s=Kernel %s",
+ tmp = g_strsplit(buffer, " ", 0);
+ computer->os->boots = h_strdup_cprintf("\n%s %s %s %s=%s|%s",
computer->os->boots,
- tmp[4],
- tmp[3]);
+ tmp[4], tmp[5], tmp[6], tmp[7], tmp[3], tmp[8]);
g_strfreev(tmp);
}
}
diff --git a/arch/linux/common/devmemory.h b/arch/linux/common/devmemory.h
index 5eafe599..e3921cdd 100644
--- a/arch/linux/common/devmemory.h
+++ b/arch/linux/common/devmemory.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 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
diff --git a/arch/linux/common/dmi.h b/arch/linux/common/dmi.h
new file mode 100644
index 00000000..f69fdc21
--- /dev/null
+++ b/arch/linux/common/dmi.h
@@ -0,0 +1,160 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2007 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
+ */
+/*
+ * DMI support based on patch by Stewart Adam <s.adam@diffingo.com>
+ */
+#include <unistd.h>
+#include <sys/types.h>
+
+typedef struct _DMIInfo DMIInfo;
+
+struct _DMIInfo {
+ const gchar *name;
+ const gchar *file; /* for sysfs */
+ const gchar *param; /* for dmidecode */
+};
+
+DMIInfo dmi_info_table[] = {
+ { "$BIOS", NULL, NULL },
+ { "Date", "/sys/class/dmi/id/bios_date", "bios-release-date" },
+ { "Vendor", "/sys/class/dmi/id/bios_vendor", "bios-vendor" },
+ { "Version", "/sys/class/dmi/id/bios_version", "bios-version" },
+ { "$Board", NULL, NULL },
+ { "Name", "/sys/class/dmi/id/board_name", "baseboard-product-name" },
+ { "Vendor", "/sys/class/dmi/id/board_vendor", "baseboard-manufacturer" },
+};
+
+static gchar *dmi_info = NULL;
+
+gboolean dmi_get_info_dmidecode()
+{
+ FILE *dmi_pipe;
+ gchar buffer[256];
+ DMIInfo *info;
+ gboolean dmi_failed = FALSE;
+ gint i;
+
+ if (dmi_info) {
+ g_free(dmi_info);
+ dmi_info = NULL;
+ }
+
+ for (i = 0; i < G_N_ELEMENTS(dmi_info_table); i++) {
+ info = &dmi_info_table[i];
+
+ if (*(info->name) == '$') {
+ dmi_info = h_strdup_cprintf("[%s]\n", dmi_info,
+ (info->name) + 1);
+ } else {
+ gchar *temp;
+
+ if (!info->param)
+ continue;
+
+ temp = g_strconcat("dmidecode -s ", info->param, NULL);
+ if ((dmi_pipe = popen(temp, "r"))) {
+ g_free(temp);
+
+ fgets(buffer, 256, dmi_pipe);
+ if (pclose(dmi_pipe)) {
+ dmi_failed = TRUE;
+ break;
+ }
+
+ dmi_info = h_strdup_cprintf("%s=%s\n",
+ dmi_info,
+ info->name,
+ buffer);
+ } else {
+ g_free(temp);
+ dmi_failed = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (dmi_failed) {
+ g_free(dmi_info);
+ dmi_info = NULL;
+ }
+
+ return !dmi_failed;
+}
+
+gboolean dmi_get_info_sys()
+{
+ FILE *dmi_file;
+ gchar buffer[256];
+ DMIInfo *info;
+ gboolean dmi_failed = FALSE;
+ gint i;
+
+ if (dmi_info) {
+ g_free(dmi_info);
+ dmi_info = NULL;
+ }
+
+ for (i = 0; i < G_N_ELEMENTS(dmi_info_table); i++) {
+ info = &dmi_info_table[i];
+
+ if (*(info->name) == '$') {
+ dmi_info = h_strdup_cprintf("[%s]\n", dmi_info,
+ (info->name) + 1);
+ } else {
+ if (!info->file)
+ continue;
+
+ if ((dmi_file = fopen(info->file, "r"))) {
+ fgets(buffer, 256, dmi_file);
+ fclose(dmi_file);
+
+ dmi_info = h_strdup_cprintf("%s=%s\n",
+ dmi_info,
+ info->name,
+ buffer);
+ } else {
+ dmi_failed = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (dmi_failed) {
+ g_free(dmi_info);
+ dmi_info = NULL;
+ }
+
+ return !dmi_failed;
+}
+
+void __scan_dmi()
+{
+ gboolean dmi_ok;
+
+ dmi_ok = dmi_get_info_sys();
+
+ if (!dmi_ok) {
+ dmi_ok = dmi_get_info_dmidecode();
+ }
+
+ if (!dmi_ok) {
+ dmi_info = g_strdup("[No DMI information]\n"
+ "There was an error retrieving the information.=\n"
+ "Please try running HardInfo as root.=\n");
+ }
+}
diff --git a/arch/linux/common/filesystem.h b/arch/linux/common/filesystem.h
index d8166fc3..1eff0818 100644
--- a/arch/linux/common/filesystem.h
+++ b/arch/linux/common/filesystem.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -51,10 +51,22 @@ scan_filesystems(void)
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);
@@ -81,9 +93,9 @@ scan_filesystems(void)
stravail);
g_hash_table_insert(moreinfo, g_strdup_printf("FS%d", ++count), strhash);
- fs_list = h_strdup_cprintf("$FS%d$%s=%s total, %s free\n",
+ fs_list = h_strdup_cprintf("$FS%d$%s=%.2f %% (%s of %s)|%s\n",
fs_list,
- count, tmp[0], strsize, stravail);
+ count, tmp[0], use_ratio, stravail, strsize, tmp[1]);
g_free(strsize);
g_free(stravail);
diff --git a/arch/linux/common/inputdevices.h b/arch/linux/common/inputdevices.h
index 8d2d8427..20e4289c 100644
--- a/arch/linux/common/inputdevices.h
+++ b/arch/linux/common/inputdevices.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -115,9 +115,19 @@ __scan_input_devices(void)
}
strhash = h_strdup_cprintf("Product=0x%x\n"
- "Version=0x%x\n"
- "Connected to=%s\n",
- strhash, product, version, phys);
+ "Version=0x%x\n",
+ strhash, product, version);
+
+ if (phys[1] != 0) {
+ strhash = h_strdup_cprintf("Connected to=%s\n",
+ strhash, phys);
+ }
+
+ if (strstr(phys,"ir")) {
+ strhash = h_strdup_cprintf("InfraRed port=yes\n",
+ strhash);
+ }
+
g_hash_table_insert(moreinfo, tmp, strhash);
g_free(phys);
diff --git a/arch/linux/common/loadavg.h b/arch/linux/common/loadavg.h
index 28132b5f..7c028679 100644
--- a/arch/linux/common/loadavg.h
+++ b/arch/linux/common/loadavg.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
diff --git a/arch/linux/common/memory.h b/arch/linux/common/memory.h
index def4cc1d..c87359b9 100644
--- a/arch/linux/common/memory.h
+++ b/arch/linux/common/memory.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
diff --git a/arch/linux/common/modules.h b/arch/linux/common/modules.h
index 6fbe13bd..7ea238b7 100644
--- a/arch/linux/common/modules.h
+++ b/arch/linux/common/modules.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -29,11 +29,18 @@ remove_module_devices(gpointer key, gpointer value, gpointer data)
return g_str_has_prefix(key, "MOD");
}
+static GHashTable *_module_hash_table = NULL;
+
static void
scan_modules_do(void)
{
FILE *lsmod;
gchar buffer[1024];
+ gchar *lsmod_path;
+
+ if (!_module_hash_table) {
+ _module_hash_table = g_hash_table_new(g_str_hash, g_str_equal);
+ }
if (module_list) {
g_free(module_list);
@@ -42,9 +49,12 @@ scan_modules_do(void)
module_list = NULL;
g_hash_table_foreach_remove(moreinfo, remove_module_devices, NULL);
- lsmod = popen("/sbin/lsmod", "r");
- if (!lsmod)
+ lsmod_path = find_program("lsmod");
+ lsmod = popen(lsmod_path, "r");
+ if (!lsmod) {
+ g_free(lsmod_path);
return;
+ }
fgets(buffer, 1024, lsmod); /* Discards the first line */
@@ -95,7 +105,15 @@ scan_modules_do(void)
if (description && g_str_equal(description, "&lt;none&gt;")) {
g_free(description);
description = g_strdup("");
- }
+
+ g_hash_table_insert(_module_hash_table,
+ g_strdup(modname),
+ g_strdup_printf("Kernel module (%s)", modname));
+ } else {
+ g_hash_table_insert(_module_hash_table,
+ g_strdup(modname),
+ g_strdup(description));
+ }
/* append this module to the list of modules */
module_list = h_strdup_cprintf("$%s$%s=%s\n",
@@ -119,7 +137,7 @@ scan_modules_do(void)
"License=%s\n",
NONE_IF_NULL(filename),
memory / 1024.0,
- NONE_IF_NULL(modname),
+ modname,
NONE_IF_NULL(description),
NONE_IF_NULL(vermagic),
NONE_IF_NULL(author),
@@ -146,4 +164,6 @@ scan_modules_do(void)
g_free(filename);
}
pclose(lsmod);
+
+ g_free(lsmod_path);
}
diff --git a/arch/linux/common/net.h b/arch/linux/common/net.h
index 527da1df..755c6936 100644
--- a/arch/linux/common/net.h
+++ b/arch/linux/common/net.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2008 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
@@ -15,36 +15,146 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
-static gchar *network_interfaces = NULL,
- *network_icons = NULL;
-
-#include <sys/ioctl.h>
-#include <net/if.h>
-#include <netinet/in.h>
-#include <linux/sockios.h>
-#include <sys/socket.h>
+/*
+ * Wireless Extension Example
+ * http://www.krugle.org/examples/p-OZYzuisV6gyQIaTu/iwconfig.c
+ */
+static gchar *network_interfaces = NULL, *network_icons = NULL;
#include <stdio.h>
#include <unistd.h>
-#include <string.h> /* for strncpy */
+#include <string.h>
+
+#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
+
#include <netinet/in.h>
+#include <linux/sockios.h>
+
#include <arpa/inet.h>
+#ifdef HAS_LINUX_WE
+#include <linux/if.h>
+#include <linux/wireless.h>
+#else
+#include <net/if.h>
+#endif /* HAS_LINUX_WE */
typedef struct _NetInfo NetInfo;
struct _NetInfo {
- char name[16];
- int mtu;
+ char name[16];
+ int mtu;
unsigned char mac[8];
char ip[16];
char mask[16];
char broadcast[16];
+
+#ifdef HAS_LINUX_WE
+ char wi_essid[IW_ESSID_MAX_SIZE + 1];
+ int wi_rate;
+ int wi_mode, wi_status;
+ gboolean wi_has_txpower;
+ struct iw_param wi_txpower;
+ int wi_quality_level, wi_signal_level, wi_noise_level;
+ gboolean is_wireless;
+#endif
};
-void get_net_info(char *if_name, NetInfo *netinfo)
+#ifdef HAS_LINUX_WE
+const gchar *wi_operation_modes[] = { "Auto", "Ad-Hoc", "Managed", "Master", "Repeater", "Secondary", "Unknown" };
+
+void get_wireless_info(int fd, NetInfo *netinfo)
+{
+ FILE *wrls;
+ char wbuf[256];
+ struct iwreq wi_req;
+ int r, trash;
+
+ netinfo->is_wireless = FALSE;
+
+ if ((wrls = fopen("/proc/net/wireless", "r"))) {
+ while (fgets(wbuf, 256, wrls)) {
+ if (strchr(wbuf, ':') && strstr(wbuf, netinfo->name)) {
+ gchar *buf1 = wbuf;
+
+ netinfo->is_wireless = TRUE;
+
+ buf1 = strchr(buf1, ':') + 1;
+
+ if (strstr(buf1, ".")) {
+ sscanf(buf1, "%d %d. %d %d %d %d %d %d %d %d",
+ &(netinfo->wi_status),
+ &(netinfo->wi_quality_level),
+ &(netinfo->wi_signal_level),
+ &(netinfo->wi_noise_level),
+ &trash, &trash, &trash, &trash, &trash, &trash);
+ } else {
+ sscanf(buf1, "%d %d %d %d %d %d %d %d %d %d",
+ &(netinfo->wi_status),
+ &(netinfo->wi_quality_level),
+ &(netinfo->wi_signal_level),
+ &(netinfo->wi_noise_level),
+ &trash, &trash, &trash, &trash, &trash,
+ &trash);
+ }
+
+ break;
+ }
+ }
+ fclose(wrls);
+ }
+
+ if (!netinfo->is_wireless)
+ return;
+
+ strncpy(wi_req.ifr_name, netinfo->name, 16);
+
+ /* obtain essid */
+ wi_req.u.essid.pointer = netinfo->wi_essid;
+ wi_req.u.essid.length = IW_ESSID_MAX_SIZE + 1;
+ wi_req.u.essid.flags = 0;
+
+ if ((r = ioctl(fd, SIOCGIWESSID, &wi_req) < 0)) {
+ strcpy(netinfo->wi_essid, "");
+ } else {
+ netinfo->wi_essid[wi_req.u.essid.length] = '\0';
+ }
+
+ /* obtain bit rate */
+ if ((r = ioctl(fd, SIOCGIWRATE, &wi_req) < 0)) {
+ netinfo->wi_rate = 0;
+ } else {
+ netinfo->wi_rate = wi_req.u.bitrate.value;
+ }
+
+ /* obtain operation mode */
+ if ((r = ioctl(fd, SIOCGIWMODE, &wi_req) < 0)) {
+ netinfo->wi_mode = 0;
+ } else {
+ if (wi_req.u.mode >= 0 && wi_req.u.mode < 6) {
+ netinfo->wi_mode = wi_req.u.mode;
+ } else {
+ netinfo->wi_mode = 6;
+ }
+ }
+
+#if WIRELESS_EXT >= 10
+ /* obtain txpower */
+ if ((r = ioctl(fd, SIOCGIWTXPOW, &wi_req) < 0)) {
+ netinfo->wi_has_txpower = FALSE;
+ } else {
+ netinfo->wi_has_txpower = TRUE;
+
+ memcpy(&netinfo->wi_txpower, &wi_req.u.txpower, sizeof(struct iw_param));
+ }
+#else
+ netinfo->wi_has_txpower = FALSE;
+#endif /* WIRELESS_EXT >= 10 */
+}
+#endif /* HAS_LINUX_WE */
+
+void get_net_info(char *if_name, NetInfo * netinfo)
{
struct ifreq ifr;
int fd;
@@ -58,44 +168,55 @@ void get_net_info(char *if_name, NetInfo *netinfo)
/* MTU */
strcpy(ifr.ifr_name, if_name);
if (ioctl(fd, SIOCGIFMTU, &ifr) < 0) {
- netinfo->mtu = 0;
+ netinfo->mtu = 0;
} else {
- netinfo->mtu = ifr.ifr_mtu;
+ netinfo->mtu = ifr.ifr_mtu;
}
/* HW Address */
strcpy(ifr.ifr_name, if_name);
if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
- memset(netinfo->mac, 0, 8);
+ memset(netinfo->mac, 0, 8);
} else {
- memcpy(netinfo->mac, ifr.ifr_ifru.ifru_hwaddr.sa_data, 8);
+ memcpy(netinfo->mac, ifr.ifr_ifru.ifru_hwaddr.sa_data, 8);
}
-
+
/* IP Address */
strcpy(ifr.ifr_name, if_name);
if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) {
- netinfo->ip[0] = 0;
+ netinfo->ip[0] = 0;
} else {
- sprintf(netinfo->ip, "%s", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
+ sprintf(netinfo->ip, "%s",
+ inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)->
+ sin_addr));
}
-
+
/* Mask Address */
strcpy(ifr.ifr_name, if_name);
if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) {
- netinfo->mask[0] = 0;
+ netinfo->mask[0] = 0;
} else {
- sprintf(netinfo->mask, "%s", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
+ sprintf(netinfo->mask, "%s",
+ inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)->
+ sin_addr));
}
/* Broadcast Address */
strcpy(ifr.ifr_name, if_name);
if (ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0) {
- netinfo->broadcast[0] = 0;
+ netinfo->broadcast[0] = 0;
} else {
- sprintf(netinfo->broadcast, "%s", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
+ sprintf(netinfo->broadcast, "%s",
+ inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)->
+ sin_addr));
}
+#ifdef HAS_LINUX_WE
+ get_wireless_info(fd, netinfo);
+#endif
+
shutdown(fd, 0);
+ close(fd);
}
static struct {
@@ -103,33 +224,46 @@ static struct {
char *label;
char *icon;
} netdev2type[] = {
- { "eth", "Ethernet", "network" },
- { "lo", "Loopback", "network-generic" },
- { "ppp", "Point-to-Point", "modem" },
- { "ath", "Wireless", "wireless" },
- { "wlan", "Wireless", "wireless" },
- { "tun", "Virtual Point-to-Point (TUN)", "network-generic" },
- { "tap", "Ethernet (TAP)", "network-generic" },
- { "plip", "Parallel Line Internet Protocol", "network" },
- { "irlan", "Infrared", "network-generic" },
- { "slip", "Serial Line Internet Protocol", "network-generic" },
- { "isdn", "Integrated Services Digital Network", "modem" },
- { "sit", "IPv6-over-IPv4 Tunnel", "network-generic" },
+ { "eth", "Ethernet", "network-interface" },
+ { "lo", "Loopback", "network" },
+ { "ppp", "Point-to-Point", "modem" },
+ { "ath", "Wireless", "wireless" },
+ { "wlan", "Wireless", "wireless" },
+ { "ra", "Wireless", "wireless" },
+ { "wl", "Wireless", "wireless" },
+ { "tun", "Virtual Point-to-Point (TUN)", "network" },
+ { "tap", "Ethernet (TAP)", "network" },
+ { "plip", "Parallel Line Internet Protocol", "network" },
+ { "irlan", "Infrared", "network" },
+ { "slip", "Serial Line Internet Protocol", "network" },
+ { "isdn", "Integrated Services Digital Network", "modem" },
+ { "sit", "IPv6-over-IPv4 Tunnel", "network" },
{ "vmnet8", "VMWare Virtual Network Interface (NAT)", "computer" },
- { "vmnet", "VMWare Virtual Network Interface", "computer"},
- { NULL, "Unknown", "network-generic" },
+ { "vmnet", "VMWare Virtual Network Interface", "computer" },
+ { "pan", "Personal Area Network (PAN)", "bluetooth" },
+ { "bnep", "Bluetooth", "bluetooth" },
+ { "br", "Bridge Interface", "network" },
+ { NULL, "Unknown", "network" },
};
-static void
-net_get_iface_type(gchar *name, gchar **type, gchar **icon)
+static void net_get_iface_type(gchar * name, gchar ** type, gchar ** icon, NetInfo *ni)
{
int i;
-
+
+#ifdef HAS_LINUX_WE
+ if (ni->is_wireless) {
+ *type = "Wireless";
+ *icon = "wireless";
+
+ return;
+ }
+#endif
+
for (i = 0; netdev2type[i].type; i++) {
- if (g_str_has_prefix(name, netdev2type[i].type))
- break;
+ if (g_str_has_prefix(name, netdev2type[i].type))
+ break;
}
-
+
*type = netdev2type[i].label;
*icon = netdev2type[i].icon;
}
@@ -140,49 +274,51 @@ remove_net_devices(gpointer key, gpointer value, gpointer data)
return g_str_has_prefix(key, "NET");
}
-static void
-scan_net_interfaces_24(void)
+static void scan_net_interfaces_24(void)
{
FILE *proc_net;
NetInfo ni;
gchar buffer[256];
gchar *devid, *detailed;
- gulong recv_bytes;
- gulong recv_errors;
- gulong recv_packets;
-
- gulong trans_bytes;
- gulong trans_errors;
- gulong trans_packets;
-
+ gdouble recv_bytes;
+ gdouble recv_errors;
+ gdouble recv_packets;
+
+ gdouble trans_bytes;
+ gdouble trans_errors;
+ gdouble trans_packets;
+
if (!g_file_test("/proc/net/dev", G_FILE_TEST_EXISTS)) {
- if (network_interfaces) {
- g_free(network_interfaces);
- network_interfaces = g_strdup("[Network Interfaces]\n"
- "None found=\n");
- }
+ if (network_interfaces) {
+ g_free(network_interfaces);
+ network_interfaces = g_strdup("[Network Interfaces]\n"
+ "None found=\n");
+ }
return;
}
if (network_interfaces) {
- g_free(network_interfaces);
+ g_free(network_interfaces);
}
-
+
if (network_icons) {
- g_free(network_icons);
+ g_free(network_icons);
}
-
+
network_interfaces = g_strdup("[Network Interfaces]\n");
network_icons = g_strdup("");
proc_net = fopen("/proc/net/dev", "r");
+ if (!proc_net)
+ return;
+
while (fgets(buffer, 256, proc_net)) {
if (strchr(buffer, ':')) {
gint trash;
gchar ifacename[16];
gchar *buf = buffer;
- gchar *iface_type, *iface_icon, *ip;
+ gchar *iface_type, *iface_icon;
gint i;
buf = g_strstrip(buf);
@@ -196,71 +332,107 @@ scan_net_interfaces_24(void)
buf = strchr(buf, ':') + 1;
/* iface: bytes packets errs drop fifo frame compressed multicast */
- sscanf(buf, "%ld %ld %ld %d %d %d %d %d %ld %ld %ld",
+ sscanf(buf, "%lf %lf %lf %d %d %d %d %d %lf %lf %lf",
&recv_bytes, &recv_packets,
&recv_errors, &trash, &trash, &trash, &trash,
- &trash, &trans_bytes, &trans_packets,
- &trans_errors);
+ &trash, &trans_bytes, &trans_packets, &trans_errors);
- gfloat recv_mb = recv_bytes / 1048576.0;
- gfloat trans_mb = trans_bytes / 1048576.0;
-
- get_net_info(ifacename, &ni);
+ gdouble recv_mb = recv_bytes / 1048576.0;
+ gdouble trans_mb = trans_bytes / 1048576.0;
+
+ get_net_info(ifacename, &ni);
+
+ devid = g_strdup_printf("NET%s", ifacename);
+
+ network_interfaces =
+ h_strdup_cprintf
+ ("$%s$%s=%s|%.2lfMiB|%.2lfMiB\n",
+ network_interfaces, devid, ifacename, ni.ip[0] ? ni.ip : "",
+ trans_mb, recv_mb);
+ net_get_iface_type(ifacename, &iface_type, &iface_icon, &ni);
- devid = g_strdup_printf("NET%s", ifacename);
-
- ip = g_strdup_printf(" (%s)", ni.ip);
- network_interfaces = h_strdup_cprintf("$%s$%s=Sent %.2fMiB, received %.2fMiB%s\n",
- network_interfaces,
- devid,
- ifacename,
- trans_mb,
- recv_mb,
- ni.ip[0] ? ip: "");
- g_free(ip);
-
- net_get_iface_type(ifacename, &iface_type, &iface_icon);
network_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n",
- network_icons, devid,
- ifacename, iface_icon);
+ network_icons, devid,
+ ifacename, iface_icon);
+
+ detailed = g_strdup_printf("[Network Adapter Properties]\n"
+ "Interface Type=%s\n"
+ "Hardware Address (MAC)=%02x:%02x:%02x:%02x:%02x:%02x\n"
+ "MTU=%d\n"
+ "[Transfer Details]\n"
+ "Bytes Received=%.0lf (%.2fMiB)\n"
+ "Bytes Sent=%.0lf (%.2fMiB)\n",
+ iface_type,
+ ni.mac[0], ni.mac[1],
+ ni.mac[2], ni.mac[3],
+ ni.mac[4], ni.mac[5],
+ ni.mtu,
+ recv_bytes, recv_mb,
+ trans_bytes, trans_mb);
- detailed = g_strdup_printf("[Network Adapter Properties]\n"
- "Interface Type=%s\n"
- "Hardware Address (MAC)=%02x:%02x:%02x:%02x:%02x:%02x\n"
- "MTU=%d\n"
- "[Transfer Details]\n"
- "Bytes Received=%ld (%.2fMiB)\n"
- "Bytes Sent=%ld (%.2fMiB)\n",
- iface_type,
- ni.mac[0], ni.mac[1],
- ni.mac[2], ni.mac[3],
- ni.mac[4], ni.mac[5],
- ni.mtu,
- recv_bytes, recv_mb,
- trans_bytes, trans_mb);
-
- if (ni.ip[0] || ni.mask[0] || ni.broadcast[0]) {
- detailed = h_strdup_cprintf("\n[Internet Protocol (IPv4)]\n"
- "IP Address=%s\n"
- "Mask=%s\n"
- "Broadcast Address=%s\n",
- detailed,
- ni.ip[0] ? ni.ip : "Not set",
- ni.mask[0] ? ni.mask : "Not set",
- ni.broadcast[0] ? ni.broadcast : "Not set");
- }
+#ifdef HAS_LINUX_WE
+ if (ni.is_wireless) {
+ gchar *txpower;
- g_hash_table_insert(moreinfo, devid, detailed);
+ if (ni.wi_has_txpower) {
+ gint mw, dbm;
+
+ if (ni.wi_txpower.flags & IW_TXPOW_MWATT) {
+ mw = ni.wi_txpower.value;
+ dbm = (int) ceil(10.0 * log10((double) ni.wi_txpower.value));
+ } else {
+ dbm = ni.wi_txpower.value;
+ mw = (int) floor(pow(10.0, ((double) dbm / 10.0)));
+ }
+
+ txpower = g_strdup_printf("%ddBm (%dmW)", dbm, mw);
+ } else {
+ txpower = g_strdup("Unknown");
+ }
+
+ detailed = h_strdup_cprintf("\n[Wireless Properties]\n"
+ "Network Name (SSID)=%s\n"
+ "Bit Rate=%dMb/s\n"
+ "Transmission Power=%s\n"
+ "Mode=%s\n"
+ "Status=%d\n"
+ "Link Quality=%d\n"
+ "Signal / Noise=%d / %d\n",
+ detailed,
+ ni.wi_essid,
+ ni.wi_rate / 1000000,
+ txpower,
+ wi_operation_modes[ni.wi_mode],
+ ni.wi_status,
+ ni.wi_quality_level,
+ ni.wi_signal_level,
+ ni.wi_noise_level);
+
+ g_free(txpower);
+ }
+#endif
+
+ if (ni.ip[0] || ni.mask[0] || ni.broadcast[0]) {
+ detailed =
+ h_strdup_cprintf("\n[Internet Protocol (IPv4)]\n"
+ "IP Address=%s\n" "Mask=%s\n"
+ "Broadcast Address=%s\n", detailed,
+ ni.ip[0] ? ni.ip : "Not set",
+ ni.mask[0] ? ni.mask : "Not set",
+ ni.broadcast[0] ? ni.
+ broadcast : "Not set");
+ }
+
+ g_hash_table_insert(moreinfo, devid, detailed);
}
}
fclose(proc_net);
}
-static void
-scan_net_interfaces(void)
+static void scan_net_interfaces(void)
{
/* FIXME: See if we're running Linux 2.6 and if /sys is mounted, then use
- that instead of /proc/net/dev */
+ that instead of /proc/net/dev */
/* remove old devices from global device table */
g_hash_table_foreach_remove(moreinfo, remove_net_devices, NULL);
diff --git a/arch/linux/common/os.h b/arch/linux/common/os.h
index e4f35e95..01853123 100644
--- a/arch/linux/common/os.h
+++ b/arch/linux/common/os.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -17,6 +17,34 @@
*/
static gchar *
+get_default_gcc_version(void)
+{
+ char *buf;
+
+ if (g_spawn_command_line_sync("gcc -v",
+ NULL,
+ &buf,
+ NULL,
+ NULL)) {
+ char *return_value;
+
+ if (!(return_value = strstr(buf, "gcc version "))) {
+ goto err;
+ }
+
+ return_value += sizeof("gcc version");
+ return_value = g_strdup_printf("GNU C Compiler version %s", return_value);
+
+ g_free(buf);
+
+ return return_value;
+ }
+
+err:
+ return g_strdup("Unknown");
+}
+
+static gchar *
get_libc_version(void)
{
FILE *libc;
@@ -66,27 +94,23 @@ detect_desktop_environment(OperatingSystem * os)
{
const gchar *tmp = g_getenv("GNOME_DESKTOP_SESSION_ID");
FILE *version;
- int maj, min;
+ 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-panel --version", "r");
+ version = popen("gnome-about --gnome-version", "r");
if (version) {
- char gnome[10];
-
- fscanf(version, "%s gnome-panel %d.%d", gnome, &maj, &min);
+ fscanf(version, "Version: %s", vers);
if (pclose(version))
goto unknown;
} else {
goto unknown;
}
- os->desktop =
- g_strdup_printf("GNOME %d.%d (session name: %s)", maj, min,
- tmp);
+ os->desktop = g_strdup_printf("GNOME %s", vers);
} else if (g_getenv("KDE_FULL_SESSION")) {
version = popen("kcontrol --version", "r");
if (version) {
@@ -94,14 +118,14 @@ detect_desktop_environment(OperatingSystem * os)
fgets(buf, 32, version);
- fscanf(version, "KDE: %d.%d", &maj, &min);
+ fscanf(version, "KDE: %s", vers);
if (pclose(version))
goto unknown;
} else {
goto unknown;
}
- os->desktop = g_strdup_printf("KDE %d.%d", maj, min);
+ os->desktop = g_strdup_printf("KDE %s", vers);
} else {
unknown:
if (!g_getenv("DISPLAY")) {
@@ -147,11 +171,13 @@ computer_get_os(void)
gchar buffer[128];
release = popen("lsb_release -d", "r");
- fgets(buffer, 128, release);
- pclose(release);
+ if (release) {
+ fgets(buffer, 128, release);
+ pclose(release);
- os->distro = buffer;
- os->distro = g_strdup(os->distro + strlen("Description:\t"));
+ os->distro = buffer;
+ os->distro = g_strdup(os->distro + strlen("Description:\t"));
+ }
}
for (i = 0;; i++) {
@@ -210,6 +236,7 @@ computer_get_os(void)
os->username = g_strdup_printf("%s (%s)",
g_get_user_name(), g_get_real_name());
os->libc = get_libc_version();
+ os->gcc = get_default_gcc_version();
scan_languages(os);
detect_desktop_environment(os);
diff --git a/arch/linux/common/pci.h b/arch/linux/common/pci.h
index 388ce9aa..a1ea1021 100644
--- a/arch/linux/common/pci.h
+++ b/arch/linux/common/pci.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -16,25 +16,47 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+/*
+ * TODO: This thing must be rewritten. We really should have a struct with all the
+ * PCI stuff we'll present to the user, and hash them by the PCI ID
+ * (domain:bus:device.function).
+ * This way we'll have ways to better organize the output, instead of relying
+ * on the order the information appears on lspci's output.
+ * Also, the "Resources" thing might be better implemented (and we won't need
+ * copies of information scattered everywhere like we do today).
+ */
+
+GHashTable *_pci_devices = NULL;
+
void
__scan_pci(void)
{
FILE *lspci;
gchar buffer[256], *buf, *strhash = NULL, *strdevice = NULL;
- gchar *category = NULL, *name = NULL, *icon;
+ gchar *category = NULL, *name = NULL, *icon, *lspci_path, *command_line;
gint n = 0, x = 0;
+
+ if ((lspci_path = find_program("lspci")) == NULL) {
+ goto pci_error;
+ } else {
+ command_line = g_strdup_printf("%s -v", lspci_path);
+ }
+
+ if (!_pci_devices) {
+ _pci_devices = g_hash_table_new(g_str_hash, g_str_equal);
+ }
buf = g_build_filename(g_get_home_dir(), ".hardinfo", "pci.ids", NULL);
if (!g_file_test(buf, G_FILE_TEST_EXISTS)) {
DEBUG("using system-provided PCI IDs");
g_free(buf);
- if (!(lspci = popen(LSPCI, "r"))) {
+ if (!(lspci = popen(command_line, "r"))) {
goto pci_error;
}
} else {
gchar *tmp;
- tmp = g_strdup_printf("%s -i '%s'", LSPCI, buf);
+ tmp = g_strdup_printf("%s -i '%s'", command_line, buf);
g_free(buf);
buf = tmp;
@@ -83,10 +105,21 @@ __scan_pci(void)
strdevice = h_strdup_cprintf("Latency=%d\n", strdevice, latency);
strdevice = h_strdup_cprintf("Bus Master=%s\n", strdevice, bus_master ? "Yes" : "No");
+ } else if (!strncmp(buf, "Kernel modules", 14)) {
+ WALK_UNTIL(' ');
+ WALK_UNTIL(':');
+ buf++;
+
+ strdevice = h_strdup_cprintf("Kernel modules=%s\n", strdevice, buf);
} else if (!strncmp(buf, "Subsystem", 9)) {
WALK_UNTIL(' ');
buf++;
- strdevice = h_strdup_cprintf("OEM Vendor=%s\n", strdevice, buf);
+ const gchar *oem_vendor_url = vendor_get_url(buf);
+ if (oem_vendor_url)
+ strdevice = h_strdup_cprintf("OEM Vendor=%s (%s)\n",
+ strdevice,
+ vendor_get_name(buf),
+ oem_vendor_url);
} else if (!strncmp(buf, "Capabilities", 12)
&& !strstr(buf, "only to root") &&
!strstr(buf, "access denied")) {
@@ -114,7 +147,7 @@ __scan_pci(void)
prefetch ? "prefetchable" :
"non-prefetchable");
- } else if (!strncmp(buf, "I/O", 3)) {
+ } else if (!strncmp(buf, "I/O ports at", 12)) {
guint io_addr, io_size;
sscanf(buf, "I/O ports at %x [size=%d]", &io_addr, &io_size);
@@ -122,7 +155,7 @@ __scan_pci(void)
strdevice =
h_strdup_cprintf("I/O ports at#%d=0x%x - 0x%x\n",
strdevice, ++x, io_addr,
- io_addr + io_size);
+ io_addr + io_size - 1);
} else if ((buf[0] >= '0' && buf[0] <= '9') && (buf[4] == ':' || buf[2] == ':')) {
gint bus, device, function, domain;
gpointer start, end;
@@ -164,6 +197,9 @@ __scan_pci(void)
else icon = "pci";
name = g_strdup(buf);
+ g_hash_table_insert(_pci_devices,
+ g_strdup_printf("0000:%02x:%02x.%x", bus, device, function),
+ name);
strhash = g_strdup_printf("PCI%d", n);
strdevice = g_strdup_printf("[Device Information]\n"
@@ -182,6 +218,9 @@ __scan_pci(void)
url);
}
+ g_hash_table_insert(_pci_devices,
+ g_strdup_printf("0000:%02x:%02x.%x", bus, device, function),
+ g_strdup(name));
pci_list = h_strdup_cprintf("$PCI%d$%s=%s\n", pci_list, n, category, name);
@@ -199,4 +238,7 @@ pci_error:
g_free(category);
g_free(name);
}
+
+ g_free(lspci_path);
+ g_free(command_line);
}
diff --git a/arch/linux/common/resources.h b/arch/linux/common/resources.h
new file mode 100644
index 00000000..20db65e9
--- /dev/null
+++ b/arch/linux/common/resources.h
@@ -0,0 +1,103 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2008 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
+ */
+
+gchar *_resources = NULL;
+
+#if GLIB_CHECK_VERSION(2,14,0)
+static GRegex *_regex_pci = NULL,
+ *_regex_module = NULL;
+
+static gchar *_resource_obtain_name(gchar *name)
+{
+ gchar *temp;
+
+ if (!_regex_pci && !_regex_module) {
+ _regex_pci = g_regex_new("^[0-9a-fA-F]{4}:[0-9a-fA-F]{2}:"
+ "[0-9a-fA-F]{2}\\.[0-9a-fA-F]{1}$",
+ 0, 0, NULL);
+ _regex_module = g_regex_new("^[0-9a-zA-Z\\_\\-]+$", 0, 0, NULL);
+ }
+
+ name = g_strstrip(name);
+
+ if (g_regex_match(_regex_pci, name, 0, NULL)) {
+ temp = module_call_method_param("devices::getPCIDeviceDescription", name);
+ if (temp) {
+ return temp;
+ }
+ } else if (g_regex_match(_regex_module, name, 0, NULL)) {
+ temp = module_call_method_param("computer::getKernelModuleDescription", name);
+ if (temp) {
+ return temp;
+ }
+ }
+
+ return g_strdup(name);
+}
+#else
+static gchar *_resource_obtain_name(gchar *name)
+{
+ return g_strdup(name);
+}
+#endif
+
+void scan_device_resources(gboolean reload)
+{
+ SCAN_START();
+ FILE *io;
+ gchar buffer[256];
+ gint i;
+
+ struct {
+ gchar *file;
+ gchar *description;
+ } resources[] = {
+ { "/proc/ioports", "[I/O Ports]\n" },
+ { "/proc/iomem", "[Memory]\n" },
+ { "/proc/dma", "[DMA]\n" }
+ };
+
+ g_free(_resources);
+ _resources = g_strdup("");
+
+ for (i = 0; i < G_N_ELEMENTS(resources); i++) {
+ if ((io = fopen(resources[i].file, "r"))) {
+ _resources = h_strconcat(_resources, resources[i].description, NULL);
+
+ while (fgets(buffer, 256, io)) {
+ gchar **temp = g_strsplit(buffer, ":", 2);
+ gchar *name = _resource_obtain_name(temp[1]);
+
+ _resources = h_strdup_cprintf("<tt>%s</tt>=%s\n", _resources,
+ temp[0], name);
+
+ g_strfreev(temp);
+ g_free(name);
+ }
+
+ fclose(io);
+ }
+ }
+
+ SCAN_END();
+}
+
+gchar *callback_device_resources(void)
+{
+ return _resources;
+}
diff --git a/arch/linux/common/samba.h b/arch/linux/common/samba.h
index 7c7d8bb7..65cdc890 100644
--- a/arch/linux/common/samba.h
+++ b/arch/linux/common/samba.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
diff --git a/arch/linux/common/sensors.h b/arch/linux/common/sensors.h
index 1c4fd69f..17637764 100644
--- a/arch/linux/common/sensors.h
+++ b/arch/linux/common/sensors.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -31,9 +31,16 @@ static void read_sensor_labels(gchar * driver)
g_free, g_free);
sensor_compute = g_hash_table_new(g_str_hash, g_str_equal);
- conf = fopen("/etc/sensors.conf", "r");
- if (!conf)
- return;
+ /* Try to open lm-sensors config file sensors3.conf */
+ conf = fopen("/etc/sensors3.conf", "r");
+
+ /* If it fails, try to open sensors.conf */
+ if (!conf) conf = fopen("/etc/sensors.conf", "r");
+
+ if (!conf) {
+ /* Cannot open config file. */
+ return;
+ }
while (fgets(buf, 256, conf)) {
line = buf;
@@ -100,7 +107,7 @@ static void read_sensor_labels(gchar * driver)
for (i = 1; chips[i]; i++) {
strend(chips[i], '*');
- if (g_str_has_prefix(driver, chips[i] + 1)) {
+ if (g_str_has_prefix(chips[i] + 1, driver)) {
lock = TRUE;
break;
}
diff --git a/arch/linux/common/storage.h b/arch/linux/common/storage.h
index 71c206cd..5208f028 100644
--- a/arch/linux/common/storage.h
+++ b/arch/linux/common/storage.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -36,6 +36,7 @@ __scan_scsi_devices(void)
gint scsi_id;
gint scsi_lun;
gchar *vendor = NULL, *revision = NULL, *model = NULL;
+ gchar *scsi_storage_list;
/* remove old devices from global device table */
g_hash_table_foreach_remove(moreinfo, remove_scsi_devices, NULL);
@@ -43,7 +44,7 @@ __scan_scsi_devices(void)
if (!g_file_test("/proc/scsi/scsi", G_FILE_TEST_EXISTS))
return;
- storage_list = g_strconcat(storage_list, "\n[SCSI Disks]\n", NULL);
+ scsi_storage_list = g_strdup("\n[SCSI Disks]\n");
proc_scsi = fopen("/proc/scsi/scsi", "r");
while (fgets(buffer, 256, proc_scsi)) {
@@ -55,29 +56,13 @@ __scan_scsi_devices(void)
n++;
} else if (!strncmp(buf, "Vendor: ", 8)) {
- char *p;
- char *rev = strstr(buf, "Rev: ");
-
- model = strstr(buf, "Model: ");
-
- if (model == NULL) {
- model = buf + strlen(buf);
- }
- p = model;
- while (*(--p) == ' ');
- *(++p) = 0;
- vendor = g_strdup(buf + 8);
-
- if (rev != NULL) {
- revision = g_strdup(rev + 5);
- } else {
- rev = model + strlen(model);
- }
- p = rev;
- while (*(--p) == ' ');
- *(++p) = 0;
- model = g_strdup_printf("%s %s", vendor, model + 7);
-
+ buf[17] = '\0';
+ buf[41] = '\0';
+ buf[53] = '\0';
+
+ vendor = g_strdup(g_strstrip(buf + 8));
+ model = g_strdup_printf("%s %s", vendor, g_strstrip(buf + 24));
+ revision = g_strdup(g_strstrip(buf + 46));
} else if (!strncmp(buf, "Type: ", 8)) {
char *p;
gchar *type = NULL, *icon = NULL;
@@ -98,43 +83,59 @@ __scan_scsi_devices(void)
{ "Direct-Access", "Disk", "hdd"},
{ "Sequential-Access", "Tape", "tape"},
{ "Printer", "Printer", "lpr"},
- { "WORM", "CD-ROM", "cd"},
- { "CD-ROM", "CD-ROM", "cd"},
+ { "WORM", "CD-ROM", "cdrom"},
+ { "CD-ROM", "CD-ROM", "cdrom"},
{ "Scanner", "Scanner", "scanner"},
+ { "Flash Disk", "USB Flash Disk", "usbfldisk" },
{ NULL, "Generic", "scsi"}
};
int i;
-
- for (i = 0; type2icon[i].type != NULL; i++)
- if (g_str_equal(buf + 8, type2icon[i].type))
- break;
-
- type = type2icon[i].label;
- icon = type2icon[i].icon;
+
+ if (strstr(model, "Flash Disk")) {
+ type = "Flash Disk";
+ icon = "usbfldisk";
+ } else {
+ for (i = 0; type2icon[i].type != NULL; i++)
+ if (g_str_equal(buf + 8, type2icon[i].type))
+ break;
+
+ type = type2icon[i].label;
+ icon = type2icon[i].icon;
+ }
}
gchar *devid = g_strdup_printf("SCSI%d", n);
- storage_list = h_strdup_cprintf("$%s$%s=\n", storage_list, devid, model);
+ scsi_storage_list = h_strdup_cprintf("$%s$%s=\n", scsi_storage_list, devid, model);
storage_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", storage_icons, devid, model, icon);
-
+
gchar *strhash = g_strdup_printf("[Device Information]\n"
- "Model=%s\n"
- "Vendor=%s (%s)\n"
- "Type=%s\n"
- "Revision=%s\n"
- "[SCSI Controller]\n"
- "Controller=scsi%d\n"
- "Channel=%d\n"
- "ID=%d\n" "LUN=%d\n",
- model,
- vendor_get_name(model),
- vendor_get_url(model),
- type,
- revision,
- scsi_controller,
- scsi_channel,
- scsi_id,
- scsi_lun);
+ "Model=%s\n", model);
+
+ const gchar *url = vendor_get_url(model);
+ if (url) {
+ strhash = h_strdup_cprintf("Vendor=%s (%s)\n",
+ strhash,
+ vendor_get_name(model),
+ url);
+ } else {
+ strhash = h_strdup_cprintf("Vendor=%s\n",
+ strhash,
+ vendor_get_name(model));
+ }
+
+ strhash = h_strdup_cprintf("Type=%s\n"
+ "Revision=%s\n"
+ "[SCSI Controller]\n"
+ "Controller=scsi%d\n"
+ "Channel=%d\n"
+ "ID=%d\n" "LUN=%d\n",
+ strhash,
+ type,
+ revision,
+ scsi_controller,
+ scsi_channel,
+ scsi_id,
+ scsi_lun);
g_hash_table_insert(moreinfo, devid, strhash);
g_free(model);
@@ -143,6 +144,11 @@ __scan_scsi_devices(void)
}
}
fclose(proc_scsi);
+
+ if (n) {
+ storage_list = h_strconcat(storage_list, scsi_storage_list, NULL);
+ g_free(scsi_storage_list);
+ }
}
static gboolean
@@ -158,12 +164,12 @@ __scan_ide_devices(void)
gchar *device, iface, *model, *media, *pgeometry = NULL, *lgeometry =
NULL;
gint n = 0, i = 0, cache, nn = 0;
- gchar *capab = NULL, *speed = NULL, *driver = NULL;
+ gchar *capab = NULL, *speed = NULL, *driver = NULL, *ide_storage_list;
/* remove old devices from global device table */
g_hash_table_foreach_remove(moreinfo, remove_ide_devices, NULL);
-
- storage_list = g_strconcat(storage_list, "\n[IDE Disks]\n", NULL);
+
+ ide_storage_list = g_strdup("\n[IDE Disks]\n");
iface = 'a';
for (i = 0; i <= 16; i++) {
@@ -285,24 +291,36 @@ __scan_ide_devices(void)
gchar *devid = g_strdup_printf("IDE%d", n);
- storage_list = h_strdup_cprintf("$%s$%s=\n", storage_list,
+ ide_storage_list = h_strdup_cprintf("$%s$%s=\n", ide_storage_list,
devid, model);
storage_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", storage_icons, devid,
model, g_str_equal(media, "cdrom") ? \
"cdrom" : "hdd");
-
+
gchar *strhash = g_strdup_printf("[Device Information]\n"
- "Model=%s\n"
- "Vendor=%s (%s)\n"
- "Device Name=hd%c\n"
- "Media=%s\n"
- "Cache=%dkb\n",
- model,
- vendor_get_name(model),
- vendor_get_url(model),
- iface,
- media,
- cache);
+ "Model=%s\n",
+ model);
+
+ const gchar *url = vendor_get_url(model);
+
+ if (url) {
+ strhash = h_strdup_cprintf("Vendor=%s (%s)\n",
+ strhash,
+ vendor_get_name(model),
+ url);
+ } else {
+ strhash = h_strdup_cprintf("Vendor=%s\n",
+ strhash,
+ vendor_get_name(model));
+ }
+
+ strhash = h_strdup_cprintf("Device Name=hd%c\n"
+ "Media=%s\n"
+ "Cache=%dkb\n",
+ strhash,
+ iface,
+ media,
+ cache);
if (driver) {
strhash = h_strdup_cprintf("%s\n", strhash, driver);
@@ -345,4 +363,9 @@ __scan_ide_devices(void)
iface++;
}
+
+ if (n) {
+ storage_list = h_strconcat(storage_list, ide_storage_list, NULL);
+ g_free(ide_storage_list);
+ }
}
diff --git a/arch/linux/common/uptime.h b/arch/linux/common/uptime.h
index 9225c85c..b2412cd2 100644
--- a/arch/linux/common/uptime.h
+++ b/arch/linux/common/uptime.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
diff --git a/arch/linux/common/usb.h b/arch/linux/common/usb.h
index f2592648..cb939ff8 100644
--- a/arch/linux/common/usb.h
+++ b/arch/linux/common/usb.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2008 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
@@ -15,7 +15,10 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
+/*
+ * FIXME:
+ * - listing with sysfs does not generate device hierarchy
+ */
static gboolean
remove_usb_devices(gpointer key, gpointer value, gpointer data)
{
@@ -23,8 +26,106 @@ remove_usb_devices(gpointer key, gpointer value, gpointer data)
}
static gchar *usb_list = NULL;
-void
-__scan_usb(void)
+
+void __scan_usb_sysfs_add_device(gchar * endpoint, int n)
+{
+ gchar *manufacturer, *product, *mxpwr, *tmp, *strhash;
+ gint bus, classid, vendor, prodid;
+ gfloat version, speed;
+
+ classid = h_sysfs_read_int(endpoint, "bDeviceClass");
+ vendor = h_sysfs_read_int(endpoint, "idVendor");
+ prodid = h_sysfs_read_int(endpoint, "idProduct");
+ bus = h_sysfs_read_int(endpoint, "busnum");
+ speed = h_sysfs_read_float(endpoint, "speed");
+ version = h_sysfs_read_float(endpoint, "version");
+
+ if (!(mxpwr = h_sysfs_read_string(endpoint, "bMaxPower"))) {
+ mxpwr = g_strdup("0 mA");
+ }
+
+ if (!(manufacturer = h_sysfs_read_string(endpoint, "manufacturer"))) {
+ manufacturer = g_strdup("Unknown");
+ }
+
+ if (!(product = h_sysfs_read_string(endpoint, "product"))) {
+ if (classid == 9) {
+ product = g_strdup_printf("USB %.2f Hub", version);
+ } else {
+ product = g_strdup_printf("Unknown USB %.2f Device (class %d)", version, classid);
+ }
+ }
+
+ const gchar *url = vendor_get_url(manufacturer);
+ if (url) {
+ tmp = g_strdup_printf("%s (%s)", vendor_get_name(manufacturer), url);
+
+ g_free(manufacturer);
+ manufacturer = tmp;
+ }
+
+ tmp = g_strdup_printf("USB%d", n);
+ usb_list = h_strdup_cprintf("$%s$%s=\n", usb_list, tmp, product);
+
+ strhash = g_strdup_printf("[Device Information]\n"
+ "Product=%s\n"
+ "Manufacturer=%s\n"
+ "Speed=%.2fMbit/s\n"
+ "Max Current=%s\n"
+ "[Misc]\n"
+ "USB Version=%.2f\n"
+ "Class=0x%x\n"
+ "Vendor=0x%x\n"
+ "Product ID=0x%x\n"
+ "Bus=%d\n",
+ product,
+ manufacturer,
+ speed,
+ mxpwr,
+ version, classid, vendor, prodid, bus);
+
+ g_hash_table_insert(moreinfo, tmp, strhash);
+
+ g_free(manufacturer);
+ g_free(product);
+ g_free(mxpwr);
+}
+
+void __scan_usb_sysfs(void)
+{
+ GDir *sysfs;
+ gchar *filename;
+ const gchar *sysfs_path = "/sys/class/usb_endpoint";
+ gint usb_device_number = 0;
+
+ if (!(sysfs = g_dir_open(sysfs_path, 0, NULL))) {
+ return;
+ }
+
+ if (usb_list) {
+ g_hash_table_foreach_remove(moreinfo, remove_usb_devices, NULL);
+ g_free(usb_list);
+ }
+ usb_list = g_strdup("[USB Devices]\n");
+
+ while ((filename = (gchar *) g_dir_read_name(sysfs))) {
+ gchar *endpoint =
+ g_build_filename(sysfs_path, filename, "device", NULL);
+ gchar *temp;
+
+ temp = g_build_filename(endpoint, "idVendor", NULL);
+ if (g_file_test(temp, G_FILE_TEST_EXISTS)) {
+ __scan_usb_sysfs_add_device(endpoint, ++usb_device_number);
+ }
+
+ g_free(temp);
+ g_free(endpoint);
+ }
+
+ g_dir_close(sysfs);
+}
+
+int __scan_usb_procfs(void)
{
FILE *dev;
gchar buffer[128];
@@ -36,13 +137,13 @@ __scan_usb(void)
dev = fopen("/proc/bus/usb/devices", "r");
if (!dev)
- return;
+ return 0;
if (usb_list) {
g_hash_table_foreach_remove(moreinfo, remove_usb_devices, NULL);
g_free(usb_list);
}
- usb_list = g_strdup("");
+ usb_list = g_strdup("[USB Devices]\n");
while (fgets(buffer, 128, dev)) {
tmp = buffer;
@@ -73,52 +174,60 @@ __scan_usb(void)
mxpwr = strstr(buffer, "MxPwr=") + 6;
tmp = g_strdup_printf("USB%d", ++n);
-
+
if (*product == '\0') {
- g_free(product);
- if (classid == 9) {
- product = g_strdup_printf("USB %.2f Hub", ver);
- } else {
- product = g_strdup_printf("Unknown USB %.2f Device (class %d)",
- ver, classid);
- }
+ g_free(product);
+ if (classid == 9) {
+ product = g_strdup_printf("USB %.2f Hub", ver);
+ } else {
+ product =
+ g_strdup_printf
+ ("Unknown USB %.2f Device (class %d)", ver,
+ classid);
+ }
}
-
+
if (classid == 9) { /* hub */
- usb_list = h_strdup_cprintf("[%s#%d]\n",
- usb_list, product, n);
- } else { /* everything else */
- usb_list = h_strdup_cprintf("$%s$%s=\n",
- usb_list, tmp, product);
-
- const gchar *url = vendor_get_url(manuf);
- if (url) {
- gchar *tmp = g_strdup_printf("%s (%s)", manuf, url);
- g_free(manuf);
- manuf = tmp;
- }
-
- gchar *strhash = g_strdup_printf("[Device Information]\n"
- "Product=%s\n"
- "Manufacturer=%s\n"
- "[Port #%d]\n"
- "Speed=%.2fMbit/s\n"
- "Max Current=%s\n"
- "[Misc]\n"
- "USB Version=%.2f\n"
- "Revision=%.2f\n"
- "Class=0x%x\n"
- "Vendor=0x%x\n"
- "Product ID=0x%x\n"
- "Bus=%d\n" "Level=%d\n",
- product, manuf,
- port, speed, mxpwr,
- ver, rev, classid,
- vendor, prodid, bus, level);
-
- g_hash_table_insert(moreinfo, tmp, strhash);
- }
+ usb_list = h_strdup_cprintf("[%s#%d]\n",
+ usb_list, product, n);
+ } else { /* everything else */
+ usb_list = h_strdup_cprintf("$%s$%s=\n",
+ usb_list, tmp, product);
+
+ const gchar *url = vendor_get_url(manuf);
+ if (url) {
+ gchar *tmp =
+ g_strdup_printf("%s (%s)", vendor_get_name(manuf),
+ url);
+ g_free(manuf);
+ manuf = tmp;
+ }
+
+ gchar *strhash = g_strdup_printf("[Device Information]\n"
+ "Product=%s\n",
+ product);
+ if (manuf && strlen(manuf))
+ strhash = h_strdup_cprintf("Manufacturer=%s\n",
+ strhash, manuf);
+
+ strhash = h_strdup_cprintf("[Port #%d]\n"
+ "Speed=%.2fMbit/s\n"
+ "Max Current=%s\n"
+ "[Misc]\n"
+ "USB Version=%.2f\n"
+ "Revision=%.2f\n"
+ "Class=0x%x\n"
+ "Vendor=0x%x\n"
+ "Product ID=0x%x\n"
+ "Bus=%d\n" "Level=%d\n",
+ strhash,
+ port, speed, mxpwr,
+ ver, rev, classid,
+ vendor, prodid, bus, level);
+
+ g_hash_table_insert(moreinfo, tmp, strhash);
+ }
g_free(manuf);
g_free(product);
@@ -128,4 +237,12 @@ __scan_usb(void)
}
fclose(dev);
+
+ return n;
+}
+
+void __scan_usb(void)
+{
+ if (!__scan_usb_procfs())
+ __scan_usb_sysfs();
}
diff --git a/arch/linux/ia64/processor.h b/arch/linux/ia64/processor.h
index bc1d7f08..d3d41519 100644
--- a/arch/linux/ia64/processor.h
+++ b/arch/linux/ia64/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -19,7 +19,7 @@
struct _Processor {
gchar *model_name;
gchar *vendor_id;
- gfloat bogomips;
+ gfloat bogomips, cpu_mhz;
gchar *strmodel;
};
@@ -50,6 +50,8 @@ __scan_processors(void)
}
g_strfreev(tmp);
}
+
+ processor->cpu_mhz = 0.0f;
fclose(cpuinfo);
diff --git a/arch/linux/ia64/resources.h b/arch/linux/ia64/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/ia64/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/m68k/processor.h b/arch/linux/m68k/processor.h
index 0fb59d24..6fbd8293 100644
--- a/arch/linux/m68k/processor.h
+++ b/arch/linux/m68k/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
diff --git a/arch/linux/m68k/resources.h b/arch/linux/m68k/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/m68k/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/mips/processor.h b/arch/linux/mips/processor.h
index 1aa7794d..cd10bd7a 100644
--- a/arch/linux/mips/processor.h
+++ b/arch/linux/mips/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
diff --git a/arch/linux/mips/resources.h b/arch/linux/mips/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/mips/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/parisc/processor.h b/arch/linux/parisc/processor.h
index 357f4d83..1712e523 100644
--- a/arch/linux/parisc/processor.h
+++ b/arch/linux/parisc/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
diff --git a/arch/linux/parisc/resources.h b/arch/linux/parisc/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/parisc/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/ppc/processor.h b/arch/linux/ppc/processor.h
index 6aa0f4ef..863b2eb7 100644
--- a/arch/linux/ppc/processor.h
+++ b/arch/linux/ppc/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
diff --git a/arch/linux/ppc/resources.h b/arch/linux/ppc/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/ppc/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/s390/processor.h b/arch/linux/s390/processor.h
index ee72b029..25dab8ca 100644
--- a/arch/linux/s390/processor.h
+++ b/arch/linux/s390/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -19,7 +19,7 @@
struct _Processor {
gchar *vendor_id, *model_name;
gint cache_size;
- gfloat bogomips;
+ gfloat bogomips, cpu_mhz;
};
static GSList *
@@ -48,6 +48,8 @@ __scan_processors(void)
}
g_strfreev(tmp);
}
+
+ processor->cpu_mhz = 0.0f;
processor->model_name = g_strconcat("S390 ", processor->vendor_id, NULL);
g_free(processor->vendor_id);
diff --git a/arch/linux/s390/resources.h b/arch/linux/s390/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/s390/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/sh/alsa.h b/arch/linux/sh/alsa.h
new file mode 120000
index 00000000..0216845a
--- /dev/null
+++ b/arch/linux/sh/alsa.h
@@ -0,0 +1 @@
+../../linux/common/alsa.h \ No newline at end of file
diff --git a/arch/linux/sh/battery.h b/arch/linux/sh/battery.h
new file mode 120000
index 00000000..e4c794f2
--- /dev/null
+++ b/arch/linux/sh/battery.h
@@ -0,0 +1 @@
+../../linux/common/battery.h \ No newline at end of file
diff --git a/arch/linux/sh/boots.h b/arch/linux/sh/boots.h
new file mode 120000
index 00000000..e7ef0408
--- /dev/null
+++ b/arch/linux/sh/boots.h
@@ -0,0 +1 @@
+../../linux/common/boots.h \ No newline at end of file
diff --git a/arch/linux/sh/devmemory.h b/arch/linux/sh/devmemory.h
new file mode 120000
index 00000000..5b1b866f
--- /dev/null
+++ b/arch/linux/sh/devmemory.h
@@ -0,0 +1 @@
+../../linux/common/devmemory.h \ No newline at end of file
diff --git a/arch/linux/sh/filesystem.h b/arch/linux/sh/filesystem.h
new file mode 120000
index 00000000..6b325b40
--- /dev/null
+++ b/arch/linux/sh/filesystem.h
@@ -0,0 +1 @@
+../../linux/common/filesystem.h \ No newline at end of file
diff --git a/arch/linux/sh/inputdevices.h b/arch/linux/sh/inputdevices.h
new file mode 120000
index 00000000..b9226a29
--- /dev/null
+++ b/arch/linux/sh/inputdevices.h
@@ -0,0 +1 @@
+../../linux/common/inputdevices.h \ No newline at end of file
diff --git a/arch/linux/sh/loadavg.h b/arch/linux/sh/loadavg.h
new file mode 120000
index 00000000..daaed6d5
--- /dev/null
+++ b/arch/linux/sh/loadavg.h
@@ -0,0 +1 @@
+../../linux/common/loadavg.h \ No newline at end of file
diff --git a/arch/linux/sh/memory.h b/arch/linux/sh/memory.h
new file mode 120000
index 00000000..5ffc013e
--- /dev/null
+++ b/arch/linux/sh/memory.h
@@ -0,0 +1 @@
+../../linux/common/memory.h \ No newline at end of file
diff --git a/arch/linux/sh/modules.h b/arch/linux/sh/modules.h
new file mode 120000
index 00000000..8ce5a808
--- /dev/null
+++ b/arch/linux/sh/modules.h
@@ -0,0 +1 @@
+../../linux/common/modules.h \ No newline at end of file
diff --git a/arch/linux/sh/net.h b/arch/linux/sh/net.h
new file mode 120000
index 00000000..72d77b26
--- /dev/null
+++ b/arch/linux/sh/net.h
@@ -0,0 +1 @@
+../../linux/common/net.h \ No newline at end of file
diff --git a/arch/linux/sh/nfs.h b/arch/linux/sh/nfs.h
new file mode 120000
index 00000000..3d1048da
--- /dev/null
+++ b/arch/linux/sh/nfs.h
@@ -0,0 +1 @@
+../../linux/common/nfs.h \ No newline at end of file
diff --git a/arch/linux/sh/os.h b/arch/linux/sh/os.h
new file mode 120000
index 00000000..ef547be5
--- /dev/null
+++ b/arch/linux/sh/os.h
@@ -0,0 +1 @@
+../../linux/common/os.h \ No newline at end of file
diff --git a/arch/linux/sh/pci.h b/arch/linux/sh/pci.h
new file mode 120000
index 00000000..63760048
--- /dev/null
+++ b/arch/linux/sh/pci.h
@@ -0,0 +1 @@
+../../linux/common/pci.h \ No newline at end of file
diff --git a/arch/linux/sh/processor.h b/arch/linux/sh/processor.h
new file mode 100644
index 00000000..de33ee91
--- /dev/null
+++ b/arch/linux/sh/processor.h
@@ -0,0 +1,78 @@
+/*
+ * 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
+ */
+
+struct _Processor {
+ gchar *model_name;
+ gchar *vendor_id;
+ gfloat bogomips, cpu_mhz;
+};
+
+static GSList *
+__scan_processors(void)
+{
+ Processor *processor;
+ FILE *cpuinfo;
+ gchar buffer[128];
+
+ cpuinfo = fopen("/proc/cpuinfo", "r");
+ if (!cpuinfo)
+ return NULL;
+
+ processor = g_new0(Processor, 1);
+ while (fgets(buffer, 128, cpuinfo)) {
+ gchar **tmp = g_strsplit(buffer, ":", 2);
+
+ if (tmp[0] && tmp[1]) {
+ tmp[0] = g_strstrip(tmp[0]);
+ tmp[1] = g_strstrip(tmp[1]);
+
+ get_str("machine", processor->model_name);
+ get_str("cpu type", processor->vendor_id);
+ get_float("bogomips", processor->bogomips);
+ processor->cpu_mhz = processor->bogomips;
+ }
+ g_strfreev(tmp);
+ }
+
+ fclose(cpuinfo);
+
+ return g_slist_append(NULL, processor);
+}
+
+static gchar *
+processor_get_info(GSList *processors)
+{
+ Processor *processor = (Processor *)processors->data;
+
+ return g_strdup_printf("[Processor]\n"
+ "System Type=%s\n"
+ "CPU Model=%s\n"
+ "Frequency=%.2fMHz\n"
+ "BogoMIPS=%.2f\n"
+ "Byte Order=%s\n",
+ processor->model_name,
+ processor->vendor_id,
+ processor->cpu_mhz,
+ processor->bogomips,
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ "Little Endian"
+#else
+ "Big Endian"
+#endif
+ );
+}
diff --git a/arch/linux/sh/resources.h b/arch/linux/sh/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/sh/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/sh/samba.h b/arch/linux/sh/samba.h
new file mode 120000
index 00000000..9227f722
--- /dev/null
+++ b/arch/linux/sh/samba.h
@@ -0,0 +1 @@
+../../linux/common/samba.h \ No newline at end of file
diff --git a/arch/linux/sh/sensors.h b/arch/linux/sh/sensors.h
new file mode 120000
index 00000000..35e5f37a
--- /dev/null
+++ b/arch/linux/sh/sensors.h
@@ -0,0 +1 @@
+../../linux/common/sensors.h \ No newline at end of file
diff --git a/arch/linux/sh/storage.h b/arch/linux/sh/storage.h
new file mode 120000
index 00000000..55b68de3
--- /dev/null
+++ b/arch/linux/sh/storage.h
@@ -0,0 +1 @@
+../../linux/common/storage.h \ No newline at end of file
diff --git a/arch/linux/sh/uptime.h b/arch/linux/sh/uptime.h
new file mode 120000
index 00000000..78c026ff
--- /dev/null
+++ b/arch/linux/sh/uptime.h
@@ -0,0 +1 @@
+../../linux/common/uptime.h \ No newline at end of file
diff --git a/arch/linux/sh/usb.h b/arch/linux/sh/usb.h
new file mode 120000
index 00000000..8b8fbb5d
--- /dev/null
+++ b/arch/linux/sh/usb.h
@@ -0,0 +1 @@
+../../linux/common/usb.h \ No newline at end of file
diff --git a/arch/linux/sparc/processor.h b/arch/linux/sparc/processor.h
index 04e38c33..0272c963 100644
--- a/arch/linux/sparc/processor.h
+++ b/arch/linux/sparc/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -19,6 +19,7 @@
struct _Processor {
gchar *model_name;
gchar *has_fpu;
+ gfloat cpu_mhz;
};
static GSList *
@@ -48,6 +49,8 @@ __scan_processors(void)
fclose(cpuinfo);
+ processor->cpu_mhz = 0.0f;
+
return g_slist_append(NULL, processor);
}
diff --git a/arch/linux/sparc/resources.h b/arch/linux/sparc/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/sparc/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/x86/boots.h b/arch/linux/x86/boots.h
index 97384500..e7ef0408 120000
--- a/arch/linux/x86/boots.h
+++ b/arch/linux/x86/boots.h
@@ -1 +1 @@
-../../../arch/linux/common/boots.h \ No newline at end of file
+../../linux/common/boots.h \ No newline at end of file
diff --git a/arch/linux/x86/dmi.h b/arch/linux/x86/dmi.h
new file mode 120000
index 00000000..1a285fbd
--- /dev/null
+++ b/arch/linux/x86/dmi.h
@@ -0,0 +1 @@
+../../../arch/linux/common/dmi.h \ No newline at end of file
diff --git a/arch/linux/x86/net.h b/arch/linux/x86/net.h
index 488b5ae3..72d77b26 120000
--- a/arch/linux/x86/net.h
+++ b/arch/linux/x86/net.h
@@ -1 +1 @@
-../../../arch/linux/common/net.h \ No newline at end of file
+../../linux/common/net.h \ No newline at end of file
diff --git a/arch/linux/x86/processor.h b/arch/linux/x86/processor.h
index fd8711af..97fa4555 100644
--- a/arch/linux/x86/processor.h
+++ b/arch/linux/x86/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * 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
@@ -16,6 +16,17 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+typedef struct _ProcessorCache ProcessorCache;
+
+struct _ProcessorCache {
+ gint level;
+ gint number_of_sets;
+ gint physical_line_partition;
+ gint size;
+ gchar *type;
+ gint ways_of_associativity;
+};
+
struct _Processor {
gchar *model_name;
gchar *vendor_id;
@@ -30,6 +41,8 @@ struct _Processor {
gchar *strmodel;
gint id;
+
+ GSList *cache;
};
/*
@@ -148,12 +161,91 @@ static void get_processor_strfamily(Processor * processor)
}
}
+static gchar *__cache_get_info_as_string(Processor *processor)
+{
+ gchar *result = g_strdup("");
+ GSList *cache_list;
+ ProcessorCache *cache;
+
+ if (!processor->cache) {
+ return g_strdup("Cache information not available=\n");
+ }
+
+ for (cache_list = processor->cache; cache_list; cache_list = cache_list->next) {
+ cache = (ProcessorCache *)cache_list->data;
+
+ result = h_strdup_cprintf("Level %d (%s)=%d-way set-associative, %d sets, %dKB size\n",
+ result,
+ cache->level,
+ cache->type,
+ cache->ways_of_associativity,
+ cache->number_of_sets,
+ cache->size);
+ }
+
+ return result;
+}
+
+static void __cache_obtain_info(Processor *processor, gint processor_number)
+{
+ ProcessorCache *cache;
+ gchar *endpoint, *entry, *index;
+ gint i;
+
+ endpoint = g_strdup_printf("/sys/devices/system/cpu/cpu%d/cache", processor_number);
+
+ for (i = 0; ; i++) {
+ cache = g_new0(ProcessorCache, 1);
+
+ index = g_strdup_printf("index%d/", i);
+
+ entry = g_strconcat(index, "type", NULL);
+ cache->type = h_sysfs_read_string(endpoint, entry);
+ g_free(entry);
+
+ if (!cache->type) {
+ g_free(cache);
+ g_free(index);
+ goto fail;
+ }
+
+ entry = g_strconcat(index, "level", NULL);
+ cache->level = h_sysfs_read_int(endpoint, entry);
+ g_free(entry);
+
+ entry = g_strconcat(index, "number_of_sets", NULL);
+ cache->number_of_sets = h_sysfs_read_int(endpoint, entry);
+ g_free(entry);
+
+ entry = g_strconcat(index, "physical_line_partition", NULL);
+ cache->physical_line_partition = h_sysfs_read_int(endpoint, entry);
+ g_free(entry);
+
+ entry = g_strconcat(index, "size", NULL);
+ cache->size = h_sysfs_read_int(endpoint, entry);
+ g_free(entry);
+
+
+ entry = g_strconcat(index, "ways_of_associativity", NULL);
+ cache->ways_of_associativity = h_sysfs_read_int(endpoint, entry);
+ g_free(entry);
+
+ g_free(index);
+
+ processor->cache = g_slist_append(processor->cache, cache);
+ }
+
+fail:
+ g_free(endpoint);
+}
+
static GSList *__scan_processors(void)
{
GSList *procs = NULL;
Processor *processor = NULL;
FILE *cpuinfo;
gchar buffer[256];
+ gint processor_number = 0;
cpuinfo = fopen("/proc/cpuinfo", "r");
if (!cpuinfo)
@@ -169,6 +261,8 @@ static GSList *__scan_processors(void)
}
processor = g_new0(Processor, 1);
+
+ __cache_obtain_info(processor, processor_number++);
}
if (tmp[0] && tmp[1]) {
@@ -208,6 +302,12 @@ static GSList *__scan_processors(void)
return procs;
}
+/*
+ * Sources:
+ * - Linux' cpufeature.h
+ * - http://gentoo-wiki.com/Cpuinfo
+ * - Intel IA-32 Architecture Software Development Manual
+ */
static struct {
char *name, *meaning;
} flag_meaning[] = {
@@ -254,6 +354,68 @@ static struct {
{ "tm", "Thermal Monitor" },
{ "pbe", "Pending Break Enable" },
{ "pb", "Pending Break Enable" },
+ { "pn", "Processor serial number" },
+ { "ds", "Debug Store" },
+ { "xmm2", "Streaming SIMD Extensions-2" },
+ { "xmm3", "Streaming SIMD Extensions-3" },
+ { "selfsnoop", "CPU self snoop" },
+ { "rdtscp", "RDTSCP" },
+ { "recovery", "CPU in recovery mode" },
+ { "longrun", "Longrun power control" },
+ { "lrti", "LongRun table interface" },
+ { "cxmmx", "Cyrix MMX extensions" },
+ { "k6_mtrr", "AMD K6 nonstandard MTRRs" },
+ { "cyrix_arr", "Cyrix ARRs (= MTRRs)" },
+ { "centaur_mcr","Centaur MCRs (= MTRRs)" },
+ { "constant_tsc","TSC ticks at a constant rate" },
+ { "up", "smp kernel running on up" },
+ { "fxsave_leak","FXSAVE leaks FOP/FIP/FOP" },
+ { "arch_perfmon","Intel Architectural PerfMon" },
+ { "pebs", "Precise-Event Based Sampling" },
+ { "bts", "Branch Trace Store" },
+ { "sync_rdtsc", "RDTSC synchronizes the CPU" },
+ { "rep_good", "rep microcode works well on this CPU" },
+ { "mwait", "Monitor/Mwait support" },
+ { "ds_cpl", "CPL Qualified Debug Store" },
+ { "est", "Enhanced SpeedStep" },
+ { "tm2", "Thermal Monitor 2" },
+ { "cid", "Context ID" },
+ { "xtpr", "Send Task Priority Messages" },
+ { "xstore", "on-CPU RNG present (xstore insn)" },
+ { "xstore_en", "on-CPU RNG enabled" },
+ { "xcrypt", "on-CPU crypto (xcrypt insn)" },
+ { "xcrypt_en", "on-CPU crypto enabled" },
+ { "ace2", "Advanced Cryptography Engine v2" },
+ { "ace2_en", "ACE v2 enabled" },
+ { "phe", "PadLock Hash Engine" },
+ { "phe_en", "PHE enabled" },
+ { "pmm", "PadLock Montgomery Multiplier" },
+ { "pmm_en", "PMM enabled" },
+ { "lahf_lm", "LAHF/SAHF in long mode" },
+ { "cmp_legacy", "HyperThreading not valid" },
+ { "lm", "LAHF/SAHF in long mode" },
+ { "ds_cpl", "CPL Qualified Debug Store" },
+ { "vmx", "Virtualization support (Intel)" },
+ { "svm", "Virtualization support (AMD)" },
+ { "est", "Enhanced SpeedStep" },
+ { "tm2", "Thermal Monitor 2" },
+ { "ssse3", "Supplemental Streaming SIMD Extension 3" },
+ { "cx16", "CMPXCHG16B instruction" },
+ { "xptr", "Send Task Priority Messages" },
+ { "pebs", "Precise Event Based Sampling" },
+ { "bts", "Branch Trace Store" },
+ { "ida", "Intel Dynamic Acceleration" },
+ { "arch_perfmon","Intel Architectural PerfMon" },
+ { "pni", "Streaming SIMD Extension 3 (Prescott New Instruction)" },
+ { "rep_good", "rep microcode works well on this CPU" },
+ { "ts", "Thermal Sensor" },
+ { "sse3", "Streaming SIMD Extension 3" },
+ { "sse4", "Streaming SIMD Extension 4" },
+ { "tni", "Tejas New Instruction" },
+ { "nni", "Nehalem New Instruction" },
+ { "tpr", "Task Priority Register" },
+ { "vid", "Voltage Identifier" },
+ { "fid", "Frequency Identifier" },
{ NULL, NULL },
};
@@ -289,9 +451,11 @@ gchar *processor_get_capabilities_from_flags(gchar * strflags)
static gchar *processor_get_detailed_info(Processor * processor)
{
- gchar *tmp, *ret;
+ gchar *tmp, *ret, *cache_info;
tmp = processor_get_capabilities_from_flags(processor->flags);
+ cache_info = __cache_get_info_as_string(processor);
+
ret = g_strdup_printf("[Processor]\n"
"Name=%s\n"
"Family, model, stepping=%d, %d, %d (%s)\n"
@@ -307,6 +471,8 @@ static gchar *processor_get_detailed_info(Processor * processor)
"F00F Bug=%s\n"
"Coma Bug=%s\n"
"Has FPU=%s\n"
+ "[Cache]\n"
+ "%s\n"
"[Capabilities]\n"
"%s",
processor->model_name,
@@ -322,15 +488,17 @@ static gchar *processor_get_detailed_info(Processor * processor)
#else
"Big Endian",
#endif
- processor->bug_fdiv ? processor->bug_fdiv : "yes",
- processor->bug_hlt ? processor->bug_hlt : "yes",
- processor->bug_f00f ? processor->bug_f00f : "yes",
- processor->bug_coma ? processor->bug_coma : "yes",
+ processor->bug_fdiv ? processor->bug_fdiv : "no",
+ processor->bug_hlt ? processor->bug_hlt : "no",
+ processor->bug_f00f ? processor->bug_f00f : "no",
+ processor->bug_coma ? processor->bug_coma : "no",
processor->has_fpu ? processor->has_fpu : "no",
+ cache_info,
tmp);
g_free(tmp);
+ g_free(cache_info);
+
return ret;
-
}
static gchar *processor_get_info(GSList * processors)
diff --git a/arch/linux/x86/resources.h b/arch/linux/x86/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/x86/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file