hardinfo-0.5.1/0000755000175000017500000000000011256732377012314 5ustar agneyagneyhardinfo-0.5.1/TODO0000644000175000017500000000215611166403363012776 0ustar agneyagney - Report Generation * Ability to create more detailed reports * Public web page to host user's reports - Benchmark * New benchmarks o Video o FPU+CPU o Disk o Phoronix? * Change current benchmarks o Remove CPU Fibonacci * Add CPU Rubik Cube solver? :P - More information * PCMCIA/Cardbus information * S.M.A.R.T. * Show USB devices as a tree instead of a list * x86info integration? - i18n, build system * GNU gettext * Better build system (no more symlink mess) - Misc * Remove (R), (TM), etc from processor strings as per Wikipedia's Manual of Style [1] * Round benchmark results to two decimal places at most, or get rid of decimal places altogether. * Add preferences window * Save/restore * Window position * Window size * Proxy configuration * Use HTTP_PROXY variable; * Use GNOME settings; * Manual configuration. * Default browser * Auto-detect; * Use GNOME settings; * Manual configuration. [1] http://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style_(trademarks)#General_rules hardinfo-0.5.1/arch/0000755000175000017500000000000011166403536013221 5ustar agneyagneyhardinfo-0.5.1/arch/linux/0000755000175000017500000000000011166403363014356 5ustar agneyagneyhardinfo-0.5.1/arch/linux/sh/0000755000175000017500000000000011166403363014770 5ustar agneyagneyhardinfo-0.5.1/arch/linux/sh/inputdevices.h0000777000175000017500000000000011256732377025602 2../../linux/common/inputdevices.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/os.h0000777000175000017500000000000011256732377021440 2../../linux/common/os.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/net.h0000777000175000017500000000000011256732377021752 2../../linux/common/net.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/nfs.h0000777000175000017500000000000011256732377021752 2../../linux/common/nfs.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/pci.h0000777000175000017500000000000011256732377021724 2../../linux/common/pci.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/usb.h0000777000175000017500000000000011256732377021760 2../../linux/common/usb.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/samba.h0000777000175000017500000000000011256732377022544 2../../linux/common/samba.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/devmemory.h0000777000175000017500000000000011256732377024414 2../../linux/common/devmemory.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/resources.h0000777000175000017500000000000011256732377025552 2../../../arch/linux/common/resources.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/processor.h0000644000175000017500000000430511166403363017162 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ struct _Processor { gchar *model_name; gchar *vendor_id; gfloat bogomips, cpu_mhz; }; static GSList * __scan_processors(void) { Processor *processor; FILE *cpuinfo; gchar buffer[128]; cpuinfo = fopen("/proc/cpuinfo", "r"); if (!cpuinfo) return NULL; processor = g_new0(Processor, 1); while (fgets(buffer, 128, cpuinfo)) { gchar **tmp = g_strsplit(buffer, ":", 2); if (tmp[0] && tmp[1]) { tmp[0] = g_strstrip(tmp[0]); tmp[1] = g_strstrip(tmp[1]); get_str("machine", processor->model_name); get_str("cpu type", processor->vendor_id); get_float("bogomips", processor->bogomips); processor->cpu_mhz = processor->bogomips; } g_strfreev(tmp); } fclose(cpuinfo); return g_slist_append(NULL, processor); } static gchar * processor_get_info(GSList *processors) { Processor *processor = (Processor *)processors->data; return g_strdup_printf("[Processor]\n" "System Type=%s\n" "CPU Model=%s\n" "Frequency=%.2fMHz\n" "BogoMIPS=%.2f\n" "Byte Order=%s\n", processor->model_name, processor->vendor_id, processor->cpu_mhz, processor->bogomips, #if G_BYTE_ORDER == G_LITTLE_ENDIAN "Little Endian" #else "Big Endian" #endif ); } hardinfo-0.5.1/arch/linux/sh/battery.h0000777000175000017500000000000011256732377023522 2../../linux/common/battery.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/loadavg.h0000777000175000017500000000000011256732377023430 2../../linux/common/loadavg.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/alsa.h0000777000175000017500000000000011256732377022236 2../../linux/common/alsa.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/uptime.h0000777000175000017500000000000011256732377023204 2../../linux/common/uptime.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/sensors.h0000777000175000017500000000000011256732377023566 2../../linux/common/sensors.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/modules.h0000777000175000017500000000000011256732377023516 2../../linux/common/modules.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/storage.h0000777000175000017500000000000011256732377023506 2../../linux/common/storage.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/filesystem.h0000777000175000017500000000000011256732377024746 2../../linux/common/filesystem.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/boots.h0000777000175000017500000000000011256732377022652 2../../linux/common/boots.hustar agneyagneyhardinfo-0.5.1/arch/linux/sh/memory.h0000777000175000017500000000000011256732377023216 2../../linux/common/memory.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/0000755000175000017500000000000011166403363015140 5ustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/inputdevices.h0000777000175000017500000000000011256732377025752 2../../linux/common/inputdevices.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/os.h0000777000175000017500000000000011256732377021610 2../../linux/common/os.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/net.h0000777000175000017500000000000011256732377022122 2../../linux/common/net.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/nfs.h0000777000175000017500000000000011256732377022122 2../../linux/common/nfs.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/pci.h0000777000175000017500000000000011256732377022074 2../../linux/common/pci.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/usb.h0000777000175000017500000000000011256732377022130 2../../linux/common/usb.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/samba.h0000777000175000017500000000000011256732377022714 2../../linux/common/samba.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/devmemory.h0000777000175000017500000000000011256732377025714 2../../../arch/linux/common/devmemory.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/resources.h0000777000175000017500000000000011256732377025722 2../../../arch/linux/common/resources.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/processor.h0000644000175000017500000000513711166403363017336 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ struct _Processor { gchar *model_name; gchar *vendor_id; gint cache_size; gfloat bogomips, cpu_mhz; }; static GSList * __scan_processors(void) { Processor *processor; FILE *cpuinfo; gchar buffer[128]; cpuinfo = fopen("/proc/cpuinfo", "r"); if (!cpuinfo) return NULL; processor = g_new0(Processor, 1); while (fgets(buffer, 128, cpuinfo)) { gchar **tmp = g_strsplit(buffer, ":", 2); if (tmp[0] && tmp[1]) { tmp[0] = g_strstrip(tmp[0]); tmp[1] = g_strstrip(tmp[1]); get_str("cpu", processor->model_name); get_str("machine", processor->vendor_id); get_int("L2 cache", processor->cache_size); get_float("clock", processor->cpu_mhz); get_float("bogomips", processor->bogomips); } g_strfreev(tmp); } gchar *tmp = g_strdup_printf("PowerPC %s (%.2fMHz)", processor->model_name, processor->cpu_mhz); g_free(processor->model_name); processor->model_name = tmp; fclose(cpuinfo); return g_slist_append(NULL, processor); } static gchar * processor_get_info(GSList *processors) { Processor *processor = (Processor *)processors->data; return g_strdup_printf("[Processor]\n" "Machine=%s\n" "CPU=%s\n" "L2 Cache=%dkB\n" "Frequency=%.2fMHz\n" "BogoMips=%.2f\n" "Byte Order=%s\n", processor->vendor_id, processor->model_name, processor->cache_size, processor->cpu_mhz, processor->bogomips, #if G_BYTE_ORDER == G_LITTLE_ENDIAN "Little Endian" #else "Big Endian" #endif ); } hardinfo-0.5.1/arch/linux/ppc/battery.h0000777000175000017500000000000011256732377023672 2../../linux/common/battery.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/loadavg.h0000777000175000017500000000000011256732377023600 2../../linux/common/loadavg.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/alsa.h0000777000175000017500000000000011256732377022406 2../../linux/common/alsa.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/uptime.h0000777000175000017500000000000011256732377023354 2../../linux/common/uptime.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/sensors.h0000777000175000017500000000000011256732377023736 2../../linux/common/sensors.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/modules.h0000777000175000017500000000000011256732377023666 2../../linux/common/modules.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/storage.h0000777000175000017500000000000011256732377023656 2../../linux/common/storage.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/filesystem.h0000777000175000017500000000000011256732377025116 2../../linux/common/filesystem.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/boots.h0000777000175000017500000000000011256732377024152 2../../../arch/linux/common/boots.hustar agneyagneyhardinfo-0.5.1/arch/linux/ppc/memory.h0000777000175000017500000000000011256732377023366 2../../linux/common/memory.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/0000755000175000017500000000000011166403363015003 5ustar agneyagneyhardinfo-0.5.1/arch/linux/x86/inputdevices.h0000777000175000017500000000000011256732377025615 2../../linux/common/inputdevices.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/os.h0000777000175000017500000000000011256732377021453 2../../linux/common/os.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/dmi.h0000777000175000017500000000000011256732377023063 2../../../arch/linux/common/dmi.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/net.h0000777000175000017500000000000011256732377021765 2../../linux/common/net.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/nfs.h0000777000175000017500000000000011256732377021765 2../../linux/common/nfs.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/pci.h0000777000175000017500000000000011256732377021737 2../../linux/common/pci.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/usb.h0000777000175000017500000000000011256732377021773 2../../linux/common/usb.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/samba.h0000777000175000017500000000000011256732377022557 2../../linux/common/samba.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/devmemory.h0000777000175000017500000000000011256732377025557 2../../../arch/linux/common/devmemory.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/resources.h0000777000175000017500000000000011256732377025565 2../../../arch/linux/common/resources.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/processor.h0000644000175000017500000004076211166403363017204 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * 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 */ typedef struct _ProcessorCache ProcessorCache; struct _ProcessorCache { gint level; gint number_of_sets; gint physical_line_partition; gint size; gchar *type; gint ways_of_associativity; }; struct _Processor { gchar *model_name; gchar *vendor_id; gchar *flags; gint cache_size; gfloat bogomips, cpu_mhz; gchar *has_fpu; gchar *bug_fdiv, *bug_hlt, *bug_f00f, *bug_coma; gint model, family, stepping; gchar *strmodel; gint id; GSList *cache; }; /* * This function is partly based on x86cpucaps * by Osamu Kayasono */ static 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"); } } 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, cache->type, cache->ways_of_associativity, cache->number_of_sets, cache->size); } return result; } static void __cache_obtain_info(Processor *processor, gint processor_number) { ProcessorCache *cache; gchar *endpoint, *entry, *index; gint i; endpoint = g_strdup_printf("/sys/devices/system/cpu/cpu%d/cache", processor_number); for (i = 0; ; i++) { cache = g_new0(ProcessorCache, 1); index = g_strdup_printf("index%d/", i); entry = g_strconcat(index, "type", NULL); cache->type = h_sysfs_read_string(endpoint, entry); g_free(entry); if (!cache->type) { g_free(cache); g_free(index); goto fail; } entry = g_strconcat(index, "level", NULL); cache->level = h_sysfs_read_int(endpoint, entry); g_free(entry); entry = g_strconcat(index, "number_of_sets", NULL); cache->number_of_sets = h_sysfs_read_int(endpoint, entry); g_free(entry); entry = g_strconcat(index, "physical_line_partition", NULL); cache->physical_line_partition = h_sysfs_read_int(endpoint, entry); g_free(entry); entry = g_strconcat(index, "size", NULL); cache->size = h_sysfs_read_int(endpoint, entry); g_free(entry); entry = g_strconcat(index, "ways_of_associativity", NULL); cache->ways_of_associativity = h_sysfs_read_int(endpoint, entry); g_free(entry); g_free(index); processor->cache = g_slist_append(processor->cache, cache); } fail: g_free(endpoint); } static GSList *__scan_processors(void) { GSList *procs = NULL; Processor *processor = NULL; FILE *cpuinfo; gchar buffer[256]; gint processor_number = 0; cpuinfo = fopen("/proc/cpuinfo", "r"); if (!cpuinfo) return NULL; while (fgets(buffer, 256, cpuinfo)) { gchar **tmp = g_strsplit(buffer, ":", 2); if (g_str_has_prefix(tmp[0], "processor")) { if (processor) { get_processor_strfamily(processor); procs = g_slist_append(procs, processor); } processor = g_new0(Processor, 1); __cache_obtain_info(processor, processor_number++); } if (tmp[0] && tmp[1]) { tmp[0] = g_strstrip(tmp[0]); tmp[1] = g_strstrip(tmp[1]); get_str("model name", processor->model_name); get_str("vendor_id", processor->vendor_id); get_str("flags", processor->flags); 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); get_int("model", processor->model); get_int("cpu family", processor->family); get_int("stepping", processor->stepping); get_int("processor", processor->id); } g_strfreev(tmp); } if (processor) { get_processor_strfamily(processor); procs = g_slist_append(procs, processor); } fclose(cpuinfo); return procs; } /* * Sources: * - Linux' cpufeature.h * - http://gentoo-wiki.com/Cpuinfo * - Intel IA-32 Architecture Software Development Manual */ static struct { char *name, *meaning; } flag_meaning[] = { { "3dnow", "3DNow! Technology" }, { "3dnowext", "Extended 3DNow! Technology" }, { "fpu", "Floating Point Unit" }, { "vme", "Virtual 86 Mode Extension" }, { "de", "Debug Extensions - I/O breakpoints" }, { "pse", "Page Size Extensions (4MB pages)" }, { "tsc", "Time Stamp Counter and RDTSC instruction" }, { "msr", "Model Specific Registers" }, { "pae", "Physical Address Extensions" }, { "mce", "Machine Check Architeture" }, { "cx8", "CMPXCHG8 instruction" }, { "apic", "Advanced Programmable Interrupt Controller" }, { "sep", "Fast System Call (SYSENTER/SYSEXIT)" }, { "mtrr", "Memory Type Range Registers" }, { "pge", "Page Global Enable" }, { "mca", "Machine Check Architecture" }, { "cmov", "Conditional Move instruction" }, { "pat", "Page Attribute Table" }, { "pse36", "36bit Page Size Extensions" }, { "psn", "96 bit Processor Serial Number" }, { "mmx", "MMX technology" }, { "mmxext", "Extended MMX Technology" }, { "cflush", "Cache Flush" }, { "dtes", "Debug Trace Store" }, { "fxsr", "FXSAVE and FXRSTOR instructions" }, { "kni", "Streaming SIMD instructions" }, { "xmm", "Streaming SIMD instructions" }, { "ht", "HyperThreading" }, { "mp", "Multiprocessing Capable" }, { "sse", "SSE instructions" }, { "sse2", "SSE2 (WNI) instructions" }, { "acc", "Automatic Clock Control" }, { "ia64", "IA64 Instructions" }, { "syscall", "SYSCALL and SYSEXIT instructions" }, { "nx", "No-execute Page Protection" }, { "xd", "Execute Disable" }, { "clflush", "Cache Line Flush instruction" }, { "acpi", "Thermal Monitor and Software Controlled Clock" }, { "dts", "Debug Store" }, { "ss", "Self Snoop" }, { "tm", "Thermal Monitor" }, { "pbe", "Pending Break Enable" }, { "pb", "Pending Break Enable" }, { "pn", "Processor serial number" }, { "ds", "Debug Store" }, { "xmm2", "Streaming SIMD Extensions-2" }, { "xmm3", "Streaming SIMD Extensions-3" }, { "selfsnoop", "CPU self snoop" }, { "rdtscp", "RDTSCP" }, { "recovery", "CPU in recovery mode" }, { "longrun", "Longrun power control" }, { "lrti", "LongRun table interface" }, { "cxmmx", "Cyrix MMX extensions" }, { "k6_mtrr", "AMD K6 nonstandard MTRRs" }, { "cyrix_arr", "Cyrix ARRs (= MTRRs)" }, { "centaur_mcr","Centaur MCRs (= MTRRs)" }, { "constant_tsc","TSC ticks at a constant rate" }, { "up", "smp kernel running on up" }, { "fxsave_leak","FXSAVE leaks FOP/FIP/FOP" }, { "arch_perfmon","Intel Architectural PerfMon" }, { "pebs", "Precise-Event Based Sampling" }, { "bts", "Branch Trace Store" }, { "sync_rdtsc", "RDTSC synchronizes the CPU" }, { "rep_good", "rep microcode works well on this CPU" }, { "mwait", "Monitor/Mwait support" }, { "ds_cpl", "CPL Qualified Debug Store" }, { "est", "Enhanced SpeedStep" }, { "tm2", "Thermal Monitor 2" }, { "cid", "Context ID" }, { "xtpr", "Send Task Priority Messages" }, { "xstore", "on-CPU RNG present (xstore insn)" }, { "xstore_en", "on-CPU RNG enabled" }, { "xcrypt", "on-CPU crypto (xcrypt insn)" }, { "xcrypt_en", "on-CPU crypto enabled" }, { "ace2", "Advanced Cryptography Engine v2" }, { "ace2_en", "ACE v2 enabled" }, { "phe", "PadLock Hash Engine" }, { "phe_en", "PHE enabled" }, { "pmm", "PadLock Montgomery Multiplier" }, { "pmm_en", "PMM enabled" }, { "lahf_lm", "LAHF/SAHF in long mode" }, { "cmp_legacy", "HyperThreading not valid" }, { "lm", "LAHF/SAHF in long mode" }, { "ds_cpl", "CPL Qualified Debug Store" }, { "vmx", "Virtualization support (Intel)" }, { "svm", "Virtualization support (AMD)" }, { "est", "Enhanced SpeedStep" }, { "tm2", "Thermal Monitor 2" }, { "ssse3", "Supplemental Streaming SIMD Extension 3" }, { "cx16", "CMPXCHG16B instruction" }, { "xptr", "Send Task Priority Messages" }, { "pebs", "Precise Event Based Sampling" }, { "bts", "Branch Trace Store" }, { "ida", "Intel Dynamic Acceleration" }, { "arch_perfmon","Intel Architectural PerfMon" }, { "pni", "Streaming SIMD Extension 3 (Prescott New Instruction)" }, { "rep_good", "rep microcode works well on this CPU" }, { "ts", "Thermal Sensor" }, { "sse3", "Streaming SIMD Extension 3" }, { "sse4", "Streaming SIMD Extension 4" }, { "tni", "Tejas New Instruction" }, { "nni", "Nehalem New Instruction" }, { "tpr", "Task Priority Register" }, { "vid", "Voltage Identifier" }, { "fid", "Frequency Identifier" }, { NULL, NULL }, }; gchar *processor_get_capabilities_from_flags(gchar * strflags) { /* FIXME: * - Separate between processor capabilities, additional instructions and whatnot. * - Use binary search or something faster than this O(n) cruft */ gchar **flags, **old; gchar *tmp = NULL; gint i, j = 0; flags = g_strsplit(strflags, " ", 0); old = flags; while (flags[j]) { gchar *meaning = ""; for (i = 0; flag_meaning[i].name != NULL; i++) { if (g_str_equal(flags[j], flag_meaning[i].name)) { meaning = flag_meaning[i].meaning; break; } } tmp = h_strdup_cprintf("%s=%s\n", tmp, flags[j], meaning); j++; } g_strfreev(old); return tmp; } static gchar *processor_get_detailed_info(Processor * processor) { gchar *tmp, *ret, *cache_info; tmp = processor_get_capabilities_from_flags(processor->flags); cache_info = __cache_get_info_as_string(processor); ret = g_strdup_printf("[Processor]\n" "Name=%s\n" "Family, model, stepping=%d, %d, %d (%s)\n" "Vendor=%s\n" "[Configuration]\n" "Cache Size=%dkb\n" "Frequency=%.2fMHz\n" "BogoMIPS=%.2f\n" "Byte Order=%s\n" "[Features]\n" "FDIV Bug=%s\n" "HLT Bug=%s\n" "F00F Bug=%s\n" "Coma Bug=%s\n" "Has FPU=%s\n" "[Cache]\n" "%s\n" "[Capabilities]\n" "%s", processor->model_name, processor->family, processor->model, processor->stepping, processor->strmodel, vendor_get_name(processor->vendor_id), processor->cache_size, processor->cpu_mhz, processor->bogomips, #if G_BYTE_ORDER == G_LITTLE_ENDIAN "Little Endian", #else "Big Endian", #endif processor->bug_fdiv ? processor->bug_fdiv : "no", processor->bug_hlt ? processor->bug_hlt : "no", processor->bug_f00f ? processor->bug_f00f : "no", processor->bug_coma ? processor->bug_coma : "no", processor->has_fpu ? processor->has_fpu : "no", cache_info, tmp); g_free(tmp); g_free(cache_info); return ret; } static gchar *processor_get_info(GSList * processors) { 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=%.2fMHz\n", tmp, processor->id, processor->model_name, processor->cpu_mhz); hashkey = g_strdup_printf("CPU%d", processor->id); g_hash_table_insert(moreinfo, hashkey, processor_get_detailed_info(processor)); } 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); } hardinfo-0.5.1/arch/linux/x86/battery.h0000777000175000017500000000000011256732377023535 2../../linux/common/battery.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/loadavg.h0000777000175000017500000000000011256732377023443 2../../linux/common/loadavg.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/alsa.h0000777000175000017500000000000011256732377022251 2../../linux/common/alsa.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/uptime.h0000777000175000017500000000000011256732377023217 2../../linux/common/uptime.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/sensors.h0000777000175000017500000000000011256732377023601 2../../linux/common/sensors.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/modules.h0000777000175000017500000000000011256732377023531 2../../linux/common/modules.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/storage.h0000777000175000017500000000000011256732377023521 2../../linux/common/storage.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/filesystem.h0000777000175000017500000000000011256732377024761 2../../linux/common/filesystem.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/boots.h0000777000175000017500000000000011256732377022665 2../../linux/common/boots.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86/memory.h0000777000175000017500000000000011256732377023231 2../../linux/common/memory.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/0000755000175000017500000000000011166403363015121 5ustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/inputdevices.h0000777000175000017500000000000011256732377027063 2../../../arch/linux/common/inputdevices.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/os.h0000777000175000017500000000000011256732377022721 2../../../arch/linux/common/os.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/net.h0000777000175000017500000000000011256732377023233 2../../../arch/linux/common/net.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/nfs.h0000777000175000017500000000000011256732377023233 2../../../arch/linux/common/nfs.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/pci.h0000777000175000017500000000000011256732377023205 2../../../arch/linux/common/pci.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/usb.h0000777000175000017500000000000011256732377023241 2../../../arch/linux/common/usb.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/samba.h0000777000175000017500000000000011256732377024025 2../../../arch/linux/common/samba.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/devmemory.h0000777000175000017500000000000011256732377025675 2../../../arch/linux/common/devmemory.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/resources.h0000777000175000017500000000000011256732377025703 2../../../arch/linux/common/resources.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/processor.h0000644000175000017500000000442111166403363017312 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ struct _Processor { gchar *model_name; gchar *vendor_id; gfloat bogomips, cpu_mhz; gchar *strmodel; }; static GSList * __scan_processors(void) { Processor *processor; FILE *cpuinfo; gchar buffer[128]; cpuinfo = fopen("/proc/cpuinfo", "r"); if (!cpuinfo) return NULL; processor = g_new0(Processor, 1); while (fgets(buffer, 128, cpuinfo)) { gchar **tmp = g_strsplit(buffer, ":", 2); if (tmp[0] && tmp[1]) { tmp[0] = g_strstrip(tmp[0]); tmp[1] = g_strstrip(tmp[1]); get_str("vendor", processor->model_name); get_str("arch", processor->vendor_id); get_str("family", processor->strmodel); get_float("BogoMIPS", processor->bogomips); } g_strfreev(tmp); } processor->cpu_mhz = 0.0f; fclose(cpuinfo); return g_slist_append(NULL, processor); } static gchar * processor_get_info(GSList *processors) { Processor *processor = (Processor *)processors->data; return g_strdup_printf("[Processor]\n" "Model=%s\n" "Architecture=%s\n" "Family=%sMHz\n" "BogoMIPS=%s\n" "Byte Order=%s\n", processor->model_name, processor->vendor_id, processor->strmodel, processor->bogomips, #if G_BYTE_ORDER == G_LITTLE_ENDIAN "Little Endian" #else "Big Endian" #endif ); } hardinfo-0.5.1/arch/linux/ia64/battery.h0000777000175000017500000000000011256732377025003 2../../../arch/linux/common/battery.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/loadavg.h0000777000175000017500000000000011256732377024711 2../../../arch/linux/common/loadavg.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/alsa.h0000777000175000017500000000000011256732377023517 2../../../arch/linux/common/alsa.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/uptime.h0000777000175000017500000000000011256732377024465 2../../../arch/linux/common/uptime.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/sensors.h0000777000175000017500000000000011256732377025047 2../../../arch/linux/common/sensors.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/modules.h0000777000175000017500000000000011256732377024777 2../../../arch/linux/common/modules.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/storage.h0000777000175000017500000000000011256732377024767 2../../../arch/linux/common/storage.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/filesystem.h0000777000175000017500000000000011256732377026227 2../../../arch/linux/common/filesystem.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/boots.h0000777000175000017500000000000011256732377024133 2../../../arch/linux/common/boots.hustar agneyagneyhardinfo-0.5.1/arch/linux/ia64/memory.h0000777000175000017500000000000011256732377024477 2../../../arch/linux/common/memory.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/0000755000175000017500000000000011166403363015143 5ustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/inputdevices.h0000777000175000017500000000000011256732377025755 2../../linux/common/inputdevices.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/os.h0000777000175000017500000000000011256732377021613 2../../linux/common/os.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/net.h0000777000175000017500000000000011256732377022125 2../../linux/common/net.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/nfs.h0000777000175000017500000000000011256732377022125 2../../linux/common/nfs.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/pci.h0000777000175000017500000000000011256732377022077 2../../linux/common/pci.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/usb.h0000777000175000017500000000000011256732377022133 2../../linux/common/usb.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/samba.h0000777000175000017500000000000011256732377022717 2../../linux/common/samba.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/devmemory.h0000777000175000017500000000000011256732377025717 2../../../arch/linux/common/devmemory.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/resources.h0000777000175000017500000000000011256732377025725 2../../../arch/linux/common/resources.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/processor.h0000644000175000017500000000441111166403363017333 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ struct _Processor { gchar *model_name; gfloat bogomips, cpu_mhz; gchar *has_fpu; }; static GSList * __scan_processors(void) { Processor *processor; FILE *cpuinfo; gchar buffer[128]; cpuinfo = fopen("/proc/cpuinfo", "r"); if (!cpuinfo) return NULL; processor = g_new0(Processor, 1); while (fgets(buffer, 128, cpuinfo)) { gchar **tmp = g_strsplit(buffer, ":", 2); if (tmp[0] && tmp[1]) { tmp[0] = g_strstrip(tmp[0]); tmp[1] = g_strstrip(tmp[1]); get_str("CPU", processor->model_name); get_float("Clocking", processor->cpu_mhz); get_float("bogomips", processor->bogomips); get_str("FPU", processor->has_fpu); } 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); } static gchar * processor_get_info(GSList *processors) { Processor *processor = (Processor *)processors->data; return g_strdup_printf("[Processor]\n" "Name=%s\n" "Frequency=%.2fMHz\n" "BogoMips=%.2f\n" "Byte Order=%s\n", processor->model_name, processor->cpu_mhz, processor->bogomips, #if G_BYTE_ORDER == G_LITTLE_ENDIAN "Little Endian" #else "Big Endian" #endif ); } hardinfo-0.5.1/arch/linux/m68k/battery.h0000777000175000017500000000000011256732377023675 2../../linux/common/battery.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/loadavg.h0000777000175000017500000000000011256732377023603 2../../linux/common/loadavg.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/alsa.h0000777000175000017500000000000011256732377022411 2../../linux/common/alsa.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/uptime.h0000777000175000017500000000000011256732377023357 2../../linux/common/uptime.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/sensors.h0000777000175000017500000000000011256732377023741 2../../linux/common/sensors.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/modules.h0000777000175000017500000000000011256732377023671 2../../linux/common/modules.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/storage.h0000777000175000017500000000000011256732377023661 2../../linux/common/storage.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/filesystem.h0000777000175000017500000000000011256732377025121 2../../linux/common/filesystem.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/boots.h0000777000175000017500000000000011256732377024155 2../../../arch/linux/common/boots.hustar agneyagneyhardinfo-0.5.1/arch/linux/m68k/memory.h0000777000175000017500000000000011256732377023371 2../../linux/common/memory.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/0000755000175000017500000000000011166403363015326 5ustar agneyagneyhardinfo-0.5.1/arch/linux/mips/inputdevices.h0000777000175000017500000000000011256732377026140 2../../linux/common/inputdevices.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/os.h0000777000175000017500000000000011256732377021776 2../../linux/common/os.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/net.h0000777000175000017500000000000011256732377022310 2../../linux/common/net.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/nfs.h0000777000175000017500000000000011256732377022310 2../../linux/common/nfs.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/pci.h0000777000175000017500000000000011256732377022262 2../../linux/common/pci.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/usb.h0000777000175000017500000000000011256732377022316 2../../linux/common/usb.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/samba.h0000777000175000017500000000000011256732377023102 2../../linux/common/samba.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/devmemory.h0000777000175000017500000000000011256732377026102 2../../../arch/linux/common/devmemory.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/resources.h0000777000175000017500000000000011256732377026110 2../../../arch/linux/common/resources.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/processor.h0000644000175000017500000000431211166403363017516 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ struct _Processor { gchar *model_name; gchar *vendor_id; gfloat bogomips, cpu_mhz; }; static GSList * __scan_processors(void) { Processor *processor; FILE *cpuinfo; gchar buffer[128]; cpuinfo = fopen("/proc/cpuinfo", "r"); if (!cpuinfo) return NULL; processor = g_new0(Processor, 1); while (fgets(buffer, 128, cpuinfo)) { gchar **tmp = g_strsplit(buffer, ":", 2); if (tmp[0] && tmp[1]) { tmp[0] = g_strstrip(tmp[0]); tmp[1] = g_strstrip(tmp[1]); get_str("system type", processor->model_name); get_str("cpu model", processor->vendor_id); get_float("cpu MHz", processor->cpu_mhz); get_float("BogoMIPS", processor->bogomips); } g_strfreev(tmp); } fclose(cpuinfo); return g_slist_append(NULL, processor); } static gchar * processor_get_info(GSList *processors) { Processor *processor = (Processor *)processors->data; return g_strdup_printf("[Processor]\n" "System Type=%s\n" "CPU Model=%s\n" "Frequency=%.2fMHz\n" "BogoMIPS=%.2f\n" "Byte Order=%s\n", processor->model_name, processor->vendor_id, processor->cpu_mhz, processor->bogomips, #if G_BYTE_ORDER == G_LITTLE_ENDIAN "Little Endian" #else "Big Endian" #endif ); } hardinfo-0.5.1/arch/linux/mips/battery.h0000777000175000017500000000000011256732377024060 2../../linux/common/battery.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/loadavg.h0000777000175000017500000000000011256732377023766 2../../linux/common/loadavg.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/alsa.h0000777000175000017500000000000011256732377022574 2../../linux/common/alsa.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/uptime.h0000777000175000017500000000000011256732377023542 2../../linux/common/uptime.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/sensors.h0000777000175000017500000000000011256732377024124 2../../linux/common/sensors.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/modules.h0000777000175000017500000000000011256732377024054 2../../linux/common/modules.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/storage.h0000777000175000017500000000000011256732377024044 2../../linux/common/storage.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/filesystem.h0000777000175000017500000000000011256732377025304 2../../linux/common/filesystem.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/boots.h0000777000175000017500000000000011256732377024340 2../../../arch/linux/common/boots.hustar agneyagneyhardinfo-0.5.1/arch/linux/mips/memory.h0000777000175000017500000000000011256732377023554 2../../linux/common/memory.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/0000755000175000017500000000000011166403363015054 5ustar agneyagneyhardinfo-0.5.1/arch/linux/s390/inputdevices.h0000777000175000017500000000000011256732377027016 2../../../arch/linux/common/inputdevices.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/os.h0000777000175000017500000000000011256732377022654 2../../../arch/linux/common/os.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/net.h0000777000175000017500000000000011256732377023166 2../../../arch/linux/common/net.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/nfs.h0000777000175000017500000000000011256732377023166 2../../../arch/linux/common/nfs.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/pci.h0000777000175000017500000000000011256732377023140 2../../../arch/linux/common/pci.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/usb.h0000777000175000017500000000000011256732377023174 2../../../arch/linux/common/usb.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/samba.h0000777000175000017500000000000011256732377023760 2../../../arch/linux/common/samba.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/devmemory.h0000777000175000017500000000000011256732377025630 2../../../arch/linux/common/devmemory.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/resources.h0000777000175000017500000000000011256732377025636 2../../../arch/linux/common/resources.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/processor.h0000644000175000017500000000445311166403363017252 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ struct _Processor { gchar *vendor_id, *model_name; gint cache_size; gfloat bogomips, cpu_mhz; }; static GSList * __scan_processors(void) { Processor *processor; FILE *cpuinfo; gchar buffer[128]; cpuinfo = fopen("/proc/cpuinfo", "r"); if (!cpuinfo) return NULL; processor = g_new0(Processor, 1); while (fgets(buffer, 128, cpuinfo)) { gchar **tmp = g_strsplit(buffer, ":", 2); if (tmp[0] && tmp[1]) { tmp[0] = g_strstrip(tmp[0]); tmp[1] = g_strstrip(tmp[1]); get_str("vendor_id", processor->vendor_id); get_float("# processors", processor->cache_size); get_int("bogomips per cpu", processor->bogomips); } g_strfreev(tmp); } processor->cpu_mhz = 0.0f; processor->model_name = g_strconcat("S390 ", processor->vendor_id, NULL); g_free(processor->vendor_id); fclose(cpuinfo); return g_slist_append(NULL, processor); } static gchar * processor_get_info(GSList *processors) { Processor *processor = (Processor *)processors->data; return g_strdup_printf("[Processor]\n" "Model=%s\n" "Processors=%d\n" "BogoMips per CPU=%.2f" "Byte Order=%s\n", processor->model_name, processor->cache_size, processor->bogomips, #if G_BYTE_ORDER == G_LITTLE_ENDIAN "Little Endian" #else "Big Endian" #endif ); } hardinfo-0.5.1/arch/linux/s390/battery.h0000777000175000017500000000000011256732377024736 2../../../arch/linux/common/battery.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/loadavg.h0000777000175000017500000000000011256732377024644 2../../../arch/linux/common/loadavg.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/alsa.h0000777000175000017500000000000011256732377023452 2../../../arch/linux/common/alsa.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/uptime.h0000777000175000017500000000000011256732377024420 2../../../arch/linux/common/uptime.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/sensors.h0000777000175000017500000000000011256732377025002 2../../../arch/linux/common/sensors.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/modules.h0000777000175000017500000000000011256732377024732 2../../../arch/linux/common/modules.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/storage.h0000777000175000017500000000000011256732377024722 2../../../arch/linux/common/storage.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/filesystem.h0000777000175000017500000000000011256732377026162 2../../../arch/linux/common/filesystem.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/boots.h0000777000175000017500000000000011256732377024066 2../../../arch/linux/common/boots.hustar agneyagneyhardinfo-0.5.1/arch/linux/s390/memory.h0000777000175000017500000000000011256732377024432 2../../../arch/linux/common/memory.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/0000755000175000017500000000000011166403363015443 5ustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/inputdevices.h0000777000175000017500000000000011256732377027405 2../../../arch/linux/common/inputdevices.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/os.h0000777000175000017500000000000011256732377023243 2../../../arch/linux/common/os.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/net.h0000777000175000017500000000000011256732377023555 2../../../arch/linux/common/net.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/nfs.h0000777000175000017500000000000011256732377023555 2../../../arch/linux/common/nfs.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/pci.h0000777000175000017500000000000011256732377023527 2../../../arch/linux/common/pci.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/usb.h0000777000175000017500000000000011256732377023563 2../../../arch/linux/common/usb.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/samba.h0000777000175000017500000000000011256732377024347 2../../../arch/linux/common/samba.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/devmemory.h0000777000175000017500000000000011256732377026217 2../../../arch/linux/common/devmemory.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/resources.h0000777000175000017500000000000011256732377026225 2../../../arch/linux/common/resources.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/processor.h0000644000175000017500000000444411166403363017641 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ struct _Processor { gchar *model_name; gfloat bogomips, cpu_mhz; gchar *strmodel; }; static GSList * __scan_processors(void) { Processor *processor; FILE *cpuinfo; gchar buffer[128]; cpuinfo = fopen("/proc/cpuinfo", "r"); if (!cpuinfo) return NULL; processor = g_new0(Processor, 1); while (fgets(buffer, 128, cpuinfo)) { gchar **tmp = g_strsplit(buffer, ":", 2); if (tmp[0] && tmp[1]) { tmp[0] = g_strstrip(tmp[0]); tmp[1] = g_strstrip(tmp[1]); get_str("cpu model", processor->model_name); get_float("BogoMIPS", processor->bogomips); get_str("platform string", processor->strmodel); } g_strfreev(tmp); } gchar *tmp = g_strconcat("Alpha ", processor->model_name, NULL); g_free(processor->model_name); processor->model_name = tmp; processor->cpu_mhz = 0.0f; fclose(cpuinfo); return g_slist_append(NULL, processor); } static gchar * processor_get_info(GSList *processors) { Processor *processor = (Processor *)processors->data; return g_strdup_printf("[Processor]\n" "Model=%s\n" "Platform String=%s\n" "BogoMIPS=%.2f" "Byte Order=%s\n", processor->model_name, processor->strmodel, processor->bogomips, #if G_BYTE_ORDER == G_LITTLE_ENDIAN "Little Endian" #else "Big Endian" #endif ); } hardinfo-0.5.1/arch/linux/alpha/battery.h0000777000175000017500000000000011256732377025325 2../../../arch/linux/common/battery.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/loadavg.h0000777000175000017500000000000011256732377025233 2../../../arch/linux/common/loadavg.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/alsa.h0000777000175000017500000000000011256732377024041 2../../../arch/linux/common/alsa.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/uptime.h0000777000175000017500000000000011256732377025007 2../../../arch/linux/common/uptime.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/sensors.h0000777000175000017500000000000011256732377025371 2../../../arch/linux/common/sensors.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/modules.h0000777000175000017500000000000011256732377025321 2../../../arch/linux/common/modules.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/storage.h0000777000175000017500000000000011256732377025311 2../../../arch/linux/common/storage.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/filesystem.h0000777000175000017500000000000011256732377026551 2../../../arch/linux/common/filesystem.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/boots.h0000777000175000017500000000000011256732377024455 2../../../arch/linux/common/boots.hustar agneyagneyhardinfo-0.5.1/arch/linux/alpha/memory.h0000777000175000017500000000000011256732377025021 2../../../arch/linux/common/memory.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/0000755000175000017500000000000011166403363015466 5ustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/inputdevices.h0000777000175000017500000000000011256732377026300 2../../linux/common/inputdevices.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/os.h0000777000175000017500000000000011256732377022136 2../../linux/common/os.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/net.h0000777000175000017500000000000011256732377022450 2../../linux/common/net.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/nfs.h0000777000175000017500000000000011256732377022450 2../../linux/common/nfs.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/pci.h0000777000175000017500000000000011256732377022422 2../../linux/common/pci.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/usb.h0000777000175000017500000000000011256732377022456 2../../linux/common/usb.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/samba.h0000777000175000017500000000000011256732377023242 2../../linux/common/samba.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/devmemory.h0000777000175000017500000000000011256732377026242 2../../../arch/linux/common/devmemory.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/resources.h0000777000175000017500000000000011256732377026250 2../../../arch/linux/common/resources.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/processor.h0000644000175000017500000000343411166403363017662 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ struct _Processor { gchar *model_name; gchar *has_fpu; gfloat cpu_mhz; }; static GSList * __scan_processors(void) { Processor *processor; FILE *cpuinfo; gchar buffer[128]; cpuinfo = fopen("/proc/cpuinfo", "r"); if (!cpuinfo) return NULL; processor = g_new0(Processor, 1); while (fgets(buffer, 128, cpuinfo)) { gchar **tmp = g_strsplit(buffer, ":", 2); if (tmp[0] && tmp[1]) { tmp[0] = g_strstrip(tmp[0]); tmp[1] = g_strstrip(tmp[1]); get_str("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); } static gchar * processor_get_info(GSList *processors) { Processor *processor = (Processor *)processors->data; return g_strdup_printf("[Processor]\n" "CPU=%s\n" "FPU=%s\n", processor->model_name, processor->has_fpu); } hardinfo-0.5.1/arch/linux/sparc/battery.h0000777000175000017500000000000011256732377024220 2../../linux/common/battery.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/loadavg.h0000777000175000017500000000000011256732377024126 2../../linux/common/loadavg.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/alsa.h0000777000175000017500000000000011256732377022734 2../../linux/common/alsa.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/uptime.h0000777000175000017500000000000011256732377023702 2../../linux/common/uptime.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/sensors.h0000777000175000017500000000000011256732377024264 2../../linux/common/sensors.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/modules.h0000777000175000017500000000000011256732377024214 2../../linux/common/modules.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/storage.h0000777000175000017500000000000011256732377024204 2../../linux/common/storage.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/filesystem.h0000777000175000017500000000000011256732377025444 2../../linux/common/filesystem.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/boots.h0000777000175000017500000000000011256732377024500 2../../../arch/linux/common/boots.hustar agneyagneyhardinfo-0.5.1/arch/linux/sparc/memory.h0000777000175000017500000000000011256732377023714 2../../linux/common/memory.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/0000755000175000017500000000000011166403363015563 5ustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/inputdevices.h0000777000175000017500000000000011256732377026375 2../../linux/common/inputdevices.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/os.h0000777000175000017500000000000011256732377022233 2../../linux/common/os.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/net.h0000777000175000017500000000000011256732377022545 2../../linux/common/net.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/nfs.h0000777000175000017500000000000011256732377022545 2../../linux/common/nfs.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/pci.h0000777000175000017500000000000011256732377022517 2../../linux/common/pci.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/usb.h0000777000175000017500000000000011256732377022553 2../../linux/common/usb.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/samba.h0000777000175000017500000000000011256732377023337 2../../linux/common/samba.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/devmemory.h0000777000175000017500000000000011256732377026337 2../../../arch/linux/common/devmemory.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/resources.h0000777000175000017500000000000011256732377026345 2../../../arch/linux/common/resources.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/processor.h0000644000175000017500000000434411166403363017760 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ struct _Processor { gchar *model_name; gchar *flags; gfloat bogomips, cpu_mhz; gchar *has_fpu; }; static GSList * __scan_processors(void) { Processor *processor; FILE *cpuinfo; gchar buffer[128]; cpuinfo = fopen("/proc/cpuinfo", "r"); if (!cpuinfo) return NULL; processor = g_new0(Processor, 1); while (fgets(buffer, 128, cpuinfo)) { gchar **tmp = g_strsplit(buffer, ":", 2); if (tmp[0] && tmp[1]) { tmp[0] = g_strstrip(tmp[0]); tmp[1] = g_strstrip(tmp[1]); get_str("Processor", processor->model_name); get_str("Features", processor->flags); get_float("BogoMIPS", processor->bogomips); get_str("Hardware", processor->has_fpu); } g_strfreev(tmp); } processor->cpu_mhz = 0.0f; fclose(cpuinfo); return g_slist_append(NULL, processor); } static gchar * processor_get_info(GSList *processors) { Processor *processor = (Processor *)processors->data; return g_strdup_printf("[Processor]\n" "Name=%s\n" "Features=%s\n" "BogoMips=%.2f\n" "Endianesss=" #if G_BYTE_ORDER == G_LITTLE_ENDIAN "Little Endian", #else "Big Endian", #endif "\n" "Hardware=%s\n", processor->model_name, processor->flags, processor->bogomips, processor->has_fpu); } hardinfo-0.5.1/arch/linux/armv4l/battery.h0000777000175000017500000000000011256732377024315 2../../linux/common/battery.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/loadavg.h0000777000175000017500000000000011256732377024223 2../../linux/common/loadavg.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/alsa.h0000777000175000017500000000000011256732377023031 2../../linux/common/alsa.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/uptime.h0000777000175000017500000000000011256732377023777 2../../linux/common/uptime.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/sensors.h0000777000175000017500000000000011256732377024361 2../../linux/common/sensors.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/modules.h0000777000175000017500000000000011256732377024311 2../../linux/common/modules.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/storage.h0000777000175000017500000000000011256732377024301 2../../linux/common/storage.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/filesystem.h0000777000175000017500000000000011256732377025541 2../../linux/common/filesystem.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/boots.h0000777000175000017500000000000011256732377024575 2../../../arch/linux/common/boots.hustar agneyagneyhardinfo-0.5.1/arch/linux/armv4l/memory.h0000777000175000017500000000000011256732377024011 2../../linux/common/memory.hustar agneyagneyhardinfo-0.5.1/arch/linux/common/0000755000175000017500000000000011166403363015646 5ustar agneyagneyhardinfo-0.5.1/arch/linux/common/inputdevices.h0000644000175000017500000000705311166403363020526 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * 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 gchar *input_icons = NULL; static gboolean remove_input_devices(gpointer key, gpointer value, gpointer data) { return g_str_has_prefix(key, "INP"); } 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[128]; gchar *tmp, *name = NULL, *phys = NULL; gint bus, vendor, product, version; int d = 0, n = 0; dev = fopen("/proc/bus/input/devices", "r"); if (!dev) return; if (input_list) { g_hash_table_foreach_remove(moreinfo, remove_input_devices, NULL); g_free(input_list); g_free(input_icons); } input_list = g_strdup(""); input_icons = g_strdup(""); while (fgets(buffer, 128, dev)) { tmp = buffer; switch (*tmp) { case 'N': name = g_strdup(tmp + strlen("N: Name=")); 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 (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); gchar *strhash = g_strdup_printf("[Device Information]\n" "Name=%s\n" "Type=%s\n" "Bus=0x%x\n", name, input_devices[d].name, bus); const gchar *url = vendor_get_url(name); if (url) { strhash = h_strdup_cprintf("Vendor=%s (%s)\n", strhash, vendor_get_name(name), url); } else { strhash = h_strdup_cprintf("Vendor=%x\n", strhash, vendor); } strhash = h_strdup_cprintf("Product=0x%x\n" "Version=0x%x\n", strhash, product, version); if (phys[1] != 0) { strhash = h_strdup_cprintf("Connected to=%s\n", strhash, phys); } if (strstr(phys,"ir")) { strhash = h_strdup_cprintf("InfraRed port=yes\n", strhash); } g_hash_table_insert(moreinfo, tmp, strhash); g_free(phys); g_free(name); } } fclose(dev); } hardinfo-0.5.1/arch/linux/common/os.h0000644000175000017500000001515011166403363016442 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * 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 gchar * get_default_gcc_version(void) { char *buf; if (g_spawn_command_line_sync("gcc -v", NULL, &buf, NULL, NULL)) { char *return_value; if (!(return_value = strstr(buf, "gcc "))) { goto err; } return_value = strstr(return_value, " ") + 1; return_value = strstr(return_value, " ") + 1; return_value = g_strdup_printf("GNU C Compiler version %s", return_value); g_free(buf); return return_value; } err: return g_strdup("Unknown"); } static gchar * get_libc_version(void) { FILE *libc; gchar buf[256], *tmp, *p; libc = popen("/lib/libc.so.6", "r"); if (!libc) goto err; (void)fgets(buf, 256, libc); if (pclose(libc)) goto err; tmp = strstr(buf, "version "); if (!tmp) goto err; p = strchr(tmp, ','); if (p) *p = '\0'; else goto err; return g_strdup_printf("GNU C Library version %s (%sstable)", strchr(tmp, ' ') + 1, strstr(buf, " stable ") ? "" : "un"); err: return g_strdup("Unknown"); } static gchar * get_os_compiled_date(void) { FILE *procversion; gchar buf[512]; procversion = fopen("/proc/sys/kernel/version", "r"); if (!procversion) return g_strdup("Unknown"); (void)fgets(buf, 512, procversion); fclose(procversion); return g_strdup(buf); } #include void detect_desktop_environment(OperatingSystem * os) { const gchar *tmp = g_getenv("GNOME_DESKTOP_SESSION_ID"); FILE *version; char vers[16]; if (tmp) { /* FIXME: this might not be true, as the gnome-panel in path may not be the one that's running. see where the user's running panel is and run *that* to obtain the version. */ version = popen("gnome-about --gnome-version", "r"); if (version) { (void)fscanf(version, "Version: %s", vers); if (pclose(version)) goto unknown; } else { goto unknown; } os->desktop = g_strdup_printf("GNOME %s", vers); } else if (g_getenv("KDE_FULL_SESSION")) { if (g_getenv("KDE_SESSION_VERSION") && strstr(g_getenv("KDE_SESSION_VERSION"),(gchar *)"4")) { version = popen("kwin --version", "r"); } else { version = popen("kcontrol --version", "r"); } if (version) { char buf[32]; (void)fgets(buf, 32, version); (void)fscanf(version, "KDE: %s", vers); if (pclose(version)) goto unknown; } else { goto unknown; } os->desktop = g_strdup_printf("KDE %s", vers); } else { unknown: if (!g_getenv("DISPLAY")) { os->desktop = g_strdup("Terminal"); } else { GdkScreen *screen = gdk_screen_get_default(); if (screen && GDK_IS_SCREEN(screen)) { const gchar *windowman; windowman = gdk_x11_screen_get_window_manager_name(screen); if (g_str_equal(windowman, "Xfwm4")) { /* FIXME: check if xprop -root | grep XFCE_DESKTOP_WINDOW is defined */ os->desktop = g_strdup("XFCE 4"); } else { os->desktop = g_strdup_printf("Unknown (Window Manager: %s)", windowman); } } else { os->desktop = g_strdup("Unknown"); } } } } static OperatingSystem * computer_get_os(void) { struct utsname utsbuf; OperatingSystem *os; int i; os = g_new0(OperatingSystem, 1); os->compiled_date = get_os_compiled_date(); /* Attempt to get the Distribution name; try using /etc/lsb-release first, then doing the legacy method (checking for /etc/$DISTRO-release files) */ if (g_file_test("/etc/lsb-release", G_FILE_TEST_EXISTS)) { FILE *release; gchar buffer[128]; release = popen("lsb_release -d", "r"); if (release) { (void)fgets(buffer, 128, release); pclose(release); os->distro = buffer; os->distro = g_strdup(os->distro + strlen("Description:\t")); } } for (i = 0;; i++) { if (distro_db[i].file == NULL) { os->distrocode = g_strdup("unk"); os->distro = g_strdup("Unknown distribution"); break; } if (g_file_test(distro_db[i].file, G_FILE_TEST_EXISTS)) { FILE *distro_ver; char buf[128]; distro_ver = fopen(distro_db[i].file, "r"); (void)fgets(buf, 128, distro_ver); fclose(distro_ver); buf[strlen(buf) - 1] = 0; if (!os->distro) { /* * HACK: Some Debian systems doesn't include * the distribuition name in /etc/debian_release, * so add them here. */ if (!strncmp(distro_db[i].codename, "deb", 3) && ((buf[0] >= '0' && buf[0] <= '9') || buf[0] != 'D')) { os->distro = g_strdup_printf ("Debian GNU/Linux %s", buf); } else { os->distro = g_strdup(buf); } } if (g_str_equal(distro_db[i].codename, "ppy")) { gchar *tmp; tmp = g_strdup_printf("Puppy Linux %.2f", atof(os->distro) / 100.0); g_free(os->distro); os->distro = tmp; } os->distrocode = g_strdup(distro_db[i].codename); break; } } /* Kernel and hostname info */ uname(&utsbuf); os->kernel = g_strdup_printf("%s %s (%s)", utsbuf.sysname, utsbuf.release, utsbuf.machine); os->hostname = g_strdup(utsbuf.nodename); os->language = g_strdup(g_getenv("LC_MESSAGES")); 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(); os->gcc = get_default_gcc_version(); scan_languages(os); detect_desktop_environment(os); return os; } hardinfo-0.5.1/arch/linux/common/dmi.h0000644000175000017500000001333711166403363016577 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 */ #include #include typedef struct _DMIInfo DMIInfo; struct _DMIInfo { const gchar *name; const gchar *file; /* for sysfs */ const gchar *param; /* for dmidecode */ }; DMIInfo dmi_info_table[] = { { "$BIOS", NULL, NULL }, { "Date", "/sys/class/dmi/id/bios_date", "bios-release-date" }, { "Vendor", "/sys/class/dmi/id/bios_vendor", "bios-vendor" }, { "Version", "/sys/class/dmi/id/bios_version", "bios-version" }, { "$Board", NULL, NULL }, { "Name", "/sys/class/dmi/id/board_name", "baseboard-product-name" }, { "Vendor", "/sys/class/dmi/id/board_vendor", "baseboard-manufacturer" }, }; static gchar *dmi_info = NULL; gboolean dmi_get_info_dmidecode() { FILE *dmi_pipe; gchar buffer[256]; DMIInfo *info; gboolean dmi_failed = FALSE; gint i; if (dmi_info) { g_free(dmi_info); dmi_info = NULL; } for (i = 0; i < G_N_ELEMENTS(dmi_info_table); i++) { info = &dmi_info_table[i]; if (*(info->name) == '$') { dmi_info = h_strdup_cprintf("[%s]\n", dmi_info, (info->name) + 1); } else { gchar *temp; if (!info->param) continue; temp = g_strconcat("dmidecode -s ", info->param, NULL); if ((dmi_pipe = popen(temp, "r"))) { g_free(temp); (void)fgets(buffer, 256, dmi_pipe); if (pclose(dmi_pipe)) { dmi_failed = TRUE; break; } const gchar *url = vendor_get_url(buffer); if (url) { const gchar *vendor = vendor_get_name(buffer); if (g_strstr_len(vendor, -1, g_strstrip(buffer)) || g_strstr_len(g_strstrip(buffer), -1, vendor)) { dmi_info = h_strdup_cprintf("%s=%s (%s)\n", dmi_info, info->name, g_strstrip(buffer), url); } else { dmi_info = h_strdup_cprintf("%s=%s (%s, %s)\n", dmi_info, info->name, g_strstrip(buffer), vendor, url); } } else { dmi_info = h_strdup_cprintf("%s=%s\n", dmi_info, info->name, buffer); } } else { g_free(temp); dmi_failed = TRUE; break; } } } if (dmi_failed) { g_free(dmi_info); dmi_info = NULL; } return !dmi_failed; } gboolean dmi_get_info_sys() { FILE *dmi_file; gchar buffer[256]; DMIInfo *info; gboolean dmi_failed = FALSE; gint i; if (dmi_info) { g_free(dmi_info); dmi_info = NULL; } for (i = 0; i < G_N_ELEMENTS(dmi_info_table); i++) { info = &dmi_info_table[i]; if (*(info->name) == '$') { dmi_info = h_strdup_cprintf("[%s]\n", dmi_info, (info->name) + 1); } else { if (!info->file) continue; if ((dmi_file = fopen(info->file, "r"))) { (void)fgets(buffer, 256, dmi_file); fclose(dmi_file); const gchar *url = vendor_get_url(buffer); if (url) { const gchar *vendor = vendor_get_name(buffer); if (g_strstr_len(vendor, -1, g_strstrip(buffer)) || g_strstr_len(g_strstrip(buffer), -1, vendor)) { dmi_info = h_strdup_cprintf("%s=%s (%s)\n", dmi_info, info->name, g_strstrip(buffer), url); } else { dmi_info = h_strdup_cprintf("%s=%s (%s, %s)\n", dmi_info, info->name, g_strstrip(buffer), vendor, url); } } else { dmi_info = h_strdup_cprintf("%s=%s\n", dmi_info, info->name, g_strstrip(buffer)); } } else { dmi_failed = TRUE; break; } } } if (dmi_failed) { g_free(dmi_info); dmi_info = NULL; } return !dmi_failed; } void __scan_dmi() { gboolean dmi_ok; dmi_ok = dmi_get_info_sys(); if (!dmi_ok) { dmi_ok = dmi_get_info_dmidecode(); } if (!dmi_ok) { dmi_info = g_strdup("[No DMI information]\n" "There was an error retrieving the information.=\n" "Please try running HardInfo as root.=\n"); } } hardinfo-0.5.1/arch/linux/common/net.h0000644000175000017500000003054111166403363016610 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2008 Leandro A. F. Pereira * * 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 */ static gchar *network_interfaces = NULL, *network_icons = NULL; #include #include #include #include #include #include #include #include #include #ifdef HAS_LINUX_WE #include #include #else #include #endif /* HAS_LINUX_WE */ 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[] = { "Auto", "Ad-Hoc", "Managed", "Master", "Repeater", "Secondary", "Unknown" }; void get_wireless_info(int fd, NetInfo *netinfo) { FILE *wrls; char wbuf[256]; struct iwreq wi_req; int r, trash; netinfo->is_wireless = FALSE; if ((wrls = fopen("/proc/net/wireless", "r"))) { while (fgets(wbuf, 256, wrls)) { if (strchr(wbuf, ':') && strstr(wbuf, netinfo->name)) { gchar *buf1 = wbuf; netinfo->is_wireless = TRUE; buf1 = strchr(buf1, ':') + 1; if (strstr(buf1, ".")) { sscanf(buf1, "%d %d. %d %d %d %d %d %d %d %d", &(netinfo->wi_status), &(netinfo->wi_quality_level), &(netinfo->wi_signal_level), &(netinfo->wi_noise_level), &trash, &trash, &trash, &trash, &trash, &trash); } else { sscanf(buf1, "%d %d %d %d %d %d %d %d %d %d", &(netinfo->wi_status), &(netinfo->wi_quality_level), &(netinfo->wi_signal_level), &(netinfo->wi_noise_level), &trash, &trash, &trash, &trash, &trash, &trash); } break; } } fclose(wrls); } if (!netinfo->is_wireless) return; strncpy(wi_req.ifr_name, netinfo->name, 16); /* obtain essid */ wi_req.u.essid.pointer = netinfo->wi_essid; wi_req.u.essid.length = IW_ESSID_MAX_SIZE + 1; wi_req.u.essid.flags = 0; if ((r = ioctl(fd, SIOCGIWESSID, &wi_req) < 0)) { strcpy(netinfo->wi_essid, ""); } else { netinfo->wi_essid[wi_req.u.essid.length] = '\0'; } /* obtain bit rate */ if ((r = ioctl(fd, SIOCGIWRATE, &wi_req) < 0)) { netinfo->wi_rate = 0; } else { netinfo->wi_rate = wi_req.u.bitrate.value; } /* obtain operation mode */ if ((r = ioctl(fd, SIOCGIWMODE, &wi_req) < 0)) { netinfo->wi_mode = 0; } else { if (wi_req.u.mode >= 0 && wi_req.u.mode < 6) { netinfo->wi_mode = wi_req.u.mode; } else { netinfo->wi_mode = 6; } } #if WIRELESS_EXT >= 10 /* obtain txpower */ if ((r = ioctl(fd, SIOCGIWTXPOW, &wi_req) < 0)) { netinfo->wi_has_txpower = FALSE; } else { netinfo->wi_has_txpower = TRUE; memcpy(&netinfo->wi_txpower, &wi_req.u.txpower, sizeof(struct iw_param)); } #else netinfo->wi_has_txpower = FALSE; #endif /* WIRELESS_EXT >= 10 */ } #endif /* HAS_LINUX_WE */ void get_net_info(char *if_name, NetInfo * netinfo) { struct ifreq ifr; int fd; fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); /* IPv4 */ ifr.ifr_addr.sa_family = AF_INET; strcpy(netinfo->name, if_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 { sprintf(netinfo->ip, "%s", inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> sin_addr)); } /* Mask Address */ strcpy(ifr.ifr_name, if_name); if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) { netinfo->mask[0] = 0; } else { sprintf(netinfo->mask, "%s", inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> sin_addr)); } /* Broadcast Address */ strcpy(ifr.ifr_name, if_name); if (ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0) { netinfo->broadcast[0] = 0; } else { sprintf(netinfo->broadcast, "%s", inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> sin_addr)); } #ifdef HAS_LINUX_WE get_wireless_info(fd, netinfo); #endif shutdown(fd, 0); close(fd); } static struct { char *type; char *label; char *icon; } netdev2type[] = { { "eth", "Ethernet", "network-interface" }, { "lo", "Loopback", "network" }, { "ppp", "Point-to-Point", "modem" }, { "ath", "Wireless", "wireless" }, { "wlan", "Wireless", "wireless" }, { "ra", "Wireless", "wireless" }, { "wl", "Wireless", "wireless" }, { "tun", "Virtual Point-to-Point (TUN)", "network" }, { "tap", "Ethernet (TAP)", "network" }, { "plip", "Parallel Line Internet Protocol", "network" }, { "irlan", "Infrared", "network" }, { "slip", "Serial Line Internet Protocol", "network" }, { "isdn", "Integrated Services Digital Network", "modem" }, { "sit", "IPv6-over-IPv4 Tunnel", "network" }, { "vmnet8", "VMWare Virtual Network Interface (NAT)", "computer" }, { "vmnet", "VMWare Virtual Network Interface", "computer" }, { "pan", "Personal Area Network (PAN)", "bluetooth" }, { "bnep", "Bluetooth", "bluetooth" }, { "br", "Bridge Interface", "network" }, { NULL, "Unknown", "network" }, }; static void net_get_iface_type(gchar * name, gchar ** type, gchar ** icon, NetInfo *ni) { int i; #ifdef HAS_LINUX_WE if (ni->is_wireless) { *type = "Wireless"; *icon = "wireless"; return; } #endif for (i = 0; netdev2type[i].type; i++) { if (g_str_has_prefix(name, netdev2type[i].type)) break; } *type = netdev2type[i].label; *icon = netdev2type[i].icon; } static gboolean remove_net_devices(gpointer key, gpointer value, gpointer data) { return g_str_has_prefix(key, "NET"); } 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("[Network Interfaces]\n" "None found=\n"); } return; } if (network_interfaces) { g_free(network_interfaces); } if (network_icons) { g_free(network_icons); } network_interfaces = g_strdup("[Network Interfaces]\n"); network_icons = g_strdup(""); proc_net = fopen("/proc/net/dev", "r"); if (!proc_net) return; while (fgets(buffer, 256, proc_net)) { if (strchr(buffer, ':')) { gint trash; gchar ifacename[16]; gchar *buf = buffer; gchar *iface_type, *iface_icon; 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|%.2lfMiB|%.2lfMiB\n", network_interfaces, devid, ifacename, ni.ip[0] ? ni.ip : "", trans_mb, recv_mb); net_get_iface_type(ifacename, &iface_type, &iface_icon, &ni); network_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", network_icons, devid, ifacename, iface_icon); detailed = g_strdup_printf("[Network Adapter Properties]\n" "Interface Type=%s\n" "Hardware Address (MAC)=%02x:%02x:%02x:%02x:%02x:%02x\n" "MTU=%d\n" "[Transfer Details]\n" "Bytes Received=%.0lf (%.2fMiB)\n" "Bytes Sent=%.0lf (%.2fMiB)\n", iface_type, ni.mac[0], ni.mac[1], ni.mac[2], ni.mac[3], ni.mac[4], ni.mac[5], ni.mtu, recv_bytes, recv_mb, trans_bytes, trans_mb); #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("%ddBm (%dmW)", dbm, mw); } else { txpower = g_strdup("Unknown"); } detailed = h_strdup_cprintf("\n[Wireless Properties]\n" "Network Name (SSID)=%s\n" "Bit Rate=%dMb/s\n" "Transmission Power=%s\n" "Mode=%s\n" "Status=%d\n" "Link Quality=%d\n" "Signal / Noise=%d / %d\n", detailed, ni.wi_essid, ni.wi_rate / 1000000, txpower, wi_operation_modes[ni.wi_mode], ni.wi_status, ni.wi_quality_level, ni.wi_signal_level, ni.wi_noise_level); g_free(txpower); } #endif if (ni.ip[0] || ni.mask[0] || ni.broadcast[0]) { detailed = h_strdup_cprintf("\n[Internet Protocol (IPv4)]\n" "IP Address=%s\n" "Mask=%s\n" "Broadcast Address=%s\n", detailed, ni.ip[0] ? ni.ip : "Not set", ni.mask[0] ? ni.mask : "Not set", ni.broadcast[0] ? ni. broadcast : "Not set"); } g_hash_table_insert(moreinfo, devid, detailed); } } fclose(proc_net); } static void scan_net_interfaces(void) { /* 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 */ g_hash_table_foreach_remove(moreinfo, remove_net_devices, NULL); scan_net_interfaces_24(); } hardinfo-0.5.1/arch/linux/common/nfs.h0000644000175000017500000000107311166403363016606 0ustar agneyagneystatic gchar *nfs_shares_list = NULL; void scan_nfs_shared_directories(void) { FILE *exports; gchar buf[512]; if (nfs_shares_list) { g_free(nfs_shares_list); } nfs_shares_list = g_strdup(""); exports = fopen("/etc/exports", "r"); if (!exports) return; while (fgets(buf, 512, exports)) { if (buf[0] != '/') continue; strend(buf, ' '); strend(buf, '\t'); nfs_shares_list = g_strconcat(nfs_shares_list, buf, "=\n", NULL); } fclose(exports); } hardinfo-0.5.1/arch/linux/common/pci.h0000644000175000017500000001677311166403363016610 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * 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). */ GHashTable *_pci_devices = NULL; void __scan_pci(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("IRQ=%d\n", strdevice, irq); if (freq) strdevice = h_strdup_cprintf("Frequency=%dMHz\n", strdevice, freq); if (latency) strdevice = h_strdup_cprintf("Latency=%d\n", strdevice, latency); strdevice = h_strdup_cprintf("Bus Master=%s\n", strdevice, bus_master ? "Yes" : "No"); } else if (!strncmp(buf, "Kernel modules", 14)) { WALK_UNTIL(' '); WALK_UNTIL(':'); buf++; strdevice = h_strdup_cprintf("Kernel modules=%s\n", strdevice, buf); } else if (!strncmp(buf, "Subsystem", 9)) { WALK_UNTIL(' '); buf++; const gchar *oem_vendor_url = vendor_get_url(buf); if (oem_vendor_url) strdevice = h_strdup_cprintf("OEM Vendor=%s (%s)\n", strdevice, vendor_get_name(buf), oem_vendor_url); } else if (!strncmp(buf, "Capabilities", 12) && !strstr(buf, "only to root") && !strstr(buf, "access denied")) { 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("Memory#%d=%d%cB (%s%s)\n", strdevice, ++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("I/O ports at#%d=0x%x - 0x%x\n", strdevice, ++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) { g_hash_table_insert(moreinfo, strhash, strdevice); 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; start = buf; WALK_UNTIL('('); *buf = 0; buf = start + 1; 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("[Device Information]\n" "Name=%s\n" "Class=%s\n" "Domain=%d\n" "Bus, device, function=%d, %d, %d\n", name, category, domain, bus, device, function); const gchar *url = vendor_get_url(name); if (url) { strdevice = h_strdup_cprintf("Vendor=%s (%s)\n", strdevice, 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 */ g_hash_table_insert(moreinfo, strhash, strdevice); g_free(category); g_free(name); } g_free(lspci_path); g_free(command_line); } hardinfo-0.5.1/arch/linux/common/usb.h0000644000175000017500000001445311166403363016617 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2008 Leandro A. F. Pereira * * 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 */ static gboolean remove_usb_devices(gpointer key, gpointer value, gpointer data) { return g_str_has_prefix(key, "USB"); } static 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("0 mA"); } if (!(manufacturer = h_sysfs_read_string(endpoint, "manufacturer"))) { manufacturer = g_strdup("Unknown"); } if (!(product = h_sysfs_read_string(endpoint, "product"))) { if (classid == 9) { product = g_strdup_printf("USB %.2f Hub", version); } else { product = g_strdup_printf("Unknown USB %.2f Device (class %d)", version, classid); } } const gchar *url = vendor_get_url(manufacturer); if (url) { tmp = g_strdup_printf("%s (%s)", vendor_get_name(manufacturer), url); g_free(manufacturer); manufacturer = tmp; } tmp = g_strdup_printf("USB%d", n); usb_list = h_strdup_cprintf("$%s$%s=\n", usb_list, tmp, product); strhash = g_strdup_printf("[Device Information]\n" "Product=%s\n" "Manufacturer=%s\n" "Speed=%.2fMbit/s\n" "Max Current=%s\n" "[Misc]\n" "USB Version=%.2f\n" "Class=0x%x\n" "Vendor=0x%x\n" "Product ID=0x%x\n" "Bus=%d\n", product, manufacturer, speed, mxpwr, version, classid, vendor, prodid, bus); g_hash_table_insert(moreinfo, tmp, strhash); g_free(manufacturer); g_free(product); g_free(mxpwr); } void __scan_usb_sysfs(void) { GDir *sysfs; gchar *filename; const gchar *sysfs_path = "/sys/class/usb_endpoint"; gint usb_device_number = 0; if (!(sysfs = g_dir_open(sysfs_path, 0, NULL))) { return; } if (usb_list) { g_hash_table_foreach_remove(moreinfo, remove_usb_devices, NULL); g_free(usb_list); } usb_list = g_strdup("[USB Devices]\n"); while ((filename = (gchar *) g_dir_read_name(sysfs))) { gchar *endpoint = g_build_filename(sysfs_path, filename, "device", NULL); gchar *temp; temp = g_build_filename(endpoint, "idVendor", NULL); if (g_file_test(temp, G_FILE_TEST_EXISTS)) { __scan_usb_sysfs_add_device(endpoint, ++usb_device_number); } g_free(temp); g_free(endpoint); } g_dir_close(sysfs); } int __scan_usb_procfs(void) { FILE *dev; gchar buffer[128]; gchar *tmp, *manuf = NULL, *product = NULL, *mxpwr; gint bus, level, port, classid, trash; gint vendor, prodid; gfloat ver, rev, speed; int n = 0; dev = fopen("/proc/bus/usb/devices", "r"); if (!dev) return 0; if (usb_list) { g_hash_table_foreach_remove(moreinfo, remove_usb_devices, NULL); g_free(usb_list); } usb_list = g_strdup("[USB Devices]\n"); while (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 == '\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); const gchar *url = vendor_get_url(manuf); if (url) { gchar *tmp = g_strdup_printf("%s (%s)", vendor_get_name(manuf), url); g_free(manuf); manuf = tmp; } gchar *strhash = g_strdup_printf("[Device Information]\n" "Product=%s\n", product); if (manuf && strlen(manuf)) strhash = h_strdup_cprintf("Manufacturer=%s\n", strhash, manuf); strhash = h_strdup_cprintf("[Port #%d]\n" "Speed=%.2fMbit/s\n" "Max Current=%s\n" "[Misc]\n" "USB Version=%.2f\n" "Revision=%.2f\n" "Class=0x%x\n" "Vendor=0x%x\n" "Product ID=0x%x\n" "Bus=%d\n" "Level=%d\n", strhash, port, speed, mxpwr, ver, rev, classid, vendor, prodid, bus, level); g_hash_table_insert(moreinfo, tmp, strhash); } g_free(manuf); g_free(product); manuf = g_strdup(""); product = g_strdup(""); } } fclose(dev); return n; } void __scan_usb(void) { if (!__scan_usb_procfs()) __scan_usb_sysfs(); } hardinfo-0.5.1/arch/linux/common/samba.h0000644000175000017500000000503511166403363017105 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * 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 gchar *smb_shares_list = NULL; void scan_samba_shared_directories(void) { GKeyFile *keyfile; GError *error = NULL; gchar **groups; gchar *smbconf; gsize length = -1; gint i = 0; if (smb_shares_list) { g_free(smb_shares_list); } keyfile = g_key_file_new(); if (!g_file_get_contents("/etc/samba/smb.conf", &smbconf, &length, &error) || length == 0) { smb_shares_list = g_strdup("Cannot open /etc/samba/smb.conf=\n"); if (error) g_error_free(error); goto cleanup; } gchar *_smbconf = smbconf; for (; *_smbconf; _smbconf++) if (*_smbconf == ';') *_smbconf = '\0'; if (!g_key_file_load_from_data(keyfile, smbconf, length, 0, &error)) { smb_shares_list = g_strdup("Cannot parse smb.conf=\n"); if (error) g_error_free(error); goto cleanup; } smb_shares_list = g_strdup(""); groups = g_key_file_get_groups(keyfile, NULL); while (groups[i]) { if (g_key_file_has_key(keyfile, groups[i], "path", NULL) && g_key_file_has_key(keyfile, groups[i], "available", NULL)) { gchar *available = g_key_file_get_string(keyfile, groups[i], "available", NULL); if (g_str_equal(available, "yes")) { gchar *path = g_key_file_get_string(keyfile, groups[i], "path", NULL); smb_shares_list = g_strconcat(smb_shares_list, groups[i], "=", path, "\n", NULL); g_free(path); } g_free(available); } i++; } g_strfreev(groups); cleanup: g_key_file_free(keyfile); g_free(smbconf); } hardinfo-0.5.1/arch/linux/common/devmemory.h0000644000175000017500000000604611166403363020034 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 GHashTable *memlabels; static void __scan_memory() { gchar **keys, *tmp; 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"); offset = strstr(os_kernel, "Linux 2.4") ? 3 : 0; g_free(os_kernel); } 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[1]); if ((tmp = g_hash_table_lookup(memlabels, newkeys[0]))) { g_free(newkeys[0]); newkeys[0] = g_strdup(tmp); } g_hash_table_replace(moreinfo, g_strdup(newkeys[0]), g_strdup(newkeys[1])); tmp = g_strconcat(meminfo, newkeys[0], "=", newkeys[1], "\n", NULL); g_free(meminfo); meminfo = tmp; tmp = g_strconcat(lginterval, "UpdateInterval$", newkeys[0], "=1000\n", NULL); g_free(lginterval); lginterval = tmp; g_strfreev(newkeys); } g_strfreev(keys); } static void __init_memory_labels(void) { static struct { char *proc_label; char *real_label; } proc2real[] = { { "MemTotal", "Total Memory" }, { "MemFree", "Free Memory" }, { "SwapCached", "Cached Swap" }, { "HighTotal", "High Memory" }, { "HighFree", "Free High Memory" }, { "LowTotal", "Low Memory" }, { "LowFree", "Free Low Memory" }, { "SwapTotal", "Virtual Memory" }, { "SwapFree", "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); } } hardinfo-0.5.1/arch/linux/common/resources.h0000644000175000017500000000550411166403363020035 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2008 Leandro A. F. Pereira * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ gchar *_resources = NULL; #if GLIB_CHECK_VERSION(2,14,0) static GRegex *_regex_pci = NULL, *_regex_module = NULL; static gchar *_resource_obtain_name(gchar *name) { gchar *temp; if (!_regex_pci && !_regex_module) { _regex_pci = g_regex_new("^[0-9a-fA-F]{4}:[0-9a-fA-F]{2}:" "[0-9a-fA-F]{2}\\.[0-9a-fA-F]{1}$", 0, 0, NULL); _regex_module = g_regex_new("^[0-9a-zA-Z\\_\\-]+$", 0, 0, NULL); } name = g_strstrip(name); if (g_regex_match(_regex_pci, name, 0, NULL)) { temp = module_call_method_param("devices::getPCIDeviceDescription", name); if (temp) { return temp; } } else if (g_regex_match(_regex_module, name, 0, NULL)) { temp = module_call_method_param("computer::getKernelModuleDescription", name); if (temp) { return temp; } } return g_strdup(name); } #else static gchar *_resource_obtain_name(gchar *name) { return g_strdup(name); } #endif void scan_device_resources(gboolean reload) { SCAN_START(); FILE *io; gchar buffer[256]; gint i; struct { gchar *file; gchar *description; } resources[] = { { "/proc/ioports", "[I/O Ports]\n" }, { "/proc/iomem", "[Memory]\n" }, { "/proc/dma", "[DMA]\n" } }; g_free(_resources); _resources = g_strdup(""); for (i = 0; i < G_N_ELEMENTS(resources); i++) { if ((io = fopen(resources[i].file, "r"))) { _resources = h_strconcat(_resources, resources[i].description, NULL); while (fgets(buffer, 256, io)) { gchar **temp = g_strsplit(buffer, ":", 2); gchar *name = _resource_obtain_name(temp[1]); _resources = h_strdup_cprintf("%s=%s\n", _resources, temp[0], name); g_strfreev(temp); g_free(name); } fclose(io); } } SCAN_END(); } gchar *callback_device_resources(void) { return _resources; } hardinfo-0.5.1/arch/linux/common/battery.h0000644000175000017500000002253511166403363017500 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * 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 const struct { gchar *key, *name; } ups_fields[] = { { "UPS Status", NULL }, { "STATUS", "Status" }, { "TIMELEFT", "Time Left" }, { "LINEV", "Line Voltage" }, { "LOADPCT", "Load Percent" }, { "UPS Battery Information", NULL }, { "BATTV", "Battery Voltage" }, { "BCHARGE", "Battery Charge" }, { "BATTDATE", "Battery Date" }, { "UPS Information", NULL }, { "APCMODEL", "Model" }, { "FIRMWARE", "Firmware Version" }, { "SERIALNO", "Serial Number" }, { "UPSMODE", "UPS Mode" }, { "CABLE", "Cable" }, { "UPSNAME", "UPS Name" }, { "UPS Nominal Values", NULL }, { "NOMINV", "Voltage" }, { "NOMBATTV", "Battery Voltage" }, { "NOMPOWER", "Power" } }; static void __scan_battery_apcupsd(void) { GHashTable *ups_data; FILE *apcaccess; char buffer[512], *apcaccess_path; int i; apcaccess_path = find_program("apcaccess"); if ((apcaccess = popen(apcaccess_path, "r"))) { /* first line isn't important */ if (fgets(buffer, 512, apcaccess)) { /* allocate the key, value hash table */ ups_data = g_hash_table_new(g_str_hash, g_str_equal); /* read up all the apcaccess' output, saving it in the key, value hash table */ while (fgets(buffer, 512, apcaccess)) { buffer[9] = '\0'; g_hash_table_insert(ups_data, g_strdup(g_strstrip(buffer)), g_strdup(g_strstrip(buffer + 10))); } /* builds the ups info string, respecting the field order as found in ups_fields */ for (i = 0; i < G_N_ELEMENTS(ups_fields); i++) { if (!ups_fields[i].name) { /* there's no name: make a group with the key as its name */ battery_list = h_strdup_cprintf("[%s]\n", battery_list, ups_fields[i].key); } else { /* there's a name: adds a line */ battery_list = h_strdup_cprintf("%s=%s\n", battery_list, ups_fields[i].name, g_hash_table_lookup(ups_data, ups_fields[i].key)); } } g_hash_table_destroy(ups_data); } pclose(apcaccess); } g_free(apcaccess_path); } static void __scan_battery_acpi(void) { 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; 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); 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); if (g_str_equal(present, "yes")) { charge_rate = atof(remaining) / atof(capacity); battery_list = h_strdup_cprintf("\n[Battery: %s]\n" "State=%s (load: %s)\n" "Capacity=%s / %s (%.2f%%)\n" "Battery Technology=%s (%s)\n" "Model Number=%s\n" "Serial Number=%s\n", battery_list, entry, state, rate, remaining, capacity, charge_rate * 100.0, technology, type, 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); present = capacity = technology = type = \ model = serial = state = remaining = rate = NULL; } g_dir_close(acpi); } } g_free(acpi_path); } 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); } } static void __scan_battery(void) { if (battery_list) { g_free(battery_list); } battery_list = g_strdup(""); __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"); } } hardinfo-0.5.1/arch/linux/common/loadavg.h0000644000175000017500000000247711166403363017446 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * 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 LoadInfo * computer_get_loadinfo(void) { LoadInfo *li = g_new0(LoadInfo, 1); FILE *procloadavg; procloadavg = fopen("/proc/loadavg", "r"); (void)fscanf(procloadavg, "%f %f %f", &(li->load1), &(li->load5), &(li->load15)); fclose(procloadavg); return li; } static gchar * computer_get_formatted_loadavg() { LoadInfo *li; gchar *tmp; li = computer_get_loadinfo(); tmp = g_strdup_printf("%.2f, %.2f, %.2f", li->load1, li->load5, li->load15); g_free(li); return tmp; } hardinfo-0.5.1/arch/linux/common/alsa.h0000644000175000017500000000331311166403363016737 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ gchar * computer_get_alsacards(Computer * computer) { GSList *p; gchar *tmp = g_strdup(""); gint n = 0; if (computer->alsa) { for (p = computer->alsa->cards; p; p = p->next) { AlsaCard *ac = (AlsaCard *) p->data; tmp = h_strdup_cprintf("Audio Adapter#%d=%s\n", tmp, ++n, ac->friendly_name); } } return tmp; } static 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; } hardinfo-0.5.1/arch/linux/common/uptime.h0000644000175000017500000000364411166403363017331 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * 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 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 { return NULL; } ui->hours = ui->minutes / 60; ui->minutes %= 60; ui->days = ui->hours / 24; ui->hours %= 24; return ui; } static gchar * computer_get_formatted_uptime() { UptimeInfo *ui; gchar *tmp; ui = computer_get_uptime(); /* FIXME: Use ngettext */ #define plural(x) ((x > 1) ? "s" : "") if (ui->days < 1) { if (ui->hours < 1) { tmp = g_strdup_printf("%d minute%s", ui->minutes, plural(ui->minutes)); } else { tmp = g_strdup_printf("%d hour%s, %d minute%s", ui->hours, plural(ui->hours), ui->minutes, plural(ui->minutes)); } } else { tmp = g_strdup_printf("%d day%s, %d hour%s and %d minute%s", ui->days, plural(ui->days), ui->hours, plural(ui->hours), ui->minutes, plural(ui->minutes)); } g_free(ui); return tmp; } hardinfo-0.5.1/arch/linux/common/sensors.h0000644000175000017500000002123211166403363017513 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * 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 gchar *sensors = NULL; static GHashTable *sensor_labels = NULL; static GHashTable *sensor_compute = NULL; static void read_sensor_labels(gchar * driver) { FILE *conf; gchar buf[256], *line, *p; gboolean lock = FALSE; gint i; 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); /* 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 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 void read_sensors_hwmon(void) { int hwmon, count; gchar *path_hwmon, *path_sensor, *tmp, *driver, *name, *mon; hwmon = 0; path_hwmon = g_strdup_printf("/sys/class/hwmon/hwmon%d/device/", hwmon); while (g_file_test(path_hwmon, G_FILE_TEST_EXISTS)) { tmp = g_strdup_printf("%sdriver", path_hwmon); driver = g_file_read_link(tmp, NULL); g_free(tmp); tmp = g_path_get_basename(driver); g_free(driver); driver = tmp; if (!sensor_labels) { read_sensor_labels(driver); } sensors = g_strconcat(sensors, "[Cooling Fans]\n", NULL); for (count = 1;; count++) { path_sensor = g_strdup_printf("%sfan%d_input", path_hwmon, count); if (!g_file_get_contents(path_sensor, &tmp, NULL, NULL)) { g_free(path_sensor); break; } mon = g_strdup_printf("fan%d", count); name = get_sensor_label(mon); if (!g_str_equal(name, "ignore")) { sensors = h_strdup_cprintf("%s=%.0fRPM\n", sensors, name, adjust_sensor(mon, atof(tmp))); } g_free(name); g_free(mon); g_free(tmp); g_free(path_sensor); } sensors = g_strconcat(sensors, "[Temperatures]\n", NULL); for (count = 1;; count++) { path_sensor = g_strdup_printf("%stemp%d_input", path_hwmon, count); if (!g_file_get_contents(path_sensor, &tmp, NULL, NULL)) { g_free(path_sensor); break; } mon = g_strdup_printf("temp%d", count); name = get_sensor_label(mon); if (!g_str_equal(name, "ignore")) { sensors = h_strdup_cprintf("%s=%.2f\302\260C\n", sensors, name, adjust_sensor(mon, atof(tmp) / 1000.0)); } g_free(tmp); g_free(name); g_free(path_sensor); g_free(mon); } sensors = g_strconcat(sensors, "[Voltage Values]\n", NULL); for (count = 0;; count++) { path_sensor = g_strdup_printf("%sin%d_input", path_hwmon, count); if (!g_file_get_contents(path_sensor, &tmp, NULL, NULL)) { g_free(path_sensor); break; } mon = g_strdup_printf("in%d", count); name = get_sensor_label(mon); if (!g_str_equal(name, "ignore")) { sensors = h_strdup_cprintf("%s=%.3fV\n", sensors, name, adjust_sensor(mon, atof(tmp) / 1000.0)); } g_free(tmp); g_free(mon); g_free(name); g_free(path_sensor); } g_free(path_hwmon); g_free(driver); path_hwmon = g_strdup_printf("/sys/class/hwmon/hwmon%d/device/", ++hwmon); } 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; gchar *temp = g_strdup(""); 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); temp = h_strdup_cprintf("\n%s=%d\302\260C\n", temp, entry, temperature); g_free(contents); } } if (*temp != '\0') sensors = h_strdup_cprintf("\n[ACPI Thermal Zone]\n%s", sensors, temp); 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); sensors = h_strdup_cprintf("\n[Omnibook]\n" "CPU temperature=%d\302\260C\n", sensors, temperature); g_free(contents); } } static void read_sensors_hddtemp(void) { Socket *s; static gchar *old = NULL; gchar buffer[1024]; gint len = 0; if ((s = sock_connect("127.0.0.1", 7634))) { while (!len) len = sock_read(s, buffer, sizeof(buffer)); sock_close(s); if (len > 2 && buffer[0] == '|' && buffer[1] == '/') { gchar **disks; int i; if (old) g_free(old); old = g_strdup("[Hard Disk Temperature]\n"); 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 */ old = h_strdup_cprintf("\n%s (%s)=%s\302\260%s\n", old, fields[1], fields[0], fields[2], fields[3]); g_strfreev(fields); } g_strfreev(disks); } } else { g_free(old); old = NULL; } if (old) { sensors = g_strconcat(sensors, "\n", old, NULL); } } static void __scan_sensors(void) { if (sensors) g_free(sensors); sensors = g_strdup(""); read_sensors_hwmon(); read_sensors_acpi(); read_sensors_omnibook(); read_sensors_hddtemp(); /* FIXME: Add support for ibm acpi and more sensors */ } hardinfo-0.5.1/arch/linux/common/modules.h0000644000175000017500000001141111166403363017465 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * 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 */ #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; \ } static gboolean remove_module_devices(gpointer key, gpointer value, gpointer data) { return g_str_has_prefix(key, "MOD"); } static GHashTable *_module_hash_table = NULL; static void scan_modules_do(void) { FILE *lsmod; gchar buffer[1024]; gchar *lsmod_path; if (!_module_hash_table) { _module_hash_table = g_hash_table_new(g_str_hash, g_str_equal); } if (module_list) { g_free(module_list); } module_list = NULL; g_hash_table_foreach_remove(moreinfo, remove_module_devices, NULL); lsmod_path = find_program("lsmod"); 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 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 : ""); #define NONE_IF_NULL(var) (var) ? (var) : "N/A" /* create the module information string */ strmodule = g_strdup_printf("[Module Information]\n" "Path=%s\n" "Used Memory=%.2fKiB\n" "[Description]\n" "Name=%s\n" "Description=%s\n" "Version Magic=%s\n" "[Copyright]\n" "Author=%s\n" "License=%s\n", NONE_IF_NULL(filename), memory / 1024.0, modname, NONE_IF_NULL(description), NONE_IF_NULL(vermagic), NONE_IF_NULL(author), NONE_IF_NULL(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); } g_hash_table_insert(moreinfo, hashkey, strmodule); g_free(license); g_free(description); g_free(author); g_free(vermagic); g_free(filename); } pclose(lsmod); g_free(lsmod_path); } hardinfo-0.5.1/arch/linux/common/storage.h0000644000175000017500000003135111166403363017466 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * 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 gchar *storage_icons = NULL; static gboolean remove_scsi_devices(gpointer key, gpointer value, gpointer data) { return g_str_has_prefix(key, "SCSI"); } /* SCSI support by Pascal F.Martin */ void __scan_scsi_devices(void) { FILE *proc_scsi; gchar buffer[256], *buf; gint n = 0; gint scsi_controller; gint scsi_channel; gint scsi_id; gint scsi_lun; gchar *vendor = NULL, *revision = NULL, *model = NULL; gchar *scsi_storage_list; /* remove old devices from global device table */ g_hash_table_foreach_remove(moreinfo, remove_scsi_devices, NULL); if (!g_file_test("/proc/scsi/scsi", G_FILE_TEST_EXISTS)) return; scsi_storage_list = g_strdup("\n[SCSI Disks]\n"); 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 (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); g_hash_table_insert(moreinfo, devid, strhash); g_free(model); g_free(revision); g_free(vendor); } } fclose(proc_scsi); if (n) { storage_list = h_strconcat(storage_list, scsi_storage_list, NULL); g_free(scsi_storage_list); } } static gboolean remove_ide_devices(gpointer key, gpointer value, gpointer data) { return g_str_has_prefix(key, "IDE"); } 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 */ g_hash_table_foreach_remove(moreinfo, remove_ide_devices, NULL); 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"); (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"); (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 : "", strreplace(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"); (void)fscanf(proc_ide, "%d", &cache); fclose(proc_ide); } 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"); (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); } 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; } g_hash_table_insert(moreinfo, devid, strhash); g_free(model); model = g_strdup(""); } else g_free(device); iface++; } if (n) { storage_list = h_strconcat(storage_list, ide_storage_list, NULL); g_free(ide_storage_list); } } hardinfo-0.5.1/arch/linux/common/filesystem.h0000644000175000017500000000545411166403363020213 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * 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 static gchar *fs_list = NULL; static gboolean remove_filesystem_entries(gpointer key, gpointer value, gpointer data) { return g_str_has_prefix(key, "FS"); } static void scan_filesystems(void) { FILE *mtab; gchar buf[1024]; struct statfs sfs; int count = 0; g_free(fs_list); fs_list = g_strdup(""); g_hash_table_foreach_remove(moreinfo, remove_filesystem_entries, NULL); 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; if ((strhash = g_hash_table_lookup(moreinfo, tmp[0]))) { g_hash_table_remove(moreinfo, tmp[0]); g_free(strhash); } strreplace(tmp[0], "#", '_'); strhash = g_strdup_printf("[%s]\n" "Filesystem=%s\n" "Mounted As=%s\n" "Mount Point=%s\n" "Size=%s\n" "Used=%s\n" "Available=%s\n", tmp[0], tmp[2], strstr(tmp[3], "rw") ? "Read-Write" : "Read-Only", tmp[1], strsize, strused, stravail); g_hash_table_insert(moreinfo, g_strdup_printf("FS%d", ++count), strhash); 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); } hardinfo-0.5.1/arch/linux/common/boots.h0000644000175000017500000000335311166403363017151 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 */ void scan_boots_real(void) { FILE *last; char buffer[256]; scan_os(FALSE); if (!computer->os->boots) computer->os->boots = g_strdup("[Boots]\n"); else return; last = popen("last", "r"); if (last) { while (fgets(buffer, 256, last)) { if (strstr(buffer, "system boot")) { gchar **tmp, *buf = buffer; strend(buffer, '\n'); while (*buf) { if (*buf == ' ' && *(buf + 1) == ' ') { strcpy(buf, buf + 1); buf--; } else { buf++; } } tmp = g_strsplit(buffer, " ", 0); computer->os->boots = h_strdup_cprintf("\n%s %s %s %s=%s|%s", computer->os->boots, tmp[4], tmp[5], tmp[6], tmp[7], tmp[3], tmp[8]); g_strfreev(tmp); } } pclose(last); } } hardinfo-0.5.1/arch/linux/common/memory.h0000644000175000017500000000302411166403363017326 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * 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 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); 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; } hardinfo-0.5.1/arch/linux/parisc/0000755000175000017500000000000011166403363015637 5ustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/inputdevices.h0000777000175000017500000000000011256732377026451 2../../linux/common/inputdevices.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/os.h0000777000175000017500000000000011256732377022307 2../../linux/common/os.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/net.h0000777000175000017500000000000011256732377022621 2../../linux/common/net.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/nfs.h0000777000175000017500000000000011256732377022621 2../../linux/common/nfs.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/pci.h0000777000175000017500000000000011256732377022573 2../../linux/common/pci.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/usb.h0000777000175000017500000000000011256732377022627 2../../linux/common/usb.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/samba.h0000777000175000017500000000000011256732377023413 2../../linux/common/samba.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/devmemory.h0000777000175000017500000000000011256732377026413 2../../../arch/linux/common/devmemory.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/resources.h0000777000175000017500000000000011256732377026421 2../../../arch/linux/common/resources.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/processor.h0000644000175000017500000000510711166403363020032 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2006 Leandro A. F. Pereira * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ struct _Processor { gchar *model_name; gchar *vendor_id; gchar *flags; gfloat bogomips, cpu_mhz; gchar *has_fpu; gchar *strmodel; }; static GSList * __scan_processors(void) { Processor *processor; FILE *cpuinfo; gchar buffer[128]; cpuinfo = fopen("/proc/cpuinfo", "r"); if (!cpuinfo) return NULL; processor = g_new0(Processor, 1); while (fgets(buffer, 128, cpuinfo)) { gchar **tmp = g_strsplit(buffer, ":", 2); if (tmp[0] && tmp[1]) { tmp[0] = g_strstrip(tmp[0]); tmp[1] = g_strstrip(tmp[1]); get_str("cpu family", processor->model_name); get_str("cpu", processor->vendor_id); get_float("cpu MHz", processor->cpu_mhz); get_float("bogomips", processor->bogomips); get_str("model name", processor->strmodel); get_int("I-cache", processor->has_fpu); get_int("D-cache", processor->flags); } g_strfreev(tmp); } fclose(cpuinfo); return g_slist_append(NULL, processor); } static gchar * processor_get_info(GSList *processors) { Processor *processor = (Processor *)processors->data; return g_strdup_printf("[Processor]\n" "CPU Family=%s\n" "CPU=%s\n" "Frequency=%.2fMHz\n" "Bogomips=%.2f\n" "Model Name=%s\n" "Byte Order=%s\n" "[Cache]\n" "I-Cache=%s\n" "D-Cache=%s\n", processor->model_name, processor->vendor_id, processor->cpu_mhz, processor->bogomips, processor->strmodel, #if G_BYTE_ORDER == G_LITTLE_ENDIAN "Little Endian", #else "Big Endian", #endif processor->has_fpu, processor->flags); } hardinfo-0.5.1/arch/linux/parisc/battery.h0000777000175000017500000000000011256732377024371 2../../linux/common/battery.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/loadavg.h0000777000175000017500000000000011256732377024277 2../../linux/common/loadavg.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/alsa.h0000777000175000017500000000000011256732377023105 2../../linux/common/alsa.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/uptime.h0000777000175000017500000000000011256732377024053 2../../linux/common/uptime.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/sensors.h0000777000175000017500000000000011256732377024435 2../../linux/common/sensors.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/modules.h0000777000175000017500000000000011256732377024365 2../../linux/common/modules.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/storage.h0000777000175000017500000000000011256732377024355 2../../linux/common/storage.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/filesystem.h0000777000175000017500000000000011256732377025615 2../../linux/common/filesystem.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/boots.h0000777000175000017500000000000011256732377024651 2../../../arch/linux/common/boots.hustar agneyagneyhardinfo-0.5.1/arch/linux/parisc/memory.h0000777000175000017500000000000011256732377024065 2../../linux/common/memory.hustar agneyagneyhardinfo-0.5.1/arch/linux/x86_640000777000175000017500000000000011256732377015616 2x86ustar agneyagneyhardinfo-0.5.1/arch/common/0000755000175000017500000000000011166403363014507 5ustar agneyagneyhardinfo-0.5.1/arch/common/languages.h0000644000175000017500000000540311166403363016630 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 */ void scan_languages(OperatingSystem * os) { FILE *locale; gchar buf[512], *retval = NULL; locale = popen("locale -va", "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); #define FIELD(f) f ? f : "(Unknown)" currlocale = g_strdup_printf("[Locale Information]\n" "Name=%s (%s)\n" "Source=%s\n" "Address=%s\n" "Email=%s\n" "Language=%s\n" "Territory=%s\n" "Revision=%s\n" "Date=%s\n" "Codeset=%s\n", name, FIELD(title), FIELD(source), FIELD(address), FIELD(email), FIELD(language), FIELD(territory), FIELD(revision), FIELD(date), FIELD(codeset)); #undef FIELD g_hash_table_insert(moreinfo, g_strdup(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; } hardinfo-0.5.1/arch/common/display.h0000644000175000017500000000774011166403363016335 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 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, ":", 0); 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); 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 = ""; } } static 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; } hardinfo-0.5.1/arch/common/raytrace.h0000644000175000017500000000247711166403363016504 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 */ void fbench(); /* fbench.c */ static gpointer parallel_raytrace(unsigned int start, unsigned int end, gpointer data) { unsigned int i; for (i = start; i <= end; i++) { fbench(); } return NULL; } static void benchmark_raytrace(void) { gdouble elapsed = 0; shell_view_set_enabled(FALSE); shell_status_update("Performing John Walker's FBENCH..."); elapsed = benchmark_parallel_for(0, 1000, parallel_raytrace, NULL); bench_results[BENCHMARK_RAYTRACE] = elapsed; } hardinfo-0.5.1/arch/common/fft.h0000644000175000017500000000252411166403363015442 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 static gpointer fft_for(unsigned int start, unsigned int end, void *data, GTimer *timer) { unsigned int i; for (i = start; i <= end; i++) { fft_bench_start(); } return NULL; } static void benchmark_fft(void) { gdouble elapsed = 0; shell_view_set_enabled(FALSE); shell_status_update("Running FFT benchmark..."); fft_bench_init(); elapsed = benchmark_parallel_for(0, 4, fft_for, NULL); fft_bench_finish(); bench_results[BENCHMARK_FFT] = elapsed; } hardinfo-0.5.1/arch/common/fib.h0000644000175000017500000000253711166403363015427 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 gulong fib(gulong n) { if (n == 0) return 0; else if (n <= 2) return 1; return fib(n - 1) + fib(n - 2); } static void benchmark_fib(void) { GTimer *timer = g_timer_new(); gdouble elapsed; 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); elapsed = g_timer_elapsed(timer, NULL); g_timer_destroy(timer); bench_results[BENCHMARK_FIB] = elapsed; } hardinfo-0.5.1/arch/common/environment.h0000644000175000017500000000240411166403363017224 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2008 Leandro A. F. Pereira * * 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 gchar *_env = NULL; void scan_env_var(gboolean reload) { SCAN_START(); gchar **envlist; gint i; g_free(_env); _env = g_strdup("[Environment Variables]\n"); 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 _env; } hardinfo-0.5.1/arch/common/blowfish.h0000644000175000017500000000342311166403363016477 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 static gpointer parallel_blowfish(unsigned int start, unsigned int end, void *data, GTimer *timer) { 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; } static void benchmark_fish(void) { gdouble elapsed = 0; 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)) { g_free(bdata_path); return; } shell_view_set_enabled(FALSE); shell_status_update("Performing Blowfish benchmark..."); elapsed = benchmark_parallel_for(0, 50000, parallel_blowfish, tmpsrc); g_free(bdata_path); g_free(tmpsrc); bench_results[BENCHMARK_BLOWFISH] = elapsed; } hardinfo-0.5.1/arch/common/cryptohash.h0000644000175000017500000000417311166403363017051 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 #include static void inline md5_step(char *data, glong srclen) { struct MD5Context ctx; guchar checksum[16]; MD5Init(&ctx); MD5Update(&ctx, (guchar *)data, srclen); MD5Final(checksum, &ctx); } static 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, GTimer *timer) { unsigned int i; for (i = start; i <= end; i++) { if (i % 2 == 0) { md5_step(data, 65536); } else { sha1_step(data, 65536); } } return NULL; } static void benchmark_cryptohash(void) { gdouble elapsed = 0; 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..."); elapsed = benchmark_parallel_for(0, 5000, cryptohash_for, tmpsrc); g_free(bdata_path); g_free(tmpsrc); bench_results[BENCHMARK_CRYPTOHASH] = 312.0 / elapsed; } hardinfo-0.5.1/arch/common/users.h0000644000175000017500000000227511166403363016027 0ustar agneyagneystatic gchar *users = NULL; static gboolean remove_users(gpointer key, gpointer value, gpointer data) { return g_str_has_prefix(key, "USER"); } static void scan_users_do(void) { FILE *passwd; char buffer[512]; passwd = fopen("/etc/passwd", "r"); if (!passwd) return; if (users) { g_free(users); g_hash_table_foreach_remove(moreinfo, remove_users, NULL); } users = g_strdup(""); while (fgets(buffer, 512, passwd)) { gchar **tmp; gint uid; tmp = g_strsplit(buffer, ":", 0); gchar *key = g_strdup_printf("USER%s", tmp[0]); gchar *val = g_strdup_printf("[User Information]\n" "User ID=%s\n" "Group ID=%s\n" "Home directory=%s\n" "Default shell=%s\n", tmp[2], tmp[3], tmp[5], tmp[6]); g_hash_table_insert(moreinfo, key, val); uid = atoi(tmp[2]); strend(tmp[4], ','); users = h_strdup_cprintf("$%s$%s=%s\n", users, key, tmp[0], tmp[4]); g_strfreev(tmp); } fclose(passwd); } hardinfo-0.5.1/arch/common/nqueens.h0000644000175000017500000000246411166403363016344 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 static gpointer nqueens_for(unsigned int start, unsigned int end, void *data, GTimer *timer) { unsigned int i; for (i = start; i <= end; i++) { nqueens(0); } return NULL; } static void benchmark_nqueens(void) { gdouble elapsed = 0; shell_view_set_enabled(FALSE); shell_status_update("Running N-Queens benchmark..."); elapsed = benchmark_parallel_for(0, 10, nqueens_for, NULL); bench_results[BENCHMARK_NQUEENS] = elapsed; } hardinfo-0.5.1/arch/common/printers.h0000644000175000017500000001714011166403363016531 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 #include #include 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; static gboolean remove_printer_devices(gpointer key, gpointer value, gpointer data) { return g_str_has_prefix(key, "PRN"); } static void __init_cups(void) { static GModule *cups = NULL; 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(void) { int num_dests, i, j; CUPSDest *dests; gchar *prn_id, *prn_moreinfo; g_free(printer_list); if (!cups_init) { __init_cups(); printer_list = g_strdup("[Printers]\n" "No suitable CUPS library found="); return; } /* remove old devices from global device table */ g_hash_table_foreach_remove(moreinfo, remove_printer_devices, NULL); num_dests = cups_dests_get(&dests); if (num_dests > 0) { printer_list = g_strdup_printf("[Printers (CUPS)]\n"); 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 ? "Default" : ""); 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(strreplace(temp, "&=", ' ')); } else { temp = g_strdup("Unknown"); } } prn_moreinfo = h_strdup_cprintf("%s=%s\n", prn_moreinfo, cups_fields[j].name, temp); g_free(temp); } } g_hash_table_insert(moreinfo, prn_id, prn_moreinfo); g_hash_table_destroy(options); } cups_dests_free(num_dests, dests); } else { printer_list = g_strdup("[Printers]\n" "No printers found=\n"); } } hardinfo-0.5.1/devices.c0000644000175000017500000002422111166403363014071 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 #include #include #include #include #include #include #include #include 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_i386) || defined(ARCH_x86_64) gchar *callback_dmi(); #endif 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_i386) || defined(ARCH_x86_64) void scan_dmi(gboolean reload); #endif void scan_device_resources(gboolean reload); static ModuleEntry entries[] = { {"Processor", "processor.png", callback_processors, scan_processors}, {"Memory", "memory.png", callback_memory, scan_memory}, {"PCI Devices", "devices.png", callback_pci, scan_pci}, {"USB Devices", "usb.png", callback_usb, scan_usb}, {"Printers", "printer.png", callback_printers, scan_printers,}, {"Battery", "battery.png", callback_battery, scan_battery}, {"Sensors", "therm.png", callback_sensors, scan_sensors}, {"Input Devices", "inputdevices.png", callback_input, scan_input}, {"Storage", "hdd.png", callback_storage, scan_storage}, #if defined(ARCH_i386) || defined(ARCH_x86_64) {"DMI", "computer.png", callback_dmi, scan_dmi}, #endif /* x86 or x86_64 */ {"Resources", "resources.png", callback_device_resources, scan_device_resources}, {NULL} }; static GHashTable *moreinfo = NULL; static GSList *processors = NULL; static gchar *printer_list = NULL; static gchar *pci_list = NULL; static gchar *input_list = NULL; static gchar *storage_list = NULL; static gchar *battery_list = NULL; static gchar *meminfo = NULL, *lginterval = NULL; #define WALK_UNTIL(x) while((*buf != '\0') && (*buf != x)) buf++ #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; \ } #define get_str(field_name,ptr) \ if (g_str_has_prefix(tmp[0], field_name)) { \ ptr = g_strdup(tmp[1]); \ g_strfreev(tmp); \ continue; \ } #define get_int(field_name,ptr) \ if (g_str_has_prefix(tmp[0], field_name)) { \ ptr = atoi(tmp[1]); \ g_strfreev(tmp); \ continue; \ } #define get_float(field_name,ptr) \ if (g_str_has_prefix(tmp[0], field_name)) { \ ptr = atof(tmp[1]); \ g_strfreev(tmp); \ continue; \ } #include typedef struct _Processor Processor; #include #include #include #include #include #include #include #include #include #include #if defined(ARCH_i386) || defined(ARCH_x86_64) #include #endif /* x86 or x86_64 */ gchar *get_processor_name(void) { scan_processors(FALSE); Processor *p = (Processor *) processors->data; if (g_slist_length(processors) > 1) { return idle_free(g_strdup_printf("%dx %s", g_slist_length(processors), p->model_name)); } else { return p->model_name; } } 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)); } gchar *get_processor_frequency(void) { Processor *p; scan_processors(FALSE); p = (Processor *)processors->data; if (p->cpu_mhz == 0.0f) { return g_strdup("Unknown"); } else { return g_strdup_printf("%.0f", p->cpu_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) { /* FIXME */ return g_strdup("0.0"); } ShellModuleMethod *hi_exported_methods(void) { static ShellModuleMethod m[] = { {"getProcessorCount", get_processor_count}, {"getProcessorName", get_processor_name}, {"getProcessorFrequency", get_processor_frequency}, {"getMemoryTotal", get_memory_total}, {"getStorageDevices", get_storage_devices}, {"getPrinters", get_printers}, {"getInputDevices", get_input_devices}, {"getPCIDeviceDescription", get_pci_device_description}, {NULL} }; return m; } gchar *hi_more_info(gchar * entry) { gchar *info = (gchar *) g_hash_table_lookup(moreinfo, entry); if (info) return g_strdup(info); return g_strdup("?"); } gchar *hi_get_field(gchar * field) { gchar *info = (gchar *) g_hash_table_lookup(moreinfo, field); if (info) return g_strdup(info); return g_strdup(field); } #if defined(ARCH_i386) || defined(ARCH_x86_64) void scan_dmi(gboolean reload) { SCAN_START(); __scan_dmi(); SCAN_END(); } #endif void scan_processors(gboolean reload) { SCAN_START(); if (!processors) processors = __scan_processors(); SCAN_END(); } void scan_memory(gboolean reload) { SCAN_START(); __scan_memory(); SCAN_END(); } void scan_battery(gboolean reload) { SCAN_START(); __scan_battery(); SCAN_END(); } void scan_pci(gboolean reload) { SCAN_START(); __scan_pci(); SCAN_END(); } void scan_sensors(gboolean reload) { SCAN_START(); __scan_sensors(); SCAN_END(); } void scan_printers(gboolean reload) { SCAN_START(); __scan_printers(); 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_i386) || defined(ARCH_x86_64) gchar *callback_dmi() { return dmi_info; } #endif gchar *callback_memory() { return g_strdup_printf("[Memory]\n" "%s\n" "[$ShellParam$]\n" "ViewType=2\n" "LoadGraphSuffix= kB\n" "RescanInterval=2000\n" "%s\n", meminfo, 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("[$ShellParam$]\n" "ReloadInterval=5000\n" "%s", sensors); } gchar *callback_printers() { return g_strdup_printf("%s\n" "[$ShellParam$]\n" "ViewType=1\n" "ReloadInterval=5000", printer_list); } 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 = "Update PCI ID listing", .name = "GetPCIIds", .save_to = "pci.ids", .get_data = NULL }; sync_manager_add_entry(&se); } moreinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); __init_memory_labels(); __init_cups(); } ModuleAbout *hi_module_get_about(void) { static ModuleAbout ma[] = { { .author = "Leandro A. F. Pereira", .description = "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; } hardinfo-0.5.1/fftbench.c0000644000175000017500000000711011166403363014224 0ustar agneyagney/* 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://www.coyotegulch.com 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 #include #include #include #include #include // 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 int *lup_decompose(double **a) { int i, j, k, k2, t; double p, temp; int *perm = (int *) malloc(sizeof(double) * N); 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 NULL; // 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]; } } return perm; } static double *lup_solve(double **a, int *perm, double *b) { int i, j, j2; double sum, u; double *y = (double *) malloc(sizeof(double) * N); double *x = (double *) malloc(sizeof(double) * N); 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; } static double **a, *b, *r; static int *p; void fft_bench_init(void) { int i, j; // generate test data a = (double **) malloc(sizeof(double *) * N); for (i = 0; i < N; ++i) { a[i] = (double *) malloc(sizeof(double) * N); for (j = 0; j < N; ++j) a[i][j] = random_double(); } b = (double *) malloc(sizeof(double) * N); for (i = 0; i < N; ++i) b[i] = random_double(); } void fft_bench_start(void) { p = lup_decompose(a); r = lup_solve(a, p, b); } void fft_bench_finish(void) { int i; // clean up for (i = 0; i < N; ++i) free(a[i]); free(a); free(b); free(p); free(r); } hardinfo-0.5.1/fftbench.h0000644000175000017500000000024311166403363014231 0ustar agneyagney#ifndef __FFTBENCH_H__ #define __FFTBENCH_H__ void fft_bench_init(void); void fft_bench_start(void); void fft_bench_finish(void); #endif /* __FFTBENCH_H__ */ hardinfo-0.5.1/report.c0000644000175000017500000005734411166403363013776 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2008 Leandro A. F. Pereira * * 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 #include #include #include #include #include #include static ReportDialog *report_dialog_new(GtkTreeModel * model, GtkWidget * parent); static void set_all_active(ReportDialog * rd, gboolean setting); static FileTypes file_types[] = { {"HTML (*.html)", "text/html", ".html", report_context_html_new}, {"Plain Text (*.txt)", "text/plain", ".txt", report_context_text_new}, {NULL, NULL, NULL, NULL} }; void report_header(ReportContext * ctx) { ctx->header(ctx); } void report_footer(ReportContext * ctx) { ctx->footer(ctx); } void report_title(ReportContext * ctx, gchar * text) { ctx->title(ctx, text); } void report_subtitle(ReportContext * ctx, gchar * text) { ctx->subtitle(ctx, text); } void report_subsubtitle(ReportContext * ctx, gchar * text) { ctx->subsubtitle(ctx, text); } void report_key_value(ReportContext * ctx, gchar * key, gchar * value) { ctx->keyvalue(ctx, key, value); } gint report_get_visible_columns(ReportContext *ctx) { gint columns; /* Column count starts at two, since we always have at least two columns visible. */ columns = 2; /* Either the Progress column or the Value column is available at the same time. So we don't count them. */ if (ctx->columns & REPORT_COL_EXTRA1) columns++; if (ctx->columns & REPORT_COL_EXTRA2) columns++; return columns; } void report_context_configure(ReportContext * ctx, GKeyFile * keyfile) { gchar **keys; const gchar *group = "$ShellParam$"; /* FIXME: sometime in the future we'll save images in the report. this flag will be set if we should support that. so i don't forget how to encode the images inside the html files: http://en.wikipedia.org/wiki/Data:_URI_scheme */ ctx->is_image_enabled = (g_key_file_get_boolean(keyfile, group, "ViewType", NULL) == SHELL_VIEW_PROGRESS); keys = g_key_file_get_keys(keyfile, group, NULL, NULL); if (keys) { gint i = 0; for (; keys[i]; i++) { gchar *key = keys[i]; if (g_str_equal(key, "ShowColumnHeaders")) { ctx->show_column_headers = g_key_file_get_boolean(keyfile, group, key, NULL); } else if (g_str_has_prefix(key, "ColumnTitle")) { gchar *value, *title = strchr(key, '$') + 1; value = g_key_file_get_value(keyfile, group, key, NULL); if (g_str_equal(title, "Extra1")) { ctx->columns |= REPORT_COL_EXTRA1; } else if (g_str_equal(title, "Extra2")) { ctx->columns |= REPORT_COL_EXTRA2; } else if (g_str_equal(title, "Value")) { ctx->columns |= REPORT_COL_VALUE; } else if (g_str_equal(title, "TextValue")) { ctx->columns |= REPORT_COL_TEXTVALUE; } else if (g_str_equal(title, "Progress")) { ctx->columns |= REPORT_COL_PROGRESS; } g_hash_table_replace(ctx->column_titles, title, g_strdup(value)); g_free(value); } else if (g_str_equal(key, "ViewType")) { if (g_key_file_get_integer(keyfile, group, "ViewType", NULL) == SHELL_VIEW_PROGRESS) { ctx->columns &= ~REPORT_COL_VALUE; ctx->columns |= REPORT_COL_PROGRESS; } } } g_strfreev(keys); } } void report_table(ReportContext * ctx, gchar * text) { GKeyFile *key_file = g_key_file_new(); gchar **groups; gint i; /* make only "Value" column visible ("Key" column is always visible) */ ctx->columns = REPORT_COL_VALUE; ctx->show_column_headers = FALSE; /**/ g_key_file_load_from_data(key_file, text, strlen(text), 0, NULL); groups = g_key_file_get_groups(key_file, NULL); for (i = 0; groups[i]; i++) { if (groups[i][0] == '$') { report_context_configure(ctx, key_file); break; } } for (i = 0; groups[i]; i++) { gchar *group, *tmpgroup; gchar **keys; gint j; if (groups[i][0] == '$') { continue; } group = groups[i]; tmpgroup = g_strdup(group); strend(group, '#'); report_subsubtitle(ctx, group); #if 0 if (ctx->is_image_enabled) { report_embed_image(ctx, key_file, group); } else { #endif keys = g_key_file_get_keys(key_file, tmpgroup, NULL, NULL); for (j = 0; keys[j]; j++) { gchar *key = keys[j]; gchar *value; value = g_key_file_get_value(key_file, tmpgroup, key, NULL); if (g_utf8_validate(key, -1, NULL) && g_utf8_validate(value, -1, NULL)) { strend(key, '#'); if (g_str_equal(value, "...")) { g_free(value); if (!(value = ctx->entry->fieldfunc(key))) { value = g_strdup("..."); } } if (*key == '$') { report_key_value(ctx, strchr(key + 1, '$') + 1, value); } else { report_key_value(ctx, key, value); } } g_free(value); } g_strfreev(keys); #if 0 } #endif g_free(tmpgroup); } g_strfreev(groups); g_key_file_free(key_file); } static void report_html_header(ReportContext * ctx) { if (ctx->output) g_free(ctx->output); ctx->output = g_strdup_printf ("\n" "\n" "HardInfo (%s) System Report\n" "\n" "\n" "\n", VERSION); } static void report_html_footer(ReportContext * ctx) { ctx->output = h_strconcat(ctx->output, "", NULL); } static void report_html_title(ReportContext * ctx, gchar * text) { if (!ctx->first_table) { ctx->output = h_strdup_cprintf("", ctx->output); } ctx->output = h_strdup_cprintf("

%s

", ctx->output, text); } static void report_html_subtitle(ReportContext * ctx, gchar * text) { gint columns = report_get_visible_columns(ctx); if (!ctx->first_table) { ctx->output = h_strdup_cprintf("", ctx->output); } else { ctx->first_table = FALSE; } ctx->output = h_strdup_cprintf("\n", ctx->output, columns, text); } static void report_html_subsubtitle(ReportContext * ctx, gchar * text) { gint columns = report_get_visible_columns(ctx); ctx->output = h_strdup_cprintf("\n", ctx->output, columns, text); } static void report_html_key_value(ReportContext * ctx, gchar * key, gchar * value) { gint columns = report_get_visible_columns(ctx); gchar **values; gint i; if (columns == 2) { ctx->output = h_strdup_cprintf("" "\n", ctx->output, key, value); } else { values = g_strsplit(value, "|", columns); ctx->output = h_strdup_cprintf("\n\n", ctx->output, key); for (i = columns - 2; i >= 0; i--) { ctx->output = h_strdup_cprintf("", ctx->output, values[i]); } ctx->output = h_strdup_cprintf("\n", ctx->output); g_strfreev(values); } } static void report_text_header(ReportContext * ctx) { if (ctx->output) g_free(ctx->output); ctx->output = g_strdup(""); } static void report_text_footer(ReportContext * ctx) { } static void report_text_title(ReportContext * ctx, gchar * text) { gchar *str = (gchar *) ctx->output; int i = strlen(text); str = h_strdup_cprintf("\n%s\n", str, text); for (; i; i--) str = h_strconcat(str, "*", NULL); str = h_strconcat(str, "\n\n", NULL); ctx->output = str; } static void report_text_subtitle(ReportContext * ctx, gchar * text) { gchar *str = ctx->output; int i = strlen(text); str = h_strdup_cprintf("\n%s\n", str, text); for (; i; i--) str = h_strconcat(str, "-", NULL); str = h_strconcat(str, "\n\n", NULL); ctx->output = str; } static void report_text_subsubtitle(ReportContext * ctx, gchar * text) { ctx->output = h_strdup_cprintf("-%s-\n", ctx->output, text); } static void report_text_key_value(ReportContext * ctx, gchar * key, gchar * value) { gint columns = report_get_visible_columns(ctx); gchar **values; gint i; if (columns == 2) { if (strlen(value)) ctx->output = h_strdup_cprintf("%s\t\t: %s\n", ctx->output, key, value); else ctx->output = h_strdup_cprintf("%s\n", ctx->output, key); } else { values = g_strsplit(value, "|", columns); ctx->output = h_strdup_cprintf("%s\t", ctx->output, key); for (i = columns - 2; i >= 0; i--) { ctx->output = h_strdup_cprintf("%s\t", ctx->output, values[i]); } ctx->output = h_strdup_cprintf("\n", ctx->output); g_strfreev(values); } } static GSList *report_create_module_list_from_dialog(ReportDialog * rd) { ShellModule *module; GSList *modules = NULL; GtkTreeModel *model = rd->model; GtkTreeIter iter; gtk_tree_model_get_iter_first(model, &iter); do { gboolean selected; gchar *name; gtk_tree_model_get(model, &iter, TREE_COL_SEL, &selected, -1); if (!selected) continue; module = g_new0(ShellModule, 1); gtk_tree_model_get(model, &iter, TREE_COL_NAME, &name, -1); module->name = name; module->entries = NULL; if (gtk_tree_model_iter_has_child(model, &iter)) { ShellModuleEntry *entry; gint children = gtk_tree_model_iter_n_children(model, &iter); gint i; for (i = 0; i < children; i++) { GtkTreeIter child; gtk_tree_model_iter_nth_child(model, &child, &iter, i); gtk_tree_model_get(model, &child, TREE_COL_SEL, &selected, -1); if (!selected) continue; gtk_tree_model_get(model, &child, TREE_COL_DATA, &entry, -1); module->entries = g_slist_append(module->entries, entry); } } modules = g_slist_append(modules, module); } while (gtk_tree_model_iter_next(rd->model, &iter)); return modules; } static void report_create_inner_from_module_list(ReportContext * ctx, GSList * modules) { for (; modules; modules = modules->next) { ShellModule *module = (ShellModule *) modules->data; GSList *entries; if (!params.gui_running) fprintf(stderr, "\033[40;32m%s\033[0m\n", module->name); report_title(ctx, module->name); for (entries = module->entries; entries; entries = entries->next) { ShellModuleEntry *entry = (ShellModuleEntry *) entries->data; if (!params.gui_running) fprintf(stderr, "\033[2K\033[40;32;1m %s\033[0m\n", entry->name); ctx->entry = entry; report_subtitle(ctx, entry->name); module_entry_scan(entry); report_table(ctx, module_entry_function(entry)); } } } void report_module_list_free(GSList * modules) { GSList *m; for (m = modules; m; m = m->next) { ShellModule *module = (ShellModule *) m->data; g_slist_free(module->entries); } g_slist_free(modules); } static gchar *report_get_filename(void) { GtkWidget *dialog; gchar *filename = NULL; dialog = gtk_file_chooser_dialog_new("Save File", NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "hardinfo_report"); file_chooser_add_filters(dialog, file_types); file_chooser_open_expander(dialog); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { gchar *ext = file_chooser_get_extension(dialog, file_types); filename = file_chooser_build_filename(dialog, ext); } gtk_widget_destroy(dialog); return filename; } ReportContext *report_context_html_new() { ReportContext *ctx; ctx = g_new0(ReportContext, 1); ctx->header = report_html_header; ctx->footer = report_html_footer; ctx->title = report_html_title; ctx->subtitle = report_html_subtitle; ctx->subsubtitle = report_html_subsubtitle; ctx->keyvalue = report_html_key_value; ctx->output = g_strdup(""); ctx->format = REPORT_FORMAT_HTML; ctx->column_titles = g_hash_table_new(g_str_hash, g_str_equal); ctx->first_table = TRUE; return ctx; } ReportContext *report_context_text_new() { ReportContext *ctx; ctx = g_new0(ReportContext, 1); ctx->header = report_text_header; ctx->footer = report_text_footer; ctx->title = report_text_title; ctx->subtitle = report_text_subtitle; ctx->subsubtitle = report_text_subsubtitle; ctx->keyvalue = report_text_key_value; ctx->output = g_strdup(""); ctx->format = REPORT_FORMAT_TEXT; ctx->column_titles = g_hash_table_new(g_str_hash, g_str_equal); ctx->first_table = TRUE; return ctx; } void report_context_free(ReportContext * ctx) { g_hash_table_destroy(ctx->column_titles); g_free(ctx->output); g_free(ctx); } void report_create_from_module_list(ReportContext * ctx, GSList * modules) { report_header(ctx); report_create_inner_from_module_list(ctx, modules); report_module_list_free(modules); report_footer(ctx); } gchar *report_create_from_module_list_format(GSList * modules, ReportFormat format) { ReportContext *(*create_context) (); ReportContext *ctx; gchar *retval; if (format >= N_REPORT_FORMAT) return NULL; create_context = file_types[format].data; if (!create_context) return NULL; ctx = create_context(); report_create_from_module_list(ctx, modules); retval = g_strdup(ctx->output); report_context_free(ctx); return retval; } static gboolean report_generate(ReportDialog * rd) { GSList *modules; ReportContext *ctx; ReportContext *(*create_context) (); gchar *file; FILE *stream; if (!(file = report_get_filename())) return FALSE; if (!(stream = fopen(file, "w+"))) { g_free(file); return FALSE; } create_context = file_types_get_data_by_name(file_types, file); if (!create_context) { g_warning("Cannot create ReportContext. Programming bug?"); g_free(file); return FALSE; } ctx = create_context(); modules = report_create_module_list_from_dialog(rd); report_create_from_module_list(ctx, modules); fputs(ctx->output, stream); fclose(stream); if (ctx->format == REPORT_FORMAT_HTML) { GtkWidget *dialog; dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, "Open the report with your web browser?"); gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_NO, GTK_RESPONSE_REJECT, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) open_url(file); gtk_widget_destroy(dialog); } report_context_free(ctx); g_free(file); return TRUE; } void report_dialog_show(GtkTreeModel * model, GtkWidget * parent) { gboolean success; ReportDialog *rd = report_dialog_new(model, parent); if (gtk_dialog_run(GTK_DIALOG(rd->dialog)) == GTK_RESPONSE_ACCEPT) { shell_status_update("Generating report..."); gtk_widget_hide(rd->dialog); shell_view_set_enabled(FALSE); shell_status_set_enabled(TRUE); success = report_generate(rd); shell_status_set_enabled(FALSE); if (success) shell_status_update("Report saved."); else shell_status_update("Error while creating the report."); } set_all_active(rd, FALSE); gtk_widget_destroy(rd->dialog); g_free(rd); } static void set_children_active(GtkTreeModel * model, GtkTreeIter * iter, gboolean setting) { if (gtk_tree_model_iter_has_child(model, iter)) { gint children = gtk_tree_model_iter_n_children(model, iter); gtk_tree_store_set(GTK_TREE_STORE(model), iter, TREE_COL_SEL, setting, -1); for (children--; children >= 0; children--) { GtkTreeIter child; gtk_tree_model_iter_nth_child(model, &child, iter, children); gtk_tree_store_set(GTK_TREE_STORE(model), &child, TREE_COL_SEL, setting, -1); } } } static void set_all_active(ReportDialog * rd, gboolean setting) { GtkTreeIter iter; GtkTreeModel *model = rd->model; gtk_tree_model_get_iter_first(model, &iter); do { set_children_active(model, &iter, setting); } while (gtk_tree_model_iter_next(model, &iter)); } static void report_dialog_sel_none(GtkWidget * widget, ReportDialog * rd) { set_all_active(rd, FALSE); } static void report_dialog_sel_all(GtkWidget * widget, ReportDialog * rd) { set_all_active(rd, TRUE); } static void report_dialog_sel_toggle(GtkCellRendererToggle * cellrenderertoggle, gchar * path_str, ReportDialog * rd) { GtkTreeModel *model = rd->model; GtkTreeIter iter; GtkTreePath *path = gtk_tree_path_new_from_string(path_str); gboolean active; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, TREE_COL_SEL, &active, -1); active = !active; gtk_tree_store_set(GTK_TREE_STORE(model), &iter, TREE_COL_SEL, active, -1); set_children_active(model, &iter, active); gtk_tree_path_free(path); } static ReportDialog * report_dialog_new(GtkTreeModel * model, GtkWidget * parent) { ReportDialog *rd; GtkWidget *dialog; GtkWidget *dialog1_vbox; GtkWidget *scrolledwindow2; GtkWidget *treeview2; GtkWidget *vbuttonbox3; GtkWidget *button3; GtkWidget *button6; GtkWidget *dialog1_action_area; GtkWidget *button8; GtkWidget *button7; GtkWidget *label; GtkWidget *hbox; GtkTreeViewColumn *column; GtkCellRenderer *cr_text, *cr_pbuf, *cr_toggle; rd = g_new0(ReportDialog, 1); dialog = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(dialog), "Generate Report"); gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); gtk_window_set_default_size(GTK_WINDOW(dialog), 420, 260); gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG); dialog1_vbox = GTK_DIALOG(dialog)->vbox; gtk_box_set_spacing(GTK_BOX(dialog1_vbox), 5); gtk_container_set_border_width(GTK_CONTAINER(dialog1_vbox), 4); gtk_widget_show(dialog1_vbox); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("Generate Report\n" "Please choose the information that you wish " "to view in your report:"); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(hbox), icon_cache_get_image("report-large.png"), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); gtk_widget_show_all(hbox); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, TRUE, TRUE, 0); gtk_widget_show(hbox); scrolledwindow2 = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(scrolledwindow2); gtk_box_pack_start(GTK_BOX(hbox), scrolledwindow2, TRUE, TRUE, 0); gtk_widget_set_size_request(scrolledwindow2, -1, 200); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow2), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scrolledwindow2), GTK_SHADOW_IN); treeview2 = gtk_tree_view_new_with_model(model); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview2), FALSE); gtk_widget_show(treeview2); gtk_container_add(GTK_CONTAINER(scrolledwindow2), treeview2); column = gtk_tree_view_column_new(); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview2), column); cr_toggle = gtk_cell_renderer_toggle_new(); gtk_tree_view_column_pack_start(column, cr_toggle, FALSE); g_signal_connect(cr_toggle, "toggled", G_CALLBACK(report_dialog_sel_toggle), rd); gtk_tree_view_column_add_attribute(column, cr_toggle, "active", TREE_COL_SEL); cr_pbuf = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE); gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf", TREE_COL_PBUF); cr_text = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, cr_text, TRUE); gtk_tree_view_column_add_attribute(column, cr_text, "markup", TREE_COL_NAME); vbuttonbox3 = gtk_vbutton_box_new(); gtk_widget_show(vbuttonbox3); gtk_box_pack_start(GTK_BOX(hbox), vbuttonbox3, FALSE, TRUE, 0); gtk_box_set_spacing(GTK_BOX(vbuttonbox3), 5); gtk_button_box_set_layout(GTK_BUTTON_BOX(vbuttonbox3), GTK_BUTTONBOX_START); button3 = gtk_button_new_with_mnemonic("Select _None"); gtk_widget_show(button3); gtk_container_add(GTK_CONTAINER(vbuttonbox3), button3); GTK_WIDGET_SET_FLAGS(button3, GTK_CAN_DEFAULT); g_signal_connect(button3, "clicked", G_CALLBACK(report_dialog_sel_none), rd); button6 = gtk_button_new_with_mnemonic("Select _All"); gtk_widget_show(button6); gtk_container_add(GTK_CONTAINER(vbuttonbox3), button6); GTK_WIDGET_SET_FLAGS(button6, GTK_CAN_DEFAULT); g_signal_connect(button6, "clicked", G_CALLBACK(report_dialog_sel_all), rd); dialog1_action_area = GTK_DIALOG(dialog)->action_area; gtk_widget_show(dialog1_action_area); gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog1_action_area), GTK_BUTTONBOX_END); button8 = gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_widget_show(button8); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button8, GTK_RESPONSE_CANCEL); GTK_WIDGET_SET_FLAGS(button8, GTK_CAN_DEFAULT); button7 = gtk_button_new_with_mnemonic("_Generate"); gtk_widget_show(button7); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button7, GTK_RESPONSE_ACCEPT); GTK_WIDGET_SET_FLAGS(button7, GTK_CAN_DEFAULT); rd->dialog = dialog; rd->btn_cancel = button8; rd->btn_generate = button7; rd->btn_sel_all = button6; rd->btn_sel_none = button3; rd->treeview = treeview2; rd->model = model; gtk_tree_view_collapse_all(GTK_TREE_VIEW(treeview2)); set_all_active(rd, TRUE); return rd; } hardinfo-0.5.1/report.h0000644000175000017500000000552711166403363013777 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 __REPORT_H__ #define __REPORT_H__ #include #include typedef enum { REPORT_FORMAT_HTML, REPORT_FORMAT_TEXT, N_REPORT_FORMAT } ReportFormat; typedef enum { REPORT_COL_PROGRESS = 1<<0, REPORT_COL_VALUE = 1<<1, REPORT_COL_EXTRA1 = 1<<2, REPORT_COL_EXTRA2 = 1<<3, REPORT_COL_TEXTVALUE= 1<<4 } ReportColumn; typedef struct _ReportDialog ReportDialog; typedef struct _ReportContext ReportContext; struct _ReportContext { ShellModuleEntry *entry; gchar *output; void (*header) (ReportContext *ctx); void (*footer) (ReportContext *ctx); void (*title) (ReportContext *ctx, gchar *text); void (*subtitle) (ReportContext *ctx, gchar *text); void (*subsubtitle) (ReportContext *ctx, gchar *text); void (*keyvalue) (ReportContext *ctx, gchar *key, gchar *value); ReportFormat format; gboolean is_image_enabled; gboolean first_table; gboolean show_column_headers; guint columns; GHashTable *column_titles; }; struct _ReportDialog { GtkWidget *dialog; GtkWidget *filechooser; GtkWidget *btn_cancel; GtkWidget *btn_generate; GtkWidget *btn_sel_all; GtkWidget *btn_sel_none; GtkWidget *treeview; GtkTreeModel *model; }; void report_dialog_show(); ReportContext *report_context_html_new(); ReportContext *report_context_text_new(); void report_header (ReportContext *ctx); void report_footer (ReportContext *ctx); void report_title (ReportContext *ctx, gchar *text); void report_subtitle (ReportContext *ctx, gchar *text); void report_subsubtitle (ReportContext *ctx, gchar *text); void report_key_value (ReportContext *ctx, gchar *key, gchar *value); void report_table (ReportContext *ctx, gchar *text); void report_create_from_module_list(ReportContext *ctx, GSList *modules); gchar *report_create_from_module_list_format(GSList *modules, ReportFormat format); void report_context_free(ReportContext *ctx); void report_module_list_free(GSList *modules); #endif /* __REPORT_H__ */ hardinfo-0.5.1/LICENSE0000644000175000017500000004313011166403363013310 0ustar agneyagney GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy 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 Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. hardinfo-0.5.1/md5.c0000644000175000017500000002310311166403363013132 0ustar agneyagney/* * 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 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 /* 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<>(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 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 */ hardinfo-0.5.1/md5.h0000644000175000017500000000157711166403363013152 0ustar agneyagney/* See md5.c for explanation and copyright information. */ #ifndef MD5_H #define MD5_H /* Unlike previous versions of this code, uint32 need not be exactly 32 bits, merely 32 bits or more. Choosing a data type which is 32 bits instead of 64 is not important; speed is considerably more important. ANSI guarantees that "unsigned long" will be big enough, and always using it seems to have few disadvantages. */ typedef unsigned long uint32; struct MD5Context { uint32 buf[4]; uint32 bits[2]; unsigned char in[64]; }; void MD5Init (struct MD5Context *context); void MD5Update (struct MD5Context *context, unsigned char const *buf, unsigned len); void MD5Final (unsigned char digest[16], struct MD5Context *context); void MD5Transform (uint32 buf[4], const unsigned char in[64]); #endif /* !MD5_H */ hardinfo-0.5.1/configure0000755000175000017500000001541111166403363014213 0ustar agneyagney#!/usr/bin/env bash # # ToscoConf 0.04 # Copyright (c) 2003-2004 Leandro Pereira # All rights reserved. # # This script is in the Tosco Public License. It may be copied and/or # modified, in whole or in part, provided that all copies must retain the # above copyright notice, this condition and the following disclaimer. # # THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # # (yes, I did a copy&paste from the BSD license, eat me) # # --------------------------------------------------------------------------- PACKAGE=`basename ${PWD} | cut -d"-" -f1`; VERSION=`basename ${PWD} | cut -d"-" -f2`; if [ "$PACKAGE" == "$VERSION" ]; then VERSION=$(date +"%F.%H:%M:%S") RELEASE=0 else RELEASE=1 fi echo "ToscoConf (version 0.04) for $PACKAGE version $VERSION" # --------------------------------------------------------------------------- echo "Determining system architecture." OS=`uname` case $OS in Linux) ;; *) echo "$OS (not supported, yet!)" exit ;; esac PROC=`uname -m` LIBDIR='/usr/lib' case $PROC in i?86) ln -sf linux/x86 arch/this ARCH="ARCH_i386" ;; ppc*) ln -sf linux/ppc arch/this ARCH="ARCH_PPC" ;; x86_64) ln -sf linux/x86_64 arch/this ARCH="ARCH_x86_64" LIBDIR="/usr/lib64" ;; mips*) ln -sf linux/mips arch/this ARCH="ARCH_MIPS" ;; parisc*) ln -sf linux/parisc arch/this ARCH="ARCH_PARISC" ;; sparc*) ln -sf linux/sparc arch/this ARCH="ARCH_SPARC" ;; armv*) ln -sf linux/armv4l arch/this ARCH="ARCH_ARMV4L" ;; ia64) ln -sf linux/ia64 arch/this ARCH="ARCH_IA64" ;; alpha) ln -sf linux/alpha arch/this ARCH="ARCH_ALPHA" ;; s390*) ln -sf linux/s390 arch/this ARCH="ARCH_S390" ;; m68k) ln -sf linux/m68k arch/this ARCH="ARCH_m68k" ;; sh*) ln -sf linux/sh arch/this ARCH="ARCH_sh" ;; esac if [ "x$ARCH" == "x" ]; then echo "Your architecture is not supported yet. Please send the" echo "output of the following commands to leandro@hardinfo.org:" echo "" echo " $ cat /proc/cpuinfo" echo " $ uname -a" echo " $ uname -m" exit 1 fi # --------------------------------------------------------------------------- echo "Compiling $PACKAGE for $OS $PROC ($ARCH)." echo "" # --------------------------------------------------------------------------- GTK2=-1 MIN_VERSION="2.6.0" echo -n "Checking for GTK version >= ${MIN_VERSION}... " for i in `which pkg-config`; do $i --errors-to-stdout gtk+-2.0 \ --atleast-version=$MIN_VERSION > /dev/null case $? in 0) GTK_FLAGS=`pkg-config gtk+-2.0 --cflags` GTK_LIBS=`pkg-config gtk+-2.0 --libs` echo "found `pkg-config gtk+-2.0 --modversion`" GTK2=1 break ;; *) echo "not found." ;; esac done # -------------------------------------------------------------------------- if [ $GTK2 -eq -1 ]; then echo -e "\nYou need the GTK libraries, including the development stuff." echo "If you're using Debian, running the command as root:" echo -e "\n\taptitude install libgtk2.0-dev\n" echo "Will do the trick." exit 1 fi # --------------------------------------------------------------------------- SOUP=-1 MIN_VERSION="2.4" echo -n "Checking for libsoup version >= ${MIN_VERSION}... " for i in `which pkg-config`; do $i --errors-to-stdout libsoup-2.4 \ --atleast-version=$MIN_VERSION > /dev/null case $? in 0) SOUP_FLAGS=`pkg-config libsoup-2.4 --cflags --static` SOUP_LIBS=`pkg-config libsoup-2.4 --libs --static` echo "found `pkg-config libsoup-2.4 --modversion`" SOUP=1 break ;; *) echo "not found." ;; esac done # -------------------------------------------------------------------------- if [ $SOUP -eq -1 ]; then echo "Disabling libsoup support. (Network Updater won't be available.)" fi # -------------------------------------------------------------------------- echo -n "Checking for Linux Wireless Extensions (CONFIG_NET_RADIO)... " if [ -e /proc/net/wireless ]; then echo "found." LINUX_WE=1 else echo "not found." LINUX_WE=-1 fi # -------------------------------------------------------------------------- if [ $LINUX_WE -eq -1 ]; then echo "Disabling Linux Wireless Extensions support." fi # -------------------------------------------------------------------------- echo -e "\nWriting config.h..." rm -f config.h echo -e "#ifndef __CONFIG_H__\n#define __CONFIG_H__\n" > config.h echo "#define VERSION \"$VERSION\"" >> config.h echo "#define $ARCH" >> config.h echo "#define ARCH \"$ARCH\"" >> config.h echo "#define PLATFORM \"`uname`\"" >> config.h echo "#define KERNEL \"`uname -r`\"" >> config.h echo "#define HOSTNAME \"`hostname`\"" >> config.h echo "#define PREFIX \"/usr/share/hardinfo/\"" >> config.h echo "#define LIBPREFIX \"/usr/lib/hardinfo/\"" >> config.h if [ "$SOUP" == "1" ]; then echo "#define HAS_LIBSOUP" >> config.h fi if [ "$LINUX_WE" == "1" ]; then echo "#define HAS_LINUX_WE" >> config.h fi if [ "$RELEASE" == "1" ]; then echo "#define DEBUG(...)" >> config.h else echo '#define DEBUG(msg,...) fprintf(stderr, "*** %s:%d (%s) *** " msg "\n", \' >> config.h echo ' __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)' >> config.h fi echo "#define ENABLE_BINRELOC 1" >> config.h echo "#define RELEASE $RELEASE" >> config.h echo -e "\n#endif /* __CONFIG_H__ */" >> config.h echo "Writing Makefile..." rm -f Makefile echo "GTK_LIBS = -lpthread -lgthread-2.0 -lrt ${GTK_LIBS}" > Makefile echo "GTK_CFLAGS = ${GTK_FLAGS}" >> Makefile echo "SOUP_LIBS = ${SOUP_LIBS}" >> Makefile echo "SOUP_CFLAGS = ${SOUP_FLAGS}" >> Makefile echo "PACKAGE = `basename ${PWD}`" >> Makefile echo "ARCHOPTS = " >> Makefile echo "LIBDIR = $LIBDIR" >> Makefile cat Makefile.in >> Makefile echo -e "\nDone. Type \"make\" to compile the program.\n" if [ "$RELEASE" == 0 ]; then cat << EOF ********************************************************* * This is work in progress! Please report bugs at: * * http://developer.berlios.de/bugs/?group_id=5897 * * Or send patches to: * * http://developer.berlios.de/patch/?group_id=5897 * ********************************************************* EOF else cat << EOF If you get errors, probably you don't have the right libraries, includes or utilities. However, if you're sure this is a bug in my code, please send a patch (use "diff -u") to . EOF fi hardinfo-0.5.1/fbench.c0000644000175000017500000005127711166403363013707 0ustar agneyagney/* John Walker's Floating Point Benchmark, derived from... Marinchip Interactive Lens Design System John Walker December 1980 By John Walker http://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 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 #include #include #ifndef INTRIG #include #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 */ 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 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 hardinfo-0.5.1/shell.c0000644000175000017500000012310411166403363013556 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 #include #include #include #include #include #include #include #include #include #include /* * Internal Prototypes ******************************************************** */ static void create_window(); static ShellTree *tree_new(void); static ShellInfoTree *info_tree_new(gboolean extra); static void module_selected(gpointer data); static void module_selected_show_info(ShellModuleEntry * entry, gboolean reload); static void info_selected(GtkTreeSelection * ts, gpointer data); static void info_selected_show_extra(gchar * data); static gboolean reload_section(gpointer data); static gboolean rescan_section(gpointer data); static gboolean update_field(gpointer data); /* * Globals ******************************************************************** */ static Shell *shell = NULL; static GHashTable *update_tbl = NULL; static GSList *update_sfusrc = NULL; /* * Code :) ******************************************************************** */ Shell *shell_get_main_shell(void) { return shell; } void shell_ui_manager_set_visible(const gchar * path, gboolean setting) { GtkWidget *widget; if (!params.gui_running) return; widget = gtk_ui_manager_get_widget(shell->ui_manager, path); if (!widget) return; if (setting) gtk_widget_show(widget); else gtk_widget_hide(widget); } void shell_action_set_property(const gchar * action_name, const gchar * property, gboolean setting) { GtkAction *action; if (!params.gui_running) return; action = gtk_action_group_get_action(shell->action_group, action_name); if (action) { GValue value = { 0 }; g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, setting); g_object_set_property(G_OBJECT(action), property, &value); g_value_unset(&value); } } void shell_action_set_enabled(const gchar * action_name, gboolean setting) { if (params.gui_running && shell->action_group) { GtkAction *action; action = gtk_action_group_get_action(shell->action_group, action_name); if (action) { gtk_action_set_sensitive(action, setting); } } } gboolean shell_action_get_enabled(const gchar * action_name) { GtkAction *action; if (!params.gui_running) return FALSE; action = gtk_action_group_get_action(shell->action_group, action_name); if (action) { return gtk_action_get_sensitive(action); } return FALSE; } void shell_set_side_pane_visible(gboolean setting) { if (!params.gui_running) return; if (setting) gtk_widget_show(shell->tree->scroll); else gtk_widget_hide(shell->tree->scroll); } gboolean shell_action_get_active(const gchar * action_name) { GtkAction *action; GSList *proxies; /* FIXME: Ugh. Are you sure there isn't any simpler way? O_o */ if (!params.gui_running) return FALSE; action = gtk_action_group_get_action(shell->action_group, action_name); if (action) { proxies = gtk_action_get_proxies(action); for (; proxies; proxies = proxies->next) { GtkWidget *widget = (GtkWidget *) proxies->data; if (GTK_IS_CHECK_MENU_ITEM(widget)) { return gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM (widget)); } } } return FALSE; } void shell_action_set_active(const gchar * action_name, gboolean setting) { GtkAction *action; GSList *proxies; /* FIXME: Ugh. Are you sure there isn't any simpler way? O_o */ if (!params.gui_running) return; action = gtk_action_group_get_action(shell->action_group, action_name); if (action) { proxies = gtk_action_get_proxies(action); for (; proxies; proxies = proxies->next) { GtkWidget *widget = (GtkWidget *) proxies->data; if (GTK_IS_CHECK_MENU_ITEM(widget)) { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), setting); return; } } } } void shell_status_pulse(void) { if (params.gui_running) { if (shell->_pulses++ == 5) { /* we're pulsing for some time, disable the interface and change the cursor to a hourglass */ shell_view_set_enabled(FALSE); } gtk_progress_bar_pulse(GTK_PROGRESS_BAR(shell->progress)); while (gtk_events_pending()) gtk_main_iteration(); } else { static gint counter = 0; fprintf(stderr, "\033[2K\033[40;37;1m %c\033[0m\r", "|/-\\"[counter++ % 4]); } } void shell_status_set_percentage(gint percentage) { if (params.gui_running) { gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(shell->progress), (float) percentage / 100.0); while (gtk_events_pending()) gtk_main_iteration(); } else { if (percentage < 1 || percentage >= 100) { fprintf(stderr, "\033[2K"); } else { gchar pbar[] = "----------"; memset(pbar, '#', percentage / 10); fprintf(stderr, "\r\033[40;37;1m%3d%% \033[40;34;1m" "%s\033[0m\r", percentage, pbar); } } } void shell_view_set_enabled(gboolean setting) { if (!params.gui_running) return; if (setting) { shell->_pulses = 0; widget_set_cursor(shell->window, GDK_LEFT_PTR); } else { widget_set_cursor(shell->window, GDK_WATCH); } gtk_widget_set_sensitive(shell->hpaned, setting); shell_action_set_enabled("ViewMenuAction", setting); shell_action_set_enabled("RefreshAction", setting); shell_action_set_enabled("CopyAction", setting); shell_action_set_enabled("ReportAction", setting); shell_action_set_enabled("SyncManagerAction", setting && sync_manager_count_entries() > 0); shell_action_set_enabled("SaveGraphAction", setting ? shell->view_type == SHELL_VIEW_PROGRESS : FALSE); } void shell_status_set_enabled(gboolean setting) { if (!params.gui_running) return; if (setting) gtk_widget_show(shell->progress); else { gtk_widget_hide(shell->progress); shell_view_set_enabled(TRUE); shell_status_update("Done."); } } void shell_do_reload(void) { if (!params.gui_running || !shell->selected) return; shell_action_set_enabled("RefreshAction", FALSE); shell_action_set_enabled("CopyAction", FALSE); shell_action_set_enabled("ReportAction", FALSE); shell_status_set_enabled(TRUE); module_entry_reload(shell->selected); module_selected(NULL); shell_action_set_enabled("RefreshAction", TRUE); shell_action_set_enabled("CopyAction", TRUE); shell_action_set_enabled("ReportAction", TRUE); } void shell_status_update(const gchar * message) { if (params.gui_running) { gtk_label_set_markup(GTK_LABEL(shell->status), message); gtk_progress_bar_pulse(GTK_PROGRESS_BAR(shell->progress)); while (gtk_events_pending()) gtk_main_iteration(); } else { fprintf(stderr, "\033[2K\033[40;37;1m %s\033[0m\r", message); } } static void destroy_me(void) { cb_quit(); } static void close_note(GtkWidget * widget, gpointer user_data) { gtk_widget_hide(shell->note->frame); } static ShellNote *note_new(void) { ShellNote *note; GtkWidget *hbox, *icon, *button; note = g_new0(ShellNote, 1); note->label = gtk_label_new(""); note->frame = gtk_frame_new(NULL); button = gtk_button_new(); icon = icon_cache_get_image("close.png"); gtk_widget_show(icon); gtk_container_add(GTK_CONTAINER(button), icon); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); g_signal_connect(G_OBJECT(button), "clicked", (GCallback) close_note, NULL); hbox = gtk_hbox_new(FALSE, 3); icon = icon_cache_get_image("dialog-information.png"); gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), note->label, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox), 5); gtk_container_add(GTK_CONTAINER(note->frame), hbox); gtk_widget_show_all(hbox); return note; } static void create_window(void) { GtkWidget *vbox, *hbox; shell = g_new0(Shell, 1); shell->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_icon(GTK_WINDOW(shell->window), icon_cache_get_pixbuf("logo.png")); gtk_window_set_title(GTK_WINDOW(shell->window), "System Information"); gtk_window_set_default_size(GTK_WINDOW(shell->window), 800, 600); g_signal_connect(G_OBJECT(shell->window), "destroy", destroy_me, NULL); vbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(vbox); gtk_container_add(GTK_CONTAINER(shell->window), vbox); shell->vbox = vbox; menu_init(shell); hbox = gtk_hbox_new(FALSE, 5); gtk_widget_show(hbox); gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); shell->progress = gtk_progress_bar_new(); gtk_widget_set_size_request(shell->progress, 80, 10); gtk_widget_hide(shell->progress); gtk_box_pack_end(GTK_BOX(hbox), shell->progress, FALSE, FALSE, 5); shell->status = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(shell->status), 0.0, 0.5); gtk_widget_show(shell->status); gtk_box_pack_start(GTK_BOX(hbox), shell->status, FALSE, FALSE, 5); shell->hpaned = gtk_hpaned_new(); gtk_widget_show(shell->hpaned); gtk_box_pack_end(GTK_BOX(vbox), shell->hpaned, TRUE, TRUE, 0); gtk_paned_set_position(GTK_PANED(shell->hpaned), 210); vbox = gtk_vbox_new(FALSE, 5); gtk_widget_show(vbox); gtk_paned_add2(GTK_PANED(shell->hpaned), vbox); shell->note = note_new(); gtk_box_pack_end(GTK_BOX(vbox), shell->note->frame, FALSE, FALSE, 0); shell->vpaned = gtk_vpaned_new(); gtk_box_pack_start(GTK_BOX(vbox), shell->vpaned, TRUE, TRUE, 0); gtk_widget_show(shell->vpaned); shell->notebook = gtk_notebook_new(); gtk_paned_add2(GTK_PANED(shell->vpaned), shell->notebook); gtk_widget_show(shell->window); while (gtk_events_pending()) gtk_main_iteration(); } static void view_menu_select_entry(gpointer data, gpointer data2) { GtkTreePath *path; GtkTreeIter *iter = (GtkTreeIter *) data2; path = gtk_tree_model_get_path(shell->tree->model, iter); gtk_tree_selection_select_path(shell->tree->selection, path); gtk_tree_view_set_cursor(GTK_TREE_VIEW(shell->tree->view), path, NULL, FALSE); gtk_tree_path_free(path); } static void add_module_to_menu(gchar * name, GdkPixbuf * pixbuf) { gchar *about_module = g_strdup_printf("AboutModule%s", name); GtkActionEntry entries[] = { { name, /* name */ name, /* stockid */ name, /* label */ NULL, /* accelerator */ NULL, /* tooltip */ NULL, /* callback */ }, { about_module, name, name, NULL, name, (GCallback) cb_about_module, }, }; stock_icon_register_pixbuf(pixbuf, name); gtk_action_group_add_actions(shell->action_group, entries, 2, NULL); gtk_ui_manager_add_ui(shell->ui_manager, gtk_ui_manager_new_merge_id(shell->ui_manager), "/menubar/ViewMenu/LastSep", name, name, GTK_UI_MANAGER_MENU, TRUE); gtk_ui_manager_add_ui(shell->ui_manager, gtk_ui_manager_new_merge_id(shell->ui_manager), "/menubar/HelpMenu/HelpMenuModules/LastSep", about_module, about_module, GTK_UI_MANAGER_AUTO, TRUE); } static void add_module_entry_to_view_menu(gchar * module, gchar * name, GdkPixbuf * pixbuf, GtkTreeIter * iter) { GtkActionEntry entries[] = { { name, /* name */ name, /* stockid */ name, /* label */ NULL, /* accelerator */ NULL, /* tooltip */ (GCallback) view_menu_select_entry, /* callback */ }, }; stock_icon_register_pixbuf(pixbuf, name); gtk_action_group_add_actions(shell->action_group, entries, 1, iter); gtk_ui_manager_add_ui(shell->ui_manager, gtk_ui_manager_new_merge_id(shell->ui_manager), g_strdup_printf("/menubar/ViewMenu/%s", module), name, name, GTK_UI_MANAGER_AUTO, FALSE); } static void add_modules_to_gui(gpointer data, gpointer user_data) { ShellTree *shelltree = (ShellTree *) user_data; ShellModule *module = (ShellModule *) data; GtkTreeStore *store = GTK_TREE_STORE(shelltree->model); GtkTreeIter parent; if (!module) { return; } gtk_tree_store_append(store, &parent, NULL); gtk_tree_store_set(store, &parent, TREE_COL_NAME, module->name, TREE_COL_DATA, NULL, TREE_COL_SEL, FALSE, -1); if (module->icon) { gtk_tree_store_set(store, &parent, TREE_COL_PBUF, module->icon, -1); } add_module_to_menu(module->name, module->icon); if (module->entries) { ShellModuleEntry *entry; GSList *p; for (p = module->entries; p; p = g_slist_next(p)) { GtkTreeIter child; entry = (ShellModuleEntry *) p->data; gtk_tree_store_append(store, &child, &parent); gtk_tree_store_set(store, &child, TREE_COL_NAME, entry->name, TREE_COL_DATA, entry, TREE_COL_SEL, FALSE, -1); if (entry->icon) { gtk_tree_store_set(store, &child, TREE_COL_PBUF, entry->icon, -1); } add_module_entry_to_view_menu(module->name, entry->name, entry->icon, gtk_tree_iter_copy(&child)); shell_status_pulse(); } } } static void __tree_iter_destroy(gpointer data) { gtk_tree_iter_free((GtkTreeIter *) data); } void shell_init(GSList * modules) { if (shell) { g_error("Shell already created"); return; } DEBUG("initializing shell"); create_window(); shell_action_set_property("CopyAction", "is-important", TRUE); shell_action_set_property("RefreshAction", "is-important", TRUE); shell_action_set_property("ReportAction", "is-important", TRUE); shell->tree = tree_new(); shell->info = info_tree_new(FALSE); shell->moreinfo = info_tree_new(TRUE); shell->loadgraph = load_graph_new(75); update_tbl = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, __tree_iter_destroy); gtk_paned_pack1(GTK_PANED(shell->hpaned), shell->tree->scroll, SHELL_PACK_RESIZE, SHELL_PACK_SHRINK); gtk_paned_pack1(GTK_PANED(shell->vpaned), shell->info->scroll, SHELL_PACK_RESIZE, SHELL_PACK_SHRINK); gtk_notebook_append_page(GTK_NOTEBOOK(shell->notebook), shell->moreinfo->scroll, NULL); gtk_notebook_append_page(GTK_NOTEBOOK(shell->notebook), load_graph_get_framed(shell->loadgraph), NULL); gtk_notebook_set_show_tabs(GTK_NOTEBOOK(shell->notebook), FALSE); gtk_notebook_set_show_border(GTK_NOTEBOOK(shell->notebook), FALSE); shell_status_set_enabled(TRUE); shell_status_update("Loading modules..."); shell->tree->modules = modules ? modules : modules_load_all(); g_slist_foreach(shell->tree->modules, add_modules_to_gui, shell->tree); gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->tree->view)); gtk_widget_show_all(shell->hpaned); load_graph_configure_expose(shell->loadgraph); gtk_widget_hide(shell->notebook); gtk_widget_hide(shell->note->frame); shell_status_update("Done."); shell_status_set_enabled(FALSE); shell_action_set_enabled("RefreshAction", FALSE); shell_action_set_enabled("CopyAction", FALSE); shell_action_set_enabled("SaveGraphAction", FALSE); shell_action_set_active("SidePaneAction", TRUE); shell_action_set_active("ToolbarAction", TRUE); #ifndef HAS_LIBSOUP shell_action_set_enabled("SyncManagerAction", FALSE); #else shell_action_set_enabled("SyncManagerAction", sync_manager_count_entries() > 0); #endif } static gboolean update_field(gpointer data) { ShellFieldUpdate *fu; GtkTreeIter *iter; fu = (ShellFieldUpdate *) data; g_return_val_if_fail(fu != NULL, FALSE); DEBUG("update_field [%s]", fu->field_name); iter = g_hash_table_lookup(update_tbl, fu->field_name); g_return_val_if_fail(iter != NULL, FALSE); /* if the entry is still selected, update it */ if (iter && fu->entry->selected && fu->entry->fieldfunc) { GtkTreeStore *store = GTK_TREE_STORE(shell->info->model); gchar *value = fu->entry->fieldfunc(fu->field_name); /* * this function is also used to feed the load graph when ViewType * is SHELL_VIEW_LOAD_GRAPH */ if (shell->view_type == SHELL_VIEW_LOAD_GRAPH && gtk_tree_selection_iter_is_selected(shell->info->selection, iter)) { load_graph_update(shell->loadgraph, atoi(value)); } gtk_tree_store_set(store, iter, INFO_TREE_COL_VALUE, value, -1); g_free(value); return TRUE; } if (update_sfusrc) { GSList *sfu; for (sfu = update_sfusrc; sfu; sfu = sfu->next) { g_free(sfu->data); } g_slist_free(update_sfusrc); update_sfusrc = NULL; } /* otherwise, cleanup and destroy the timeout */ g_free(fu->field_name); g_free(fu); return FALSE; } #define RANGE_SET_VALUE(tree,scrollbar,value) \ gtk_range_set_value(GTK_RANGE \ (GTK_SCROLLED_WINDOW(shell->tree->scroll)-> \ scrollbar), value); static gboolean reload_section(gpointer data) { ShellModuleEntry *entry = (ShellModuleEntry *) data; /* if the entry is still selected, update it */ if (entry->selected) { GtkTreePath *path = NULL; GtkTreeIter iter; /* avoid drawing the window while we reload */ gdk_window_freeze_updates(shell->window->window); /* gets the current selected path */ if (gtk_tree_selection_get_selected (shell->info->selection, &shell->info->model, &iter)) { path = gtk_tree_model_get_path(shell->info->model, &iter); } /* update the information, clear the treeview and populate it again */ module_entry_reload(entry); info_selected_show_extra(NULL); /* clears the more info store */ module_selected_show_info(entry, TRUE); /* if there was a selection, reselect it */ if (path) { gtk_tree_selection_select_path(shell->info->selection, path); gtk_tree_view_set_cursor(GTK_TREE_VIEW(shell->info->view), path, NULL, FALSE); gtk_tree_path_free(path); } /* make the window drawable again */ gdk_window_thaw_updates(shell->window->window); } /* destroy the timeout: it'll be set up again */ return FALSE; } static gboolean rescan_section(gpointer data) { ShellModuleEntry *entry = (ShellModuleEntry *) data; module_entry_reload(entry); return entry->selected; } gint info_tree_compare_val_func(GtkTreeModel * model, GtkTreeIter * a, GtkTreeIter * b, gpointer userdata) { gint ret = 0; gchar *col1, *col2; gtk_tree_model_get(model, a, INFO_TREE_COL_VALUE, &col1, -1); gtk_tree_model_get(model, b, INFO_TREE_COL_VALUE, &col2, -1); if (col1 == NULL || col2 == NULL) { if (col1 == NULL && col2 == NULL) return 0; ret = (col1 == NULL) ? -1 : 1; } else { ret = shell->_order_type ? (atof(col1) < atof(col2)) : (atof(col1) > atof(col2)); } g_free(col1); g_free(col2); return ret; } static void set_view_type(ShellViewType viewtype, gboolean reload) { if (viewtype < SHELL_VIEW_NORMAL || viewtype >= SHELL_VIEW_N_VIEWS) viewtype = SHELL_VIEW_NORMAL; shell->normalize_percentage = TRUE; shell->view_type = viewtype; /* reset to the default model */ gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), shell->info->model); /* reset to the default view columns */ if (!reload) { gtk_tree_view_column_set_visible(shell->info->col_extra1, FALSE); gtk_tree_view_column_set_visible(shell->info->col_extra2, FALSE); gtk_tree_view_column_set_visible(shell->info->col_progress, FALSE); gtk_tree_view_column_set_visible(shell->info->col_value, TRUE); } /* turn off the rules hint */ gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(shell->info->view), FALSE); /* turn off the save graphic action */ shell_action_set_enabled("SaveGraphAction", FALSE); switch (viewtype) { default: case SHELL_VIEW_NORMAL: gtk_widget_hide(shell->notebook); if (!reload) { gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info->view), FALSE); } break; case SHELL_VIEW_DUAL: gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 0); gtk_widget_show(shell->notebook); break; case SHELL_VIEW_LOAD_GRAPH: gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 1); gtk_widget_show(shell->notebook); load_graph_clear(shell->loadgraph); gtk_paned_set_position(GTK_PANED(shell->vpaned), shell->hpaned->allocation.height - shell->loadgraph->height - 16); break; case SHELL_VIEW_PROGRESS_DUAL: gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 0); gtk_widget_show(shell->notebook); /* fallthrough */ case SHELL_VIEW_PROGRESS: shell_action_set_enabled("SaveGraphAction", TRUE); if (!reload) { gtk_tree_view_column_set_visible(shell->info->col_progress, TRUE); gtk_tree_view_column_set_visible(shell->info->col_value, FALSE); } if (viewtype == SHELL_VIEW_PROGRESS) gtk_widget_hide(shell->notebook); break; } } static void group_handle_special(GKeyFile * key_file, ShellModuleEntry * entry, gchar * group, gchar ** keys, gboolean reload) { if (g_str_equal(group, "$ShellParam$")) { gboolean headers_visible = FALSE; gint i; for (i = 0; keys[i]; i++) { gchar *key = keys[i]; if (g_str_has_prefix(key, "UpdateInterval")) { ShellFieldUpdate *fu = g_new0(ShellFieldUpdate, 1); ShellFieldUpdateSource *sfutbl; gint ms; ms = g_key_file_get_integer(key_file, group, key, NULL); fu->field_name = g_strdup(strchr(key, '$') + 1); fu->entry = entry; sfutbl = g_new0(ShellFieldUpdateSource, 1); sfutbl->source_id = g_timeout_add(ms, update_field, fu); sfutbl->sfu = fu; update_sfusrc = g_slist_prepend(update_sfusrc, sfutbl); } else if (g_str_equal(key, "NormalizePercentage")) { shell->normalize_percentage = g_key_file_get_boolean(key_file, group, key, NULL); } else if (g_str_equal(key, "LoadGraphSuffix")) { gchar *suffix = g_key_file_get_value(key_file, group, key, NULL); load_graph_set_data_suffix(shell->loadgraph, suffix); g_free(suffix); } else if (g_str_equal(key, "ReloadInterval")) { gint ms; ms = g_key_file_get_integer(key_file, group, key, NULL); g_timeout_add(ms, reload_section, entry); } else if (g_str_equal(key, "RescanInterval")) { gint ms; ms = g_key_file_get_integer(key_file, group, key, NULL); g_timeout_add(ms, rescan_section, entry); } else if (g_str_equal(key, "ShowColumnHeaders")) { headers_visible = g_key_file_get_boolean(key_file, group, key, NULL); } else if (g_str_has_prefix(key, "ColumnTitle")) { GtkTreeViewColumn *column = NULL; gchar *value, *title = strchr(key, '$') + 1; value = g_key_file_get_value(key_file, group, key, NULL); if (g_str_equal(title, "Extra1")) { column = shell->info->col_extra1; } else if (g_str_equal(title, "Extra2")) { column = shell->info->col_extra2; } else if (g_str_equal(title, "Value")) { column = shell->info->col_value; } else if (g_str_equal(title, "TextValue")) { column = shell->info->col_textvalue; } else if (g_str_equal(title, "Progress")) { column = shell->info->col_progress; } if (column) { gtk_tree_view_column_set_title(column, value); gtk_tree_view_column_set_visible(column, TRUE); } g_free(value); } else if (g_str_equal(key, "OrderType")) { shell->_order_type = g_key_file_get_integer(key_file, group, key, NULL); } else if (g_str_equal(key, "ViewType")) { set_view_type(g_key_file_get_integer(key_file, group, key, NULL), reload); } else if (g_str_has_prefix(key, "Icon")) { GtkTreeIter *iter = g_hash_table_lookup(update_tbl, strchr(key, '$') + 1); if (iter) { gchar *file = g_key_file_get_value(key_file, group, key, NULL); gtk_tree_store_set(GTK_TREE_STORE(shell->info->model), iter, INFO_TREE_COL_PBUF, icon_cache_get_pixbuf_at_size(file, 22, 22), -1); g_free(file); } } else if (g_str_equal(key, "Zebra")) { gtk_tree_view_set_rules_hint(GTK_TREE_VIEW (shell->info->view), g_key_file_get_boolean (key_file, group, key, NULL)); } } gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info->view), headers_visible); } else { g_warning("Unknown parameter group: ``%s''", group); } } static void group_handle_normal(GKeyFile * key_file, ShellModuleEntry * entry, gchar * group, gchar ** keys, gsize ngroups) { GtkTreeIter parent; GtkTreeStore *store = GTK_TREE_STORE(shell->info->model); gchar *tmp = g_strdup(group); gint i; if (ngroups > 1) { gtk_tree_store_append(store, &parent, NULL); strend(tmp, '#'); gtk_tree_store_set(store, &parent, INFO_TREE_COL_NAME, tmp, -1); g_free(tmp); } for (i = 0; keys[i]; i++) { gchar *key = keys[i]; gchar *value; GtkTreeIter child; value = g_key_file_get_value(key_file, group, key, NULL); if (entry->fieldfunc && value && g_str_equal(value, "...")) { g_free(value); value = entry->fieldfunc(key); } if ((key && value) && g_utf8_validate(key, -1, NULL) && g_utf8_validate(value, -1, NULL)) { if (ngroups == 1) { gtk_tree_store_append(store, &child, NULL); } else { gtk_tree_store_append(store, &child, &parent); } /* FIXME: use g_key_file_get_string_list? */ if (strchr(value, '|')) { gchar **columns = g_strsplit(value, "|", 0); gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, columns[0], -1); if (columns[1]) { gtk_tree_store_set(store, &child, INFO_TREE_COL_EXTRA1, columns[1], -1); if (columns[2]) { gtk_tree_store_set(store, &child, INFO_TREE_COL_EXTRA2, columns[2], -1); } } g_strfreev(columns); } else { gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, value, -1); } strend(key, '#'); if (*key == '$') { gchar **tmp; tmp = g_strsplit(++key, "$", 0); gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, tmp[1], INFO_TREE_COL_DATA, tmp[0], -1); g_strfreev(tmp); } else { gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, key, INFO_TREE_COL_DATA, NULL, -1); } g_hash_table_insert(update_tbl, g_strdup(key), gtk_tree_iter_copy(&child)); } g_free(value); } } static void moreinfo_handle_normal(GKeyFile * key_file, gchar * group, gchar ** keys) { GtkTreeIter parent; GtkTreeStore *store = GTK_TREE_STORE(shell->moreinfo->model); gint i; gtk_tree_store_append(store, &parent, NULL); gtk_tree_store_set(store, &parent, INFO_TREE_COL_NAME, group, -1); for (i = 0; keys[i]; i++) { gchar *key = keys[i]; GtkTreeIter child; gchar *value; value = g_key_file_get_value(key_file, group, key, NULL); if (g_utf8_validate(key, -1, NULL) && g_utf8_validate(value, -1, NULL)) { strend(key, '#'); gtk_tree_store_append(store, &child, &parent); gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, value, INFO_TREE_COL_NAME, key, -1); } g_free(value); } } static void update_progress() { GtkTreeModel *model = shell->info->model; GtkTreeStore *store = GTK_TREE_STORE(model); GtkTreeIter iter, fiter; gchar *tmp; gdouble maxv = 0, maxp = 0, cur, floatval; gtk_tree_model_get_iter_first(model, &fiter); /* finds the maximum value */ if (shell->normalize_percentage) { iter = fiter; do { gtk_tree_model_get(model, &iter, INFO_TREE_COL_VALUE, &tmp, -1); cur = atof(tmp); maxv = MAX(maxv, cur); g_free(tmp); } while (gtk_tree_model_iter_next(model, &iter)); } else { maxv = 100.0f; } /* calculates the relative percentage and finds the maximum percentage */ if (shell->_order_type == SHELL_ORDER_ASCENDING) { iter = fiter; do { gtk_tree_model_get(model, &iter, INFO_TREE_COL_VALUE, &tmp, -1); cur = 100 - 100 * atof(tmp) / maxv; maxp = MAX(cur, maxp); g_free(tmp); } while (gtk_tree_model_iter_next(model, &iter)); maxp = 100 - maxp; } /* fix the maximum relative percentage */ iter = fiter; do { char *strval; gtk_tree_model_get(model, &iter, INFO_TREE_COL_VALUE, &tmp, -1); floatval = atof(tmp); strval = g_strdup(tmp); g_free(tmp); cur = 100 * floatval / maxv; if (shell->_order_type == SHELL_ORDER_ASCENDING) cur = 100 - cur + maxp; if (strchr(strval, ' ')) { tmp = g_strdup_printf("%.2f%s", floatval, strchr(strval, ' ')); } else { tmp = g_strdup_printf("%.2f", floatval); } tmp = strreplace(tmp, ",", '.'); gtk_tree_store_set(store, &iter, INFO_TREE_COL_PROGRESS, cur, INFO_TREE_COL_VALUE, tmp, -1); g_free(tmp); g_free(strval); } while (gtk_tree_model_iter_next(model, &iter)); /* now sort everything up. that wasn't as hard as i thought :) */ GtkTreeSortable *sortable = GTK_TREE_SORTABLE(shell->info->model); gtk_tree_sortable_set_sort_func(sortable, INFO_TREE_COL_VALUE, info_tree_compare_val_func, 0, NULL); gtk_tree_sortable_set_sort_column_id(sortable, INFO_TREE_COL_VALUE, GTK_SORT_DESCENDING); gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), GTK_TREE_MODEL(sortable)); } void shell_set_note_from_entry(ShellModuleEntry * entry) { if (entry->notefunc) { const gchar *note = module_entry_get_note(entry); if (note) { gtk_label_set_markup(GTK_LABEL(shell->note->label), note); gtk_widget_show(shell->note->frame); } else { gtk_widget_hide(shell->note->frame); } } else { gtk_widget_hide(shell->note->frame); } } static void module_selected_show_info(ShellModuleEntry * entry, gboolean reload) { GKeyFile *key_file = g_key_file_new(); GtkTreeStore *store; gchar *key_data, **groups; gboolean has_shell_param = FALSE; gint i; gsize ngroups; module_entry_scan(entry); key_data = module_entry_function(entry); /* */ gdk_window_freeze_updates(shell->info->view->window); g_object_ref(shell->info->model); gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), NULL); /* reset the view type to normal */ set_view_type(SHELL_VIEW_NORMAL, reload); if (!reload) { /* recreate the iter hash table */ h_hash_table_remove_all(update_tbl); } if (update_sfusrc) { GSList *sfusrc; for (sfusrc = update_sfusrc; sfusrc; sfusrc = sfusrc->next) { ShellFieldUpdateSource *src = (ShellFieldUpdateSource *) sfusrc->data; g_source_remove(src->source_id); g_free(src->sfu->field_name); g_free(src->sfu); g_free(src); } g_slist_free(update_sfusrc); update_sfusrc = NULL; } store = GTK_TREE_STORE(shell->info->model); gtk_tree_store_clear(store); g_key_file_load_from_data(key_file, key_data, strlen(key_data), 0, NULL); groups = g_key_file_get_groups(key_file, &ngroups); for (i = 0; groups[i]; i++) if (groups[i][0] == '$') ngroups--; for (i = 0; groups[i]; i++) { gchar *group = groups[i]; gchar **keys = g_key_file_get_keys(key_file, group, NULL, NULL); if (*group == '$') { group_handle_special(key_file, entry, group, keys, reload); has_shell_param = TRUE; } else { group_handle_normal(key_file, entry, group, keys, ngroups); } g_strfreev(keys); } /* */ if (!has_shell_param) { gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info->view), FALSE); } /* */ g_object_unref(shell->info->model); gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), shell->info->model); gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->info->view)); gdk_window_thaw_updates(shell->info->view->window); shell_set_note_from_entry(entry); if (shell->view_type == SHELL_VIEW_PROGRESS || shell->view_type == SHELL_VIEW_PROGRESS_DUAL) { update_progress(); } #if GTK_CHECK_VERSION(2,12,0) if (ngroups == 1) { gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(shell->info->view), FALSE); } else { gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(shell->info->view), TRUE); } #endif g_strfreev(groups); g_key_file_free(key_file); g_free(key_data); } static void info_selected_show_extra(gchar * data) { GtkTreeStore *store; store = GTK_TREE_STORE(shell->moreinfo->model); gtk_tree_store_clear(store); if (!shell->selected->morefunc) return; if (data) { GKeyFile *key_file = g_key_file_new(); gchar *key_data = shell->selected->morefunc(data); gchar **groups; gint i; g_key_file_load_from_data(key_file, key_data, strlen(key_data), 0, NULL); groups = g_key_file_get_groups(key_file, NULL); for (i = 0; groups[i]; i++) { gchar *group = groups[i]; gchar **keys = g_key_file_get_keys(key_file, group, NULL, NULL); moreinfo_handle_normal(key_file, group, keys); } gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->moreinfo->view)); g_strfreev(groups); g_key_file_free(key_file); g_free(key_data); } } static void module_selected(gpointer data) { ShellTree *shelltree = shell->tree; GtkTreeModel *model = GTK_TREE_MODEL(shelltree->model); GtkTreeIter parent; ShellModuleEntry *entry; static ShellModuleEntry *current = NULL; static gboolean updating = FALSE; /* Gets the currently selected item on the left-side TreeView; if there is no selection, silently return */ if (!gtk_tree_selection_get_selected (shelltree->selection, &model, &parent)) { return; } /* Mark the currently selected module as "unselected"; this is used to kill the update timeout. */ if (current) { current->selected = FALSE; } if (updating) { return; } else { updating = TRUE; } /* Get the current selection and shows its related info */ gtk_tree_model_get(model, &parent, TREE_COL_DATA, &entry, -1); if (entry && !entry->selected) { gchar *title; shell_status_set_enabled(TRUE); shell_status_update("Updating..."); entry->selected = TRUE; shell->selected = entry; module_selected_show_info(entry, FALSE); info_selected_show_extra(NULL); /* clears the more info store */ gtk_tree_view_columns_autosize(GTK_TREE_VIEW(shell->info->view)); /* urgh. why don't GTK do this when the model is cleared? */ RANGE_SET_VALUE(info, vscrollbar, 0.0); RANGE_SET_VALUE(info, hscrollbar, 0.0); RANGE_SET_VALUE(moreinfo, vscrollbar, 0.0); RANGE_SET_VALUE(moreinfo, hscrollbar, 0.0); shell_status_update("Done."); shell_status_set_enabled(FALSE); title = g_strdup_printf("%s - System Information", entry->name); gtk_window_set_title(GTK_WINDOW(shell->window), title); g_free(title); shell_action_set_enabled("RefreshAction", TRUE); shell_action_set_enabled("CopyAction", TRUE); } else { gtk_window_set_title(GTK_WINDOW(shell->window), "System Information"); shell_action_set_enabled("RefreshAction", FALSE); shell_action_set_enabled("CopyAction", FALSE); gtk_tree_store_clear(GTK_TREE_STORE(shell->info->model)); set_view_type(SHELL_VIEW_NORMAL, FALSE); } current = entry; updating = FALSE; } static void info_selected(GtkTreeSelection * ts, gpointer data) { ShellInfoTree *info = (ShellInfoTree *) data; GtkTreeModel *model = GTK_TREE_MODEL(info->model); GtkTreeIter parent; gchar *datacol; if (!gtk_tree_selection_get_selected(ts, &model, &parent)) return; gtk_tree_model_get(model, &parent, INFO_TREE_COL_DATA, &datacol, -1); info_selected_show_extra(datacol); gtk_tree_view_columns_autosize(GTK_TREE_VIEW(shell->moreinfo->view)); } static ShellInfoTree *info_tree_new(gboolean extra) { ShellInfoTree *info; GtkWidget *treeview, *scroll; GtkTreeModel *model; GtkTreeStore *store; GtkTreeViewColumn *column; GtkCellRenderer *cr_text, *cr_pbuf, *cr_progress; GtkTreeSelection *sel; info = g_new0(ShellInfoTree, 1); scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); store = gtk_tree_store_new(INFO_TREE_NCOL, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_FLOAT, G_TYPE_STRING, G_TYPE_STRING); model = GTK_TREE_MODEL(store); treeview = gtk_tree_view_new_with_model(model); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(treeview), TRUE); info->col_progress = column = gtk_tree_view_column_new(); gtk_tree_view_column_set_visible(column, FALSE); gtk_tree_view_column_set_min_width(column, 240); gtk_tree_view_column_set_clickable(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); cr_progress = gtk_cell_renderer_progress_new(); gtk_tree_view_column_pack_start(column, cr_progress, TRUE); gtk_tree_view_column_add_attribute(column, cr_progress, "value", INFO_TREE_COL_PROGRESS); gtk_tree_view_column_add_attribute(column, cr_progress, "text", INFO_TREE_COL_VALUE); gtk_tree_view_column_set_visible(column, FALSE); info->col_textvalue = column = gtk_tree_view_column_new(); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); gtk_tree_view_column_set_clickable(column, TRUE); cr_pbuf = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE); gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf", INFO_TREE_COL_PBUF); cr_text = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, cr_text, TRUE); gtk_tree_view_column_add_attribute(column, cr_text, "markup", INFO_TREE_COL_NAME); info->col_extra1 = column = gtk_tree_view_column_new(); gtk_tree_view_column_set_visible(column, FALSE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); gtk_tree_view_column_set_clickable(column, TRUE); cr_text = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, cr_text, FALSE); gtk_tree_view_column_add_attribute(column, cr_text, "markup", INFO_TREE_COL_EXTRA1); info->col_extra2 = column = gtk_tree_view_column_new(); gtk_tree_view_column_set_visible(column, FALSE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); gtk_tree_view_column_set_clickable(column, TRUE); cr_text = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, cr_text, FALSE); gtk_tree_view_column_add_attribute(column, cr_text, "markup", INFO_TREE_COL_EXTRA2); info->col_value = column = gtk_tree_view_column_new(); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); gtk_tree_view_column_set_clickable(column, TRUE); cr_text = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, cr_text, FALSE); gtk_tree_view_column_add_attribute(column, cr_text, "markup", INFO_TREE_COL_VALUE); sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); if (!extra) g_signal_connect(G_OBJECT(sel), "changed", (GCallback) info_selected, info); gtk_container_add(GTK_CONTAINER(scroll), treeview); info->scroll = scroll; info->view = treeview; info->model = model; info->selection = sel; gtk_widget_show_all(scroll); return info; } static ShellTree *tree_new() { ShellTree *shelltree; GtkWidget *treeview, *scroll; GtkTreeModel *model; GtkTreeStore *store; GtkCellRenderer *cr_text, *cr_pbuf; GtkTreeViewColumn *column; GtkTreeSelection *sel; shelltree = g_new0(ShellTree, 1); scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); store = gtk_tree_store_new(TREE_NCOL, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN); model = GTK_TREE_MODEL(store); treeview = gtk_tree_view_new_with_model(model); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); column = gtk_tree_view_column_new(); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); cr_pbuf = gtk_cell_renderer_pixbuf_new(); cr_text = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE); gtk_tree_view_column_pack_start(column, cr_text, TRUE); gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf", TREE_COL_PBUF); gtk_tree_view_column_add_attribute(column, cr_text, "markup", TREE_COL_NAME); sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); g_signal_connect(G_OBJECT(sel), "changed", (GCallback) module_selected, NULL); gtk_container_add(GTK_CONTAINER(scroll), treeview); shelltree->scroll = scroll; shelltree->view = treeview; shelltree->model = model; shelltree->modules = NULL; shelltree->selection = sel; gtk_widget_show_all(scroll); return shelltree; } hardinfo-0.5.1/shell.h0000644000175000017500000001125111166403363013562 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 __SHELL_H__ #define __SHELL_H__ #include #include typedef struct _Shell Shell; typedef struct _ShellTree ShellTree; typedef struct _ShellInfoTree ShellInfoTree; typedef struct _ShellNote ShellNote; typedef struct _ShellModule ShellModule; typedef struct _ShellModuleMethod ShellModuleMethod; typedef struct _ShellModuleEntry ShellModuleEntry; typedef struct _ShellFieldUpdate ShellFieldUpdate; typedef struct _ShellFieldUpdateSource ShellFieldUpdateSource; typedef enum { SHELL_ORDER_DESCENDING, SHELL_ORDER_ASCENDING, } ShellOrderType; typedef enum { SHELL_PACK_RESIZE = 1 << 0, SHELL_PACK_SHRINK = 1 << 1 } ShellPackOptions; typedef enum { SHELL_VIEW_NORMAL, SHELL_VIEW_DUAL, SHELL_VIEW_LOAD_GRAPH, SHELL_VIEW_PROGRESS, SHELL_VIEW_PROGRESS_DUAL, SHELL_VIEW_N_VIEWS } ShellViewType; typedef enum { TREE_COL_PBUF, TREE_COL_NAME, TREE_COL_DATA, TREE_COL_SEL, TREE_NCOL } ShellTreeColumns; typedef enum { INFO_TREE_COL_NAME, INFO_TREE_COL_VALUE, INFO_TREE_COL_DATA, INFO_TREE_COL_PBUF, INFO_TREE_COL_PROGRESS, INFO_TREE_COL_EXTRA1, INFO_TREE_COL_EXTRA2, INFO_TREE_NCOL } ShellInfoTreeColumns; struct _Shell { GtkWidget *window, *vbox; GtkWidget *status, *progress; GtkWidget *notebook; GtkWidget *hpaned, *vpaned; ShellTree *tree; ShellInfoTree *info, *moreinfo; ShellModuleEntry *selected; ShellNote *note; LoadGraph *loadgraph; GtkActionGroup *action_group; GtkUIManager *ui_manager; ShellViewType view_type; gboolean normalize_percentage; gint _pulses; ShellOrderType _order_type; }; struct _ShellTree { GtkWidget *scroll; GtkWidget *view; GtkTreeModel *model; GtkTreeSelection *selection; GSList *modules; }; struct _ShellInfoTree { GtkWidget *scroll; GtkWidget *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeViewColumn *col_progress, *col_value, *col_extra1, *col_extra2, *col_textvalue; }; struct _ShellNote { GtkWidget *frame; GtkWidget *label; }; struct _ShellModule { gchar *name; GdkPixbuf *icon; GModule *dll; guchar weight; GSList *entries; }; struct _ShellModuleMethod { gchar *name; gpointer function; }; struct _ShellModuleEntry { gchar *name; GdkPixbuf *icon; gboolean selected; gint number; gchar *(*func) (); void (*scan_func) (); gchar *(*fieldfunc) (gchar * entry); gchar *(*morefunc) (gchar * entry); gchar *(*notefunc) (gint entry); }; struct _ShellFieldUpdate { ShellModuleEntry *entry; gchar *field_name; }; struct _ShellFieldUpdateSource { guint source_id; ShellFieldUpdate *sfu; }; void shell_init(GSList *modules); void shell_do_reload(void); Shell *shell_get_main_shell(); void shell_action_set_enabled(const gchar *action_name, gboolean setting); gboolean shell_action_get_enabled(const gchar *action_name); gboolean shell_action_get_active(const gchar *action_name); void shell_action_set_active(const gchar *action_name, gboolean setting); void shell_action_set_property(const gchar *action_name, const gchar *property, gboolean setting); void shell_set_side_pane_visible(gboolean setting); void shell_set_note_from_entry(ShellModuleEntry *entry); void shell_ui_manager_set_visible(const gchar *path, gboolean setting); void shell_status_update(const gchar *message); void shell_status_pulse(void); void shell_status_set_percentage(gint percentage); void shell_status_set_enabled(gboolean setting); void shell_view_set_enabled(gboolean setting); #endif /* __SHELL_H__ */ hardinfo-0.5.1/hardinfo.desktop0000644000175000017500000000033611166403363015471 0ustar agneyagney[Desktop Entry] Name=System Profiler and Benchmark Name[pt_BR]=Informações e Testes do Sistema Exec=hardinfo Icon=/usr/share/hardinfo/pixmaps/logo.png Terminal=false Type=Application StartupNotify=true Categories=System;hardinfo-0.5.1/uidefs.h0000644000175000017500000000372211166403363013736 0ustar agneyagney#ifndef __UIDEFS_H__ #define __UIDEFS_H__ char *uidefs_str = "" \ " " \ " " \ /*" " \ " " \ " " \*/ " " \ /*" " \ */ " " \ /* * Save Image is not ready for prime time. Yet. * "" \ */ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ " " \ ""; #endif /* __UIDEFS_H__ */ hardinfo-0.5.1/stock.c0000644000175000017500000000504611166403363013576 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 #include #include #include static struct { gchar *filename; gchar *stock_id; } stock_icons[] = { { "report.png", HI_STOCK_REPORT}, { "internet.png", HI_STOCK_INTERNET}, { "module.png", HI_STOCK_MODULE}, { "about-modules.png", HI_STOCK_ABOUT_MODULES}, { "syncmanager-small.png", HI_STOCK_SYNC_MENU}, { "face-grin.png", HI_STOCK_DONATE}, }; static GtkIconFactory *icon_factory; void stock_icon_register(gchar * filename, gchar * stock_id) { GtkIconSet *icon_set; GtkIconSource *icon_source; icon_set = gtk_icon_set_new(); icon_source = gtk_icon_source_new(); gtk_icon_source_set_pixbuf(icon_source, icon_cache_get_pixbuf(filename)); gtk_icon_set_add_source(icon_set, icon_source); gtk_icon_source_free(icon_source); gtk_icon_factory_add(icon_factory, stock_id, icon_set); gtk_icon_set_unref(icon_set); } void stock_icon_register_pixbuf(GdkPixbuf * pixbuf, gchar * stock_id) { GtkIconSet *icon_set; GtkIconSource *icon_source; icon_set = gtk_icon_set_new(); icon_source = gtk_icon_source_new(); gtk_icon_source_set_pixbuf(icon_source, pixbuf); gtk_icon_set_add_source(icon_set, icon_source); gtk_icon_source_free(icon_source); gtk_icon_factory_add(icon_factory, stock_id, icon_set); gtk_icon_set_unref(icon_set); } void stock_icons_init(void) { gint i; guint n_stock_icons = G_N_ELEMENTS(stock_icons); DEBUG("initializing stock icons"); icon_factory = gtk_icon_factory_new(); for (i = 0; i < n_stock_icons; i++) { stock_icon_register(stock_icons[i].filename, stock_icons[i].stock_id); } gtk_icon_factory_add_default(icon_factory); g_object_unref(icon_factory); } hardinfo-0.5.1/stock.h0000644000175000017500000000244311166403363013601 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 __STOCK_H__ #define __STOCK_H__ #define HI_STOCK_REPORT "hi-stock-report" #define HI_STOCK_INTERNET "hi-stock-internet" #define HI_STOCK_MODULE "hi-stock-module" #define HI_STOCK_ABOUT_MODULES "hi-stock-about-modules" #define HI_STOCK_SYNC_MENU "hi-stock-sync-menu" #define HI_STOCK_DONATE "hi-stock-donate" void stock_icons_init(void); void stock_icon_register(gchar *filename, gchar *stock_id); void stock_icon_register_pixbuf(GdkPixbuf *pixbuf, gchar *stock_id); #endif /* __STOCK_H__ */ hardinfo-0.5.1/computer.c0000644000175000017500000002366311166403363014316 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2008 Leandro A. F. Pereira * * 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 #include #include #include #include #include #include #include #include #include #include #include /* Callbacks */ gchar *callback_summary(); gchar *callback_os(); gchar *callback_modules(); gchar *callback_boots(); gchar *callback_locales(); gchar *callback_fs(); gchar *callback_display(); gchar *callback_network(); gchar *callback_users(); gchar *callback_env_var(); /* 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_env_var(gboolean reload); static ModuleEntry entries[] = { {"Summary", "summary.png", callback_summary, scan_summary}, {"Operating System", "os.png", callback_os, scan_os}, {"Kernel Modules", "module.png", callback_modules, scan_modules}, {"Boots", "boot.png", callback_boots, scan_boots}, {"Languages", "language.png", callback_locales, scan_locales}, {"Filesystems", "dev_removable.png", callback_fs, scan_fs}, {"Display", "monitor.png", callback_display, scan_display}, {"Environment Variables", "environment.png", callback_env_var, scan_env_var}, {"Users", "users.png", callback_users, scan_users}, {NULL}, }; #include "computer.h" static GHashTable *moreinfo = NULL; static gchar *module_list = NULL; static Computer *computer = NULL; #include #include #include #include #include #include #include #include #include #include #include #include gchar *hi_more_info(gchar * entry) { gchar *info = (gchar *) g_hash_table_lookup(moreinfo, 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 { tmp = g_strdup(""); } 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(); } gchar *callback_summary() { gchar *processor_name, *alsa_cards, *input_devices, *printers, *storage_devices, *summary; processor_name = module_call_method("devices::getProcessorName"); alsa_cards = computer_get_alsacards(computer); input_devices = module_call_method("devices::getInputDevices"); printers = module_call_method("devices::getPrinters"); storage_devices = module_call_method("devices::getStorageDevices"); summary = g_strdup_printf("[$ShellParam$]\n" "UpdateInterval$Memory=1000\n" "UpdateInterval$Date/Time=1000\n" "#ReloadInterval=5000\n" "[Computer]\n" "Processor=%s\n" "Memory=...\n" "Operating System=%s\n" "User Name=%s\n" "Date/Time=...\n" "[Display]\n" "Resolution=%dx%d pixels\n" "OpenGL Renderer=%s\n" "X11 Vendor=%s\n" "[Multimedia]\n" "\n%s\n" "[Input Devices]\n%s\n" "\n%s\n" "\n%s\n", processor_name, computer->os->distro, computer->os->username, computer->display->width, computer->display->height, computer->display->ogl_renderer, computer->display->vendor, alsa_cards, input_devices, printers, storage_devices); g_free(processor_name); g_free(alsa_cards); g_free(input_devices); g_free(printers); g_free(storage_devices); return summary; } gchar *callback_os() { return g_strdup_printf("[$ShellParam$]\n" "UpdateInterval$Uptime=10000\n" "UpdateInterval$Load Average=1000\n" "[Version]\n" "Kernel=%s\n" "Compiled=%s\n" "C Library=%s\n" "Default C Compiler=%s\n" "Distribution=%s\n" "[Current Session]\n" "Computer Name=%s\n" "User Name=%s\n" "#Language=%s\n" "Home Directory=%s\n" "Desktop Environment=%s\n" "[Misc]\n" "Uptime=...\n" "Load Average=...", computer->os->kernel, computer->os->compiled_date, computer->os->libc, computer->os->gcc, computer->os->distro, computer->os->hostname, computer->os->username, computer->os->language, computer->os->homedir, computer->os->desktop); } gchar *callback_modules() { return g_strdup_printf("[Loaded Modules]\n" "%s" "[$ShellParam$]\n" "ViewType=1\n" "ColumnTitle$TextValue=Name\n" "ColumnTitle$Value=Description\n" "ShowColumnHeaders=true\n", module_list); } gchar *callback_boots() { return g_strdup_printf("[$ShellParam$]\n" "ColumnTitle$TextValue=Date & Time\n" "ColumnTitle$Value=Kernel Version\n" "ShowColumnHeaders=true\n" "\n" "%s", computer->os->boots); } gchar *callback_locales() { return g_strdup_printf("[$ShellParam$]\n" "ViewType=1\n" "ColumnTitle$TextValue=Language Code\n" "ColumnTitle$Value=Name\n" "ShowColumnHeaders=true\n" "[Available Languages]\n" "%s", computer->os->languages); } gchar *callback_fs() { return g_strdup_printf("[$ShellParam$]\n" "ViewType=4\n" "ReloadInterval=5000\n" "Zebra=1\n" "NormalizePercentage=false\n" "ColumnTitle$Extra1=Mount Point\n" "ColumnTitle$Progress=Usage\n" "ColumnTitle$TextValue=Device\n" "ShowColumnHeaders=true\n" "[Mounted File Systems]\n%s\n", fs_list); } gchar *callback_display() { return g_strdup_printf("[Display]\n" "Resolution=%dx%d pixels\n" "Vendor=%s\n" "Version=%s\n" "[Monitors]\n" "%s" "[Extensions]\n" "%s" "[OpenGL]\n" "Vendor=%s\n" "Renderer=%s\n" "Version=%s\n" "Direct Rendering=%s\n", computer->display->width, computer->display->height, computer->display->vendor, computer->display->version, computer->display->monitors, computer->display->extensions, computer->display->ogl_vendor, computer->display->ogl_renderer, computer->display->ogl_version, computer->display->dri ? "Yes" : "No"); } gchar *callback_users() { return g_strdup_printf("[$ShellParam$]\n" "ReloadInterval=10000\n" "ViewType=1\n" "[Users]\n" "%s\n", users); } gchar *get_os_kernel(void) { scan_os(FALSE); return computer->os->kernel; } 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 g_strdup(module); } return g_strdup(description); } ShellModuleMethod *hi_exported_methods(void) { static ShellModuleMethod m[] = { {"getOSKernel", get_os_kernel}, {"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; } void hi_module_init(void) { computer = g_new0(Computer, 1); moreinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); } ModuleAbout *hi_module_get_about(void) { static ModuleAbout ma[] = { { .author = "Leandro A. F. Pereira", .description = "Gathers high-level computer information", .version = VERSION, .license = "GNU GPL version 2"} }; return ma; } hardinfo-0.5.1/computer.h0000644000175000017500000001130611166403363014312 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 __COMPUTER_H__ #define __COMPUTER_H__ #define DB_PREFIX "/etc/" static struct { gchar *file, *codename; } distro_db[] = { { 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 "puppyversion", "ppy" }, { DB_PREFIX "distro-release", "fl" }, /* * 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" }, { NULL, NULL } }; typedef struct _Computer Computer; typedef struct _OperatingSystem OperatingSystem; typedef struct _MemoryInfo MemoryInfo; typedef struct _UptimeInfo UptimeInfo; typedef struct _LoadInfo LoadInfo; typedef struct _DisplayInfo DisplayInfo; typedef struct _AlsaInfo AlsaInfo; typedef struct _AlsaCard AlsaCard; typedef struct _FileSystem FileSystem; typedef struct _FileSystemEntry FileSystemEntry; struct _AlsaCard { gchar *alsa_name; gchar *friendly_name; /* gchar *board; gchar revision, compat_class; gint subsys_vendorid, subsys_id; gint cap_dac_res, cap_adc_res; gboolean cap_3d_enh; gint curr_mic_gain; gboolean curr_3d_enh, curr_loudness, curr_simstereo; gchar *curr_mic_select; */ }; struct _AlsaInfo { GSList *cards; }; struct _DisplayInfo { gchar *ogl_vendor, *ogl_renderer, *ogl_version; gboolean dri; gchar *display_name, *vendor, *version; gchar *extensions; gchar *monitors; gint width, height; }; struct _LoadInfo { float load1, load5, load15; }; struct _UptimeInfo { int days, hours, minutes; }; struct _Computer { MemoryInfo *memory; OperatingSystem *os; DisplayInfo *display; AlsaInfo *alsa; gchar *date_time; }; struct _Processor { gchar *model_name; gchar *vendor_id; gchar *flags; gint cache_size; gfloat bogomips, cpu_mhz; gchar *has_fpu; gchar *bug_fdiv, *bug_hlt, *bug_f00f, *bug_coma; gint model, family, stepping; gchar *strmodel; gint id; }; struct _OperatingSystem { gchar *kernel; gchar *libc; gchar *gcc; gchar *distrocode, *distro; gchar *hostname; gchar *language; gchar *homedir; gchar *compiled_date; gchar *languages; gchar *desktop; gchar *username; gchar *boots; }; struct _MemoryInfo { gint total, used, free, cached; gfloat ratio; }; #define get_str(field_name,ptr) \ if (g_str_has_prefix(tmp[0], field_name)) { \ ptr = g_strdup(tmp[1]); \ g_strfreev(tmp); \ continue; \ } #define get_int(field_name,ptr) \ if (g_str_has_prefix(tmp[0], field_name)) { \ ptr = atoi(tmp[1]); \ g_strfreev(tmp); \ continue; \ } #define get_float(field_name,ptr) \ if (g_str_has_prefix(tmp[0], field_name)) { \ ptr = atof(tmp[1]); \ g_strfreev(tmp); \ continue; \ } #endif /* __COMPUTER_H__ */ hardinfo-0.5.1/vendor.c0000644000175000017500000001505011166403363013744 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2009 Leandro A. F. Pereira * * List of vendors based on GtkSysInfo (c) Pissens Sebastien. * * 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 #include #include "vendor.h" #include "syncmanager.h" #include "config.h" #include "hardinfo.h" static const Vendor vendors[] = { {"ATI", "ATI Technologies", "www.ati.com"}, {"nVidia", "NVIDIA", "www.nvidia.com"}, {"3Com", "3Com", "www.3com.com"}, {"Intel", "Intel", "www.intel.com"}, {"Cirrus Logic", "Cirrus Logic", "www.cirrus.com"}, {"VIA Technologies", "VIA Technologies", "www.via.com.tw"}, {"VIA", "VIA Technologies", "www.via.com.tw"}, {"hp", "Hewlett-Packard", "www.hp.com"}, {"NEC Corporation", "NEC Coporation", "www.nec.com"}, {"MAXTOR", "MAXTOR", "www.maxtor.com"}, {"SAMSUNG", "SAMSUNG", "www.samsung.com"}, {"PIONEER", "PIONEER", "www.pioneer-eur.com"}, {"PLEXTOR", "PLEXTOR", "www.plextor.be"}, {"Realtek Semiconductor", "Realtek", "www.realtek.com.tw"}, {"TOSHIBA", "TOSHIBA", "www.toshiba.com"}, {"LITE-ON", "LITE-ON", "www.liteonit.com"}, {"WDC", "Western Digital", "www.wdc.com"}, {"HL-DT-ST", "LG Electronics", "www.lge.com"}, {"ST", "SEAGATE", "www.seagate.com"}, {"Lexmark", "Lexmark", "www.lexmark.com"}, {"_NEC", "NEC Corporation", "www.nec.com"}, {"Creative Labs", "Creative Labs", "www.creative.com"}, {"Brooktree", "Conexant", "www.brooktree.com"}, {"Atheros", "Atheros Communications", "www.atheros.com"}, {"MATSHITA", "Panasonic", "www.panasonic.com"}, {"Silicon Image", "Silicon Image", "www.siliconimage.com"}, {"Silicon Integrated Image", "Silicon Image", "www.siliconimage.com"}, {"KYE", "KYE Systems", "www.genius-kye.com"}, {"Broadcom", "Broadcom", "www.broadcom.com"}, {"Apple", "Apple", "www.apple.com"}, {"IBM", "IBM", "www.ibm.com"}, {"Dell", "Dell Computer", "www.dell.com"}, {"Logitech", "Logitech International", "www.logitech.com"}, {"FUJITSU", "Fujitsu", "www.fujitsu.com"}, {"CDU", "Sony", "www.sony.com"}, {"SanDisk", "SanDisk", "www.sandisk.com"}, {"ExcelStor", "ExcelStor Technology", "www.excelstor.com"}, {"D-Link", "D-Link", "www.dlink.com.tw"}, {"Giga-byte", "Gigabyte Technology", "www.gigabyte.com.tw"}, {"Gigabyte", "Gigabyte Technology", "www.gigabyte.com.tw"}, {"C-Media", "C-Media Electronics", "www.cmedia.com.tw"}, {"Avermedia", "AVerMedia Technologies", "www.aver.com"}, {"Philips", "Philips", "www.philips.com"}, {"RaLink", "Ralink Technology", "www.ralinktech.com"}, {"Siemens", "Siemens AG", "www.siemens.com"}, {"HP", "Hewlett-Packard", "www.hp.com"}, {"Hewlett-Packard", "Hewlett-Packard", "www.hp.com"}, {"TEAC", "TEAC America", "www.teac.com"}, {"Microsoft", "Microsoft", "www.microsoft.com"}, {"Memorex", "Memorex Products", "www.memorex.com"}, {"eMPIA", "eMPIA Technology", "www.empiatech.com.tw"}, {"Canon", "Canon", "www.canon.com"}, {"A4Tech", "A4tech", "www.a4tech.com"}, {"ALCOR", "Alcor", "www.alcor.org"}, {"Vimicro", "Vimicro", "www.vimicro.com"}, {"OTi", "Ours Technology", "www.oti.com.tw"}, {"BENQ", "BenQ", "www.benq.com"}, {"Acer", "Acer", "www.acer.com"}, /* BIOS manufacturers */ {"American Megatrends", "American Megatrends", "www.ami.com"}, {"Award", "Award Software International", "www.award-bios.com"}, {"Phoenix", "Phoenix Technologies", "www.phoenix.com"}, }; static GSList *vendor_list = NULL; void vendor_init(void) { gint i; gchar *path; static SyncEntry se = { .fancy_name = "Update vendor list", .name = "RecvVendorList", .save_to = "vendor.conf", .get_data = NULL }; DEBUG("initializing vendor list"); sync_manager_add_entry(&se); path = g_build_filename(g_get_home_dir(), ".hardinfo", "vendor.conf", NULL); if (!g_file_test(path, G_FILE_TEST_EXISTS)) { DEBUG("local vendor.conf not found, trying system-wise"); g_free(path); path = g_build_filename(params.path_data, "vendor.conf", NULL); } if (g_file_test(path, G_FILE_TEST_EXISTS)) { GKeyFile *vendors; gchar *tmp; gint num_vendors; DEBUG("loading %s", path); vendors = g_key_file_new(); if (g_key_file_load_from_file(vendors, path, 0, NULL)) { num_vendors = g_key_file_get_integer(vendors, "vendors", "number", NULL); for (i = num_vendors - 1; i >= 0; i--) { Vendor *v = g_new0(Vendor, 1); tmp = g_strdup_printf("vendor%d", i); v->id = g_key_file_get_string(vendors, tmp, "id", NULL); v->name = g_key_file_get_string(vendors, tmp, "name", NULL); v->url = g_key_file_get_string(vendors, tmp, "url", NULL); vendor_list = g_slist_prepend(vendor_list, v); g_free(tmp); } } g_key_file_free(vendors); } else { DEBUG("system-wise vendor.conf not found, using internal database"); for (i = G_N_ELEMENTS(vendors) - 1; i >= 0; i--) { vendor_list = g_slist_prepend(vendor_list, (gpointer) &vendors[i]); } } g_free(path); } const gchar *vendor_get_name(const gchar * id) { GSList *vendor; int i; if (!id) { return NULL; } for (vendor = vendor_list; vendor; vendor = vendor->next) { Vendor *v = (Vendor *)vendor->data; if (v && v->id && strstr(id, v->id)) { return g_strdup(v->name); } } return id; } const gchar *vendor_get_url(const gchar * id) { GSList *vendor; int i; if (!id) { return NULL; } for (vendor = vendor_list; vendor; vendor = vendor->next) { Vendor *v = (Vendor *)vendor->data; if (v && v->id && strstr(id, v->id)) { return g_strdup(v->url); } } return NULL; } hardinfo-0.5.1/vendor.h0000644000175000017500000000210111166403363013742 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 __VENDOR_H__ #define __VENDOR_H__ typedef struct _Vendor Vendor; struct _Vendor { char *id; char *name; char *url; }; void vendor_init(void); const gchar *vendor_get_name(const gchar *id); const gchar *vendor_get_url(const gchar *id); #endif /* __VENDOR_H__ */ hardinfo-0.5.1/binreloc.c0000644000175000017500000004227111166403363014251 0ustar agneyagney/* * BinReloc - a library for creating relocatable executables * Written by: Hongli Lai * http://autopackage.org/ * * This source code is public domain. You can relicense this code * under whatever license you want. * * See http://autopackage.org/docs/binreloc/ for * more information and how to use this. */ #ifndef __BINRELOC_C__ #define __BINRELOC_C__ #include #include #include #include #include #include #include #include "binreloc.h" #include "config.h" G_BEGIN_DECLS /** @internal * Find the canonical filename of the executable. Returns the filename * (which must be freed) or NULL on error. If the parameter 'error' is * not NULL, the error code will be stored there, if an error occured. */ static char *_br_find_exe(GbrInitError * error) { char *path, *path2, *line, *result; size_t buf_size; ssize_t size; struct stat stat_buf; FILE *f; /* Read from /proc/self/exe (symlink) */ if (sizeof(path) > SSIZE_MAX) buf_size = SSIZE_MAX - 1; else buf_size = PATH_MAX - 1; path = (char *) g_try_malloc(buf_size); if (path == NULL) { /* Cannot allocate memory. */ if (error) *error = GBR_INIT_ERROR_NOMEM; return NULL; } path2 = (char *) g_try_malloc(buf_size); if (path2 == NULL) { /* Cannot allocate memory. */ if (error) *error = GBR_INIT_ERROR_NOMEM; g_free(path); return NULL; } strncpy(path2, "/proc/self/exe", buf_size - 1); while (1) { int i; size = readlink(path2, path, buf_size - 1); if (size == -1) { /* Error. */ g_free(path2); break; } /* readlink() success. */ path[size] = '\0'; /* Check whether the symlink's target is also a symlink. * We want to get the final target. */ i = stat(path, &stat_buf); if (i == -1) { /* Error. */ g_free(path2); break; } /* stat() success. */ if (!S_ISLNK(stat_buf.st_mode)) { /* path is not a symlink. Done. */ g_free(path2); return path; } /* path is a symlink. Continue loop and resolve this. */ strncpy(path, path2, buf_size - 1); } /* readlink() or stat() failed; this can happen when the program is * running in Valgrind 2.2. Read from /proc/self/maps as fallback. */ buf_size = PATH_MAX + 128; line = (char *) g_try_realloc(path, buf_size); if (line == NULL) { /* Cannot allocate memory. */ g_free(path); if (error) *error = GBR_INIT_ERROR_NOMEM; return NULL; } f = fopen("/proc/self/maps", "r"); if (f == NULL) { g_free(line); if (error) *error = GBR_INIT_ERROR_OPEN_MAPS; return NULL; } /* The first entry should be the executable name. */ result = fgets(line, (int) buf_size, f); if (result == NULL) { fclose(f); g_free(line); if (error) *error = GBR_INIT_ERROR_READ_MAPS; return NULL; } /* Get rid of newline character. */ buf_size = strlen(line); if (buf_size <= 0) { /* Huh? An empty string? */ fclose(f); g_free(line); if (error) *error = GBR_INIT_ERROR_INVALID_MAPS; return NULL; } if (line[buf_size - 1] == 10) line[buf_size - 1] = 0; /* Extract the filename; it is always an absolute path. */ path = strchr(line, '/'); /* Sanity check. */ if (strstr(line, " r-xp ") == NULL || path == NULL) { fclose(f); g_free(line); if (error) *error = GBR_INIT_ERROR_INVALID_MAPS; return NULL; } path = g_strdup(path); g_free(line); fclose(f); return path; } /** @internal * Find the canonical filename of the executable which owns symbol. * Returns a filename which must be freed, or NULL on error. */ static char *_br_find_exe_for_symbol(const void *symbol, GbrInitError * error) { #define SIZE PATH_MAX + 100 FILE *f; size_t address_string_len; char *address_string, line[SIZE], *found; if (symbol == NULL) return (char *) NULL; f = fopen("/proc/self/maps", "r"); if (f == NULL) return (char *) NULL; address_string_len = 4; address_string = (char *) g_try_malloc(address_string_len); found = (char *) NULL; while (!feof(f)) { char *start_addr, *end_addr, *end_addr_end, *file; void *start_addr_p, *end_addr_p; size_t len; if (fgets(line, SIZE, f) == NULL) break; /* Sanity check. */ if (strstr(line, " r-xp ") == NULL || strchr(line, '/') == NULL) continue; /* Parse line. */ start_addr = line; end_addr = strchr(line, '-'); file = strchr(line, '/'); /* More sanity check. */ if (!(file > end_addr && end_addr != NULL && end_addr[0] == '-')) continue; end_addr[0] = '\0'; end_addr++; end_addr_end = strchr(end_addr, ' '); if (end_addr_end == NULL) continue; end_addr_end[0] = '\0'; len = strlen(file); if (len == 0) continue; if (file[len - 1] == '\n') file[len - 1] = '\0'; /* Get rid of "(deleted)" from the filename. */ len = strlen(file); if (len > 10 && strcmp(file + len - 10, " (deleted)") == 0) file[len - 10] = '\0'; /* I don't know whether this can happen but better safe than sorry. */ len = strlen(start_addr); if (len != strlen(end_addr)) continue; /* Transform the addresses into a string in the form of 0xdeadbeef, * then transform that into a pointer. */ if (address_string_len < len + 3) { address_string_len = len + 3; address_string = (char *) g_try_realloc(address_string, address_string_len); } memcpy(address_string, "0x", 2); memcpy(address_string + 2, start_addr, len); address_string[2 + len] = '\0'; sscanf(address_string, "%p", &start_addr_p); memcpy(address_string, "0x", 2); memcpy(address_string + 2, end_addr, len); address_string[2 + len] = '\0'; sscanf(address_string, "%p", &end_addr_p); if (symbol >= start_addr_p && symbol < end_addr_p) { found = file; break; } } g_free(address_string); fclose(f); if (found == NULL) return (char *) NULL; else return g_strdup(found); } static gchar *exe = NULL; static void set_gerror(GError ** error, GbrInitError errcode); /** Initialize the BinReloc library (for applications). * * This function must be called before using any other BinReloc functions. * It attempts to locate the application's canonical filename. * * @note If you want to use BinReloc for a library, then you should call * gbr_init_lib() instead. * * @param error If BinReloc failed to initialize, then the error report will * be stored in this variable. Set to NULL if you don't want an * error report. See the #GbrInitError for a list of error * codes. * * @returns TRUE on success, FALSE if BinReloc failed to initialize. */ gboolean gbr_init(GError ** error) { GbrInitError errcode = 0; /* Locate the application's filename. */ exe = _br_find_exe(&errcode); if (exe != NULL) /* Success! */ return TRUE; else { /* Failed :-( */ set_gerror(error, errcode); return FALSE; } } /** Initialize the BinReloc library (for libraries). * * This function must be called before using any other BinReloc functions. * It attempts to locate the calling library's canonical filename. * * @note The BinReloc source code MUST be included in your library, or this * function won't work correctly. * * @returns TRUE on success, FALSE if a filename cannot be found. */ gboolean gbr_init_lib(GError ** error) { GbrInitError errcode = 0; exe = _br_find_exe_for_symbol((const void *) "", &errcode); if (exe != NULL) /* Success! */ return TRUE; else { /* Failed :-( */ set_gerror(error, errcode); return exe != NULL; } } static void set_gerror(GError ** error, GbrInitError errcode) { gchar *error_message; if (error == NULL) return; switch (errcode) { case GBR_INIT_ERROR_NOMEM: error_message = "Cannot allocate memory."; break; case GBR_INIT_ERROR_OPEN_MAPS: error_message = "Unable to open /proc/self/maps for reading."; break; case GBR_INIT_ERROR_READ_MAPS: error_message = "Unable to read from /proc/self/maps."; break; case GBR_INIT_ERROR_INVALID_MAPS: error_message = "The file format of /proc/self/maps is invalid."; break; case GBR_INIT_ERROR_DISABLED: error_message = "Binary relocation support is disabled."; break; default: error_message = "Unknown error."; break; }; g_set_error(error, g_quark_from_static_string("GBinReloc"), errcode, "%s", error_message); } /** Find the canonical filename of the current application. * * @param default_exe A default filename which will be used as fallback. * @returns A string containing the application's canonical filename, * which must be freed when no longer necessary. If BinReloc is * not initialized, or if the initialization function failed, * then a copy of default_exe will be returned. If default_exe * is NULL, then NULL will be returned. */ gchar *gbr_find_exe(const gchar * default_exe) { if (exe == NULL) { /* BinReloc is not initialized. */ if (default_exe != NULL) return g_strdup(default_exe); else return NULL; } return g_strdup(exe); } /** Locate the directory in which the current application is installed. * * The prefix is generated by the following pseudo-code evaluation: * \code * dirname(exename) * \endcode * * @param default_dir A default directory which will used as fallback. * @return A string containing the directory, which must be freed when no * longer necessary. If BinReloc is not initialized, or if the * initialization function failed, then a copy of default_dir * will be returned. If default_dir is NULL, then NULL will be * returned. */ gchar *gbr_find_exe_dir(const gchar * default_dir) { if (exe == NULL) { /* BinReloc not initialized. */ if (default_dir != NULL) return g_strdup(default_dir); else return NULL; } return g_path_get_dirname(exe); } /** Locate the prefix in which the current application is installed. * * The prefix is generated by the following pseudo-code evaluation: * \code * dirname(dirname(exename)) * \endcode * * @param default_prefix A default prefix which will used as fallback. * @return A string containing the prefix, which must be freed when no * longer necessary. If BinReloc is not initialized, or if the * initialization function failed, then a copy of default_prefix * will be returned. If default_prefix is NULL, then NULL will be * returned. */ gchar *gbr_find_prefix(const gchar * default_prefix) { gchar *dir1, *dir2; if (exe == NULL) { /* BinReloc not initialized. */ if (default_prefix != NULL) return g_strdup(default_prefix); else return NULL; } dir1 = g_path_get_dirname(exe); dir2 = g_path_get_dirname(dir1); g_free(dir1); return dir2; } /** Locate the application's binary folder. * * The path is generated by the following pseudo-code evaluation: * \code * prefix + "/bin" * \endcode * * @param default_bin_dir A default path which will used as fallback. * @return A string containing the bin folder's path, which must be freed when * no longer necessary. If BinReloc is not initialized, or if the * initialization function failed, then a copy of default_bin_dir will * be returned. If default_bin_dir is NULL, then NULL will be returned. */ gchar *gbr_find_bin_dir(const gchar * default_bin_dir) { gchar *prefix, *dir; prefix = gbr_find_prefix(NULL); if (prefix == NULL) { /* BinReloc not initialized. */ if (default_bin_dir != NULL) return g_strdup(default_bin_dir); else return NULL; } dir = g_build_filename(prefix, "bin", NULL); g_free(prefix); return dir; } /** Locate the application's superuser binary folder. * * The path is generated by the following pseudo-code evaluation: * \code * prefix + "/sbin" * \endcode * * @param default_sbin_dir A default path which will used as fallback. * @return A string containing the sbin folder's path, which must be freed when * no longer necessary. If BinReloc is not initialized, or if the * initialization function failed, then a copy of default_sbin_dir will * be returned. If default_bin_dir is NULL, then NULL will be returned. */ gchar *gbr_find_sbin_dir(const gchar * default_sbin_dir) { gchar *prefix, *dir; prefix = gbr_find_prefix(NULL); if (prefix == NULL) { /* BinReloc not initialized. */ if (default_sbin_dir != NULL) return g_strdup(default_sbin_dir); else return NULL; } dir = g_build_filename(prefix, "sbin", NULL); g_free(prefix); return dir; } /** Locate the application's data folder. * * The path is generated by the following pseudo-code evaluation: * \code * prefix + "/share" * \endcode * * @param default_data_dir A default path which will used as fallback. * @return A string containing the data folder's path, which must be freed when * no longer necessary. If BinReloc is not initialized, or if the * initialization function failed, then a copy of default_data_dir * will be returned. If default_data_dir is NULL, then NULL will be * returned. */ gchar *gbr_find_data_dir(const gchar * default_data_dir) { gchar *prefix, *dir; prefix = gbr_find_prefix(NULL); if (prefix == NULL) { /* BinReloc not initialized. */ if (default_data_dir != NULL) return g_strdup(default_data_dir); else return NULL; } dir = g_build_filename(prefix, "share", NULL); g_free(prefix); return dir; } /** Locate the application's localization folder. * * The path is generated by the following pseudo-code evaluation: * \code * prefix + "/share/locale" * \endcode * * @param default_locale_dir A default path which will used as fallback. * @return A string containing the localization folder's path, which must be freed when * no longer necessary. If BinReloc is not initialized, or if the * initialization function failed, then a copy of default_locale_dir will be returned. * If default_locale_dir is NULL, then NULL will be returned. */ gchar *gbr_find_locale_dir(const gchar * default_locale_dir) { gchar *data_dir, *dir; data_dir = gbr_find_data_dir(NULL); if (data_dir == NULL) { /* BinReloc not initialized. */ if (default_locale_dir != NULL) return g_strdup(default_locale_dir); else return NULL; } dir = g_build_filename(data_dir, "locale", NULL); g_free(data_dir); return dir; } /** Locate the application's library folder. * * The path is generated by the following pseudo-code evaluation: * \code * prefix + "/lib" * \endcode * * @param default_lib_dir A default path which will used as fallback. * @return A string containing the library folder's path, which must be freed when * no longer necessary. If BinReloc is not initialized, or if the * initialization function failed, then a copy of default_lib_dir will be returned. * If default_lib_dir is NULL, then NULL will be returned. */ gchar *gbr_find_lib_dir(const gchar * default_lib_dir) { gchar *prefix, *dir; prefix = gbr_find_prefix(NULL); if (prefix == NULL) { /* BinReloc not initialized. */ if (default_lib_dir != NULL) return g_strdup(default_lib_dir); else return NULL; } #ifdef ARCH_x86_64 dir = g_build_filename(prefix, "lib64", NULL); #else dir = g_build_filename(prefix, "lib", NULL); #endif g_free(prefix); return dir; } /** Locate the application's libexec folder. * * The path is generated by the following pseudo-code evaluation: * \code * prefix + "/libexec" * \endcode * * @param default_libexec_dir A default path which will used as fallback. * @return A string containing the libexec folder's path, which must be freed when * no longer necessary. If BinReloc is not initialized, or if the initialization * function failed, then a copy of default_libexec_dir will be returned. * If default_libexec_dir is NULL, then NULL will be returned. */ gchar *gbr_find_libexec_dir(const gchar * default_libexec_dir) { gchar *prefix, *dir; prefix = gbr_find_prefix(NULL); if (prefix == NULL) { /* BinReloc not initialized. */ if (default_libexec_dir != NULL) return g_strdup(default_libexec_dir); else return NULL; } dir = g_build_filename(prefix, "libexec", NULL); g_free(prefix); return dir; } /** Locate the application's configuration files folder. * * The path is generated by the following pseudo-code evaluation: * \code * prefix + "/etc" * \endcode * * @param default_etc_dir A default path which will used as fallback. * @return A string containing the etc folder's path, which must be freed when * no longer necessary. If BinReloc is not initialized, or if the initialization * function failed, then a copy of default_etc_dir will be returned. * If default_etc_dir is NULL, then NULL will be returned. */ gchar *gbr_find_etc_dir(const gchar * default_etc_dir) { gchar *prefix, *dir; prefix = gbr_find_prefix(NULL); if (prefix == NULL) { /* BinReloc not initialized. */ if (default_etc_dir != NULL) return g_strdup(default_etc_dir); else return NULL; } dir = g_build_filename(prefix, "etc", NULL); g_free(prefix); return dir; } G_END_DECLS #endif /* __BINRELOC_C__ */ hardinfo-0.5.1/binreloc.h0000644000175000017500000000474311166403363014260 0ustar agneyagney/* * BinReloc - a library for creating relocatable executables * Written by: Hongli Lai * http://autopackage.org/ * * This source code is public domain. You can relicense this code * under whatever license you want. * * See http://autopackage.org/docs/binreloc/ for * more information and how to use this. */ #ifndef __BINRELOC_H__ #define __BINRELOC_H__ #include G_BEGIN_DECLS /** These error codes can be returned by br_init(), br_init_lib(), gbr_init() or gbr_init_lib(). */ typedef enum { /** Cannot allocate memory. */ GBR_INIT_ERROR_NOMEM, /** Unable to open /proc/self/maps; see errno for details. */ GBR_INIT_ERROR_OPEN_MAPS, /** Unable to read from /proc/self/maps; see errno for details. */ GBR_INIT_ERROR_READ_MAPS, /** The file format of /proc/self/maps is invalid; kernel bug? */ GBR_INIT_ERROR_INVALID_MAPS, /** BinReloc is disabled (the ENABLE_BINRELOC macro is not defined). */ GBR_INIT_ERROR_DISABLED } GbrInitError; #ifndef BINRELOC_RUNNING_DOXYGEN /* Mangle symbol names to avoid symbol collisions with other ELF objects. */ #define gbr_find_exe UfUy21856259474323_gbr_find_exe #define gbr_find_exe_dir UfUy21856259474323_gbr_find_exe_dir #define gbr_find_prefix UfUy21856259474323_gbr_find_prefix #define gbr_find_bin_dir UfUy21856259474323_gbr_find_bin_dir #define gbr_find_sbin_dir UfUy21856259474323_gbr_find_sbin_dir #define gbr_find_data_dir UfUy21856259474323_gbr_find_data_dir #define gbr_find_locale_dir UfUy21856259474323_gbr_find_locale_dir #define gbr_find_lib_dir UfUy21856259474323_gbr_find_lib_dir #define gbr_find_libexec_dir UfUy21856259474323_gbr_find_libexec_dir #define gbr_find_etc_dir UfUy21856259474323_gbr_find_etc_dir #endif gboolean gbr_init (GError **error); gboolean gbr_init_lib (GError **error); gchar *gbr_find_exe (const gchar *default_exe); gchar *gbr_find_exe_dir (const gchar *default_dir); gchar *gbr_find_prefix (const gchar *default_prefix); gchar *gbr_find_bin_dir (const gchar *default_bin_dir); gchar *gbr_find_sbin_dir (const gchar *default_sbin_dir); gchar *gbr_find_data_dir (const gchar *default_data_dir); gchar *gbr_find_locale_dir (const gchar *default_locale_dir); gchar *gbr_find_lib_dir (const gchar *default_lib_dir); gchar *gbr_find_libexec_dir (const gchar *default_libexec_dir); gchar *gbr_find_etc_dir (const gchar *default_etc_dir); G_END_DECLS #endif /* __BINRELOC_H__ */ hardinfo-0.5.1/iconcache.c0000644000175000017500000000460411166403363014366 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 #include #include static GHashTable *cache = NULL; void icon_cache_init(void) { DEBUG("initializing icon cache"); if (!cache) { cache = g_hash_table_new(g_str_hash, g_str_equal); } else { DEBUG("already initialized? huh?"); } } GdkPixbuf *icon_cache_get_pixbuf(const gchar * file) { GdkPixbuf *icon; if (!cache) icon_cache_init(); icon = g_hash_table_lookup(cache, file); if (!icon) { gchar *path; path = g_build_filename(params.path_data, "pixmaps", file, NULL); icon = gdk_pixbuf_new_from_file(path, NULL); g_hash_table_insert(cache, g_strdup(file), icon); g_free(path); } if (icon) { g_object_ref(icon); } return icon; } GtkWidget *icon_cache_get_image(const gchar * file) { GdkPixbuf *icon; icon = icon_cache_get_pixbuf(file); return gtk_image_new_from_pixbuf(icon); } GdkPixbuf *icon_cache_get_pixbuf_at_size(const gchar * file, gint wid, gint hei) { GdkPixbuf *icon; if (!cache) icon_cache_init(); icon = g_hash_table_lookup(cache, file); if (!icon) { gchar *path; path = g_build_filename(params.path_data, "pixmaps", file, NULL); icon = gdk_pixbuf_new_from_file_at_size(path, wid, hei, NULL); g_hash_table_insert(cache, g_strdup(file), icon); g_free(path); } if (icon) { g_object_ref(icon); } return icon; } GtkWidget *icon_cache_get_image_at_size(const gchar * file, gint wid, gint hei) { GdkPixbuf *icon; icon = icon_cache_get_pixbuf_at_size(file, wid, hei); return gtk_image_new_from_pixbuf(icon); } hardinfo-0.5.1/iconcache.h0000644000175000017500000000226711166403363014376 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 __ICONCACHE_H__ #define __ICONCACHE_H__ #include void icon_cache_init(void); GdkPixbuf *icon_cache_get_pixbuf(const gchar *file); GtkWidget *icon_cache_get_image(const gchar *file); GdkPixbuf *icon_cache_get_pixbuf_at_size(const gchar *file, gint wid, gint hei); GtkWidget *icon_cache_get_image_at_size(const gchar *file, gint wid, gint hei); #endif /* __ICONCACHE_H__ */ hardinfo-0.5.1/modules/0000755000175000017500000000000011166403463013753 5ustar agneyagneyhardinfo-0.5.1/modules/placeholder0000644000175000017500000000000011166403363016145 0ustar agneyagneyhardinfo-0.5.1/expr.c0000644000175000017500000001263711166403363013435 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 */ /* * This is only used to compute sensor values, hence the only variable supported is '@'. * The '`' operator (ln(x)) is not available, nor multi-line formulas. */ #include #include #include #include #include #include "expr.h" #include "config.h" static MathToken *new_operator(gchar op) { MathToken *t = g_new0(MathToken, 1); t->val.op = op; t->type = TOKEN_OPERATOR; /* operator */ return t; } static MathToken *new_variable(gchar var) { MathToken *t = g_new0(MathToken, 1); t->val.op = '@'; t->type = TOKEN_VARIABLE; /* variable */ return t; } static MathToken *new_value(gfloat value) { MathToken *t = g_new0(MathToken, 1); t->val.value = value; t->type = TOKEN_VALUE; /* value */ return t; } static inline gint priority(char operation) { switch (operation) { case '^': return 3; case '*': case '/': return 2; case '+': case '-': return 1; case '(': return 0; } return 0; } GSList *math_infix_to_postfix(GSList * infix) { MathToken *stack[500]; gint t_sp = 0; GSList *postfix = NULL, *p; MathToken *top; for (p = infix; p; p = p->next) { MathToken *t = (MathToken *) p->data; if (t->type == TOKEN_OPERATOR && t->val.op == '(') { stack[++t_sp] = t; } else if (t->type == TOKEN_OPERATOR && t->val.op == ')') { for (top = stack[t_sp]; t_sp != 0 && top->val.op != '('; top = stack[t_sp]) { postfix = g_slist_append(postfix, stack[t_sp--]); } t_sp--; } else if (t->type != TOKEN_OPERATOR) { postfix = g_slist_append(postfix, t); } else if (t_sp == 0) { stack[++t_sp] = t; } else { while (t_sp != 0 && priority(t->val.op) <= priority(stack[t_sp]->val.op)) postfix = g_slist_append(postfix, stack[t_sp--]); stack[++t_sp] = t; } } while (t_sp) postfix = g_slist_append(postfix, stack[t_sp--]); return postfix; } static inline gfloat __result(gfloat op1, gfloat op2, gchar operation) { switch (operation) { case '^': return powf(op1, op2); case '+': return op1 + op2; case '-': return op1 - op2; case '/': return op1 / op2; case '*': return op1 * op2; } return 0; } gfloat math_postfix_eval(GSList * postfix, gfloat at_value) { GSList *p; gfloat stack[500]; gint sp = 0; memset(stack, 0, sizeof(gfloat) * 500); for (p = postfix; p; p = p->next) { MathToken *t = (MathToken *) p->data; if (t->type == TOKEN_VARIABLE) { stack[++sp] = at_value; } else if (t->type == TOKEN_VALUE) { stack[++sp] = t->val.value; } else { gfloat op1, op2; op2 = stack[sp--]; op1 = stack[sp]; stack[sp] = __result(op1, op2, t->val.op); } } return stack[sp]; } GSList *math_string_to_infix(gchar * string) { GSList *infix = NULL; gchar *expr = string; for (; *expr; expr++) { if (strchr("+-/*^()", *expr)) { infix = g_slist_append(infix, new_operator(*expr)); } else if (strchr("@", *expr)) { infix = g_slist_append(infix, new_variable(*expr)); } else if (strchr("-.1234567890", *expr)) { gchar value[32], *v = value; gfloat floatval; do { *v++ = *expr++; } while (*expr && strchr("-.1234567890", *expr)); expr--; *v = '\0'; sscanf(value, "%f", &floatval); infix = g_slist_append(infix, new_value(floatval)); } else if (!isspace(*expr)) { g_print("Invalid token: [%c][%d]\n", *expr, *expr); math_infix_free(infix, TRUE); return NULL; } } return infix; } void math_infix_free(GSList * infix, gboolean free_tokens) { GSList *p; if (!free_tokens) for (p = infix; p; p = g_slist_delete_link(p, p)); else for (p = infix; p; p = g_slist_delete_link(p, p)) { MathToken *t = (MathToken *) p->data; g_free(t); } } GSList *math_string_to_postfix(gchar * string) { GSList *infix; GSList *postfix; infix = math_string_to_infix(string); if (!infix) return NULL; postfix = math_infix_to_postfix(infix); math_infix_free(infix, FALSE); return postfix; } gfloat math_string_eval(gchar * string, gfloat at_value) { GSList *postfix; gfloat val; postfix = math_string_to_postfix(string); val = math_postfix_eval(postfix, at_value); math_postfix_free(postfix, TRUE); return val; } #ifdef MATH_TEST int main(void) { GSList *postfix; gchar *expr = "0.9*(@+(5.2*0.923+3*(2.0)))"; postfix = math_string_to_postfix(expr); g_print("%s = %f (must be 18.71964)\n", expr, math_postfix_eval(postfix, 10)); math_postfix_free(postfix, TRUE); return 0; } #endif hardinfo-0.5.1/expr.h0000644000175000017500000000266311166403363013440 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 __EXPR_H__ #define __EXPR_H__ typedef struct _MathToken MathToken; typedef enum { TOKEN_OPERATOR, TOKEN_VARIABLE, TOKEN_VALUE } MathTokenType; struct _MathToken { union { gfloat value; gchar op; } val; MathTokenType type; }; #define math_postfix_free math_infix_free GSList *math_infix_to_postfix(GSList *infix); void math_infix_free(GSList *infix, gboolean free_tokens); GSList *math_string_to_infix(gchar *string); GSList *math_string_to_postfix(gchar *string); gfloat math_postfix_eval(GSList *postfix, gfloat at_value); gfloat math_string_eval(gchar *string, gfloat at_value); #endif /* __EXPR_H__ */ hardinfo-0.5.1/blowfish.c0000644000175000017500000004751511166403363014277 0ustar agneyagney/* 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 "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; } } } hardinfo-0.5.1/blowfish.h0000644000175000017500000000225111166403363014270 0ustar agneyagney/* blowfish.h: Header file for blowfish.c 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 See blowfish.c for more information about this file. */ typedef struct { unsigned long P[16 + 2]; unsigned long S[4][256]; } BLOWFISH_CTX; void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen); void Blowfish_Encrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr); void Blowfish_Decrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr); hardinfo-0.5.1/callbacks.c0000644000175000017500000001625511166403363014376 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2009 Leandro A. F. Pereira * * 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 #include #include #include #include #include #include #include #include void cb_sync_manager() { sync_manager_show(); } void cb_save_graphic() { Shell *shell = shell_get_main_shell(); GtkWidget *dialog; gchar *filename; /* save the pixbuf to a png file */ dialog = gtk_file_chooser_dialog_new("Save Image", NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); filename = g_strconcat(shell->selected->name, ".png", NULL); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename); g_free(filename); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); gtk_widget_destroy(dialog); shell_status_update("Saving image..."); tree_view_save_image(filename); shell_status_update("Done."); g_free(filename); return; } gtk_widget_destroy(dialog); } void cb_open_web_page() { open_url("http://wiki.hardinfo.org"); } void cb_open_online_docs() { open_url("http://wiki.hardinfo.org/Documentation"); } void cb_report_bug() { open_url("http://wiki.hardinfo.org/BugReports"); } void cb_donate() { open_url("http://wiki.hardinfo.org/Donate"); } void cb_refresh() { shell_do_reload(); } void cb_copy_to_clipboard() { ShellModuleEntry *entry = shell_get_main_shell()->selected; if (entry) { gchar *data = module_entry_function(entry); GtkClipboard *clip = gtk_clipboard_get(gdk_atom_intern("CLIPBOARD", FALSE)); ReportContext *ctx = report_context_text_new(NULL); ctx->entry = entry; report_header(ctx); report_table(ctx, data); report_footer(ctx); gtk_clipboard_set_text(clip, ctx->output, -1); g_free(data); report_context_free(ctx); } } void cb_side_pane() { gboolean visible; visible = shell_action_get_active("SidePaneAction"); shell_set_side_pane_visible(visible); } void cb_toolbar() { gboolean visible; visible = shell_action_get_active("ToolbarAction"); shell_ui_manager_set_visible("/MainMenuBarAction", visible); } void cb_about_module(GtkAction * action) { Shell *shell = shell_get_main_shell(); GSList *modules = shell->tree->modules; ModuleAbout *ma; gchar *name; g_object_get(G_OBJECT(action), "tooltip", &name, NULL); for (; modules; modules = modules->next) { ShellModule *sm = (ShellModule *) modules->data; if (!g_str_equal(sm->name, name)) continue; if ((ma = module_get_about(sm))) { GtkWidget *about; gchar *text; about = gtk_about_dialog_new(); text = g_strdup_printf("%s Module", sm->name); gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(about), text); g_free(text); gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about), ma->version); text = g_strdup_printf("Written by %s\nLicensed under %s", ma->author, ma->license); gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about), text); g_free(text); if (ma->description) gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about), ma->description); gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(about), sm->icon); gtk_dialog_run(GTK_DIALOG(about)); gtk_widget_destroy(about); } else { g_warning ("No about information is associated with the %s module.", name); } break; } g_free(name); } void cb_about() { GtkWidget *about; const gchar *authors[] = { "Author:", "Leandro A. F. Pereira", "", "Contributors:", "Agney Lopes Roth Ferraz", "Andrey Esin", "", "Based on work by:", "MD5 implementation by Colin Plumb (see md5.c for details)", "SHA1 implementation by Steve Reid (see sha1.c for details)", "Blowfish implementation by Paul Kocher (see blowfich.c for details)", "Raytracing benchmark by John Walker (see fbench.c for details)", "FFT benchmark by Scott Robert Ladd (see fftbench.c for details)", "Some code partly based on x86cpucaps by Osamu Kayasono", "Vendor list based on GtkSysInfo by Pissens Sebastien", "DMI support based on code by Stewart Adam", "SCSI support based on code by Pascal F. Martin", NULL }; const gchar *artists[] = { "Jakub Szypulka", "Tango Project", "The GNOME Project", "VMWare, Inc. (USB icon from VMWare Workstation 6)", NULL }; about = gtk_about_dialog_new(); gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(about), "HardInfo"); gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about), VERSION); gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about), "Copyright \302\251 2003-2009 " "Leandro A. F. Pereira"); gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about), "System information and benchmark tool"); gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(about), icon_cache_get_pixbuf("logo.png")); gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(about), "HardInfo 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.\n\n" "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.\n\n" "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"); #if GTK_CHECK_VERSION(2,8,0) gtk_about_dialog_set_wrap_license(GTK_ABOUT_DIALOG(about), TRUE); #endif gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(about), authors); gtk_about_dialog_set_artists(GTK_ABOUT_DIALOG(about), artists); gtk_dialog_run(GTK_DIALOG(about)); gtk_widget_destroy(about); } void cb_generate_report() { Shell *shell = shell_get_main_shell(); gboolean btn_refresh = shell_action_get_enabled("RefreshAction"); gboolean btn_copy = shell_action_get_enabled("CopyAction"); report_dialog_show(shell->tree->model, shell->window); shell_action_set_enabled("RefreshAction", btn_refresh); shell_action_set_enabled("CopyAction", btn_copy); } void cb_quit(void) { do { gtk_main_quit(); } while (gtk_main_level() > 1); } hardinfo-0.5.1/callbacks.h0000644000175000017500000000233111166403363014371 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 __CALLBACKS_H__ #define __CALLBACKS_H__ #include void cb_about(); void cb_about_module(GtkAction *action); void cb_generate_report(); void cb_save_graphic(); void cb_quit(); void cb_refresh(); void cb_copy_to_clipboard(); void cb_side_pane(); void cb_toolbar(); void cb_open_web_page(); void cb_open_online_docs(); void cb_sync_manager(); void cb_report_bug(); void cb_donate(); #endif /* __CALLBACKS_H__ */ hardinfo-0.5.1/Makefile.in0000644000175000017500000000462211166403363014353 0ustar agneyagney CCFLAGS = -fPIC -pipe -Wall -g CFLAGS = $(GTK_CFLAGS) $(SOUP_CFLAGS) -I. CC = gcc $(ARCHOPTS) -g CCSLOW = gcc -O0 -g # ---------------------------------------------------------------------------- OBJECTS = hardinfo.o shell.o util.o iconcache.o loadgraph.o \ menu.o stock.o callbacks.o expr.o report.o binreloc.o \ vendor.o socket.o syncmanager.o BENCHMARK_OBJECTS = fbench.o sha1.o blowfish.o md5.o nqueens.o fftbench.o MODULES = computer.so devices.so benchmark.so network.so all: $(OBJECTS) $(MODULES) $(CC) $(CCFLAGS) -o hardinfo -Wl,-export-dynamic $(OBJECTS) $(GTK_LIBS) \ $(SOUP_LIBS) md5.o: $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c md5.c -o $@ blowfish.o: $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c blowfish.c -o $@ sha1.o: $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c sha1.c -o $@ fbench.o: $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c fbench.c -o $@ fftbench.o: $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c fftbench.c -o $@ nqueens.o: $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c nqueens.c -o $@ benchmark.so: benchmark.c make $(BENCHMARK_OBJECTS) $(CCSLOW) $(CCFLAGS) $(CFLAGS) -o $@ -shared $< $(BENCHMARK_OBJECTS) \ $(GTK_FLAGS) $(GTK_LIBS) ln -sf ../$@ modules %.so: %.c $(CC) $(CCFLAGS) $(CFLAGS) -o $@ -shared $< $(GTK_FLAGS) $(GTK_LIBS) ln -sf ../$@ modules clean: rm -rf .xvpics pixmaps/.xvpics *.o *.so hardinfo modules/*.so report find . -name \*~ -exec rm -v {} \; find . -name x86 -type l -exec rm -v {} \; dist-clean: clean rm -rf Makefile debian/hardinfo/ config.h arch/this package: dist-clean @echo "Creating tar.gz..." cd .. && tar czf $(PACKAGE).tar.gz $(PACKAGE)/* && cd $(PACKAGE) @echo "Creating tar.bz2..." cd .. && tar cjf $(PACKAGE).tar.bz2 $(PACKAGE)/* && cd $(PACKAGE) deb: dist-clean @echo "Creating deb..." dpkg-buildpackage -rfakeroot -k${USER} install: all rm -rf ${DESTDIR}${LIBDIR}/hardinfo/modules ${DESTDIR}/usr/share/hardinfo/pixmaps mkdir -p ${DESTDIR}/usr/bin mkdir -p ${DESTDIR}/usr/local mkdir -p ${DESTDIR}/usr/share/applications mkdir -p ${DESTDIR}${LIBDIR}/hardinfo/modules mkdir -p ${DESTDIR}/usr/share/hardinfo/pixmaps cp hardinfo.desktop ${DESTDIR}/usr/share/applications cp hardinfo ${DESTDIR}/usr/bin/hardinfo cp -Lr modules/*.so ${DESTDIR}${LIBDIR}/hardinfo/modules cp -Lr pixmaps/* ${DESTDIR}/usr/share/hardinfo/pixmaps cp benchmark.conf ${DESTDIR}/usr/share/hardinfo cp benchmark.data ${DESTDIR}/usr/share/hardinfo chmod 755 ${DESTDIR}/usr/bin/hardinfo installer: makepackage hardinfo-0.5.1/loadgraph.c0000644000175000017500000002071211166403363014411 0ustar agneyagney/* * Simple Load Graph * Version 0.1 - Wed, Jan 11 2006 * - initial release * Version 0.1.1 - Fri, Jan 13 2006 * - fixes autoscaling * - add color * * Copyright (C) 2006 Leandro A. F. Pereira * * The Simple Load Graph is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License, version 2.1, as published by the Free Software Foundation. * * The Simple Load Graph 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 the Simple Load Graph; if not, write to the Free * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA. */ #include "loadgraph.h" static void _draw(LoadGraph * lg); LoadGraph *load_graph_new(gint size) { LoadGraph *lg; lg = g_new0(LoadGraph, 1); size++; lg->suffix = g_strdup(""); lg->area = gtk_drawing_area_new(); lg->size = (size * 3) / 2; lg->data = g_new0(gint, lg->size); lg->scale = 1.0; lg->width = size * 6; lg->height = size * 2; lg->max_value = 1; lg->remax_count = 0; lg->layout = pango_layout_new(gtk_widget_get_pango_context(lg->area)); gtk_widget_set_size_request(lg->area, lg->width, lg->height); gtk_widget_show(lg->area); return lg; } void load_graph_set_data_suffix(LoadGraph * lg, gchar * suffix) { g_free(lg->suffix); lg->suffix = g_strdup(suffix); } gchar *load_graph_get_data_suffix(LoadGraph * lg) { return lg->suffix; } GtkWidget *load_graph_get_framed(LoadGraph * lg) { GtkWidget *align, *frame; align = gtk_alignment_new(0.5, 0.5, 0, 0); gtk_widget_show(align); frame = gtk_frame_new(NULL); gtk_widget_show(frame); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(align), frame); gtk_container_add(GTK_CONTAINER(frame), lg->area); return align; } void load_graph_clear(LoadGraph * lg) { gint i; for (i = 0; i < lg->size; i++) lg->data[i] = 0; lg->scale = 1.0; lg->max_value = 1; lg->remax_count = 0; _draw(lg); } void load_graph_set_color(LoadGraph * lg, LoadGraphColor color) { lg->color = color; gdk_rgb_gc_set_foreground(lg->trace, lg->color); gdk_rgb_gc_set_foreground(lg->fill, lg->color - 0x303030); gdk_rgb_gc_set_foreground(lg->grid, lg->color - 0xcdcdcd); } void load_graph_destroy(LoadGraph * lg) { g_free(lg->data); gtk_widget_destroy(lg->area); gdk_pixmap_unref(lg->buf); g_object_unref(lg->trace); g_object_unref(lg->grid); g_object_unref(lg->fill); g_object_unref(lg->layout); g_free(lg); } static gboolean _expose(GtkWidget * widget, GdkEventExpose * event, gpointer user_data) { LoadGraph *lg = (LoadGraph *) user_data; GdkDrawable *draw = GDK_DRAWABLE(lg->buf); gdk_draw_drawable(lg->area->window, lg->area->style->black_gc, draw, 0, 0, 0, 0, lg->width, lg->height); return FALSE; } void load_graph_configure_expose(LoadGraph * lg) { /* creates the backing store pixmap */ gtk_widget_realize(lg->area); lg->buf = gdk_pixmap_new(lg->area->window, lg->width, lg->height, -1); /* create the graphic contexts */ lg->grid = gdk_gc_new(GDK_DRAWABLE(lg->buf)); lg->trace = gdk_gc_new(GDK_DRAWABLE(lg->buf)); lg->fill = gdk_gc_new(GDK_DRAWABLE(lg->buf)); /* the default color is green */ load_graph_set_color(lg, LG_COLOR_GREEN); /* init graphic contexts */ gdk_gc_set_line_attributes(lg->grid, 1, GDK_LINE_ON_OFF_DASH, GDK_CAP_NOT_LAST, GDK_JOIN_ROUND); gdk_gc_set_dashes(lg->grid, 0, (gint8*)"\2\2", 2); #if 0 /* old-style grid */ gdk_rgb_gc_set_foreground(lg->grid, 0x707070); #endif gdk_gc_set_line_attributes(lg->trace, 1, GDK_LINE_SOLID, GDK_CAP_PROJECTING, GDK_JOIN_ROUND); #if 0 /* old-style fill */ gdk_gc_set_line_attributes(lg->fill, 1, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_BEVEL); #endif /* configures the expose event */ g_signal_connect(G_OBJECT(lg->area), "expose-event", (GCallback) _expose, lg); } static void _draw_label_and_line(LoadGraph * lg, gint position, gint value) { gchar *tmp; /* draw lines */ if (position > 0) gdk_draw_line(GDK_DRAWABLE(lg->buf), lg->grid, 0, position, lg->width, position); else position = -1 * position; /* draw label */ tmp = g_strdup_printf("%d%s", value, lg->suffix); pango_layout_set_markup(lg->layout, tmp, -1); pango_layout_set_width(lg->layout, lg->area->allocation.width * PANGO_SCALE); gdk_draw_layout(GDK_DRAWABLE(lg->buf), lg->trace, 2, position, lg->layout); g_free(tmp); } static void _draw(LoadGraph * lg) { GdkDrawable *draw = GDK_DRAWABLE(lg->buf); gint i, d; /* clears the drawing area */ gdk_draw_rectangle(draw, lg->area->style->black_gc, TRUE, 0, 0, lg->width, lg->height); /* the graph */ GdkPoint *points = g_new0(GdkPoint, lg->size + 1); for (i = 0; i < lg->size; i++) { points[i].x = i * 4; points[i].y = lg->height - lg->data[i] * lg->scale; } points[0].x = points[1].x = 0; points[0].y = points[i].y = lg->height; points[i].x = points[i - 1].x = lg->width; gdk_draw_polygon(draw, lg->fill, TRUE, points, lg->size + 1); gdk_draw_polygon(draw, lg->trace, FALSE, points, lg->size + 1); g_free(points); /* vertical bars */ for (i = lg->width, d = 0; i > 1; i--, d++) if ((d % 45) == 0 && d) gdk_draw_line(draw, lg->grid, i, 0, i, lg->height); /* horizontal bars and labels; 25%, 50% and 75% */ _draw_label_and_line(lg, -1, lg->max_value); _draw_label_and_line(lg, lg->height / 4, 3 * (lg->max_value / 4)); _draw_label_and_line(lg, lg->height / 2, lg->max_value / 2); _draw_label_and_line(lg, 3 * (lg->height / 4), lg->max_value / 4); #if 0 /* old-style drawing */ for (i = 0; i < lg->size; i++) { gint this = lg->height - lg->data[i] * lg->scale; gint next = lg->height - lg->data[i + 1] * lg->scale; gint i4 = i * 4; gdk_draw_line(draw, lg->fill, i4, this, i4, lg->height); gdk_draw_line(draw, lg->fill, i4 + 2, this, i4 + 2, lg->height); } for (i = 0; i < lg->size; i++) { gint this = lg->height - lg->data[i] * lg->scale; gint next = lg->height - lg->data[i + 1] * lg->scale; gint i4 = i * 4; gdk_draw_line(draw, lg->trace, i4, this, i4 + 2, (this + next) / 2); gdk_draw_line(draw, lg->trace, i4 + 2, (this + next) / 2, i4 + 4, next); } #endif gtk_widget_queue_draw(lg->area); } void load_graph_update(LoadGraph * lg, gint value) { gint i; if (value < 0) return; /* shift-right our data */ for (i = 0; i < lg->size; i++) { lg->data[i] = lg->data[i + 1]; } /* insert the updated value */ lg->data[i] = value; /* calculates the maximum value */ if (lg->remax_count++ > 20) { /* only finds the maximum amongst the data every 20 times */ lg->remax_count = 0; gint max = lg->data[0]; for (i = 1; i < lg->size; i++) { if (lg->data[i] > max) max = lg->data[i]; } lg->max_value = max; } else { /* otherwise, select the maximum between the current maximum and the supplied value */ lg->max_value = MAX(value, lg->max_value); } /* recalculates the scale; always use 90% of it */ lg->scale = 0.90 * ((gfloat) lg->height / (gfloat) lg->max_value); /* redraw */ _draw(lg); } #ifdef LOADGRAPH_UNIT_TEST gboolean lg_update(gpointer d) { LoadGraph *lg = (LoadGraph *) d; static int i = 0; static int j = 1; if (i > 150) { j = -1; } else if (i < 0) { j = 1; } i += j; if (rand() % 10 > 8) i *= 2; if (rand() % 10 < 2) i /= 2; load_graph_update(lg, i + rand() % 50); return TRUE; } int main(int argc, char **argv) { LoadGraph *lg; GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_show(window); lg = load_graph_new(50); gtk_container_add(GTK_CONTAINER(window), load_graph_get_framed(lg)); gtk_container_set_border_width(GTK_CONTAINER(window), 20); load_graph_configure_expose(lg); lg_update(lg); g_timeout_add(100, lg_update, lg); gtk_main(); return 0; } #endif hardinfo-0.5.1/loadgraph.h0000644000175000017500000000361311166403363014417 0ustar agneyagney/* * Simple Load Graph * Copyright (C) 2006 Leandro A. F. Pereira * * The Simple Load Graph is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License, version 2.1, as published by the Free Software Foundation. * * The Simple Load Graph 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 the Simple Load Graph; if not, write to the Free * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA. */ #ifndef __LOADGRAPH_H__ #define __LOADGRAPH_H__ #include #include #include typedef struct _LoadGraph LoadGraph; typedef enum { LG_COLOR_GREEN = 0x4FB05A, LG_COLOR_BLUE = 0x4F58B0, LG_COLOR_RED = 0xB04F4F } LoadGraphColor; struct _LoadGraph { GdkPixmap *buf; GtkWidget *area; GdkGC *grid; GdkGC *trace; GdkGC *fill; gint *data; gfloat scale; gint size; gint width, height; LoadGraphColor color; gint max_value, remax_count; PangoLayout *layout; gchar *suffix; }; LoadGraph *load_graph_new(gint size); void load_graph_destroy(LoadGraph *lg); void load_graph_configure_expose(LoadGraph *lg); GtkWidget *load_graph_get_framed(LoadGraph *lg); void load_graph_update(LoadGraph *lg, gint value); void load_graph_set_color(LoadGraph *lg, LoadGraphColor color); void load_graph_clear(LoadGraph *lg); void load_graph_set_data_suffix(LoadGraph *lg, gchar *suffix); gchar *load_graph_get_data_suffix(LoadGraph *lg); #endif /* __LOADGRAPH_H__ */ hardinfo-0.5.1/benchmark.c0000644000175000017500000002542411166403363014407 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2009 Leandro A. F. Pereira * * 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 #include #include #include #include #include #include enum { BENCHMARK_BLOWFISH, BENCHMARK_CRYPTOHASH, BENCHMARK_FIB, BENCHMARK_NQUEENS, BENCHMARK_FFT, BENCHMARK_RAYTRACE, BENCHMARK_N_ENTRIES } Entries; void scan_fft(gboolean reload); void scan_raytr(gboolean reload); void scan_bfsh(gboolean reload); void scan_cryptohash(gboolean reload); void scan_fib(gboolean reload); void scan_nqueens(gboolean reload); gchar *callback_fft(); gchar *callback_raytr(); gchar *callback_bfsh(); gchar *callback_fib(); gchar *callback_cryptohash(); gchar *callback_nqueens(); static ModuleEntry entries[] = { {"CPU Blowfish", "blowfish.png", callback_bfsh, scan_bfsh}, {"CPU CryptoHash", "cryptohash.png", callback_cryptohash, scan_cryptohash}, {"CPU Fibonacci", "nautilus.png", callback_fib, scan_fib}, {"CPU N-Queens", "nqueens.png", callback_nqueens, scan_nqueens}, {"FPU FFT", "fft.png", callback_fft, scan_fft}, {"FPU Raytracing", "raytrace.png", callback_raytr, scan_raytr}, {NULL} }; typedef struct _ParallelBenchTask ParallelBenchTask; struct _ParallelBenchTask { guint start, end; gpointer data, callback; }; gpointer benchmark_parallel_for_dispatcher(gpointer data) { ParallelBenchTask *pbt = (ParallelBenchTask *)data; gpointer (*callback)(unsigned int start, unsigned int end, void *data); gpointer return_value; 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); 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; } gdouble benchmark_parallel_for(guint start, guint end, gpointer callback, gpointer callback_data) { gchar *temp; guint n_cores, iter_per_core, iter; gdouble elapsed_time; GSList *threads = NULL, *t; GTimer *timer; timer = g_timer_new(); temp = module_call_method("devices::getProcessorCount"); n_cores = temp ? atoi(temp) : 1; g_free(temp); while (1) { iter_per_core = (end - start) / n_cores; if (iter_per_core == 0) { DEBUG("not enough items per core; disabling one"); n_cores--; } else { break; } } DEBUG("processor has %d cores; processing %d elements (%d per core)", n_cores, (end - start), iter_per_core); g_timer_start(timer); for (iter = start; iter < end; iter += iter_per_core) { ParallelBenchTask *pbt = g_new0(ParallelBenchTask, 1); GThread *thread; DEBUG("launching thread %d", 1 + (iter / iter_per_core)); pbt->start = iter == 0 ? 0 : iter + 1; pbt->end = iter + iter_per_core - 1; pbt->data = callback_data; pbt->callback = callback; if (pbt->end > end) pbt->end = end; thread = g_thread_create((GThreadFunc) benchmark_parallel_for_dispatcher, pbt, TRUE, NULL); threads = g_slist_append(threads, thread); DEBUG("thread %d launched as context %p", 1 + (iter / iter_per_core), threads->data); } DEBUG("waiting for all threads to finish"); for (t = threads; t; t = t->next) { DEBUG("waiting for thread with context %p", t->data); g_thread_join((GThread *)t->data); } g_timer_stop(timer); elapsed_time = g_timer_elapsed(timer, NULL); g_slist_free(threads); g_timer_destroy(timer); DEBUG("finishing; all threads took %f seconds to finish", elapsed_time); return elapsed_time; } static gchar *__benchmark_include_results(gdouble result, const gchar * benchmark, ShellOrderType order_type) { GKeyFile *conf; gchar **machines; gchar *path, *results = g_strdup(""), *return_value, *processor_frequency; int i; 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); machines = g_key_file_get_keys(conf, benchmark, NULL, NULL); for (i = 0; machines && machines[i]; i++) { gchar *value; value = g_key_file_get_value(conf, benchmark, machines[i], NULL); results = g_strconcat(results, machines[i], "=", value, "\n", NULL); g_free(value); } g_strfreev(machines); g_free(path); g_key_file_free(conf); processor_frequency = module_call_method("devices::getProcessorFrequency"); return_value = g_strdup_printf("[$ShellParam$]\n" "Zebra=1\n" "OrderType=%d\n" "ViewType=3\n" "ColumnTitle$Extra1=CPU Clock\n" "ColumnTitle$Progress=Results\n" "ColumnTitle$TextValue=CPU\n" "ShowColumnHeaders=true\n" "[%s]\n" "This Machine=%.3f|%s MHz\n" "%s", order_type, benchmark, result, processor_frequency, results); g_free(processor_frequency); return return_value; } static gchar *benchmark_include_results_reverse(gdouble result, const gchar * benchmark) { return __benchmark_include_results(result, benchmark, SHELL_ORDER_DESCENDING); } static gchar *benchmark_include_results(gdouble result, const gchar * benchmark) { return __benchmark_include_results(result, benchmark, SHELL_ORDER_ASCENDING); } static gdouble bench_results[BENCHMARK_N_ENTRIES]; #include #include #include #include #include #include gchar *callback_fft() { return benchmark_include_results(bench_results[BENCHMARK_FFT], "FPU FFT"); } gchar *callback_nqueens() { return benchmark_include_results(bench_results[BENCHMARK_NQUEENS], "CPU N-Queens"); } gchar *callback_raytr() { return benchmark_include_results(bench_results[BENCHMARK_RAYTRACE], "FPU Raytracing"); } gchar *callback_bfsh() { return benchmark_include_results(bench_results[BENCHMARK_BLOWFISH], "CPU Blowfish"); } gchar *callback_cryptohash() { return benchmark_include_results_reverse(bench_results[BENCHMARK_CRYPTOHASH], "CPU CryptoHash"); } gchar *callback_fib() { return benchmark_include_results(bench_results[BENCHMARK_FIB], "CPU Fibonacci"); } #define RUN_WITH_HIGH_PRIORITY(fn) \ do { \ int old_priority = getpriority(PRIO_PROCESS, 0); \ setpriority(PRIO_PROCESS, 0, -20); \ fn(); \ setpriority(PRIO_PROCESS, 0, old_priority); \ } while (0); void scan_fft(gboolean reload) { SCAN_START(); RUN_WITH_HIGH_PRIORITY(benchmark_fft); SCAN_END(); } void scan_nqueens(gboolean reload) { SCAN_START(); RUN_WITH_HIGH_PRIORITY(benchmark_nqueens); SCAN_END(); } void scan_raytr(gboolean reload) { SCAN_START(); RUN_WITH_HIGH_PRIORITY(benchmark_raytrace); SCAN_END(); } void scan_bfsh(gboolean reload) { SCAN_START(); RUN_WITH_HIGH_PRIORITY(benchmark_fish); SCAN_END(); } void scan_cryptohash(gboolean reload) { SCAN_START(); RUN_WITH_HIGH_PRIORITY(benchmark_cryptohash); SCAN_END(); } void scan_fib(gboolean reload) { SCAN_START(); RUN_WITH_HIGH_PRIORITY(benchmark_fib); SCAN_END(); } const gchar *hi_note_func(gint entry) { switch (entry) { case BENCHMARK_CRYPTOHASH: return "Results in MiB/second. 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; } 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 = "Perform tasks and compare with other systems", .version = VERSION, .license = "GNU GPL version 2"} }; return ma; } static gchar *get_benchmark_results() { void (*scan_callback) (gboolean rescan); gint i = G_N_ELEMENTS(entries) - 1; 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=%d\n", machine, machineclock, machineram, i); for (; i >= 0; i--) { if ((scan_callback = entries[i].scan_callback)) { 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); return result; } void hi_module_init(void) { static SyncEntry se[] = { { .fancy_name = "Send benchmark results", .name = "SendBenchmarkResults", .save_to = NULL, .get_data = get_benchmark_results}, { .fancy_name = "Receive benchmark results", .name = "RecvBenchmarkResults", .save_to = "benchmark.conf", .get_data = NULL} }; sync_manager_add_entry(&se[0]); sync_manager_add_entry(&se[1]); } gchar **hi_module_get_dependencies(void) { static gchar *deps[] = { "devices.so", NULL }; return deps; } hardinfo-0.5.1/autopackage/0000755000175000017500000000000011166403532014564 5ustar agneyagneyhardinfo-0.5.1/autopackage/default.apspec0000644000175000017500000000353211166403526017413 0ustar agneyagney# -*- shell-script -*- # Generated by mkapspec 0.2 [Meta] ShortName: hardinfo SoftwareVersion: 0.5.1 DisplayName: HardInfo RootName: @hardinfo.org/hardinfo:$SOFTWAREVERSION Summary: System profiler and benchmark tool Maintainer: Leandro A. F. Pereira Packager: Leandro A. F. Pereira PackageVersion: 1 CPUArchitectures: x86 AutopackageTarget: 1.2 Type: Application License: GPL [BuildPrepare] # If you're using autotools, the default should be enough. # prepareBuild will set up apbuild and run configure for you. If you # need to pass arguments to configure, just add them to prepareBuild: # prepareBuild --enable-foo --disable-bar export APBUILD_INCLUDE="/usr/local/gtk-headers/2.6" export CC="apgcc" prepareBuild [BuildUnprepare] # If you're using prepareBuild above, there is no need to change this! unprepareBuild [Globals] [Prepare] require '@gtk.org/gtk' 2.6 require '@gtk.org/glib' 2.6 require '@gnome.org/libsoup' 8.0 [Imports] # This command will tell makeinstaller what to include in the package. # The selection comes from the files created by 'make install' or equivalent. # Usually, you can leave this at the default cd ../ echo '*' | import [Install] # See http://www.autopackage.org/api/ for details installExe bin/* installData share/* copyFile lib/hardinfo/modules/benchmark.so $PREFIX/lib/hardinfo/modules/benchmark.so copyFile lib/hardinfo/modules/computer.so $PREFIX/lib/hardinfo/modules/computer.so copyFile lib/hardinfo/modules/devices.so $PREFIX/lib/hardinfo/modules/devices.so copyFile lib/hardinfo/modules/network.so $PREFIX/lib/hardinfo/modules/network.so installMenuItem "System" share/applications/hardinfo.desktop [Uninstall] # Leaving this at the default is safe unless you use custom commands in # "Install" to create files. By default, all autopackage API functions are # logged. uninstallFromLog hardinfo-0.5.1/menu.c0000644000175000017500000001245111166403363013415 0ustar agneyagney/* * HardInfo * Copyright(C) 2003-2007 Leandro A. F. Pereira. * * menu.c is based on UI Manager tutorial by Ryan McDougall * Copyright(C) 2005 Ryan McDougall. * * 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include "uidefs.h" static GtkActionEntry entries[] = { {"InformationMenuAction", NULL, "_Information"}, /* name, stock id, label */ {"ViewMenuAction", NULL, "_View"}, {"HelpMenuAction", NULL, "_Help"}, {"HelpMenuModulesAction", HI_STOCK_ABOUT_MODULES, "About _Modules"}, {"MainMenuBarAction", NULL, ""}, {"ReportAction", HI_STOCK_REPORT, /* name, stock id */ "Generate _Report", "R", /* label, accelerator */ NULL, /* tooltip */ G_CALLBACK(cb_generate_report)}, {"SyncManagerAction", HI_STOCK_SYNC_MENU, "_Network Updater...", NULL, NULL, G_CALLBACK(cb_sync_manager)}, {"OpenAction", GTK_STOCK_OPEN, "_Open...", NULL, NULL, G_CALLBACK(cb_sync_manager)}, {"ConnectToAction", GTK_STOCK_CONNECT, "_Connect to...", NULL, NULL, G_CALLBACK(cb_sync_manager)}, {"CopyAction", GTK_STOCK_COPY, "_Copy to Clipboard", "C", NULL, G_CALLBACK(cb_copy_to_clipboard)}, {"SaveGraphAction", GTK_STOCK_SAVE_AS, "_Save image as...", "S", NULL, G_CALLBACK(cb_save_graphic)}, {"RefreshAction", GTK_STOCK_REFRESH, "_Refresh", "F5", NULL, G_CALLBACK(cb_refresh)}, {"OnlineDocsAction", GTK_STOCK_HELP, "Contents (online)", "F1", NULL, G_CALLBACK(cb_open_online_docs)}, {"HomePageAction", HI_STOCK_INTERNET, "_Open HardInfo Web Site", NULL, NULL, G_CALLBACK(cb_open_web_page)}, {"ReportBugAction", HI_STOCK_INTERNET, "_Report bug", NULL, NULL, G_CALLBACK(cb_report_bug)}, {"DonateAction", HI_STOCK_DONATE, "_Donate to the project", NULL, NULL, G_CALLBACK(cb_donate)}, {"AboutAction", GTK_STOCK_ABOUT, "_About HardInfo", NULL, "Displays program version information", G_CALLBACK(cb_about)}, {"QuitAction", GTK_STOCK_QUIT, "_Quit", "Q", NULL, G_CALLBACK(cb_quit)} }; static GtkToggleActionEntry toggle_entries[] = { {"SidePaneAction", NULL, "_Side Pane", NULL, "Toggles side pane visibility", G_CALLBACK(cb_side_pane)}, {"ToolbarAction", NULL, "_Toolbar", NULL, NULL, G_CALLBACK(cb_toolbar)}, }; /* Implement a handler for GtkUIManager's "add_widget" signal. The UI manager * will emit this signal whenever it needs you to place a new widget it has. */ static void menu_add_widget(GtkUIManager * ui, GtkWidget * widget, GtkContainer * container) { gtk_box_pack_start(GTK_BOX(container), widget, FALSE, FALSE, 0); gtk_widget_show(widget); } void menu_init(Shell * shell) { GtkWidget *menu_box; /* Packing box for the menu and toolbars */ GtkActionGroup *action_group; /* Packing group for our Actions */ GtkUIManager *menu_manager; /* The magic widget! */ GError *error; /* For reporting exceptions or errors */ GtkAccelGroup *accel_group; /* Create our objects */ menu_box = shell->vbox; action_group = gtk_action_group_new("HardInfo"); menu_manager = gtk_ui_manager_new(); shell->action_group = action_group; shell->ui_manager = menu_manager; /* Pack up our objects: * menu_box -> window * actions -> action_group * action_group -> menu_manager */ gtk_action_group_add_actions(action_group, entries, G_N_ELEMENTS(entries), NULL); gtk_action_group_add_toggle_actions(action_group, toggle_entries, G_N_ELEMENTS(toggle_entries), NULL); gtk_ui_manager_insert_action_group(menu_manager, action_group, 0); /* Read in the UI from our XML file */ error = NULL; gtk_ui_manager_add_ui_from_string(menu_manager, uidefs_str, -1, &error); if (error) { g_error("Building menus failed: %s", error->message); g_error_free(error); return; } /* Enable menu accelerators */ accel_group = gtk_ui_manager_get_accel_group(menu_manager); gtk_window_add_accel_group(GTK_WINDOW(shell->window), accel_group); /* Connect up important signals */ /* This signal is necessary in order to place widgets from the UI manager * into the menu_box */ g_signal_connect(menu_manager, "add_widget", G_CALLBACK(menu_add_widget), menu_box); /* Show the window and run the main loop, we're done! */ gtk_widget_show(menu_box); gtk_toolbar_set_style(GTK_TOOLBAR (gtk_ui_manager_get_widget (shell->ui_manager, "/MainMenuBarAction")), GTK_TOOLBAR_BOTH_HORIZ); } hardinfo-0.5.1/menu.h0000644000175000017500000000163311166403363013422 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 __MENU_H__ #define __MENU_H__ #include void menu_init(Shell *shell); #endif /* __MENU_H__ */ hardinfo-0.5.1/network.c0000644000175000017500000002562111166403363014145 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2008 Leandro A. F. Pereira * * 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 #include #include #include #include #include #include #include #include #include #include #include #include static GHashTable *moreinfo = NULL; /* 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[] = { {"Interfaces", "network-interface.png", callback_network, scan_network}, {"IP Connections", "network-connections.png", callback_connections, scan_connections}, {"Routing Table", "network.png", callback_route, scan_route}, {"ARP Table", "module.png", callback_arp, scan_arp}, {"DNS Servers", "dns.png", callback_dns, scan_dns}, {"Statistics", "network-statistics.png", callback_statistics, scan_statistics}, {"Shared Directories", "shares.png", callback_shares, scan_shares}, {NULL}, }; #include #include #include void scan_shares(gboolean reload) { SCAN_START(); scan_samba_shared_directories(); scan_nfs_shared_directories(); SCAN_END(); } static gchar *__statistics = NULL; void scan_statistics(gboolean reload) { FILE *netstat; gchar buffer[256]; gchar *netstat_path; 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 if (isdigit(buffer[4])) { gchar *tmp1 = buffer + 4, *tmp2 = tmp1; while (*tmp2 && !isspace(*tmp2)) tmp2++; *tmp2 = 0; tmp2++; *tmp2 = toupper(*tmp2); __statistics = h_strdup_cprintf("%s=%s\n", __statistics, g_strstrip(tmp1), g_strstrip(tmp2)); } } 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")) { __nameservers = h_strdup_cprintf("%s=\n", __nameservers, g_strstrip(buffer + sizeof("nameserver"))); } } 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)); } pclose(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("[ARP Table]\n" "%s\n" "[$ShellParam$]\n" "ReloadInterval=3000\n" "ColumnTitle$TextValue=IP Address\n" "ColumnTitle$Value=Interface\n" "ColumnTitle$Extra1=MAC Address\n" "ShowColumnHeaders=true\n", __arp_table); } gchar *callback_shares() { return g_strdup_printf("[SAMBA]\n" "%s\n" "[NFS]\n" "%s", smb_shares_list, nfs_shares_list); } gchar *callback_dns() { return g_strdup_printf("[Name servers]\n" "%s\n", __nameservers); } gchar *callback_connections() { return g_strdup_printf("[Connections]\n" "%s\n" "[$ShellParam$]\n" "ReloadInterval=3000\n" "ColumnTitle$TextValue=Local Address\n" "ColumnTitle$Value=Protocol\n" "ColumnTitle$Extra1=Foreign Address\n" "ColumnTitle$Extra2=State\n" "ShowColumnHeaders=true\n", __connections); } gchar *callback_network() { return g_strdup_printf("%s\n" "[$ShellParam$]\n" "ReloadInterval=3000\n" "ViewType=1\n" "ColumnTitle$TextValue=Interface\n" "ColumnTitle$Value=IP Address\n" "ColumnTitle$Extra1=Sent\n" "ColumnTitle$Extra2=Received\n" "ShowColumnHeaders=true\n" "%s", network_interfaces, network_icons); } gchar *callback_route() { return g_strdup_printf("[IP routing table]\n" "%s\n" "[$ShellParam$]\n" "ViewType=0\n" "ReloadInterval=3000\n" "ColumnTitle$TextValue=Destination / Gateway\n" "ColumnTitle$Value=Interface\n" "ColumnTitle$Extra1=Flags\n" "ColumnTitle$Extra2=Mask\n" "ShowColumnHeaders=true\n", __routing_table); } gchar *callback_statistics() { return g_strdup_printf("%s\n" "[$ShellParam$]\n" "ReloadInterval=3000\n", __statistics); } gchar *hi_more_info(gchar * entry) { gchar *info = (gchar *) g_hash_table_lookup(moreinfo, 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) { moreinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); } ModuleAbout *hi_module_get_about(void) { static ModuleAbout ma[] = { { .author = "Leandro A. F. Pereira", .description = "Gathers information about this computer's network connection", .version = VERSION, .license = "GNU GPL version 2"} }; return ma; } hardinfo-0.5.1/syncmanager.c0000644000175000017500000004717511166403363014773 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2009 Leandro A. F. Pereira * * 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 "syncmanager.h" #include "iconcache.h" #include "hardinfo.h" #include "config.h" #ifdef HAS_LIBSOUP #include #include #include typedef struct _SyncDialog SyncDialog; typedef struct _SyncNetArea SyncNetArea; typedef struct _SyncNetAction SyncNetAction; struct _SyncNetArea { GtkWidget *vbox; }; struct _SyncNetAction { gchar *name; gboolean(*do_action) (SyncDialog * sd, gpointer sna); SyncEntry *entry; GError *error; }; struct _SyncDialog { GtkWidget *dialog; GtkWidget *label; GtkWidget *button_sync; GtkWidget *button_cancel; GtkWidget *button_close; GtkWidget *scroll_box; SyncNetArea *sna; gboolean flag_cancel:1; }; static GSList *entries = NULL; static SoupSession *session = NULL; static GMainLoop *loop; static GQuark err_quark; #define XMLRPC_SERVER_URI "http://hardinfo.berlios.de/xmlrpc/" #define XMLRPC_SERVER_API_VERSION 1 #define LABEL_SYNC_DEFAULT "Synchronize with Central Database\n" \ "The following information may be synchronized " \ "with the HardInfo central database." #define LABEL_SYNC_SYNCING "Synchronizing\n" \ "This may take some time." static SyncDialog *sync_dialog_new(void); static void sync_dialog_destroy(SyncDialog * sd); static void sync_dialog_start_sync(SyncDialog * sd); static SyncNetArea *sync_dialog_netarea_new(void); static void sync_dialog_netarea_destroy(SyncNetArea * sna); static void sync_dialog_netarea_show(SyncDialog * sd); #if 0 static void sync_dialog_netarea_hide(SyncDialog * sd); #endif static void sync_dialog_netarea_start_actions(SyncDialog * sd, SyncNetAction * sna, gint n); #define SNA_ERROR(code,message,...) if (!sna->error) { \ sna->error = g_error_new(err_quark, code, message, \ ##__VA_ARGS__); \ } #endif /* HAS_LIBSOUP */ gint sync_manager_count_entries(void) { #ifdef HAS_LIBSOUP return g_slist_length(entries); #else return 0; #endif } void sync_manager_add_entry(SyncEntry * entry) { #ifdef HAS_LIBSOUP DEBUG("registering syncmanager entry ''%s''", entry->fancy_name); entry->selected = TRUE; entries = g_slist_append(entries, entry); #else DEBUG("libsoup support is disabled."); #endif /* HAS_LIBSOUP */ } void sync_manager_show(void) { #ifndef HAS_LIBSOUP g_warning ("HardInfo was compiled without libsoup support. (Network Updater requires it.)"); #else /* !HAS_LIBSOUP */ SyncDialog *sd = sync_dialog_new(); err_quark = g_quark_from_static_string("syncmanager"); if (gtk_dialog_run(GTK_DIALOG(sd->dialog)) == GTK_RESPONSE_ACCEPT) { shell_view_set_enabled(FALSE); shell_status_set_enabled(TRUE); sync_dialog_start_sync(sd); shell_status_set_enabled(FALSE); shell_view_set_enabled(TRUE); } sync_dialog_destroy(sd); #endif /* HAS_LIBSOUP */ } #ifdef HAS_LIBSOUP static gint _soup_get_xmlrpc_value_int(SoupMessage * msg, SyncNetAction * sna) { gint int_value = -1; sna->error = NULL; if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { SNA_ERROR(1, "%s (error #%d)", msg->reason_phrase, msg->status_code); goto bad; } if (!soup_xmlrpc_extract_method_response(msg->response_body->data, msg->response_body->length, NULL, G_TYPE_INT, &int_value)) { SNA_ERROR(2, "Could not parse XML-RPC response"); } bad: return int_value; } static gchar *_soup_get_xmlrpc_value_string(SoupMessage * msg, SyncNetAction * sna) { gchar *string = NULL; sna->error = NULL; if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { SNA_ERROR(1, "%s (error #%d)", msg->reason_phrase, msg->status_code); goto bad; } if (!soup_xmlrpc_extract_method_response(msg->response_body->data, msg->response_body->length, NULL, G_TYPE_STRING, &string)) { SNA_ERROR(2, "Could not parse XML-RPC response"); } bad: return string; } static gboolean _soup_xmlrpc_call(gchar * method, SyncNetAction * sna, SoupSessionCallback callback) { SoupMessage *msg; sna->error = NULL; msg = soup_xmlrpc_request_new(XMLRPC_SERVER_URI, method, G_TYPE_INVALID); if (!msg) return FALSE; DEBUG("calling xmlrpc method %s", method); soup_session_queue_message(session, msg, callback, sna); g_main_run(loop); return TRUE; } static gboolean _soup_xmlrpc_call_with_parameters(gchar * method, SyncNetAction * sna, SoupSessionCallback callback, ...) { SoupMessage *msg; GValueArray *parameters; gchar *argument, *body; va_list ap; sna->error = NULL; msg = soup_message_new("POST", XMLRPC_SERVER_URI); DEBUG("calling xmlrpc method %s", method); if (!msg) return FALSE; parameters = g_value_array_new(1); va_start(ap, callback); while ((argument = va_arg(ap, gchar *))) { soup_value_array_append(parameters, G_TYPE_STRING, argument); DEBUG("with parameter: %s", argument); } va_end(ap); body = soup_xmlrpc_build_method_call(method, parameters->values, parameters->n_values); g_value_array_free(parameters); soup_message_set_request(msg, "text/xml", SOUP_MEMORY_TAKE, body, strlen (body)); soup_session_queue_message(session, msg, callback, sna); g_main_run(loop); return TRUE; } static void _action_check_api_version_got_response(SoupSession * session, SoupMessage * msg, gpointer user_data) { SyncNetAction *sna = (SyncNetAction *) user_data; gint version = _soup_get_xmlrpc_value_int(msg, sna); if (version != XMLRPC_SERVER_API_VERSION) { SNA_ERROR(5, "Server says it supports API version %d, but " "this version of HardInfo only supports API " "version %d.", version, XMLRPC_SERVER_API_VERSION); } g_main_quit(loop); } static gboolean _action_check_api_version(SyncDialog * sd, gpointer user_data) { SyncNetAction *sna = (SyncNetAction *) user_data; if (!_soup_xmlrpc_call("server.getAPIVersion", sna, _action_check_api_version_got_response)) return FALSE; return sna->error ? FALSE : TRUE; } static void _action_call_function_got_response(SoupSession * session, SoupMessage * msg, gpointer user_data) { SyncNetAction *sna = (SyncNetAction *) user_data; gchar *string; if ((string = _soup_get_xmlrpc_value_string(msg, sna)) && sna->entry->save_to) { DEBUG("received string: %s\n", string); gchar *filename = g_build_filename(g_get_home_dir(), ".hardinfo", sna->entry->save_to, NULL); DEBUG("saving to %s", filename); g_file_set_contents(filename, string, -1, NULL); g_free(filename); } if (sna->entry->callback) { sna->entry->callback(sna->entry, string); } g_free(string); g_main_quit(loop); } static gboolean _action_call_function(SyncDialog * sd, gpointer user_data) { SyncNetAction *sna = (SyncNetAction *) user_data; if (sna->entry) { gchar *str_data = NULL; if (sna->entry->get_data) str_data = sna->entry->get_data(); if (!_soup_xmlrpc_call_with_parameters("sync.callFunctionEx", sna, _action_call_function_got_response, VERSION, ARCH, sna->entry->name, str_data, NULL)) { if (str_data) g_free(str_data); return FALSE; } if (str_data) g_free(str_data); } return sna->error ? FALSE : TRUE; } static gboolean _cancel_sync(GtkWidget * widget, gpointer data) { SyncDialog *sd = (SyncDialog *) data; if (session) { soup_session_abort(session); } sd->flag_cancel = TRUE; g_main_quit(loop); gtk_widget_set_sensitive(widget, FALSE); return FALSE; } static SyncNetAction *sync_manager_get_selected_actions(gint * n) { gint i; GSList *entry; SyncNetAction *actions; SyncNetAction action_check_api = { "Contacting HardInfo Central Database", _action_check_api_version }, action_clean_up = { "Cleaning up", NULL}; actions = g_new0(SyncNetAction, 2 + g_slist_length(entries)); for (entry = entries, i = 1; entry; entry = entry->next) { SyncEntry *e = (SyncEntry *) entry->data; if (e->selected) { SyncNetAction sna = { e->fancy_name, _action_call_function, e }; actions[i++] = sna; } } actions[0] = action_check_api; actions[i++] = action_clean_up; *n = i; return actions; } static SoupURI *sync_manager_get_proxy(void) { const gchar *conf; if (!(conf = g_getenv("HTTP_PROXY"))) { if (!(conf = g_getenv("http_proxy"))) { return NULL; } } return soup_uri_new(conf); } static void sync_dialog_start_sync(SyncDialog * sd) { gint nactions; SyncNetAction *actions; if (!session) { SoupURI *proxy = sync_manager_get_proxy(); session = soup_session_async_new_with_options(SOUP_SESSION_TIMEOUT, 10, SOUP_SESSION_PROXY_URI, proxy, NULL); /* Crashes if we unref the proxy? O_o */ /*if (proxy) g_object_unref(proxy); */ } loop = g_main_loop_new(NULL, TRUE); gtk_widget_hide(sd->button_sync); sync_dialog_netarea_show(sd); g_signal_connect(G_OBJECT(sd->button_cancel), "clicked", (GCallback) _cancel_sync, sd); actions = sync_manager_get_selected_actions(&nactions); sync_dialog_netarea_start_actions(sd, actions, nactions); g_free(actions); if (sd->flag_cancel) { gtk_widget_hide(sd->button_cancel); gtk_widget_show(sd->button_close); /* wait for the user to close the dialog */ g_main_run(loop); } g_main_loop_unref(loop); } static void sync_dialog_netarea_start_actions(SyncDialog * sd, SyncNetAction sna[], gint n) { gint i; GtkWidget **labels; GtkWidget **icons; GdkPixbuf *done_icon = icon_cache_get_pixbuf("status-done.png"); GdkPixbuf *curr_icon = icon_cache_get_pixbuf("status-curr.png"); labels = g_new0(GtkWidget *, n); icons = g_new0(GtkWidget *, n); for (i = 0; i < n; i++) { GtkWidget *hbox; hbox = gtk_hbox_new(FALSE, 5); labels[i] = gtk_label_new(sna[i].name); icons[i] = gtk_image_new(); gtk_widget_set_size_request(icons[i], gdk_pixbuf_get_width(done_icon), gdk_pixbuf_get_height(done_icon)); gtk_label_set_use_markup(GTK_LABEL(labels[i]), TRUE); gtk_misc_set_alignment(GTK_MISC(labels[i]), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(hbox), icons[i], FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), labels[i], TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(sd->sna->vbox), hbox, FALSE, FALSE, 3); gtk_widget_show_all(hbox); } while (gtk_events_pending()) gtk_main_iteration(); for (i = 0; i < n; i++) { gchar *markup; if (sd->flag_cancel) { markup = g_strdup_printf("%s (canceled)", sna[i].name); gtk_label_set_markup(GTK_LABEL(labels[i]), markup); g_free(markup); gtk_image_set_from_pixbuf(GTK_IMAGE(icons[i]), icon_cache_get_pixbuf ("dialog-error.png")); break; } markup = g_strdup_printf("%s", sna[i].name); gtk_label_set_markup(GTK_LABEL(labels[i]), markup); g_free(markup); gtk_image_set_from_pixbuf(GTK_IMAGE(icons[i]), curr_icon); if (sna[i].do_action && !sna[i].do_action(sd, &sna[i])) { markup = g_strdup_printf("%s (failed)", sna[i].name); gtk_label_set_markup(GTK_LABEL(labels[i]), markup); g_free(markup); sd->flag_cancel = TRUE; gtk_image_set_from_pixbuf(GTK_IMAGE(icons[i]), icon_cache_get_pixbuf ("dialog-error.png")); if (sna[i].error) { if (sna[i].error->code != 1) { /* the user has not cancelled something... */ g_warning ("Failed while performing \"%s\". Please file a bug report " "if this problem persists. (Use the Help\342\206\222Report" " bug option.)\n\nDetails: %s", sna[i].name, sna[i].error->message); } g_error_free(sna[i].error); } else { g_warning ("Failed while performing \"%s\". Please file a bug report " "if this problem persists. (Use the Help\342\206\222Report" " bug option.)", sna[i].name); } break; } gtk_image_set_from_pixbuf(GTK_IMAGE(icons[i]), done_icon); gtk_label_set_markup(GTK_LABEL(labels[i]), sna[i].name); } g_free(labels); g_free(icons); } static SyncNetArea *sync_dialog_netarea_new(void) { SyncNetArea *sna = g_new0(SyncNetArea, 1); sna->vbox = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(sna->vbox), 10); gtk_widget_show_all(sna->vbox); gtk_widget_hide(sna->vbox); return sna; } static void sync_dialog_netarea_destroy(SyncNetArea * sna) { g_return_if_fail(sna != NULL); g_free(sna); } static void sync_dialog_netarea_show(SyncDialog * sd) { g_return_if_fail(sd && sd->sna); gtk_widget_hide(GTK_WIDGET(sd->scroll_box)); gtk_widget_show(GTK_WIDGET(sd->sna->vbox)); gtk_label_set_markup(GTK_LABEL(sd->label), LABEL_SYNC_SYNCING); gtk_window_set_default_size(GTK_WINDOW(sd->dialog), 0, 0); gtk_window_reshow_with_initial_size(GTK_WINDOW(sd->dialog)); } #if 0 static void sync_dialog_netarea_hide(SyncDialog * sd) { g_return_if_fail(sd && sd->sna); gtk_widget_show(GTK_WIDGET(sd->scroll_box)); gtk_widget_hide(GTK_WIDGET(sd->sna->vbox)); gtk_label_set_markup(GTK_LABEL(sd->label), LABEL_SYNC_DEFAULT); gtk_window_reshow_with_initial_size(GTK_WINDOW(sd->dialog)); } #endif static void populate_store(GtkListStore * store) { GSList *entry; SyncEntry *e; gtk_list_store_clear(store); for (entry = entries; entry; entry = entry->next) { GtkTreeIter iter; e = (SyncEntry *) entry->data; e->selected = TRUE; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, TRUE, 1, e->fancy_name, 2, e, -1); } } static void sel_toggle(GtkCellRendererToggle * cellrenderertoggle, gchar * path_str, GtkTreeModel * model) { GtkTreeIter iter; GtkTreePath *path = gtk_tree_path_new_from_string(path_str); SyncEntry *se; gboolean active; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, 0, &active, 2, &se, -1); se->selected = !active; gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, se->selected, -1); gtk_tree_path_free(path); } static void close_clicked(void) { g_main_quit(loop); } static SyncDialog *sync_dialog_new(void) { SyncDialog *sd; GtkWidget *dialog; GtkWidget *dialog1_vbox; GtkWidget *scrolledwindow2; GtkWidget *treeview2; GtkWidget *dialog1_action_area; GtkWidget *button8; GtkWidget *button7; GtkWidget *button6; GtkWidget *label; GtkWidget *hbox; GtkTreeViewColumn *column; GtkTreeModel *model; GtkListStore *store; GtkCellRenderer *cr_text, *cr_toggle; sd = g_new0(SyncDialog, 1); sd->sna = sync_dialog_netarea_new(); dialog = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(dialog), "Network Updater"); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); gtk_window_set_icon(GTK_WINDOW(dialog), icon_cache_get_pixbuf("syncmanager.png")); gtk_window_set_default_size(GTK_WINDOW(dialog), 420, 260); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG); gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); dialog1_vbox = GTK_DIALOG(dialog)->vbox; gtk_box_set_spacing(GTK_BOX(dialog1_vbox), 5); gtk_container_set_border_width(GTK_CONTAINER(dialog1_vbox), 4); gtk_widget_show(dialog1_vbox); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(LABEL_SYNC_DEFAULT); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(hbox), icon_cache_get_image("syncmanager.png"), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); gtk_widget_show_all(hbox); gtk_box_pack_start(GTK_BOX(dialog1_vbox), sd->sna->vbox, TRUE, TRUE, 0); scrolledwindow2 = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(scrolledwindow2); gtk_box_pack_start(GTK_BOX(dialog1_vbox), scrolledwindow2, TRUE, TRUE, 0); gtk_widget_set_size_request(scrolledwindow2, -1, 200); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow2), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scrolledwindow2), GTK_SHADOW_IN); store = gtk_list_store_new(3, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_POINTER); model = GTK_TREE_MODEL(store); treeview2 = gtk_tree_view_new_with_model(model); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview2), FALSE); gtk_widget_show(treeview2); gtk_container_add(GTK_CONTAINER(scrolledwindow2), treeview2); column = gtk_tree_view_column_new(); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview2), column); cr_toggle = gtk_cell_renderer_toggle_new(); gtk_tree_view_column_pack_start(column, cr_toggle, FALSE); g_signal_connect(cr_toggle, "toggled", G_CALLBACK(sel_toggle), model); gtk_tree_view_column_add_attribute(column, cr_toggle, "active", 0); cr_text = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, cr_text, TRUE); gtk_tree_view_column_add_attribute(column, cr_text, "markup", 1); populate_store(store); dialog1_action_area = GTK_DIALOG(dialog)->action_area; gtk_widget_show(dialog1_action_area); gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog1_action_area), GTK_BUTTONBOX_END); button8 = gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_widget_show(button8); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button8, GTK_RESPONSE_CANCEL); GTK_WIDGET_SET_FLAGS(button8, GTK_CAN_DEFAULT); button7 = gtk_button_new_with_mnemonic("_Synchronize"); gtk_widget_show(button7); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button7, GTK_RESPONSE_ACCEPT); GTK_WIDGET_SET_FLAGS(button7, GTK_CAN_DEFAULT); button6 = gtk_button_new_from_stock(GTK_STOCK_CLOSE); g_signal_connect(G_OBJECT(button6), "clicked", (GCallback) close_clicked, NULL); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button6, GTK_RESPONSE_ACCEPT); GTK_WIDGET_SET_FLAGS(button6, GTK_CAN_DEFAULT); sd->dialog = dialog; sd->button_sync = button7; sd->button_cancel = button8; sd->button_close = button6; sd->scroll_box = scrolledwindow2; sd->label = label; return sd; } static void sync_dialog_destroy(SyncDialog * sd) { gtk_widget_destroy(sd->dialog); sync_dialog_netarea_destroy(sd->sna); g_free(sd); } #endif /* HAS_LIBSOUP */ hardinfo-0.5.1/syncmanager.h0000644000175000017500000000236111166403363014764 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 __SYNCMANAGER_H__ #define __SYNCMANAGER_H__ #include typedef struct _SyncEntry SyncEntry; struct _SyncEntry { gchar *name; gchar *fancy_name; gchar *save_to; gchar *(*get_data)(void); void (*callback)(SyncEntry *entry, const gchar *response); gboolean selected; }; void sync_manager_add_entry(SyncEntry *entry); void sync_manager_show(void); gint sync_manager_count_entries(void); #endif /* __SYNCMANAGER_H__ */ hardinfo-0.5.1/sha1.c0000644000175000017500000002151211166403363013303 0ustar agneyagney/* SHA-1 in C By Steve Reid 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 #include #include #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 "); 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 */ hardinfo-0.5.1/sha1.h0000644000175000017500000000121111166403363013302 0ustar agneyagney/* * SHA-1 in C * By Steve Reid * 100% Public Domain */ #ifndef __SHA1_H__ #define __SHA1_H__ #include #ifndef LITTLE_ENDIAN #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define LITTLE_ENDIAN /* This should be #define'd if true. */ #endif /* G_BYTE_ORDER */ #endif /* LITTLE_ENDIAN */ typedef struct { guint32 state[5]; guint32 count[2]; guchar buffer[64]; } SHA1_CTX; void SHA1Transform(guint32 state[5], guchar buffer[64]); void SHA1Init(SHA1_CTX* context); void SHA1Update(SHA1_CTX* context, guchar* data, unsigned int len); void SHA1Final(guchar digest[20], SHA1_CTX* context); #endif /* __SHA1_H__ */ hardinfo-0.5.1/util.c0000644000175000017500000006720611166403363013436 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 */ /* * Functions h_strdup_cprintf and h_strconcat are based on GLib version 2.4.6 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * 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 of the License, or (at your option) any later version. * */ #include #include #include #include #include #include #include #include #include #include #define KiB 1024 #define MiB 1048576 #define GiB 1073741824 gchar *find_program(gchar *program_name) { int i; char *temp; static GHashTable *cache = NULL; const char *path[] = { "/bin", "/sbin", "/usr/bin", "/usr/sbin", "/usr/local/bin", "/usr/local/sbin", NULL }; /* we don't need to call stat() every time: cache the results */ if (!cache) { cache = g_hash_table_new(g_str_hash, g_str_equal); } else if ((temp = g_hash_table_lookup(cache, program_name))) { return g_strdup(temp); } for (i = 0; path[i]; i++) { temp = g_build_filename(path[i], program_name, NULL); if (g_file_test(temp, G_FILE_TEST_IS_EXECUTABLE)) { g_hash_table_insert(cache, program_name, g_strdup(temp)); return temp; } g_free(temp); } /* our search has failed; use GLib's search (which uses $PATH env var) */ if ((temp = g_find_program_in_path(program_name))) { g_hash_table_insert(cache, program_name, g_strdup(temp)); return temp; } return NULL; } gchar *seconds_to_string(unsigned int seconds) { unsigned int hours, minutes, days; minutes = seconds / 60; hours = minutes / 60; minutes %= 60; days = hours / 24; hours %= 24; #define plural(x) ((x > 1) ? "s" : "") if (days < 1) { if (hours < 1) { return g_strdup_printf("%d minute%s", minutes, plural(minutes)); } else { return g_strdup_printf("%d hour%s, %d minute%s", hours, plural(hours), minutes, plural(minutes)); } } return g_strdup_printf("%d day%s, %d hour%s and %d minute%s", days, plural(days), hours, plural(hours), minutes, plural(minutes)); } inline gchar *size_human_readable(gfloat size) { if (size < KiB) return g_strdup_printf("%.1f B", size); if (size < MiB) return g_strdup_printf("%.1f KiB", size / KiB); if (size < GiB) return g_strdup_printf("%.1f MiB", size / MiB); return g_strdup_printf("%.1f GiB", size / GiB); } inline char *strend(gchar * str, gchar chr) { if (!str) return NULL; char *p; if ((p = strchr(str, chr))) *p = 0; return str; } inline void remove_quotes(gchar * str) { if (!str) return; while (*str == '"') *(str++) = ' '; strend(str, '"'); } inline void remove_linefeed(gchar * str) { strend(str, '\n'); } void widget_set_cursor(GtkWidget * widget, GdkCursorType cursor_type) { GdkCursor *cursor; if ((cursor = gdk_cursor_new(cursor_type))) { gdk_window_set_cursor(GDK_WINDOW(widget->window), cursor); gdk_display_flush(gtk_widget_get_display(widget)); gdk_cursor_unref(cursor); } while (gtk_events_pending()) gtk_main_iteration(); } static gboolean __nonblock_cb(gpointer data) { gtk_main_quit(); return FALSE; } void nonblock_sleep(guint msec) { g_timeout_add(msec, (GSourceFunc) __nonblock_cb, NULL); gtk_main(); } static void __expand_cb(GtkWidget * widget, gpointer data) { if (GTK_IS_EXPANDER(widget)) { gtk_expander_set_expanded(GTK_EXPANDER(widget), TRUE); } else if (GTK_IS_CONTAINER(widget)) { gtk_container_foreach(GTK_CONTAINER(widget), (GtkCallback) __expand_cb, NULL); } } void file_chooser_open_expander(GtkWidget * chooser) { gtk_container_foreach(GTK_CONTAINER(chooser), (GtkCallback) __expand_cb, NULL); } void file_chooser_add_filters(GtkWidget * chooser, FileTypes * filters) { GtkFileFilter *filter; gint i; for (i = 0; filters[i].name; i++) { filter = gtk_file_filter_new(); gtk_file_filter_add_mime_type(filter, filters[i].mime_type); gtk_file_filter_set_name(filter, filters[i].name); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter); } } gchar *file_chooser_get_extension(GtkWidget * chooser, FileTypes * filters) { GtkFileFilter *filter; const gchar *filter_name; gint i; filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(chooser)); filter_name = gtk_file_filter_get_name(filter); for (i = 0; filters[i].name; i++) { if (g_str_equal(filter_name, filters[i].name)) { return filters[i].extension; } } return NULL; } gpointer file_types_get_data_by_name(FileTypes * filters, gchar * filename) { gint i; for (i = 0; filters[i].name; i++) { if (g_str_has_suffix(filename, filters[i].extension)) { return filters[i].data; } } return NULL; } gchar *file_chooser_build_filename(GtkWidget * chooser, gchar * extension) { gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); gchar *retval; if (g_str_has_suffix(filename, extension)) { return filename; } retval = g_strconcat(filename, extension, NULL); g_free(filename); return retval; } gboolean binreloc_init(gboolean try_hardcoded) { GError *error = NULL; gchar *tmp; DEBUG("initializing binreloc (hardcoded = %d)", try_hardcoded); /* If the runtime data directories we previously found, don't even try to find them again. */ if (params.path_data && params.path_lib) { DEBUG("data and lib path already found."); return TRUE; } if (try_hardcoded || !gbr_init(&error)) { /* We were asked to try hardcoded paths or BinReloc failed to initialize. */ params.path_data = g_strdup(PREFIX); params.path_lib = g_strdup(LIBPREFIX); if (error) { g_error_free(error); } DEBUG("%strying hardcoded paths.", try_hardcoded ? "" : "binreloc init failed. "); } else { /* If we were able to initialize BinReloc, build the default data and library paths. */ DEBUG("done, trying to use binreloc paths."); tmp = gbr_find_data_dir(PREFIX); params.path_data = g_build_filename(tmp, "hardinfo", NULL); g_free(tmp); tmp = gbr_find_lib_dir(PREFIX); params.path_lib = g_build_filename(tmp, "hardinfo", NULL); g_free(tmp); } DEBUG("searching for runtime data on these locations:"); DEBUG(" lib: %s", params.path_lib); DEBUG(" data: %s", params.path_data); /* Try to see if the uidefs.xml file isn't missing. This isn't the definitive test, but it should do okay for most situations. */ tmp = g_build_filename(params.path_data, "benchmark.data", NULL); if (!g_file_test(tmp, G_FILE_TEST_EXISTS)) { DEBUG("runtime data not found"); g_free(params.path_data); g_free(params.path_lib); g_free(tmp); params.path_data = params.path_lib = NULL; if (try_hardcoded) { /* We tried the hardcoded paths, but still was unable to find the runtime data. Give up. */ DEBUG("giving up"); return FALSE; } else { /* Even though BinReloc worked OK, the runtime data was not found. Try the hardcoded paths. */ DEBUG("trying to find elsewhere"); return binreloc_init(TRUE); } } g_free(tmp); DEBUG("runtime data found!"); /* We found the runtime data; hope everything is fine */ return TRUE; } static void log_handler(const gchar * log_domain, GLogLevelFlags log_level, const gchar * message, gpointer user_data) { if (!params.gui_running) { /* No GUI running: spit the message to the terminal */ g_print("\n\n*** %s: %s\n\n", (log_level & G_LOG_FLAG_FATAL) ? "Error" : "Warning", message); } else { /* Hooray! We have a GUI running! */ GtkWidget *dialog; dialog = gtk_message_dialog_new_with_markup(NULL, GTK_DIALOG_MODAL, (log_level & G_LOG_FLAG_FATAL) ? GTK_MESSAGE_ERROR : GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, "%s\n\n%s", (log_level & G_LOG_FLAG_FATAL) ? "Fatal Error" : "Warning", message); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } } void parameters_init(int *argc, char ***argv, ProgramParameters * param) { static gboolean create_report = FALSE; static gboolean show_version = FALSE; static gboolean list_modules = FALSE; static gboolean autoload_deps = FALSE; static gchar *report_format = NULL; static gchar **use_modules = NULL; static GOptionEntry options[] = { { .long_name = "generate-report", .short_name = 'r', .arg = G_OPTION_ARG_NONE, .arg_data = &create_report, .description = "creates a report and prints to standard output"}, { .long_name = "report-format", .short_name = 'f', .arg = G_OPTION_ARG_STRING, .arg_data = &report_format, .description = "chooses a report format (text, html)"}, { .long_name = "list-modules", .short_name = 'l', .arg = G_OPTION_ARG_NONE, .arg_data = &list_modules, .description = "lists modules"}, { .long_name = "load-module", .short_name = 'm', .arg = G_OPTION_ARG_STRING_ARRAY, .arg_data = &use_modules, .description = "specify module to load"}, { .long_name = "autoload-deps", .short_name = 'a', .arg = G_OPTION_ARG_NONE, .arg_data = &autoload_deps, .description = "automatically load module dependencies"}, { .long_name = "version", .short_name = 'v', .arg = G_OPTION_ARG_NONE, .arg_data = &show_version, .description = "shows program version and quit"}, {NULL} }; GOptionContext *ctx; ctx = g_option_context_new("- System Profiler and Benchmark tool"); g_option_context_set_ignore_unknown_options(ctx, FALSE); g_option_context_set_help_enabled(ctx, TRUE); g_option_context_add_main_entries(ctx, options, *(argv)[0]); g_option_context_parse(ctx, argc, argv, NULL); g_option_context_free(ctx); if (*argc >= 2) { g_print("Unrecognized arguments.\n" "Try ``%s --help'' for more information.\n", *(argv)[0]); exit(1); } param->create_report = create_report; param->report_format = REPORT_FORMAT_TEXT; param->show_version = show_version; param->list_modules = list_modules; param->use_modules = use_modules; param->autoload_deps = autoload_deps; param->argv0 = *(argv)[0]; if (report_format && g_str_equal(report_format, "html")) param->report_format = REPORT_FORMAT_HTML; gchar *confdir = g_build_filename(g_get_home_dir(), ".hardinfo", NULL); if (!g_file_test(confdir, G_FILE_TEST_EXISTS)) { mkdir(confdir, 0744); } g_free(confdir); } gboolean ui_init(int *argc, char ***argv) { DEBUG("initializing gtk+ UI"); g_set_application_name("HardInfo"); g_log_set_handler(NULL, G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL | G_LOG_LEVEL_ERROR, log_handler, NULL); return gtk_init_check(argc, argv); } void open_url(gchar * url) { const gchar *browsers[] = { "xdg-open", "gnome-open", "kfmclient openURL", "sensible-browser", "firefox", "epiphany", "iceweasel", "seamonkey", "galeon", "mozilla", "opera", "konqueror", "netscape", "links -g", NULL }; gint i = 0; gchar *browser = (gchar *)g_getenv("BROWSER"); if (!browser || *browser == '\0') { browser = (gchar *)browsers[i++]; } do { gchar *cmdline = g_strdup_printf("%s '%s'", browser, url); if (g_spawn_command_line_async(cmdline, NULL)) { g_free(cmdline); return; } g_free(cmdline); browser = (gchar *)browsers[i++]; } while (browser); g_warning("Couldn't find a Web browser to open URL %s.", url); } /* Copyright: Jens Låås, SLU 2002 */ gchar *strreplace(gchar * string, gchar * replace, gchar new_char) { gchar *s; for (s = string; *s; s++) if (strchr(replace, *s)) *s = new_char; return string; } static GHashTable *__module_methods = NULL; static void module_register_methods(ShellModule * module) { ShellModuleMethod *(*get_methods) (void); gchar *method_name; if (__module_methods == NULL) { __module_methods = g_hash_table_new(g_str_hash, g_str_equal); } if (g_module_symbol (module->dll, "hi_exported_methods", (gpointer) & get_methods)) { ShellModuleMethod *methods; for (methods = get_methods(); methods->name; methods++) { ShellModuleMethod method = *methods; gchar *name = g_path_get_basename(g_module_name(module->dll)); strend(name, '.'); method_name = g_strdup_printf("%s::%s", name, method.name); g_hash_table_insert(__module_methods, method_name, method.function); g_free(name); } } } gchar *module_call_method(gchar * method) { gchar *(*function) (void); if (__module_methods == NULL) { return NULL; } function = g_hash_table_lookup(__module_methods, method); return function ? g_strdup(function()) : g_strdup_printf("{Unknown method: \"%s\"}", method); } /* FIXME: varargs? */ gchar *module_call_method_param(gchar * method, gchar * parameter) { gchar *(*function) (gchar *param); if (__module_methods == NULL) { return NULL; } function = g_hash_table_lookup(__module_methods, method); return function ? g_strdup(function(parameter)) : g_strdup_printf("{Unknown method: \"%s\"}", method); } static ShellModule *module_load(gchar * filename) { ShellModule *module; gchar *tmp; module = g_new0(ShellModule, 1); if (params.gui_running) { gchar *tmpicon; tmpicon = g_strdup(filename); gchar *dot = g_strrstr(tmpicon, "." G_MODULE_SUFFIX); *dot = '\0'; tmp = g_strdup_printf("%s.png", tmpicon); module->icon = icon_cache_get_pixbuf(tmp); g_free(tmp); g_free(tmpicon); } tmp = g_build_filename(params.path_lib, "modules", filename, NULL); module->dll = g_module_open(tmp, G_MODULE_BIND_LAZY); g_free(tmp); if (module->dll) { void (*init) (void); ModuleEntry *(*get_module_entries) (void); gint(*weight_func) (void); gchar *(*name_func) (void); ModuleEntry *entries; gint i = 0; if (!g_module_symbol (module->dll, "hi_module_get_entries", (gpointer) & get_module_entries) || !g_module_symbol(module->dll, "hi_module_get_name", (gpointer) & name_func)) { goto failed; } if (g_module_symbol (module->dll, "hi_module_init", (gpointer) & init)) { init(); } g_module_symbol(module->dll, "hi_module_get_weight", (gpointer) & weight_func); module->weight = weight_func ? weight_func() : 0; module->name = name_func(); entries = get_module_entries(); while (entries[i].name) { ShellModuleEntry *entry = g_new0(ShellModuleEntry, 1); if (params.gui_running) { entry->icon = icon_cache_get_pixbuf(entries[i].icon); } g_module_symbol(module->dll, "hi_more_info", (gpointer) & (entry->morefunc)); g_module_symbol(module->dll, "hi_get_field", (gpointer) & (entry->fieldfunc)); g_module_symbol(module->dll, "hi_note_func", (gpointer) & (entry->notefunc)); entry->name = entries[i].name; entry->scan_func = entries[i].scan_callback; entry->func = entries[i].callback; entry->number = i; module->entries = g_slist_append(module->entries, entry); i++; } module_register_methods(module); } else { failed: DEBUG("loading module %s failed", filename); g_free(module->name); g_free(module); module = NULL; } return module; } static gboolean module_in_module_list(gchar * module, gchar ** module_list) { int i = 0; if (!module_list) return TRUE; for (; module_list[i]; i++) { if (g_str_equal(module_list[i], module)) return TRUE; } return FALSE; } static gint module_cmp(gconstpointer m1, gconstpointer m2) { ShellModule *a = (ShellModule *) m1; ShellModule *b = (ShellModule *) m2; return a->weight - b->weight; } static void module_entry_free(gpointer data, gpointer user_data) { ShellModuleEntry *entry = (ShellModuleEntry *) data; if (entry) { g_free(entry->name); g_object_unref(entry->icon); g_free(entry); } } void module_free(ShellModule * module) { g_free(module->name); g_object_unref(module->icon); g_module_close(module->dll); DEBUG("module_free: module->entries, %p\n", module->entries); g_slist_foreach(module->entries, (GFunc) module_entry_free, NULL); g_slist_free(module->entries); g_free(module); } ModuleAbout *module_get_about(ShellModule * module) { ModuleAbout *(*get_about) (void); if (g_module_symbol(module->dll, "hi_module_get_about", (gpointer) & get_about)) { return get_about(); } return NULL; } static GSList *modules_check_deps(GSList * modules) { GSList *mm; ShellModule *module; for (mm = modules; mm; mm = mm->next) { gchar **(*get_deps) (void); gchar **deps; gint i; module = (ShellModule *) mm->data; if (g_module_symbol(module->dll, "hi_module_get_dependencies", (gpointer) & get_deps)) { for (i = 0, deps = get_deps(); deps[i]; i++) { GSList *l; ShellModule *m; gboolean found = FALSE; for (l = modules; l && !found; l = l->next) { m = (ShellModule *) l->data; gchar *name = g_path_get_basename(g_module_name(m->dll)); found = g_str_equal(name, deps[i]); g_free(name); } if (!found) { if (params.autoload_deps) { ShellModule *mod = module_load(deps[i]); if (mod) modules = g_slist_append(modules, mod); modules = modules_check_deps(modules); /* re-check dependencies */ break; } if (params.gui_running) { GtkWidget *dialog; dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, "Module \"%s\" depends on module \"%s\", load it?", module->name, deps[i]); gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_NO, GTK_RESPONSE_REJECT, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { ShellModule *mod = module_load(deps[i]); if (mod) modules = g_slist_prepend(modules, mod); modules = modules_check_deps(modules); /* re-check dependencies */ } else { g_error("HardInfo cannot run without loading the additional module."); exit(1); } gtk_widget_destroy(dialog); } else { g_error("Module \"%s\" depends on module \"%s\".", module->name, deps[i]); } } } } } return modules; } static GSList *modules_load(gchar ** module_list) { GDir *dir; GSList *modules = NULL; ShellModule *module; gchar *filename; filename = g_build_filename(params.path_lib, "modules", NULL); dir = g_dir_open(filename, 0, NULL); g_free(filename); if (dir) { while ((filename = (gchar *) g_dir_read_name(dir))) { if (g_strrstr(filename, "." G_MODULE_SUFFIX) && module_in_module_list(filename, module_list) && ((module = module_load(filename)))) { modules = g_slist_prepend(modules, module); } } g_dir_close(dir); } modules = modules_check_deps(modules); if (g_slist_length(modules) == 0) { if (params.use_modules == NULL) { g_error ("No module could be loaded. Check permissions on \"%s\" and try again.", params.path_lib); } else { g_error ("No module could be loaded. Please use hardinfo -l to list all avai" "lable modules and try again with a valid module list."); } } return g_slist_sort(modules, module_cmp); } GSList *modules_load_selected(void) { return modules_load(params.use_modules); } GSList *modules_load_all(void) { return modules_load(NULL); } gint tree_view_get_visible_height(GtkTreeView * tv) { GtkTreePath *path; GdkRectangle rect; GtkTreeIter iter; GtkTreeModel *model = gtk_tree_view_get_model(tv); gint nrows = 1; path = gtk_tree_path_new_first(); gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tv), path, NULL, &rect); /* FIXME: isn't there any easier way to tell the number of rows? */ gtk_tree_model_get_iter_first(model, &iter); do { nrows++; } while (gtk_tree_model_iter_next(model, &iter)); gtk_tree_path_free(path); return nrows * rect.height; } void tree_view_save_image(gchar * filename) { /* this is ridiculously complicated :/ why in the hell gtk+ makes this kind of thing so difficult? */ /* FIXME: this does not work if the window (or part of it) isn't visible. does anyone know how to fix this? :/ */ Shell *shell = shell_get_main_shell(); GtkWidget *widget = shell->info->view; PangoLayout *layout; PangoContext *context; PangoRectangle rect; GdkPixmap *pm; GdkPixbuf *pb; GdkGC *gc; GdkColor black = { 0, 0, 0, 0 }; GdkColor white = { 0, 65535, 65535, 65535 }; gint w, h, visible_height; gchar *tmp; gboolean tv_enabled; /* present the window */ gtk_window_present(GTK_WINDOW(shell->window)); /* if the treeview is disabled, we need to enable it so we get the correct colors when saving. we make it insensitive later on if it was this way before entering this function */ tv_enabled = GTK_WIDGET_IS_SENSITIVE(widget); gtk_widget_set_sensitive(widget, TRUE); gtk_widget_queue_draw(widget); /* unselect things in the information treeview */ gtk_range_set_value(GTK_RANGE (GTK_SCROLLED_WINDOW(shell->info->scroll)-> vscrollbar), 0.0); gtk_tree_selection_unselect_all(gtk_tree_view_get_selection (GTK_TREE_VIEW(widget))); while (gtk_events_pending()) gtk_main_iteration(); /* initialize stuff */ gc = gdk_gc_new(widget->window); gdk_gc_set_background(gc, &black); gdk_gc_set_foreground(gc, &white); context = gtk_widget_get_pango_context(widget); layout = pango_layout_new(context); visible_height = tree_view_get_visible_height(GTK_TREE_VIEW(widget)); /* draw the title */ tmp = g_strdup_printf("%s\n%s", shell->selected->name, shell->selected->notefunc(shell->selected-> number)); pango_layout_set_markup(layout, tmp, -1); pango_layout_set_width(layout, widget->allocation.width * PANGO_SCALE); pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); pango_layout_get_pixel_extents(layout, NULL, &rect); w = widget->allocation.width; h = visible_height + rect.height; pm = gdk_pixmap_new(widget->window, w, rect.height, -1); gdk_draw_rectangle(GDK_DRAWABLE(pm), gc, TRUE, 0, 0, w, rect.height); gdk_draw_layout_with_colors(GDK_DRAWABLE(pm), gc, 0, 0, layout, &white, &black); /* copy the pixmap from the treeview and from the title */ pb = gdk_pixbuf_get_from_drawable(NULL, widget->window, NULL, 0, 0, 0, 0, w, h); pb = gdk_pixbuf_get_from_drawable(pb, pm, NULL, 0, 0, 0, visible_height, w, rect.height); /* save the pixbuf to a png file */ gdk_pixbuf_save(pb, filename, "png", NULL, "compression", "9", "tEXt::hardinfo::version", VERSION, "tEXt::hardinfo::arch", ARCH, NULL); /* unref */ g_object_unref(pb); g_object_unref(layout); g_object_unref(pm); g_object_unref(gc); g_free(tmp); gtk_widget_set_sensitive(widget, tv_enabled); } static gboolean __idle_free_do(gpointer ptr) { if (ptr) { g_free(ptr); } return FALSE; } #if RELEASE == 1 gpointer idle_free(gpointer ptr) #else gpointer __idle_free(gpointer ptr, gchar * f, gint l) #endif { DEBUG("file: %s, line: %d, ptr %p", f, l, ptr); if (ptr) { g_timeout_add(10000, __idle_free_do, ptr); } return ptr; } void module_entry_scan_all_except(ModuleEntry * entries, gint except_entry) { ModuleEntry entry; gint i = 0; void (*scan_callback) (gboolean reload); gchar *text; shell_view_set_enabled(FALSE); for (entry = entries[0]; entry.name; entry = entries[++i]) { if (i == except_entry) continue; text = g_strdup_printf("Scanning: %s...", entry.name); shell_status_update(text); g_free(text); if ((scan_callback = entry.scan_callback)) { scan_callback(FALSE); } } shell_view_set_enabled(TRUE); shell_status_update("Done."); } void module_entry_scan_all(ModuleEntry * entries) { module_entry_scan_all_except(entries, -1); } void module_entry_reload(ShellModuleEntry * module_entry) { if (module_entry->scan_func) { module_entry->scan_func(TRUE); } } void module_entry_scan(ShellModuleEntry * module_entry) { if (module_entry->scan_func) { module_entry->scan_func(FALSE); } } gchar *module_entry_function(ShellModuleEntry * module_entry) { if (module_entry->func) { return g_strdup(module_entry->func()); } return g_strdup("[Error]\n" "Invalid module="); } const gchar *module_entry_get_note(ShellModuleEntry * module_entry) { return module_entry->notefunc(module_entry->number); } gchar *h_strdup_cprintf(const gchar * format, gchar * source, ...) { gchar *buffer, *retn; va_list args; va_start(args, source); buffer = g_strdup_vprintf(format, args); va_end(args); if (source) { retn = g_strconcat(source, buffer, NULL); g_free(buffer); g_free(source); } else { retn = buffer; } return retn; } gchar *h_strconcat(gchar * string1, ...) { gsize l; va_list args; gchar *s; gchar *concat; gchar *ptr; if (!string1) return NULL; l = 1 + strlen(string1); va_start(args, string1); s = va_arg(args, gchar *); while (s) { l += strlen(s); s = va_arg(args, gchar *); } va_end(args); concat = g_new(gchar, l); ptr = concat; ptr = g_stpcpy(ptr, string1); va_start(args, string1); s = va_arg(args, gchar *); while (s) { ptr = g_stpcpy(ptr, s); s = va_arg(args, gchar *); } va_end(args); g_free(string1); return concat; } static gboolean h_hash_table_remove_all_true(gpointer key, gpointer data, gpointer user_data) { return TRUE; } void h_hash_table_remove_all(GHashTable *hash_table) { g_hash_table_foreach_remove(hash_table, h_hash_table_remove_all_true, NULL); } gfloat h_sysfs_read_float(gchar *endpoint, gchar *entry) { gchar *tmp, *buffer; gfloat return_value = 0.0f; tmp = g_build_filename(endpoint, entry, NULL); if (g_file_get_contents(tmp, &buffer, NULL, NULL)) return_value = atof(buffer); g_free(tmp); g_free(buffer); return return_value; } gint h_sysfs_read_int(gchar *endpoint, gchar *entry) { gchar *tmp, *buffer; gint return_value = 0; tmp = g_build_filename(endpoint, entry, NULL); if (g_file_get_contents(tmp, &buffer, NULL, NULL)) return_value = atoi(buffer); g_free(tmp); g_free(buffer); return return_value; } gchar * h_sysfs_read_string(gchar *endpoint, gchar *entry) { gchar *tmp, *return_value; tmp = g_build_filename(endpoint, entry, NULL); if (!g_file_get_contents(tmp, &return_value, NULL, NULL)) { g_free(return_value); return_value = NULL; } else { return_value = g_strstrip(return_value); } g_free(tmp); return return_value; } hardinfo-0.5.1/nqueens.c0000644000175000017500000000114711166403363014127 0ustar agneyagney/* * N-Queens Problem Solver * Found somewhere on the Internet; can't remember where. Possibly Wikipedia. */ #include #include #include #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; } hardinfo-0.5.1/nqueens.h0000644000175000017500000000032111166403363014125 0ustar agneyagney/* * N-Queens Problem Solver * Found somewhere on the Internet; can't remember where. Possibly Wikipedia. */ #ifndef __NQUEENS_H__ #define __NQUEENS_H__ int nqueens(int y); #endif /* __NQUEENS_H__ */ hardinfo-0.5.1/benchmark.data0000644000175000017500000020000011166403363015057 0ustar agneyagneyvUf0 Q%k0%A31)΃D:H6OUc`n ̡f}wV?,T ~^ùD' !iCo\W LFtx*V" 5}#UsQVJEKHz$6dMǩсQֺX.=~u&~xY7?&O@CCp]~#e^Q{?cB?𨂦գ~@~y{߫W҂a :_8y]PQ3CC]V"*px:P9 "V5"f85/ &b`gc| Rj 6P)vӢOǖzJ@C曹y[Rozn'j0V` +~z@X8UlUzR%@jTP<%ˣyidJ/J]y%9$6%sCX:N8q~>bC}䱶:Bni;kkoݐSyĔ 8YֿSep:XM3thdj%\29+V=BZlgķ%Q\0zh[w6hw0(V;f+5OCLM 0D<^q0n$=۴ ~-`6">QWӤA'-CVE#qfBf_?T 4C(9c(=v%5!ؗꇸB_57S2AkҞoUXkNP٬u7w(xM" >{)yjeH#t:Pc͔+֟Uo ҈{)v u%~Q__L}9B+^=m/y˗bD9͇N':#^ =lۧ87޾KJ8 vvxWᶂӻ!SYiXH" Tz:F/5toȑʛl@`vBf'ٖY}d [~Xk=tu%psrwF) p)ږGa4ԧPαdl3~P(k~ZB|\X'k\]gj~-t5bo* ܢ3JAKg AŅ^6r㱡Fb U=#*0Xܞq5'"5ojs$y.[4Tu%+I/NO &JNɔ?G]-_:[ۼn$!0ampya ;<L ء/3/BR wdIݐ|}D6'üJҿkbDX\o_ȥ+$, dɠ'y3 ȠMW:ZbEx^IM3# rqO<巢pXǎ[&7BIt[rImM@K=FRZ# >=c浸^|hk:g;#'(! 0!>d\WI}-ĀDylg ScYM]:aұ=8kY YUù}u!?j}7$ fW`4E[Vݏȷ'1ZL-֎0ܨplȏU?w̰荖"k[G["5- {B6%Ogv;&ۅVzdB]v^:6GF/mgw-X^ZH^[L!}ð,LUiAU3&?4$,#;VgĒǰO$蚡jͿ)Yb0_[&h K`OZ_썃:L>nR0Y;Go%YpW ptꓻɒCH\N]¬k[cf/H{RU&J8v6zdr}CZ㞁fg`ӞkPͫCa SZ3/5y'Su(OZup FwH=-$˞ :-uږBR63H K[P0W?/ 7rBl He}7\JvaYW^1#`NW֣4.#Z[ dp䣌XprXSfxĂ6' $pco{tt/ۜa!f-9}[g:ʹ"Ho> \V""u n~:^&FJhΟi"">nhL&-je"`Mr tQc[u6ՉnJ,\?K:="9SC&K!pjHӒ(`gߛW<㳝auQ e=aI)ak4W*i._Tk<5jk$Y34kr *ԓOZ7*p^az$촻rߌqm|иq 7LT*ڸJJg8tY?GNi{*+,sa7F͇2E76O߰K%T2b %"`wA~I6/oQ*miZDgyJs7Z)_M*</klYlh򪊞bq4E%dSO@ox[l(!7,Cga96F0\KG6^n$`_ lA0 p$TkmE?y N1g!Q,//,O판i6*ha1Sܝi8НaG_ϺNAᐉY.}8Y:[iNOc ZT']I]pd!F9Qd5O"#4_@yLW#spB9gM26K1æf:oZ&O!m4!ou`oI0"976ZU >&2WObxQj7J|}ݳre ~meb)C48<D$kw L!9\K/|ommѸ%esly\I܆ T!3/LZjDwAs`X[A!*Jsg_f QX-EI֍d4Nlc9 i:9Cw52 Ǔ5y4EX+x& ڽljuP> 6*Q:˻BT $eu;NIIt4D3'u>5,皨J5k-ZHfa%+v*j]xR?^sLzn J xgQYd4k 3{XZuAv@B3|rqDi#t) _t)Lv{gLդGql:"S[7#Ū?ѵ9ku;)5u0A#2Mڡ d]? {<(^2ck[ z` c{  K-lV3Kr02k4Ƌ|\I'L۔ʗݝ7{2n`.jKR/Jvt%Jϕ)tScRƷz.#g8sy2ɽ]0F|墎#JЃmps=!2YJݓ._ϗQPOȔSK|#N^9{ߝ<>AC5G2Q~kd` UwM{_N] ;XO@g4[ecM_& ~+ ݺ~~ PB)^@ѝ {3O(Ra[,S`?r@R` M1Bҗ2̌ʿ$mևi;7e>5`_.\zMS֘̕YFGG鐒͸a&.ӁxCwgT0XLD`.T$+"nC% 5(!vp,{)+w"BL:w&pj*Qu3DEo̎X$u#pD.S76wRb20z練)VZm(Y'.W$}6n mP fQf?.W#́m7B [Ы}KoiIBIƀ\ZT\dPZ6R^xޟ̇ofR~j x/fʋel钜8f-Lqnʴwc[Q`;2Fob2jU_Zj]xq􄄽(.AՋG`qGC4ɫum[z2b1 o^)qWK߆3!`6eи5.>~B\Jx`ş[1O99c< Wbh)7A3KtAw!}ێe! g֮.6 l6^%1cުhDRYqXwJC\N A!$Y.xOB4r6 kQQlyUG%j LgSeQdM ^j\K0^*EB qle -QnCƤ3STjrYކ7_mxyRׂm-anTLVsdct-jnj?)9o;gfaLO4`XaJT^OzرLKk^lMjW?[{h8劬4!jQ.R2zF:^wxh5n (]mxlI" QK º$Iޖ'%L?7ALo}^rhXZ'R\{5 Jyoq!nΏ) l)iY +7zb?JQT;ˏ.kVw?n9a٬"|SӠA+`V 4`%eޖޞ5*G'JHB#:xZѻ )2ֱYʘyņFf[ƺw{89Do)iwpbT彜a#W9 FlW5Jw5;r}+!JZOݳcx iݙh%bu@n ?~£1a^OrכɚHmtZ C=wWW2ɗI"6qi脎 {xAϺ$'~G^n)[CY-!ϡgQms"gtd$܌v{GR¾w l@1 <>84=WI@KSUC5|c#>W{r[\D}*)W$#{; eh04gv׺IC6&@Ԟ2#Nә,v}qKL_ eIEdPjwbV2Ϯvl5'Psn1ŀmuqỵOBRv-nCNlT2V!_iqwia c͍>*! Q|-A&Mf|htPm׋`hJ %c{T.i\}O)!7Q#K9^(8p!qR HP1!޳ hWX*SѝӝV% nɊ?MUnK1DZ^jՙj0K,ʡ DmP2򱯊nA?wTOi6w'Ob؟:‚˴?* " l_Dia(e^7 PlGAxo5_ݴPhPVB=f4$El <7"ڳ`EX0Ѳ{.G~ )7BG5K:G/\H"!Yh>2ԓ"BfVxGF.h1x4B@;#G?mTrۊp |GtKvL}6n?UËMDmg/J&\D-qtԎ_8Jxsώ3KL側XH塋@⃾.ɲB>Q:M/?7jŊPh9W ֙|f`,>]$tQW 4[ y]Ź.WȐ]W [rysnոu[fnvj@Nq3׾yUw ?(uE-|pRtVFu>DHE2[7'_鑊/@`<]Q&ğ"cR1^%"kIWU0}%Dž_#D:u@13H3}cײjT2˃j.sTRX:N0)|hgڌrpqB| F=Т'(jL1 xƖJ"-ϯ(v&njlD "u:܉2GAGGQxӯ醉·E/8.Lw^ HTmP=M݅AoqYFkP؏Dqlγy9+Wz~5N!\!8Y2sNJ_/zp1mрWaFa aF"MK[=r~vfXI4$d2 kiۈK+ tym~`$ϸ^(S1M=0ZzV'.Ѭ@`oh4Zbjy'&fݿ p@8@`z7/ -XW G45D0D'Qk:_k@w>tUbBʓ|t{f/3-2Z 9Z%9:(4WYmlq}GSr9xNl?QLP4b-!d"8ط;%G9Wύ(,ՙr8TZΓ[=>[{M4Y$Җ;*rͫauu?uP&.qp1@k_qt5dw[3@Di8S')>3U3, 3 AGGq!Fu$!<~H*(5ӪҦDexs#.%tk+/b _F+bK ك둿nTY b҉2 7Xt^Ǧ`w).oԯ8WpȓaK$ lmC]Rj!Y ;zQx'`W 'QqOephs x1j<>V8tnW l3ҳ2s/Jߨa>?sc&d!MZ E0eE}5s;n*u~;EF=0'-f`}) 6Kz6A ĥ$$YB!5 K g_`~V3r*@p?.O$xї8ktwGЍ}x\>8c Cw J a8q)Xߒw>?cU "of5r0v Ȗt`ThyqAA^y/w*.@RNB,V:iI"KM:='BTI#wkn)a.ƄW Jb˸ACO{$ɸua[L]ZUFo8D\@Sٕ@qsjWWg mtJ=[a5.N rXh~WmWJ?nk4|>yݛ1A[:Eq@GZ(,vy=7bocx[3d ǰW׮?Wqb뀩z)W jPꢃG҇m.u8D30@@Hgb DMiIJ i,W`ƨuB*L{t :V%V]PHZz=~K`]lGb$I˶/Ek .5og8CX}f1gZgi3s!U{GM<=yVӧ.*Y0eF> V(֔{'K=% =Lwm)*+0K|b"Q2! 4y_Z~xGZ;?;/pOhKxwjj2ϻAqX@v#}9W+In]E'UP@),@Y$, ?Pk#e2-con=9Ys[_F??bJR}]>m_8O3F_u2s}z}ߵ&;cS=Ot &r&.mp F҄)b.^ !а'"et>j+!4,  u̥4LcrAY Y_W,r@;`[+cS!l||1:#Q)' M-^ƣ{bݚW<{L"\_~[}\h ^ju'92|pw{~ ōh&B"1$0>kr۱_{r9s|262}]*B>lΝ\F-봷ma|U~]{Htw-Rc4lji#E3ohp3Q\VKFgGP1+&ܩˡmm,%( ^iqW lҟĩs u/$0?S*N[o 02wX9v:}Z҄䦜S}#SGz& 59H\TR8Ȱ}^r4{ .N ct1*rf R^(jS\$N ҥ|z&DJW {a"J8n'Y8VlAn .8hTg '4s&D`@ T\%[nnͶ'5 /׭Mp}q'*S@p4*|aZun=p]4 pNp5w?≡r)l,AyO]x,$ˑ ˗"VnaG,KV% *(6@t=HF,]FHf=C_?C'%U7e@ ]}:ԑ ޷8:Ϳ%Ñ0b޳ܶx<%/]!f lܞ.3ڇ2v ;3{~S_ҡhd0Q kTQ v+< ӻaަ)4MmsPA"yetٴbA0m 7*גLŸL,ɋ=#emJbOUii u1PѢx< BiS',j3/⮴%!Kֿ fҔ OO䵎$`lc.xʎWM'PgT  =jȿ|ގ] =6^Z!_p~LNRCM.Pp7wLI#AGhkd-˭Ӽj<ِ& N!"e$QV&:Y7h u5(A nOVxX'7=pVY hn c#H\k'Hޮ [<`e e 4lbLP Z29cխ9%^QShL=zX=EQ?Bu56x%1jLQ#+Lv{k'F> *r 3v/"-UHrprۊm099: |qo(a)OWd7J"]Tx@ UDJ6o޹f9IguT2}k|@V IRM|mލ}z^3VR0 \. u&8h#Q/(ݡz`T&i ٠ 7+3]҉m.u̡:ZhS0Uᑂ$)Wa㋱;rf9̈@Β$agxGZ?IV{Af]|ĥ, ch>ߍ.:ܼ1/fPN^QMd/;M .-mqUSz?/Vo< TE&EO+{V 1m-Hv;eЈ 8t8){*/\HzcV\ZYXmlB=qGT~LX -"`yQn_(/yPGgp"!KΌ tdѵOEi|^l3x/(ޚK0ÇH^Yy)BoN؝k8od>%K#lRs<.X啦AKAE-zZ|[$ ƿ'fuih(Oe%lRYoY+Vorχ[U1U,GKrˡ=tB|eRԆGXX}.hgIxߌebn,}SK-++4؎ @m$.@pa:鞏ZseRc'q`T6b0֕k7ssF˟|m 9l8e\g{+<g5MMwJ]# ^wh,ÿ<ŋ{G<:Tq ~ՈR];*OrH|;vߘNJM`h >Em ⷋA| F|;T^9Zi}.b&p@3Tݢu?Bp̲v!tRhhd*mѬT`'=k bnc4*4w171%VuS51a=a'ns+r}a$C貵I0iw.AhΊþ dA8;`e J Z"#35kuꦇban9{ne-TCj7 :AbU9B]au7#YQal],nw3_^njwġ#[@H]"H;(G=`L/ЖUm^@/^j/ U¼}|'d$P=t{4m^8L3cVh!dE|sF6=Pgĥ kMtBeb0;|{8%!)d VV kSqbKI_%\ @);#>gE>LA\CPC}4$[khACN/QgK'O)`S#;vō55;u``%?3JS+*G̿.tm<u ?YpVENd'ˠʳw&ylOo>w>nKHb9] VQ(2\`F{ĥ/0[ca򇼦u}I:HI ;}E~Y*& 2N}]oC9c΃lm jF*wQ!!\Jo唣7a'y=_X^ bw)v;}xSe.Dh2%bm!&zݫWF)h|@;2V׭ i=&omi:V(kӊOR%>2!_, ٌOith h܈<2&Y2?Jӑ|MW>%;j*Vv` "ϸ3;I+X;joݕ8 |=`D{>T'vy93c9yZ;.%{gXǿDXBM [Ô*؏}XoL{!ӌZV09m~mo,#ʜ8G'Pc[~`gLN2pF4M?K/V\RY &dQvS]SDw(ŽoT u>z{ioojdDq@H&Nߑ#Dxy|Q=P)ClԺUl2^s0oǵN~f~/DU ^csVq=s$Pn?i"NEr'sF 2X%}IAAa&0FjcjQ0Nݝy9ILnP:mՂ٣7+NOڵX6"kV |T Uv.cJ*{/Foo@k#@eg:.cwUVL{)Z9,:|:o ߔMK_dމVkzX&km`f} 1 w]y` ̃0\+%{V^akGf<Ϭlv[屔ci^Wx* JY VU$$k"-J.lӻ2$VDliQ*mcW'emv%y ;bFZ|7'[Ҷ2+ks^k½jc$fm(ҟ|0YXa7R2mbYA0k3dvMMYyƩk'߅f-$]g;(0DS#8BVTai}NTh'bf#ѮlE)Zu!d?1ië& %A=frƢ~-|d6abcd~g+vcdrWd:dQ~zzчH GXp++B#ȩj`-߄^x9l.0ᜂSn_.ᄟN5X `#թ]!UZӔ":yj^sA]M&ېi'n38qƬNOYA,ƒ'TU| ?xMy6O:)aہJZʋ uu]6e`gNЦJEIuiW Z$ijaڻV`<|>Qa4KHRh+LLTY!i<ۤm^S<|M@X5kW[f|G6DwΉj j2%fbԧ{J-۪ZOҫNq8 ~MZRDٛ82l?6ore愲y)xR+4 b\]Ŧ >nI"M;# ـ p|穁hXe{ =oj_U(gR'H 쌤hWHMrD r]4锶{nZ$کy"+*(|Bh?Th6i: EJҎL2V#ګVB}6nVU3΀fMϔCV*1jP%r3^<ަ?gaEZ C~?U\!%h튕UfHL] _r1 z!84 %UsrVBּ8ώE?t" ng$FoU24M6By`V $3s>4{~$ Y k?*MqCCh~0]fI(JӐ?aB1^UKL?v?۲s_t1-e-9zyx^d1ck#f5|Zgm}kJNitO3/z=-?~nR[iF8ƽYT 4#t 84etiËmH >H'v̲-v+i٣$ǪA/lFqHXϷ6]\ C^zbȱT + B}a&ǘ-HeYb"bR(v7?qvMvH6 }^\Z |h}oE_\DQEdk"b `K,؜&O9?ȴgHQJPA/ay<闦vc,LҚQ*w\X؉y[KoMe^"c֯u*32d~n6Z"`$_;IRH=#va^cwd\+ 0VㄌweyJyF/ڏ쾷5YcDnd ]5R.e;fFيԆgiJqEGz!0ȆWv6f+ؿg=e'@9 $/5Vkj"557U Ѭkv67Q$*OiciՙD#)J76vqI_T@ۖ_yuƫ&„aP yJ80R߼XKwiHRƪDb N:˨`Q*EV\yK<6MhK9)=m/īLhʮ4Kp) wLǁb%.:_ ȳx`s!ڳ@!2jT5Nm!}ȁ-X 1ek2.蟗2gXT)6:"PmUƻ_/Vy<q4}ı5=bH]6D@rcJ!LHh" :hG\Wv8sΚ`vnj.N4_\J2&2Do5X w^)p=| ++qh3_F>iuU6|8L/c?kT^ajd)B,z2a*"_^aݾx^>TuW  =y`1_/hDѣmT-q;8bT7*GldKtBܣ_E] P5ez𗩆5*X{gdZB4rzerF[ nJLы2&&P,þrh1h;fc_zw2Sy~,Gk䟕 W5O 1OZ9h<`~ִ2 =?(4=Zx] ,MW|tĦ˯ gSNc}͈FGɍKxVft_,jaYq#Mtdt\"Ђ*~Eit_M35ǬǑI$|"HB`2*+6ric̊B1,4 ]|cz(4a|C"`Dz"x I<!mom43My%3?M,1* n P\R/gٮi{W22P}qCbas[DfON?\}lsP$MnVjRBɇv8>V,m֕'ޙ\\'b1d*m2'>` S/OBc&=yC)O1ܔLH;5C٭ 0k}"y:Vͼppgt -%lʹt֩( e\4:vp8V)vk8+atcjzHFb=*iFFhHP x Y$ik@yNމQGil%_Glm§*7QCfi O7esЅ.Ӯ`K;qcY`EЉǨDžcj?љz$So1 'z7S|^v6q6@qd;>SEI$YjR]_PrU tHYO!ijHj3 D%&Nu5]P{\. -)藅uQHWSD>sӷK(%!.lX[6Coja7]@,;"Q3 8 f7慎p|d_ &p|$ y2AgJŽud6|EgkMpZ΋?sT526f}1 ej$u3k^SARX1rHDD+A"w(8SjDLZRc-X?{e"i׉e$>eO5Űyw6TVՏCy%47_%ӷ :4c/F5q@(x~R(t3AW帓A" dh#`!B5 5nu^$+7㱗Y![Ƅ(MI; h-؄v[OG+ǝ|*l)|"rE'dU*Ta C,13B}9ᑛ57 ~aBD`A "Zuƶh> 7Y7Y[i>>~U-JB[HslC[,M_6oj P"'])HZ'E*vR ZSH돟=[^䕝a d0g[[~1w/yrbђHm(UGv) 2{MOOFWnAXs G5{@ =rv{Y \9#@EV/Gwryk1k6^ngG@N~z+46.=R)"GjwΟZȺk(M=FmHπk2Za-L:Fۉ9XoɻTqgI;ݔ̎Ӄ?*#Q jcdĔ>bdWWrF:h !>qs@D (˹ۉBDC@!|V;DQ !0 $o%v;2ւ?0ś^'͚Nd BfE=*FIJV񥭼|,&S l7+J(Dt8 W'n?U\(yʫWD8!$N\,81puy^\::ր(҂l<h9unzB0øɥ`_ǃmm {v yEnzrوFwF+ ԏPS&릻OM.;" m<=;-[CTE޵^ULTLv4{ljqaOzJ<АY^mbUx8 'L۝SypVISU:WFI#va{z z.܃Hg3NeR8H#lje_^Z}ɟQaPS/c_r{.fHSœ6; Wɂd>&}Tr,}/QBn7X~MG+O4% ݋sSt}'萲xHjF_7`;x3|j ge!(9&?ܡU4ɲUTEsNlA>ۇ$Eے`(t3\\|])|PmC! 3e9kOzNb3o\jfyZOJ1$HI2.+Z/^-àZ*|ɴn,2toh>> _{kfe_D[YcԻAx1V25"gL][`j4;+{=Y$!2c)o"L{/iyOͅN?ZafN$@5EטhV1ggIhEI/~gȊ ǿt;s<ޯ{)j{]$D@ iF?q"lRƏR Rj">i+Tb\ y*sɬ#=#`>6E''pd\<+}YJnK.-u\ְhb^]|ʒ?-. Fyz10[b:g픑\L^l>F9[1 XFFDtJDj.x >d$WCff*I(cR@V,9LWϹ%mϴeP }I(O97]GxѦ&/Gލ4:fN*) Nd *Uq" |b[G7VuhHJ:-9f:It@ɱ)MJucȌNkoAbӟq ȴGP` ' J9i. Ĩ6 T U'(2Ҵe ?rlѴˡLݴ*ߕ!!õqKN)`ݍ>D+RL(w&` @yE8?9by(Fy˶k6eF~*8_-jĸG>jd>a!V - ;iyʼF_~wc}\Hɐ\ OxE(&4=]YhUrA!8ێMԹbL.\͓%DQhX16N o*h/?c7?oplWrFݾ{iUpB!{R!jB}-[sX"ِiЃX두0zp]iA,9>kM%-$snٳW'B<* vr+aD\%FMPI+)Dndb^$8\ \L?DȌmwշ:&nݙ@vOYTvЏݵD=<1eEw+E9D2fHmeh^WV_W)O0{p #KlY#Lyp|Ynr Cખg}s3IS ݨH}^9dt7>wst&la t$8M癟6`*@BBeAh_ZW5T "Gn0XH[/697*2ȏj\CjfEm;^jUa(4pk !Uau >'#/^}R6 dPjZrM})_3ߞ Gb2X,yk^bYaʴyؿP6-YM?Vf>mr'`3[@PfءY,IJNe %.~bFpXz؇>*S=فGl>Ŷ܌nGs!4w`Sr~cJղwӮ$bjF9~pUl W] D8&IY %+&#[h1\\x]V@V[d{&DE Pi<IZoIbt8bBw3kGZmqD=o@Պ-ِh{bVezjHblϘf@$Muƻk,|.=͑hGW5Q4][\RǑfX[$@&dMGu`[m=/e5:!.&w kӜrnK[LNTm Ğ[-`LD!Us!_6WcIZ\RCYkbpg!g2 >܇Fﳾ. '&Q=Sb'J\ߠU,=]:JJ0ʊ7IZ2o DuUF^4ŤOHS,~)\r;29mNwR bduLJ HK?"0 $K%*sS[\WZllRaQ~9GA)dPvt7_־m=tGjz@ Ue=r4޳5xΨ(!#_VD$хWZ3Kx|ba(8.?aLS+1/ĘBD89s8`QJNփB~hǿU0-e;H0]Fĝq.=rT=ݷGqz pIs\a{jxޓKĿxA;[,T%}x`4gzsYbIo}9.o_`o(RR8Q9%^ vA)P7 \1\{Vqx uaԳeg$R-nnGI)7xj 3ւQ+05+쎏p1KdƱC݃M=G??cWf>O“~ Qf{ %MtvGrL2kȯn#H}j"jS@ʊ㒉?Ȩar\A[ܻ=E]۞/bbܓlht9-*Wrѫ8bAb*Ob8|oILmAnW"uC }|S!Tz?%tl"D^[ d.!%@Sɽւ@8veleo KG㱐q- 1yck4?)?$r.:ڛUY~BsA/ rѯ\ !'|̔_ٰ`Y0j};rȖonRDؚt krtf6N'8w̿)z\w@4>D6A:cV.q`^:V 0nRb' YCJXVM@m ++ph{2+%?BW {D2 E׮zܫL NñD>C.Ԕa3Pv,:c. M$G!xLߩm3ӹCT@eCkuhzVr'43#M^Ԕ-x4#2>DJ$gI[&W~'βw4+̆b!KlJ6bK&đxWZ^%laOXlU׵@7`@ra&F=%@G$GhX=r23(G8O֢n}[- X4L!)հ6 ڠ=tᗑ{HkoPBSјӼt^ϸ OFq;*= \0uK8Io6݇p2cpő!'6c3$AD]bYW+I ۹-BxB >5K㾘vЕXs H0%yqymfxdDQr 6gl \4 G Fzg{+ ̊XW=㵳4@Ra&*x[¡v:,0ci7[TkZR/*2#J`a?Mu*r)k;N=E~9[t7._8? 3d kwoL@ h څk6x;8m/,߈_܊o~lbܒu@QX BJI2ђ]{Mt&\}QN :L&Wt#@'x_bG;c=ȽB=6UD5!Jңa΁:ykp42a}Td nWtDӾ7̙K3xnF^K`.hHm$:K@}<,;LrDw# B](oaa(/oF&탭XVzK%ul@3{Cy@Q*C͈.ihU<إkuXqKh(Zzulrkә0OUq\%6ox'0jާB鿄ZǍQZrn=b?5\^YtKs+Ur!bOJ뢐LEkKIeTi#ǚeӀĤ<~8ae`aN@,'c}@M]Y>EҵeBj)8NCīN٩7I0KH2YOţ5|!){q" "[%V"9ZiW_X0f(!j0lx#Iarp=s?3a(Pl(j>ml WSW7C~sΕ415Ho0=r(J,ܿ'r( ƯӃܽzݾk7 wlLV]ok$߭3){H{bV1?A ࿗!x{*R"qP[fPěs 1$j81P}B/Hlޫ 3%i (f~Q{>;xrD4 C,iۍˏBI6jNTS֖ЬWmn1 3nϑr;SPd8'&`pvGzuXA 71Ⲵ#œłC#! -\5n^މ![P/Wo\y.bJGn`296(&2Y" +̮( +Mhj%ٱygmy cyTgZ+((zxWNBt_X})U|eZMH"]TYX67P>%N[ 7q4!|)G \ipgɐy²°lXuYU㩵SAEh; q`eE7m|/ylͣ½iJJI6&8{%5~ JYR[mkKyTKucσ4\YTVoXMNV y̆$!<7h&t;*!~nRhXD [ّUT((TeKvI]Gr{#c'Yn@u>\k h[͋'r;d|sBaI-:l+'[iH}ģH`Mʙ"(I`<#qCJ\3kC&%ʑG}weE@9Bmfc63zoc[?brVrAr'V<SvיouΩ.WW 'ʙ??0_!,N$s`H,a]溼J;t>0Zu9^k (a8tTDPÿg޿>Xn><ɶVHMiO;TS%P4]r{+!4/KME 7K)l8ر[zM_N/vXA(j0>%xh:+RNpgFSn`_BLpt yÓzɍ~_T r+op.N. Уj gdMKI!WbjkšZyܺ&2/1 6` ~X@ )om6!Ejir \vB9:(1{`hΝ|@P^s+S(>!%8΃\o8KmI֞ǃ-RRm{]yn"(nQhw/-]ŸA$z8~'> |OL{Vuͣy^|;p:V2ڗHE^$A@r!R4\yZAl4m_xS{X&!7 @LLQ ;Ah8 oZ > P Z.od+B#Ϡcn(y%l 9wOת%Z |\tFF_灀u#] _{QrQ[vC4_r`6 U8M8+&49Bl(a);Y6$篥X[-``Ke/(Nfܓ/%9C#+ٔю*8춻h$:aˤN.i3wPa)%6&-M=^,u–XŨx5pR??/4v$5A܁!BݛLrR6 >~8ov"i^Jq"׌X@' 1 J'P^y ~ಔD"~e H)F& Tч,41h(*V^N$$ǖB:1,x˙fY]!4|XL67kȱS,$~kɉ}1*DfO}F W;$fCvwP$\*. tj |&k\:;؄(>Ўpp>Ade@.a9k2a ;ilb>ΑȁuJ=ǿQi: uucBD^^/[bj^4 L/]7`T`Ltܛjvob*MJF$|TD.6ϻ&.9Wc-~d:'QdiZ+'׽(ăpS*:2ocZfmFO#Zxp>q #(=0rKIDjϢotolG[A||7szjZHQFo j5hj&73'Ԥ5e@4Ow";T^BLǪ֪SZ_ -ة|\6ԇ&XC`Rw[]3U/'EJB= ~GU<@YSP`6af4c5%^ na?ol"gP Zkk^*%H3fPveOhdsˤU D x p6Zobj)D uqM5sy&6b bJ]߁5ɤ_6%u<|] ͷK,LVo@5 (.TCvcqjzorJ)gZX}, 7{4YJ־r&6T1Yگ -nhQ n. H,E_ҡ5E 6"z WIgQJg) ]h)1K [xM~&"@FxuzuR,3:Bw?M`2Wo _ yj_l%! ^f@.X㙠QjKL-8]-J/HTŦ9f"'F ԅ=>x{H[ou:ǹh Ņb'hֵo}E-[7߷!; ʝxmbMzvtfz;Oj2xOo>;[,d5HX&{4# s[Dر9}fd"q|xa1/U-܊RXn9 MgFEkm2^W Tj?rpٺ:o9c8ֺ/JhJ-7@@{|&7^a =?! gs 6):"f)'>Q6rU^(&3̐Dቕ7ʹN>*XihlXWhL  X%;U$cXcYw) ]ڸ%hyӍ9_c:8P1n4L<_zrUJj2e5҆S+g0gWL̲ٙD` [6DKUEةZ;2U< 餸3oWvoA*}/^{ e: 5%6q99f?z2Wˋ'*/5=A+Tƕ] -/~yfucf;?c]ʝ@܄i"4ԍm%@q({LOE!ܗpYɬ 띂ǀm+3z<iX4Cw @ \r9R3Q:ݻ_i3{f%sG]zPhM=`+kڵBZudM20wdjZoFY2#пnۘ#g9` 'qÐaQM%ם5]gT{BDw{nr(Pq@PHrrSugA8[Չa*d)fY:eh1_GunI4,A *vWc"NJ&"J#eOFb7<W갥IPz<l-a I&͊)IdJA$d٤?OsבHb'3ktuXm6{ rb;egǹ_K~Z_ BmޑZI~0f'rH9l+QW|GA΅ 6ez,ӎ{\lkNaQ#;'Z|٤љ`InݳZQ+R!d)Ja*$)/s MaUXAcvlޤ}2 Hrbw9sJ1Kr`=z? 1 D(Mhz\6"2F rDqՅQ'T)J,6TJ}j&BvT|f.Z< *n cEH`f}M0:\8l\=#n(7KgJ20*G~4b^AԇPޯM?QEfMcOJ,#+rսiiPխpþI]%!6`/֪vw~N `_׎ A*A;įԏ3 j$3m[Dp=pU,.0(c.˩m!V'g4l9Ym'*X^W or[ u @n<ߣݾo'U ^\sǛG >jJjmj!JT:+`˔pKԟpLW? ϴ>V|]$cAU0q-X x &A*UnYjlsN4CkҺ|3g =2B2eiTꌈOn9[rp4J_ڲY˝*m3 Z n#JW(11tM8c c /:l5<{Gx5d1~N:Qf6' gftsc_7p4.T6<ҭӴ[0=jlbY0'E9 M"X+% )S:yeFHPju|l@Oꐉ\MMe"G@S5Wr"Yv ֛ēܰAR FF-ւ3&8e XTq@pO0@Υ_cq 9nfF~EAg@A}6FK'B` dC.ѵ-zv͋st<,6َN8xꗢSX>113 p(ղS7<>[%3u9{{@AUsՄ4ުA{MӮnx 5s#[p6aCzZ t&җ(KFc} {<F;q)(c/A^'`.*H P(=Ή~-p fiVŻ3c4m5q#yJ $̻| nAdQ+ Y^F֯}EIS1䶰顇7ƶQ+Ҽ.?L.xR7掎'n}T}h9*qIE 5?qiۻ`bLž3i=&sH;+ܙ%xFQuS>!U5䙮/'3/Jά~04>@C{ˎjO] 5iAn!ŲH:SnW^;)F:RUϟx,_D>Kvn(Pzt{7ɅR4gC'1 c:3 4%DΰXKo [8ǼZ1@-( q;ucLاmqסݾuqA\UYJ: %kZ-3Fe eS4̿=17Ig7݈4bs T Urਭx8ַh0m-E\CߺFwjT \vLD>\@]|\2@JHys!n3HGċҨqxa3i|d7kէ1ےfuVD*b(?gcGB@| uI=R!ߋ0nAk7jOAAh 8J뛨QPXD vaʱ-u̴ 6F}t ߿n0s:sWaN;ÙoϗI"-&W&8`bj x߰BSph:4b /PىP@s'2Ec?s6bF݄uYφK3g;B:N ULxևljՠwߢJ+DB5#'+FUKyD0Z֓/ǫDG&:_t~tқj6G>}zV~^Oxs9~FtnolU%;m|Sup8&5gt8!rleZRx;4)hZw/- ~kWqxEZܫh cuy=DPn<܈\lc{5zYiY"ns*Bײʷf6'/7ʦ+چ~\r}5nVGk>I z֥+>Lt$CNNsj:QQ A(RW)˥@b5W<DAE= :z%nܜ )zgߥ vm p% BH͵f>ZnJsoed툘;fD5cdTX1` N{,`^EIrս|#vQM$,]o%[Kucg'Z=6MO|A.=K@=r HyGZ=f’dÆi# vqQq fh}jY%9!ˠbx ?¡UR cKl{O~ %T'y{pNqP0oQzaN5s#s?Q %iQ~ oQpZU+TB@mՙm2u𽆹/4$+$Z1޼sB;*v@#ndi-/f}yi#α2.*o߲GEG$EhJc/p4hfWA h }s-N)\ִ( =7]wo@Q:`4̀~@ԇQ7L١4ҋtDd|raͬmZE-6FI"7!L ]Twfn-y El/7zlE]eӢ}Ğ$>0 gsO:L _G}`~5`Ap$tJ+t=W?G5 o mǏWD$!iXK+-٦tcۃn F˧ ?Il,QD"y?5],DQ𒬟nVDf<˵,pZ2 A@W1G5wm9P[ֳ=Q/+ΉuPb.M ׵#& ș83CUlϟLDUj) Ŕh2eD7ݲ^X]=!Ԁېz@ݷ=+W+(lկЖEfH6+TC;%G R9?2f`|(+K\tTvY=gAu0xOἕZ5#vGt^" œ*LAar@ԝb 3)} |j( #LHQVR`*Mٓ[kryC /4hbFˬ~ AyAFT̷T/W >2UR.:JWGXL\Mh&l\{>E#:̎wK+V2㮇_hEwI8QA^M1GbB6dҪ]Jgd XVΣPvQy)!8K#smS Zfx}߅nb%t<2SCcU  `ƱT@hҮvJl˾5q "lc݈+a 89At%,0,Gșڰ y!K _]-hC1;x-9 ukhH"ǵ0-s1|&7 AF`Q < 6`$: @^=kBs.D{_E(_-i+gy5:@fY51G!Ycj-Jm݄I~Gmer%em->;ӜwЩ5w?|>>Ӧi'|*;z{0hh>"9y/[~b= ˶;Ҥް7UE5z]; x3<q9M *GMkKHWq817*Zp}ImBvOJjzŘ헍fb.{\#s ,ڣ>(VFh8m>Ũ` 9?9{UzN5A(w?nͧJ,{цSt<8| ? 3ʶd`lҎQ߸%iCPk}}&̓0a.48\UfPUj(erۘ{4}db<}'ȤP6@;dr6p7˛dA*.ĀRlk^ =6})}bOEIu=H=9g³b;$pȴ8|Jc"iDy4^ M.L,Oj4 ByTOuxw9t/eKCӱ6Yw5ciC^V!+'xmht*.:AUc-*]hge˿U" V; ڊAKZSS]8Oʫh/fpw͝7k7 9ݑ}5z)e+%vv ,c;cUHW LiO_`ٖ{j?y ,z\}KA0` ʡ bltA2fFFgbh%QPȑzvG /LR@럋l6_Z/m_-Lv??PKmhI)u:e&B:X+'(hqOACrtAK @Ґu삫v,;Ҙu WmwbA4C.tQB?w\Ha=2$dF )Gw/b;?{[ ab- )>Y?W4n-?Uynx+m[]ԎFp*oti5S f yi ;n+D3fy~lDQ'r4+;X1Y]قڗ?R|z~Xq%^=etTYSglby7%v,?6(~f!y;HWY*~K,@]u1+T-i/'? WC(Dv3c+٬ͪz#NodVSyO {F|"l͑^? 5+PKU1Y+ǹe úK~ '^Cy|[gND'4WY^Æ4EA8vi" j\7d8Zz7U8qLw *L-;$Q/cuT&%C+\6bnPB#ZBcBv`:[?HQy^wAl3F^=/l@%me7$ODŽ-k4 QDyW0Ze|n^Më3FF BzB @%esJaObq%ÕjЇrӣ̖g?hϬMZ%”:56R/6'—NΤ)to_*WC7{nœyWj|~gAl(;zL`TkSV&ڑv b:%M|dIrKzu 94LHZ߰-~_Oߞc1x`I"8Ԥ9zytFo0yg$ԡ{^C"K験?]S1-ߞGdsdBxGɽm d4FQv}.~HGKJظУQi‹8<1*Uĭ}2̴zb@V<M{$:Yp@ٔYhHq2{\E@VaO *#"kl]k;FiXXuR_?'TYM y^ychDwm߉KQ/|XJ(ۧwͫ ,.,gK>n:ګu Bv8X7Et49azT1_+]6{fo.]aZpW#_9S^rR<,2<ؽ~7~5']5#9iՠᄔ\̰" s igZ *n?U"}¢e$vh7$ȩyukTtn?Ȃmuro4" r-]cTpꊗC4l&`.l)zOY-)(l.<7zd@xTծNk$u<杓Ѿ#ƣzSf"|1^2Ɗ)j*0 SZ}a'S6 Div tr/Aহ/G_7A"d[mGS@Šo?6QVdDį|ǁ6Zu>,i >h!VHx&!v boK=P&ʮπ&C&4ϚߗW`Z?^P%7rv/n(dsoetv\]gqr #r^%!Y}OW|?X* =ި@|OP/4z6-hkoQ$<2љRf!Kg )B}&RMQ[򱹸cQۓfN%j bPwEa|XKf"FXH4VcPF9y,{-' ~ xB@_>RUI,%۝ʭkJlZ!}9JU"E2 ">2V] UΙS;_ԺGOжs ;txa̤Y.TQ Pa8Uh~)uwapUZ'~?_JOI!h@G}#,F:zN%gs "ioLYN`=`ۜX[iEsةt'|j8X?VKs-Xf_ 2s(W=1)\kK2loq[Dzjغ0>QjN+r@*{$%/+ X\BrN|cb7s Ny~Xv ܪxu0A5H$$v/ݨA2îx*b>-lȰբZ̈SQqwR] <"X3Ro<_*Ś{P(Kg.pœ1,© ^Q>C08qx Y9Ճ8zC'R&Ju`>>{v" ڠl.FVg sbE,ƒ*%9ob:OEbtArѯOn@~\<|{)?q0TaG'}LJJkl#xNVr4g8;[+I# -wѶ 3.ىyNZp(ts:çGr]=fo;SB/ |s̽;K;&\!ͪ>d1dWypq7ug> `1P穸vH+]`~!tWwx ƈAw4PU;t?Цyυ3!ZBIgfhV ~BH=Nނ&ʉ& Ek6 [+-0*֘ѣ. Y~:'U>~sc*3OVtP2[G T%4K^[M<I9dO:q~ dDcQ;xlc-r߸s,Qy v[ +;SDZvqOPmL.{MBĂ_y `.ut.cؐ}T+JN8cx``}TH4@ح'Hd$`!+ .3ʥX>ѧsH^@|B5?y2302s&|H,]zmanp*ӕ%r] _A$6n`t*_?#"rx}>&3E%,SξWC84$vM 9ZO2X:G]T) mK{ho*LY4:q0BV}Fi:l_/a8|k(g:4mH%66Uww_rNEP~]XD4u[|%_þ3͖R\&:M1a/a-I8dNɒmgTg7GqY:!JM7c`׼e1j-"&?D`@=~:ٵ4.vZ/ENw!I{ Yr4"{7(Zde*d zZb [n >&5>lMA{3 z]ra= WU4T]Cl%ƐM =LW>lT)\X(4f+?~="h. +;JdI7t{;;- 0N}d5^b`bo(Äd↝"zᛧp}|r9: u\ ̯FswU,>Prp:fNP#x9# o挐qF. S?%dyH.ʍ IEƂf4%mKS:/&@lʍs[(כ0tT4K6$ω[M{R,JnD0iS+2R4xB @ m(u{/|\[ie;;o=Dm lP۠aZ[/N(=g?Lil"2RPakHҨZL}fUU *0`xӯ^YP6ct+a/ dV~UW38uPuTWPhCMhw3,)paAŮFUۇvxM S+@mr}ޣ4} }xǠO80}F픢`cˆ$oj8 .c^;T;,39C `dJdf|xlnZdpqbegC򞞝 pJ-&ռPAnSQlzy` 0 eP͒.q> | 13uڰ*X֟D|sq@: D p+">StOu7K@M&ħn႖!̕\8nZ=*q,}J~zpCӳ͠'-StO"wd1:~Ɩ)"rW`WX6G|~'9/=3iK;ѰlBNLѸ[0Y:s#eYEzFL>գh8ȅO,VNS|jzm+5Pm¢"I7,x{*OוkYCJ֛4ҞoAjinXay%8Pt_oD![? ;= A0wy^l~Az{R:'aHG1op[*;CTxTkg.}kŮ6TAEIIH 4Ӫ};y-NEN <`݇ˆv^#pp^Ĭ"PwSdYTmw>W;dkVnp+z6j|+!S"tjf!C1&H&Ajp0N'T:,Ǫ?1Vx Q:#-#{h Y)3h ]/ fgYr+S f/T}/90n'WX A'`cQy(Jd,|j_uw)V=5GhP9t=[㬤m_;+޼}dh:3

m4N5;/ʮiiѵJMřRDzJ#rh|1|Tu i}j:\cwz8q-Qp䅏Aǐγ,ő6{*ёU[Aާ>G;# s b{vkw`3FQ>^57CD{khwt[^}5 >G|\&C>]FlWh |Pj%f3$7ފY 'B%kœx# La!%TGLofr2"I$eb8nkG7V6-7UdH*:)"TGqMlލXh!]HG]qFB4 C t笐v*p><[F32OyC[7~^ ›띕j#Mit²C|]d;MA{},Ch^4Na-')\Ʒk0#Q>_B.=B9*$.$Ʈ}㛤to>Rt Goi>T{R$ Gd)ˎ/Ż.K\%/Lf>#h4c >LjzI*T[nΤKc ' }s;$=u;ͅGX6Y֒8~$z\o󞎠BwoOEwu?IYXڕ-gFȓr]jgŤ3iГe~;_GrOvSy#gcZXO{ٜkf*SIˮVQPzM~+sBw=9qͽ>Њ_wg.6ʱ俊b9W2'JʧCO`"(]$gDQqqo#=X*/\ޭ0guSw;kְ5Yp؈n{!LEtRk9 y$ mH]LX[_"5]AU4z +Fs=Ϳ'c&MTla5^ &}σ}}Bnձ 78{0[T6)+m; $=%eH!?tv R]=xȒѼIVxQ)u*(G_o .+xvw MͲ)11IX7^KS_Ic_I9Z.-բ)aAK ՜ζ &MHy ZZ[ܷ֨bPRrH&tR a^'ܝf4H.,_PK#ȲC ]n@/~ ~ rX j|v;KBZ$N`5A٤J֮_R] ]y߿ގ)ġzEς``OA q*9A:vm@a_zl@>DA mS`jg8g:gaSAvDXS=E*U0oI^-o*{7{;5njTIZx_XcV ono ׎ÉQ.F|Kikg >L1^/y]b5_eCЂ^{8  /o9WFuT[KHΜLk:,i5WF[x5YCPٞc[r[s' axL?TvDq[bN W͢Ggٓ6Fi6Ӏ+eK۬/0ԃ0V`HH]:AQ>y!ה [4z펻LW6 w[xv~0e==0bZ+9;Z/؍azeǁ^Y &T|퉏_J:3{rk^}TM*Ko.QMdnk:V _ IC:9B~":wtp;/gkPToCS6"2LI˷XJIZ6ynqG ./y)BB۰ %:LjSkisHa!Jd(Zm qt)p̝$WHP@B81N0UbBJq?WRrvaNlsøX:>6#E\;E\(:"5{z.ɣ4z-?,E ;CD"-سLkQ"3K-bLTGā~ioG,VPϻQT[|h.FN/mO뀫 -nK}`K5 ]-x|L)?$xș:قT&%ݵ c,dޮ/ƝpZ'6N =D[4!B` Zj`+kIBAu&ޗKdؼsc1" C>q5pnHzf}VV)ut'Ӑ: WD n$2n W  |[n åS7 E)'Mz,PI9\nENgz +6yl<3X+YR{\Y<ř@5ޡ54ƅ(i7qVٮvNӭ 2M(*|p|5dn-6(62њ=sP顑PJxf9^F:z-U2>11,h Y3e-EGR_36Ҥ3FvY__ 7رJ}Rй*D O!p+(gwpA afÒK^fj`"zP,zU oז$όJV2Nv7d[lOc\ۣ.Ah|\Jy} [D9gx4lmB+*ˏr3m\I2F08!+J$,]hO)%hJ+%Y%xx E~ X/|جaGۈ*~e*&Q*ٶ3-z5dV8,XZC,H# E*ȼ"MUG*hZ%7ZxUYWQU[\UM%01y#w+xw2W[dejQ@>GV ms=jvYceSJO; .(zOS[|0>u JIU<^kISqK5;$u KGhڏK+(HH&orPS5dis}B@`ϋ phJóvTJx`12$rQjg$`)HAU!܏DŽH{Y5cOeȀb!24K\\s">Tg:@9 ̀Eg}]w^ 1CV(-1 5d]ewƝ?lG5xhXڏC!_MO[ݸf*Hc%~m3Wuw(4BJ~ L]%J~ra˄^E ;k`xnS:*^lKv,V_fIsi/kwCJk[WH6-^oPBNwS7D%>.N\3e(QIKGu_B΢d46ِ(Baڃ=N^ (2scX611>RRH㌐(k%SN |+RWGYckI c#WL]_h AJPM8x |xK\[t޶B4aplG>}\U[5CڒY0K9/{DKE8^i;ٚ;*K7ÿ=%B1Na.J 3oK#%D0jxVl%Wy1wO T5> Wqzc/9RG1t^r0D6*(رXa9V:"_M ]crgnڝ1T0 }'z\NHɢp:T}.QCIdlDWDWWA m ̉K`R}"<ޕ&+$<|t;;+Yԥ.^S\rh`\gעmB"hͳG!\ iEAld`E$E1Ji:[%BίRƓmIR2bhg24x =Ѯnpiyfh޳O{ri?3<A1c c\d1sh-[YyVA:&c3Xw,Lۛ á f*M^gJgn,PG VP}) @x9 Ixx?f7pf,fNx3"Yk/ ,*Ё ]ߝڪXw]Qs#vHuwR-(;goSzQ l ydݾEigl>s8N2Л*)_ H&T@v-D~3rR^(bF2 - Lg޿P *r6縞p(+a8};hT:56D%OmGXlXͭzĝۄܳ)mɃ }"aWn+k^L\ ı3FLlna'.- `-wUg@Ր](⼰3lS fW@oJt7gQ%!t 'd., PŸ0cw$~]Veo&9YË*mY/&MȜ<'ē_aʉWg`y*Bo,7DOיEgR(yn$8 CqLkХ |AO32?TD)i|Ɋ*ZV @O!a D{Q#!1lCWpp|`*z=!Hq`V9oQ%Y*,e( lՉ#d5g|^^[gC?lVMQd1%RĴA 99 C8 : 0LX epٛZ?f^ ܌@$?V8yf5)+cƴٌ.2vPPB^4j3)\kk-#z@;=,ڿRi㍌dC `S 1F玌d_F wb7A/fkG"eTmBڗ" `5lm0%HL!'$'_{gWRi$S# /=jy0U81hy⽁qu4OKr*w^J-`8C5C4s%~G{G*x )hm+t+[|洓T_x]bp8Xq L%̚zаXՍUxL9۠5C2 'ऌE)zghfOȫ^J{j@Bi'4 ˴ ;Y*1$G1٪':sAR!{ B`vEv_ r{F1UF>`{uF"s\T{#ƌ:=S}1FCo Mܚ#Yk|.(c̓Bb/RB A]{H=,eq2}l>9f{f G| 5@o c͸޵sz^qޟ囂֦9Y3qj`sG"Dc&4hURLdQ 6$} B*䯉Pmns.$; IlFkdL^fcZCG6lSlʿ MGȹ6e0/WQww<+##(P9`: l|sH.T7|xkFL)u0EYi/r(> %(W!"|5f^ʲ*:#Xmv MH2q/3/Ue?0'3k:d>y!PU6TR&sˎ!D1QU72*8CG{<(hQ٭SNd䌔5j C:\F>jX?_}~"kkUf.%VYҡܗUsl>zu,8CFЛ0b١w6/f<;03Ӳ 0ꔮ]~UxCޢ)}X{8lq?_N,E  +[BP2(uJI!i 5]HaZ턎JPSZW6%vx9pʹlF1{ TbTk]!jk+FI}ӶÚ8;pw;`!G\)$\Y/P9veasQ[X*S,CRG9jpaH<pQ4^wmH.DGR!T%7tvnF_G_okXvWmrI-{@Ga*])7Im\=믯![?hƕ_{[=sڡIǸ=Ipo vc"C1E ص 見aC^Q{ͱs &C?|Q[⨚V͛'$clué"lWX'|a}1f9OHw7ve$o5M]QmfmgyX 6{>T:ЋZ8W$%.`(P&[f%m|:ܰr `"նO$1Jcq3 6Ozdɧ[h'{O"TA'/$b y 6Ts`HVvՓ +<;ǏYH\D-Ңd} r@D^w.}O#FI2u (f>`"ӱS'8bhg#hY+;Xc/m4jՄodLB${ ܗL)dd%Xj7BM١pUP5x7w6۟A'ǰb_g!} w3q:6%m Ȼ/_P/-̧fNS:Oh+m*9I !l[g1:`#2RPT% H?f{\.أjVG19SR8weۖ <^S%VmR(#,?2<2vfdWϳ$ P-֣dbQsBr,o R5 W{;~Q-Y;dEOnT q6SCB~Z>Y^`%l)1 9bayds%o/UqRN8]91L9W6.gZAK_:~"Еh#owT=vRnA^mo?Mҳh WQxs!|Lf!{~..J:Vb#Y?SCD`t%YP m޴RtVeR1yzz-p%+ Ş & kMRQٿ`A7\U(]c 1ugkѾˆCt7 _2X5ohz+'d `Nv?=B{Tݞ*y" ^і ZlXTEƹ !@1$'|f" ˎ`kϲn 䚚ٙقTJd2e=[567~PRkU(`EOdF4<|uk[ʖ4)m&bf@S(*=(ψDXJJ4+A~(IENDB`hardinfo-0.5.1/pixmaps/processor.png0000644000175000017500000000260111166403363016507 0ustar agneyagneyPNG  IHDRw=bKGD pHYs  tIME /1}-IDATHǽMhiUVRݩ$(L"2 3zv@=qă;aa٫39X$im)? fjVv;*ֻ y^xRl ~ü{ꯀ{f?tTZUk㨡 Py%o S6xX1jy=JiÐvSi@{A@ooo_.bxh/LNNaDQDXtuu:f45y{eiiSص 3'addCvލii4PJ144ٽkϟ?gq~/˩7n|сb6Q! #``yٳ)%Fׯ!m|wqKt`ڵke,BJ< &yIO>,37GER)2?;+l63W\aqq$I)RDf`OOOg2H);qR-Ee~g`u]?ޱ!];g!u_]fm[kk*ϟDz,ǫWl6Koo/]]]|49jyo~-\O|8GT*z|a0:: BBiIPP(8| >ooޖ3@IENDB`hardinfo-0.5.1/pixmaps/network.png0000644000175000017500000000142111166403363016160 0ustar agneyagneyPNG  IHDRĴl;bKGD pHYs  ~tIME7>tEXtCommentCreated with The GIMP (c) 2003 Jakub 'jimmac' Steiner'3XTIDAT8˝kQ?w`VdQtqC*XAĀ[FGSDPp(w\椨-6p tH-v`b0-IM6$y9rq~ϝ1V(Ǽ:OxFo\I8Gpo[o&BwBKU $#ϨϹue_9wNHr;C`6E:n"3g J>U܋r[ ɘ{Ea\xj*U.fJ E72[=0;1lhDHRz/yl]J}4 uM:8*tR` $45oJr9gj*VÌ_DeZ{V\.G(|EvJ(gGX,LZP((J)V6S NS!Xѧ;t=~؟<5uu6͞m6Z^gJ2<]|`VpP@N. E?IENDB`hardinfo-0.5.1/pixmaps/usbfldisk.png0000644000175000017500000000146511166403363016465 0ustar agneyagneyPNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8ˋWs8&1#BPI!Yl7 nlBv+]H i&(F7Ngy:3֮9SM;OoN<M&}t]Wn¬+ X^bh5݉-;]gcs%ޞ"7y_g~3׻q.fq+q87yM|l_cՑBYi@! "2c1Zg1Z汘laz{O XxaVu멮,܆{)@|ܱ}kv`\ꍋVvy۫i.,vw/,;0m¯ZN wi=EhԊ{)cR&f 5 K\raEfl|N޻Iek`Я3~)R2}yeoܒGfAȱVAĦubQEDOm sx]x$)H"Iqq \$Q$ui}O.߇NQ9NL8 KEA7ȑe Ȁ.:k05y^E_gN1 3.MTE{4qleZ'Y4QL Yr1()du{f`N@`Uq,HRߓx*65`YPH’z /j^}G BaIlIENDB`hardinfo-0.5.1/pixmaps/mouse.png0000644000175000017500000000215011166403363015617 0ustar agneyagneyPNG  IHDRĴl;bKGD pHYs B(xtIME -oZIDAT8˭kUƟ;/Lff5nIXDPSIVl5fk(Z(S(V Bl_6ؠRPE)4hlufmΰMi>x ss=sssS3̂|> ;>' ,ڞdJriQ6)>qFl?{!4we2 i`sN|?555ְJrF|t:ldIPR`euKK(E>Xvy3mll@oOuhhO/8QU333eEVV&^]z=Je3|G"c,[f\.VR EQ IRoF+b78okkkq"a6hWMirWIBZu]87ouhga2po(nÇwtnvtt/,..B$j S$lfߝZ>qR 6 /xi3{>'=4d6`K.^eO4{iy ?;3Zٙ{mmm ]UE]˝qro/` v3IENDB`hardinfo-0.5.1/pixmaps/joystick.png0000644000175000017500000000163711166403363016337 0ustar agneyagneyPNG  IHDRĴl;bKGDM4{ pHYs B(xtIME(@܊,IDAT8˭]hUsvfvf7?۬ZE1n,&B Ŋ+?%%қh b$z)DoZĶYnM?X$vfgvvgg7,l4q=y96quӀ#24'#sY&R:;jM T姭B|Z2m&&Pc%y?Ɖz"L:Qnk{>*طk JS̀8ڱb˄Du]f]z<{+޷:LaN*7_vLc;V7O/|2^'o}o=(o~Z2;؄p]?kzeH*1=|i?8}!3H,koLd铠ׯ:ǁq۴籜޲zp ȰC^fϡV0  cp:5`us>+W:'ous^eLmyeVтSaPB0@ JG|9qXf.R691tv4 jD!66->#emʳGZ!gdRnfGE-j)'|hp)o*ʉMcueM&06eoX)6lA<^`1f -c/ 8`xn9IENDB`hardinfo-0.5.1/pixmaps/dns.png0000644000175000017500000000256511166403363015265 0ustar agneyagneyPNG  IHDRĴl;bKGD pHYs B(xtIME 9"mIDAT8˽Ml33c:?;chP) &%m%B> R*SժR=T(*mUV@X`&);^{_kwvgwgvf޷Ljr#=zo(:zy6E,ߡb{8f>ᄑrw?ڈ~.[p{l#E ]fiqfi򊹖?xu6G vǩנ'%ڈ:uR-\p,-zR6}tW~z$$;LDhaU!$P fOmrcy=؎4L]SHߺiڽNFDU)s"{VF5v7>Fus~~70|Bߡ!l6 $BJU@?|j^J!y9>ٿXJDgG3ba̰XeRŲ^X@o{~B{ɇ3Gޙ 0z85m vSBI BH6˛U)-57+5*%Mìqdx\յMG*"]ǛmHnW W-w7 L\gXP1"0Mz:D yJRt1smh3um_>w#lUrqk> {0ؗlBTrVEޘ)rܸx=鴥L|d;iF|HH8v*N"|:>-@۶ɝlA:3Q">G BIee%a`uU:ӇȐȃDacߺ-;Yt] `Yw<@b]v"dz޶-kU;1QUC$P';Ɍ|L)ݖjPJZbܗE?4),}?twTͪCQ(Pz;3YR/̓ߩ[C7m =k{y߼"AXIENDB`hardinfo-0.5.1/pixmaps/dev_removable.png0000644000175000017500000000114411166403363017303 0ustar agneyagneyPNG  IHDRĴl;bKGD pHYs B(xtIME ;/AIDAT8ՔMkQ4IB&3k$[ Auٝ.! ]BAno&4$KLg:.L> 3nzr99nPgyG'ǧjgPUueꗯ30ponZ4˱R-NOł%#q6S#4+' Vvnuup y{y VKڭ$D۶W۶M<GOJ\Rb*h4uH}}MJF7MqN$5-LQ֔B"#_pAB>Ԓ4MyDz,i=<2vzP(]bB.ȟs!q>||O|7 K`^M&~8.z$6hZ~)v=W,h_Dt:aMhZ> ee?!j} KC?R>-sh&Eo}IENDB`hardinfo-0.5.1/pixmaps/report.png0000644000175000017500000000220111166403363015777 0ustar agneyagneyPNG  IHDRw=sRGBbKGD pHYs B(xtIME / yyIDATHǵ]PUUks/\/"`b 0b%TZMYC89MD\Sؘ3J 2=VxMͯ(`1 ^.܃x=g:>ph\vr4j=ZkZ+@VpWm}uL" eO&--rv)P} _#>z$^C)w4G; #si S|IENDB`hardinfo-0.5.1/pixmaps/nqueens.png0000644000175000017500000000200311166403363016142 0ustar agneyagneyPNG  IHDRw=sBIT|dtEXtSoftwarewww.inkscape.org<IDATHTMlGfv널:RHlVm 1j8p5j=U(PUTD*TT$Ej/^ۻzCcD?i5oާ^&K{t^&_!/˗?xe`nn~>~|R8Hܻcbc333mpX dn#pz3mAbjHTLXj$AbHle7AD#T*e9TE:kk)CoLVt0rd X,=șzvիyX)fgg7{4wm`h,XM`0nݓ@,Ͳy'HR2rټV p=Zbbkw|/ӫ>Y^^.@<7wϊlF/MUUcef.e8 q O&$Ej78x~XX-lMA6 Dds8T on Tc0&ѩ[ZɓSn59z$mB|||!\!l>l.HJ" hMY`zm;A4 7o`ak8zv}EQru3ߟuKax<.xܭ(*2tMuBldIY"+0 |wP Ӳ,5vg$cVWryDIRi:FGFt:'(v>Aʊb:r(拰H@e躎{OrS>eDnjX0Zѿ9>DFcWNiQ)Hc2nIENDB`hardinfo-0.5.1/pixmaps/raytrace.png0000644000175000017500000000174611166403363016313 0ustar agneyagneyPNG  IHDRw=sBIT|dtEXtSoftwarewww.inkscape.org<xIDATHՕ]h[e=_i~iLlqeME,^BCD UX7\B!~̋C/bZF2VjIzIrzde yjJ)K6c ()yP 8FZ vtth -pqJłu):~rÀÇ5 W> Z& B@_58nRm*G=tHɾ<whBlD}C<|VH=3tN~sx"y( = _ʟX,y04rFg8hKc[s=Og^|%~(pE)0 ?HVr*_>]_DwBom`0Nc66ED%52@Ie!Oa&xϞJke >3y6pk`lL}ǡPXuʔJ%vlG}ضҢ1-?LQ(J?LΞb6c~ 7J#$f&j!uJB4N{klƁ B̮R"}Z#k\.q]d0>1֪-iF RSSǪIo4MVVV4P(mL]I'jimۣbH\ްZuuu1=TR}<qmmttt" o'}i9;ka{ 4F0^ΌZ@1s;:I`t}yTE_@btIENDB`hardinfo-0.5.1/pixmaps/audio.png0000644000175000017500000000220711166403363015573 0ustar agneyagneyPNG  IHDRĴl;bKGD pHYs B(xtIME%vB IDAT8˵oU?Ν_Ka;e) Mc|ˣ?h(g01 &ھ-j .]vٙ3>8iKj|qso'~ϙsz^~ 8px*=z,?~W?+ӟ(.xFR0 UdZBZoߺ;77;zw > N}%Դrsϥ{DѠa22::]۶NP>ͷ_?}%/q㺨VOh1 ˲B MG\vPT d,#-u򼑅*RfJ) wu]6ꅅر˿6(R_xđjL&i(0M4d2eY÷yS'߼ ?"IH)1 cho)%J)bNiZ[Fk,0+( r9$!">ZkR;e!JL#0X#R8r9,6\.SbOMM!@JEQDa5q f xcq$IZEIP*m $l{ lYbM* 1FzN(pr8H)s8C>g7^Ţ;2>~i atX__ci&-?֎&4r_;IEj=n>Za),C \e~~~ix$"@I9x2L֚0 m)%QQיEHa6I4BzNEC, ڱ"!1S˳s?ڶ$ɎyAس,+AWlZ !`..ެ>RJf^3 =~:Fl}@Xd0ʫ/y|f v^@xdOͤ&N R.+?ͼ]V ~ 7 aIENDB`hardinfo-0.5.1/pixmaps/cdrom.png0000644000175000017500000000200411166403363015571 0ustar agneyagneyPNG  IHDRĴl;bKGD4(I pHYs B(xtIME gh<IDAT8˽O\U?潡3 ?'hҺmMLlLM5Tƅ ac4ƅhݘ [?VV "A)̛=.:†rr?Ls8{gh O)ˈHԾ>w}"K$y bmm|\.G"`l|t`7pw2@k2a瑃_)2> HkhD{.-˞|73--nO@m-^ADUGL" EloTDēL2Sx2*  kdl|t2MIJ첪kEk.C%5B@4@c{{[iXMו\ڒnAX,>L&,KU "^:rJDvS2vlx_WWw6G(T`mm}D"Ε7sC=Z`7̙mq'7 nn2XXgxI5`>,dvvvFGX,N8\O$rWEOhj""ޘ b!jWWW%J֖Nvl&'`ii] ӴFdgHwʊJR!Fc|e o@.(e eb(ɚ;S##k a? զRZeqɉ__IC_IENDB`hardinfo-0.5.1/pixmaps/fft.png0000644000175000017500000000175111166403363015254 0ustar agneyagneyPNG  IHDRĴl;bKGD pHYs B(xtIME ! vIDAT8˵]L[eϋrv*QʲelI$4ܠ#]Q/L2޹+41# E"ĀtmeUMEHc6 +-szh{t|rq?<>GΛy+ﳱ)*G䏟Ycѽ>>[ R2l(b*f"op%&"cr'=AGNTsaNGݳ(+2dʥTf"b~?TX5Mg_JIwWpqp%obxܵi~E@1MU?{D2bv/tKMC߬scoŲ,DYo$V| ۪U7DG 9}&bt&Bp'w-}#DO^:z斻[&Po .0A0$Tnׁ.׸^O&Sx5sS}IITU.o{q˖Vު "3;xE7(/ !`ZgIENDB`hardinfo-0.5.1/pixmaps/inputdevices.png0000644000175000017500000000233211166403363017173 0ustar agneyagneyPNG  IHDRĴl;bKGD pHYs  tIME 2zd5tEXtComment(c) 2004 Jakub Steiner Created with The GIMPًo&IDAT8˕[lE̷K-lm /BL\MА(1 ĈYIEL 4B>xyB/JLHBwmwЋmPO3g͙sXXsb=>766<@mmms@$ŷ7555ɖOIeG>:{T=68e[LJ̳O|u?RL&[o/>Eт}?c.޵s0]ρ14i^ǯ2!m/R)8|| K)1|>?ҶG2F2˩M&I,,ػ%5\dTjAaLdsĖ-3w&9.~wx78@1ou7hD"'[`aaFi6JkWTKjcPFB)Zkhm0ZD B iR(oZf|D"2,!PZt0ъ(n-lg@ аjj"33>qN? +W:;޽ٱv_*_c:˗IENDB`hardinfo-0.5.1/pixmaps/dialog-warning.png0000644000175000017500000000167211166403363017401 0ustar agneyagneyPNG  IHDRĴl;bKGD pHYs  tIME-GGIDAT8˥kTW?fȨ6C&ImR2B@lB P 4 u1С Ҵ(hbk3:b&djw>{/Zk:`tEዌiøwRcvu߀ j͛7UlT8&ʶn_DkȃRhH? nT*݂U7_IdtcQi ^I/T,Zv733]^?o:irax]6[r'_=I-.J?:Z -iXq4 Pfthm8{Է<7xi4/hFV2Gh@>Ru ^zmk@hpe2bT Sh-IENDB`hardinfo-0.5.1/pixmaps/network-connections.png0000644000175000017500000000152411166403363020504 0ustar agneyagneyPNG  IHDRw=sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATHOQƿ33qHXMI(,LYJʕ6.D]3&,?W &$*%"DqI@[B3L< I3o=3Q-'bR!Z)P+`T ̆Q)!g\QhNʑ\,}Da iu) LMN/ 3qY@$ !f/ڼͤ;*9O;p?o47BulmoN #!pml?WuQkkKmrШo& fT RJ ?(Ѱ"𡭬i١`Y@1{Zy[t4Dɉ󉫩`>a0i4 @<>((z6z*jr"c}.in)*iQA)owwgʚ|Tpjr:{ftuuLb4c?oܼޛH,| Qв&)3X}W^6Rr#)Ca~~$^J4E8gIELDl&L$ؙ"͹CH2"cl?i#kZP5v%*R!YY(yT)gT;3{?IENDB`hardinfo-0.5.1/pixmaps/modem.png0000644000175000017500000000320511166403363015572 0ustar agneyagneyPNG  IHDRw=bKGD pHYs  ~tIME>tEXtCommentCreated with The GIMP (c) 2003 Jakub 'jimmac' Steiner'3XIDATHǵ[l\Gߜ{MėN$"QE/Q%.T$TFJOO^ߤJ!q{:IU܁RʼnU%"Byz@yv)nft_tF :L{w蚻V}Ӟ[1F1%#I'݁,C NjA9[G%u06a]ZI|ùh&5p|iI. -Yh (nI,n+b,pla9ZTڬɧ?ҽߏW}G Cfi[g2t*2zޟ"UnTxhk޸@L( & xNz[(b|l k-|Cݹ}} &y J@ F M?z}61CIµ z`RAWVI1$@ Qt¹/p_7355Eem%:2 K$v,/o@pݙͦ2F&<6vZ.sv=# (yl.-qU܇Wfn>|2 .,pU8FE>J1"~C5:@&gƅ r q]X$Fwb$(Zn:gp8ҞJAn Zd24eVc- W?6T2pjqq9wB{Z8&뺄QD UiڄԬjLs} SZ*RΜ9؛oYKEXUl<%@bm\u/D<9$lRL\v@Vlؤe,"r QT#B,rl8/t*E B(VU\u\<ߣ-F^rZK䆇av.sGI>_@ QD UP`CNOZkxj5 `˖-qhÇh||7o CiJ`c֗7ʺ@4 MJIENDB`hardinfo-0.5.1/pixmaps/benchmark.png0000644000175000017500000000155311166403363016427 0ustar agneyagneyPNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8KTQƿ5Ι$cB0M%z ע&A!* AC5:S=Q'`֏"! !S(Jkd."|&8~VLQSG+5FU)Zއ}אH#WW1ybaws(T~ O4&!I2@q I©OK[{XQ$EOQ}a]]H[$),W pt:QabNY 5QTFMmll`+™1[_CH}>?Pm BgyI1EA BU0q0Y8\7&Ji=$4}Au{δLoB~Er.KWB[-~13ۜiRLe|&XѦd2ei9~j%'0nd g|"KKJrdy\ 0a ]]2dHh7~ԷUQ[s{߾J^=ݐ,w!yB]o|7sU|^K6C9:'zǭ֛Ed6MӌS#@MUƭeX2M&ѳ 6 #:c-7XU9`"r @0 @Ǧ @ ͥ Qj2koIENDB`hardinfo-0.5.1/pixmaps/devices.png0000644000175000017500000000152011166403363016111 0ustar agneyagneyPNG  IHDRĴl;bKGD pHYs B(xtIME ֊IDAT8˵OSAJH@h@cPIAc|-%Q1tg]RDw.iFbQȣvq)텊$w93A8|ϒ  W yb `?\`j:PI|+[4D_=6tf!HQ_XwaFFG\ZA9PaAUQ` 28^('i+0JYE<4􃱔Hd?A -\*ZTn*N7T*6-\KtlKc Q+U(ٌJR&wAA!""}G/^.V(L2]q?wqe!Zt-:w+'ˣTee·x%7j_ULA;M3`1 ql`*FUfs/oVnw` `xڨ|36Z]N_@N!θ1g <9`o{yػ й2K W/:9LMfj,d22GīSU笌ci<)jN.IENDB`hardinfo-0.5.1/pixmaps/printer.png0000644000175000017500000000167511166403363016165 0ustar agneyagneyPNG  IHDRĴl;bKGD pHYs  tIME 6[:5tEXtComment(c) 2004 Jakub Steiner Created with The GIMPًo IDAT8˵oU?o.GDy8qHEL(B4 @yX2A4\86"%&: #{w|o &DFb̛m0<=5S챁V}ԋsieQ8ʢ;;.{Rr(9Q]ޡ[Q.hvs0w8u"c4%ٟ(`棚˥׀mz^D,a@G>5ssF |jRi=ao.dzsJ%~Z[{;!6ԣQZamS~x;$nDz44PF ai;X^I[nY{fQU'x::ɱqr^gΝn?V![$&in~@^DzL9{<+4AHD`ٌw $#Ev[J:o1/ϯr]3V*cBa% ceۿF44LdOUsi}Ŧ[cW_y|~i6w}ŵ BD9rJ9C ɲLeYc$M$ItZZk@@:תKҐRyޔ1ƈRJ1bm;jrWlo2‹IENDB`hardinfo-0.5.1/pixmaps/blowfish.png0000644000175000017500000000275611166403363016320 0ustar agneyagneyPNG  IHDR+IDAT8˅}Pʲ,_ wQ X"!Q" )8jLC 44M&Ih>l)hKLa"`X]}Ƕ[:}fܙ{ι9^ 2#UyxxѓHG͖hR#}ՊzVN2% |~XnN}+P=ko|3TV<@uuM^ޡqj ;9EK=񯑢4~{@ҡc %;{rO6  #>_?нd ߸ 9.{(&O}{k!Y2rWK=ї5|WB&Xs7V/|w1 #)Cc 0`ߤIs%KdoȞ-OsEb"|K`2Yp| _xG2{ 7lx .+i9 m  ]` QWTB[%wpg1F$K܉S zk=|b7zff`|}б`9JО8l{cya +O0 6E\g 7 j]~J`MNcak2+rGlmog+dڸ`sߎ^ (56ה x`1AC3,6bTp0)\;gcߓ gf(q/oX9*DaІC0h5zUp :z& S/<lOYqPA .&ؑ*N-z\IKXI d+Yӊ+]緥F۲0^DIH3LN> "5 .oJL%݂-zet=E"cg*ں R ˄;w3=CYapM=kryEM#ʢ"h%PtT V.[R$8{t 4KM2;Cv'vQ9ٗSt|*M|OTo& _`Cn}ð17x pW|Ϫ^bk'm5MG^xӚ}Gr骫;.E WlA_Α^9e[x棸E'>xtLւcy68cyʭ} fLPll_l@ZȀIENDB`hardinfo-0.5.1/pixmaps/shares.png0000644000175000017500000000152111166403363015755 0ustar agneyagneyPNG  IHDRĴl;bKGDC pHYs B(xtIME %IDAT8˭KhTYs&&!4f r`p@tQ\Q D2n>V:=֑ADwB_qc&1;{jӉdM Pŭԭ~=q5̲|>quo0pc6gQtꍧ ^/ Y3ADCγsg[~ܼs3r5@+.joo?DR_)&on#2g GC~͡=:w^`OI rit,P Lޝ .UP(d,qt!91+,e10F0Fp=/x:C?UrA!AM}T m;MOZX}hrb(j4>'Ύ, (yee ɑ"t'TZȗk>(*ͬ DkÔ|) $LMi{{y93w @ P(߾cۉ͛uׯ8 ^y3@jmmm5J`RA)\)Ud0 x9"0*"cOwVgggۼSX,ꀪh4b1jkk IHXpy('H`6mKWW/P7K_7BYav9OIENDB`hardinfo-0.5.1/pixmaps/summary.png0000644000175000017500000000261411166403363016171 0ustar agneyagneyPNG  IHDRw=sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATHۏ_U?{so:q UH1HL|šhc GBLjM41/<0 TB`;f(Ԓ8~s]m9sfFŝ^wD5hTyOsZ2 oh\}LN>ԝ"x Ǽ}cvßhXY立;j%V\8 p왗uX 'zZY'M-:Fxn?⵿\+w~lcϼܨtЁɩ/ eg~hR  uT}XcafL.Ԡ?wC3BOxh'YV0J-3!0އ|k˧ޙj~n|~sAd{̫V*RP  @+e\$w}(6)jxӋMx(d^G) 'Gf<279ArNDR4 }pU$whJɬ#o5'Ud`f֧|qoF򂵎:R+$㧿^V[ZԒd4^?h58e*Jnշ 9RPdkK:9"5Pfa7Q0ZY!q戋Fێ ׻")zt{#WJ@AZxxF$Y:%QbK0q[։ШxlFY˝Y|q"D%J-+]Q84k>~. MjץITJ7B)Mf̵jI]AF+O3 ҔM2/'t#z veVv#`Ua7}~KDJ3{|އQ{C<\+ QhjG'k'/]g.!"O9vCO=S??d;oV n l ?W֓[7?~ׯ{wED])RJ@ h޻&&?*٣*֗^ `) vU ,f9+fDE$w_ѢIENDB`hardinfo-0.5.1/pixmaps/report-large.png0000644000175000017500000000470011166403363017075 0ustar agneyagneyPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< =IDAThՙ{pT?k$D@xH Qdj[;NәBt(3=8vaA(*  ,b4<y d7wn]wLg=9^ځBO#~>P! M TJH!@7|^MݚԫK+mu J)T(P((m㶛0MbSR\7qbY7V5/IݤRnl;B1)ZH)dM0 ׅqw! GH W<٭ uʲ0u(m2:mxxq޺-2I__omg_`^v!Yt~ innf طCv=al6~' ;;op^-ۨav}!4-wc8|m +G(Y%Pq; "fu+W87#8B`&>bؑ۶pD[]l6hj!Rh)`چGx1SxGuW#I\)*7}a_(ܽ!<@ N!W2ʑ[nm](:"=}ԕXߌ\@ Q򑘎\J :=JyBeMyI$rD To2$D@ ZېN!MM{~HPo4\rkoF&q|0t?RB6a,Ns aXuzljyXr bxiTG-xuZXbMUG~[%ݍ:]ި- 5+%_J E qv.W& [n.R~G!>zu ~!Դr[xxz)yqӣo6}xq)}EzN^nđGzfJ g]܃<:M`^^% !niv4mWpS(>][fi3@YxC_rvoe_iڻγfY9OU.IGut+}X0D&8tvx)";n^Uk&qGyi3ly9w:g\[\qe198QYwt,ֽwZϞ8Oqϟ> ݂ۋf^ -EYMtvι;Xtv8y~L0L!B͐56SjCi Zn2;xN^ ىr#I0uL@;3BB@H8rSb,,ddgg eO '>?C\EU##odAɲ=n8ci{o!_}5/;˟{O)9 5ͻI'ϐǞdZ"p9ŠDvIENDB`hardinfo-0.5.1/pixmaps/monitor.png0000644000175000017500000000142411166403363016161 0ustar agneyagneyPNG  IHDRĴl;bKGD(i"u pHYs B(xtIME ;8aIDAT8˽MhAMIbK B`iފGToŋR E zQܴozRDŦ IM;y2Y[ ٝoy5 `K_bNLMx08t}?lVD h3"BN'۲ rIjyiiϊC}!DcKK:}тZ5hDus \. V_E@mu}KDk͛@Z}k9uc'ھ|ܭo.tuu2V%^4G(ʺi; 1\;bZu!eqa)癙ܩߥ\NKo}?bOӹ̟L dA#kgn?u- ɗ?xY|'w^)rdz S&D 2h7ZY~ߟ?l_Avoyh;kmcAv&I*ca)'Pz\^ u MB#+GңLYj1`lx,\dHr6y=hnpi1^hTŘءc5|6G3y4DU&ĵllAh{h8#L2L9lQ>^]ff&~>!տwfC;Zd#4:Ɩ66I'U2ST\(Vw [GدZOP$gxHR3NfW薷Z{108a[vgbۜN1 u +l|R뇲'뇃X<*S$VrnW=&z[,rg`ҡՓPÖ1ΰw6+&rssNs! { `t>_%?TK_IENDB`hardinfo-0.5.1/pixmaps/resources.png0000644000175000017500000000172311166403363016506 0ustar agneyagneyPNG  IHDRĴl;bKGDC pHYs B(xtIME U`IDAT8ˍ_h[U{mfkNjfsс( /"l#:AE tTpE/>DִSэmuMV][mצˁ9?>s.T9RIb$jJƪťL|RTutCtuOB5 xBJDJ=l;vK\VBw^;ji߆}(/{Vƥ"P6ֻ~ w0{<3m+E-סLfDm v'4U.`[ߑr,`&3zN"ZcG)MPF#ݵ-!%Z>s qMDB-O`E۸q=P@piƠxlj=^xГ'5nY~kN97DcEb)&`BZ4j NC4Ibq'f* "kU'1I?GEQJDV Xd\=Gy^!N-ITƏr.cn4lUN. oܱotOPv@}n f1,.31miJ]%ea(AW dykt<튶7!JDJ!u&]LevbX5fG4L_7ѓJb ?q_4Ȁ)u9콟@^退6w-lM%1/J_T^-@B^ނa'0ڲ;$?y@Ο `Gap_GS .3@BYPpo/xjdk(IENDB`hardinfo-0.5.1/pixmaps/environment.png0000644000175000017500000000200211166403363017027 0ustar agneyagneyPNG  IHDRĴl;bKGD pHYs  tIME 'IDAT8˝MhU}_y1D,u]X-ERXXUK JJ)])-Ѷ4Iӂ-IZbI_f̽縘ysϽwR`_D^QAd "d}M[TC/ѡ_۹}WR!MCUPm ?ppbza89䶝ճ4 +>>2~jS1}ǿ @uXU@UKJUD=ţoE91~0KStM*mə(~1VcOZ%N~9 @2c; Xk6j >0ä"UA| pf`0 Ss>Zo,ɩC (0j ^J10lu.ɬ0%F;qi| TzRN)֓vR*۴fgŪkYYZe_|]3;Ĺ 4WcmW 6I1KϏ}EF^y/8PbNKc {T#qӖxavzf+ tl.X`&XcIk$qc yo*>G*҃n?]kӊf+' qc!/xun#8rXkޥVxqX @ʼnkZ L@x/m+VՙzǞ27A!H7O\07wCBUlK)%ZPi/4 gyf`T+Uز =_1&Jx|P|;)"$97=\.}>+W;r83y(:yf#0 }5ZzCE0_L âIENDB`hardinfo-0.5.1/pixmaps/about-modules.png0000644000175000017500000000114111166403363017246 0ustar agneyagneyPNG  IHDRabKGDC pHYs B(xtIME :IDAT8˥=hSQ{{iiRFMZ'gnA]:?vEEإ(iO" $i|M3}sυ ld.lut8qLS]yh8&}-J;?1K{j Fl#4#[nnQ(L.5JdzCogo bY6DNH 7і:72eCT8Oc X5dm7Jvk'0' %cp3ĮL1Z]ElƷsjv7mDj1R <=z8ۛ|^?>B>@5やb鑃^`JƘ. mEJ_1ψ %F)վx+%S^|ADmt@k6!w>z7)̄t}pmb;Q.}xZd86'zT_d#l^IENDB`hardinfo-0.5.1/pixmaps/wireless.png0000644000175000017500000000170011166403363016324 0ustar agneyagneyPNG  IHDRĴl;bKGD pHYs B(xtIMEMIDAT8˝kG?VZj" ݌ߪ$bC q|3%P(=JIK\\T| "H'F%r#;=h%ԪSa`goͬoNMO?[n_lXGUXdgn~@(`|:u߷lmm "V(`'OЍ !SFFXk2wnd4>"*N&Cx~!,sBPUh,euTRdkױ"XG=dFGxC"sc/r{8… 'Oc?jVUt{5Jzf21ˈ1Wb{{Et};8xjIuVCr9v  xY^FpLI't|o`jj`'15 ?REXIENDB`hardinfo-0.5.1/pixmaps/network-statistics.png0000644000175000017500000000221311166403363020350 0ustar agneyagneyPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8OG=;OEAjTc6ZVI샾m|}>>4IM*ƪUa#w'pLN_|/3c\v/@0ec:|p$>J)2>tSآimK+g8KeEu+.**HB|1M&atl(LҌֺV1 06ZybK!Jۖr" DzxJ@)o+ƶEX:ekGJ۶:1>xWf&7m^4(X9J=ߦ8 \PLexbLONb#-P̺.?ž愤S75h1LQ~=433833[M2:wD{* TH)tH\@m] F 3q-PͮfeG~v7644zʂwye^b|˒Kud m0:0F{fy_ʅ2~tN]{0geNPǩ{ _J7Μӏ2!@9^F %"ö/2=S-e/OB,~U\&9ZSsW* RSU 8f+|p5Am XxЧ@LIENDB`hardinfo-0.5.1/pixmaps/hdd.png0000644000175000017500000000116011166403363015226 0ustar agneyagneyPNG  IHDRĴl;bKGDC pHYs B(xtIME>;IDAT8AkAv3&Kظ[SXUzxR<֋B!/%ZHBXi7i2^iE<ޛxo&11js`oAˏ>'P{BW;/ډou]>Q]h'"\ץVnNЋzH)βv,wn tiիv>5VW7-+E2$^q9NZ@H)Ri@)%a^Iqp8Tjx(~eq\<۶E۝0Fc8qt/inA0\RTbi|fm:o+掹H * F4ve{MӰ, !ea6ahZ3l~fzAg|GWu׎|=nS\h8|`}J$FE_(A ЃcM2q~yjal (:{6{{M_58voW/>2Q <[!T&/,]mMxJBRXΖIKLfzMáihR!)b tVz3 fN5m(0ύ%`q1 iWuhݲ#B'YYѩVT|{50kb,yMEH,o-?m 22V<~P}/\_[$rs==-XU MQ5xpSgPw-OzXڝhbqpv]onϽ>ǿMH!BHo;ĬuE_w?n" ؙٱ<#]{+>tJ_,t!OkK#R 2Պ @vMS8y>d-woO*#|.uw>&-ZK)jkPɦ J!'Q~71J_[Ot摆Y#T0>r . T*u5bYvjB5/>xnϷ|)W8?=Z\9¦RbI }r4Ұٜ19=S8YE(]M\.8ָkKGc?^!zK}q ,@r1;3+GŽKݗ?q(qeP7P@[Ͼ=35w=aENb]OX< < @`MPQ4giFϺ)Ӂ_-J*̙SjNaץ)j&7RPU,*:8VR0x5IENDB`hardinfo-0.5.1/pixmaps/syncmanager-small.png0000644000175000017500000000170411166403363020110 0ustar agneyagneyPNG  IHDRabKGD pHYs  tIME LE5tEXtComment(c) 2004 Jakub Steiner Created with The GIMPًoIDAT8uk[u?sNIfM&i.[gE*CӛR/EAE -8peh:kK5Yc^N^NsrUܠ<_qć?p]勋 _?ZJf| vSiHgUnld) !]\\XHpW3eLQgP!.?n= ӽX8v~ph _ 6gQlj1;Dz6}Mv^/8fx}~dIq5^Q}WƓfn~"bnjjN?H@H WñI#/Z5R{z(LTyQ-s<8Ba7Wj}8 &GbHFnw,꺁P_0뷶p(> Dhp=b3=.M%it:^3 Rl8T(OeX#Scavkh>-,^[00Ap+Uf%E.햛D,Ar2%TlTUE4zQuvJJKgƵwU6kM ҤT)ZhFAPi:++=1`M8xq3Wma(ԴzIL /TK~yZ/Ř{7㱥Aߐk:>h`mSu'OgNrW=tr%Y!:]s ~ cS #]2IENDB`hardinfo-0.5.1/pixmaps/usb.png0000644000175000017500000000135411166403363015265 0ustar agneyagneyPNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<iIDAT8KTaN3ciI!aiҠf(eEHA%䶝-m #EDm$S"2uL Ǚiμ-;Ё繿e+:._z`vW= ߻{[m'mv_ec^Wo_PWA1Da"0Z)9 r m4DF)3Jbvߗ:-#՞97ݷ[2b(;m9PEm?mLEjV*F?0.P nn!ol5ff2ɠw @ETn:MU U$~ ^wggideNƕb$NHap*<tlg4N1n:M譨cP][c׻3Gm dZ66qRRT[,!=ǥCV;-1ފq{QNoy ^އU6@w 49sw!30+Ʉ)` ;f?Rh@c2֡3߫C=%.:/ɧIENDB`hardinfo-0.5.1/pixmaps/close.png0000644000175000017500000000053311166403363015577 0ustar agneyagneyPNG  IHDR7bKGD#2 pHYs  d_tIME-_BGIDAT(Ͻ1KP,T2T,88 Ǵ#@(td|t!:8Iե<*x;sWEa(x=8 ;/Y^O|`8 ߞHM~%ܟX`ldkRo4X'C>N4eД(> R-2rQQˆӒ AlSRccCGLdܸIpqL? R,SIENDB`hardinfo-0.5.1/pixmaps/status-curr.png0000644000175000017500000000147411166403363016773 0ustar agneyagneyPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8OHQǿqw\*+P(tCCE-/N]KH)vE!CrtnΟ}~vv]G?2?bfF(-?0D i 66_V9za 9u\okn꭮rt\n:0$BWWXlo2:0٫ "2gp˞g{Tʆ"-}|4'8|yLowCP; Hm(47Ư9c%]5&L)ZE"`-ejDjη-:U5Do RB2tV@ >5UC_i;Ț6LFִyQ ˲aL+*GBRpu(; A \F,:nΎ Wz@E(`w,c;2pΕ d9U*Xg/'KvbF@ MX"C"XPXI? *pJ=k_#~c"R?1 ]ԑcͺ g]'w;>=>T 6-77N&qkg!.\na̓j^yҼ06\7:'rQa<webgeϱ={OYRcff"Kυ %g?,U%rٵy J[P!$)uZS<8IENDB`hardinfo-0.5.1/pixmaps/logo.png0000644000175000017500000000417111166403363015434 0ustar agneyagneyPNG  IHDR00WsRGBbKGD pHYs  tIMEy4LtEXtCommentToolbar-sized icon ============ (c) 2003 Jakub 'jimmac' Steiner, http://jimmac.musichall.cz created with the GIMP, http://www.gimp.org\IDAThklޙۀ%` EEJyZtaDCCdp%sԡow0^E$9c 4#i;' + $ݓk-W_rZGd}`-RJI*ɛ_<`<~,F L %XgqNM(XX:"S"BM}hY$c >$es8">hyraHFZk'R)W@|@æ۫>yrlB*E]h./8J(=bێ,c X@kۇ\6[N?yj/ Źh;))ycxu2Zcδ5 y%yn rmPJ!e$eX PJٛf{]WbMRQ'^78vR‘iQn8Ξ,|YJ0BK@z{MB5 ],^;hjfBӛR[x"---x1Qm[5kݮ={^J(\Eax˕s m^za nLwx:Ns ɊQTUoUUTd2YZ,qyJ֚L&CEs5i+hǦ-M]Y. iLt:!/F`o|pCia9]MWXxKdɢ,[]><=SJ'+F {ּ9hćâlVZkjkjJm5bEkA}f̜O_~q@C$n*SI| ͞osW.t7~GǏ2cA?8]6Ճ@%vG_N2vB'L/!8BX|/A*tۨL֑ɥKcwaKRzT71}HYEH_>M*RJQ(ߓ4+ft#-1&bEkĬq 24+Z ;q1qog}<l7O EdKn{7Aρm1֛7l(ٹ-Ǭ"ŀ-}p>DW2M,5c Kvb5:M(OġLxzP* @SNbj+m 䀰hg^ E*^;BbZb=F0`Ci) IENDB`hardinfo-0.5.1/pixmaps/logo.xcf0000644000175000017500000000763611166403363015441 0ustar agneyagneygimp xcf file00BB gimp-commentToolbar-sized icon ============ (c) 2003 Jakub 'jimmac' Steiner, http://jimmac.musichall.cz created with the GIMP, http://www.gimp.orggimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 32.000000) (yspacing 32.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) 2 00 New Layer#1     0000VYXYZc[ ZtY^eU\ _vtZ_fQ\ _wv[^fE\ c}{y\Z_M\ b~\emcZV\U\ _\Za\\]_cfige`]X?pttsqnUUVYbkchd^`lmmb[aff韘}||c^ W\\񫩹[[\T\\􈉊|XT`ceec`ohkU YZ\^`_V \yz|aZ _`^yttu\VvqSSriPTTUVZZSVUVW^X WkV[`PY \mlW\aLY \nmX[a@|Y `trpYW[HY _zvvYYaWWSXPY \|YN^YYZ\`cfdb]ZS;eiihfcRRSV_`X]YSUabbWPV[c锍yqux~|wvpx}}r`[~ TYY񢟱XXYQYY{{|}~~}|pttxUQ{|]`bb`]c\_R VNPR]\sS Ymnp^W \}}zyz][ymhhivYSjePPf]MQQRSWWTWVWXaY XpW\cSZ ]rpX]dOZ ]srY\dCZ aywuZX]KZ `{{Z_g]XTZSZ ]ZT_ZZ[]adgec^[V>koonliSSTW`f^c_Y[ghh]V\ad陒wz~}{v~wa\ UZZ񦤵YYZRZZ􂃄vzz~VR^acca^ibeS WTVX^]yT Zstv_X ]^\snno|ZTpkQQlcNRRSTXX     #r0$h$)%8%6%?    00 Background      >00 R00 b****xxnUSSkww**xxTRRXxvww**_O}~Ocww**OۂRw**_OUUOcxxx**ORx**_OOOOOQcxxx**xxOyOxOxxx**zz{{{{{{{{**x{{**xx}{퇃**xx}{}}***'**&WWWWↆw[YYuWWↆYWX\WWhTVnWWT܅WWWhTWWTnWWUWWWhTTTTTVnWWTTTWW∈WW⑴WWԆԊԉԑԑWWWWWRWWN?44)8#:#9&## 4?A9A# 4%>xvuurtx6# 4=xxA## 4%>xSSx># 4>|>|>|>: 4> >> 4## 4 4 4OOOO OOOOO ( OO OO OO OOO ? 8?$ *BNV`gjkjijihdZTPD7(  $# hardinfo-0.5.1/pixmaps/language.png0000644000175000017500000000215711166403363016261 0ustar agneyagneyPNG  IHDRw= pHYs B(xtIME.r)IDATHՖ[kE3{w7ILHx*~k?Tx)RJ^-ZAil7{zw=xm&j~<oևnc+_]W0W3U儐"qZs{XVk@v^3ye 1cԻ[z5AV:Խ>馯t0idY{8ժ$JpԹR{|e?*~bΝ$+ }6Z)=i煢"W;xZ:ӎF>ol+_s=S '/,X@A^وDHwC.LDnνjd6V21 #q\n]yߐw6վuz/M+R/js.ޙ/b*UޑW+dIENDB`hardinfo-0.5.1/pixmaps/computer.png0000644000175000017500000000167111166403363016334 0ustar agneyagneyPNG  IHDRĴl;bKGDC pHYs B(xtIME 3*CLFIDAT8˭Mh\Uޗd2q4V֐ uSLw,JL5(R\jp#uEQ]VJdIM3o>޼ͼh{.9W^x~@Z=ODq0F!T5Hc.GuKz]Ms k+Z+|qy%;$ڎVn}L~xh_r-#9l (V{&2˃窉T)`(3Eziq໽zKu]Y[ۘݙ)̙ܞdxxiaX' CQqXk3ڬL59) =^~x'ի t:}99=C%0Vp-G.\+6O\3gi9A cssCԥ^ ն_.97P>bAIIENDB`hardinfo-0.5.1/pixmaps/dialog-information.png0000644000175000017500000000226411166403363020257 0ustar agneyagneyPNG  IHDRĴl;bKGDC pHYs  tIME / ={HAIDAT8˝]lUw|NgnRU[PJ!i@DjjR#} AM !$1`ԄBb4F%>!Ceq@;ͽ%EB9a,!$Ι-?E#Na7nZص[4,A/HeEsשFNx]íoتԃD`q\~IÇ7E#낷صi-ejqpsBŌOdϣmZPicHfpkamM)#~mPb6xĒK>TlNyA D9߱p+WoòM)1 !eA %JHRRDР)*M|Pq|xs]gl[CA 1 !VN5N1̙.l8.f_%J yN7尢+D fEt(~" GUPGKY:נޮ`C7-F5:=3k8U1"c'y Վu9ʖ&i=ۻCuɹS3/ S}Ŭ^4*X"q}QVs\<GNYgFG߷ی6ṳ̏1*lJSͪlmT:ri98؜9C KAu?\ sm"/L-.c[cшyG*?}(})X TJm]3$iu줓dr}L͖W_.>|9{nѨz񿀩ho[\}OJtslly~OGQo}굗'(o]_`iB.{:H9lNS4 P@=Mt@Qp%,//D"ģ(}RalllV(ʟ`~CQA,..b``i]7WVVp\D60z=H&(p\8>>F<B/eYx0LHe&$I|3{p^3M۴ pxwA8Q̟ct]7RTeY٭E5KJIQiAIVju5̸} !lvhn6uY#qyUU,FOkkkӱ @Njt^ 0BjtmZ^]]3v}5"*K.9=Xg U<75TO2f5f-<͋2>{ْ;V2xpo=OoK#s/zPpE:IENDB`hardinfo-0.5.1/pixmaps/nautilus.png0000644000175000017500000000236611166403363016344 0ustar agneyagneyPNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<sIDAT8KlTUΝLgVB1 HPD 1uc4qcFLPW H07&.GRPtӢ(”t>=nMkJ_r?>5GijOʻ1I2f4ֹJ/qeIAٔUρJR,օ>̦EK0f5C(҈|sYʥgii5ߞʨp{R&,㛶onI$Z k4,27j̿wVSTAࡎ > ~y!MC ζcOl4PƮa 8#e˪%sPf<9x}6R,S?|(XQ,ZZqFmIe<#=\'XjcMiiO$ ǁ+5N[Xwp+=0{zCyb A9 v<}Uݼq C[1jq}q 50Zts$㹛tJ )hOI8QG.tףiY (ڊRˑ=`j"?fcJIrDTSkP1 T?.vB! G9:ۮaR,{Tli"p5m)#TFeKm\zq5?߆-\ɖ-k[x\h0/ Gip9s>ۛ?pDtoetǹG'6>KMBPz-hM4SgO/ܯ_OoZO$| W |_|Zp%L ⊕AsVVV:u$h( 땟l9V =JsnanfX0 + 16N^H}Ь,oĝ; , =v3G75NyOH3T%1aJ 95{,p,g9`y\$LVָ4}e-L̽2fF 9|~_n|1#Q%7 SB:>UFe<)\Wgߥڜ̿r:YBd̰Q}%{.f_}U:gػvƉYo}TaC0Qsl9)>b^Ţv#I8Mp{n(>7ޜ'2U&z2pzOjàE5Tp5jO,A2Ex{J>-M}2!mT&L8#|Mr09rI|Y"x#C,=Iɣ~5[풡~ Y g-a:Z8FX,JR`aJZ̕OQ"%gfaŎRdl9|@ @?8]ڟ\UIIENDB`hardinfo-0.5.1/pixmaps/cryptohash.png0000644000175000017500000000215011166403363016653 0ustar agneyagneyPNG  IHDRw=bKGDC pHYsHHFk>IDATHœIle>, h)j F[ĄDOތbƥ)b!p05 20)2_ϋ i57'}6ӳ~~d2=.j{mJaQdFu$M"%ZKK]x Q[eIqЧ\̲F,$_󺻻g-x9?}YXnr4 vqu]"(b6M("&رgm>V 8r<~6wqgNNgd3\:H<֭ |pQhjjV@-KCBoo^I&*ԔyT~@]2QsDA/:d2)5kYUQ @Ƕ% s2e۝\xmbQqZ@ au6 6y\E 0LIoYtzfd.wiFAM,KCҲWvjnڪ(IsufffD x.qSJ/<-X,=1ys[r܎+ xs*#.`ֿ?*uҁ_IENDB`hardinfo-0.5.1/pixmaps/users.png0000644000175000017500000000237511166403363015641 0ustar agneyagneyPNG  IHDRĴl;bKGD pHYs B(xtIME ?IDAT8˕[lTe9g{am%PS  H1kD mbb%AQc31HFM$1!MPJnwٳ;]*Lf&g?́-X P= AۃԖ-M@_7L!YùWf OuRg%TZKe8 mMy; 䜛 6պ77Ãz:j#TUV B\p¬m( !8~ n{C}>"U~Jr["t/ʞ*dNcEnR `$7y삃Lpɢpd&@%,D'׵m?ݕ=+5Lf+ϓɚ3Y Q#siF.gb[ f|jЂV+ؕ}̠UjCyw #q'b4`Q9:< 0VO|h8j/d|sYR2jQJ 5 uc8N#*XyǛY؆rnׯIʣj)("s fAH)K@p:7 c~o:ejV=6|'Ű4Bh N6GȤ@r.c˸V=( >zj=yo';Ɏ*g{/t|{Uki$ p@5d {##MQۂ 4`ifΞMWTpױ):DzlDxB-1O嗏Cq}`+}r޴o6opo1Q$p !&ZZaOpQY~9|K,{i{xH2cisw+ŻHyӜ•qt:2svyEJ\H"Ʃ_:wf1W_J(:@{88t h3G^JbV,`1GWfooF3qKa88!DPJݮ߻gгK/oXT*WH]$ s0VX*`,=6vb?|Obb;" "!ϡV5cdYGw شe#~}csY\%vYp Ep[pQr5tE xk[oX2/?r'ܽŽ{'<B2qҪR,CH.I=DB@3VF:WH,jQn&~7Ν1xw3>ًpR,A,_S^l8ز>33`0XaNUU9o&ۜ7%h.\%4M(0l@8 IR |Խ.]Ӵ |%!n !,-t]GZW[9O)E(2Vh)h4ѦrE4m+ *t:X,d20 IcA2D,ksގqPJ u0>1 M֦&ܦ/7U;R4L!ò,B!]9|4 `!ħ[ Ǎ@4[2ij @Ӽغm+`Aпgbᢅ_v啥o/l r eY, " avVf/>@ @U߼qp$9} Kk>^7\.(p@4BX?GZmBV+6IQ9\ t_4 C; >_; | ggk3sQ=nBXPG@4ͧit:;_}n-ya2PJ&?g/ߟ~[[/K2nYVfzzpܯ4z"Txڪg[>h7%>ڭ4wFjdjwblZEኝG,xp|(ͱ) q\lG7mr ﻵ&Xu۳O1׼;ecےc/ocm2te4$W<[ر-Ue%IcX='H)˲$ , K)#c2c`)0-{>M Y:m; GQp]7( Ha Sq1-ϑ[iG aO'5_Ֆ\Ǔ KsIg(Ͽs5i(e#% yC$^]ġ'8m+3k-![uP3o|ϿTۮ^BbvP }<+xz{ ޻O`_EQ2S:f}Z}GAH [(]cU1<h]Nebg]nMgvoχ|c?鼃J(UI4Ű7יW5-Y j>4͏zK9p XTV ʣ$" ^)Iyf܍K#d5gBz%2+O@Pb!%ZaVg}XĜ dIENDB`hardinfo-0.5.1/pixmaps/syncmanager.png0000644000175000017500000000740011166403363017001 0ustar agneyagneyPNG  IHDR00WsBIT|dtEXtSoftwarewww.inkscape.org<IDAThyl}?of$xH$EQ-ӲVe:T µDlR#( Ҧ6==ڍ&%[Yu)7W<+a; ? w )%YmD}R׾-y4EuBjN`:/&\$l!HK)E9ݽGE@\+ : $q~y"02b٬d1r9r*;}XxɤҒJy@]r`C 5@6˗go};O9E4"7XvLQд`!(ðla*LoPᇯ4}-҅ہ%tgǰޟJA/p|@>DEmIܢəѶXC_O7Fj>eIkpcNX?h$tgH%ÀN2a.nuYv>?ٲe@Uy _(? hH$GYxU(w%M N=Dž v ** iPU桍y&  0M[lM_߼bd Hwv[콪n.kD,̩o@R*(TװxQ3C#(qؾa/o|2 1 Uxg8w^A}#,>]0L~w/7% NcR̞< 4̭EQLdѢ$s'N<iEV]S-y(ϰ_Vy{{MgI< gƨ9.EGOzg? aT6WՓ%]/*!p9{Y cux7M!_ÿq̩"DD3L OfcaEQͩz@u RbHwvGQs]*;/]V)X4B4mq8v|OWp 躎m:D.=xwKຮY&H{rLͷ>{C fdYFEoDtBu sE)qy}^ fxdO 8y}0/8/|;)ڻ(K+\2&&_G2~H i(R(( cYή_Ob!/RtgG/d&V׾M۽eGJ'!I.N8z~S01"Y`0#P( DT7\q$u]7 4j۶ MNNrYoTr;$ 4MC4BP1LFKXlrm=wqعsR~q/J)׌t@JCxmaFFFJq!D#ਪz:hTn޼>n( !T p]<+e˖=p]]]aĄgϞvaQ(fxTa;12 j޵U}[{JǔC;U?՝ WtѷqD_̂qӿ#ґjŭV|+êɷ>-:ėG)K[WE/Vg)p~sqf_ر}N}/o4B`豽\͉SNt.Ϡ"\*5u~um^S'q4K S 6J/ԇGgǓ *cV1~ҍ1ʦEہW*IAρbVl eӪ){M7)qK z$83 Ts(@ZuMV6W+e %*J]V]E 3o濼Ӟ^[P`@*%H8LFOa6Jl5K.Q1e (1" Q$J)rA4EJ*e, >7Z²ml ܠ8Xi@8Z:X,l~i'kZm4>ɲ*l7諾+-e5X۶&IvȆ@$gF3^yBJYO˲p6vwjK'\ l=Pzl T4/,VսG$mbq8DqLC^qS=7'.MIg/i5h$&x-{{?W[ `(6 E7zP d,6P(O7x?PCA ZM|hIIENDB`hardinfo-0.5.1/pixmaps/compress.png0000644000175000017500000000126111166403363016324 0ustar agneyagneyPNG  IHDRw=bKGDC pHYs oyQIDATH픽kSQsGLڄƊꢎGAp ~LN8Q,R݄V:A-EC". M[/6msqmi4p=ylK <( u$Rj.`ռ( ,)8x6^;"֚_K2׽8ֶX4і M}op{ 7 &3Hƙ@iy23OBbS;?fr|4{='p}RS_0r_!-&>: i7k4UcUZD/9h+L3]I{ҀXˎp:ʙZihUUޕWُ8v*x0< @WS]z@"D֮#3;:Dpj: H#rx,b\W&&p7R}ZMpّ\c;~DJUyPXkCՌ!! m+@1+܄ dUf `kGhֆ|3X6X\*’~8lK-Y@ cP(Xj)þjot IENDB`hardinfo-0.5.1/hardinfo.c0000644000175000017500000000742711166403363014252 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 #include #include #include #include #include #include #include ProgramParameters params = { 0 }; int main(int argc, char **argv) { GSList *modules; DEBUG("HardInfo version " VERSION ". Debug version."); DEBUG("g_thread_init()"); if (!g_thread_supported()) g_thread_init(NULL); /* parse all command line parameters */ parameters_init(&argc, &argv, ¶ms); /* show version information and quit */ if (params.show_version) { g_print("HardInfo version " VERSION "\n"); g_print ("Copyright (C) 2003-2009 Leandro A. F. Pereira. See COPYING for details.\n\n"); g_print("Compile-time options:\n" " Release version: %s (%s)\n" " BinReloc enabled: %s\n" " Data prefix: %s\n" " Library prefix: %s\n" " Compiled on: %s %s (%s)\n", RELEASE ? "Yes" : "No (" VERSION ")", ARCH, ENABLE_BINRELOC ? "Yes" : "No", PREFIX, LIBPREFIX, PLATFORM, KERNEL, HOSTNAME); DEBUG(" Debugging is enabled."); /* show also available modules */ params.list_modules = TRUE; } /* initialize the binreloc library, so we can load program data */ if (!binreloc_init(FALSE)) g_error("Failed to find runtime data.\n\n" "\342\200\242 Is HardInfo correctly installed?\n" "\342\200\242 See if %s and %s exists and you have read permision.", PREFIX, LIBPREFIX); /* list all module names */ if (params.list_modules) { g_print("Modules:\n" "%-20s%-15s%-12s\n", "File Name", "Name", "Version"); for (modules = modules_load_all(); modules; modules = modules->next) { ShellModule *module = (ShellModule *) modules->data; ModuleAbout *ma = module_get_about(module); gchar *name = g_path_get_basename(g_module_name(module->dll)); g_print("%-20s%-15s%-12s\n", name, module->name, ma->version); g_free(name); } return 0; } if (!params.create_report) { /* we only try to open the UI if the user didn't asked for a report. */ params.gui_running = ui_init(&argc, &argv); /* as a fallback, if GTK+ initialization failed, run in report generation mode. */ if (!params.gui_running) params.create_report = TRUE; } if (params.use_modules) { /* load only selected modules */ DEBUG("loading user-selected modules"); modules = modules_load_selected(); } else { /* load all modules */ DEBUG("loading all modules"); modules = modules_load_all(); } /* initialize vendor database */ vendor_init(); if (params.gui_running) { /* initialize gui and start gtk+ main loop */ icon_cache_init(); stock_icons_init(); shell_init(modules); DEBUG("entering gtk+ main loop"); gtk_main(); } else if (params.create_report) { /* generate report */ gchar *report; DEBUG("generating report"); report = report_create_from_module_list_format(modules, params. report_format); g_print("%s", report); g_free(report); } DEBUG("finished"); return 0; } hardinfo-0.5.1/hardinfo.h0000644000175000017500000001054711166403363014254 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 __HARDINFO_H__ #define __HARDINFO_H__ #include #include typedef struct _ModuleEntry ModuleEntry; typedef struct _ModuleAbout ModuleAbout; typedef struct _FileTypes FileTypes; typedef struct _ProgramParameters ProgramParameters; struct _ProgramParameters { gboolean create_report; gboolean show_version; gboolean gui_running; gboolean list_modules; gboolean autoload_deps; gint report_format; gchar **use_modules; gchar *path_lib; gchar *path_data; gchar *argv0; }; struct _FileTypes { gchar *name; gchar *mime_type; gchar *extension; gpointer data; }; struct _ModuleEntry { gchar *name; gchar *icon; gpointer callback; gpointer scan_callback; }; struct _ModuleAbout { const gchar *description; const gchar *author; const gchar *version; const gchar *license; }; /* String utility functions */ inline void remove_quotes(gchar *str); inline char *strend(gchar *str, gchar chr); inline void remove_linefeed(gchar *str); gchar *strreplace(gchar *string, gchar *replace, gchar new_char); /* Widget utility functions */ void widget_set_cursor(GtkWidget *widget, GdkCursorType cursor_type); gint tree_view_get_visible_height(GtkTreeView *tv); void tree_view_save_image(gchar *filename); /* File Chooser utility functions */ void file_chooser_open_expander(GtkWidget *chooser); void file_chooser_add_filters(GtkWidget *chooser, FileTypes *filters); gchar *file_chooser_get_extension(GtkWidget *chooser, FileTypes *filters); gchar *file_chooser_build_filename(GtkWidget *chooser, gchar *extension); gpointer file_types_get_data_by_name(FileTypes *file_types, gchar *name); /* Misc utility functions */ #if RELEASE == 1 gpointer idle_free(gpointer ptr); #else gpointer __idle_free(gpointer ptr, gchar *f, gint l); #define idle_free(p) __idle_free(p, __FILE__, __LINE__) #endif /* RELEASE == 1 */ gchar *find_program(gchar *program_name); inline gchar *size_human_readable(gfloat size); void nonblock_sleep(guint msec); void open_url(gchar *url); GSList *modules_load_selected(void); GSList *modules_load_all(void); ModuleAbout *module_get_about(ShellModule *module); gchar *seconds_to_string(unsigned int seconds); gchar *h_strdup_cprintf(const gchar *format, gchar *source, ...); gchar *h_strconcat(gchar *string1, ...); void h_hash_table_remove_all (GHashTable *hash_table); void module_entry_scan_all_except(ModuleEntry *entries, gint except_entry); void module_entry_scan_all(ModuleEntry *entries); void module_entry_reload(ShellModuleEntry *module_entry); void module_entry_scan(ShellModuleEntry *module_entry); gchar *module_entry_function(ShellModuleEntry *module_entry); const gchar *module_entry_get_note(ShellModuleEntry *module_entry); /* BinReloc stuff */ gboolean binreloc_init(gboolean try_hardcoded); /* GTK UI stuff */ gboolean ui_init(int *argc, char ***argv); void parameters_init(int *argc, char ***argv, ProgramParameters *params); extern ProgramParameters params; /* Module stuff */ gchar *module_call_method(gchar *method); gchar *module_call_method_param(gchar * method, gchar * parameter); /* Sysfs stuff */ gfloat h_sysfs_read_float(gchar *endpoint, gchar *entry); gint h_sysfs_read_int(gchar *endpoint, gchar *entry); gchar *h_sysfs_read_string(gchar *endpoint, gchar *entry); #define SCAN_START() static gboolean scanned = FALSE; if (reload) scanned = FALSE; if (scanned) return; #define SCAN_END() scanned = TRUE; #endif /* __HARDINFO_H__ */ hardinfo-0.5.1/socket.c0000644000175000017500000000513111166403363013736 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 #include #include #include #include #include #include #include #include #include #include "socket.h" Socket *sock_connect(gchar * host, gint port) { struct sockaddr_in server; Socket *s; int sock; sock = socket(AF_INET, SOCK_STREAM, 0); if (sock > 0) { memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr(host); server.sin_port = htons(port); if (connect (sock, (struct sockaddr *) (void *) &server, sizeof(server)) < 0) { return NULL; } s = g_new0(Socket, 1); s->sock = sock; return s; } return NULL; } /* From: http://www.erlenstar.demon.co.uk/unix/faq_3.html#SEC26 */ static inline int __sock_is_ready(Socket * s, int mode) { int rc, fd = s->sock; fd_set fds; struct timeval tv; FD_ZERO(&fds); FD_SET(fd, &fds); tv.tv_sec = tv.tv_usec = 0; if (mode == 0) { /* read */ rc = select(fd + 1, &fds, NULL, NULL, &tv); } else { /* write */ rc = select(fd + 1, NULL, &fds, NULL, &tv); } if (rc < 0) return -1; return FD_ISSET(fd, &fds) ? 1 : 0; } int sock_ready_to_read(Socket * s) { return __sock_is_ready(s, 0); } int sock_ready_to_write(Socket * s) { return __sock_is_ready(s, 1); } int sock_read(Socket * s, gchar * buffer, gint size) { if (sock_ready_to_read(s)) { gint n; n = read(s->sock, buffer, size); if (n > 0) { buffer[n] = '\0'; } else { return 0; } return n; } return 0; } int sock_write(Socket * s, gchar * str) { while (!sock_ready_to_write(s)); return write(s->sock, str, strlen(str)); } void sock_close(Socket * s) { close(s->sock); g_free(s); } hardinfo-0.5.1/socket.h0000644000175000017500000000226011166403363013743 0ustar agneyagney/* * HardInfo - Displays System Information * Copyright (C) 2003-2007 Leandro A. F. Pereira * * 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 __HI_SOCKET_H__ #define __HI_SOCKET_H__ typedef struct _Socket Socket; struct _Socket { gint sock; }; Socket *sock_connect(gchar * host, gint port); int sock_write(Socket * s, gchar * str); int sock_read(Socket * s, gchar * buffer, gint size); void sock_close(Socket * s); int sock_ready_to_read(Socket *s); int sock_ready_to_write(Socket *s); #endif /* __HI_SOCKET_H__ */

%s
%s
%s%s
%s%s