diff options
Diffstat (limited to 'modules')
67 files changed, 0 insertions, 16706 deletions
diff --git a/modules/benchmark.c b/modules/benchmark.c deleted file mode 100644 index 26de9557..00000000 --- a/modules/benchmark.c +++ /dev/null @@ -1,720 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <hardinfo.h> -#include <iconcache.h> -#include <shell.h> -#include <config.h> -#include <syncmanager.h> - -#include <sys/time.h> -#include <sys/resource.h> - -#include <sys/types.h> -#include <signal.h> - -#include "benchmark.h" - -#include "benchmark/bench_results.c" - -bench_value bench_results[BENCHMARK_N_ENTRIES]; - -static void do_benchmark(void (*benchmark_function)(void), int entry); -static gchar *benchmark_include_results_reverse(bench_value result, const gchar * benchmark); -static gchar *benchmark_include_results(bench_value result, const gchar * benchmark); - -/* ModuleEntry entries, scan_*(), callback_*(), etc. */ -#include "benchmark/benches.c" - -static gboolean sending_benchmark_results = FALSE; - -char *bench_value_to_str(bench_value r) { - return g_strdup_printf("%lf; %lf; %d", r.result, r.elapsed_time, r.threads_used); -} - -bench_value bench_value_from_str(const char* str) { - bench_value ret = EMPTY_BENCH_VALUE; - double r, e; - int t, c; - if (str) { - c = sscanf(str, "%lf; %lf; %d", &r, &e, &t); - if (c >= 3) { - ret.result = r; - ret.elapsed_time = e; - ret.threads_used = t; - } - } - return ret; -} - -typedef struct _ParallelBenchTask ParallelBenchTask; - -struct _ParallelBenchTask { - gint thread_number; - guint start, end; - gpointer data, callback; - int *stop; -}; - -static gpointer benchmark_crunch_for_dispatcher(gpointer data) -{ - ParallelBenchTask *pbt = (ParallelBenchTask *)data; - gpointer (*callback)(void *data, gint thread_number); - gpointer return_value = g_malloc(sizeof(int)); - int count = 0; - - if ((callback = pbt->callback)) { - while(!*pbt->stop) { - callback(pbt->data, pbt->thread_number); - /* don't count if didn't finish in time */ - if (!*pbt->stop) - count++; - } - } else { - DEBUG("this is thread %p; callback is NULL and it should't be!", g_thread_self()); - } - - g_free(pbt); - - *(double*)return_value = (double)count; - return return_value; -} - -bench_value benchmark_crunch_for(float seconds, gint n_threads, - gpointer callback, gpointer callback_data) { - int cpu_procs, cpu_cores, cpu_threads, thread_number, stop = 0; - GSList *threads = NULL, *t; - GTimer *timer; - bench_value ret = EMPTY_BENCH_VALUE; - - timer = g_timer_new(); - - cpu_procs_cores_threads(&cpu_procs, &cpu_cores, &cpu_threads); - if (n_threads > 0) - ret.threads_used = n_threads; - else if (n_threads < 0) - ret.threads_used = cpu_cores; - else - ret.threads_used = cpu_threads; - - g_timer_start(timer); - for (thread_number = 0; thread_number < ret.threads_used; thread_number++) { - ParallelBenchTask *pbt = g_new0(ParallelBenchTask, 1); - GThread *thread; - - DEBUG("launching thread %d", thread_number); - - pbt->thread_number = thread_number; - pbt->data = callback_data; - pbt->callback = callback; - pbt->stop = &stop; - - thread = g_thread_new("dispatcher", - (GThreadFunc)benchmark_crunch_for_dispatcher, pbt); - threads = g_slist_prepend(threads, thread); - - DEBUG("thread %d launched as context %p", thread_number, thread); - } - - /* wait for time */ - //while ( g_timer_elapsed(timer, NULL) < seconds ) { } - g_usleep(seconds * 1000000); - - /* signal all threads to stop */ - stop = 1; - g_timer_stop(timer); - - ret.result = 0; - DEBUG("waiting for all threads to finish"); - for (t = threads; t; t = t->next) { - DEBUG("waiting for thread with context %p", t->data); - gpointer *rv = g_thread_join((GThread *)t->data); - ret.result += *(double*)rv; - g_free(rv); - } - - ret.elapsed_time = g_timer_elapsed(timer, NULL); - - g_slist_free(threads); - g_timer_destroy(timer); - - return ret; -} - -static gpointer benchmark_parallel_for_dispatcher(gpointer data) -{ - ParallelBenchTask *pbt = (ParallelBenchTask *)data; - gpointer (*callback)(unsigned int start, unsigned int end, void *data, gint thread_number); - gpointer return_value = NULL; - - if ((callback = pbt->callback)) { - DEBUG("this is thread %p; items %d -> %d, data %p", g_thread_self(), - pbt->start, pbt->end, pbt->data); - return_value = callback(pbt->start, pbt->end, pbt->data, pbt->thread_number); - DEBUG("this is thread %p; return value is %p", g_thread_self(), return_value); - } else { - DEBUG("this is thread %p; callback is NULL and it should't be!", g_thread_self()); - } - - g_free(pbt); - - return return_value; -} - -/* one call for each thread to be used */ -bench_value benchmark_parallel(gint n_threads, gpointer callback, gpointer callback_data) { - int cpu_procs, cpu_cores, cpu_threads; - cpu_procs_cores_threads(&cpu_procs, &cpu_cores, &cpu_threads); - if (n_threads == 0) n_threads = cpu_threads; - else if (n_threads == -1) n_threads = cpu_cores; - return benchmark_parallel_for(n_threads, 0, n_threads, callback, callback_data); -} - -/* Note: - * benchmark_parallel_for(): element [start] included, but [end] is excluded. - * callback(): expected to processes elements [start] through [end] inclusive. - */ -bench_value benchmark_parallel_for(gint n_threads, guint start, guint end, - gpointer callback, gpointer callback_data) { - gchar *temp; - int cpu_procs, cpu_cores, cpu_threads; - guint iter_per_thread, iter, thread_number = 0; - GSList *threads = NULL, *t; - GTimer *timer; - - bench_value ret = EMPTY_BENCH_VALUE; - - timer = g_timer_new(); - - cpu_procs_cores_threads(&cpu_procs, &cpu_cores, &cpu_threads); - - if (n_threads > 0) - ret.threads_used = n_threads; - else if (n_threads < 0) - ret.threads_used = cpu_cores; - else - ret.threads_used = cpu_threads; - - while (ret.threads_used > 0) { - iter_per_thread = (end - start) / ret.threads_used; - - if (iter_per_thread == 0) { - DEBUG("not enough items per thread; disabling one thread"); - ret.threads_used--; - } else { - break; - } - } - - DEBUG("Using %d threads across %d logical processors; processing %d elements (%d per thread)", - ret.threads_used, cpu_threads, (end - start), iter_per_thread); - - g_timer_start(timer); - for (iter = start; iter < end; ) { - ParallelBenchTask *pbt = g_new0(ParallelBenchTask, 1); - GThread *thread; - - guint ts = iter, te = iter + iter_per_thread; - /* add the remainder of items/iter_per_thread to the last thread */ - if (end - te < iter_per_thread) - te = end; - iter = te; - - DEBUG("launching thread %d", 1 + thread_number); - - pbt->thread_number = thread_number++; - pbt->start = ts; - pbt->end = te - 1; - pbt->data = callback_data; - pbt->callback = callback; - - thread = g_thread_new("dispatcher", - (GThreadFunc)benchmark_parallel_for_dispatcher, pbt); - threads = g_slist_prepend(threads, thread); - - DEBUG("thread %d launched as context %p", thread_number, thread); - } - - DEBUG("waiting for all threads to finish"); - for (t = threads; t; t = t->next) { - DEBUG("waiting for thread with context %p", t->data); - gpointer *rv = g_thread_join((GThread *)t->data); - if (rv) { - if (ret.result == -1.0) ret.result = 0; - ret.result += *(double*)rv; - } - g_free(rv); - } - - g_timer_stop(timer); - ret.elapsed_time = g_timer_elapsed(timer, NULL); - - g_slist_free(threads); - g_timer_destroy(timer); - - DEBUG("finishing; all threads took %f seconds to finish", ret.elapsed_time); - - return ret; -} - -static gchar *clean_cpuname(gchar *cpuname) -{ - gchar *ret = NULL, *tmp; - gchar *remove[] = { - "(R)", "(r)", "(TM)", "(tm)", "Processor", - "Technology", "processor", "CPU", - "cpu", "Genuine", "Authentic", NULL - }; - gint i; - - ret = g_strdup(cpuname); - for (i = 0; remove[i]; i++) { - tmp = strreplace(ret, remove[i], ""); - g_free(ret); - ret = tmp; - } - - ret = strend(ret, '@'); - ret = g_strstrip(ret); - - tmp = g_strdup(ret); - g_free(ret); - - 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->bvalue.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(bench_value r, - const gchar * benchmark, - ShellOrderType order_type) -{ - bench_result *b = NULL; - GKeyFile *conf; - gchar **machines, *temp = NULL;; - gchar *path, *results = g_strdup(""), *return_value, *processor_frequency, *processor_name; - int i, n_threads; - - moreinfo_del_with_prefix("BENCH"); - - if (r.result > 0.0) { - b = bench_result_this_machine(benchmark, r); - 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(); - - path = g_build_filename(g_get_home_dir(), ".hardinfo", "benchmark.conf", NULL); - if (!g_file_test(path, G_FILE_TEST_EXISTS)) { - DEBUG("local benchmark.conf not found, trying system-wide"); - g_free(path); - path = g_build_filename(params.path_data, "benchmark.conf", NULL); - } - - 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 **values; - bench_result *sbr; - - values = g_key_file_get_string_list(conf, benchmark, machines[i], NULL, NULL); - - 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); - - 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; -} - -static gchar *benchmark_include_results_reverse(bench_value result, const gchar * benchmark) -{ - return __benchmark_include_results(result, benchmark, SHELL_ORDER_DESCENDING); -} - -static gchar *benchmark_include_results(bench_value result, const gchar * benchmark) -{ - return __benchmark_include_results(result, benchmark, SHELL_ORDER_ASCENDING); -} - -typedef struct _BenchmarkDialog BenchmarkDialog; -struct _BenchmarkDialog { - GtkWidget *dialog; - bench_value r; -}; - -static gboolean do_benchmark_handler(GIOChannel *source, - GIOCondition condition, - gpointer data) -{ - BenchmarkDialog *bench_dialog = (BenchmarkDialog*)data; - GIOStatus status; - gchar *result; - bench_value r = EMPTY_BENCH_VALUE; - - status = g_io_channel_read_line(source, &result, NULL, NULL, NULL); - if (status != G_IO_STATUS_NORMAL) { - DEBUG("error while reading benchmark result"); - r.result = -1.0f; - bench_dialog->r = r; - gtk_widget_destroy(bench_dialog->dialog); - return FALSE; - } - - r = bench_value_from_str(result); - bench_dialog->r = r; - - gtk_widget_destroy(bench_dialog->dialog); - g_free(result); - - return FALSE; -} - -static void do_benchmark(void (*benchmark_function)(void), int entry) -{ - int old_priority = 0; - - if (params.gui_running && !sending_benchmark_results) { - gchar *argv[] = { params.argv0, "-b", entries[entry].name, - "-m", "benchmark.so", "-a", NULL }; - GPid bench_pid; - gint bench_stdout; - GtkWidget *bench_dialog; - GtkWidget *bench_image; - BenchmarkDialog *benchmark_dialog; - GSpawnFlags spawn_flags = G_SPAWN_STDERR_TO_DEV_NULL; - gchar *bench_status; - - bench_value r = EMPTY_BENCH_VALUE; - bench_results[entry] = r; - - bench_status = g_strdup_printf(_("Benchmarking: <b>%s</b>."), entries[entry].name); - - shell_view_set_enabled(FALSE); - shell_status_update(bench_status); - - g_free(bench_status); - - 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, - GTK_BUTTONS_NONE, - _("Benchmarking. Please do not move your mouse " \ - "or press any keys.")); - 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(); - } - - benchmark_dialog = g_new0(BenchmarkDialog, 1); - benchmark_dialog->dialog = bench_dialog; - benchmark_dialog->r = r; - - if (!g_path_is_absolute(params.argv0)) { - spawn_flags |= G_SPAWN_SEARCH_PATH; - } - - if (g_spawn_async_with_pipes(NULL, - argv, NULL, - spawn_flags, - NULL, NULL, - &bench_pid, - NULL, &bench_stdout, NULL, - NULL)) { - GIOChannel *channel; - guint watch_id; - - DEBUG("spawning benchmark; pid=%d", bench_pid); - - channel = g_io_channel_unix_new(bench_stdout); - watch_id = g_io_add_watch(channel, G_IO_IN, do_benchmark_handler, - benchmark_dialog); - - switch (gtk_dialog_run(GTK_DIALOG(bench_dialog))) { - case GTK_RESPONSE_NONE: - DEBUG("benchmark finished"); - break; - case GTK_RESPONSE_ACCEPT: - DEBUG("cancelling benchmark"); - - gtk_widget_destroy(bench_dialog); - g_source_remove(watch_id); - kill(bench_pid, SIGINT); - } - - bench_results[entry] = benchmark_dialog->r; - - g_io_channel_unref(channel); - shell_view_set_enabled(TRUE); - shell_status_set_enabled(TRUE); - g_free(benchmark_dialog); - - shell_status_update(_("Done.")); - - return; - } - - gtk_widget_destroy(bench_dialog); - g_free(benchmark_dialog); - shell_status_set_enabled(TRUE); - shell_status_update(_("Done.")); - } - - setpriority(PRIO_PROCESS, 0, -20); - benchmark_function(); - setpriority(PRIO_PROCESS, 0, old_priority); -} - -gchar *hi_module_get_name(void) -{ - return g_strdup(_("Benchmarks")); -} - -guchar hi_module_get_weight(void) -{ - return 240; -} - -ModuleEntry *hi_module_get_entries(void) -{ - return entries; -} - -ModuleAbout *hi_module_get_about(void) -{ - static ModuleAbout ma[] = { - { - .author = "Leandro A. F. Pereira", - .description = N_("Perform tasks and compare with other systems"), - .version = VERSION, - .license = "GNU GPL version 2"} - }; - - return ma; -} - -static gchar *get_benchmark_results() -{ - gint i; - void (*scan_callback) (gboolean rescan); - - sending_benchmark_results = TRUE; - - gchar *machine = module_call_method("devices::getProcessorName"); - gchar *machineclock = module_call_method("devices::getProcessorFrequency"); - gchar *machineram = module_call_method("devices::getMemoryTotal"); - gchar *result = g_strdup_printf("[param]\n" - "machine=%s\n" - "machineclock=%s\n" - "machineram=%s\n" - "nbenchmarks=%zu\n", - machine, - machineclock, - machineram, - G_N_ELEMENTS(entries) - 1); - for (i = 0; i < G_N_ELEMENTS(entries); i++) { - scan_callback = entries[i].scan_callback; - if (!scan_callback) - continue; - - if (bench_results[i].result < 0.0) { - /* benchmark was cancelled */ - scan_callback(TRUE); - } else { - scan_callback(FALSE); - } - - result = h_strdup_cprintf("[bench%d]\n" - "name=%s\n" - "value=%f\n", - result, - i, entries[i].name, bench_results[i]); - } - - g_free(machine); - g_free(machineclock); - g_free(machineram); - - sending_benchmark_results = FALSE; - - return result; -} - -static gchar *run_benchmark(gchar *name) -{ - int i; - - DEBUG("name = %s", name); - - for (i = 0; entries[i].name; i++) { - if (g_str_equal(entries[i].name, name)) { - void (*scan_callback)(gboolean rescan); - - if ((scan_callback = entries[i].scan_callback)) { - scan_callback(FALSE); - -#define CHK_RESULT_FORMAT(F) (params.result_format && strcmp(params.result_format, F) == 0) - - if (params.run_benchmark) { - if (CHK_RESULT_FORMAT("conf") ) { - bench_result *b = bench_result_this_machine(name, bench_results[i]); - char *temp = bench_result_benchmarkconf_line(b); - bench_result_free(b); - return temp; - } else if (CHK_RESULT_FORMAT("shell") ) { - bench_result *b = bench_result_this_machine(name, bench_results[i]); - char *temp = bench_result_more_info_complete(b); - bench_result_free(b); - return temp; - } - /* defaults to "short" which is below*/ - } - - return bench_value_to_str(bench_results[i]); - } - } - } - - return NULL; -} - -ShellModuleMethod *hi_exported_methods(void) -{ - static ShellModuleMethod m[] = { - {"runBenchmark", run_benchmark}, - {NULL} - }; - - return m; -} - -void hi_module_init(void) -{ - static SyncEntry se[] = { - { - .fancy_name = N_("Send benchmark results"), - .name = "SendBenchmarkResults", - .save_to = NULL, - .get_data = get_benchmark_results}, - { - .fancy_name = N_("Receive benchmark results"), - .name = "RecvBenchmarkResults", - .save_to = "benchmark.conf", - .get_data = NULL} - }; - - sync_manager_add_entry(&se[0]); - sync_manager_add_entry(&se[1]); - - bench_value er = EMPTY_BENCH_VALUE; - int i; - for (i = 0; i < G_N_ELEMENTS(entries) - 1; i++) { - bench_results[i] = er; - } -} - -gchar **hi_module_get_dependencies(void) -{ - static gchar *deps[] = { "devices.so", NULL }; - - return deps; -} diff --git a/modules/benchmark/bench_results.c b/modules/benchmark/bench_results.c deleted file mode 100644 index 27a33a65..00000000 --- a/modules/benchmark/bench_results.c +++ /dev/null @@ -1,442 +0,0 @@ -/* - * 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; -} bench_machine; - -typedef struct { - char *name; - bench_value bvalue; - bench_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(bench_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++; - } - } -} - -bench_machine *bench_machine_new() { - bench_machine *m = NULL; - m = malloc(sizeof(bench_machine)); - if (m) - memset(m, 0, sizeof(bench_machine)); - return m; -} - -bench_machine *bench_machine_this() { - bench_machine *m = NULL; - char *tmp; - - m = bench_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); - gen_machine_id(m); - } - return m; -} - -void bench_machine_free(bench_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); - bench_machine_free(s->machine); - } -} - -bench_result *bench_result_this_machine(const char *bench_name, bench_value r) { - bench_result *b = NULL; - - b = malloc(sizeof(bench_result)); - if (b) { - memset(b, 0, sizeof(bench_result)); - b->machine = bench_machine_this(); - b->name = strdup(bench_name); - b->bvalue = r; - 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; -} - -/* old results didn't store the actual number of threads used */ -static int guess_threads_old_result(const char *bench_name, int threads_available) { -#define CHKBNAME(BN) (strcmp(bench_name, BN) == 0) - if (CHKBNAME("CPU Fibonacci") ) - return 1; - if (CHKBNAME("FPU FFT") ) { - if (threads_available >= 4) - return 4; - else if (threads_available >= 2) - return 2; - else - return 1; - } - if (CHKBNAME("CPU N-Queens") ) { - if (threads_available >= 10) - return 10; - else if (threads_available >= 5) - return 5; - else if (threads_available >= 2) - return 2; - else - return 1; - } - return threads_available; -} - -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 = bench_machine_new(); - b->name = strdup(section); - - if (vl >= 10) { /* the 11th could be empty */ - b->machine->mid = strdup(key); - /* first try as bench_value, then try as double 'result' only */ - b->bvalue = bench_value_from_str(values[0]); - if (b->bvalue.result == -1) - b->bvalue.result = atoi(values[0]); - b->bvalue.threads_used = 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->bvalue.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; - } else { - b->machine->cpu_name = strdup(key); - b->machine->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->bvalue.threads_used = guess_threads_old_result(section, b->machine->threads); - - /* 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->bvalue.threads_used, 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 *bv = bench_value_to_str(b->bvalue); - char *ret = g_strdup_printf("%s=%s|%d|%s|%s|%s|%s|%d|%d|%d|%d|%s\n", - b->machine->mid, bv, b->bvalue.threads_used, - (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); - free(bv); - return ret; -} - -static char *bench_result_more_info_less(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->bvalue.threads_used, - 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; -} - -static char *bench_result_more_info_complete(bench_result *b) { - return g_strdup_printf("[%s]\n" - /* bench name */"%s=%s\n" - /* threads */ "%s=%d\n" - /* result */ "%s=%0.2f\n" - /* elapsed */ "%s=%0.2f\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, - _("Threads"), b->bvalue.threads_used, - _("Result"), b->bvalue.result, - _("Elapsed Time"), b->bvalue.elapsed_time, - 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) - ); -} - -char *bench_result_more_info(bench_result *b) { - //return bench_result_more_info_complete(b); - return bench_result_more_info_less(b); -} diff --git a/modules/benchmark/benches.c b/modules/benchmark/benches.c deleted file mode 100644 index e09dedcc..00000000 --- a/modules/benchmark/benches.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2017 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 - */ - -/* These are parts of modules/benchmark.c where specific benchmarks are defined. */ - -#define BENCH_CALLBACK(CN, BN, BID, R) \ -gchar *CN() { \ - if (R) \ - return benchmark_include_results_reverse(bench_results[BID], BN); \ - else \ - return benchmark_include_results(bench_results[BID], BN); \ -} - -BENCH_CALLBACK(callback_gui, "GPU Drawing", BENCHMARK_GUI, 1); -BENCH_CALLBACK(callback_fft, "FPU FFT", BENCHMARK_FFT, 0); -BENCH_CALLBACK(callback_nqueens, "CPU N-Queens", BENCHMARK_NQUEENS, 0); -BENCH_CALLBACK(callback_raytr, "FPU Raytracing", BENCHMARK_RAYTRACE, 0); -BENCH_CALLBACK(callback_bfsh, "CPU Blowfish", BENCHMARK_BLOWFISH, 0); -BENCH_CALLBACK(callback_cryptohash, "CPU CryptoHash", BENCHMARK_CRYPTOHASH, 1); -BENCH_CALLBACK(callback_fib, "CPU Fibonacci", BENCHMARK_FIB, 0); -BENCH_CALLBACK(callback_zlib, "CPU Zlib", BENCHMARK_ZLIB, 0); - -#define BENCH_SCAN_SIMPLE(SN, BF, BID) \ -void SN(gboolean reload) { \ - SCAN_START(); \ - do_benchmark(BF, BID); \ - SCAN_END(); \ -} - -BENCH_SCAN_SIMPLE(scan_fft, benchmark_fft, BENCHMARK_FFT); -BENCH_SCAN_SIMPLE(scan_nqueens, benchmark_nqueens, BENCHMARK_NQUEENS); -BENCH_SCAN_SIMPLE(scan_raytr, benchmark_raytrace, BENCHMARK_RAYTRACE); -BENCH_SCAN_SIMPLE(scan_bfsh, benchmark_fish, BENCHMARK_BLOWFISH); -BENCH_SCAN_SIMPLE(scan_cryptohash, benchmark_cryptohash, BENCHMARK_CRYPTOHASH); -BENCH_SCAN_SIMPLE(scan_fib, benchmark_fib, BENCHMARK_FIB); -BENCH_SCAN_SIMPLE(scan_zlib, benchmark_zlib, BENCHMARK_ZLIB); - -void scan_gui(gboolean reload) -{ - SCAN_START(); - - bench_value er = EMPTY_BENCH_VALUE; - - if (params.run_benchmark) { - int argc = 0; - - ui_init(&argc, NULL); - } - - if (params.gui_running || params.run_benchmark) { - do_benchmark(benchmark_gui, BENCHMARK_GUI); - } else { - bench_results[BENCHMARK_GUI] = er; - } - SCAN_END(); -} - -static ModuleEntry entries[] = { - {N_("CPU Blowfish"), "blowfish.png", callback_bfsh, scan_bfsh, MODULE_FLAG_NONE}, - {N_("CPU CryptoHash"), "cryptohash.png", callback_cryptohash, scan_cryptohash, MODULE_FLAG_NONE}, - {N_("CPU Fibonacci"), "nautilus.png", callback_fib, scan_fib, MODULE_FLAG_NONE}, - {N_("CPU N-Queens"), "nqueens.png", callback_nqueens, scan_nqueens, MODULE_FLAG_NONE}, - {N_("CPU Zlib"), "file-roller.png", callback_zlib, scan_zlib, MODULE_FLAG_NONE}, - {N_("FPU FFT"), "fft.png", callback_fft, scan_fft, MODULE_FLAG_NONE}, - {N_("FPU Raytracing"), "raytrace.png", callback_raytr, scan_raytr, MODULE_FLAG_NONE}, -#if !GTK_CHECK_VERSION(3,0,0) - {N_("GPU Drawing"), "module.png", callback_gui, scan_gui, MODULE_FLAG_NO_REMOTE}, -#endif - {NULL} -}; - -const gchar *hi_note_func(gint entry) -{ - switch (entry) { - case BENCHMARK_CRYPTOHASH: - return _("Results in MiB/second. Higher is better."); - - case BENCHMARK_ZLIB: - case BENCHMARK_GUI: - return _("Results in HIMarks. Higher is better."); - - case BENCHMARK_FFT: - case BENCHMARK_RAYTRACE: - case BENCHMARK_BLOWFISH: - case BENCHMARK_FIB: - case BENCHMARK_NQUEENS: - return _("Results in seconds. Lower is better."); - } - - return NULL; -} diff --git a/modules/benchmark/blowfish.c b/modules/benchmark/blowfish.c deleted file mode 100644 index 2aa11a2a..00000000 --- a/modules/benchmark/blowfish.c +++ /dev/null @@ -1,538 +0,0 @@ -/* -blowfish.c: C implementation of the Blowfish algorithm. - -Copyright (C) 1997 by Paul Kocher - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. -This library 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 -Lesser General Public License for more details. -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - - -COMMENTS ON USING THIS CODE: - -Normal usage is as follows: - [1] Allocate a BLOWFISH_CTX. (It may be too big for the stack.) - [2] Call Blowfish_Init with a pointer to your BLOWFISH_CTX, a pointer to - the key, and the number of bytes in the key. - [3] To encrypt a 64-bit block, call Blowfish_Encrypt with a pointer to - BLOWFISH_CTX, a pointer to the 32-bit left half of the plaintext - and a pointer to the 32-bit right half. The plaintext will be - overwritten with the ciphertext. - [4] Decryption is the same as encryption except that the plaintext and - ciphertext are reversed. - -Warning #1: The code does not check key lengths. (Caveat encryptor.) -Warning #2: Beware that Blowfish keys repeat such that "ab" = "abab". -Warning #3: It is normally a good idea to zeroize the BLOWFISH_CTX before - freeing it. -Warning #4: Endianness conversions are the responsibility of the caller. - (To encrypt bytes on a little-endian platforms, you'll probably want - to swap bytes around instead of just casting.) -Warning #5: Make sure to use a reasonable mode of operation for your - application. (If you don't know what CBC mode is, see Warning #7.) -Warning #6: This code is susceptible to timing attacks. -Warning #7: Security engineering is risky and non-intuitive. Have someone - check your work. If you don't know what you are doing, get help. - - -This is code is fast enough for most applications, but is not optimized for -speed. - -If you require this code under a license other than LGPL, please ask. (I -can be located using your favorite search engine.) Unfortunately, I do not -have time to provide unpaid support for everyone who uses this code. - - -- Paul Kocher -*/ - -#include "hardinfo.h" -#include "benchmark.h" -#include "blowfish.h" - -#define N 16 -static const unsigned long ORIG_P[16 + 2] = - { 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L, 0xA4093822L, - 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L, 0x452821E6L, 0x38D01377L, - 0xBE5466CFL, 0x34E90C6CL, 0xC0AC29B7L, - 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L, 0x9216D5D9L, 0x8979FB1BL -}; - -static const unsigned long ORIG_S[4][256] = { - {0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L, 0xB8E1AFEDL, - 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L, 0x24A19947L, 0xB3916CF7L, - 0x0801F2E2L, 0x858EFC16L, 0x636920D8L, 0x71574E69L, 0xA458FEA3L, - 0xF4933D7EL, 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL, - 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L, 0xC5D1B023L, - 0x286085F0L, 0xCA417918L, 0xB8DB38EFL, 0x8E79DCB0L, 0x603A180EL, - 0x6C9E0E8BL, 0xB01E8A3EL, 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, - 0x55605C60L, 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L, - 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL, 0xA15486AFL, - 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL, 0x2BA9C55DL, 0x741831F6L, - 0xCE5C3E16L, 0x9B87931EL, 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, - 0x28958677L, 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L, - 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L, 0xEF845D5DL, - 0xE98575B1L, 0xDC262302L, 0xEB651B88L, 0x23893E81L, 0xD396ACC5L, - 0x0F6D6FF3L, 0x83F44239L, 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, - 0x9E1F9B5EL, 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L, - 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L, 0x6EEF0B6CL, - 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L, 0xA1F1651DL, 0x39AF0176L, - 0x66CA593EL, 0x82430E88L, 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, - 0x3B8B5EBEL, 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L, - 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL, 0x37D0D724L, - 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL, 0x075372C9L, 0x80991B7BL, - 0x25D479D8L, 0xF6E8DEF7L, 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, - 0x04C006BAL, 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L, - 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL, 0x6DFC511FL, - 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L, 0xBEE3D004L, 0xDE334AFDL, - 0x660F2807L, 0x192E4BB3L, 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, - 0xB9D3FBDBL, 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L, - 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L, 0x3C7516DFL, - 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL, 0x323DB5FAL, 0xFD238760L, - 0x53317B48L, 0x3E00DF82L, 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, - 0xDF1769DBL, 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L, - 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L, 0x10FA3D98L, - 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL, 0x9A53E479L, 0xB6F84565L, - 0xD28E49BCL, 0x4BFB9790L, 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, - 0xCEE4C6E8L, 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L, - 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L, 0xD08ED1D0L, - 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L, 0x8FF6E2FBL, 0xF2122B64L, - 0x8888B812L, 0x900DF01CL, 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, - 0xB3A8C1ADL, 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L, - 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L, 0xB4A84FE0L, - 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L, 0x165FA266L, 0x80957705L, - 0x93CC7314L, 0x211A1477L, 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, - 0xFB9D35CFL, 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L, - 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL, 0x2464369BL, - 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL, 0x78C14389L, 0xD95A537FL, - 0x207D5BA2L, 0x02E5B9C5L, 0x83260376L, 0x6295CFA9L, 0x11C81968L, - 0x4E734A41L, 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L, - 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L, 0x08BA6FB5L, - 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L, 0xB6636521L, 0xE7B9F9B6L, - 0xFF34052EL, 0xC5855664L, 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, - 0x6E85076AL}, {0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, - 0xC4192623L, 0xAD6EA6B0L, 0x49A7DF7DL, - 0x9CEE60B8L, 0x8FEDB266L, 0xECAA8C71L, - 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L, - 0x193602A5L, 0x75094C29L, 0xA0591340L, - 0xE4183A3EL, 0x3F54989AL, 0x5B429D65L, - 0x6B8FE4D6L, 0x99F73FD6L, 0xA1D29C07L, - 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L, - 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, - 0x021ECC5EL, 0x09686B3FL, 0x3EBAEFC9L, - 0x3C971814L, 0x6B6A70A1L, 0x687F3584L, - 0x52A0E286L, 0xB79C5305L, 0xAA500737L, - 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, - 0x5716F2B8L, 0xB03ADA37L, 0xF0500C0DL, - 0xF01C1F04L, 0x0200B3FFL, 0xAE0CF51AL, - 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL, - 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, - 0x22F54701L, 0x3AE5E581L, 0x37C2DADCL, - 0xC8B57634L, 0x9AF3DDA7L, 0xA9446146L, - 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L, - 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, - 0x183EB331L, 0x4E548B38L, 0x4F6DB908L, - 0x6F420D03L, 0xF60A04BFL, 0x2CB81290L, - 0x24977C79L, 0x5679B072L, 0xBCAF89AFL, - 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, - 0xDCCF3F2EL, 0x5512721FL, 0x2E6B7124L, - 0x501ADDE6L, 0x9F84CD87L, 0x7A584718L, - 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL, - 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, - 0xC464C3D2L, 0xEF1C1847L, 0x3215D908L, - 0xDD433B37L, 0x24C2BA16L, 0x12A14D43L, - 0x2A65C451L, 0x50940002L, 0x133AE4DDL, - 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, - 0x5F11199BL, 0x043556F1L, 0xD7A3C76BL, - 0x3C11183BL, 0x5924A509L, 0xF28FE6EDL, - 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL, - 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, - 0x5A3E2AB3L, 0x771FE71CL, 0x4E3D06FAL, - 0x2965DCB9L, 0x99E71D0FL, 0x803E89D6L, - 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL, - 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, - 0x1E0A2DF4L, 0xF2F74EA7L, 0x361D2B3DL, - 0x1939260FL, 0x19C27960L, 0x5223A708L, - 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L, - 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, - 0x018CFF28L, 0xC332DDEFL, 0xBE6C5AA5L, - 0x65582185L, 0x68AB9802L, 0xEECEA50FL, - 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L, - 0x1521B628L, 0x29076170L, 0xECDD4775L, - 0x619F1510L, 0x13CCA830L, 0xEB61BD96L, - 0x0334FE1EL, 0xAA0363CFL, 0xB5735C90L, - 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L, - 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, - 0xB2F3846EL, 0x648B1EAFL, 0x19BDF0CAL, - 0xA02369B9L, 0x655ABB50L, 0x40685A32L, - 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L, - 0x9B540B19L, 0x875FA099L, 0x95F7997EL, - 0x623D7DA8L, 0xF837889AL, 0x97E32D77L, - 0x11ED935FL, 0x16681281L, 0x0E358829L, - 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L, - 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, - 0x1AC24696L, 0xCDB30AEBL, 0x532E3054L, - 0x8FD948E4L, 0x6DBC3128L, 0x58EBF2EFL, - 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L, - 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, - 0x203E13E0L, 0x45EEE2B6L, 0xA3AAABEAL, - 0xDB6C4F15L, 0xFACB4FD0L, 0xC742F442L, - 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L, - 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, - 0x3D816250L, 0xCF62A1F2L, 0x5B8D2646L, - 0xFC8883A0L, 0xC1C7B6A3L, 0x7F1524C3L, - 0x69CB7492L, 0x47848A0BL, 0x5692B285L, - 0x095BBF00L, 0xAD19489DL, 0x1462B174L, - 0x23820E00L, 0x58428D2AL, 0x0C55F5EAL, - 0x1DADF43EL, 0x233F7061L, 0x3372F092L, - 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL, - 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, - 0xCE77326EL, 0xA6078084L, 0x19F8509EL, - 0xE8EFD855L, 0x61D99735L, 0xA969A7AAL, - 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL, - 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, - 0x0E1E9EC9L, 0xDB73DBD3L, 0x105588CDL, - 0x675FDA79L, 0xE3674340L, 0xC5C43465L, - 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L, - 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, - 0xDB83ADF7L}, {0xE93D5A68L, 0x948140F7L, - 0xF64C261CL, 0x94692934L, - 0x411520F7L, 0x7602D4F7L, - 0xBCF46B2EL, 0xD4A20068L, - 0xD4082471L, 0x3320F46AL, - 0x43B7D4B7L, 0x500061AFL, - 0x1E39F62EL, 0x97244546L, - 0x14214F74L, 0xBF8B8840L, - 0x4D95FC1DL, 0x96B591AFL, - 0x70F4DDD3L, 0x66A02F45L, - 0xBFBC09ECL, 0x03BD9785L, - 0x7FAC6DD0L, 0x31CB8504L, - 0x96EB27B3L, 0x55FD3941L, - 0xDA2547E6L, 0xABCA0A9AL, - 0x28507825L, 0x530429F4L, - 0x0A2C86DAL, 0xE9B66DFBL, - 0x68DC1462L, 0xD7486900L, - 0x680EC0A4L, 0x27A18DEEL, - 0x4F3FFEA2L, 0xE887AD8CL, - 0xB58CE006L, 0x7AF4D6B6L, - 0xAACE1E7CL, 0xD3375FECL, - 0xCE78A399L, 0x406B2A42L, - 0x20FE9E35L, 0xD9F385B9L, - 0xEE39D7ABL, 0x3B124E8BL, - 0x1DC9FAF7L, 0x4B6D1856L, - 0x26A36631L, 0xEAE397B2L, - 0x3A6EFA74L, 0xDD5B4332L, - 0x6841E7F7L, 0xCA7820FBL, - 0xFB0AF54EL, 0xD8FEB397L, - 0x454056ACL, 0xBA489527L, - 0x55533A3AL, 0x20838D87L, - 0xFE6BA9B7L, 0xD096954BL, - 0x55A867BCL, 0xA1159A58L, - 0xCCA92963L, 0x99E1DB33L, - 0xA62A4A56L, 0x3F3125F9L, - 0x5EF47E1CL, 0x9029317CL, - 0xFDF8E802L, 0x04272F70L, - 0x80BB155CL, 0x05282CE3L, - 0x95C11548L, 0xE4C66D22L, - 0x48C1133FL, 0xC70F86DCL, - 0x07F9C9EEL, 0x41041F0FL, - 0x404779A4L, 0x5D886E17L, - 0x325F51EBL, 0xD59BC0D1L, - 0xF2BCC18FL, 0x41113564L, - 0x257B7834L, 0x602A9C60L, - 0xDFF8E8A3L, 0x1F636C1BL, - 0x0E12B4C2L, 0x02E1329EL, - 0xAF664FD1L, 0xCAD18115L, - 0x6B2395E0L, 0x333E92E1L, - 0x3B240B62L, 0xEEBEB922L, - 0x85B2A20EL, 0xE6BA0D99L, - 0xDE720C8CL, 0x2DA2F728L, - 0xD0127845L, 0x95B794FDL, - 0x647D0862L, 0xE7CCF5F0L, - 0x5449A36FL, 0x877D48FAL, - 0xC39DFD27L, 0xF33E8D1EL, - 0x0A476341L, 0x992EFF74L, - 0x3A6F6EABL, 0xF4F8FD37L, - 0xA812DC60L, 0xA1EBDDF8L, - 0x991BE14CL, 0xDB6E6B0DL, - 0xC67B5510L, 0x6D672C37L, - 0x2765D43BL, 0xDCD0E804L, - 0xF1290DC7L, 0xCC00FFA3L, - 0xB5390F92L, 0x690FED0BL, - 0x667B9FFBL, 0xCEDB7D9CL, - 0xA091CF0BL, 0xD9155EA3L, - 0xBB132F88L, 0x515BAD24L, - 0x7B9479BFL, 0x763BD6EBL, - 0x37392EB3L, 0xCC115979L, - 0x8026E297L, 0xF42E312DL, - 0x6842ADA7L, 0xC66A2B3BL, - 0x12754CCCL, 0x782EF11CL, - 0x6A124237L, 0xB79251E7L, - 0x06A1BBE6L, 0x4BFB6350L, - 0x1A6B1018L, 0x11CAEDFAL, - 0x3D25BDD8L, 0xE2E1C3C9L, - 0x44421659L, 0x0A121386L, - 0xD90CEC6EL, 0xD5ABEA2AL, - 0x64AF674EL, 0xDA86A85FL, - 0xBEBFE988L, 0x64E4C3FEL, - 0x9DBC8057L, 0xF0F7C086L, - 0x60787BF8L, 0x6003604DL, - 0xD1FD8346L, 0xF6381FB0L, - 0x7745AE04L, 0xD736FCCCL, - 0x83426B33L, 0xF01EAB71L, - 0xB0804187L, 0x3C005E5FL, - 0x77A057BEL, 0xBDE8AE24L, - 0x55464299L, 0xBF582E61L, - 0x4E58F48FL, 0xF2DDFDA2L, - 0xF474EF38L, 0x8789BDC2L, - 0x5366F9C3L, 0xC8B38E74L, - 0xB475F255L, 0x46FCD9B9L, - 0x7AEB2661L, 0x8B1DDF84L, - 0x846A0E79L, 0x915F95E2L, - 0x466E598EL, 0x20B45770L, - 0x8CD55591L, 0xC902DE4CL, - 0xB90BACE1L, 0xBB8205D0L, - 0x11A86248L, 0x7574A99EL, - 0xB77F19B6L, 0xE0A9DC09L, - 0x662D09A1L, 0xC4324633L, - 0xE85A1F02L, 0x09F0BE8CL, - 0x4A99A025L, 0x1D6EFE10L, - 0x1AB93D1DL, 0x0BA5A4DFL, - 0xA186F20FL, 0x2868F169L, - 0xDCB7DA83L, 0x573906FEL, - 0xA1E2CE9BL, 0x4FCD7F52L, - 0x50115E01L, 0xA70683FAL, - 0xA002B5C4L, 0x0DE6D027L, - 0x9AF88C27L, 0x773F8641L, - 0xC3604C06L, 0x61A806B5L, - 0xF0177A28L, 0xC0F586E0L, - 0x006058AAL, 0x30DC7D62L, - 0x11E69ED7L, 0x2338EA63L, - 0x53C2DD94L, 0xC2C21634L, - 0xBBCBEE56L, 0x90BCB6DEL, - 0xEBFC7DA1L, 0xCE591D76L, - 0x6F05E409L, 0x4B7C0188L, - 0x39720A3DL, 0x7C927C24L, - 0x86E3725FL, 0x724D9DB9L, - 0x1AC15BB4L, 0xD39EB8FCL, - 0xED545578L, 0x08FCA5B5L, - 0xD83D7CD3L, 0x4DAD0FC4L, - 0x1E50EF5EL, 0xB161E6F8L, - 0xA28514D9L, 0x6C51133CL, - 0x6FD5C7E7L, 0x56E14EC4L, - 0x362ABFCEL, 0xDDC6C837L, - 0xD79A3234L, 0x92638212L, - 0x670EFA8EL, 0x406000E0L}, -{0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL, 0x5CB0679EL, - 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL, 0xD5118E9DL, 0xBF0F7315L, - 0xD62D1C7EL, 0xC700C47BL, 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, - 0x6A366EB4L, 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L, - 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L, 0x2939BBDBL, - 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L, 0xA1FAD5F0L, 0x6A2D519AL, - 0x63EF8CE2L, 0x9A86EE22L, 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, - 0x9CF2D0A4L, 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L, - 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L, 0xC72FEFD3L, - 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L, 0x80E4A915L, 0x87B08601L, - 0x9B09E6ADL, 0x3B3EE593L, 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, - 0x022B8B51L, 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L, - 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL, 0xE029AC71L, - 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL, 0xE8D3C48DL, 0x283B57CCL, - 0xF8D56629L, 0x79132E28L, 0x785F0191L, 0xED756055L, 0xF7960E44L, - 0xE3D35E8CL, 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL, - 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL, 0x1B3F6D9BL, - 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L, 0x7533D928L, 0xB155FDF5L, - 0x03563482L, 0x8ABA3CBBL, 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, - 0xCCAD925FL, 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L, - 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L, 0xA8B6E37EL, - 0xC3293D46L, 0x48DE5369L, 0x6413E680L, 0xA2AE0810L, 0xDD6DB224L, - 0x69852DFDL, 0x09072166L, 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, - 0x1C20C8AEL, 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL, - 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L, 0x72EACEA8L, - 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L, 0xD29BE463L, 0x542F5D9EL, - 0xAEC2771BL, 0xF64E6370L, 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, - 0xAF537D5DL, 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L, - 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L, 0x6F3F3B82L, - 0x3520AB82L, 0x011A1D4BL, 0x277227F8L, 0x611560B1L, 0xE7933FDCL, - 0xBB3A792BL, 0x344525BDL, 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, - 0xA01FBAC9L, 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L, - 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L, 0x0339C32AL, - 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL, 0xF79E59B7L, 0x43F5BB3AL, - 0xF2D519FFL, 0x27D9459CL, 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, - 0x9B941525L, 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L, - 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L, 0xE0EC6E0EL, - 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L, 0x9F1F9532L, 0xE0D392DFL, - 0xD3A0342BL, 0x8971F21EL, 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, - 0xC37632D8L, 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL, - 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL, 0x1618B166L, - 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L, 0xF523F357L, 0xA6327623L, - 0x93A83531L, 0x56CCCD02L, 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, - 0x88D273CCL, 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L, - 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL, 0xC9AA53FDL, - 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L, 0x71126905L, 0xB2040222L, - 0xB6CBCF7CL, 0xCD769C2BL, 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, - 0x2547ADF0L, 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L, - 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL, 0x1948C25CL, - 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L, 0x90D4F869L, 0xA65CDEA0L, - 0x3F09252DL, 0xC208E69FL, 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, - 0x3AC372E6L} -}; - -static unsigned long F(BLOWFISH_CTX * ctx, unsigned long x) -{ - unsigned short a, b, c, d; - unsigned long y; - d = (unsigned short) (x & 0xFF); - x >>= 8; - c = (unsigned short) (x & 0xFF); - x >>= 8; - b = (unsigned short) (x & 0xFF); - x >>= 8; - a = (unsigned short) (x & 0xFF); - y = ctx->S[0][a] + ctx->S[1][b]; - y = y ^ ctx->S[2][c]; - y = y + ctx->S[3][d]; - return y; -} - -void Blowfish_Encrypt(BLOWFISH_CTX * ctx, unsigned long *xl, - unsigned long *xr) -{ - unsigned long Xl; - unsigned long Xr; - unsigned long temp; - short i; - Xl = *xl; - Xr = *xr; - for (i = 0; i < N; ++i) { - Xl = Xl ^ ctx->P[i]; - Xr = F(ctx, Xl) ^ Xr; - temp = Xl; - Xl = Xr; - Xr = temp; - } - temp = Xl; - Xl = Xr; - Xr = temp; - Xr = Xr ^ ctx->P[N]; - Xl = Xl ^ ctx->P[N + 1]; - *xl = Xl; - *xr = Xr; -} - -void Blowfish_Decrypt(BLOWFISH_CTX * ctx, unsigned long *xl, - unsigned long *xr) -{ - unsigned long Xl; - unsigned long Xr; - unsigned long temp; - short i; - Xl = *xl; - Xr = *xr; - for (i = N + 1; i > 1; --i) { - Xl = Xl ^ ctx->P[i]; - Xr = F(ctx, Xl) ^ Xr; - - /* Exchange Xl and Xr */ - temp = Xl; - Xl = Xr; - Xr = temp; - } - - /* Exchange Xl and Xr */ - temp = Xl; - Xl = Xr; - Xr = temp; - Xr = Xr ^ ctx->P[1]; - Xl = Xl ^ ctx->P[0]; - *xl = Xl; - *xr = Xr; -} - -void Blowfish_Init(BLOWFISH_CTX * ctx, unsigned char *key, int keyLen) -{ - int i, j, k; - unsigned long data, datal, datar; - for (i = 0; i < 4; i++) { - for (j = 0; j < 256; j++) - ctx->S[i][j] = ORIG_S[i][j]; - } - j = 0; - for (i = 0; i < N + 2; ++i) { - data = 0x00000000; - for (k = 0; k < 4; ++k) { - data = (data << 8) | key[j]; - j = j + 1; - if (j >= keyLen) - j = 0; - } - ctx->P[i] = ORIG_P[i] ^ data; - } - datal = 0x00000000; - datar = 0x00000000; - for (i = 0; i < N + 2; i += 2) { - Blowfish_Encrypt(ctx, &datal, &datar); - ctx->P[i] = datal; - ctx->P[i + 1] = datar; - } - for (i = 0; i < 4; ++i) { - for (j = 0; j < 256; j += 2) { - Blowfish_Encrypt(ctx, &datal, &datar); - ctx->S[i][j] = datal; - ctx->S[i][j + 1] = datar; - } - } -} - -static gpointer -parallel_blowfish(unsigned int start, unsigned int end, void *data, gint thread_number) -{ - BLOWFISH_CTX ctx; - unsigned int i; - unsigned long L, R; - - L = 0xBEBACAFE; - R = 0xDEADBEEF; - - for (i = start; i <= end; i++) { - Blowfish_Init(&ctx, (unsigned char*)data, 65536); - Blowfish_Encrypt(&ctx, &L, &R); - Blowfish_Decrypt(&ctx, &L, &R); - } - - return NULL; -} - -void -benchmark_fish(void) -{ - bench_value r = EMPTY_BENCH_VALUE; - - gchar *tmpsrc; - gchar *bdata_path; - - bdata_path = g_build_filename(params.path_data, "benchmark.data", NULL); - if (!g_file_get_contents(bdata_path, &tmpsrc, NULL, NULL)) { - bench_results[BENCHMARK_BLOWFISH] = r; - g_free(bdata_path); - return; - } - - shell_view_set_enabled(FALSE); - shell_status_update("Performing Blowfish benchmark..."); - - r = benchmark_parallel_for(0, 0, 50000, parallel_blowfish, tmpsrc); - r.result = r.elapsed_time; - - bench_results[BENCHMARK_BLOWFISH] = r; - g_free(bdata_path); - g_free(tmpsrc); -} diff --git a/modules/benchmark/cryptohash.c b/modules/benchmark/cryptohash.c deleted file mode 100644 index 6150f3ef..00000000 --- a/modules/benchmark/cryptohash.c +++ /dev/null @@ -1,80 +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 - */ - -#include "md5.h" -#include "sha1.h" -#include "benchmark.h" - -void inline md5_step(char *data, glong srclen) -{ - struct MD5Context ctx; - guchar checksum[16]; - - MD5Init(&ctx); - MD5Update(&ctx, (guchar *)data, srclen); - MD5Final(checksum, &ctx); -} - -void inline sha1_step(char *data, glong srclen) -{ - SHA1_CTX ctx; - guchar checksum[20]; - - SHA1Init(&ctx); - SHA1Update(&ctx, (guchar*)data, srclen); - SHA1Final(checksum, &ctx); -} - -static gpointer cryptohash_for(unsigned int start, unsigned int end, void *data, gint thread_number) -{ - unsigned int i; - - for (i = start; i <= end; i++) { - if (i & 1) { - md5_step(data, 65536); - } else { - sha1_step(data, 65536); - } - } - - return NULL; -} - -void -benchmark_cryptohash(void) -{ - bench_value r = EMPTY_BENCH_VALUE; - gchar *tmpsrc, *bdata_path; - - bdata_path = g_build_filename(params.path_data, "benchmark.data", NULL); - if (!g_file_get_contents(bdata_path, &tmpsrc, NULL, NULL)) { - g_free(bdata_path); - return; - } - - shell_view_set_enabled(FALSE); - shell_status_update("Running CryptoHash benchmark..."); - - r = benchmark_parallel_for(0, 0, 5000, cryptohash_for, tmpsrc); - - g_free(bdata_path); - g_free(tmpsrc); - - r.result = 312.0 / r.elapsed_time; //TODO: explain in code comments - bench_results[BENCHMARK_CRYPTOHASH] = r; -} diff --git a/modules/benchmark/drawing.c b/modules/benchmark/drawing.c deleted file mode 100644 index d0905954..00000000 --- a/modules/benchmark/drawing.c +++ /dev/null @@ -1,33 +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 - */ - -#include "benchmark.h" -#include "guibench.h" - -void -benchmark_gui(void) -{ - bench_value r = EMPTY_BENCH_VALUE; - - shell_view_set_enabled(FALSE); - shell_status_update("Running drawing benchmark..."); - - r.result = guibench(); //TODO: explain in code comments - - bench_results[BENCHMARK_GUI] = r; -} diff --git a/modules/benchmark/fbench.c b/modules/benchmark/fbench.c deleted file mode 100644 index b5afc1bc..00000000 --- a/modules/benchmark/fbench.c +++ /dev/null @@ -1,745 +0,0 @@ -/* - - John Walker's Floating Point Benchmark, derived from... - - Marinchip Interactive Lens Design System - - John Walker December 1980 - - By John Walker - https://www.fourmilab.ch/ - - This program may be used, distributed, and modified freely as - long as the origin information is preserved. - - This is a complete optical design raytracing algorithm, - stripped of its user interface and recast into portable C. It - not only determines execution speed on an extremely floating - point (including trig function) intensive real-world - application, it checks accuracy on an algorithm that is - exquisitely sensitive to errors. The performance of this - program is typically far more sensitive to changes in the - efficiency of the trigonometric library routines than the - average floating point program. - - The benchmark may be compiled in two modes. If the symbol - INTRIG is defined, built-in trigonometric and square root - routines will be used for all calculations. Timings made with - INTRIG defined reflect the machine's basic floating point - performance for the arithmetic operators. If INTRIG is not - defined, the system library <math.h> functions are used. - Results with INTRIG not defined reflect the system's library - performance and/or floating point hardware support for trig - functions and square root. Results with INTRIG defined are a - good guide to general floating point performance, while - results with INTRIG undefined indicate the performance of an - application which is math function intensive. - - Special note regarding errors in accuracy: this program has - generated numbers identical to the last digit it formats and - checks on the following machines, floating point - architectures, and languages: - - Marinchip 9900 QBASIC IBM 370 double-precision (REAL * 8) format - - IBM PC / XT / AT Lattice C IEEE 64 bit, 80 bit temporaries - High C same, in line 80x87 code - BASICA "Double precision" - Quick BASIC IEEE double precision, software routines - - Sun 3 C IEEE 64 bit, 80 bit temporaries, - in-line 68881 code, in-line FPA code. - - MicroVAX II C Vax "G" format floating point - - Macintosh Plus MPW C SANE floating point, IEEE 64 bit format - implemented in ROM. - - Inaccuracies reported by this program should be taken VERY - SERIOUSLY INDEED, as the program has been demonstrated to be - invariant under changes in floating point format, as long as - the format is a recognised double precision format. If you - encounter errors, please remember that they are just as likely - to be in the floating point editing library or the - trigonometric libraries as in the low level operator code. - - The benchmark assumes that results are basically reliable, and - only tests the last result computed against the reference. If - you're running on a suspect system you can compile this - program with ACCURACY defined. This will generate a version - which executes as an infinite loop, performing the ray trace - and checking the results on every pass. All incorrect results - will be reported. - - Representative timings are given below. All have been - normalised as if run for 1000 iterations. - - Time in seconds Computer, Compiler, and notes - Normal INTRIG - - 3466.00 4031.00 Commodore 128, 2 Mhz 8510 with software floating - point. Abacus Software/Data-Becker Super-C 128, - version 3.00, run in fast (2 Mhz) mode. Note: - the results generated by this system differed - from the reference results in the 8th to 10th - decimal place. - - 3290.00 IBM PC/AT 6 Mhz, Microsoft/IBM BASICA version A3.00. - Run with the "/d" switch, software floating point. - - 2131.50 IBM PC/AT 6 Mhz, Lattice C version 2.14, small model. - This version of Lattice compiles subroutine - calls which either do software floating point - or use the 80x87. The machine on which I ran - this had an 80287, but the results were so bad - I wonder if it was being used. - - 1598.00 Macintosh Plus, MPW C, SANE Software floating point. - - 1582.13 Marinchip 9900 2 Mhz, QBASIC compiler with software - floating point. This was a QBASIC version of the - program which contained the identical algorithm. - - 404.00 IBM PC/AT 6 Mhz, Microsoft QuickBASIC version 2.0. - Software floating point. - - 165.15 IBM PC/AT 6 Mhz, Metaware High C version 1.3, small - model. This was compiled to call subroutines for - floating point, and the machine contained an 80287 - which was used by the subroutines. - - 143.20 Macintosh II, MPW C, SANE calls. I was unable to - determine whether SANE was using the 68881 chip or - not. - - 121.80 Sun 3/160 16 Mhz, Sun C. Compiled with -fsoft switch - which executes floating point in software. - - 78.78 110.11 IBM RT PC (Model 6150). IBM AIX 1.0 C compiler - with -O switch. - - 75.2 254.0 Microsoft Quick C 1.0, in-line 8087 instructions, - compiled with 80286 optimisation on. (Switches - were -Ol -FPi87-G2 -AS). Small memory model. - - 69.50 IBM PC/AT 6Mhz, Borland Turbo BASIC 1.0. Compiled - in "8087 required" mode to generate in-line - code for the math coprocessor. - - 66.96 IBM PC/AT 6Mhz, Microsoft QuickBASIC 4.0. This - release of QuickBASIC compiles code for the - 80287 math coprocessor. - - 66.36 206.35 IBM PC/AT 6Mhz, Metaware High C version 1.3, small - model. This was compiled with in-line code for the - 80287 math coprocessor. Trig functions still call - library routines. - - 63.07 220.43 IBM PC/AT, 6Mhz, Borland Turbo C, in-line 8087 code, - small model, word alignment, no stack checking, - 8086 code mode. - - 17.18 Apollo DN-3000, 12 Mhz 68020 with 68881, compiled - with in-line code for the 68881 coprocessor. - According to Apollo, the library routines are chosen - at runtime based on coprocessor presence. Since the - coprocessor was present, the library is supposed to - use in-line floating point code. - - 15.55 27.56 VAXstation II GPX. Compiled and executed under - VAX/VMS C. - - 15.14 37.93 Macintosh II, Unix system V. Green Hills 68020 - Unix compiler with in-line code for the 68881 - coprocessor (-O -ZI switches). - - 12.69 Sun 3/160 16 Mhz, Sun C. Compiled with -fswitch, - which calls a subroutine to select the fastest - floating point processor. This was using the 68881. - - 11.74 26.73 Compaq Deskpro 386, 16 Mhz 80386 with 16 Mhz 80387. - Metaware High C version 1.3, compiled with in-line - for the math coprocessor (but not optimised for the - 80386/80387). Trig functions still call library - routines. - - 8.43 30.49 Sun 3/160 16 Mhz, Sun C. Compiled with -f68881, - generating in-line MC68881 instructions. Trig - functions still call library routines. - - 6.29 25.17 Sun 3/260 25 Mhz, Sun C. Compiled with -f68881, - generating in-line MC68881 instructions. Trig - functions still call library routines. - - 4.57 Sun 3/260 25 Mhz, Sun FORTRAN 77. Compiled with - -O -f68881, generating in-line MC68881 instructions. - Trig functions are compiled in-line. This used - the FORTRAN 77 version of the program, FBFORT77.F. - - 4.00 14.20 Sun386i/25 Mhz model 250, Sun C compiler. - - 4.00 14.00 Sun386i/25 Mhz model 250, Metaware C. - - 3.10 12.00 Compaq 386/387 25 Mhz running SCO Xenix 2. - Compiled with Metaware HighC 386, optimized - for 386. - - 3.00 12.00 Compaq 386/387 25MHZ optimized for 386/387. - - 2.96 5.17 Sun 4/260, Sparc RISC processor. Sun C, - compiled with the -O2 switch for global - optimisation. - - 2.47 COMPAQ 486/25, secondary cache disabled, High C, - 486/387, inline f.p., small memory model. - - 2.20 3.40 Data General Motorola 88000, 16 Mhz, Gnu C. - - 1.56 COMPAQ 486/25, 128K secondary cache, High C, 486/387, - inline f.p., small memory model. - - 0.66 1.50 DEC Pmax, Mips processor. - - 0.63 0.91 Sun SparcStation 2, Sun C (SunOS 4.1.1) with - -O4 optimisation and "/usr/lib/libm.il" inline - floating point. - - 0.60 1.07 Intel 860 RISC processor, 33 Mhz, Greenhills - C compiler. - - 0.40 0.90 Dec 3MAX, MIPS 3000 processor, -O4. - - 0.31 0.90 IBM RS/6000, -O. - - 0.1129 0.2119 Dell Dimension XPS P133c, Pentium 133 MHz, - Windows 95, Microsoft Visual C 5.0. - - 0.0883 0.2166 Silicon Graphics Indigo², MIPS R4400, - 175 Mhz, "-O3". - - 0.0351 0.0561 Dell Dimension XPS R100, Pentium II 400 MHz, - Windows 98, Microsoft Visual C 5.0. - - 0.0312 0.0542 Sun Ultra 2, UltraSPARC V9, 300 MHz, Solaris - 2.5.1. - - 0.00862 0.01074 Dell Inspiron 9100, Pentium 4, 3.4 GHz, gcc -O3. - -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#ifndef INTRIG -#include <math.h> -#endif - -#define cot(x) (1.0 / tan(x)) - -#define TRUE 1 -#define FALSE 0 - -#define max_surfaces 10 - -/* Local variables */ - -/*static char tbfr[132];*/ - -static short current_surfaces; -static short paraxial; - -static double clear_aperture; - -static double aberr_lspher; -static double aberr_osc; -static double aberr_lchrom; - -static double max_lspher; -static double max_osc; -static double max_lchrom; - -static double radius_of_curvature; -static double object_distance; -static double ray_height; -static double axis_slope_angle; -static double from_index; -static double to_index; - -static double spectral_line[9]; -static double s[max_surfaces][5]; -static double od_sa[2][2]; - - /*static char outarr[8][80];*//* Computed output of program goes here */ - -static int itercount; /* The iteration counter for the main loop - in the program is made global so that - the compiler should not be allowed to - optimise out the loop over the ray - tracing code. */ - -#ifndef ITERATIONS -#define ITERATIONS 1000 -#endif -static int niter = ITERATIONS; /* Iteration counter */ - -#if 0 -static char *refarr[] = { /* Reference results. These happen to - be derived from a run on Microsoft - Quick BASIC on the IBM PC/AT. */ - - " Marginal ray 47.09479120920 0.04178472683", - " Paraxial ray 47.08372160249 0.04177864821", - "Longitudinal spherical aberration: -0.01106960671", - " (Maximum permissible): 0.05306749907", - "Offense against sine condition (coma): 0.00008954761", - " (Maximum permissible): 0.00250000000", - "Axial chromatic aberration: 0.00448229032", - " (Maximum permissible): 0.05306749907" -}; -#endif - -/* The test case used in this program is the design for a 4 inch - achromatic telescope objective used as the example in Wyld's - classic work on ray tracing by hand, given in Amateur Telescope - Making, Volume 3. */ - -static double testcase[4][4] = { - {27.05, 1.5137, 63.6, 0.52}, - {-16.68, 1, 0, 0.138}, - {-16.68, 1.6164, 36.7, 0.38}, - {-78.1, 1, 0, 0} -}; - -/* Internal trig functions (used only if INTRIG is defined). These - standard functions may be enabled to obtain timings that reflect - the machine's floating point performance rather than the speed of - its trig function evaluation. */ - -#ifdef INTRIG - -/* The following definitions should keep you from getting intro trouble - with compilers which don't let you redefine intrinsic functions. */ - -#define sin I_sin -#define cos I_cos -#define tan I_tan -#define sqrt I_sqrt -#define atan I_atan -#define atan2 I_atan2 -#define asin I_asin - -#define fabs(x) ((x < 0.0) ? -x : x) - -#define pic 3.1415926535897932 - -/* Commonly used constants */ - -static double pi = pic, - twopi = pic * 2.0, - piover4 = pic / 4.0, fouroverpi = 4.0 / pic, piover2 = pic / 2.0; - -/* Coefficients for ATAN evaluation */ - -static double atanc[] = { - 0.0, - 0.4636476090008061165, - 0.7853981633974483094, - 0.98279372324732906714, - 1.1071487177940905022, - 1.1902899496825317322, - 1.2490457723982544262, - 1.2924966677897852673, - 1.3258176636680324644 -}; - -/* aint(x) Return integer part of number. Truncates towards 0 */ - -double aint(x) -double x; -{ - long l; - - /* Note that this routine cannot handle the full floating point - number range. This function should be in the machine-dependent - floating point library! */ - - l = x; - if ((int) (-0.5) != 0 && l < 0) - l++; - x = l; - return x; -} - -/* sin(x) Return sine, x in radians */ - -static double sin(x) -double x; -{ - int sign; - double y, r, z; - - x = (((sign = (x < 0.0)) != 0) ? -x : x); - - if (x > twopi) - x -= (aint(x / twopi) * twopi); - - if (x > pi) { - x -= pi; - sign = !sign; - } - - if (x > piover2) - x = pi - x; - - if (x < piover4) { - y = x * fouroverpi; - z = y * y; - r = y * - (((((((-0.202253129293E-13 * z + 0.69481520350522E-11) * z - - 0.17572474176170806E-8) * z + - 0.313361688917325348E-6) * z - - 0.365762041821464001E-4) * z + - 0.249039457019271628E-2) * z - 0.0807455121882807815) * z + - 0.785398163397448310); - } else { - y = (piover2 - x) * fouroverpi; - z = y * y; - r = ((((((-0.38577620372E-12 * z + 0.11500497024263E-9) * z - - 0.2461136382637005E-7) * z + - 0.359086044588581953E-5) * z - - 0.325991886926687550E-3) * z + 0.0158543442438154109) * z - - 0.308425137534042452) * z + 1.0; - } - return sign ? -r : r; -} - -/* cos(x) Return cosine, x in radians, by identity */ - -static double cos(x) -double x; -{ - x = (x < 0.0) ? -x : x; - if (x > twopi) /* Do range reduction here to limit */ - x = x - (aint(x / twopi) * twopi); /* roundoff on add of PI/2 */ - return sin(x + piover2); -} - -/* tan(x) Return tangent, x in radians, by identity */ - -static double tan(x) -double x; -{ - return sin(x) / cos(x); -} - -/* sqrt(x) Return square root. Initial guess, then Newton- - Raphson refinement */ - -double sqrt(x) -double x; -{ - double c, cl, y; - int n; - - if (x == 0.0) - return 0.0; - - if (x < 0.0) { - fprintf(stderr, - "\nGood work! You tried to take the square root of %g", - x); - fprintf(stderr, - "\nunfortunately, that is too complex for me to handle.\n"); - exit(1); - } - - y = (0.154116 + 1.893872 * x) / (1.0 + 1.047988 * x); - - c = (y - x / y) / 2.0; - cl = 0.0; - for (n = 50; c != cl && n--;) { - y = y - c; - cl = c; - c = (y - x / y) / 2.0; - } - return y; -} - -/* atan(x) Return arctangent in radians, - range -pi/2 to pi/2 */ - -static double atan(x) -double x; -{ - int sign, l, y; - double a, b, z; - - x = (((sign = (x < 0.0)) != 0) ? -x : x); - l = 0; - - if (x >= 4.0) { - l = -1; - x = 1.0 / x; - y = 0; - goto atl; - } else { - if (x < 0.25) { - y = 0; - goto atl; - } - } - - y = aint(x / 0.5); - z = y * 0.5; - x = (x - z) / (x * z + 1); - - atl: - z = x * x; - b = ((((893025.0 * z + 49116375.0) * z + 425675250.0) * z + - 1277025750.0) * z + 1550674125.0) * z + 654729075.0; - a = (((13852575.0 * z + 216602100.0) * z + 891080190.0) * z + - 1332431100.0) * z + 654729075.0; - a = (a / b) * x + atanc[y]; - if (l) - a = piover2 - a; - return sign ? -a : a; -} - -/* atan2(y,x) Return arctangent in radians of y/x, - range -pi to pi */ - -static double atan2(y, x) -double y, x; -{ - double temp; - - if (x == 0.0) { - if (y == 0.0) /* Special case: atan2(0,0) = 0 */ - return 0.0; - else if (y > 0) - return piover2; - else - return -piover2; - } - temp = atan(y / x); - if (x < 0.0) { - if (y >= 0.0) - temp += pic; - else - temp -= pic; - } - return temp; -} - -/* asin(x) Return arcsine in radians of x */ - -static double asin(x) -double x; -{ - if (fabs(x) > 1.0) { - fprintf(stderr, - "\nInverse trig functions lose much of their gloss when"); - fprintf(stderr, - "\ntheir arguments are greater than 1, such as the"); - fprintf(stderr, "\nvalue %g you passed.\n", x); - exit(1); - } - return atan2(x, sqrt(1 - x * x)); -} -#endif - -/* Calculate passage through surface - - If the variable PARAXIAL is true, the trace through the - surface will be done using the paraxial approximations. - Otherwise, the normal trigonometric trace will be done. - - This routine takes the following inputs: - - RADIUS_OF_CURVATURE Radius of curvature of surface - being crossed. If 0, surface is - plane. - - OBJECT_DISTANCE Distance of object focus from - lens vertex. If 0, incoming - rays are parallel and - the following must be specified: - - RAY_HEIGHT Height of ray from axis. Only - relevant if OBJECT.DISTANCE == 0 - - AXIS_SLOPE_ANGLE Angle incoming ray makes with axis - at intercept - - FROM_INDEX Refractive index of medium being left - - TO_INDEX Refractive index of medium being - entered. - - The outputs are the following variables: - - OBJECT_DISTANCE Distance from vertex to object focus - after refraction. - - AXIS_SLOPE_ANGLE Angle incoming ray makes with axis - at intercept after refraction. - -*/ - -static void transit_surface() -{ - double iang, /* Incidence angle */ - rang, /* Refraction angle */ - iang_sin, /* Incidence angle sin */ - rang_sin, /* Refraction angle sin */ - old_axis_slope_angle, sagitta; - - if (paraxial) { - if (radius_of_curvature != 0.0) { - if (object_distance == 0.0) { - axis_slope_angle = 0.0; - iang_sin = ray_height / radius_of_curvature; - } else - iang_sin = ((object_distance - - radius_of_curvature) / radius_of_curvature) * - axis_slope_angle; - - rang_sin = (from_index / to_index) * iang_sin; - old_axis_slope_angle = axis_slope_angle; - axis_slope_angle = axis_slope_angle + iang_sin - rang_sin; - if (object_distance != 0.0) - ray_height = object_distance * old_axis_slope_angle; - object_distance = ray_height / axis_slope_angle; - return; - } - object_distance = object_distance * (to_index / from_index); - axis_slope_angle = axis_slope_angle * (from_index / to_index); - return; - } - - if (radius_of_curvature != 0.0) { - if (object_distance == 0.0) { - axis_slope_angle = 0.0; - iang_sin = ray_height / radius_of_curvature; - } else { - iang_sin = ((object_distance - - radius_of_curvature) / radius_of_curvature) * - sin(axis_slope_angle); - } - iang = asin(iang_sin); - rang_sin = (from_index / to_index) * iang_sin; - old_axis_slope_angle = axis_slope_angle; - axis_slope_angle = axis_slope_angle + iang - asin(rang_sin); - sagitta = sin((old_axis_slope_angle + iang) / 2.0); - sagitta = 2.0 * radius_of_curvature * sagitta * sagitta; - object_distance = - ((radius_of_curvature * sin(old_axis_slope_angle + iang)) * - cot(axis_slope_angle)) + sagitta; - return; - } - - rang = -asin((from_index / to_index) * sin(axis_slope_angle)); - object_distance = object_distance * ((to_index * - cos(-rang)) / (from_index * - cos - (axis_slope_angle))); - axis_slope_angle = -rang; -} - -/* Perform ray trace in specific spectral line */ - -static void trace_line(line, ray_h) -int line; -double ray_h; -{ - int i; - - object_distance = 0.0; - ray_height = ray_h; - from_index = 1.0; - - for (i = 1; i <= current_surfaces; i++) { - radius_of_curvature = s[i][1]; - to_index = s[i][2]; - if (to_index > 1.0) - to_index = to_index + ((spectral_line[4] - - spectral_line[line]) / - (spectral_line[3] - - spectral_line[6])) * ((s[i][2] - - 1.0) / s[i][3]); - transit_surface(); - from_index = to_index; - if (i < current_surfaces) - object_distance = object_distance - s[i][4]; - } -} - -/* Initialise when called the first time */ - -void fbench() -{ - int i, j; - double od_fline, od_cline; - - spectral_line[1] = 7621.0; /* A */ - spectral_line[2] = 6869.955; /* B */ - spectral_line[3] = 6562.816; /* C */ - spectral_line[4] = 5895.944; /* D */ - spectral_line[5] = 5269.557; /* E */ - spectral_line[6] = 4861.344; /* F */ - spectral_line[7] = 4340.477; /* G' */ - spectral_line[8] = 3968.494; /* H */ - - niter = 3000; - - /* Load test case into working array */ - - clear_aperture = 4.0; - current_surfaces = 4; - for (i = 0; i < current_surfaces; i++) - for (j = 0; j < 4; j++) - s[i + 1][j + 1] = testcase[i][j]; - - for (itercount = 0; itercount < niter; itercount++) { - for (paraxial = 0; paraxial <= 1; paraxial++) { - - /* Do main trace in D light */ - - trace_line(4, clear_aperture / 2.0); - od_sa[paraxial][0] = object_distance; - od_sa[paraxial][1] = axis_slope_angle; - } - paraxial = FALSE; - - /* Trace marginal ray in C */ - - trace_line(3, clear_aperture / 2.0); - od_cline = object_distance; - - /* Trace marginal ray in F */ - - trace_line(6, clear_aperture / 2.0); - od_fline = object_distance; - - aberr_lspher = od_sa[1][0] - od_sa[0][0]; - aberr_osc = 1.0 - (od_sa[1][0] * od_sa[1][1]) / - (sin(od_sa[0][1]) * od_sa[0][0]); - aberr_lchrom = od_fline - od_cline; - max_lspher = sin(od_sa[0][1]); - - /* D light */ - - max_lspher = 0.0000926 / (max_lspher * max_lspher); - max_osc = 0.0025; - max_lchrom = max_lspher; - } -} - -#ifdef __FBENCH_TEST__ -int main(void) -{ - fbench(); - - return 0; -} -#endif diff --git a/modules/benchmark/fft.c b/modules/benchmark/fft.c deleted file mode 100644 index caa52d3d..00000000 --- a/modules/benchmark/fft.c +++ /dev/null @@ -1,67 +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 - */ - -#include "hardinfo.h" -#include "benchmark.h" -#include "fftbench.h" - -static gpointer fft_for(unsigned int start, unsigned int end, void *data, gint thread_number) -{ - unsigned int i; - FFTBench **benches = (FFTBench **)data; - FFTBench *fftbench = (FFTBench *)(benches[thread_number]); - - for (i = start; i <= end; i++) { - fft_bench_run(fftbench); - } - - return NULL; -} - -#define FFT_MAXT 4 - -void -benchmark_fft(void) -{ - bench_value r = EMPTY_BENCH_VALUE; - - int n_cores, i; - gchar *temp; - FFTBench **benches; - - shell_view_set_enabled(FALSE); - shell_status_update("Running FFT benchmark..."); - - /* Pre-allocate all benchmarks */ - benches = g_new0(FFTBench *, FFT_MAXT); - for (i = 0; i < FFT_MAXT; i++) { - benches[i] = fft_bench_new(); - } - - /* Run the benchmark */ - r = benchmark_parallel_for(FFT_MAXT, 0, FFT_MAXT, fft_for, benches); - - /* Free up the memory */ - for (i = 0; i < FFT_MAXT; i++) { - fft_bench_free(benches[i]); - } - g_free(benches); - - r.result = r.elapsed_time; - bench_results[BENCHMARK_FFT] = r; -} diff --git a/modules/benchmark/fftbench.c b/modules/benchmark/fftbench.c deleted file mode 100644 index 89fd5a73..00000000 --- a/modules/benchmark/fftbench.c +++ /dev/null @@ -1,212 +0,0 @@ -/* - fftbench.c - - Written by Scott Robert Ladd (scott@coyotegulch.com) - No rights reserved. This is public domain software, for use by anyone. - - A number-crunching benchmark using LUP-decomposition to solve a large - linear equation. - - The code herein is design for the purpose of testing computational - performance; error handling is minimal. - - In fact, this is a weak implementation of the FFT; unfortunately, all - of my really nifty FFTs are in commercial code, and I haven't had time - to write a new FFT routine for this benchmark. I may add a Hartley - transform to the seat, too. - - Actual benchmark results can be found at: - http://scottrobertladd.net/coyotegulch/ - - Please do not use this information or algorithm in any way that might - upset the balance of the universe or otherwise cause a disturbance in - the space-time continuum. -*/ - -#include <time.h> -#include <string.h> -#include <stdlib.h> -#include <math.h> -#include <stdbool.h> -#include <stdio.h> - -#include "fftbench.h" - -// embedded random number generator; ala Park and Miller -static long seed = 1325; -static const long IA = 16807; -static const long IM = 2147483647; -static const double AM = 4.65661287525E-10; -static const long IQ = 127773; -static const long IR = 2836; -static const long MASK = 123459876; - -static double random_double() -{ - long k; - double result; - - seed ^= MASK; - k = seed / IQ; - seed = IA * (seed - k * IQ) - IR * k; - - if (seed < 0) - seed += IM; - - result = AM * seed; - seed ^= MASK; - - return result; -} - -static const int N = 800; -static const int NM1 = 799; // N - 1 -static const int NP1 = 801; // N + 1 - -static void lup_decompose(FFTBench *fftbench) -{ - int i, j, k, k2, t; - double p, temp, **a; - - int *perm = (int *) malloc(sizeof(double) * N); - - fftbench->p = perm; - a = fftbench->a; - - for (i = 0; i < N; ++i) - perm[i] = i; - - for (k = 0; k < NM1; ++k) { - p = 0.0; - - for (i = k; i < N; ++i) { - temp = fabs(a[i][k]); - - if (temp > p) { - p = temp; - k2 = i; - } - } - - // check for invalid a - if (p == 0.0) - return; - - // exchange rows - t = perm[k]; - perm[k] = perm[k2]; - perm[k2] = t; - - for (i = 0; i < N; ++i) { - temp = a[k][i]; - a[k][i] = a[k2][i]; - a[k2][i] = temp; - } - - for (i = k + 1; i < N; ++i) { - a[i][k] /= a[k][k]; - - for (j = k + 1; j < N; ++j) - a[i][j] -= a[i][k] * a[k][j]; - } - } -} - -static double *lup_solve(FFTBench *fftbench) -{ - int i, j, j2; - double sum, u; - - double *y = (double *) malloc(sizeof(double) * N); - double *x = (double *) malloc(sizeof(double) * N); - - double **a = fftbench->a; - double *b = fftbench->b; - int *perm = fftbench->p; - - for (i = 0; i < N; ++i) { - y[i] = 0.0; - x[i] = 0.0; - } - - for (i = 0; i < N; ++i) { - sum = 0.0; - j2 = 0; - - for (j = 1; j <= i; ++j) { - sum += a[i][j2] * y[j2]; - ++j2; - } - - y[i] = b[perm[i]] - sum; - } - - i = NM1; - - while (1) { - sum = 0.0; - u = a[i][i]; - - for (j = i + 1; j < N; ++j) - sum += a[i][j] * x[j]; - - x[i] = (y[i] - sum) / u; - - if (i == 0) - break; - - --i; - } - - free(y); - - return x; -} - -FFTBench *fft_bench_new(void) -{ - FFTBench *fftbench; - int i, j; - - fftbench = g_new0(FFTBench, 1); - - // generate test data - fftbench->a = (double **) malloc(sizeof(double *) * N); - - for (i = 0; i < N; ++i) { - fftbench->a[i] = (double *) malloc(sizeof(double) * N); - - for (j = 0; j < N; ++j) - fftbench->a[i][j] = random_double(); - } - - fftbench->b = (double *) malloc(sizeof(double) * N); - - for (i = 0; i < N; ++i) - fftbench->b[i] = random_double(); - - return fftbench; -} - -void fft_bench_run(FFTBench *fftbench) -{ - lup_decompose(fftbench); - double *x = lup_solve(fftbench); - free(x); -} - -void fft_bench_free(FFTBench *fftbench) -{ - int i; - - // clean up - for (i = 0; i < N; ++i) - free(fftbench->a[i]); - - free(fftbench->a); - free(fftbench->b); - free(fftbench->p); - free(fftbench->r); - - g_free(fftbench); -} diff --git a/modules/benchmark/fib.c b/modules/benchmark/fib.c deleted file mode 100644 index d75ac367..00000000 --- a/modules/benchmark/fib.c +++ /dev/null @@ -1,52 +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 - */ - -#include "benchmark.h" - -gulong fib(gulong n) -{ - if (n == 0) - return 0; - else if (n <= 2) - return 1; - return fib(n - 1) + fib(n - 2); -} - -void -benchmark_fib(void) -{ - GTimer *timer = g_timer_new(); - bench_value r = EMPTY_BENCH_VALUE; - - shell_view_set_enabled(FALSE); - shell_status_update("Calculating the 42nd Fibonacci number..."); - - g_timer_reset(timer); - g_timer_start(timer); - - fib(42); - - g_timer_stop(timer); - r.elapsed_time = g_timer_elapsed(timer, NULL); - g_timer_destroy(timer); - - r.threads_used = 1; - r.result = r.elapsed_time; - - bench_results[BENCHMARK_FIB] = r; -} diff --git a/modules/benchmark/guibench.c b/modules/benchmark/guibench.c deleted file mode 100644 index b9573278..00000000 --- a/modules/benchmark/guibench.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <gtk/gtk.h> - -#include "iconcache.h" -#include "config.h" - -#define N_ITERATIONS 100000 -#define PHRASE "I \342\231\245 HardInfo" - -typedef double (*BenchCallback)(GtkWindow *window); - -static double test_lines(GtkWindow *window); -static double test_shapes(GtkWindow *window); -static double test_filled_shapes(GtkWindow *window); -static double test_text(GtkWindow *window); -static double test_icons(GtkWindow *window); - -/* -Results on a AMD Athlon 3200+ (Barton), 1GB RAM, -nVidia Geforce 6200 with nvidia Xorg driver, -running Linux 2.6.28, Xorg 1.6.0, Ubuntu 9.04 -desktop, GNOME 2.26.1, composite enabled. - -Test Time Iter/Sec -Line Drawing 3.9570 25271.7663 -Shape Drawing 22.2499 4494.4065 -Filled Shape Drawing 4.0377 24766.2806 -Text Drawing 59.1565 1690.4309 -Icon Blitting 51.720941 1933.4528 - -Results are normalized according to these values. -A guibench() result of 1000.0 is roughly equivalent -to this same setup. -*/ - -static struct { - BenchCallback callback; - gchar *title; - gdouble weight; -} tests[] = { - { test_lines, "Line Drawing", 25271.77 }, - { test_shapes, "Shape Drawing", 4494.49 }, - { test_filled_shapes, "Filled Shape Drawing", 24766.28 }, - { test_text, "Text Drawing", 1690.43 }, - { test_icons, "Icon Blitting", 1933.45 }, - { NULL, NULL } -}; - -static gchar *phrase = NULL; - -static gboolean keypress_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data) -{ - const int magic[] = { 0x1b, 0x33, 0x3a, 0x35, 0x51 }; - const int states[] = { 0xff52, 0xff52, 0xff54, 0xff54, - 0xff51, 0xff53, 0xff51, 0xff53, - 0x62, 0x61 }; - static int state = 0; - - if (event->keyval == states[state]) { - state++; - } else { - state = 0; - } - - if (state == G_N_ELEMENTS(states)) { - int i; - - for (i = 0; i < G_N_ELEMENTS(magic); i++) { - phrase[i + 6] = magic[i] ^ (states[i] & (states[i] >> 8)); - } - - state = 0; - } - - return FALSE; -} - -static double test_icons(GtkWindow *window) -{ - GdkPixbuf *pixbufs[3]; - GdkGC *gc; - GRand *rand; - GTimer *timer; - double time; - GdkWindow *gdk_window = GTK_WIDGET(window)->window; - int icons; - - gdk_window_clear(gdk_window); - - rand = g_rand_new(); - gc = gdk_gc_new(GDK_DRAWABLE(gdk_window)); - timer = g_timer_new(); - - pixbufs[0] = icon_cache_get_pixbuf("logo.png"); - pixbufs[1] = icon_cache_get_pixbuf("syncmanager.png"); - pixbufs[2] = icon_cache_get_pixbuf("report-large.png"); - - g_timer_start(timer); - for (icons = N_ITERATIONS; icons >= 0; icons--) { - int x, y; - - x = g_rand_int_range(rand, 0, 800); - y = g_rand_int_range(rand, 0, 600); - - gdk_draw_pixbuf(GDK_DRAWABLE(gdk_window), gc, - pixbufs[icons % G_N_ELEMENTS(pixbufs)], - 0, 0, x, y, 48, 48, - GDK_RGB_DITHER_NONE, 0, 0); - - while (gtk_events_pending()) { - gtk_main_iteration(); - } - } - g_timer_stop(timer); - - time = g_timer_elapsed(timer, NULL); - - g_rand_free(rand); - gdk_gc_destroy(gc); - g_timer_destroy(timer); - - return time; -} - -static double test_text(GtkWindow *window) -{ - GRand *rand; - GTimer *timer; - GdkGC *gc; - double time; - PangoLayout *layout; - PangoFontDescription *font; - GdkWindow *gdk_window = GTK_WIDGET(window)->window; - int strings; - - gdk_window_clear(gdk_window); - - rand = g_rand_new(); - gc = gdk_gc_new(GDK_DRAWABLE(gdk_window)); - timer = g_timer_new(); - - font = pango_font_description_new(); - layout = pango_layout_new(gtk_widget_get_pango_context(GTK_WIDGET(window))); - pango_layout_set_text(layout, phrase, -1); - - g_timer_start(timer); - for (strings = N_ITERATIONS; strings >= 0; strings--) { - int x, y, size; - - x = g_rand_int_range(rand, 0, 800); - y = g_rand_int_range(rand, 0, 600); - size = g_rand_int_range(rand, 1, 96) * PANGO_SCALE; - - pango_font_description_set_size(font, size); - pango_layout_set_font_description(layout, font); - gdk_draw_layout(GDK_DRAWABLE(gdk_window), gc, x, y, layout); - - gdk_rgb_gc_set_foreground(gc, strings << 8); - - while (gtk_events_pending()) { - gtk_main_iteration(); - } - - } - g_timer_stop(timer); - - time = g_timer_elapsed(timer, NULL); - - g_rand_free(rand); - gdk_gc_destroy(gc); - g_timer_destroy(timer); - g_object_unref(layout); - pango_font_description_free(font); - - return time; -} - -static double test_filled_shapes(GtkWindow *window) -{ - GRand *rand; - GTimer *timer; - GdkGC *gc; - double time; - GdkWindow *gdk_window = GTK_WIDGET(window)->window; - int lines; - - gdk_window_clear(gdk_window); - - rand = g_rand_new(); - gc = gdk_gc_new(GDK_DRAWABLE(gdk_window)); - timer = g_timer_new(); - - g_timer_start(timer); - for (lines = N_ITERATIONS; lines >= 0; lines--) { - int x1, y1; - - x1 = g_rand_int_range(rand, 0, 800); - y1 = g_rand_int_range(rand, 0, 600); - - gdk_rgb_gc_set_foreground(gc, lines << 8); - - gdk_draw_rectangle(GDK_DRAWABLE(gdk_window), gc, TRUE, - x1, y1, - g_rand_int_range(rand, 0, 400), - g_rand_int_range(rand, 0, 300)); - - while (gtk_events_pending()) { - gtk_main_iteration(); - } - } - g_timer_stop(timer); - - time = g_timer_elapsed(timer, NULL); - - g_rand_free(rand); - gdk_gc_destroy(gc); - g_timer_destroy(timer); - - return time; -} - -static double test_shapes(GtkWindow *window) -{ - GRand *rand; - GTimer *timer; - GdkGC *gc; - double time; - GdkWindow *gdk_window = GTK_WIDGET(window)->window; - int lines; - - gdk_window_clear(gdk_window); - - rand = g_rand_new(); - gc = gdk_gc_new(GDK_DRAWABLE(gdk_window)); - timer = g_timer_new(); - - g_timer_start(timer); - for (lines = N_ITERATIONS; lines >= 0; lines--) { - int x1, y1; - - x1 = g_rand_int_range(rand, 0, 800); - y1 = g_rand_int_range(rand, 0, 600); - - gdk_rgb_gc_set_foreground(gc, lines << 8); - - gdk_draw_rectangle(GDK_DRAWABLE(gdk_window), gc, FALSE, - x1, y1, - g_rand_int_range(rand, 0, 400), - g_rand_int_range(rand, 0, 300)); - while (gtk_events_pending()) { - gtk_main_iteration(); - } - } - g_timer_stop(timer); - - time = g_timer_elapsed(timer, NULL); - - g_rand_free(rand); - gdk_gc_destroy(gc); - g_timer_destroy(timer); - - return time; -} - -static double test_lines(GtkWindow *window) -{ - GRand *rand; - GTimer *timer; - GdkGC *gc; - double time; - GdkWindow *gdk_window = GTK_WIDGET(window)->window; - int lines; - - gdk_window_clear(gdk_window); - - rand = g_rand_new(); - gc = gdk_gc_new(GDK_DRAWABLE(gdk_window)); - timer = g_timer_new(); - - g_timer_start(timer); - for (lines = N_ITERATIONS; lines >= 0; lines--) { - int x1, y1, x2, y2; - - x1 = g_rand_int_range(rand, 0, 800); - y1 = g_rand_int_range(rand, 0, 600); - x2 = g_rand_int_range(rand, 0, 800); - y2 = g_rand_int_range(rand, 0, 600); - - gdk_draw_line(GDK_DRAWABLE(gdk_window), gc, x1, y1, x2, y2); - gdk_rgb_gc_set_foreground(gc, lines << 8); - - while (gtk_events_pending()) { - gtk_main_iteration(); - } - } - g_timer_stop(timer); - - time = g_timer_elapsed(timer, NULL); - - g_rand_free(rand); - gdk_gc_destroy(gc); - g_timer_destroy(timer); - - return time; -} - -double guibench(void) -{ - GtkWidget *window; - gdouble score = 0.0f; - gint i; - - phrase = g_strdup(PHRASE); - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_widget_set_size_request(window, 800, 600); - gtk_window_set_title(GTK_WINDOW(window), "guibench"); - - gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS); - gtk_widget_show(window); - - g_signal_connect(window, "key-press-event", G_CALLBACK(keypress_event), NULL); - - for (i = 0; tests[i].title; i++) { - double time; - - gtk_window_set_title(GTK_WINDOW(window), tests[i].title); - time = tests[i].callback(GTK_WINDOW(window)); - score += (N_ITERATIONS / time) / tests[i].weight; - } - - gtk_widget_destroy(window); - g_free(phrase); - - return (score / i) * 1000.0f; -} diff --git a/modules/benchmark/md5.c b/modules/benchmark/md5.c deleted file mode 100644 index f4032ddd..00000000 --- a/modules/benchmark/md5.c +++ /dev/null @@ -1,317 +0,0 @@ -/* - * This code implements the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to MD5Init, call MD5Update as - * needed on buffers full of bytes, and then call MD5Final, which - * will fill a supplied 16-byte array with the digest. - */ - -/* This code was modified in 1997 by Jim Kingdon of Cyclic Software to - not require an integer type which is exactly 32 bits. This work - draws on the changes for the same purpose by Tatu Ylonen - <ylo@cs.hut.fi> as part of SSH, but since I didn't actually use - that code, there is no copyright issue. I hereby disclaim - copyright in any changes I have made; this code remains in the - public domain. */ - -#include <string.h> /* for memcpy() and memset() */ - -/* Add prototype support. */ -#ifndef PROTO -#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__) -#define PROTO(ARGS) ARGS -#else -#define PROTO(ARGS) () -#endif -#endif - -#include "md5.h" - -#if defined(__OPTIMIZE__) -#error You must compile this program without "-O". (Or else the benchmark results may be different!) -#endif - -/* Little-endian byte-swapping routines. Note that these do not - depend on the size of datatypes such as uint32, nor do they require - us to detect the endianness of the machine we are running on. It - is possible they should be macros for speed, but I would be - surprised if they were a performance bottleneck for MD5. */ - -static uint32 getu32(addr) -const unsigned char *addr; -{ - return (((((unsigned long) addr[3] << 8) | addr[2]) << 8) - | addr[1]) << 8 | addr[0]; -} - -static void putu32(data, addr) -uint32 data; -unsigned char *addr; -{ - addr[0] = (unsigned char) data; - addr[1] = (unsigned char) (data >> 8); - addr[2] = (unsigned char) (data >> 16); - addr[3] = (unsigned char) (data >> 24); -} - -/* - * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious - * initialization constants. - */ -void MD5Init(ctx) -struct MD5Context *ctx; -{ - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; - - ctx->bits[0] = 0; - ctx->bits[1] = 0; -} - -/* - * Update context to reflect the concatenation of another buffer full - * of bytes. - */ -void MD5Update(ctx, buf, len) -struct MD5Context *ctx; -unsigned char const *buf; -unsigned len; -{ - uint32 t; - - /* Update bitcount */ - - t = ctx->bits[0]; - if ((ctx->bits[0] = (t + ((uint32) len << 3)) & 0xffffffff) < t) - ctx->bits[1]++; /* Carry from low to high */ - ctx->bits[1] += len >> 29; - - t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ - - /* Handle any leading odd-sized chunks */ - - if (t) { - unsigned char *p = ctx->in + t; - - t = 64 - t; - if (len < t) { - memcpy(p, buf, len); - return; - } - memcpy(p, buf, t); - MD5Transform(ctx->buf, ctx->in); - buf += t; - len -= t; - } - - /* Process data in 64-byte chunks */ - - while (len >= 64) { - memcpy(ctx->in, buf, 64); - MD5Transform(ctx->buf, ctx->in); - buf += 64; - len -= 64; - } - - /* Handle any remaining bytes of data. */ - - memcpy(ctx->in, buf, len); -} - -/* - * Final wrapup - pad to 64-byte boundary with the bit pattern - * 1 0* (64-bit count of bits processed, MSB-first) - */ -void MD5Final(digest, ctx) -unsigned char digest[16]; -struct MD5Context *ctx; -{ - unsigned count; - unsigned char *p; - - /* Compute number of bytes mod 64 */ - count = (ctx->bits[0] >> 3) & 0x3F; - - /* Set the first char of padding to 0x80. This is safe since there is - always at least one byte free */ - p = ctx->in + count; - *p++ = 0x80; - - /* Bytes of padding needed to make 64 bytes */ - count = 64 - 1 - count; - - /* Pad out to 56 mod 64 */ - if (count < 8) { - /* Two lots of padding: Pad the first block to 64 bytes */ - memset(p, 0, count); - MD5Transform(ctx->buf, ctx->in); - - /* Now fill the next block with 56 bytes */ - memset(ctx->in, 0, 56); - } else { - /* Pad block to 56 bytes */ - memset(p, 0, count - 8); - } - - /* Append length in bits and transform */ - putu32(ctx->bits[0], ctx->in + 56); - putu32(ctx->bits[1], ctx->in + 60); - - MD5Transform(ctx->buf, ctx->in); - putu32(ctx->buf[0], digest); - putu32(ctx->buf[1], digest + 4); - putu32(ctx->buf[2], digest + 8); - putu32(ctx->buf[3], digest + 12); - memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ -} - -#ifndef ASM_MD5 - -/* The four core functions - F1 is optimized somewhat */ - -/* #define F1(x, y, z) (x & y | ~x & z) */ -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -/* This is the central step in the MD5 algorithm. */ -#define MD5STEP(f, w, x, y, z, data, s) \ - ( w += f(x, y, z) + data, w &= 0xffffffff, w = w<<s | w>>(32-s), w += x ) - -/* - * The core of the MD5 algorithm, this alters an existing MD5 hash to - * reflect the addition of 16 longwords of new data. MD5Update blocks - * the data and converts bytes into longwords for this routine. - */ -void MD5Transform(buf, inraw) -uint32 buf[4]; -const unsigned char inraw[64]; -{ - register uint32 a, b, c, d; - uint32 in[16]; - int i; - - for (i = 0; i < 16; ++i) - in[i] = getu32(inraw + 4 * i); - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} -#endif - -#ifdef TEST -/* Simple test program. Can use it to manually run the tests from - RFC1321 for example. */ -#include <stdio.h> - -int main(int argc, char **argv) -{ - struct MD5Context context; - unsigned char checksum[16]; - int i; - int j; - - if (argc < 2) { - fprintf(stderr, "usage: %s string-to-hash\n", argv[0]); - exit(1); - } - for (j = 1; j < argc; ++j) { - printf("MD5 (\"%s\") = ", argv[j]); - MD5Init(&context); - MD5Update(&context, argv[j], strlen(argv[j])); - MD5Final(checksum, &context); - for (i = 0; i < 16; i++) { - printf("%02x", (unsigned int) checksum[i]); - } - printf("\n"); - } - return 0; -} -#endif /* TEST */ diff --git a/modules/benchmark/nqueens.c b/modules/benchmark/nqueens.c deleted file mode 100644 index 78293abb..00000000 --- a/modules/benchmark/nqueens.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * N-Queens Problem Solver - * Found somewhere on the Internet; can't remember where. Possibly Wikipedia. - */ -#include <stdio.h> -#include <stdbool.h> -#include <stdlib.h> - -#include "hardinfo.h" -#include "benchmark.h" - -#define QUEENS 11 - -int row[QUEENS]; - -bool safe(int x, int y) -{ - int i; - for (i = 1; i <= y; i++) - if (row[y - i] == x || row[y - i] == x - i || row[y - i] == x + i) - return false; - return true; -} - -int nqueens(int y) -{ - int x; - - for (x = 0; x < QUEENS; x++) { - if (safe((row[y - 1] = x), y - 1)) { - if (y < QUEENS) { - nqueens(y + 1); - } else { - break; - } - } - } - - return 0; -} - -static gpointer nqueens_for(unsigned int start, unsigned int end, void *data, gint thread_number) -{ - unsigned int i; - - for (i = start; i <= end; i++) { - nqueens(0); - } - - return NULL; -} - -void -benchmark_nqueens(void) -{ - bench_value r = EMPTY_BENCH_VALUE; - - shell_view_set_enabled(FALSE); - shell_status_update("Running N-Queens benchmark..."); - - r = benchmark_parallel_for(0, 0, 10, nqueens_for, NULL); - r.result = r.elapsed_time; - - bench_results[BENCHMARK_NQUEENS] = r; -} - - diff --git a/modules/benchmark/raytrace.c b/modules/benchmark/raytrace.c deleted file mode 100644 index c7963583..00000000 --- a/modules/benchmark/raytrace.c +++ /dev/null @@ -1,48 +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 - */ - -#include "benchmark.h" - -void fbench(); /* fbench.c */ - -static gpointer -parallel_raytrace(unsigned int start, unsigned int end, gpointer data, gint thread_number) -{ - unsigned int i; - - for (i = start; i <= end; i++) { - fbench(); - } - - return NULL; -} - -void -benchmark_raytrace(void) -{ - bench_value r = EMPTY_BENCH_VALUE; - - shell_view_set_enabled(FALSE); - shell_status_update("Performing John Walker's FBENCH..."); - - r = benchmark_parallel_for(0, 0, 1000, parallel_raytrace, NULL); - r.result = r.elapsed_time; - - bench_results[BENCHMARK_RAYTRACE] = r; -} - diff --git a/modules/benchmark/sha1.c b/modules/benchmark/sha1.c deleted file mode 100644 index b94ce254..00000000 --- a/modules/benchmark/sha1.c +++ /dev/null @@ -1,329 +0,0 @@ -/* -SHA-1 in C -By Steve Reid <steve@edmweb.com> -100% Public Domain - -Test Vectors (from FIPS PUB 180-1) -"abc" - A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D -"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" - 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 -A million repetitions of "a" - 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F -*/ - - -/* #define SHA1HANDSOFF * Copies data before messing with it. */ - -#include <stdio.h> -#include <string.h> -#include <sha1.h> - -#if defined(__OPTIMIZE__) -#error You must compile this program without "-O". -#endif - - -#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) - -/* blk0() and blk() perform the initial expand. */ -/* I got the idea of expanding during the round function from SSLeay */ -#ifdef LITTLE_ENDIAN -#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ - |(rol(block->l[i],8)&0x00FF00FF)) -#else -#define blk0(i) block->l[i] -#endif -#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ - ^block->l[(i+2)&15]^block->l[i&15],1)) - -/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); -#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); -#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); - - -/* Hash a single 512-bit block. This is the core of the algorithm. */ - -void SHA1Transform(guint32 state[5], guchar buffer[64]) -{ - guint32 a, b, c, d, e; - typedef union { - guchar c[64]; - guint32 l[16]; - } CHAR64LONG16; - CHAR64LONG16 *block; -#ifdef SHA1HANDSOFF - static guchar workspace[64]; - block = (CHAR64LONG16 *) workspace; - memcpy(block, buffer, 64); -#else - block = (CHAR64LONG16 *) buffer; -#endif - /* Copy context->state[] to working vars */ - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - /* 4 rounds of 20 operations each. Loop unrolled. */ - R0(a, b, c, d, e, 0); - R0(e, a, b, c, d, 1); - R0(d, e, a, b, c, 2); - R0(c, d, e, a, b, 3); - R0(b, c, d, e, a, 4); - R0(a, b, c, d, e, 5); - R0(e, a, b, c, d, 6); - R0(d, e, a, b, c, 7); - R0(c, d, e, a, b, 8); - R0(b, c, d, e, a, 9); - R0(a, b, c, d, e, 10); - R0(e, a, b, c, d, 11); - R0(d, e, a, b, c, 12); - R0(c, d, e, a, b, 13); - R0(b, c, d, e, a, 14); - R0(a, b, c, d, e, 15); - R1(e, a, b, c, d, 16); - R1(d, e, a, b, c, 17); - R1(c, d, e, a, b, 18); - R1(b, c, d, e, a, 19); - R2(a, b, c, d, e, 20); - R2(e, a, b, c, d, 21); - R2(d, e, a, b, c, 22); - R2(c, d, e, a, b, 23); - R2(b, c, d, e, a, 24); - R2(a, b, c, d, e, 25); - R2(e, a, b, c, d, 26); - R2(d, e, a, b, c, 27); - R2(c, d, e, a, b, 28); - R2(b, c, d, e, a, 29); - R2(a, b, c, d, e, 30); - R2(e, a, b, c, d, 31); - R2(d, e, a, b, c, 32); - R2(c, d, e, a, b, 33); - R2(b, c, d, e, a, 34); - R2(a, b, c, d, e, 35); - R2(e, a, b, c, d, 36); - R2(d, e, a, b, c, 37); - R2(c, d, e, a, b, 38); - R2(b, c, d, e, a, 39); - R3(a, b, c, d, e, 40); - R3(e, a, b, c, d, 41); - R3(d, e, a, b, c, 42); - R3(c, d, e, a, b, 43); - R3(b, c, d, e, a, 44); - R3(a, b, c, d, e, 45); - R3(e, a, b, c, d, 46); - R3(d, e, a, b, c, 47); - R3(c, d, e, a, b, 48); - R3(b, c, d, e, a, 49); - R3(a, b, c, d, e, 50); - R3(e, a, b, c, d, 51); - R3(d, e, a, b, c, 52); - R3(c, d, e, a, b, 53); - R3(b, c, d, e, a, 54); - R3(a, b, c, d, e, 55); - R3(e, a, b, c, d, 56); - R3(d, e, a, b, c, 57); - R3(c, d, e, a, b, 58); - R3(b, c, d, e, a, 59); - R4(a, b, c, d, e, 60); - R4(e, a, b, c, d, 61); - R4(d, e, a, b, c, 62); - R4(c, d, e, a, b, 63); - R4(b, c, d, e, a, 64); - R4(a, b, c, d, e, 65); - R4(e, a, b, c, d, 66); - R4(d, e, a, b, c, 67); - R4(c, d, e, a, b, 68); - R4(b, c, d, e, a, 69); - R4(a, b, c, d, e, 70); - R4(e, a, b, c, d, 71); - R4(d, e, a, b, c, 72); - R4(c, d, e, a, b, 73); - R4(b, c, d, e, a, 74); - R4(a, b, c, d, e, 75); - R4(e, a, b, c, d, 76); - R4(d, e, a, b, c, 77); - R4(c, d, e, a, b, 78); - R4(b, c, d, e, a, 79); - /* Add the working vars back into context.state[] */ - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - /* Wipe variables */ - a = b = c = d = e = 0; -} - - -/* SHA1Init - Initialize new context */ - -void SHA1Init(SHA1_CTX * context) -{ - /* SHA1 initialization constants */ - context->state[0] = 0x67452301; - context->state[1] = 0xEFCDAB89; - context->state[2] = 0x98BADCFE; - context->state[3] = 0x10325476; - context->state[4] = 0xC3D2E1F0; - context->count[0] = context->count[1] = 0; -} - - -/* Run your data through this. */ - -void SHA1Update(SHA1_CTX * context, guchar * data, guint32 len) -{ - guint32 i, j; - - j = (context->count[0] >> 3) & 63; - if ((context->count[0] += len << 3) < (len << 3)) - context->count[1]++; - context->count[1] += (len >> 29); - if ((j + len) > 63) { - memcpy(&context->buffer[j], data, (i = 64 - j)); - SHA1Transform(context->state, context->buffer); - for (; i + 63 < len; i += 64) { - SHA1Transform(context->state, &data[i]); - } - j = 0; - } else - i = 0; - memcpy(&context->buffer[j], &data[i], len - i); -} - - -/* Add padding and return the message digest. */ - -void SHA1Final(guchar digest[20], SHA1_CTX * context) -{ - guint32 i, j; - guchar finalcount[8]; - - for (i = 0; i < 8; i++) { - finalcount[i] = (guchar) ((context->count[(i >= 4 ? 0 : 1)] - >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */ - } - SHA1Update(context, (guchar *) "\200", 1); - while ((context->count[0] & 504) != 448) { - SHA1Update(context, (guchar *) "\0", 1); - } - SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ - for (i = 0; i < 20; i++) { - digest[i] = (guchar) - ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255); - } - /* Wipe variables */ - i = j = 0; - memset(context->buffer, 0, 64); - memset(context->state, 0, 20); - memset(context->count, 0, 8); - memset(&finalcount, 0, 8); -#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite it's own static vars */ - SHA1Transform(context->state, context->buffer); -#endif -} - -#ifdef SHA1_TEST -static char *b32_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; - -static void base32_encode_exactly(guchar * buf, gint len, - guchar * encbuf, gint enclen) -{ - gint i = 0; - guchar *ip = buf + len; - guchar *op = encbuf + enclen; - - switch (len % 5) { - case 0: - do { - g_assert(op - encbuf >= 8); - i = *--ip; /* Input #4 */ - *--op = b32_alphabet[i & 0x1f]; /* Ouput #7 */ - i >>= 5; /* upper <234>, input #4 */ - /* FALLTHROUGH */ - case 4: - i |= ((guint32) * --ip) << 3; /* had 3 bits in `i' */ - *--op = b32_alphabet[i & 0x1f]; /* Output #6 */ - i >>= 5; /* upper <401234>, input #3 */ - *--op = b32_alphabet[i & 0x1f]; /* Output #5 */ - i >>= 5; /* upper <4>, input #3 */ - /* FALLTHROUGH */ - case 3: - i |= ((guint32) * --ip) << 1; /* had 1 bits in `i' */ - *--op = b32_alphabet[i & 0x1f]; /* Output #4 */ - i >>= 5; /* upper <1234>, input #2 */ - /* FALLTHROUGH */ - case 2: - i |= ((guint32) * --ip) << 4; /* had 4 bits in `i' */ - *--op = b32_alphabet[i & 0x1f]; /* Output #3 */ - i >>= 5; /* upper <3401234>, input #1 */ - *--op = b32_alphabet[i & 0x1f]; /* Output #2 */ - i >>= 5; /* upper <34>, input #1 */ - /* FALLTHROUGH */ - case 1: - i |= ((guint32) * --ip) << 2; /* had 2 bits in `i' */ - *--op = b32_alphabet[i & 0x1f]; /* Output #1 */ - i >>= 5; /* upper <01234>, input #0 */ - *--op = b32_alphabet[i & 0x1f]; /* Output #0 */ - i >>= 5; /* Holds nothing, MBZ */ - g_assert(i == 0); - g_assert(op >= encbuf); - } while (op > encbuf); - } -} - - - -/*************************************************************/ - -int main(int argc, char **argv) -{ - gint i, j; - SHA1_CTX context; - guchar digest[20], buffer[16384]; - FILE *file; - - if (argc > 2) { - puts("Public domain SHA-1 implementation - by Steve Reid <steve@edmweb.com>"); - puts("Produces the SHA-1 hash of a file, or stdin if no file is specified."); - exit(0); - } - if (argc < 2) { - file = stdin; - } else { - if (!(file = fopen(argv[1], "rb"))) { - fputs("Unable to open file.", stderr); - exit(-1); - } - } - SHA1Init(&context); - while (!feof(file)) { /* note: what if ferror(file) */ - i = fread(buffer, 1, 16384, file); - SHA1Update(&context, buffer, i); - } - SHA1Final(digest, &context); - fclose(file); - - for (i = 0; i < 5; i++) { - for (j = 0; j < 4; j++) { - printf("%02X", digest[i*4+j]); - } - putchar(' '); - } - putchar('\n'); - - { - guchar tmp[33]; - tmp[32] = '\0'; - base32_encode_exactly(digest, 20, tmp, 32); - printf("%s\n", tmp); - } - - exit(0); -} -#endif /* SHA1_TEST */ diff --git a/modules/benchmark/zlib.c b/modules/benchmark/zlib.c deleted file mode 100644 index 2ded59a4..00000000 --- a/modules/benchmark/zlib.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2017 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <glib.h> -#include <stdlib.h> -#include <zlib.h> - -#include "benchmark.h" - -static gpointer zlib_for(unsigned int start, unsigned int end, void *data, gint thread_number) -{ - char *compressed; - uLong bound = compressBound(bound); - unsigned int i; - - compressed = malloc(bound); - if (!compressed) - return NULL; - - for (i = start; i <= end; i++) { - char uncompressed[65536]; - uLong compressedBound = bound; - uLong destBound = sizeof(uncompressed); - - compress(compressed, &compressedBound, data, 65536); - uncompress(uncompressed, &destBound, compressed, compressedBound); - } - - free(compressed); - - return NULL; -} - -void -benchmark_zlib(void) -{ - bench_value r = EMPTY_BENCH_VALUE; - gchar *tmpsrc, *bdata_path; - - bdata_path = g_build_filename(params.path_data, "benchmark.data", NULL); - if (!g_file_get_contents(bdata_path, &tmpsrc, NULL, NULL)) { - g_free(bdata_path); - return; - } - - shell_view_set_enabled(FALSE); - shell_status_update("Running Zlib benchmark..."); - - r = benchmark_parallel_for(0, 0, 50000, zlib_for, tmpsrc); - - g_free(bdata_path); - g_free(tmpsrc); - - //TODO: explain in code comments - gdouble marks = (50000. * 65536.) / (r.elapsed_time * 840205128.); - r.result = marks; - bench_results[BENCHMARK_ZLIB] = r; -} diff --git a/modules/computer.c b/modules/computer.c deleted file mode 100644 index ea6762a7..00000000 --- a/modules/computer.c +++ /dev/null @@ -1,812 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <config.h> -#include <gtk/gtk.h> -#include <stdarg.h> -#include <stdlib.h> -#include <string.h> -#include <string.h> -#include <sys/stat.h> -#include <time.h> - -#include <hardinfo.h> -#include <iconcache.h> -#include <shell.h> - -#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 */ -gchar *callback_summary(void); -gchar *callback_os(void); -gchar *callback_modules(void); -gchar *callback_boots(void); -gchar *callback_locales(void); -gchar *callback_fs(void); -gchar *callback_display(void); -gchar *callback_network(void); -gchar *callback_users(void); -gchar *callback_groups(void); -gchar *callback_env_var(void); -#if GLIB_CHECK_VERSION(2,14,0) -gchar *callback_dev(void); -#endif /* GLIB_CHECK_VERSION(2,14,0) */ - -/* Scan callbacks */ -void scan_summary(gboolean reload); -void scan_os(gboolean reload); -void scan_modules(gboolean reload); -void scan_boots(gboolean reload); -void scan_locales(gboolean reload); -void scan_fs(gboolean reload); -void scan_display(gboolean reload); -void scan_network(gboolean reload); -void scan_users(gboolean reload); -void scan_groups(gboolean reload); -void scan_env_var(gboolean reload); -#if GLIB_CHECK_VERSION(2,14,0) -void scan_dev(gboolean reload); -#endif /* GLIB_CHECK_VERSION(2,14,0) */ - -static ModuleEntry entries[] = { - {N_("Summary"), "summary.png", callback_summary, scan_summary, MODULE_FLAG_NONE}, - {N_("Operating System"), "os.png", callback_os, scan_os, MODULE_FLAG_NONE}, - {N_("Kernel Modules"), "module.png", callback_modules, scan_modules, MODULE_FLAG_NONE}, - {N_("Boots"), "boot.png", callback_boots, scan_boots, MODULE_FLAG_NONE}, - {N_("Languages"), "language.png", callback_locales, scan_locales, MODULE_FLAG_NONE}, - {N_("Filesystems"), "dev_removable.png", callback_fs, scan_fs, MODULE_FLAG_NONE}, - {N_("Display"), "monitor.png", callback_display, scan_display, MODULE_FLAG_NONE}, - {N_("Environment Variables"), "environment.png", callback_env_var, scan_env_var, MODULE_FLAG_NONE}, -#if GLIB_CHECK_VERSION(2,14,0) - {N_("Development"), "devel.png", callback_dev, scan_dev, MODULE_FLAG_NONE}, -#endif /* GLIB_CHECK_VERSION(2,14,0) */ - {N_("Users"), "users.png", callback_users, scan_users, MODULE_FLAG_NONE}, - {N_("Groups"), "users.png", callback_groups, scan_groups, MODULE_FLAG_NONE}, - {NULL}, -}; - - -gchar *module_list = NULL; -Computer *computer = NULL; - -gchar *hi_more_info(gchar * entry) -{ - gchar *info = moreinfo_lookup_with_prefix("COMP", entry); - - if (info) - return g_strdup(info); - - return g_strdup_printf("[%s]", entry); -} - -gchar *hi_get_field(gchar * field) -{ - gchar *tmp; - - if (g_str_equal(field, _("Memory"))) { - MemoryInfo *mi = computer_get_memory(); - tmp = g_strdup_printf(_("%dMB (%dMB used)"), mi->total, mi->used); - g_free(mi); - } else if (g_str_equal(field, _("Uptime"))) { - tmp = computer_get_formatted_uptime(); - } else if (g_str_equal(field, _("Date/Time"))) { - time_t t = time(NULL); - - tmp = g_new0(gchar, 64); - strftime(tmp, 64, "%c", localtime(&t)); - } else if (g_str_equal(field, _("Load Average"))) { - tmp = computer_get_formatted_loadavg(); - } else if (g_str_equal(field, _("Available entropy in /dev/random"))) { - tmp = computer_get_entropy_avail(); - } else { - tmp = g_strdup_printf("Unknown field: %s", field); - } - return tmp; -} - -void scan_summary(gboolean reload) -{ - SCAN_START(); - module_entry_scan_all_except(entries, 0); - computer->alsa = computer_get_alsainfo(); - SCAN_END(); -} - -void scan_os(gboolean reload) -{ - SCAN_START(); - computer->os = computer_get_os(); - SCAN_END(); -} - -void scan_modules(gboolean reload) -{ - SCAN_START(); - scan_modules_do(); - SCAN_END(); -} - -void scan_boots(gboolean reload) -{ - SCAN_START(); - scan_boots_real(); - SCAN_END(); -} - -void scan_locales(gboolean reload) -{ - SCAN_START(); - scan_os(FALSE); - scan_languages(computer->os); - SCAN_END(); -} - -void scan_fs(gboolean reload) -{ - SCAN_START(); - scan_filesystems(); - SCAN_END(); -} - -void scan_display(gboolean reload) -{ - SCAN_START(); - computer->display = computer_get_display(); - SCAN_END(); -} - -void scan_users(gboolean reload) -{ - SCAN_START(); - scan_users_do(); - SCAN_END(); -} - -void scan_groups(gboolean reload) -{ - SCAN_START(); - scan_groups_do(); - SCAN_END(); -} - -#if GLIB_CHECK_VERSION(2,14,0) -static gchar *dev_list = NULL; -void scan_dev(gboolean reload) -{ - SCAN_START(); - - int i; - struct { - gchar *compiler_name; - gchar *version_command; - gchar *regex; - gboolean stdout; - } detect_lang[] = { - { N_("Scripting Languages"), NULL, FALSE }, - { N_("Gambas3 (gbr3)"), "gbr3 --version", "\\d+\\.\\d+\\.\\d+", TRUE }, - { N_("Python"), "python -V", "\\d+\\.\\d+\\.\\d+", FALSE }, - { N_("Python2"), "python2 -V", "\\d+\\.\\d+\\.\\d+", FALSE }, - { N_("Python3"), "python3 -V", "\\d+\\.\\d+\\.\\d+", TRUE }, - { N_("Perl"), "perl -v", "\\d+\\.\\d+\\.\\d+", TRUE }, - { N_("Perl6 (VM)"), "perl6 -v", "(?<=This is ).*", TRUE }, - { N_("Perl6"), "perl6 -v", "(?<=implementing Perl )\\w*\\.\\w*", TRUE }, - { N_("PHP"), "php --version", "\\d+\\.\\d+\\.\\S+", TRUE}, - { N_("Ruby"), "ruby --version", "\\d+\\.\\d+\\.\\d+", TRUE }, - { N_("Bash"), "bash --version", "\\d+\\.\\d+\\.\\S+", TRUE}, - { N_("Compilers"), NULL, FALSE }, - { 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+", 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 }, - { N_("Vala"), "valac --version", "\\d+\\.\\d+\\.\\d+", TRUE }, - { N_("Haskell (GHC)"), "ghc -v", "\\d+\\.\\d+\\.\\d+", FALSE }, - { N_("FreePascal"), "fpc -iV", "\\d+\\.\\d+\\.?\\d*", TRUE }, - { N_("Go"), "go version", "\\d+\\.\\d+\\.?\\d* ", TRUE }, - { N_("Tools"), NULL, FALSE }, - { N_("make"), "make --version", "\\d+\\.\\d+", TRUE }, - { N_("GDB"), "gdb --version", "(?<=^GNU gdb ).*", TRUE }, - { N_("strace"), "strace -V", "\\d+\\.\\d+\\.?\\d*", TRUE }, - { 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+", TRUE }, - }; - - g_free(dev_list); - - dev_list = g_strdup(""); - - for (i = 0; i < G_N_ELEMENTS(detect_lang); i++) { - gchar *version = NULL; - gchar *output, *ignored; - gchar *temp; - GRegex *regex; - GMatchInfo *match_info; - gboolean found; - - if (!detect_lang[i].regex) { - dev_list = h_strdup_cprintf("[%s]\n", dev_list, _(detect_lang[i].compiler_name)); - continue; - } - - if (detect_lang[i].stdout) { - found = g_spawn_command_line_sync(detect_lang[i].version_command, &output, &ignored, NULL, NULL); - } else { - found = g_spawn_command_line_sync(detect_lang[i].version_command, &ignored, &output, NULL, NULL); - } - g_free(ignored); - - if (found) { - regex = g_regex_new(detect_lang[i].regex, 0, 0, NULL); - - g_regex_match(regex, output, 0, &match_info); - if (g_match_info_matches(match_info)) { - version = g_match_info_fetch(match_info, 0); - } - - g_match_info_free(match_info); - g_regex_unref(regex); - g_free(output); - } - - if (version == NULL) - version = strdup(_("Not found")); - - dev_list = h_strdup_cprintf("%s=%s\n", dev_list, detect_lang[i].compiler_name, version); - g_free(version); - - temp = g_strdup_printf(_("Detecting version: %s"), - detect_lang[i].compiler_name); - shell_status_update(temp); - g_free(temp); - } - - SCAN_END(); -} - -gchar *callback_dev(void) -{ - return g_strdup_printf( - "[$ShellParam$]\n" - "ColumnTitle$TextValue=%s\n" /* Program */ - "ColumnTitle$Value=%s\n" /* Version */ - "ShowColumnHeaders=true\n" - "%s", - _("Program"), _("Version"), - dev_list); -} -#endif /* GLIB_CHECK_VERSION(2,14,0) */ - -static gchar *detect_machine_type(void) -{ - GDir *dir; - gchar *chassis; - - 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)) - return g_strdup(_("Laptop")); - - dir = g_dir_open("/proc/acpi/battery", 0, NULL); - if (dir) { - const gchar *name = g_dir_read_name(dir); - - g_dir_close(dir); - - if (name) - return g_strdup(_("Laptop")); - } - - dir = g_dir_open("/sys/class/power_supply", 0, NULL); - if (dir) { - const gchar *name; - - while ((name = g_dir_read_name(dir))) { - gchar *contents; - gchar type[PATH_MAX]; - int r; - - r = snprintf(type, sizeof(type), "%s/%s/type", - "/sys/class/power_supply", name); - if (r < 0 || r > PATH_MAX) - continue; - - if (g_file_get_contents(type, &contents, NULL, NULL)) { - if (g_str_has_prefix(contents, "Battery")) { - g_free(contents); - g_dir_close(dir); - - return g_strdup(_("Laptop")); - } - - g_free(contents); - } - } - - g_dir_close(dir); - } - - /* FIXME: check if batteries are found using /proc/apm */ - - return g_strdup(_("Unknown physical machine type")); -} - -/* Table based off imvirt by Thomas Liske <liske@ibh.de> - Copyright (c) 2008 IBH IT-Service GmbH under GPLv2. */ -gchar *computer_get_virtualization(void) -{ - gboolean found = FALSE; - gint i, j; - gchar *files[] = { - "/proc/scsi/scsi", - "/proc/cpuinfo", - "/var/log/dmesg", - NULL - }; - const static struct { - gchar *str; - gchar *vmtype; - } vm_types[] = { - /* VMware */ - { "VMware", N_("Virtual (VMware)") }, - { ": VMware Virtual IDE CDROM Drive", N_("Virtual (VMware)") }, - /* 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,", N_("Virtual (Unknown)") }, - { ": Virtual CD,", N_("Virtual (Unknown)") }, - /* Virtual Box */ - { "VBOX", N_("Virtual (VirtualBox)") }, - { ": VBOX HARDDISK", N_("Virtual (VirtualBox)") }, - { ": VBOX CD-ROM", N_("Virtual (VirtualBox)") }, - /* Xen */ - { "Xen virtual console", N_("Virtual (Xen)") }, - { "Xen reported: ", N_("Virtual (Xen)") }, - { "xen-vbd: registered block device", N_("Virtual (Xen)") }, - /* Generic */ - { " 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(_("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]; - FILE *file; - - if ((file = fopen(files[i], "r"))) { - while (!found && fgets(buffer, 512, file)) { - for (j = 0; vm_types[j+1].str; j++) { - if (strstr(buffer, vm_types[j].str)) { - found = TRUE; - break; - } - } - } - - fclose(file); - - if (found) { - DEBUG("%s found (by reading file %s)", - vm_types[j].vmtype, files[i]); - return g_strdup(_(vm_types[j].vmtype)); - } - } - - } - - DEBUG("no virtual machine detected; assuming physical machine"); - - return detect_machine_type(); -} - -gchar *callback_summary(void) -{ - struct Info *info = info_new(); - - info_add_group(info, _("Computer"), - info_field_printf(_("Processor"), "%s", - module_call_method("devices::getProcessorName")), - info_field_update(_("Memory"), 1000), - info_field_printf(_("Machine Type"), "%s", - computer_get_virtualization()), - info_field(_("Operating System"), computer->os->distro), - info_field(_("User Name"), computer->os->username), - info_field_update(_("Date/Time"), 1000), - info_field_last()); - - info_add_group(info, _("Display"), - info_field_printf(_("Resolution"), _(/* label for resolution */ "%dx%d pixels"), - computer->display->width, computer->display->height), - info_field(_("OpenGL Renderer"), computer->display->ogl_renderer), - info_field(_("X11 Vendor"), computer->display->vendor), - info_field_last()); - - info_add_computed_group(info, _("Audio Devices"), - 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, NULL, /* getPrinters provides group headers */ - idle_free(module_call_method("devices::getPrinters"))); - info_add_computed_group(info, NULL, /* getStorageDevices provides group headers */ - idle_free(module_call_method("devices::getStorageDevices"))); - - return info_flatten(info); -} - -gchar *callback_os(void) -{ - struct Info *info = info_new(); - - info_add_group(info, _("Version"), - info_field(_("Kernel"), computer->os->kernel), - info_field(_("Version"), computer->os->kernel_version), - info_field(_("C Library"), computer->os->libc), - info_field(_("Distribution"), computer->os->distro), - info_field_last()); - - info_add_group(info, _("Current Session"), - info_field(_("Computer Name"), computer->os->hostname), - info_field(_("User Name"), computer->os->username), - info_field(_("Language"), computer->os->language), - info_field(_("Home Directory"), computer->os->homedir), - info_field_last()); - - info_add_group(info, _("Misc"), - info_field_update(_("Uptime"), 1000), - info_field_update(_("Load Average"), 10000), - info_field_update(_("Available entropy in /dev/random"), 1000), - info_field_last()); - - return info_flatten(info); -} - -gchar *callback_modules(void) -{ - struct Info *info = info_new(); - - info_add_computed_group(info, _("Loaded Modules"), module_list); - - info_set_column_title(info, "TextValue", _("Name")); - info_set_column_title(info, "Value", _("Description")); - info_set_column_headers_visible(info, TRUE); - info_set_view_type(info, SHELL_VIEW_DUAL); - - return info_flatten(info); -} - -gchar *callback_boots(void) -{ - struct Info *info = info_new(); - - info_add_computed_group(info, _("Boots"), computer->os->boots); - - info_set_column_title(info, "TextValue", _("Date & Time")); - info_set_column_title(info, "Value", _("Kernel Version")); - info_set_column_headers_visible(info, TRUE); - - return info_flatten(info); -} - -gchar *callback_locales(void) -{ - struct Info *info = info_new(); - - info_add_computed_group(info, _("Available Languages"), computer->os->languages); - - info_set_column_title(info, "TextValue", _("Language Code")); - info_set_column_title(info, "Value", _("Name")); - info_set_view_type(info, SHELL_VIEW_DUAL); - info_set_column_headers_visible(info, TRUE); - - return info_flatten(info); -} - -gchar *callback_fs(void) -{ - struct Info *info = info_new(); - - info_add_computed_group(info, _("Mounted File Systems"), fs_list); - - info_set_column_title(info, "Extra1", _("Mount Point")); - info_set_column_title(info, "Progress", _("Usage")); - info_set_column_title(info, "TextValue", _("Device")); - info_set_column_headers_visible(info, TRUE); - info_set_view_type(info, SHELL_VIEW_PROGRESS_DUAL); - info_set_zebra_visible(info, TRUE); - info_set_normalize_percentage(info, FALSE); - - return info_flatten(info); -} - -gchar *callback_display(void) -{ - struct Info *info = info_new(); - - info_add_group(info, _("Display"), - info_field_printf(_("Resolution"), _(/* resolution WxH unit */ "%dx%d pixels"), - 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); - - info_add_group(info, _("OpenGL"), - info_field(_("Vendor"), computer->display->ogl_vendor), - info_field(_("Renderer"), computer->display->ogl_renderer), - info_field(_("Version"), computer->display->ogl_version), - info_field(_("Direct Rendering"), - computer->display->dri ? _("Yes") : _("No")), - info_field_last()); - - info_add_computed_group(info, _("Extensions"), computer->display->extensions); - - return info_flatten(info); -} - -gchar *callback_users(void) -{ - struct Info *info = info_new(); - - info_add_computed_group(info, _("Users"), users); - info_set_view_type(info, SHELL_VIEW_DUAL); - info_set_reload_interval(info, 10000); - - return info_flatten(info); -} - -gchar *callback_groups(void) -{ - struct Info *info = info_new(); - - info_add_computed_group(info, _("Group"), groups); - - info_set_column_title(info, "TextValue", _("Name")); - info_set_column_title(info, "Value", _("Group ID")); - info_set_column_headers_visible(info, TRUE); - info_set_reload_interval(info, 10000); - - return info_flatten(info); -} - -gchar *get_os_kernel(void) -{ - scan_os(FALSE); - return g_strdup(computer->os->kernel); -} - -gchar *get_os(void) -{ - scan_os(FALSE); - 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); - - return g_strdup_printf("%dx%d\n" - "%s\n" - "%s", - computer->display->width, - computer->display->height, - computer->display->ogl_renderer, - computer->display->vendor); -} - -gchar *get_kernel_module_description(gchar *module) -{ - gchar *description; - - if (!_module_hash_table) { - scan_modules(FALSE); - } - - description = g_hash_table_lookup(_module_hash_table, module); - if (!description) { - return NULL; - } - - return g_strdup(description); -} - -gchar *get_audio_cards(void) -{ - if (!computer->alsa) { - computer->alsa = computer_get_alsainfo(); - } - - return computer_get_alsacards(computer); -} - -ShellModuleMethod *hi_exported_methods(void) -{ - static ShellModuleMethod m[] = { - {"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} - }; - - return m; -} - -ModuleEntry *hi_module_get_entries(void) -{ - return entries; -} - -gchar *hi_module_get_name(void) -{ - return g_strdup(_("Computer")); -} - -guchar hi_module_get_weight(void) -{ - return 80; -} - -gchar **hi_module_get_dependencies(void) -{ - static gchar *deps[] = { "devices.so", NULL }; - - return deps; -} - -gchar *hi_module_get_summary(void) -{ - return g_strdup_printf("[%s]\n" - "Icon=os.png\n" - "Method=computer::getOS\n" - "[%s]\n" - "Icon=processor.png\n" - "Method=devices::getProcessorNameAndDesc\n" - "[%s]\n" - "Icon=memory.png\n" - "Method=devices::getMemoryTotal\n" - "[%s]\n" - "Icon=module.png\n" - "Method=devices::getMotherboard\n" - "[%s]\n" - "Icon=monitor.png\n" - "Method=computer::getDisplaySummary\n" - "[%s]\n" - "Icon=hdd.png\n" - "Method=devices::getStorageDevices\n" - "[%s]\n" - "Icon=printer.png\n" - "Method=devices::getPrinters\n" - "[%s]\n" - "Icon=audio.png\n" - "Method=computer::getAudioCards\n", - _("Operating System"), - _("CPU"), _("RAM"), _("Motherboard"), _("Graphics"), - _("Storage"), _("Printers"), _("Audio") - ); -} - -void hi_module_deinit(void) -{ - if (computer->os) { - g_free(computer->os->kernel); - g_free(computer->os->libc); - g_free(computer->os->distrocode); - g_free(computer->os->distro); - g_free(computer->os->hostname); - g_free(computer->os->language); - g_free(computer->os->homedir); - g_free(computer->os->kernel_version); - g_free(computer->os->languages); - g_free(computer->os->desktop); - g_free(computer->os->username); - g_free(computer->os->boots); - g_free(computer->os); - } - - if (computer->display) { - g_free(computer->display->ogl_vendor); - g_free(computer->display->ogl_renderer); - g_free(computer->display->ogl_version); - g_free(computer->display->display_name); - g_free(computer->display->vendor); - g_free(computer->display->version); - g_free(computer->display->extensions); - g_free(computer->display->monitors); - g_free(computer->display); - } - - if (computer->alsa) { - g_slist_free(computer->alsa->cards); - g_free(computer->alsa); - } - - g_free(computer->date_time); - g_free(computer); - - moreinfo_del_with_prefix("COMP"); -} - -void hi_module_init(void) -{ - computer = g_new0(Computer, 1); -} - -ModuleAbout *hi_module_get_about(void) -{ - static ModuleAbout ma[] = { - { - .author = "Leandro A. F. Pereira", - .description = N_("Gathers high-level computer information"), - .version = VERSION, - .license = "GNU GPL version 2"} - }; - - return ma; -} - diff --git a/modules/computer/alsa.c b/modules/computer/alsa.c deleted file mode 100644 index 00c1fceb..00000000 --- a/modules/computer/alsa.c +++ /dev/null @@ -1,71 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "computer.h" - -gchar * -computer_get_alsacards(Computer * computer) -{ - GSList *p; - gchar *tmp = g_strdup_printf("[%s]\n", _("Audio Devices")); - gint n = 0; - - if (computer->alsa) { - for (p = computer->alsa->cards; p; p = p->next) { - AlsaCard *ac = (AlsaCard *) p->data; - - tmp = h_strdup_cprintf("%s#%d=%s\n", tmp, - _("Audio Adapter"), ++n, ac->friendly_name); - } - } - - return tmp; -} - -AlsaInfo * -computer_get_alsainfo(void) -{ - AlsaInfo *ai; - AlsaCard *ac; - FILE *cards; - gchar buffer[128]; - - cards = fopen("/proc/asound/cards", "r"); - if (!cards) - return NULL; - - ai = g_new0(AlsaInfo, 1); - - while (fgets(buffer, 128, cards)) { - gchar **tmp; - - ac = g_new0(AlsaCard, 1); - - tmp = g_strsplit(buffer, ":", 0); - - ac->friendly_name = g_strdup(tmp[1]); - ai->cards = g_slist_append(ai->cards, ac); - - g_strfreev(tmp); - (void)fgets(buffer, 128, cards); /* skip next line */ - } - fclose(cards); - - return ai; -} diff --git a/modules/computer/boots.c b/modules/computer/boots.c deleted file mode 100644 index ba458242..00000000 --- a/modules/computer/boots.c +++ /dev/null @@ -1,66 +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 - */ - -#include <stdio.h> -#include <string.h> -#include "hardinfo.h" -#include "computer.h" - -void -scan_boots_real(void) -{ - gchar **tmp; - gboolean spawned; - gchar *out, *err, *p, *s, *next_nl; - - scan_os(FALSE); - - if (!computer->os->boots) - computer->os->boots = strdup(""); - else - return; - - 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); - } - p = next_nl + 1; - } - g_free(out); - g_free(err); - } -} diff --git a/modules/computer/display.c b/modules/computer/display.c deleted file mode 100644 index 61eac4eb..00000000 --- a/modules/computer/display.c +++ /dev/null @@ -1,151 +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 - */ - -#include <string.h> - -#include "hardinfo.h" -#include "computer.h" - -static void -get_glx_info(DisplayInfo *di) -{ - gchar *output; - if (g_spawn_command_line_sync("glxinfo", &output, NULL, NULL, NULL)) { - 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); - - 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); - - 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)"); - - } else { - di->ogl_vendor = di->ogl_renderer = di->ogl_version = _("(Unknown)"); - } - -} - -static void -get_x11_info(DisplayInfo *di) -{ - gchar *output; - - if (g_spawn_command_line_sync("xdpyinfo", &output, NULL, NULL, NULL)) { - gchar **output_lines, **old; - - output_lines = g_strsplit(output, "\n", 0); - g_free(output); - - old = output_lines; - while (*output_lines) { - gchar **tmp = g_strsplit(*output_lines, ":", 2); - output_lines++; - - if (tmp[1] && tmp[0]) { - tmp[1] = g_strchug(tmp[1]); - - 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, - g_strstrip(*(++output_lines)), - "=\n", - NULL); - } - g_strfreev(tmp); - - break; - } - } - - g_strfreev(tmp); - } - - 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); - } - } else { - di->monitors = ""; - } -} - -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); - } else { - di->width = di->height = 0; - } - - get_glx_info(di); - get_x11_info(di); - - return di; -} diff --git a/modules/computer/environment.c b/modules/computer/environment.c deleted file mode 100644 index dc0fb6f3..00000000 --- a/modules/computer/environment.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "computer.h" - -static gchar *_env = NULL; -void scan_env_var(gboolean reload) -{ - SCAN_START(); - - gchar **envlist; - gint i; - - g_free(_env); - - _env = g_strdup_printf("[%s]\n", _("Environment Variables") ); - for (i = 0, envlist = g_listenv(); envlist[i]; i++) { - _env = h_strdup_cprintf("%s=%s\n", _env, - envlist[i], g_getenv(envlist[i])); - } - g_strfreev(envlist); - - SCAN_END(); -} - -gchar *callback_env_var(void) -{ - return g_strdup(_env); -} diff --git a/modules/computer/filesystem.c b/modules/computer/filesystem.c deleted file mode 100644 index 397dc636..00000000 --- a/modules/computer/filesystem.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Some code from xfce4-mount-plugin, version 0.4.3 - * Copyright (C) 2005 Jean-Baptiste jb_dul@yahoo.com - * Distributed under the terms of GNU GPL 2. - */ - -#include <string.h> -#include <sys/vfs.h> -#include "hardinfo.h" -#include "computer.h" - -gchar *fs_list = NULL; - -void -scan_filesystems(void) -{ - FILE *mtab; - gchar buf[1024]; - struct statfs sfs; - int count = 0; - - g_free(fs_list); - fs_list = g_strdup(""); - moreinfo_del_with_prefix("COMP:FS"); - - mtab = fopen("/etc/mtab", "r"); - if (!mtab) - return; - - while (fgets(buf, 1024, mtab)) { - gfloat size, used, avail; - gchar **tmp; - - tmp = g_strsplit(buf, " ", 0); - if (!statfs(tmp[1], &sfs)) { - gfloat use_ratio; - - size = (float) sfs.f_bsize * (float) sfs.f_blocks; - avail = (float) sfs.f_bsize * (float) sfs.f_bavail; - used = size - avail; - - if (size == 0.0f) { - continue; - } - - if (avail == 0.0f) { - use_ratio = 100.0f; - } else { - use_ratio = 100.0f * (used / size); - } - - gchar *strsize = size_human_readable(size), - *stravail = size_human_readable(avail), - *strused = size_human_readable(used); - - gchar *strhash; - - strreplacechr(tmp[0], "#", '_'); - strhash = g_strdup_printf("[%s]\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n", - tmp[0], /* path */ - _("Filesystem"), tmp[2], - _("Mounted As"), ( strstr(tmp[3], "rw") != NULL) ? _("Read-Write") : _("Read-Only"), - _("Mount Point"), tmp[1], - _("Size"), strsize, - _("Used"), strused, - _("Available"), stravail); - gchar *key = g_strdup_printf("FS%d", ++count); - moreinfo_add_with_prefix("COMP", key, strhash); - g_free(key); - - fs_list = h_strdup_cprintf("$FS%d$%s=%.2f %% (%s of %s)|%s\n", - fs_list, - count, tmp[0], use_ratio, stravail, strsize, tmp[1]); - - g_free(strsize); - g_free(stravail); - g_free(strused); - } - g_strfreev(tmp); - } - - fclose(mtab); -} diff --git a/modules/computer/groups.c b/modules/computer/groups.c deleted file mode 100644 index 244b8000..00000000 --- a/modules/computer/groups.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2012 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <sys/types.h> -#include <grp.h> -#include "hardinfo.h" -#include "computer.h" - -gchar *groups = NULL; - -void -scan_groups_do(void) -{ - struct group *group_; - - setgrent(); - group_ = getgrent(); - if (!group_) - return; - - g_free(groups); - groups = g_strdup(""); - - while (group_) { - groups = h_strdup_cprintf("%s=%d\n", groups, group_->gr_name, group_->gr_gid); - group_ = getgrent(); - } - - endgrent(); -} diff --git a/modules/computer/languages.c b/modules/computer/languages.c deleted file mode 100644 index d4681839..00000000 --- a/modules/computer/languages.c +++ /dev/null @@ -1,134 +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 - */ - -#include <string.h> - -#include "hardinfo.h" -#include "computer.h" -#include "cpu_util.h" /* for UNKIFNULL() */ - -void -scan_languages(OperatingSystem * os) -{ - FILE *locale; - gchar buf[512], *retval = NULL; - - locale = popen("locale -va && echo", "r"); - if (!locale) - return; - - gchar name[32]; - gchar *title = NULL, - *source = NULL, - *address = NULL, - *email = NULL, - *language = NULL, - *territory = NULL, - *revision = NULL, - *date = NULL, - *codeset = NULL; - - while (fgets(buf, 512, locale)) { - if (!strncmp(buf, "locale:", 7)) { - sscanf(buf, "locale: %s", name); - (void)fgets(buf, 128, locale); - } else if (strchr(buf, '|')) { - gchar **tmp = g_strsplit(buf, "|", 2); - - tmp[0] = g_strstrip(tmp[0]); - - if (tmp[1]) { - tmp[1] = g_strstrip(tmp[1]); - - get_str("title", title); - get_str("source", source); - get_str("address", address); - get_str("email", email); - get_str("language", language); - get_str("territory", territory); - get_str("revision", revision); - get_str("date", date); - get_str("codeset", codeset); - } - - g_strfreev(tmp); - } else { - gchar *currlocale; - - retval = h_strdup_cprintf("$%s$%s=%s\n", retval, name, name, title); - - UNKIFNULL(title); - UNKIFNULL(source); - UNKIFNULL(address); - UNKIFNULL(email); - UNKIFNULL(language); - UNKIFNULL(territory); - UNKIFNULL(revision); - UNKIFNULL(date); - UNKIFNULL(codeset); - - /* values may have & */ - title = hardinfo_clean_value(title, 1); - source = hardinfo_clean_value(source, 1); - address = hardinfo_clean_value(address, 1); - email = hardinfo_clean_value(email, 1); - language = hardinfo_clean_value(language, 1); - territory = hardinfo_clean_value(territory, 1); - - currlocale = g_strdup_printf("[%s]\n" - /* Name */ "%s=%s (%s)\n" - /* Source */ "%s=%s\n" - /* Address */ "%s=%s\n" - /* Email */ "%s=%s\n" - /* Language */ "%s=%s\n" - /* Territory */"%s=%s\n" - /* Revision */ "%s=%s\n" - /* Date */ "%s=%s\n" - /* Codeset */ "%s=%s\n", - _("Locale Information"), - _("Name"), name, title, - _("Source"), source, - _("Address"), address, - _("E-mail"), email, - _("Language"), language, - _("Territory"), territory, - _("Revision"), revision, - _("Date"), date, - _("Codeset"), codeset ); - - moreinfo_add_with_prefix("COMP", name, currlocale); - - g_free(title); - g_free(source); - g_free(address); - g_free(email); - g_free(language); - g_free(territory); - g_free(revision); - g_free(date); - g_free(codeset); - - title = source = address = email = language = territory = \ - revision = date = codeset = NULL; - } - } - - fclose(locale); - - os->languages = retval; -} diff --git a/modules/computer/loadavg.c b/modules/computer/loadavg.c deleted file mode 100644 index 7311dbf0..00000000 --- a/modules/computer/loadavg.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <string.h> - -#include "hardinfo.h" -#include "computer.h" - -static gboolean -computer_get_loadinfo(LoadInfo *li) -{ - FILE *procloadavg; - char buf[64]; - int ret; - - procloadavg = fopen("/proc/loadavg", "r"); - if (!procloadavg) - return FALSE; - - if (!fgets(buf, sizeof(buf), procloadavg)) { - fclose(procloadavg); - return FALSE; - } - - ret = sscanf(buf, "%f %f %f", &li->load1, &li->load5, &li->load15); - if (ret != 3) { - size_t len = strlen(buf); - size_t i; - - for (i = 0; i < len; i++) { - if (buf[i] == '.') - buf[i] = ','; - } - - ret = sscanf(buf, "%f %f %f", &li->load1, &li->load5, &li->load15); - } - - fclose(procloadavg); - - return ret == 3; -} - -gchar * -computer_get_formatted_loadavg() -{ - LoadInfo li; - - if (!computer_get_loadinfo(&li)) - return g_strdup(_("Couldn't obtain load average")); - - return g_strdup_printf("%.2f, %.2f, %.2f", li.load1, li.load5, - li.load15); -} diff --git a/modules/computer/memory.c b/modules/computer/memory.c deleted file mode 100644 index dc8599c2..00000000 --- a/modules/computer/memory.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "computer.h" - -MemoryInfo * -computer_get_memory(void) -{ - MemoryInfo *mi; - FILE *procmem; - gchar buffer[128]; - - procmem = fopen("/proc/meminfo", "r"); - if (!procmem) - return NULL; - mi = g_new0(MemoryInfo, 1); - - while (fgets(buffer, 128, procmem)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - if (tmp[1] == NULL) { - g_strfreev(tmp); - continue; - } - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_int("MemTotal", mi->total); - get_int("MemFree", mi->free); - get_int("Cached", mi->cached); - - g_strfreev(tmp); - } - fclose(procmem); - - mi->used = mi->total - mi->free; - - mi->total /= 1000; - mi->cached /= 1000; - mi->used /= 1000; - mi->free /= 1000; - - mi->used -= mi->cached; - mi->ratio = 1 - (gdouble) mi->used / mi->total; - - return mi; -} diff --git a/modules/computer/modules.c b/modules/computer/modules.c deleted file mode 100644 index df876e3a..00000000 --- a/modules/computer/modules.c +++ /dev/null @@ -1,177 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <string.h> - -#include "hardinfo.h" -#include "computer.h" -#include "cpu_util.h" /* for STRIFNULL() */ - -#define GET_STR(field_name,ptr) \ - if (!ptr && strstr(tmp[0], field_name)) { \ - ptr = g_markup_escape_text(g_strstrip(tmp[1]), strlen(tmp[1])); \ - g_strfreev(tmp); \ - continue; \ - } - -GHashTable *_module_hash_table = NULL; - -void -scan_modules_do(void) -{ - FILE *lsmod; - gchar buffer[1024]; - gchar *lsmod_path; - - if (!_module_hash_table) { - _module_hash_table = g_hash_table_new(g_str_hash, g_str_equal); - } - - g_free(module_list); - - module_list = NULL; - moreinfo_del_with_prefix("COMP:MOD"); - - lsmod_path = find_program("lsmod"); - if (!lsmod_path) - return; - lsmod = popen(lsmod_path, "r"); - if (!lsmod) { - g_free(lsmod_path); - return; - } - - (void)fgets(buffer, 1024, lsmod); /* Discards the first line */ - - while (fgets(buffer, 1024, lsmod)) { - gchar *buf, *strmodule, *hashkey; - gchar *author = NULL, - *description = NULL, - *license = NULL, - *deps = NULL, *vermagic = NULL, *filename = NULL, modname[64]; - FILE *modi; - glong memory; - - shell_status_pulse(); - - buf = buffer; - - sscanf(buf, "%s %ld", modname, &memory); - - hashkey = g_strdup_printf("MOD%s", modname); - buf = g_strdup_printf("/sbin/modinfo %s 2>/dev/null", modname); - - modi = popen(buf, "r"); - while (fgets(buffer, 1024, modi)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - GET_STR("author", author); - GET_STR("description", description); - GET_STR("license", license); - GET_STR("depends", deps); - GET_STR("vermagic", vermagic); - GET_STR("filename", filename); - - g_strfreev(tmp); - } - pclose(modi); - g_free(buf); - - /* old modutils includes quotes in some strings; strip them */ - /*remove_quotes(modname); - remove_quotes(description); - remove_quotes(vermagic); - remove_quotes(author); - remove_quotes(license); */ - - /* old modutils displays <none> when there's no value for a - given field; this is not desirable in the module name - display, so change it to an empty string */ - if (description && g_str_equal(description, "<none>")) { - g_free(description); - description = g_strdup(""); - - g_hash_table_insert(_module_hash_table, - g_strdup(modname), - g_strdup_printf("Kernel module (%s)", modname)); - } else { - g_hash_table_insert(_module_hash_table, - g_strdup(modname), - g_strdup(description)); - } - - /* append this module to the list of modules */ - module_list = h_strdup_cprintf("$%s$%s=%s\n", - module_list, - hashkey, - modname, - description ? description : ""); - - STRIFNULL(filename, _("(Not available)") ); - STRIFNULL(description, _("(Not available)") ); - STRIFNULL(vermagic, _("(Not available)") ); - STRIFNULL(author, _("(Not available)") ); - STRIFNULL(license, _("(Not available)") ); - - /* create the module information string */ - strmodule = g_strdup_printf("[%s]\n" - "%s=%s\n" - "%s=%.2f %s\n" - "[%s]\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "[%s]\n" - "%s=%s\n" - "%s=%s\n", - _("Module Information"), - _("Path"), filename, - _("Used Memory"), memory / 1024.0, _("KiB"), - _("Description"), - _("Name"), modname, - _("Description"), description, - _("Version Magic"), vermagic, - _("Copyright"), - _("Author"), author, - _("License"), license ); - - /* if there are dependencies, append them to that string */ - if (deps && strlen(deps)) { - gchar **tmp = g_strsplit(deps, ",", 0); - - strmodule = h_strconcat(strmodule, - "\n[", _("Dependencies"), "]\n", - g_strjoinv("=\n", tmp), - "=\n", NULL); - g_strfreev(tmp); - g_free(deps); - } - - moreinfo_add_with_prefix("COMP", hashkey, strmodule); - g_free(hashkey); - - g_free(license); - g_free(description); - g_free(author); - g_free(vermagic); - g_free(filename); - } - pclose(lsmod); - - g_free(lsmod_path); -} diff --git a/modules/computer/os.c b/modules/computer/os.c deleted file mode 100644 index a8886f64..00000000 --- a/modules/computer/os.c +++ /dev/null @@ -1,393 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <gdk/gdkx.h> -#include <string.h> -#include <sys/utsname.h> -#include "hardinfo.h" -#include "computer.h" - -static gchar * -get_libc_version(void) -{ - static const struct { - const char *test_cmd; - const char *match_str; - const char *lib_name; - gboolean try_ver_str; - gboolean use_stderr; - } libs[] = { - { "ldd --version", "GLIBC", N_("GNU C Library"), TRUE, FALSE}, - { "ldd --version", "GNU libc", N_("GNU C Library"), TRUE, FALSE}, - { "ldconfig -V", "GLIBC", N_("GNU C Library"), TRUE, FALSE}, - { "ldconfig -V", "GNU libc", N_("GNU C Library"), TRUE, FALSE}, - { "ldconfig -v", "uClibc", N_("uClibc or uClibc-ng"), FALSE, FALSE}, - { "diet", "diet version", N_("diet libc"), TRUE, TRUE}, - { NULL } - }; - int i; - - for (i = 0; libs[i].test_cmd; i++) { - gboolean spawned; - gchar *out, *err, *p; - - spawned = g_spawn_command_line_sync(libs[i].test_cmd, - &out, &err, NULL, NULL); - if (!spawned) - continue; - - if (libs[i].use_stderr) { - p = strend(idle_free(err), '\n'); - g_free(out); - } else { - p = strend(idle_free(out), '\n'); - g_free(err); - } - - if (!p || !strstr(p, libs[i].match_str)) - continue; - - if (libs[i].try_ver_str) { - /* skip the first word, likely "ldconfig" or name of utility */ - const gchar *ver_str = strchr(p, ' '); - - if (ver_str) { - return g_strdup_printf("%s / %s", _(libs[i].lib_name), - ver_str + 1); - } - } - - return g_strdup(_(libs[i].lib_name)); - } - - return g_strdup(_("Unknown")); -} - -static gchar *detect_kde_version(void) -{ - const gchar *cmd; - const gchar *tmp = g_getenv("KDE_SESSION_VERSION"); - gchar *out; - gboolean spawned; - - if (tmp && tmp[0] == '4') { - cmd = "kwin --version"; - } else { - cmd = "kcontrol --version"; - } - - spawned = g_spawn_command_line_sync(cmd, &out, NULL, NULL, NULL); - if (!spawned) - return NULL; - - tmp = strstr(idle_free(out), "KDE: "); - return tmp ? g_strdup(tmp + strlen("KDE: ")) : NULL; -} - -static gchar * -detect_gnome_version(void) -{ - gchar *tmp; - gchar *out; - gboolean spawned; - - spawned = g_spawn_command_line_sync( - "gnome-shell --version", &out, NULL, NULL, NULL); - if (spawned) { - tmp = strstr(idle_free(out), _("GNOME Shell ")); - - if (tmp) { - tmp += strlen(_("GNOME Shell ")); - return g_strdup_printf("GNOME %s", strend(tmp, '\n')); - } - } - - spawned = g_spawn_command_line_sync( - "gnome-about --gnome-version", &out, NULL, NULL, NULL); - if (spawned) { - tmp = strstr(idle_free(out), _("Version: ")); - - if (tmp) { - tmp += strlen(_("Version: ")); - return g_strdup_printf("GNOME %s", strend(tmp, '\n')); - } - } - - return NULL; -} - -static gchar * -detect_window_manager(void) -{ - GdkScreen *screen = gdk_screen_get_default(); - const gchar *windowman; - const gchar *curdesktop; - - if (!screen || !GDK_IS_SCREEN(screen)) - return NULL; - - windowman = gdk_x11_screen_get_window_manager_name(screen); - - if (g_str_equal(windowman, "Xfwm4")) - return g_strdup("XFCE 4"); - - curdesktop = g_getenv("XDG_CURRENT_DESKTOP"); - if (curdesktop) { - const gchar *desksession = g_getenv("DESKTOP_SESSION"); - - if (desksession && !g_str_equal(curdesktop, desksession)) - return g_strdup(desksession); - } - - return g_strdup_printf(_("Unknown (Window Manager: %s)"), windowman); -} - -static gchar * -desktop_with_session_type(const gchar *desktop_env) -{ - const char *tmp; - - tmp = g_getenv("XDG_SESSION_TYPE"); - if (tmp) { - if (!g_str_equal(tmp, "unspecified")) - return g_strdup_printf(_(/*/{desktop environment} on {session type}*/ "%s on %s"), desktop_env, tmp); - } - - return g_strdup(desktop_env); -} - -static gchar * -detect_xdg_environment(const gchar *env_var) -{ - const gchar *tmp; - - tmp = g_getenv(env_var); - if (!tmp) - return NULL; - - if (g_str_equal(tmp, "GNOME") || g_str_equal(tmp, "gnome")) { - gchar *maybe_gnome = detect_gnome_version(); - - if (maybe_gnome) - return maybe_gnome; - } - if (g_str_equal(tmp, "KDE") || g_str_equal(tmp, "kde")) { - gchar *maybe_kde = detect_kde_version(); - - if (maybe_kde) - return maybe_kde; - } - - return g_strdup(tmp); -} - -static gchar * -detect_desktop_environment(void) -{ - const gchar *tmp; - gchar *windowman; - - windowman = detect_xdg_environment("XDG_CURRENT_DESKTOP"); - if (windowman) - return windowman; - windowman = detect_xdg_environment("XDG_SESSION_DESKTOP"); - if (windowman) - return windowman; - - tmp = g_getenv("KDE_FULL_SESSION"); - if (tmp) { - gchar *maybe_kde = detect_kde_version(); - - if (maybe_kde) - return maybe_kde; - } - tmp = g_getenv("GNOME_DESKTOP_SESSION_ID"); - if (tmp) { - gchar *maybe_gnome = detect_gnome_version(); - - if (maybe_gnome) - return maybe_gnome; - } - - windowman = detect_window_manager(); - if (windowman) - return windowman; - - if (!g_getenv("DISPLAY")) - return g_strdup(_("Terminal")); - - return g_strdup(_("Unknown")); -} - -gchar * -computer_get_entropy_avail(void) -{ - gchar tab_entropy_fstr[][32] = { - N_(/*/bits of entropy for rng (0)*/ "(None or not available)"), - N_(/*/bits of entropy for rng (low/poor value)*/ "%d bits (low)"), - N_(/*/bits of entropy for rng (medium value)*/ "%d bits (medium)"), - N_(/*/bits of entropy for rng (high/good value)*/ "%d bits (healthy)") - }; - gint bits = h_sysfs_read_int("/proc/sys/kernel/random", "entropy_avail"); - if (bits > 3000) return g_strdup_printf(_(tab_entropy_fstr[3]), bits); - if (bits > 200) return g_strdup_printf(_(tab_entropy_fstr[2]), bits); - if (bits > 1) return g_strdup_printf(_(tab_entropy_fstr[1]), bits); - return g_strdup_printf(_(tab_entropy_fstr[0]), bits); -} - -gchar * -computer_get_language(void) -{ - gchar *tab_lang_env[] = - { "LANGUAGE", "LANG", "LC_ALL", "LC_MESSAGES", NULL }; - gchar *lc = NULL, *env = NULL, *ret = NULL; - gint i = 0; - - lc = setlocale(LC_ALL, NULL); - - while (tab_lang_env[i] != NULL) { - env = g_strdup( g_getenv(tab_lang_env[i]) ); - if (env != NULL) break; - i++; - } - - if (env != NULL) - if (lc != NULL) - ret = g_strdup_printf("%s (%s)", lc, env); - else - ret = g_strdup_printf("%s", env); - else - if (lc != NULL) - ret = g_strdup_printf("%s", lc); - - if (ret == NULL) - ret = g_strdup( _("(Unknown)") ); - - return ret; -} - -static gchar * -detect_distro(void) -{ - static const struct { - const gchar *file; - const gchar *codename; - const gchar *override; - } distro_db[] = { -#define DB_PREFIX "/etc/" - { DB_PREFIX "arch-release", "arch", "Arch Linux" }, - { DB_PREFIX "fatdog-version", "fatdog" }, - { DB_PREFIX "debian_version", "deb" }, - { DB_PREFIX "slackware-version", "slk" }, - { DB_PREFIX "mandrake-release", "mdk" }, - { DB_PREFIX "mandriva-release", "mdv" }, - { DB_PREFIX "fedora-release", "fdra" }, - { DB_PREFIX "coas", "coas" }, - { DB_PREFIX "environment.corel", "corel"}, - { DB_PREFIX "gentoo-release", "gnt" }, - { DB_PREFIX "conectiva-release", "cnc" }, - { DB_PREFIX "versão-conectiva", "cnc" }, - { DB_PREFIX "turbolinux-release", "tl" }, - { DB_PREFIX "yellowdog-release", "yd" }, - { DB_PREFIX "sabayon-release", "sbn" }, - { DB_PREFIX "arch-release", "arch" }, - { DB_PREFIX "enlisy-release", "enlsy" }, - { DB_PREFIX "SuSE-release", "suse" }, - { DB_PREFIX "sun-release", "sun" }, - { DB_PREFIX "zenwalk-version", "zen" }, - { DB_PREFIX "DISTRO_SPECS", "ppy", "Puppy Linux" }, - { DB_PREFIX "puppyversion", "ppy", "Puppy Linux" }, - { DB_PREFIX "distro-release", "fl" }, - { DB_PREFIX "vine-release", "vine" }, - { DB_PREFIX "PartedMagic-version", "pmag" }, - /* - * RedHat must be the *last* one to be checked, since - * some distros (like Mandrake) includes a redhat-relase - * file too. - */ - { DB_PREFIX "redhat-release", "rh" }, -#undef DB_PREFIX - { NULL, NULL } - }; - gchar *contents; - int i; - - if (g_spawn_command_line_sync("lsb_release -d", &contents, NULL, NULL, NULL)) { - gchar *tmp = strstr(idle_free(contents), "Description:\t"); - - if (tmp) - return g_strdup(tmp + strlen("Description:\t")); - } - - for (i = 0; distro_db[i].file; i++) { - if (!g_file_get_contents(distro_db[i].file, &contents, NULL, NULL)) - continue; - - if (distro_db[i].override) { - g_free(contents); - return g_strdup(distro_db[i].override); - } - - if (g_str_equal(distro_db[i].codename, "deb")) { - /* HACK: Some Debian systems doesn't include the distribuition - * name in /etc/debian_release, so add them here. */ - if (isdigit(contents[0]) || contents[0] != 'D') - return g_strdup_printf("Debian GNU/Linux %s", (char*)idle_free(contents)); - } - - if (g_str_equal(distro_db[i].codename, "fatdog")) - return g_strdup_printf("Fatdog64 [%.10s]", (char*)idle_free(contents)); - - return contents; - } - - return g_strdup(_("Unknown")); -} - -OperatingSystem * -computer_get_os(void) -{ - struct utsname utsbuf; - OperatingSystem *os; - int i; - - os = g_new0(OperatingSystem, 1); - - os->distro = g_strstrip(detect_distro()); - - /* Kernel and hostname info */ - uname(&utsbuf); - os->kernel_version = g_strdup(utsbuf.version); - os->kernel = g_strdup_printf("%s %s (%s)", utsbuf.sysname, - utsbuf.release, utsbuf.machine); - os->hostname = g_strdup(utsbuf.nodename); - os->language = computer_get_language(); - os->homedir = g_strdup(g_get_home_dir()); - os->username = g_strdup_printf("%s (%s)", - g_get_user_name(), g_get_real_name()); - os->libc = get_libc_version(); - scan_languages(os); - - os->desktop = detect_desktop_environment(); - if (os->desktop) - os->desktop = desktop_with_session_type(idle_free(os->desktop)); - - os->entropy_avail = computer_get_entropy_avail(); - - return os; -} diff --git a/modules/computer/uptime.c b/modules/computer/uptime.c deleted file mode 100644 index 6ef3d250..00000000 --- a/modules/computer/uptime.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "hardinfo.h" -#include "computer.h" - -UptimeInfo * -computer_get_uptime(void) -{ - UptimeInfo *ui = g_new0(UptimeInfo, 1); - FILE *procuptime; - gulong minutes; - - if ((procuptime = fopen("/proc/uptime", "r")) != NULL) { - (void)fscanf(procuptime, "%lu", &minutes); - ui->minutes = minutes / 60; - fclose(procuptime); - } else { - g_free(ui); - return NULL; - } - - ui->hours = ui->minutes / 60; - ui->minutes %= 60; - ui->days = ui->hours / 24; - ui->hours %= 24; - - return ui; -} - -gchar * -computer_get_formatted_uptime() -{ - UptimeInfo *ui; - const gchar *days_fmt, *hours_fmt, *minutes_fmt; - gchar *full_fmt = NULL, *ret = NULL; - - ui = computer_get_uptime(); - - days_fmt = ngettext("%d day", "%d days", ui->days); - hours_fmt = ngettext("%d hour", "%d hours", ui->hours); - minutes_fmt = ngettext("%d minute", "%d minutes", ui->minutes); - - if (ui->days < 1) { - if (ui->hours < 1) { - ret = g_strdup_printf(minutes_fmt, ui->minutes); - } else { - full_fmt = g_strdup_printf("%s %s", hours_fmt, minutes_fmt); - ret = g_strdup_printf(full_fmt, ui->hours, ui->minutes); - } - } else { - full_fmt = g_strdup_printf("%s %s %s", days_fmt, hours_fmt, minutes_fmt); - ret = g_strdup_printf(full_fmt, ui->days, ui->hours, ui->minutes); - } - g_free(full_fmt); - g_free(ui); - return ret; -} diff --git a/modules/computer/users.c b/modules/computer/users.c deleted file mode 100644 index f47320bb..00000000 --- a/modules/computer/users.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <pwd.h> -#include "hardinfo.h" -#include "computer.h" - -gchar *users = NULL; - -void -scan_users_do(void) -{ - struct passwd *passwd_; - passwd_ = getpwent(); - if (!passwd_) - return; - - if (users) { - g_free(users); - moreinfo_del_with_prefix("COMP:USER"); - } - - users = g_strdup(""); - - while (passwd_) { - gchar *key = g_strdup_printf("USER%s", passwd_->pw_name); - gchar *val = g_strdup_printf("[%s]\n" - "%s=%d\n" - "%s=%d\n" - "%s=%s\n" - "%s=%s\n", - _("User Information"), - _("User ID"), (gint) passwd_->pw_uid, - _("Group ID"), (gint) passwd_->pw_gid, - _("Home Directory"), passwd_->pw_dir, - _("Default Shell"), passwd_->pw_shell); - moreinfo_add_with_prefix("COMP", key, val); - - strend(passwd_->pw_gecos, ','); - users = h_strdup_cprintf("$%s$%s=%s\n", users, key, passwd_->pw_name, passwd_->pw_gecos); - passwd_ = getpwent(); - g_free(key); - } - - endpwent(); -} diff --git a/modules/devices.c b/modules/devices.c deleted file mode 100644 index 152b6831..00000000 --- a/modules/devices.c +++ /dev/null @@ -1,725 +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 - */ - -#ifndef __USE_XOPEN -#define __USE_XOPEN -#endif /* __USE_XOPEN */ - -#ifndef _XOPEN_SOURCE -#define _XOPEN_SOURCE -#endif /* _XOPEN_SOURCE */ - -#include <gtk/gtk.h> -#include <config.h> -#include <string.h> - -#include <hardinfo.h> -#include <shell.h> -#include <iconcache.h> -#include <syncmanager.h> - -#include <expr.h> -#include <socket.h> - -#include "devices.h" -#include "dt_util.h" - -gchar *callback_processors(); -gchar *callback_memory(); -gchar *callback_battery(); -gchar *callback_pci(); -gchar *callback_sensors(); -gchar *callback_printers(); -gchar *callback_storage(); -gchar *callback_input(); -gchar *callback_usb(); -#if defined(ARCH_x86) || defined(ARCH_x86_64) -gchar *callback_dmi(); -gchar *callback_spd(); -#endif -gchar *callback_dtree(); -gchar *callback_device_resources(); - -void scan_processors(gboolean reload); -void scan_memory(gboolean reload); -void scan_battery(gboolean reload); -void scan_pci(gboolean reload); -void scan_sensors(gboolean reload); -void scan_printers(gboolean reload); -void scan_storage(gboolean reload); -void scan_input(gboolean reload); -void scan_usb(gboolean reload); -#if defined(ARCH_x86) || defined(ARCH_x86_64) -void scan_dmi(gboolean reload); -void scan_spd(gboolean reload); -#endif -void scan_dtree(gboolean reload); -void scan_device_resources(gboolean reload); - -gboolean root_required_for_resources(void); - -gchar *hi_more_info(gchar *entry); - -enum { - ENTRY_DTREE, - ENTRY_PROCESSOR, - ENTRY_MEMORY, - ENTRY_PCI, - ENTRY_USB, - ENTRY_PRINTERS, - ENTRY_BATTERY, - ENTRY_SENSORS, - ENTRY_INPUT, - ENTRY_STORAGE, - ENTRY_DMI, - ENTRY_SPD, - ENTRY_RESOURCES -}; - -static ModuleEntry entries[] = { - [ENTRY_PROCESSOR] = {N_("Processor"), "processor.png", callback_processors, scan_processors, MODULE_FLAG_NONE}, - [ENTRY_MEMORY] = {N_("Memory"), "memory.png", callback_memory, scan_memory, MODULE_FLAG_NONE}, - [ENTRY_PCI] = {N_("PCI Devices"), "devices.png", callback_pci, scan_pci, MODULE_FLAG_NONE}, - [ENTRY_USB] = {N_("USB Devices"), "usb.png", callback_usb, scan_usb, MODULE_FLAG_NONE}, - [ENTRY_PRINTERS] = {N_("Printers"), "printer.png", callback_printers, scan_printers, MODULE_FLAG_NONE}, - [ENTRY_BATTERY] = {N_("Battery"), "battery.png", callback_battery, scan_battery, MODULE_FLAG_NONE}, - [ENTRY_SENSORS] = {N_("Sensors"), "therm.png", callback_sensors, scan_sensors, MODULE_FLAG_NONE}, - [ENTRY_INPUT] = {N_("Input Devices"), "inputdevices.png", callback_input, scan_input, MODULE_FLAG_NONE}, - [ENTRY_STORAGE] = {N_("Storage"), "hdd.png", callback_storage, scan_storage, MODULE_FLAG_NONE}, -#if defined(ARCH_x86) || defined(ARCH_x86_64) - [ENTRY_DMI] = {N_("DMI"), "computer.png", callback_dmi, scan_dmi, MODULE_FLAG_NONE}, - [ENTRY_SPD] = {N_("Memory SPD"), "memory.png", callback_spd, scan_spd, MODULE_FLAG_NONE}, - [ENTRY_DTREE] = {"#"}, -#else - [ENTRY_DMI] = {"#"}, - [ENTRY_SPD] = {"#"}, - [ENTRY_DTREE] = {N_("Device Tree"), "devices.png", callback_dtree, scan_dtree, MODULE_FLAG_NONE}, -#endif /* x86 or x86_64 */ - [ENTRY_RESOURCES] = {N_("Resources"), "resources.png", callback_device_resources, scan_device_resources, MODULE_FLAG_NONE}, - { NULL } -}; - -static GSList *processors = NULL; -gchar *printer_list = NULL; -gchar *printer_icons = NULL; -gchar *pci_list = NULL; -gchar *input_list = NULL; -gchar *storage_list = NULL; -gchar *battery_list = NULL; -gchar *meminfo = NULL; -gchar *lginterval = NULL; - -#include <vendor.h> - -static gint proc_cmp_model_name(Processor *a, Processor *b) { - return g_strcmp0(a->model_name, b->model_name); -} - -static gint proc_cmp_max_freq(Processor *a, Processor *b) { - if (a->cpu_mhz == b->cpu_mhz) - return 0; - if (a->cpu_mhz > b->cpu_mhz) - return -1; - return 1; -} - -gchar *processor_describe_default(GSList * processors) -{ - int packs, cores, threads; - const gchar *packs_fmt, *cores_fmt, *threads_fmt; - gchar *ret, *full_fmt; - - cpu_procs_cores_threads(&packs, &cores, &threads); - - /* if topology info was available, else fallback to old method */ - if (cores > 0) { - packs_fmt = ngettext("%d physical processor", "%d physical processors", packs); - cores_fmt = ngettext("%d core", "%d cores", cores); - threads_fmt = ngettext("%d thread", "%d threads", threads); - full_fmt = g_strdup_printf(_(/*/NP procs; NC cores; NT threads*/ "%s; %s; %s"), packs_fmt, cores_fmt, threads_fmt); - ret = g_strdup_printf(full_fmt, packs, cores, threads); - g_free(full_fmt); - return ret; - } else { - return processor_describe_by_counting_names(processors); - } -} - -gchar *processor_name_default(GSList * processors) -{ - gchar *ret = g_strdup(""); - GSList *tmp, *l; - Processor *p; - gchar *cur_str = NULL; - gint cur_count = 0; - - tmp = g_slist_copy(processors); - tmp = g_slist_sort(tmp, (GCompareFunc)proc_cmp_model_name); - - for (l = tmp; l; l = l->next) { - p = (Processor*)l->data; - if (cur_str == NULL) { - cur_str = p->model_name; - cur_count = 1; - } else { - if(g_strcmp0(cur_str, p->model_name)) { - ret = h_strdup_cprintf("%s%s", ret, strlen(ret) ? "; " : "", cur_str); - cur_str = p->model_name; - cur_count = 1; - } else { - cur_count++; - } - } - } - ret = h_strdup_cprintf("%s%s", ret, strlen(ret) ? "; " : "", cur_str); - g_slist_free(tmp); - return ret; -} - -/* TODO: prefix counts are threads when they should be cores. */ -gchar *processor_describe_by_counting_names(GSList * processors) -{ - gchar *ret = g_strdup(""); - GSList *tmp, *l; - Processor *p; - gchar *cur_str = NULL; - gint cur_count = 0; - - tmp = g_slist_copy(processors); - tmp = g_slist_sort(tmp, (GCompareFunc)proc_cmp_model_name); - - for (l = tmp; l; l = l->next) { - p = (Processor*)l->data; - if (cur_str == NULL) { - cur_str = p->model_name; - cur_count = 1; - } else { - if(g_strcmp0(cur_str, p->model_name)) { - ret = h_strdup_cprintf("%s%dx %s", ret, strlen(ret) ? " + " : "", cur_count, cur_str); - cur_str = p->model_name; - cur_count = 1; - } else { - cur_count++; - } - } - } - ret = h_strdup_cprintf("%s%dx %s", ret, strlen(ret) ? " + " : "", cur_count, cur_str); - g_slist_free(tmp); - return ret; -} - -gchar *get_processor_name(void) -{ - scan_processors(FALSE); - return processor_name(processors); -} - -gchar *get_processor_desc(void) -{ - scan_processors(FALSE); - return processor_describe(processors); -} - -gchar *get_processor_name_and_desc(void) -{ - scan_processors(FALSE); - gchar* name = processor_name(processors); - gchar* desc = processor_describe(processors); - gchar* nd = g_strdup_printf("%s\n%s", name, desc); - g_free(name); - g_free(desc); - return nd; -} - - -gchar *get_storage_devices(void) -{ - scan_storage(FALSE); - - return storage_list; -} - -gchar *get_printers(void) -{ - scan_printers(FALSE); - - return printer_list; -} - -gchar *get_input_devices(void) -{ - scan_input(FALSE); - - return input_list; -} - -gchar *get_processor_count(void) -{ - scan_processors(FALSE); - - return g_strdup_printf("%d", g_slist_length(processors)); -} - -/* TODO: maybe move into processor.c along with processor_name() etc. - * Could mention the big.LITTLE cluster arangement for ARM that kind of thing. - * TODO: prefix counts are threads when they should be cores. */ -gchar *processor_frequency_desc(GSList * processors) -{ - gchar *ret = g_strdup(""); - GSList *tmp, *l; - Processor *p; - float cur_val = -1; - gint cur_count = 0; - - tmp = g_slist_copy(processors); - tmp = g_slist_sort(tmp, (GCompareFunc)proc_cmp_max_freq); - - for (l = tmp; l; l = l->next) { - p = (Processor*)l->data; - if (cur_val == -1) { - cur_val = p->cpu_mhz; - cur_count = 1; - } else { - if(cur_val != p->cpu_mhz) { - ret = h_strdup_cprintf("%s%dx %.2f %s", ret, strlen(ret) ? " + " : "", cur_count, cur_val, _("MHz") ); - cur_val = p->cpu_mhz; - cur_count = 1; - } else { - cur_count++; - } - } - } - ret = h_strdup_cprintf("%s%dx %.2f %s", ret, strlen(ret) ? " + " : "", cur_count, cur_val, _("MHz")); - g_slist_free(tmp); - return ret; -} - -gchar *get_processor_frequency_desc(void) -{ - scan_processors(FALSE); - return processor_frequency_desc(processors); -} - -gchar *get_processor_max_frequency(void) -{ - GSList *l; - Processor *p; - float max_freq = 0; - - scan_processors(FALSE); - - for (l = processors; l; l = l->next) { - p = (Processor*)l->data; - if (p->cpu_mhz > max_freq) - max_freq = p->cpu_mhz; - } - - if (max_freq == 0.0f) { - return g_strdup(N_("Unknown")); - } else { - return g_strdup_printf("%.2f %s", max_freq, _("MHz") ); - } -} - -gchar *get_pci_device_description(gchar *pci_id) -{ - gchar *description; - - if (!_pci_devices) { - scan_pci(FALSE); - } - - if ((description = g_hash_table_lookup(_pci_devices, pci_id))) { - return g_strdup(description); - } - - return NULL; -} - -gchar *get_memory_total(void) -{ - scan_memory(FALSE); - return moreinfo_lookup ("DEV:MemTotal"); -} - -gchar *get_motherboard(void) -{ - char *board_name, *board_vendor, *system_version; - char *ret; - -#if defined(ARCH_x86) || defined(ARCH_x86_64) - scan_dmi(FALSE); - - 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" */ - board_vendor = dtr_get_string("/model", 0); - if (board_vendor != NULL) - return board_vendor; - - return g_strdup(_("Unknown")); -} - -ShellModuleMethod *hi_exported_methods(void) -{ - static ShellModuleMethod m[] = { - {"getProcessorCount", get_processor_count}, - {"getProcessorName", get_processor_name}, - {"getProcessorDesc", get_processor_desc}, - {"getProcessorNameAndDesc", get_processor_name_and_desc}, - {"getProcessorFrequency", get_processor_max_frequency}, - {"getProcessorFrequencyDesc", get_processor_frequency_desc}, - {"getMemoryTotal", get_memory_total}, - {"getStorageDevices", get_storage_devices}, - {"getPrinters", get_printers}, - {"getInputDevices", get_input_devices}, - {"getPCIDeviceDescription", get_pci_device_description}, - {"getMotherboard", get_motherboard}, - {NULL} - }; - - return m; -} - -gchar *hi_more_info(gchar * entry) -{ - gchar *info = moreinfo_lookup_with_prefix("DEV", entry); - - if (info) - return g_strdup(info); - - return g_strdup("?"); -} - -gchar *hi_get_field(gchar * field) -{ - gchar *info = moreinfo_lookup_with_prefix("DEV", field); - - if (info) - return g_strdup(info); - - return g_strdup(field); -} - -#if defined(ARCH_x86) || defined(ARCH_x86_64) -void scan_dmi(gboolean reload) -{ - SCAN_START(); - __scan_dmi(); - SCAN_END(); -} - -void scan_spd(gboolean reload) -{ - SCAN_START(); - scan_spd_do(); - SCAN_END(); -} -#endif - -void scan_dtree(gboolean reload) -{ - SCAN_START(); - __scan_dtree(); - SCAN_END(); -} - -void scan_processors(gboolean reload) -{ - SCAN_START(); - if (!processors) - processors = processor_scan(); - SCAN_END(); -} - -void scan_memory(gboolean reload) -{ - SCAN_START(); - scan_memory_do(); - SCAN_END(); -} - -void scan_battery(gboolean reload) -{ - SCAN_START(); - scan_battery_do(); - SCAN_END(); -} - -void scan_pci(gboolean reload) -{ - SCAN_START(); - scan_pci_do(); - SCAN_END(); -} - -void scan_sensors(gboolean reload) -{ - SCAN_START(); - scan_sensors_do(); - SCAN_END(); -} - -void scan_printers(gboolean reload) -{ - SCAN_START(); - scan_printers_do(); - SCAN_END(); -} - -void scan_storage(gboolean reload) -{ - SCAN_START(); - g_free(storage_list); - storage_list = g_strdup(""); - - __scan_ide_devices(); - __scan_scsi_devices(); - SCAN_END(); -} - -void scan_input(gboolean reload) -{ - SCAN_START(); - __scan_input_devices(); - SCAN_END(); -} - -void scan_usb(gboolean reload) -{ - SCAN_START(); - __scan_usb(); - SCAN_END(); -} - -gchar *callback_processors() -{ - return processor_get_info(processors); -} - -#if defined(ARCH_x86) || defined(ARCH_x86_64) -gchar *callback_dmi() -{ - return g_strdup(dmi_info); -} - -gchar *callback_spd() -{ - return g_strdup(spd_info); -} -#endif - -gchar *callback_dtree() -{ - return g_strdup_printf("%s" - "[$ShellParam$]\n" - "ViewType=1\n", dtree_info); -} - -gchar *callback_memory() -{ - return g_strdup_printf("[Memory]\n" - "%s\n" - "[$ShellParam$]\n" - "ViewType=2\n" - "LoadGraphSuffix= kB\n" - "RescanInterval=2000\n" - "ColumnTitle$TextValue=%s\n" - "ColumnTitle$Extra1=%s\n" - "ColumnTitle$Value=%s\n" - "ShowColumnHeaders=true\n" - "%s\n", meminfo, - _("Field"), _("Description"), _("Value"), /* column labels */ - lginterval); -} - -gchar *callback_battery() -{ - return g_strdup_printf("%s\n" - "[$ShellParam$]\n" - "ReloadInterval=4000\n", battery_list); -} - -gchar *callback_pci() -{ - return g_strdup_printf("[PCI Devices]\n" - "%s" - "[$ShellParam$]\n" "ViewType=1\n", pci_list); -} - -gchar *callback_sensors() -{ - return g_strdup_printf("[Sensors]\n" - "%s\n" - "[$ShellParam$]\n" - "ViewType=2\n" - "LoadGraphSuffix=\n" - "ColumnTitle$TextValue=%s\n" - "ColumnTitle$Value=%s\n" - "ColumnTitle$Extra1=%s\n" - "ShowColumnHeaders=true\n" - "RescanInterval=5000\n" - "%s", - sensors, - _("Sensor"), _("Value"), _("Type"), /* column labels */ - lginterval); -} - -gchar *callback_printers() -{ - return g_strdup_printf("%s\n" - "[$ShellParam$]\n" - "ViewType=1\n" - "ReloadInterval=5000\n" - "%s", printer_list, printer_icons); -} - -gchar *callback_storage() -{ - return g_strdup_printf("%s\n" - "[$ShellParam$]\n" - "ReloadInterval=5000\n" - "ViewType=1\n%s", storage_list, storage_icons); -} - -gchar *callback_input() -{ - return g_strdup_printf("[Input Devices]\n" - "%s" - "[$ShellParam$]\n" - "ViewType=1\n" - "ReloadInterval=5000\n%s", input_list, - input_icons); -} - -gchar *callback_usb() -{ - return g_strdup_printf("%s" - "[$ShellParam$]\n" - "ViewType=1\n" - "ReloadInterval=5000\n", usb_list); -} - -ModuleEntry *hi_module_get_entries(void) -{ - return entries; -} - -gchar *hi_module_get_name(void) -{ - return g_strdup(_("Devices")); -} - -guchar hi_module_get_weight(void) -{ - return 85; -} - -void hi_module_init(void) -{ - if (!g_file_test("/usr/share/misc/pci.ids", G_FILE_TEST_EXISTS)) { - static SyncEntry se = { - .fancy_name = N_("Update PCI ID listing"), - .name = "GetPCIIds", - .save_to = "pci.ids", - .get_data = NULL - }; - - sync_manager_add_entry(&se); - } - -#if defined(ARCH_x86) || defined(ARCH_x86_64) - { - static SyncEntry se = { - .fancy_name = N_("Update CPU feature database"), - .name = "RecvCPUFlags", - .save_to = "cpuflags.conf", - .get_data = NULL - }; - - sync_manager_add_entry(&se); - } -#endif /* defined(ARCH_x86) */ - - init_memory_labels(); - init_cups(); - sensors_init(); -} - -void hi_module_deinit(void) -{ - moreinfo_del_with_prefix("DEV"); - sensors_shutdown(); - g_hash_table_destroy(memlabels); - g_module_close(cups); -} - -ModuleAbout *hi_module_get_about(void) -{ - static ModuleAbout ma[] = { - { - .author = "Leandro A. F. Pereira", - .description = N_("Gathers information about hardware devices"), - .version = VERSION, - .license = "GNU GPL version 2"} - }; - - return ma; -} - -gchar **hi_module_get_dependencies(void) -{ - static gchar *deps[] = { "computer.so", NULL }; - - return deps; -} - -const gchar *hi_note_func(gint entry) -{ - if (entry == ENTRY_RESOURCES) { - if (root_required_for_resources()) { - return g_strdup(_("Resource information requires superuser privileges")); - } - } - return NULL; -} diff --git a/modules/devices/alpha/processor.c b/modules/devices/alpha/processor.c deleted file mode 100644 index c7862232..00000000 --- a/modules/devices/alpha/processor.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "devices.h" -#include "cpu_util.h" - -GSList * -processor_scan(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - long long hz = 0; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("cpu model", processor->model_name); - get_float("BogoMIPS", processor->bogomips); - get_str("platform string", processor->strmodel); - get_str("cycle frequency [Hz]", processor->cycle_frequency_hz_str); - - } - g_strfreev(tmp); - } - - fclose(cpuinfo); - - gchar *tmp = g_strconcat("Alpha ", processor->model_name, NULL); - g_free(processor->model_name); - processor->model_name = tmp; - - if (processor->cycle_frequency_hz_str) { - hz = atoll(processor->cycle_frequency_hz_str); - processor->cpu_mhz = hz; - processor->cpu_mhz /= 1000000; - } else - processor->cpu_mhz = 0.0f; - - return g_slist_append(NULL, processor); -} - -gchar *processor_name(GSList * processors) { - return processor_name_default(processors); -} - -gchar *processor_describe(GSList * processors) { - return processor_describe_default(processors); -} - -gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[%s]\n" - "%s=%s\n" - "%s=%s\n" - "%s=%.2f %s\n" /* frequency */ - "%s=%.2f\n" /* bogomips */ - "%s=%s\n", /* byte order */ - _("Processor"), - _("Model"), processor->model_name, - _("Platform String"), processor->strmodel, - _("Frequency"), processor->cpu_mhz, _("MHz"), - _("BogoMips"), processor->bogomips, - _("Byte Order"), byte_order_str() - ); -} diff --git a/modules/devices/arm/arm_data.c b/modules/devices/arm/arm_data.c deleted file mode 100644 index 60e8ea34..00000000 --- a/modules/devices/arm/arm_data.c +++ /dev/null @@ -1,265 +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 <stdlib.h> -#include <stdio.h> -#include <string.h> -#include "arm_data.h" - -#ifndef C_ -#define C_(Ctx, String) String -#endif -#ifndef NC_ -#define NC_(Ctx, String) String -#endif - -/* sources: - * https://unix.stackexchange.com/a/43563 - * git:linux/arch/arm/kernel/setup.c - * git:linux/arch/arm64/kernel/cpuinfo.c - */ -static struct { - char *name, *meaning; -} tab_flag_meaning[] = { - /* arm/hw_cap */ - { "swp", NC_("arm-flag", /*/flag:swp*/ "SWP instruction (atomic read-modify-write)") }, - { "half", NC_("arm-flag", /*/flag:half*/ "Half-word loads and stores") }, - { "thumb", NC_("arm-flag", /*/flag:thumb*/ "Thumb (16-bit instruction set)") }, - { "26bit", NC_("arm-flag", /*/flag:26bit*/ "26-Bit Model (Processor status register folded into program counter)") }, - { "fastmult", NC_("arm-flag", /*/flag:fastmult*/ "32x32->64-bit multiplication") }, - { "fpa", NC_("arm-flag", /*/flag:fpa*/ "Floating point accelerator") }, - { "vfp", NC_("arm-flag", /*/flag:vfp*/ "VFP (early SIMD vector floating point instructions)") }, - { "edsp", NC_("arm-flag", /*/flag:edsp*/ "DSP extensions (the 'e' variant of the ARM9 CPUs, and all others above)") }, - { "java", NC_("arm-flag", /*/flag:java*/ "Jazelle (Java bytecode accelerator)") }, - { "iwmmxt", NC_("arm-flag", /*/flag:iwmmxt*/ "SIMD instructions similar to Intel MMX") }, - { "crunch", NC_("arm-flag", /*/flag:crunch*/ "MaverickCrunch coprocessor (if kernel support enabled)") }, - { "thumbee", NC_("arm-flag", /*/flag:thumbee*/ "ThumbEE") }, - { "neon", NC_("arm-flag", /*/flag:neon*/ "Advanced SIMD/NEON on AArch32") }, - { "evtstrm", NC_("arm-flag", /*/flag:evtstrm*/ "Kernel event stream using generic architected timer") }, - { "vfpv3", NC_("arm-flag", /*/flag:vfpv3*/ "VFP version 3") }, - { "vfpv3d16", NC_("arm-flag", /*/flag:vfpv3d16*/ "VFP version 3 with 16 D-registers") }, - { "vfpv4", NC_("arm-flag", /*/flag:vfpv4*/ "VFP version 4 with fast context switching") }, - { "vfpd32", NC_("arm-flag", /*/flag:vfpd32*/ "VFP with 32 D-registers") }, - { "tls", NC_("arm-flag", /*/flag:tls*/ "TLS register") }, - { "idiva", NC_("arm-flag", /*/flag:idiva*/ "SDIV and UDIV hardware division in ARM mode") }, - { "idivt", NC_("arm-flag", /*/flag:idivt*/ "SDIV and UDIV hardware division in Thumb mode") }, - { "lpae", NC_("arm-flag", /*/flag:lpae*/ "40-bit Large Physical Address Extension") }, - /* arm/hw_cap2 */ - { "pmull", NC_("arm-flag", /*/flag:pmull*/ "64x64->128-bit F2m multiplication (arch>8)") }, - { "aes", NC_("arm-flag", /*/flag:aes*/ "Crypto:AES (arch>8)") }, - { "sha1", NC_("arm-flag", /*/flag:sha1*/ "Crypto:SHA1 (arch>8)") }, - { "sha2", NC_("arm-flag", /*/flag:sha2*/ "Crypto:SHA2 (arch>8)") }, - { "crc32", NC_("arm-flag", /*/flag:crc32*/ "CRC32 checksum instructions (arch>8)") }, - /* arm64/hw_cap */ - { "fp", NULL }, - { "asimd", NC_("arm-flag", /*/flag:asimd*/ "Advanced SIMD/NEON on AArch64 (arch>8)") }, - { "atomics", NULL }, - { "fphp", NULL }, - { "asimdhp", NULL }, - { "cpuid", NULL }, - { "asimdrdm", NULL }, - { "jscvt", NULL }, - { "fcma", NULL }, - { "lrcpc", NULL }, - { NULL, NULL } -}; - -static struct { - int code; char *name; -} tab_arm_implementer[] = { - { 0x41, "ARM" }, - { 0x44, "Intel (formerly DEC) StrongARM" }, - { 0x4e, "nVidia" }, - { 0x54, "Texas Instruments" }, - { 0x56, "Marvell" }, - { 0x69, "Intel XScale" }, - { 0, NULL}, -}; - -static struct { - /* source: t = tested, d = official docs, f = web */ - int code; char *part_desc; -} tab_arm_arm_part[] = { /* only valid for implementer 0x41 ARM */ - /*d */ { 0x920, "ARM920" }, - /*d */ { 0x926, "ARM926" }, - /*d */ { 0x946, "ARM946" }, - /*d */ { 0x966, "ARM966" }, - /*d */ { 0xb02, "ARM11 MPCore" }, - /*d */ { 0xb36, "ARM1136" }, - /*d */ { 0xb56, "ARM1156" }, - /*dt*/ { 0xb76, "ARM1176" }, - /*dt*/ { 0xc05, "Cortex-A5" }, - /*d */ { 0xc07, "Cortex-A7 MPCore" }, - /*dt*/ { 0xc08, "Cortex-A8" }, - /*dt*/ { 0xc09, "Cortex-A9" }, - /*d */ { 0xc0e, "Cortex-A17 MPCore" }, - /*d */ { 0xc0f, "Cortex-A15" }, - /*d */ { 0xd01, "Cortex-A32" }, - /*dt*/ { 0xd03, "Cortex-A53" }, - /*d */ { 0xd04, "Cortex-A35" }, - /*d */ { 0xd05, "Cortex-A55" }, - /*d */ { 0xd07, "Cortex-A57 MPCore" }, - /*d */ { 0xd08, "Cortex-A72" }, - /*d */ { 0xd09, "Cortex-A73" }, - /*d */ { 0xd0a, "Cortex-A75" }, - { 0, NULL}, -}; - -static struct { - char *code; char *name; char *more; -} tab_arm_arch[] = { - { "7", "AArch32", "AArch32 (ARMv7)" }, - { "8", "AArch64", "AArch64 (ARMv8)" }, - { "AArch32", "AArch32", "AArch32 (ARMv7)" }, - { "AArch64", "AArch64", "AArch64 (ARMv8)" }, - { NULL, NULL, NULL }, -}; - -static char all_flags[1024] = ""; - -#define APPEND_FLAG(f) strcat(all_flags, f); strcat(all_flags, " "); -const char *arm_flag_list() { - int i = 0, built = 0; - built = strlen(all_flags); - if (!built) { - while(tab_flag_meaning[i].name != NULL) { - APPEND_FLAG(tab_flag_meaning[i].name); - i++; - } - } - return all_flags; -} - -const char *arm_flag_meaning(const char *flag) { - int i = 0; - if (flag) - while(tab_flag_meaning[i].name != NULL) { - if (strcmp(tab_flag_meaning[i].name, flag) == 0) { - if (tab_flag_meaning[i].meaning != NULL) - return C_("arm-flag", tab_flag_meaning[i].meaning); - else return NULL; - } - i++; - } - return NULL; -} - -static int code_match(int c0, const char* code1) { - int c1; - if (code1 == NULL) return 0; - c1 = strtol(code1, NULL, 0); - return (c0 == c1) ? 1 : 0; -} - -const char *arm_implementer(const char *code) { - int i = 0; - if (code) - while(tab_arm_implementer[i].code) { - if (code_match(tab_arm_implementer[i].code, code)) - return tab_arm_implementer[i].name; - i++; - } - return NULL; -} - -const char *arm_part(const char *imp_code, const char *part_code) { - int i = 0; - if (imp_code && part_code) { - if (code_match(0x41, imp_code)) { - /* 0x41=ARM parts */ - while(tab_arm_arm_part[i].code) { - if (code_match(tab_arm_arm_part[i].code, part_code)) - return tab_arm_arm_part[i].part_desc; - i++; - } - } - } - return NULL; -} - -const char *arm_arch(const char *cpuinfo_arch_str) { - int i = 0; - if (cpuinfo_arch_str) - while(tab_arm_arch[i].code) { - if (strcmp(tab_arm_arch[i].code, cpuinfo_arch_str) == 0) - return tab_arm_arch[i].name; - i++; - } - return cpuinfo_arch_str; -} - -const char *arm_arch_more(const char *cpuinfo_arch_str) { - int i = 0; - if (cpuinfo_arch_str) - while(tab_arm_arch[i].code) { - if (strcmp(tab_arm_arch[i].code, cpuinfo_arch_str) == 0) - return tab_arm_arch[i].more; - i++; - } - return cpuinfo_arch_str; -} - -char *arm_decoded_name(const char *imp, const char *part, const char *var, const char *rev, const char *arch, const char *model_name) { - char *dnbuff; - char *imp_name = NULL, *part_desc = NULL, *arch_name = NULL; - int r = 0, p = 0; - dnbuff = malloc(256); - if (dnbuff) { - memset(dnbuff, 0, 256); - - if (imp && arch && part && rev) { - /* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0395b/CIHCAGHH.html - * variant and revision can be rendered r{variant}p{revision} */ - r = strtol(var, NULL, 0); - p = strtol(rev, NULL, 0); - imp_name = (char*) arm_implementer(imp); - part_desc = (char*) arm_part(imp, part); - arch_name = (char*) arm_arch(arch); - if (imp_name || part_desc) { - if (arch_name != arch) - sprintf(dnbuff, "%s %s r%dp%d (%s)", - (imp_name) ? imp_name : imp, - (part_desc) ? part_desc : part, - r, p, arch_name); - else - sprintf(dnbuff, "%s %s r%dp%d (arch:%s)", - (imp_name) ? imp_name : imp, - (part_desc) ? part_desc : part, - r, p, arch); - } else { - /* fallback for now */ - sprintf(dnbuff, "%s [imp:%s part:%s r%dp%d arch:%s]", - model_name, - (imp_name) ? imp_name : imp, - (part_desc) ? part_desc : part, - r, p, arch); - } - } else { - /* prolly not ARM arch at all */ - if (model_name) - sprintf(dnbuff, "%s", model_name); - else { - free(dnbuff); - return NULL; - } - } - } - return dnbuff; -} diff --git a/modules/devices/arm/arm_data.h b/modules/devices/arm/arm_data.h deleted file mode 100644 index 63b3c906..00000000 --- a/modules/devices/arm/arm_data.h +++ /dev/null @@ -1,40 +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. - * - */ - -#ifndef _ARMDATA_H_ -#define _ARMDATA_H_ - -/* table lookups */ -const char *arm_implementer(const char *code); -const char *arm_part(const char *imp_code, const char *part_code); -const char *arm_arch(const char *cpuinfo_arch_str); -const char *arm_arch_more(const char *cpuinfo_arch_str); - -/* cpu_implementer, cpu_part, cpu_variant, cpu_revision, cpu_architecture from /proc/cpuinfo - * model_name is returned as a fallback if not enough data is known */ -char *arm_decoded_name( - const char *imp, const char *part, const char *var, const char *rev, - const char *arch, const char *model_name); - -/* cpu flags from /proc/cpuinfo */ -const char *arm_flag_list(void); /* list of all known flags */ -const char *arm_flag_meaning(const char *flag); /* lookup flag meaning */ - -#endif diff --git a/modules/devices/arm/processor.c b/modules/devices/arm/processor.c deleted file mode 100644 index 3bee39f8..00000000 --- a/modules/devices/arm/processor.c +++ /dev/null @@ -1,493 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "devices.h" -#include "cpu_util.h" -#include "dt_util.h" - -#include "arm_data.h" -#include "arm_data.c" - -enum { - ARM_A32 = 0, - ARM_A64 = 1, - ARM_A32_ON_A64 = 2, -}; - -static const gchar *arm_mode_str[] = { - "A32", - "A64", - "A32 on A64", -}; - -GSList * -processor_scan(void) -{ - GSList *procs = NULL; - Processor *processor = NULL; - FILE *cpuinfo; - gchar buffer[128]; - gchar *rep_pname = NULL; - GSList *pi = NULL; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - -#define CHECK_FOR(k) (g_str_has_prefix(tmp[0], k)) - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - } else { - g_strfreev(tmp); - continue; - } - - get_str("Processor", rep_pname); - - if ( CHECK_FOR("processor") ) { - /* finish previous */ - if (processor) { - procs = g_slist_append(procs, processor); - } - - /* start next */ - processor = g_new0(Processor, 1); - processor->id = atol(tmp[1]); - - if (rep_pname) - processor->linux_name = g_strdup(rep_pname); - - g_strfreev(tmp); - continue; - } - - if (!processor && - ( CHECK_FOR("model name") - || CHECK_FOR("Features") - || CHECK_FOR("BogoMIPS") ) ) { - - /* single proc/core may not have "processor : n" */ - processor = g_new0(Processor, 1); - processor->id = 0; - - if (rep_pname) - processor->linux_name = g_strdup(rep_pname); - } - - if (processor) { - get_str("model name", processor->linux_name); - get_str("Features", processor->flags); - get_float("BogoMIPS", processor->bogomips); - - get_str("CPU implementer", processor->cpu_implementer); - get_str("CPU architecture", processor->cpu_architecture); - get_str("CPU variant", processor->cpu_variant); - get_str("CPU part", processor->cpu_part); - get_str("CPU revision", processor->cpu_revision); - } - g_strfreev(tmp); - } - - if (processor) - procs = g_slist_append(procs, processor); - - g_free(rep_pname); - fclose(cpuinfo); - - /* re-duplicate missing data for /proc/cpuinfo variant that de-duplicated it */ -#define REDUP(f) if (dproc->f && !processor->f) processor->f = g_strdup(dproc->f); - Processor *dproc; - GSList *l; - l = procs = g_slist_reverse(procs); - while (l) { - processor = l->data; - if (processor->flags) { - dproc = processor; - } else if (dproc) { - REDUP(flags); - REDUP(cpu_implementer); - REDUP(cpu_architecture); - REDUP(cpu_variant); - REDUP(cpu_part); - REDUP(cpu_revision); - } - l = g_slist_next(l); - } - procs = g_slist_reverse(procs); - - /* data not from /proc/cpuinfo */ - for (pi = procs; pi; pi = pi->next) { - processor = (Processor *) pi->data; - - /* strings can't be null or segfault later */ - STRIFNULL(processor->linux_name, _("ARM Processor") ); - EMPIFNULL(processor->flags); - UNKIFNULL(processor->cpu_implementer); - UNKIFNULL(processor->cpu_architecture); - UNKIFNULL(processor->cpu_variant); - UNKIFNULL(processor->cpu_part); - UNKIFNULL(processor->cpu_revision); - - processor->model_name = arm_decoded_name( - processor->cpu_implementer, processor->cpu_part, - processor->cpu_variant, processor->cpu_revision, - processor->cpu_architecture, processor->linux_name); - UNKIFNULL(processor->model_name); - - /* topo & freq */ - processor->cpufreq = cpufreq_new(processor->id); - processor->cputopo = cputopo_new(processor->id); - - if (processor->cpufreq->cpukhz_max) - processor->cpu_mhz = processor->cpufreq->cpukhz_max / 1000; - else - processor->cpu_mhz = 0.0f; - - /* mode */ - processor->mode = ARM_A32; - if ( processor_has_flag(processor->flags, "pmull") - || processor_has_flag(processor->flags, "crc32") ) { -#ifdef __aarch64__ - processor->mode = ARM_A64; -#else - processor->mode = ARM_A32_ON_A64; -#endif - } - } - - return procs; -} - -gchar *processor_get_capabilities_from_flags(gchar * strflags) -{ - gchar **flags, **old; - gchar *tmp = NULL; - gint j = 0; - - flags = g_strsplit(strflags, " ", 0); - old = flags; - - while (flags[j]) { - const gchar *meaning = arm_flag_meaning( flags[j] ); - - if (meaning) { - tmp = h_strdup_cprintf("%s=%s\n", tmp, flags[j], meaning); - } else { - tmp = h_strdup_cprintf("%s=\n", tmp, flags[j]); - } - j++; - } - if (tmp == NULL || g_strcmp0(tmp, "") == 0) - tmp = g_strdup_printf("%s=%s\n", "empty", _("Empty List")); - - g_strfreev(old); - return tmp; -} - -#define khzint_to_mhzdouble(k) (((double)k)/1000) -#define cmp_clocks_test(f) if (a->f < b->f) return -1; if (a->f > b->f) return 1; - -static gint cmp_cpufreq_data(cpufreq_data *a, cpufreq_data *b) { - gint i = 0; - i = g_strcmp0(a->shared_list, b->shared_list); if (i!=0) return i; - cmp_clocks_test(cpukhz_max); - cmp_clocks_test(cpukhz_min); - return 0; -} - -static gint cmp_cpufreq_data_ignore_affected(cpufreq_data *a, cpufreq_data *b) { - gint i = 0; - cmp_clocks_test(cpukhz_max); - cmp_clocks_test(cpukhz_min); - return 0; -} - -gchar *clocks_summary(GSList * processors) -{ - gchar *ret = g_strdup_printf("[%s]\n", _("Clocks")); - GSList *all_clocks = NULL, *uniq_clocks = NULL; - GSList *tmp, *l; - Processor *p; - cpufreq_data *c, *cur = NULL; - gint cur_count = 0, i = 0; - - /* create list of all clock references */ - for (l = processors; l; l = l->next) { - p = (Processor*)l->data; - if (p->cpufreq) { - all_clocks = g_slist_prepend(all_clocks, p->cpufreq); - } - } - - if (g_slist_length(all_clocks) == 0) { - ret = h_strdup_cprintf("%s=\n", ret, _("(Not Available)") ); - g_slist_free(all_clocks); - return ret; - } - - /* ignore duplicate references */ - all_clocks = g_slist_sort(all_clocks, (GCompareFunc)cmp_cpufreq_data); - for (l = all_clocks; l; l = l->next) { - c = (cpufreq_data*)l->data; - if (!cur) { - cur = c; - } else { - if (cmp_cpufreq_data(cur, c) != 0) { - uniq_clocks = g_slist_prepend(uniq_clocks, cur); - cur = c; - } - } - } - uniq_clocks = g_slist_prepend(uniq_clocks, cur); - uniq_clocks = g_slist_reverse(uniq_clocks); - cur = 0, cur_count = 0; - - /* count and list clocks */ - for (l = uniq_clocks; l; l = l->next) { - c = (cpufreq_data*)l->data; - if (!cur) { - cur = c; - cur_count = 1; - } else { - if (cmp_cpufreq_data_ignore_affected(cur, c) != 0) { - ret = h_strdup_cprintf(_("%.2f-%.2f %s=%dx\n"), - ret, - khzint_to_mhzdouble(cur->cpukhz_min), - khzint_to_mhzdouble(cur->cpukhz_max), - _("MHz"), - cur_count); - cur = c; - cur_count = 1; - } else { - cur_count++; - } - } - } - ret = h_strdup_cprintf(_("%.2f-%.2f %s=%dx\n"), - ret, - khzint_to_mhzdouble(cur->cpukhz_min), - khzint_to_mhzdouble(cur->cpukhz_max), - _("MHz"), - cur_count); - - g_slist_free(all_clocks); - g_slist_free(uniq_clocks); - return ret; -} - -gchar * -processor_get_detailed_info(Processor *processor) -{ - gchar *tmp_flags, *tmp_imp, *tmp_part, *tmp_arch, *tmp_cpufreq, *tmp_topology, *ret; - tmp_flags = processor_get_capabilities_from_flags(processor->flags); - tmp_imp = (char*)arm_implementer(processor->cpu_implementer); - tmp_part = (char*)arm_part(processor->cpu_implementer, processor->cpu_part); - tmp_arch = (char*)arm_arch_more(processor->cpu_architecture); - - tmp_topology = cputopo_section_str(processor->cputopo); - tmp_cpufreq = cpufreq_section_str(processor->cpufreq); - - ret = g_strdup_printf("[%s]\n" - "%s=%s\n" /* linux name */ - "%s=%s\n" /* decoded name */ - "%s=%s\n" /* mode */ - "%s=%.2f %s\n" /* frequency */ - "%s=%.2f\n" /* bogomips */ - "%s=%s\n" /* byte order */ - "%s" /* topology */ - "%s" /* frequency scaling */ - "[%s]\n" /* ARM */ - "%s=[%s] %s\n" /* implementer */ - "%s=[%s] %s\n" /* part */ - "%s=[%s] %s\n" /* architecture */ - "%s=%s\n" /* variant */ - "%s=%s\n" /* revision */ - "[%s]\n" /* flags */ - "%s" - "%s", /* empty */ - _("Processor"), - _("Linux Name"), processor->linux_name, - _("Decoded Name"), processor->model_name, - _("Mode"), arm_mode_str[processor->mode], - _("Frequency"), processor->cpu_mhz, _("MHz"), - _("BogoMips"), processor->bogomips, - _("Byte Order"), byte_order_str(), - tmp_topology, - tmp_cpufreq, - _("ARM"), - _("Implementer"), processor->cpu_implementer, (tmp_imp) ? tmp_imp : "", - _("Part"), processor->cpu_part, (tmp_part) ? tmp_part : "", - _("Architecture"), processor->cpu_architecture, (tmp_arch) ? tmp_arch : "", - _("Variant"), processor->cpu_variant, - _("Revision"), processor->cpu_revision, - _("Capabilities"), tmp_flags, - ""); - g_free(tmp_flags); - g_free(tmp_cpufreq); - g_free(tmp_topology); - return ret; -} - -gchar *processor_name(GSList *processors) { - /* compatible contains a list of compatible hardware, so be careful - * with matching order. - * ex: "ti,omap3-beagleboard-xm", "ti,omap3450", "ti,omap3"; - * matches "omap3 family" first. - * ex: "brcm,bcm2837", "brcm,bcm2836"; - * would match 2836 when it is a 2837. - */ -#define UNKSOC "(Unknown)" /* don't translate this */ - const struct { - char *search_str; - char *vendor; - char *soc; - } dt_compat_searches[] = { - { "brcm,bcm2837", "Broadcom", "BCM2837" }, - { "brcm,bcm2836", "Broadcom", "BCM2836" }, - { "brcm,bcm2835", "Broadcom", "BCM2835" }, - { "ti,omap5432", "Texas Instruments", "OMAP5432" }, - { "ti,omap5430", "Texas Instruments", "OMAP5430" }, - { "ti,omap4470", "Texas Instruments", "OMAP4470" }, - { "ti,omap4460", "Texas Instruments", "OMAP4460" }, - { "ti,omap4430", "Texas Instruments", "OMAP4430" }, - { "ti,omap3620", "Texas Instruments", "OMAP3620" }, - { "ti,omap3450", "Texas Instruments", "OMAP3450" }, - { "ti,omap5", "Texas Instruments", "OMAP5-family" }, - { "ti,omap4", "Texas Instruments", "OMAP4-family" }, - { "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" }, - { "bcm,", "Broadcom", UNKSOC }, - { "nvidia," "nVidia", UNKSOC }, - { "rockchip," "Rockchip", UNKSOC }, - { "ti,", "Texas Instruments", UNKSOC }, - { "qcom,", "Qualcom", UNKSOC }, - { "mediatek," "MediaTek", UNKSOC }, - { NULL, NULL } - }; - gchar *ret = NULL; - gchar *compat = NULL; - int i; - - compat = dtr_get_string("/compatible", 1); - - if (compat != NULL) { - i = 0; - while(dt_compat_searches[i].search_str != NULL) { - if (strstr(compat, dt_compat_searches[i].search_str) != NULL) { - ret = g_strdup_printf("%s %s", dt_compat_searches[i].vendor, dt_compat_searches[i].soc); - break; - } - i++; - } - } - g_free(compat); - UNKIFNULL(ret); - return ret; -} - -gchar *processor_describe(GSList * processors) { - return processor_describe_by_counting_names(processors); -} - -gchar *processor_meta(GSList * processors) { - gchar *meta_soc = processor_name(processors); - gchar *meta_cpu_desc = processor_describe(processors); - gchar *meta_cpu_topo = processor_describe_default(processors); - gchar *meta_freq_desc = processor_frequency_desc(processors); - gchar *meta_clocks = clocks_summary(processors); - gchar *ret = NULL; - UNKIFNULL(meta_cpu_desc); - ret = g_strdup_printf("[%s]\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s", - _("SOC/Package"), - _("Name"), meta_soc, - _("Description"), meta_cpu_desc, - _("Topology"), meta_cpu_topo, - _("Logical CPU Config"), meta_freq_desc, - meta_clocks ); - g_free(meta_soc); - g_free(meta_cpu_desc); - g_free(meta_cpu_topo); - g_free(meta_freq_desc); - g_free(meta_clocks); - return ret; -} - -gchar *processor_get_info(GSList * processors) -{ - Processor *processor; - gchar *ret, *tmp, *hashkey; - gchar *meta; /* becomes owned by more_info? no need to free? */ - GSList *l; - - tmp = g_strdup_printf("$CPU_META$%s=\n", _("SOC/Package Information") ); - - meta = processor_meta(processors); - moreinfo_add_with_prefix("DEV", "CPU_META", meta); - - for (l = processors; l; l = l->next) { - processor = (Processor *) l->data; - - tmp = g_strdup_printf("%s$CPU%d$%s=%.2f %s\n", - tmp, processor->id, - processor->model_name, - processor->cpu_mhz, _("MHz")); - - hashkey = g_strdup_printf("CPU%d", processor->id); - moreinfo_add_with_prefix("DEV", hashkey, - processor_get_detailed_info(processor)); - g_free(hashkey); - } - - ret = g_strdup_printf("[$ShellParam$]\n" - "ViewType=1\n" - "[Processors]\n" - "%s", tmp); - g_free(tmp); - - return ret; -} diff --git a/modules/devices/battery.c b/modules/devices/battery.c deleted file mode 100644 index cbcebb12..00000000 --- a/modules/devices/battery.c +++ /dev/null @@ -1,388 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <string.h> -#include <time.h> - -#include "hardinfo.h" -#include "devices.h" - -const struct { - gchar *key, *name; -} ups_fields[] = { - { "UPS Status", NULL }, - { "STATUS", "Status" }, - { "TIMELEFT", "Time Left" }, - { "LINEV", "Line Voltage" }, - { "LOADPCT", "Load Percent" }, - - { "UPS Battery Information", NULL }, - { "BATTV", "Battery Voltage" }, - { "BCHARGE", "Battery Charge" }, - { "BATTDATE", "Battery Date" }, - - { "UPS Information", NULL }, - { "APCMODEL", "Model" }, - { "FIRMWARE", "Firmware Version" }, - { "SERIALNO", "Serial Number" }, - { "UPSMODE", "UPS Mode" }, - { "CABLE", "Cable" }, - { "UPSNAME", "UPS Name" }, - - { "UPS Nominal Values", NULL }, - { "NOMINV", "Voltage" }, - { "NOMBATTV", "Battery Voltage" }, - { "NOMPOWER", "Power" } -}; - - -static void -__scan_battery_apcupsd(void) -{ - GHashTable *ups_data; - FILE *apcaccess; - char buffer[512], *apcaccess_path; - int i; - - apcaccess_path = find_program("apcaccess"); - if (apcaccess_path && (apcaccess = popen(apcaccess_path, "r"))) { - /* first line isn't important */ - if (fgets(buffer, 512, apcaccess)) { - /* allocate the key, value hash table */ - ups_data = g_hash_table_new(g_str_hash, g_str_equal); - - /* read up all the apcaccess' output, saving it in the key, value hash table */ - while (fgets(buffer, 512, apcaccess)) { - buffer[9] = '\0'; - - g_hash_table_insert(ups_data, - g_strdup(g_strstrip(buffer)), - g_strdup(g_strstrip(buffer + 10))); - } - - /* builds the ups info string, respecting the field order as found in ups_fields */ - for (i = 0; i < G_N_ELEMENTS(ups_fields); i++) { - if (!ups_fields[i].name) { - /* there's no name: make a group with the key as its name */ - battery_list = h_strdup_cprintf("[%s]\n", battery_list, ups_fields[i].key); - } else { - /* there's a name: adds a line */ - battery_list = h_strdup_cprintf("%s=%s\n", battery_list, - ups_fields[i].name, - g_hash_table_lookup(ups_data, ups_fields[i].key)); - } - } - - g_hash_table_destroy(ups_data); - } - - pclose(apcaccess); - } - - g_free(apcaccess_path); -} - -static void -__scan_battery_acpi(void) -{ - gchar *acpi_path; - - gchar *present = NULL; - gchar *capacity = NULL; - gchar *technology = NULL; - gchar *voltage = NULL; - gchar *model = NULL, *serial = NULL, *type = NULL; - gchar *state = NULL, *rate = NULL; - gchar *remaining = NULL; - gchar *manufacturer = NULL; - - acpi_path = g_strdup("/proc/acpi/battery"); - if (g_file_test(acpi_path, G_FILE_TEST_EXISTS)) { - GDir *acpi; - - if ((acpi = g_dir_open(acpi_path, 0, NULL))) { - const gchar *entry; - - while ((entry = g_dir_read_name(acpi))) { - gchar *path = g_strdup_printf("%s/%s/info", acpi_path, entry); - FILE *f; - gchar buffer[256]; - gdouble charge_rate = 1.0; - - f = fopen(path, "r"); - g_free(path); - - if (!f) - goto cleanup; - - while (fgets(buffer, 256, f)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - GET_STR("present", present); - GET_STR("design capacity", capacity); - GET_STR("battery technology", technology); - GET_STR("design voltage", voltage); - GET_STR("model number", model); - GET_STR("serial number", serial); - GET_STR("battery type", type); - GET_STR("OEM info", manufacturer); - - g_strfreev(tmp); - } - fclose(f); - - path = g_strdup_printf("%s/%s/state", acpi_path, entry); - f = fopen(path, "r"); - g_free(path); - - if (!f) - goto cleanup; - - while (fgets(buffer, 256, f)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - GET_STR("charging state", state); - GET_STR("present rate", rate); - GET_STR("remaining capacity", remaining); - - g_strfreev(tmp); - } - - fclose(f); - - const gchar *url = vendor_get_url(manufacturer); - if (url) { - char *tmp = g_strdup_printf("%s (%s)", vendor_get_name(manufacturer), url); - g_free(manufacturer); - manufacturer = tmp; - } - - if (g_str_equal(present, "yes")) { - if (remaining && capacity) - charge_rate = atof(remaining) / atof(capacity); - else - charge_rate = 0; - - battery_list = h_strdup_cprintf(_("\n[Battery: %s]\n" - "State=%s (load: %s)\n" - "Capacity=%s / %s (%.2f%%)\n" - "Battery Technology=%s (%s)\n" - "Manufacturer=%s\n" - "Model Number=%s\n" - "Serial Number=%s\n"), - battery_list, - entry, - state, rate, - remaining, capacity, charge_rate * 100.0, - technology, type, - manufacturer, - model, - serial); - } - - cleanup: - g_free(present); - g_free(capacity); - g_free(technology); - g_free(type); - g_free(model); - g_free(serial); - g_free(state); - g_free(remaining); - g_free(rate); - g_free(manufacturer); - - present = capacity = technology = type = \ - model = serial = state = remaining = rate = manufacturer = NULL; - } - - g_dir_close(acpi); - } - } - - g_free(acpi_path); -} - -static gchar * -read_contents(const gchar *base, const gchar *key) -{ - gchar *value; - gchar *path; - - path = g_strdup_printf("%s/%s", base, key); - if (!path) - return NULL; - - if (!g_file_get_contents(path, &value, NULL, NULL)) { - free(path); - return NULL; - } - - free(path); - return g_strchomp(value); -} - -static void -__scan_battery_sysfs_add_battery(const gchar *name) -{ - gchar *path = g_strdup_printf("/sys/class/power_supply/%s", name); - gchar *status, *capacity, *capacity_level, *technology, *manufacturer, - *model_name, *serial_number; - - if (!path) - return; - - status = read_contents(path, "status"); - capacity = read_contents(path, "capacity"); - capacity_level = read_contents(path, "capacity_level"); - technology = read_contents(path, "technology"); - manufacturer = read_contents(path, "manufacturer"); - model_name = read_contents(path, "model_name"); - serial_number = read_contents(path, "serial_number"); - - battery_list = h_strdup_cprintf(_("\n[Battery: %s]\n" - "State=%s\n" - "Capacity=%s / %s\n" - "Battery Technology=%s\n" - "Manufacturer=%s\n" - "Model Number=%s\n" - "Serial Number=%s\n"), - battery_list, - name, - status, - capacity, capacity_level, - technology, - manufacturer, - model_name, - serial_number); - - free(status); - free(capacity); - free(capacity_level); - free(technology); - free(manufacturer); - free(model_name); - free(serial_number); -} - -static void -__scan_battery_sysfs(void) -{ - GDir *dir; - const gchar *entry; - - dir = g_dir_open("/sys/class/power_supply", 0, NULL); - if (!dir) - return; - - while ((entry = g_dir_read_name(dir))) { - if (g_str_has_prefix(entry, "BAT")) - __scan_battery_sysfs_add_battery(entry); - } - - g_dir_close(dir); -} - -static void -__scan_battery_apm(void) -{ - FILE *procapm; - static char *sremaining = NULL, *stotal = NULL; - static unsigned int last_time = 0; - static int percentage = 0; - const char *ac_status[] = { "Battery", - "AC Power", - "Charging" }; - int ac_bat; - char apm_bios_ver[16], apm_drv_ver[16]; - char trash[10]; - - if ((procapm = fopen("/proc/apm", "r"))) { - int old_percentage = percentage; - - (void)fscanf(procapm, "%s %s %s 0x%x %s %s %d%%", - apm_drv_ver, apm_bios_ver, trash, - &ac_bat, trash, trash, &percentage); - fclose(procapm); - - if (last_time == 0) { - last_time = time(NULL); - sremaining = stotal = NULL; - } - - if (old_percentage - percentage > 0) { - if (sremaining && stotal) { - g_free(sremaining); - g_free(stotal); - } - - int secs_remaining = (time(NULL) - last_time) * percentage / - (old_percentage - percentage); - sremaining = seconds_to_string(secs_remaining); - stotal = seconds_to_string((secs_remaining * 100) / percentage); - - last_time = time(NULL); - } - } else { - return; - } - - if (stotal && sremaining) { - battery_list = h_strdup_cprintf(_("\n[Battery (APM)]\n" - "Charge=%d%%\n" - "Remaining Charge=%s of %s\n" - "Using=%s\n" - "APM driver version=%s\n" - "APM BIOS version=%s\n"), - battery_list, - percentage, - sremaining, stotal, - ac_status[ac_bat], - apm_drv_ver, apm_bios_ver); - } else { - battery_list = h_strdup_cprintf(_("\n[Battery (APM)]\n" - "Charge=%d%%\n" - "Using=%s\n" - "APM driver version=%s\n" - "APM BIOS version=%s\n"), - battery_list, - percentage, - ac_status[ac_bat], - apm_drv_ver, apm_bios_ver); - - } -} - -void -scan_battery_do(void) -{ - g_free(battery_list); - battery_list = g_strdup(""); - - __scan_battery_sysfs(); - __scan_battery_acpi(); - __scan_battery_apm(); - __scan_battery_apcupsd(); - - if (*battery_list == '\0') { - g_free(battery_list); - - battery_list = g_strdup(_("[No batteries]\n" - "No batteries found on this system=\n")); - } -} diff --git a/modules/devices/devicetree.c b/modules/devices/devicetree.c deleted file mode 100644 index 4f3c85a2..00000000 --- a/modules/devices/devicetree.c +++ /dev/null @@ -1,304 +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 <stdint.h> -#include "hardinfo.h" -#include "devices.h" -#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 - -gchar *dtree_info = NULL; - -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; - gchar *node_path; - const gchar *fn; - GDir *dir; - dtr_obj *node, *child; - - props = g_strdup_printf("[%s]\n", _("Properties") ); - nodes = g_strdup_printf("[%s]\n", _("Children") ); - node = dtr_obj_read(dt, np); - dir_path = dtr_obj_full_path(node); - - dir = g_dir_open(dir_path, 0 , NULL); - if (dir) { - while((fn = g_dir_read_name(dir)) != NULL) { - child = dtr_get_prop_obj(dt, node, fn); - pstr = hardinfo_clean_value(dtr_str(child), 1); - lstr = hardinfo_clean_label(fn, 0); - if (dtr_obj_type(child) == DT_NODE) { - tmp = g_strdup_printf("%s%s=%s\n", - nodes, lstr, pstr); - g_free(nodes); - nodes = tmp; - } else { - tmp = g_strdup_printf("%s%s=%s\n", - props, lstr, pstr); - g_free(props); - props = tmp; - } - dtr_obj_free(child); - g_free(pstr); - g_free(lstr); - } - } - g_dir_close(dir); - g_free(dir_path); - - lstr = dtr_obj_alias(node); - pstr = dtr_obj_symbol(node); - ret = g_strdup_printf("[%s]\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s%s", - _("Node"), - _("Node Path"), dtr_obj_path(node), - _("Alias"), (lstr != NULL) ? lstr : _("(None)"), - _("Symbol"), (pstr != NULL) ? pstr : _("(None)"), - props, nodes); - - 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 */ -static char *get_dt_string(dtr *dt, char *path, gboolean decode) { - char *ret; - - if (decode) { - dtr_obj *obj = dtr_get_prop_obj(dt, NULL, path); - - ret = dtr_str(obj); - - dtr_obj_free(obj); - } else { - ret = dtr_get_prop_str(dt, NULL, path); - } - - return ret; -} - -static gchar *get_summary(dtr *dt) { - char *model = NULL, *compat = NULL; - char *ret = NULL; - - 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") - || 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"), 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", - _("Raspberry Pi or Compatible"), - _("Model"), model, - _("Serial Number"), serial_number, - _("RCode"), _("No revision code available; unable to lookup model details."), - basic_info); - - g_free(serial_number); - } - - 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) { - 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", - mac_details, - _("More"), - _("Serial Number"), serial_number); - - free(mac_details); - free(serial_number); - } - } -#endif - - /* fallback */ - if (!ret) { - gchar *serial_number = get_dt_string(dt, "/serial-number", 1); - EMPIFNULL(serial_number); - ret = g_strdup_printf( - "[%s]\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n", - _("Board"), - _("Model"), model, - _("Serial Number"), serial_number, - _("Compatible"), compat); - free(serial_number); - } - - free(model); - free(compat); - - return ret; -} - -static void mi_add(const char *key, const char *value) { - gchar *ckey, *rkey; - - ckey = hardinfo_clean_label(key, 0); - rkey = g_strdup_printf("%s:%s", "DTREE", ckey); - - dtree_info = h_strdup_cprintf("$%s$%s=\n", dtree_info, rkey, ckey); - moreinfo_add_with_prefix("DEV", rkey, g_strdup(value)); - - g_free(ckey); - g_free(rkey); -} - -static void add_keys(dtr *dt, char *np) { - gchar *dir_path, *dt_path; - gchar *ftmp, *ntmp; - gchar *n_info; - const gchar *fn; - GDir *dir; - dtr_obj *obj; - - /* add self */ - obj = dtr_obj_read(dt, np); - dt_path = dtr_obj_path(obj); - 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); - 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) ) { - if (strcmp(np, "/") == 0) - ntmp = g_strdup_printf("/%s", fn); - else - ntmp = g_strdup_printf("%s/%s", np, fn); - add_keys(dt, ntmp); - g_free(ntmp); - } - g_free(ftmp); - } - } - g_dir_close(dir); -} - -static char *msg_section(dtr *dt, int dump) { - gchar *aslbl = NULL; - gchar *messages = dtr_messages(dt); - gchar *ret = g_strdup_printf("[%s]\n", _("Messages")); - gchar **lines = g_strsplit(messages, "\n", 0); - int i = 0; - while(lines[i] != NULL) { - aslbl = hardinfo_clean_label(lines[i], 0); - ret = appf(ret, "%s=\n", aslbl); - g_free(aslbl); - i++; - } - g_strfreev(lines); - if (dump) - printf("%s", messages); - g_free(messages); - return ret; -} - -void __scan_dtree() -{ - dtr *dt = dtr_new(NULL); - gchar *summary = get_summary(dt); - gchar *maps = dtr_maps_info(dt); - gchar *messages = NULL; - - dtree_info = g_strdup("[Device Tree]\n"); - mi_add("Summary", summary); - mi_add("Maps", maps); - - if(dtr_was_found(dt)) - add_keys(dt, "/"); - messages = msg_section(dt, 0); - mi_add("Messages", messages); - - g_free(summary); - g_free(maps); - g_free(messages); - dtr_free(dt); -} diff --git a/modules/devices/devicetree/pmac_data.c b/modules/devices/devicetree/pmac_data.c deleted file mode 100644 index b236aef1..00000000 --- a/modules/devices/devicetree/pmac_data.c +++ /dev/null @@ -1,98 +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 - */ - -#include "cpu_util.h" /* for PROC_CPUINFO */ - -static gchar *ppc_mac_details(void) { - int i = 0; - gchar *ret = NULL; - gchar *platform = NULL; - gchar *model = NULL; - gchar *machine = NULL; - gchar *motherboard = NULL; - gchar *detected_as = NULL; - gchar *pmac_flags = NULL; - gchar *l2_cache = NULL; - gchar *pmac_gen = NULL; - - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - if (tmp[1] == NULL) { - g_strfreev(tmp); - continue; - } - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - get_str("platform", platform); - get_str("model", model); - get_str("machine", machine); - get_str("motherboard", motherboard); - get_str("detected as", detected_as); - get_str("pmac flags", pmac_flags); - get_str("L2 cache", l2_cache); - get_str("pmac-generation", pmac_gen); - } - fclose(cpuinfo); - - if (machine == NULL) - goto pmd_exit; - - UNKIFNULL(platform); - UNKIFNULL(model); - UNKIFNULL(motherboard); - UNKIFNULL(detected_as); - UNKIFNULL(pmac_flags); - UNKIFNULL(l2_cache); - UNKIFNULL(pmac_gen); - - 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=%s\n", - _("Apple Power Macintosh"), - _("Platform"), platform, - _("Model"), model, - _("Machine"), machine, - _("Motherboard"), motherboard, - _("Detected as"), detected_as, - _("PMAC Flags"), pmac_flags, - _("L2 Cache"), l2_cache, - _("PMAC Generation"), pmac_gen ); - -pmd_exit: - g_free(platform); - g_free(model); - g_free(machine); - g_free(motherboard); - g_free(detected_as); - g_free(pmac_flags); - g_free(l2_cache); - g_free(pmac_gen); - return ret; -} diff --git a/modules/devices/devicetree/rpi_data.c b/modules/devices/devicetree/rpi_data.c deleted file mode 100644 index d0132e3a..00000000 --- a/modules/devices/devicetree/rpi_data.c +++ /dev/null @@ -1,166 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org> - * This file from: 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, 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 - */ - -static char unk[] = "(Unknown)"; - -/* information table from: http://elinux.org/RPi_HardwareHistory */ -static struct { - char *value, *intro, *model, *pcb, *mem, *mfg, *soc; -} rpi_boardinfo[] = { -/* Value Introduction Model Name PCB rev. Memory(spec) Manufacturer SOC(spec) * - * Raspberry Pi %s */ - { unk, unk, unk, unk, unk, unk, NULL }, - { "Beta", "Q1 2012", "B (Beta)", unk, "256MB", "(Beta board)", NULL }, - { "0002", "Q1 2012", "B", "1.0", "256MB", unk, "BCM2835" }, - { "0003", "Q3 2012", "B (ECN0001)", "1.0", "256MB", "(Fuses mod and D14 removed)", NULL }, - { "0004", "Q3 2012", "B", "2.0", "256MB", "Sony", NULL }, - { "0005", "Q4 2012", "B", "2.0", "256MB", "Qisda", NULL }, - { "0006", "Q4 2012", "B", "2.0", "256MB", "Egoman", NULL }, - { "0007", "Q1 2013", "A", "2.0", "256MB", "Egoman", NULL }, - { "0008", "Q1 2013", "A", "2.0", "256MB", "Sony", NULL }, - { "0009", "Q1 2013", "A", "2.0", "256MB", "Qisda", NULL }, - { "000d", "Q4 2012", "B", "2.0", "512MB", "Egoman", NULL }, - { "000e", "Q4 2012", "B", "2.0", "512MB", "Sony", NULL }, - { "000f", "Q4 2012", "B", "2.0", "512MB", "Qisda", NULL }, - { "0010", "Q3 2014", "B+", "1.0", "512MB", "Sony", NULL }, - { "0011", "Q2 2014", "Compute Module 1", "1.0", "512MB", "Sony", NULL }, - { "0012", "Q4 2014", "A+", "1.1", "256MB", "Sony", NULL }, - { "0013", "Q1 2015", "B+", "1.2", "512MB", unk, NULL }, - { "0014", "Q2 2014", "Compute Module 1", "1.0", "512MB", "Embest", NULL }, - { "0015", unk, "A+", "1.1", "256MB/512MB", "Embest", NULL }, - { "a01040", unk, "2 Model B", "1.0", "1GB", "Sony", "BCM2836" }, - { "a01041", "Q1 2015", "2 Model B", "1.1", "1GB", "Sony", "BCM2836" }, - { "a21041", "Q1 2015", "2 Model B", "1.1", "1GB", "Embest", "BCM2836" }, - { "a22042", "Q3 2016", "2 Model B", "1.2", "1GB", "Embest", "BCM2837" }, /* (with BCM2837) */ - { "900021", "Q3 2016", "A+", "1.1", "512MB", "Sony", NULL }, - { "900032", "Q2 2016?", "B+", "1.2", "512MB", "Sony", NULL }, - { "900092", "Q4 2015", "Zero", "1.2", "512MB", "Sony", NULL }, - { "900093", "Q2 2016", "Zero", "1.3", "512MB", "Sony", NULL }, - { "920093", "Q4 2016?", "Zero", "1.3", "512MB", "Embest", NULL }, - { "9000c1", "Q1 2017", "Zero W", "1.1", "512MB", "Sony", NULL }, - { "a02082", "Q1 2016", "3 Model B", "1.2", "1GB", "Sony", "BCM2837" }, - { "a020a0", "Q1 2017", "Compute Module 3 or CM3 Lite", "1.0", "1GB", "Sony", NULL }, - { "a22082", "Q1 2016", "3 Model B", "1.2", "1GB", "Embest", "BCM2837" }, - { "a32082", "Q4 2016", "3 Model B", "1.2", "1GB", "Sony Japan", NULL }, - { NULL, NULL, NULL, NULL, NULL, NULL, NULL } -}; - - -/* return number of chars to skip */ -static int rpi_ov_check(const char *r_code) { - /* sources differ. prefix is either 1000... or just 1... */ - //if (strncmp(r, "1000", 4) == 0) - // return 4; - if (strncmp(r_code, "1", 1) == 0) - return 1; - return 0; -} - -static int rpi_code_match(const char* code0, const char* code1) { - int c0, c1; - if (code0 == NULL || code1 == NULL) return 0; - c0 = strtol(code0, NULL, 16); - c1 = strtol(code1, NULL, 16); - if (c0 && c1) - return (c0 == c1) ? 1 : 0; - else - return (strcmp(code0, code1) == 0) ? 1 : 0; -} - -static int rpi_find_board(const char *r_code) { - int i = 0; - char *r = (char*)r_code; - if (r_code == NULL) - return 0; - /* ignore the overvolt prefix */ - r += rpi_ov_check(r_code); - while (rpi_boardinfo[i].value != NULL) { - if (rpi_code_match(r, rpi_boardinfo[i].value)) - return i; - - i++; - } - return 0; -} - -/* ------------------------- */ - -#include "cpu_util.h" /* for PROC_CPUINFO */ - -static gchar *rpi_board_details(void) { - int i = 0; - gchar *ret = NULL; - gchar *soc = NULL; - gchar *serial = NULL; - gchar *revision = NULL; - int ov = 0; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - if (tmp[1] == NULL) { - g_strfreev(tmp); - continue; - } - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - get_str("Revision", revision); - get_str("Hardware", soc); - get_str("Serial", serial); - } - fclose(cpuinfo); - - if (revision == NULL || soc == NULL) { - g_free(soc); - g_free(revision); - return NULL; - } - - ov = rpi_ov_check(revision); - i = rpi_find_board(revision); - ret = g_strdup_printf("[%s]\n" - "%s=%s %s\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n", - _("Raspberry Pi"), - _("Board Name"), _("Raspberry Pi"), rpi_boardinfo[i].model, - _("PCB Revision"), rpi_boardinfo[i].pcb, - _("Introduction"), rpi_boardinfo[i].intro, - _("Manufacturer"), rpi_boardinfo[i].mfg, - _("RCode"), rpi_boardinfo[i].value, - _("SOC (spec)"), rpi_boardinfo[i].soc, - _("Memory (spec)"), rpi_boardinfo[i].mem, - _("Serial Number"), serial, - _("Permanent overvolt bit"), (ov) ? C_("rpi-ov-bit", "Set") : C_("rpi-ov-bit", "Not set") ); - - g_free(soc); - g_free(revision); - return ret; -} diff --git a/modules/devices/devmemory.c b/modules/devices/devmemory.c deleted file mode 100644 index 29094dd8..00000000 --- a/modules/devices/devmemory.c +++ /dev/null @@ -1,120 +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 - */ - -#include <string.h> -#include "devices.h" - -GHashTable *memlabels = NULL; - -void scan_memory_do(void) -{ - gchar **keys, *tmp, *tmp_label, *trans_val; - static gint offset = -1; - gint i; - - if (offset == -1) { - /* gah. linux 2.4 adds three lines of data we don't need in - /proc/meminfo */ - gchar *os_kernel = module_call_method("computer::getOSKernel"); - if (os_kernel) { - offset = strstr(os_kernel, "Linux 2.4") ? 3 : 0; - g_free(os_kernel); - } else { - offset = 0; - } - } - - g_file_get_contents("/proc/meminfo", &meminfo, NULL, NULL); - - keys = g_strsplit(meminfo, "\n", 0); - - g_free(meminfo); - g_free(lginterval); - - meminfo = g_strdup(""); - lginterval = g_strdup(""); - - for (i = offset; keys[i]; i++) { - gchar **newkeys = g_strsplit(keys[i], ":", 0); - - if (!newkeys[0]) { - g_strfreev(newkeys); - break; - } - - g_strstrip(newkeys[0]); - g_strstrip(newkeys[1]); - - /* try to find a localizable label */ - tmp = g_hash_table_lookup(memlabels, newkeys[0]); - if (tmp) - tmp_label = _(tmp); - else - tmp_label = ""; /* or newkeys[0] */ - /* although it doesn't matter... */ - - if (strstr(newkeys[1], "kB")) { - trans_val = g_strdup_printf("%d %s", atoi(newkeys[1]), _("KiB") ); - } else { - trans_val = strdup(newkeys[1]); - } - - 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); - lginterval = tmp; - - g_strfreev(newkeys); - } - g_strfreev(keys); -} - -void init_memory_labels(void) -{ - static const struct { - char *proc_label; - char *real_label; - } proc2real[] = { - { "MemTotal", N_("Total Memory") }, - { "MemFree", N_("Free Memory") }, - { "SwapCached", N_("Cached Swap") }, - { "HighTotal", N_("High Memory") }, - { "HighFree", N_("Free High Memory") }, - { "LowTotal", N_("Low Memory") }, - { "LowFree", N_("Free Low Memory") }, - { "SwapTotal", N_("Virtual Memory") }, - { "SwapFree", N_("Free Virtual Memory") }, - { NULL }, - }; - gint i; - - memlabels = g_hash_table_new(g_str_hash, g_str_equal); - - for (i = 0; proc2real[i].proc_label; i++) { - g_hash_table_insert(memlabels, proc2real[i].proc_label, - _(proc2real[i].real_label)); - } -} diff --git a/modules/devices/dmi.c b/modules/devices/dmi.c deleted file mode 100644 index b25cfe21..00000000 --- a/modules/devices/dmi.c +++ /dev/null @@ -1,140 +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 - */ -/* - * DMI support based on patch by Stewart Adam <s.adam@diffingo.com> - */ -#include <unistd.h> -#include <sys/types.h> - -#include "devices.h" -#include "dmi_util.h" - -typedef struct _DMIInfo DMIInfo; - -struct _DMIInfo { - const gchar *name; - const gchar *id_str; - int group; -}; - -DMIInfo dmi_info_table[] = { - { 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; - -static void add_to_moreinfo(const char *group, const char *key, char *value) -{ - char *new_key = g_strconcat("DMI:", group, ":", key, NULL); - moreinfo_add_with_prefix("DEV", new_key, g_strdup(g_strstrip(value))); -} - -gboolean dmi_get_info() -{ - const gchar *group = NULL; - DMIInfo *info; - gboolean dmi_succeeded = FALSE; - gint i; - gchar *value; - - 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->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); - - if (value != NULL) { - add_to_moreinfo(group, info->name, value); - - const gchar *url = vendor_get_url(value); - if (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), - value); - } - dmi_succeeded = TRUE; - } else { - dmi_info = h_strdup_cprintf("%s=%s\n", - dmi_info, - _(info->name), - (getuid() == 0) - ? _("(Not available)") - : _("(Not available; Perhaps try running HardInfo as root.)") ); - } - } - } - - if (!dmi_succeeded) { - g_free(dmi_info); - dmi_info = NULL; - } - - return dmi_succeeded; -} - -void __scan_dmi() -{ - gboolean dmi_ok; - - dmi_ok = dmi_get_info(); - - if (!dmi_ok) { - dmi_info = g_strdup("[No DMI information]\n" - "There was an error retrieving the information.=\n" - "Please try running HardInfo as root.=\n"); - } -} diff --git a/modules/devices/ia64/processor.c b/modules/devices/ia64/processor.c deleted file mode 100644 index c4d06a71..00000000 --- a/modules/devices/ia64/processor.c +++ /dev/null @@ -1,215 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "devices.h" -#include "cpu_util.h" - -GSList * -processor_scan(void) -{ - GSList *procs = NULL; - Processor *processor = NULL; - FILE *cpuinfo; - gchar buffer[128]; - gchar *rep_pname = NULL; - GSList *pi = NULL; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - -#define CHECK_FOR(k) (g_str_has_prefix(tmp[0], k)) - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - } else { - g_strfreev(tmp); - continue; - } - - get_str("Processor", rep_pname); - - if ( CHECK_FOR("processor") ) { - /* finish previous */ - if (processor) { - procs = g_slist_append(procs, processor); - } - - /* start next */ - processor = g_new0(Processor, 1); - processor->id = atol(tmp[1]); - - if (rep_pname) - processor->model_name = g_strdup(rep_pname); - - g_strfreev(tmp); - continue; - } - - if (!processor && - ( CHECK_FOR("vendor") - || CHECK_FOR("arch") - || CHECK_FOR("family") ) ) { - - /* single proc/core may not have "processor : n" */ - processor = g_new0(Processor, 1); - processor->id = 0; - - if (rep_pname) - processor->model_name = g_strdup(rep_pname); - } - - if (processor) { - get_str("vendor", processor->vendor_id); - get_str("archrev", processor->archrev); - get_str("arch", processor->arch); - get_str("family", processor->family); - get_str("features", processor->features); - get_int("model", processor->model); - get_int("revision", processor->revision); - get_float("BogoMIPS", processor->bogomips); - get_float("cpu MHz", processor->cpu_mhz); - get_int("cpu regs", processor->cpu_regs); - } - g_strfreev(tmp); - } - - if (processor) - procs = g_slist_append(procs, processor); - - g_free(rep_pname); - fclose(cpuinfo); - - /* TODO: redup */ - - /* data not from /proc/cpuinfo */ - for (pi = procs; pi; pi = pi->next) { - processor = (Processor *) pi->data; - - /* strings can't be null or segfault later */ - STRIFNULL(processor->model_name, _("IA64 Processor") ); - UNKIFNULL(processor->vendor_id); - STRIFNULL(processor->arch, "IA-64"); - STRIFNULL(processor->archrev, "0"); - UNKIFNULL(processor->family); - UNKIFNULL(processor->features); - - /* topo & freq */ - processor->cpufreq = cpufreq_new(processor->id); - processor->cputopo = cputopo_new(processor->id); - - if (processor->cpufreq->cpukhz_max) - processor->cpu_mhz = processor->cpufreq->cpukhz_max / 1000; - - } - - return procs; -} - -gchar *processor_name(GSList * processors) { - return processor_name_default(processors); -} - -gchar *processor_describe(GSList * processors) { - return processor_describe_default(processors); -} - -gchar * -processor_get_detailed_info(Processor *processor) -{ - gchar *tmp_cpufreq, *tmp_topology, *ret; - - tmp_topology = cputopo_section_str(processor->cputopo); - tmp_cpufreq = cpufreq_section_str(processor->cpufreq); - - ret = g_strdup_printf("[%s]\n" - "%s=%s\n" /* name */ - "%s=%s\n" /* vendor */ - "%s=%s\n" /* arch */ - "%s=%s\n" /* archrev */ - "%s=%s\n" /* family */ - "%s=%d\n" /* model no. */ - "%s=%d\n" /* revision */ - "%s=%.2f %s\n" /* frequency */ - "%s=%.2f\n" /* bogomips */ - "%s=%s\n" /* byte order */ - "%s=%d\n" /* regs */ - "%s=%s\n" /* features */ - "%s" /* topology */ - "%s" /* frequency scaling */ - "%s",/* empty */ - _("Processor"), - _("Name"), processor->model_name, - _("Vendor"), processor->vendor_id, - _("Architecture"), processor->arch, - _("Architecture Revision"), processor->archrev, - _("Family"), processor->family, - _("Model"), processor->model, - _("Revision"), processor->revision, - _("Frequency"), processor->cpu_mhz, _("MHz"), - _("BogoMips"), processor->bogomips, - _("Byte Order"), byte_order_str(), - _("CPU regs"), processor->cpu_regs, - _("Features"), processor->features, - tmp_topology, - tmp_cpufreq, - ""); - g_free(tmp_cpufreq); - g_free(tmp_topology); - return ret; -} - -gchar *processor_get_info(GSList * processors) -{ - Processor *processor; - - if (g_slist_length(processors) > 1) { - gchar *ret, *tmp, *hashkey; - GSList *l; - - tmp = g_strdup(""); - - for (l = processors; l; l = l->next) { - processor = (Processor *) l->data; - - tmp = g_strdup_printf("%s$CPU%d$%s=%.2f %s\n", - tmp, processor->id, - processor->model_name, - processor->cpu_mhz, _("MHz")); - - hashkey = g_strdup_printf("CPU%d", processor->id); - moreinfo_add_with_prefix("DEV", hashkey, - processor_get_detailed_info(processor)); - g_free(hashkey); - } - - ret = g_strdup_printf("[$ShellParam$]\n" - "ViewType=1\n" - "[Processors]\n" - "%s", tmp); - g_free(tmp); - - return ret; - } - - processor = (Processor *) processors->data; - return processor_get_detailed_info(processor); -} diff --git a/modules/devices/inputdevices.c b/modules/devices/inputdevices.c deleted file mode 100644 index cf1728a9..00000000 --- a/modules/devices/inputdevices.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <string.h> - -#include "hardinfo.h" -#include "devices.h" - -gchar *input_icons = NULL; - -static struct { - char *name; - char *icon; -} input_devices[] = { - { "Keyboard", "keyboard.png" }, - { "Joystick", "joystick.png" }, - { "Mouse", "mouse.png" }, - { "Speaker", "audio.png" }, - { "Unknown", "module.png" }, -}; - -void -__scan_input_devices(void) -{ - FILE *dev; - gchar buffer[1024]; - gchar *tmp, *name = NULL, *phys = NULL; - gint bus = 0, vendor = 0, product = 0, version = 0; - int d = 0, n = 0; - - dev = fopen("/proc/bus/input/devices", "r"); - if (!dev) - return; - - if (input_list) { - moreinfo_del_with_prefix("DEV:INP"); - g_free(input_list); - g_free(input_icons); - } - input_list = g_strdup(""); - input_icons = g_strdup(""); - - while (fgets(buffer, sizeof(buffer), dev)) { - tmp = buffer; - - switch (*tmp) { - case 'N': - tmp = strreplacechr(tmp + strlen("N: Name="), "=", ':'); - name = g_strdup(tmp); - remove_quotes(name); - break; - case 'P': - phys = g_strdup(tmp + strlen("P: Phys=")); - break; - case 'I': - sscanf(tmp, "I: Bus=%x Vendor=%x Product=%x Version=%x", - &bus, &vendor, &product, &version); - break; - case 'H': - if (strstr(tmp, "kbd")) - d = 0; //INPUT_KEYBOARD; - else if (strstr(tmp, "js")) - d = 1; //INPUT_JOYSTICK; - else if (strstr(tmp, "mouse")) - d = 2; //INPUT_MOUSE; - else - d = 4; //INPUT_UNKNOWN; - break; - case '\n': - if (name && strstr(name, "PC Speaker")) { - d = 3; // INPUT_PCSPKR - } - - tmp = g_strdup_printf("INP%d", ++n); - input_list = h_strdup_cprintf("$%s$%s=\n", - input_list, - tmp, name); - input_icons = h_strdup_cprintf("Icon$%s$%s=%s\n", - input_icons, - tmp, name, - input_devices[d].icon); - - const gchar *v_url = (gchar*)vendor_get_url(name); - const gchar *v_name = (gchar*)vendor_get_name(name); - gchar *v_str = NULL; - if (v_url != NULL) - v_str = g_strdup_printf("[0x%x] %s (%s)", vendor, v_name, v_url); - else - v_str = g_strdup_printf("0x%x", vendor); - v_str = hardinfo_clean_value(v_str, 1); - name = hardinfo_clean_value(name, 1); - - gchar *strhash = g_strdup_printf("[%s]\n" - /* Name */ "%s=%s\n" - /* Type */ "%s=%s\n" - /* Bus */ "%s=0x%x\n" - /* Vendor */ "%s=%s\n" - /* Product */"%s=0x%x\n" - /* Version */"%s=0x%x\n", - _("Device Information"), - _("Name"), name, - _("Type"), input_devices[d].name, - _("Bus"), bus, - _("Vendor"), v_str, - _("Product"), product, - _("Version"), version ); - - if (phys && phys[1] != 0) { - strhash = h_strdup_cprintf("%s=%s\n", strhash, _("Connected to"), phys); - } - - if (phys && strstr(phys, "ir")) { - strhash = h_strdup_cprintf("%s=%s\n", strhash, _("InfraRed port"), _("Yes") ); - } - - moreinfo_add_with_prefix("DEV", tmp, strhash); - g_free(tmp); - g_free(v_str); - g_free(phys); - g_free(name); - } - } - - fclose(dev); -} diff --git a/modules/devices/m68k/processor.c b/modules/devices/m68k/processor.c deleted file mode 100644 index e030732a..00000000 --- a/modules/devices/m68k/processor.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "devices.h" -#include "cpu_util.h" - -GSList * -processor_scan(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("CPU", processor->model_name); - get_str("MMU", processor->mmu_name); - get_str("FPU", processor->fpu_name); - get_float("Clocking", processor->cpu_mhz); - get_float("BogoMips", processor->bogomips); - get_str("Calibration", processor->calibration); - } - g_strfreev(tmp); - } - - gchar *tmp; - tmp = g_strconcat("Motorola ", processor->model_name, NULL); - g_free(processor->model_name); - processor->model_name = tmp; - - fclose(cpuinfo); - - return g_slist_append(NULL, processor); -} - -gchar *processor_name(GSList * processors) { - return processor_name_default(processors); -} - -gchar *processor_describe(GSList * processors) { - return processor_describe_default(processors); -} - -gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[%s]\n" - "%s=%s\n" /* cpu */ - "%s=%s\n" /* mmu */ - "%s=%s\n" /* fpu */ - "%s=%.2f %s\n" /* frequency */ - "%s=%.2f\n" /* bogomips */ - "%s=%s\n" /* byte order */ - "%s=%s\n", /* calibration */ - _("Processor"), - _("Model"), processor->model_name, - _("MMU"), processor->mmu_name, - _("FPU"), processor->fpu_name, - _("Frequency"), processor->cpu_mhz, _("MHz"), - _("BogoMips"), processor->bogomips, - _("Byte Order"), byte_order_str(), - _("Calibration"), processor->calibration - ); -} diff --git a/modules/devices/mips/processor.c b/modules/devices/mips/processor.c deleted file mode 100644 index b31af7dd..00000000 --- a/modules/devices/mips/processor.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "devices.h" -#include "cpu_util.h" - -GSList * -processor_scan(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("system type", processor->vendor_id); - get_str("cpu model", processor->model_name); - get_float("cpu MHz", processor->cpu_mhz); - get_float("BogoMIPS", processor->bogomips); - } - g_strfreev(tmp); - } - - fclose(cpuinfo); - - return g_slist_append(NULL, processor); -} - -gchar *processor_name(GSList * processors) { - return processor_name_default(processors); -} - -gchar *processor_describe(GSList * processors) { - return processor_describe_default(processors); -} - -gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[%s]\n" - "%s=%s\n" - "%s=%s\n" - "%s=%.2f %s\n" /* frequency */ - "%s=%.2f\n" /* bogomips */ - "%s=%s\n", /* byte order */ - _("Processor"), - _("Model"), processor->model_name, - _("System Type"), processor->vendor_id, - _("Frequency"), processor->cpu_mhz, _("MHz"), - _("BogoMips"), processor->bogomips, - _("Byte Order"), byte_order_str() - ); -} diff --git a/modules/devices/parisc/processor.c b/modules/devices/parisc/processor.c deleted file mode 100644 index 9ca38d12..00000000 --- a/modules/devices/parisc/processor.c +++ /dev/null @@ -1,210 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "devices.h" -#include "cpu_util.h" - -GSList * -processor_scan(void) -{ - GSList *procs = NULL; - Processor *processor = NULL; - FILE *cpuinfo; - gchar buffer[128]; - gchar *rep_pname = NULL; - GSList *pi = NULL; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - -#define CHECK_FOR(k) (g_str_has_prefix(tmp[0], k)) - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - } else { - g_strfreev(tmp); - continue; - } - - get_str("Processor", rep_pname); - - if ( CHECK_FOR("processor") ) { - /* finish previous */ - if (processor) { - procs = g_slist_append(procs, processor); - } - - /* start next */ - processor = g_new0(Processor, 1); - processor->id = atol(tmp[1]); - - if (rep_pname) - processor->model_name = g_strdup(rep_pname); - - g_strfreev(tmp); - continue; - } - - if (!processor && - ( CHECK_FOR("cpu family") - || CHECK_FOR("cpu MHz") - || CHECK_FOR("cpu") ) ) { - - /* single proc/core may not have "processor : n" */ - processor = g_new0(Processor, 1); - processor->id = 0; - - if (rep_pname) - processor->model_name = g_strdup(rep_pname); - } - - if (processor) { - get_str("cpu family", processor->cpu_family); - get_float("cpu MHz", processor->cpu_mhz); - get_str("cpu", processor->model_name); - get_float("bogomips", processor->bogomips); - get_str("model name", processor->strmodel); - get_str("I-cache", processor->icache_str); - get_str("D-cache", processor->dcache_str); - get_str("hversion", processor->hversion); - get_str("sversion", processor->sversion); - } - g_strfreev(tmp); - } - - if (processor) - procs = g_slist_append(procs, processor); - - g_free(rep_pname); - fclose(cpuinfo); - - /* TODO: redup */ - - /* data not from /proc/cpuinfo */ - for (pi = procs; pi; pi = pi->next) { - processor = (Processor *) pi->data; - - /* strings can't be null or segfault later */ - STRIFNULL(processor->model_name, _("PA-RISC Processor") ); - STRIFNULL(processor->cpu_family, "PA-RISC"); - UNKIFNULL(processor->strmodel); - - /* topo & freq */ - processor->cpufreq = cpufreq_new(processor->id); - processor->cputopo = cputopo_new(processor->id); - - if (processor->cpufreq->cpukhz_max) - processor->cpu_mhz = processor->cpufreq->cpukhz_max / 1000; - - } - - return procs; -} - -gchar *processor_name(GSList * processors) { - return processor_name_default(processors); -} - -gchar *processor_describe(GSList * processors) { - return processor_describe_default(processors); -} - -gchar * -processor_get_detailed_info(Processor *processor) -{ - gchar *tmp_cpufreq, *tmp_topology, *ret; - - tmp_topology = cputopo_section_str(processor->cputopo); - tmp_cpufreq = cpufreq_section_str(processor->cpufreq); - - ret = g_strdup_printf("[%s]\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" /* model name */ - "%s=%.2f %s\n" /* frequency */ - "%s=%.2f\n" /* bogomips */ - "%s=%s\n" /* byte order */ - "%s=%s\n" /* hversion */ - "%s=%s\n" /* sversion */ - "[%s]\n" - "I-Cache=%s\n" - "D-Cache=%s\n" - "%s" /* topology */ - "%s" /* frequency scaling */ - "%s",/* empty */ - _("Processor"), - _("Model"), processor->model_name, - _("Architecture"), processor->cpu_family, - _("System"), processor->strmodel, - _("Frequency"), processor->cpu_mhz, _("MHz"), - _("BogoMips"), processor->bogomips, - _("Byte Order"), byte_order_str(), - _("HVersion"), processor->hversion, - _("SVersion"), processor->sversion, - _("Cache"), - processor->icache_str, - processor->dcache_str, - tmp_topology, - tmp_cpufreq, - ""); - - g_free(tmp_cpufreq); - g_free(tmp_topology); - return ret; -} - -gchar *processor_get_info(GSList * processors) -{ - Processor *processor; - - if (g_slist_length(processors) > 1) { - gchar *ret, *tmp, *hashkey; - GSList *l; - - tmp = g_strdup(""); - - for (l = processors; l; l = l->next) { - processor = (Processor *) l->data; - - tmp = g_strdup_printf("%s$CPU%d$%s=%.2f %s\n", - tmp, processor->id, - processor->model_name, - processor->cpu_mhz, _("MHz")); - - hashkey = g_strdup_printf("CPU%d", processor->id); - moreinfo_add_with_prefix("DEV", hashkey, - processor_get_detailed_info(processor)); - g_free(hashkey); - } - - ret = g_strdup_printf("[$ShellParam$]\n" - "ViewType=1\n" - "[Processors]\n" - "%s", tmp); - g_free(tmp); - - return ret; - } - - processor = (Processor *) processors->data; - return processor_get_detailed_info(processor); -} diff --git a/modules/devices/pci.c b/modules/devices/pci.c deleted file mode 100644 index c1965a63..00000000 --- a/modules/devices/pci.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* - * TODO: This thing must be rewritten. We really should have a struct with all the - * PCI stuff we'll present to the user, and hash them by the PCI ID - * (domain:bus:device.function). - * This way we'll have ways to better organize the output, instead of relying - * on the order the information appears on lspci's output. - * Also, the "Resources" thing might be better implemented (and we won't need - * copies of information scattered everywhere like we do today). - */ - -#include <string.h> - -#include "hardinfo.h" -#include "devices.h" - -GHashTable *_pci_devices = NULL; - -void -scan_pci_do(void) -{ - FILE *lspci; - gchar buffer[256], *buf, *strhash = NULL, *strdevice = NULL; - gchar *category = NULL, *name = NULL, *icon, *lspci_path, *command_line = NULL; - gint n = 0, x = 0; - - if ((lspci_path = find_program("lspci")) == NULL) { - goto pci_error; - } else { - command_line = g_strdup_printf("%s -v", lspci_path); - } - - if (!_pci_devices) { - _pci_devices = g_hash_table_new(g_str_hash, g_str_equal); - } - - buf = g_build_filename(g_get_home_dir(), ".hardinfo", "pci.ids", NULL); - if (!g_file_test(buf, G_FILE_TEST_EXISTS)) { - DEBUG("using system-provided PCI IDs"); - g_free(buf); - if (!(lspci = popen(command_line, "r"))) { - goto pci_error; - } - } else { - gchar *tmp; - - tmp = g_strdup_printf("%s -i '%s'", command_line, buf); - g_free(buf); - buf = tmp; - - DEBUG("using updated PCI IDs (from %s)", buf); - if (!(lspci = popen(tmp, "r"))) { - g_free(buf); - goto pci_error; - } else { - g_free(buf); - } - } - - while (fgets(buffer, 256, lspci)) { - buf = g_strstrip(buffer); - - if (!strncmp(buf, "Flags", 5)) { - gint irq = 0, freq = 0, latency = 0, i; - gchar **list; - gboolean bus_master; - - buf += 7; - - bus_master = FALSE; - - list = g_strsplit(buf, ", ", 10); - for (i = 0; i <= 10; i++) { - if (!list[i]) - break; - - if (!strncmp(list[i], "IRQ", 3)) - sscanf(list[i], "IRQ %d", &irq); - else if (strstr(list[i], "Mhz")) - sscanf(list[i], "%dMhz", &freq); - else if (!strncmp(list[i], "bus master", 10)) - bus_master = TRUE; - else if (!strncmp(list[i], "latency", 7)) - sscanf(list[i], "latency %d", &latency); - } - g_strfreev(list); - - if (irq) - strdevice = h_strdup_cprintf("%s=%d\n", strdevice, _("IRQ"), irq); - if (freq) - strdevice = h_strdup_cprintf("%s=%d %s\n", strdevice, _("Frequency"), freq, _("MHz") ); - if (latency) - strdevice = h_strdup_cprintf("%s=%d\n", strdevice, _("Latency"), latency); - - strdevice = h_strdup_cprintf("%s=%s\n", strdevice, _("Bus Master"), bus_master ? _("Yes") : _("No") ); - } else if (!strncmp(buf, "Kernel modules", 14)) { - WALK_UNTIL(' '); - WALK_UNTIL(':'); - buf++; - - strdevice = h_strdup_cprintf("%s=%s\n", strdevice, _("Kernel modules"), buf); - } else if (!strncmp(buf, "Subsystem", 9)) { - WALK_UNTIL(' '); - buf++; - const gchar *oem_vendor_url = vendor_get_url(buf); - if (oem_vendor_url) - strdevice = h_strdup_cprintf(_("%s=%s (%s)\n"), - strdevice, - _("OEM Vendor"), - vendor_get_name(buf), - oem_vendor_url); - } else if (!strncmp(buf, "Capabilities", 12) - && !strstr(buf, "only to root") && - !strstr(buf, "access denied")) { - WALK_UNTIL(' '); - WALK_UNTIL(']'); - buf++; - strdevice = h_strdup_cprintf("Capability#%d=%s\n", strdevice, ++x, buf); - } else if (!strncmp(buf, "Memory at", 9) && strstr(buf, "[size=")) { - gint mem; - gchar unit; - gboolean prefetch; - gboolean _32bit; - - prefetch = strstr(buf, "non-prefetchable") ? FALSE : TRUE; - _32bit = strstr(buf, "32-bit") ? TRUE : FALSE; - - WALK_UNTIL('['); - sscanf(buf, "[size=%d%c", &mem, &unit); - - strdevice = h_strdup_cprintf("%s#%d=%d%cB (%s%s)\n", - strdevice, _("Memory"), ++x, - mem, - (unit == ']') ? ' ' : unit, - _32bit ? "32-bit, " : "", - prefetch ? _("prefetchable") : - _("non-prefetchable") ); - - } else if (!strncmp(buf, "I/O ports at", 12)) { - guint io_addr, io_size; - - sscanf(buf, "I/O ports at %x [size=%d]", &io_addr, &io_size); - - strdevice = - h_strdup_cprintf("%s#%d=0x%x - 0x%x\n", - strdevice, _("I/O ports at"), ++x, io_addr, - io_addr + io_size - 1); - } else if ((buf[0] >= '0' && buf[0] <= '9') && (buf[4] == ':' || buf[2] == ':')) { - gint bus, device, function, domain; - gpointer start, end; - - if (strdevice != NULL && strhash != NULL) { - moreinfo_add_with_prefix("DEV", strhash, strdevice); - g_free(strhash); - g_free(category); - g_free(name); - } - - if (buf[4] == ':') { - sscanf(buf, "%x:%x:%x.%d", &domain, &bus, &device, &function); - } else { - /* lspci without domain field */ - sscanf(buf, "%x:%x.%x", &bus, &device, &function); - domain = 0; - } - - WALK_UNTIL(' '); - - start = buf; - - WALK_UNTIL(':'); - end = buf + 1; - *buf = 0; - - buf = start + 1; - category = g_strdup(buf); - - buf = end; - - if (strstr(category, "RAM memory")) icon = "mem"; - else if (strstr(category, "Multimedia")) icon = "media"; - else if (strstr(category, "USB")) icon = "usb"; - else icon = "pci"; - - name = g_strdup(buf); - g_hash_table_insert(_pci_devices, - g_strdup_printf("0000:%02x:%02x.%x", bus, device, function), - name); - - strhash = g_strdup_printf("PCI%d", n); - strdevice = g_strdup_printf("[%s]\n" - /* Name */ "%s=%s\n" - /* Class */ "%s=%s\n" - /* Domain */ "%s=%d\n" - /* Bus, device, function */ - "%s=%d, %d, %d\n", - _("Device Information"), - _("Name"), name, - _("Class"), category, - _("Domain"), domain, - _("Bus, device, function"), - bus, device, function); - - const gchar *url = vendor_get_url(name); - if (url) { - strdevice = h_strdup_cprintf("%s=%s (%s)\n", - strdevice, - _("Vendor"), - vendor_get_name(name), - url); - } - - g_hash_table_insert(_pci_devices, - g_strdup_printf("0000:%02x:%02x.%x", bus, device, function), - g_strdup(name)); - - pci_list = h_strdup_cprintf("$PCI%d$%s=%s\n", pci_list, n, category, name); - - n++; - } - } - - if (pclose(lspci)) { -pci_error: - /* error (no pci, perhaps?) */ - pci_list = g_strconcat(pci_list, _("No PCI devices found"), "=\n", NULL); - } else if (strhash) { - /* insert the last device */ - moreinfo_add_with_prefix("DEV", strhash, strdevice); - g_free(strhash); - g_free(category); - g_free(name); - } - - g_free(lspci_path); - g_free(command_line); -} diff --git a/modules/devices/ppc/processor.c b/modules/devices/ppc/processor.c deleted file mode 100644 index 3360a136..00000000 --- a/modules/devices/ppc/processor.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "devices.h" -#include "cpu_util.h" - -GSList * -processor_scan(void) -{ - GSList *procs = NULL; - Processor *processor = NULL; - FILE *cpuinfo; - gchar buffer[128]; - gchar *rep_pname = NULL; - GSList *pi = NULL; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - -#define CHECK_FOR(k) (g_str_has_prefix(tmp[0], k)) - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - } else { - g_strfreev(tmp); - continue; - } - - get_str("Processor", rep_pname); - - if ( CHECK_FOR("processor") ) { - /* finish previous */ - if (processor) { - procs = g_slist_append(procs, processor); - } - - /* start next */ - processor = g_new0(Processor, 1); - processor->id = atol(tmp[1]); - - if (rep_pname) - processor->model_name = g_strdup(rep_pname); - - g_strfreev(tmp); - continue; - } - - if (!processor && - ( CHECK_FOR("cpu") - || CHECK_FOR("clock") - || CHECK_FOR("revision") ) ) { - - /* single proc/core may not have "processor : n" */ - processor = g_new0(Processor, 1); - processor->id = 0; - - if (rep_pname) - processor->model_name = g_strdup(rep_pname); - } - - if (processor) { - get_str("cpu", processor->model_name); - get_str("revision", processor->revision); - get_float("clock", processor->cpu_mhz); - get_float("BogoMIPS", processor->bogomips); - } - g_strfreev(tmp); - } - - if (processor) - procs = g_slist_append(procs, processor); - - g_free(rep_pname); - fclose(cpuinfo); - - /* re-duplicate missing data for /proc/cpuinfo variant that de-duplicated it */ -#define REDUP(f) if (dproc->f && !processor->f) processor->f = g_strdup(dproc->f); - Processor *dproc; - GSList *l; - l = procs = g_slist_reverse(procs); - while (l) { - processor = l->data; - if (processor->model_name) { - dproc = processor; - } else if (dproc) { - REDUP(model_name); - REDUP(revision); - } - l = g_slist_next(l); - } - procs = g_slist_reverse(procs); - - /* data not from /proc/cpuinfo */ - for (pi = procs; pi; pi = pi->next) { - processor = (Processor *) pi->data; - - /* strings can't be null or segfault later */ - STRIFNULL(processor->model_name, _("POWER Processor") ); - UNKIFNULL(processor->revision); - - /* topo & freq */ - processor->cpufreq = cpufreq_new(processor->id); - processor->cputopo = cputopo_new(processor->id); - - if (processor->cpufreq->cpukhz_max) - processor->cpu_mhz = processor->cpufreq->cpukhz_max / 1000; - - } - - return procs; -} - -gchar *processor_name(GSList * processors) { - return processor_name_default(processors); -} - -gchar *processor_describe(GSList * processors) { - return processor_describe_default(processors); -} - -gchar * -processor_get_detailed_info(Processor *processor) -{ - gchar *tmp_cpufreq, *tmp_topology, *ret; - - tmp_topology = cputopo_section_str(processor->cputopo); - tmp_cpufreq = cpufreq_section_str(processor->cpufreq); - - ret = g_strdup_printf("[%s]\n" - "%s=%s\n" /* model */ - "%s=%s\n" /* revision */ - "%s=%.2f %s\n" /* frequency */ - "%s=%.2f\n" /* bogomips */ - "%s=%s\n" /* byte order */ - "%s" /* topology */ - "%s" /* frequency scaling */ - "%s",/* empty */ - _("Processor"), - _("Model"), processor->model_name, - _("Revision"), processor->revision, - _("Frequency"), processor->cpu_mhz, _("MHz"), - _("BogoMips"), processor->bogomips, - _("Byte Order"), byte_order_str(), - tmp_topology, - tmp_cpufreq, - ""); - g_free(tmp_cpufreq); - g_free(tmp_topology); - return ret; -} - -gchar *processor_get_info(GSList * processors) -{ - Processor *processor; - - if (g_slist_length(processors) > 1) { - gchar *ret, *tmp, *hashkey; - GSList *l; - - tmp = g_strdup(""); - - for (l = processors; l; l = l->next) { - processor = (Processor *) l->data; - - tmp = g_strdup_printf("%s$CPU%d$%s=%.2f %s\n", - tmp, processor->id, - processor->model_name, - processor->cpu_mhz, _("MHz")); - - hashkey = g_strdup_printf("CPU%d", processor->id); - moreinfo_add_with_prefix("DEV", hashkey, - processor_get_detailed_info(processor)); - g_free(hashkey); - } - - ret = g_strdup_printf("[$ShellParam$]\n" - "ViewType=1\n" - "[Processors]\n" - "%s", tmp); - g_free(tmp); - - return ret; - } - - processor = (Processor *) processors->data; - return processor_get_detailed_info(processor); -} diff --git a/modules/devices/printers.c b/modules/devices/printers.c deleted file mode 100644 index 77b52a43..00000000 --- a/modules/devices/printers.c +++ /dev/null @@ -1,266 +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 - */ - -#include <stdio.h> -#include <stdlib.h> -#include <time.h> - -#include "devices.h" - -typedef struct _CUPSDest CUPSDest; -typedef struct _CUPSOption CUPSOption; - -struct _CUPSOption { - char *name, *value; -}; - -struct _CUPSDest { - char *name, *instance; - int is_default; - int num_options; - CUPSOption *options; -}; - -static int (*cups_dests_get) (CUPSDest **dests) = NULL; -static int (*cups_dests_free) (int num_dests, CUPSDest *dests) = NULL; -static gboolean cups_init = FALSE; - -GModule *cups; - -void -init_cups(void) -{ - const char *libcups[] = { "libcups", "libcups.so", "libcups.so.1", "libcups.so.2", NULL }; - - if (!(cups_dests_get && cups_dests_free)) { - int i; - - for (i = 0; libcups[i] != NULL; i++) { - cups = g_module_open(libcups[i], G_MODULE_BIND_LAZY); - if (cups) - break; - } - - if (!cups) { - cups_init = FALSE; - return; - } - - if (!g_module_symbol(cups, "cupsGetDests", (gpointer) & cups_dests_get) - || !g_module_symbol(cups, "cupsFreeDests", (gpointer) & cups_dests_free)) { - g_module_close(cups); - cups_init = FALSE; - } - } - - cups_init = TRUE; -} - -gchar *__cups_callback_ptype(gchar *strvalue) -{ - if (strvalue) { - unsigned value = atoi(strvalue); - gchar *output = g_strdup("\n"); - - if (value & 0x0004) - output = h_strdup_cprintf(_("\342\232\254 Can do black and white printing=\n"), output); - if (value & 0x0008) - output = h_strdup_cprintf(_("\342\232\254 Can do color printing=\n"), output); - if (value & 0x0010) - output = h_strdup_cprintf(_("\342\232\254 Can do duplexing=\n"), output); - if (value & 0x0020) - output = h_strdup_cprintf(_("\342\232\254 Can do staple output=\n"), output); - if (value & 0x0040) - output = h_strdup_cprintf(_("\342\232\254 Can do copies=\n"), output); - if (value & 0x0080) - output = h_strdup_cprintf(_("\342\232\254 Can collate copies=\n"), output); - if (value & 0x80000) - output = h_strdup_cprintf(_("\342\232\254 Printer is rejecting jobs=\n"), output); - if (value & 0x1000000) - output = h_strdup_cprintf(_("\342\232\254 Printer was automatically discovered and added=\n"), output); - - return output; - } else { - return g_strdup(_("Unknown")); - } -} - -gchar *__cups_callback_state(gchar *value) -{ - if (!value) { - return g_strdup(_("Unknown")); - } - - if (g_str_equal(value, "3")) { - return g_strdup(_("Idle")); - } else if (g_str_equal(value, "4")) { - return g_strdup(_("Printing a Job")); - } else if (g_str_equal(value, "5")) { - return g_strdup(_("Stopped")); - } else { - return g_strdup(_("Unknown")); - } -} - -gchar *__cups_callback_state_change_time(gchar *value) -{ - struct tm tm; - char buf[255]; - - if (value) { - strptime(value, "%s", &tm); - strftime(buf, sizeof(buf), "%c", &tm); - - return g_strdup(buf); - } else { - return g_strdup(_("Unknown")); - } -} - -gchar *__cups_callback_boolean(gchar *value) -{ - if (value) { - return g_strdup(g_str_equal(value, "1") ? _("Yes") : _("No")); - } else { - return g_strdup(_("Unknown")); - } -} - -const struct { - char *key, *name; - gchar *(*callback)(gchar *value); -} cups_fields[] = { - { "Printer Information", NULL, NULL }, - { "printer-info", "Destination Name", NULL }, - { "printer-make-and-model", "Make and Model", NULL }, - - { "Capabilities", NULL, NULL }, - { "printer-type", "#", __cups_callback_ptype }, - - { "Printer State", NULL, NULL }, - { "printer-state", "State", __cups_callback_state }, - { "printer-state-change-time", "Change Time", __cups_callback_state_change_time }, - { "printer-state-reasons", "State Reasons" }, - - { "Sharing Information", NULL, NULL }, - { "printer-is-shared", "Shared?", __cups_callback_boolean }, - { "printer-location", "Physical Location" }, - { "auth-info-required", "Authentication Required", __cups_callback_boolean }, - - { "Jobs", NULL, NULL }, - { "job-hold-until", "Hold Until", NULL }, - { "job-priority", "Priority", NULL }, - { "printer-is-accepting-jobs", "Accepting Jobs", __cups_callback_boolean }, - - { "Media", NULL, NULL }, - { "media", "Media", NULL }, - { "finishings", "Finishings", NULL }, - { "copies", "Copies", NULL }, -}; - -void -scan_printers_do(void) -{ - int num_dests, i, j; - CUPSDest *dests; - gchar *prn_id, *prn_moreinfo; - - g_free(printer_list); - g_free(printer_icons); - - if (!cups_init) { - init_cups(); - - printer_icons = g_strdup(""); - printer_list = g_strdup(_("[Printers]\n" - "No suitable CUPS library found=")); - return; - } - - /* remove old devices from global device table */ - moreinfo_del_with_prefix("DEV:PRN"); - - num_dests = cups_dests_get(&dests); - if (num_dests > 0) { - printer_list = g_strdup_printf(_("[Printers (CUPS)]\n")); - printer_icons = g_strdup(""); - for (i = 0; i < num_dests; i++) { - GHashTable *options; - - options = g_hash_table_new(g_str_hash, g_str_equal); - - for (j = 0; j < dests[i].num_options; j++) { - g_hash_table_insert(options, - g_strdup(dests[i].options[j].name), - g_strdup(dests[i].options[j].value)); - } - - prn_id = g_strdup_printf("PRN%d", i); - - printer_list = h_strdup_cprintf("\n$%s$%s=%s\n", - printer_list, - prn_id, - dests[i].name, - dests[i].is_default ? "<i>Default</i>" : ""); - printer_icons = h_strdup_cprintf("\nIcon$%s$%s=printer.png", - printer_icons, - prn_id, - dests[i].name); - - prn_moreinfo = g_strdup(""); - for (j = 0; j < G_N_ELEMENTS(cups_fields); j++) { - if (!cups_fields[j].name) { - prn_moreinfo = h_strdup_cprintf("[%s]\n", - prn_moreinfo, - cups_fields[j].key); - } else { - gchar *temp; - - temp = g_hash_table_lookup(options, cups_fields[j].key); - - if (cups_fields[j].callback) { - temp = cups_fields[j].callback(temp); - } else { - if (temp) { - /* FIXME Do proper escaping */ - temp = g_strdup(strreplacechr(temp, "&=", ' ')); - } else { - temp = g_strdup(_("Unknown")); - } - } - - prn_moreinfo = h_strdup_cprintf("%s=%s\n", - prn_moreinfo, - cups_fields[j].name, - temp); - - g_free(temp); - } - } - - moreinfo_add_with_prefix("DEV", prn_id, prn_moreinfo); - g_free(prn_id); - g_hash_table_destroy(options); - } - - cups_dests_free(num_dests, dests); - } else { - printer_list = g_strdup(_("[Printers]\n" - "No printers found=\n")); - } -} diff --git a/modules/devices/resources.c b/modules/devices/resources.c deleted file mode 100644 index 15cb8f21..00000000 --- a/modules/devices/resources.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <string.h> - -#include "devices.h" - -static gchar *_resources = NULL; -static gboolean _require_root = FALSE; - -#if GLIB_CHECK_VERSION(2,14,0) -static GRegex *_regex_pci = NULL, - *_regex_module = NULL; - -static gchar *_resource_obtain_name(gchar *name) -{ - gchar *temp; - - if (!_regex_pci && !_regex_module) { - _regex_pci = g_regex_new("^[0-9a-fA-F]{4}:[0-9a-fA-F]{2}:" - "[0-9a-fA-F]{2}\\.[0-9a-fA-F]{1}$", - 0, 0, NULL); - _regex_module = g_regex_new("^[0-9a-zA-Z\\_\\-]+$", 0, 0, NULL); - } - - name = g_strstrip(name); - - if (g_regex_match(_regex_pci, name, 0, NULL)) { - temp = module_call_method_param("devices::getPCIDeviceDescription", name); - if (temp) { - return g_strdup_printf("<b><small>PCI</small></b> %s", (gchar *)idle_free(temp)); - } - } else if (g_regex_match(_regex_module, name, 0, NULL)) { - temp = module_call_method_param("computer::getKernelModuleDescription", name); - if (temp) { - return g_strdup_printf("<b><small>Module</small></b> %s", (gchar *)idle_free(temp)); - } - } - - return g_strdup(name); -} -#else -static gchar *_resource_obtain_name(gchar *name) -{ - return g_strdup(name); -} -#endif - -void scan_device_resources(gboolean reload) -{ - SCAN_START(); - FILE *io; - gchar buffer[256]; - gint i; - gint zero_to_zero_addr = 0; - - struct { - gchar *file; - gchar *description; - } resources[] = { - { "/proc/ioports", "[I/O Ports]\n" }, - { "/proc/iomem", "[Memory]\n" }, - { "/proc/dma", "[DMA]\n" } - }; - - g_free(_resources); - _resources = g_strdup(""); - - for (i = 0; i < G_N_ELEMENTS(resources); i++) { - if ((io = fopen(resources[i].file, "r"))) { - _resources = h_strconcat(_resources, resources[i].description, NULL); - - while (fgets(buffer, 256, io)) { - gchar **temp = g_strsplit(buffer, ":", 2); - gchar *name = _resource_obtain_name(temp[1]); - - if (strstr(temp[0], "0000-0000")) - zero_to_zero_addr++; - - _resources = h_strdup_cprintf("<tt>%s</tt>=%s\n", _resources, - temp[0], name); - - g_strfreev(temp); - g_free(name); - } - - fclose(io); - } - } - - _require_root = zero_to_zero_addr > 16; - - SCAN_END(); -} - -gchar *callback_device_resources(void) -{ - return g_strdup(_resources); -} - -gboolean root_required_for_resources(void) -{ - return _require_root; -} diff --git a/modules/devices/riscv/processor.c b/modules/devices/riscv/processor.c deleted file mode 100644 index afddf89d..00000000 --- a/modules/devices/riscv/processor.c +++ /dev/null @@ -1,233 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* source: https://github.com/riscv/riscv-linux/blob/riscv-next/arch/riscv/kernel/cpu.c */ - -#include "hardinfo.h" -#include "devices.h" -#include "cpu_util.h" - -#include "riscv_data.h" -#include "riscv_data.c" - -GSList * -processor_scan(void) -{ - GSList *procs = NULL; - Processor *processor = NULL; - FILE *cpuinfo; - gchar buffer[128]; - gchar *rep_pname = NULL; - gchar *tmpfreq_str = NULL; - GSList *pi = NULL; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - -#define CHECK_FOR(k) (g_str_has_prefix(tmp[0], k)) - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - } else { - g_strfreev(tmp); - continue; - } - - //get_str("Processor", rep_pname); - - if ( CHECK_FOR("hart") ) { - /* finish previous */ - if (processor) { - procs = g_slist_append(procs, processor); - } - - /* start next */ - processor = g_new0(Processor, 1); - processor->id = atol(tmp[1]); - - if (rep_pname) - processor->model_name = g_strdup(rep_pname); - - g_strfreev(tmp); - continue; - } - - if (!processor && - ( CHECK_FOR("mmu") - || CHECK_FOR("isa") - || CHECK_FOR("uarch") ) ) { - - /* single proc/core may not have "hart : n" */ - processor = g_new0(Processor, 1); - processor->id = 0; - - if (rep_pname) - processor->model_name = g_strdup(rep_pname); - } - - if (processor) { - get_str("mmu", processor->mmu); - get_str("isa", processor->isa); - get_str("uarch", processor->uarch); - } - g_strfreev(tmp); - } - - if (processor) - procs = g_slist_append(procs, processor); - - g_free(rep_pname); - fclose(cpuinfo); - - /* TODO: redup */ - - /* data not from /proc/cpuinfo */ - for (pi = procs; pi; pi = pi->next) { - processor = (Processor *) pi->data; - - /* strings can't be null or segfault later */ - STRIFNULL(processor->model_name, _("RISC-V Processor") ); - UNKIFNULL(processor->mmu); - UNKIFNULL(processor->isa); - UNKIFNULL(processor->uarch); - - processor->flags = riscv_isa_to_flags(processor->isa); - - /* topo & freq */ - processor->cpufreq = cpufreq_new(processor->id); - processor->cputopo = cputopo_new(processor->id); - - if (processor->cpufreq->cpukhz_max) - processor->cpu_mhz = processor->cpufreq->cpukhz_max / 1000; - else - processor->cpu_mhz = 0.0f; - } - - return procs; -} - -gchar *processor_get_capabilities_from_flags(gchar * strflags) -{ - gchar **flags, **old; - gchar *tmp = NULL; - gint j = 0; - - flags = g_strsplit(strflags, " ", 0); - old = flags; - - while (flags[j]) { - const gchar *meaning = riscv_ext_meaning( flags[j] ); - - if (meaning) { - tmp = h_strdup_cprintf("%s=%s\n", tmp, flags[j], meaning); - } else { - tmp = h_strdup_cprintf("%s=\n", tmp, flags[j]); - } - j++; - } - if (tmp == NULL || g_strcmp0(tmp, "") == 0) - tmp = g_strdup_printf("%s=%s\n", "empty", _("Empty List")); - - g_strfreev(old); - return tmp; -} - -gchar *processor_name(GSList * processors) { - return processor_name_default(processors); -} - -gchar *processor_describe(GSList * processors) { - return processor_describe_default(processors); -} - -gchar * -processor_get_detailed_info(Processor *processor) -{ - gchar *tmp_flags, *tmp_cpufreq, *tmp_topology, *ret; - tmp_flags = processor_get_capabilities_from_flags(processor->flags); - tmp_topology = cputopo_section_str(processor->cputopo); - tmp_cpufreq = cpufreq_section_str(processor->cpufreq); - - ret = g_strdup_printf("[%s]\n" - "%s=%s\n" /* model */ - "%s=%s\n" /* isa */ - "%s=%s\n" /* uarch */ - "%s=%s\n" /* mmu */ - "%s=%.2f %s\n" /* frequency */ - "%s=%s\n" /* byte order */ - "%s" /* topology */ - "%s" /* frequency scaling */ - "[%s]\n" /* extensions */ - "%s" - "%s",/* empty */ - _("Processor"), - _("Model"), processor->model_name, - _("Architecture"), processor->isa, - _("uarch"), processor->uarch, - _("MMU"), processor->mmu, - _("Frequency"), processor->cpu_mhz, _("MHz"), - _("Byte Order"), byte_order_str(), - tmp_topology, - tmp_cpufreq, - _("Capabilities"), tmp_flags, - ""); - g_free(tmp_flags); - g_free(tmp_cpufreq); - g_free(tmp_topology); - return ret; -} - -gchar *processor_get_info(GSList * processors) -{ - Processor *processor; - - if (g_slist_length(processors) > 1) { - gchar *ret, *tmp, *hashkey; - GSList *l; - - tmp = g_strdup(""); - - for (l = processors; l; l = l->next) { - processor = (Processor *) l->data; - - tmp = g_strdup_printf("%s$CPU%d$%s=%.2f %s\n", - tmp, processor->id, - processor->model_name, - processor->cpu_mhz, _("MHz")); - - hashkey = g_strdup_printf("CPU%d", processor->id); - moreinfo_add_with_prefix("DEV", hashkey, - processor_get_detailed_info(processor)); - g_free(hashkey); - } - - ret = g_strdup_printf("[$ShellParam$]\n" - "ViewType=1\n" - "[Processors]\n" - "%s", tmp); - g_free(tmp); - - return ret; - } - - processor = (Processor *) processors->data; - return processor_get_detailed_info(processor); -} diff --git a/modules/devices/riscv/riscv_data.c b/modules/devices/riscv/riscv_data.c deleted file mode 100644 index 4ae68ef4..00000000 --- a/modules/devices/riscv/riscv_data.c +++ /dev/null @@ -1,212 +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 <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <ctype.h> -#include "riscv_data.h" - -#ifndef C_ -#define C_(Ctx, String) String -#endif -#ifndef NC_ -#define NC_(Ctx, String) String -#endif - -static struct { - char *name, *meaning; -} tab_ext_meaning[] = { - { "RV32", NC_("rv-ext", /*/ext:RV32*/ "RISC-V 32-bit") }, - { "RV64", NC_("rv-ext", /*/ext:RV64*/ "RISC-V 64-bit") }, - { "RV128", NC_("rv-ext", /*/ext:RV128*/ "RISC-V 128-bit") }, - { "E", NC_("rv-ext", /*/ext:E*/ "Base embedded integer instructions (15 registers)") }, - { "I", NC_("rv-ext", /*/ext:I*/ "Base integer instructions (31 registers)") }, - { "M", NC_("rv-ext", /*/ext:M*/ "Hardware integer multiply and divide") }, - { "A", NC_("rv-ext", /*/ext:A*/ "Atomic memory operations") }, - { "C", NC_("rv-ext", /*/ext:C*/ "Compressed 16-bit instructions") }, - { "F", NC_("rv-ext", /*/ext:F*/ "Floating-point instructions, single-precision") }, - { "D", NC_("rv-ext", /*/ext:D*/ "Floating-point instructions, double-precision") }, - { "Q", NC_("rv-ext", /*/ext:Q*/ "Floating-point instructions, quad-precision") }, - { "B", NC_("rv-ext", /*/ext:B*/ "Bit manipulation instructions") }, - { "V", NC_("rv-ext", /*/ext:V*/ "Vector operations") }, - { "T", NC_("rv-ext", /*/ext:T*/ "Transactional memory") }, - { "P", NC_("rv-ext", /*/ext:P*/ "Packed SIMD instructions") }, - { "L", NC_("rv-ext", /*/ext:L*/ "Decimal floating-point instructions") }, - { "J", NC_("rv-ext", /*/ext:J*/ "Dynamically translated languages") }, - { "N", NC_("rv-ext", /*/ext:N*/ "User-level interrupts") }, - { NULL, NULL } -}; - -static char all_extensions[1024] = ""; - -#define APPEND_EXT(f) strcat(all_extensions, f); strcat(all_extensions, " "); -const char *riscv_ext_list() { - int i = 0, built = 0; - built = strlen(all_extensions); - if (!built) { - while(tab_ext_meaning[i].name != NULL) { - APPEND_EXT(tab_ext_meaning[i].name); - i++; - } - } - return all_extensions; -} - -const char *riscv_ext_meaning(const char *ext) { - int i = 0, l = 0; - char *c = NULL; - if (ext) { - c = strchr(ext, ':'); /* allow extension:version, ignore version */ - if (c != NULL) - l = c - ext; - else - l = strlen(ext); - while(tab_ext_meaning[i].name != NULL) { - if (strncasecmp(tab_ext_meaning[i].name, ext, l) == 0) { - if (tab_ext_meaning[i].meaning != NULL) - return C_("rv-ext", tab_ext_meaning[i].meaning); - else return NULL; - } - i++; - } - } - return NULL; -} - -/* see RISC-V spec 2.2: Chapter 22: ISA Subset Naming Conventions */ - -/* Spec says case-insensitve, but I prefer single-letter extensions - * capped and version string (like "2p1") with a lowercase p. */ -#define RV_FIX_CASE(fstr,vo) \ - p = fstr; while (*p != 0 && *p != ':') { if (!vo) *p = toupper(*p); p++; } \ - if (*p == ':') while (*p != 0) { if (*p == 'P') *p = 'p'; p++; } - -static int riscv_isa_next(const char *isap, char *flag) { - char *p = NULL, *start = NULL; - char *next_sep = NULL, *next_digit = NULL; - int skip_len = 0, tag_len = 0, ver_len = 0; - char ext_str[32], ver_str[32]; - - if (isap == NULL) - return 0; - - /* find start by skipping any '_' */ - start = (char*)isap; - while (*start != 0 && *start == '_') { start++; skip_len++; }; - if (*start == 0) - return 0; - - /* find next '_' or \0 */ - p = start; while (*p != 0 && *p != '_') { p++; }; next_sep = p; - - /* find next digit that may be a version, find length of version */ - p = start; while (*p != 0 && !isdigit(*p)) { p++; }; - if (isdigit(*p)) next_digit = p; - if (next_digit) { - while (*p != 0 && (isdigit(*p) || *p == 'p' || *p == 'P') ) { - if ((*p == 'p' || *p == 'P') && !isdigit(*(p+1)) ) - break; - ver_len++; - p++; - } - } - - /* is next version nearer than next separator */ - p = start; - if (next_digit && next_digit < next_sep) - tag_len = next_digit - p; - else { - tag_len = next_sep - p; - ver_len = 0; - } - - switch(*p) { - case 'S': case 's': /* supervisor extension */ - case 'X': case 'x': /* custom extension */ - /* custom supervisor extension (SX..) handled by S */ - break; - default: /* single character (standard) extension */ - tag_len = 1; - if (next_digit != p+1) ver_len = 0; - break; - } - - memset(ext_str, 0, 32); - memset(ver_str, 0, 32); - if (ver_len) { - strncpy(ext_str, p, tag_len); - strncpy(ver_str, next_digit, ver_len); - sprintf(flag, "%s:%s", ext_str, ver_str); - if (tag_len == 1) { - RV_FIX_CASE(flag, 0); - } else { - RV_FIX_CASE(flag, 1); - } - return skip_len + tag_len + ver_len; - } else { - strncpy(ext_str, p, tag_len); - sprintf(flag, "%s", ext_str); - if (tag_len == 1) { RV_FIX_CASE(flag, 0); } - return skip_len + tag_len; - } -} - -#define FSTR_SIZE 1024 -#define RV_CHECK_FOR(e) ( strncasecmp(ps, e, 2) == 0 ) -#define ADD_EXT_FLAG(ext) el = strlen(ext); strncpy(pd, ext, el); strncpy(pd + el, " ", 1); pd += el + 1; -char *riscv_isa_to_flags(const char *isa) { - char *flags = NULL, *ps = (char*)isa, *pd = NULL; - char flag_buf[64] = ""; - int isa_len = 0, tl = 0, el = 0; /* el used in macro */ - - if (isa) { - isa_len = strlen(isa); - flags = malloc(FSTR_SIZE); - if (flags) { - memset(flags, 0, FSTR_SIZE); - ps = (char*)isa; - pd = flags; - if ( RV_CHECK_FOR("RV") ) - { ps += 2; } - if ( RV_CHECK_FOR("32") ) - { ADD_EXT_FLAG("RV32"); ps += 2; } - else if ( RV_CHECK_FOR("64") ) - { ADD_EXT_FLAG("RV64"); ps += 2; } - else if ( RV_CHECK_FOR("128") ) - { ADD_EXT_FLAG("RV128"); ps += 3; } - - while( (tl = riscv_isa_next(ps, flag_buf)) ) { - if (flag_buf[0] == 'G') { /* G = IMAFD */ - flag_buf[0] = 'I'; ADD_EXT_FLAG(flag_buf); - flag_buf[0] = 'M'; ADD_EXT_FLAG(flag_buf); - flag_buf[0] = 'A'; ADD_EXT_FLAG(flag_buf); - flag_buf[0] = 'F'; ADD_EXT_FLAG(flag_buf); - flag_buf[0] = 'D'; ADD_EXT_FLAG(flag_buf); - } else { - ADD_EXT_FLAG(flag_buf); - } - ps += tl; - if (ps - isa >= isa_len) break; /* just in case */ - } - } - } - return flags; -} diff --git a/modules/devices/riscv/riscv_data.h b/modules/devices/riscv/riscv_data.h deleted file mode 100644 index 1d3a0a48..00000000 --- a/modules/devices/riscv/riscv_data.h +++ /dev/null @@ -1,33 +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. - * - */ - -#ifndef _RISCVDATA_H_ -#define _RISCVDATA_H_ - -/* convert RISC-V ISA string to flags list */ -char *riscv_isa_to_flags(const char *isa); - -/* all known extensions as flags list */ -const char *riscv_ext_list(void); - -/* get meaning of flag */ -const char *riscv_ext_meaning(const char *ext); - -#endif diff --git a/modules/devices/s390/processor.c b/modules/devices/s390/processor.c deleted file mode 100644 index cf45c33c..00000000 --- a/modules/devices/s390/processor.c +++ /dev/null @@ -1,180 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "devices.h" -#include "string.h" -#include "cpu_util.h" - -GSList * -processor_scan(void) -{ - GSList *procs = NULL; - Processor *processor = NULL; - FILE *cpuinfo; - gchar buffer[128]; - gchar *vendor_id = NULL; - gint num_procs = 0; - gfloat bogomips = 0.0f; - GSList *pi = NULL; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - -#define CHECK_FOR(k) (g_str_has_prefix(tmp[0], k)) - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - } else { - g_strfreev(tmp); - continue; - } - - get_str("vendor_id", vendor_id); - get_int("# processors", num_procs); - get_int("bogomips per cpu", bogomips); - - if ( CHECK_FOR("processor") ) { - /* finish previous */ - if (processor) { - procs = g_slist_append(procs, processor); - } - - /* start next */ - processor = g_new0(Processor, 1); - if (strlen(tmp[0]) >= 10) - processor->id = atol(tmp[0] + 10); /* processor n: ... */ - else - processor->id = 0; /* idk */ - processor->proc_str = g_strdup(tmp[1]); - - if (vendor_id) - processor->model_name = g_strdup(vendor_id); - if (bogomips) - processor->bogomips = bogomips; - - g_strfreev(tmp); - continue; - } - - g_strfreev(tmp); - } - - if (processor) - procs = g_slist_append(procs, processor); - - g_free(vendor_id); - fclose(cpuinfo); - - /* data not from /proc/cpuinfo */ - for (pi = procs; pi; pi = pi->next) { - processor = (Processor *) pi->data; - - /* strings can't be null or segfault later */ - STRIFNULL(processor->model_name, _("S390 Processor") ); - UNKIFNULL(processor->proc_str); - - /* topo & freq */ - processor->cpufreq = cpufreq_new(processor->id); - processor->cputopo = cputopo_new(processor->id); - - if (processor->cpufreq->cpukhz_max) - processor->cpu_mhz = processor->cpufreq->cpukhz_max / 1000; - else - processor->cpu_mhz = 0.0f; - - } - - return procs; -} - -gchar *processor_name(GSList * processors) { - return processor_name_default(processors); -} - -gchar *processor_describe(GSList * processors) { - return processor_describe_default(processors); -} - -gchar * -processor_get_detailed_info(Processor *processor) -{ - gchar *tmp_cpufreq, *tmp_topology, *ret; - tmp_topology = cputopo_section_str(processor->cputopo); - tmp_cpufreq = cpufreq_section_str(processor->cpufreq); - - ret = g_strdup_printf("[%s]\n" - "%s=%s\n" /* model */ - "%s=%s\n" /* proc string */ - "%s=%.2f\n" /* bogomips */ - "%s=%s\n" /* byte order */ - "%s" /* topology */ - "%s", /* frequency scaling */ - _("Processor"), - _("Model"), processor->model_name, - _("ID String"), processor->proc_str, - _("BogoMips"), processor->bogomips, - _("Byte Order"), byte_order_str(), - tmp_topology, - tmp_cpufreq - ); - g_free(tmp_cpufreq); - g_free(tmp_topology); - return ret; -} - -gchar *processor_get_info(GSList * processors) -{ - Processor *processor; - - if (g_slist_length(processors) > 1) { - gchar *ret, *tmp, *hashkey; - GSList *l; - - tmp = g_strdup(""); - - for (l = processors; l; l = l->next) { - processor = (Processor *) l->data; - - tmp = g_strdup_printf("%s$CPU%d$%s=%.2f %s\n", - tmp, processor->id, - processor->model_name, - processor->cpu_mhz, _("MHz")); - - hashkey = g_strdup_printf("CPU%d", processor->id); - moreinfo_add_with_prefix("DEV", hashkey, - processor_get_detailed_info(processor)); - g_free(hashkey); - } - - ret = g_strdup_printf("[$ShellParam$]\n" - "ViewType=1\n" - "[Processors]\n" - "%s", tmp); - g_free(tmp); - - return ret; - } - - processor = (Processor *) processors->data; - return processor_get_detailed_info(processor); -} - diff --git a/modules/devices/sensors.c b/modules/devices/sensors.c deleted file mode 100644 index c9d78ff7..00000000 --- a/modules/devices/sensors.c +++ /dev/null @@ -1,453 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <string.h> - -#include "devices.h" -#include "expr.h" -#include "hardinfo.h" -#include "socket.h" - -gchar *sensors = NULL; -GHashTable *sensor_compute = NULL; -GHashTable *sensor_labels = NULL; - -static void read_sensor_labels(gchar *driver) { - FILE *conf; - gchar buf[256], *line, *p; - gboolean lock = FALSE; - gint i; - - /* Try to open lm-sensors config file sensors3.conf */ - conf = fopen("/etc/sensors3.conf", "r"); - - /* If it fails, try to open sensors.conf */ - if (!conf) - conf = fopen("/etc/sensors.conf", "r"); - - if (!conf) { - /* Cannot open config file. */ - return; - } - - while (fgets(buf, 256, conf)) { - line = buf; - - remove_linefeed(line); - strend(line, '#'); - - if (*line == '\0') { - continue; - } else if (lock && strstr(line, "label")) { /* label lines */ - gchar **names = g_strsplit(strstr(line, "label") + 5, " ", 0); - gchar *name = NULL, *value = NULL; - - for (i = 0; names[i]; i++) { - if (names[i][0] == '\0') - continue; - - if (!name) - name = g_strdup(names[i]); - else if (!value) - value = g_strdup(names[i]); - else - value = g_strconcat(value, " ", names[i], NULL); - } - - remove_quotes(value); - g_hash_table_insert(sensor_labels, name, value); - - g_strfreev(names); - } else if (lock && strstr(line, "ignore")) { /* ignore lines */ - p = strstr(line, "ignore") + 6; - if (!strchr(p, ' ')) - continue; - - while (*p == ' ') - p++; - g_hash_table_insert(sensor_labels, g_strdup(p), "ignore"); - } else if (lock && strstr(line, "compute")) { /* compute lines */ - gchar **formulas = g_strsplit(strstr(line, "compute") + 7, " ", 0); - gchar *name = NULL, *formula = NULL; - - for (i = 0; formulas[i]; i++) { - if (formulas[i][0] == '\0') - continue; - if (formulas[i][0] == ',') - break; - - if (!name) - name = g_strdup(formulas[i]); - else if (!formula) - formula = g_strdup(formulas[i]); - else - formula = g_strconcat(formula, formulas[i], NULL); - } - - g_strfreev(formulas); - g_hash_table_insert(sensor_compute, name, - math_string_to_postfix(formula)); - } else if (g_str_has_prefix(line, - "chip")) { /* chip lines (delimiter) */ - if (lock == FALSE) { - gchar **chips = g_strsplit(line, " ", 0); - - for (i = 1; chips[i]; i++) { - strend(chips[i], '*'); - - if (g_str_has_prefix(chips[i] + 1, driver)) { - lock = TRUE; - break; - } - } - - g_strfreev(chips); - } else { - break; - } - } - } - - fclose(conf); -} - -static void add_sensor(const char *type, - const char *sensor, - const char *driver, - double value, - const char *unit) { - char key[64]; - - sensors = h_strdup_cprintf("%s/%s=%.2f%s|%s\n", sensors, - driver, sensor, value, unit, type); - - snprintf(key, sizeof(key), "%s/%s", driver, sensor); - moreinfo_add_with_prefix("DEV", key, g_strdup_printf("%.2f%s", value, unit)); - - lginterval = h_strdup_cprintf("UpdateInterval$%s=1000\n", lginterval, key); -} - -static gchar *get_sensor_label(gchar *sensor) { - gchar *ret; - - ret = g_hash_table_lookup(sensor_labels, sensor); - if (!ret) - ret = g_strdup(sensor); - else - ret = g_strdup(ret); - - return ret; -} - -static float adjust_sensor(gchar *name, float value) { - GSList *postfix; - - postfix = g_hash_table_lookup(sensor_compute, name); - if (!postfix) - return value; - - return math_postfix_eval(postfix, value); -} - -static char *get_sensor_path(int number, const char *prefix) { - return g_strdup_printf("/sys/class/hwmon/hwmon%d/%s", number, prefix); -} - -static char *determine_driver_for_hwmon_path(char *path) { - char *tmp, *driver; - - tmp = g_strdup_printf("%s/device/driver", path); - driver = g_file_read_link(tmp, NULL); - g_free(tmp); - - if (driver) { - tmp = g_path_get_basename(driver); - g_free(driver); - driver = tmp; - } else { - tmp = g_strdup_printf("%s/device", path); - driver = g_file_read_link(tmp, NULL); - g_free(tmp); - } - - if (!driver) { - tmp = g_strdup_printf("%s/name", path); - if (!g_file_get_contents(tmp, &driver, NULL, NULL)) { - driver = g_strdup("unknown"); - } else { - driver = g_strstrip(driver); - } - g_free(tmp); - } - - return driver; -} - -struct HwmonSensor { - const char *friendly_name; - const char *path_format; - const char *key_format; - const char *unit; - const float adjust_ratio; - const int begin_at; -}; - -static const struct HwmonSensor hwmon_sensors[] = { - { - "Fan", - "%s/fan%d_input", - "fan%d", - "RPM", - 1.0, - 1 - }, - { - "Temperature", - "%s/temp%d_input", - "temp%d", - "\302\260C", - 1000.0, - 1 - }, - { - "Voltage", - "%s/in%d_input", - "in%d", - "V", - 1000.0, - 0 - }, - { } -}; - -static const char *hwmon_prefix[] = {"device", "", NULL}; - -static void read_sensors_hwmon(void) { - int hwmon, count; - gchar *path_hwmon, *path_sensor, *tmp, *driver, *name, *mon; - const char **prefix; - - for (prefix = hwmon_prefix; *prefix; prefix++) { - hwmon = 0; - path_hwmon = get_sensor_path(hwmon, *prefix); - while (path_hwmon && g_file_test(path_hwmon, G_FILE_TEST_EXISTS)) { - const struct HwmonSensor *sensor; - - driver = determine_driver_for_hwmon_path(path_hwmon); - DEBUG("hwmon%d has driver=%s", hwmon, driver); - - if (!sensor_labels) { - read_sensor_labels(driver); - } - - for (sensor = hwmon_sensors; sensor->friendly_name; sensor++) { - DEBUG("current sensor type=%s", sensor->friendly_name); - - for (count = sensor->begin_at;; count++) { - path_sensor = - g_strdup_printf(sensor->path_format, path_hwmon, count); - DEBUG("should be reading from %s", path_sensor); - if (!g_file_get_contents(path_sensor, &tmp, NULL, NULL)) { - g_free(path_sensor); - if (count < 256) - continue; // brute-force find all - else - break; - } - - mon = g_strdup_printf(sensor->key_format, count); - name = get_sensor_label(mon); - if (!g_str_equal(name, "ignore")) { - float adjusted = adjust_sensor(mon, - atof(tmp) / sensor->adjust_ratio); - - add_sensor(sensor->friendly_name, - name, - driver, - adjusted, - sensor->unit); - } - - g_free(tmp); - g_free(mon); - g_free(name); - g_free(path_sensor); - } - } - - g_free(path_hwmon); - g_free(driver); - - path_hwmon = get_sensor_path(++hwmon, *prefix); - } - - g_free(path_hwmon); - } -} - -static void read_sensors_acpi(void) { - const gchar *path_tz = "/proc/acpi/thermal_zone"; - - if (g_file_test(path_tz, G_FILE_TEST_EXISTS)) { - GDir *tz; - - if ((tz = g_dir_open(path_tz, 0, NULL))) { - const gchar *entry; - - while ((entry = g_dir_read_name(tz))) { - gchar *path = - g_strdup_printf("%s/%s/temperature", path_tz, entry); - gchar *contents; - - if (g_file_get_contents(path, &contents, NULL, NULL)) { - int temperature; - - sscanf(contents, "temperature: %d C", &temperature); - - add_sensor("Temperature", - entry, - "ACPI Thermal Zone", - temperature, - "\302\260C"); - } - } - - g_dir_close(tz); - } - } -} - -static void read_sensors_sys_thermal(void) { - const gchar *path_tz = "/sys/class/thermal"; - - if (g_file_test(path_tz, G_FILE_TEST_EXISTS)) { - GDir *tz; - - if ((tz = g_dir_open(path_tz, 0, NULL))) { - const gchar *entry; - gchar *temp = g_strdup(""); - - while ((entry = g_dir_read_name(tz))) { - gchar *path = g_strdup_printf("%s/%s/temp", path_tz, entry); - gchar *contents; - - if (g_file_get_contents(path, &contents, NULL, NULL)) { - int temperature; - - sscanf(contents, "%d", &temperature); - - add_sensor("Temperature", - entry, - "thermal", - temperature / 1000.0, - "\302\260C"); - - g_free(contents); - } - } - - g_dir_close(tz); - } - } -} - -static void read_sensors_omnibook(void) { - const gchar *path_ob = "/proc/omnibook/temperature"; - gchar *contents; - - if (g_file_get_contents(path_ob, &contents, NULL, NULL)) { - int temperature; - - sscanf(contents, "CPU temperature: %d C", &temperature); - - add_sensor("Temperature", - "CPU", - "omnibook", - temperature, - "\302\260C\n"); - - g_free(contents); - } -} - -static void read_sensors_hddtemp(void) { - Socket *s; - gchar buffer[1024]; - gint len = 0; - - if (!(s = sock_connect("127.0.0.1", 7634))) - return; - - while (!len) - len = sock_read(s, buffer, sizeof(buffer)); - sock_close(s); - - if (len > 2 && buffer[0] == '|' && buffer[1] == '/') { - gchar **disks; - int i; - - disks = g_strsplit(buffer, "\n", 0); - for (i = 0; disks[i]; i++) { - gchar **fields = g_strsplit(disks[i] + 1, "|", 5); - - /* - * 0 -> /dev/hda - * 1 -> FUJITSU MHV2080AH - * 2 -> 41 - * 3 -> C - */ - const gchar *unit = strcmp(fields[3], "C") - ? "\302\260C" : "\302\260F"; - add_sensor("Hard Drive", - fields[1], - "hddtemp", - atoi(fields[2]), - unit); - - g_strfreev(fields); - } - - g_strfreev(disks); - } -} - -void scan_sensors_do(void) { - g_free(sensors); - sensors = g_strdup(""); - - g_free(lginterval); - lginterval = g_strdup(""); - - read_sensors_hwmon(); - read_sensors_acpi(); - read_sensors_sys_thermal(); - read_sensors_omnibook(); - read_sensors_hddtemp(); - /* FIXME: Add support for ibm acpi and more sensors */ -} - -void sensors_init(void) { - sensor_labels = - g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); - sensor_compute = g_hash_table_new(g_str_hash, g_str_equal); -} - -void sensors_shutdown(void) { - g_hash_table_destroy(sensor_labels); - g_hash_table_destroy(sensor_compute); -} diff --git a/modules/devices/sh/processor.c b/modules/devices/sh/processor.c deleted file mode 100644 index 9da2f9b0..00000000 --- a/modules/devices/sh/processor.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "devices.h" -#include "cpu_util.h" - -GSList * -processor_scan(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("machine", processor->vendor_id); - get_str("cpu type", processor->model_name); - get_str("cpu family", processor->family); - get_float("cpu clock", processor->cpu_mhz); - get_float("bus clock", processor->bus_mhz); - get_float("module clock", processor->mod_mhz); - get_float("bogomips", processor->bogomips); - } - g_strfreev(tmp); - } - - fclose(cpuinfo); - - STRIFNULL(processor->model_name, _("SuperH Processor")); - UNKIFNULL(processor->vendor_id); - - return g_slist_append(NULL, processor); -} - -gchar *processor_name(GSList * processors) { - return processor_name_default(processors); -} - -gchar *processor_describe(GSList * processors) { - return processor_describe_default(processors); -} - -gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[%s]\n" - "%s=%s\n" /* cpu type */ - "%s=%s\n" /* machine */ - "%s=%s\n" /* family */ - "%s=%.2f %s\n" /* frequency */ - "%s=%.2f %s\n" /* bus frequency */ - "%s=%.2f %s\n" /* module frequency */ - "%s=%.2f\n" /* bogomips */ - "%s=%s\n", /* byte order */ - _("Processor"), - _("Name"), processor->model_name, - _("Machine"), processor->vendor_id, - _("Family"), processor->family, - _("Frequency"), processor->cpu_mhz, _("MHz"), - _("Bus Frequency"), processor->bus_mhz, _("MHz"), - _("Module Frequency"), processor->mod_mhz, _("MHz"), - _("BogoMips"), processor->bogomips, - _("Byte Order"), byte_order_str() - ); -} diff --git a/modules/devices/sparc/processor.c b/modules/devices/sparc/processor.c deleted file mode 100644 index 32c7aa94..00000000 --- a/modules/devices/sparc/processor.c +++ /dev/null @@ -1,80 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "devices.h" -#include "cpu_util.h" - -GSList * -processor_scan(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("cpucaps", processor->cpucaps); - get_str("cpu", processor->model_name); - get_str("fpu", processor->has_fpu); - } - g_strfreev(tmp); - } - - fclose(cpuinfo); - - processor->cpu_mhz = 0.0f; - - return g_slist_append(NULL, processor); -} - -gchar *processor_name(GSList * processors) { - return processor_name_default(processors); -} - -gchar *processor_describe(GSList * processors) { - return processor_describe_default(processors); -} - -gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[%s]\n" - "%s=%s\n" /* cpu */ - "%s=%s\n" /* fpu */ - "%s=%s\n" /* byte order */ - "%s=%s\n", /* caps */ - _("Processor"), - _("CPU"), processor->model_name, - _("FPU"), processor->has_fpu, - _("Byte Order"), byte_order_str(), - _("Capabilities"), processor->cpucaps - ); -} diff --git a/modules/devices/spd-decode.c b/modules/devices/spd-decode.c deleted file mode 100644 index 2db4895b..00000000 --- a/modules/devices/spd-decode.c +++ /dev/null @@ -1,1512 +0,0 @@ -/* - * spd-decode.c - * Copyright (c) 2010 Leandro A. F. Pereira - * - * Based on decode-dimms.pl - * Copyright 1998, 1999 Philip Edelbrock <phil@netroedge.com> - * modified by Christian Zuckschwerdt <zany@triq.net> - * modified by Burkart Lingner <burkart@bollchen.de> - * - * 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., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include <ctype.h> -#include <math.h> -#include <stdio.h> -#include <sys/stat.h> - -#include "hardinfo.h" -#include "devices.h" - -typedef enum { - UNKNOWN, - DIRECT_RAMBUS, - RAMBUS, - FPM_DRAM, - EDO, - PIPELINED_NIBBLE, - SDR_SDRAM, - MULTIPLEXED_ROM, - DDR_SGRAM, - DDR_SDRAM, - DDR2_SDRAM, - DDR3_SDRAM -} RamType; - -char *spd_info = NULL; - -static const char *ram_types[] = { - "Unknown", - "Direct Rambus", - "Rambus", - "FPM DRAM", - "EDO", - "Pipelined Nibble", - "SDR SDRAM", - "Multiplexed ROM", - "DDR SGRAM", - "DDR SDRAM", - "DDR2 SDRAM", - "DDR3 SDRAM" -}; - -static const char *vendors1[] = { "AMD", "AMI", "Fairchild", "Fujitsu", - "GTE", "Harris", "Hitachi", "Inmos", - "Intel", "I.T.T.", "Intersil", - "Monolithic Memories", - "Mostek", - "Freescale (former Motorola)", - "National", "NEC", - "RCA", "Raytheon", - "Conexant (Rockwell)", "Seeq", - "NXP (former Signetics, Philips Semi.)", - "Synertek", - "Texas Instruments", "Toshiba", - "Xicor", "Zilog", "Eurotechnique", - "Mitsubishi", - "Lucent (AT&T)", "Exel", "Atmel", - "SGS/Thomson", - "Lattice Semi.", "NCR", - "Wafer Scale Integration", "IBM", - "Tristar", "Visic", - "Intl. CMOS Technology", "SSSI", - "MicrochipTechnology", "Ricoh Ltd.", - "VLSI", "Micron Technology", - "Hyundai Electronics", - "OKI Semiconductor", "ACTEL", - "Sharp", - "Catalyst", "Panasonic", "IDT", - "Cypress", - "DEC", "LSI Logic", - "Zarlink (former Plessey)", "UTMC", - "Thinking Machine", "Thomson CSF", - "Integrated CMOS (Vertex)", - "Honeywell", - "Tektronix", "Sun Microsystems", - "SST", "ProMos/Mosel Vitelic", - "Infineon (former Siemens)", - "Macronix", "Xerox", "Plus Logic", - "SunDisk", "Elan Circuit Tech.", - "European Silicon Str.", - "Apple Computer", - "Xilinx", "Compaq", - "Protocol Engines", "SCI", - "Seiko Instruments", "Samsung", - "I3 Design System", "Klic", - "Crosspoint Solutions", - "Alliance Semiconductor", "Tandem", - "Hewlett-Packard", - "Intg. Silicon Solutions", - "Brooktree", "New Media", - "MHS Electronic", - "Performance Semi.", - "Winbond Electronic", - "Kawasaki Steel", - "Bright Micro", - "TECMAR", "Exar", "PCMCIA", - "LG Semi (former Goldstar)", - "Northern Telecom", "Sanyo", - "Array Microsystems", - "Crystal Semiconductor", - "Analog Devices", "PMC-Sierra", - "Asparix", "Convex Computer", - "Quality Semiconductor", - "Nimbus Technology", "Transwitch", - "Micronas (ITT Intermetall)", - "Cannon", "Altera", "NEXCOM", - "QUALCOMM", - "Sony", "Cray Research", - "AMS(Austria Micro)", "Vitesse", - "Aster Electronics", - "Bay Networks (Synoptic)", - "Zentrum or ZMD", - "TRW", - "Thesys", "Solbourne Computer", - "Allied-Signal", "Dialog", - "Media Vision", - "Level One Communication" -}; - -static const char *vendors2[] = { "Cirrus Logic", - "National Instruments", - "ILC Data Device", - "Alcatel Mietec", - "Micro Linear", - "Univ. of NC", - "JTAG Technologies", - "BAE Systems", - "Nchip", - "Galileo Tech", - "Bestlink Systems", - "Graychip", - "GENNUM", - "VideoLogic", - "Robert Bosch", - "Chip Express", - "DATARAM", - "United Microelec Corp.", - "TCSI", - "Smart Modular", - "Hughes Aircraft", - "Lanstar Semiconductor", - "Qlogic", "Kingston", - "Music Semi", - "Ericsson Components", - "SpaSE", - "Eon Silicon Devices", - "Programmable Micro Corp", - "DoD", - "Integ. Memories Tech.", - "Corollary Inc.", - "Dallas Semiconductor", - "Omnivision", - "EIV(Switzerland)", - "Novatel Wireless", - "Zarlink (former Mitel)", - "Clearpoint", - "Cabletron", - "STEC (former Silicon Technology)", - "Vanguard", - "Hagiwara Sys-Com", - "Vantis", "Celestica", - "Century", - "Hal Computers", - "Rohm Company Ltd.", - "Juniper Networks", - "Libit Signal Processing", - "Mushkin Enhanced Memory", - "Tundra Semiconductor", - "Adaptec Inc.", - "LightSpeed Semi.", - "ZSP Corp.", - "AMIC Technology", - "Adobe Systems", - "Dynachip", - "PNY Electronics", - "Newport Digital", - "MMC Networks", - "T Square", - "Seiko Epson", - "Broadcom", - "Viking Components", - "V3 Semiconductor", - "Flextronics (former Orbit)", - "Suwa Electronics", - "Transmeta", - "Micron CMS", - "American Computer & Digital Components Inc", - "Enhance 3000 Inc", - "Tower Semiconductor", - "CPU Design", - "Price Point", - "Maxim Integrated Product", - "Tellabs", - "Centaur Technology", - "Unigen Corporation", - "Transcend Information", - "Memory Card Technology", - "CKD Corporation Ltd.", - "Capital Instruments, Inc.", - "Aica Kogyo, Ltd.", - "Linvex Technology", - "MSC Vertriebs GmbH", - "AKM Company, Ltd.", - "Dynamem, Inc.", - "NERA ASA", - "GSI Technology", - "Dane-Elec (C Memory)", - "Acorn Computers", - "Lara Technology", - "Oak Technology, Inc.", - "Itec Memory", - "Tanisys Technology", - "Truevision", - "Wintec Industries", - "Super PC Memory", - "MGV Memory", - "Galvantech", - "Gadzoox Nteworks", - "Multi Dimensional Cons.", - "GateField", - "Integrated Memory System", - "Triscend", "XaQti", - "Goldenram", - "Clear Logic", - "Cimaron Communications", - "Nippon Steel Semi. Corp.", - "Advantage Memory", - "AMCC", - "LeCroy", - "Yamaha Corporation", - "Digital Microwave", - "NetLogic Microsystems", - "MIMOS Semiconductor", - "Advanced Fibre", - "BF Goodrich Data.", - "Epigram", - "Acbel Polytech Inc.", - "Apacer Technology", - "Admor Memory", - "FOXCONN", - "Quadratics Superconductor", - "3COM", -}; - -static const char *vendors3[] = { "Camintonn Corporation", "ISOA Incorporated", - "Agate Semiconductor", "ADMtek Incorporated", - "HYPERTEC", "Adhoc Technologies", "MOSAID Technologies", - "Ardent Technologies", - "Switchcore", "Cisco Systems, Inc.", "Allayer Technologies", - "WorkX AG", - "Oasis Semiconductor", "Novanet Semiconductor", "E-M Solutions", - "Power General", - "Advanced Hardware Arch.", "Inova Semiconductors GmbH", "Telocity", - "Delkin Devices", - "Symagery Microsystems", "C-Port Corporation", - "SiberCore Technologies", "Southland Microsystems", - "Malleable Technologies", "Kendin Communications", - "Great Technology Microcomputer", "Sanmina Corporation", - "HADCO Corporation", "Corsair", "Actrans System Inc.", - "ALPHA Technologies", - "Silicon Laboratories, Inc. (Cygnal)", "Artesyn Technologies", - "Align Manufacturing", "Peregrine Semiconductor", - "Chameleon Systems", "Aplus Flash Technology", "MIPS Technologies", - "Chrysalis ITS", - "ADTEC Corporation", "Kentron Technologies", "Win Technologies", - "Tachyon Semiconductor (former ASIC Designs Inc.)", - "Extreme Packet Devices", "RF Micro Devices", "Siemens AG", - "Sarnoff Corporation", - "Itautec Philco SA", "Radiata Inc.", "Benchmark Elect. (AVEX)", - "Legend", - "SpecTek Incorporated", "Hi/fn", "Enikia Incorporated", - "SwitchOn Networks", - "AANetcom Incorporated", "Micro Memory Bank", "ESS Technology", - "Virata Corporation", - "Excess Bandwidth", "West Bay Semiconductor", "DSP Group", - "Newport Communications", - "Chip2Chip Incorporated", "Phobos Corporation", - "Intellitech Corporation", "Nordic VLSI ASA", - "Ishoni Networks", "Silicon Spice", "Alchemy Semiconductor", - "Agilent Technologies", - "Centillium Communications", "W.L. Gore", "HanBit Electronics", - "GlobeSpan", - "Element 14", "Pycon", "Saifun Semiconductors", "Sibyte, Incorporated", - "MetaLink Technologies", "Feiya Technology", "I & C Technology", - "Shikatronics", - "Elektrobit", "Megic", "Com-Tier", "Malaysia Micro Solutions", - "Hyperchip", "Gemstone Communications", "Anadigm (former Anadyne)", - "3ParData", - "Mellanox Technologies", "Tenx Technologies", "Helix AG", "Domosys", - "Skyup Technology", "HiNT Corporation", "Chiaro", - "MDT Technologies GmbH (former MCI Computer GMBH)", - "Exbit Technology A/S", "Integrated Technology Express", "AVED Memory", - "Legerity", - "Jasmine Networks", "Caspian Networks", "nCUBE", - "Silicon Access Networks", - "FDK Corporation", "High Bandwidth Access", "MultiLink Technology", - "BRECIS", - "World Wide Packets", "APW", "Chicory Systems", "Xstream Logic", - "Fast-Chip", "Zucotto Wireless", "Realchip", "Galaxy Power", - "eSilicon", "Morphics Technology", "Accelerant Networks", - "Silicon Wave", - "SandCraft", "Elpida" -}; - -static const char *vendors4[] = { "Solectron", "Optosys Technologies", - "Buffalo (former Melco)", - "TriMedia Technologies", - "Cyan Technologies", "Global Locate", - "Optillion", - "Terago Communications", - "Ikanos Communications", - "Princeton Technology", - "Nanya Technology", - "Elite Flash Storage", - "Mysticom", "LightSand Communications", - "ATI Technologies", - "Agere Systems", - "NeoMagic", "AuroraNetics", "Golden Empire", - "Mushkin", - "Tioga Technologies", "Netlist", "TeraLogic", - "Cicada Semiconductor", - "Centon Electronics", "Tyco Electronics", - "Magis Works", "Zettacom", - "Cogency Semiconductor", "Chipcon AS", - "Aspex Technology", - "F5 Networks", - "Programmable Silicon Solutions", - "ChipWrights", - "Acorn Networks", - "Quicklogic", - "Kingmax Semiconductor", "BOPS", "Flasys", - "BitBlitz Communications", - "eMemory Technology", "Procket Networks", - "Purple Ray", - "Trebia Networks", - "Delta Electronics", "Onex Communications", - "Ample Communications", - "Memory Experts Intl", - "Astute Networks", "Azanda Network Devices", - "Dibcom", "Tekmos", - "API NetWorks", "Bay Microsystems", - "Firecron Ltd", - "Resonext Communications", - "Tachys Technologies", "Equator Technology", - "Concept Computer", - "SILCOM", - "3Dlabs", "c't Magazine", "Sanera Systems", - "Silicon Packets", - "Viasystems Group", "Simtek", - "Semicon Devices Singapore", - "Satron Handelsges", - "Improv Systems", "INDUSYS GmbH", "Corrent", - "Infrant Technologies", - "Ritek Corp", "empowerTel Networks", - "Hypertec", - "Cavium Networks", - "PLX Technology", "Massana Design", - "Intrinsity", - "Valence Semiconductor", - "Terawave Communications", - "IceFyre Semiconductor", "Primarion", - "Picochip Designs Ltd", - "Silverback Systems", - "Jade Star Technologies", - "Pijnenburg Securealink", - "TakeMS International AG", - "Cambridge Silicon Radio", - "Swissbit", "Nazomi Communications", - "eWave System", - "Rockwell Collins", "Picocel Co., Ltd.", - "Alphamosaic Ltd", - "Sandburst", - "SiCon Video", "NanoAmp Solutions", - "Ericsson Technology", - "PrairieComm", - "Mitac International", "Layer N Networks", - "MtekVision", - "Allegro Networks", - "Marvell Semiconductors", - "Netergy Microelectronic", "NVIDIA", - "Internet Machines", - "Peak Electronics", - "Litchfield Communication", - "Accton Technology", - "Teradiant Networks", - "Europe Technologies", "Cortina Systems", - "RAM Components", - "Raqia Networks", - "ClearSpeed", "Matsushita Battery", - "Xelerated", - "SimpleTech", - "Utron Technology", "Astec International", - "AVM gmbH", - "Redux Communications", - "Dot Hill Systems", "TeraChip" -}; - -static const char *vendors5[] = { "T-RAM Incorporated", - "Innovics Wireless", "Teknovus", "KeyEye Communications", - "Runcom Technologies", "RedSwitch", "Dotcast", - "Silicon Mountain Memory", - "Signia Technologies", "Pixim", "Galazar Networks", - "White Electronic Designs", - "Patriot Scientific", "Neoaxiom Corporation", "3Y Power Technology", - "Europe Technologies", - "Potentia Power Systems", "C-guys Incorporated", - "Digital Communications Technology Incorporated", - "Silicon-Based Technology", - "Fulcrum Microsystems", "Positivo Informatica Ltd", - "XIOtech Corporation", "PortalPlayer", - "Zhiying Software", "Direct2Data", "Phonex Broadband", - "Skyworks Solutions", - "Entropic Communications", "Pacific Force Technology", "Zensys A/S", - "Legend Silicon Corp.", - "sci-worx GmbH", "SMSC (former Oasis Silicon Systems)", - "Renesas Technology", "Raza Microelectronics", - "Phyworks", "MediaTek", "Non-cents Productions", "US Modular", - "Wintegra Ltd", "Mathstar", "StarCore", "Oplus Technologies", - "Mindspeed", "Just Young Computer", "Radia Communications", "OCZ", - "Emuzed", "LOGIC Devices", "Inphi Corporation", "Quake Technologies", - "Vixel", "SolusTek", "Kongsberg Maritime", "Faraday Technology", - "Altium Ltd.", "Insyte", "ARM Ltd.", "DigiVision", - "Vativ Technologies", "Endicott Interconnect Technologies", "Pericom", - "Bandspeed", - "LeWiz Communications", "CPU Technology", "Ramaxel Technology", - "DSP Group", - "Axis Communications", "Legacy Electronics", "Chrontel", - "Powerchip Semiconductor", - "MobilEye Technologies", "Excel Semiconductor", "A-DATA Technology", - "VirtualDigm", - "G Skill Intl", "Quanta Computer", "Yield Microelectronics", - "Afa Technologies", - "KINGBOX Technology Co. Ltd.", "Ceva", "iStor Networks", - "Advance Modules", - "Microsoft", "Open-Silicon", "Goal Semiconductor", - "ARC International", - "Simmtec", "Metanoia", "Key Stream", "Lowrance Electronics", - "Adimos", "SiGe Semiconductor", "Fodus Communications", - "Credence Systems Corp.", - "Genesis Microchip Inc.", "Vihana, Inc.", "WIS Technologies", - "GateChange Technologies", - "High Density Devices AS", "Synopsys", "Gigaram", - "Enigma Semiconductor Inc.", - "Century Micro Inc.", "Icera Semiconductor", - "Mediaworks Integrated Systems", "O'Neil Product Development", - "Supreme Top Technology Ltd.", "MicroDisplay Corporation", - "Team Group Inc.", "Sinett Corporation", - "Toshiba Corporation", "Tensilica", "SiRF Technology", "Bacoc Inc.", - "SMaL Camera Technologies", "Thomson SC", "Airgo Networks", - "Wisair Ltd.", - "SigmaTel", "Arkados", "Compete IT gmbH Co. KG", - "Eudar Technology Inc.", - "Focus Enhancements", "Xyratex" -}; - -static const char *vendors6[] = { "Specular Networks", - "Patriot Memory", - "U-Chip Technology Corp.", - "Silicon Optix", - "Greenfield Networks", - "CompuRAM GmbH", "Stargen, Inc.", - "NetCell Corporation", - "Excalibrus Technologies Ltd", - "SCM Microsystems", - "Xsigo Systems, Inc.", - "CHIPS & Systems Inc", - "Tier 1 Multichip Solutions", - "CWRL Labs", "Teradici", - "Gigaram, Inc.", - "g2 Microsystems", - "PowerFlash Semiconductor", - "P.A. Semi, Inc.", - "NovaTech Solutions, S.A.", - "c2 Microsystems, Inc.", - "Level5 Networks", - "COS Memory AG", - "Innovasic Semiconductor", - "02IC Co. Ltd", "Tabula, Inc.", - "Crucial Technology", - "Chelsio Communications", - "Solarflare Communications", - "Xambala Inc.", "EADS Astrium", - "ATO Semicon Co. Ltd.", - "Imaging Works, Inc.", - "Astute Networks, Inc.", "Tzero", - "Emulex", - "Power-One", "Pulse~LINK Inc.", - "Hon Hai Precision Industry", - "White Rock Networks Inc.", - "Telegent Systems USA, Inc.", - "Atrua Technologies, Inc.", - "Acbel Polytech Inc.", - "eRide Inc.", - "ULi Electronics Inc.", - "Magnum Semiconductor Inc.", - "neoOne Technology, Inc.", - "Connex Technology, Inc.", - "Stream Processors, Inc.", - "Focus Enhancements", - "Telecis Wireless, Inc.", - "uNav Microelectronics", - "Tarari, Inc.", "Ambric, Inc.", - "Newport Media, Inc.", "VMTS", - "Enuclia Semiconductor, Inc.", - "Virtium Technology Inc.", - "Solid State System Co., Ltd.", - "Kian Tech LLC", - "Artimi", - "Power Quotient International", - "Avago Technologies", - "ADTechnology", "Sigma Designs", - "SiCortex, Inc.", - "Ventura Technology Group", - "eASIC", "M.H.S. SAS", - "Micro Star International", - "Rapport Inc.", - "Makway International", - "Broad Reach Engineering Co.", - "Semiconductor Mfg Intl Corp", - "SiConnect", "FCI USA Inc.", - "Validity Sensors", - "Coney Technology Co. Ltd.", - "Spans Logic", "Neterion Inc.", - "Qimonda", - "New Japan Radio Co. Ltd.", - "Velogix", "Montalvo Systems", - "iVivity Inc.", - "Walton Chaintech", - "AENEON", - "Lorom Industrial Co. Ltd.", - "Radiospire Networks", - "Sensio Technologies, Inc.", - "Nethra Imaging", - "Hexon Technology Pte Ltd", - "CompuStocx (CSX)", - "Methode Electronics, Inc.", - "Connect One Ltd.", - "Opulan Technologies", - "Septentrio NV", - "Goldenmars Technology Inc.", - "Kreton Corporation", - "Cochlear Ltd.", - "Altair Semiconductor", - "NetEffect, Inc.", - "Spansion, Inc.", - "Taiwan Semiconductor Mfg", - "Emphany Systems Inc.", - "ApaceWave Technologies", - "Mobilygen Corporation", "Tego", - "Cswitch Corporation", - "Haier (Beijing) IC Design Co.", - "MetaRAM", - "Axel Electronics Co. Ltd.", - "Tilera Corporation", - "Aquantia", - "Vivace Semiconductor", - "Redpine Signals", "Octalica", - "InterDigital Communications", - "Avant Technology", - "Asrock, Inc.", "Availink", - "Quartics, Inc.", - "Element CXI", - "Innovaciones Microelectronicas", - "VeriSilicon Microelectronics", - "W5 Networks" -}; - -static const char *vendors7[] = { "MOVEKING", "Mavrix Technology, Inc.", - "CellGuide Ltd.", "Faraday Technology", - "Diablo Technologies, Inc.", "Jennic", "Octasic", - "Molex Incorporated", - "3Leaf Networks", - "Bright Micron Technology", "Netxen", "NextWave Broadband Inc.", - "DisplayLink", "ZMOS Technology", - "Tec-Hill", "Multigig, Inc.", "Amimon", "Euphonic Technologies, Inc.", - "BRN Phoenix", - "InSilica", "Ember Corporation", "Avexir Technologies Corporation", - "Echelon Corporation", - "Edgewater Computer Systems", "XMOS Semiconductor Ltd.", - "GENUSION, Inc.", "Memory Corp NV", - "SiliconBlue Technologies", "Rambus Inc." -}; - -static const char **vendors[7] = { vendors1, vendors2, vendors3, vendors4, vendors5, vendors6, - vendors7 -}; - -/* - * We consider that no data was written to this area of the SPD EEPROM if - * all bytes read 0x00 or all bytes read 0xff - */ -static int spd_written(unsigned char *bytes, int len) -{ - do { - if (*bytes == 0x00 || *bytes == 0xFF) - return 1; - } while (--len && bytes++); - - return 0; -} - -static int parity(int value) -{ - value ^= value >> 16; - value ^= value >> 8; - value ^= value >> 4; - value &= 0xf; - - return (0x6996 >> value) & 1; -} - -static void decode_sdr_module_size(unsigned char *bytes, int *size) -{ - int i, k = 0; - - i = (bytes[3] & 0x0f) + (bytes[4] & 0x0f) - 17; - if (bytes[5] <= 8 && bytes[17] <= 8) { - k = bytes[5] * bytes[17]; - } - - if (i > 0 && i <= 12 && k > 0) { - if (size) { - *size = (1 << i) * k; - } - } else { - if (size) { - *size = -1; - } - } -} - -static void decode_sdr_module_timings(unsigned char *bytes, float *tcl, float *trcd, float *trp, float *tras) -{ - float cas[3], ctime; - int i, j; - - for (i = 0, j = 0; j < 7; j++) { - if (bytes[18] & 1 << j) { - cas[i++] = j + 1; - } - } - - ctime = (bytes[9] >> 4 + bytes[9] & 0xf) * 0.1; - - if (trcd) { - *trcd = ceil(bytes[29] / ctime); - } - if (trp) { - *trp = ceil(bytes[27] / ctime); - } - if (tras) { - *tras = ceil(bytes[30] / ctime); - } - if (tcl) { - *tcl = cas[i]; - } -} - -static void decode_sdr_module_row_address_bits(unsigned char *bytes, char **bits) -{ - char *temp; - - switch (bytes[3]) { - case 0: - temp = "Undefined"; - break; - case 1: - temp = "1/16"; - break; - case 2: - temp = "2/27"; - break; - case 3: - temp = "3/18"; - break; - default: - /* printf("%d\n", bytes[3]); */ - temp = "Unknown"; - } - - if (bits) { - *bits = temp; - } -} - -static void decode_sdr_module_col_address_bits(unsigned char *bytes, char **bits) -{ - char *temp; - - switch (bytes[4]) { - case 0: - temp = "Undefined"; - break; - case 1: - temp = "1/16"; - break; - case 2: - temp = "2/17"; - break; - case 3: - temp = "3/18"; - break; - default: - /*printf("%d\n", bytes[4]); */ - temp = "Unknown"; - } - - if (bits) { - *bits = temp; - } -} - -static void decode_sdr_module_number_of_rows(unsigned char *bytes, int *rows) -{ - if (rows) { - *rows = bytes[5]; - } -} - -static void decode_sdr_module_data_with(unsigned char *bytes, int *width) -{ - if (width) { - if (bytes[7] > 1) { - *width = 0; - } else { - *width = (bytes[7] * 0xff) + bytes[6]; - } - } -} - -static void decode_sdr_module_interface_signal_levels(unsigned char *bytes, char **signal_levels) -{ - char *temp; - - switch (bytes[8]) { - case 0: - temp = "5.0 Volt/TTL"; - break; - case 1: - temp = "LVTTL"; - break; - case 2: - temp = "HSTL 1.5"; - break; - case 3: - temp = "SSTL 3.3"; - break; - case 4: - temp = "SSTL 2.5"; - break; - case 255: - temp = "New Table"; - break; - default: - temp = "Undefined"; - } - - if (signal_levels) { - *signal_levels = temp; - } -} - -static void decode_sdr_module_configuration_type(unsigned char *bytes, char **module_config_type) -{ - char *temp; - - switch (bytes[11]) { - case 0: - temp = "No parity"; - break; - case 1: - temp = "Parity"; - break; - case 2: - temp = "ECC"; - break; - default: - temp = "Undefined"; - } - - if (module_config_type) { - *module_config_type = temp; - } -} - -static void decode_sdr_module_refresh_type(unsigned char *bytes, char **refresh_type) -{ - char *temp; - - if (bytes[12] & 0x80) { - temp = "Self refreshing"; - } else { - temp = "Not self refreshing"; - } - - if (refresh_type) { - *refresh_type = temp; - } -} - -static void decode_sdr_module_refresh_rate(unsigned char *bytes, char **refresh_rate) -{ - char *temp; - - switch (bytes[12] & 0x7f) { - case 0: - temp = "Normal (15.625us)"; - break; - case 1: - temp = "Reduced (3.9us)"; - break; - case 2: - temp = "Reduced (7.8us)"; - break; - case 3: - temp = "Extended (31.3us)"; - break; - case 4: - temp = "Extended (62.5us)"; - break; - case 5: - temp = "Extended (125us)"; - break; - default: - temp = "Undefined"; - } - - if (refresh_rate) { - *refresh_rate = temp; - } -} - -static gchar *decode_sdr_sdram(unsigned char *bytes, int *size) -{ - int rows, data_width; - float tcl, trcd, trp, tras; - char *row_address_bits, *col_address_bits, *signal_level; - char *module_config_type, *refresh_type, *refresh_rate; - - decode_sdr_module_size(bytes, size); - decode_sdr_module_timings(bytes, &tcl, &trcd, &trp, &tras); - decode_sdr_module_row_address_bits(bytes, &row_address_bits); - decode_sdr_module_col_address_bits(bytes, &col_address_bits); - decode_sdr_module_number_of_rows(bytes, &rows); - decode_sdr_module_data_with(bytes, &data_width); - decode_sdr_module_interface_signal_levels(bytes, &signal_level); - decode_sdr_module_configuration_type(bytes, &module_config_type); - decode_sdr_module_refresh_type(bytes, &refresh_type); - decode_sdr_module_refresh_rate(bytes, &refresh_rate); - - /* TODO: - - RAS to CAS delay - - Supported CAS latencies - - Supported CS latencies - - Supported WE latencies - - Cycle Time / Access time - - SDRAM module attributes - - SDRAM device attributes - - Row densities - - Other misc stuff - */ - - return g_strdup_printf("[Module Information]\n" - "Module type=SDR\n" - "SPD revision=%d\n" - "Row address bits=%s\n" - "Column address bits=%s\n" - "Number of rows=%d\n" - "Data width=%d bits\n" - "Interface signal levels=%s\n" - "Configuration type=%s\n" - "Refresh=%s (%s)\n" - "[Timings]\n" - "tCL=%.2f\n" - "tRCD=%.2f\n" - "tRP=%.2f\n" - "tRAS=%.2f\n", - bytes[62], - row_address_bits, col_address_bits, rows, - data_width, signal_level, module_config_type, - refresh_type, refresh_rate, tcl, trcd, trp, tras); -} - -static void decode_ddr_module_speed(unsigned char *bytes, float *ddrclk, int *pcclk) -{ - float temp, clk; - int tbits, pc; - - temp = (bytes[9] >> 4) + (bytes[9] & 0xf) * 0.1; - clk = 2 * (1000 / temp); - tbits = (bytes[7] * 256) + bytes[6]; - - if (bytes[11] == 2 || bytes[11] == 1) { - tbits -= 8; - } - - pc = clk * tbits / 8; - if (pc % 100 > 50) { - pc += 100; - } - pc -= pc % 100; - - if (ddrclk) - *ddrclk = (int) clk; - - if (pcclk) - *pcclk = pc; -} - -static void decode_ddr_module_size(unsigned char *bytes, int *size) -{ - int i, k; - - i = (bytes[3] & 0x0f) + (bytes[4] & 0x0f) - 17; - k = (bytes[5] <= 8 && bytes[17] <= 8) ? bytes[5] * bytes[17] : 0; - - if (i > 0 && i <= 12 && k > 0) { - if (size) { - *size = (1 << i) * k; - } - } else { - if (size) { - *size = -1; - } - } -} - -static void *decode_ddr_module_timings(unsigned char *bytes, float *tcl, float *trcd, float *trp, float *tras) -{ - float ctime; - float highest_cas = 0; - int i; - - for (i = 0; i < 7; i++) { - if (bytes[18] & (1 << i)) { - highest_cas = 1 + i * 0.5f; - } - } - - ctime = (bytes[9] >> 4) + (bytes[9] & 0xf) * 0.1; - - if (trcd) { - *trcd = (bytes[29] >> 2) + ((bytes[29] & 3) * 0.25); - *trcd = ceil(*trcd / ctime); - } - - if (trp) { - *trp = (bytes[27] >> 2) + ((bytes[27] & 3) * 0.25); - *trp = ceil(*trp / ctime); - } - - if (tras) { - *tras = bytes[30]; - *tras = ceil(*tras / ctime); - } - - if (tcl) { - *tcl = highest_cas; - } -} - -static gchar *decode_ddr_sdram(unsigned char *bytes, int *size) -{ - float ddr_clock; - float tcl, trcd, trp, tras; - int pc_speed; - - decode_ddr_module_speed(bytes, &ddr_clock, &pc_speed); - decode_ddr_module_size(bytes, size); - decode_ddr_module_timings(bytes, &tcl, &trcd, &trp, &tras); - - return g_strdup_printf("[Module Information]\n" - "Module type=DDR %.2fMHz (PC%d)\n" - "SPD revision=%d.%d\n" - "[Timings]\n" - "tCL=%.2f\n" - "tRCD=%.2f\n" - "tRP=%.2f\n" - "tRAS=%.2f\n", ddr_clock, pc_speed, bytes[62] >> 4, bytes[62] & 0xf, tcl, trcd, trp, tras); -} - -static float decode_ddr2_module_ctime(unsigned char byte) -{ - float ctime; - - ctime = (byte >> 4); - byte &= 0xf; - - if (byte <= 9) { - ctime += byte * 0.1; - } else if (byte == 10) { - ctime += 0.25; - } else if (byte == 11) { - ctime += 0.33; - } else if (byte == 12) { - ctime += 0.66; - } else if (byte == 13) { - ctime += 0.75; - } - - return ctime; -} - -static void decode_ddr2_module_speed(unsigned char *bytes, float *ddr_clock, int *pc2_speed) -{ - float ctime; - float ddrclk; - int tbits, pcclk; - - ctime = decode_ddr2_module_ctime(bytes[9]); - ddrclk = 2 * (1000 / ctime); - - tbits = (bytes[7] * 256) + bytes[6]; - if (bytes[11] & 0x03) { - tbits -= 8; - } - - pcclk = ddrclk * tbits / 8; - pcclk -= pcclk % 100; - - if (ddr_clock) { - *ddr_clock = (int) ddrclk; - } - if (pc2_speed) { - *pc2_speed = pcclk; - } -} - -static void decode_ddr2_module_size(unsigned char *bytes, int *size) -{ - int i, k; - - i = (bytes[3] & 0x0f) + (bytes[4] & 0x0f) - 17; - k = ((bytes[5] & 0x7) + 1) * bytes[17]; - - if (i > 0 && i <= 12 && k > 0) { - if (*size) { - *size = ((1 << i) * k); - } - } else { - if (*size) { - *size = 0; - } - } -} - -static void decode_ddr2_module_timings(unsigned char *bytes, float *trcd, float *trp, float *tras, float *tcl) -{ - float ctime; - float highest_cas = 0; - int i; - - for (i = 0; i < 7; i++) { - if (bytes[18] & (1 << i)) { - highest_cas = i; - } - } - - ctime = decode_ddr2_module_ctime(bytes[9]); - - if (trcd) { - *trcd = ceil(((bytes[29] >> 2) + ((bytes[29] & 3) * 0.25)) / ctime); - } - - if (trp) { - *trp = ceil(((bytes[27] >> 2) + ((bytes[27] & 3) * 0.25)) / ctime); - } - - if (tras) { - *tras = ceil(bytes[30] / ctime); - } - - if (tcl) { - *tcl = highest_cas; - } -} - -static gchar *decode_ddr2_sdram(unsigned char *bytes, int *size) -{ - float ddr_clock; - float trcd, trp, tras, tcl; - int pc2_speed; - - decode_ddr2_module_speed(bytes, &ddr_clock, &pc2_speed); - decode_ddr2_module_size(bytes, size); - decode_ddr2_module_timings(bytes, &trcd, &trp, &tras, &tcl); - - return g_strdup_printf("[Module Information]\n" - "Module type=DDR2 %.2f MHz (PC2-%d)\n" - "SPD revision=%d.%d\n" - "[Timings]\n" - "tCL=%.2f\n" - "tRCD=%.2f\n" - "tRP=%.2f\n" - "tRAS=%.2f\n", ddr_clock, pc2_speed, bytes[62] >> 4, bytes[62] & 0xf, tcl, trcd, trp, tras); -} - -static void decode_ddr3_module_speed(unsigned char *bytes, float *ddr_clock, int *pc3_speed) -{ - float ctime; - float ddrclk; - int tbits, pcclk; - float mtb = 0.125; - - if (bytes[10] == 1 && bytes[11] == 8) - mtb = 0.125; - if (bytes[10] == 1 && bytes[11] == 15) - mtb = 0.0625; - ctime = mtb * bytes[12]; - - ddrclk = 2 * (1000 / ctime); - - tbits = 64; - switch (bytes[8]) { - case 1: - tbits = 16; - break; - case 4: - tbits = 32; - break; - case 3: - case 0xb: - tbits = 64; - break; - } - - pcclk = ddrclk * tbits / 8; - pcclk -= pcclk % 100; - - if (ddr_clock) { - *ddr_clock = (int) ddrclk; - } - if (pc3_speed) { - *pc3_speed = pcclk; - } -} - -static void decode_ddr3_module_size(unsigned char *bytes, int *size) -{ - *size = 512 << bytes[4]; -} - -static void decode_ddr3_module_timings(unsigned char *bytes, float *trcd, float *trp, float *tras, float *tcl) -{ - float ctime; - float highest_cas = 0; - int i; - float mtb = 0.125; - - if (bytes[10] == 1 && bytes[11] == 8) - mtb = 0.125; - if (bytes[10] == 1 && bytes[11] == 15) - mtb = 0.0625; - ctime = mtb * bytes[12]; - - switch (bytes[14]) { - case 6: - highest_cas = 5; - break; - case 4: - highest_cas = 6; - break; - case 0xc: - highest_cas = 7; - break; - case 0x1e: - highest_cas = 8; - break; - } - if (trcd) { - *trcd = bytes[18] * mtb; - } - - if (trp) { - *trp = bytes[20] * mtb; - } - - if (tras) { - *tras = (bytes[22] + bytes[21] & 0xf) * mtb; - } - - if (tcl) { - *tcl = highest_cas; - } -} - -static void decode_ddr3_module_type(unsigned char *bytes, const char **type) -{ - switch (bytes[3]) { - case 0x00: - *type = "Undefined"; - break; - case 0x01: - *type = "RDIMM (Registered Long DIMM)"; - break; - case 0x02: - *type = "UDIMM (Unbuffered Long DIMM)"; - break; - case 0x03: - *type = "SODIMM (Small Outline DIMM)"; - break; - default: - *type = "Unknown"; - } -} - -static gchar *decode_ddr3_sdram(unsigned char *bytes, int *size) -{ - float ddr_clock; - float trcd, trp, tras, tcl; - int pc3_speed; - const char *type; - - decode_ddr3_module_speed(bytes, &ddr_clock, &pc3_speed); - decode_ddr3_module_size(bytes, size); - decode_ddr3_module_timings(bytes, &trcd, &trp, &tras, &tcl); - decode_ddr3_module_type(bytes, &type); - - return g_strdup_printf("[Module Information]\n" - "Module type=DDR3 %.2f MHz (PC3-%d)\n" - "SPD revision=%d.%d\n" - "Type=%s\n" - "[Timings]\n" - "tCL=%.2f\n" - "tRCD=%.3fns\n" - "tRP=%.3fns\n" - "tRAS=%.3fns\n", - ddr_clock, pc3_speed, - bytes[1] >> 4, bytes[1] & 0xf, - type, - tcl, - trcd, - trp, - tras); -} - -static void decode_ddr3_part_number(unsigned char *bytes, char *part_number) -{ - int i; - if (part_number) { - for (i = 128; i <= 145; i++) - *part_number++ = bytes[i]; - *part_number = '\0'; - } -} - -static void decode_ddr3_manufacturer(unsigned char *bytes, char **manufacturer) -{ - char *out = "Unknown"; - - end: - if (manufacturer) { - *manufacturer = out; - } -} - -static void decode_module_manufacturer(unsigned char *bytes, char **manufacturer) -{ - char *out = "Unknown"; - unsigned char first; - int ai = 0; - int len = 8; - unsigned char *initial = bytes; - - if (!spd_written(bytes, 8)) { - out = "Undefined"; - goto end; - } - - do { - ai++; - } while ((--len && (*bytes++ == 0x7f))); - first = *--bytes; - - if (ai == 0) { - out = "Invalid"; - goto end; - } - - if (parity(first) != 1) { - out = "Invalid"; - goto end; - } - - out = (char *) vendors[ai - 1][(first & 0x7f) - 1]; - - end: - if (manufacturer) { - *manufacturer = out; - } -} - -static void decode_module_part_number(unsigned char *bytes, char *part_number) -{ - if (part_number) { - bytes += 8 + 64; - - while (*bytes++ && *bytes >= 32 && *bytes < 127) { - *part_number++ = *bytes; - } - *part_number = '\0'; - } -} - -static int decode_ram_type(unsigned char *bytes) -{ - if (bytes[0] < 4) { - switch (bytes[2]) { - case 1: - return DIRECT_RAMBUS; - case 17: - return RAMBUS; - } - } else { - switch (bytes[2]) { - case 1: - return FPM_DRAM; - case 2: - return EDO; - case 3: - return PIPELINED_NIBBLE; - case 4: - return SDR_SDRAM; - case 5: - return MULTIPLEXED_ROM; - case 6: - return DDR_SGRAM; - case 7: - return DDR_SDRAM; - case 8: - return DDR2_SDRAM; - case 11: - return DDR3_SDRAM; - } - } - - return UNKNOWN; -} - -static void read_spd(char *spd_path, int offset, size_t size, int use_sysfs, unsigned char *bytes_out) -{ - if (use_sysfs) { - FILE *spd; - gchar *temp_path; - - temp_path = g_strdup_printf("%s/eeprom", spd_path); - if ((spd = fopen(temp_path, "rb"))) { - fseek(spd, offset, SEEK_SET); - fread(bytes_out, 1, size, spd); - fclose(spd); - } - - g_free(temp_path); - } else { - int i; - - for (i = 0; i <= 3; i++) { - FILE *spd; - char *temp_path; - - temp_path = g_strdup_printf("%s/%02x", spd_path, offset + i * 16); - if ((spd = fopen(temp_path, "rb"))) { - fread(bytes_out + i * 16, 1, 16, spd); - fclose(spd); - } - - g_free(temp_path); - } - } -} - -static gchar *decode_dimms(GSList * dimm_list, gboolean use_sysfs) -{ - GSList *dimm; - GString *output; - gint count = 0; - - output = g_string_new(""); - - for (dimm = dimm_list; dimm; dimm = dimm->next, count++) { - gchar *spd_path = (gchar *) dimm->data; - gchar *manufacturer; - gchar *detailed_info; - gchar *moreinfo_key; - gchar part_number[32]; - unsigned char bytes[256]; - int module_size; - RamType ram_type; - - shell_status_pulse(); - - read_spd(spd_path, 0, 256, use_sysfs, bytes); - ram_type = decode_ram_type(bytes); - - switch (ram_type) { - case DDR2_SDRAM: - detailed_info = decode_ddr2_sdram(bytes, &module_size); - decode_module_part_number(bytes, part_number); - decode_module_manufacturer(bytes + 64, &manufacturer); - break; - case DDR3_SDRAM: - detailed_info = decode_ddr3_sdram(bytes, &module_size); - decode_ddr3_part_number(bytes, part_number); - decode_ddr3_manufacturer(bytes, &manufacturer); - break; - case DDR_SDRAM: - detailed_info = decode_ddr_sdram(bytes, &module_size); - decode_module_part_number(bytes, part_number); - decode_module_manufacturer(bytes + 64, &manufacturer); - break; - case SDR_SDRAM: - detailed_info = decode_sdr_sdram(bytes, &module_size); - decode_module_part_number(bytes, part_number); - decode_module_manufacturer(bytes + 64, &manufacturer); - break; - default: - DEBUG("Unsupported EEPROM type: %s\n", ram_types[ram_type]); - continue; - } - - - - gchar *key = g_strdup_printf("MEM%d", count); - moreinfo_add_with_prefix("DEV", key, g_strdup(detailed_info)); - g_free(key); - g_string_append_printf(output, "$MEM%d$%d=%s|%d MB|%s\n", count, count, part_number, module_size, manufacturer); - - g_free(spd_path); - g_free(detailed_info); - } - - return g_string_free(output, FALSE); -} - -void scan_spd_do(void) -{ - GDir *dir = NULL; - GSList *dimm_list = NULL; - gboolean use_sysfs = FALSE; - gchar *dir_entry; - gchar *list; - - if (g_file_test("/sys/bus/i2c/drivers/eeprom", G_FILE_TEST_EXISTS)) { - dir = g_dir_open("/sys/bus/i2c/drivers/eeprom", 0, NULL); - use_sysfs = TRUE; - } else if (g_file_test("/proc/sys/dev/sensors", G_FILE_TEST_EXISTS)) { - dir = g_dir_open("/proc/sys/dev/sensors", 0, NULL); - } - - if (!dir) { - g_free(spd_info); - if (!g_file_test("/sys/module/eeprom", G_FILE_TEST_EXISTS)) { - spd_info = g_strdup(_("[SPD]\n" - "Please load the eeprom module to obtain information about memory SPD=\n" - "[$ShellParam$]\n" - "ReloadInterval=500\n")); - } else { - spd_info = g_strdup(_("[SPD]\n" "Reading memory SPD not supported on this system=\n")); - } - - return; - } - - while ((dir_entry = (char *) g_dir_read_name(dir))) { - if (use_sysfs && isdigit(dir_entry[0])) { - dimm_list = g_slist_prepend(dimm_list, g_strdup_printf("/sys/bus/i2c/drivers/eeprom/%s", dir_entry)); - } else if (g_str_has_prefix(dir_entry, "eeprom-")) { - dimm_list = g_slist_prepend(dimm_list, g_strdup_printf("/proc/sys/dev/sensors/%s", dir_entry)); - } - } - - g_dir_close(dir); - - list = decode_dimms(dimm_list, use_sysfs); - g_slist_free(dimm_list); - - g_free(spd_info); - spd_info = g_strdup_printf("[%s]\n" - "%s\n" - "[$ShellParam$]\n" - "ViewType=1\n" - "ColumnTitle$TextValue=%s\n" /* Bank */ - "ColumnTitle$Extra1=%s\n" /* Size */ - "ColumnTitle$Extra2=%s\n" /* Manufacturer */ - "ColumnTitle$Value=%s\n" /* Model */ - "ShowColumnHeaders=true\n", - _("SPD"), list, - _("Bank"), _("Size"), _("Manufacturer"), _("Model") ); - g_free(list); -} diff --git a/modules/devices/storage.c b/modules/devices/storage.c deleted file mode 100644 index 0c393682..00000000 --- a/modules/devices/storage.c +++ /dev/null @@ -1,371 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <string.h> - -#include "hardinfo.h" -#include "devices.h" - -gchar *storage_icons = NULL; - -/* SCSI support by Pascal F.Martin <pascalmartin@earthlink.net> */ -void -__scan_scsi_devices(void) -{ - FILE *proc_scsi; - gchar buffer[256], *buf; - gint n = 0; - gint scsi_controller = 0; - gint scsi_channel = 0; - gint scsi_id = 0 ; - gint scsi_lun = 0; - gchar *vendor = NULL, *revision = NULL, *model = NULL; - gchar *scsi_storage_list; - - /* remove old devices from global device table */ - moreinfo_del_with_prefix("DEV:SCSI"); - - if (!g_file_test("/proc/scsi/scsi", G_FILE_TEST_EXISTS)) - return; - - scsi_storage_list = g_strdup(_("\n[SCSI Disks]\n")); - - if ((proc_scsi = fopen("/proc/scsi/scsi", "r"))) { - while (fgets(buffer, 256, proc_scsi)) { - buf = g_strstrip(buffer); - if (!strncmp(buf, "Host: scsi", 10)) { - sscanf(buf, - "Host: scsi%d Channel: %d Id: %d Lun: %d", - &scsi_controller, &scsi_channel, &scsi_id, &scsi_lun); - - n++; - } else if (!strncmp(buf, "Vendor: ", 8)) { - buf[17] = '\0'; - buf[41] = '\0'; - buf[53] = '\0'; - - vendor = g_strdup(g_strstrip(buf + 8)); - model = g_strdup_printf("%s %s", vendor, g_strstrip(buf + 24)); - revision = g_strdup(g_strstrip(buf + 46)); - } else if (!strncmp(buf, "Type: ", 8)) { - char *p; - gchar *type = NULL, *icon = NULL; - - if (!(p = strstr(buf, "ANSI SCSI revision"))) { - p = strstr(buf, "ANSI SCSI revision"); - } - - if (p != NULL) { - while (*(--p) == ' '); - *(++p) = 0; - - static struct { - char *type; - char *label; - char *icon; - } type2icon[] = { - { "Direct-Access", "Disk", "hdd"}, - { "Sequential-Access", "Tape", "tape"}, - { "Printer", "Printer", "lpr"}, - { "WORM", "CD-ROM", "cdrom"}, - { "CD-ROM", "CD-ROM", "cdrom"}, - { "Scanner", "Scanner", "scanner"}, - { "Flash Disk", "USB Flash Disk", "usbfldisk" }, - { NULL, "Generic", "scsi"} - }; - int i; - - if (model && strstr(model, "Flash Disk")) { - type = "Flash Disk"; - icon = "usbfldisk"; - } else { - for (i = 0; type2icon[i].type != NULL; i++) - if (g_str_equal(buf + 8, type2icon[i].type)) - break; - - type = type2icon[i].label; - icon = type2icon[i].icon; - } - } - - gchar *devid = g_strdup_printf("SCSI%d", n); - scsi_storage_list = h_strdup_cprintf("$%s$%s=\n", scsi_storage_list, devid, model); - storage_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", storage_icons, devid, model, icon); - - gchar *strhash = g_strdup_printf(_("[Device Information]\n" - "Model=%s\n"), model); - - const gchar *url = vendor_get_url(model); - if (url) { - strhash = h_strdup_cprintf(_("Vendor=%s (%s)\n"), - strhash, - vendor_get_name(model), - url); - } else { - strhash = h_strdup_cprintf(_("Vendor=%s\n"), - strhash, - vendor_get_name(model)); - } - - strhash = h_strdup_cprintf(_("Type=%s\n" - "Revision=%s\n" - "[SCSI Controller]\n" - "Controller=scsi%d\n" - "Channel=%d\n" - "ID=%d\n" "LUN=%d\n"), - strhash, - type, - revision, - scsi_controller, - scsi_channel, - scsi_id, - scsi_lun); - moreinfo_add_with_prefix("DEV", devid, strhash); - g_free(devid); - - g_free(model); - g_free(revision); - g_free(vendor); - - scsi_controller = scsi_channel = scsi_id = scsi_lun = 0; - } - } - fclose(proc_scsi); - } - - if (n) { - storage_list = h_strconcat(storage_list, scsi_storage_list, NULL); - g_free(scsi_storage_list); - } -} - -void __scan_ide_devices(void) -{ - FILE *proc_ide; - gchar *device, iface, *model, *media, *pgeometry = NULL, *lgeometry = NULL; - gint n = 0, i = 0, cache, nn = 0; - gchar *capab = NULL, *speed = NULL, *driver = NULL, *ide_storage_list; - - /* remove old devices from global device table */ - moreinfo_del_with_prefix("DEV:IDE"); - - ide_storage_list = g_strdup(_("\n[IDE Disks]\n")); - - iface = 'a'; - for (i = 0; i <= 16; i++) { - device = g_strdup_printf("/proc/ide/hd%c/model", iface); - if (g_file_test(device, G_FILE_TEST_EXISTS)) { - gchar buf[128]; - - cache = 0; - - proc_ide = fopen(device, "r"); - if (!proc_ide) - continue; - - (void) fgets(buf, 128, proc_ide); - fclose(proc_ide); - - buf[strlen(buf) - 1] = 0; - - model = g_strdup(buf); - - g_free(device); - - device = g_strdup_printf("/proc/ide/hd%c/media", iface); - proc_ide = fopen(device, "r"); - if (!proc_ide) { - free(model); - continue; - } - - (void) fgets(buf, 128, proc_ide); - fclose(proc_ide); - buf[strlen(buf) - 1] = 0; - - media = g_strdup(buf); - if (g_str_equal(media, "cdrom")) { - /* obtain cd-rom drive information from cdrecord */ - GTimer *timer; - gchar *tmp = g_strdup_printf("cdrecord dev=/dev/hd%c -prcap 2>/dev/stdout", iface); - FILE *prcap; - - if ((prcap = popen(tmp, "r"))) { - /* we need a timeout so cdrecord does not try to get information on cd drives - with inserted media, which is not possible currently. half second should be - enough. */ - timer = g_timer_new(); - g_timer_start(timer); - - while (fgets(buf, 128, prcap) - && g_timer_elapsed(timer, NULL) < 0.5) { - if (g_str_has_prefix(buf, " Does")) { - if (g_str_has_suffix(buf, "media\n") - && !strstr(buf, "speed")) { - gchar *media_type = g_strstrip(strstr(buf, "Does ")); - gchar **ttmp = g_strsplit(media_type, " ", 0); - - capab = h_strdup_cprintf("\nCan %s#%d=%s\n", capab, ttmp[1], ++nn, ttmp[2]); - - g_strfreev(ttmp); - } else if (strstr(buf, "Buffer-Underrun-Free")) { - capab = - h_strdup_cprintf - ("\nSupports BurnProof=%s\n", capab, strstr(buf, "Does not") ? "No" : "Yes"); - } else if (strstr(buf, "multi-session")) { - capab = - h_strdup_cprintf - ("\nCan read multi-session CDs=%s\n", - capab, strstr(buf, "Does not") ? "No" : "Yes"); - } else if (strstr(buf, "audio CDs")) { - capab = - h_strdup_cprintf - ("\nCan play audio CDs=%s\n", capab, strstr(buf, "Does not") ? "No" : "Yes"); - } else if (strstr(buf, "PREVENT/ALLOW")) { - capab = - h_strdup_cprintf - ("\nCan lock media=%s\n", capab, strstr(buf, "Does not") ? "No" : "Yes"); - } - } else if ((strstr(buf, "read") - || strstr(buf, "write")) - && strstr(buf, "kB/s")) { - speed = - g_strconcat(speed ? speed : "", strreplacechr(g_strstrip(buf), ":", '='), "\n", NULL); - } else if (strstr(buf, "Device seems to be")) { - driver = g_strdup_printf(_("Driver=%s\n"), strchr(buf, ':') + 1); - } - } - - pclose(prcap); - g_timer_destroy(timer); - } - - g_free(tmp); - } - g_free(device); - - device = g_strdup_printf("/proc/ide/hd%c/cache", iface); - if (g_file_test(device, G_FILE_TEST_EXISTS)) { - proc_ide = fopen(device, "r"); - if (proc_ide) { - (void) fscanf(proc_ide, "%d", &cache); - fclose(proc_ide); - } else { - cache = 0; - } - } - g_free(device); - - device = g_strdup_printf("/proc/ide/hd%c/geometry", iface); - if (g_file_test(device, G_FILE_TEST_EXISTS)) { - gchar *tmp; - - proc_ide = fopen(device, "r"); - if (proc_ide) { - (void) fgets(buf, 64, proc_ide); - for (tmp = buf; *tmp; tmp++) { - if (*tmp >= '0' && *tmp <= '9') - break; - } - - pgeometry = g_strdup(g_strstrip(tmp)); - - (void) fgets(buf, 64, proc_ide); - for (tmp = buf; *tmp; tmp++) { - if (*tmp >= '0' && *tmp <= '9') - break; - } - lgeometry = g_strdup(g_strstrip(tmp)); - - fclose(proc_ide); - } else { - pgeometry = g_strdup("Unknown"); - lgeometry = g_strdup("Unknown"); - } - - } - g_free(device); - - n++; - - gchar *devid = g_strdup_printf("IDE%d", n); - - ide_storage_list = h_strdup_cprintf("$%s$%s=\n", ide_storage_list, devid, model); - storage_icons = - h_strdup_cprintf("Icon$%s$%s=%s.png\n", storage_icons, - devid, model, g_str_equal(media, "cdrom") ? "cdrom" : "hdd"); - - gchar *strhash = g_strdup_printf(_("[Device Information]\n" "Model=%s\n"), - model); - - const gchar *url = vendor_get_url(model); - - if (url) { - strhash = h_strdup_cprintf(_("Vendor=%s (%s)\n"), strhash, vendor_get_name(model), url); - } else { - strhash = h_strdup_cprintf(_("Vendor=%s\n"), strhash, vendor_get_name(model)); - } - - strhash = h_strdup_cprintf(_("Device Name=hd%c\n" - "Media=%s\n" "Cache=%dkb\n"), strhash, iface, media, cache); - if (driver) { - strhash = h_strdup_cprintf("%s\n", strhash, driver); - - g_free(driver); - driver = NULL; - } - - if (pgeometry && lgeometry) { - strhash = h_strdup_cprintf(_("[Geometry]\n" - "Physical=%s\n" "Logical=%s\n"), strhash, pgeometry, lgeometry); - - g_free(pgeometry); - pgeometry = NULL; - g_free(lgeometry); - lgeometry = NULL; - } - - if (capab) { - strhash = h_strdup_cprintf(_("[Capabilities]\n%s"), strhash, capab); - - g_free(capab); - capab = NULL; - } - - if (speed) { - strhash = h_strdup_cprintf(_("[Speeds]\n%s"), strhash, speed); - - g_free(speed); - speed = NULL; - } - - moreinfo_add_with_prefix("DEV", devid, strhash); - g_free(devid); - g_free(model); - } else { - g_free(device); - } - - iface++; - } - - if (n) { - storage_list = h_strconcat(storage_list, ide_storage_list, NULL); - g_free(ide_storage_list); - } -} diff --git a/modules/devices/usb.c b/modules/devices/usb.c deleted file mode 100644 index 9366c7ce..00000000 --- a/modules/devices/usb.c +++ /dev/null @@ -1,436 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -/* - * FIXME: - * - listing with sysfs does not generate device hierarchy - */ - -#include <string.h> - -#include "hardinfo.h" -#include "devices.h" - -gchar *usb_list = NULL; - -void __scan_usb_sysfs_add_device(gchar * endpoint, int n) -{ - gchar *manufacturer, *product, *mxpwr, *tmp, *strhash; - gint bus, classid, vendor, prodid; - gfloat version, speed; - - classid = h_sysfs_read_int(endpoint, "bDeviceClass"); - vendor = h_sysfs_read_int(endpoint, "idVendor"); - prodid = h_sysfs_read_int(endpoint, "idProduct"); - bus = h_sysfs_read_int(endpoint, "busnum"); - speed = h_sysfs_read_float(endpoint, "speed"); - version = h_sysfs_read_float(endpoint, "version"); - - if (!(mxpwr = h_sysfs_read_string(endpoint, "bMaxPower"))) { - mxpwr = g_strdup_printf("%d %s", 0 , _("mA") ); - } - - if (!(manufacturer = h_sysfs_read_string(endpoint, "manufacturer"))) { - manufacturer = g_strdup(_("(Unknown)")); - } - - if (!(product = h_sysfs_read_string(endpoint, "product"))) { - if (classid == 9) { - product = g_strdup_printf(_(/*/%.2f is version*/ "USB %.2f Hub"), version); - } else { - product = g_strdup_printf(_("Unknown USB %.2f Device (class %d)"), version, classid); - } - } - - const gchar *v_url = vendor_get_url(manufacturer); - const gchar *v_name = vendor_get_name(manufacturer); - gchar *v_str; - if (v_url != NULL) { - v_str = g_strdup_printf("%s (%s)", v_name, v_url); - } else { - v_str = g_strdup_printf("%s", manufacturer); - } - - tmp = g_strdup_printf("USB%d", n); - usb_list = h_strdup_cprintf("$%s$%s=\n", usb_list, tmp, product); - - strhash = g_strdup_printf("[%s]\n" - /* Product */ "%s=%s\n" - /* Manufacturer */ "%s=%s\n" - /* Speed */ "%s=%.2f %s\n" - /* Max Current */ "%s=%s\n" - "[%s]\n" - /* USB Version */ "%s=%.2f\n" - /* Class */ "%s=0x%x\n" - /* Vendor */ "%s=0x%x\n" - /* Product ID */ "%s=0x%x\n" - /* Bus */ "%s=%d\n", - _("Device Information"), - _("Product"), product, - _("Manufacturer"), v_str, - _("Speed"), speed, _("Mbit/s"), - _("Max Current"), mxpwr, - _("Misc"), - _("USB Version"), version, - _("Class"), classid, - _("Vendor ID"), vendor, - _("Product ID"), prodid, - _("Bus"), bus); - - moreinfo_add_with_prefix("DEV", tmp, strhash); - g_free(tmp); - g_free(v_str); - g_free(manufacturer); - g_free(product); - g_free(mxpwr); -} - -gboolean __scan_usb_sysfs(void) -{ - GDir *sysfs; - gchar *filename; - const gchar *sysfs_path = "/sys/class/usb_endpoint"; - gint usb_device_number = 0; - - if (!(sysfs = g_dir_open(sysfs_path, 0, NULL))) { - return FALSE; - } - - if (usb_list) { - moreinfo_del_with_prefix("DEV:USB"); - g_free(usb_list); - } - usb_list = g_strdup_printf("[%s]\n", _("USB Devices")); - - while ((filename = (gchar *) g_dir_read_name(sysfs))) { - gchar *endpoint = - g_build_filename(sysfs_path, filename, "device", NULL); - gchar *temp; - - temp = g_build_filename(endpoint, "idVendor", NULL); - if (g_file_test(temp, G_FILE_TEST_EXISTS)) { - __scan_usb_sysfs_add_device(endpoint, ++usb_device_number); - } - - g_free(temp); - g_free(endpoint); - } - - g_dir_close(sysfs); - - return usb_device_number > 0; -} - -gboolean __scan_usb_procfs(void) -{ - FILE *dev; - gchar buffer[128]; - gchar *tmp, *manuf = NULL, *product = NULL, *mxpwr = NULL; - gint bus = 0, level = 0, port = 0, classid = 0, trash; - gint vendor = 0, prodid = 0; - gfloat ver = 0.0f, rev = 0.0f, speed = 0.0f; - int n = 0; - - dev = fopen("/proc/bus/usb/devices", "r"); - if (!dev) - return 0; - - if (usb_list) { - moreinfo_del_with_prefix("DEV:USB"); - g_free(usb_list); - } - usb_list = g_strdup_printf("[%s]\n", _("USB Devices")); - - while (fgets(buffer, 128, dev)) { - tmp = buffer; - - switch (*tmp) { - case 'T': - sscanf(tmp, - "T: Bus=%d Lev=%d Prnt=%d Port=%d Cnt=%d Dev#=%d Spd=%f", - &bus, &level, &trash, &port, &trash, &trash, &speed); - break; - case 'D': - sscanf(tmp, "D: Ver=%f Cls=%x", &ver, &classid); - break; - case 'P': - sscanf(tmp, "P: Vendor=%x ProdID=%x Rev=%f", &vendor, &prodid, &rev); - break; - case 'S': - if (strstr(tmp, "Manufacturer=")) { - manuf = g_strdup(strchr(tmp, '=') + 1); - remove_linefeed(manuf); - } else if (strstr(tmp, "Product=")) { - product = g_strdup(strchr(tmp, '=') + 1); - remove_linefeed(product); - } - break; - case 'C': - mxpwr = strstr(buffer, "MxPwr=") + 6; - - tmp = g_strdup_printf("USB%d", ++n); - - if (product && *product == '\0') { - g_free(product); - if (classid == 9) { - product = g_strdup_printf(_("USB %.2f Hub"), ver); - } else { - product = g_strdup_printf(_("Unknown USB %.2f Device (class %d)"), ver, classid); - } - } - - if (classid == 9) { /* hub */ - usb_list = h_strdup_cprintf("[%s#%d]\n", usb_list, product, n); - } else { /* everything else */ - usb_list = h_strdup_cprintf("$%s$%s=\n", usb_list, tmp, product); - - EMPIFNULL(manuf); - const gchar *v_url = vendor_get_url(manuf); - const gchar *v_name = vendor_get_name(manuf); - gchar *v_str = NULL; - if (strlen(manuf)) { - if (v_url != NULL) - v_str = g_strdup_printf("%s (%s)", v_name, v_url); - else - v_str = g_strdup_printf("%s", manuf); - } - UNKIFNULL(v_str); - UNKIFNULL(product); - - gchar *strhash = g_strdup_printf("[%s]\n" "%s=%s\n" "%s=%s\n", - _("Device Information"), - _("Product"), product, - _("Manufacturer"), v_str); - - strhash = h_strdup_cprintf("[%s #%d]\n" - /* Speed */ "%s=%.2f %s\n" - /* Max Current */ "%s=%s\n" - "[%s]\n" - /* USB Version */ "%s=%.2f\n" - /* Revision */ "%s=%.2f\n" - /* Class */ "%s=0x%x\n" - /* Vendor */ "%s=0x%x\n" - /* Product ID */ "%s=0x%x\n" - /* Bus */ "%s=%d\n" - /* Level */ "%s=%d\n", - strhash, - _("Port"), port, - _("Speed"), speed, _("Mbit/s"), - _("Max Current"), mxpwr, - _("Misc"), - _("USB Version"), ver, - _("Revision"), rev, - _("Class"), classid, - _("Vendor ID"), vendor, - _("Product ID"), prodid, - _("Bus"), bus, - _("Level"), level); - - moreinfo_add_with_prefix("DEV", tmp, strhash); - g_free(v_str); - g_free(tmp); - } - - g_free(manuf); - g_free(product); - manuf = NULL; - product = NULL; - port = classid = 0; - } - } - - fclose(dev); - - return n > 0; -} - - -void __scan_usb_lsusb_add_device(char *buffer, int bufsize, FILE * lsusb, int usb_device_number) -{ - gint bus, device, vendor_id, product_id; - gchar *version = NULL, *product = NULL, *vendor = NULL, *dev_class = NULL, *int_class = NULL; - gchar *max_power = NULL, *name = NULL; - gchar *tmp, *strhash; - long position = 0; - - g_strstrip(buffer); - sscanf(buffer, "Bus %d Device %d: ID %x:%x", &bus, &device, &vendor_id, &product_id); - name = g_strdup(buffer + 33); - - for (fgets(buffer, bufsize, lsusb); position >= 0 && fgets(buffer, bufsize, lsusb); position = ftell(lsusb)) { - g_strstrip(buffer); - - if (g_str_has_prefix(buffer, "idVendor")) { - g_free(vendor); - vendor = g_strdup(buffer + 26); - } else if (g_str_has_prefix(buffer, "idProduct")) { - g_free(product); - product = g_strdup(buffer + 26); - } else if (g_str_has_prefix(buffer, "MaxPower")) { - g_free(max_power); - max_power = g_strdup(buffer + 9); - } else if (g_str_has_prefix(buffer, "bcdUSB")) { - g_free(version); - version = g_strdup(buffer + 7); - } else if (g_str_has_prefix(buffer, "bDeviceClass")) { - g_free(dev_class); - dev_class = g_strdup(buffer + 14); - } else if (g_str_has_prefix(buffer, "bInterfaceClass")) { - g_free(int_class); - int_class = g_strdup(buffer + 16); - } else if (g_str_has_prefix(buffer, "Bus ")) { - /* device separator */ - fseek(lsusb, position, SEEK_SET); - break; - } - } - - if (dev_class && strstr(dev_class, "0 (Defined at Interface level)")) { - g_free(dev_class); - if (int_class) { - dev_class = int_class; - } else { - dev_class = g_strdup(_("(Unknown)")); - } - } else - dev_class = g_strdup(_("(Unknown)")); - - tmp = g_strdup_printf("USB%d", usb_device_number); - usb_list = h_strdup_cprintf("$%s$%s=\n", usb_list, tmp, name); - - const gchar *v_url = vendor_get_url(vendor); - const gchar *v_name = vendor_get_name(vendor); - gchar *v_str; - if (v_url != NULL) { - v_str = g_strdup_printf("%s (%s)", v_name, v_url); - } else { - v_str = g_strdup_printf("%s", g_strstrip(vendor) ); - } - - if (max_power != NULL) { - int mA = atoi(g_strstrip(max_power)); - gchar *trent_steel = g_strdup_printf("%d %s", mA, _("mA")); - g_free(max_power); - max_power = trent_steel; - } - - UNKIFNULL(product); - UNKIFNULL(v_str); - UNKIFNULL(max_power); - UNKIFNULL(version); - UNKIFNULL(dev_class); - - strhash = g_strdup_printf("[%s]\n" - /* Product */ "%s=%s\n" - /* Manufacturer */ "%s=%s\n" - /* Max Current */ "%s=%s\n" - "[%s]\n" - /* USB Version */ "%s=%s\n" - /* Class */ "%s=%s\n" - /* Vendor ID */ "%s=0x%x\n" - /* Product ID */ "%s=0x%x\n" - /* Bus */ "%s=%d\n", - _("Device Information"), - _("Product"), g_strstrip(product), - _("Vendor"), v_str, - _("Max Current"), g_strstrip(max_power), - _("Misc"), - _("USB Version"), g_strstrip(version), - _("Class"), g_strstrip(dev_class), - _("Vendor ID"), vendor_id, - _("Product ID"), product_id, - _("Bus"), bus); - - moreinfo_add_with_prefix("DEV", tmp, strhash); - g_free(v_str); - g_free(vendor); - g_free(product); - g_free(max_power); - g_free(dev_class); - g_free(version); - g_free(tmp); - g_free(name); -} - -gboolean __scan_usb_lsusb(void) -{ - static gchar *lsusb_path = NULL; - int usb_device_number = 0; - FILE *lsusb; - FILE *temp_lsusb; - char buffer[512], *temp; - - if (!lsusb_path) { - if (!(lsusb_path = find_program("lsusb"))) { - DEBUG("lsusb not found"); - - return FALSE; - } - } - - temp = g_strdup_printf("%s -v | tr '[]' '()'", lsusb_path); - if (!(lsusb = popen(temp, "r"))) { - DEBUG("cannot run %s", lsusb_path); - - g_free(temp); - return FALSE; - } - - temp_lsusb = tmpfile(); - if (!temp_lsusb) { - DEBUG("cannot create temporary file for lsusb"); - pclose(lsusb); - g_free(temp); - return FALSE; - } - - while (fgets(buffer, sizeof(buffer), lsusb)) { - fputs(buffer, temp_lsusb); - } - - pclose(lsusb); - - // rewind file so we can read from it - fseek(temp_lsusb, 0, SEEK_SET); - - g_free(temp); - - if (usb_list) { - moreinfo_del_with_prefix("DEV:USB"); - g_free(usb_list); - } - usb_list = g_strdup_printf("[%s]\n", _("USB Devices")); - - while (fgets(buffer, sizeof(buffer), temp_lsusb)) { - if (g_str_has_prefix(buffer, "Bus ")) { - __scan_usb_lsusb_add_device(buffer, sizeof(buffer), temp_lsusb, ++usb_device_number); - } - } - - fclose(temp_lsusb); - - return usb_device_number > 0; -} - -void __scan_usb(void) -{ - if (!__scan_usb_procfs()) { - if (!__scan_usb_sysfs()) { - __scan_usb_lsusb(); - } - } -} diff --git a/modules/devices/x86/processor.c b/modules/devices/x86/processor.c deleted file mode 100644 index f1c2b6e9..00000000 --- a/modules/devices/x86/processor.c +++ /dev/null @@ -1,747 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "devices.h" -#include "cpu_util.h" - -#include "x86_data.h" -#include "x86_data.c" - -/* - * This function is partly based on x86cpucaps - * by Osamu Kayasono <jacobi@jcom.home.ne.jp> - */ -void get_processor_strfamily(Processor * processor) -{ - gint family = processor->family; - gint model = processor->model; - - if (g_str_equal(processor->vendor_id, "GenuineIntel")) { - if (family == 4) { - processor->strmodel = g_strdup("i486 series"); - } else if (family == 5) { - if (model < 4) { - processor->strmodel = g_strdup("Pentium Classic"); - } else { - processor->strmodel = g_strdup("Pentium MMX"); - } - } else if (family == 6) { - if (model <= 1) { - processor->strmodel = g_strdup("Pentium Pro"); - } else if (model < 7) { - processor->strmodel = g_strdup("Pentium II/Pentium II Xeon/Celeron"); - } else if (model == 9) { - processor->strmodel = g_strdup("Pentium M"); - } else { - processor->strmodel = g_strdup("Pentium III/Pentium III Xeon/Celeron/Core Duo/Core Duo 2"); - } - } else if (family > 6) { - processor->strmodel = g_strdup("Pentium 4"); - } else { - processor->strmodel = g_strdup("i386 class"); - } - } else if (g_str_equal(processor->vendor_id, "AuthenticAMD")) { - if (family == 4) { - if (model <= 9) { - processor->strmodel = g_strdup("AMD i80486 series"); - } else { - processor->strmodel = g_strdup("AMD 5x86"); - } - } else if (family == 5) { - if (model <= 3) { - processor->strmodel = g_strdup("AMD K5"); - } else if (model <= 7) { - processor->strmodel = g_strdup("AMD K6"); - } else if (model == 8) { - processor->strmodel = g_strdup("AMD K6-2"); - } else if (model == 9) { - processor->strmodel = g_strdup("AMD K6-III"); - } else { - processor->strmodel = g_strdup("AMD K6-2+/III+"); - } - } else if (family == 6) { - if (model == 1) { - processor->strmodel = g_strdup("AMD Athlon (K7)"); - } else if (model == 2) { - processor->strmodel = g_strdup("AMD Athlon (K75)"); - } else if (model == 3) { - processor->strmodel = g_strdup("AMD Duron (Spitfire)"); - } else if (model == 4) { - processor->strmodel = g_strdup("AMD Athlon (Thunderbird)"); - } else if (model == 6) { - processor->strmodel = g_strdup("AMD Athlon XP/MP/4 (Palomino)"); - } else if (model == 7) { - processor->strmodel = g_strdup("AMD Duron (Morgan)"); - } else if (model == 8) { - processor->strmodel = g_strdup("AMD Athlon XP/MP (Thoroughbred)"); - } else if (model == 10) { - processor->strmodel = g_strdup("AMD Athlon XP/MP (Barton)"); - } else { - processor->strmodel = g_strdup("AMD Athlon (unknown)"); - } - } else if (family > 6) { - processor->strmodel = g_strdup("AMD Opteron/Athlon64/FX"); - } else { - processor->strmodel = g_strdup("AMD i386 class"); - } - } else if (g_str_equal(processor->vendor_id, "CyrixInstead")) { - if (family == 4) { - processor->strmodel = g_strdup("Cyrix 5x86"); - } else if (family == 5) { - processor->strmodel = g_strdup("Cyrix M1 (6x86)"); - } else if (family == 6) { - if (model == 0) { - processor->strmodel = g_strdup("Cyrix M2 (6x86MX)"); - } else if (model <= 5) { - processor->strmodel = g_strdup("VIA Cyrix III (M2 core)"); - } else if (model == 6) { - processor->strmodel = g_strdup("VIA Cyrix III (WinChip C5A)"); - } else if (model == 7) { - processor->strmodel = g_strdup("VIA Cyrix III (WinChip C5B/C)"); - } else { - processor->strmodel = g_strdup("VIA Cyrix III (WinChip C5C-T)"); - } - } else { - processor->strmodel = g_strdup("Cyrix i386 class"); - } - } else if (g_str_equal(processor->vendor_id, "CentaurHauls")) { - if (family == 5) { - if (model <= 4) { - processor->strmodel = g_strdup("Centaur WinChip C6"); - } else if (model <= 8) { - processor->strmodel = g_strdup("Centaur WinChip 2"); - } else { - processor->strmodel = g_strdup("Centaur WinChip 2A"); - } - } else { - processor->strmodel = g_strdup("Centaur i386 class"); - } - } else if (g_str_equal(processor->vendor_id, "GenuineTMx86")) { - processor->strmodel = g_strdup("Transmeta Crusoe TM3x00/5x00"); - } else { - processor->strmodel = g_strdup("Unknown"); - } -} - -static gchar *__cache_get_info_as_string(Processor *processor) -{ - gchar *result = g_strdup(""); - GSList *cache_list; - ProcessorCache *cache; - - if (!processor->cache) { - return g_strdup(_("Cache information not available=\n")); - } - - for (cache_list = processor->cache; cache_list; cache_list = cache_list->next) { - cache = (ProcessorCache *)cache_list->data; - - result = h_strdup_cprintf(_("Level %d (%s)=%d-way set-associative, %d sets, %dKB size\n"), - result, - cache->level, - C_("cache-type", cache->type), - cache->ways_of_associativity, - cache->number_of_sets, - cache->size); - } - - return result; -} - -/* This is not used directly, but creates translatable strings for - * the type string returned from /sys/.../cache */ -static const char* cache_types[] = { - NC_("cache-type", /*/cache type, as appears in: Level 1 (Data)*/ "Data"), - NC_("cache-type", /*/cache type, as appears in: Level 1 (Instruction)*/ "Instruction"), - NC_("cache-type", /*/cache type, as appears in: Level 2 (Unified)*/ "Unified") -}; - -static void __cache_obtain_info(Processor *processor) -{ - ProcessorCache *cache; - gchar *endpoint, *entry, *index; - gchar *uref = NULL; - gint i; - gint processor_number = processor->id; - - endpoint = g_strdup_printf("/sys/devices/system/cpu/cpu%d/cache", processor_number); - - for (i = 0; ; i++) { - cache = g_new0(ProcessorCache, 1); - - index = g_strdup_printf("index%d/", i); - - entry = g_strconcat(index, "type", NULL); - cache->type = h_sysfs_read_string(endpoint, entry); - g_free(entry); - - if (!cache->type) { - g_free(cache); - g_free(index); - goto fail; - } - - entry = g_strconcat(index, "level", NULL); - cache->level = h_sysfs_read_int(endpoint, entry); - g_free(entry); - - entry = g_strconcat(index, "number_of_sets", NULL); - cache->number_of_sets = h_sysfs_read_int(endpoint, entry); - g_free(entry); - - entry = g_strconcat(index, "physical_line_partition", NULL); - cache->physical_line_partition = h_sysfs_read_int(endpoint, entry); - g_free(entry); - - entry = g_strconcat(index, "size", NULL); - cache->size = h_sysfs_read_int(endpoint, entry); - g_free(entry); - - entry = g_strconcat(index, "ways_of_associativity", NULL); - cache->ways_of_associativity = h_sysfs_read_int(endpoint, entry); - g_free(entry); - - /* unique cache references: id is nice, but share_cpu_list can be - * used if it is not available. */ - entry = g_strconcat(index, "id", NULL); - uref = h_sysfs_read_string(endpoint, entry); - g_free(entry); - if (uref != NULL && *uref != 0 ) - cache->uid = atoi(uref); - else - cache->uid = -1; - g_free(uref); - entry = g_strconcat(index, "shared_cpu_list", NULL); - cache->shared_cpu_list = h_sysfs_read_string(endpoint, entry); - g_free(entry); - - /* reacharound */ - entry = g_strconcat(index, "../../topology/physical_package_id", NULL); - cache->phy_sock = h_sysfs_read_int(endpoint, entry); - g_free(entry); - - g_free(index); - - processor->cache = g_slist_append(processor->cache, cache); - } - -fail: - g_free(endpoint); -} - -#define khzint_to_mhzdouble(k) (((double)k)/1000) -#define cmp_clocks_test(f) if (a->f < b->f) return -1; if (a->f > b->f) return 1; - -static gint cmp_cpufreq_data(cpufreq_data *a, cpufreq_data *b) { - gint i = 0; - i = g_strcmp0(a->shared_list, b->shared_list); if (i!=0) return i; - cmp_clocks_test(cpukhz_max); - cmp_clocks_test(cpukhz_min); - return 0; -} - -static gint cmp_cpufreq_data_ignore_affected(cpufreq_data *a, cpufreq_data *b) { - gint i = 0; - cmp_clocks_test(cpukhz_max); - cmp_clocks_test(cpukhz_min); - return 0; -} - -gchar *clocks_summary(GSList * processors) -{ - gchar *ret = g_strdup_printf("[%s]\n", _("Clocks")); - GSList *all_clocks = NULL, *uniq_clocks = NULL; - GSList *tmp, *l; - Processor *p; - cpufreq_data *c, *cur = NULL; - gint cur_count = 0, i = 0; - - /* create list of all clock references */ - for (l = processors; l; l = l->next) { - p = (Processor*)l->data; - if (p->cpufreq) { - all_clocks = g_slist_prepend(all_clocks, p->cpufreq); - } - } - - if (g_slist_length(all_clocks) == 0) { - ret = h_strdup_cprintf("%s=\n", ret, _("(Not Available)") ); - g_slist_free(all_clocks); - return ret; - } - - /* ignore duplicate references */ - all_clocks = g_slist_sort(all_clocks, (GCompareFunc)cmp_cpufreq_data); - for (l = all_clocks; l; l = l->next) { - c = (cpufreq_data*)l->data; - if (!cur) { - cur = c; - } else { - if (cmp_cpufreq_data(cur, c) != 0) { - uniq_clocks = g_slist_prepend(uniq_clocks, cur); - cur = c; - } - } - } - uniq_clocks = g_slist_prepend(uniq_clocks, cur); - uniq_clocks = g_slist_reverse(uniq_clocks); - cur = 0, cur_count = 0; - - /* count and list clocks */ - for (l = uniq_clocks; l; l = l->next) { - c = (cpufreq_data*)l->data; - if (!cur) { - cur = c; - cur_count = 1; - } else { - if (cmp_cpufreq_data_ignore_affected(cur, c) != 0) { - ret = h_strdup_cprintf(_("%.2f-%.2f %s=%dx\n"), - ret, - khzint_to_mhzdouble(cur->cpukhz_min), - khzint_to_mhzdouble(cur->cpukhz_max), - _("MHz"), - cur_count); - cur = c; - cur_count = 1; - } else { - cur_count++; - } - } - } - ret = h_strdup_cprintf(_("%.2f-%.2f %s=%dx\n"), - ret, - khzint_to_mhzdouble(cur->cpukhz_min), - khzint_to_mhzdouble(cur->cpukhz_max), - _("MHz"), - cur_count); - - g_slist_free(all_clocks); - g_slist_free(uniq_clocks); - return ret; -} - -#define cmp_cache_test(f) if (a->f < b->f) return -1; if (a->f > b->f) return 1; - -static gint cmp_cache(ProcessorCache *a, ProcessorCache *b) { - gint i = 0; - cmp_cache_test(phy_sock); - i = g_strcmp0(a->type, b->type); if (i!=0) return i; - cmp_cache_test(level); - cmp_cache_test(size); - cmp_cache_test(uid); /* uid is unique among caches with the same (type, level) */ - if (a->uid == -1) { - /* if id wasn't available, use shared_cpu_list as a unique ref */ - i = g_strcmp0(a->shared_cpu_list, b->shared_cpu_list); if (i!=0) - return i; - } - return 0; -} - -static gint cmp_cache_ignore_id(ProcessorCache *a, ProcessorCache *b) { - gint i = 0; - cmp_cache_test(phy_sock); - i = g_strcmp0(a->type, b->type); if (i!=0) return i; - cmp_cache_test(level); - cmp_cache_test(size); - return 0; -} - -gchar *caches_summary(GSList * processors) -{ - gchar *ret = g_strdup_printf("[%s]\n", _("Caches")); - GSList *all_cache = NULL, *uniq_cache = NULL; - GSList *tmp, *l; - Processor *p; - ProcessorCache *c, *cur = NULL; - gint cur_count = 0, i = 0; - - /* create list of all cache references */ - for (l = processors; l; l = l->next) { - p = (Processor*)l->data; - if (p->cache) { - tmp = g_slist_copy(p->cache); - if (all_cache) { - all_cache = g_slist_concat(all_cache, tmp); - } else { - all_cache = tmp; - } - } - } - - if (g_slist_length(all_cache) == 0) { - ret = h_strdup_cprintf("%s=\n", ret, _("(Not Available)") ); - g_slist_free(all_cache); - return ret; - } - - /* ignore duplicate references */ - all_cache = g_slist_sort(all_cache, (GCompareFunc)cmp_cache); - for (l = all_cache; l; l = l->next) { - c = (ProcessorCache*)l->data; - if (!cur) { - cur = c; - } else { - if (cmp_cache(cur, c) != 0) { - uniq_cache = g_slist_prepend(uniq_cache, cur); - cur = c; - } - } - } - uniq_cache = g_slist_prepend(uniq_cache, cur); - uniq_cache = g_slist_reverse(uniq_cache); - cur = 0, cur_count = 0; - - /* count and list caches */ - for (l = uniq_cache; l; l = l->next) { - c = (ProcessorCache*)l->data; - if (!cur) { - cur = c; - cur_count = 1; - } else { - if (cmp_cache_ignore_id(cur, c) != 0) { - ret = h_strdup_cprintf(_("Level %d (%s)#%d=%dx %dKB (%dKB), %d-way set-associative, %d sets\n"), - ret, - cur->level, - C_("cache-type", cur->type), - cur->phy_sock, - cur_count, - cur->size, - cur->size * cur_count, - cur->ways_of_associativity, - cur->number_of_sets); - cur = c; - cur_count = 1; - } else { - cur_count++; - } - } - } - ret = h_strdup_cprintf(_("Level %d (%s)#%d=%dx %dKB (%dKB), %d-way set-associative, %d sets\n"), - ret, - cur->level, - C_("cache-type", cur->type), - cur->phy_sock, - cur_count, - cur->size, - cur->size * cur_count, - cur->ways_of_associativity, - cur->number_of_sets); - - g_slist_free(all_cache); - g_slist_free(uniq_cache); - return ret; -} - -#define PROC_SCAN_READ_BUFFER_SIZE 896 -GSList *processor_scan(void) -{ - GSList *procs = NULL, *l = NULL; - Processor *processor = NULL; - FILE *cpuinfo; - gchar buffer[PROC_SCAN_READ_BUFFER_SIZE]; - - cpuinfo = fopen(PROC_CPUINFO, "r"); - if (!cpuinfo) - return NULL; - - while (fgets(buffer, PROC_SCAN_READ_BUFFER_SIZE, cpuinfo)) { - int rlen = strlen(buffer); - if (rlen >= PROC_SCAN_READ_BUFFER_SIZE - 1) { - fprintf(stderr, "Warning: truncated a line (probably flags list) longer than %d bytes while reading %s.\n", PROC_SCAN_READ_BUFFER_SIZE, PROC_CPUINFO); - } - gchar **tmp = g_strsplit(buffer, ":", 2); - if (!tmp[1] || !tmp[0]) { - g_strfreev(tmp); - continue; - } - - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - if (g_str_has_prefix(tmp[0], "processor")) { - /* finish previous */ - if (processor) - procs = g_slist_append(procs, processor); - - /* start next */ - processor = g_new0(Processor, 1); - processor->id = atol(tmp[1]); - g_strfreev(tmp); - continue; - } - - if (processor) { - get_str("model name", processor->model_name); - get_str("vendor_id", processor->vendor_id); - get_str("flags", processor->flags); - get_str("bugs", processor->bugs); - get_str("power management", processor->pm); - get_str("microcode", processor->microcode); - get_int("cache size", processor->cache_size); - get_float("cpu MHz", processor->cpu_mhz); - get_float("bogomips", processor->bogomips); - - get_str("fpu", processor->has_fpu); - - get_str("fdiv_bug", processor->bug_fdiv); - get_str("hlt_bug", processor->bug_hlt); - get_str("f00f_bug", processor->bug_f00f); - get_str("coma_bug", processor->bug_coma); - /* sep_bug? */ - - get_int("model", processor->model); - get_int("cpu family", processor->family); - get_int("stepping", processor->stepping); - } - g_strfreev(tmp); - } - - fclose(cpuinfo); - - /* finish last */ - if (processor) - procs = g_slist_append(procs, processor); - - for (l = procs; l; l = l->next) { - processor = (Processor *) l->data; - - STRIFNULL(processor->microcode, _("(Not Available)") ); - - get_processor_strfamily(processor); - __cache_obtain_info(processor); - -#define NULLIFNOTYES(f) if (processor->f) if (strcmp(processor->f, "yes") != 0) { g_free(processor->f); processor->f = NULL; } - NULLIFNOTYES(bug_fdiv); - NULLIFNOTYES(bug_hlt); - NULLIFNOTYES(bug_f00f); - NULLIFNOTYES(bug_coma); - - if (processor->bugs == NULL || g_strcmp0(processor->bugs, "") == 0) { - g_free(processor->bugs); - /* make bugs list on old kernels that don't offer one */ - processor->bugs = g_strdup_printf("%s%s%s%s%s%s%s%s%s%s", - /* the oldest bug workarounds indicated in /proc/cpuinfo */ - processor->bug_fdiv ? " fdiv" : "", - processor->bug_hlt ? " _hlt" : "", - processor->bug_f00f ? " f00f" : "", - processor->bug_coma ? " coma" : "", - /* these bug workarounds were reported as "features" in older kernels */ - processor_has_flag(processor->flags, "fxsave_leak") ? " fxsave_leak" : "", - processor_has_flag(processor->flags, "clflush_monitor") ? " clflush_monitor" : "", - processor_has_flag(processor->flags, "11ap") ? " 11ap" : "", - processor_has_flag(processor->flags, "tlb_mmatch") ? " tlb_mmatch" : "", - processor_has_flag(processor->flags, "apic_c1e") ? " apic_c1e" : "", - ""); /* just to make adding lines easier */ - g_strchug(processor->bugs); - } - - if (processor->pm == NULL || g_strcmp0(processor->pm, "") == 0) { - g_free(processor->pm); - /* make power management list on old kernels that don't offer one */ - processor->pm = g_strdup_printf("%s%s", - /* "hw_pstate" -> "hwpstate" */ - processor_has_flag(processor->flags, "hw_pstate") ? " hwpstate" : "", - ""); /* just to make adding lines easier */ - g_strchug(processor->pm); - } - - /* topo & freq */ - processor->cpufreq = cpufreq_new(processor->id); - processor->cputopo = cputopo_new(processor->id); - - if (processor->cpufreq->cpukhz_max) - processor->cpu_mhz = processor->cpufreq->cpukhz_max / 1000; - } - - return procs; -} - -gchar *processor_get_capabilities_from_flags(gchar *strflags, gchar *lookup_prefix) -{ - gchar **flags, **old; - gchar tmp_flag[64] = ""; - const gchar *meaning; - gchar *tmp = NULL; - gint j = 0, i = 0; - - flags = g_strsplit(strflags, " ", 0); - old = flags; - - while (flags[j]) { - if ( sscanf(flags[j], "[%d]", &i) ) { - /* Some flags are indexes, like [13], and that looks like - * a new section to hardinfo shell */ - tmp = h_strdup_cprintf("(%s%d)=\n", tmp, - (lookup_prefix) ? lookup_prefix : "", - i ); - } else { - sprintf(tmp_flag, "%s%s", lookup_prefix, flags[j]); - meaning = x86_flag_meaning(tmp_flag); - - if (meaning) { - tmp = h_strdup_cprintf("%s=%s\n", tmp, flags[j], meaning); - } else { - tmp = h_strdup_cprintf("%s=\n", tmp, flags[j]); - } - } - j++; - } - if (tmp == NULL || g_strcmp0(tmp, "") == 0) - tmp = g_strdup_printf("%s=%s\n", "empty", _("Empty List")); - - g_strfreev(old); - return tmp; -} - -gchar *processor_get_detailed_info(Processor * processor) -{ - gchar *tmp_flags, *tmp_bugs, *tmp_pm, *tmp_cpufreq, *tmp_topology, *ret, *cache_info; - - tmp_flags = processor_get_capabilities_from_flags(processor->flags, ""); - tmp_bugs = processor_get_capabilities_from_flags(processor->bugs, "bug:"); - tmp_pm = processor_get_capabilities_from_flags(processor->pm, "pm:"); - cache_info = __cache_get_info_as_string(processor); - - tmp_topology = cputopo_section_str(processor->cputopo); - tmp_cpufreq = cpufreq_section_str(processor->cpufreq); - - ret = g_strdup_printf("[%s]\n" - "%s=%s\n" - "%s=%d, %d, %d (%s)\n" /* family, model, stepping (decoded name) */ - "%s=%s\n" /* vendor */ - "%s=%s\n" /* microcode */ - "[%s]\n" /* configuration */ - "%s=%d %s\n" /* cache size (from cpuinfo) */ - "%s=%.2f %s\n" /* frequency */ - "%s=%.2f\n" /* bogomips */ - "%s=%s\n" /* byte order */ - "%s" /* topology */ - "%s" /* frequency scaling */ - "[%s]\n" /* cache */ - "%s\n" - "[%s]\n" /* pm */ - "%s" - "[%s]\n" /* bugs */ - "%s" - "[%s]\n" /* flags */ - "%s", - _("Processor"), - _("Model Name"), processor->model_name, - _("Family, model, stepping"), - processor->family, - processor->model, - processor->stepping, - processor->strmodel, - _("Vendor"), vendor_get_name(processor->vendor_id), - _("Microcode Version"), processor->microcode, - _("Configuration"), - _("Cache Size"), processor->cache_size, _("kb"), - _("Frequency"), processor->cpu_mhz, _("MHz"), - _("BogoMips"), processor->bogomips, - _("Byte Order"), byte_order_str(), - tmp_topology, - tmp_cpufreq, - _("Cache"), cache_info, - _("Power Management"), tmp_pm, - _("Bug Workarounds"), tmp_bugs, - _("Capabilities"), tmp_flags ); - g_free(tmp_flags); - g_free(tmp_bugs); - g_free(tmp_pm); - g_free(cache_info); - g_free(tmp_cpufreq); - g_free(tmp_topology); - return ret; -} - -gchar *processor_name(GSList * processors) { - return processor_name_default(processors); -} - -gchar *processor_describe(GSList * processors) { - return processor_describe_default(processors); -} - -gchar *processor_meta(GSList * processors) { - gchar *meta_cpu_name = processor_name(processors); - gchar *meta_cpu_desc = processor_describe(processors); - gchar *meta_freq_desc = processor_frequency_desc(processors); - gchar *meta_clocks = clocks_summary(processors); - gchar *meta_caches = caches_summary(processors); - gchar *ret = NULL; - UNKIFNULL(meta_cpu_desc); - ret = g_strdup_printf("[%s]\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s" - "%s", - _("Package Information"), - _("Name"), meta_cpu_name, - _("Topology"), meta_cpu_desc, - _("Logical CPU Config"), meta_freq_desc, - meta_clocks, - meta_caches); - g_free(meta_cpu_desc); - g_free(meta_freq_desc); - g_free(meta_clocks); - g_free(meta_caches); - return ret; -} - -gchar *processor_get_info(GSList * processors) -{ - Processor *processor; - gchar *ret, *tmp, *hashkey; - gchar *meta; /* becomes owned by more_info? no need to free? */ - GSList *l; - - tmp = g_strdup_printf("$CPU_META$%s=\n", _("Package Information") ); - - meta = processor_meta(processors); - moreinfo_add_with_prefix("DEV", "CPU_META", meta); - - for (l = processors; l; l = l->next) { - processor = (Processor *) l->data; - - tmp = g_strdup_printf("%s$CPU%d$%s=%.2f %s|%d:%d|%d\n", - tmp, processor->id, - processor->model_name, - processor->cpu_mhz, _("MHz"), - processor->cputopo->socket_id, - processor->cputopo->core_id, - processor->cputopo->id ); - - hashkey = g_strdup_printf("CPU%d", processor->id); - moreinfo_add_with_prefix("DEV", hashkey, - processor_get_detailed_info(processor)); - g_free(hashkey); - } - - ret = g_strdup_printf("[$ShellParam$]\n" - "ViewType=1\n" - "ColumnTitle$Extra1=%s\n" - "ColumnTitle$Extra2=%s\n" - "[Processors]\n" - "%s", _("Socket:Core"), _("Thread" /*TODO: +s*/), tmp); - g_free(tmp); - - return ret; -} - diff --git a/modules/devices/x86/x86_data.c b/modules/devices/x86/x86_data.c deleted file mode 100644 index c052f4e1..00000000 --- a/modules/devices/x86/x86_data.c +++ /dev/null @@ -1,348 +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 <stdlib.h> -#include <stdio.h> -#include <string.h> -#include "x86_data.h" - -#ifndef C_ -#define C_(Ctx, String) String -#endif -#ifndef NC_ -#define NC_(Ctx, String) String -#endif - -/* sources: - * https://unix.stackexchange.com/a/43540 - * https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/tree/arch/x86/include/asm/cpufeatures.h?id=refs/tags/v4.9 - * hardinfo: modules/devices/x86/processor.c - */ -static struct { - char *name, *meaning; -} tab_flag_meaning[] = { -/* Intel-defined CPU features, CPUID level 0x00000001 (edx) - * See also Wikipedia and table 2-27 in Intel Advanced Vector Extensions Programming Reference */ - { "fpu", NC_("x86-flag", /*/flag:fpu*/ "Onboard FPU (floating point support)") }, - { "vme", NC_("x86-flag", /*/flag:vme*/ "Virtual 8086 mode enhancements") }, - { "de", NC_("x86-flag", /*/flag:de*/ "Debugging Extensions (CR4.DE)") }, - { "pse", NC_("x86-flag", /*/flag:pse*/ "Page Size Extensions (4MB memory pages)") }, - { "tsc", NC_("x86-flag", /*/flag:tsc*/ "Time Stamp Counter (RDTSC)") }, - { "msr", NC_("x86-flag", /*/flag:msr*/ "Model-Specific Registers (RDMSR, WRMSR)") }, - { "pae", NC_("x86-flag", /*/flag:pae*/ "Physical Address Extensions (support for more than 4GB of RAM)") }, - { "mce", NC_("x86-flag", /*/flag:mce*/ "Machine Check Exception") }, - { "cx8", NC_("x86-flag", /*/flag:cx8*/ "CMPXCHG8 instruction (64-bit compare-and-swap)") }, - { "apic", NC_("x86-flag", /*/flag:apic*/ "Onboard APIC") }, - { "sep", NC_("x86-flag", /*/flag:sep*/ "SYSENTER/SYSEXIT") }, - { "mtrr", NC_("x86-flag", /*/flag:mtrr*/ "Memory Type Range Registers") }, - { "pge", NC_("x86-flag", /*/flag:pge*/ "Page Global Enable (global bit in PDEs and PTEs)") }, - { "mca", NC_("x86-flag", /*/flag:mca*/ "Machine Check Architecture") }, - { "cmov", NC_("x86-flag", /*/flag:cmov*/ "CMOV instructions (conditional move) (also FCMOV)") }, - { "pat", NC_("x86-flag", /*/flag:pat*/ "Page Attribute Table") }, - { "pse36", NC_("x86-flag", /*/flag:pse36*/ "36-bit PSEs (huge pages)") }, - { "pn", NC_("x86-flag", /*/flag:pn*/ "Processor serial number") }, - { "clflush", NC_("x86-flag", /*/flag:clflush*/ "Cache Line Flush instruction") }, - { "dts", NC_("x86-flag", /*/flag:dts*/ "Debug Store (buffer for debugging and profiling instructions), or alternately: digital thermal sensor") }, - { "acpi", NC_("x86-flag", /*/flag:acpi*/ "ACPI via MSR (temperature monitoring and clock speed modulation)") }, - { "mmx", NC_("x86-flag", /*/flag:mmx*/ "Multimedia Extensions") }, - { "fxsr", NC_("x86-flag", /*/flag:fxsr*/ "FXSAVE/FXRSTOR, CR4.OSFXSR") }, - { "sse", NC_("x86-flag", /*/flag:sse*/ "Intel SSE vector instructions") }, - { "sse2", NC_("x86-flag", /*/flag:sse2*/ "SSE2") }, - { "ss", NC_("x86-flag", /*/flag:ss*/ "CPU self snoop") }, - { "ht", NC_("x86-flag", /*/flag:ht*/ "Hyper-Threading") }, - { "tm", NC_("x86-flag", /*/flag:tm*/ "Automatic clock control (Thermal Monitor)") }, - { "ia64", NC_("x86-flag", /*/flag:ia64*/ "Intel Itanium Architecture 64-bit (not to be confused with Intel's 64-bit x86 architecture with flag x86-64 or \"AMD64\" bit indicated by flag lm)") }, - { "pbe", NC_("x86-flag", /*/flag:pbe*/ "Pending Break Enable (PBE# pin) wakeup support") }, -/* AMD-defined CPU features, CPUID level 0x80000001 - * See also Wikipedia and table 2-23 in Intel Advanced Vector Extensions Programming Reference */ - { "syscall", NC_("x86-flag", /*/flag:syscall*/ "SYSCALL (Fast System Call) and SYSRET (Return From Fast System Call)") }, - { "mp", NC_("x86-flag", /*/flag:mp*/ "Multiprocessing Capable.") }, - { "nx", NC_("x86-flag", /*/flag:nx*/ "Execute Disable") }, - { "mmxext", NC_("x86-flag", /*/flag:mmxext*/ "AMD MMX extensions") }, - { "fxsr_opt", NC_("x86-flag", /*/flag:fxsr_opt*/ "FXSAVE/FXRSTOR optimizations") }, - { "pdpe1gb", NC_("x86-flag", /*/flag:pdpe1gb*/ "One GB pages (allows hugepagesz=1G)") }, - { "rdtscp", NC_("x86-flag", /*/flag:rdtscp*/ "Read Time-Stamp Counter and Processor ID") }, - { "lm", NC_("x86-flag", /*/flag:lm*/ "Long Mode (x86-64: amd64, also known as Intel 64, i.e. 64-bit capable)") }, - { "3dnow", NC_("x86-flag", /*/flag:3dnow*/ "3DNow! (AMD vector instructions, competing with Intel's SSE1)") }, - { "3dnowext", NC_("x86-flag", /*/flag:3dnowext*/ "AMD 3DNow! extensions") }, -/* Transmeta-defined CPU features, CPUID level 0x80860001 */ - { "recovery", NC_("x86-flag", /*/flag:recovery*/ "CPU in recovery mode") }, - { "longrun", NC_("x86-flag", /*/flag:longrun*/ "Longrun power control") }, - { "lrti", NC_("x86-flag", /*/flag:lrti*/ "LongRun table interface") }, -/* Other features, Linux-defined mapping */ - { "cxmmx", NC_("x86-flag", /*/flag:cxmmx*/ "Cyrix MMX extensions") }, - { "k6_mtrr", NC_("x86-flag", /*/flag:k6_mtrr*/ "AMD K6 nonstandard MTRRs") }, - { "cyrix_arr", NC_("x86-flag", /*/flag:cyrix_arr*/ "Cyrix ARRs (= MTRRs)") }, - { "centaur_mcr", NC_("x86-flag", /*/flag:centaur_mcr*/ "Centaur MCRs (= MTRRs)") }, - { "constant_tsc", NC_("x86-flag", /*/flag:constant_tsc*/ "TSC ticks at a constant rate") }, - { "up", NC_("x86-flag", /*/flag:up*/ "SMP kernel running on UP") }, - { "art", NC_("x86-flag", /*/flag:art*/ "Always-Running Timer") }, - { "arch_perfmon", NC_("x86-flag", /*/flag:arch_perfmon*/ "Intel Architectural PerfMon") }, - { "pebs", NC_("x86-flag", /*/flag:pebs*/ "Precise-Event Based Sampling") }, - { "bts", NC_("x86-flag", /*/flag:bts*/ "Branch Trace Store") }, - { "rep_good", NC_("x86-flag", /*/flag:rep_good*/ "rep microcode works well") }, - { "acc_power", NC_("x86-flag", /*/flag:acc_power*/ "AMD accumulated power mechanism") }, - { "nopl", NC_("x86-flag", /*/flag:nopl*/ "The NOPL (0F 1F) instructions") }, - { "xtopology", NC_("x86-flag", /*/flag:xtopology*/ "cpu topology enum extensions") }, - { "tsc_reliable", NC_("x86-flag", /*/flag:tsc_reliable*/ "TSC is known to be reliable") }, - { "nonstop_tsc", NC_("x86-flag", /*/flag:nonstop_tsc*/ "TSC does not stop in C states") }, - { "extd_apicid", NC_("x86-flag", /*/flag:extd_apicid*/ "has extended APICID (8 bits)") }, - { "amd_dcm", NC_("x86-flag", /*/flag:amd_dcm*/ "multi-node processor") }, - { "aperfmperf", NC_("x86-flag", /*/flag:aperfmperf*/ "APERFMPERF") }, - { "eagerfpu", NC_("x86-flag", /*/flag:eagerfpu*/ "Non lazy FPU restore") }, - { "nonstop_tsc_s3", NC_("x86-flag", /*/flag:nonstop_tsc_s3*/ "TSC doesn't stop in S3 state") }, - { "mce_recovery", NC_("x86-flag", /*/flag:mce_recovery*/ "CPU has recoverable machine checks") }, -/* Intel-defined CPU features, CPUID level 0x00000001 (ecx) - * See also Wikipedia and table 2-26 in Intel Advanced Vector Extensions Programming Reference */ - { "pni", NC_("x86-flag", /*/flag:pni*/ "SSE-3 (\"Prescott New Instructions\")") }, - { "pclmulqdq", NC_("x86-flag", /*/flag:pclmulqdq*/ "Perform a Carry-Less Multiplication of Quadword instruction - accelerator for GCM)") }, - { "dtes64", NC_("x86-flag", /*/flag:dtes64*/ "64-bit Debug Store") }, - { "monitor", NC_("x86-flag", /*/flag:monitor*/ "Monitor/Mwait support (Intel SSE3 supplements)") }, - { "ds_cpl", NC_("x86-flag", /*/flag:ds_cpl*/ "CPL Qual. Debug Store") }, - { "vmx", NC_("x86-flag", /*/flag:vmx*/ "Hardware virtualization, Intel VMX") }, - { "smx", NC_("x86-flag", /*/flag:smx*/ "Safer mode TXT (TPM support)") }, - { "est", NC_("x86-flag", /*/flag:est*/ "Enhanced SpeedStep") }, - { "tm2", NC_("x86-flag", /*/flag:tm2*/ "Thermal Monitor 2") }, - { "ssse3", NC_("x86-flag", /*/flag:ssse3*/ "Supplemental SSE-3") }, - { "cid", NC_("x86-flag", /*/flag:cid*/ "Context ID") }, - { "sdbg", NC_("x86-flag", /*/flag:sdbg*/ "silicon debug") }, - { "fma", NC_("x86-flag", /*/flag:fma*/ "Fused multiply-add") }, - { "cx16", NC_("x86-flag", /*/flag:cx16*/ "CMPXCHG16B") }, - { "xtpr", NC_("x86-flag", /*/flag:xtpr*/ "Send Task Priority Messages") }, - { "pdcm", NC_("x86-flag", /*/flag:pdcm*/ "Performance Capabilities") }, - { "pcid", NC_("x86-flag", /*/flag:pcid*/ "Process Context Identifiers") }, - { "dca", NC_("x86-flag", /*/flag:dca*/ "Direct Cache Access") }, - { "sse4_1", NC_("x86-flag", /*/flag:sse4_1*/ "SSE-4.1") }, - { "sse4_2", NC_("x86-flag", /*/flag:sse4_2*/ "SSE-4.2") }, - { "x2apic", NC_("x86-flag", /*/flag:x2apic*/ "x2APIC") }, - { "movbe", NC_("x86-flag", /*/flag:movbe*/ "Move Data After Swapping Bytes instruction") }, - { "popcnt", NC_("x86-flag", /*/flag:popcnt*/ "Return the Count of Number of Bits Set to 1 instruction (Hamming weight, i.e. bit count)") }, - { "tsc_deadline_timer", NC_("x86-flag", /*/flag:tsc_deadline_timer*/ "Tsc deadline timer") }, - { "aes/aes-ni", NC_("x86-flag", /*/flag:aes/aes-ni*/ "Advanced Encryption Standard (New Instructions)") }, - { "xsave", NC_("x86-flag", /*/flag:xsave*/ "Save Processor Extended States: also provides XGETBY,XRSTOR,XSETBY") }, - { "avx", NC_("x86-flag", /*/flag:avx*/ "Advanced Vector Extensions") }, - { "f16c", NC_("x86-flag", /*/flag:f16c*/ "16-bit fp conversions (CVT16)") }, - { "rdrand", NC_("x86-flag", /*/flag:rdrand*/ "Read Random Number from hardware random number generator instruction") }, - { "hypervisor", NC_("x86-flag", /*/flag:hypervisor*/ "Running on a hypervisor") }, -/* VIA/Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001 */ - { "rng", NC_("x86-flag", /*/flag:rng*/ "Random Number Generator present (xstore)") }, - { "rng_en", NC_("x86-flag", /*/flag:rng_en*/ "Random Number Generator enabled") }, - { "ace", NC_("x86-flag", /*/flag:ace*/ "on-CPU crypto (xcrypt)") }, - { "ace_en", NC_("x86-flag", /*/flag:ace_en*/ "on-CPU crypto enabled") }, - { "ace2", NC_("x86-flag", /*/flag:ace2*/ "Advanced Cryptography Engine v2") }, - { "ace2_en", NC_("x86-flag", /*/flag:ace2_en*/ "ACE v2 enabled") }, - { "phe", NC_("x86-flag", /*/flag:phe*/ "PadLock Hash Engine") }, - { "phe_en", NC_("x86-flag", /*/flag:phe_en*/ "PHE enabled") }, - { "pmm", NC_("x86-flag", /*/flag:pmm*/ "PadLock Montgomery Multiplier") }, - { "pmm_en", NC_("x86-flag", /*/flag:pmm_en*/ "PMM enabled") }, -/* More extended AMD flags: CPUID level 0x80000001, ecx */ - { "lahf_lm", NC_("x86-flag", /*/flag:lahf_lm*/ "Load AH from Flags (LAHF) and Store AH into Flags (SAHF) in long mode") }, - { "cmp_legacy", NC_("x86-flag", /*/flag:cmp_legacy*/ "If yes HyperThreading not valid") }, - { "svm", NC_("x86-flag", /*/flag:svm*/ "\"Secure virtual machine\": AMD-V") }, - { "extapic", NC_("x86-flag", /*/flag:extapic*/ "Extended APIC space") }, - { "cr8_legacy", NC_("x86-flag", /*/flag:cr8_legacy*/ "CR8 in 32-bit mode") }, - { "abm", NC_("x86-flag", /*/flag:abm*/ "Advanced Bit Manipulation") }, - { "sse4a", NC_("x86-flag", /*/flag:sse4a*/ "SSE-4A") }, - { "misalignsse", NC_("x86-flag", /*/flag:misalignsse*/ "indicates if a general-protection exception (#GP) is generated when some legacy SSE instructions operate on unaligned data. Also depends on CR0 and Alignment Checking bit") }, - { "3dnowprefetch", NC_("x86-flag", /*/flag:3dnowprefetch*/ "3DNow prefetch instructions") }, - { "osvw", NC_("x86-flag", /*/flag:osvw*/ "indicates OS Visible Workaround, which allows the OS to work around processor errata.") }, - { "ibs", NC_("x86-flag", /*/flag:ibs*/ "Instruction Based Sampling") }, - { "xop", NC_("x86-flag", /*/flag:xop*/ "extended AVX instructions") }, - { "skinit", NC_("x86-flag", /*/flag:skinit*/ "SKINIT/STGI instructions") }, - { "wdt", NC_("x86-flag", /*/flag:wdt*/ "Watchdog timer") }, - { "lwp", NC_("x86-flag", /*/flag:lwp*/ "Light Weight Profiling") }, - { "fma4", NC_("x86-flag", /*/flag:fma4*/ "4 operands MAC instructions") }, - { "tce", NC_("x86-flag", /*/flag:tce*/ "translation cache extension") }, - { "nodeid_msr", NC_("x86-flag", /*/flag:nodeid_msr*/ "NodeId MSR") }, - { "tbm", NC_("x86-flag", /*/flag:tbm*/ "Trailing Bit Manipulation") }, - { "topoext", NC_("x86-flag", /*/flag:topoext*/ "Topology Extensions CPUID leafs") }, - { "perfctr_core", NC_("x86-flag", /*/flag:perfctr_core*/ "Core Performance Counter Extensions") }, - { "perfctr_nb", NC_("x86-flag", /*/flag:perfctr_nb*/ "NB Performance Counter Extensions") }, - { "bpext", NC_("x86-flag", /*/flag:bpext*/ "data breakpoint extension") }, - { "ptsc", NC_("x86-flag", /*/flag:ptsc*/ "performance time-stamp counter") }, - { "perfctr_l2", NC_("x86-flag", /*/flag:perfctr_l2*/ "L2 Performance Counter Extensions") }, - { "mwaitx", NC_("x86-flag", /*/flag:mwaitx*/ "MWAIT extension (MONITORX/MWAITX)") }, -/* Auxiliary flags: Linux defined - For features scattered in various CPUID levels */ - { "cpb", NC_("x86-flag", /*/flag:cpb*/ "AMD Core Performance Boost") }, - { "epb", NC_("x86-flag", /*/flag:epb*/ "IA32_ENERGY_PERF_BIAS support") }, - { "hw_pstate", NC_("x86-flag", /*/flag:hw_pstate*/ "AMD HW-PState") }, - { "proc_feedback", NC_("x86-flag", /*/flag:proc_feedback*/ "AMD ProcFeedbackInterface") }, - { "intel_pt", NC_("x86-flag", /*/flag:intel_pt*/ "Intel Processor Tracing") }, -/* Virtualization flags: Linux defined */ - { "tpr_shadow", NC_("x86-flag", /*/flag:tpr_shadow*/ "Intel TPR Shadow") }, - { "vnmi", NC_("x86-flag", /*/flag:vnmi*/ "Intel Virtual NMI") }, - { "flexpriority", NC_("x86-flag", /*/flag:flexpriority*/ "Intel FlexPriority") }, - { "ept", NC_("x86-flag", /*/flag:ept*/ "Intel Extended Page Table") }, - { "vpid", NC_("x86-flag", /*/flag:vpid*/ "Intel Virtual Processor ID") }, - { "vmmcall", NC_("x86-flag", /*/flag:vmmcall*/ "prefer VMMCALL to VMCALL") }, -/* Intel-defined CPU features, CPUID level 0x00000007:0 (ebx) */ - { "fsgsbase", NC_("x86-flag", /*/flag:fsgsbase*/ "{RD/WR}{FS/GS}BASE instructions") }, - { "tsc_adjust", NC_("x86-flag", /*/flag:tsc_adjust*/ "TSC adjustment MSR") }, - { "bmi1", NC_("x86-flag", /*/flag:bmi1*/ "1st group bit manipulation extensions") }, - { "hle", NC_("x86-flag", /*/flag:hle*/ "Hardware Lock Elision") }, - { "avx2", NC_("x86-flag", /*/flag:avx2*/ "AVX2 instructions") }, - { "smep", NC_("x86-flag", /*/flag:smep*/ "Supervisor Mode Execution Protection") }, - { "bmi2", NC_("x86-flag", /*/flag:bmi2*/ "2nd group bit manipulation extensions") }, - { "erms", NC_("x86-flag", /*/flag:erms*/ "Enhanced REP MOVSB/STOSB") }, - { "invpcid", NC_("x86-flag", /*/flag:invpcid*/ "Invalidate Processor Context ID") }, - { "rtm", NC_("x86-flag", /*/flag:rtm*/ "Restricted Transactional Memory") }, - { "cqm", NC_("x86-flag", /*/flag:cqm*/ "Cache QoS Monitoring") }, - { "mpx", NC_("x86-flag", /*/flag:mpx*/ "Memory Protection Extension") }, - { "avx512f", NC_("x86-flag", /*/flag:avx512f*/ "AVX-512 foundation") }, - { "avx512dq", NC_("x86-flag", /*/flag:avx512dq*/ "AVX-512 Double/Quad instructions") }, - { "rdseed", NC_("x86-flag", /*/flag:rdseed*/ "The RDSEED instruction") }, - { "adx", NC_("x86-flag", /*/flag:adx*/ "The ADCX and ADOX instructions") }, - { "smap", NC_("x86-flag", /*/flag:smap*/ "Supervisor Mode Access Prevention") }, - { "clflushopt", NC_("x86-flag", /*/flag:clflushopt*/ "CLFLUSHOPT instruction") }, - { "clwb", NC_("x86-flag", /*/flag:clwb*/ "CLWB instruction") }, - { "avx512pf", NC_("x86-flag", /*/flag:avx512pf*/ "AVX-512 Prefetch") }, - { "avx512er", NC_("x86-flag", /*/flag:avx512er*/ "AVX-512 Exponential and Reciprocal") }, - { "avx512cd", NC_("x86-flag", /*/flag:avx512cd*/ "AVX-512 Conflict Detection") }, - { "sha_ni", NC_("x86-flag", /*/flag:sha_ni*/ "SHA1/SHA256 Instruction Extensions") }, - { "avx512bw", NC_("x86-flag", /*/flag:avx512bw*/ "AVX-512 Byte/Word instructions") }, - { "avx512vl", NC_("x86-flag", /*/flag:avx512vl*/ "AVX-512 128/256 Vector Length extensions") }, -/* Extended state features, CPUID level 0x0000000d:1 (eax) */ - { "xsaveopt", NC_("x86-flag", /*/flag:xsaveopt*/ "Optimized XSAVE") }, - { "xsavec", NC_("x86-flag", /*/flag:xsavec*/ "XSAVEC") }, - { "xgetbv1", NC_("x86-flag", /*/flag:xgetbv1*/ "XGETBV with ECX = 1") }, - { "xsaves", NC_("x86-flag", /*/flag:xsaves*/ "XSAVES/XRSTORS") }, -/* Intel-defined CPU QoS sub-leaf, CPUID level 0x0000000F:0 (edx) */ - { "cqm_llc", NC_("x86-flag", /*/flag:cqm_llc*/ "LLC QoS") }, -/* Intel-defined CPU QoS sub-leaf, CPUID level 0x0000000F:1 (edx) */ - { "cqm_occup_llc", NC_("x86-flag", /*/flag:cqm_occup_llc*/ "LLC occupancy monitoring") }, - { "cqm_mbm_total", NC_("x86-flag", /*/flag:cqm_mbm_total*/ "LLC total MBM monitoring") }, - { "cqm_mbm_local", NC_("x86-flag", /*/flag:cqm_mbm_local*/ "LLC local MBM monitoring") }, -/* AMD-defined CPU features, CPUID level 0x80000008 (ebx) */ - { "clzero", NC_("x86-flag", /*/flag:clzero*/ "CLZERO instruction") }, - { "irperf", NC_("x86-flag", /*/flag:irperf*/ "instructions retired performance counter") }, -/* Thermal and Power Management leaf, CPUID level 0x00000006 (eax) */ - { "dtherm", NC_("x86-flag", /*/flag:dtherm*/ "digital thermal sensor") }, /* formerly dts */ - { "ida", NC_("x86-flag", /*/flag:ida*/ "Intel Dynamic Acceleration") }, - { "arat", NC_("x86-flag", /*/flag:arat*/ "Always Running APIC Timer") }, - { "pln", NC_("x86-flag", /*/flag:pln*/ "Intel Power Limit Notification") }, - { "pts", NC_("x86-flag", /*/flag:pts*/ "Intel Package Thermal Status") }, - { "hwp", NC_("x86-flag", /*/flag:hwp*/ "Intel Hardware P-states") }, - { "hwp_notify", NC_("x86-flag", /*/flag:hwp_notify*/ "HWP notification") }, - { "hwp_act_window", NC_("x86-flag", /*/flag:hwp_act_window*/ "HWP Activity Window") }, - { "hwp_epp", NC_("x86-flag", /*/flag:hwp_epp*/ "HWP Energy Performance Preference") }, - { "hwp_pkg_req", NC_("x86-flag", /*/flag:hwp_pkg_req*/ "HWP package-level request") }, -/* AMD SVM Feature Identification, CPUID level 0x8000000a (edx) */ - { "npt", NC_("x86-flag", /*/flag:npt*/ "AMD Nested Page Table support") }, - { "lbrv", NC_("x86-flag", /*/flag:lbrv*/ "AMD LBR Virtualization support") }, - { "svm_lock", NC_("x86-flag", /*/flag:svm_lock*/ "AMD SVM locking MSR") }, - { "nrip_save", NC_("x86-flag", /*/flag:nrip_save*/ "AMD SVM next_rip save") }, - { "tsc_scale", NC_("x86-flag", /*/flag:tsc_scale*/ "AMD TSC scaling support") }, - { "vmcb_clean", NC_("x86-flag", /*/flag:vmcb_clean*/ "AMD VMCB clean bits support") }, - { "flushbyasid", NC_("x86-flag", /*/flag:flushbyasid*/ "AMD flush-by-ASID support") }, - { "decodeassists", NC_("x86-flag", /*/flag:decodeassists*/ "AMD Decode Assists support") }, - { "pausefilter", NC_("x86-flag", /*/flag:pausefilter*/ "AMD filtered pause intercept") }, - { "pfthreshold", NC_("x86-flag", /*/flag:pfthreshold*/ "AMD pause filter threshold") }, - { "avic", NC_("x86-flag", /*/flag:avic*/ "Virtual Interrupt Controller") }, -/* Intel-defined CPU features, CPUID level 0x00000007:0 (ecx) */ - { "pku", NC_("x86-flag", /*/flag:pku*/ "Protection Keys for Userspace") }, - { "ospke", NC_("x86-flag", /*/flag:ospke*/ "OS Protection Keys Enable") }, -/* AMD-defined CPU features, CPUID level 0x80000007 (ebx) */ - { "overflow_recov", NC_("x86-flag", /*/flag:overflow_recov*/ "MCA overflow recovery support") }, - { "succor", NC_("x86-flag", /*/flag:succor*/ "uncorrectable error containment and recovery") }, - { "smca", NC_("x86-flag", /*/flag:smca*/ "Scalable MCA") }, - -/* bug workarounds */ - { "bug:f00f", NC_("x86-flag", /*/bug:f00f*/ "Intel F00F bug") }, - { "bug:fdiv", NC_("x86-flag", /*/bug:fdiv*/ "FPU FDIV") }, - { "bug:coma", NC_("x86-flag", /*/bug:coma*/ "Cyrix 6x86 coma") }, - { "bug:tlb_mmatch", NC_("x86-flag", /*/bug:tlb_mmatch*/ "AMD Erratum 383") }, - { "bug:apic_c1e", NC_("x86-flag", /*/bug:apic_c1e*/ "AMD Erratum 400") }, - { "bug:11ap", NC_("x86-flag", /*/bug:11ap*/ "Bad local APIC aka 11AP") }, - { "bug:fxsave_leak", NC_("x86-flag", /*/bug:fxsave_leak*/ "FXSAVE leaks FOP/FIP/FOP") }, - { "bug:clflush_monitor", NC_("x86-flag", /*/bug:clflush_monitor*/ "AAI65, CLFLUSH required before MONITOR") }, - { "bug:sysret_ss_attrs", NC_("x86-flag", /*/bug:sysret_ss_attrs*/ "SYSRET doesn't fix up SS attrs") }, - { "bug:espfix", NC_("x86-flag", /*/bug:espfix*/ "IRET to 16-bit SS corrupts ESP/RSP high bits") }, - { "bug:null_seg", NC_("x86-flag", /*/bug:null_seg*/ "Nulling a selector preserves the base") }, /* see: detect_null_seg_behavior() */ - { "bug:swapgs_fence", NC_("x86-flag", /*/bug:swapgs_fence*/ "SWAPGS without input dep on GS") }, - { "bug:monitor", NC_("x86-flag", /*/bug:monitor*/ "IPI required to wake up remote CPU") }, - { "bug:amd_e400", NC_("x86-flag", /*/bug:amd_e400*/ "AMD Erratum 400") }, - { "bug:cpu_insecure", NC_("x86-flag", /*/bug:cpu_insecure & bug:cpu_meltdown*/ "CPU is affected by meltdown attack and needs kernel page table isolation") }, - { "bug:cpu_meltdown", NC_("x86-flag", /*/bug:cpu_insecure & bug:cpu_meltdown*/ "CPU is affected by meltdown attack and needs kernel page table isolation") }, - { "bug:spectre_v1", NC_("x86-flag", /*/bug:spectre_v1*/ "CPU is affected by Spectre variant 1 attack with conditional branches") }, - { "bug:spectre_v2", NC_("x86-flag", /*/bug:spectre_v2*/ "CPU is affected by Spectre variant 2 attack with indirect branches") }, -/* power management - * ... from arch/x86/kernel/cpu/powerflags.h */ - { "pm:ts", NC_("x86-flag", /*/flag:pm:ts*/ "temperature sensor") }, - { "pm:fid", NC_("x86-flag", /*/flag:pm:fid*/ "frequency id control") }, - { "pm:vid", NC_("x86-flag", /*/flag:pm:vid*/ "voltage id control") }, - { "pm:ttp", NC_("x86-flag", /*/flag:pm:ttp*/ "thermal trip") }, - { "pm:tm", NC_("x86-flag", /*/flag:pm:tm*/ "hardware thermal control") }, - { "pm:stc", NC_("x86-flag", /*/flag:pm:stc*/ "software thermal control") }, - { "pm:100mhzsteps", NC_("x86-flag", /*/flag:pm:100mhzsteps*/ "100 MHz multiplier control") }, - { "pm:hwpstate", NC_("x86-flag", /*/flag:pm:hwpstate*/ "hardware P-state control") }, - { "pm:cpb", NC_("x86-flag", /*/flag:pm:cpb*/ "core performance boost") }, - { "pm:eff_freq_ro", NC_("x86-flag", /*/flag:pm:eff_freq_ro*/ "Readonly aperf/mperf") }, - { "pm:proc_feedback", NC_("x86-flag", /*/flag:pm:proc_feedback*/ "processor feedback interface") }, - { "pm:acc_power", NC_("x86-flag", /*/flag:pm:acc_power*/ "accumulated power mechanism") }, - { NULL, NULL}, -}; - -static char all_flags[4096] = ""; - -#define APPEND_FLAG(f) strcat(all_flags, f); strcat(all_flags, " "); -const char *x86_flag_list() { - int i = 0, built = 0; - built = strlen(all_flags); - if (!built) { - while(tab_flag_meaning[i].name != NULL) { - APPEND_FLAG(tab_flag_meaning[i].name); - i++; - } - } - return all_flags; -} - -const char *x86_flag_meaning(const char *flag) { - int i = 0; - if (flag) - while(tab_flag_meaning[i].name != NULL) { - if (strcmp(tab_flag_meaning[i].name, flag) == 0) { - if (tab_flag_meaning[i].meaning != NULL) - return C_("x86-flag", tab_flag_meaning[i].meaning); - else return NULL; - } - i++; - } - return NULL; -} - -static void x86_flag_find_dups(void) { - int t, i; - - t = 0; - while(tab_flag_meaning[t].name != NULL) { - i = t+1; - while(tab_flag_meaning[i].name != NULL) { - if (strcmp(tab_flag_meaning[t].name, tab_flag_meaning[i].name) == 0) { - printf("x86-flag duplicate definition: %s\n ... %d: %s\n ... %d: %s\n", - tab_flag_meaning[i].name, - t, tab_flag_meaning[t].meaning, - i, tab_flag_meaning[i].meaning); - } - i++; - } - t++; - } -} diff --git a/modules/devices/x86/x86_data.h b/modules/devices/x86/x86_data.h deleted file mode 100644 index 66a4c80f..00000000 --- a/modules/devices/x86/x86_data.h +++ /dev/null @@ -1,28 +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. - * - */ - -#ifndef _X86DATA_H_ -#define _X86DATA_H_ - -/* cpu flags from /proc/cpuinfo */ -const char *x86_flag_list(void); /* list of all known flags */ -const char *x86_flag_meaning(const char *flag); /* lookup flag meaning */ - -#endif diff --git a/modules/network.c b/modules/network.c deleted file mode 100644 index f27a159a..00000000 --- a/modules/network.c +++ /dev/null @@ -1,441 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <ctype.h> -#include <stdlib.h> -#include <string.h> -#include <gtk/gtk.h> -#include <config.h> -#include <time.h> -#include <string.h> -#include <sys/utsname.h> -#include <sys/stat.h> - -#include <sys/socket.h> -#include <netdb.h> - -#include <hardinfo.h> -#include <iconcache.h> -#include <shell.h> - -#include <vendor.h> - -#include "network.h" - -/* Callbacks */ -gchar *callback_network(); -gchar *callback_route(); -gchar *callback_dns(); -gchar *callback_connections(); -gchar *callback_shares(); -gchar *callback_arp(); -gchar *callback_statistics(); - -/* Scan callbacks */ -void scan_network(gboolean reload); -void scan_route(gboolean reload); -void scan_dns(gboolean reload); -void scan_connections(gboolean reload); -void scan_shares(gboolean reload); -void scan_arp(gboolean reload); -void scan_statistics(gboolean reload); - -static ModuleEntry entries[] = { - {N_("Interfaces"), "network-interface.png", callback_network, scan_network, MODULE_FLAG_NONE}, - {N_("IP Connections"), "network-connections.png", callback_connections, scan_connections, MODULE_FLAG_NONE}, - {N_("Routing Table"), "network.png", callback_route, scan_route, MODULE_FLAG_NONE}, - {N_("ARP Table"), "module.png", callback_arp, scan_arp, MODULE_FLAG_NONE}, - {N_("DNS Servers"), "dns.png", callback_dns, scan_dns, MODULE_FLAG_NONE}, - {N_("Statistics"), "network-statistics.png", callback_statistics, scan_statistics, MODULE_FLAG_NONE}, - {N_("Shared Directories"), "shares.png", callback_shares, scan_shares, MODULE_FLAG_NONE}, - {NULL}, -}; - -void scan_shares(gboolean reload) -{ - SCAN_START(); - scan_samba(); - scan_nfs_shared_directories(); - SCAN_END(); -} - -static gchar *__statistics = NULL; -void scan_statistics(gboolean reload) -{ - FILE *netstat; - gchar buffer[256]; - gchar *netstat_path; - int line = 0; - - SCAN_START(); - - g_free(__statistics); - __statistics = g_strdup(""); - - if ((netstat_path = find_program("netstat"))) { - gchar *command_line = g_strdup_printf("%s -s", netstat_path); - - if ((netstat = popen(command_line, "r"))) { - while (fgets(buffer, 256, netstat)) { - if (!isspace(buffer[0]) && strchr(buffer, ':')) { - gchar *tmp; - - tmp = g_ascii_strup(strend(buffer, ':'), -1); - - __statistics = h_strdup_cprintf("[%s]\n", - __statistics, - tmp); - g_free(tmp); - - } else { - gchar *tmp = buffer; - - while (*tmp && isspace(*tmp)) tmp++; - - __statistics = h_strdup_cprintf("<b> </b>#%d=%s\n", - __statistics, - line++, tmp); - } - } - - pclose(netstat); - } - - g_free(command_line); - g_free(netstat_path); - } - - SCAN_END(); -} - -static gchar *__nameservers = NULL; -void scan_dns(gboolean reload) -{ - FILE *resolv; - gchar buffer[256]; - - SCAN_START(); - - g_free(__nameservers); - __nameservers = g_strdup(""); - - if ((resolv = fopen("/etc/resolv.conf", "r"))) { - while (fgets(buffer, 256, resolv)) { - if (g_str_has_prefix(buffer, "nameserver")) { - gchar *ip; - struct sockaddr_in sa; - char hbuf[NI_MAXHOST]; - - ip = g_strstrip(buffer + sizeof("nameserver")); - - sa.sin_family = AF_INET; - sa.sin_addr.s_addr = inet_addr(ip); - - if (getnameinfo((struct sockaddr *)&sa, sizeof(sa), hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD)) { - __nameservers = h_strdup_cprintf("%s=\n", - __nameservers, - ip); - } else { - __nameservers = h_strdup_cprintf("%s=%s\n", - __nameservers, - ip, hbuf); - - } - - shell_status_pulse(); - } - } - fclose(resolv); - } - - SCAN_END(); -} - -void scan_network(gboolean reload) -{ - SCAN_START(); - scan_net_interfaces(); - SCAN_END(); -} - -static gchar *__routing_table = NULL; -void scan_route(gboolean reload) -{ - FILE *route; - gchar buffer[256]; - gchar *route_path; - - SCAN_START(); - - g_free(__routing_table); - __routing_table = g_strdup(""); - - if ((route_path = find_program("route"))) { - gchar *command_line = g_strdup_printf("%s -n", route_path); - - if ((route = popen(command_line, "r"))) { - /* eat first two lines */ - (void)fgets(buffer, 256, route); - (void)fgets(buffer, 256, route); - - while (fgets(buffer, 256, route)) { - buffer[15] = '\0'; - buffer[31] = '\0'; - buffer[47] = '\0'; - buffer[53] = '\0'; - - __routing_table = h_strdup_cprintf("%s / %s=%s|%s|%s\n", - __routing_table, - g_strstrip(buffer), g_strstrip(buffer + 16), - g_strstrip(buffer + 72), - g_strstrip(buffer + 48), - g_strstrip(buffer + 32)); - } - - pclose(route); - } - - g_free(command_line); - g_free(route_path); - } - - SCAN_END(); -} - -static gchar *__arp_table = NULL; -void scan_arp(gboolean reload) -{ - FILE *arp; - gchar buffer[256]; - - SCAN_START(); - - g_free(__arp_table); - __arp_table = g_strdup(""); - - if ((arp = fopen("/proc/net/arp", "r"))) { - /* eat first line */ - (void)fgets(buffer, 256, arp); - - while (fgets(buffer, 256, arp)) { - buffer[15] = '\0'; - buffer[58] = '\0'; - - __arp_table = h_strdup_cprintf("%s=%s|%s\n", - __arp_table, - g_strstrip(buffer), - g_strstrip(buffer + 72), - g_strstrip(buffer + 41)); - } - - fclose(arp); - } - - SCAN_END(); -} - -static gchar *__connections = NULL; -void scan_connections(gboolean reload) -{ - FILE *netstat; - gchar buffer[256]; - gchar *netstat_path; - - SCAN_START(); - - g_free(__connections); - __connections = g_strdup(""); - - if ((netstat_path = find_program("netstat"))) { - gchar *command_line = g_strdup_printf("%s -an", netstat_path); - - if ((netstat = popen("netstat -an", "r"))) { - while (fgets(buffer, 256, netstat)) { - buffer[6] = '\0'; - buffer[43] = '\0'; - buffer[67] = '\0'; - - if (g_str_has_prefix(buffer, "tcp") || g_str_has_prefix(buffer, "udp")) { - __connections = h_strdup_cprintf("%s=%s|%s|%s\n", - __connections, - g_strstrip(buffer + 20), /* local address */ - g_strstrip(buffer), /* protocol */ - g_strstrip(buffer + 44), /* foreign address */ - g_strstrip(buffer + 68)); /* state */ - } - } - - pclose(netstat); - } - - g_free(command_line); - g_free(netstat_path); - } - - SCAN_END(); -} - -gchar *callback_arp() -{ - return g_strdup_printf("[%s]\n" - "%s\n" - "[$ShellParam$]\n" - "ReloadInterval=3000\n" - "ColumnTitle$TextValue=%s\n" /* IP Address */ - "ColumnTitle$Value=%s\n" /* Interface */ - "ColumnTitle$Extra1=%s\n" /* MAC Address */ - "ShowColumnHeaders=true\n", - _("ARP Table"), __arp_table, - _("IP Address"), _("Interface"), _("MAC Address") ); -} - -gchar *callback_shares() -{ - return g_strdup_printf("[%s]\n" - "%s\n" - "[%s]\n" - "%s", - _("SAMBA"), smb_shares_list, - _("NFS"), nfs_shares_list); -} - -gchar *callback_dns() -{ - return g_strdup_printf("[%s]\n" - "%s\n" - "[$ShellParam$]\n" - "ColumnTitle$TextValue=%s\n" /* IP Address */ - "ColumnTitle$Value=%s\n" /* Name */ - "ShowColumnHeaders=true\n", - _("Name Servers"), __nameservers, - _("IP Address"), _("Name") ); -} - -gchar *callback_connections() -{ - return g_strdup_printf("[%s]\n" - "%s\n" - "[$ShellParam$]\n" - "ReloadInterval=3000\n" - "ColumnTitle$TextValue=%s\n" /* Local Address */ - "ColumnTitle$Value=%s\n" /* Protocol */ - "ColumnTitle$Extra1=%s\n" /* Foreign Address */ - "ColumnTitle$Extra2=%s\n" /* State */ - "ShowColumnHeaders=true\n", - _("Connections"), __connections, - _("Local Address"), _("Protocol"), _("Foreign Address"), _("State") ); -} - -gchar *callback_network() -{ - return g_strdup_printf("%s\n" - "[$ShellParam$]\n" - "ReloadInterval=3000\n" - "ViewType=1\n" - "ColumnTitle$TextValue=%s\n" /* Interface */ - "ColumnTitle$Value=%s\n" /* IP Address */ - "ColumnTitle$Extra1=%s\n" /* Sent */ - "ColumnTitle$Extra2=%s\n" /* Received */ - "ShowColumnHeaders=true\n" - "%s", - network_interfaces, - _("Interface"), _("IP Address"), _("Sent"), _("Received"), - network_icons); -} - -gchar *callback_route() -{ - return g_strdup_printf("[%s]\n" - "%s\n" - "[$ShellParam$]\n" - "ViewType=0\n" - "ReloadInterval=3000\n" - "ColumnTitle$TextValue=%s\n" /* Destination / Gateway */ - "ColumnTitle$Value=%s\n" /* Interface */ - "ColumnTitle$Extra1=%s\n" /* Flags */ - "ColumnTitle$Extra2=%s\n" /* Mask */ - "ShowColumnHeaders=true\n", - _("IP routing table"), __routing_table, - _("Destination/Gateway"), _("Interface"), _("Flags"), _("Mask") ); -} - -gchar *callback_statistics() -{ - return g_strdup_printf("%s\n" - "[$ShellParam$]\n" - "ReloadInterval=3000\n", - __statistics); -} - -gchar *hi_more_info(gchar * entry) -{ - gchar *info = moreinfo_lookup_with_prefix("NET", entry); - - if (info) - return g_strdup(info); - - return g_strdup_printf("[%s]", entry); -} - -ModuleEntry *hi_module_get_entries(void) -{ - return entries; -} - -gchar *hi_module_get_name(void) -{ - return g_strdup(_("Network")); -} - -guchar hi_module_get_weight(void) -{ - return 160; -} - -void hi_module_init(void) -{ -} - -void hi_module_deinit(void) -{ - moreinfo_del_with_prefix("NET"); - - g_free(smb_shares_list); - g_free(nfs_shares_list); - g_free(network_interfaces); - g_free(network_icons); - - g_free(__statistics); - g_free(__nameservers); - g_free(__arp_table); - g_free(__routing_table); - g_free(__connections); -} - -ModuleAbout *hi_module_get_about(void) -{ - static ModuleAbout ma[] = { - { - .author = "Leandro A. F. Pereira", - .description = N_("Gathers information about this computer's network connection"), - .version = VERSION, - .license = "GNU GPL version 2"} - }; - - return ma; -} diff --git a/modules/network/net.c b/modules/network/net.c deleted file mode 100644 index a75cf8b6..00000000 --- a/modules/network/net.c +++ /dev/null @@ -1,494 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -/* - * Wireless Extension Example - * http://www.krugle.org/examples/p-OZYzuisV6gyQIaTu/iwconfig.c - */ - -#include "config.h" - -#include <stdio.h> -#include <unistd.h> -#include <string.h> - -#include <sys/ioctl.h> -#include <sys/types.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <linux/sockios.h> - -#include <arpa/inet.h> - -#ifdef HAS_LINUX_WE -#include <linux/if.h> -#include <linux/wireless.h> -#else -#include <net/if.h> -#endif /* HAS_LINUX_WE */ - -#include "hardinfo.h" -#include "network.h" - -gchar *network_interfaces = NULL, *network_icons = NULL; - -typedef struct _NetInfo NetInfo; -struct _NetInfo { - char name[16]; - int mtu; - unsigned char mac[8]; - char ip[16]; - char mask[16]; - char broadcast[16]; - -#ifdef HAS_LINUX_WE - char wi_essid[IW_ESSID_MAX_SIZE + 1]; - int wi_rate; - int wi_mode, wi_status; - gboolean wi_has_txpower; - struct iw_param wi_txpower; - int wi_quality_level, wi_signal_level, wi_noise_level; - gboolean is_wireless; -#endif -}; - -#ifdef HAS_LINUX_WE -const gchar *wi_operation_modes[] = { - NC_("wi-op-mode", "Auto"), - NC_("wi-op-mode", "Ad-Hoc"), - NC_("wi-op-mode", "Managed"), - NC_("wi-op-mode", "Master"), - NC_("wi-op-mode", "Repeater"), - NC_("wi-op-mode", "Secondary"), - NC_("wi-op-mode", "(Unknown)") -}; - -void get_wireless_info(int fd, NetInfo *netinfo) -{ - FILE *wrls; - char wbuf[256]; - struct iwreq wi_req; - int r, trash; - - netinfo->is_wireless = FALSE; - - if ((wrls = fopen("/proc/net/wireless", "r"))) { - while (fgets(wbuf, 256, wrls)) { - if (strchr(wbuf, ':') && strstr(wbuf, netinfo->name)) { - gchar *buf1 = wbuf; - - netinfo->is_wireless = TRUE; - - buf1 = strchr(buf1, ':') + 1; - - if (strchr(buf1, '.')) { - sscanf(buf1, "%d %d. %d. %d %d %d %d %d %d %d", - &(netinfo->wi_status), - &(netinfo->wi_quality_level), - &(netinfo->wi_signal_level), - &(netinfo->wi_noise_level), - &trash, &trash, &trash, &trash, &trash, &trash); - } else { - sscanf(buf1, "%d %d %d %d %d %d %d %d %d %d", - &(netinfo->wi_status), - &(netinfo->wi_quality_level), - &(netinfo->wi_signal_level), - &(netinfo->wi_noise_level), - &trash, &trash, &trash, &trash, &trash, - &trash); - } - - break; - } - } - fclose(wrls); - } - - if (!netinfo->is_wireless) - return; - - strncpy(wi_req.ifr_name, netinfo->name, 16); - - /* obtain essid */ - wi_req.u.essid.pointer = netinfo->wi_essid; - wi_req.u.essid.length = IW_ESSID_MAX_SIZE + 1; - wi_req.u.essid.flags = 0; - - if (ioctl(fd, SIOCGIWESSID, &wi_req) < 0) { - strcpy(netinfo->wi_essid, ""); - } else { - netinfo->wi_essid[wi_req.u.essid.length] = '\0'; - } - - /* obtain bit rate */ - if (ioctl(fd, SIOCGIWRATE, &wi_req) < 0) { - netinfo->wi_rate = 0; - } else { - netinfo->wi_rate = wi_req.u.bitrate.value; - } - - /* obtain operation mode */ - if (ioctl(fd, SIOCGIWMODE, &wi_req) < 0) { - netinfo->wi_mode = 0; - } else { - if (wi_req.u.mode >= 0 && wi_req.u.mode < 6) { - netinfo->wi_mode = wi_req.u.mode; - } else { - netinfo->wi_mode = 6; - } - } - -#if WIRELESS_EXT >= 10 - /* obtain txpower */ - if (ioctl(fd, SIOCGIWTXPOW, &wi_req) < 0) { - netinfo->wi_has_txpower = FALSE; - } else { - netinfo->wi_has_txpower = TRUE; - - memcpy(&netinfo->wi_txpower, &wi_req.u.txpower, sizeof(struct iw_param)); - } -#else - netinfo->wi_has_txpower = FALSE; -#endif /* WIRELESS_EXT >= 10 */ -} -#endif /* HAS_LINUX_WE */ - -void get_net_info(char *if_name, NetInfo * netinfo) -{ - struct ifreq ifr; - int fd; - - fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); - - /* IPv4 */ - ifr.ifr_addr.sa_family = AF_INET; - strncpy(netinfo->name, if_name, sizeof(netinfo->name)); - - /* MTU */ - strcpy(ifr.ifr_name, if_name); - if (ioctl(fd, SIOCGIFMTU, &ifr) < 0) { - netinfo->mtu = 0; - } else { - netinfo->mtu = ifr.ifr_mtu; - } - - /* HW Address */ - strcpy(ifr.ifr_name, if_name); - if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { - memset(netinfo->mac, 0, 8); - } else { - memcpy(netinfo->mac, ifr.ifr_ifru.ifru_hwaddr.sa_data, 8); - } - - /* IP Address */ - strcpy(ifr.ifr_name, if_name); - if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) { - netinfo->ip[0] = 0; - } else { - snprintf(netinfo->ip, sizeof(netinfo->ip), "%s", - inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> - sin_addr)); - } - - /* Mask Address */ - strcpy(ifr.ifr_name, if_name); - if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) { - netinfo->mask[0] = 0; - } else { - snprintf(netinfo->mask, sizeof(netinfo->mask), "%s", - inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> - sin_addr)); - } - - /* Broadcast Address */ - strcpy(ifr.ifr_name, if_name); - if (ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0) { - netinfo->broadcast[0] = 0; - } else { - snprintf(netinfo->broadcast, sizeof(netinfo->broadcast), "%s", - inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> - sin_addr)); - } - -#ifdef HAS_LINUX_WE - get_wireless_info(fd, netinfo); -#endif - - shutdown(fd, 0); - close(fd); -} - -static struct { - char *type; - char *label; - char *icon; -} netdev2type[] = { - /* Classic */ - { "eth", NC_("net-if-type", "Ethernet"), "network-interface" }, - { "lo", NC_("net-if-type", "Loopback"), "network" }, - { "ppp", NC_("net-if-type", "Point-to-Point"), "modem" }, - { "ath", NC_("net-if-type", "Wireless"), "wireless" }, - { "wlan", NC_("net-if-type", "Wireless"), "wireless" }, - { "ra", NC_("net-if-type", "Wireless"), "wireless" }, - { "wmaster", NC_("net-if-type", "Wireless"), "wireless" }, - { "tun", NC_("net-if-type", "Virtual Point-to-Point (TUN)"), "network" }, - { "tap", NC_("net-if-type", "Ethernet (TAP)"), "network" }, - { "plip", NC_("net-if-type", "Parallel Line Internet Protocol"), "network" }, - { "irlan", NC_("net-if-type", "Infrared"), "network" }, - { "slip", NC_("net-if-type", "Serial Line Internet Protocol"), "network" }, - { "isdn", NC_("net-if-type", "Integrated Services Digital Network"), "modem" }, - { "sit", NC_("net-if-type", "IPv6-over-IPv4 Tunnel"), "network" }, - { "vmnet8", NC_("net-if-type", "VMWare Virtual Network Interface (NAT)"), "computer" }, - { "vmnet", NC_("net-if-type", "VMWare Virtual Network Interface"), "computer" }, - { "pan", NC_("net-if-type", "Personal Area Network (PAN)"), "bluetooth" }, - { "bnep", NC_("net-if-type", "Bluetooth"), "bluetooth" }, - { "br", NC_("net-if-type", "Bridge Interface"), "network" }, - { "ham", NC_("net-if-type", "Hamachi Virtual Personal Network"), "network"}, - { "net", NC_("net-if-type", "Ethernet"), "network-interface" }, - { "ifb", NC_("net-if-type", "Intermediate Functional Block"), "network" }, - { "gre", NC_("net-if-type", "GRE Network Tunnel"), "network" }, - { "msh", NC_("net-if-type", "Mesh Network"), "wireless" }, - { "wmaster", NC_("net-if-type", "Wireless Master Interface"), "wireless" }, - { "vboxnet", NC_("net-if-type", "VirtualBox Virtual Network Interface"), "network" }, - - /* Predictable network interface device names (systemd) */ - { "en", NC_("net-if-type", "Ethernet"), "network-interface" }, - { "sl", NC_("net-if-type", "Serial Line Internet Protocol"), "network" }, - { "wl", NC_("net-if-type", "Wireless"), "wireless" }, - { "ww", NC_("net-if-type", "Wireless (WAN)"), "wireless" }, - - { NULL, NC_("net-if-type", "(Unknown)"), "network" }, -}; - -static void net_get_iface_type(gchar * name, gchar ** type, gchar ** icon, NetInfo *ni) -{ - int i; - -#ifdef HAS_LINUX_WE - if (ni->is_wireless) { - *type = "Wireless"; /* translated when used */ - *icon = "wireless"; - - return; - } -#endif - - for (i = 0; netdev2type[i].type; i++) { - if (g_str_has_prefix(name, netdev2type[i].type)) - break; - } - - *type = netdev2type[i].label; /* translated when used */ - *icon = netdev2type[i].icon; -} - -static gboolean -remove_net_devices(gpointer key, gpointer value, gpointer data) -{ - return g_str_has_prefix(key, "NET"); -} - -#ifdef HAS_LINUX_WE -const char *wifi_bars(int signal, int noise) -{ - signal = -signal; - - if (signal > 80) - return "▰▰▰▰▰"; - if (signal > 55) - return "▰▰▰▰▱"; - if (signal > 30) - return "▰▰▰▱▱"; - if (signal > 15) - return "▰▰▱▱▱"; - if (signal > 5) - return "▰▱▱▱▱"; - return "▱▱▱▱▱"; -} -#endif - -static void scan_net_interfaces_24(void) -{ - FILE *proc_net; - NetInfo ni; - gchar buffer[256]; - gchar *devid, *detailed; - gdouble recv_bytes; - gdouble recv_errors; - gdouble recv_packets; - - gdouble trans_bytes; - gdouble trans_errors; - gdouble trans_packets; - - if (!g_file_test("/proc/net/dev", G_FILE_TEST_EXISTS)) { - if (network_interfaces) { - g_free(network_interfaces); - network_interfaces = g_strdup_printf("[%s]]\n%s=\n", - _("Network Interfaces"), _("None Found") ); - } - - return; - } - - g_free(network_interfaces); - - g_free(network_icons); - - network_interfaces = g_strdup_printf("[%s]\n", _("Network Interfaces")); - network_icons = g_strdup(""); - - proc_net = fopen("/proc/net/dev", "r"); - if (!proc_net) - return; - - while (fgets(buffer, 256, proc_net)) { - if (strchr(buffer, ':')) { - gint trash; - gchar ifacename[16]; - gchar *buf = buffer; - gchar *iface_type, *iface_icon; - gint i; - - buf = g_strstrip(buf); - - memset(ifacename, 0, 16); - - for (i = 0; buffer[i] != ':' && i < 16; i++) { - ifacename[i] = buffer[i]; - } - - buf = strchr(buf, ':') + 1; - - /* iface: bytes packets errs drop fifo frame compressed multicast */ - sscanf(buf, "%lf %lf %lf %d %d %d %d %d %lf %lf %lf", - &recv_bytes, &recv_packets, - &recv_errors, &trash, &trash, &trash, &trash, - &trash, &trans_bytes, &trans_packets, &trans_errors); - - gdouble recv_mb = recv_bytes / 1048576.0; - gdouble trans_mb = trans_bytes / 1048576.0; - - get_net_info(ifacename, &ni); - - devid = g_strdup_printf("NET%s", ifacename); - - network_interfaces = - h_strdup_cprintf - ("$%s$%s=%s|%.2lf%s|%.2lf%s\n", - network_interfaces, devid, ifacename, ni.ip[0] ? ni.ip : "", - trans_mb, _("MiB"), recv_mb, _("MiB")); - net_get_iface_type(ifacename, &iface_type, &iface_icon, &ni); - - network_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", - network_icons, devid, - ifacename, iface_icon); - - detailed = g_strdup_printf("[%s]\n" - "%s=%s\n" /* Interface Type */ - "%s=%02x:%02x:%02x:%02x:%02x:%02x\n" /* MAC */ - "%s=%d\n" /* MTU */ - "[%s]\n" /*Transfer Details*/ - "%s=%.0lf (%.2f%s)\n" /* Bytes Received */ - "%s=%.0lf (%.2f%s)\n" /* Bytes Sent */, - _("Network Adapter Properties"), - _("Interface Type"), C_("net-if-type", iface_type), - _("Hardware Address (MAC)"), - ni.mac[0], ni.mac[1], - ni.mac[2], ni.mac[3], - ni.mac[4], ni.mac[5], - _("MTU"), ni.mtu, - _("Transfer Details"), - _("Bytes Received"), recv_bytes, recv_mb, _("MiB"), - _("Bytes Sent"), trans_bytes, trans_mb, _("MiB")); - -#ifdef HAS_LINUX_WE - if (ni.is_wireless) { - gchar *txpower; - - if (ni.wi_has_txpower) { - gint mw, dbm; - - if (ni.wi_txpower.flags & IW_TXPOW_MWATT) { - mw = ni.wi_txpower.value; - dbm = (int) ceil(10.0 * log10((double) ni.wi_txpower.value)); - } else { - dbm = ni.wi_txpower.value; - mw = (int) floor(pow(10.0, ((double) dbm / 10.0))); - } - - txpower = g_strdup_printf("%d%s (%d%s)", dbm, _("dBm"), mw, _("mW")); - } else { - txpower = g_strdup(_("(Unknown)")); - } - - detailed = h_strdup_cprintf("\n[%s]\n" - "%s=%s\n" /* Network Name (SSID) */ - "%s=%d%s\n" /* Bit Rate */ - "%s=%s\n" /* Transmission Power */ - "%s=%s\n" /* Mode */ - "%s=%d\n" /* Status */ - "%s=%d\n" /* Link Quality */ - "%s=%d %s / %d %s (%s)\n", - detailed, - _("Wireless Properties"), - _("Network Name (SSID)"), ni.wi_essid, - _("Bit Rate"), ni.wi_rate / 1000000, _("Mb/s"), - _("Transmission Power"), txpower, - _("Mode"), C_("wi-op-mode", wi_operation_modes[ni.wi_mode]), - _("Status"), ni.wi_status, - _("Link Quality"), ni.wi_quality_level, - _("Signal / Noise"), - ni.wi_signal_level, _("dBm"), - ni.wi_noise_level, _("dBm"), - wifi_bars(ni.wi_signal_level, ni.wi_noise_level)); - - g_free(txpower); - } -#endif - - if (ni.ip[0] || ni.mask[0] || ni.broadcast[0]) { - detailed = - h_strdup_cprintf("\n[%s]\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n", detailed, - _("Internet Protocol (IPv4)"), - _("IP Address"), ni.ip[0] ? ni.ip : _("(Not set)"), - _("Mask"), ni.mask[0] ? ni.mask : _("(Not set)"), - _("Broadcast Address"), - ni.broadcast[0] ? ni.broadcast : _("(Not set)") ); - } - - moreinfo_add_with_prefix("NET", devid, detailed); - g_free(devid); - } - } - fclose(proc_net); -} - -void scan_net_interfaces(void) -{ - /* FIXME: See if we're running Linux 2.6 and if /sys is mounted, then use - that instead of /proc/net/dev */ - - /* remove old devices from global device table */ - moreinfo_del_with_prefix("NET"); - - scan_net_interfaces_24(); -} diff --git a/modules/network/nfs.c b/modules/network/nfs.c deleted file mode 100644 index 54bbfe0e..00000000 --- a/modules/network/nfs.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <string.h> - -#include "hardinfo.h" -#include "network.h" - -gchar *nfs_shares_list = NULL; - -void -scan_nfs_shared_directories(void) -{ - FILE *exports; - gint count = 0; - gchar buf[512]; - - g_free(nfs_shares_list); - - nfs_shares_list = g_strdup(""); - - if ((exports = fopen("/etc/exports", "r"))) { - while (fgets(buf, 512, exports)) { - if (buf[0] != '/') - continue; - - strend(buf, ' '); - strend(buf, '\t'); - - nfs_shares_list = h_strdup_cprintf("%s=\n", - nfs_shares_list, buf); - count++; - } - - fclose(exports); - } - - if (!count) { - g_free(nfs_shares_list); - - nfs_shares_list = g_strdup("No NFS exports=\n"); - } -} - diff --git a/modules/network/samba.c b/modules/network/samba.c deleted file mode 100644 index 7e8dc46c..00000000 --- a/modules/network/samba.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <string.h> - -#include "hardinfo.h" -#include "network.h" - -gchar *smb_shares_list = NULL; - -void scan_samba_from_string(gchar *str, gsize length); -void scan_samba_usershares(void); - -void -scan_samba(void) -{ - gchar *str; - gsize length; - - if (smb_shares_list) { - g_free(smb_shares_list); - smb_shares_list = g_strdup(""); - } - - if (g_file_get_contents("/etc/samba/smb.conf", - &str, &length, NULL)) { - shell_status_update("Scanning SAMBA shares..."); - scan_samba_from_string(str, length); - g_free(str); - } - - scan_samba_usershares(); -} - -void -scan_samba_usershares(void) -{ - FILE *usershare_list; - 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..."); - p = out; - while(next_nl = strchr(p, '\n')) { - cmdline = g_strdup_printf("net usershare info '%s'", - strend(p, '\n')); - if (g_spawn_command_line_sync(cmdline, - &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; - } - g_free(out); - g_free(err); - } -} - -void -scan_samba_from_string(gchar *str, gsize length) -{ - GKeyFile *keyfile; - 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) - g_error_free(error); - goto cleanup; - } - - groups = g_key_file_get_groups(keyfile, NULL); - while (groups[i]) { - shell_status_pulse(); - - if (g_key_file_has_key(keyfile, groups[i], "path", NULL)) { - gchar *path = g_key_file_get_string(keyfile, groups[i], "path", NULL); - smb_shares_list = h_strdup_cprintf("%s=%s\n", - smb_shares_list, - groups[i], path); - g_free(path); - } - - i++; - } - - g_strfreev(groups); - - cleanup: - g_key_file_free(keyfile); -} - |