aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.in55
-rw-r--r--TODO47
-rw-r--r--arch/common/blowfish.h54
-rw-r--r--arch/common/cryptohash.h (renamed from arch/common/md5.h)67
-rw-r--r--arch/common/display.h2
-rw-r--r--arch/common/environment.h42
-rw-r--r--arch/common/fft.h47
-rw-r--r--arch/common/fib.h2
-rw-r--r--arch/common/languages.h4
-rw-r--r--arch/common/nqueens.h45
-rw-r--r--arch/common/printers.h256
-rw-r--r--arch/common/raytrace.h29
-rw-r--r--arch/common/sha1.h62
-rw-r--r--arch/common/users.h17
-rw-r--r--arch/common/zlib.h82
-rw-r--r--arch/linux/alpha/processor.h5
l---------arch/linux/alpha/resources.h1
-rw-r--r--arch/linux/armv4l/processor.h6
l---------arch/linux/armv4l/resources.h1
-rw-r--r--arch/linux/common/alsa.h2
-rw-r--r--arch/linux/common/battery.h84
-rw-r--r--arch/linux/common/boots.h9
-rw-r--r--arch/linux/common/devmemory.h2
-rw-r--r--arch/linux/common/dmi.h160
-rw-r--r--arch/linux/common/filesystem.h18
-rw-r--r--arch/linux/common/inputdevices.h18
-rw-r--r--arch/linux/common/loadavg.h2
-rw-r--r--arch/linux/common/memory.h2
-rw-r--r--arch/linux/common/modules.h30
-rw-r--r--arch/linux/common/net.h406
-rw-r--r--arch/linux/common/os.h57
-rw-r--r--arch/linux/common/pci.h56
-rw-r--r--arch/linux/common/resources.h103
-rw-r--r--arch/linux/common/samba.h2
-rw-r--r--arch/linux/common/sensors.h17
-rw-r--r--arch/linux/common/storage.h161
-rw-r--r--arch/linux/common/uptime.h2
-rw-r--r--arch/linux/common/usb.h213
-rw-r--r--arch/linux/ia64/processor.h6
l---------arch/linux/ia64/resources.h1
-rw-r--r--arch/linux/m68k/processor.h2
l---------arch/linux/m68k/resources.h1
-rw-r--r--arch/linux/mips/processor.h2
l---------arch/linux/mips/resources.h1
-rw-r--r--arch/linux/parisc/processor.h2
l---------arch/linux/parisc/resources.h1
-rw-r--r--arch/linux/ppc/processor.h2
l---------arch/linux/ppc/resources.h1
-rw-r--r--arch/linux/s390/processor.h6
l---------arch/linux/s390/resources.h1
l---------arch/linux/sh/alsa.h1
l---------arch/linux/sh/battery.h1
l---------arch/linux/sh/boots.h1
l---------arch/linux/sh/devmemory.h1
l---------arch/linux/sh/filesystem.h1
l---------arch/linux/sh/inputdevices.h1
l---------arch/linux/sh/loadavg.h1
l---------arch/linux/sh/memory.h1
l---------arch/linux/sh/modules.h1
l---------arch/linux/sh/net.h1
l---------arch/linux/sh/nfs.h1
l---------arch/linux/sh/os.h1
l---------arch/linux/sh/pci.h1
-rw-r--r--arch/linux/sh/processor.h78
l---------arch/linux/sh/resources.h1
l---------arch/linux/sh/samba.h1
l---------arch/linux/sh/sensors.h1
l---------arch/linux/sh/storage.h1
l---------arch/linux/sh/uptime.h1
l---------arch/linux/sh/usb.h1
-rw-r--r--arch/linux/sparc/processor.h5
l---------arch/linux/sparc/resources.h1
l---------arch/linux/x86/boots.h2
l---------arch/linux/x86/dmi.h1
l---------arch/linux/x86/net.h2
-rw-r--r--arch/linux/x86/processor.h182
l---------arch/linux/x86/resources.h1
-rw-r--r--autopackage/default.apspec10
-rw-r--r--benchmark.c250
-rw-r--r--blowfish.c840
-rw-r--r--callbacks.c15
-rw-r--r--callbacks.h2
-rw-r--r--computer.c109
-rw-r--r--computer.h11
-rwxr-xr-xconfigure64
-rw-r--r--devices.c107
-rw-r--r--expr.c35
-rw-r--r--expr.h2
-rw-r--r--fftbench.c201
-rw-r--r--fftbench.h8
-rw-r--r--hardinfo.c7
-rw-r--r--hardinfo.desktop3
-rw-r--r--hardinfo.h12
-rw-r--r--iconcache.c2
-rw-r--r--iconcache.h2
-rw-r--r--loadgraph.c14
-rw-r--r--loadgraph.h2
-rw-r--r--menu.c10
-rw-r--r--menu.h2
-rw-r--r--modules/placeholder0
-rw-r--r--network.c403
-rw-r--r--nqueens.c37
-rw-r--r--nqueens.h13
-rw-r--r--pixmaps/benchmark.pngbin946 -> 875 bytes
-rw-r--r--pixmaps/bluetooth.pngbin0 -> 994 bytes
-rw-r--r--pixmaps/cryptohash.pngbin0 -> 1128 bytes
-rw-r--r--pixmaps/dns.pngbin0 -> 1397 bytes
-rw-r--r--pixmaps/environment.png (renamed from pixmaps/gnome-terminal.png)bin1026 -> 1026 bytes
-rw-r--r--pixmaps/fft.pngbin0 -> 1001 bytes
-rw-r--r--pixmaps/language.pngbin950 -> 1135 bytes
-rw-r--r--pixmaps/logo.pngbin3836 -> 2169 bytes
-rw-r--r--pixmaps/logo.svg771
-rw-r--r--pixmaps/logo.xcfbin0 -> 3998 bytes
-rw-r--r--pixmaps/nautilus.pngbin0 -> 1270 bytes
-rw-r--r--pixmaps/network-connections.pngbin0 -> 852 bytes
-rw-r--r--pixmaps/network-generic.pngbin785 -> 0 bytes
-rw-r--r--pixmaps/network-interface.pngbin0 -> 1130 bytes
-rw-r--r--pixmaps/network-statistics.pngbin0 -> 1163 bytes
-rw-r--r--pixmaps/network.pngbin1130 -> 785 bytes
-rw-r--r--pixmaps/nqueens.pngbin0 -> 1027 bytes
-rw-r--r--pixmaps/report-large.pngbin3071 -> 2496 bytes
-rw-r--r--pixmaps/report.pngbin853 -> 1153 bytes
-rw-r--r--pixmaps/resources.pngbin0 -> 979 bytes
-rw-r--r--pixmaps/summary.pngbin1358 -> 1420 bytes
-rw-r--r--pixmaps/therm.pngbin954 -> 612 bytes
-rw-r--r--pixmaps/usb.pngbin936 -> 748 bytes
-rw-r--r--pixmaps/usbfldisk.pngbin0 -> 821 bytes
-rw-r--r--report.c183
-rw-r--r--report.h27
-rw-r--r--sha1.c8
-rw-r--r--shell.c289
-rw-r--r--shell.h10
-rw-r--r--socket.c8
-rw-r--r--socket.h2
-rw-r--r--stock.c2
-rw-r--r--stock.h2
-rw-r--r--syncmanager.c139
-rw-r--r--syncmanager.h2
-rw-r--r--uidefs.h5
-rw-r--r--util.c154
-rw-r--r--vendor.c19
-rw-r--r--vendor.h2
142 files changed, 4027 insertions, 2242 deletions
diff --git a/Makefile.in b/Makefile.in
index 52158394..5639db69 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,41 +1,52 @@
+CCFLAGS = -fPIC -pipe -Wall -g
+CFLAGS = $(GTK_CFLAGS) $(SOUP_CFLAGS) -I.
CC = gcc $(ARCHOPTS) -g
CCSLOW = gcc -O0 -g
-CFLAGS = -fPIC -pipe -Wall -g $(GTK_CFLAGS) $(GLADE_CFLAGS) $(SOUP_CFLAGS) -I.
# ----------------------------------------------------------------------------
-OBJECTS = hardinfo.o shell.o util.o iconcache.o loadgraph.o sha1.o md5.o \
- menu.o stock.o callbacks.o expr.o report.o blowfish.o binreloc.o \
- vendor.o socket.o fbench.o syncmanager.o
-MODULES = computer.so devices.so benchmark.so
+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
-all: $(OBJECTS) $(MODULES)
- $(CC) $(CFLAGS) -o hardinfo -Wl,-export-dynamic $(OBJECTS) $(GTK_LIBS) $(GTK_FLAGS) \
- $(GLADE_LIBS) $(GLADE_FLAGS) $(SOUP_LIBS) $(SOUP_FLAGS)
+MODULES = computer.so devices.so benchmark.so network.so
+
+all: $(OBJECTS) $(MODULES) hardinfo
+
+hardinfo:
+ $(CC) $(CCFLAGS) -o hardinfo -Wl,-export-dynamic $(OBJECTS) $(GTK_LIBS) \
+ $(SOUP_LIBS)
md5.o:
- $(CCSLOW) $(CFLAGS) -c md5.c -o $@
+ $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c md5.c -o $@
blowfish.o:
- $(CCSLOW) $(CFLAGS) -c blowfish.c -o $@
+ $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c blowfish.c -o $@
sha1.o:
- $(CCSLOW) $(CFLAGS) -c sha1.c -o $@
+ $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c sha1.c -o $@
fbench.o:
- $(CCSLOW) $(CFLAGS) -c fbench.c -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
@echo "--- Module: $< ($@)"
- $(CCSLOW) $(CFLAGS) -o $@ -shared $< $(GTK_FLAGS) $(GTK_LIBS) \
- $(GLADE_LIBS) $(GLADE_FLAGS)
+ make $(BENCHMARK_OBJECTS)
+ $(CCSLOW) $(CCFLAGS) $(CFLAGS) -o $@ -shared $< $(BENCHMARK_OBJECTS) \
+ $(GTK_FLAGS) $(GTK_LIBS)
ln -sf ../$@ modules
%.so: %.c
@echo "--- Module: $< ($@)"
- $(CC) $(CFLAGS) -o $@ -shared $< $(GTK_FLAGS) $(GTK_LIBS) \
- $(GLADE_LIBS) $(GLADE_FLAGS)
+ $(CC) $(CCFLAGS) $(CFLAGS) -o $@ -shared $< $(GTK_FLAGS) $(GTK_LIBS)
ln -sf ../$@ modules
clean:
@@ -57,10 +68,15 @@ deb: dist-clean
dpkg-buildpackage -rfakeroot -k${USER}
install: all
+ @echo '*** Cleaning up installation...'
+ rm -rf ${DESTDIR}${LIBDIR}/hardinfo/modules ${DESTDIR}/usr/share/hardinfo/pixmaps
+
@echo '*** Creating directories...'
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
@@ -71,10 +87,10 @@ install: all
cp hardinfo ${DESTDIR}/usr/bin/hardinfo
@echo '*** Installing modules...'
- cp -Lr modules/*.so ${DESTDIR}${LIBDIR}/hardinfo/modules
+ cp -Lvr modules/*.so ${DESTDIR}${LIBDIR}/hardinfo/modules
@echo '*** Installing pixmaps...'
- cp -Lr pixmaps/* ${DESTDIR}/usr/share/hardinfo/pixmaps
+ cp -Lvr pixmaps/* ${DESTDIR}/usr/share/hardinfo/pixmaps
@echo '*** Installing misc data...'
cp benchmark.conf ${DESTDIR}/usr/share/hardinfo
@@ -86,4 +102,5 @@ install: all
@echo '*** Done installing.'
installer:
- makeinstaller
+ makepackage
+
diff --git a/TODO b/TODO
new file mode 100644
index 00000000..b77f4f49
--- /dev/null
+++ b/TODO
@@ -0,0 +1,47 @@
+
+- 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
+ * 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
+
diff --git a/arch/common/blowfish.h b/arch/common/blowfish.h
index ceec7a96..5fea2e22 100644
--- a/arch/common/blowfish.h
+++ b/arch/common/blowfish.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -18,48 +18,46 @@
#include <blowfish.h>
-static void
-benchmark_fish(void)
+static gpointer
+parallel_blowfish(unsigned int start, unsigned int end, void *data, GTimer *timer)
{
BLOWFISH_CTX ctx;
- GTimer *timer = g_timer_new();
- gdouble elapsed = 0;
- gchar src[65536], *tmpsrc;
- glong srclen = 65536;
+ unsigned int i;
unsigned long L, R;
- int i;
-
- tmpsrc = src;
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...");
-
- for (i = 0; i <= 50000; i++) {
- g_timer_start(timer);
- Blowfish_Init(&ctx, (unsigned char*)tmpsrc, srclen);
- Blowfish_Encrypt(&ctx, &L, &R);
- Blowfish_Decrypt(&ctx, &L, &R);
-
- g_timer_stop(timer);
- elapsed += g_timer_elapsed(timer, NULL);
-
- shell_status_set_percentage(i/500);
- }
-
- g_timer_destroy(timer);
+ elapsed = benchmark_parallel_for(0, 50000, parallel_blowfish, tmpsrc);
+
g_free(bdata_path);
-
+ g_free(tmpsrc);
+
bench_results[BENCHMARK_BLOWFISH] = elapsed;
}
diff --git a/arch/common/md5.h b/arch/common/cryptohash.h
index 95d683bd..9897bb6b 100644
--- a/arch/common/md5.h
+++ b/arch/common/cryptohash.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -17,21 +17,48 @@
*/
#include <md5.h>
+#include <sha1.h>
-static void
-benchmark_md5(void)
+static void inline md5_step(char *data, glong srclen)
{
struct MD5Context ctx;
guchar checksum[16];
- int i;
- GTimer *timer = g_timer_new();
- gdouble elapsed = 0;
- gchar src[65536], *tmpsrc;
- glong srclen = 65536;
+
+ MD5Init(&ctx);
+ MD5Update(&ctx, (guchar *)data, srclen);
+ MD5Final(checksum, &ctx);
+}
- tmpsrc = src;
+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);
+}
- gchar *bdata_path;
+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)) {
@@ -40,24 +67,12 @@ benchmark_md5(void)
}
shell_view_set_enabled(FALSE);
- shell_status_update("Generating MD5 sum for 312MiB of data...");
-
- for (i = 0; i <= 5000; i++) {
- g_timer_start(timer);
-
- MD5Init(&ctx);
- MD5Update(&ctx, (guchar*)tmpsrc, srclen);
- MD5Final(checksum, &ctx);
-
- g_timer_stop(timer);
- elapsed += g_timer_elapsed(timer, NULL);
+ shell_status_update("Running CryptoHash benchmark...");
- shell_status_set_percentage(i/50);
- }
+ elapsed = benchmark_parallel_for(0, 5000, cryptohash_for, tmpsrc);
- g_timer_destroy(timer);
g_free(bdata_path);
+ g_free(tmpsrc);
- bench_results[BENCHMARK_MD5] = 312.0 / elapsed;
+ bench_results[BENCHMARK_CRYPTOHASH] = 312.0 / elapsed;
}
-
diff --git a/arch/common/display.h b/arch/common/display.h
index d7cf2ae6..075a0a24 100644
--- a/arch/common/display.h
+++ b/arch/common/display.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/arch/common/environment.h b/arch/common/environment.h
new file mode 100644
index 00000000..c78c4a73
--- /dev/null
+++ b/arch/common/environment.h
@@ -0,0 +1,42 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+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;
+}
diff --git a/arch/common/fft.h b/arch/common/fft.h
new file mode 100644
index 00000000..62daa9fe
--- /dev/null
+++ b/arch/common/fft.h
@@ -0,0 +1,47 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <fftbench.h>
+
+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;
+}
+
+
diff --git a/arch/common/fib.h b/arch/common/fib.h
index 645002fa..6a216afe 100644
--- a/arch/common/fib.h
+++ b/arch/common/fib.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/arch/common/languages.h b/arch/common/languages.h
index efc100fb..45eb2b6a 100644
--- a/arch/common/languages.h
+++ b/arch/common/languages.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -77,7 +77,7 @@ scan_languages(OperatingSystem * os)
"Revision=%s\n"
"Date=%s\n"
"Codeset=%s\n",
- FIELD(name), FIELD(title),
+ name, FIELD(title),
FIELD(source), FIELD(address),
FIELD(email), FIELD(language),
FIELD(territory), FIELD(revision),
diff --git a/arch/common/nqueens.h b/arch/common/nqueens.h
new file mode 100644
index 00000000..2a233722
--- /dev/null
+++ b/arch/common/nqueens.h
@@ -0,0 +1,45 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <nqueens.h>
+
+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;
+}
+
+
diff --git a/arch/common/printers.h b/arch/common/printers.h
index 43ddda0a..2f221252 100644
--- a/arch/common/printers.h
+++ b/arch/common/printers.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -16,70 +16,244 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-void
-__scan_printers(void)
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+typedef struct _CUPSDest CUPSDest;
+typedef struct _CUPSOption CUPSOption;
+
+struct _CUPSOption {
+ char *name, *value;
+};
+
+struct _CUPSDest {
+ char *name, *instance;
+ int is_default;
+ int num_options;
+ CUPSOption *options;
+};
+
+static int (*cups_dests_get) (CUPSDest **dests) = NULL;
+static int (*cups_dests_free) (int num_dests, CUPSDest *dests) = NULL;
+static gboolean cups_init = FALSE;
+
+static gboolean
+remove_printer_devices(gpointer key, gpointer value, gpointer data)
{
- static GModule *cups = NULL;
- static int (*cupsGetPrinters) (char ***printers) = NULL;
- static char *(*cupsGetDefault) (void) = NULL;
-
- static char *libcups[] = { "libcups",
- "libcups.so",
- "libcups.so.1",
- "libcups.so.2",
- NULL };
+ return g_str_has_prefix(key, "PRN");
+}
- if (printer_list)
- g_free(printer_list);
+static void
+__init_cups(void)
+{
+ static GModule *cups = NULL;
+ const char *libcups[] = { "libcups", "libcups.so", "libcups.so.1", "libcups.so.2", NULL };
- if (!(cupsGetPrinters && cupsGetDefault)) {
+ 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;
+ break;
}
if (!cups) {
- printer_list = g_strdup("[Printers]\n"
- "CUPS libraries cannot be found=");
+ cups_init = FALSE;
return;
}
- if (!g_module_symbol(cups, "cupsGetPrinters", (gpointer) & cupsGetPrinters)
- || !g_module_symbol(cups, "cupsGetDefault", (gpointer) & cupsGetDefault)) {
- printer_list = g_strdup("[Printers]\n"
- "No suitable CUPS library found=");
+ if (!g_module_symbol(cups, "cupsGetDests", (gpointer) & cups_dests_get)
+ || !g_module_symbol(cups, "cupsFreeDests", (gpointer) & cups_dests_free)) {
g_module_close(cups);
- return;
+ cups_init = FALSE;
}
}
+
+ cups_init = TRUE;
+}
- gchar **printers;
- int noprinters, i;
- const char *default_printer;
-
- noprinters = cupsGetPrinters(&printers);
- default_printer = cupsGetDefault();
+gchar *__cups_callback_ptype(gchar *strvalue)
+{
+ if (strvalue) {
+ unsigned value = atoi(strvalue);
+ gchar *output = g_strdup("\n");
- if (!default_printer) {
- default_printer = "";
+ 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;
}
-
- if (noprinters > 0) {
+
+ /* 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 < noprinters; i++) {
- printer_list = h_strdup_cprintf("\n$PRN%d$%s=%s\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,
- i,
- printers[i],
- g_str_equal(default_printer, printers[i]) ?
- "<i>(Default)</i>" : "");
- g_free(printers[i]);
+ prn_id,
+ dests[i].name,
+ dests[i].is_default ? "<i>Default</i>" : "");
+
+ 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);
}
- g_free(printers);
+ cups_dests_free(num_dests, dests);
} else {
printer_list = g_strdup("[Printers]\n"
"No printers found=\n");
diff --git a/arch/common/raytrace.h b/arch/common/raytrace.h
index af9f2afa..7fdc5e21 100644
--- a/arch/common/raytrace.h
+++ b/arch/common/raytrace.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -18,28 +18,27 @@
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)
{
- int i;
- GTimer *timer = g_timer_new();
gdouble elapsed = 0;
shell_view_set_enabled(FALSE);
shell_status_update("Performing John Walker's FBENCH...");
- for (i = 0; i <= 1000; i++) {
- g_timer_start(timer);
-
- fbench();
-
- g_timer_stop(timer);
- elapsed += g_timer_elapsed(timer, NULL);
-
- shell_status_set_percentage(i/10);
- }
-
- g_timer_destroy(timer);
+ elapsed = benchmark_parallel_for(0, 1000, parallel_raytrace, NULL);
bench_results[BENCHMARK_RAYTRACE] = elapsed;
}
diff --git a/arch/common/sha1.h b/arch/common/sha1.h
deleted file mode 100644
index 3b7f7652..00000000
--- a/arch/common/sha1.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
- *
- * 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 <sha1.h>
-
-static void
-benchmark_sha1(void)
-{
- SHA1_CTX ctx;
- guchar checksum[20];
- int i;
- GTimer *timer = g_timer_new();
- gdouble elapsed = 0;
- gchar src[65536], *tmpsrc;
- glong srclen = 65536;
-
- tmpsrc = src;
-
- 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("Generating SHA1 sum for 312MiB of data...");
-
- for (i = 0; i <= 5000; i++) {
- g_timer_start(timer);
-
- SHA1Init(&ctx);
- SHA1Update(&ctx, (guchar*)tmpsrc, srclen);
- SHA1Final(checksum, &ctx);
-
- g_timer_stop(timer);
- elapsed += g_timer_elapsed(timer, NULL);
-
- shell_status_set_percentage(i/50);
- }
-
- g_timer_destroy(timer);
- g_free(bdata_path);
-
- bench_results[BENCHMARK_SHA1] = 312.0 / elapsed;
-}
-
diff --git a/arch/common/users.h b/arch/common/users.h
index fd8f7834..2361a4bf 100644
--- a/arch/common/users.h
+++ b/arch/common/users.h
@@ -1,5 +1,4 @@
-static gchar *sys_users = NULL,
- *human_users = NULL;
+static gchar *users = NULL;
static gboolean
remove_users(gpointer key, gpointer value, gpointer data)
@@ -17,15 +16,13 @@ scan_users_do(void)
if (!passwd)
return;
- if (sys_users) {
- g_free(sys_users);
- g_free(human_users);
+ if (users) {
+ g_free(users);
g_hash_table_foreach_remove(moreinfo, remove_users, NULL);
}
- sys_users = g_strdup("");
- human_users = g_strdup("");
+ users = g_strdup("");
while (fgets(buffer, 512, passwd)) {
gchar **tmp;
@@ -44,11 +41,7 @@ scan_users_do(void)
uid = atoi(tmp[2]);
strend(tmp[4], ',');
- if (uid >= 1000 && uid <= 65530) {
- human_users = h_strdup_cprintf("$%s$%s=%s\n", human_users, key, tmp[0], tmp[4]);
- } else {
- sys_users = h_strdup_cprintf("$%s$%s=%s\n", sys_users, key, tmp[0], tmp[4]);
- }
+ users = h_strdup_cprintf("$%s$%s=%s\n", users, key, tmp[0], tmp[4]);
g_strfreev(tmp);
}
diff --git a/arch/common/zlib.h b/arch/common/zlib.h
deleted file mode 100644
index 96d20944..00000000
--- a/arch/common/zlib.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
- *
- * 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
-benchmark_zlib(void)
-{
- GModule *libz;
- static gulong (*compressBound) (glong srclen) = NULL;
- static gint (*compress) (gchar *dst, glong *dstlen,
- const gchar *src, glong srclen) = NULL;
-
- if (!(compress && compressBound)) {
- libz = g_module_open("libz", G_MODULE_BIND_LAZY);
- if (!libz) {
- libz = g_module_open("/usr/lib/libz.so", G_MODULE_BIND_LAZY);
- if (!libz) {
- g_warning("Cannot load ZLib: %s", g_module_error());
- return;
- }
- }
-
- if (!g_module_symbol(libz, "compress", (gpointer) & compress)
- || !g_module_symbol(libz, "compressBound", (gpointer) & compressBound)) {
-
- g_module_close(libz);
- return;
- }
- }
-
- shell_view_set_enabled(FALSE);
-
- int i;
- GTimer *timer = g_timer_new();
- gdouble elapsed = 0;
- gchar src[65536], *tmpsrc;
- glong srclen = 65536;
- 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_status_update("Compressing 64MB with default options...");
-
- for (i = 0; i <= 1000; i++) {
- g_timer_start(timer);
-
- gchar *dst;
- glong dstlen = compressBound(srclen);
-
- dst = g_new0(gchar, dstlen);
- compress(dst, &dstlen, src, srclen);
-
- g_timer_stop(timer);
- elapsed += g_timer_elapsed(timer, NULL);
- g_free(dst);
-
- shell_status_set_percentage(i/10);
- }
-
- g_timer_destroy(timer);
- g_free(bdata_path);
-
- bench_results[BENCHMARK_ZLIB] = 65536.0 / elapsed;
-}
diff --git a/arch/linux/alpha/processor.h b/arch/linux/alpha/processor.h
index 081a4f7d..1e5b014c 100644
--- a/arch/linux/alpha/processor.h
+++ b/arch/linux/alpha/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -18,7 +18,7 @@
struct _Processor {
gchar *model_name;
- gfloat bogomips;
+ gfloat bogomips, cpu_mhz;
gchar *strmodel;
};
@@ -52,6 +52,7 @@ __scan_processors(void)
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);
diff --git a/arch/linux/alpha/resources.h b/arch/linux/alpha/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/alpha/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/armv4l/processor.h b/arch/linux/armv4l/processor.h
index d66d6f25..82b6be04 100644
--- a/arch/linux/armv4l/processor.h
+++ b/arch/linux/armv4l/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
struct _Processor {
gchar *model_name;
gchar *flags;
- gfloat bogomips;
+ gfloat bogomips, cpu_mhz;
gchar *has_fpu;
};
@@ -53,6 +53,8 @@ __scan_processors(void)
g_strfreev(tmp);
}
+ processor->cpu_mhz = 0.0f;
+
fclose(cpuinfo);
return g_slist_append(NULL, processor);
diff --git a/arch/linux/armv4l/resources.h b/arch/linux/armv4l/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/armv4l/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/common/alsa.h b/arch/linux/common/alsa.h
index 8f4cc2ac..5609471c 100644
--- a/arch/linux/common/alsa.h
+++ b/arch/linux/common/alsa.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/arch/linux/common/battery.h b/arch/linux/common/battery.h
index 4a38b842..7dfa5423 100644
--- a/arch/linux/common/battery.h
+++ b/arch/linux/common/battery.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -18,6 +18,82 @@
#include <time.h>
+const struct {
+ gchar *key, *name;
+} ups_fields[] = {
+ { "UPS Status", NULL },
+ { "STATUS", "Status" },
+ { "TIMELEFT", "Time Left" },
+ { "LINEV", "Line Voltage" },
+ { "LOADPCT", "Load Percent" },
+
+ { "UPS Battery Information", NULL },
+ { "BATTV", "Battery Voltage" },
+ { "BCHARGE", "Battery Charge" },
+ { "BATTDATE", "Battery Date" },
+
+ { "UPS Information", NULL },
+ { "APCMODEL", "Model" },
+ { "FIRMWARE", "Firmware Version" },
+ { "SERIALNO", "Serial Number" },
+ { "UPSMODE", "UPS Mode" },
+ { "CABLE", "Cable" },
+ { "UPSNAME", "UPS Name" },
+
+ { "UPS Nominal Values", NULL },
+ { "NOMINV", "Voltage" },
+ { "NOMBATTV", "Battery Voltage" },
+ { "NOMPOWER", "Power" }
+};
+
+
+static void
+__scan_battery_apcupsd(void)
+{
+ GHashTable *ups_data;
+ FILE *apcaccess;
+ char buffer[512], *apcaccess_path;
+ int i;
+
+ apcaccess_path = find_program("apcaccess");
+
+ if ((apcaccess = 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)
{
@@ -31,11 +107,6 @@ __scan_battery_acpi(void)
gchar *state = NULL, *rate = NULL;
gchar *remaining = NULL;
- if (battery_list) {
- g_free(battery_list);
- }
- battery_list = g_strdup("");
-
acpi_path = g_strdup("/proc/acpi/battery");
if (g_file_test(acpi_path, G_FILE_TEST_EXISTS)) {
GDir *acpi;
@@ -209,6 +280,7 @@ __scan_battery(void)
__scan_battery_acpi();
__scan_battery_apm();
+ __scan_battery_apcupsd();
if (*battery_list == '\0') {
g_free(battery_list);
diff --git a/arch/linux/common/boots.h b/arch/linux/common/boots.h
index d3428ea9..8a3c11fa 100644
--- a/arch/linux/common/boots.h
+++ b/arch/linux/common/boots.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -47,11 +47,10 @@ scan_boots_real(void)
}
}
- tmp = g_strsplit(buffer, " ", 5);
- computer->os->boots = h_strdup_cprintf("\n%s=Kernel %s",
+ tmp = g_strsplit(buffer, " ", 0);
+ computer->os->boots = h_strdup_cprintf("\n%s %s %s %s=%s|%s",
computer->os->boots,
- tmp[4],
- tmp[3]);
+ tmp[4], tmp[5], tmp[6], tmp[7], tmp[3], tmp[8]);
g_strfreev(tmp);
}
}
diff --git a/arch/linux/common/devmemory.h b/arch/linux/common/devmemory.h
index 5eafe599..e3921cdd 100644
--- a/arch/linux/common/devmemory.h
+++ b/arch/linux/common/devmemory.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/arch/linux/common/dmi.h b/arch/linux/common/dmi.h
new file mode 100644
index 00000000..f69fdc21
--- /dev/null
+++ b/arch/linux/common/dmi.h
@@ -0,0 +1,160 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+/*
+ * DMI support based on patch by Stewart Adam <s.adam@diffingo.com>
+ */
+#include <unistd.h>
+#include <sys/types.h>
+
+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);
+
+ fgets(buffer, 256, dmi_pipe);
+ if (pclose(dmi_pipe)) {
+ dmi_failed = TRUE;
+ break;
+ }
+
+ 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"))) {
+ fgets(buffer, 256, dmi_file);
+ fclose(dmi_file);
+
+ dmi_info = h_strdup_cprintf("%s=%s\n",
+ dmi_info,
+ info->name,
+ 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");
+ }
+}
diff --git a/arch/linux/common/filesystem.h b/arch/linux/common/filesystem.h
index d8166fc3..1eff0818 100644
--- a/arch/linux/common/filesystem.h
+++ b/arch/linux/common/filesystem.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -51,10 +51,22 @@ scan_filesystems(void)
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);
@@ -81,9 +93,9 @@ scan_filesystems(void)
stravail);
g_hash_table_insert(moreinfo, g_strdup_printf("FS%d", ++count), strhash);
- fs_list = h_strdup_cprintf("$FS%d$%s=%s total, %s free\n",
+ fs_list = h_strdup_cprintf("$FS%d$%s=%.2f %% (%s of %s)|%s\n",
fs_list,
- count, tmp[0], strsize, stravail);
+ count, tmp[0], use_ratio, stravail, strsize, tmp[1]);
g_free(strsize);
g_free(stravail);
diff --git a/arch/linux/common/inputdevices.h b/arch/linux/common/inputdevices.h
index 8d2d8427..20e4289c 100644
--- a/arch/linux/common/inputdevices.h
+++ b/arch/linux/common/inputdevices.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -115,9 +115,19 @@ __scan_input_devices(void)
}
strhash = h_strdup_cprintf("Product=0x%x\n"
- "Version=0x%x\n"
- "Connected to=%s\n",
- strhash, product, version, phys);
+ "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);
diff --git a/arch/linux/common/loadavg.h b/arch/linux/common/loadavg.h
index 28132b5f..7c028679 100644
--- a/arch/linux/common/loadavg.h
+++ b/arch/linux/common/loadavg.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/arch/linux/common/memory.h b/arch/linux/common/memory.h
index def4cc1d..c87359b9 100644
--- a/arch/linux/common/memory.h
+++ b/arch/linux/common/memory.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/arch/linux/common/modules.h b/arch/linux/common/modules.h
index 6fbe13bd..7ea238b7 100644
--- a/arch/linux/common/modules.h
+++ b/arch/linux/common/modules.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -29,11 +29,18 @@ 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);
@@ -42,9 +49,12 @@ scan_modules_do(void)
module_list = NULL;
g_hash_table_foreach_remove(moreinfo, remove_module_devices, NULL);
- lsmod = popen("/sbin/lsmod", "r");
- if (!lsmod)
+ lsmod_path = find_program("lsmod");
+ lsmod = popen(lsmod_path, "r");
+ if (!lsmod) {
+ g_free(lsmod_path);
return;
+ }
fgets(buffer, 1024, lsmod); /* Discards the first line */
@@ -95,7 +105,15 @@ scan_modules_do(void)
if (description && g_str_equal(description, "&lt;none&gt;")) {
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",
@@ -119,7 +137,7 @@ scan_modules_do(void)
"License=%s\n",
NONE_IF_NULL(filename),
memory / 1024.0,
- NONE_IF_NULL(modname),
+ modname,
NONE_IF_NULL(description),
NONE_IF_NULL(vermagic),
NONE_IF_NULL(author),
@@ -146,4 +164,6 @@ scan_modules_do(void)
g_free(filename);
}
pclose(lsmod);
+
+ g_free(lsmod_path);
}
diff --git a/arch/linux/common/net.h b/arch/linux/common/net.h
index 527da1df..755c6936 100644
--- a/arch/linux/common/net.h
+++ b/arch/linux/common/net.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -15,36 +15,146 @@
* 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 *network_interfaces = NULL,
- *network_icons = NULL;
-
-#include <sys/ioctl.h>
-#include <net/if.h>
-#include <netinet/in.h>
-#include <linux/sockios.h>
-#include <sys/socket.h>
+/*
+ * Wireless Extension Example
+ * http://www.krugle.org/examples/p-OZYzuisV6gyQIaTu/iwconfig.c
+ */
+static gchar *network_interfaces = NULL, *network_icons = NULL;
#include <stdio.h>
#include <unistd.h>
-#include <string.h> /* for strncpy */
+#include <string.h>
+
+#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
+
#include <netinet/in.h>
+#include <linux/sockios.h>
+
#include <arpa/inet.h>
+#ifdef HAS_LINUX_WE
+#include <linux/if.h>
+#include <linux/wireless.h>
+#else
+#include <net/if.h>
+#endif /* HAS_LINUX_WE */
typedef struct _NetInfo NetInfo;
struct _NetInfo {
- char name[16];
- int mtu;
+ 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
};
-void get_net_info(char *if_name, NetInfo *netinfo)
+#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;
@@ -58,44 +168,55 @@ void get_net_info(char *if_name, NetInfo *netinfo)
/* MTU */
strcpy(ifr.ifr_name, if_name);
if (ioctl(fd, SIOCGIFMTU, &ifr) < 0) {
- netinfo->mtu = 0;
+ netinfo->mtu = 0;
} else {
- netinfo->mtu = ifr.ifr_mtu;
+ netinfo->mtu = ifr.ifr_mtu;
}
/* HW Address */
strcpy(ifr.ifr_name, if_name);
if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
- memset(netinfo->mac, 0, 8);
+ memset(netinfo->mac, 0, 8);
} else {
- memcpy(netinfo->mac, ifr.ifr_ifru.ifru_hwaddr.sa_data, 8);
+ 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;
+ netinfo->ip[0] = 0;
} else {
- sprintf(netinfo->ip, "%s", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
+ 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;
+ netinfo->mask[0] = 0;
} else {
- sprintf(netinfo->mask, "%s", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
+ 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;
+ netinfo->broadcast[0] = 0;
} else {
- sprintf(netinfo->broadcast, "%s", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
+ 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 {
@@ -103,33 +224,46 @@ static struct {
char *label;
char *icon;
} netdev2type[] = {
- { "eth", "Ethernet", "network" },
- { "lo", "Loopback", "network-generic" },
- { "ppp", "Point-to-Point", "modem" },
- { "ath", "Wireless", "wireless" },
- { "wlan", "Wireless", "wireless" },
- { "tun", "Virtual Point-to-Point (TUN)", "network-generic" },
- { "tap", "Ethernet (TAP)", "network-generic" },
- { "plip", "Parallel Line Internet Protocol", "network" },
- { "irlan", "Infrared", "network-generic" },
- { "slip", "Serial Line Internet Protocol", "network-generic" },
- { "isdn", "Integrated Services Digital Network", "modem" },
- { "sit", "IPv6-over-IPv4 Tunnel", "network-generic" },
+ { "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"},
- { NULL, "Unknown", "network-generic" },
+ { "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)
+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;
+ if (g_str_has_prefix(name, netdev2type[i].type))
+ break;
}
-
+
*type = netdev2type[i].label;
*icon = netdev2type[i].icon;
}
@@ -140,49 +274,51 @@ remove_net_devices(gpointer key, gpointer value, gpointer data)
return g_str_has_prefix(key, "NET");
}
-static void
-scan_net_interfaces_24(void)
+static void scan_net_interfaces_24(void)
{
FILE *proc_net;
NetInfo ni;
gchar buffer[256];
gchar *devid, *detailed;
- gulong recv_bytes;
- gulong recv_errors;
- gulong recv_packets;
-
- gulong trans_bytes;
- gulong trans_errors;
- gulong trans_packets;
-
+ 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");
- }
+ 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);
+ g_free(network_interfaces);
}
-
+
if (network_icons) {
- g_free(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, *ip;
+ gchar *iface_type, *iface_icon;
gint i;
buf = g_strstrip(buf);
@@ -196,71 +332,107 @@ scan_net_interfaces_24(void)
buf = strchr(buf, ':') + 1;
/* iface: bytes packets errs drop fifo frame compressed multicast */
- sscanf(buf, "%ld %ld %ld %d %d %d %d %d %ld %ld %ld",
+ 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);
+ &trash, &trans_bytes, &trans_packets, &trans_errors);
- gfloat recv_mb = recv_bytes / 1048576.0;
- gfloat trans_mb = trans_bytes / 1048576.0;
-
- get_net_info(ifacename, &ni);
+ 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);
- devid = g_strdup_printf("NET%s", ifacename);
-
- ip = g_strdup_printf(" (%s)", ni.ip);
- network_interfaces = h_strdup_cprintf("$%s$%s=Sent %.2fMiB, received %.2fMiB%s\n",
- network_interfaces,
- devid,
- ifacename,
- trans_mb,
- recv_mb,
- ni.ip[0] ? ip: "");
- g_free(ip);
-
- net_get_iface_type(ifacename, &iface_type, &iface_icon);
network_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n",
- network_icons, devid,
- ifacename, iface_icon);
+ 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);
- 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=%ld (%.2fMiB)\n"
- "Bytes Sent=%ld (%.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);
-
- 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");
- }
+#ifdef HAS_LINUX_WE
+ if (ni.is_wireless) {
+ gchar *txpower;
- g_hash_table_insert(moreinfo, devid, detailed);
+ 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)
+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 */
+ that instead of /proc/net/dev */
/* remove old devices from global device table */
g_hash_table_foreach_remove(moreinfo, remove_net_devices, NULL);
diff --git a/arch/linux/common/os.h b/arch/linux/common/os.h
index e4f35e95..01853123 100644
--- a/arch/linux/common/os.h
+++ b/arch/linux/common/os.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -17,6 +17,34 @@
*/
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 version "))) {
+ goto err;
+ }
+
+ return_value += sizeof("gcc version");
+ 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;
@@ -66,27 +94,23 @@ detect_desktop_environment(OperatingSystem * os)
{
const gchar *tmp = g_getenv("GNOME_DESKTOP_SESSION_ID");
FILE *version;
- int maj, min;
+ 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-panel --version", "r");
+ version = popen("gnome-about --gnome-version", "r");
if (version) {
- char gnome[10];
-
- fscanf(version, "%s gnome-panel %d.%d", gnome, &maj, &min);
+ fscanf(version, "Version: %s", vers);
if (pclose(version))
goto unknown;
} else {
goto unknown;
}
- os->desktop =
- g_strdup_printf("GNOME %d.%d (session name: %s)", maj, min,
- tmp);
+ os->desktop = g_strdup_printf("GNOME %s", vers);
} else if (g_getenv("KDE_FULL_SESSION")) {
version = popen("kcontrol --version", "r");
if (version) {
@@ -94,14 +118,14 @@ detect_desktop_environment(OperatingSystem * os)
fgets(buf, 32, version);
- fscanf(version, "KDE: %d.%d", &maj, &min);
+ fscanf(version, "KDE: %s", vers);
if (pclose(version))
goto unknown;
} else {
goto unknown;
}
- os->desktop = g_strdup_printf("KDE %d.%d", maj, min);
+ os->desktop = g_strdup_printf("KDE %s", vers);
} else {
unknown:
if (!g_getenv("DISPLAY")) {
@@ -147,11 +171,13 @@ computer_get_os(void)
gchar buffer[128];
release = popen("lsb_release -d", "r");
- fgets(buffer, 128, release);
- pclose(release);
+ if (release) {
+ fgets(buffer, 128, release);
+ pclose(release);
- os->distro = buffer;
- os->distro = g_strdup(os->distro + strlen("Description:\t"));
+ os->distro = buffer;
+ os->distro = g_strdup(os->distro + strlen("Description:\t"));
+ }
}
for (i = 0;; i++) {
@@ -210,6 +236,7 @@ computer_get_os(void)
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);
diff --git a/arch/linux/common/pci.h b/arch/linux/common/pci.h
index 388ce9aa..a1ea1021 100644
--- a/arch/linux/common/pci.h
+++ b/arch/linux/common/pci.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -16,25 +16,47 @@
* 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;
+ gchar *category = NULL, *name = NULL, *icon, *lspci_path, *command_line;
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(LSPCI, "r"))) {
+ if (!(lspci = popen(command_line, "r"))) {
goto pci_error;
}
} else {
gchar *tmp;
- tmp = g_strdup_printf("%s -i '%s'", LSPCI, buf);
+ tmp = g_strdup_printf("%s -i '%s'", command_line, buf);
g_free(buf);
buf = tmp;
@@ -83,10 +105,21 @@ __scan_pci(void)
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++;
- strdevice = h_strdup_cprintf("OEM Vendor=%s\n", strdevice, 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")) {
@@ -114,7 +147,7 @@ __scan_pci(void)
prefetch ? "prefetchable" :
"non-prefetchable");
- } else if (!strncmp(buf, "I/O", 3)) {
+ } 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);
@@ -122,7 +155,7 @@ __scan_pci(void)
strdevice =
h_strdup_cprintf("I/O ports at#%d=0x%x - 0x%x\n",
strdevice, ++x, io_addr,
- io_addr + io_size);
+ 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;
@@ -164,6 +197,9 @@ __scan_pci(void)
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"
@@ -182,6 +218,9 @@ __scan_pci(void)
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);
@@ -199,4 +238,7 @@ pci_error:
g_free(category);
g_free(name);
}
+
+ g_free(lspci_path);
+ g_free(command_line);
}
diff --git a/arch/linux/common/resources.h b/arch/linux/common/resources.h
new file mode 100644
index 00000000..20db65e9
--- /dev/null
+++ b/arch/linux/common/resources.h
@@ -0,0 +1,103 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+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("<tt>%s</tt>=%s\n", _resources,
+ temp[0], name);
+
+ g_strfreev(temp);
+ g_free(name);
+ }
+
+ fclose(io);
+ }
+ }
+
+ SCAN_END();
+}
+
+gchar *callback_device_resources(void)
+{
+ return _resources;
+}
diff --git a/arch/linux/common/samba.h b/arch/linux/common/samba.h
index 7c7d8bb7..65cdc890 100644
--- a/arch/linux/common/samba.h
+++ b/arch/linux/common/samba.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/arch/linux/common/sensors.h b/arch/linux/common/sensors.h
index 1c4fd69f..17637764 100644
--- a/arch/linux/common/sensors.h
+++ b/arch/linux/common/sensors.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -31,9 +31,16 @@ static void read_sensor_labels(gchar * driver)
g_free, g_free);
sensor_compute = g_hash_table_new(g_str_hash, g_str_equal);
- conf = fopen("/etc/sensors.conf", "r");
- if (!conf)
- return;
+ /* 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;
@@ -100,7 +107,7 @@ static void read_sensor_labels(gchar * driver)
for (i = 1; chips[i]; i++) {
strend(chips[i], '*');
- if (g_str_has_prefix(driver, chips[i] + 1)) {
+ if (g_str_has_prefix(chips[i] + 1, driver)) {
lock = TRUE;
break;
}
diff --git a/arch/linux/common/storage.h b/arch/linux/common/storage.h
index 71c206cd..5208f028 100644
--- a/arch/linux/common/storage.h
+++ b/arch/linux/common/storage.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -36,6 +36,7 @@ __scan_scsi_devices(void)
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);
@@ -43,7 +44,7 @@ __scan_scsi_devices(void)
if (!g_file_test("/proc/scsi/scsi", G_FILE_TEST_EXISTS))
return;
- storage_list = g_strconcat(storage_list, "\n[SCSI Disks]\n", NULL);
+ scsi_storage_list = g_strdup("\n[SCSI Disks]\n");
proc_scsi = fopen("/proc/scsi/scsi", "r");
while (fgets(buffer, 256, proc_scsi)) {
@@ -55,29 +56,13 @@ __scan_scsi_devices(void)
n++;
} else if (!strncmp(buf, "Vendor: ", 8)) {
- char *p;
- char *rev = strstr(buf, "Rev: ");
-
- model = strstr(buf, "Model: ");
-
- if (model == NULL) {
- model = buf + strlen(buf);
- }
- p = model;
- while (*(--p) == ' ');
- *(++p) = 0;
- vendor = g_strdup(buf + 8);
-
- if (rev != NULL) {
- revision = g_strdup(rev + 5);
- } else {
- rev = model + strlen(model);
- }
- p = rev;
- while (*(--p) == ' ');
- *(++p) = 0;
- model = g_strdup_printf("%s %s", vendor, model + 7);
-
+ 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;
@@ -98,43 +83,59 @@ __scan_scsi_devices(void)
{ "Direct-Access", "Disk", "hdd"},
{ "Sequential-Access", "Tape", "tape"},
{ "Printer", "Printer", "lpr"},
- { "WORM", "CD-ROM", "cd"},
- { "CD-ROM", "CD-ROM", "cd"},
+ { "WORM", "CD-ROM", "cdrom"},
+ { "CD-ROM", "CD-ROM", "cdrom"},
{ "Scanner", "Scanner", "scanner"},
+ { "Flash Disk", "USB Flash Disk", "usbfldisk" },
{ NULL, "Generic", "scsi"}
};
int i;
-
- 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;
+
+ 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);
- storage_list = h_strdup_cprintf("$%s$%s=\n", storage_list, devid, model);
+ 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"
- "Vendor=%s (%s)\n"
- "Type=%s\n"
- "Revision=%s\n"
- "[SCSI Controller]\n"
- "Controller=scsi%d\n"
- "Channel=%d\n"
- "ID=%d\n" "LUN=%d\n",
- model,
- vendor_get_name(model),
- vendor_get_url(model),
- type,
- revision,
- scsi_controller,
- scsi_channel,
- scsi_id,
- scsi_lun);
+ "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);
@@ -143,6 +144,11 @@ __scan_scsi_devices(void)
}
}
fclose(proc_scsi);
+
+ if (n) {
+ storage_list = h_strconcat(storage_list, scsi_storage_list, NULL);
+ g_free(scsi_storage_list);
+ }
}
static gboolean
@@ -158,12 +164,12 @@ __scan_ide_devices(void)
gchar *device, iface, *model, *media, *pgeometry = NULL, *lgeometry =
NULL;
gint n = 0, i = 0, cache, nn = 0;
- gchar *capab = NULL, *speed = NULL, *driver = NULL;
+ 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);
-
- storage_list = g_strconcat(storage_list, "\n[IDE Disks]\n", NULL);
+
+ ide_storage_list = g_strdup("\n[IDE Disks]\n");
iface = 'a';
for (i = 0; i <= 16; i++) {
@@ -285,24 +291,36 @@ __scan_ide_devices(void)
gchar *devid = g_strdup_printf("IDE%d", n);
- storage_list = h_strdup_cprintf("$%s$%s=\n", storage_list,
+ 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"
- "Vendor=%s (%s)\n"
- "Device Name=hd%c\n"
- "Media=%s\n"
- "Cache=%dkb\n",
- model,
- vendor_get_name(model),
- vendor_get_url(model),
- iface,
- media,
- cache);
+ "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);
@@ -345,4 +363,9 @@ __scan_ide_devices(void)
iface++;
}
+
+ if (n) {
+ storage_list = h_strconcat(storage_list, ide_storage_list, NULL);
+ g_free(ide_storage_list);
+ }
}
diff --git a/arch/linux/common/uptime.h b/arch/linux/common/uptime.h
index 9225c85c..b2412cd2 100644
--- a/arch/linux/common/uptime.h
+++ b/arch/linux/common/uptime.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/arch/linux/common/usb.h b/arch/linux/common/usb.h
index f2592648..cb939ff8 100644
--- a/arch/linux/common/usb.h
+++ b/arch/linux/common/usb.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -15,7 +15,10 @@
* 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)
{
@@ -23,8 +26,106 @@ remove_usb_devices(gpointer key, gpointer value, gpointer data)
}
static gchar *usb_list = NULL;
-void
-__scan_usb(void)
+
+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];
@@ -36,13 +137,13 @@ __scan_usb(void)
dev = fopen("/proc/bus/usb/devices", "r");
if (!dev)
- return;
+ return 0;
if (usb_list) {
g_hash_table_foreach_remove(moreinfo, remove_usb_devices, NULL);
g_free(usb_list);
}
- usb_list = g_strdup("");
+ usb_list = g_strdup("[USB Devices]\n");
while (fgets(buffer, 128, dev)) {
tmp = buffer;
@@ -73,52 +174,60 @@ __scan_usb(void)
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);
- }
+ 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)", manuf, url);
- g_free(manuf);
- manuf = tmp;
- }
-
- gchar *strhash = g_strdup_printf("[Device Information]\n"
- "Product=%s\n"
- "Manufacturer=%s\n"
- "[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",
- product, manuf,
- port, speed, mxpwr,
- ver, rev, classid,
- vendor, prodid, bus, level);
-
- g_hash_table_insert(moreinfo, tmp, strhash);
- }
+ 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);
@@ -128,4 +237,12 @@ __scan_usb(void)
}
fclose(dev);
+
+ return n;
+}
+
+void __scan_usb(void)
+{
+ if (!__scan_usb_procfs())
+ __scan_usb_sysfs();
}
diff --git a/arch/linux/ia64/processor.h b/arch/linux/ia64/processor.h
index bc1d7f08..d3d41519 100644
--- a/arch/linux/ia64/processor.h
+++ b/arch/linux/ia64/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
struct _Processor {
gchar *model_name;
gchar *vendor_id;
- gfloat bogomips;
+ gfloat bogomips, cpu_mhz;
gchar *strmodel;
};
@@ -50,6 +50,8 @@ __scan_processors(void)
}
g_strfreev(tmp);
}
+
+ processor->cpu_mhz = 0.0f;
fclose(cpuinfo);
diff --git a/arch/linux/ia64/resources.h b/arch/linux/ia64/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/ia64/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/m68k/processor.h b/arch/linux/m68k/processor.h
index 0fb59d24..6fbd8293 100644
--- a/arch/linux/m68k/processor.h
+++ b/arch/linux/m68k/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/arch/linux/m68k/resources.h b/arch/linux/m68k/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/m68k/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/mips/processor.h b/arch/linux/mips/processor.h
index 1aa7794d..cd10bd7a 100644
--- a/arch/linux/mips/processor.h
+++ b/arch/linux/mips/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/arch/linux/mips/resources.h b/arch/linux/mips/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/mips/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/parisc/processor.h b/arch/linux/parisc/processor.h
index 357f4d83..1712e523 100644
--- a/arch/linux/parisc/processor.h
+++ b/arch/linux/parisc/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/arch/linux/parisc/resources.h b/arch/linux/parisc/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/parisc/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/ppc/processor.h b/arch/linux/ppc/processor.h
index 6aa0f4ef..863b2eb7 100644
--- a/arch/linux/ppc/processor.h
+++ b/arch/linux/ppc/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/arch/linux/ppc/resources.h b/arch/linux/ppc/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/ppc/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/s390/processor.h b/arch/linux/s390/processor.h
index ee72b029..25dab8ca 100644
--- a/arch/linux/s390/processor.h
+++ b/arch/linux/s390/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
struct _Processor {
gchar *vendor_id, *model_name;
gint cache_size;
- gfloat bogomips;
+ gfloat bogomips, cpu_mhz;
};
static GSList *
@@ -48,6 +48,8 @@ __scan_processors(void)
}
g_strfreev(tmp);
}
+
+ processor->cpu_mhz = 0.0f;
processor->model_name = g_strconcat("S390 ", processor->vendor_id, NULL);
g_free(processor->vendor_id);
diff --git a/arch/linux/s390/resources.h b/arch/linux/s390/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/s390/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/sh/alsa.h b/arch/linux/sh/alsa.h
new file mode 120000
index 00000000..0216845a
--- /dev/null
+++ b/arch/linux/sh/alsa.h
@@ -0,0 +1 @@
+../../linux/common/alsa.h \ No newline at end of file
diff --git a/arch/linux/sh/battery.h b/arch/linux/sh/battery.h
new file mode 120000
index 00000000..e4c794f2
--- /dev/null
+++ b/arch/linux/sh/battery.h
@@ -0,0 +1 @@
+../../linux/common/battery.h \ No newline at end of file
diff --git a/arch/linux/sh/boots.h b/arch/linux/sh/boots.h
new file mode 120000
index 00000000..e7ef0408
--- /dev/null
+++ b/arch/linux/sh/boots.h
@@ -0,0 +1 @@
+../../linux/common/boots.h \ No newline at end of file
diff --git a/arch/linux/sh/devmemory.h b/arch/linux/sh/devmemory.h
new file mode 120000
index 00000000..5b1b866f
--- /dev/null
+++ b/arch/linux/sh/devmemory.h
@@ -0,0 +1 @@
+../../linux/common/devmemory.h \ No newline at end of file
diff --git a/arch/linux/sh/filesystem.h b/arch/linux/sh/filesystem.h
new file mode 120000
index 00000000..6b325b40
--- /dev/null
+++ b/arch/linux/sh/filesystem.h
@@ -0,0 +1 @@
+../../linux/common/filesystem.h \ No newline at end of file
diff --git a/arch/linux/sh/inputdevices.h b/arch/linux/sh/inputdevices.h
new file mode 120000
index 00000000..b9226a29
--- /dev/null
+++ b/arch/linux/sh/inputdevices.h
@@ -0,0 +1 @@
+../../linux/common/inputdevices.h \ No newline at end of file
diff --git a/arch/linux/sh/loadavg.h b/arch/linux/sh/loadavg.h
new file mode 120000
index 00000000..daaed6d5
--- /dev/null
+++ b/arch/linux/sh/loadavg.h
@@ -0,0 +1 @@
+../../linux/common/loadavg.h \ No newline at end of file
diff --git a/arch/linux/sh/memory.h b/arch/linux/sh/memory.h
new file mode 120000
index 00000000..5ffc013e
--- /dev/null
+++ b/arch/linux/sh/memory.h
@@ -0,0 +1 @@
+../../linux/common/memory.h \ No newline at end of file
diff --git a/arch/linux/sh/modules.h b/arch/linux/sh/modules.h
new file mode 120000
index 00000000..8ce5a808
--- /dev/null
+++ b/arch/linux/sh/modules.h
@@ -0,0 +1 @@
+../../linux/common/modules.h \ No newline at end of file
diff --git a/arch/linux/sh/net.h b/arch/linux/sh/net.h
new file mode 120000
index 00000000..72d77b26
--- /dev/null
+++ b/arch/linux/sh/net.h
@@ -0,0 +1 @@
+../../linux/common/net.h \ No newline at end of file
diff --git a/arch/linux/sh/nfs.h b/arch/linux/sh/nfs.h
new file mode 120000
index 00000000..3d1048da
--- /dev/null
+++ b/arch/linux/sh/nfs.h
@@ -0,0 +1 @@
+../../linux/common/nfs.h \ No newline at end of file
diff --git a/arch/linux/sh/os.h b/arch/linux/sh/os.h
new file mode 120000
index 00000000..ef547be5
--- /dev/null
+++ b/arch/linux/sh/os.h
@@ -0,0 +1 @@
+../../linux/common/os.h \ No newline at end of file
diff --git a/arch/linux/sh/pci.h b/arch/linux/sh/pci.h
new file mode 120000
index 00000000..63760048
--- /dev/null
+++ b/arch/linux/sh/pci.h
@@ -0,0 +1 @@
+../../linux/common/pci.h \ No newline at end of file
diff --git a/arch/linux/sh/processor.h b/arch/linux/sh/processor.h
new file mode 100644
index 00000000..de33ee91
--- /dev/null
+++ b/arch/linux/sh/processor.h
@@ -0,0 +1,78 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+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
+ );
+}
diff --git a/arch/linux/sh/resources.h b/arch/linux/sh/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/sh/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/sh/samba.h b/arch/linux/sh/samba.h
new file mode 120000
index 00000000..9227f722
--- /dev/null
+++ b/arch/linux/sh/samba.h
@@ -0,0 +1 @@
+../../linux/common/samba.h \ No newline at end of file
diff --git a/arch/linux/sh/sensors.h b/arch/linux/sh/sensors.h
new file mode 120000
index 00000000..35e5f37a
--- /dev/null
+++ b/arch/linux/sh/sensors.h
@@ -0,0 +1 @@
+../../linux/common/sensors.h \ No newline at end of file
diff --git a/arch/linux/sh/storage.h b/arch/linux/sh/storage.h
new file mode 120000
index 00000000..55b68de3
--- /dev/null
+++ b/arch/linux/sh/storage.h
@@ -0,0 +1 @@
+../../linux/common/storage.h \ No newline at end of file
diff --git a/arch/linux/sh/uptime.h b/arch/linux/sh/uptime.h
new file mode 120000
index 00000000..78c026ff
--- /dev/null
+++ b/arch/linux/sh/uptime.h
@@ -0,0 +1 @@
+../../linux/common/uptime.h \ No newline at end of file
diff --git a/arch/linux/sh/usb.h b/arch/linux/sh/usb.h
new file mode 120000
index 00000000..8b8fbb5d
--- /dev/null
+++ b/arch/linux/sh/usb.h
@@ -0,0 +1 @@
+../../linux/common/usb.h \ No newline at end of file
diff --git a/arch/linux/sparc/processor.h b/arch/linux/sparc/processor.h
index 04e38c33..0272c963 100644
--- a/arch/linux/sparc/processor.h
+++ b/arch/linux/sparc/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,6 +19,7 @@
struct _Processor {
gchar *model_name;
gchar *has_fpu;
+ gfloat cpu_mhz;
};
static GSList *
@@ -48,6 +49,8 @@ __scan_processors(void)
fclose(cpuinfo);
+ processor->cpu_mhz = 0.0f;
+
return g_slist_append(NULL, processor);
}
diff --git a/arch/linux/sparc/resources.h b/arch/linux/sparc/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/sparc/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/arch/linux/x86/boots.h b/arch/linux/x86/boots.h
index 97384500..e7ef0408 120000
--- a/arch/linux/x86/boots.h
+++ b/arch/linux/x86/boots.h
@@ -1 +1 @@
-../../../arch/linux/common/boots.h \ No newline at end of file
+../../linux/common/boots.h \ No newline at end of file
diff --git a/arch/linux/x86/dmi.h b/arch/linux/x86/dmi.h
new file mode 120000
index 00000000..1a285fbd
--- /dev/null
+++ b/arch/linux/x86/dmi.h
@@ -0,0 +1 @@
+../../../arch/linux/common/dmi.h \ No newline at end of file
diff --git a/arch/linux/x86/net.h b/arch/linux/x86/net.h
index 488b5ae3..72d77b26 120000
--- a/arch/linux/x86/net.h
+++ b/arch/linux/x86/net.h
@@ -1 +1 @@
-../../../arch/linux/common/net.h \ No newline at end of file
+../../linux/common/net.h \ No newline at end of file
diff --git a/arch/linux/x86/processor.h b/arch/linux/x86/processor.h
index fd8711af..97fa4555 100644
--- a/arch/linux/x86/processor.h
+++ b/arch/linux/x86/processor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -16,6 +16,17 @@
* 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;
@@ -30,6 +41,8 @@ struct _Processor {
gchar *strmodel;
gint id;
+
+ GSList *cache;
};
/*
@@ -148,12 +161,91 @@ static void get_processor_strfamily(Processor * processor)
}
}
+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)
@@ -169,6 +261,8 @@ static GSList *__scan_processors(void)
}
processor = g_new0(Processor, 1);
+
+ __cache_obtain_info(processor, processor_number++);
}
if (tmp[0] && tmp[1]) {
@@ -208,6 +302,12 @@ static GSList *__scan_processors(void)
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[] = {
@@ -254,6 +354,68 @@ static struct {
{ "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 },
};
@@ -289,9 +451,11 @@ gchar *processor_get_capabilities_from_flags(gchar * strflags)
static gchar *processor_get_detailed_info(Processor * processor)
{
- gchar *tmp, *ret;
+ 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"
@@ -307,6 +471,8 @@ static gchar *processor_get_detailed_info(Processor * processor)
"F00F Bug=%s\n"
"Coma Bug=%s\n"
"Has FPU=%s\n"
+ "[Cache]\n"
+ "%s\n"
"[Capabilities]\n"
"%s",
processor->model_name,
@@ -322,15 +488,17 @@ static gchar *processor_get_detailed_info(Processor * processor)
#else
"Big Endian",
#endif
- processor->bug_fdiv ? processor->bug_fdiv : "yes",
- processor->bug_hlt ? processor->bug_hlt : "yes",
- processor->bug_f00f ? processor->bug_f00f : "yes",
- processor->bug_coma ? processor->bug_coma : "yes",
+ 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)
diff --git a/arch/linux/x86/resources.h b/arch/linux/x86/resources.h
new file mode 120000
index 00000000..20a4815d
--- /dev/null
+++ b/arch/linux/x86/resources.h
@@ -0,0 +1 @@
+../../../arch/linux/common/resources.h \ No newline at end of file
diff --git a/autopackage/default.apspec b/autopackage/default.apspec
index f12960c1..a1c0bbbe 100644
--- a/autopackage/default.apspec
+++ b/autopackage/default.apspec
@@ -2,12 +2,12 @@
# Generated by mkapspec 0.2
[Meta]
ShortName: hardinfo
-SoftwareVersion: 0.4.2.1
+SoftwareVersion: 0.4.3-beta2
DisplayName: HardInfo $SOFTWAREVERSION
RootName: @tia.mat.br/hardinfo:$SOFTWAREVERSION
Summary: System profiler and benchmark tool
-Maintainer: Leandro A. F. Pereira <leandro@linuxmag.com.br>
-Packager: Leandro A. F. Pereira <leandro@linuxmag.com.br>
+Maintainer: Leandro A. F. Pereira <leandro@hardinfo.org>
+Packager: Leandro A. F. Pereira <leandro@hardinfo.org>
PackageVersion: 1
CPUArchitectures: x86
AutopackageTarget: 1.2
@@ -20,6 +20,7 @@ License: GPL
# 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]
@@ -30,6 +31,8 @@ unprepareBuild
[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.
@@ -45,6 +48,7 @@ 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]
diff --git a/benchmark.c b/benchmark.c
index 3c6f0f1f..8bbfe11a 100644
--- a/benchmark.c
+++ b/benchmark.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -26,53 +26,145 @@
#include <sys/resource.h>
enum {
- BENCHMARK_ZLIB,
- BENCHMARK_FIB,
- BENCHMARK_MD5,
- BENCHMARK_SHA1,
BENCHMARK_BLOWFISH,
+ BENCHMARK_CRYPTOHASH,
+ BENCHMARK_FIB,
+ BENCHMARK_NQUEENS,
+ BENCHMARK_FFT,
BENCHMARK_RAYTRACE,
BENCHMARK_N_ENTRIES
} Entries;
-void scan_zlib(gboolean reload);
+void scan_fft(gboolean reload);
void scan_raytr(gboolean reload);
void scan_bfsh(gboolean reload);
-void scan_md5(gboolean reload);
+void scan_cryptohash(gboolean reload);
void scan_fib(gboolean reload);
-void scan_sha1(gboolean reload);
+void scan_nqueens(gboolean reload);
-gchar *callback_zlib();
+gchar *callback_fft();
gchar *callback_raytr();
gchar *callback_bfsh();
-gchar *callback_md5();
gchar *callback_fib();
-gchar *callback_sha1();
+gchar *callback_cryptohash();
+gchar *callback_nqueens();
static ModuleEntry entries[] = {
- {"CPU ZLib", "compress.png", callback_zlib, scan_zlib},
- {"CPU Fibonacci", "module.png", callback_fib, scan_fib},
- {"CPU MD5", "module.png", callback_md5, scan_md5},
- {"CPU SHA1", "module.png", callback_sha1, scan_sha1},
{"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("");
+ 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);
+ 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);
@@ -95,17 +187,24 @@ static gchar *__benchmark_include_results(gdouble result,
g_free(path);
g_key_file_free(conf);
- DEBUG("results = %s", results);
-
- return g_strdup_printf("[$ShellParam$]\n"
- "Zebra=1\n"
- "OrderType=%d\n"
- "ViewType=3\n"
- "[%s]\n"
- "<i>This Machine</i>=%.3f\n"
- "%s", order_type, benchmark, result, results);
+ 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"
+ "<big><b>This Machine</b></big>=%.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)
{
@@ -123,16 +222,22 @@ static gchar *benchmark_include_results(gdouble result,
static gdouble bench_results[BENCHMARK_N_ENTRIES];
#include <arch/common/fib.h>
-#include <arch/common/zlib.h>
-#include <arch/common/md5.h>
-#include <arch/common/sha1.h>
+#include <arch/common/cryptohash.h>
#include <arch/common/blowfish.h>
#include <arch/common/raytrace.h>
+#include <arch/common/nqueens.h>
+#include <arch/common/fft.h>
+
+gchar *callback_fft()
+{
+ return benchmark_include_results(bench_results[BENCHMARK_FFT],
+ "FPU FFT");
+}
-gchar *callback_zlib()
+gchar *callback_nqueens()
{
- return benchmark_include_results_reverse(bench_results[BENCHMARK_ZLIB],
- "CPU ZLib");
+ return benchmark_include_results_reverse(bench_results[BENCHMARK_NQUEENS],
+ "CPU N-Queens");
}
gchar *callback_raytr()
@@ -147,10 +252,10 @@ gchar *callback_bfsh()
"CPU Blowfish");
}
-gchar *callback_md5()
+gchar *callback_cryptohash()
{
- return benchmark_include_results_reverse(bench_results[BENCHMARK_MD5],
- "CPU MD5");
+ return benchmark_include_results_reverse(bench_results[BENCHMARK_CRYPTOHASH],
+ "CPU Cryptohash");
}
gchar *callback_fib()
@@ -159,12 +264,6 @@ gchar *callback_fib()
"CPU Fibonacci");
}
-gchar *callback_sha1()
-{
- return benchmark_include_results_reverse(bench_results[BENCHMARK_SHA1],
- "CPU SHA1");
-}
-
#define RUN_WITH_HIGH_PRIORITY(fn) \
do { \
int old_priority = getpriority(PRIO_PROCESS, 0); \
@@ -173,10 +272,17 @@ gchar *callback_sha1()
setpriority(PRIO_PROCESS, 0, old_priority); \
} while (0);
-void scan_zlib(gboolean reload)
+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_zlib);
+ RUN_WITH_HIGH_PRIORITY(benchmark_nqueens);
SCAN_END();
}
@@ -194,10 +300,10 @@ void scan_bfsh(gboolean reload)
SCAN_END();
}
-void scan_md5(gboolean reload)
+void scan_cryptohash(gboolean reload)
{
SCAN_START();
- RUN_WITH_HIGH_PRIORITY(benchmark_md5);
+ RUN_WITH_HIGH_PRIORITY(benchmark_cryptohash);
SCAN_END();
}
@@ -208,26 +314,16 @@ void scan_fib(gboolean reload)
SCAN_END();
}
-void scan_sha1(gboolean reload)
-{
- SCAN_START();
- RUN_WITH_HIGH_PRIORITY(benchmark_sha1);
- SCAN_END();
-}
-
const gchar *hi_note_func(gint entry)
{
switch (entry) {
- case BENCHMARK_ZLIB:
- return "Results in KiB/second. Higher is better.";
-
- case BENCHMARK_MD5:
- case BENCHMARK_SHA1:
+ case BENCHMARK_CRYPTOHASH:
return "Results in MiB/second. Higher is better.";
case BENCHMARK_RAYTRACE:
case BENCHMARK_BLOWFISH:
case BENCHMARK_FIB:
+ case BENCHMARK_NQUEENS:
return "Results in seconds. Lower is better.";
}
@@ -268,26 +364,31 @@ static gchar *get_benchmark_results()
gint i = G_N_ELEMENTS(entries) - 1;
gchar *machine = module_call_method("devices::getProcessorName");
- gchar *param = g_strdup_printf("[param]\n"
- "machine=%s\n" "nbenchmarks=%d\n",
- machine, i);
- gchar *result = param;
-
+ 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 = g_strdup_printf("%s\n"
- "[bench%d]\n"
- "name=%s\n"
- "value=%f\n",
- result,
- i, entries[i].name, bench_results[i]);
+ 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(param);
+ g_free(machineclock);
+ g_free(machineram);
return result;
}
@@ -310,3 +411,10 @@ void hi_module_init(void)
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;
+}
diff --git a/blowfish.c b/blowfish.c
index acc65b45..034315ab 100644
--- a/blowfish.c
+++ b/blowfish.c
@@ -54,434 +54,440 @@ 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_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 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)
+
+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 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 = 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;
-
+ 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;
- }
-
+ 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)
+ 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;
- }
- }
- }
+ 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;
+ }
+ }
+}
-
+
diff --git a/callbacks.c b/callbacks.c
index 32db0791..40ee07bc 100644
--- a/callbacks.c
+++ b/callbacks.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -195,20 +195,25 @@ void cb_about()
"",
"Contributors:",
"Agney Lopes Roth Ferraz",
- "SCSI support by Pascal F. Martin",
+ "Andrey Esin",
"",
"Based on work by:",
"MD5 implementation by Colin Plumb (see md5.c for details)",
- "SHA1 implementation by Steve Raid (see sha1.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[] = {
- "The GNOME Project",
+ "Jakub Szypulka",
"Tango Project",
+ "The GNOME Project",
+ "VMWare, Inc. (USB icon from VMWare Workstation 6)",
NULL
};
@@ -216,7 +221,7 @@ void cb_about()
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-2007 "
+ "Copyright \302\251 2003-2009 "
"Leandro A. F. Pereira");
gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about),
"System information and benchmark tool");
diff --git a/callbacks.h b/callbacks.h
index 0387df05..88165f97 100644
--- a/callbacks.h
+++ b/callbacks.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/computer.c b/computer.c
index 151642eb..558206e7 100644
--- a/computer.c
+++ b/computer.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -31,19 +31,6 @@
#include <vendor.h>
-enum {
- COMPUTER_SUMMARY,
- COMPUTER_OPERATING_SYSTEM,
- COMPUTER_KERNEL_MODULES,
- COMPUTER_BOOTS,
- COMPUTER_LANGUAGE,
- COMPUTER_FILESYSTEMS,
- COMPUTER_SHARES,
- COMPUTER_DISPLAY,
- COMPUTER_NETWORK,
- COMPUTER_USERS,
-} Entries;
-
/* Callbacks */
gchar *callback_summary();
gchar *callback_os();
@@ -51,10 +38,10 @@ gchar *callback_modules();
gchar *callback_boots();
gchar *callback_locales();
gchar *callback_fs();
-gchar *callback_shares();
gchar *callback_display();
gchar *callback_network();
gchar *callback_users();
+gchar *callback_env_var();
/* Scan callbacks */
void scan_summary(gboolean reload);
@@ -63,10 +50,10 @@ void scan_modules(gboolean reload);
void scan_boots(gboolean reload);
void scan_locales(gboolean reload);
void scan_fs(gboolean reload);
-void scan_shares(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},
@@ -75,9 +62,8 @@ static ModuleEntry entries[] = {
{"Boots", "boot.png", callback_boots, scan_boots},
{"Languages", "language.png", callback_locales, scan_locales},
{"Filesystems", "dev_removable.png", callback_fs, scan_fs},
- {"Shared Directories", "shares.png", callback_shares, scan_shares},
{"Display", "monitor.png", callback_display, scan_display},
- {"Network Interfaces", "network.png", callback_network, scan_network},
+ {"Environment Variables", "environment.png", callback_env_var, scan_env_var},
{"Users", "users.png", callback_users, scan_users},
{NULL},
};
@@ -97,11 +83,9 @@ static Computer *computer = NULL;
#include <arch/this/uptime.h>
#include <arch/this/os.h>
#include <arch/this/filesystem.h>
-#include <arch/this/samba.h>
-#include <arch/this/nfs.h>
-#include <arch/this/net.h>
#include <arch/common/users.h>
#include <arch/this/boots.h>
+#include <arch/common/environment.h>
gchar *hi_more_info(gchar * entry)
{
@@ -140,7 +124,7 @@ gchar *hi_get_field(gchar * field)
void scan_summary(gboolean reload)
{
SCAN_START();
- module_entry_scan_all_except(entries, COMPUTER_SUMMARY);
+ module_entry_scan_all_except(entries, 0);
computer->alsa = computer_get_alsainfo();
SCAN_END();
}
@@ -181,14 +165,6 @@ void scan_fs(gboolean reload)
SCAN_END();
}
-void scan_shares(gboolean reload)
-{
- SCAN_START();
- scan_samba_shared_directories();
- scan_nfs_shared_directories();
- SCAN_END();
-}
-
void scan_display(gboolean reload)
{
SCAN_START();
@@ -196,13 +172,6 @@ void scan_display(gboolean reload)
SCAN_END();
}
-void scan_network(gboolean reload)
-{
- SCAN_START();
- scan_net_interfaces();
- SCAN_END();
-}
-
void scan_users(gboolean reload)
{
SCAN_START();
@@ -267,6 +236,7 @@ gchar *callback_os()
"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"
@@ -280,6 +250,7 @@ gchar *callback_os()
computer->os->kernel,
computer->os->compiled_date,
computer->os->libc,
+ computer->os->gcc,
computer->os->distro,
computer->os->hostname,
computer->os->username,
@@ -291,18 +262,30 @@ gchar *callback_modules()
{
return g_strdup_printf("[Loaded Modules]\n"
"%s"
- "[$ShellParam$]\n" "ViewType=1", module_list);
+ "[$ShellParam$]\n"
+ "ViewType=1\n"
+ "ColumnTitle$TextValue=Name\n"
+ "ColumnTitle$Value=Description\n"
+ "ShowColumnHeaders=true\n", module_list);
}
gchar *callback_boots()
{
- return g_strdup(computer->os->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);
}
@@ -310,19 +293,17 @@ gchar *callback_locales()
gchar *callback_fs()
{
return g_strdup_printf("[$ShellParam$]\n"
- "ViewType=1\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_shares()
-{
- return g_strdup_printf("[SAMBA]\n"
- "%s\n"
- "[NFS]\n"
- "%s", smb_shares_list, nfs_shares_list);
-}
-
gchar *callback_display()
{
return g_strdup_printf("[Display]\n"
@@ -350,24 +331,13 @@ gchar *callback_display()
computer->display->dri ? "Yes" : "No");
}
-gchar *callback_network()
-{
- return g_strdup_printf("%s\n"
- "[$ShellParam$]\n"
- "ReloadInterval=3000\n"
- "ViewType=1\n"
- "%s", network_interfaces, network_icons);
-}
-
gchar *callback_users()
{
return g_strdup_printf("[$ShellParam$]\n"
"ReloadInterval=10000\n"
"ViewType=1\n"
- "[Human Users]\n"
- "%s\n"
- "[System Users]\n"
- "%s\n", human_users, sys_users);
+ "[Users]\n"
+ "%s\n", users);
}
gchar *get_os_kernel(void)
@@ -376,10 +346,27 @@ gchar *get_os_kernel(void)
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}
};
diff --git a/computer.h b/computer.h
index ceb2b2a0..b2874c69 100644
--- a/computer.h
+++ b/computer.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -26,15 +26,23 @@ static struct {
{ 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
@@ -127,6 +135,7 @@ struct _Processor {
struct _OperatingSystem {
gchar *kernel;
gchar *libc;
+ gchar *gcc;
gchar *distrocode, *distro;
gchar *hostname;
gchar *language;
diff --git a/configure b/configure
index ef2ed8ba..f9373062 100755
--- a/configure
+++ b/configure
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
#
# ToscoConf 0.04
-# Copyright (c) 2003-2004 Leandro Pereira <leandro@linuxmag.com.br>
+# Copyright (c) 2003-2004 Leandro Pereira <leandro@hardinfo.org>
# All rights reserved.
#
# This script is in the Tosco Public License. It may be copied and/or
@@ -24,7 +24,7 @@ PACKAGE=`basename ${PWD} | cut -d"-" -f1`;
VERSION=`basename ${PWD} | cut -d"-" -f2`;
if [ "$PACKAGE" == "$VERSION" ]; then
- VERSION=$(printf "SVN_%d" $(LC_ALL=C svn -R info|grep Revision|cut -d: -f2|sort -n|tail -n1))
+ VERSION=$(date +"%F.%H:%M:%S")
RELEASE=0
else
RELEASE=1
@@ -81,11 +81,15 @@ case $PROC in
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@linuxmag.com.br:"
+ echo "output of the following commands to leandro@hardinfo.org:"
echo ""
echo " $ cat /proc/cpuinfo"
echo " $ uname -a"
@@ -100,24 +104,6 @@ echo ""
# ---------------------------------------------------------------------------
-echo -n "Checking for lspci... "
-LSPCIPATH="/sbin/lspci /usr/sbin/lspci /bin/lspci /usr/bin/lspci `which lspci 2>/dev/null`"
-for i in $LSPCIPATH; do
- if [ -x "$i" ]; then
- LSPCI=$i
- break
- fi
-done
-
-if [ -e "$LSPCI" ]; then
- echo $LSPCI
-else
- echo "lspci cannot be found"
- exit
-fi
-
-# ---------------------------------------------------------------------------
-
GTK2=-1
MIN_VERSION="2.6.0"
echo -n "Checking for GTK version >= ${MIN_VERSION}... "
@@ -149,16 +135,16 @@ fi
# ---------------------------------------------------------------------------
SOUP=-1
-MIN_VERSION="2.2.7"
+MIN_VERSION="2.24"
echo -n "Checking for libsoup version >= ${MIN_VERSION}... "
for i in `which pkg-config`; do
- $i --errors-to-stdout libsoup-2.2 \
+ $i --errors-to-stdout libsoup-2.4 \
--atleast-version=$MIN_VERSION > /dev/null
case $? in
0)
- SOUP_FLAGS=`pkg-config libsoup-2.2 --cflags --static`
- SOUP_LIBS=`pkg-config libsoup-2.2 --libs --static`
- echo "found `pkg-config libsoup-2.2 --modversion`"
+ 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 ;;
*)
@@ -174,13 +160,29 @@ 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 LSPCI \"$LSPCI -v\"" >> config.h
echo "#define $ARCH" >> config.h
echo "#define ARCH \"$ARCH\"" >> config.h
@@ -195,6 +197,10 @@ 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
@@ -210,7 +216,7 @@ echo -e "\n#endif /* __CONFIG_H__ */" >> config.h
echo "Writing Makefile..."
rm -f Makefile
-echo "GTK_LIBS = ${GTK_LIBS}" > 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
@@ -236,6 +242,6 @@ 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 <leandro@linuxmag.com.br>.
+code, please send a patch (use "diff -u") to <leandro@hardinfo.org>.
EOF
fi
diff --git a/devices.c b/devices.c
index 6221769c..49f84413 100644
--- a/devices.c
+++ b/devices.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -16,6 +16,14 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#ifndef __USE_XOPEN
+#define __USE_XOPEN
+#endif /* __USE_XOPEN */
+
+#ifndef _XOPEN_SOURCE
+#define _XOPEN_SOURCE
+#endif /* _XOPEN_SOURCE */
+
#include <gtk/gtk.h>
#include <config.h>
#include <string.h>
@@ -28,18 +36,6 @@
#include <expr.h>
#include <socket.h>
-enum {
- DEVICES_PROCESSORS,
- DEVICES_MEMORY,
- DEVICES_PCI,
- DEVICES_USB,
- DEVICES_PRINTERS,
- DEVICES_BATTERY,
- DEVICES_SENSORS,
- DEVICES_INPUT,
- DEVICES_STORAGE,
-} Entries;
-
gchar *callback_processors();
gchar *callback_memory();
gchar *callback_battery();
@@ -49,6 +45,10 @@ 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);
@@ -59,6 +59,10 @@ 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},
@@ -70,6 +74,10 @@ static ModuleEntry entries[] = {
{"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}
};
@@ -123,6 +131,11 @@ typedef struct _Processor Processor;
#include <arch/this/battery.h>
#include <arch/this/sensors.h>
#include <arch/this/devmemory.h>
+#include <arch/this/resources.h>
+
+#if defined(ARCH_i386) || defined(ARCH_x86_64)
+#include <arch/this/dmi.h>
+#endif /* x86 or x86_64 */
gchar *get_processor_name(void)
{
@@ -160,13 +173,59 @@ gchar *get_input_devices(void)
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}
};
@@ -176,7 +235,7 @@ ShellModuleMethod *hi_exported_methods(void)
gchar *hi_more_info(gchar * entry)
{
gchar *info = (gchar *) g_hash_table_lookup(moreinfo, entry);
-
+
if (info)
return g_strdup(info);
@@ -193,6 +252,15 @@ gchar *hi_get_field(gchar * field)
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();
@@ -266,6 +334,13 @@ 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"
@@ -301,6 +376,7 @@ gchar *callback_printers()
{
return g_strdup_printf("%s\n"
"[$ShellParam$]\n"
+ "ViewType=1\n"
"ReloadInterval=5000", printer_list);
}
@@ -342,7 +418,7 @@ gchar *hi_module_get_name(void)
guchar hi_module_get_weight(void)
{
- return 160;
+ return 85;
}
void hi_module_init(void)
@@ -362,6 +438,7 @@ void hi_module_init(void)
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)
diff --git a/expr.c b/expr.c
index d204859d..32e303d7 100644
--- a/expr.c
+++ b/expr.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -25,7 +25,9 @@
#include <stdio.h>
#include <ctype.h>
#include <math.h>
-#include <expr.h>
+
+#include "expr.h"
+#include "config.h"
static MathToken *new_operator(gchar op)
{
@@ -90,8 +92,9 @@ GSList *math_infix_to_postfix(GSList * infix)
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--]);
+ 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);
@@ -107,7 +110,7 @@ GSList *math_infix_to_postfix(GSList * infix)
while (t_sp)
postfix = g_slist_append(postfix, stack[t_sp--]);
-
+
return postfix;
}
@@ -149,11 +152,11 @@ gfloat math_postfix_eval(GSList * postfix, gfloat at_value)
op2 = stack[sp--];
op1 = stack[sp];
-
+
stack[sp] = __result(op1, op2, t->val.op);
}
}
-
+
return stack[sp];
}
@@ -161,17 +164,25 @@ 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)) {
- gfloat value;
-
- expr += sscanf(expr, "%f", &value);
- infix = g_slist_append(infix, new_value(value));
+ 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);
diff --git a/expr.h b/expr.h
index 6d4fabe1..4bda6b72 100644
--- a/expr.h
+++ b/expr.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/fftbench.c b/fftbench.c
new file mode 100644
index 00000000..597c5693
--- /dev/null
+++ b/fftbench.c
@@ -0,0 +1,201 @@
+/*
+ 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 <time.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+// embedded random number generator; ala Park and Miller
+static long seed = 1325;
+static const long IA = 16807;
+static const long IM = 2147483647;
+static const double AM = 4.65661287525E-10;
+static const long IQ = 127773;
+static const long IR = 2836;
+static const long MASK = 123459876;
+
+static double random_double()
+{
+ long k;
+ double result;
+
+ seed ^= MASK;
+ k = seed / IQ;
+ seed = IA * (seed - k * IQ) - IR * k;
+
+ if (seed < 0)
+ seed += IM;
+
+ result = AM * seed;
+ seed ^= MASK;
+
+ return result;
+}
+
+static const int N = 800;
+static const int NM1 = 799; // N - 1
+static const int NP1 = 801; // N + 1
+
+static 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);
+}
diff --git a/fftbench.h b/fftbench.h
new file mode 100644
index 00000000..055226e0
--- /dev/null
+++ b/fftbench.h
@@ -0,0 +1,8 @@
+#ifndef __FFTBENCH_H__
+#define __FFTBENCH_H__
+
+void fft_bench_init(void);
+void fft_bench_start(void);
+void fft_bench_finish(void);
+
+#endif /* __FFTBENCH_H__ */ \ No newline at end of file
diff --git a/hardinfo.c b/hardinfo.c
index 655bf896..34caca04 100644
--- a/hardinfo.c
+++ b/hardinfo.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -34,11 +34,9 @@ int main(int argc, char **argv)
DEBUG("HardInfo version " VERSION ". Debug version.");
-#ifdef HAS_LIBSOUP
DEBUG("g_thread_init()");
if (!g_thread_supported())
g_thread_init(NULL);
-#endif /* HAS_LIBSOUP */
/* parse all command line parameters */
parameters_init(&argc, &argv, &params);
@@ -47,7 +45,7 @@ int main(int argc, char **argv)
if (params.show_version) {
g_print("HardInfo version " VERSION "\n");
g_print
- ("Copyright (C) 2003-2007 Leandro A. F. Pereira. See COPYING for details.\n\n");
+ ("Copyright (C) 2003-2008 Leandro A. F. Pereira. See COPYING for details.\n\n");
g_print("Compile-time options:\n"
" Release version: %s (%s)\n"
@@ -120,6 +118,7 @@ int main(int argc, char **argv)
shell_init(modules);
DEBUG("entering gtk+ main loop");
+
gtk_main();
} else if (params.create_report) {
/* generate report */
diff --git a/hardinfo.desktop b/hardinfo.desktop
index 35c58bcd..523432f1 100644
--- a/hardinfo.desktop
+++ b/hardinfo.desktop
@@ -1,5 +1,4 @@
[Desktop Entry]
-Encoding=UTF-8
Name=System Profiler and Benchmark
Name[pt_BR]=Informações e Testes do Sistema
Exec=hardinfo
@@ -7,4 +6,4 @@ Icon=/usr/share/hardinfo/pixmaps/logo.png
Terminal=false
Type=Application
StartupNotify=true
-Categories=System
+Categories=System; \ No newline at end of file
diff --git a/hardinfo.h b/hardinfo.h
index 36dbb6d6..9f52f633 100644
--- a/hardinfo.h
+++ b/hardinfo.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -39,6 +39,7 @@ struct _ProgramParameters {
gchar **use_modules;
gchar *path_lib;
gchar *path_data;
+ gchar *argv0;
};
struct _FileTypes {
@@ -64,7 +65,7 @@ struct _ModuleAbout {
/* String utility functions */
inline void remove_quotes(gchar *str);
-inline void strend(gchar *str, gchar chr);
+inline char *strend(gchar *str, gchar chr);
inline void remove_linefeed(gchar *str);
gchar *strreplace(gchar *string, gchar *replace, gchar new_char);
@@ -88,6 +89,8 @@ 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);
@@ -118,7 +121,12 @@ 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;
diff --git a/iconcache.c b/iconcache.c
index ed7ce209..c927ca5e 100644
--- a/iconcache.c
+++ b/iconcache.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/iconcache.h b/iconcache.h
index df1c0629..97f59a82 100644
--- a/iconcache.h
+++ b/iconcache.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/loadgraph.c b/loadgraph.c
index 3a535f5b..c8503072 100644
--- a/loadgraph.c
+++ b/loadgraph.c
@@ -6,7 +6,7 @@
* - fixes autoscaling
* - add color
*
- * Copyright (C) 2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* The Simple Load Graph is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -37,12 +37,12 @@ LoadGraph *load_graph_new(gint size)
lg->suffix = g_strdup("");
lg->area = gtk_drawing_area_new();
- lg->size = size;
- lg->data = g_new0(gint, size);
+ lg->size = (size * 3) / 2;
+ lg->data = g_new0(gint, lg->size);
lg->scale = 1.0;
- lg->width = size * 4;
+ lg->width = size * 6;
lg->height = size * 2;
lg->max_value = 1;
@@ -103,7 +103,7 @@ 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 - 0x404040);
+ gdk_rgb_gc_set_foreground(lg->grid, lg->color - 0xcdcdcd);
}
void load_graph_destroy(LoadGraph * lg)
@@ -125,7 +125,7 @@ static gboolean _expose(GtkWidget * widget, GdkEventExpose * event,
GdkDrawable *draw = GDK_DRAWABLE(lg->buf);
gdk_draw_drawable(lg->area->window,
- lg->area->style->white_gc,
+ lg->area->style->black_gc,
draw, 0, 0, 0, 0, lg->width, lg->height);
return FALSE;
}
@@ -148,6 +148,8 @@ void load_graph_configure_expose(LoadGraph * lg)
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
diff --git a/loadgraph.h b/loadgraph.h
index 8adfe6b9..3a53f793 100644
--- a/loadgraph.h
+++ b/loadgraph.h
@@ -1,6 +1,6 @@
/*
* Simple Load Graph
- * Copyright (C) 2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2006 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* The Simple Load Graph is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/menu.c b/menu.c
index 6c945c9c..63601c39 100644
--- a/menu.c
+++ b/menu.c
@@ -47,6 +47,16 @@ static GtkActionEntry entries[] = {
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", "<control>C",
NULL,
diff --git a/menu.h b/menu.h
index 9e9deda4..361b2323 100644
--- a/menu.h
+++ b/menu.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/modules/placeholder b/modules/placeholder
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/modules/placeholder
diff --git a/network.c b/network.c
new file mode 100644
index 00000000..52029598
--- /dev/null
+++ b/network.c
@@ -0,0 +1,403 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gtk/gtk.h>
+#include <config.h>
+#include <time.h>
+#include <string.h>
+#include <sys/utsname.h>
+#include <sys/stat.h>
+
+#include <hardinfo.h>
+#include <iconcache.h>
+#include <shell.h>
+
+#include <vendor.h>
+
+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 <arch/this/samba.h>
+#include <arch/this/nfs.h>
+#include <arch/this/net.h>
+
+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 */
+ fgets(buffer, 256, route);
+ 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 */
+ 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=Device\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;
+}
diff --git a/nqueens.c b/nqueens.c
new file mode 100644
index 00000000..838731c4
--- /dev/null
+++ b/nqueens.c
@@ -0,0 +1,37 @@
+/*
+ * N-Queens Problem Solver
+ * Found somewhere on the Internet; can't remember where. Possibly Wikipedia.
+ */
+#include <stdio.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#define QUEENS 11
+
+int row[QUEENS];
+
+bool safe(int x, int y)
+{
+ int i;
+ for (i = 1; i <= y; i++)
+ if (row[y - i] == x || row[y - i] == x - i || row[y - i] == x + i)
+ return false;
+ return true;
+}
+
+int nqueens(int y)
+{
+ int x;
+
+ for (x = 0; x < QUEENS; x++) {
+ if (safe((row[y - 1] = x), y - 1)) {
+ if (y < QUEENS) {
+ nqueens(y + 1);
+ } else {
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/nqueens.h b/nqueens.h
new file mode 100644
index 00000000..a4be93f0
--- /dev/null
+++ b/nqueens.h
@@ -0,0 +1,13 @@
+/*
+ * 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__ */
+
+
diff --git a/pixmaps/benchmark.png b/pixmaps/benchmark.png
index 1be159b7..927681cf 100644
--- a/pixmaps/benchmark.png
+++ b/pixmaps/benchmark.png
Binary files differ
diff --git a/pixmaps/bluetooth.png b/pixmaps/bluetooth.png
new file mode 100644
index 00000000..7f002131
--- /dev/null
+++ b/pixmaps/bluetooth.png
Binary files differ
diff --git a/pixmaps/cryptohash.png b/pixmaps/cryptohash.png
new file mode 100644
index 00000000..e2eb5d29
--- /dev/null
+++ b/pixmaps/cryptohash.png
Binary files differ
diff --git a/pixmaps/dns.png b/pixmaps/dns.png
new file mode 100644
index 00000000..d4bfb82b
--- /dev/null
+++ b/pixmaps/dns.png
Binary files differ
diff --git a/pixmaps/gnome-terminal.png b/pixmaps/environment.png
index ceb0fb99..ceb0fb99 100644
--- a/pixmaps/gnome-terminal.png
+++ b/pixmaps/environment.png
Binary files differ
diff --git a/pixmaps/fft.png b/pixmaps/fft.png
new file mode 100644
index 00000000..3a44038c
--- /dev/null
+++ b/pixmaps/fft.png
Binary files differ
diff --git a/pixmaps/language.png b/pixmaps/language.png
index ed0480b1..495a94bc 100644
--- a/pixmaps/language.png
+++ b/pixmaps/language.png
Binary files differ
diff --git a/pixmaps/logo.png b/pixmaps/logo.png
index ed4f8ef5..48d49419 100644
--- a/pixmaps/logo.png
+++ b/pixmaps/logo.png
Binary files differ
diff --git a/pixmaps/logo.svg b/pixmaps/logo.svg
deleted file mode 100644
index 159b96ed..00000000
--- a/pixmaps/logo.svg
+++ /dev/null
@@ -1,771 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="32"
- height="32"
- id="svg2327"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- sodipodi:docbase="/home/leandro/Work/hardinfo/trunk/hardinfo2/pixmaps"
- sodipodi:docname="logo.svg"
- version="1.0"
- inkscape:export-filename="/home/leandro/Work/hardinfo/trunk/hardinfo2/pixmaps/logo.png"
- inkscape:export-xdpi="137.46988"
- inkscape:export-ydpi="137.46988">
- <defs
- id="defs3">
- <linearGradient
- id="linearGradient2752">
- <stop
- id="stop2754"
- offset="0"
- style="stop-color:#9d9d9d;stop-opacity:1;" />
- <stop
- id="stop2756"
- offset="1.0000000"
- style="stop-color:#b9b9b9;stop-opacity:1.0000000;" />
- </linearGradient>
- <linearGradient
- id="linearGradient2711">
- <stop
- id="stop2713"
- offset="0.0000000"
- style="stop-color:#909090;stop-opacity:1.0000000;" />
- <stop
- id="stop2715"
- offset="1.0000000"
- style="stop-color:#bebebe;stop-opacity:0.0000000;" />
- </linearGradient>
- <linearGradient
- id="linearGradient2701">
- <stop
- id="stop2703"
- offset="0.0000000"
- style="stop-color:#585956;stop-opacity:1.0000000;" />
- <stop
- id="stop2705"
- offset="1.0000000"
- style="stop-color:#bbbeb8;stop-opacity:1.0000000;" />
- </linearGradient>
- <linearGradient
- id="linearGradient2683"
- inkscape:collect="always">
- <stop
- id="stop2685"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop2687"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient2675">
- <stop
- id="stop2677"
- offset="0.0000000"
- style="stop-color:#5b5b97;stop-opacity:1.0000000;" />
- <stop
- id="stop2679"
- offset="1.0000000"
- style="stop-color:#1b1b43;stop-opacity:1.0000000;" />
- </linearGradient>
- <linearGradient
- id="linearGradient2667">
- <stop
- id="stop2669"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:1.0000000;" />
- <stop
- id="stop2671"
- offset="1.0000000"
- style="stop-color:#fcfcff;stop-opacity:0.0000000;" />
- </linearGradient>
- <linearGradient
- id="linearGradient2635"
- inkscape:collect="always">
- <stop
- id="stop2637"
- offset="0"
- style="stop-color:#f9fff5;stop-opacity:1;" />
- <stop
- id="stop2639"
- offset="1"
- style="stop-color:#f9fff5;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient2454">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop2456" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop2458" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient2415">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop2417" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop2419" />
- </linearGradient>
- <linearGradient
- id="linearGradient2253">
- <stop
- style="stop-color:#8f8f8f;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop2255" />
- <stop
- style="stop-color:#494949;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop2257" />
- </linearGradient>
- <linearGradient
- id="linearGradient2245">
- <stop
- style="stop-color:#dde1d9;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop2247" />
- <stop
- style="stop-color:#cacdc6;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop2249" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2454"
- id="radialGradient2119"
- gradientUnits="userSpaceOnUse"
- gradientTransform="scale(1.925808,0.519262)"
- cx="12.57571"
- cy="67.501709"
- fx="12.57571"
- fy="67.501709"
- r="8.7662792" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2245"
- id="linearGradient3151"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.754296,0,0,0.650713,-0.158607,-3.549207)"
- x1="18.316999"
- y1="48.643234"
- x2="18.176752"
- y2="52.536461" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2253"
- id="linearGradient3153"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.737296,0,0,0.665717,-0.158607,-3.549207)"
- x1="10.390738"
- y1="5.3817744"
- x2="32.536823"
- y2="31.246054" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2752"
- id="linearGradient3155"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.540139,0,0,0.264783,-0.187732,2.141243)"
- x1="8.1134243"
- y1="88.509071"
- x2="8.1134233"
- y2="100.20015" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2752"
- id="linearGradient3157"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.540139,0,0,0.264783,-0.187732,2.141243)"
- x1="8.1134243"
- y1="88.509071"
- x2="8.1134233"
- y2="100.20015" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2752"
- id="linearGradient3159"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.540139,0,0,0.264783,-0.187732,2.141243)"
- x1="8.1134243"
- y1="88.509071"
- x2="8.1134233"
- y2="100.20015" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2635"
- id="linearGradient3161"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.409488,0,0,0.31705,0.718141,-1.635309)"
- x1="13.62871"
- y1="101.2846"
- x2="8.6485014"
- y2="74.098007" />
- <linearGradient
- y2="3.8451097"
- x2="35.520542"
- y1="3.9384086"
- x1="34.300991"
- gradientUnits="userSpaceOnUse"
- id="linearGradient3006"
- xlink:href="#linearGradient2711"
- inkscape:collect="always" />
- <linearGradient
- y2="3.8451097"
- x2="35.520542"
- y1="3.9384086"
- x1="34.300991"
- gradientUnits="userSpaceOnUse"
- id="linearGradient3002"
- xlink:href="#linearGradient2711"
- inkscape:collect="always" />
- <linearGradient
- y2="3.8451097"
- x2="35.520542"
- y1="3.9384086"
- x1="34.300991"
- gradientUnits="userSpaceOnUse"
- id="linearGradient2998"
- xlink:href="#linearGradient2711"
- inkscape:collect="always" />
- <radialGradient
- r="8.7662792"
- fy="67.501709"
- fx="12.57571"
- cy="67.501709"
- cx="12.57571"
- gradientTransform="scale(1.925808,0.519262)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient2013"
- xlink:href="#linearGradient2454"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient2321">
- <stop
- style="stop-color:#7b7f7a;stop-opacity:1;"
- offset="0"
- id="stop2323" />
- <stop
- style="stop-color:#7b7f7a;stop-opacity:0;"
- offset="1"
- id="stop2325" />
- </linearGradient>
- <linearGradient
- id="linearGradient2329">
- <stop
- style="stop-color:#ffffff;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop2331" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0.0000000;"
- offset="1.0000000"
- id="stop2333" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2667"
- id="linearGradient3407"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.825985,0,0,0.597304,3.484242,-1.538064)"
- x1="11.492236"
- y1="1.6537577"
- x2="17.199417"
- y2="26.729263" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2415"
- id="linearGradient3410"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.735452,0,0,0.59631,3.472291,0.397507)"
- x1="17.698339"
- y1="13.004725"
- x2="34.974548"
- y2="55.200756" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2683"
- id="linearGradient3413"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(3.803441,0,0,0.116853,3.71313,-1.108211)"
- x1="3.7069976"
- y1="171.29134"
- x2="3.7069974"
- y2="162.45061" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2675"
- id="linearGradient3416"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.777649,0,0,0.664731,3.629634,-1.713604)"
- x1="19.150396"
- y1="32.622238"
- x2="16.315819"
- y2="8.8666229" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2245"
- id="linearGradient3419"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.770539,0,0,0.610387,1.337506,-1.56896)"
- x1="8.6116238"
- y1="7.2293582"
- x2="34.784473"
- y2="33.339787" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2253"
- id="linearGradient3421"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.753173,0,0,0.624463,2.445717,-0.669394)"
- x1="10.390738"
- y1="5.3817744"
- x2="32.536823"
- y2="31.246054" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2701"
- id="linearGradient3424"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.210897,0,0,0.852618,1.322911,-29.79883)"
- x1="12.206709"
- y1="53.535141"
- x2="12.127711"
- y2="64.892525" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2329"
- id="linearGradient3430"
- gradientUnits="userSpaceOnUse"
- x1="-35.122688"
- y1="34.242237"
- x2="-35.074745"
- y2="30.962345" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2321"
- id="linearGradient3432"
- gradientUnits="userSpaceOnUse"
- x1="-35.658386"
- y1="33.416473"
- x2="-35.658386"
- y2="28.205938" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2711"
- id="linearGradient3436"
- gradientUnits="userSpaceOnUse"
- x1="34.300991"
- y1="3.9384086"
- x2="35.520542"
- y2="3.8451097" />
- <radialGradient
- r="8.753643"
- fy="16.855663"
- fx="-19.515638"
- cy="16.855663"
- cx="-19.515638"
- gradientTransform="matrix(2.828299,0,0,4.35457,72.19634,-62.10365)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient2953"
- xlink:href="#linearGradient2431"
- inkscape:collect="always" />
- <radialGradient
- r="22.376116"
- fy="28.458725"
- fx="26.544321"
- cy="28.458725"
- cx="26.544321"
- gradientTransform="matrix(1.238342,5.954846e-3,-6.507762e-3,1.351272,-6.992513,-9.744842)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient2062"
- xlink:href="#linearGradient2933"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient2431">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop2433" />
- <stop
- style="stop-color:#b8b8b8;stop-opacity:1;"
- offset="1"
- id="stop2435" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient21644">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop21646" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop21648" />
- </linearGradient>
- <linearGradient
- id="linearGradient2933">
- <stop
- id="stop2935"
- offset="0"
- style="stop-color:#9cbcde;stop-opacity:1" />
- <stop
- id="stop2937"
- offset="1"
- style="stop-color:#204a87" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient21644"
- id="radialGradient1887"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.595238,0,14.875)"
- cx="25.125"
- cy="36.75"
- fx="25.125"
- fy="36.75"
- r="15.75" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2431"
- id="radialGradient1996"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.828299,0,0,4.35457,111.3213,-64.97613)"
- cx="-19.515638"
- cy="16.855663"
- fx="-19.515638"
- fy="16.855663"
- r="8.753643" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient21644"
- id="radialGradient2012"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.595238,0,14.875)"
- cx="25.125"
- cy="36.75"
- fx="25.125"
- fy="36.75"
- r="15.75" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2933"
- id="radialGradient2014"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.238342,5.954846e-3,-6.507762e-3,1.351272,-6.992513,-9.744842)"
- cx="26.544321"
- cy="28.458725"
- fx="26.544321"
- fy="28.458725"
- r="22.376116" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666"
- borderopacity="1"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="8"
- inkscape:cx="37.875488"
- inkscape:cy="18.167741"
- inkscape:current-layer="layer1"
- showgrid="false"
- inkscape:grid-bbox="true"
- inkscape:document-units="px"
- inkscape:window-width="1034"
- inkscape:window-height="622"
- inkscape:window-x="236"
- inkscape:window-y="25"
- inkscape:showpageshadow="false"
- width="32px"
- height="32px"
- showborder="false" />
- <metadata
- id="metadata4">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title>Computer</dc:title>
- <dc:date>2005-03-08</dc:date>
- <dc:creator>
- <cc:Agent>
- <dc:title>Jakub Steiner</dc:title>
- </cc:Agent>
- </dc:creator>
- <dc:subject>
- <rdf:Bag>
- <rdf:li>workstation</rdf:li>
- <rdf:li>computer</rdf:li>
- <rdf:li>node</rdf:li>
- <rdf:li>client</rdf:li>
- </rdf:Bag>
- </dc:subject>
- <cc:license
- rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
- <dc:source>http://jimmac.musichall.cz/</dc:source>
- </cc:Work>
- <cc:License
- rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
- </cc:License>
- </rdf:RDF>
- </metadata>
- <g
- id="layer1"
- inkscape:label="Layer 1"
- inkscape:groupmode="layer">
- <path
- transform="matrix(0.842932,0,0,0.860842,-4.144223,-2.66695)"
- d="M 41.10058 35.051105 A 16.882174 4.552 0 1 1 7.3362331,35.051105 A 16.882174 4.552 0 1 1 41.10058 35.051105 z"
- sodipodi:ry="4.552"
- sodipodi:rx="16.882174"
- sodipodi:cy="35.051105"
- sodipodi:cx="24.218407"
- id="path2657"
- style="color:black;fill:url(#radialGradient2119);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible"
- sodipodi:type="arc" />
- <path
- sodipodi:type="arc"
- style="opacity:0.50857143;color:black;fill:url(#radialGradient2013);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible"
- id="path2452"
- sodipodi:cx="24.218407"
- sodipodi:cy="35.051105"
- sodipodi:rx="16.882174"
- sodipodi:ry="4.552"
- d="M 41.10058 35.051105 A 16.882174 4.552 0 1 1 7.3362331,35.051105 A 16.882174 4.552 0 1 1 41.10058 35.051105 z"
- transform="matrix(0.700168,0,0,1.245259,-0.630378,-20.73743)" />
- <path
- sodipodi:type="arc"
- style="color:black;fill:#adb0aa;fill-opacity:1;fill-rule:evenodd;stroke:#4b4d4a;stroke-width:1.46916819;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="path2407"
- sodipodi:cx="-35.658386"
- sodipodi:cy="29.716238"
- sodipodi:rx="9.3944187"
- sodipodi:ry="3.939595"
- d="M -26.263968 29.716238 A 9.3944187 3.939595 0 1 1 -45.052805,29.716238 A 9.3944187 3.939595 0 1 1 -26.263968 29.716238 z"
- transform="matrix(0.694942,0,0,0.666667,40.76488,2.385605)" />
- <path
- transform="matrix(0.638173,0,0,0.52797,38.69372,6.192003)"
- d="M -26.263968 29.716238 A 9.3944187 3.939595 0 1 1 -45.052805,29.716238 A 9.3944187 3.939595 0 1 1 -26.263968 29.716238 z"
- sodipodi:ry="3.939595"
- sodipodi:rx="9.3944187"
- sodipodi:cy="29.716238"
- sodipodi:cx="-35.658386"
- id="path1825"
- style="color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3432);stroke-width:1.72276604;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- sodipodi:type="arc" />
- <path
- sodipodi:type="arc"
- style="color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3430);stroke-width:1.67341197;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="path2983"
- sodipodi:cx="-35.658386"
- sodipodi:cy="29.716238"
- sodipodi:rx="9.3944187"
- sodipodi:ry="3.939595"
- d="M -26.263968 29.716238 A 9.3944187 3.939595 0 1 1 -45.052805,29.716238 A 9.3944187 3.939595 0 1 1 -26.263968 29.716238 z"
- transform="matrix(0.628221,0,0,0.568437,38.54718,4.306169)" />
- <rect
- y="17.750319"
- x="12.971182"
- height="4.2433615"
- width="6.0264516"
- id="rect2699"
- style="color:black;fill:url(#linearGradient3424);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.60872948;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- <path
- sodipodi:nodetypes="ccccccccccccccccc"
- style="fill:#d0d0d0;fill-opacity:1;fill-rule:evenodd;stroke:#979797;stroke-width:0.4000003;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
- d="M 17.126296,19.177505 L 17.083349,19.844172 C 17.083349,19.844172 20.054664,22.243617 23.267708,22.645845 C 24.874229,22.846958 26.5342,23.11412 27.905977,23.437512 C 29.277754,23.760904 30.37172,24.183916 30.740474,24.541679 C 30.953774,24.74862 31.050423,24.924105 31.08405,25.062513 C 31.117678,25.20092 31.110311,25.299056 31.01963,25.437513 C 30.838269,25.714426 30.277605,26.082614 29.323226,26.375013 C 27.414468,26.95981 24.018129,27.333347 19.31659,27.333347 L 19.31659,28.000014 C 24.055181,28.000014 27.468719,27.648233 29.516487,27.020847 C 30.540371,26.707153 31.251503,26.343722 31.599413,25.812513 C 31.773369,25.546909 31.844947,25.220213 31.771201,24.916679 C 31.697456,24.613145 31.506954,24.326975 31.234364,24.062512 C 30.631341,23.477465 29.491174,23.124885 28.077765,22.791678 C 26.664356,22.458471 24.974773,22.182125 23.353601,21.979178 C 20.111261,21.573283 17.126296,19.177505 17.126296,19.177505 z "
- id="path2411" />
- <path
- style="color:black;fill:url(#linearGradient3419);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3421);stroke-width:1.0000006;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- d="M 4.5468197,0.5000001 L 27.453174,0.5000001 C 28.074688,0.5000001 28.560804,0.9024013 28.589859,1.4666116 L 29.498282,19.106685 C 29.537979,19.877537 28.883783,20.499998 28.120482,20.499998 L 3.8795124,20.499998 C 3.116211,20.499998 2.4620149,19.877537 2.5017119,19.106685 L 3.4101343,1.4666116 C 3.4376069,0.9331395 3.7835182,0.5000001 4.5468197,0.5000001 z "
- id="rect2404"
- sodipodi:nodetypes="cssssssss" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path2377"
- d="M 6.0727205,2.2499997 L 5.2499969,17.749996 L 26.212503,17.749996 L 25.328301,2.3156892 L 6.0727205,2.2499997 z "
- style="fill:url(#linearGradient3416);fill-opacity:1;fill-rule:evenodd;stroke:#000079;stroke-width:0.50000036;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:url(#linearGradient3413);stroke-width:0.99618173;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.24840764"
- d="M 4.4980854,18.501907 L 28.117082,18.501907"
- id="path2393" />
- <path
- sodipodi:nodetypes="cssssssss"
- id="path2397"
- d="M 4.7430574,1.5249746 L 27.207154,1.4999972 C 27.39545,1.4997879 27.578376,1.6567607 27.59351,1.9311672 L 28.497431,18.319972 C 28.535954,19.018408 28.139187,19.499992 27.436553,19.499992 L 4.5221432,19.499992 C 3.8195091,19.499992 3.4648201,19.018441 3.5027474,18.319972 L 4.3815789,2.1353932 C 4.4072623,1.6624066 4.4920129,1.5252537 4.7430574,1.5249746 z "
- style="color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3410);stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible" />
- <path
- sodipodi:nodetypes="ccccc"
- style="opacity:0.53142856;fill:url(#linearGradient3407);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 6.2315651,2.5138621 L 5.6965455,14.427421 C 13.059641,12.827001 15.977526,7.4326186 25.132577,5.662917 L 25.024928,2.5579048 L 6.2315651,2.5138621 z "
- id="path2443" />
- <path
- id="text2735"
- d="M 15.000002,18.128436 L 15.187812,18.128436 C 15.243656,18.128437 15.286469,18.140879 15.316252,18.165763 C 15.346232,18.190452 15.361221,18.225721 15.361222,18.271572 C 15.361221,18.317619 15.346232,18.353084 15.316252,18.377969 C 15.286469,18.402658 15.243656,18.415002 15.187812,18.415002 L 15.113158,18.415002 L 15.113158,18.567249 L 15.000002,18.567249 L 15.000002,18.128436 M 15.113158,18.210438 L 15.113158,18.333 L 15.175762,18.333 C 15.197707,18.333 15.214656,18.327709 15.226609,18.317129 C 15.238561,18.306352 15.244538,18.291167 15.244538,18.271572 C 15.244538,18.251978 15.238561,18.236891 15.226609,18.226309 C 15.214656,18.215729 15.197707,18.210438 15.175762,18.210438 L 15.113158,18.210438 M 15.641321,18.202502 C 15.606835,18.202503 15.580089,18.215239 15.561082,18.240711 C 15.542076,18.266184 15.532573,18.302041 15.532573,18.348284 C 15.532573,18.39433 15.542076,18.43009 15.561082,18.455562 C 15.580089,18.481035 15.606835,18.493771 15.641321,18.493771 C 15.676003,18.493771 15.702847,18.481035 15.721854,18.455562 C 15.74086,18.43009 15.750363,18.39433 15.750363,18.348284 C 15.750363,18.302041 15.74086,18.266184 15.721854,18.240711 C 15.702847,18.215239 15.676003,18.202503 15.641321,18.202502 M 15.641321,18.1205 C 15.71186,18.120501 15.767116,18.140683 15.807089,18.181047 C 15.847061,18.221411 15.867047,18.277157 15.867047,18.348284 C 15.867047,18.419215 15.847061,18.474862 15.807089,18.515226 C 15.767116,18.555591 15.71186,18.575773 15.641321,18.575773 C 15.570978,18.575773 15.515722,18.555591 15.475554,18.515226 C 15.435582,18.474862 15.415596,18.419215 15.415596,18.348284 C 15.415596,18.277157 15.435582,18.221411 15.475554,18.181047 C 15.515722,18.140683 15.570978,18.120501 15.641321,18.1205 M 15.952282,18.128436 L 16.078665,18.128436 L 16.23826,18.429404 L 16.23826,18.128436 L 16.345539,18.128436 L 16.345539,18.567249 L 16.219155,18.567249 L 16.059561,18.266281 L 16.059561,18.567249 L 15.952282,18.567249 L 15.952282,18.128436 M 16.394328,18.128436 L 16.518066,18.128436 L 16.617996,18.284798 L 16.717927,18.128436 L 16.841959,18.128436 L 16.674722,18.382378 L 16.674722,18.567249 L 16.561565,18.567249 L 16.561565,18.382378 L 16.394328,18.128436"
- style="font-size:0.9029026px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;writing-mode:lr-tb;text-anchor:start;fill:#4a4a4a;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" />
- <path
- sodipodi:type="arc"
- style="color:black;fill:url(#linearGradient2998);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="path2996"
- sodipodi:cx="34.780815"
- sodipodi:cy="3.9384086"
- sodipodi:rx="0.83968931"
- sodipodi:ry="0.83968931"
- d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
- transform="matrix(1.191851,0,0,0.590943,-14.20356,3.172623)" />
- <path
- sodipodi:type="arc"
- style="color:black;fill:url(#linearGradient3002);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="path3000"
- sodipodi:cx="34.780815"
- sodipodi:cy="3.9384086"
- sodipodi:rx="0.83968931"
- sodipodi:ry="0.83968931"
- d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
- transform="matrix(1.191851,0,0,0.590943,-14.07856,5.172623)" />
- <path
- sodipodi:type="arc"
- style="color:black;fill:url(#linearGradient3006);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="path3004"
- sodipodi:cx="34.780815"
- sodipodi:cy="3.9384086"
- sodipodi:rx="0.83968931"
- sodipodi:ry="0.83968931"
- d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
- transform="matrix(1.191851,0,0,0.590943,-13.98481,7.172623)" />
- <g
- id="g3140"
- transform="matrix(1.07411,0,0,1,-7.474908e-2,0)">
- <path
- style="color:black;fill:url(#linearGradient3151);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3153);stroke-width:0.96488512;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- d="M 4.1555474,23.519597 L 24.852756,23.519597 C 25.599965,23.519597 25.505238,23.719163 25.581927,23.970171 L 27.474336,30.164233 C 27.551025,30.415242 27.492376,30.614807 26.745165,30.614807 L 2.2631378,30.614807 C 1.515927,30.614807 1.457278,30.415242 1.5339666,30.164233 L 3.4263762,23.970171 C 3.5030648,23.719162 3.4083366,23.519597 4.1555474,23.519597 z "
- id="path2409"
- sodipodi:nodetypes="cssssssss" />
- <path
- style="fill:#7a7d77;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 4.1084868,24.998609 L 2.9283249,28.967343 L 6.5868268,28.967343 L 6.9408752,27.393536 L 16.854234,27.393536 L 17.2212,29 L 21.338848,29 L 20.217696,24.998609 L 4.1084868,24.998609 z "
- id="path2611"
- sodipodi:nodetypes="ccccccccc" />
- <path
- style="fill:#777874;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 7.2359158,27.667242 L 6.9408752,28.967344 L 16.795227,28.967344 L 16.500186,27.598815 L 7.2359158,27.667242 z "
- id="path2613" />
- <path
- id="path2619"
- d="M 24.938342,24.99861 L 26.059498,28.898918 L 22.400995,28.830491 L 21.397857,25.067036 L 24.938342,24.99861 z "
- style="color:black;fill:#777a75;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- <g
- transform="matrix(0.99867,0,0,0.940591,3.681797e-2,1.004505)"
- id="g2197">
- <path
- id="path2615"
- d="M 24.878007,25.565138 L 25.997768,28.64651 L 22.343815,28.59245 L 21.341925,25.619197 L 24.878007,25.565138 z "
- style="color:black;fill:url(#linearGradient3155);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- <path
- style="fill:url(#linearGradient3157);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 4.0740554,25.511079 L 2.8953613,28.64651 L 6.5493134,28.64651 L 6.9029215,27.403149 L 16.803952,27.403149 L 17.170462,28.672308 L 21.282989,28.672308 L 20.163231,25.511079 L 4.0740554,25.511079 z "
- id="path2617"
- sodipodi:nodetypes="ccccccccc" />
- <path
- style="color:black;fill:url(#linearGradient3159);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- d="M 7.1975952,27.673445 L 6.9029215,28.700569 L 16.745018,28.700569 L 16.450344,27.619386 L 7.1975952,27.673445 z "
- id="path2621" />
- </g>
- <path
- sodipodi:nodetypes="ccccc"
- id="path2631"
- d="M 4.0897989,24.249996 L 25.016002,24.249996 L 26.750007,29.750003 L 2.2500001,29.750003 L 4.0897989,24.249996 z "
- style="color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3161);stroke-width:0.48244256;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- </g>
- <path
- sodipodi:type="arc"
- style="color:black;fill:url(#linearGradient3436);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="path3434"
- sodipodi:cx="34.780815"
- sodipodi:cy="3.9384086"
- sodipodi:rx="0.83968931"
- sodipodi:ry="0.83968931"
- d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
- transform="matrix(1.191851,0,0,0.590943,-14.45356,1.172623)" />
- <g
- id="g2005"
- transform="matrix(0.470834,0,0,0.470834,-17.64221,12.13147)">
- <path
- transform="matrix(0.773935,0,0,0.397914,36.00038,9.77376)"
- d="M 40.875 36.75 A 15.75 9.375 0 1 1 9.375,36.75 A 15.75 9.375 0 1 1 40.875 36.75 z"
- sodipodi:ry="9.375"
- sodipodi:rx="15.75"
- sodipodi:cy="36.75"
- sodipodi:cx="25.125"
- id="path21642"
- style="opacity:0.63068183;color:black;fill:url(#radialGradient2012);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- sodipodi:type="arc" />
- <path
- transform="matrix(0.664228,0,0,0.641487,39.24394,-2.658954)"
- d="M 45.785164 23.825787 A 21.876116 21.876116 0 1 1 2.0329323,23.825787 A 21.876116 21.876116 0 1 1 45.785164 23.825787 z"
- sodipodi:ry="21.876116"
- sodipodi:rx="21.876116"
- sodipodi:cy="23.825787"
- sodipodi:cx="23.909048"
- id="path2093"
- style="fill:url(#radialGradient2014);fill-opacity:1;stroke:#204a87;stroke-width:1.43783867"
- sodipodi:type="arc" />
- <path
- sodipodi:type="arc"
- style="opacity:0.96022728;fill:none;fill-opacity:1;stroke:white;stroke-width:3.43368769;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path2209"
- sodipodi:cx="23.909048"
- sodipodi:cy="23.825787"
- sodipodi:rx="21.876116"
- sodipodi:ry="21.876116"
- d="M 45.785164 23.825787 A 21.876116 21.876116 0 1 1 2.0329323,23.825787 A 21.876116 21.876116 0 1 1 45.785164 23.825787 z"
- transform="matrix(0.594256,0,0,0.570906,40.91689,-0.974785)" />
- <text
- id="text2001"
- y="21.797297"
- x="50.589512"
- style="font-size:25.51218796px;font-style:normal;font-weight:normal;fill:#f2f2f2;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Alianna"
- xml:space="preserve"><tspan
- style="fill:#f2f2f2;font-family:Arial Black"
- y="21.797297"
- x="50.589512"
- id="tspan2003"
- sodipodi:role="line">i</tspan></text>
- </g>
- </g>
-</svg>
diff --git a/pixmaps/logo.xcf b/pixmaps/logo.xcf
new file mode 100644
index 00000000..e4295251
--- /dev/null
+++ b/pixmaps/logo.xcf
Binary files differ
diff --git a/pixmaps/nautilus.png b/pixmaps/nautilus.png
new file mode 100644
index 00000000..945d4d74
--- /dev/null
+++ b/pixmaps/nautilus.png
Binary files differ
diff --git a/pixmaps/network-connections.png b/pixmaps/network-connections.png
new file mode 100644
index 00000000..883a003b
--- /dev/null
+++ b/pixmaps/network-connections.png
Binary files differ
diff --git a/pixmaps/network-generic.png b/pixmaps/network-generic.png
deleted file mode 100644
index caebd989..00000000
--- a/pixmaps/network-generic.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/network-interface.png b/pixmaps/network-interface.png
new file mode 100644
index 00000000..51c8b16f
--- /dev/null
+++ b/pixmaps/network-interface.png
Binary files differ
diff --git a/pixmaps/network-statistics.png b/pixmaps/network-statistics.png
new file mode 100644
index 00000000..18a118a2
--- /dev/null
+++ b/pixmaps/network-statistics.png
Binary files differ
diff --git a/pixmaps/network.png b/pixmaps/network.png
index 51c8b16f..caebd989 100644
--- a/pixmaps/network.png
+++ b/pixmaps/network.png
Binary files differ
diff --git a/pixmaps/nqueens.png b/pixmaps/nqueens.png
new file mode 100644
index 00000000..17499732
--- /dev/null
+++ b/pixmaps/nqueens.png
Binary files differ
diff --git a/pixmaps/report-large.png b/pixmaps/report-large.png
index 1cc693f5..694c9211 100644
--- a/pixmaps/report-large.png
+++ b/pixmaps/report-large.png
Binary files differ
diff --git a/pixmaps/report.png b/pixmaps/report.png
index 48bd5d01..dc566f59 100644
--- a/pixmaps/report.png
+++ b/pixmaps/report.png
Binary files differ
diff --git a/pixmaps/resources.png b/pixmaps/resources.png
new file mode 100644
index 00000000..308acb27
--- /dev/null
+++ b/pixmaps/resources.png
Binary files differ
diff --git a/pixmaps/summary.png b/pixmaps/summary.png
index 0abb49f3..b66871a9 100644
--- a/pixmaps/summary.png
+++ b/pixmaps/summary.png
Binary files differ
diff --git a/pixmaps/therm.png b/pixmaps/therm.png
index 3dac3913..73f80da6 100644
--- a/pixmaps/therm.png
+++ b/pixmaps/therm.png
Binary files differ
diff --git a/pixmaps/usb.png b/pixmaps/usb.png
index 7c7c6746..af28b288 100644
--- a/pixmaps/usb.png
+++ b/pixmaps/usb.png
Binary files differ
diff --git a/pixmaps/usbfldisk.png b/pixmaps/usbfldisk.png
new file mode 100644
index 00000000..c6a2d0c6
--- /dev/null
+++ b/pixmaps/usbfldisk.png
Binary files differ
diff --git a/report.c b/report.c
index 85653502..c0cc8563 100644
--- a/report.c
+++ b/report.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -64,8 +64,31 @@ 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.
@@ -73,10 +96,50 @@ void report_context_configure(ReportContext * ctx, GKeyFile * keyfile)
http://en.wikipedia.org/wiki/Data:_URI_scheme */
ctx->is_image_enabled = (g_key_file_get_boolean(keyfile,
- "$ShellParam$",
+ group,
"ViewType",
- NULL) ==
- SHELL_VIEW_PROGRESS);
+ 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)
@@ -85,8 +148,20 @@ void report_table(ReportContext * ctx, gchar * text)
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;
@@ -94,7 +169,6 @@ void report_table(ReportContext * ctx, gchar * text)
gint j;
if (groups[i][0] == '$') {
- report_context_configure(ctx, key_file);
continue;
}
@@ -115,11 +189,9 @@ void report_table(ReportContext * ctx, gchar * text)
gchar *key = keys[j];
gchar *value;
- value =
- g_key_file_get_value(key_file, tmpgroup, key, NULL);
+ value = g_key_file_get_value(key_file, tmpgroup, key, NULL);
- if (g_utf8_validate(key, -1, NULL)
- && g_utf8_validate(value, -1, NULL)) {
+ if (g_utf8_validate(key, -1, NULL) && g_utf8_validate(value, -1, NULL)) {
strend(key, '#');
if (g_str_equal(value, "...")) {
@@ -128,7 +200,7 @@ void report_table(ReportContext * ctx, gchar * text)
value = g_strdup("...");
}
}
-
+
if (*key == '$') {
report_key_value(ctx, strchr(key + 1, '$') + 1,
value);
@@ -168,45 +240,80 @@ static void report_html_header(ReportContext * ctx)
" .sstitle{ font: bold 80%% serif; color: #000000; background: #efefef }\n"
" .field { font: 80%% sans-serif; color: #000000; padding: 2px; padding-left: 50px }\n"
" .value { font: 80%% sans-serif; color: #505050 }\n"
- "</style>\n" "</head><body>\n" "<table width=\"100%%\"><tbody>",
+ "</style>\n" "</head><body>\n",
VERSION);
}
static void report_html_footer(ReportContext * ctx)
{
ctx->output = h_strconcat(ctx->output,
- "</tbody></table></body></html>", NULL);
+ "</table></html>", NULL);
}
static void report_html_title(ReportContext * ctx, gchar * text)
{
- ctx->output = h_strdup_cprintf("<tr><td colspan=\"2\" class=\"titl"
- "e\">%s</td></tr>\n", ctx->output, text);
+ if (!ctx->first_table) {
+ ctx->output = h_strdup_cprintf("</table>", ctx->output);
+ }
+
+ ctx->output = h_strdup_cprintf("<h1 class=\"title\">%s</h1>", ctx->output, text);
}
static void report_html_subtitle(ReportContext * ctx, gchar * text)
{
- ctx->output = h_strdup_cprintf("<tr><td colspan=\"2\" class=\"stit"
+ gint columns = report_get_visible_columns(ctx);
+
+ if (!ctx->first_table) {
+ ctx->output = h_strdup_cprintf("</table>", ctx->output);
+ } else {
+ ctx->first_table = FALSE;
+ }
+
+ ctx->output = h_strdup_cprintf("<table><tr><td colspan=\"%d\" class=\"stit"
"le\">%s</td></tr>\n",
ctx->output,
+ columns,
text);
}
static void report_html_subsubtitle(ReportContext * ctx, gchar * text)
{
- ctx->output = h_strdup_cprintf("<tr><td colspan=\"2\" class=\"ssti"
+ gint columns = report_get_visible_columns(ctx);
+
+ ctx->output = h_strdup_cprintf("<tr><td colspan=\"%d\" class=\"ssti"
"tle\">%s</td></tr>\n",
ctx->output,
+ columns,
text);
}
static void
report_html_key_value(ReportContext * ctx, gchar * key, gchar * value)
{
- ctx->output = h_strdup_cprintf("<tr><td class=\"field\">%s</td>"
- "<td class=\"value\">%s</td></tr>\n",
- ctx->output,
- key, value);
+ gint columns = report_get_visible_columns(ctx);
+ gchar **values;
+ gint i;
+
+ if (columns == 2) {
+ ctx->output = h_strdup_cprintf("<tr><td class=\"field\">%s</td>"
+ "<td class=\"value\">%s</td></tr>\n",
+ ctx->output,
+ key, value);
+ } else {
+ values = g_strsplit(value, "|", columns);
+
+ ctx->output = h_strdup_cprintf("\n<tr>\n<td class=\"field\">%s</td>", ctx->output, key);
+
+ for (i = columns - 2; i >= 0; i--) {
+ ctx->output = h_strdup_cprintf("<td class=\"value\">%s</td>",
+ ctx->output,
+ values[i]);
+ }
+
+ ctx->output = h_strdup_cprintf("</tr>\n", ctx->output);
+
+ g_strfreev(values);
+ }
}
static void report_text_header(ReportContext * ctx)
@@ -255,11 +362,30 @@ static void report_text_subsubtitle(ReportContext * ctx, gchar * text)
static void
report_text_key_value(ReportContext * ctx, gchar * key, gchar * value)
{
- 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);
+ 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)
@@ -394,6 +520,9 @@ ReportContext *report_context_html_new()
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;
}
@@ -411,12 +540,16 @@ ReportContext *report_context_text_new()
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);
}
diff --git a/report.h b/report.h
index bf93d9b0..782621cb 100644
--- a/report.h
+++ b/report.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -27,6 +27,14 @@ typedef enum {
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;
@@ -34,16 +42,21 @@ 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);
+ 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 {
diff --git a/sha1.c b/sha1.c
index 871835ae..b94ce254 100644
--- a/sha1.c
+++ b/sha1.c
@@ -231,11 +231,6 @@ void SHA1Final(guchar digest[20], SHA1_CTX * context)
#ifdef SHA1_TEST
static char *b32_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
-void g_assert(int a)
-{
- /* Bah, who needs testing anyway... ;) */
-}
-
static void base32_encode_exactly(guchar * buf, gint len,
guchar * encbuf, gint enclen)
{
@@ -313,7 +308,7 @@ int main(int argc, char **argv)
}
SHA1Final(digest, &context);
fclose(file);
-/*
+
for (i = 0; i < 5; i++) {
for (j = 0; j < 4; j++) {
printf("%02X", digest[i*4+j]);
@@ -321,7 +316,6 @@ int main(int argc, char **argv)
putchar(' ');
}
putchar('\n');
-*/
{
guchar tmp[33];
diff --git a/shell.c b/shell.c
index 50f36f6c..376f1034 100644
--- a/shell.c
+++ b/shell.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -197,7 +197,7 @@ void shell_action_set_active(const gchar * action_name, gboolean setting)
void shell_status_pulse(void)
{
if (params.gui_running) {
- if (shell->_pulses++ == 20) {
+ 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);
@@ -252,7 +252,7 @@ void shell_view_set_enabled(gboolean 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);
+ shell_action_set_enabled("SyncManagerAction", setting && sync_manager_count_entries() > 0);
shell_action_set_enabled("SaveGraphAction",
setting ? shell->view_type ==
SHELL_VIEW_PROGRESS : FALSE);
@@ -355,7 +355,7 @@ static void create_window(void)
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_widget_set_size_request(shell->window, 600, 400);
+ 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);
@@ -485,6 +485,10 @@ static void add_modules_to_gui(gpointer data, gpointer 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,
@@ -604,9 +608,11 @@ static gboolean update_field(gpointer data)
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);
@@ -639,8 +645,6 @@ static gboolean update_field(gpointer data)
update_sfusrc = NULL;
}
- DEBUG("destroying ShellFieldUpdate for field %s", fu->field_name);
-
/* otherwise, cleanup and destroy the timeout */
g_free(fu->field_name);
g_free(fu);
@@ -648,6 +652,11 @@ static gboolean update_field(gpointer data)
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;
@@ -657,10 +666,14 @@ static gboolean reload_section(gpointer data)
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))
+ (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);
@@ -670,8 +683,13 @@ static gboolean reload_section(gpointer data)
/* 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 */
@@ -714,34 +732,40 @@ info_tree_compare_val_func(GtkTreeModel * model,
return ret;
}
-static void set_view_type(ShellViewType viewtype)
+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 */
- gtk_tree_view_column_set_visible(shell->info->col_progress, FALSE);
- gtk_tree_view_column_set_visible(shell->info->col_value, TRUE);
-
+ 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);
- if (viewtype == shell->view_type)
- return;
-
- if (viewtype < SHELL_VIEW_NORMAL || viewtype >= SHELL_VIEW_N_VIEWS)
- viewtype = SHELL_VIEW_NORMAL;
-
- shell->view_type = viewtype;
-
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);
@@ -756,20 +780,30 @@ static void set_view_type(ShellViewType viewtype)
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);
- gtk_tree_view_column_set_visible(shell->info->col_progress, TRUE);
- gtk_tree_view_column_set_visible(shell->info->col_value, FALSE);
- gtk_widget_hide(shell->notebook);
+
+ 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)
+ gchar * group, gchar ** keys, gboolean reload)
{
if (g_str_equal(group, "$ShellParam$")) {
+ gboolean headers_visible = FALSE;
gint i;
for (i = 0; keys[i]; i++) {
@@ -790,6 +824,8 @@ group_handle_special(GKeyFile * key_file, ShellModuleEntry * entry,
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);
@@ -807,13 +843,37 @@ group_handle_special(GKeyFile * key_file, ShellModuleEntry * entry,
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;
+ 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;
+ }
+
+ 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));
+ key, NULL), reload);
} else if (g_str_has_prefix(key, "Icon")) {
GtkTreeIter *iter = g_hash_table_lookup(update_tbl,
strchr(key,
@@ -837,6 +897,8 @@ group_handle_special(GKeyFile * key_file, ShellModuleEntry * entry,
(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);
}
@@ -870,16 +932,29 @@ group_handle_normal(GKeyFile * key_file, ShellModuleEntry * entry,
value = entry->fieldfunc(key);
}
- if ((key && value) &&
- g_utf8_validate(key, -1, NULL)
- && g_utf8_validate(value, -1, NULL)) {
+ 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);
}
- gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, value,
- -1);
+
+ /* 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, '#');
@@ -942,27 +1017,30 @@ static void update_progress()
GtkTreeStore *store = GTK_TREE_STORE(model);
GtkTreeIter iter, fiter;
gchar *tmp;
- gdouble maxv = 0, maxp = 0, cur;
+ gdouble maxv = 0, maxp = 0, cur, floatval;
gtk_tree_model_get_iter_first(model, &fiter);
/* finds the maximum value */
- 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));
+ 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);
+ gtk_tree_model_get(model, &iter, INFO_TREE_COL_VALUE, &tmp, -1);
cur = 100 - 100 * atof(tmp) / maxv;
maxp = MAX(cur, maxp);
@@ -976,14 +1054,29 @@ static void update_progress()
/* 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;
- cur = 100 * atof(tmp) / maxv;
if (shell->_order_type == SHELL_ORDER_ASCENDING)
cur = 100 - cur + maxp;
-
- gtk_tree_store_set(store, &iter, INFO_TREE_COL_PROGRESS, cur, -1);
- g_free(tmp);
+
+ 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 :) */
@@ -1020,17 +1113,24 @@ 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);
+ set_view_type(SHELL_VIEW_NORMAL, reload);
- /* recreate the iter hash table */
if (!reload) {
+ /* recreate the iter hash table */
h_hash_table_remove_all(update_tbl);
}
@@ -1052,6 +1152,7 @@ module_selected_show_info(ShellModuleEntry * entry, gboolean reload)
}
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,
@@ -1067,21 +1168,41 @@ module_selected_show_info(ShellModuleEntry * entry, gboolean reload)
gchar **keys = g_key_file_get_keys(key_file, group, NULL, NULL);
if (*group == '$') {
- group_handle_special(key_file, entry, group, keys);
+ 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));
- if (shell->view_type == SHELL_VIEW_PROGRESS) {
+ 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();
}
- shell_set_note_from_entry(entry);
+#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);
@@ -1169,18 +1290,11 @@ static void module_selected(gpointer data)
gtk_tree_view_columns_autosize(GTK_TREE_VIEW(shell->info->view));
/* urgh. why don't GTK do this when the model is cleared? */
-#define RANGE_SET_VALUE(tree,scrollbar,value) \
- gtk_range_set_value(GTK_RANGE \
- (GTK_SCROLLED_WINDOW(shell->tree->scroll)-> \
- scrollbar), value);
-
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);
-#undef RANGE_SET_VALUE
-
shell_status_update("Done.");
shell_status_set_enabled(FALSE);
@@ -1197,7 +1311,7 @@ static void module_selected(gpointer data)
shell_action_set_enabled("CopyAction", FALSE);
gtk_tree_store_clear(GTK_TREE_STORE(shell->info->model));
- set_view_type(SHELL_VIEW_NORMAL);
+ set_view_type(SHELL_VIEW_NORMAL, FALSE);
}
current = entry;
@@ -1236,17 +1350,34 @@ static ShellInfoTree *info_tree_new(gboolean extra)
(scroll), GTK_SHADOW_IN);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
GTK_POLICY_AUTOMATIC,
- 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, 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);
- column = gtk_tree_view_column_new();
+ 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);
@@ -1254,28 +1385,38 @@ static ShellInfoTree *info_tree_new(gboolean extra)
INFO_TREE_COL_PBUF);
cr_text = gtk_cell_renderer_text_new();
- gtk_tree_view_column_pack_start(column, cr_text, FALSE);
+ 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_value = column = gtk_tree_view_column_new();
+ 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_VALUE);
+ INFO_TREE_COL_EXTRA1);
- info->col_progress = column = gtk_tree_view_column_new();
+ 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_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",
+ 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);
- gtk_tree_view_column_set_visible(column, FALSE);
sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
@@ -1311,7 +1452,7 @@ static ShellTree *tree_new()
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_NEVER,
GTK_POLICY_AUTOMATIC);
store = gtk_tree_store_new(TREE_NCOL, GDK_TYPE_PIXBUF, G_TYPE_STRING,
diff --git a/shell.h b/shell.h
index 5446d6c2..56b7765f 100644
--- a/shell.h
+++ b/shell.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -48,6 +48,7 @@ typedef enum {
SHELL_VIEW_DUAL,
SHELL_VIEW_LOAD_GRAPH,
SHELL_VIEW_PROGRESS,
+ SHELL_VIEW_PROGRESS_DUAL,
SHELL_VIEW_N_VIEWS
} ShellViewType;
@@ -65,6 +66,8 @@ typedef enum {
INFO_TREE_COL_DATA,
INFO_TREE_COL_PBUF,
INFO_TREE_COL_PROGRESS,
+ INFO_TREE_COL_EXTRA1,
+ INFO_TREE_COL_EXTRA2,
INFO_TREE_NCOL
} ShellInfoTreeColumns;
@@ -84,6 +87,7 @@ struct _Shell {
GtkUIManager *ui_manager;
ShellViewType view_type;
+ gboolean normalize_percentage;
gint _pulses;
ShellOrderType _order_type;
@@ -104,7 +108,7 @@ struct _ShellInfoTree {
GtkTreeModel *model;
GtkTreeSelection *selection;
- GtkTreeViewColumn *col_progress, *col_value;
+ GtkTreeViewColumn *col_progress, *col_value, *col_extra1, *col_extra2, *col_textvalue;
};
struct _ShellNote {
@@ -124,7 +128,7 @@ struct _ShellModule {
struct _ShellModuleMethod {
gchar *name;
- gchar *(*function) (void);
+ gpointer function;
};
struct _ShellModuleEntry {
diff --git a/socket.c b/socket.c
index daf6f434..cada32b6 100644
--- a/socket.c
+++ b/socket.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -99,7 +99,11 @@ int sock_read(Socket * s, gchar * buffer, gint size)
gint n;
n = read(s->sock, buffer, size);
- buffer[n] = '\0';
+ if (n > 0) {
+ buffer[n] = '\0';
+ } else {
+ return 0;
+ }
return n;
}
diff --git a/socket.h b/socket.h
index ae124d4f..7c44837e 100644
--- a/socket.h
+++ b/socket.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/stock.c b/stock.c
index 748379e8..5c1a3490 100644
--- a/stock.c
+++ b/stock.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/stock.h b/stock.h
index 7f6b2742..f8c61275 100644
--- a/stock.h
+++ b/stock.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/syncmanager.c b/syncmanager.c
index f4949644..12b0465e 100644
--- a/syncmanager.c
+++ b/syncmanager.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,8 +23,6 @@
#ifdef HAS_LIBSOUP
#include <libsoup/soup.h>
-#include <libsoup/soup-xmlrpc-message.h>
-#include <libsoup/soup-xmlrpc-response.h>
#include <stdarg.h>
#include <string.h>
@@ -140,11 +138,10 @@ void sync_manager_show(void)
}
#ifdef HAS_LIBSOUP
-static SoupXmlrpcValue *_soup_get_xmlrpc_value(SoupMessage * msg,
- SyncNetAction * sna)
+static gint _soup_get_xmlrpc_value_int(SoupMessage * msg,
+ SyncNetAction * sna)
{
- SoupXmlrpcResponse *response = NULL;
- SoupXmlrpcValue *value = NULL;
+ gint int_value = -1;
sna->error = NULL;
@@ -154,37 +151,11 @@ static SoupXmlrpcValue *_soup_get_xmlrpc_value(SoupMessage * msg,
goto bad;
}
- response =
- soup_xmlrpc_message_parse_response(SOUP_XMLRPC_MESSAGE(msg));
- if (!response) {
+ 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");
- goto bad;
- }
-
- value = soup_xmlrpc_response_get_value(response);
- if (!value) {
- SNA_ERROR(3, "No response value in XML-RPC response");
- }
-
- /*g_object_unref(response); */
- bad:
- return value;
-}
-
-static long _soup_get_xmlrpc_value_int(SoupMessage * msg,
- SyncNetAction * sna)
-{
- SoupXmlrpcValue *value;
- long int_value = -1;
-
- value = _soup_get_xmlrpc_value(msg, sna);
- if (!value) {
- SNA_ERROR(4, "Could not extract result from XML-RPC response");
- goto bad;
- }
-
- if (!soup_xmlrpc_value_get_int(value, &int_value)) {
- SNA_ERROR(4, "Could not extract result from XML-RPC response");
}
bad:
@@ -194,17 +165,21 @@ static long _soup_get_xmlrpc_value_int(SoupMessage * msg,
static gchar *_soup_get_xmlrpc_value_string(SoupMessage * msg,
SyncNetAction * sna)
{
- SoupXmlrpcValue *value;
gchar *string = NULL;
- value = _soup_get_xmlrpc_value(msg, sna);
- if (!value) {
- SNA_ERROR(4, "Could not extract result from XML-RPC response");
+ 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_value_get_string(value, &string)) {
- SNA_ERROR(4, "Could not extract result from XML-RPC response");
+ 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:
@@ -212,23 +187,20 @@ static gchar *_soup_get_xmlrpc_value_string(SoupMessage * msg,
}
static gboolean _soup_xmlrpc_call(gchar * method, SyncNetAction * sna,
- SoupMessageCallbackFn callback)
+ SoupSessionCallback callback)
{
- SoupXmlrpcMessage *msg;
+ SoupMessage *msg;
sna->error = NULL;
- msg = soup_xmlrpc_message_new(XMLRPC_SERVER_URI);
+ msg = soup_xmlrpc_request_new(XMLRPC_SERVER_URI, method,
+ G_TYPE_INVALID);
if (!msg)
return FALSE;
DEBUG("calling xmlrpc method %s", method);
- soup_xmlrpc_message_start_call(msg, method);
- soup_xmlrpc_message_end_call(msg);
-
- soup_xmlrpc_message_persist(msg);
- soup_session_queue_message(session, SOUP_MESSAGE(msg), callback, sna);
+ soup_session_queue_message(session, msg, callback, sna);
g_main_run(loop);
return TRUE;
@@ -236,49 +208,51 @@ static gboolean _soup_xmlrpc_call(gchar * method, SyncNetAction * sna,
static gboolean _soup_xmlrpc_call_with_parameters(gchar * method,
SyncNetAction * sna,
- SoupMessageCallbackFn
+ SoupSessionCallback
callback, ...)
{
- SoupXmlrpcMessage *msg;
- gchar *argument;
+ SoupMessage *msg;
+ GValueArray *parameters;
+ gchar *argument, *body;
va_list ap;
sna->error = NULL;
- msg = soup_xmlrpc_message_new(XMLRPC_SERVER_URI);
- if (!msg)
- return FALSE;
+ msg = soup_message_new("POST", XMLRPC_SERVER_URI);
DEBUG("calling xmlrpc method %s", method);
- soup_xmlrpc_message_start_call(msg, method);
+ if (!msg)
+ return FALSE;
+ parameters = g_value_array_new(1);
va_start(ap, callback);
while ((argument = va_arg(ap, gchar *))) {
- soup_xmlrpc_message_start_param(msg);
- soup_xmlrpc_message_write_string(msg, argument);
- soup_xmlrpc_message_end_param(msg);
-
+ soup_value_array_append(parameters, G_TYPE_STRING, argument);
DEBUG("with parameter: %s", argument);
}
va_end(ap);
- soup_xmlrpc_message_end_call(msg);
- soup_xmlrpc_message_persist(msg);
+ 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, SOUP_MESSAGE(msg), callback, sna);
+ soup_session_queue_message(session, msg, callback, sna);
g_main_run(loop);
return TRUE;
}
-static void _action_check_api_version_got_response(SoupMessage * msg,
+static void _action_check_api_version_got_response(SoupSession * session,
+ SoupMessage * msg,
gpointer user_data)
{
SyncNetAction *sna = (SyncNetAction *) user_data;
- long version = _soup_get_xmlrpc_value_int(msg, sna);
+ gint version = _soup_get_xmlrpc_value_int(msg, sna);
if (version != XMLRPC_SERVER_API_VERSION) {
- SNA_ERROR(5, "Server says it supports API version %ld, but "
+ 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);
}
@@ -298,7 +272,8 @@ static gboolean _action_check_api_version(SyncDialog * sd,
return sna->error ? FALSE : TRUE;
}
-static void _action_call_function_got_response(SoupMessage * msg,
+static void _action_call_function_got_response(SoupSession * session,
+ SoupMessage * msg,
gpointer user_data)
{
SyncNetAction *sna = (SyncNetAction *) user_data;
@@ -312,19 +287,7 @@ static void _action_call_function_got_response(SoupMessage * msg,
DEBUG("saving to %s", filename);
-#ifdef g_file_set_contents
g_file_set_contents(filename, string, -1, NULL);
-#else
- {
- FILE *f;
-
- f = fopen(filename, "w+");
- if (f) {
- fwrite(string, 1, strlen(string), f);
- fclose(f);
- }
- }
-#endif
g_free(filename);
}
@@ -346,7 +309,7 @@ static gboolean _action_call_function(SyncDialog * sd, gpointer user_data)
if (sna->entry->get_data)
str_data = sna->entry->get_data();
- if (!_soup_xmlrpc_call_with_parameters("sync.callFunction", sna,
+ if (!_soup_xmlrpc_call_with_parameters("sync.callFunctionEx", sna,
_action_call_function_got_response,
VERSION, ARCH,
sna->entry->name,
@@ -385,11 +348,9 @@ 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};
+ 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));
@@ -411,7 +372,7 @@ static SyncNetAction *sync_manager_get_selected_actions(gint * n)
return actions;
}
-static SoupUri *sync_manager_get_proxy(void)
+static SoupURI *sync_manager_get_proxy(void)
{
const gchar *conf;
@@ -430,7 +391,7 @@ static void sync_dialog_start_sync(SyncDialog * sd)
SyncNetAction *actions;
if (!session) {
- SoupUri *proxy = sync_manager_get_proxy();
+ SoupURI *proxy = sync_manager_get_proxy();
session =
soup_session_async_new_with_options(SOUP_SESSION_TIMEOUT, 10,
diff --git a/syncmanager.h b/syncmanager.h
index 93e238d7..360c012a 100644
--- a/syncmanager.h
+++ b/syncmanager.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/uidefs.h b/uidefs.h
index a3a3e32d..333c9ce5 100644
--- a/uidefs.h
+++ b/uidefs.h
@@ -3,7 +3,10 @@
char *uidefs_str = "<ui>" \
" <menubar>" \
-" <menu name=\"InformationMenu\" action=\"InformationMenuAction\">" \
+" <menu name=\"InformationMenu\" action=\"InformationMenuAction\">" \
+/*" <menuitem name=\"Open\" action=\"OpenAction\" />" \
+" <menuitem name=\"ConnectTo\" action=\"ConnectToAction\" />" \
+" <separator/>" \*/
" <menuitem name=\"Report\" action=\"ReportAction\" />" \
/*" <separator/>" \ */
" <menuitem name=\"Copy\" action=\"CopyAction\" />" \
diff --git a/util.c b/util.c
index 79f4aef3..924b9b45 100644
--- a/util.c
+++ b/util.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -45,6 +45,43 @@
#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;
@@ -86,14 +123,16 @@ inline gchar *size_human_readable(gfloat size)
return g_strdup_printf("%.1f GiB", size / GiB);
}
-inline void strend(gchar * str, gchar chr)
+inline char *strend(gchar * str, gchar chr)
{
if (!str)
- return;
+ return NULL;
char *p;
if ((p = strchr(str, chr)))
*p = 0;
+
+ return str;
}
inline void remove_quotes(gchar * str)
@@ -116,9 +155,11 @@ void widget_set_cursor(GtkWidget * widget, GdkCursorType cursor_type)
{
GdkCursor *cursor;
- cursor = gdk_cursor_new(cursor_type);
- gdk_window_set_cursor(GDK_WINDOW(widget->window), cursor);
- gdk_cursor_unref(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();
@@ -387,6 +428,7 @@ void parameters_init(int *argc, char ***argv, ProgramParameters * param)
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;
@@ -419,10 +461,15 @@ void open_url(gchar * url)
"opera", "konqueror", "netscape", "links -g",
NULL
};
- gint i;
-
- for (i = 0; browsers[i]; i++) {
- gchar *cmdline = g_strdup_printf("%s '%s'", browsers[i], url);
+ 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);
@@ -430,7 +477,9 @@ void open_url(gchar * url)
}
g_free(cmdline);
- }
+
+ browser = (gchar *)browsers[i++];
+ } while (browser);
g_warning("Couldn't find a Web browser to open URL %s.", url);
}
@@ -459,9 +508,9 @@ static void module_register_methods(ShellModule * module)
if (g_module_symbol
(module->dll, "hi_exported_methods", (gpointer) & get_methods)) {
- ShellModuleMethod *methods = get_methods();
-
- while (TRUE) {
+ ShellModuleMethod *methods;
+
+ for (methods = get_methods(); methods->name; methods++) {
ShellModuleMethod method = *methods;
gchar *name = g_path_get_basename(g_module_name(module->dll));
@@ -471,9 +520,6 @@ static void module_register_methods(ShellModule * module)
g_hash_table_insert(__module_methods, method_name,
method.function);
g_free(name);
-
- if (!(*(++methods)).name)
- break;
}
}
@@ -492,6 +538,20 @@ gchar *module_call_method(gchar * method)
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;
@@ -618,7 +678,7 @@ static void module_entry_free(gpointer data, gpointer user_data)
}
}
-static void module_free(ShellModule * module)
+void module_free(ShellModule * module)
{
g_free(module->name);
g_object_unref(module->icon);
@@ -705,8 +765,8 @@ static GSList *modules_check_deps(GSList * modules)
modules = g_slist_prepend(modules, mod);
modules = modules_check_deps(modules); /* re-check dependencies */
} else {
- modules = g_slist_remove(modules, module);
- module_free(module);
+ g_error("HardInfo cannot run without loading the additional module.");
+ exit(1);
}
gtk_widget_destroy(dialog);
@@ -896,8 +956,6 @@ void tree_view_save_image(gchar * filename)
static gboolean __idle_free_do(gpointer ptr)
{
- DEBUG("bla %p", ptr);
-
if (ptr) {
g_free(ptr);
}
@@ -1048,3 +1106,55 @@ h_hash_table_remove_all(GHashTable *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.0f;
+
+ 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;
+}
+
diff --git a/vendor.c b/vendor.c
index dae383d2..f75e4e38 100644
--- a/vendor.c
+++ b/vendor.c
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* List of vendors based on GtkSysInfo (c) Pissens Sebastien.
*
@@ -49,6 +49,7 @@ static const Vendor vendors[] = {
{"Atheros", "Atheros Communications", "www.atheros.com"},
{"MATSHITA", "Panasonic", "www.panasonic.com"},
{"Silicon Image", "Silicon Image, Inc.", "www.siliconimage.com"},
+ {"Silicon Integrated Image", "Silicon Image, Inc.", "www.siliconimage.com"},
{"KYE", "KYE Systems Corp.", "www.genius-kye.com"},
{"Broadcom", "Broadcom Corp.", "www.broadcom.com"},
{"Apple", "Apple Computer, Inc.", "www.apple.com"},
@@ -58,6 +59,22 @@ static const Vendor vendors[] = {
{"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", "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 Inc.", "www.teac.com"},
+ {"Microsoft", "Microsoft Corp.", "www.microsoft.com"},
+ {"Memorex", "Memorex Products, Inc.", "www.memorex.com"},
+ {"eMPIA", "eMPIA Technology, Inc.", "www.empiatech.com.tw"},
+ {"Canon", "Canon Inc.", "www.canon.com"},
+ {"A4Tech", "A4tech Co., Ltd.", "www.a4tech.com"},
{NULL, NULL, NULL},
};
diff --git a/vendor.h b/vendor.h
index cdbb3547..b40dafb1 100644
--- a/vendor.h
+++ b/vendor.h
@@ -1,6 +1,6 @@
/*
* HardInfo - Displays System Information
- * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by