aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorSimon Quigley <tsimonq2@ubuntu.com>2017-11-25 13:35:47 -0600
committerSimon Quigley <tsimonq2@ubuntu.com>2017-11-25 13:35:47 -0600
commit11e616945340e87a1f567ab92e6dfac3068875b1 (patch)
tree451c1385230f29d3f4deef777b41609bed6e8090 /modules
parent9a9db98089717990cd5e0eef529f6bb0819ebe46 (diff)
New upstream version 0.5.1+git20171103
Diffstat (limited to 'modules')
-rw-r--r--modules/benchmark.c139
-rw-r--r--modules/benchmark/bench_results.c413
-rw-r--r--modules/computer.c110
-rw-r--r--modules/computer/boots.c58
-rw-r--r--modules/computer/display.c83
-rw-r--r--modules/computer/uptime.c1
-rw-r--r--modules/devices.c41
-rw-r--r--modules/devices/arm/processor.c20
-rw-r--r--modules/devices/cpu_util.c225
-rw-r--r--modules/devices/cpubits.c113
-rw-r--r--modules/devices/devicetree.c130
-rw-r--r--modules/devices/devicetree/dt_util.c1040
-rw-r--r--modules/devices/devmemory.c14
-rw-r--r--modules/devices/dmi.c176
-rw-r--r--modules/devices/usb.c1
-rw-r--r--modules/network/net.c27
-rw-r--r--modules/network/samba.c50
17 files changed, 864 insertions, 1777 deletions
diff --git a/modules/benchmark.c b/modules/benchmark.c
index 50fddf4d..857904a8 100644
--- a/modules/benchmark.c
+++ b/modules/benchmark.c
@@ -30,6 +30,8 @@
#include "benchmark.h"
+#include "benchmark/bench_results.c"
+
void scan_fft(gboolean reload);
void scan_raytr(gboolean reload);
void scan_bfsh(gboolean reload);
@@ -186,14 +188,62 @@ static gchar *clean_cpuname(gchar *cpuname)
return tmp;
}
+gchar *hi_more_info(gchar * entry)
+{
+ gchar *info = moreinfo_lookup_with_prefix("BENCH", entry);
+ if (info)
+ return g_strdup(info);
+ return g_strdup("?");
+}
+
+gchar *hi_get_field(gchar * field)
+{
+ gchar *info = moreinfo_lookup_with_prefix("BENCH", field);
+ if (info)
+ return g_strdup(info);
+ return g_strdup(field);
+}
+
+static void br_mi_add(char **results_list, bench_result *b, gboolean select) {
+ gchar *ckey, *rkey;
+
+ ckey = hardinfo_clean_label(b->machine->cpu_name, 0);
+ rkey = strdup(b->machine->mid);
+
+ *results_list = h_strdup_cprintf("$%s%s$%s=%.2f|%s\n", *results_list,
+ select ? "*" : "", rkey, ckey,
+ b->result, b->machine->cpu_config);
+
+ moreinfo_add_with_prefix("BENCH", rkey, bench_result_more_info(b) );
+
+ g_free(ckey);
+ g_free(rkey);
+}
+
static gchar *__benchmark_include_results(gdouble result,
const gchar * benchmark,
ShellOrderType order_type)
{
+ bench_result *b = NULL;
GKeyFile *conf;
- gchar **machines;
+ gchar **machines, *temp = NULL;;
gchar *path, *results = g_strdup(""), *return_value, *processor_frequency, *processor_name;
- int i;
+ int i, n_threads;
+
+ moreinfo_del_with_prefix("BENCH");
+
+ if (result > 0.0) {
+ temp = module_call_method("devices::getProcessorCount");
+ n_threads = temp ? atoi(temp) : 1;
+ g_free(temp); temp = NULL;
+
+ b = bench_result_this_machine(benchmark, result, n_threads);
+ br_mi_add(&results, b, 1);
+
+ temp = bench_result_benchmarkconf_line(b);
+ printf("[%s]\n%s", benchmark, temp);
+ g_free(temp); temp = NULL;
+ }
conf = g_key_file_new();
@@ -205,56 +255,40 @@ static gchar *__benchmark_include_results(gdouble result,
}
g_key_file_load_from_file(conf, path, 0, NULL);
+ g_key_file_set_list_separator(conf, '|');
machines = g_key_file_get_keys(conf, benchmark, NULL, NULL);
for (i = 0; machines && machines[i]; i++) {
- gchar *value, *cleaned_machine;
+ gchar **values;
+ bench_result *sbr;
- value = g_key_file_get_value(conf, benchmark, machines[i], NULL);
- cleaned_machine = clean_cpuname(machines[i]);
- results = h_strconcat(results, cleaned_machine, "=", value, "\n", NULL);
+ values = g_key_file_get_string_list(conf, benchmark, machines[i], NULL, NULL);
- g_free(value);
- g_free(cleaned_machine);
+ sbr = bench_result_benchmarkconf(benchmark, machines[i], values);
+ br_mi_add(&results, sbr, 0);
+
+ bench_result_free(sbr);
+ g_strfreev(values);
}
g_strfreev(machines);
g_free(path);
g_key_file_free(conf);
- if (result > 0.0f) {
- processor_name = module_call_method("devices::getProcessorName");
- processor_frequency = module_call_method("devices::getProcessorFrequencyDesc");
- return_value = g_strdup_printf("[$ShellParam$]\n"
- "Zebra=1\n"
- "OrderType=%d\n"
- "ViewType=3\n"
- "ColumnTitle$Extra1=%s\n" /* CPU Clock */
- "ColumnTitle$Progress=%s\n" /* Results */
- "ColumnTitle$TextValue=%s\n" /* CPU */
- "ShowColumnHeaders=true\n"
- "[%s]\n"
- "<big><b>%s</b></big>=%.3f|%s\n"
- "%s", order_type,
- _("CPU Config"), _("Results"), _("CPU"),
- benchmark,
- processor_name, result, processor_frequency, results);
- g_free(processor_frequency);
- g_free(processor_name);
- } else {
- return_value = g_strdup_printf("[$ShellParam$]\n"
- "Zebra=1\n"
- "OrderType=%d\n"
- "ViewType=3\n"
- "ColumnTitle$Extra1=%s\n" /* CPU Clock */
- "ColumnTitle$Progress=%s\n" /* Results */
- "ColumnTitle$TextValue=%s\n" /* CPU */
- "ShowColumnHeaders=true\n"
- "[%s]\n%s",
- order_type,
- _("CPU Config"), _("Results"), _("CPU"),
- benchmark, results);
- }
+ return_value = g_strdup_printf("[$ShellParam$]\n"
+ "Zebra=1\n"
+ "OrderType=%d\n"
+ "ViewType=4\n"
+ "ColumnTitle$Extra1=%s\n" /* CPU Clock */
+ "ColumnTitle$Progress=%s\n" /* Results */
+ "ColumnTitle$TextValue=%s\n" /* CPU */
+ "ShowColumnHeaders=true\n"
+ "[%s]\n%s",
+ order_type,
+ _("CPU Config"), _("Results"), _("CPU"),
+ benchmark, results);
+
+ bench_result_free(b);
return return_value;
}
@@ -388,6 +422,27 @@ static void do_benchmark(void (*benchmark_function)(void), int entry)
bench_image = icon_cache_get_image("benchmark.png");
gtk_widget_show(bench_image);
+#if GTK_CHECK_VERSION(3, 0, 0)
+ GtkWidget *button;
+ GtkWidget *content_area;
+ GtkWidget *hbox;
+ GtkWidget *label;
+
+ bench_dialog = gtk_dialog_new_with_buttons("",
+ NULL,
+ GTK_DIALOG_MODAL,
+ _("Cancel"),
+ GTK_RESPONSE_ACCEPT,
+ NULL);
+ content_area = gtk_dialog_get_content_area(GTK_DIALOG(bench_dialog));
+ label = gtk_label_new(_("Benchmarking. Please do not move your mouse " \
+ "or press any keys."));
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_box_pack_start(GTK_BOX(hbox), bench_image, TRUE, TRUE, 5);
+ gtk_box_pack_end(GTK_BOX(hbox), label, TRUE, TRUE, 5);
+ gtk_container_add(GTK_CONTAINER (content_area), hbox);
+ gtk_widget_show_all(bench_dialog);
+#else
bench_dialog = gtk_message_dialog_new(GTK_WINDOW(shell_get_main_shell()->window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_INFO,
@@ -398,6 +453,7 @@ static void do_benchmark(void (*benchmark_function)(void), int entry)
gtk_dialog_add_buttons(GTK_DIALOG(bench_dialog),
_("Cancel"), GTK_RESPONSE_ACCEPT, NULL);
gtk_message_dialog_set_image(GTK_MESSAGE_DIALOG(bench_dialog), bench_image);
+#endif
while (gtk_events_pending()) {
gtk_main_iteration();
@@ -686,4 +742,3 @@ gchar **hi_module_get_dependencies(void)
return deps;
}
-
diff --git a/modules/benchmark/bench_results.c b/modules/benchmark/bench_results.c
new file mode 100644
index 00000000..226f595c
--- /dev/null
+++ b/modules/benchmark/bench_results.c
@@ -0,0 +1,413 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2017 Leandro A. F. Pereira <leandro@hardinfo.org>
+ * This file:
+ * Copyright (C) 2017 Burt P. <pburt0@gmail.com>
+ *
+ * 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
+ */
+
+/*/ Used for an unknown value. Having it in only one place cleans up the .po line references */
+static const char *unk = N_("(Unknown)");
+
+typedef struct {
+ char *board;
+ int memory_kiB;
+ char *cpu_name;
+ char *cpu_desc;
+ char *cpu_config;
+ char *ogl_renderer;
+ int processors;
+ int cores;
+ int threads;
+ char *mid;
+} simple_machine;
+
+typedef struct {
+ char *name;
+ float result;
+ int threads;
+ simple_machine *machine;
+ int legacy; /* an old benchmark.conf result */
+} bench_result;
+
+static char *cpu_config_retranslate(char *str, int force_en, int replacing) {
+ char *new_str = NULL;
+ char *mhz = (force_en) ? "MHz" : _("MHz");
+ char *c = str, *tmp;
+ int t;
+ float f;
+
+ if (str != NULL) {
+ new_str = strdup("");
+ if (strchr(str, 'x')) {
+ while (c != NULL && sscanf(c, "%dx %f", &t, &f) ) {
+ tmp = g_strdup_printf("%s%s%dx %.2f %s",
+ new_str, strlen(new_str) ? " + " : "",
+ t, f, mhz );
+ free(new_str);
+ new_str = tmp;
+ c = strchr(c+1, '+');
+ }
+ } else {
+ sscanf(c, "%f", &f);
+ tmp = g_strdup_printf("%s%s%dx %.2f %s",
+ new_str, strlen(new_str) ? " + " : "",
+ 1, f, mhz );
+ free(new_str);
+ new_str = tmp;
+ }
+
+ if (replacing)
+ free(str);
+ }
+ return new_str;
+}
+
+/* "2x 1400.00 MHz + 2x 800.00 MHz" -> 4400.0 */
+static float cpu_config_val(char *str) {
+ char *c = str;
+ int t;
+ float f, r = 0.0;
+ if (str != NULL) {
+ if (strchr(str, 'x')) {
+ while (c != NULL && sscanf(c, "%dx %f", &t, &f) ) {
+ r += f * t;
+ c = strchr(c+1, '+');
+ }
+ } else {
+ sscanf(c, "%f", &r);
+ }
+ }
+ return r;
+}
+
+static int cpu_config_cmp(char *str0, char *str1) {
+ float r0, r1;
+ r0 = cpu_config_val(str0);
+ r1 = cpu_config_val(str1);
+ if (r0 == r1) return 0;
+ if (r0 < r1) return -1;
+ return 1;
+}
+
+static int cpu_config_is_close(char *str0, char *str1) {
+ float r0, r1, r1n;
+ r0 = cpu_config_val(str0);
+ r1 = cpu_config_val(str1);
+ r1n = r1 * .9;
+ if (r0 > r1n && r0 < r1)
+ return 1;
+ return 0;
+}
+
+static gen_machine_id(simple_machine *m) {
+ char *s;
+ if (m) {
+ if (m->mid != NULL)
+ free(m->mid);
+ /* Don't try and translate unknown. The mid string needs to be made of all
+ * untranslated elements.*/
+ m->mid = g_strdup_printf("%s;%s;%.2f",
+ (m->board != NULL) ? m->board : "(Unknown)", m->cpu_name, cpu_config_val(m->cpu_config) );
+ s = m->mid;
+ while (*s != 0) {
+ if (!isalnum(*s)) {
+ if (*s != ';'
+ && *s != '('
+ && *s != '('
+ && *s != ')')
+ *s = '_';
+ }
+ s++;
+ }
+ }
+}
+
+simple_machine *simple_machine_new() {
+ simple_machine *m = NULL;
+ m = malloc(sizeof(simple_machine));
+ if (m)
+ memset(m, 0, sizeof(simple_machine));
+ return m;
+}
+
+simple_machine *simple_machine_this() {
+ simple_machine *m = NULL;
+ char *tmp;
+
+ m = simple_machine_new();
+ if (m) {
+ m->board = module_call_method("devices::getMotherboard");
+ m->cpu_name = module_call_method("devices::getProcessorName");
+ m->cpu_desc = module_call_method("devices::getProcessorDesc");
+ m->cpu_config = module_call_method("devices::getProcessorFrequencyDesc");
+ m->ogl_renderer = module_call_method("computer::getOGLRenderer");
+ tmp = module_call_method("devices::getMemoryTotal");
+ m->memory_kiB = atoi(tmp);
+ free(tmp);
+
+ cpu_procs_cores_threads(&m->processors, &m->cores, &m->threads);
+ /*
+ tmp = module_call_method("devices::getProcessorCount");
+ m->threads = atoi(tmp);
+ free(tmp);
+ */
+
+ gen_machine_id(m);
+ }
+ return m;
+}
+
+void simple_machine_free(simple_machine *s) {
+ if (s) {
+ free(s->board);
+ free(s->cpu_name);
+ free(s->cpu_desc);
+ free(s->cpu_config);
+ free(s->mid);
+ }
+}
+
+void bench_result_free(bench_result *s) {
+ if (s) {
+ free(s->name);
+ simple_machine_free(s->machine);
+ }
+}
+
+bench_result *bench_result_this_machine(const char *bench_name, float result, int threads) {
+ bench_result *b = NULL;
+
+ b = malloc(sizeof(bench_result));
+ if (b) {
+ memset(b, 0, sizeof(bench_result));
+ b->machine = simple_machine_this();
+ b->name = strdup(bench_name);
+ b->result = result;
+ b->threads = threads;
+ b->legacy = 0;
+ }
+ return b;
+}
+
+/* -1 for none */
+static int nx_prefix(const char *str) {
+ char *s, *x;
+ if (str != NULL) {
+ s = (char*)str;
+ x = strchr(str, 'x');
+ if (x && x-s >= 1) {
+ while(s != x) {
+ if (!isdigit(*s))
+ return -1;
+ s++;
+ }
+ *x = 0;
+ return atoi(str);
+ }
+ }
+ return -1;
+}
+
+bench_result *bench_result_benchmarkconf(const char *section, const char *key, char **values) {
+ bench_result *b = NULL;
+ char *s0, *s1, *s2;
+ int nx = 0, vl = 0;
+ float n, m;
+
+ vl = g_strv_length(values);
+
+ b = malloc(sizeof(bench_result));
+ if (b) {
+ memset(b, 0, sizeof(bench_result));
+ b->machine = simple_machine_new();
+ b->name = strdup(section);
+
+ if (vl >= 10) { /* the 11th could be empty */
+ b->machine->mid = strdup(key);
+ b->result = atof(values[0]);
+ b->threads = atoi(values[1]);
+ b->machine->board = strdup(values[2]);
+ b->machine->cpu_name = strdup(values[3]);
+ b->machine->cpu_desc = strdup(values[4]);
+ b->machine->cpu_config = strdup(values[5]);
+ b->machine->memory_kiB = atoi(values[6]);
+ b->machine->processors = atoi(values[7]);
+ b->machine->cores = atoi(values[8]);
+ b->machine->threads = atoi(values[9]);
+ if (vl >= 11)
+ b->machine->ogl_renderer = strdup(values[10]);
+ b->legacy = 0;
+ } else if (vl >= 2) {
+ b->result = atof(values[0]);
+ b->legacy = 1;
+
+ /* old old format has prefix before cpu name (ex: 4x Pentium...) */
+ nx = nx_prefix(key);
+ if (nx > 0) {
+ b->machine->cpu_name = strdup(strchr(key, 'x') + 1);
+ b->machine->threads = nx;
+ b->threads = nx;
+ } else {
+ b->machine->cpu_name = strdup(key);
+ b->machine->threads = 1;
+ b->threads = 1;
+ }
+
+ b->machine->cpu_config = strdup(values[1]);
+ /* new old format has cpu_config string with nx prefix */
+ nx = nx_prefix(values[1]);
+ if (nx > 0) {
+ b->machine->threads = nx;
+ b->threads = nx;
+ }
+
+ /* If the clock rate in the id string is more than the
+ * config string, use that. Older hardinfo used current cpu freq
+ * instead of max freq.
+ * "...@ 2.00GHz" -> 2000.0 */
+ s0 = b->machine->cpu_name;
+ s2 = strstr(s0, "Hz");
+ if (s2 && s2 > s0 + 2) {
+ m = 1; /* assume M */
+ if (*(s2-1) == 'G')
+ m = 1000;
+ s1 = s2 - 2;
+ while (s1 > s0) {
+ if (!( isdigit(*s1) || *s1 == '.' || *s1 == ' '))
+ break;
+ s1--;
+ }
+
+ if (s1 > s0) {
+ n = atof(s1+1);
+ n *= m;
+
+ s1 = g_strdup_printf("%dx %.2f %s", b->threads, n, _("MHz"));
+ if ( cpu_config_cmp(b->machine->cpu_config, s1) == -1
+ && !cpu_config_is_close(b->machine->cpu_config, s1) ) {
+ free(b->machine->cpu_config);
+ b->machine->cpu_config = s1;
+ } else {
+ free(s1);
+ }
+ }
+ }
+
+ /* old results only give threads */
+ b->machine->processors = -1;
+ b->machine->cores = -1;
+ }
+
+ b->machine->cpu_config = cpu_config_retranslate(b->machine->cpu_config, 0, 1);
+ if (b->machine->board != NULL && strlen(b->machine->board) == 0) {
+ free(b->machine->board);
+ b->machine->board = NULL;
+ }
+ if (b->machine->cpu_desc != NULL && strlen(b->machine->cpu_desc) == 0) {
+ free(b->machine->cpu_desc);
+ b->machine->cpu_desc = NULL;
+ }
+ gen_machine_id(b->machine);
+ }
+ return b;
+}
+
+char *bench_result_benchmarkconf_line(bench_result *b) {
+ char *cpu_config = cpu_config_retranslate(b->machine->cpu_config, 1, 0);
+ char *ret = g_strdup_printf("%s=%.2f|%d|%s|%s|%s|%s|%d|%d|%d|%d|%s\n",
+ b->machine->mid, b->result, b->threads,
+ (b->machine->board != NULL) ? b->machine->board : "",
+ b->machine->cpu_name,
+ (b->machine->cpu_desc != NULL) ? b->machine->cpu_desc : "",
+ cpu_config,
+ b->machine->memory_kiB,
+ b->machine->processors, b->machine->cores, b->machine->threads,
+ (b->machine->ogl_renderer != NULL) ? b->machine->ogl_renderer : ""
+ );
+ free(cpu_config);
+ return ret;
+}
+
+char *bench_result_more_info(bench_result *b) {
+ char *memory =
+ (b->machine->memory_kiB > 0)
+ ? g_strdup_printf("%d %s", b->machine->memory_kiB, _("kiB") )
+ : g_strdup(_(unk) );
+
+ char *ret = g_strdup_printf("[%s]\n"
+ /* threads */ "%s=%d\n"
+ /* legacy */ "%s=%s\n"
+ "[%s]\n"
+ /* board */ "%s=%s\n"
+ /* cpu */ "%s=%s\n"
+ /* cpudesc */ "%s=%s\n"
+ /* cpucfg */ "%s=%s\n"
+ /* threads */ "%s=%d\n"
+ /* ogl rend */ "%s=%s\n"
+ /* mem */ "%s=%s\n",
+ _("Benchmark Result"),
+ _("Threads"), b->threads,
+ b->legacy ? _("Note") : "#Note",
+ b->legacy ? _("This result is from an old version of HardInfo. Results might not be comparable to current version. Some details are missing.") : "",
+ _("Machine"),
+ _("Board"), (b->machine->board != NULL) ? b->machine->board : _(unk),
+ _("CPU Name"), b->machine->cpu_name,
+ _("CPU Description"), (b->machine->cpu_desc != NULL) ? b->machine->cpu_desc : _(unk),
+ _("CPU Config"), b->machine->cpu_config,
+ _("Threads Available"), b->machine->threads,
+ _("OpenGL Renderer"), (b->machine->ogl_renderer != NULL) ? b->machine->ogl_renderer : _(unk),
+ _("Memory"), memory
+ );
+ free(memory);
+ return ret;
+}
+
+char *bench_result_more_info_complete(bench_result *b) {
+ return g_strdup_printf("[%s]\n"
+ /* bench name */"%s=%s\n"
+ /* result */ "%s=%0.2f\n"
+ /* threads */ "%s=%d\n"
+ /* legacy */ "%s=%s\n"
+ "[%s]\n"
+ /* board */ "%s=%s\n"
+ /* cpu */ "%s=%s\n"
+ /* cpudesc */ "%s=%s\n"
+ /* cpucfg */ "%s=%s\n"
+ /* threads */ "%s=%d\n"
+ /* ogl rend */ "%s=%s\n"
+ /* mem */ "%s=%d %s\n"
+ "[%s]\n"
+ /* mid */ "%s=%s\n"
+ /* cfg_val */ "%s=%.2f\n",
+ _("Benchmark Result"),
+ _("Benchmark"), b->name,
+ _("Result"), b->result,
+ _("Threads"), b->threads,
+ b->legacy ? _("Note") : "#Note",
+ b->legacy ? _("This result is from an old version of HardInfo. Results might not be comparable to current version. Some details are missing.") : "",
+ _("Machine"),
+ _("Board"), (b->machine->board != NULL) ? b->machine->board : _(unk),
+ _("CPU Name"), b->machine->cpu_name,
+ _("CPU Description"), (b->machine->cpu_desc != NULL) ? b->machine->cpu_desc : _(unk),
+ _("CPU Config"), b->machine->cpu_config,
+ _("Threads Available"), b->machine->threads,
+ _("OpenGL Renderer"), (b->machine->ogl_renderer != NULL) ? b->machine->ogl_renderer : _(unk),
+ _("Memory"), b->machine->memory_kiB, _("kiB"),
+ _("Handles"),
+ _("mid"), b->machine->mid,
+ _("cfg_val"), cpu_config_val(b->machine->cpu_config)
+ );
+}
diff --git a/modules/computer.c b/modules/computer.c
index 513d94f5..ea6762a7 100644
--- a/modules/computer.c
+++ b/modules/computer.c
@@ -32,6 +32,10 @@
#include <vendor.h>
#include "computer.h"
+
+#include "dmi_util.h" /* for dmi_get_str() */
+#include "dt_util.h" /* for dtr_get_string() */
+
#include "info.h"
/* Callbacks */
@@ -215,7 +219,7 @@ void scan_dev(gboolean reload)
{ N_("C (GCC)"), "gcc -v", "\\d+\\.\\d+\\.\\d+", FALSE },
{ N_("C (Clang)"), "clang -v", "\\d+\\.\\d+", FALSE },
{ N_("D (dmd)"), "dmd --help", "\\d+\\.\\d+", TRUE },
- { N_("Gambas3 (gbc3)"), "gbc3 --version", "\\d+\\.\\d+\\.\\d+", FALSE },
+ { N_("Gambas3 (gbc3)"), "gbc3 --version", "\\d+\\.\\d+\\.\\d+", TRUE },
{ N_("Java"), "javac -version", "\\d+\\.\\d+\\.\\d+", FALSE },
{ N_("CSharp (Mono, old)"), "mcs --version", "\\d+\\.\\d+\\.\\d+\\.\\d+", TRUE },
{ N_("CSharp (Mono)"), "gmcs --version", "\\d+\\.\\d+\\.\\d+\\.\\d+", TRUE },
@@ -230,7 +234,7 @@ void scan_dev(gboolean reload)
{ N_("valgrind"), "valgrind --version", "\\d+\\.\\d+\\.\\S+", TRUE },
{ N_("QMake"), "qmake --version", "\\d+\\.\\S+", TRUE},
{ N_("CMake"), "cmake --version", "\\d+\\.\\d+\\.?\\d*", TRUE},
- { N_("Gambas3 IDE"), "gambas3 --version", "\\d+\\.\\d+\\.\\d+", FALSE },
+ { N_("Gambas3 IDE"), "gambas3 --version", "\\d+\\.\\d+\\.\\d+", TRUE },
};
g_free(dev_list);
@@ -303,38 +307,19 @@ static gchar *detect_machine_type(void)
GDir *dir;
gchar *chassis;
- if (g_file_get_contents("/sys/devices/virtual/dmi/id/chassis_type", &chassis, NULL, NULL)) {
- static const char *types[] = {
- N_("Invalid chassis type (0)"),
- N_("Unknown chassis type"), /* 1 is "Other", but not helpful in HardInfo */
- N_("Unknown chassis type"),
- N_("Desktop"),
- N_("Low-profile Desktop"),
- N_("Pizza Box"),
- N_("Mini Tower"),
- N_("Tower"),
- N_("Portable"),
- N_("Laptop"),
- N_("Notebook"),
- N_("Handheld"),
- N_("Docking Station"),
- N_("All-in-one"),
- N_("Subnotebook"),
- N_("Space-saving"),
- N_("Lunch Box"),
- N_("Main Server Chassis"),
- N_("Expansion Chassis"),
- N_("Sub Chassis"),
- N_("Bus Expansion Chassis"),
- N_("Peripheral Chassis"),
- N_("RAID Chassis"),
- N_("Rack Mount Chassis"),
- N_("Sealed-case PC"),
- };
- int chassis_type = atoi(idle_free(chassis));
-
- if (chassis_type >= 0 && chassis_type < G_N_ELEMENTS(types))
- return g_strdup(_(types[chassis_type]));
+ chassis = dmi_chassis_type_str(-1, 0);
+ if (chassis)
+ return chassis;
+
+ chassis = dtr_get_string("/model", 0);
+ if (chassis) {
+ if (strstr(chassis, "Raspberry Pi") != NULL
+ || strstr(chassis, "ODROID") != NULL
+ /* FIXME: consider making a table when adding more models */ ) {
+ g_free(chassis);
+ return g_strdup(_("Single-board computer"));
+ }
+ g_free(chassis);
}
if (g_file_test("/proc/pmu/info", G_FILE_TEST_EXISTS))
@@ -381,8 +366,6 @@ static gchar *detect_machine_type(void)
/* FIXME: check if batteries are found using /proc/apm */
- /* FIXME: use dmidecode if available to get chassis type */
-
return g_strdup(_("Unknown physical machine type"));
}
@@ -403,35 +386,43 @@ gchar *computer_get_virtualization(void)
gchar *vmtype;
} vm_types[] = {
/* VMware */
- { "VMware", "Virtual (VMware)" },
- { ": VMware Virtual IDE CDROM Drive", "Virtual (VMware)" },
+ { "VMware", N_("Virtual (VMware)") },
+ { ": VMware Virtual IDE CDROM Drive", N_("Virtual (VMware)") },
/* QEMU */
- { "QEMU", "Virtual (QEMU)" },
- { "QEMU Virtual CPU", "Virtual (QEMU)" },
- { ": QEMU HARDDISK", "Virtual (QEMU)" },
- { ": QEMU CD-ROM", "Virtual (QEMU)" },
+ { "QEMU", N_("Virtual (QEMU)") },
+ { "QEMU Virtual CPU", N_("Virtual (QEMU)") },
+ { ": QEMU HARDDISK", N_("Virtual (QEMU)") },
+ { ": QEMU CD-ROM", N_("Virtual (QEMU)") },
/* Generic Virtual Machine */
- { ": Virtual HD,", "Virtual (Unknown)" },
- { ": Virtual CD,", "Virtual (Unknown)" },
+ { ": Virtual HD,", N_("Virtual (Unknown)") },
+ { ": Virtual CD,", N_("Virtual (Unknown)") },
/* Virtual Box */
- { "VBOX", "Virtual (VirtualBox)" },
- { ": VBOX HARDDISK", "Virtual (VirtualBox)" },
- { ": VBOX CD-ROM", "Virtual (VirtualBox)" },
+ { "VBOX", N_("Virtual (VirtualBox)") },
+ { ": VBOX HARDDISK", N_("Virtual (VirtualBox)") },
+ { ": VBOX CD-ROM", N_("Virtual (VirtualBox)") },
/* Xen */
- { "Xen virtual console", "Virtual (Xen)" },
- { "Xen reported: ", "Virtual (Xen)" },
- { "xen-vbd: registered block device", "Virtual (Xen)" },
+ { "Xen virtual console", N_("Virtual (Xen)") },
+ { "Xen reported: ", N_("Virtual (Xen)") },
+ { "xen-vbd: registered block device", N_("Virtual (Xen)") },
/* Generic */
- { " hypervisor", "Virtual (hypervisor present)"} ,
+ { " hypervisor", N_("Virtual (hypervisor present)") } ,
{ NULL }
};
+ gchar *tmp;
DEBUG("Detecting virtual machine");
if (g_file_test("/proc/xen", G_FILE_TEST_EXISTS)) {
DEBUG("/proc/xen found; assuming Xen");
- return g_strdup("Xen");
+ return g_strdup(_("Virtual (Xen)"));
+ }
+
+ tmp = module_call_method("devices::getMotherboard");
+ if (strstr(tmp, "VirtualBox") != NULL) {
+ g_free(tmp);
+ return g_strdup(_("Virtual (VirtualBox)"));
}
+ g_free(tmp);
for (i = 0; files[i+1]; i++) {
gchar buffer[512];
@@ -452,7 +443,7 @@ gchar *computer_get_virtualization(void)
if (found) {
DEBUG("%s found (by reading file %s)",
vm_types[j].vmtype, files[i]);
- return g_strdup(vm_types[j].vmtype);
+ return g_strdup(_(vm_types[j].vmtype));
}
}
@@ -489,9 +480,9 @@ gchar *callback_summary(void)
idle_free(computer_get_alsacards(computer)));
info_add_computed_group(info, _("Input Devices"),
idle_free(module_call_method("devices::getInputDevices")));
- info_add_computed_group(info, _("Printers"),
+ info_add_computed_group(info, NULL, /* getPrinters provides group headers */
idle_free(module_call_method("devices::getPrinters")));
- info_add_computed_group(info, _("Storage"),
+ info_add_computed_group(info, NULL, /* getStorageDevices provides group headers */
idle_free(module_call_method("devices::getStorageDevices")));
return info_flatten(info);
@@ -591,6 +582,7 @@ gchar *callback_display(void)
computer->display->width, computer->display->height),
info_field(_("Vendor"), computer->display->vendor),
info_field(_("Version"), computer->display->version),
+ info_field(_("Current Display Name"), computer->display->display_name),
info_field_last());
info_add_computed_group(info, _("Monitors"), computer->display->monitors);
@@ -645,6 +637,13 @@ gchar *get_os(void)
return g_strdup(computer->os->distro);
}
+gchar *get_ogl_renderer(void)
+{
+ scan_display(FALSE);
+
+ return g_strdup(computer->display->ogl_renderer);
+}
+
gchar *get_display_summary(void)
{
scan_display(FALSE);
@@ -689,6 +688,7 @@ ShellModuleMethod *hi_exported_methods(void)
{"getOSKernel", get_os_kernel},
{"getOS", get_os},
{"getDisplaySummary", get_display_summary},
+ {"getOGLRenderer", get_ogl_renderer},
{"getAudioCards", get_audio_cards},
{"getKernelModuleDescription", get_kernel_module_description},
{NULL}
diff --git a/modules/computer/boots.c b/modules/computer/boots.c
index d8a6d32a..ba458242 100644
--- a/modules/computer/boots.c
+++ b/modules/computer/boots.c
@@ -24,43 +24,43 @@
void
scan_boots_real(void)
{
- FILE *last;
- char buffer[256];
+ gchar **tmp;
+ gboolean spawned;
+ gchar *out, *err, *p, *s, *next_nl;
scan_os(FALSE);
if (!computer->os->boots)
- computer->os->boots = g_strdup_printf("[%s]\n", _("Boots"));
+ computer->os->boots = strdup("");
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++;
+ spawned = g_spawn_command_line_sync("last",
+ &out, &err, NULL, NULL);
+ if (spawned && out != NULL) {
+ p = out;
+ while(next_nl = strchr(p, '\n')) {
+ strend(p, '\n');
+ if (strstr(p, "system boot")) {
+ s = p;
+ while (*s) {
+ if (*s == ' ' && *(s + 1) == ' ') {
+ memmove(s, s + 1, strlen(s) + 1);
+ s--;
+ } else {
+ s++;
+ }
+ }
+ tmp = g_strsplit(p, " ", 0);
+ computer->os->boots =
+ h_strdup_cprintf("\n%s %s %s %s=%s",
+ computer->os->boots,
+ tmp[4], tmp[5], tmp[6], tmp[7], tmp[3]);
+ g_strfreev(tmp);
}
- }
-
- 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]);
- g_strfreev(tmp);
+ p = next_nl + 1;
}
- }
-
- pclose(last);
+ g_free(out);
+ g_free(err);
}
}
diff --git a/modules/computer/display.c b/modules/computer/display.c
index 2c98b144..61eac4eb 100644
--- a/modules/computer/display.c
+++ b/modules/computer/display.c
@@ -26,38 +26,39 @@ get_glx_info(DisplayInfo *di)
{
gchar *output;
if (g_spawn_command_line_sync("glxinfo", &output, NULL, NULL, NULL)) {
- gchar **output_lines;
- gint i = 0;
+ gchar **output_lines;
+ gint i = 0;
- for (output_lines = g_strsplit(output, "\n", 0);
- output_lines && output_lines[i];
- i++) {
- if (strstr(output_lines[i], "OpenGL")) {
- gchar **tmp = g_strsplit(output_lines[i], ":", 0);
+ for (output_lines = g_strsplit(output, "\n", 0);
+ output_lines && output_lines[i];
+ i++) {
+ if (strstr(output_lines[i], "OpenGL")) {
+ gchar **tmp = g_strsplit(output_lines[i], ":", 0);
- tmp[1] = g_strchug(tmp[1]);
+ tmp[1] = g_strchug(tmp[1]);
- get_str("OpenGL vendor str", di->ogl_vendor);
- get_str("OpenGL renderer str", di->ogl_renderer);
- get_str("OpenGL version str", di->ogl_version);
+ get_str("OpenGL vendor str", di->ogl_vendor);
+ get_str("OpenGL renderer str", di->ogl_renderer);
+ get_str("OpenGL version str", di->ogl_version);
- g_strfreev(tmp);
- } else if (strstr(output_lines[i], "direct rendering: Yes")) {
- di->dri = TRUE;
- }
- }
+ g_strfreev(tmp);
+ } else if (strstr(output_lines[i], "direct rendering: Yes")) {
+ di->dri = TRUE;
+ }
+ }
+
+ g_free(output);
+ g_strfreev(output_lines);
+
+ if (!di->ogl_vendor)
+ di->ogl_vendor = _("(Unknown)");
+ if (!di->ogl_renderer)
+ di->ogl_renderer = _("(Unknown)");
+ if (!di->ogl_version)
+ di->ogl_version = _("(Unknown)");
- g_free(output);
- g_strfreev(output_lines);
-
- if (!di->ogl_vendor)
- di->ogl_vendor = "Unknown";
- if (!di->ogl_renderer)
- di->ogl_renderer = "Unknown";
- if (!di->ogl_version)
- di->ogl_version = "Unknown";
} else {
- di->ogl_vendor = di->ogl_renderer = di->ogl_version = "Unknown";
+ di->ogl_vendor = di->ogl_renderer = di->ogl_version = _("(Unknown)");
}
}
@@ -66,7 +67,7 @@ static void
get_x11_info(DisplayInfo *di)
{
gchar *output;
-
+
if (g_spawn_command_line_sync("xdpyinfo", &output, NULL, NULL, NULL)) {
gchar **output_lines, **old;
@@ -74,8 +75,9 @@ get_x11_info(DisplayInfo *di)
g_free(output);
old = output_lines;
- while (*(output_lines++)) {
- gchar **tmp = g_strsplit(*output_lines, ":", 0);
+ while (*output_lines) {
+ gchar **tmp = g_strsplit(*output_lines, ":", 2);
+ output_lines++;
if (tmp[1] && tmp[0]) {
tmp[1] = g_strchug(tmp[1]);
@@ -83,20 +85,21 @@ get_x11_info(DisplayInfo *di)
get_str("vendor string", di->vendor);
get_str("X.Org version", di->version);
get_str("XFree86 version", di->version);
+ get_str("name of display", di->display_name);
if (g_str_has_prefix(tmp[0], "number of extensions")) {
int n;
-
+
di->extensions = g_strdup("");
-
+
for (n = atoi(tmp[1]); n; n--) {
- di->extensions = h_strconcat(di->extensions,
+ di->extensions = h_strconcat(di->extensions,
g_strstrip(*(++output_lines)),
"=\n",
NULL);
}
g_strfreev(tmp);
-
+
break;
}
}
@@ -106,19 +109,19 @@ get_x11_info(DisplayInfo *di)
g_strfreev(old);
}
-
+
GdkScreen *screen = gdk_screen_get_default();
-
+
if (screen && GDK_IS_SCREEN(screen)) {
gint n_monitors = gdk_screen_get_n_monitors(screen);
gint i;
-
+
di->monitors = NULL;
for (i = 0; i < n_monitors; i++) {
GdkRectangle rect;
-
+
gdk_screen_get_monitor_geometry(screen, i, &rect);
-
+
di->monitors = h_strdup_cprintf(_("Monitor %d=%dx%d pixels\n"),
di->monitors, i, rect.width, rect.height);
}
@@ -131,9 +134,9 @@ DisplayInfo *
computer_get_display(void)
{
DisplayInfo *di = g_new0(DisplayInfo, 1);
-
+
GdkScreen *screen = gdk_screen_get_default();
-
+
if (screen && GDK_IS_SCREEN(screen)) {
di->width = gdk_screen_get_width(screen);
di->height = gdk_screen_get_height(screen);
diff --git a/modules/computer/uptime.c b/modules/computer/uptime.c
index 5f0f1942..6ef3d250 100644
--- a/modules/computer/uptime.c
+++ b/modules/computer/uptime.c
@@ -30,6 +30,7 @@ computer_get_uptime(void)
ui->minutes = minutes / 60;
fclose(procuptime);
} else {
+ g_free(ui);
return NULL;
}
diff --git a/modules/devices.c b/modules/devices.c
index 9c7a184d..152b6831 100644
--- a/modules/devices.c
+++ b/modules/devices.c
@@ -359,24 +359,37 @@ gchar *get_memory_total(void)
gchar *get_motherboard(void)
{
- char *board_name, *board_vendor, *product_version;
+ char *board_name, *board_vendor, *system_version;
+ char *ret;
#if defined(ARCH_x86) || defined(ARCH_x86_64)
scan_dmi(FALSE);
- board_name = moreinfo_lookup("DEV:DMI:Board:Name");
- board_vendor = moreinfo_lookup("DEV:DMI:Board:Vendor");
- product_version = moreinfo_lookup("DEV:DMI:Product:Version#1");
-
- if (!board_name || !*board_name)
- board_name = _(" (model unknown)");
- if (!board_vendor || !*board_vendor)
- board_vendor = _(" (vendor unknown)");
-
- if (product_version && *product_version)
- return g_strdup_printf("%s / %s (%s)", product_version, board_name, board_vendor);
-
- return g_strconcat(board_vendor, " ", board_name, NULL);
+ board_name = dmi_get_str("baseboard-product-name");
+ if (board_name == NULL)
+ board_name = dmi_get_str("system-product-name");
+
+ board_vendor = dmi_get_str("baseboard-manufacturer");
+ if (board_vendor == NULL)
+ board_vendor = dmi_get_str("system-manufacturer");
+
+ system_version = dmi_get_str("system-version");
+
+ if (board_name && board_vendor && system_version)
+ ret = g_strdup_printf("%s / %s (%s)", system_version, board_name, board_vendor);
+ else if (board_name && board_vendor)
+ ret = g_strconcat(board_vendor, " ", board_name, NULL);
+ else if (board_name)
+ ret = g_strdup(board_name);
+ else if (board_vendor)
+ ret = g_strdup(board_vendor);
+ else
+ ret = g_strdup(_("(Unknown)"));
+
+ free(board_name);
+ free(board_vendor);
+ free(system_version);
+ return ret;
#endif
/* use device tree "model" */
diff --git a/modules/devices/arm/processor.c b/modules/devices/arm/processor.c
index e9446229..37f07d79 100644
--- a/modules/devices/arm/processor.c
+++ b/modules/devices/arm/processor.c
@@ -264,7 +264,7 @@ gchar *processor_name(GSList *processors) {
* ex: "brcm,bcm2837", "brcm,bcm2836";
* would match 2836 when it is a 2837.
*/
-#define UNKSOC "(Unknown)"
+#define UNKSOC "(Unknown)" /* don't translate this */
const struct {
char *search_str;
char *vendor;
@@ -285,6 +285,23 @@ gchar *processor_name(GSList *processors) {
{ "ti,omap3", "Texas Instruments", "OMAP3-family" },
{ "ti,omap2", "Texas Instruments", "OMAP2-family" },
{ "ti,omap1", "Texas Instruments", "OMAP1-family" },
+ { "mediatek,mt6799", "MediaTek", "MT6799 Helio X30" },
+ { "mediatek,mt6799", "MediaTek", "MT6799 Helio X30" },
+ { "mediatek,mt6797x", "MediaTek", "MT6797X Helio X27" },
+ { "mediatek,mt6797t", "MediaTek", "MT6797T Helio X25" },
+ { "mediatek,mt6797", "MediaTek", "MT6797 Helio X20" },
+ { "mediatek,mt6757T", "MediaTek", "MT6757T Helio P25" },
+ { "mediatek,mt6757", "MediaTek", "MT6757 Helio P20" },
+ { "mediatek,mt6795", "MediaTek", "MT6795 Helio X10" },
+ { "mediatek,mt6755", "MediaTek", "MT6755 Helio P10" },
+ { "mediatek,mt6750t", "MediaTek", "MT6750T" },
+ { "mediatek,mt6750", "MediaTek", "MT6750" },
+ { "mediatek,mt6753", "MediaTek", "MT6753" },
+ { "mediatek,mt6752", "MediaTek", "MT6752" },
+ { "mediatek,mt6738", "MediaTek", "MT6738" },
+ { "mediatek,mt6737t", "MediaTek", "MT6737T" },
+ { "mediatek,mt6735", "MediaTek", "MT6735" },
+ { "mediatek,mt6732", "MediaTek", "MT6732" },
{ "qcom,msm8939", "Qualcomm", "Snapdragon 615"},
{ "qcom,msm", "Qualcomm", "Snapdragon-family"},
{ "nvidia,tegra" "nVidia", "Tegra-family" },
@@ -293,6 +310,7 @@ gchar *processor_name(GSList *processors) {
{ "rockchip," "Rockchip", UNKSOC },
{ "ti,", "Texas Instruments", UNKSOC },
{ "qcom,", "Qualcom", UNKSOC },
+ { "mediatek," "MediaTek", UNKSOC },
{ NULL, NULL }
};
gchar *ret = NULL;
diff --git a/modules/devices/cpu_util.c b/modules/devices/cpu_util.c
deleted file mode 100644
index f5bddd5c..00000000
--- a/modules/devices/cpu_util.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
- * This file by Burt P. <pburt0@gmail.com>
- *
- * 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 "hardinfo.h"
-#include "cpu_util.h"
-
-#include "cpubits.c"
-
-#define CPU_TOPO_NULL -9877
-
-const gchar *byte_order_str() {
-#if G_BYTE_ORDER == G_LITTLE_ENDIAN
- return _("Little Endian");
-#else
- return _("Big Endian");
-#endif
-}
-
-int processor_has_flag(gchar * strflags, gchar * strflag)
-{
- gchar **flags;
- gint ret = 0;
- if (strflags == NULL || strflag == NULL)
- return 0;
- flags = g_strsplit(strflags, " ", 0);
- ret = g_strv_contains((const gchar * const *)flags, strflag);
- g_strfreev(flags);
- return ret;
-}
-
-gchar* get_cpu_str(const gchar* file, gint cpuid) {
- gchar *tmp0 = NULL;
- gchar *tmp1 = NULL;
- tmp0 = g_strdup_printf("/sys/devices/system/cpu/cpu%d/%s", cpuid, file);
- g_file_get_contents(tmp0, &tmp1, NULL, NULL);
- g_free(tmp0);
- return tmp1;
-}
-
-gint get_cpu_int(const char* item, int cpuid, int null_val) {
- gchar *fc = NULL;
- int ret = null_val;
- fc = get_cpu_str(item, cpuid);
- if (fc) {
- ret = atol(fc);
- g_free(fc);
- }
- return ret;
-}
-
-/* cpubits is 32768 bits long
- * core_ids are not unique among physical_ids
- * hack up cpubits into 128 packs of 256 cores
- * to make cores unique in cpubits */
-#define MAX_CORES_PER_PACK 256
-#define MAX_PACKS 128
-
-int cpu_procs_cores_threads(int *p, int *c, int *t) {
- cpubits *threads, *cores, *packs;
- char *tmp;
- int i, m, pack_id, core_id;
- g_file_get_contents("/sys/devices/system/cpu/present", &tmp, NULL, NULL);
- if (tmp != NULL) {
- threads = cpubits_from_str(tmp);
- cores = cpubits_from_str("");
- packs = cpubits_from_str("");
- m = cpubits_max(threads);
- for (i = 0; i <= m; i++) {
- pack_id = get_cpu_int("topology/physical_package_id", i, CPU_TOPO_NULL);
- core_id = get_cpu_int("topology/core_id", i, CPU_TOPO_NULL);
- if (pack_id >= 0) { CPUBIT_SET(packs, pack_id); }
- if (core_id >= 0) { CPUBIT_SET(cores, (pack_id * MAX_CORES_PER_PACK) + core_id ); }
- }
- *t = cpubits_count(threads);
- *c = cpubits_count(cores);
- *p = cpubits_count(packs);
- if (!*c) *c = 1;
- if (!*p) *p = 1;
- free(threads);
- free(cores);
- free(packs);
- free(tmp);
- return 1;
- } else {
- *p = *c = *t = -1;
- return 0;
- }
-}
-
-cpufreq_data *cpufreq_new(gint id)
-{
- cpufreq_data *cpufd;
- cpufd = malloc(sizeof(cpufreq_data));
- if (cpufd) {
- memset(cpufd, 0, sizeof(cpufreq_data));
- cpufd->id = id;
- cpufreq_update(cpufd, 0);
- }
- return cpufd;
-}
-
-void cpufreq_update(cpufreq_data *cpufd, int cur_only)
-{
- if (cpufd) {
- cpufd->cpukhz_cur = get_cpu_int("cpufreq/scaling_cur_freq", cpufd->id, 0);
- if (cur_only) return;
- cpufd->scaling_driver = get_cpu_str("cpufreq/scaling_driver", cpufd->id);
- cpufd->scaling_governor = get_cpu_str("cpufreq/scaling_governor", cpufd->id);
- cpufd->transition_latency = get_cpu_int("cpufreq/cpuinfo_transition_latency", cpufd->id, 0);
- cpufd->cpukhz_min = get_cpu_int("cpufreq/scaling_min_freq", cpufd->id, 0);
- cpufd->cpukhz_max = get_cpu_int("cpufreq/scaling_max_freq", cpufd->id, 0);
- if (cpufd->scaling_driver == NULL) cpufd->scaling_driver = g_strdup("(Unknown)");
- if (cpufd->scaling_governor == NULL) cpufd->scaling_governor = g_strdup("(Unknown)");
- }
-}
-
-void cpufreq_free(cpufreq_data *cpufd)
-{
- if (cpufd) {
- g_free(cpufd->scaling_driver);
- g_free(cpufd->scaling_governor);
- }
- g_free(cpufd);
-}
-
-cpu_topology_data *cputopo_new(gint id)
-{
- cpu_topology_data *cputd;
- cputd = malloc(sizeof(cpu_topology_data));
- if (cputd) {
- memset(cputd, 0, sizeof(cpu_topology_data));
- cputd->id = id;
- cputd->socket_id = get_cpu_int("topology/physical_package_id", id, CPU_TOPO_NULL);
- cputd->core_id = get_cpu_int("topology/core_id", id, CPU_TOPO_NULL);
- cputd->book_id = get_cpu_int("topology/book_id", id, CPU_TOPO_NULL);
- cputd->drawer_id = get_cpu_int("topology/drawer_id", id, CPU_TOPO_NULL);
- }
- return cputd;
-
-}
-
-void cputopo_free(cpu_topology_data *cputd)
-{
- g_free(cputd);
-}
-
-gchar *cpufreq_section_str(cpufreq_data *cpufd)
-{
- if (cpufd == NULL)
- return g_strdup("");
-
- if (cpufd->cpukhz_min || cpufd->cpukhz_max || cpufd->cpukhz_cur) {
- return g_strdup_printf(
- "[%s]\n"
- "%s=%d %s\n"
- "%s=%d %s\n"
- "%s=%d %s\n"
- "%s=%d %s\n"
- "%s=%s\n"
- "%s=%s\n",
- _("Frequency Scaling"),
- _("Minimum"), cpufd->cpukhz_min, _("kHz"),
- _("Maximum"), cpufd->cpukhz_max, _("kHz"),
- _("Current"), cpufd->cpukhz_cur, _("kHz"),
- _("Transition Latency"), cpufd->transition_latency, _("ns"),
- _("Governor"), cpufd->scaling_governor,
- _("Driver"), cpufd->scaling_driver);
- } else {
- return g_strdup_printf(
- "[%s]\n"
- "%s=%s\n",
- _("Frequency Scaling"),
- _("Driver"), cpufd->scaling_driver);
- }
-}
-
-gchar *cputopo_section_str(cpu_topology_data *cputd)
-{
- static const char na[] = N_("(Not Available)");
- char sock_str[64] = "", core_str[64] = "";
- char book_str[64] = "", drawer_str[64] = "";
-
- if (cputd == NULL)
- return g_strdup("");
-
- if (cputd->socket_id != CPU_TOPO_NULL && cputd->socket_id != -1)
- sprintf(sock_str, "%s=%d\n", _("Socket"), cputd->socket_id);
- else
- sprintf(sock_str, "%s=%s\n", _("Socket"), na);
-
- if (cputd->core_id != CPU_TOPO_NULL)
- sprintf(core_str, "%s=%d\n", _("Core"), cputd->core_id);
- else
- sprintf(core_str, "%s=%s\n", _("Core"), na);
-
- if (cputd->book_id != CPU_TOPO_NULL)
- sprintf(core_str, "%s=%d\n", _("Book"), cputd->book_id);
- if (cputd->book_id != CPU_TOPO_NULL)
- sprintf(core_str, "%s=%d\n", _("Drawer"), cputd->drawer_id);
-
- return g_strdup_printf(
- "[%s]\n"
- "%s=%d\n"
- "%s%s%s%s",
- _("Topology"),
- _("ID"), cputd->id,
- sock_str, core_str, book_str, drawer_str );
-}
diff --git a/modules/devices/cpubits.c b/modules/devices/cpubits.c
deleted file mode 100644
index ba9bffc7..00000000
--- a/modules/devices/cpubits.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * rpiz - https://github.com/bp0/rpiz
- * Copyright (C) 2017 Burt P. <pburt0@gmail.com>
- *
- * 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; either version 2
- * of the License, or (at your option) any later version.
- *
- * 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include <stdint.h>
-
-typedef uint32_t cpubits;
-uint32_t cpubits_count(cpubits *b);
-cpubits *cpubits_from_str(char *str);
-char *cpubits_to_str(cpubits *bits, char *str, int max_len);
-
-#define CPUBITS_SIZE 4096 /* bytes, multiple of sizeof(uint32_t) */
-#define CPUBIT_SET(BITS, BIT) (BITS[BIT/32] |= (1 << BIT%32))
-#define CPUBIT_GET(BITS, BIT) ((BITS[BIT/32] & (1 << BIT%32)) >> BIT%32)
-#define CPUBITS_CLEAR(BITS) memset(BITS, 0, CPUBITS_SIZE)
-
-uint32_t cpubits_count(cpubits *b) {
- static const uint32_t max = CPUBITS_SIZE * 8;
- uint32_t count = 0, i = 0;
- while (i < max) {
- count += CPUBIT_GET(b, i);
- i++;
- }
- return count;
-}
-
-int cpubits_max(cpubits *b) {
- int i = CPUBITS_SIZE * 8;
- while (i >= 0) {
- if (CPUBIT_GET(b, i))
- break;
- i--;
- }
- return i;
-}
-
-cpubits *cpubits_from_str(char *str) {
- char *v, *nv, *hy;
- int r0, r1;
- cpubits *newbits = malloc(CPUBITS_SIZE);
- if (newbits) {
- memset(newbits, 0, CPUBITS_SIZE);
- if (str != NULL) {
- v = (char*)str;
- while ( *v != 0 ) {
- nv = strchr(v, ','); /* strchrnul() */
- if (nv == NULL) nv = strchr(v, 0); /* equivalent */
- hy = strchr(v, '-');
- if (hy && hy < nv) {
- r0 = strtol(v, NULL, 0);
- r1 = strtol(hy + 1, NULL, 0);
- } else {
- r0 = r1 = strtol(v, NULL, 0);
- }
- for (; r0 <= r1; r0++) {
- CPUBIT_SET(newbits, r0);
- }
- v = (*nv == ',') ? nv + 1 : nv;
- }
- }
- }
- return newbits;
-}
-
-char *cpubits_to_str(cpubits *bits, char *str, int max_len) {
- static const uint32_t max = CPUBITS_SIZE * 8;
- uint32_t i = 1, seq_start = 0, seq_last = 0, seq = 0, l = 0;
- char buffer[65536] = "";
- if (CPUBIT_GET(bits, 0)) {
- seq = 1;
- strcpy(buffer, "0");
- }
- while (i < max) {
- if (CPUBIT_GET(bits, i) ) {
- seq_last = i;
- if (!seq) {
- seq = 1;
- seq_start = i;
- l = strlen(buffer);
- sprintf(buffer + l, "%s%d", l ? "," : "", i);
- }
- } else {
- if (seq && seq_last != seq_start) {
- l = strlen(buffer);
- sprintf(buffer + l, "-%d", seq_last);
- }
- seq = 0;
- }
- i++;
- }
- if (str == NULL)
- return strdup(buffer);
- else {
- strncpy(str, buffer, max_len);
- return str;
- }
-}
diff --git a/modules/devices/devicetree.c b/modules/devices/devicetree.c
index 6fce066a..4f3c85a2 100644
--- a/modules/devices/devicetree.c
+++ b/modules/devices/devicetree.c
@@ -29,13 +29,16 @@
#include "cpu_util.h"
#include "dt_util.h"
+/* These should really go into CMakeLists.txt */
+#if defined(__arm__)
#include "devicetree/rpi_data.c"
+#elif defined(__powerpc__)
#include "devicetree/pmac_data.c"
+#endif
-dtr *dt;
gchar *dtree_info = NULL;
-gchar *get_node(char *np) {
+static gchar *get_node(dtr *dt, char *np) {
gchar *nodes = NULL, *props = NULL, *ret = NULL;
gchar *tmp = NULL, *pstr = NULL, *lstr = NULL;
gchar *dir_path;
@@ -90,83 +93,111 @@ gchar *get_node(char *np) {
dtr_obj_free(node);
g_free(props);
g_free(nodes);
+
return ret;
}
/* different from dtr_get_string() in that it re-uses the existing dt */
-char *get_dt_string(char *path, int decode) {
- dtr_obj *obj;
- char *ret = NULL;
+static char *get_dt_string(dtr *dt, char *path, gboolean decode) {
+ char *ret;
+
if (decode) {
- obj = dtr_get_prop_obj(dt, NULL, path);
+ dtr_obj *obj = dtr_get_prop_obj(dt, NULL, path);
+
ret = dtr_str(obj);
+
dtr_obj_free(obj);
- } else
+ } else {
ret = dtr_get_prop_str(dt, NULL, path);
+ }
+
return ret;
}
-gchar *get_summary() {
+static gchar *get_summary(dtr *dt) {
char *model = NULL, *compat = NULL;
- char *tmp[10];
char *ret = NULL;
- model = get_dt_string("/model", 0);
- compat = get_dt_string("/compatible", 1);
+ model = get_dt_string(dt, "/model", 0);
+ compat = get_dt_string(dt, "/compatible", 1);
UNKIFNULL(model);
EMPIFNULL(compat);
+#if defined(__arm__)
/* Expand on the DT information from known machines, like RPi.
* RPi stores a revision value in /proc/cpuinfo that can be used
* to look up details. This is just a nice place to pull it all
* together for DT machines, with a nice fallback.
* PPC Macs could be handled this way too. They store
* machine identifiers in /proc/cpuinfo. */
- if ( strstr(model, "Raspberry Pi") != NULL
- || strstr(compat, "raspberrypi") != NULL ) {
- tmp[0] = get_dt_string("/serial-number", 1);
- tmp[1] = get_dt_string("/soc/gpu/compatible", 1);
- tmp[9] = rpi_board_details();
- tmp[8] = g_strdup_printf(
- "[%s]\n" "%s=%s\n" "%s=%s\n",
+ if (strstr(model, "Raspberry Pi")
+ || strstr(compat, "raspberrypi")) {
+ gchar *gpu_compat = get_dt_string(dt, "/soc/gpu/compatible", 1);
+ gchar *rpi_details = rpi_board_details();
+ gchar *basic_info;
+
+ basic_info = g_strdup_printf(
+ "[%s]\n"
+ "%s=%s\n"
+ "%s=%s\n",
_("Platform"),
_("Compatible"), compat,
- _("GPU-compatible"), tmp[1] );
- if (tmp[9] != NULL) {
- ret = g_strdup_printf("%s%s", tmp[9], tmp[8]);
+ _("GPU-compatible"), gpu_compat);
+
+ if (rpi_details) {
+ ret = g_strconcat(rpi_details, basic_info, NULL);
+
+ g_free(rpi_details);
} else {
+ gchar *serial_number = get_dt_string(dt, "/serial-number", 1);
+
ret = g_strdup_printf(
- "[%s]\n" "%s=%s\n" "%s=%s\n" "%s=%s\n" "%s",
+ "[%s]\n"
+ "%s=%s\n"
+ "%s=%s\n"
+ "%s=%s\n"
+ "%s",
_("Raspberry Pi or Compatible"),
_("Model"), model,
- _("Serial Number"), tmp[0],
+ _("Serial Number"), serial_number,
_("RCode"), _("No revision code available; unable to lookup model details."),
- tmp[8]);
+ basic_info);
+
+ g_free(serial_number);
}
- free(tmp[0]); free(tmp[1]);
- free(tmp[9]); free(tmp[8]);
+
+ g_free(gpu_compat);
+ g_free(basic_info);
}
+#endif
+#if defined(__powerpc__)
/* Power Macintosh */
if (strstr(compat, "PowerBook") != NULL
|| strstr(compat, "MacRISC") != NULL
|| strstr(compat, "Power Macintosh") != NULL) {
- tmp[9] = ppc_mac_details();
- if (tmp[9] != NULL) {
- tmp[0] = get_dt_string("/serial-number", 1);
+ gchar *mac_details = ppc_mac_details();
+
+ if (mac_details) {
+ gchar *serial_number = get_dt_string(dt, "/serial-number", 1);
+
ret = g_strdup_printf(
- "%s[%s]\n" "%s=%s\n", tmp[9],
+ "%s[%s]\n"
+ "%s=%s\n",
+ mac_details,
_("More"),
- _("Serial Number"), tmp[0] );
- free(tmp[0]);
+ _("Serial Number"), serial_number);
+
+ free(mac_details);
+ free(serial_number);
}
- free(tmp[9]);
}
+#endif
/* fallback */
- if (ret == NULL) {
- tmp[0] = get_dt_string("/serial-number", 1);
- EMPIFNULL(tmp[0]);
+ if (!ret) {
+ gchar *serial_number = get_dt_string(dt, "/serial-number", 1);
+ EMPIFNULL(serial_number);
ret = g_strdup_printf(
"[%s]\n"
"%s=%s\n"
@@ -174,15 +205,18 @@ gchar *get_summary() {
"%s=%s\n",
_("Board"),
_("Model"), model,
- _("Serial Number"), tmp[0],
+ _("Serial Number"), serial_number,
_("Compatible"), compat);
- free(tmp[0]);
+ free(serial_number);
}
+
free(model);
+ free(compat);
+
return ret;
}
-void mi_add(const char *key, const char *value) {
+static void mi_add(const char *key, const char *value) {
gchar *ckey, *rkey;
ckey = hardinfo_clean_label(key, 0);
@@ -195,7 +229,7 @@ void mi_add(const char *key, const char *value) {
g_free(rkey);
}
-void add_keys(char *np) {
+static void add_keys(dtr *dt, char *np) {
gchar *dir_path, *dt_path;
gchar *ftmp, *ntmp;
gchar *n_info;
@@ -206,7 +240,7 @@ void add_keys(char *np) {
/* add self */
obj = dtr_obj_read(dt, np);
dt_path = dtr_obj_path(obj);
- n_info = get_node(dt_path);
+ n_info = get_node(dt, dt_path);
mi_add(dt_path, n_info);
dir_path = g_strdup_printf("%s/%s", dtr_base_path(dt), np);
@@ -219,7 +253,7 @@ void add_keys(char *np) {
ntmp = g_strdup_printf("/%s", fn);
else
ntmp = g_strdup_printf("%s/%s", np, fn);
- add_keys(ntmp);
+ add_keys(dt, ntmp);
g_free(ntmp);
}
g_free(ftmp);
@@ -228,7 +262,7 @@ void add_keys(char *np) {
g_dir_close(dir);
}
-char *msg_section(int dump) {
+static char *msg_section(dtr *dt, int dump) {
gchar *aslbl = NULL;
gchar *messages = dtr_messages(dt);
gchar *ret = g_strdup_printf("[%s]\n", _("Messages"));
@@ -249,8 +283,8 @@ char *msg_section(int dump) {
void __scan_dtree()
{
- dt = dtr_new(NULL);
- gchar *summary = get_summary();
+ dtr *dt = dtr_new(NULL);
+ gchar *summary = get_summary(dt);
gchar *maps = dtr_maps_info(dt);
gchar *messages = NULL;
@@ -259,12 +293,10 @@ void __scan_dtree()
mi_add("Maps", maps);
if(dtr_was_found(dt))
- add_keys("/");
- messages = msg_section(0);
+ add_keys(dt, "/");
+ messages = msg_section(dt, 0);
mi_add("Messages", messages);
- //printf("%s\n", dtree_info);
-
g_free(summary);
g_free(maps);
g_free(messages);
diff --git a/modules/devices/devicetree/dt_util.c b/modules/devices/devicetree/dt_util.c
deleted file mode 100644
index 9678042d..00000000
--- a/modules/devices/devicetree/dt_util.c
+++ /dev/null
@@ -1,1040 +0,0 @@
-/*
- * 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
- */
-/*
- * Device Tree support by Burt P. <pburt0@gmail.com>
- * Sources:
- * http://elinux.org/Device_Tree_Usage
- * http://elinux.org/Device_Tree_Mysteries
- */
-#include <unistd.h>
-#include <sys/types.h>
-#include <endian.h>
-#include "hardinfo.h"
-#include "dt_util.h"
-
-static struct {
- char *name; int type;
-} prop_types[] = {
- { "name", DTP_STR },
- { "compatible", DTP_STR },
- { "model", DTP_STR },
- { "reg", DTP_REG },
- { "clocks", DTP_CLOCKS },
- { "gpios", DTP_GPIOS },
- { "cs-gpios", DTP_GPIOS },
- { "phandle", DTP_PH },
- { "interrupts", DTP_INTRUPT },
- { "interrupts-extended", DTP_INTRUPT_EX },
- { "interrupt-parent", DTP_PH_REF },
- { "interrupt-controller", DTP_EMPTY },
- { "regulator-min-microvolt", DTP_UINT },
- { "regulator-max-microvolt", DTP_UINT },
- { "clock-frequency", DTP_UINT },
- { "dmas", DTP_DMAS },
- { "dma-channels", DTP_UINT },
- { "dma-requests", DTP_UINT },
- { NULL, 0 },
-};
-
-static struct {
- char *name; uint32_t v;
-} default_values[] = {
- { "#address-cells", 2 },
- { "#size-cells", 1 },
- { "#dma-cells", 1 },
- { NULL, 0 },
-};
-
-struct _dtr_map {
- uint32_t v; /* phandle */
- char *label; /* alias */
- char *path;
- struct _dtr_map *next;
-};
-typedef struct _dtr_map dtr_map;
-
-struct _dtr {
- dtr_map *aliases;
- dtr_map *symbols;
- dtr_map *phandles;
- char *base_path;
- char *log;
-};
-
-struct _dtr_obj {
- char *path;
- union {
- void *data;
- char *data_str;
- dt_uint *data_int;
- };
- char *name;
- uint32_t length;
- int type;
- char *prefix; /* if the name has a manufacturer's prefix or null */
- char *np_name; /* the name without any prefix. points into .prefix or .name, do not free */
- const char *alias; /* null until first dtr_obj_alias(). do not free */
- const char *symbol; /* null until first dtr_obj_symbol(). do not free */
- dtr *dt;
-};
-
-dtr_map *dtr_map_add(dtr_map *map, uint32_t v, const char *label, const char *path) {
- dtr_map *it;
- dtr_map *nmap = malloc(sizeof(dtr_map));
- memset(nmap, 0, sizeof(dtr_map));
- nmap->v = v;
-
- if (label != NULL) nmap->label = strdup(label);
- if (path != NULL) nmap->path = strdup(path);
- if (map == NULL)
- return nmap;
-
- it = map;
- while(it->next != NULL)
- it = it->next;
- it->next = nmap;
-
- return nmap;
-}
-
-void dtr_map_free(dtr_map *map) {
- dtr_map *it;
- while(map != NULL) {
- it = map->next;
- free(map->label);
- free(map->path);
- free(map);
- map = it;
- }
-}
-
-/* simple sort for maps
- * sv: 1 = sort by v, 0 = sort by label */
-void dtr_map_sort(dtr_map *map, int sv)
-{
- int done = 0, cmp;
- dtr_map *this, *next, *top, *next_top;
- uint32_t tmp_v;
- char *tmp_l, *tmp_p;
- if (map == NULL) return;
- do {
- this = map;
- next_top = NULL;
- while(this != NULL) {
- next = this->next;
- if (this == top)
- break;
- if (next == NULL)
- break;
- if (sv)
- cmp = (this->v > next->v) ? 1 : 0;
- else
- cmp = strcmp(this->label, next->label);
- if (cmp > 0) {
- tmp_v = this->v; this->v = next->v; next->v = tmp_v;
- tmp_l = this->label; this->label = next->label; next->label = tmp_l;
- tmp_p = this->path; this->path = next->path; next->path = tmp_p;
- next_top = this;
- }
- this = next;
- }
- if (next_top == NULL)
- done = 1;
- else
- top = next_top;
- } while (!done);
-}
-
-const char *dtr_phandle_lookup(dtr *s, uint32_t v) {
- dtr_map *phi = s->phandles;
- /* 0 and 0xffffffff are invalid phandle values */
- /* TODO: perhaps "INVALID" or something */
- if (v == 0 || v == 0xffffffff)
- return NULL;
- while(phi != NULL) {
- if (phi->v == v)
- return phi->path;
- phi = phi->next;
- }
- return NULL;
-}
-
-const char *dtr_alias_lookup(dtr *s, const char* label) {
- dtr_map *ali = s->aliases;
- while(ali != NULL) {
- if (strcmp(ali->label, label) == 0)
- return ali->path;
- ali = ali->next;
- }
- return NULL;
-}
-
-const char *dtr_alias_lookup_by_path(dtr *s, const char* path) {
- dtr_map *ali = s->aliases;
- while(ali != NULL) {
- if (strcmp(ali->path, path) == 0)
- return ali->label;
- ali = ali->next;
- }
- return NULL;
-}
-
-const char *dtr_symbol_lookup_by_path(dtr *s, const char* path) {
- dtr_map *ali = s->symbols;
- while(ali != NULL) {
- if (strcmp(ali->path, path) == 0)
- return ali->label;
- ali = ali->next;
- }
- return NULL;
-}
-
-void _dtr_read_aliases(dtr *);
-void _dtr_read_symbols(dtr *);
-void _dtr_map_phandles(dtr *, char *np);
-
-const char *dtr_find_device_tree_root() {
- char *candidates[] = {
- "/proc/device-tree",
- "/sys/firmware/devicetree/base",
- /* others? */
- NULL
- };
- int i = 0;
- while (candidates[i] != NULL) {
- if(access(candidates[i], F_OK) != -1)
- return candidates[i];
- i++;
- }
- return NULL;
-}
-
-dtr *dtr_new_x(const char *base_path, int fast) {
- dtr *dt = malloc(sizeof(dtr));
- if (dt != NULL) {
- memset(dt, 0, sizeof(dtr));
- dt->log = strdup("");
-
- if (base_path == NULL)
- base_path = DTR_ROOT;
-
- if (base_path != NULL)
- dt->base_path = strdup(base_path);
- else {
- dtr_msg(dt, "%s", "Device Tree not found.");
- return dt;
- }
-
- /* build alias and phandle lists */
- dt->aliases = NULL;
- dt->symbols = NULL;
- dt->phandles = NULL;
- if (!fast) {
- _dtr_read_aliases(dt);
- _dtr_read_symbols(dt);
- _dtr_map_phandles(dt, "");
- }
- }
- return dt;
-}
-
-dtr *dtr_new(const char *base_path) {
- return dtr_new_x(base_path, 0);
-}
-
-void dtr_free(dtr *s) {
- if (s != NULL) {
- dtr_map_free(s->aliases);
- dtr_map_free(s->symbols);
- dtr_map_free(s->phandles);
- free(s->base_path);
- free(s->log);
- free(s);
- }
-}
-
-int dtr_was_found(dtr *s) {
- if (s != NULL) {
- if (s->base_path != NULL)
- return 1;
- }
- return 0;
-}
-
-void dtr_msg(dtr *s, char *fmt, ...) {
- gchar *buf, *tmp;
- va_list args;
-
- va_start(args, fmt);
- buf = g_strdup_vprintf(fmt, args);
- va_end(args);
-
- tmp = g_strdup_printf("%s%s", s->log, buf);
- g_free(s->log);
- s->log = tmp;
-}
-
-char *dtr_messages(dtr *s) {
- if (s != NULL)
- return strdup(s->log);
- else
- return NULL;
-}
-
-const char *dtr_base_path(dtr *s) {
- if (s)
- return s->base_path;
- return NULL;
-}
-
-/*glib, but _dt_obj *prop uses malloc() and std types */
-dtr_obj *dtr_obj_read(dtr *s, const char *dtp) {
- char *full_path;
- char *slash, *coma;
- dtr_obj *obj;
-
- if (dtp == NULL)
- return NULL;
-
- obj = malloc(sizeof(dtr_obj));
- if (obj != NULL) {
- memset(obj, 0, sizeof(dtr_obj));
-
- obj->dt = s;
- if (*dtp != '/') {
- /* doesn't start with slash, use alias */
- obj->path = (char*)dtr_alias_lookup(s, dtp);
- if (obj->path != NULL)
- obj->path = strdup(obj->path);
- else {
- dtr_obj_free(obj);
- return NULL;
- }
- } else
- obj->path = strdup(dtp);
-
- /* find name after last slash, or start */
- slash = strrchr(obj->path, '/');
- if (slash != NULL)
- obj->name = strdup(slash + 1);
- else
- obj->name = strdup(obj->path);
-
- /* find manufacturer prefix */
- obj->prefix = strdup(obj->name);
- coma = strchr(obj->prefix, ',');
- if (coma != NULL) {
- /* coma -> null; .np_name starts after */
- *coma = 0;
- obj->np_name = coma + 1;
- } else {
- obj->np_name = obj->name;
- free(obj->prefix);
- obj->prefix = NULL;
- }
-
- /* read data */
- full_path = g_strdup_printf("%s%s", s->base_path, obj->path);
- if ( g_file_test(full_path, G_FILE_TEST_IS_DIR) ) {
- obj->type = DT_NODE;
- } else {
- if (!g_file_get_contents(full_path, (gchar**)&obj->data, (gsize*)&obj->length, NULL)) {
- dtr_obj_free(obj);
- g_free(full_path);
- return NULL;
- }
- obj->type = dtr_guess_type(obj);
- }
- g_free(full_path);
-
- return obj;
- }
- return NULL;
-}
-
-void dtr_obj_free(dtr_obj *s) {
- if (s != NULL) {
- free(s->path);
- free(s->name);
- free(s->prefix);
- free(s->data);
- free(s);
- }
-}
-
-int dtr_obj_type(dtr_obj *s) {
- if (s)
- return s->type;
- return DT_TYPE_ERR;
-}
-
-char *dtr_obj_alias(dtr_obj *s) {
- if (s) {
- if (s->alias == NULL)
- s->alias = dtr_alias_lookup_by_path(s->dt, s->path);
- return (char*)s->alias;
- }
- return NULL;
-}
-
-char *dtr_obj_symbol(dtr_obj *s) {
- if (s) {
- if (s->symbol == NULL)
- s->symbol = dtr_symbol_lookup_by_path(s->dt, s->path);
- return (char*)s->symbol;
- }
- return NULL;
-}
-
-char *dtr_obj_path(dtr_obj *s) {
- if (s)
- return s->path;
- return NULL;
-}
-
-char *dtr_obj_full_path(dtr_obj *s) {
- if (s) {
- if (strcmp(s->path, "/") == 0)
- return g_strdup_printf("%s", s->dt->base_path);
- else
- return g_strdup_printf("%s%s", s->dt->base_path, s->path);
- }
- return NULL;
-}
-
-dtr_obj *dtr_get_prop_obj(dtr *s, dtr_obj *node, const char *name) {
- dtr_obj *prop;
- char *ptmp;
- ptmp = g_strdup_printf("%s/%s", (node == NULL) ? "" : node->path, name);
- prop = dtr_obj_read(s, ptmp);
- g_free(ptmp);
- return prop;
-}
-
-char *dtr_get_prop_str(dtr *s, dtr_obj *node, const char *name) {
- dtr_obj *prop;
- char *ptmp;
- char *ret = NULL;
-
- ptmp = g_strdup_printf("%s/%s", (node == NULL) ? "" : node->path, name);
- prop = dtr_obj_read(s, ptmp);
- if (prop != NULL && prop->data != NULL) {
- ret = strdup(prop->data_str);
- dtr_obj_free(prop);
- }
- g_free(ptmp);
- return ret;
-}
-
-char *dtr_get_string(const char *p, int decode) {
- dtr *dt = dtr_new_x(NULL, 1);
- dtr_obj *obj;
- char *ret = NULL;
- if (decode) {
- obj = dtr_get_prop_obj(dt, NULL, p);
- ret = dtr_str(obj);
- dtr_obj_free(obj);
- } else
- ret = dtr_get_prop_str(dt, NULL, p);
- dtr_free(dt);
- return ret;
-}
-
-uint32_t dtr_get_prop_u32(dtr *s, dtr_obj *node, const char *name) {
- dtr_obj *prop;
- char *ptmp;
- uint32_t ret = 0;
-
- ptmp = g_strdup_printf("%s/%s", (node == NULL) ? "" : node->path, name);
- prop = dtr_obj_read(s, ptmp);
- if (prop != NULL && prop->data != NULL) {
- ret = be32toh(*prop->data_int);
- dtr_obj_free(prop);
- }
- g_free(ptmp);
- return ret;
-}
-
-int dtr_guess_type(dtr_obj *obj) {
- char *tmp, *dash;
- int i = 0, anc = 0, might_be_str = 1;
-
- if (obj->length == 0)
- return DTP_EMPTY;
-
- /* special #(.*)-cells names are UINT */
- if (*obj->name == '#') {
- dash = strrchr(obj->name, '-');
- if (dash != NULL) {
- if (strcmp(dash, "-cells") == 0)
- return DTP_UINT;
- }
- }
-
- /* /aliases/* and /__symbols__/* are always strings */
- if (strncmp(obj->path, "/aliases/", strlen("/aliases/") ) == 0)
- return DTP_STR;
- if (strncmp(obj->path, "/__symbols__/", strlen("/__symbols__/") ) == 0)
- return DTP_STR;
-
- /* /__overrides__/* */
- if (strncmp(obj->path, "/__overrides__/", strlen("/__overrides__/") ) == 0)
- if (strcmp(obj->name, "name") != 0)
- return DTP_OVR;
-
- /* lookup known type */
- while (prop_types[i].name != NULL) {
- if (strcmp(obj->name, prop_types[i].name) == 0)
- return prop_types[i].type;
- i++;
- }
-
- /* maybe a string? */
- for (i = 0; i < obj->length; i++) {
- tmp = obj->data_str + i;
- if ( isalnum(*tmp) ) anc++; /* count the alpha-nums */
- if ( isprint(*tmp) || *tmp == 0 )
- continue;
- might_be_str = 0;
- break;
- }
- if (might_be_str &&
- ( anc >= obj->length - 2 /* all alpha-nums but ^/ and \0$ */
- || anc >= 5 ) /*arbitrary*/)
- return DTP_STR;
-
- /* multiple of 4 bytes, try list of hex values */
- if (!(obj->length % 4))
- return DTP_HEX;
-
- return DTP_UNK;
-}
-
-char *dtr_elem_phref(dtr *s, dt_uint e, int show_path) {
- const char *ph_path, *al_label;
- char *ret = NULL;
- ph_path = dtr_phandle_lookup(s, be32toh(e));
- if (ph_path != NULL) {
- /* TODO: alias or symbol? */
- al_label = dtr_symbol_lookup_by_path(s, ph_path);
- if (al_label != NULL) {
- if (show_path)
- ret = g_strdup_printf("&%s (%s)", al_label, ph_path);
- else
- ret = g_strdup_printf("&%s", al_label);
- } else {
- if (show_path)
- ret = g_strdup_printf("0x%x (%s)", be32toh(e), ph_path);
- }
- }
- if (ret == NULL)
- ret = dtr_elem_hex(e);
- return ret;
-}
-
-char *dtr_elem_hex(dt_uint e) {
- return g_strdup_printf("0x%x", be32toh(e) );
-}
-
-char *dtr_elem_byte(uint8_t e) {
- return g_strdup_printf("%x", e);
-}
-
-char *dtr_elem_uint(dt_uint e) {
- return g_strdup_printf("%u", be32toh(e) );
-}
-
-char *dtr_list_byte(uint8_t *bytes, unsigned long count) {
- char *ret, *dest;
- char buff[4] = ""; /* max element: " 00\0" */
- uint32_t v;
- unsigned long i, l;
- l = count * 4 + 1;
- ret = malloc(l);
- memset(ret, 0, l);
- strcpy(ret, "[");
- dest = ret + 1;
- for (i = 0; i < count; i++) {
- v = bytes[i];
- sprintf(buff, "%s%02x", (i) ? " " : "", v);
- l = strlen(buff);
- strncpy(dest, buff, l);
- dest += l;
- }
- strcpy(dest, "]");
- return ret;
-}
-
-char *dtr_list_hex(dt_uint *list, unsigned long count) {
- char *ret, *dest;
- char buff[12] = ""; /* max element: " 0x00000000\0" */
- unsigned long i, l;
- l = count * 12 + 1;
- dest = ret = malloc(l);
- memset(ret, 0, l);
- for (i = 0; i < count; i++) {
- sprintf(buff, "%s0x%x", (i) ? " " : "", be32toh(list[i]));
- l = strlen(buff);
- strncpy(dest, buff, l);
- dest += l;
- }
- return ret;
-}
-
-/*cstd, except for g_strescape()*/
-char *dtr_list_str0(const char *data, uint32_t length) {
- char *tmp, *esc, *next_str;
- char ret[1024] = "";
- uint32_t l, tl;
-
- /* treat as null-separated string list */
- tl = 0;
- strcpy(ret, "");
- tmp = ret;
- next_str = (char*)data;
- while(next_str != NULL) {
- l = strlen(next_str);
- esc = g_strescape(next_str, NULL);
- sprintf(tmp, "%s\"%s\"",
- strlen(ret) ? ", " : "", esc);
- free(esc);
- tmp += strlen(tmp);
- tl += l + 1; next_str += l + 1;
- if (tl >= length) break;
- }
-
- return strdup(ret);
-}
-
-char *dtr_list_override(dtr_obj *obj) {
- /* <phref, string "property:value"> ... */
- char *ret = NULL;
- char *ph, *str;
- char *src;
- int l, consumed = 0;
- src = obj->data_str;
- while (consumed + 5 <= obj->length) {
- ph = dtr_elem_phref(obj->dt, *(dt_uint*)src, 1);
- src += 4; consumed += 4;
- l = strlen(src) + 1; /* consume the null */
- str = dtr_list_str0(src, l);
- ret = appf(ret, "<%s -> %s>", ph, str);
- src += l; consumed += l;
- free(ph);
- free(str);
- }
- if (consumed < obj->length) {
- str = dtr_list_byte(src, obj->length - consumed);
- ret = appf(ret, "%s", str);
- free(str);
- }
- return ret;
-}
-
-uint32_t dtr_get_phref_prop(dtr *s, uint32_t phandle, char *prop) {
- const char *ph_path;
- char *tmp;
- uint32_t ret;
- ph_path = dtr_phandle_lookup(s, phandle);
- tmp = g_strdup_printf("%s/%s", ph_path, prop);
- ret = dtr_get_prop_u32(s, NULL, tmp);
- free(tmp);
- return ret;
-}
-
-char *dtr_list_phref(dtr_obj *obj, char *ext_cell_prop) {
- /* <phref, #XXX-cells> */
- int count = obj->length / 4;
- int i = 0, ext_cells = 0;
- char *ph_path;
- char *ph, *ext, *ret = NULL;
- while (i < count) {
- if (ext_cell_prop == NULL)
- ext_cells = 0;
- else
- ext_cells = dtr_get_phref_prop(obj->dt, be32toh(obj->data_int[i]), ext_cell_prop);
- ph = dtr_elem_phref(obj->dt, obj->data_int[i], 0); i++;
- if (ext_cells > count - i) ext_cells = count - i;
- ext = dtr_list_hex((obj->data_int + i), ext_cells); i+=ext_cells;
- ret = appf(ret, "<%s%s%s>",
- ph, (ext_cells) ? " " : "", ext);
- g_free(ph);
- g_free(ext);
- }
- return ret;
-}
-
-char *dtr_list_interrupts(dtr_obj *obj) {
- char *ext, *ret = NULL;
- uint32_t iparent, icells;
- int count, i = 0;
-
- iparent = dtr_inh_find(obj, "interrupt-parent", 0);
- if (!iparent) {
- dtr_msg(obj->dt, "Did not find an interrupt-parent for %s", obj->path);
- goto intr_err;
- }
- icells = dtr_get_phref_prop(obj->dt, iparent, "#interrupt-cells");
- if (!icells) {
- dtr_msg(obj->dt, "Invalid #interrupt-cells value %d for %s", icells, obj->path);
- goto intr_err;
- }
-
- count = obj->length / 4;
- while (i < count) {
- icells = MIN(icells, count - i);
- ext = dtr_list_hex((obj->data_int + i), icells); i+=icells;
- ret = appf(ret, "<%s>", ext);
- }
- return ret;
-
-intr_err:
- return dtr_list_hex(obj->data_int, obj->length);
-
-}
-
-char *dtr_list_reg(dtr_obj *obj) {
- char *tup_str, *ret = NULL;
- uint32_t acells, scells, tup_len;
- uint32_t tups, extra, consumed; /* extra and consumed are bytes */
- uint32_t *next;
-
- acells = dtr_inh_find(obj, "#address-cells", 2);
- scells = dtr_inh_find(obj, "#size-cells", 2);
- tup_len = acells + scells;
- tups = obj->length / (tup_len * 4);
- extra = obj->length % (tup_len * 4);
- consumed = 0; /* bytes */
-
- //printf("list reg: %s\n ... acells: %u, scells: %u, extra: %u\n", obj->path, acells, scells, extra);
-
- if (extra) {
- /* error: length is not a multiple of tuples */
- dtr_msg(obj->dt, "Data length (%u) is not a multiple of (#address-cells:%u + #size-cells:%u) for %s\n",
- obj->length, acells, scells, obj->path);
- return dtr_list_hex(obj->data, obj->length / 4);
- }
-
- next = obj->data_int;
- consumed = 0;
- while (consumed + (tup_len * 4) <= obj->length) {
- tup_str = dtr_list_hex(next, tup_len);
- ret = appf(ret, "<%s>", tup_str);
- free(tup_str);
- consumed += (tup_len * 4);
- next += tup_len;
- }
-
- //printf(" ... %s\n", ret);
- return ret;
-}
-
-char* dtr_str(dtr_obj *obj) {
- char *ret;
- int type;
-
- if (obj == NULL) return NULL;
- type = obj->type;
-
- if (type == DTP_PH_REF) {
- if (!DTEX_PHREFS || obj->length != 4)
- type = DTP_HEX;
- }
-
- switch(type) {
- case DT_NODE:
- ret = strdup("{node}");
- break;
- case DTP_EMPTY:
- ret = strdup("{empty}");
- break;
- case DTP_STR:
- ret = dtr_list_str0(obj->data_str, obj->length);
- break;
- case DTP_OVR:
- ret = dtr_list_override(obj);
- break;
- case DTP_REG:
- /* <#address-cells #size-cells> */
- ret = dtr_list_reg(obj);
- break;
- case DTP_INTRUPT:
- ret = dtr_list_interrupts(obj);
- break;
- case DTP_INTRUPT_EX:
- /* <phref, #interrupt-cells"> */
- ret = dtr_list_phref(obj, "#interrupt-cells");
- break;
- case DTP_CLOCKS:
- /* <phref, #clock-cells"> */
- ret = dtr_list_phref(obj, "#clock-cells");
- break;
- case DTP_GPIOS:
- /* <phref, #gpio-cells"> */
- ret = dtr_list_phref(obj, "#gpio-cells");
- break;
- case DTP_DMAS:
- /* <phref, #dma-cells"> */
- ret = dtr_list_phref(obj, "#dma-cells");
- break;
- case DTP_PH:
- case DTP_HEX:
- if (obj->length % 4)
- ret = dtr_list_byte((uint8_t*)obj->data, obj->length);
- else
- ret = dtr_list_hex(obj->data, obj->length / 4);
- break;
- case DTP_PH_REF:
- ret = dtr_elem_phref(obj->dt, *obj->data_int, 1);
- break;
- case DTP_UINT:
- ret = dtr_elem_uint(*obj->data_int);
- break;
- case DTP_UNK:
- default:
- if (obj->length > 64) /* maybe should use #define at the top */
- ret = g_strdup_printf(ret, "{data} (%lu bytes)", obj->length);
- else
- ret = dtr_list_byte((uint8_t*)obj->data, obj->length);
- break;
- }
-
- return ret;
-}
-
-dtr_obj *dtr_get_parent_obj(dtr_obj *obj) {
- char *slash, *parent;
- dtr_obj *ret = NULL;
-
- if (obj == NULL)
- return NULL;
-
- parent = strdup(obj->path);
- slash = strrchr(parent, '/');
- if (slash != NULL) {
- *slash = 0;
- if (strlen(parent) > 0)
- ret = dtr_obj_read(obj->dt, parent);
- else
- ret = dtr_obj_read(obj->dt, "/");
- }
- free(parent);
- return ret;
-}
-
-/* find the value of a path-inherited property by climbing the path */
-int dtr_inh_find(dtr_obj *obj, char *qprop, int limit) {
- dtr_obj *tobj, *pobj, *qobj;
- uint32_t ret = 0;
- int i, found = 0;
-
- if (!limit) limit = 1000;
-
- tobj = obj;
- while (tobj != NULL) {
- pobj = dtr_get_parent_obj(tobj);
- if (tobj != obj)
- dtr_obj_free(tobj);
- if (!limit || pobj == NULL) break;
- qobj = dtr_get_prop_obj(obj->dt, pobj, qprop);
- if (qobj != NULL) {
- ret = be32toh(*qobj->data_int);
- found = 1;
- dtr_obj_free(qobj);
- break;
- }
- tobj = pobj;
- limit--;
- }
- dtr_obj_free(pobj);
-
- if (!found) {
- i = 0;
- while(default_values[i].name != NULL) {
- if (strcmp(default_values[i].name, qprop) == 0) {
- ret = default_values[i].v;
- dtr_msg(obj->dt, "Using default value %d for %s in %s\n", ret, qprop, obj->path);
- break;
- }
- i++;
- }
- }
-
- return ret;
-}
-
-void _dtr_read_aliases(dtr *s) {
- gchar *dir_path;
- GDir *dir;
- const gchar *fn;
- dtr_obj *anode, *prop;
- dtr_map *al;
- anode = dtr_obj_read(s, "/aliases");
-
- dir_path = g_strdup_printf("%s/aliases", s->base_path);
- dir = g_dir_open(dir_path, 0 , NULL);
- if (dir) {
- while((fn = g_dir_read_name(dir)) != NULL) {
- prop = dtr_get_prop_obj(s, anode, fn);
- if (prop->type == DTP_STR) {
- if (*prop->data_str == '/') {
- al = dtr_map_add(s->aliases, 0, prop->name, prop->data_str);
- if (s->aliases == NULL)
- s->aliases = al;
- }
- }
- dtr_obj_free(prop);
- }
- }
- g_dir_close(dir);
- g_free(dir_path);
- dtr_obj_free(anode);
- dtr_map_sort(s->aliases, 0);
-}
-
-void _dtr_read_symbols(dtr *s) {
- gchar *dir_path;
- GDir *dir;
- const gchar *fn;
- dtr_obj *anode, *prop;
- dtr_map *al;
- anode = dtr_obj_read(s, "/__symbols__");
-
- dir_path = g_strdup_printf("%s/__symbols__", s->base_path);
- dir = g_dir_open(dir_path, 0 , NULL);
- if (dir) {
- while((fn = g_dir_read_name(dir)) != NULL) {
- prop = dtr_get_prop_obj(s, anode, fn);
- if (prop->type == DTP_STR) {
- if (*prop->data_str == '/') {
- al = dtr_map_add(s->symbols, 0, prop->name, prop->data_str);
- if (s->symbols == NULL)
- s->symbols = al;
- }
- }
- dtr_obj_free(prop);
- }
- }
- g_dir_close(dir);
- g_free(dir_path);
- dtr_obj_free(anode);
- dtr_map_sort(s->symbols, 0);
-}
-
-/* TODO: rewrite */
-void _dtr_map_phandles(dtr *s, char *np) {
- gchar *dir_path;
- gchar *ftmp, *ntmp, *ptmp;
- const gchar *fn;
- GDir *dir;
- dtr_obj *prop, *ph_prop;
- dtr_map *ph;
- uint32_t phandle;
-
- if (np == NULL) np = "";
- dir_path = g_strdup_printf("%s/%s", s->base_path, np);
-
- prop = dtr_obj_read(s, np);
- dir = g_dir_open(dir_path, 0 , NULL);
- if (dir) {
- while((fn = g_dir_read_name(dir)) != NULL) {
- ftmp = g_strdup_printf("%s/%s", dir_path, fn);
- if ( g_file_test(ftmp, G_FILE_TEST_IS_DIR) ) {
- ntmp = g_strdup_printf("%s/%s", np, fn);
- ptmp = g_strdup_printf("%s/phandle", ntmp);
- ph_prop = dtr_obj_read(s, ptmp);
- if (ph_prop != NULL) {
- ph = dtr_map_add(s->phandles, be32toh(*ph_prop->data_int), NULL, ntmp);
- if (s->phandles == NULL)
- s->phandles = ph;
- }
- _dtr_map_phandles(s, ntmp);
- g_free(ptmp);
- g_free(ntmp);
- dtr_obj_free(ph_prop);
- }
- g_free(ftmp);
- }
- }
- g_dir_close(dir);
- dtr_obj_free(prop);
- dtr_map_sort(s->phandles, 1);
-}
-
-/*
- * Maybe these should move to devicetree.c, but would have to expose
- * struct internals.
- */
-
-/* kvl: 0 = key is label, 1 = key is v */
-char *dtr_map_info_section(dtr *s, dtr_map *map, char *title, int kvl) {
- gchar *tmp, *ret;
- const gchar *sym;
- ret = g_strdup_printf("[%s]\n", _(title));
- dtr_map *it = map;
- while(it != NULL) {
- if (kvl) {
- sym = dtr_symbol_lookup_by_path(s, it->path);
- if (sym != NULL)
- tmp = g_strdup_printf("%s0x%x (%s)=%s\n", ret,
- it->v, sym, it->path);
- else
- tmp = g_strdup_printf("%s0x%x=%s\n", ret,
- it->v, it->path);
- } else
- tmp = g_strdup_printf("%s%s=%s\n", ret,
- it->label, it->path);
- g_free(ret);
- ret = tmp;
- it = it->next;
- }
-
- return ret;
-}
-
-char *dtr_maps_info(dtr *s) {
- gchar *ph_map, *al_map, *sy_map, *ret;
-
- ph_map = dtr_map_info_section(s, s->phandles, _("phandle Map"), 1);
- al_map = dtr_map_info_section(s, s->aliases, _("Alias Map"), 0);
- sy_map = dtr_map_info_section(s, s->symbols, _("Symbol Map"), 0);
- ret = g_strdup_printf("%s%s%s", ph_map, sy_map, al_map);
- g_free(ph_map);
- g_free(al_map);
- g_free(sy_map);
- return ret;
-}
-
-char *appf(char *src, char *fmt, ...) {
- gchar *buf, *ret;
- va_list args;
-
- va_start(args, fmt);
- buf = g_strdup_vprintf(fmt, args);
- va_end(args);
-
- if (src != NULL) {
- ret = g_strdup_printf("%s%s%s", src, sp_sep(src), buf);
- g_free(buf);
- g_free(src);
- } else
- ret = buf;
-
- return ret;
-}
-
diff --git a/modules/devices/devmemory.c b/modules/devices/devmemory.c
index 080e2bbe..29094dd8 100644
--- a/modules/devices/devmemory.c
+++ b/modules/devices/devmemory.c
@@ -23,7 +23,7 @@ GHashTable *memlabels = NULL;
void scan_memory_do(void)
{
- gchar **keys, *tmp, *tmp_label;
+ gchar **keys, *tmp, *tmp_label, *trans_val;
static gint offset = -1;
gint i;
@@ -68,12 +68,20 @@ void scan_memory_do(void)
tmp_label = ""; /* or newkeys[0] */
/* although it doesn't matter... */
- moreinfo_add_with_prefix("DEV", newkeys[0], g_strdup(newkeys[1]));
+ if (strstr(newkeys[1], "kB")) {
+ trans_val = g_strdup_printf("%d %s", atoi(newkeys[1]), _("KiB") );
+ } else {
+ trans_val = strdup(newkeys[1]);
+ }
- tmp = g_strconcat(meminfo, newkeys[0], "=", newkeys[1], "|", tmp_label, "\n", NULL);
+ moreinfo_add_with_prefix("DEV", newkeys[0], g_strdup(trans_val));
+
+ tmp = g_strconcat(meminfo, newkeys[0], "=", trans_val, "|", tmp_label, "\n", NULL);
g_free(meminfo);
meminfo = tmp;
+ g_free(trans_val);
+
tmp = g_strconcat(lginterval,
"UpdateInterval$", newkeys[0], "=1000\n", NULL);
g_free(lginterval);
diff --git a/modules/devices/dmi.c b/modules/devices/dmi.c
index 5f87df13..b25cfe21 100644
--- a/modules/devices/dmi.c
+++ b/modules/devices/dmi.c
@@ -22,27 +22,38 @@
#include <sys/types.h>
#include "devices.h"
+#include "dmi_util.h"
typedef struct _DMIInfo DMIInfo;
struct _DMIInfo {
const gchar *name;
- const gchar *file; /* for sysfs */
- const gchar *param; /* for dmidecode */
+ const gchar *id_str;
+ int group;
};
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#0", "/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" },
- { "$Product", NULL, NULL },
- { "Name", "/sys/class/dmi/id/product_name", "system-product-name" },
- { "Family", "/sys/class/dmi/id/product_family", "system-product-family" },
- { "Version#1", "/sys/class/dmi/id/product_version", "system-product-version" },
+ { N_("Product"), NULL, 1 },
+ { N_("Name"), "system-product-name", 0 },
+ { N_("Family"), "system-product-family", 0 },
+ { N_("Vendor"), "system-manufacturer", 0 },
+ { N_("Version"), "system-version", 0 },
+ { N_("BIOS"), NULL, 1 },
+ { N_("Date"), "bios-release-date", 0 },
+ { N_("Vendor"), "bios-vendor", 0 },
+ { N_("Version"), "bios-version", 0 },
+ { N_("Board"), NULL, 1 },
+ { N_("Name"), "baseboard-product-name", 0 },
+ { N_("Vendor"), "baseboard-manufacturer", 0 },
+ { N_("Version"), "baseboard-version", 0 },
+ { N_("Serial Number"), "baseboard-serial-number", 0 },
+ { N_("Asset Tag"), "baseboard-asset-tag", 0 },
+ { N_("Chassis"), NULL, 1 },
+ { N_("Vendor"), "chassis-manufacturer", 0 },
+ { N_("Type"), "chassis-type", 0 },
+ { N_("Version"), "chassis-version", 0 },
+ { N_("Serial Number"), "chassis-serial-number", 0 },
+ { N_("Asset Tag"), "chassis-asset-tag", 0 },
};
gchar *dmi_info = NULL;
@@ -53,91 +64,13 @@ static void add_to_moreinfo(const char *group, const char *key, char *value)
moreinfo_add_with_prefix("DEV", new_key, g_strdup(g_strstrip(value)));
}
-gboolean dmi_get_info_dmidecode()
+gboolean dmi_get_info()
{
- FILE *dmi_pipe;
- gchar buffer[256];
- const gchar *group;
- 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) == '$') {
- group = info->name + 1;
- dmi_info = h_strdup_cprintf("[%s]\n", dmi_info, group);
- } else {
- gchar *temp;
-
- if (!info->param)
- continue;
-
- temp = g_strconcat("dmidecode -s ", info->param, NULL);
- if ((dmi_pipe = popen(temp, "r"))) {
- g_free(temp);
-
- (void)fgets(buffer, 256, dmi_pipe);
- if (pclose(dmi_pipe)) {
- dmi_failed = TRUE;
- break;
- }
-
- add_to_moreinfo(group, info->name, buffer);
-
- const gchar *url = vendor_get_url(buffer);
- if (url) {
- const gchar *vendor = vendor_get_name(buffer);
- if (g_strstr_len(vendor, -1, g_strstrip(buffer)) ||
- g_strstr_len(g_strstrip(buffer), -1, vendor)) {
- dmi_info = h_strdup_cprintf("%s=%s (%s)\n",
- dmi_info,
- info->name,
- g_strstrip(buffer),
- url);
- } else {
- dmi_info = h_strdup_cprintf("%s=%s (%s, %s)\n",
- dmi_info,
- info->name,
- g_strstrip(buffer),
- vendor, url);
- }
- } else {
- 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];
const gchar *group = NULL;
DMIInfo *info;
gboolean dmi_succeeded = FALSE;
gint i;
+ gchar *value;
if (dmi_info) {
g_free(dmi_info);
@@ -147,45 +80,40 @@ gboolean dmi_get_info_sys()
for (i = 0; i < G_N_ELEMENTS(dmi_info_table); i++) {
info = &dmi_info_table[i];
- if (*(info->name) == '$') {
- group = info->name + 1;
- dmi_info = h_strdup_cprintf("[%s]\n", dmi_info, group);
- } else if (group && info->file) {
- if ((dmi_file = fopen(info->file, "r"))) {
- (void)fgets(buffer, 256, dmi_file);
- fclose(dmi_file);
+ if (info->group) {
+ group = info->name;
+ dmi_info = h_strdup_cprintf("[%s]\n", dmi_info, _(info->name) );
+ } else if (group && info->id_str) {
+ if (strcmp(info->id_str, "chassis-type") == 0)
+ value = dmi_chassis_type_str(-1, 1);
+ else
+ value = dmi_get_str(info->id_str);
- add_to_moreinfo(group, info->name, buffer);
+ if (value != NULL) {
+ add_to_moreinfo(group, info->name, value);
- const gchar *url = vendor_get_url(buffer);
+ const gchar *url = vendor_get_url(value);
if (url) {
- const gchar *vendor = vendor_get_name(buffer);
- if (g_strstr_len(vendor, -1, g_strstrip(buffer)) ||
- g_strstr_len(g_strstrip(buffer), -1, vendor)) {
- dmi_info = h_strdup_cprintf("%s=%s (%s)\n",
- dmi_info,
- info->name,
- g_strstrip(buffer),
- url);
- } else {
- dmi_info = h_strdup_cprintf("%s=%s (%s, %s)\n",
- dmi_info,
- info->name,
- g_strstrip(buffer),
- vendor, url);
- }
+ const gchar *vendor = vendor_get_name(value);
+ dmi_info = h_strdup_cprintf("%s=%s (%s, %s)\n",
+ dmi_info,
+ _(info->name),
+ value,
+ vendor, url);
} else {
dmi_info = h_strdup_cprintf("%s=%s\n",
dmi_info,
- info->name,
- g_strstrip(buffer));
+ _(info->name),
+ value);
}
dmi_succeeded = TRUE;
} else {
dmi_info = h_strdup_cprintf("%s=%s\n",
dmi_info,
- info->name,
- _("(Not available; Perhaps try running HardInfo as root.)") );
+ _(info->name),
+ (getuid() == 0)
+ ? _("(Not available)")
+ : _("(Not available; Perhaps try running HardInfo as root.)") );
}
}
}
@@ -202,11 +130,7 @@ void __scan_dmi()
{
gboolean dmi_ok;
- dmi_ok = dmi_get_info_sys();
-
- if (!dmi_ok) {
- dmi_ok = dmi_get_info_dmidecode();
- }
+ dmi_ok = dmi_get_info();
if (!dmi_ok) {
dmi_info = g_strdup("[No DMI information]\n"
diff --git a/modules/devices/usb.c b/modules/devices/usb.c
index e5088bd2..9366c7ce 100644
--- a/modules/devices/usb.c
+++ b/modules/devices/usb.c
@@ -394,6 +394,7 @@ gboolean __scan_usb_lsusb(void)
if (!temp_lsusb) {
DEBUG("cannot create temporary file for lsusb");
pclose(lsusb);
+ g_free(temp);
return FALSE;
}
diff --git a/modules/network/net.c b/modules/network/net.c
index 99a5e616..a75cf8b6 100644
--- a/modules/network/net.c
+++ b/modules/network/net.c
@@ -306,24 +306,19 @@ remove_net_devices(gpointer key, gpointer value, gpointer data)
#ifdef HAS_LINUX_WE
const char *wifi_bars(int signal, int noise)
{
- float quality;
+ signal = -signal;
- if (signal <= -100)
- quality = 0.0;
- else if (signal >= -50)
- quality = 1.0;
- else
- quality = (2.0 * (signal + 100.0)) / 100.0;
-
- if (quality < 0.20)
- return "▰▱▱▱▱";
- if (quality < 0.40)
- return "▰▰▱▱▱";
- if (quality < 0.60)
- return "▰▰▰▱▱";
- if (quality < 0.80)
+ if (signal > 80)
+ return "▰▰▰▰▰";
+ if (signal > 55)
return "▰▰▰▰▱";
- return "▰▰▰▰▰";
+ if (signal > 30)
+ return "▰▰▰▱▱";
+ if (signal > 15)
+ return "▰▰▱▱▱";
+ if (signal > 5)
+ return "▰▱▱▱▱";
+ return "▱▱▱▱▱";
}
#endif
diff --git a/modules/network/samba.c b/modules/network/samba.c
index 71ba6ab6..7e8dc46c 100644
--- a/modules/network/samba.c
+++ b/modules/network/samba.c
@@ -31,7 +31,7 @@ scan_samba(void)
{
gchar *str;
gsize length;
-
+
if (smb_shares_list) {
g_free(smb_shares_list);
smb_shares_list = g_strdup("");
@@ -41,7 +41,7 @@ scan_samba(void)
&str, &length, NULL)) {
shell_status_update("Scanning SAMBA shares...");
scan_samba_from_string(str, length);
- g_free(str);
+ g_free(str);
}
scan_samba_usershares();
@@ -51,32 +51,34 @@ void
scan_samba_usershares(void)
{
FILE *usershare_list;
-
- if ((usershare_list = popen("net usershare list", "r"))) {
- char buffer[512];
-
+ gboolean spawned;
+ int status;
+ gchar *out, *err, *p, *next_nl;
+ gchar *usershare, *cmdline;
+ gsize length;
+
+ spawned = g_spawn_command_line_sync("net usershare list",
+ &out, &err, &status, NULL);
+
+ if (spawned && status == 0 && out != NULL) {
shell_status_update("Scanning SAMBA user shares...");
-
- while (fgets(buffer, 512, usershare_list)) {
- gchar *usershare, *cmdline;
- gsize length;
-
+ p = out;
+ while(next_nl = strchr(p, '\n')) {
cmdline = g_strdup_printf("net usershare info '%s'",
- strend(buffer, '\n'));
+ strend(p, '\n'));
if (g_spawn_command_line_sync(cmdline,
- &usershare, NULL,
- NULL, NULL)) {
+ &usershare, NULL, NULL, NULL)) {
length = strlen(usershare);
scan_samba_from_string(usershare, length);
g_free(usershare);
}
-
g_free(cmdline);
-
+
shell_status_pulse();
+ p = next_nl + 1;
}
-
- pclose(usershare_list);
+ g_free(out);
+ g_free(err);
}
}
@@ -87,13 +89,13 @@ scan_samba_from_string(gchar *str, gsize length)
GError *error = NULL;
gchar **groups;
gint i = 0;
-
+
keyfile = g_key_file_new();
-
+
gchar *_smbconf = str;
for (; *_smbconf; _smbconf++)
if (*_smbconf == ';') *_smbconf = '\0';
-
+
if (!g_key_file_load_from_data(keyfile, str, length, 0, &error)) {
smb_shares_list = g_strdup("Cannot parse smb.conf=\n");
if (error)
@@ -112,12 +114,12 @@ scan_samba_from_string(gchar *str, gsize length)
groups[i], path);
g_free(path);
}
-
+
i++;
}
-
+
g_strfreev(groups);
-
+
cleanup:
g_key_file_free(keyfile);
}