diff options
| author | Simon Quigley <tsimonq2@ubuntu.com> | 2017-11-25 13:35:47 -0600 | 
|---|---|---|
| committer | Simon Quigley <tsimonq2@ubuntu.com> | 2017-11-25 13:35:47 -0600 | 
| commit | 11e616945340e87a1f567ab92e6dfac3068875b1 (patch) | |
| tree | 451c1385230f29d3f4deef777b41609bed6e8090 /modules | |
| parent | 9a9db98089717990cd5e0eef529f6bb0819ebe46 (diff) | |
New upstream version 0.5.1+git20171103
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);  } | 
