diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/benchmark.c | 139 | ||||
-rw-r--r-- | modules/benchmark/bench_results.c | 413 | ||||
-rw-r--r-- | modules/computer.c | 110 | ||||
-rw-r--r-- | modules/computer/boots.c | 58 | ||||
-rw-r--r-- | modules/computer/display.c | 83 | ||||
-rw-r--r-- | modules/computer/uptime.c | 1 | ||||
-rw-r--r-- | modules/devices.c | 41 | ||||
-rw-r--r-- | modules/devices/arm/processor.c | 20 | ||||
-rw-r--r-- | modules/devices/cpu_util.c | 225 | ||||
-rw-r--r-- | modules/devices/cpubits.c | 113 | ||||
-rw-r--r-- | modules/devices/devicetree.c | 130 | ||||
-rw-r--r-- | modules/devices/devicetree/dt_util.c | 1040 | ||||
-rw-r--r-- | modules/devices/devmemory.c | 14 | ||||
-rw-r--r-- | modules/devices/dmi.c | 176 | ||||
-rw-r--r-- | modules/devices/usb.c | 1 | ||||
-rw-r--r-- | modules/network/net.c | 27 | ||||
-rw-r--r-- | modules/network/samba.c | 50 |
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); } |