From 7aacc9f2510901c9e97b30fa9bcb550bb7f99c03 Mon Sep 17 00:00:00 2001 From: Simon Quigley Date: Mon, 19 Jun 2017 15:19:47 -0500 Subject: New upstream version 0.5.1+git20170605 --- .gitignore | 8 + CMakeLists.txt | 201 ++++ Makefile.in | 90 -- README | 71 ++ TODO | 7 - arch/common/blowfish.h | 63 -- arch/common/cryptohash.h | 78 -- arch/common/display.h | 143 --- arch/common/environment.h | 42 - arch/common/fft.h | 47 - arch/common/fib.h | 48 - arch/common/languages.h | 107 -- arch/common/nqueens.h | 45 - arch/common/printers.h | 261 ----- arch/common/raytrace.h | 45 - arch/common/users.h | 50 - arch/linux/alpha/alsa.h | 1 - arch/linux/alpha/battery.h | 1 - arch/linux/alpha/boots.h | 1 - arch/linux/alpha/devmemory.h | 1 - arch/linux/alpha/filesystem.h | 1 - arch/linux/alpha/inputdevices.h | 1 - arch/linux/alpha/loadavg.h | 1 - arch/linux/alpha/memory.h | 1 - arch/linux/alpha/modules.h | 1 - arch/linux/alpha/net.h | 1 - arch/linux/alpha/nfs.h | 1 - arch/linux/alpha/os.h | 1 - arch/linux/alpha/pci.h | 1 - arch/linux/alpha/processor.h | 81 -- arch/linux/alpha/resources.h | 1 - arch/linux/alpha/samba.h | 1 - arch/linux/alpha/sensors.h | 1 - arch/linux/alpha/storage.h | 1 - arch/linux/alpha/uptime.h | 1 - arch/linux/alpha/usb.h | 1 - arch/linux/armv4l/alsa.h | 1 - arch/linux/armv4l/battery.h | 1 - arch/linux/armv4l/boots.h | 1 - arch/linux/armv4l/devmemory.h | 1 - arch/linux/armv4l/filesystem.h | 1 - arch/linux/armv4l/inputdevices.h | 1 - arch/linux/armv4l/loadavg.h | 1 - arch/linux/armv4l/memory.h | 1 - arch/linux/armv4l/modules.h | 1 - arch/linux/armv4l/net.h | 1 - arch/linux/armv4l/nfs.h | 1 - arch/linux/armv4l/os.h | 1 - arch/linux/armv4l/pci.h | 1 - arch/linux/armv4l/processor.h | 84 -- arch/linux/armv4l/resources.h | 1 - arch/linux/armv4l/samba.h | 1 - arch/linux/armv4l/sensors.h | 1 - arch/linux/armv4l/storage.h | 1 - arch/linux/armv4l/uptime.h | 1 - arch/linux/armv4l/usb.h | 1 - arch/linux/common/alsa.h | 68 -- arch/linux/common/battery.h | 291 ------ arch/linux/common/boots.h | 60 -- arch/linux/common/devmemory.h | 100 -- arch/linux/common/dmi.h | 198 ---- arch/linux/common/filesystem.h | 108 -- arch/linux/common/inputdevices.h | 139 --- arch/linux/common/loadavg.h | 47 - arch/linux/common/memory.h | 56 - arch/linux/common/modules.h | 169 --- arch/linux/common/net.h | 441 -------- arch/linux/common/nfs.h | 29 - arch/linux/common/os.h | 252 ----- arch/linux/common/pci.h | 244 ----- arch/linux/common/resources.h | 103 -- arch/linux/common/samba.h | 82 -- arch/linux/common/sensors.h | 377 ------- arch/linux/common/storage.h | 371 ------- arch/linux/common/uptime.h | 74 -- arch/linux/common/usb.h | 248 ----- arch/linux/ia64/alsa.h | 1 - arch/linux/ia64/battery.h | 1 - arch/linux/ia64/boots.h | 1 - arch/linux/ia64/devmemory.h | 1 - arch/linux/ia64/filesystem.h | 1 - arch/linux/ia64/inputdevices.h | 1 - arch/linux/ia64/loadavg.h | 1 - arch/linux/ia64/memory.h | 1 - arch/linux/ia64/modules.h | 1 - arch/linux/ia64/net.h | 1 - arch/linux/ia64/nfs.h | 1 - arch/linux/ia64/os.h | 1 - arch/linux/ia64/pci.h | 1 - arch/linux/ia64/processor.h | 82 -- arch/linux/ia64/resources.h | 1 - arch/linux/ia64/samba.h | 1 - arch/linux/ia64/sensors.h | 1 - arch/linux/ia64/storage.h | 1 - arch/linux/ia64/uptime.h | 1 - arch/linux/ia64/usb.h | 1 - arch/linux/m68k/alsa.h | 1 - arch/linux/m68k/battery.h | 1 - arch/linux/m68k/boots.h | 1 - arch/linux/m68k/devmemory.h | 1 - arch/linux/m68k/filesystem.h | 1 - arch/linux/m68k/inputdevices.h | 1 - arch/linux/m68k/loadavg.h | 1 - arch/linux/m68k/memory.h | 1 - arch/linux/m68k/modules.h | 1 - arch/linux/m68k/net.h | 1 - arch/linux/m68k/nfs.h | 1 - arch/linux/m68k/os.h | 1 - arch/linux/m68k/pci.h | 1 - arch/linux/m68k/processor.h | 83 -- arch/linux/m68k/resources.h | 1 - arch/linux/m68k/samba.h | 1 - arch/linux/m68k/sensors.h | 1 - arch/linux/m68k/storage.h | 1 - arch/linux/m68k/uptime.h | 1 - arch/linux/m68k/usb.h | 1 - arch/linux/mips/alsa.h | 1 - arch/linux/mips/battery.h | 1 - arch/linux/mips/boots.h | 1 - arch/linux/mips/devmemory.h | 1 - arch/linux/mips/filesystem.h | 1 - arch/linux/mips/inputdevices.h | 1 - arch/linux/mips/loadavg.h | 1 - arch/linux/mips/memory.h | 1 - arch/linux/mips/modules.h | 1 - arch/linux/mips/net.h | 1 - arch/linux/mips/nfs.h | 1 - arch/linux/mips/os.h | 1 - arch/linux/mips/pci.h | 1 - arch/linux/mips/processor.h | 78 -- arch/linux/mips/resources.h | 1 - arch/linux/mips/samba.h | 1 - arch/linux/mips/sensors.h | 1 - arch/linux/mips/storage.h | 1 - arch/linux/mips/uptime.h | 1 - arch/linux/mips/usb.h | 1 - arch/linux/parisc/alsa.h | 1 - arch/linux/parisc/battery.h | 1 - arch/linux/parisc/boots.h | 1 - arch/linux/parisc/devmemory.h | 1 - arch/linux/parisc/filesystem.h | 1 - arch/linux/parisc/inputdevices.h | 1 - arch/linux/parisc/loadavg.h | 1 - arch/linux/parisc/memory.h | 1 - arch/linux/parisc/modules.h | 1 - arch/linux/parisc/net.h | 1 - arch/linux/parisc/nfs.h | 1 - arch/linux/parisc/os.h | 1 - arch/linux/parisc/pci.h | 1 - arch/linux/parisc/processor.h | 95 -- arch/linux/parisc/resources.h | 1 - arch/linux/parisc/samba.h | 1 - arch/linux/parisc/sensors.h | 1 - arch/linux/parisc/storage.h | 1 - arch/linux/parisc/uptime.h | 1 - arch/linux/parisc/usb.h | 1 - arch/linux/ppc/alsa.h | 1 - arch/linux/ppc/battery.h | 1 - arch/linux/ppc/boots.h | 1 - arch/linux/ppc/devmemory.h | 1 - arch/linux/ppc/filesystem.h | 1 - arch/linux/ppc/inputdevices.h | 1 - arch/linux/ppc/loadavg.h | 1 - arch/linux/ppc/memory.h | 1 - arch/linux/ppc/modules.h | 1 - arch/linux/ppc/net.h | 1 - arch/linux/ppc/nfs.h | 1 - arch/linux/ppc/os.h | 1 - arch/linux/ppc/pci.h | 1 - arch/linux/ppc/processor.h | 89 -- arch/linux/ppc/resources.h | 1 - arch/linux/ppc/samba.h | 1 - arch/linux/ppc/sensors.h | 1 - arch/linux/ppc/storage.h | 1 - arch/linux/ppc/uptime.h | 1 - arch/linux/ppc/usb.h | 1 - arch/linux/s390/alsa.h | 1 - arch/linux/s390/battery.h | 1 - arch/linux/s390/boots.h | 1 - arch/linux/s390/devmemory.h | 1 - arch/linux/s390/filesystem.h | 1 - arch/linux/s390/inputdevices.h | 1 - arch/linux/s390/loadavg.h | 1 - arch/linux/s390/memory.h | 1 - arch/linux/s390/modules.h | 1 - arch/linux/s390/net.h | 1 - arch/linux/s390/nfs.h | 1 - arch/linux/s390/os.h | 1 - arch/linux/s390/pci.h | 1 - arch/linux/s390/processor.h | 81 -- arch/linux/s390/resources.h | 1 - arch/linux/s390/samba.h | 1 - arch/linux/s390/sensors.h | 1 - arch/linux/s390/storage.h | 1 - arch/linux/s390/uptime.h | 1 - arch/linux/s390/usb.h | 1 - arch/linux/sh/alsa.h | 1 - arch/linux/sh/battery.h | 1 - arch/linux/sh/boots.h | 1 - arch/linux/sh/devmemory.h | 1 - arch/linux/sh/filesystem.h | 1 - arch/linux/sh/inputdevices.h | 1 - arch/linux/sh/loadavg.h | 1 - arch/linux/sh/memory.h | 1 - arch/linux/sh/modules.h | 1 - arch/linux/sh/net.h | 1 - arch/linux/sh/nfs.h | 1 - arch/linux/sh/os.h | 1 - arch/linux/sh/pci.h | 1 - arch/linux/sh/processor.h | 78 -- arch/linux/sh/resources.h | 1 - arch/linux/sh/samba.h | 1 - arch/linux/sh/sensors.h | 1 - arch/linux/sh/storage.h | 1 - arch/linux/sh/uptime.h | 1 - arch/linux/sh/usb.h | 1 - arch/linux/sparc/alsa.h | 1 - arch/linux/sparc/battery.h | 1 - arch/linux/sparc/boots.h | 1 - arch/linux/sparc/devmemory.h | 1 - arch/linux/sparc/filesystem.h | 1 - arch/linux/sparc/inputdevices.h | 1 - arch/linux/sparc/loadavg.h | 1 - arch/linux/sparc/memory.h | 1 - arch/linux/sparc/modules.h | 1 - arch/linux/sparc/net.h | 1 - arch/linux/sparc/nfs.h | 1 - arch/linux/sparc/os.h | 1 - arch/linux/sparc/pci.h | 1 - arch/linux/sparc/processor.h | 67 -- arch/linux/sparc/resources.h | 1 - arch/linux/sparc/samba.h | 1 - arch/linux/sparc/sensors.h | 1 - arch/linux/sparc/storage.h | 1 - arch/linux/sparc/uptime.h | 1 - arch/linux/sparc/usb.h | 1 - arch/linux/x86/alsa.h | 1 - arch/linux/x86/battery.h | 1 - arch/linux/x86/boots.h | 1 - arch/linux/x86/devmemory.h | 1 - arch/linux/x86/dmi.h | 1 - arch/linux/x86/filesystem.h | 1 - arch/linux/x86/inputdevices.h | 1 - arch/linux/x86/loadavg.h | 1 - arch/linux/x86/memory.h | 1 - arch/linux/x86/modules.h | 1 - arch/linux/x86/net.h | 1 - arch/linux/x86/nfs.h | 1 - arch/linux/x86/os.h | 1 - arch/linux/x86/pci.h | 1 - arch/linux/x86/processor.h | 538 ---------- arch/linux/x86/resources.h | 1 - arch/linux/x86/samba.h | 1 - arch/linux/x86/sensors.h | 1 - arch/linux/x86/storage.h | 1 - arch/linux/x86/uptime.h | 1 - arch/linux/x86/usb.h | 1 - arch/linux/x86_64 | 1 - autopackage/default.apspec | 58 -- benchmark.c | 421 -------- benchmark.conf | 327 +++++- binreloc.c | 672 ------------ binreloc.h | 68 -- blowfish.c | 493 --------- blowfish.h | 33 - callbacks.c | 270 ----- callbacks.h | 39 - cmake/GNUInstallDirs.cmake | 182 ++++ cmake/Translations.cmake | 41 + computer.c | 416 -------- computer.h | 177 ---- config.h.cmake | 36 + configure | 247 ----- devices.c | 460 --------- doc/index.hlp | 35 + expr.c | 250 ----- expr.h | 48 - fbench.c | 745 -------------- fftbench.c | 201 ---- fftbench.h | 10 - hardinfo.c | 143 --- hardinfo.desktop | 9 - hardinfo.desktop.cmake | 14 + hardinfo.h | 134 --- hardinfo/binreloc.c | 668 ++++++++++++ hardinfo/expr.c | 250 +++++ hardinfo/hardinfo.c | 158 +++ hardinfo/socket.c | 127 +++ hardinfo/util.c | 1404 +++++++++++++++++++++++++ hardinfo/vendor.c | 195 ++++ iconcache.c | 102 -- iconcache.h | 30 - includes/alpha/processor-platform.h | 28 + includes/arm/processor-platform.h | 41 + includes/benchmark.h | 33 + includes/binreloc.h | 68 ++ includes/blowfish.h | 33 + includes/callbacks.h | 45 + includes/computer.h | 190 ++++ includes/devices.h | 95 ++ includes/egg-markdown.h | 84 ++ includes/expr.h | 48 + includes/fftbench.h | 19 + includes/guibench.h | 24 + includes/hardinfo.h | 170 +++ includes/help-viewer.h | 43 + includes/ia64/processor-platform.h | 29 + includes/iconcache.h | 30 + includes/loadgraph.h | 75 ++ includes/m68k/processor-platform.h | 29 + includes/markdown-text-view.h | 70 ++ includes/md5.h | 26 + includes/menu.h | 26 + includes/mips/processor-platform.h | 28 + includes/network.h | 13 + includes/nqueens.h | 13 + includes/parisc/processor-platform.h | 33 + includes/ppc/processor-platform.h | 29 + includes/remote.h | 29 + includes/report.h | 93 ++ includes/s390/processor-platform.h | 28 + includes/sh/processor-platform.h | 28 + includes/sha1.h | 30 + includes/shell.h | 225 ++++ includes/socket.h | 36 + includes/sparc/processor-platform.h | 28 + includes/ssh-conn.h | 66 ++ includes/stock.h | 34 + includes/syncmanager.h | 42 + includes/test-utils.h | 24 + includes/uidefs.h | 63 ++ includes/vendor.h | 33 + includes/x86/processor-platform.h | 56 + includes/x86_64 | 1 + includes/xmlrpc-client.h | 43 + includes/xmlrpc-server.h | 25 + loadgraph.c | 347 ------- loadgraph.h | 69 -- md5.c | 317 ------ md5.h | 26 - menu.c | 182 ---- menu.h | 25 - modules/benchmark.c | 663 ++++++++++++ modules/benchmark/blowfish.c | 533 ++++++++++ modules/benchmark/cryptohash.c | 79 ++ modules/benchmark/drawing.c | 29 + modules/benchmark/fbench.c | 745 ++++++++++++++ modules/benchmark/fft.c | 67 ++ modules/benchmark/fftbench.c | 212 ++++ modules/benchmark/fib.c | 50 + modules/benchmark/guibench.c | 353 +++++++ modules/benchmark/md5.c | 317 ++++++ modules/benchmark/nqueens.c | 66 ++ modules/benchmark/raytrace.c | 47 + modules/benchmark/sha1.c | 329 ++++++ modules/computer.c | 716 +++++++++++++ modules/computer/alsa.c | 71 ++ modules/computer/boots.c | 65 ++ modules/computer/display.c | 148 +++ modules/computer/environment.c | 45 + modules/computer/filesystem.c | 103 ++ modules/computer/groups.c | 45 + modules/computer/languages.c | 112 ++ modules/computer/loadavg.c | 68 ++ modules/computer/memory.c | 59 ++ modules/computer/modules.c | 169 +++ modules/computer/os.c | 258 +++++ modules/computer/uptime.c | 76 ++ modules/computer/users.c | 60 ++ modules/devices.c | 613 +++++++++++ modules/devices/alpha/processor.c | 78 ++ modules/devices/arm/arm_data.c | 215 ++++ modules/devices/arm/arm_data.h | 38 + modules/devices/arm/processor.c | 340 ++++++ modules/devices/battery.c | 388 +++++++ modules/devices/devmemory.c | 108 ++ modules/devices/dmi.c | 209 ++++ modules/devices/ia64/processor.c | 78 ++ modules/devices/inputdevices.c | 140 +++ modules/devices/m68k/processor.c | 79 ++ modules/devices/mips/processor.c | 75 ++ modules/devices/parisc/processor.c | 87 ++ modules/devices/pci.c | 247 +++++ modules/devices/ppc/processor.c | 85 ++ modules/devices/printers.c | 266 +++++ modules/devices/resources.c | 119 +++ modules/devices/s390/processor.c | 78 ++ modules/devices/sensors.c | 444 ++++++++ modules/devices/sh/processor.c | 75 ++ modules/devices/sparc/processor.c | 64 ++ modules/devices/spd-decode.c | 1509 +++++++++++++++++++++++++++ modules/devices/storage.c | 371 +++++++ modules/devices/usb.c | 381 +++++++ modules/devices/x86/processor.c | 727 +++++++++++++ modules/devices/x86_64 | 1 + modules/network.c | 438 ++++++++ modules/network/net.c | 452 ++++++++ modules/network/nfs.c | 59 ++ modules/network/samba.c | 124 +++ modules/placeholder | 0 network.c | 403 -------- nqueens.c | 37 - nqueens.h | 13 - pixmaps/about-modules.png | Bin 609 -> 534 bytes pixmaps/audio.png | Bin 1159 -> 1084 bytes pixmaps/battery.png | Bin 1059 -> 1048 bytes pixmaps/benchmark.png | Bin 875 -> 649 bytes pixmaps/blowfish.png | Bin 1518 -> 1368 bytes pixmaps/bluetooth.png | Bin 994 -> 894 bytes pixmaps/boot.png | Bin 1339 -> 1161 bytes pixmaps/cdrom.png | Bin 1028 -> 904 bytes pixmaps/close.png | Bin 347 -> 272 bytes pixmaps/compress.png | Bin 689 -> 657 bytes pixmaps/computer.png | Bin 953 -> 952 bytes pixmaps/cryptohash.png | Bin 1128 -> 985 bytes pixmaps/dev_removable.png | Bin 612 -> 562 bytes pixmaps/devel.png | Bin 0 -> 982 bytes pixmaps/devices.png | Bin 848 -> 771 bytes pixmaps/dialog-information.png | Bin 1204 -> 1102 bytes pixmaps/dialog-warning.png | Bin 954 -> 937 bytes pixmaps/dns.png | Bin 1397 -> 1389 bytes pixmaps/environment.png | Bin 1026 -> 1024 bytes pixmaps/face-grin.png | Bin 905 -> 816 bytes pixmaps/fft.png | Bin 1001 -> 961 bytes pixmaps/hdd.png | Bin 624 -> 524 bytes pixmaps/home.png | Bin 0 -> 815 bytes pixmaps/inputdevices.png | Bin 1242 -> 1132 bytes pixmaps/internet.png | Bin 864 -> 848 bytes pixmaps/joystick.png | Bin 927 -> 896 bytes pixmaps/keyboard.png | Bin 741 -> 663 bytes pixmaps/logo.png | Bin 2169 -> 1904 bytes pixmaps/memory.png | Bin 991 -> 796 bytes pixmaps/modem.png | Bin 1669 -> 1668 bytes pixmaps/module.png | Bin 1044 -> 932 bytes pixmaps/monitor.png | Bin 788 -> 784 bytes pixmaps/mouse.png | Bin 1128 -> 1048 bytes pixmaps/nautilus.png | Bin 1270 -> 1264 bytes pixmaps/network-connections.png | Bin 852 -> 800 bytes pixmaps/network-interface.png | Bin 1130 -> 1019 bytes pixmaps/network-statistics.png | Bin 1163 -> 1161 bytes pixmaps/network.png | Bin 785 -> 658 bytes pixmaps/nqueens.png | Bin 1027 -> 925 bytes pixmaps/os.png | Bin 1488 -> 1381 bytes pixmaps/printer.png | Bin 957 -> 908 bytes pixmaps/processor.png | Bin 1409 -> 1099 bytes pixmaps/raytrace.png | Bin 998 -> 955 bytes pixmaps/report-large.png | Bin 2496 -> 2435 bytes pixmaps/report.png | Bin 1153 -> 1119 bytes pixmaps/resources.png | Bin 979 -> 935 bytes pixmaps/server-large.png | Bin 0 -> 1359 bytes pixmaps/server.png | Bin 0 -> 821 bytes pixmaps/shares.png | Bin 849 -> 806 bytes pixmaps/status-curr.png | Bin 828 -> 0 bytes pixmaps/status-done.png | Bin 870 -> 0 bytes pixmaps/summary.png | Bin 1420 -> 1374 bytes pixmaps/syncmanager-small.png | Bin 964 -> 920 bytes pixmaps/syncmanager.png | Bin 3840 -> 3633 bytes pixmaps/therm.png | Bin 612 -> 490 bytes pixmaps/usb.png | Bin 748 -> 683 bytes pixmaps/users.png | Bin 1277 -> 1255 bytes pixmaps/wireless.png | Bin 960 -> 912 bytes po/CMakeLists.txt | 3 + po/HOWTO.txt | 2 + po/de.po | 1707 +++++++++++++++++++++++++++++++ po/es.po | 1676 ++++++++++++++++++++++++++++++ po/fr.po | 1644 +++++++++++++++++++++++++++++ po/hardinfo.pot | 1498 +++++++++++++++++++++++++++ po/ru.po | 1812 ++++++++++++++++++++++++++++++++ report.c | 875 ---------------- report.h | 93 -- sha1.c | 329 ------ sha1.h | 30 - shell.c | 1493 --------------------------- shell.h | 185 ---- shell/callbacks.c | 265 +++++ shell/iconcache.c | 100 ++ shell/loadgraph.c | 349 +++++++ shell/menu.c | 171 ++++ shell/report.c | 900 ++++++++++++++++ shell/shell.c | 1876 ++++++++++++++++++++++++++++++++++ shell/stock.c | 91 ++ shell/syncmanager.c | 768 ++++++++++++++ socket.c | 125 --- socket.h | 36 - stock.c | 90 -- stock.h | 33 - syncmanager.c | 748 -------------- syncmanager.h | 41 - uidefs.h | 54 - util.c | 1160 --------------------- vendor.c | 193 ---- vendor.h | 33 - 492 files changed, 32141 insertions(+), 18030 deletions(-) create mode 100644 .gitignore create mode 100644 CMakeLists.txt delete mode 100644 Makefile.in create mode 100644 README delete mode 100644 arch/common/blowfish.h delete mode 100644 arch/common/cryptohash.h delete mode 100644 arch/common/display.h delete mode 100644 arch/common/environment.h delete mode 100644 arch/common/fft.h delete mode 100644 arch/common/fib.h delete mode 100644 arch/common/languages.h delete mode 100644 arch/common/nqueens.h delete mode 100644 arch/common/printers.h delete mode 100644 arch/common/raytrace.h delete mode 100644 arch/common/users.h delete mode 120000 arch/linux/alpha/alsa.h delete mode 120000 arch/linux/alpha/battery.h delete mode 120000 arch/linux/alpha/boots.h delete mode 120000 arch/linux/alpha/devmemory.h delete mode 120000 arch/linux/alpha/filesystem.h delete mode 120000 arch/linux/alpha/inputdevices.h delete mode 120000 arch/linux/alpha/loadavg.h delete mode 120000 arch/linux/alpha/memory.h delete mode 120000 arch/linux/alpha/modules.h delete mode 120000 arch/linux/alpha/net.h delete mode 120000 arch/linux/alpha/nfs.h delete mode 120000 arch/linux/alpha/os.h delete mode 120000 arch/linux/alpha/pci.h delete mode 100644 arch/linux/alpha/processor.h delete mode 120000 arch/linux/alpha/resources.h delete mode 120000 arch/linux/alpha/samba.h delete mode 120000 arch/linux/alpha/sensors.h delete mode 120000 arch/linux/alpha/storage.h delete mode 120000 arch/linux/alpha/uptime.h delete mode 120000 arch/linux/alpha/usb.h delete mode 120000 arch/linux/armv4l/alsa.h delete mode 120000 arch/linux/armv4l/battery.h delete mode 120000 arch/linux/armv4l/boots.h delete mode 120000 arch/linux/armv4l/devmemory.h delete mode 120000 arch/linux/armv4l/filesystem.h delete mode 120000 arch/linux/armv4l/inputdevices.h delete mode 120000 arch/linux/armv4l/loadavg.h delete mode 120000 arch/linux/armv4l/memory.h delete mode 120000 arch/linux/armv4l/modules.h delete mode 120000 arch/linux/armv4l/net.h delete mode 120000 arch/linux/armv4l/nfs.h delete mode 120000 arch/linux/armv4l/os.h delete mode 120000 arch/linux/armv4l/pci.h delete mode 100644 arch/linux/armv4l/processor.h delete mode 120000 arch/linux/armv4l/resources.h delete mode 120000 arch/linux/armv4l/samba.h delete mode 120000 arch/linux/armv4l/sensors.h delete mode 120000 arch/linux/armv4l/storage.h delete mode 120000 arch/linux/armv4l/uptime.h delete mode 120000 arch/linux/armv4l/usb.h delete mode 100644 arch/linux/common/alsa.h delete mode 100644 arch/linux/common/battery.h delete mode 100644 arch/linux/common/boots.h delete mode 100644 arch/linux/common/devmemory.h delete mode 100644 arch/linux/common/dmi.h delete mode 100644 arch/linux/common/filesystem.h delete mode 100644 arch/linux/common/inputdevices.h delete mode 100644 arch/linux/common/loadavg.h delete mode 100644 arch/linux/common/memory.h delete mode 100644 arch/linux/common/modules.h delete mode 100644 arch/linux/common/net.h delete mode 100644 arch/linux/common/nfs.h delete mode 100644 arch/linux/common/os.h delete mode 100644 arch/linux/common/pci.h delete mode 100644 arch/linux/common/resources.h delete mode 100644 arch/linux/common/samba.h delete mode 100644 arch/linux/common/sensors.h delete mode 100644 arch/linux/common/storage.h delete mode 100644 arch/linux/common/uptime.h delete mode 100644 arch/linux/common/usb.h delete mode 120000 arch/linux/ia64/alsa.h delete mode 120000 arch/linux/ia64/battery.h delete mode 120000 arch/linux/ia64/boots.h delete mode 120000 arch/linux/ia64/devmemory.h delete mode 120000 arch/linux/ia64/filesystem.h delete mode 120000 arch/linux/ia64/inputdevices.h delete mode 120000 arch/linux/ia64/loadavg.h delete mode 120000 arch/linux/ia64/memory.h delete mode 120000 arch/linux/ia64/modules.h delete mode 120000 arch/linux/ia64/net.h delete mode 120000 arch/linux/ia64/nfs.h delete mode 120000 arch/linux/ia64/os.h delete mode 120000 arch/linux/ia64/pci.h delete mode 100644 arch/linux/ia64/processor.h delete mode 120000 arch/linux/ia64/resources.h delete mode 120000 arch/linux/ia64/samba.h delete mode 120000 arch/linux/ia64/sensors.h delete mode 120000 arch/linux/ia64/storage.h delete mode 120000 arch/linux/ia64/uptime.h delete mode 120000 arch/linux/ia64/usb.h delete mode 120000 arch/linux/m68k/alsa.h delete mode 120000 arch/linux/m68k/battery.h delete mode 120000 arch/linux/m68k/boots.h delete mode 120000 arch/linux/m68k/devmemory.h delete mode 120000 arch/linux/m68k/filesystem.h delete mode 120000 arch/linux/m68k/inputdevices.h delete mode 120000 arch/linux/m68k/loadavg.h delete mode 120000 arch/linux/m68k/memory.h delete mode 120000 arch/linux/m68k/modules.h delete mode 120000 arch/linux/m68k/net.h delete mode 120000 arch/linux/m68k/nfs.h delete mode 120000 arch/linux/m68k/os.h delete mode 120000 arch/linux/m68k/pci.h delete mode 100644 arch/linux/m68k/processor.h delete mode 120000 arch/linux/m68k/resources.h delete mode 120000 arch/linux/m68k/samba.h delete mode 120000 arch/linux/m68k/sensors.h delete mode 120000 arch/linux/m68k/storage.h delete mode 120000 arch/linux/m68k/uptime.h delete mode 120000 arch/linux/m68k/usb.h delete mode 120000 arch/linux/mips/alsa.h delete mode 120000 arch/linux/mips/battery.h delete mode 120000 arch/linux/mips/boots.h delete mode 120000 arch/linux/mips/devmemory.h delete mode 120000 arch/linux/mips/filesystem.h delete mode 120000 arch/linux/mips/inputdevices.h delete mode 120000 arch/linux/mips/loadavg.h delete mode 120000 arch/linux/mips/memory.h delete mode 120000 arch/linux/mips/modules.h delete mode 120000 arch/linux/mips/net.h delete mode 120000 arch/linux/mips/nfs.h delete mode 120000 arch/linux/mips/os.h delete mode 120000 arch/linux/mips/pci.h delete mode 100644 arch/linux/mips/processor.h delete mode 120000 arch/linux/mips/resources.h delete mode 120000 arch/linux/mips/samba.h delete mode 120000 arch/linux/mips/sensors.h delete mode 120000 arch/linux/mips/storage.h delete mode 120000 arch/linux/mips/uptime.h delete mode 120000 arch/linux/mips/usb.h delete mode 120000 arch/linux/parisc/alsa.h delete mode 120000 arch/linux/parisc/battery.h delete mode 120000 arch/linux/parisc/boots.h delete mode 120000 arch/linux/parisc/devmemory.h delete mode 120000 arch/linux/parisc/filesystem.h delete mode 120000 arch/linux/parisc/inputdevices.h delete mode 120000 arch/linux/parisc/loadavg.h delete mode 120000 arch/linux/parisc/memory.h delete mode 120000 arch/linux/parisc/modules.h delete mode 120000 arch/linux/parisc/net.h delete mode 120000 arch/linux/parisc/nfs.h delete mode 120000 arch/linux/parisc/os.h delete mode 120000 arch/linux/parisc/pci.h delete mode 100644 arch/linux/parisc/processor.h delete mode 120000 arch/linux/parisc/resources.h delete mode 120000 arch/linux/parisc/samba.h delete mode 120000 arch/linux/parisc/sensors.h delete mode 120000 arch/linux/parisc/storage.h delete mode 120000 arch/linux/parisc/uptime.h delete mode 120000 arch/linux/parisc/usb.h delete mode 120000 arch/linux/ppc/alsa.h delete mode 120000 arch/linux/ppc/battery.h delete mode 120000 arch/linux/ppc/boots.h delete mode 120000 arch/linux/ppc/devmemory.h delete mode 120000 arch/linux/ppc/filesystem.h delete mode 120000 arch/linux/ppc/inputdevices.h delete mode 120000 arch/linux/ppc/loadavg.h delete mode 120000 arch/linux/ppc/memory.h delete mode 120000 arch/linux/ppc/modules.h delete mode 120000 arch/linux/ppc/net.h delete mode 120000 arch/linux/ppc/nfs.h delete mode 120000 arch/linux/ppc/os.h delete mode 120000 arch/linux/ppc/pci.h delete mode 100644 arch/linux/ppc/processor.h delete mode 120000 arch/linux/ppc/resources.h delete mode 120000 arch/linux/ppc/samba.h delete mode 120000 arch/linux/ppc/sensors.h delete mode 120000 arch/linux/ppc/storage.h delete mode 120000 arch/linux/ppc/uptime.h delete mode 120000 arch/linux/ppc/usb.h delete mode 120000 arch/linux/s390/alsa.h delete mode 120000 arch/linux/s390/battery.h delete mode 120000 arch/linux/s390/boots.h delete mode 120000 arch/linux/s390/devmemory.h delete mode 120000 arch/linux/s390/filesystem.h delete mode 120000 arch/linux/s390/inputdevices.h delete mode 120000 arch/linux/s390/loadavg.h delete mode 120000 arch/linux/s390/memory.h delete mode 120000 arch/linux/s390/modules.h delete mode 120000 arch/linux/s390/net.h delete mode 120000 arch/linux/s390/nfs.h delete mode 120000 arch/linux/s390/os.h delete mode 120000 arch/linux/s390/pci.h delete mode 100644 arch/linux/s390/processor.h delete mode 120000 arch/linux/s390/resources.h delete mode 120000 arch/linux/s390/samba.h delete mode 120000 arch/linux/s390/sensors.h delete mode 120000 arch/linux/s390/storage.h delete mode 120000 arch/linux/s390/uptime.h delete mode 120000 arch/linux/s390/usb.h delete mode 120000 arch/linux/sh/alsa.h delete mode 120000 arch/linux/sh/battery.h delete mode 120000 arch/linux/sh/boots.h delete mode 120000 arch/linux/sh/devmemory.h delete mode 120000 arch/linux/sh/filesystem.h delete mode 120000 arch/linux/sh/inputdevices.h delete mode 120000 arch/linux/sh/loadavg.h delete mode 120000 arch/linux/sh/memory.h delete mode 120000 arch/linux/sh/modules.h delete mode 120000 arch/linux/sh/net.h delete mode 120000 arch/linux/sh/nfs.h delete mode 120000 arch/linux/sh/os.h delete mode 120000 arch/linux/sh/pci.h delete mode 100644 arch/linux/sh/processor.h delete mode 120000 arch/linux/sh/resources.h delete mode 120000 arch/linux/sh/samba.h delete mode 120000 arch/linux/sh/sensors.h delete mode 120000 arch/linux/sh/storage.h delete mode 120000 arch/linux/sh/uptime.h delete mode 120000 arch/linux/sh/usb.h delete mode 120000 arch/linux/sparc/alsa.h delete mode 120000 arch/linux/sparc/battery.h delete mode 120000 arch/linux/sparc/boots.h delete mode 120000 arch/linux/sparc/devmemory.h delete mode 120000 arch/linux/sparc/filesystem.h delete mode 120000 arch/linux/sparc/inputdevices.h delete mode 120000 arch/linux/sparc/loadavg.h delete mode 120000 arch/linux/sparc/memory.h delete mode 120000 arch/linux/sparc/modules.h delete mode 120000 arch/linux/sparc/net.h delete mode 120000 arch/linux/sparc/nfs.h delete mode 120000 arch/linux/sparc/os.h delete mode 120000 arch/linux/sparc/pci.h delete mode 100644 arch/linux/sparc/processor.h delete mode 120000 arch/linux/sparc/resources.h delete mode 120000 arch/linux/sparc/samba.h delete mode 120000 arch/linux/sparc/sensors.h delete mode 120000 arch/linux/sparc/storage.h delete mode 120000 arch/linux/sparc/uptime.h delete mode 120000 arch/linux/sparc/usb.h delete mode 120000 arch/linux/x86/alsa.h delete mode 120000 arch/linux/x86/battery.h delete mode 120000 arch/linux/x86/boots.h delete mode 120000 arch/linux/x86/devmemory.h delete mode 120000 arch/linux/x86/dmi.h delete mode 120000 arch/linux/x86/filesystem.h delete mode 120000 arch/linux/x86/inputdevices.h delete mode 120000 arch/linux/x86/loadavg.h delete mode 120000 arch/linux/x86/memory.h delete mode 120000 arch/linux/x86/modules.h delete mode 120000 arch/linux/x86/net.h delete mode 120000 arch/linux/x86/nfs.h delete mode 120000 arch/linux/x86/os.h delete mode 120000 arch/linux/x86/pci.h delete mode 100644 arch/linux/x86/processor.h delete mode 120000 arch/linux/x86/resources.h delete mode 120000 arch/linux/x86/samba.h delete mode 120000 arch/linux/x86/sensors.h delete mode 120000 arch/linux/x86/storage.h delete mode 120000 arch/linux/x86/uptime.h delete mode 120000 arch/linux/x86/usb.h delete mode 120000 arch/linux/x86_64 delete mode 100644 autopackage/default.apspec delete mode 100644 benchmark.c delete mode 100644 binreloc.c delete mode 100644 binreloc.h delete mode 100644 blowfish.c delete mode 100644 blowfish.h delete mode 100644 callbacks.c delete mode 100644 callbacks.h create mode 100644 cmake/GNUInstallDirs.cmake create mode 100644 cmake/Translations.cmake delete mode 100644 computer.c delete mode 100644 computer.h create mode 100644 config.h.cmake delete mode 100755 configure delete mode 100644 devices.c create mode 100644 doc/index.hlp delete mode 100644 expr.c delete mode 100644 expr.h delete mode 100644 fbench.c delete mode 100644 fftbench.c delete mode 100644 fftbench.h delete mode 100644 hardinfo.c delete mode 100644 hardinfo.desktop create mode 100644 hardinfo.desktop.cmake delete mode 100644 hardinfo.h create mode 100644 hardinfo/binreloc.c create mode 100644 hardinfo/expr.c create mode 100644 hardinfo/hardinfo.c create mode 100644 hardinfo/socket.c create mode 100644 hardinfo/util.c create mode 100644 hardinfo/vendor.c delete mode 100644 iconcache.c delete mode 100644 iconcache.h create mode 100644 includes/alpha/processor-platform.h create mode 100644 includes/arm/processor-platform.h create mode 100644 includes/benchmark.h create mode 100644 includes/binreloc.h create mode 100644 includes/blowfish.h create mode 100644 includes/callbacks.h create mode 100644 includes/computer.h create mode 100644 includes/devices.h create mode 100644 includes/egg-markdown.h create mode 100644 includes/expr.h create mode 100644 includes/fftbench.h create mode 100644 includes/guibench.h create mode 100644 includes/hardinfo.h create mode 100644 includes/help-viewer.h create mode 100644 includes/ia64/processor-platform.h create mode 100644 includes/iconcache.h create mode 100644 includes/loadgraph.h create mode 100644 includes/m68k/processor-platform.h create mode 100644 includes/markdown-text-view.h create mode 100644 includes/md5.h create mode 100644 includes/menu.h create mode 100644 includes/mips/processor-platform.h create mode 100644 includes/network.h create mode 100644 includes/nqueens.h create mode 100644 includes/parisc/processor-platform.h create mode 100644 includes/ppc/processor-platform.h create mode 100644 includes/remote.h create mode 100644 includes/report.h create mode 100644 includes/s390/processor-platform.h create mode 100644 includes/sh/processor-platform.h create mode 100644 includes/sha1.h create mode 100644 includes/shell.h create mode 100644 includes/socket.h create mode 100644 includes/sparc/processor-platform.h create mode 100644 includes/ssh-conn.h create mode 100644 includes/stock.h create mode 100644 includes/syncmanager.h create mode 100644 includes/test-utils.h create mode 100644 includes/uidefs.h create mode 100644 includes/vendor.h create mode 100644 includes/x86/processor-platform.h create mode 120000 includes/x86_64 create mode 100644 includes/xmlrpc-client.h create mode 100644 includes/xmlrpc-server.h delete mode 100644 loadgraph.c delete mode 100644 loadgraph.h delete mode 100644 md5.c delete mode 100644 md5.h delete mode 100644 menu.c delete mode 100644 menu.h create mode 100644 modules/benchmark.c create mode 100644 modules/benchmark/blowfish.c create mode 100644 modules/benchmark/cryptohash.c create mode 100644 modules/benchmark/drawing.c create mode 100644 modules/benchmark/fbench.c create mode 100644 modules/benchmark/fft.c create mode 100644 modules/benchmark/fftbench.c create mode 100644 modules/benchmark/fib.c create mode 100644 modules/benchmark/guibench.c create mode 100644 modules/benchmark/md5.c create mode 100644 modules/benchmark/nqueens.c create mode 100644 modules/benchmark/raytrace.c create mode 100644 modules/benchmark/sha1.c create mode 100644 modules/computer.c create mode 100644 modules/computer/alsa.c create mode 100644 modules/computer/boots.c create mode 100644 modules/computer/display.c create mode 100644 modules/computer/environment.c create mode 100644 modules/computer/filesystem.c create mode 100644 modules/computer/groups.c create mode 100644 modules/computer/languages.c create mode 100644 modules/computer/loadavg.c create mode 100644 modules/computer/memory.c create mode 100644 modules/computer/modules.c create mode 100644 modules/computer/os.c create mode 100644 modules/computer/uptime.c create mode 100644 modules/computer/users.c create mode 100644 modules/devices.c create mode 100644 modules/devices/alpha/processor.c create mode 100644 modules/devices/arm/arm_data.c create mode 100644 modules/devices/arm/arm_data.h create mode 100644 modules/devices/arm/processor.c create mode 100644 modules/devices/battery.c create mode 100644 modules/devices/devmemory.c create mode 100644 modules/devices/dmi.c create mode 100644 modules/devices/ia64/processor.c create mode 100644 modules/devices/inputdevices.c create mode 100644 modules/devices/m68k/processor.c create mode 100644 modules/devices/mips/processor.c create mode 100644 modules/devices/parisc/processor.c create mode 100644 modules/devices/pci.c create mode 100644 modules/devices/ppc/processor.c create mode 100644 modules/devices/printers.c create mode 100644 modules/devices/resources.c create mode 100644 modules/devices/s390/processor.c create mode 100644 modules/devices/sensors.c create mode 100644 modules/devices/sh/processor.c create mode 100644 modules/devices/sparc/processor.c create mode 100644 modules/devices/spd-decode.c create mode 100644 modules/devices/storage.c create mode 100644 modules/devices/usb.c create mode 100644 modules/devices/x86/processor.c create mode 120000 modules/devices/x86_64 create mode 100644 modules/network.c create mode 100644 modules/network/net.c create mode 100644 modules/network/nfs.c create mode 100644 modules/network/samba.c delete mode 100644 modules/placeholder delete mode 100644 network.c delete mode 100644 nqueens.c delete mode 100644 nqueens.h create mode 100644 pixmaps/devel.png create mode 100644 pixmaps/home.png create mode 100644 pixmaps/server-large.png create mode 100644 pixmaps/server.png delete mode 100644 pixmaps/status-curr.png delete mode 100644 pixmaps/status-done.png create mode 100644 po/CMakeLists.txt create mode 100644 po/HOWTO.txt create mode 100644 po/de.po create mode 100644 po/es.po create mode 100644 po/fr.po create mode 100644 po/hardinfo.pot create mode 100644 po/ru.po delete mode 100644 report.c delete mode 100644 report.h delete mode 100644 sha1.c delete mode 100644 sha1.h delete mode 100644 shell.c delete mode 100644 shell.h create mode 100644 shell/callbacks.c create mode 100644 shell/iconcache.c create mode 100644 shell/loadgraph.c create mode 100644 shell/menu.c create mode 100644 shell/report.c create mode 100644 shell/shell.c create mode 100644 shell/stock.c create mode 100644 shell/syncmanager.c delete mode 100644 socket.c delete mode 100644 socket.h delete mode 100644 stock.c delete mode 100644 stock.h delete mode 100644 syncmanager.c delete mode 100644 syncmanager.h delete mode 100644 uidefs.h delete mode 100644 util.c delete mode 100644 vendor.c delete mode 100644 vendor.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..1b6c8d15 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +Makefile +config.h +*.so +*.o +*~ +arch/this +build/ + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..f93c835e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,201 @@ +project(HardInfo) +cmake_minimum_required(VERSION 2.6) +cmake_policy(VERSION 2.6) + +set(HARDINFO_VERSION "0.6-alpha") +option(HARDINFO_NOSYNC "Disable database sync via libsoup" 1) +SET( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ) +include(GNUInstallDirs) + +if(${CMAKE_BUILD_TYPE} MATCHES [Dd]ebug) + set(HARDINFO_DEBUG 1) +endif() + +if(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Linux") + set(HARDINFO_OS "linux") +else() + message(FATAL_ERROR "Unsupported operating system: ${CMAKE_HOST_SYSTEM_NAME}") +endif() + +if(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "i[3-6]86") + set(HARDINFO_ARCH "x86") +elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "x86_64") + set(HARDINFO_ARCH "x86_64") +elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "ppc{32,64}") + set(HARDINFO_ARCH "ppc") +elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "mips") + set(HARDINFO_ARCH "mips") +elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "parisc.*") + set(HARDINFO_ARCH "parisc") +elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "sparc{32,64}") + set(HARDINFO_ARCH "sparc") +elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "arm.*") + set(HARDINFO_ARCH "arm") +elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "ia64") + set(HARDINFO_ARCH "ia64") +elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "alpha") + set(HARDINFO_ARCH "alpha") +elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "s390.*") + set(HARDINFO_ARCH "s390") +elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "m68k") + set(HARDINFO_ARCH "m68k") +elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "sh{3,4}") + set(HARDINFO_ARCH "sh") +else() + message(FATAL_ERROR "Unsupported architecture: ${CMAKE_HOST_SYSTEM_PROCESSOR}") +endif() + +message(STATUS "Building HardInfo for architecture: ${HARDINFO_OS}-${HARDINFO_ARCH}") + +add_definitions("-std=gnu89") + +add_subdirectory(po) + +include(FindPkgConfig) +pkg_check_modules(GTK REQUIRED gtk+-2.0>=2.10 glib-2.0>=2.10 gthread-2.0>=2.10 gmodule-export-2.0>=2.10) +if(NOT HARDINFO_NOSYNC) + pkg_check_modules(LIBSOUP libsoup-2.4>=2.24) +endif() + +include_directories( + ${CMAKE_SOURCE_DIR} + ${CMAKE_SOURCE_DIR}/includes + ${CMAKE_SOURCE_DIR}/includes/${HARDINFO_ARCH} + ${CMAKE_BINARY_DIR} + ${GTK_INCLUDE_DIRS} + ${LIBSOUP_INCLUDE_DIRS} +) +link_directories( + ${GTK_LIBRARY_DIRS} + ${LIBSOUP_LIBRARY_DIRS} +) + +set(HARDINFO_MODULES + computer + devices + benchmark + network +) +set(HARDINFO_RESOURCES + "benchmark.conf" + "benchmark.data" +) + +set(MODULE_computer_SOURCES + modules/computer.c + modules/computer/alsa.c + modules/computer/boots.c + modules/computer/display.c + modules/computer/environment.c + modules/computer/filesystem.c + modules/computer/languages.c + modules/computer/loadavg.c + modules/computer/memory.c + modules/computer/modules.c + modules/computer/os.c + modules/computer/uptime.c + modules/computer/users.c + modules/computer/groups.c +) +set(MODULE_devices_SOURCES + modules/devices.c + modules/devices/${HARDINFO_ARCH}/processor.c + modules/devices/battery.c + modules/devices/devmemory.c + modules/devices/dmi.c + modules/devices/inputdevices.c + modules/devices/pci.c + modules/devices/printers.c + modules/devices/resources.c + modules/devices/sensors.c + modules/devices/spd-decode.c + modules/devices/storage.c + modules/devices/usb.c +) +set(MODULE_network_SOURCES + modules/network.c + modules/network/net.c + modules/network/nfs.c + modules/network/samba.c +) +set(MODULE_benchmark_SOURCES + modules/benchmark.c + modules/benchmark/blowfish.c + modules/benchmark/cryptohash.c + modules/benchmark/drawing.c + modules/benchmark/fbench.c + modules/benchmark/fftbench.c + modules/benchmark/fft.c + modules/benchmark/fib.c + modules/benchmark/guibench.c + modules/benchmark/md5.c + modules/benchmark/nqueens.c + modules/benchmark/raytrace.c + modules/benchmark/sha1.c +) + +set_source_files_properties( + modules/benchmark/blowfish.c + modules/benchmark/fftbench.c + modules/benchmark/md5.c + modules/benchmark/sha1.c + PROPERTIES + COMPILE_FLAGS "-O0" +) + +foreach (_module ${HARDINFO_MODULES}) + add_library(${_module} MODULE ${MODULE_${_module}_SOURCES}) + set_target_properties(${_module} PROPERTIES PREFIX "") +endforeach() + +add_library(hardinfo-shell STATIC + shell/callbacks.c + shell/iconcache.c + shell/loadgraph.c + shell/menu.c + shell/report.c + shell/shell.c + shell/stock.c + shell/syncmanager.c +) +add_executable(hardinfo + hardinfo/binreloc.c + hardinfo/expr.c + hardinfo/hardinfo.c + hardinfo/socket.c + hardinfo/util.c + hardinfo/vendor.c +) +target_link_libraries(hardinfo + ${GTK_LIBRARIES} + ${LIBSOUP_LIBRARIES} + hardinfo-shell + m +) + +configure_file(config.h.cmake ${CMAKE_BINARY_DIR}/config.h @ONLY) +configure_file(hardinfo.desktop.cmake ${CMAKE_BINARY_DIR}/hardinfo.desktop @ONLY) + +install(TARGETS hardinfo ${HARDINFO_MODULES} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/hardinfo/modules + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE +) +install(FILES ${CMAKE_BINARY_DIR}/hardinfo.desktop + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ +) +install(FILES ${HARDINFO_RESOURCES} + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hardinfo + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ +) +install(DIRECTORY pixmaps + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hardinfo + PATTERN "*.{png,svg}" + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ +) +install(DIRECTORY doc + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hardinfo + PATTERN "*.{hlp,png}" + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ +) diff --git a/Makefile.in b/Makefile.in deleted file mode 100644 index 03a9df8b..00000000 --- a/Makefile.in +++ /dev/null @@ -1,90 +0,0 @@ - -CCFLAGS = -fPIC -pipe -Wall -g -CFLAGS = $(GTK_CFLAGS) $(SOUP_CFLAGS) -I. -CC = gcc $(ARCHOPTS) -g -CCSLOW = gcc -O0 -g - -# ---------------------------------------------------------------------------- - -OBJECTS = hardinfo.o shell.o util.o iconcache.o loadgraph.o \ - menu.o stock.o callbacks.o expr.o report.o binreloc.o \ - vendor.o socket.o syncmanager.o -BENCHMARK_OBJECTS = fbench.o sha1.o blowfish.o md5.o nqueens.o fftbench.o - -MODULES = computer.so devices.so benchmark.so network.so - -all: $(OBJECTS) $(MODULES) - $(CC) $(CCFLAGS) -o hardinfo -Wl,-export-dynamic $(OBJECTS) $(GTK_LIBS) \ - $(SOUP_LIBS) - -md5.o: - $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c md5.c -o $@ - -blowfish.o: - $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c blowfish.c -o $@ - -sha1.o: - $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c sha1.c -o $@ - -fbench.o: - $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c fbench.c -o $@ - -fftbench.o: - $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c fftbench.c -o $@ - -nqueens.o: - $(CCSLOW) $(CCFLAGS) $(CFLAGS) -c nqueens.c -o $@ - -benchmark.so: benchmark.c - make $(BENCHMARK_OBJECTS) - $(CCSLOW) $(CCFLAGS) $(CFLAGS) -o $@ -shared $< $(BENCHMARK_OBJECTS) \ - $(GTK_FLAGS) $(GTK_LIBS) - ln -sf ../$@ modules - -%.so: %.c - $(CC) $(CCFLAGS) $(CFLAGS) -o $@ -shared $< $(GTK_FLAGS) $(GTK_LIBS) - ln -sf ../$@ modules - -clean: - rm -rf .xvpics pixmaps/.xvpics *.o *.so hardinfo modules/*.so report - find . -name \*~ -exec rm -v {} \; - find . -name x86 -type l -exec rm -v {} \; - -dist-clean: clean - rm -rf Makefile debian/hardinfo/ config.h arch/this - -package: dist-clean - @echo "Creating tar.gz..." - cd .. && tar czf $(PACKAGE).tar.gz $(PACKAGE)/* && cd $(PACKAGE) - @echo "Creating tar.bz2..." - cd .. && tar cjf $(PACKAGE).tar.bz2 $(PACKAGE)/* && cd $(PACKAGE) - -deb: dist-clean - @echo "Creating deb..." - dpkg-buildpackage -rfakeroot -k${USER} - -install: all - rm -rf ${DESTDIR}${LIBDIR}/hardinfo/modules ${DESTDIR}/usr/share/hardinfo/pixmaps - - mkdir -p ${DESTDIR}/usr/bin - mkdir -p ${DESTDIR}/usr/local - mkdir -p ${DESTDIR}/usr/share/applications - mkdir -p ${DESTDIR}${LIBDIR}/hardinfo/modules - mkdir -p ${DESTDIR}/usr/share/hardinfo/pixmaps - - cp hardinfo.desktop ${DESTDIR}/usr/share/applications - - cp hardinfo ${DESTDIR}/usr/bin/hardinfo - - cp -Lr modules/*.so ${DESTDIR}${LIBDIR}/hardinfo/modules - - cp -Lr pixmaps/* ${DESTDIR}/usr/share/hardinfo/pixmaps - - cp benchmark.conf ${DESTDIR}/usr/share/hardinfo - cp benchmark.data ${DESTDIR}/usr/share/hardinfo - - chmod 755 ${DESTDIR}/usr/bin/hardinfo - -installer: - makepackage - diff --git a/README b/README new file mode 100644 index 00000000..5484dfe0 --- /dev/null +++ b/README @@ -0,0 +1,71 @@ + + *** This project is not dead, but needs a maintainer *** + *** Please contact the author if you're interested *** + + +HardInfo is a system profiler and benchmark for Linux systems. It is able to +obtain information from both hardware and basic software, and organize them +in a simple to use GUI. + +Features include: +- Report generation (in either HTML or plain text) +- Benchmark result synchronization +- Ability to explore the information on remote computers + + +DEPENDENCIES +------------ + +Required: +- GTK+ 2.10 (or newer) +- GLib 2.10 (or newer) + +Optional (for synchronization/remote): +- Libsoup 2.24 (or newer) + +If having trouble building with libsoup, disable it with: + cmake -DHARDINFO_NOSYNC=1 + +BUILDING +-------- + +HardInfo previously used a hand-made Makefile and configure scripts, but it +is now using CMake. This makes the job of maintaining HardInfo simpler and +also produces better binaries. + +To build, it is recommended to create a build directory and build from +there: + + hardinfo $ mkdir build + hardinfo $ cd build + build $ cmake .. + build $ make + +There are some variables that can be changed: + + CMAKE_BUILD_TYPE Can be either Release or Debug + [Default: Release] Debug builds prints messages to console + and are not recommended for general use + CMAKE_INSTALL_PREFIX Sets the installation prefix. + [Default: /usr/local] + +To set a variable, pass use cmake's -D command-line parameter. For example: + + build $ cmake .. -DCMAKE_BUILD_TYPE=Debug + +SETTING UP +---------- + +Most things in HardInfo are detected automatically. However, some things +depends on manual set up. They are: + +Sensors +------- + +lm-sensors: If your computer is compatible with lm-sensors module, use the +"sensors-detect" program included with the lm-sensors package, and be sure +to have the detected kernel modules loaded. + +hddtemp: To obtain the hard disk drive temperature, be sure to run hddtemp +in daemon mode, using the default port. + diff --git a/TODO b/TODO index fcdba7be..b65d77f8 100644 --- a/TODO +++ b/TODO @@ -7,7 +7,6 @@ - Benchmark * New benchmarks - o Video o FPU+CPU o Disk o Phoronix? @@ -25,12 +24,9 @@ - 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 @@ -45,6 +41,3 @@ * 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 deleted file mode 100644 index 5fea2e22..00000000 --- a/arch/common/blowfish.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -static gpointer -parallel_blowfish(unsigned int start, unsigned int end, void *data, GTimer *timer) -{ - BLOWFISH_CTX ctx; - unsigned int i; - unsigned long L, R; - - L = 0xBEBACAFE; - R = 0xDEADBEEF; - - for (i = start; i <= end; i++) { - Blowfish_Init(&ctx, (unsigned char*)data, 65536); - Blowfish_Encrypt(&ctx, &L, &R); - Blowfish_Decrypt(&ctx, &L, &R); - } - - return NULL; -} - -static void -benchmark_fish(void) -{ - gdouble elapsed = 0; - gchar *tmpsrc; - - gchar *bdata_path; - - bdata_path = g_build_filename(params.path_data, "benchmark.data", NULL); - if (!g_file_get_contents(bdata_path, &tmpsrc, NULL, NULL)) { - g_free(bdata_path); - return; - } - - shell_view_set_enabled(FALSE); - shell_status_update("Performing Blowfish benchmark..."); - - elapsed = benchmark_parallel_for(0, 50000, parallel_blowfish, tmpsrc); - - g_free(bdata_path); - g_free(tmpsrc); - - bench_results[BENCHMARK_BLOWFISH] = elapsed; -} diff --git a/arch/common/cryptohash.h b/arch/common/cryptohash.h deleted file mode 100644 index 9897bb6b..00000000 --- a/arch/common/cryptohash.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include - -static void inline md5_step(char *data, glong srclen) -{ - struct MD5Context ctx; - guchar checksum[16]; - - MD5Init(&ctx); - MD5Update(&ctx, (guchar *)data, srclen); - MD5Final(checksum, &ctx); -} - -static void inline sha1_step(char *data, glong srclen) -{ - SHA1_CTX ctx; - guchar checksum[20]; - - SHA1Init(&ctx); - SHA1Update(&ctx, (guchar*)data, srclen); - SHA1Final(checksum, &ctx); -} - -static gpointer cryptohash_for(unsigned int start, unsigned int end, void *data, GTimer *timer) -{ - unsigned int i; - - for (i = start; i <= end; i++) { - if (i % 2 == 0) { - md5_step(data, 65536); - } else { - sha1_step(data, 65536); - } - } - - return NULL; -} - -static void -benchmark_cryptohash(void) -{ - gdouble elapsed = 0; - gchar *tmpsrc, *bdata_path; - - bdata_path = g_build_filename(params.path_data, "benchmark.data", NULL); - if (!g_file_get_contents(bdata_path, &tmpsrc, NULL, NULL)) { - g_free(bdata_path); - return; - } - - shell_view_set_enabled(FALSE); - shell_status_update("Running CryptoHash benchmark..."); - - elapsed = benchmark_parallel_for(0, 5000, cryptohash_for, tmpsrc); - - g_free(bdata_path); - g_free(tmpsrc); - - bench_results[BENCHMARK_CRYPTOHASH] = 312.0 / elapsed; -} diff --git a/arch/common/display.h b/arch/common/display.h deleted file mode 100644 index 075a0a24..00000000 --- a/arch/common/display.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -static void -get_glx_info(DisplayInfo *di) -{ - gchar *output; - if (g_spawn_command_line_sync("glxinfo", &output, NULL, NULL, NULL)) { - gchar **output_lines; - gint i = 0; - - for (output_lines = g_strsplit(output, "\n", 0); - output_lines && output_lines[i]; - i++) { - if (strstr(output_lines[i], "OpenGL")) { - gchar **tmp = g_strsplit(output_lines[i], ":", 0); - - tmp[1] = g_strchug(tmp[1]); - - get_str("OpenGL vendor str", di->ogl_vendor); - get_str("OpenGL renderer str", di->ogl_renderer); - get_str("OpenGL version str", di->ogl_version); - - g_strfreev(tmp); - } else if (strstr(output_lines[i], "direct rendering: Yes")) { - di->dri = TRUE; - } - } - - g_free(output); - g_strfreev(output_lines); - - if (!di->ogl_vendor) - di->ogl_vendor = "Unknown"; - if (!di->ogl_renderer) - di->ogl_renderer = "Unknown"; - if (!di->ogl_version) - di->ogl_version = "Unknown"; - } else { - di->ogl_vendor = di->ogl_renderer = di->ogl_version = "Unknown"; - } - -} - -static void -get_x11_info(DisplayInfo *di) -{ - gchar *output; - - if (g_spawn_command_line_sync("xdpyinfo", &output, NULL, NULL, NULL)) { - gchar **output_lines, **old; - - output_lines = g_strsplit(output, "\n", 0); - g_free(output); - - old = output_lines; - while (*(output_lines++)) { - gchar **tmp = g_strsplit(*output_lines, ":", 0); - - if (tmp[1] && tmp[0]) { - tmp[1] = g_strchug(tmp[1]); - - get_str("vendor string", di->vendor); - get_str("X.Org version", di->version); - get_str("XFree86 version", di->version); - - if (g_str_has_prefix(tmp[0], "number of extensions")) { - int n; - - di->extensions = g_strdup(""); - - for (n = atoi(tmp[1]); n; n--) { - di->extensions = h_strconcat(di->extensions, - g_strstrip(*(++output_lines)), - "=\n", - NULL); - } - g_strfreev(tmp); - - break; - } - } - - g_strfreev(tmp); - } - - g_strfreev(old); - } - - GdkScreen *screen = gdk_screen_get_default(); - - if (screen && GDK_IS_SCREEN(screen)) { - gint n_monitors = gdk_screen_get_n_monitors(screen); - gint i; - - di->monitors = NULL; - for (i = 0; i < n_monitors; i++) { - GdkRectangle rect; - - gdk_screen_get_monitor_geometry(screen, i, &rect); - - di->monitors = h_strdup_cprintf("Monitor %d=%dx%d pixels\n", - di->monitors, i, rect.width, rect.height); - } - } else { - di->monitors = ""; - } -} - -static DisplayInfo * -computer_get_display(void) -{ - DisplayInfo *di = g_new0(DisplayInfo, 1); - - GdkScreen *screen = gdk_screen_get_default(); - - if (screen && GDK_IS_SCREEN(screen)) { - di->width = gdk_screen_get_width(screen); - di->height = gdk_screen_get_height(screen); - } else { - di->width = di->height = 0; - } - - get_glx_info(di); - get_x11_info(di); - - return di; -} diff --git a/arch/common/environment.h b/arch/common/environment.h deleted file mode 100644 index c78c4a73..00000000 --- a/arch/common/environment.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2008 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -static gchar *_env = NULL; -void scan_env_var(gboolean reload) -{ - SCAN_START(); - - gchar **envlist; - gint i; - - g_free(_env); - - _env = g_strdup("[Environment Variables]\n"); - for (i = 0, envlist = g_listenv(); envlist[i]; i++) { - _env = h_strdup_cprintf("%s=%s\n", _env, - envlist[i], g_getenv(envlist[i])); - } - g_strfreev(envlist); - - SCAN_END(); -} - -gchar *callback_env_var(void) -{ - return _env; -} diff --git a/arch/common/fft.h b/arch/common/fft.h deleted file mode 100644 index 62daa9fe..00000000 --- a/arch/common/fft.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -static gpointer fft_for(unsigned int start, unsigned int end, void *data, GTimer *timer) -{ - unsigned int i; - - for (i = start; i <= end; i++) { - fft_bench_start(); - } - - return NULL; -} - -static void -benchmark_fft(void) -{ - gdouble elapsed = 0; - - shell_view_set_enabled(FALSE); - shell_status_update("Running FFT benchmark..."); - - fft_bench_init(); - elapsed = benchmark_parallel_for(0, 4, fft_for, NULL); - fft_bench_finish(); - - bench_results[BENCHMARK_FFT] = elapsed; -} - - diff --git a/arch/common/fib.h b/arch/common/fib.h deleted file mode 100644 index 6a216afe..00000000 --- a/arch/common/fib.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -static gulong -fib(gulong n) -{ - if (n == 0) - return 0; - else if (n <= 2) - return 1; - return fib(n - 1) + fib(n - 2); -} - -static void -benchmark_fib(void) -{ - GTimer *timer = g_timer_new(); - gdouble elapsed; - - shell_view_set_enabled(FALSE); - shell_status_update("Calculating the 42nd Fibonacci number..."); - - g_timer_reset(timer); - g_timer_start(timer); - - fib(42); - - g_timer_stop(timer); - elapsed = g_timer_elapsed(timer, NULL); - g_timer_destroy(timer); - - bench_results[BENCHMARK_FIB] = elapsed; -} diff --git a/arch/common/languages.h b/arch/common/languages.h deleted file mode 100644 index c1839ee9..00000000 --- a/arch/common/languages.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -void -scan_languages(OperatingSystem * os) -{ - FILE *locale; - gchar buf[512], *retval = NULL; - - locale = popen("locale -va", "r"); - if (!locale) - return; - - gchar name[32]; - gchar *title = NULL, - *source = NULL, - *address = NULL, - *email = NULL, - *language = NULL, - *territory = NULL, - *revision = NULL, - *date = NULL, - *codeset = NULL; - - while (fgets(buf, 512, locale)) { - if (!strncmp(buf, "locale:", 7)) { - sscanf(buf, "locale: %s", name); - (void)fgets(buf, 128, locale); - } else if (strchr(buf, '|')) { - gchar **tmp = g_strsplit(buf, "|", 2); - - tmp[0] = g_strstrip(tmp[0]); - - if (tmp[1]) { - tmp[1] = g_strstrip(tmp[1]); - - get_str("title", title); - get_str("source", source); - get_str("address", address); - get_str("email", email); - get_str("language", language); - get_str("territory", territory); - get_str("revision", revision); - get_str("date", date); - get_str("codeset", codeset); - } - - g_strfreev(tmp); - } else { - gchar *currlocale; - - retval = h_strdup_cprintf("$%s$%s=%s\n", retval, name, name, title); - -#define FIELD(f) f ? f : "(Unknown)" - currlocale = g_strdup_printf("[Locale Information]\n" - "Name=%s (%s)\n" - "Source=%s\n" - "Address=%s\n" - "Email=%s\n" - "Language=%s\n" - "Territory=%s\n" - "Revision=%s\n" - "Date=%s\n" - "Codeset=%s\n", - name, FIELD(title), - FIELD(source), FIELD(address), - FIELD(email), FIELD(language), - FIELD(territory), FIELD(revision), - FIELD(date), FIELD(codeset)); -#undef FIELD - - g_hash_table_insert(moreinfo, g_strdup(name), currlocale); - - g_free(title); - g_free(source); - g_free(address); - g_free(email); - g_free(language); - g_free(territory); - g_free(revision); - g_free(date); - g_free(codeset); - - title = source = address = email = language = territory = \ - revision = date = codeset = NULL; - } - } - - fclose(locale); - - os->languages = retval; -} diff --git a/arch/common/nqueens.h b/arch/common/nqueens.h deleted file mode 100644 index 2a233722..00000000 --- a/arch/common/nqueens.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -static gpointer nqueens_for(unsigned int start, unsigned int end, void *data, GTimer *timer) -{ - unsigned int i; - - for (i = start; i <= end; i++) { - nqueens(0); - } - - return NULL; -} - -static void -benchmark_nqueens(void) -{ - gdouble elapsed = 0; - - shell_view_set_enabled(FALSE); - shell_status_update("Running N-Queens benchmark..."); - - elapsed = benchmark_parallel_for(0, 10, nqueens_for, NULL); - - bench_results[BENCHMARK_NQUEENS] = elapsed; -} - - diff --git a/arch/common/printers.h b/arch/common/printers.h deleted file mode 100644 index 2f221252..00000000 --- a/arch/common/printers.h +++ /dev/null @@ -1,261 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include - -typedef struct _CUPSDest CUPSDest; -typedef struct _CUPSOption CUPSOption; - -struct _CUPSOption { - char *name, *value; -}; - -struct _CUPSDest { - char *name, *instance; - int is_default; - int num_options; - CUPSOption *options; -}; - -static int (*cups_dests_get) (CUPSDest **dests) = NULL; -static int (*cups_dests_free) (int num_dests, CUPSDest *dests) = NULL; -static gboolean cups_init = FALSE; - -static gboolean -remove_printer_devices(gpointer key, gpointer value, gpointer data) -{ - return g_str_has_prefix(key, "PRN"); -} - -static void -__init_cups(void) -{ - static GModule *cups = NULL; - const char *libcups[] = { "libcups", "libcups.so", "libcups.so.1", "libcups.so.2", NULL }; - - if (!(cups_dests_get && cups_dests_free)) { - int i; - - for (i = 0; libcups[i] != NULL; i++) { - cups = g_module_open(libcups[i], G_MODULE_BIND_LAZY); - if (cups) - break; - } - - if (!cups) { - cups_init = FALSE; - return; - } - - if (!g_module_symbol(cups, "cupsGetDests", (gpointer) & cups_dests_get) - || !g_module_symbol(cups, "cupsFreeDests", (gpointer) & cups_dests_free)) { - g_module_close(cups); - cups_init = FALSE; - } - } - - cups_init = TRUE; -} - -gchar *__cups_callback_ptype(gchar *strvalue) -{ - if (strvalue) { - unsigned value = atoi(strvalue); - gchar *output = g_strdup("\n"); - - if (value & 0x0004) - output = h_strdup_cprintf("\342\232\254 Can do black and white printing=\n", output); - if (value & 0x0008) - output = h_strdup_cprintf("\342\232\254 Can do color printing=\n", output); - if (value & 0x0010) - output = h_strdup_cprintf("\342\232\254 Can do duplexing=\n", output); - if (value & 0x0020) - output = h_strdup_cprintf("\342\232\254 Can do staple output=\n", output); - if (value & 0x0040) - output = h_strdup_cprintf("\342\232\254 Can do copies=\n", output); - if (value & 0x0080) - output = h_strdup_cprintf("\342\232\254 Can collate copies=\n", output); - if (value & 0x80000) - output = h_strdup_cprintf("\342\232\254 Printer is rejecting jobs=\n", output); - if (value & 0x1000000) - output = h_strdup_cprintf("\342\232\254 Printer was automatically discovered and added=\n", output); - - return output; - } else { - return g_strdup("Unknown"); - } -} - -gchar *__cups_callback_state(gchar *value) -{ - if (!value) { - return g_strdup("Unknown"); - } - - if (g_str_equal(value, "3")) { - return g_strdup("Idle"); - } else if (g_str_equal(value, "4")) { - return g_strdup("Printing a Job"); - } else if (g_str_equal(value, "5")) { - return g_strdup("Stopped"); - } else { - return g_strdup("Unknown"); - } -} - -gchar *__cups_callback_state_change_time(gchar *value) -{ - struct tm tm; - char buf[255]; - - if (value) { - strptime(value, "%s", &tm); - strftime(buf, sizeof(buf), "%c", &tm); - - return g_strdup(buf); - } else { - return g_strdup("Unknown"); - } -} - -gchar *__cups_callback_boolean(gchar *value) -{ - if (value) { - return g_strdup(g_str_equal(value, "1") ? "Yes" : "No"); - } else { - return g_strdup("Unknown"); - } -} - -const struct { - char *key, *name; - gchar *(*callback)(gchar *value); -} cups_fields[] = { - { "Printer Information", NULL, NULL }, - { "printer-info", "Destination Name", NULL }, - { "printer-make-and-model", "Make and Model", NULL }, - - { "Capabilities", NULL, NULL }, - { "printer-type", "#", __cups_callback_ptype }, - - { "Printer State", NULL, NULL }, - { "printer-state", "State", __cups_callback_state }, - { "printer-state-change-time", "Change Time", __cups_callback_state_change_time }, - { "printer-state-reasons", "State Reasons" }, - - { "Sharing Information", NULL, NULL }, - { "printer-is-shared", "Shared?", __cups_callback_boolean }, - { "printer-location", "Physical Location" }, - { "auth-info-required", "Authentication Required", __cups_callback_boolean }, - - { "Jobs", NULL, NULL }, - { "job-hold-until", "Hold Until", NULL }, - { "job-priority", "Priority", NULL }, - { "printer-is-accepting-jobs", "Accepting Jobs", __cups_callback_boolean }, - - { "Media", NULL, NULL }, - { "media", "Media", NULL }, - { "finishings", "Finishings", NULL }, - { "copies", "Copies", NULL }, -}; - -void -__scan_printers(void) -{ - int num_dests, i, j; - CUPSDest *dests; - gchar *prn_id, *prn_moreinfo; - - g_free(printer_list); - - if (!cups_init) { - __init_cups(); - - printer_list = g_strdup("[Printers]\n" - "No suitable CUPS library found="); - return; - } - - /* remove old devices from global device table */ - g_hash_table_foreach_remove(moreinfo, remove_printer_devices, NULL); - - num_dests = cups_dests_get(&dests); - if (num_dests > 0) { - printer_list = g_strdup_printf("[Printers (CUPS)]\n"); - for (i = 0; i < num_dests; i++) { - GHashTable *options; - - options = g_hash_table_new(g_str_hash, g_str_equal); - - for (j = 0; j < dests[i].num_options; j++) { - g_hash_table_insert(options, - g_strdup(dests[i].options[j].name), - g_strdup(dests[i].options[j].value)); - } - - prn_id = g_strdup_printf("PRN%d", i); - - printer_list = h_strdup_cprintf("\n$%s$%s=%s\n", - printer_list, - prn_id, - dests[i].name, - dests[i].is_default ? "Default" : ""); - - prn_moreinfo = g_strdup(""); - for (j = 0; j < G_N_ELEMENTS(cups_fields); j++) { - if (!cups_fields[j].name) { - prn_moreinfo = h_strdup_cprintf("[%s]\n", - prn_moreinfo, - cups_fields[j].key); - } else { - gchar *temp; - - temp = g_hash_table_lookup(options, cups_fields[j].key); - - if (cups_fields[j].callback) { - temp = cups_fields[j].callback(temp); - } else { - if (temp) { - /* FIXME Do proper escaping */ - temp = g_strdup(strreplace(temp, "&=", ' ')); - } else { - temp = g_strdup("Unknown"); - } - } - - prn_moreinfo = h_strdup_cprintf("%s=%s\n", - prn_moreinfo, - cups_fields[j].name, - temp); - - g_free(temp); - } - } - - g_hash_table_insert(moreinfo, prn_id, prn_moreinfo); - g_hash_table_destroy(options); - } - - cups_dests_free(num_dests, dests); - } else { - printer_list = g_strdup("[Printers]\n" - "No printers found=\n"); - } -} diff --git a/arch/common/raytrace.h b/arch/common/raytrace.h deleted file mode 100644 index 7fdc5e21..00000000 --- a/arch/common/raytrace.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -void fbench(); /* fbench.c */ - -static gpointer -parallel_raytrace(unsigned int start, unsigned int end, gpointer data) -{ - unsigned int i; - - for (i = start; i <= end; i++) { - fbench(); - } - - return NULL; -} - -static void -benchmark_raytrace(void) -{ - gdouble elapsed = 0; - - shell_view_set_enabled(FALSE); - shell_status_update("Performing John Walker's FBENCH..."); - - elapsed = benchmark_parallel_for(0, 1000, parallel_raytrace, NULL); - - bench_results[BENCHMARK_RAYTRACE] = elapsed; -} - diff --git a/arch/common/users.h b/arch/common/users.h deleted file mode 100644 index 2361a4bf..00000000 --- a/arch/common/users.h +++ /dev/null @@ -1,50 +0,0 @@ -static gchar *users = NULL; - -static gboolean -remove_users(gpointer key, gpointer value, gpointer data) -{ - return g_str_has_prefix(key, "USER"); -} - -static void -scan_users_do(void) -{ - FILE *passwd; - char buffer[512]; - - passwd = fopen("/etc/passwd", "r"); - if (!passwd) - return; - - if (users) { - g_free(users); - - g_hash_table_foreach_remove(moreinfo, remove_users, NULL); - } - - users = g_strdup(""); - - while (fgets(buffer, 512, passwd)) { - gchar **tmp; - gint uid; - - tmp = g_strsplit(buffer, ":", 0); - - gchar *key = g_strdup_printf("USER%s", tmp[0]); - gchar *val = g_strdup_printf("[User Information]\n" - "User ID=%s\n" - "Group ID=%s\n" - "Home directory=%s\n" - "Default shell=%s\n", - tmp[2], tmp[3], tmp[5], tmp[6]); - g_hash_table_insert(moreinfo, key, val); - - uid = atoi(tmp[2]); - strend(tmp[4], ','); - users = h_strdup_cprintf("$%s$%s=%s\n", users, key, tmp[0], tmp[4]); - - g_strfreev(tmp); - } - - fclose(passwd); -} diff --git a/arch/linux/alpha/alsa.h b/arch/linux/alpha/alsa.h deleted file mode 120000 index ede8a364..00000000 --- a/arch/linux/alpha/alsa.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/alsa.h \ No newline at end of file diff --git a/arch/linux/alpha/battery.h b/arch/linux/alpha/battery.h deleted file mode 120000 index ed7360e1..00000000 --- a/arch/linux/alpha/battery.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/battery.h \ No newline at end of file diff --git a/arch/linux/alpha/boots.h b/arch/linux/alpha/boots.h deleted file mode 120000 index 97384500..00000000 --- a/arch/linux/alpha/boots.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/boots.h \ No newline at end of file diff --git a/arch/linux/alpha/devmemory.h b/arch/linux/alpha/devmemory.h deleted file mode 120000 index f8a833e7..00000000 --- a/arch/linux/alpha/devmemory.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/devmemory.h \ No newline at end of file diff --git a/arch/linux/alpha/filesystem.h b/arch/linux/alpha/filesystem.h deleted file mode 120000 index d884bcd0..00000000 --- a/arch/linux/alpha/filesystem.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/filesystem.h \ No newline at end of file diff --git a/arch/linux/alpha/inputdevices.h b/arch/linux/alpha/inputdevices.h deleted file mode 120000 index 0f594231..00000000 --- a/arch/linux/alpha/inputdevices.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/inputdevices.h \ No newline at end of file diff --git a/arch/linux/alpha/loadavg.h b/arch/linux/alpha/loadavg.h deleted file mode 120000 index 1f64e107..00000000 --- a/arch/linux/alpha/loadavg.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/loadavg.h \ No newline at end of file diff --git a/arch/linux/alpha/memory.h b/arch/linux/alpha/memory.h deleted file mode 120000 index 64c6e0ed..00000000 --- a/arch/linux/alpha/memory.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/memory.h \ No newline at end of file diff --git a/arch/linux/alpha/modules.h b/arch/linux/alpha/modules.h deleted file mode 120000 index d21c9a20..00000000 --- a/arch/linux/alpha/modules.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/modules.h \ No newline at end of file diff --git a/arch/linux/alpha/net.h b/arch/linux/alpha/net.h deleted file mode 120000 index 488b5ae3..00000000 --- a/arch/linux/alpha/net.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/net.h \ No newline at end of file diff --git a/arch/linux/alpha/nfs.h b/arch/linux/alpha/nfs.h deleted file mode 120000 index 73e0b8c9..00000000 --- a/arch/linux/alpha/nfs.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/nfs.h \ No newline at end of file diff --git a/arch/linux/alpha/os.h b/arch/linux/alpha/os.h deleted file mode 120000 index 44051626..00000000 --- a/arch/linux/alpha/os.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/os.h \ No newline at end of file diff --git a/arch/linux/alpha/pci.h b/arch/linux/alpha/pci.h deleted file mode 120000 index 8df04a0e..00000000 --- a/arch/linux/alpha/pci.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/pci.h \ No newline at end of file diff --git a/arch/linux/alpha/processor.h b/arch/linux/alpha/processor.h deleted file mode 100644 index 1e5b014c..00000000 --- a/arch/linux/alpha/processor.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -struct _Processor { - gchar *model_name; - gfloat bogomips, cpu_mhz; - gchar *strmodel; -}; - -static GSList * -__scan_processors(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen("/proc/cpuinfo", "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("cpu model", processor->model_name); - get_float("BogoMIPS", processor->bogomips); - get_str("platform string", processor->strmodel); - - } - g_strfreev(tmp); - } - - gchar *tmp = g_strconcat("Alpha ", processor->model_name, NULL); - g_free(processor->model_name); - processor->model_name = tmp; - processor->cpu_mhz = 0.0f; - - fclose(cpuinfo); - - return g_slist_append(NULL, processor); -} - -static gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[Processor]\n" - "Model=%s\n" - "Platform String=%s\n" - "BogoMIPS=%.2f" - "Byte Order=%s\n", - processor->model_name, - processor->strmodel, - processor->bogomips, -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - "Little Endian" -#else - "Big Endian" -#endif - ); -} diff --git a/arch/linux/alpha/resources.h b/arch/linux/alpha/resources.h deleted file mode 120000 index 20a4815d..00000000 --- a/arch/linux/alpha/resources.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/resources.h \ No newline at end of file diff --git a/arch/linux/alpha/samba.h b/arch/linux/alpha/samba.h deleted file mode 120000 index ebab9b11..00000000 --- a/arch/linux/alpha/samba.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/samba.h \ No newline at end of file diff --git a/arch/linux/alpha/sensors.h b/arch/linux/alpha/sensors.h deleted file mode 120000 index 3b799377..00000000 --- a/arch/linux/alpha/sensors.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/sensors.h \ No newline at end of file diff --git a/arch/linux/alpha/storage.h b/arch/linux/alpha/storage.h deleted file mode 120000 index 3ea886ce..00000000 --- a/arch/linux/alpha/storage.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/storage.h \ No newline at end of file diff --git a/arch/linux/alpha/uptime.h b/arch/linux/alpha/uptime.h deleted file mode 120000 index a5bac980..00000000 --- a/arch/linux/alpha/uptime.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/uptime.h \ No newline at end of file diff --git a/arch/linux/alpha/usb.h b/arch/linux/alpha/usb.h deleted file mode 120000 index aee3046c..00000000 --- a/arch/linux/alpha/usb.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/usb.h \ No newline at end of file diff --git a/arch/linux/armv4l/alsa.h b/arch/linux/armv4l/alsa.h deleted file mode 120000 index 0216845a..00000000 --- a/arch/linux/armv4l/alsa.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/alsa.h \ No newline at end of file diff --git a/arch/linux/armv4l/battery.h b/arch/linux/armv4l/battery.h deleted file mode 120000 index e4c794f2..00000000 --- a/arch/linux/armv4l/battery.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/battery.h \ No newline at end of file diff --git a/arch/linux/armv4l/boots.h b/arch/linux/armv4l/boots.h deleted file mode 120000 index 97384500..00000000 --- a/arch/linux/armv4l/boots.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/boots.h \ No newline at end of file diff --git a/arch/linux/armv4l/devmemory.h b/arch/linux/armv4l/devmemory.h deleted file mode 120000 index f8a833e7..00000000 --- a/arch/linux/armv4l/devmemory.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/devmemory.h \ No newline at end of file diff --git a/arch/linux/armv4l/filesystem.h b/arch/linux/armv4l/filesystem.h deleted file mode 120000 index 6b325b40..00000000 --- a/arch/linux/armv4l/filesystem.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/filesystem.h \ No newline at end of file diff --git a/arch/linux/armv4l/inputdevices.h b/arch/linux/armv4l/inputdevices.h deleted file mode 120000 index b9226a29..00000000 --- a/arch/linux/armv4l/inputdevices.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/inputdevices.h \ No newline at end of file diff --git a/arch/linux/armv4l/loadavg.h b/arch/linux/armv4l/loadavg.h deleted file mode 120000 index daaed6d5..00000000 --- a/arch/linux/armv4l/loadavg.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/loadavg.h \ No newline at end of file diff --git a/arch/linux/armv4l/memory.h b/arch/linux/armv4l/memory.h deleted file mode 120000 index 5ffc013e..00000000 --- a/arch/linux/armv4l/memory.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/memory.h \ No newline at end of file diff --git a/arch/linux/armv4l/modules.h b/arch/linux/armv4l/modules.h deleted file mode 120000 index 8ce5a808..00000000 --- a/arch/linux/armv4l/modules.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/modules.h \ No newline at end of file diff --git a/arch/linux/armv4l/net.h b/arch/linux/armv4l/net.h deleted file mode 120000 index 72d77b26..00000000 --- a/arch/linux/armv4l/net.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/net.h \ No newline at end of file diff --git a/arch/linux/armv4l/nfs.h b/arch/linux/armv4l/nfs.h deleted file mode 120000 index 3d1048da..00000000 --- a/arch/linux/armv4l/nfs.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/nfs.h \ No newline at end of file diff --git a/arch/linux/armv4l/os.h b/arch/linux/armv4l/os.h deleted file mode 120000 index ef547be5..00000000 --- a/arch/linux/armv4l/os.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/os.h \ No newline at end of file diff --git a/arch/linux/armv4l/pci.h b/arch/linux/armv4l/pci.h deleted file mode 120000 index 63760048..00000000 --- a/arch/linux/armv4l/pci.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/pci.h \ No newline at end of file diff --git a/arch/linux/armv4l/processor.h b/arch/linux/armv4l/processor.h deleted file mode 100644 index 82b6be04..00000000 --- a/arch/linux/armv4l/processor.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -struct _Processor { - gchar *model_name; - gchar *flags; - gfloat bogomips, cpu_mhz; - - gchar *has_fpu; -}; - - -static GSList * -__scan_processors(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen("/proc/cpuinfo", "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("Processor", processor->model_name); - get_str("Features", processor->flags); - get_float("BogoMIPS", processor->bogomips); - - get_str("Hardware", processor->has_fpu); - } - g_strfreev(tmp); - } - - processor->cpu_mhz = 0.0f; - - fclose(cpuinfo); - - return g_slist_append(NULL, processor); -} - -static gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[Processor]\n" - "Name=%s\n" - "Features=%s\n" - "BogoMips=%.2f\n" - "Endianesss=" -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - "Little Endian", -#else - "Big Endian", -#endif - "\n" - "Hardware=%s\n", - processor->model_name, - processor->flags, - processor->bogomips, - processor->has_fpu); -} diff --git a/arch/linux/armv4l/resources.h b/arch/linux/armv4l/resources.h deleted file mode 120000 index 20a4815d..00000000 --- a/arch/linux/armv4l/resources.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/resources.h \ No newline at end of file diff --git a/arch/linux/armv4l/samba.h b/arch/linux/armv4l/samba.h deleted file mode 120000 index 9227f722..00000000 --- a/arch/linux/armv4l/samba.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/samba.h \ No newline at end of file diff --git a/arch/linux/armv4l/sensors.h b/arch/linux/armv4l/sensors.h deleted file mode 120000 index 35e5f37a..00000000 --- a/arch/linux/armv4l/sensors.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/sensors.h \ No newline at end of file diff --git a/arch/linux/armv4l/storage.h b/arch/linux/armv4l/storage.h deleted file mode 120000 index 55b68de3..00000000 --- a/arch/linux/armv4l/storage.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/storage.h \ No newline at end of file diff --git a/arch/linux/armv4l/uptime.h b/arch/linux/armv4l/uptime.h deleted file mode 120000 index 78c026ff..00000000 --- a/arch/linux/armv4l/uptime.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/uptime.h \ No newline at end of file diff --git a/arch/linux/armv4l/usb.h b/arch/linux/armv4l/usb.h deleted file mode 120000 index 8b8fbb5d..00000000 --- a/arch/linux/armv4l/usb.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/usb.h \ No newline at end of file diff --git a/arch/linux/common/alsa.h b/arch/linux/common/alsa.h deleted file mode 100644 index ddd58edd..00000000 --- a/arch/linux/common/alsa.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -gchar * -computer_get_alsacards(Computer * computer) -{ - GSList *p; - gchar *tmp = g_strdup(""); - gint n = 0; - - if (computer->alsa) { - for (p = computer->alsa->cards; p; p = p->next) { - AlsaCard *ac = (AlsaCard *) p->data; - - tmp = h_strdup_cprintf("Audio Adapter#%d=%s\n", - tmp, ++n, ac->friendly_name); - } - } - - return tmp; -} - -static AlsaInfo * -computer_get_alsainfo(void) -{ - AlsaInfo *ai; - AlsaCard *ac; - FILE *cards; - gchar buffer[128]; - - cards = fopen("/proc/asound/cards", "r"); - if (!cards) - return NULL; - - ai = g_new0(AlsaInfo, 1); - - while (fgets(buffer, 128, cards)) { - gchar **tmp; - - ac = g_new0(AlsaCard, 1); - - tmp = g_strsplit(buffer, ":", 0); - - ac->friendly_name = g_strdup(tmp[1]); - ai->cards = g_slist_append(ai->cards, ac); - - g_strfreev(tmp); - (void)fgets(buffer, 128, cards); /* skip next line */ - } - fclose(cards); - - return ai; -} diff --git a/arch/linux/common/battery.h b/arch/linux/common/battery.h deleted file mode 100644 index d378fdef..00000000 --- a/arch/linux/common/battery.h +++ /dev/null @@ -1,291 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -const struct { - gchar *key, *name; -} ups_fields[] = { - { "UPS Status", NULL }, - { "STATUS", "Status" }, - { "TIMELEFT", "Time Left" }, - { "LINEV", "Line Voltage" }, - { "LOADPCT", "Load Percent" }, - - { "UPS Battery Information", NULL }, - { "BATTV", "Battery Voltage" }, - { "BCHARGE", "Battery Charge" }, - { "BATTDATE", "Battery Date" }, - - { "UPS Information", NULL }, - { "APCMODEL", "Model" }, - { "FIRMWARE", "Firmware Version" }, - { "SERIALNO", "Serial Number" }, - { "UPSMODE", "UPS Mode" }, - { "CABLE", "Cable" }, - { "UPSNAME", "UPS Name" }, - - { "UPS Nominal Values", NULL }, - { "NOMINV", "Voltage" }, - { "NOMBATTV", "Battery Voltage" }, - { "NOMPOWER", "Power" } -}; - - -static void -__scan_battery_apcupsd(void) -{ - GHashTable *ups_data; - FILE *apcaccess; - char buffer[512], *apcaccess_path; - int i; - - apcaccess_path = find_program("apcaccess"); - - if ((apcaccess = popen(apcaccess_path, "r"))) { - /* first line isn't important */ - if (fgets(buffer, 512, apcaccess)) { - /* allocate the key, value hash table */ - ups_data = g_hash_table_new(g_str_hash, g_str_equal); - - /* read up all the apcaccess' output, saving it in the key, value hash table */ - while (fgets(buffer, 512, apcaccess)) { - buffer[9] = '\0'; - - g_hash_table_insert(ups_data, - g_strdup(g_strstrip(buffer)), - g_strdup(g_strstrip(buffer + 10))); - } - - /* builds the ups info string, respecting the field order as found in ups_fields */ - for (i = 0; i < G_N_ELEMENTS(ups_fields); i++) { - if (!ups_fields[i].name) { - /* there's no name: make a group with the key as its name */ - battery_list = h_strdup_cprintf("[%s]\n", battery_list, ups_fields[i].key); - } else { - /* there's a name: adds a line */ - battery_list = h_strdup_cprintf("%s=%s\n", battery_list, - ups_fields[i].name, - g_hash_table_lookup(ups_data, ups_fields[i].key)); - } - } - - g_hash_table_destroy(ups_data); - } - - pclose(apcaccess); - } - - g_free(apcaccess_path); -} - -static void -__scan_battery_acpi(void) -{ - gchar *acpi_path; - - gchar *present = NULL; - gchar *capacity = NULL; - gchar *technology = NULL; - gchar *voltage = NULL; - gchar *model = NULL, *serial = NULL, *type = NULL; - gchar *state = NULL, *rate = NULL; - gchar *remaining = NULL; - - acpi_path = g_strdup("/proc/acpi/battery"); - if (g_file_test(acpi_path, G_FILE_TEST_EXISTS)) { - GDir *acpi; - - if ((acpi = g_dir_open(acpi_path, 0, NULL))) { - const gchar *entry; - - while ((entry = g_dir_read_name(acpi))) { - gchar *path = g_strdup_printf("%s/%s/info", acpi_path, entry); - FILE *f; - gchar buffer[256]; - gdouble charge_rate = 1.0; - - f = fopen(path, "r"); - g_free(path); - - if (!f) - goto cleanup; - - while (fgets(buffer, 256, f)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - GET_STR("present", present); - GET_STR("design capacity", capacity); - GET_STR("battery technology", technology); - GET_STR("design voltage", voltage); - GET_STR("model number", model); - GET_STR("serial number", serial); - GET_STR("battery type", type); - - g_strfreev(tmp); - } - fclose(f); - - path = g_strdup_printf("%s/%s/state", acpi_path, entry); - f = fopen(path, "r"); - g_free(path); - - if (!f) - goto cleanup; - - while (fgets(buffer, 256, f)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - GET_STR("charging state", state); - GET_STR("present rate", rate); - GET_STR("remaining capacity", remaining); - - g_strfreev(tmp); - } - - fclose(f); - - if (g_str_equal(present, "yes")) { - charge_rate = atof(remaining) / atof(capacity); - - battery_list = h_strdup_cprintf("\n[Battery: %s]\n" - "State=%s (load: %s)\n" - "Capacity=%s / %s (%.2f%%)\n" - "Battery Technology=%s (%s)\n" - "Model Number=%s\n" - "Serial Number=%s\n", - battery_list, - entry, - state, rate, - remaining, capacity, charge_rate * 100.0, - technology, type, - model, - serial); - } - - cleanup: - g_free(present); - g_free(capacity); - g_free(technology); - g_free(type); - g_free(model); - g_free(serial); - g_free(state); - g_free(remaining); - g_free(rate); - - present = capacity = technology = type = \ - model = serial = state = remaining = rate = NULL; - } - - g_dir_close(acpi); - } - } - - g_free(acpi_path); -} - -static void -__scan_battery_apm(void) -{ - FILE *procapm; - static char *sremaining = NULL, *stotal = NULL; - static unsigned int last_time = 0; - static int percentage = 0; - const char *ac_status[] = { "Battery", - "AC Power", - "Charging" }; - int ac_bat; - char apm_bios_ver[16], apm_drv_ver[16]; - char trash[10]; - - if ((procapm = fopen("/proc/apm", "r"))) { - int old_percentage = percentage; - - (void)fscanf(procapm, "%s %s %s 0x%x %s %s %d%%", - apm_drv_ver, apm_bios_ver, trash, - &ac_bat, trash, trash, &percentage); - fclose(procapm); - - if (last_time == 0) { - last_time = time(NULL); - sremaining = stotal = NULL; - } - - if (old_percentage - percentage > 0) { - if (sremaining && stotal) { - g_free(sremaining); - g_free(stotal); - } - - int secs_remaining = (time(NULL) - last_time) * percentage / - (old_percentage - percentage); - sremaining = seconds_to_string(secs_remaining); - stotal = seconds_to_string((secs_remaining * 100) / percentage); - - last_time = time(NULL); - } - } else { - return; - } - - if (stotal && sremaining) { - battery_list = h_strdup_cprintf("\n[Battery (APM)]\n" - "Charge=%d%%\n" - "Remaining Charge=%s of %s\n" - "Using=%s\n" - "APM driver version=%s\n" - "APM BIOS version=%s\n", - battery_list, - percentage, - sremaining, stotal, - ac_status[ac_bat], - apm_drv_ver, apm_bios_ver); - } else { - battery_list = h_strdup_cprintf("\n[Battery (APM)]\n" - "Charge=%d%%\n" - "Using=%s\n" - "APM driver version=%s\n" - "APM BIOS version=%s\n", - battery_list, - percentage, - ac_status[ac_bat], - apm_drv_ver, apm_bios_ver); - - } -} - -static void -__scan_battery(void) -{ - if (battery_list) { - g_free(battery_list); - } - battery_list = g_strdup(""); - - __scan_battery_acpi(); - __scan_battery_apm(); - __scan_battery_apcupsd(); - - if (*battery_list == '\0') { - g_free(battery_list); - - battery_list = g_strdup("[No batteries]\n" - "No batteries found on this system=\n"); - } -} diff --git a/arch/linux/common/boots.h b/arch/linux/common/boots.h deleted file mode 100644 index 8a3c11fa..00000000 --- a/arch/linux/common/boots.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -void -scan_boots_real(void) -{ - FILE *last; - char buffer[256]; - - scan_os(FALSE); - - if (!computer->os->boots) - computer->os->boots = g_strdup("[Boots]\n"); - else - return; - - last = popen("last", "r"); - if (last) { - while (fgets(buffer, 256, last)) { - if (strstr(buffer, "system boot")) { - gchar **tmp, *buf = buffer; - - strend(buffer, '\n'); - - while (*buf) { - if (*buf == ' ' && *(buf + 1) == ' ') { - strcpy(buf, buf + 1); - - buf--; - } else { - buf++; - } - } - - tmp = g_strsplit(buffer, " ", 0); - computer->os->boots = h_strdup_cprintf("\n%s %s %s %s=%s|%s", - computer->os->boots, - tmp[4], tmp[5], tmp[6], tmp[7], tmp[3], tmp[8]); - g_strfreev(tmp); - } - } - - pclose(last); - } -} diff --git a/arch/linux/common/devmemory.h b/arch/linux/common/devmemory.h deleted file mode 100644 index e3921cdd..00000000 --- a/arch/linux/common/devmemory.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -static GHashTable *memlabels; - -static void __scan_memory() -{ - gchar **keys, *tmp; - static gint offset = -1; - gint i; - - if (offset == -1) { - /* gah. linux 2.4 adds three lines of data we don't need in - /proc/meminfo */ - gchar *os_kernel = module_call_method("computer::getOSKernel"); - offset = strstr(os_kernel, "Linux 2.4") ? 3 : 0; - g_free(os_kernel); - } - - g_file_get_contents("/proc/meminfo", &meminfo, NULL, NULL); - - keys = g_strsplit(meminfo, "\n", 0); - - g_free(meminfo); - g_free(lginterval); - - meminfo = g_strdup(""); - lginterval = g_strdup(""); - - for (i = offset; keys[i]; i++) { - gchar **newkeys = g_strsplit(keys[i], ":", 0); - - if (!newkeys[0]) { - g_strfreev(newkeys); - break; - } - - g_strstrip(newkeys[1]); - - if ((tmp = g_hash_table_lookup(memlabels, newkeys[0]))) { - g_free(newkeys[0]); - newkeys[0] = g_strdup(tmp); - } - - g_hash_table_replace(moreinfo, g_strdup(newkeys[0]), g_strdup(newkeys[1])); - - tmp = g_strconcat(meminfo, newkeys[0], "=", newkeys[1], "\n", NULL); - g_free(meminfo); - meminfo = tmp; - - tmp = g_strconcat(lginterval, - "UpdateInterval$", newkeys[0], "=1000\n", NULL); - g_free(lginterval); - lginterval = tmp; - - g_strfreev(newkeys); - } - g_strfreev(keys); -} - -static void __init_memory_labels(void) -{ - static struct { - char *proc_label; - char *real_label; - } proc2real[] = { - { "MemTotal", "Total Memory" }, - { "MemFree", "Free Memory" }, - { "SwapCached", "Cached Swap" }, - { "HighTotal", "High Memory" }, - { "HighFree", "Free High Memory" }, - { "LowTotal", "Low Memory" }, - { "LowFree", "Free Low Memory" }, - { "SwapTotal", "Virtual Memory" }, - { "SwapFree", "Free Virtual Memory" }, - { NULL }, - }; - gint i; - - memlabels = g_hash_table_new(g_str_hash, g_str_equal); - - for (i = 0; proc2real[i].proc_label; i++) { - g_hash_table_insert(memlabels, proc2real[i].proc_label, proc2real[i].real_label); - } -} diff --git a/arch/linux/common/dmi.h b/arch/linux/common/dmi.h deleted file mode 100644 index 7c5e6e6f..00000000 --- a/arch/linux/common/dmi.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -/* - * DMI support based on patch by Stewart Adam - */ -#include -#include - -typedef struct _DMIInfo DMIInfo; - -struct _DMIInfo { - const gchar *name; - const gchar *file; /* for sysfs */ - const gchar *param; /* for dmidecode */ -}; - -DMIInfo dmi_info_table[] = { - { "$BIOS", NULL, NULL }, - { "Date", "/sys/class/dmi/id/bios_date", "bios-release-date" }, - { "Vendor", "/sys/class/dmi/id/bios_vendor", "bios-vendor" }, - { "Version", "/sys/class/dmi/id/bios_version", "bios-version" }, - { "$Board", NULL, NULL }, - { "Name", "/sys/class/dmi/id/board_name", "baseboard-product-name" }, - { "Vendor", "/sys/class/dmi/id/board_vendor", "baseboard-manufacturer" }, -}; - -static gchar *dmi_info = NULL; - -gboolean dmi_get_info_dmidecode() -{ - FILE *dmi_pipe; - gchar buffer[256]; - DMIInfo *info; - gboolean dmi_failed = FALSE; - gint i; - - if (dmi_info) { - g_free(dmi_info); - dmi_info = NULL; - } - - for (i = 0; i < G_N_ELEMENTS(dmi_info_table); i++) { - info = &dmi_info_table[i]; - - if (*(info->name) == '$') { - dmi_info = h_strdup_cprintf("[%s]\n", dmi_info, - (info->name) + 1); - } else { - gchar *temp; - - if (!info->param) - continue; - - temp = g_strconcat("dmidecode -s ", info->param, NULL); - if ((dmi_pipe = popen(temp, "r"))) { - g_free(temp); - - (void)fgets(buffer, 256, dmi_pipe); - if (pclose(dmi_pipe)) { - dmi_failed = TRUE; - break; - } - - const gchar *url = vendor_get_url(buffer); - if (url) { - const gchar *vendor = vendor_get_name(buffer); - if (g_strstr_len(vendor, -1, g_strstrip(buffer)) || - g_strstr_len(g_strstrip(buffer), -1, vendor)) { - dmi_info = h_strdup_cprintf("%s=%s (%s)\n", - dmi_info, - info->name, - g_strstrip(buffer), - url); - } else { - dmi_info = h_strdup_cprintf("%s=%s (%s, %s)\n", - dmi_info, - info->name, - g_strstrip(buffer), - vendor, url); - } - } else { - dmi_info = h_strdup_cprintf("%s=%s\n", - dmi_info, - info->name, - buffer); - } - } else { - g_free(temp); - dmi_failed = TRUE; - break; - } - } - } - - if (dmi_failed) { - g_free(dmi_info); - dmi_info = NULL; - } - - return !dmi_failed; -} - -gboolean dmi_get_info_sys() -{ - FILE *dmi_file; - gchar buffer[256]; - DMIInfo *info; - gboolean dmi_failed = FALSE; - gint i; - - if (dmi_info) { - g_free(dmi_info); - dmi_info = NULL; - } - - for (i = 0; i < G_N_ELEMENTS(dmi_info_table); i++) { - info = &dmi_info_table[i]; - - if (*(info->name) == '$') { - dmi_info = h_strdup_cprintf("[%s]\n", dmi_info, - (info->name) + 1); - } else { - if (!info->file) - continue; - - if ((dmi_file = fopen(info->file, "r"))) { - (void)fgets(buffer, 256, dmi_file); - fclose(dmi_file); - - const gchar *url = vendor_get_url(buffer); - if (url) { - const gchar *vendor = vendor_get_name(buffer); - if (g_strstr_len(vendor, -1, g_strstrip(buffer)) || - g_strstr_len(g_strstrip(buffer), -1, vendor)) { - dmi_info = h_strdup_cprintf("%s=%s (%s)\n", - dmi_info, - info->name, - g_strstrip(buffer), - url); - } else { - dmi_info = h_strdup_cprintf("%s=%s (%s, %s)\n", - dmi_info, - info->name, - g_strstrip(buffer), - vendor, url); - } - } else { - dmi_info = h_strdup_cprintf("%s=%s\n", - dmi_info, - info->name, - g_strstrip(buffer)); - } - } else { - dmi_failed = TRUE; - break; - } - } - } - - if (dmi_failed) { - g_free(dmi_info); - dmi_info = NULL; - } - - return !dmi_failed; -} - -void __scan_dmi() -{ - gboolean dmi_ok; - - dmi_ok = dmi_get_info_sys(); - - if (!dmi_ok) { - dmi_ok = dmi_get_info_dmidecode(); - } - - if (!dmi_ok) { - dmi_info = g_strdup("[No DMI information]\n" - "There was an error retrieving the information.=\n" - "Please try running HardInfo as root.=\n"); - } -} diff --git a/arch/linux/common/filesystem.h b/arch/linux/common/filesystem.h deleted file mode 100644 index 1eff0818..00000000 --- a/arch/linux/common/filesystem.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Some code from xfce4-mount-plugin, version 0.4.3 - * Copyright (C) 2005 Jean-Baptiste jb_dul@yahoo.com - * Distributed under the terms of GNU GPL 2. - */ -#include - -static gchar *fs_list = NULL; - -static gboolean -remove_filesystem_entries(gpointer key, gpointer value, gpointer data) -{ - return g_str_has_prefix(key, "FS"); -} - -static void -scan_filesystems(void) -{ - FILE *mtab; - gchar buf[1024]; - struct statfs sfs; - int count = 0; - - g_free(fs_list); - fs_list = g_strdup(""); - g_hash_table_foreach_remove(moreinfo, remove_filesystem_entries, NULL); - - mtab = fopen("/etc/mtab", "r"); - if (!mtab) - return; - - while (fgets(buf, 1024, mtab)) { - gfloat size, used, avail; - gchar **tmp; - - tmp = g_strsplit(buf, " ", 0); - if (!statfs(tmp[1], &sfs)) { - gfloat use_ratio; - - size = (float) sfs.f_bsize * (float) sfs.f_blocks; - avail = (float) sfs.f_bsize * (float) sfs.f_bavail; - used = size - avail; - - if (size == 0.0f) { - continue; - } - - if (avail == 0.0f) { - use_ratio = 100.0f; - } else { - use_ratio = 100.0f * (used / size); - } - - gchar *strsize = size_human_readable(size), - *stravail = size_human_readable(avail), - *strused = size_human_readable(used); - - gchar *strhash; - if ((strhash = g_hash_table_lookup(moreinfo, tmp[0]))) { - g_hash_table_remove(moreinfo, tmp[0]); - g_free(strhash); - } - - strreplace(tmp[0], "#", '_'); - - strhash = g_strdup_printf("[%s]\n" - "Filesystem=%s\n" - "Mounted As=%s\n" - "Mount Point=%s\n" - "Size=%s\n" - "Used=%s\n" - "Available=%s\n", - tmp[0], - tmp[2], - strstr(tmp[3], "rw") ? "Read-Write" : - "Read-Only", tmp[1], strsize, strused, - stravail); - g_hash_table_insert(moreinfo, g_strdup_printf("FS%d", ++count), strhash); - - fs_list = h_strdup_cprintf("$FS%d$%s=%.2f %% (%s of %s)|%s\n", - fs_list, - count, tmp[0], use_ratio, stravail, strsize, tmp[1]); - - g_free(strsize); - g_free(stravail); - g_free(strused); - } - g_strfreev(tmp); - } - - fclose(mtab); -} diff --git a/arch/linux/common/inputdevices.h b/arch/linux/common/inputdevices.h deleted file mode 100644 index 20e4289c..00000000 --- a/arch/linux/common/inputdevices.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -static gchar *input_icons = NULL; - -static gboolean -remove_input_devices(gpointer key, gpointer value, gpointer data) -{ - return g_str_has_prefix(key, "INP"); -} - -static struct { - char *name; - char *icon; -} input_devices[] = { - { "Keyboard", "keyboard.png" }, - { "Joystick", "joystick.png" }, - { "Mouse", "mouse.png" }, - { "Speaker", "audio.png" }, - { "Unknown", "module.png" }, -}; - -void -__scan_input_devices(void) -{ - FILE *dev; - gchar buffer[128]; - gchar *tmp, *name = NULL, *phys = NULL; - gint bus, vendor, product, version; - int d = 0, n = 0; - - dev = fopen("/proc/bus/input/devices", "r"); - if (!dev) - return; - - if (input_list) { - g_hash_table_foreach_remove(moreinfo, remove_input_devices, NULL); - g_free(input_list); - g_free(input_icons); - } - input_list = g_strdup(""); - input_icons = g_strdup(""); - - while (fgets(buffer, 128, dev)) { - tmp = buffer; - - switch (*tmp) { - case 'N': - name = g_strdup(tmp + strlen("N: Name=")); - remove_quotes(name); - break; - case 'P': - phys = g_strdup(tmp + strlen("P: Phys=")); - break; - case 'I': - sscanf(tmp, "I: Bus=%x Vendor=%x Product=%x Version=%x", - &bus, &vendor, &product, &version); - break; - case 'H': - if (strstr(tmp, "kbd")) - d = 0; //INPUT_KEYBOARD; - else if (strstr(tmp, "js")) - d = 1; //INPUT_JOYSTICK; - else if (strstr(tmp, "mouse")) - d = 2; //INPUT_MOUSE; - else - d = 4; //INPUT_UNKNOWN; - break; - case '\n': - if (strstr(name, "PC Speaker")) { - d = 3; // INPUT_PCSPKR - } - - tmp = g_strdup_printf("INP%d", ++n); - input_list = h_strdup_cprintf("$%s$%s=\n", - input_list, - tmp, name); - input_icons = h_strdup_cprintf("Icon$%s$%s=%s\n", - input_icons, - tmp, name, - input_devices[d].icon); - gchar *strhash = g_strdup_printf("[Device Information]\n" - "Name=%s\n" - "Type=%s\n" - "Bus=0x%x\n", - name, - input_devices[d].name, - bus); - - const gchar *url = vendor_get_url(name); - if (url) { - strhash = h_strdup_cprintf("Vendor=%s (%s)\n", - strhash, - vendor_get_name(name), - url); - } else { - strhash = h_strdup_cprintf("Vendor=%x\n", - strhash, - vendor); - } - - strhash = h_strdup_cprintf("Product=0x%x\n" - "Version=0x%x\n", - strhash, product, version); - - if (phys[1] != 0) { - strhash = h_strdup_cprintf("Connected to=%s\n", - strhash, phys); - } - - if (strstr(phys,"ir")) { - strhash = h_strdup_cprintf("InfraRed port=yes\n", - strhash); - } - - g_hash_table_insert(moreinfo, tmp, strhash); - - g_free(phys); - g_free(name); - } - } - - fclose(dev); -} diff --git a/arch/linux/common/loadavg.h b/arch/linux/common/loadavg.h deleted file mode 100644 index ce2d8775..00000000 --- a/arch/linux/common/loadavg.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -static LoadInfo * -computer_get_loadinfo(void) -{ - LoadInfo *li = g_new0(LoadInfo, 1); - FILE *procloadavg; - - procloadavg = fopen("/proc/loadavg", "r"); - (void)fscanf(procloadavg, "%f %f %f", &(li->load1), &(li->load5), - &(li->load15)); - fclose(procloadavg); - - return li; -} - -static gchar * -computer_get_formatted_loadavg() -{ - LoadInfo *li; - gchar *tmp; - - li = computer_get_loadinfo(); - - tmp = - g_strdup_printf("%.2f, %.2f, %.2f", li->load1, li->load5, - li->load15); - - g_free(li); - return tmp; -} diff --git a/arch/linux/common/memory.h b/arch/linux/common/memory.h deleted file mode 100644 index c87359b9..00000000 --- a/arch/linux/common/memory.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -static MemoryInfo * -computer_get_memory(void) -{ - MemoryInfo *mi; - FILE *procmem; - gchar buffer[128]; - - procmem = fopen("/proc/meminfo", "r"); - if (!procmem) - return NULL; - mi = g_new0(MemoryInfo, 1); - - while (fgets(buffer, 128, procmem)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_int("MemTotal", mi->total); - get_int("MemFree", mi->free); - get_int("Cached", mi->cached); - - g_strfreev(tmp); - } - fclose(procmem); - - mi->used = mi->total - mi->free; - - mi->total /= 1000; - mi->cached /= 1000; - mi->used /= 1000; - mi->free /= 1000; - - mi->used -= mi->cached; - mi->ratio = 1 - (gdouble) mi->used / mi->total; - - return mi; -} diff --git a/arch/linux/common/modules.h b/arch/linux/common/modules.h deleted file mode 100644 index 78fb9de3..00000000 --- a/arch/linux/common/modules.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#define GET_STR(field_name,ptr) \ - if (!ptr && strstr(tmp[0], field_name)) { \ - ptr = g_markup_escape_text(g_strstrip(tmp[1]), strlen(tmp[1])); \ - g_strfreev(tmp); \ - continue; \ - } - -static gboolean -remove_module_devices(gpointer key, gpointer value, gpointer data) -{ - return g_str_has_prefix(key, "MOD"); -} - -static GHashTable *_module_hash_table = NULL; - -static void -scan_modules_do(void) -{ - FILE *lsmod; - gchar buffer[1024]; - gchar *lsmod_path; - - if (!_module_hash_table) { - _module_hash_table = g_hash_table_new(g_str_hash, g_str_equal); - } - - if (module_list) { - g_free(module_list); - } - - module_list = NULL; - g_hash_table_foreach_remove(moreinfo, remove_module_devices, NULL); - - lsmod_path = find_program("lsmod"); - lsmod = popen(lsmod_path, "r"); - if (!lsmod) { - g_free(lsmod_path); - return; - } - - (void)fgets(buffer, 1024, lsmod); /* Discards the first line */ - - while (fgets(buffer, 1024, lsmod)) { - gchar *buf, *strmodule, *hashkey; - gchar *author = NULL, - *description = NULL, - *license = NULL, - *deps = NULL, *vermagic = NULL, *filename = NULL, modname[64]; - FILE *modi; - glong memory; - - shell_status_pulse(); - - buf = buffer; - - sscanf(buf, "%s %ld", modname, &memory); - - hashkey = g_strdup_printf("MOD%s", modname); - buf = g_strdup_printf("/sbin/modinfo %s 2>/dev/null", modname); - - modi = popen(buf, "r"); - while (fgets(buffer, 1024, modi)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - GET_STR("author", author); - GET_STR("description", description); - GET_STR("license", license); - GET_STR("depends", deps); - GET_STR("vermagic", vermagic); - GET_STR("filename", filename); - - g_strfreev(tmp); - } - pclose(modi); - g_free(buf); - - /* old modutils includes quotes in some strings; strip them */ - /*remove_quotes(modname); - remove_quotes(description); - remove_quotes(vermagic); - remove_quotes(author); - remove_quotes(license); */ - - /* old modutils displays when there's no value for a - given field; this is not desirable in the module name - display, so change it to an empty string */ - if (description && g_str_equal(description, "<none>")) { - g_free(description); - description = g_strdup(""); - - g_hash_table_insert(_module_hash_table, - g_strdup(modname), - g_strdup_printf("Kernel module (%s)", modname)); - } else { - g_hash_table_insert(_module_hash_table, - g_strdup(modname), - g_strdup(description)); - } - - /* append this module to the list of modules */ - module_list = h_strdup_cprintf("$%s$%s=%s\n", - module_list, - hashkey, - modname, - description ? description : ""); - -#define NONE_IF_NULL(var) (var) ? (var) : "N/A" - - /* create the module information string */ - strmodule = g_strdup_printf("[Module Information]\n" - "Path=%s\n" - "Used Memory=%.2fKiB\n" - "[Description]\n" - "Name=%s\n" - "Description=%s\n" - "Version Magic=%s\n" - "[Copyright]\n" - "Author=%s\n" - "License=%s\n", - NONE_IF_NULL(filename), - memory / 1024.0, - modname, - NONE_IF_NULL(description), - NONE_IF_NULL(vermagic), - NONE_IF_NULL(author), - NONE_IF_NULL(license)); - - /* if there are dependencies, append them to that string */ - if (deps && strlen(deps)) { - gchar **tmp = g_strsplit(deps, ",", 0); - - strmodule = h_strconcat(strmodule, - "\n[Dependencies]\n", - g_strjoinv("=\n", tmp), - "=\n", NULL); - g_strfreev(tmp); - g_free(deps); - } - - g_hash_table_insert(moreinfo, hashkey, strmodule); - - g_free(license); - g_free(description); - g_free(author); - g_free(vermagic); - g_free(filename); - } - pclose(lsmod); - - g_free(lsmod_path); -} diff --git a/arch/linux/common/net.h b/arch/linux/common/net.h deleted file mode 100644 index 755c6936..00000000 --- a/arch/linux/common/net.h +++ /dev/null @@ -1,441 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2008 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -/* - * Wireless Extension Example - * http://www.krugle.org/examples/p-OZYzuisV6gyQIaTu/iwconfig.c - */ -static gchar *network_interfaces = NULL, *network_icons = NULL; - -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include - -#ifdef HAS_LINUX_WE -#include -#include -#else -#include -#endif /* HAS_LINUX_WE */ - -typedef struct _NetInfo NetInfo; -struct _NetInfo { - char name[16]; - int mtu; - unsigned char mac[8]; - char ip[16]; - char mask[16]; - char broadcast[16]; - -#ifdef HAS_LINUX_WE - char wi_essid[IW_ESSID_MAX_SIZE + 1]; - int wi_rate; - int wi_mode, wi_status; - gboolean wi_has_txpower; - struct iw_param wi_txpower; - int wi_quality_level, wi_signal_level, wi_noise_level; - gboolean is_wireless; -#endif -}; - -#ifdef HAS_LINUX_WE -const gchar *wi_operation_modes[] = { "Auto", "Ad-Hoc", "Managed", "Master", "Repeater", "Secondary", "Unknown" }; - -void get_wireless_info(int fd, NetInfo *netinfo) -{ - FILE *wrls; - char wbuf[256]; - struct iwreq wi_req; - int r, trash; - - netinfo->is_wireless = FALSE; - - if ((wrls = fopen("/proc/net/wireless", "r"))) { - while (fgets(wbuf, 256, wrls)) { - if (strchr(wbuf, ':') && strstr(wbuf, netinfo->name)) { - gchar *buf1 = wbuf; - - netinfo->is_wireless = TRUE; - - buf1 = strchr(buf1, ':') + 1; - - if (strstr(buf1, ".")) { - sscanf(buf1, "%d %d. %d %d %d %d %d %d %d %d", - &(netinfo->wi_status), - &(netinfo->wi_quality_level), - &(netinfo->wi_signal_level), - &(netinfo->wi_noise_level), - &trash, &trash, &trash, &trash, &trash, &trash); - } else { - sscanf(buf1, "%d %d %d %d %d %d %d %d %d %d", - &(netinfo->wi_status), - &(netinfo->wi_quality_level), - &(netinfo->wi_signal_level), - &(netinfo->wi_noise_level), - &trash, &trash, &trash, &trash, &trash, - &trash); - } - - break; - } - } - fclose(wrls); - } - - if (!netinfo->is_wireless) - return; - - strncpy(wi_req.ifr_name, netinfo->name, 16); - - /* obtain essid */ - wi_req.u.essid.pointer = netinfo->wi_essid; - wi_req.u.essid.length = IW_ESSID_MAX_SIZE + 1; - wi_req.u.essid.flags = 0; - - if ((r = ioctl(fd, SIOCGIWESSID, &wi_req) < 0)) { - strcpy(netinfo->wi_essid, ""); - } else { - netinfo->wi_essid[wi_req.u.essid.length] = '\0'; - } - - /* obtain bit rate */ - if ((r = ioctl(fd, SIOCGIWRATE, &wi_req) < 0)) { - netinfo->wi_rate = 0; - } else { - netinfo->wi_rate = wi_req.u.bitrate.value; - } - - /* obtain operation mode */ - if ((r = ioctl(fd, SIOCGIWMODE, &wi_req) < 0)) { - netinfo->wi_mode = 0; - } else { - if (wi_req.u.mode >= 0 && wi_req.u.mode < 6) { - netinfo->wi_mode = wi_req.u.mode; - } else { - netinfo->wi_mode = 6; - } - } - -#if WIRELESS_EXT >= 10 - /* obtain txpower */ - if ((r = ioctl(fd, SIOCGIWTXPOW, &wi_req) < 0)) { - netinfo->wi_has_txpower = FALSE; - } else { - netinfo->wi_has_txpower = TRUE; - - memcpy(&netinfo->wi_txpower, &wi_req.u.txpower, sizeof(struct iw_param)); - } -#else - netinfo->wi_has_txpower = FALSE; -#endif /* WIRELESS_EXT >= 10 */ -} -#endif /* HAS_LINUX_WE */ - -void get_net_info(char *if_name, NetInfo * netinfo) -{ - struct ifreq ifr; - int fd; - - fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); - - /* IPv4 */ - ifr.ifr_addr.sa_family = AF_INET; - strcpy(netinfo->name, if_name); - - /* MTU */ - strcpy(ifr.ifr_name, if_name); - if (ioctl(fd, SIOCGIFMTU, &ifr) < 0) { - netinfo->mtu = 0; - } else { - netinfo->mtu = ifr.ifr_mtu; - } - - /* HW Address */ - strcpy(ifr.ifr_name, if_name); - if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { - memset(netinfo->mac, 0, 8); - } else { - memcpy(netinfo->mac, ifr.ifr_ifru.ifru_hwaddr.sa_data, 8); - } - - /* IP Address */ - strcpy(ifr.ifr_name, if_name); - if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) { - netinfo->ip[0] = 0; - } else { - sprintf(netinfo->ip, "%s", - inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> - sin_addr)); - } - - /* Mask Address */ - strcpy(ifr.ifr_name, if_name); - if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) { - netinfo->mask[0] = 0; - } else { - sprintf(netinfo->mask, "%s", - inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> - sin_addr)); - } - - /* Broadcast Address */ - strcpy(ifr.ifr_name, if_name); - if (ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0) { - netinfo->broadcast[0] = 0; - } else { - sprintf(netinfo->broadcast, "%s", - inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> - sin_addr)); - } - -#ifdef HAS_LINUX_WE - get_wireless_info(fd, netinfo); -#endif - - shutdown(fd, 0); - close(fd); -} - -static struct { - char *type; - char *label; - char *icon; -} netdev2type[] = { - { "eth", "Ethernet", "network-interface" }, - { "lo", "Loopback", "network" }, - { "ppp", "Point-to-Point", "modem" }, - { "ath", "Wireless", "wireless" }, - { "wlan", "Wireless", "wireless" }, - { "ra", "Wireless", "wireless" }, - { "wl", "Wireless", "wireless" }, - { "tun", "Virtual Point-to-Point (TUN)", "network" }, - { "tap", "Ethernet (TAP)", "network" }, - { "plip", "Parallel Line Internet Protocol", "network" }, - { "irlan", "Infrared", "network" }, - { "slip", "Serial Line Internet Protocol", "network" }, - { "isdn", "Integrated Services Digital Network", "modem" }, - { "sit", "IPv6-over-IPv4 Tunnel", "network" }, - { "vmnet8", "VMWare Virtual Network Interface (NAT)", "computer" }, - { "vmnet", "VMWare Virtual Network Interface", "computer" }, - { "pan", "Personal Area Network (PAN)", "bluetooth" }, - { "bnep", "Bluetooth", "bluetooth" }, - { "br", "Bridge Interface", "network" }, - { NULL, "Unknown", "network" }, -}; - -static void net_get_iface_type(gchar * name, gchar ** type, gchar ** icon, NetInfo *ni) -{ - int i; - -#ifdef HAS_LINUX_WE - if (ni->is_wireless) { - *type = "Wireless"; - *icon = "wireless"; - - return; - } -#endif - - for (i = 0; netdev2type[i].type; i++) { - if (g_str_has_prefix(name, netdev2type[i].type)) - break; - } - - *type = netdev2type[i].label; - *icon = netdev2type[i].icon; -} - -static gboolean -remove_net_devices(gpointer key, gpointer value, gpointer data) -{ - return g_str_has_prefix(key, "NET"); -} - -static void scan_net_interfaces_24(void) -{ - FILE *proc_net; - NetInfo ni; - gchar buffer[256]; - gchar *devid, *detailed; - gdouble recv_bytes; - gdouble recv_errors; - gdouble recv_packets; - - gdouble trans_bytes; - gdouble trans_errors; - gdouble trans_packets; - - if (!g_file_test("/proc/net/dev", G_FILE_TEST_EXISTS)) { - if (network_interfaces) { - g_free(network_interfaces); - network_interfaces = g_strdup("[Network Interfaces]\n" - "None found=\n"); - } - - return; - } - - if (network_interfaces) { - g_free(network_interfaces); - } - - if (network_icons) { - g_free(network_icons); - } - - network_interfaces = g_strdup("[Network Interfaces]\n"); - network_icons = g_strdup(""); - - proc_net = fopen("/proc/net/dev", "r"); - if (!proc_net) - return; - - while (fgets(buffer, 256, proc_net)) { - if (strchr(buffer, ':')) { - gint trash; - gchar ifacename[16]; - gchar *buf = buffer; - gchar *iface_type, *iface_icon; - gint i; - - buf = g_strstrip(buf); - - memset(ifacename, 0, 16); - - for (i = 0; buffer[i] != ':' && i < 16; i++) { - ifacename[i] = buffer[i]; - } - - buf = strchr(buf, ':') + 1; - - /* iface: bytes packets errs drop fifo frame compressed multicast */ - sscanf(buf, "%lf %lf %lf %d %d %d %d %d %lf %lf %lf", - &recv_bytes, &recv_packets, - &recv_errors, &trash, &trash, &trash, &trash, - &trash, &trans_bytes, &trans_packets, &trans_errors); - - gdouble recv_mb = recv_bytes / 1048576.0; - gdouble trans_mb = trans_bytes / 1048576.0; - - get_net_info(ifacename, &ni); - - devid = g_strdup_printf("NET%s", ifacename); - - network_interfaces = - h_strdup_cprintf - ("$%s$%s=%s|%.2lfMiB|%.2lfMiB\n", - network_interfaces, devid, ifacename, ni.ip[0] ? ni.ip : "", - trans_mb, recv_mb); - net_get_iface_type(ifacename, &iface_type, &iface_icon, &ni); - - network_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", - network_icons, devid, - ifacename, iface_icon); - - detailed = g_strdup_printf("[Network Adapter Properties]\n" - "Interface Type=%s\n" - "Hardware Address (MAC)=%02x:%02x:%02x:%02x:%02x:%02x\n" - "MTU=%d\n" - "[Transfer Details]\n" - "Bytes Received=%.0lf (%.2fMiB)\n" - "Bytes Sent=%.0lf (%.2fMiB)\n", - iface_type, - ni.mac[0], ni.mac[1], - ni.mac[2], ni.mac[3], - ni.mac[4], ni.mac[5], - ni.mtu, - recv_bytes, recv_mb, - trans_bytes, trans_mb); - -#ifdef HAS_LINUX_WE - if (ni.is_wireless) { - gchar *txpower; - - if (ni.wi_has_txpower) { - gint mw, dbm; - - if (ni.wi_txpower.flags & IW_TXPOW_MWATT) { - mw = ni.wi_txpower.value; - dbm = (int) ceil(10.0 * log10((double) ni.wi_txpower.value)); - } else { - dbm = ni.wi_txpower.value; - mw = (int) floor(pow(10.0, ((double) dbm / 10.0))); - } - - txpower = g_strdup_printf("%ddBm (%dmW)", dbm, mw); - } else { - txpower = g_strdup("Unknown"); - } - - detailed = h_strdup_cprintf("\n[Wireless Properties]\n" - "Network Name (SSID)=%s\n" - "Bit Rate=%dMb/s\n" - "Transmission Power=%s\n" - "Mode=%s\n" - "Status=%d\n" - "Link Quality=%d\n" - "Signal / Noise=%d / %d\n", - detailed, - ni.wi_essid, - ni.wi_rate / 1000000, - txpower, - wi_operation_modes[ni.wi_mode], - ni.wi_status, - ni.wi_quality_level, - ni.wi_signal_level, - ni.wi_noise_level); - - g_free(txpower); - } -#endif - - if (ni.ip[0] || ni.mask[0] || ni.broadcast[0]) { - detailed = - h_strdup_cprintf("\n[Internet Protocol (IPv4)]\n" - "IP Address=%s\n" "Mask=%s\n" - "Broadcast Address=%s\n", detailed, - ni.ip[0] ? ni.ip : "Not set", - ni.mask[0] ? ni.mask : "Not set", - ni.broadcast[0] ? ni. - broadcast : "Not set"); - } - - g_hash_table_insert(moreinfo, devid, detailed); - } - } - fclose(proc_net); -} - -static void scan_net_interfaces(void) -{ - /* FIXME: See if we're running Linux 2.6 and if /sys is mounted, then use - that instead of /proc/net/dev */ - - /* remove old devices from global device table */ - g_hash_table_foreach_remove(moreinfo, remove_net_devices, NULL); - - scan_net_interfaces_24(); -} diff --git a/arch/linux/common/nfs.h b/arch/linux/common/nfs.h deleted file mode 100644 index 5ae22797..00000000 --- a/arch/linux/common/nfs.h +++ /dev/null @@ -1,29 +0,0 @@ -static gchar *nfs_shares_list = NULL; -void -scan_nfs_shared_directories(void) -{ - FILE *exports; - gchar buf[512]; - - if (nfs_shares_list) { - g_free(nfs_shares_list); - } - - nfs_shares_list = g_strdup(""); - - exports = fopen("/etc/exports", "r"); - if (!exports) - return; - - while (fgets(buf, 512, exports)) { - if (buf[0] != '/') - continue; - - strend(buf, ' '); - strend(buf, '\t'); - - nfs_shares_list = g_strconcat(nfs_shares_list, buf, "=\n", NULL); - } - fclose(exports); -} - diff --git a/arch/linux/common/os.h b/arch/linux/common/os.h deleted file mode 100644 index f3c2c2d8..00000000 --- a/arch/linux/common/os.h +++ /dev/null @@ -1,252 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -static gchar * -get_default_gcc_version(void) -{ - char *buf; - - if (g_spawn_command_line_sync("gcc -v", - NULL, - &buf, - NULL, - NULL)) { - char *return_value; - - if (!(return_value = strstr(buf, "gcc "))) { - goto err; - } - - return_value = strstr(return_value, " ") + 1; - return_value = strstr(return_value, " ") + 1; - - return_value = g_strdup_printf("GNU C Compiler version %s", return_value); - - g_free(buf); - - return return_value; - } - -err: - return g_strdup("Unknown"); -} - -static gchar * -get_libc_version(void) -{ - FILE *libc; - gchar buf[256], *tmp, *p; - - libc = popen("/lib/libc.so.6", "r"); - if (!libc) goto err; - - (void)fgets(buf, 256, libc); - if (pclose(libc)) goto err; - - tmp = strstr(buf, "version "); - if (!tmp) goto err; - - p = strchr(tmp, ','); - if (p) *p = '\0'; - else goto err; - - return g_strdup_printf("GNU C Library version %s (%sstable)", - strchr(tmp, ' ') + 1, - strstr(buf, " stable ") ? "" : "un"); - err: - return g_strdup("Unknown"); -} - -static gchar * -get_os_compiled_date(void) -{ - FILE *procversion; - gchar buf[512]; - - procversion = fopen("/proc/sys/kernel/version", "r"); - if (!procversion) - return g_strdup("Unknown"); - - (void)fgets(buf, 512, procversion); - fclose(procversion); - - return g_strdup(buf); -} - - -#include - -void -detect_desktop_environment(OperatingSystem * os) -{ - const gchar *tmp = g_getenv("GNOME_DESKTOP_SESSION_ID"); - FILE *version; - char vers[16]; - - if (tmp) { - /* FIXME: this might not be true, as the gnome-panel in path - may not be the one that's running. - see where the user's running panel is and run *that* to - obtain the version. */ - version = popen("gnome-about --gnome-version", "r"); - if (version) { - (void)fscanf(version, "Version: %s", vers); - if (pclose(version)) - goto unknown; - } else { - goto unknown; - } - - os->desktop = g_strdup_printf("GNOME %s", vers); - } else if (g_getenv("KDE_FULL_SESSION")) { - - if (g_getenv("KDE_SESSION_VERSION") && strstr(g_getenv("KDE_SESSION_VERSION"),(gchar *)"4")) { - version = popen("kwin --version", "r"); - } else { - version = popen("kcontrol --version", "r"); - } - - if (version) { - char buf[32]; - - (void)fgets(buf, 32, version); - - (void)fscanf(version, "KDE: %s", vers); - if (pclose(version)) - goto unknown; - } else { - goto unknown; - } - - os->desktop = g_strdup_printf("KDE %s", vers); - } else { - unknown: - if (!g_getenv("DISPLAY")) { - os->desktop = g_strdup("Terminal"); - } else { - GdkScreen *screen = gdk_screen_get_default(); - - if (screen && GDK_IS_SCREEN(screen)) { - const gchar *windowman; - - windowman = gdk_x11_screen_get_window_manager_name(screen); - - if (g_str_equal(windowman, "Xfwm4")) { - /* FIXME: check if xprop -root | grep XFCE_DESKTOP_WINDOW - is defined */ - os->desktop = g_strdup("XFCE 4"); - } else { - os->desktop = g_strdup_printf("Unknown (Window Manager: %s)", - windowman); - } - } else { - os->desktop = g_strdup("Unknown"); - } - } - } -} - -static OperatingSystem * -computer_get_os(void) -{ - struct utsname utsbuf; - OperatingSystem *os; - int i; - - os = g_new0(OperatingSystem, 1); - - os->compiled_date = get_os_compiled_date(); - - /* Attempt to get the Distribution name; try using /etc/lsb-release first, - then doing the legacy method (checking for /etc/$DISTRO-release files) */ - if (g_file_test("/etc/lsb-release", G_FILE_TEST_EXISTS)) { - FILE *release; - gchar buffer[128]; - - release = popen("lsb_release -d", "r"); - if (release) { - (void)fgets(buffer, 128, release); - pclose(release); - - os->distro = buffer; - os->distro = g_strdup(os->distro + strlen("Description:\t")); - } - } - - for (i = 0;; i++) { - if (distro_db[i].file == NULL) { - os->distrocode = g_strdup("unk"); - os->distro = g_strdup("Unknown distribution"); - break; - } - - if (g_file_test(distro_db[i].file, G_FILE_TEST_EXISTS)) { - FILE *distro_ver; - char buf[128]; - - distro_ver = fopen(distro_db[i].file, "r"); - (void)fgets(buf, 128, distro_ver); - fclose(distro_ver); - - buf[strlen(buf) - 1] = 0; - - if (!os->distro) { - /* - * HACK: Some Debian systems doesn't include - * the distribuition name in /etc/debian_release, - * so add them here. - */ - if (!strncmp(distro_db[i].codename, "deb", 3) && - ((buf[0] >= '0' && buf[0] <= '9') || buf[0] != 'D')) { - os->distro = g_strdup_printf - ("Debian GNU/Linux %s", buf); - } else { - os->distro = g_strdup(buf); - } - } - - if (g_str_equal(distro_db[i].codename, "ppy")) { - gchar *tmp; - - tmp = g_strdup_printf("Puppy Linux %.2f", atof(os->distro) / 100.0); - g_free(os->distro); - os->distro = tmp; - } - - os->distrocode = g_strdup(distro_db[i].codename); - - break; - } - } - - /* Kernel and hostname info */ - uname(&utsbuf); - os->kernel = g_strdup_printf("%s %s (%s)", utsbuf.sysname, - utsbuf.release, utsbuf.machine); - os->hostname = g_strdup(utsbuf.nodename); - os->language = g_strdup(g_getenv("LC_MESSAGES")); - os->homedir = g_strdup(g_get_home_dir()); - os->username = g_strdup_printf("%s (%s)", - g_get_user_name(), g_get_real_name()); - os->libc = get_libc_version(); - os->gcc = get_default_gcc_version(); - scan_languages(os); - detect_desktop_environment(os); - - return os; -} diff --git a/arch/linux/common/pci.h b/arch/linux/common/pci.h deleted file mode 100644 index 73d87c7f..00000000 --- a/arch/linux/common/pci.h +++ /dev/null @@ -1,244 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* - * TODO: This thing must be rewritten. We really should have a struct with all the - * PCI stuff we'll present to the user, and hash them by the PCI ID - * (domain:bus:device.function). - * This way we'll have ways to better organize the output, instead of relying - * on the order the information appears on lspci's output. - * Also, the "Resources" thing might be better implemented (and we won't need - * copies of information scattered everywhere like we do today). - */ - -GHashTable *_pci_devices = NULL; - -void -__scan_pci(void) -{ - FILE *lspci; - gchar buffer[256], *buf, *strhash = NULL, *strdevice = NULL; - gchar *category = NULL, *name = NULL, *icon, *lspci_path, *command_line = NULL; - gint n = 0, x = 0; - - if ((lspci_path = find_program("lspci")) == NULL) { - goto pci_error; - } else { - command_line = g_strdup_printf("%s -v", lspci_path); - } - - if (!_pci_devices) { - _pci_devices = g_hash_table_new(g_str_hash, g_str_equal); - } - - buf = g_build_filename(g_get_home_dir(), ".hardinfo", "pci.ids", NULL); - if (!g_file_test(buf, G_FILE_TEST_EXISTS)) { - DEBUG("using system-provided PCI IDs"); - g_free(buf); - if (!(lspci = popen(command_line, "r"))) { - goto pci_error; - } - } else { - gchar *tmp; - - tmp = g_strdup_printf("%s -i '%s'", command_line, buf); - g_free(buf); - buf = tmp; - - DEBUG("using updated PCI IDs (from %s)", buf); - if (!(lspci = popen(tmp, "r"))) { - g_free(buf); - goto pci_error; - } else { - g_free(buf); - } - } - - while (fgets(buffer, 256, lspci)) { - buf = g_strstrip(buffer); - - if (!strncmp(buf, "Flags", 5)) { - gint irq = 0, freq = 0, latency = 0, i; - gchar **list; - gboolean bus_master; - - buf += 7; - - bus_master = FALSE; - - list = g_strsplit(buf, ", ", 10); - for (i = 0; i <= 10; i++) { - if (!list[i]) - break; - - if (!strncmp(list[i], "IRQ", 3)) - sscanf(list[i], "IRQ %d", &irq); - else if (strstr(list[i], "Mhz")) - sscanf(list[i], "%dMhz", &freq); - else if (!strncmp(list[i], "bus master", 10)) - bus_master = TRUE; - else if (!strncmp(list[i], "latency", 7)) - sscanf(list[i], "latency %d", &latency); - } - g_strfreev(list); - - if (irq) - strdevice = h_strdup_cprintf("IRQ=%d\n", strdevice, irq); - if (freq) - strdevice = h_strdup_cprintf("Frequency=%dMHz\n", strdevice, freq); - if (latency) - strdevice = h_strdup_cprintf("Latency=%d\n", strdevice, latency); - - strdevice = h_strdup_cprintf("Bus Master=%s\n", strdevice, bus_master ? "Yes" : "No"); - } else if (!strncmp(buf, "Kernel modules", 14)) { - WALK_UNTIL(' '); - WALK_UNTIL(':'); - buf++; - - strdevice = h_strdup_cprintf("Kernel modules=%s\n", strdevice, buf); - } else if (!strncmp(buf, "Subsystem", 9)) { - WALK_UNTIL(' '); - buf++; - const gchar *oem_vendor_url = vendor_get_url(buf); - if (oem_vendor_url) - strdevice = h_strdup_cprintf("OEM Vendor=%s (%s)\n", - strdevice, - vendor_get_name(buf), - oem_vendor_url); - } else if (!strncmp(buf, "Capabilities", 12) - && !strstr(buf, "only to root") && - !strstr(buf, "access denied")) { - WALK_UNTIL(' '); - WALK_UNTIL(']'); - buf++; - strdevice = h_strdup_cprintf("Capability#%d=%s\n", strdevice, ++x, buf); - } else if (!strncmp(buf, "Memory at", 9) && strstr(buf, "[size=")) { - gint mem; - gchar unit; - gboolean prefetch; - gboolean _32bit; - - prefetch = strstr(buf, "non-prefetchable") ? FALSE : TRUE; - _32bit = strstr(buf, "32-bit") ? TRUE : FALSE; - - WALK_UNTIL('['); - sscanf(buf, "[size=%d%c", &mem, &unit); - - strdevice = h_strdup_cprintf("Memory#%d=%d%cB (%s%s)\n", - strdevice, ++x, - mem, - (unit == ']') ? ' ' : unit, - _32bit ? "32-bit, " : "", - prefetch ? "prefetchable" : - "non-prefetchable"); - - } else if (!strncmp(buf, "I/O ports at", 12)) { - guint io_addr, io_size; - - sscanf(buf, "I/O ports at %x [size=%d]", &io_addr, &io_size); - - strdevice = - h_strdup_cprintf("I/O ports at#%d=0x%x - 0x%x\n", - strdevice, ++x, io_addr, - io_addr + io_size - 1); - } else if ((buf[0] >= '0' && buf[0] <= '9') && (buf[4] == ':' || buf[2] == ':')) { - gint bus, device, function, domain; - gpointer start, end; - - if (strdevice != NULL && strhash != NULL) { - g_hash_table_insert(moreinfo, strhash, strdevice); - g_free(category); - g_free(name); - } - - if (buf[4] == ':') { - sscanf(buf, "%x:%x:%x.%d", &domain, &bus, &device, &function); - } else { - /* lspci without domain field */ - sscanf(buf, "%x:%x.%x", &bus, &device, &function); - domain = 0; - } - - WALK_UNTIL(' '); - - start = buf; - - WALK_UNTIL(':'); - end = buf + 1; - *buf = 0; - - buf = start + 1; - category = g_strdup(buf); - - buf = end; - start = buf; - WALK_UNTIL('('); - *buf = 0; - buf = start + 1; - - if (strstr(category, "RAM memory")) icon = "mem"; - else if (strstr(category, "Multimedia")) icon = "media"; - else if (strstr(category, "USB")) icon = "usb"; - else icon = "pci"; - - name = g_strdup(buf); - g_hash_table_insert(_pci_devices, - g_strdup_printf("0000:%02x:%02x.%x", bus, device, function), - name); - - strhash = g_strdup_printf("PCI%d", n); - strdevice = g_strdup_printf("[Device Information]\n" - "Name=%s\n" - "Class=%s\n" - "Domain=%d\n" - "Bus, device, function=%d, %d, %d\n", - name, category, domain, bus, - device, function); - - const gchar *url = vendor_get_url(name); - if (url) { - strdevice = h_strdup_cprintf("Vendor=%s (%s)\n", - strdevice, - vendor_get_name(name), - url); - } - - g_hash_table_insert(_pci_devices, - g_strdup_printf("0000:%02x:%02x.%x", bus, device, function), - g_strdup(name)); - - pci_list = h_strdup_cprintf("$PCI%d$%s=%s\n", pci_list, n, category, name); - - n++; - } - } - - if (pclose(lspci)) { -pci_error: - /* error (no pci, perhaps?) */ - pci_list = g_strconcat(pci_list, "No PCI devices found=\n", NULL); - } else if (strhash) { - /* insert the last device */ - g_hash_table_insert(moreinfo, strhash, strdevice); - g_free(category); - g_free(name); - } - - g_free(lspci_path); - g_free(command_line); -} diff --git a/arch/linux/common/resources.h b/arch/linux/common/resources.h deleted file mode 100644 index 20db65e9..00000000 --- a/arch/linux/common/resources.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2008 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -gchar *_resources = NULL; - -#if GLIB_CHECK_VERSION(2,14,0) -static GRegex *_regex_pci = NULL, - *_regex_module = NULL; - -static gchar *_resource_obtain_name(gchar *name) -{ - gchar *temp; - - if (!_regex_pci && !_regex_module) { - _regex_pci = g_regex_new("^[0-9a-fA-F]{4}:[0-9a-fA-F]{2}:" - "[0-9a-fA-F]{2}\\.[0-9a-fA-F]{1}$", - 0, 0, NULL); - _regex_module = g_regex_new("^[0-9a-zA-Z\\_\\-]+$", 0, 0, NULL); - } - - name = g_strstrip(name); - - if (g_regex_match(_regex_pci, name, 0, NULL)) { - temp = module_call_method_param("devices::getPCIDeviceDescription", name); - if (temp) { - return temp; - } - } else if (g_regex_match(_regex_module, name, 0, NULL)) { - temp = module_call_method_param("computer::getKernelModuleDescription", name); - if (temp) { - return temp; - } - } - - return g_strdup(name); -} -#else -static gchar *_resource_obtain_name(gchar *name) -{ - return g_strdup(name); -} -#endif - -void scan_device_resources(gboolean reload) -{ - SCAN_START(); - FILE *io; - gchar buffer[256]; - gint i; - - struct { - gchar *file; - gchar *description; - } resources[] = { - { "/proc/ioports", "[I/O Ports]\n" }, - { "/proc/iomem", "[Memory]\n" }, - { "/proc/dma", "[DMA]\n" } - }; - - g_free(_resources); - _resources = g_strdup(""); - - for (i = 0; i < G_N_ELEMENTS(resources); i++) { - if ((io = fopen(resources[i].file, "r"))) { - _resources = h_strconcat(_resources, resources[i].description, NULL); - - while (fgets(buffer, 256, io)) { - gchar **temp = g_strsplit(buffer, ":", 2); - gchar *name = _resource_obtain_name(temp[1]); - - _resources = h_strdup_cprintf("%s=%s\n", _resources, - temp[0], name); - - g_strfreev(temp); - g_free(name); - } - - fclose(io); - } - } - - SCAN_END(); -} - -gchar *callback_device_resources(void) -{ - return _resources; -} diff --git a/arch/linux/common/samba.h b/arch/linux/common/samba.h deleted file mode 100644 index 65cdc890..00000000 --- a/arch/linux/common/samba.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -static gchar *smb_shares_list = NULL; -void -scan_samba_shared_directories(void) -{ - GKeyFile *keyfile; - GError *error = NULL; - gchar **groups; - gchar *smbconf; - gsize length = -1; - gint i = 0; - - if (smb_shares_list) { - g_free(smb_shares_list); - } - - keyfile = g_key_file_new(); - - if (!g_file_get_contents("/etc/samba/smb.conf", &smbconf, &length, &error) || length == 0) { - smb_shares_list = g_strdup("Cannot open /etc/samba/smb.conf=\n"); - if (error) - g_error_free(error); - goto cleanup; - } - - gchar *_smbconf = smbconf; - for (; *_smbconf; _smbconf++) - if (*_smbconf == ';') *_smbconf = '\0'; - - if (!g_key_file_load_from_data(keyfile, smbconf, length, 0, &error)) { - smb_shares_list = g_strdup("Cannot parse smb.conf=\n"); - if (error) - g_error_free(error); - goto cleanup; - } - - smb_shares_list = g_strdup(""); - - groups = g_key_file_get_groups(keyfile, NULL); - while (groups[i]) { - if (g_key_file_has_key(keyfile, groups[i], "path", NULL) && - g_key_file_has_key(keyfile, groups[i], "available", NULL)) { - - gchar *available = g_key_file_get_string(keyfile, groups[i], "available", NULL); - - if (g_str_equal(available, "yes")) { - gchar *path = g_key_file_get_string(keyfile, groups[i], "path", NULL); - smb_shares_list = g_strconcat(smb_shares_list, groups[i], "=", - path, "\n", NULL); - g_free(path); - } - - g_free(available); - } - - i++; - } - - g_strfreev(groups); - - cleanup: - g_key_file_free(keyfile); - g_free(smbconf); -} - diff --git a/arch/linux/common/sensors.h b/arch/linux/common/sensors.h deleted file mode 100644 index 17637764..00000000 --- a/arch/linux/common/sensors.h +++ /dev/null @@ -1,377 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -static gchar *sensors = NULL; -static GHashTable *sensor_labels = NULL; -static GHashTable *sensor_compute = NULL; - -static void read_sensor_labels(gchar * driver) -{ - FILE *conf; - gchar buf[256], *line, *p; - gboolean lock = FALSE; - gint i; - - sensor_labels = g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, g_free); - sensor_compute = g_hash_table_new(g_str_hash, g_str_equal); - - /* Try to open lm-sensors config file sensors3.conf */ - conf = fopen("/etc/sensors3.conf", "r"); - - /* If it fails, try to open sensors.conf */ - if (!conf) conf = fopen("/etc/sensors.conf", "r"); - - if (!conf) { - /* Cannot open config file. */ - return; - } - - while (fgets(buf, 256, conf)) { - line = buf; - - remove_linefeed(line); - strend(line, '#'); - - if (*line == '\0') { - continue; - } else if (lock && strstr(line, "label")) { /* label lines */ - gchar **names = g_strsplit(strstr(line, "label") + 5, " ", 0); - gchar *name = NULL, *value = NULL; - - for (i = 0; names[i]; i++) { - if (names[i][0] == '\0') - continue; - - if (!name) - name = g_strdup(names[i]); - else if (!value) - value = g_strdup(names[i]); - else - value = g_strconcat(value, " ", names[i], NULL); - } - - remove_quotes(value); - g_hash_table_insert(sensor_labels, name, value); - - g_strfreev(names); - } else if (lock && strstr(line, "ignore")) { /* ignore lines */ - p = strstr(line, "ignore") + 6; - if (!strchr(p, ' ')) - continue; - - while (*p == ' ') - p++; - g_hash_table_insert(sensor_labels, g_strdup(p), "ignore"); - } else if (lock && strstr(line, "compute")) { /* compute lines */ - gchar **formulas = - g_strsplit(strstr(line, "compute") + 7, " ", 0); - gchar *name = NULL, *formula = NULL; - - for (i = 0; formulas[i]; i++) { - if (formulas[i][0] == '\0') - continue; - if (formulas[i][0] == ',') - break; - - if (!name) - name = g_strdup(formulas[i]); - else if (!formula) - formula = g_strdup(formulas[i]); - else - formula = g_strconcat(formula, formulas[i], NULL); - } - - g_strfreev(formulas); - g_hash_table_insert(sensor_compute, name, - math_string_to_postfix(formula)); - } else if (g_str_has_prefix(line, "chip")) { /* chip lines (delimiter) */ - if (lock == FALSE) { - gchar **chips = g_strsplit(line, " ", 0); - - for (i = 1; chips[i]; i++) { - strend(chips[i], '*'); - - if (g_str_has_prefix(chips[i] + 1, driver)) { - lock = TRUE; - break; - } - } - - g_strfreev(chips); - } else { - break; - } - } - } - - fclose(conf); -} - -static gchar *get_sensor_label(gchar * sensor) -{ - gchar *ret; - - ret = g_hash_table_lookup(sensor_labels, sensor); - if (!ret) - ret = g_strdup(sensor); - else - ret = g_strdup(ret); - - return ret; -} - -static float adjust_sensor(gchar * name, float value) -{ - GSList *postfix; - - postfix = g_hash_table_lookup(sensor_compute, name); - if (!postfix) - return value; - - return math_postfix_eval(postfix, value); -} - - -static void read_sensors_hwmon(void) -{ - int hwmon, count; - gchar *path_hwmon, *path_sensor, *tmp, *driver, *name, *mon; - hwmon = 0; - - path_hwmon = g_strdup_printf("/sys/class/hwmon/hwmon%d/device/", hwmon); - while (g_file_test(path_hwmon, G_FILE_TEST_EXISTS)) { - tmp = g_strdup_printf("%sdriver", path_hwmon); - driver = g_file_read_link(tmp, NULL); - g_free(tmp); - - tmp = g_path_get_basename(driver); - g_free(driver); - driver = tmp; - - if (!sensor_labels) { - read_sensor_labels(driver); - } - - sensors = g_strconcat(sensors, "[Cooling Fans]\n", NULL); - for (count = 1;; count++) { - path_sensor = - g_strdup_printf("%sfan%d_input", path_hwmon, count); - if (!g_file_get_contents(path_sensor, &tmp, NULL, NULL)) { - g_free(path_sensor); - break; - } - - mon = g_strdup_printf("fan%d", count); - name = get_sensor_label(mon); - if (!g_str_equal(name, "ignore")) { - sensors = h_strdup_cprintf("%s=%.0fRPM\n", - sensors, name, - adjust_sensor(mon, atof(tmp))); - } - - g_free(name); - g_free(mon); - g_free(tmp); - g_free(path_sensor); - } - - sensors = g_strconcat(sensors, "[Temperatures]\n", NULL); - for (count = 1;; count++) { - path_sensor = - g_strdup_printf("%stemp%d_input", path_hwmon, count); - if (!g_file_get_contents(path_sensor, &tmp, NULL, NULL)) { - g_free(path_sensor); - break; - } - - mon = g_strdup_printf("temp%d", count); - name = get_sensor_label(mon); - if (!g_str_equal(name, "ignore")) { - sensors = h_strdup_cprintf("%s=%.2f\302\260C\n", - sensors, name, - adjust_sensor(mon, - atof(tmp) / - 1000.0)); - } - - g_free(tmp); - g_free(name); - g_free(path_sensor); - g_free(mon); - } - - sensors = g_strconcat(sensors, "[Voltage Values]\n", NULL); - for (count = 0;; count++) { - path_sensor = - g_strdup_printf("%sin%d_input", path_hwmon, count); - if (!g_file_get_contents(path_sensor, &tmp, NULL, NULL)) { - g_free(path_sensor); - break; - } - - - mon = g_strdup_printf("in%d", count); - name = get_sensor_label(mon); - if (!g_str_equal(name, "ignore")) { - sensors = h_strdup_cprintf("%s=%.3fV\n", - sensors, name, - adjust_sensor(mon, - atof(tmp) / - 1000.0)); - } - - g_free(tmp); - g_free(mon); - g_free(name); - g_free(path_sensor); - } - - g_free(path_hwmon); - g_free(driver); - path_hwmon = - g_strdup_printf("/sys/class/hwmon/hwmon%d/device/", ++hwmon); - } - - g_free(path_hwmon); - -} - -static void read_sensors_acpi(void) -{ - const gchar *path_tz = "/proc/acpi/thermal_zone"; - - if (g_file_test(path_tz, G_FILE_TEST_EXISTS)) { - GDir *tz; - - if ((tz = g_dir_open(path_tz, 0, NULL))) { - const gchar *entry; - gchar *temp = g_strdup(""); - - - while ((entry = g_dir_read_name(tz))) { - gchar *path = - g_strdup_printf("%s/%s/temperature", path_tz, entry); - gchar *contents; - - if (g_file_get_contents(path, &contents, NULL, NULL)) { - int temperature; - - sscanf(contents, "temperature: %d C", &temperature); - - temp = h_strdup_cprintf("\n%s=%d\302\260C\n", - temp, entry, temperature); - - g_free(contents); - } - } - - if (*temp != '\0') - sensors = - h_strdup_cprintf("\n[ACPI Thermal Zone]\n%s", - sensors, temp); - - g_dir_close(tz); - } - } - -} - -static void read_sensors_omnibook(void) -{ - const gchar *path_ob = "/proc/omnibook/temperature"; - gchar *contents; - - if (g_file_get_contents(path_ob, &contents, NULL, NULL)) { - int temperature; - - sscanf(contents, "CPU temperature: %d C", &temperature); - - sensors = h_strdup_cprintf("\n[Omnibook]\n" - "CPU temperature=%d\302\260C\n", - sensors, temperature); - - g_free(contents); - } -} - -static void read_sensors_hddtemp(void) -{ - Socket *s; - static gchar *old = NULL; - gchar buffer[1024]; - gint len = 0; - - if ((s = sock_connect("127.0.0.1", 7634))) { - while (!len) - len = sock_read(s, buffer, sizeof(buffer)); - sock_close(s); - - if (len > 2 && buffer[0] == '|' && buffer[1] == '/') { - gchar **disks; - int i; - - if (old) - g_free(old); - - old = g_strdup("[Hard Disk Temperature]\n"); - - disks = g_strsplit(buffer, "\n", 0); - for (i = 0; disks[i]; i++) { - gchar **fields = g_strsplit(disks[i] + 1, "|", 5); - - /* - * 0 -> /dev/hda - * 1 -> FUJITSU MHV2080AH - * 2 -> 41 - * 3 -> C - */ - old = h_strdup_cprintf("\n%s (%s)=%s\302\260%s\n", - old, - fields[1], fields[0], - fields[2], fields[3]); - - g_strfreev(fields); - } - - g_strfreev(disks); - } - } else { - g_free(old); - old = NULL; - } - - if (old) { - sensors = g_strconcat(sensors, "\n", old, NULL); - } -} - -static void __scan_sensors(void) -{ - if (sensors) - g_free(sensors); - - sensors = g_strdup(""); - - read_sensors_hwmon(); - read_sensors_acpi(); - read_sensors_omnibook(); - read_sensors_hddtemp(); - - /* FIXME: Add support for ibm acpi and more sensors */ -} diff --git a/arch/linux/common/storage.h b/arch/linux/common/storage.h deleted file mode 100644 index 06593a09..00000000 --- a/arch/linux/common/storage.h +++ /dev/null @@ -1,371 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -static gchar *storage_icons = NULL; - -static gboolean -remove_scsi_devices(gpointer key, gpointer value, gpointer data) -{ - return g_str_has_prefix(key, "SCSI"); -} - -/* SCSI support by Pascal F.Martin */ -void -__scan_scsi_devices(void) -{ - FILE *proc_scsi; - gchar buffer[256], *buf; - gint n = 0; - gint scsi_controller; - gint scsi_channel; - gint scsi_id; - gint scsi_lun; - gchar *vendor = NULL, *revision = NULL, *model = NULL; - gchar *scsi_storage_list; - - /* remove old devices from global device table */ - g_hash_table_foreach_remove(moreinfo, remove_scsi_devices, NULL); - - if (!g_file_test("/proc/scsi/scsi", G_FILE_TEST_EXISTS)) - return; - - scsi_storage_list = g_strdup("\n[SCSI Disks]\n"); - - proc_scsi = fopen("/proc/scsi/scsi", "r"); - while (fgets(buffer, 256, proc_scsi)) { - buf = g_strstrip(buffer); - if (!strncmp(buf, "Host: scsi", 10)) { - sscanf(buf, - "Host: scsi%d Channel: %d Id: %d Lun: %d", - &scsi_controller, &scsi_channel, &scsi_id, &scsi_lun); - - n++; - } else if (!strncmp(buf, "Vendor: ", 8)) { - buf[17] = '\0'; - buf[41] = '\0'; - buf[53] = '\0'; - - vendor = g_strdup(g_strstrip(buf + 8)); - model = g_strdup_printf("%s %s", vendor, g_strstrip(buf + 24)); - revision = g_strdup(g_strstrip(buf + 46)); - } else if (!strncmp(buf, "Type: ", 8)) { - char *p; - gchar *type = NULL, *icon = NULL; - - if (!(p = strstr(buf, "ANSI SCSI revision"))) { - p = strstr(buf, "ANSI SCSI revision"); - } - - if (p != NULL) { - while (*(--p) == ' '); - *(++p) = 0; - - static struct { - char *type; - char *label; - char *icon; - } type2icon[] = { - { "Direct-Access", "Disk", "hdd"}, - { "Sequential-Access", "Tape", "tape"}, - { "Printer", "Printer", "lpr"}, - { "WORM", "CD-ROM", "cdrom"}, - { "CD-ROM", "CD-ROM", "cdrom"}, - { "Scanner", "Scanner", "scanner"}, - { "Flash Disk", "USB Flash Disk", "usbfldisk" }, - { NULL, "Generic", "scsi"} - }; - int i; - - if (strstr(model, "Flash Disk")) { - type = "Flash Disk"; - icon = "usbfldisk"; - } else { - for (i = 0; type2icon[i].type != NULL; i++) - if (g_str_equal(buf + 8, type2icon[i].type)) - break; - - type = type2icon[i].label; - icon = type2icon[i].icon; - } - } - - gchar *devid = g_strdup_printf("SCSI%d", n); - scsi_storage_list = h_strdup_cprintf("$%s$%s=\n", scsi_storage_list, devid, model); - storage_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", storage_icons, devid, model, icon); - - gchar *strhash = g_strdup_printf("[Device Information]\n" - "Model=%s\n", model); - - const gchar *url = vendor_get_url(model); - if (url) { - strhash = h_strdup_cprintf("Vendor=%s (%s)\n", - strhash, - vendor_get_name(model), - url); - } else { - strhash = h_strdup_cprintf("Vendor=%s\n", - strhash, - vendor_get_name(model)); - } - - strhash = h_strdup_cprintf("Type=%s\n" - "Revision=%s\n" - "[SCSI Controller]\n" - "Controller=scsi%d\n" - "Channel=%d\n" - "ID=%d\n" "LUN=%d\n", - strhash, - type, - revision, - scsi_controller, - scsi_channel, - scsi_id, - scsi_lun); - g_hash_table_insert(moreinfo, devid, strhash); - - g_free(model); - g_free(revision); - g_free(vendor); - } - } - fclose(proc_scsi); - - if (n) { - storage_list = h_strconcat(storage_list, scsi_storage_list, NULL); - g_free(scsi_storage_list); - } -} - -static gboolean -remove_ide_devices(gpointer key, gpointer value, gpointer data) -{ - return g_str_has_prefix(key, "IDE"); -} - -void -__scan_ide_devices(void) -{ - FILE *proc_ide; - gchar *device, iface, *model, *media, *pgeometry = NULL, *lgeometry = - NULL; - gint n = 0, i = 0, cache, nn = 0; - gchar *capab = NULL, *speed = NULL, *driver = NULL, *ide_storage_list; - - /* remove old devices from global device table */ - g_hash_table_foreach_remove(moreinfo, remove_ide_devices, NULL); - - ide_storage_list = g_strdup("\n[IDE Disks]\n"); - - iface = 'a'; - for (i = 0; i <= 16; i++) { - device = g_strdup_printf("/proc/ide/hd%c/model", iface); - if (g_file_test(device, G_FILE_TEST_EXISTS)) { - gchar buf[128]; - - cache = 0; - - proc_ide = fopen(device, "r"); - (void)fgets(buf, 128, proc_ide); - fclose(proc_ide); - - buf[strlen(buf) - 1] = 0; - - model = g_strdup(buf); - - g_free(device); - - device = g_strdup_printf("/proc/ide/hd%c/media", iface); - proc_ide = fopen(device, "r"); - (void)fgets(buf, 128, proc_ide); - fclose(proc_ide); - buf[strlen(buf) - 1] = 0; - - media = g_strdup(buf); - if (g_str_equal(media, "cdrom")) { - /* obtain cd-rom drive information from cdrecord */ - GTimer *timer; - gchar *tmp = g_strdup_printf("cdrecord dev=/dev/hd%c -prcap 2>/dev/stdout", iface); - FILE *prcap; - - if ((prcap = popen(tmp, "r"))) { - /* we need a timeout so cdrecord does not try to get information on cd drives - with inserted media, which is not possible currently. half second should be - enough. */ - timer = g_timer_new(); - g_timer_start(timer); - - while (fgets(buf, 128, prcap) && g_timer_elapsed(timer, NULL) < 0.5) { - if (g_str_has_prefix(buf, " Does")) { - if (g_str_has_suffix(buf, "media\n") && !strstr(buf, "speed")) { - gchar *media_type = g_strstrip(strstr(buf, "Does ")); - gchar **ttmp = g_strsplit(media_type, " ", 0); - - capab = h_strdup_cprintf("\nCan %s#%d=%s\n", - capab, - ttmp[1], ++nn, ttmp[2]); - - g_strfreev(ttmp); - } else if (strstr(buf, "Buffer-Underrun-Free")) { - capab = h_strdup_cprintf("\nSupports BurnProof=%s\n", - capab, - strstr(buf, "Does not") ? "No" : "Yes"); - } else if (strstr(buf, "multi-session")) { - capab = h_strdup_cprintf("\nCan read multi-session CDs=%s\n", - capab, - strstr(buf, "Does not") ? "No" : "Yes"); - } else if (strstr(buf, "audio CDs")) { - capab = h_strdup_cprintf("\nCan play audio CDs=%s\n", - capab, - strstr(buf, "Does not") ? "No" : "Yes"); - } else if (strstr(buf, "PREVENT/ALLOW")) { - capab = h_strdup_cprintf("\nCan lock media=%s\n", - capab, - strstr(buf, "Does not") ? "No" : "Yes"); - } - } else if ((strstr(buf, "read") || strstr(buf, "write")) && strstr(buf, "kB/s")) { - speed = g_strconcat(speed ? speed : "", - strreplace(g_strstrip(buf), ":", '='), - "\n", NULL); - } else if (strstr(buf, "Device seems to be")) { - driver = g_strdup_printf("Driver=%s\n", strchr(buf, ':') + 1); - } - } - - pclose(prcap); - g_timer_destroy(timer); - } - - g_free(tmp); - } - g_free(device); - - device = g_strdup_printf("/proc/ide/hd%c/cache", iface); - if (g_file_test(device, G_FILE_TEST_EXISTS)) { - proc_ide = fopen(device, "r"); - (void)fscanf(proc_ide, "%d", &cache); - fclose(proc_ide); - } - g_free(device); - - device = g_strdup_printf("/proc/ide/hd%c/geometry", iface); - if (g_file_test(device, G_FILE_TEST_EXISTS)) { - gchar *tmp; - - proc_ide = fopen(device, "r"); - - (void)fgets(buf, 64, proc_ide); - for (tmp = buf; *tmp; tmp++) { - if (*tmp >= '0' && *tmp <= '9') - break; - } - - pgeometry = g_strdup(g_strstrip(tmp)); - - (void)fgets(buf, 64, proc_ide); - for (tmp = buf; *tmp; tmp++) { - if (*tmp >= '0' && *tmp <= '9') - break; - } - lgeometry = g_strdup(g_strstrip(tmp)); - - fclose(proc_ide); - } - g_free(device); - - n++; - - gchar *devid = g_strdup_printf("IDE%d", n); - - ide_storage_list = h_strdup_cprintf("$%s$%s=\n", ide_storage_list, - devid, model); - storage_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", storage_icons, devid, - model, g_str_equal(media, "cdrom") ? \ - "cdrom" : "hdd"); - - gchar *strhash = g_strdup_printf("[Device Information]\n" - "Model=%s\n", - model); - - const gchar *url = vendor_get_url(model); - - if (url) { - strhash = h_strdup_cprintf("Vendor=%s (%s)\n", - strhash, - vendor_get_name(model), - url); - } else { - strhash = h_strdup_cprintf("Vendor=%s\n", - strhash, - vendor_get_name(model)); - } - - strhash = h_strdup_cprintf("Device Name=hd%c\n" - "Media=%s\n" - "Cache=%dkb\n", - strhash, - iface, - media, - cache); - if (driver) { - strhash = h_strdup_cprintf("%s\n", strhash, driver); - - g_free(driver); - driver = NULL; - } - - if (pgeometry && lgeometry) { - strhash = h_strdup_cprintf("[Geometry]\n" - "Physical=%s\n" - "Logical=%s\n", - strhash, pgeometry, lgeometry); - - g_free(pgeometry); - pgeometry = NULL; - g_free(lgeometry); - lgeometry = NULL; - } - - if (capab) { - strhash = h_strdup_cprintf("[Capabilities]\n%s", strhash, capab); - - g_free(capab); - capab = NULL; - } - - if (speed) { - strhash = h_strdup_cprintf("[Speeds]\n%s", strhash, speed); - - g_free(speed); - speed = NULL; - } - - g_hash_table_insert(moreinfo, devid, strhash); - - g_free(model); - model = g_strdup(""); - } else - g_free(device); - - iface++; - } - - if (n) { - storage_list = h_strconcat(storage_list, ide_storage_list, NULL); - g_free(ide_storage_list); - } -} diff --git a/arch/linux/common/uptime.h b/arch/linux/common/uptime.h deleted file mode 100644 index 8fdc3a27..00000000 --- a/arch/linux/common/uptime.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -static UptimeInfo * -computer_get_uptime(void) -{ - UptimeInfo *ui = g_new0(UptimeInfo, 1); - FILE *procuptime; - gulong minutes; - - if ((procuptime = fopen("/proc/uptime", "r")) != NULL) { - (void)fscanf(procuptime, "%lu", &minutes); - ui->minutes = minutes / 60; - fclose(procuptime); - } else { - return NULL; - } - - ui->hours = ui->minutes / 60; - ui->minutes %= 60; - ui->days = ui->hours / 24; - ui->hours %= 24; - - return ui; -} - -static gchar * -computer_get_formatted_uptime() -{ - UptimeInfo *ui; - gchar *tmp; - - ui = computer_get_uptime(); - - /* FIXME: Use ngettext */ -#define plural(x) ((x > 1) ? "s" : "") - - if (ui->days < 1) { - if (ui->hours < 1) { - tmp = - g_strdup_printf("%d minute%s", ui->minutes, - plural(ui->minutes)); - } else { - tmp = - g_strdup_printf("%d hour%s, %d minute%s", ui->hours, - plural(ui->hours), ui->minutes, - plural(ui->minutes)); - } - } else { - tmp = - g_strdup_printf("%d day%s, %d hour%s and %d minute%s", - ui->days, plural(ui->days), ui->hours, - plural(ui->hours), ui->minutes, - plural(ui->minutes)); - } - - g_free(ui); - return tmp; -} diff --git a/arch/linux/common/usb.h b/arch/linux/common/usb.h deleted file mode 100644 index cb939ff8..00000000 --- a/arch/linux/common/usb.h +++ /dev/null @@ -1,248 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2008 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -/* - * FIXME: - * - listing with sysfs does not generate device hierarchy - */ -static gboolean -remove_usb_devices(gpointer key, gpointer value, gpointer data) -{ - return g_str_has_prefix(key, "USB"); -} - -static gchar *usb_list = NULL; - -void __scan_usb_sysfs_add_device(gchar * endpoint, int n) -{ - gchar *manufacturer, *product, *mxpwr, *tmp, *strhash; - gint bus, classid, vendor, prodid; - gfloat version, speed; - - classid = h_sysfs_read_int(endpoint, "bDeviceClass"); - vendor = h_sysfs_read_int(endpoint, "idVendor"); - prodid = h_sysfs_read_int(endpoint, "idProduct"); - bus = h_sysfs_read_int(endpoint, "busnum"); - speed = h_sysfs_read_float(endpoint, "speed"); - version = h_sysfs_read_float(endpoint, "version"); - - if (!(mxpwr = h_sysfs_read_string(endpoint, "bMaxPower"))) { - mxpwr = g_strdup("0 mA"); - } - - if (!(manufacturer = h_sysfs_read_string(endpoint, "manufacturer"))) { - manufacturer = g_strdup("Unknown"); - } - - if (!(product = h_sysfs_read_string(endpoint, "product"))) { - if (classid == 9) { - product = g_strdup_printf("USB %.2f Hub", version); - } else { - product = g_strdup_printf("Unknown USB %.2f Device (class %d)", version, classid); - } - } - - const gchar *url = vendor_get_url(manufacturer); - if (url) { - tmp = g_strdup_printf("%s (%s)", vendor_get_name(manufacturer), url); - - g_free(manufacturer); - manufacturer = tmp; - } - - tmp = g_strdup_printf("USB%d", n); - usb_list = h_strdup_cprintf("$%s$%s=\n", usb_list, tmp, product); - - strhash = g_strdup_printf("[Device Information]\n" - "Product=%s\n" - "Manufacturer=%s\n" - "Speed=%.2fMbit/s\n" - "Max Current=%s\n" - "[Misc]\n" - "USB Version=%.2f\n" - "Class=0x%x\n" - "Vendor=0x%x\n" - "Product ID=0x%x\n" - "Bus=%d\n", - product, - manufacturer, - speed, - mxpwr, - version, classid, vendor, prodid, bus); - - g_hash_table_insert(moreinfo, tmp, strhash); - - g_free(manufacturer); - g_free(product); - g_free(mxpwr); -} - -void __scan_usb_sysfs(void) -{ - GDir *sysfs; - gchar *filename; - const gchar *sysfs_path = "/sys/class/usb_endpoint"; - gint usb_device_number = 0; - - if (!(sysfs = g_dir_open(sysfs_path, 0, NULL))) { - return; - } - - if (usb_list) { - g_hash_table_foreach_remove(moreinfo, remove_usb_devices, NULL); - g_free(usb_list); - } - usb_list = g_strdup("[USB Devices]\n"); - - while ((filename = (gchar *) g_dir_read_name(sysfs))) { - gchar *endpoint = - g_build_filename(sysfs_path, filename, "device", NULL); - gchar *temp; - - temp = g_build_filename(endpoint, "idVendor", NULL); - if (g_file_test(temp, G_FILE_TEST_EXISTS)) { - __scan_usb_sysfs_add_device(endpoint, ++usb_device_number); - } - - g_free(temp); - g_free(endpoint); - } - - g_dir_close(sysfs); -} - -int __scan_usb_procfs(void) -{ - FILE *dev; - gchar buffer[128]; - gchar *tmp, *manuf = NULL, *product = NULL, *mxpwr; - gint bus, level, port, classid, trash; - gint vendor, prodid; - gfloat ver, rev, speed; - int n = 0; - - dev = fopen("/proc/bus/usb/devices", "r"); - if (!dev) - return 0; - - if (usb_list) { - g_hash_table_foreach_remove(moreinfo, remove_usb_devices, NULL); - g_free(usb_list); - } - usb_list = g_strdup("[USB Devices]\n"); - - while (fgets(buffer, 128, dev)) { - tmp = buffer; - - switch (*tmp) { - case 'T': - sscanf(tmp, - "T: Bus=%d Lev=%d Prnt=%d Port=%d Cnt=%d Dev#=%d Spd=%f", - &bus, &level, &trash, &port, &trash, &trash, &speed); - break; - case 'D': - sscanf(tmp, "D: Ver=%f Cls=%x", &ver, &classid); - break; - case 'P': - sscanf(tmp, "P: Vendor=%x ProdID=%x Rev=%f", - &vendor, &prodid, &rev); - break; - case 'S': - if (strstr(tmp, "Manufacturer=")) { - manuf = g_strdup(strchr(tmp, '=') + 1); - remove_linefeed(manuf); - } else if (strstr(tmp, "Product=")) { - product = g_strdup(strchr(tmp, '=') + 1); - remove_linefeed(product); - } - break; - case 'C': - mxpwr = strstr(buffer, "MxPwr=") + 6; - - tmp = g_strdup_printf("USB%d", ++n); - - if (*product == '\0') { - g_free(product); - if (classid == 9) { - product = g_strdup_printf("USB %.2f Hub", ver); - } else { - product = - g_strdup_printf - ("Unknown USB %.2f Device (class %d)", ver, - classid); - } - } - - - if (classid == 9) { /* hub */ - usb_list = h_strdup_cprintf("[%s#%d]\n", - usb_list, product, n); - } else { /* everything else */ - usb_list = h_strdup_cprintf("$%s$%s=\n", - usb_list, tmp, product); - - const gchar *url = vendor_get_url(manuf); - if (url) { - gchar *tmp = - g_strdup_printf("%s (%s)", vendor_get_name(manuf), - url); - g_free(manuf); - manuf = tmp; - } - - gchar *strhash = g_strdup_printf("[Device Information]\n" - "Product=%s\n", - product); - if (manuf && strlen(manuf)) - strhash = h_strdup_cprintf("Manufacturer=%s\n", - strhash, manuf); - - strhash = h_strdup_cprintf("[Port #%d]\n" - "Speed=%.2fMbit/s\n" - "Max Current=%s\n" - "[Misc]\n" - "USB Version=%.2f\n" - "Revision=%.2f\n" - "Class=0x%x\n" - "Vendor=0x%x\n" - "Product ID=0x%x\n" - "Bus=%d\n" "Level=%d\n", - strhash, - port, speed, mxpwr, - ver, rev, classid, - vendor, prodid, bus, level); - - g_hash_table_insert(moreinfo, tmp, strhash); - } - - g_free(manuf); - g_free(product); - manuf = g_strdup(""); - product = g_strdup(""); - } - } - - fclose(dev); - - return n; -} - -void __scan_usb(void) -{ - if (!__scan_usb_procfs()) - __scan_usb_sysfs(); -} diff --git a/arch/linux/ia64/alsa.h b/arch/linux/ia64/alsa.h deleted file mode 120000 index ede8a364..00000000 --- a/arch/linux/ia64/alsa.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/alsa.h \ No newline at end of file diff --git a/arch/linux/ia64/battery.h b/arch/linux/ia64/battery.h deleted file mode 120000 index ed7360e1..00000000 --- a/arch/linux/ia64/battery.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/battery.h \ No newline at end of file diff --git a/arch/linux/ia64/boots.h b/arch/linux/ia64/boots.h deleted file mode 120000 index 97384500..00000000 --- a/arch/linux/ia64/boots.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/boots.h \ No newline at end of file diff --git a/arch/linux/ia64/devmemory.h b/arch/linux/ia64/devmemory.h deleted file mode 120000 index f8a833e7..00000000 --- a/arch/linux/ia64/devmemory.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/devmemory.h \ No newline at end of file diff --git a/arch/linux/ia64/filesystem.h b/arch/linux/ia64/filesystem.h deleted file mode 120000 index d884bcd0..00000000 --- a/arch/linux/ia64/filesystem.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/filesystem.h \ No newline at end of file diff --git a/arch/linux/ia64/inputdevices.h b/arch/linux/ia64/inputdevices.h deleted file mode 120000 index 0f594231..00000000 --- a/arch/linux/ia64/inputdevices.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/inputdevices.h \ No newline at end of file diff --git a/arch/linux/ia64/loadavg.h b/arch/linux/ia64/loadavg.h deleted file mode 120000 index 1f64e107..00000000 --- a/arch/linux/ia64/loadavg.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/loadavg.h \ No newline at end of file diff --git a/arch/linux/ia64/memory.h b/arch/linux/ia64/memory.h deleted file mode 120000 index 64c6e0ed..00000000 --- a/arch/linux/ia64/memory.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/memory.h \ No newline at end of file diff --git a/arch/linux/ia64/modules.h b/arch/linux/ia64/modules.h deleted file mode 120000 index d21c9a20..00000000 --- a/arch/linux/ia64/modules.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/modules.h \ No newline at end of file diff --git a/arch/linux/ia64/net.h b/arch/linux/ia64/net.h deleted file mode 120000 index 488b5ae3..00000000 --- a/arch/linux/ia64/net.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/net.h \ No newline at end of file diff --git a/arch/linux/ia64/nfs.h b/arch/linux/ia64/nfs.h deleted file mode 120000 index 73e0b8c9..00000000 --- a/arch/linux/ia64/nfs.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/nfs.h \ No newline at end of file diff --git a/arch/linux/ia64/os.h b/arch/linux/ia64/os.h deleted file mode 120000 index 44051626..00000000 --- a/arch/linux/ia64/os.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/os.h \ No newline at end of file diff --git a/arch/linux/ia64/pci.h b/arch/linux/ia64/pci.h deleted file mode 120000 index 8df04a0e..00000000 --- a/arch/linux/ia64/pci.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/pci.h \ No newline at end of file diff --git a/arch/linux/ia64/processor.h b/arch/linux/ia64/processor.h deleted file mode 100644 index d3d41519..00000000 --- a/arch/linux/ia64/processor.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -struct _Processor { - gchar *model_name; - gchar *vendor_id; - gfloat bogomips, cpu_mhz; - gchar *strmodel; -}; - -static GSList * -__scan_processors(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen("/proc/cpuinfo", "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("vendor", processor->model_name); - get_str("arch", processor->vendor_id); - get_str("family", processor->strmodel); - get_float("BogoMIPS", processor->bogomips); - - } - g_strfreev(tmp); - } - - processor->cpu_mhz = 0.0f; - - fclose(cpuinfo); - - return g_slist_append(NULL, processor); -} - -static gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[Processor]\n" - "Model=%s\n" - "Architecture=%s\n" - "Family=%sMHz\n" - "BogoMIPS=%s\n" - "Byte Order=%s\n", - processor->model_name, - processor->vendor_id, - processor->strmodel, - processor->bogomips, -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - "Little Endian" -#else - "Big Endian" -#endif - ); -} diff --git a/arch/linux/ia64/resources.h b/arch/linux/ia64/resources.h deleted file mode 120000 index 20a4815d..00000000 --- a/arch/linux/ia64/resources.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/resources.h \ No newline at end of file diff --git a/arch/linux/ia64/samba.h b/arch/linux/ia64/samba.h deleted file mode 120000 index ebab9b11..00000000 --- a/arch/linux/ia64/samba.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/samba.h \ No newline at end of file diff --git a/arch/linux/ia64/sensors.h b/arch/linux/ia64/sensors.h deleted file mode 120000 index 3b799377..00000000 --- a/arch/linux/ia64/sensors.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/sensors.h \ No newline at end of file diff --git a/arch/linux/ia64/storage.h b/arch/linux/ia64/storage.h deleted file mode 120000 index 3ea886ce..00000000 --- a/arch/linux/ia64/storage.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/storage.h \ No newline at end of file diff --git a/arch/linux/ia64/uptime.h b/arch/linux/ia64/uptime.h deleted file mode 120000 index a5bac980..00000000 --- a/arch/linux/ia64/uptime.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/uptime.h \ No newline at end of file diff --git a/arch/linux/ia64/usb.h b/arch/linux/ia64/usb.h deleted file mode 120000 index aee3046c..00000000 --- a/arch/linux/ia64/usb.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/usb.h \ No newline at end of file diff --git a/arch/linux/m68k/alsa.h b/arch/linux/m68k/alsa.h deleted file mode 120000 index 0216845a..00000000 --- a/arch/linux/m68k/alsa.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/alsa.h \ No newline at end of file diff --git a/arch/linux/m68k/battery.h b/arch/linux/m68k/battery.h deleted file mode 120000 index e4c794f2..00000000 --- a/arch/linux/m68k/battery.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/battery.h \ No newline at end of file diff --git a/arch/linux/m68k/boots.h b/arch/linux/m68k/boots.h deleted file mode 120000 index 97384500..00000000 --- a/arch/linux/m68k/boots.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/boots.h \ No newline at end of file diff --git a/arch/linux/m68k/devmemory.h b/arch/linux/m68k/devmemory.h deleted file mode 120000 index f8a833e7..00000000 --- a/arch/linux/m68k/devmemory.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/devmemory.h \ No newline at end of file diff --git a/arch/linux/m68k/filesystem.h b/arch/linux/m68k/filesystem.h deleted file mode 120000 index 6b325b40..00000000 --- a/arch/linux/m68k/filesystem.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/filesystem.h \ No newline at end of file diff --git a/arch/linux/m68k/inputdevices.h b/arch/linux/m68k/inputdevices.h deleted file mode 120000 index b9226a29..00000000 --- a/arch/linux/m68k/inputdevices.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/inputdevices.h \ No newline at end of file diff --git a/arch/linux/m68k/loadavg.h b/arch/linux/m68k/loadavg.h deleted file mode 120000 index daaed6d5..00000000 --- a/arch/linux/m68k/loadavg.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/loadavg.h \ No newline at end of file diff --git a/arch/linux/m68k/memory.h b/arch/linux/m68k/memory.h deleted file mode 120000 index 5ffc013e..00000000 --- a/arch/linux/m68k/memory.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/memory.h \ No newline at end of file diff --git a/arch/linux/m68k/modules.h b/arch/linux/m68k/modules.h deleted file mode 120000 index 8ce5a808..00000000 --- a/arch/linux/m68k/modules.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/modules.h \ No newline at end of file diff --git a/arch/linux/m68k/net.h b/arch/linux/m68k/net.h deleted file mode 120000 index 72d77b26..00000000 --- a/arch/linux/m68k/net.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/net.h \ No newline at end of file diff --git a/arch/linux/m68k/nfs.h b/arch/linux/m68k/nfs.h deleted file mode 120000 index 3d1048da..00000000 --- a/arch/linux/m68k/nfs.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/nfs.h \ No newline at end of file diff --git a/arch/linux/m68k/os.h b/arch/linux/m68k/os.h deleted file mode 120000 index ef547be5..00000000 --- a/arch/linux/m68k/os.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/os.h \ No newline at end of file diff --git a/arch/linux/m68k/pci.h b/arch/linux/m68k/pci.h deleted file mode 120000 index 63760048..00000000 --- a/arch/linux/m68k/pci.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/pci.h \ No newline at end of file diff --git a/arch/linux/m68k/processor.h b/arch/linux/m68k/processor.h deleted file mode 100644 index 6fbd8293..00000000 --- a/arch/linux/m68k/processor.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -struct _Processor { - gchar *model_name; - gfloat bogomips, cpu_mhz; - - gchar *has_fpu; -}; - -static GSList * -__scan_processors(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen("/proc/cpuinfo", "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("CPU", processor->model_name); - get_float("Clocking", processor->cpu_mhz); - get_float("bogomips", processor->bogomips); - - get_str("FPU", processor->has_fpu); - } - g_strfreev(tmp); - } - - gchar *tmp; - tmp = g_strconcat("Motorola ", processor->model_name, NULL); - g_free(processor->model_name); - processor->model_name = tmp; - - fclose(cpuinfo); - - return g_slist_append(NULL, processor); -} - -static gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[Processor]\n" - "Name=%s\n" - "Frequency=%.2fMHz\n" - "BogoMips=%.2f\n" - "Byte Order=%s\n", - processor->model_name, - processor->cpu_mhz, - processor->bogomips, -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - "Little Endian" -#else - "Big Endian" -#endif - ); -} diff --git a/arch/linux/m68k/resources.h b/arch/linux/m68k/resources.h deleted file mode 120000 index 20a4815d..00000000 --- a/arch/linux/m68k/resources.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/resources.h \ No newline at end of file diff --git a/arch/linux/m68k/samba.h b/arch/linux/m68k/samba.h deleted file mode 120000 index 9227f722..00000000 --- a/arch/linux/m68k/samba.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/samba.h \ No newline at end of file diff --git a/arch/linux/m68k/sensors.h b/arch/linux/m68k/sensors.h deleted file mode 120000 index 35e5f37a..00000000 --- a/arch/linux/m68k/sensors.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/sensors.h \ No newline at end of file diff --git a/arch/linux/m68k/storage.h b/arch/linux/m68k/storage.h deleted file mode 120000 index 55b68de3..00000000 --- a/arch/linux/m68k/storage.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/storage.h \ No newline at end of file diff --git a/arch/linux/m68k/uptime.h b/arch/linux/m68k/uptime.h deleted file mode 120000 index 78c026ff..00000000 --- a/arch/linux/m68k/uptime.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/uptime.h \ No newline at end of file diff --git a/arch/linux/m68k/usb.h b/arch/linux/m68k/usb.h deleted file mode 120000 index 8b8fbb5d..00000000 --- a/arch/linux/m68k/usb.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/usb.h \ No newline at end of file diff --git a/arch/linux/mips/alsa.h b/arch/linux/mips/alsa.h deleted file mode 120000 index 0216845a..00000000 --- a/arch/linux/mips/alsa.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/alsa.h \ No newline at end of file diff --git a/arch/linux/mips/battery.h b/arch/linux/mips/battery.h deleted file mode 120000 index e4c794f2..00000000 --- a/arch/linux/mips/battery.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/battery.h \ No newline at end of file diff --git a/arch/linux/mips/boots.h b/arch/linux/mips/boots.h deleted file mode 120000 index 97384500..00000000 --- a/arch/linux/mips/boots.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/boots.h \ No newline at end of file diff --git a/arch/linux/mips/devmemory.h b/arch/linux/mips/devmemory.h deleted file mode 120000 index f8a833e7..00000000 --- a/arch/linux/mips/devmemory.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/devmemory.h \ No newline at end of file diff --git a/arch/linux/mips/filesystem.h b/arch/linux/mips/filesystem.h deleted file mode 120000 index 6b325b40..00000000 --- a/arch/linux/mips/filesystem.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/filesystem.h \ No newline at end of file diff --git a/arch/linux/mips/inputdevices.h b/arch/linux/mips/inputdevices.h deleted file mode 120000 index b9226a29..00000000 --- a/arch/linux/mips/inputdevices.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/inputdevices.h \ No newline at end of file diff --git a/arch/linux/mips/loadavg.h b/arch/linux/mips/loadavg.h deleted file mode 120000 index daaed6d5..00000000 --- a/arch/linux/mips/loadavg.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/loadavg.h \ No newline at end of file diff --git a/arch/linux/mips/memory.h b/arch/linux/mips/memory.h deleted file mode 120000 index 5ffc013e..00000000 --- a/arch/linux/mips/memory.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/memory.h \ No newline at end of file diff --git a/arch/linux/mips/modules.h b/arch/linux/mips/modules.h deleted file mode 120000 index 8ce5a808..00000000 --- a/arch/linux/mips/modules.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/modules.h \ No newline at end of file diff --git a/arch/linux/mips/net.h b/arch/linux/mips/net.h deleted file mode 120000 index 72d77b26..00000000 --- a/arch/linux/mips/net.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/net.h \ No newline at end of file diff --git a/arch/linux/mips/nfs.h b/arch/linux/mips/nfs.h deleted file mode 120000 index 3d1048da..00000000 --- a/arch/linux/mips/nfs.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/nfs.h \ No newline at end of file diff --git a/arch/linux/mips/os.h b/arch/linux/mips/os.h deleted file mode 120000 index ef547be5..00000000 --- a/arch/linux/mips/os.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/os.h \ No newline at end of file diff --git a/arch/linux/mips/pci.h b/arch/linux/mips/pci.h deleted file mode 120000 index 63760048..00000000 --- a/arch/linux/mips/pci.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/pci.h \ No newline at end of file diff --git a/arch/linux/mips/processor.h b/arch/linux/mips/processor.h deleted file mode 100644 index cd10bd7a..00000000 --- a/arch/linux/mips/processor.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -struct _Processor { - gchar *model_name; - gchar *vendor_id; - gfloat bogomips, cpu_mhz; -}; - -static GSList * -__scan_processors(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen("/proc/cpuinfo", "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("system type", processor->model_name); - get_str("cpu model", processor->vendor_id); - get_float("cpu MHz", processor->cpu_mhz); - get_float("BogoMIPS", processor->bogomips); - } - g_strfreev(tmp); - } - - fclose(cpuinfo); - - return g_slist_append(NULL, processor); -} - -static gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[Processor]\n" - "System Type=%s\n" - "CPU Model=%s\n" - "Frequency=%.2fMHz\n" - "BogoMIPS=%.2f\n" - "Byte Order=%s\n", - processor->model_name, - processor->vendor_id, - processor->cpu_mhz, - processor->bogomips, -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - "Little Endian" -#else - "Big Endian" -#endif - ); -} diff --git a/arch/linux/mips/resources.h b/arch/linux/mips/resources.h deleted file mode 120000 index 20a4815d..00000000 --- a/arch/linux/mips/resources.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/resources.h \ No newline at end of file diff --git a/arch/linux/mips/samba.h b/arch/linux/mips/samba.h deleted file mode 120000 index 9227f722..00000000 --- a/arch/linux/mips/samba.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/samba.h \ No newline at end of file diff --git a/arch/linux/mips/sensors.h b/arch/linux/mips/sensors.h deleted file mode 120000 index 35e5f37a..00000000 --- a/arch/linux/mips/sensors.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/sensors.h \ No newline at end of file diff --git a/arch/linux/mips/storage.h b/arch/linux/mips/storage.h deleted file mode 120000 index 55b68de3..00000000 --- a/arch/linux/mips/storage.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/storage.h \ No newline at end of file diff --git a/arch/linux/mips/uptime.h b/arch/linux/mips/uptime.h deleted file mode 120000 index 78c026ff..00000000 --- a/arch/linux/mips/uptime.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/uptime.h \ No newline at end of file diff --git a/arch/linux/mips/usb.h b/arch/linux/mips/usb.h deleted file mode 120000 index 8b8fbb5d..00000000 --- a/arch/linux/mips/usb.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/usb.h \ No newline at end of file diff --git a/arch/linux/parisc/alsa.h b/arch/linux/parisc/alsa.h deleted file mode 120000 index 0216845a..00000000 --- a/arch/linux/parisc/alsa.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/alsa.h \ No newline at end of file diff --git a/arch/linux/parisc/battery.h b/arch/linux/parisc/battery.h deleted file mode 120000 index e4c794f2..00000000 --- a/arch/linux/parisc/battery.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/battery.h \ No newline at end of file diff --git a/arch/linux/parisc/boots.h b/arch/linux/parisc/boots.h deleted file mode 120000 index 97384500..00000000 --- a/arch/linux/parisc/boots.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/boots.h \ No newline at end of file diff --git a/arch/linux/parisc/devmemory.h b/arch/linux/parisc/devmemory.h deleted file mode 120000 index f8a833e7..00000000 --- a/arch/linux/parisc/devmemory.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/devmemory.h \ No newline at end of file diff --git a/arch/linux/parisc/filesystem.h b/arch/linux/parisc/filesystem.h deleted file mode 120000 index 6b325b40..00000000 --- a/arch/linux/parisc/filesystem.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/filesystem.h \ No newline at end of file diff --git a/arch/linux/parisc/inputdevices.h b/arch/linux/parisc/inputdevices.h deleted file mode 120000 index b9226a29..00000000 --- a/arch/linux/parisc/inputdevices.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/inputdevices.h \ No newline at end of file diff --git a/arch/linux/parisc/loadavg.h b/arch/linux/parisc/loadavg.h deleted file mode 120000 index daaed6d5..00000000 --- a/arch/linux/parisc/loadavg.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/loadavg.h \ No newline at end of file diff --git a/arch/linux/parisc/memory.h b/arch/linux/parisc/memory.h deleted file mode 120000 index 5ffc013e..00000000 --- a/arch/linux/parisc/memory.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/memory.h \ No newline at end of file diff --git a/arch/linux/parisc/modules.h b/arch/linux/parisc/modules.h deleted file mode 120000 index 8ce5a808..00000000 --- a/arch/linux/parisc/modules.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/modules.h \ No newline at end of file diff --git a/arch/linux/parisc/net.h b/arch/linux/parisc/net.h deleted file mode 120000 index 72d77b26..00000000 --- a/arch/linux/parisc/net.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/net.h \ No newline at end of file diff --git a/arch/linux/parisc/nfs.h b/arch/linux/parisc/nfs.h deleted file mode 120000 index 3d1048da..00000000 --- a/arch/linux/parisc/nfs.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/nfs.h \ No newline at end of file diff --git a/arch/linux/parisc/os.h b/arch/linux/parisc/os.h deleted file mode 120000 index ef547be5..00000000 --- a/arch/linux/parisc/os.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/os.h \ No newline at end of file diff --git a/arch/linux/parisc/pci.h b/arch/linux/parisc/pci.h deleted file mode 120000 index 63760048..00000000 --- a/arch/linux/parisc/pci.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/pci.h \ No newline at end of file diff --git a/arch/linux/parisc/processor.h b/arch/linux/parisc/processor.h deleted file mode 100644 index 1712e523..00000000 --- a/arch/linux/parisc/processor.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -struct _Processor { - gchar *model_name; - gchar *vendor_id; - gchar *flags; - gfloat bogomips, cpu_mhz; - - gchar *has_fpu; - - gchar *strmodel; -}; - -static GSList * -__scan_processors(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen("/proc/cpuinfo", "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("cpu family", processor->model_name); - get_str("cpu", processor->vendor_id); - get_float("cpu MHz", processor->cpu_mhz); - get_float("bogomips", processor->bogomips); - - get_str("model name", processor->strmodel); - - get_int("I-cache", processor->has_fpu); - get_int("D-cache", processor->flags); - - } - g_strfreev(tmp); - } - - fclose(cpuinfo); - - return g_slist_append(NULL, processor); -} - -static gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[Processor]\n" - "CPU Family=%s\n" - "CPU=%s\n" - "Frequency=%.2fMHz\n" - "Bogomips=%.2f\n" - "Model Name=%s\n" - "Byte Order=%s\n" - "[Cache]\n" - "I-Cache=%s\n" - "D-Cache=%s\n", - processor->model_name, - processor->vendor_id, - processor->cpu_mhz, - processor->bogomips, - processor->strmodel, -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - "Little Endian", -#else - "Big Endian", -#endif - processor->has_fpu, - processor->flags); -} diff --git a/arch/linux/parisc/resources.h b/arch/linux/parisc/resources.h deleted file mode 120000 index 20a4815d..00000000 --- a/arch/linux/parisc/resources.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/resources.h \ No newline at end of file diff --git a/arch/linux/parisc/samba.h b/arch/linux/parisc/samba.h deleted file mode 120000 index 9227f722..00000000 --- a/arch/linux/parisc/samba.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/samba.h \ No newline at end of file diff --git a/arch/linux/parisc/sensors.h b/arch/linux/parisc/sensors.h deleted file mode 120000 index 35e5f37a..00000000 --- a/arch/linux/parisc/sensors.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/sensors.h \ No newline at end of file diff --git a/arch/linux/parisc/storage.h b/arch/linux/parisc/storage.h deleted file mode 120000 index 55b68de3..00000000 --- a/arch/linux/parisc/storage.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/storage.h \ No newline at end of file diff --git a/arch/linux/parisc/uptime.h b/arch/linux/parisc/uptime.h deleted file mode 120000 index 78c026ff..00000000 --- a/arch/linux/parisc/uptime.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/uptime.h \ No newline at end of file diff --git a/arch/linux/parisc/usb.h b/arch/linux/parisc/usb.h deleted file mode 120000 index 8b8fbb5d..00000000 --- a/arch/linux/parisc/usb.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/usb.h \ No newline at end of file diff --git a/arch/linux/ppc/alsa.h b/arch/linux/ppc/alsa.h deleted file mode 120000 index 0216845a..00000000 --- a/arch/linux/ppc/alsa.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/alsa.h \ No newline at end of file diff --git a/arch/linux/ppc/battery.h b/arch/linux/ppc/battery.h deleted file mode 120000 index e4c794f2..00000000 --- a/arch/linux/ppc/battery.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/battery.h \ No newline at end of file diff --git a/arch/linux/ppc/boots.h b/arch/linux/ppc/boots.h deleted file mode 120000 index 97384500..00000000 --- a/arch/linux/ppc/boots.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/boots.h \ No newline at end of file diff --git a/arch/linux/ppc/devmemory.h b/arch/linux/ppc/devmemory.h deleted file mode 120000 index f8a833e7..00000000 --- a/arch/linux/ppc/devmemory.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/devmemory.h \ No newline at end of file diff --git a/arch/linux/ppc/filesystem.h b/arch/linux/ppc/filesystem.h deleted file mode 120000 index 6b325b40..00000000 --- a/arch/linux/ppc/filesystem.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/filesystem.h \ No newline at end of file diff --git a/arch/linux/ppc/inputdevices.h b/arch/linux/ppc/inputdevices.h deleted file mode 120000 index b9226a29..00000000 --- a/arch/linux/ppc/inputdevices.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/inputdevices.h \ No newline at end of file diff --git a/arch/linux/ppc/loadavg.h b/arch/linux/ppc/loadavg.h deleted file mode 120000 index daaed6d5..00000000 --- a/arch/linux/ppc/loadavg.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/loadavg.h \ No newline at end of file diff --git a/arch/linux/ppc/memory.h b/arch/linux/ppc/memory.h deleted file mode 120000 index 5ffc013e..00000000 --- a/arch/linux/ppc/memory.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/memory.h \ No newline at end of file diff --git a/arch/linux/ppc/modules.h b/arch/linux/ppc/modules.h deleted file mode 120000 index 8ce5a808..00000000 --- a/arch/linux/ppc/modules.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/modules.h \ No newline at end of file diff --git a/arch/linux/ppc/net.h b/arch/linux/ppc/net.h deleted file mode 120000 index 72d77b26..00000000 --- a/arch/linux/ppc/net.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/net.h \ No newline at end of file diff --git a/arch/linux/ppc/nfs.h b/arch/linux/ppc/nfs.h deleted file mode 120000 index 3d1048da..00000000 --- a/arch/linux/ppc/nfs.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/nfs.h \ No newline at end of file diff --git a/arch/linux/ppc/os.h b/arch/linux/ppc/os.h deleted file mode 120000 index ef547be5..00000000 --- a/arch/linux/ppc/os.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/os.h \ No newline at end of file diff --git a/arch/linux/ppc/pci.h b/arch/linux/ppc/pci.h deleted file mode 120000 index 63760048..00000000 --- a/arch/linux/ppc/pci.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/pci.h \ No newline at end of file diff --git a/arch/linux/ppc/processor.h b/arch/linux/ppc/processor.h deleted file mode 100644 index 863b2eb7..00000000 --- a/arch/linux/ppc/processor.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -struct _Processor { - gchar *model_name; - gchar *vendor_id; - gint cache_size; - gfloat bogomips, cpu_mhz; -}; - -static GSList * -__scan_processors(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen("/proc/cpuinfo", "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("cpu", processor->model_name); - get_str("machine", processor->vendor_id); - get_int("L2 cache", processor->cache_size); - get_float("clock", processor->cpu_mhz); - get_float("bogomips", processor->bogomips); - - } - g_strfreev(tmp); - } - - gchar *tmp = g_strdup_printf("PowerPC %s (%.2fMHz)", - processor->model_name, - processor->cpu_mhz); - g_free(processor->model_name); - processor->model_name = tmp; - - fclose(cpuinfo); - - return g_slist_append(NULL, processor); -} - -static gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[Processor]\n" - "Machine=%s\n" - "CPU=%s\n" - "L2 Cache=%dkB\n" - "Frequency=%.2fMHz\n" - "BogoMips=%.2f\n" - "Byte Order=%s\n", - processor->vendor_id, - processor->model_name, - processor->cache_size, - processor->cpu_mhz, - processor->bogomips, -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - "Little Endian" -#else - "Big Endian" -#endif - ); -} diff --git a/arch/linux/ppc/resources.h b/arch/linux/ppc/resources.h deleted file mode 120000 index 20a4815d..00000000 --- a/arch/linux/ppc/resources.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/resources.h \ No newline at end of file diff --git a/arch/linux/ppc/samba.h b/arch/linux/ppc/samba.h deleted file mode 120000 index 9227f722..00000000 --- a/arch/linux/ppc/samba.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/samba.h \ No newline at end of file diff --git a/arch/linux/ppc/sensors.h b/arch/linux/ppc/sensors.h deleted file mode 120000 index 35e5f37a..00000000 --- a/arch/linux/ppc/sensors.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/sensors.h \ No newline at end of file diff --git a/arch/linux/ppc/storage.h b/arch/linux/ppc/storage.h deleted file mode 120000 index 55b68de3..00000000 --- a/arch/linux/ppc/storage.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/storage.h \ No newline at end of file diff --git a/arch/linux/ppc/uptime.h b/arch/linux/ppc/uptime.h deleted file mode 120000 index 78c026ff..00000000 --- a/arch/linux/ppc/uptime.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/uptime.h \ No newline at end of file diff --git a/arch/linux/ppc/usb.h b/arch/linux/ppc/usb.h deleted file mode 120000 index 8b8fbb5d..00000000 --- a/arch/linux/ppc/usb.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/usb.h \ No newline at end of file diff --git a/arch/linux/s390/alsa.h b/arch/linux/s390/alsa.h deleted file mode 120000 index ede8a364..00000000 --- a/arch/linux/s390/alsa.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/alsa.h \ No newline at end of file diff --git a/arch/linux/s390/battery.h b/arch/linux/s390/battery.h deleted file mode 120000 index ed7360e1..00000000 --- a/arch/linux/s390/battery.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/battery.h \ No newline at end of file diff --git a/arch/linux/s390/boots.h b/arch/linux/s390/boots.h deleted file mode 120000 index 97384500..00000000 --- a/arch/linux/s390/boots.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/boots.h \ No newline at end of file diff --git a/arch/linux/s390/devmemory.h b/arch/linux/s390/devmemory.h deleted file mode 120000 index f8a833e7..00000000 --- a/arch/linux/s390/devmemory.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/devmemory.h \ No newline at end of file diff --git a/arch/linux/s390/filesystem.h b/arch/linux/s390/filesystem.h deleted file mode 120000 index d884bcd0..00000000 --- a/arch/linux/s390/filesystem.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/filesystem.h \ No newline at end of file diff --git a/arch/linux/s390/inputdevices.h b/arch/linux/s390/inputdevices.h deleted file mode 120000 index 0f594231..00000000 --- a/arch/linux/s390/inputdevices.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/inputdevices.h \ No newline at end of file diff --git a/arch/linux/s390/loadavg.h b/arch/linux/s390/loadavg.h deleted file mode 120000 index 1f64e107..00000000 --- a/arch/linux/s390/loadavg.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/loadavg.h \ No newline at end of file diff --git a/arch/linux/s390/memory.h b/arch/linux/s390/memory.h deleted file mode 120000 index 64c6e0ed..00000000 --- a/arch/linux/s390/memory.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/memory.h \ No newline at end of file diff --git a/arch/linux/s390/modules.h b/arch/linux/s390/modules.h deleted file mode 120000 index d21c9a20..00000000 --- a/arch/linux/s390/modules.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/modules.h \ No newline at end of file diff --git a/arch/linux/s390/net.h b/arch/linux/s390/net.h deleted file mode 120000 index 488b5ae3..00000000 --- a/arch/linux/s390/net.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/net.h \ No newline at end of file diff --git a/arch/linux/s390/nfs.h b/arch/linux/s390/nfs.h deleted file mode 120000 index 73e0b8c9..00000000 --- a/arch/linux/s390/nfs.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/nfs.h \ No newline at end of file diff --git a/arch/linux/s390/os.h b/arch/linux/s390/os.h deleted file mode 120000 index 44051626..00000000 --- a/arch/linux/s390/os.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/os.h \ No newline at end of file diff --git a/arch/linux/s390/pci.h b/arch/linux/s390/pci.h deleted file mode 120000 index 8df04a0e..00000000 --- a/arch/linux/s390/pci.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/pci.h \ No newline at end of file diff --git a/arch/linux/s390/processor.h b/arch/linux/s390/processor.h deleted file mode 100644 index 25dab8ca..00000000 --- a/arch/linux/s390/processor.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -struct _Processor { - gchar *vendor_id, *model_name; - gint cache_size; - gfloat bogomips, cpu_mhz; -}; - -static GSList * -__scan_processors(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen("/proc/cpuinfo", "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("vendor_id", processor->vendor_id); - get_float("# processors", processor->cache_size); - get_int("bogomips per cpu", processor->bogomips); - - } - g_strfreev(tmp); - } - - processor->cpu_mhz = 0.0f; - - processor->model_name = g_strconcat("S390 ", processor->vendor_id, NULL); - g_free(processor->vendor_id); - - fclose(cpuinfo); - - return g_slist_append(NULL, processor); -} - -static gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[Processor]\n" - "Model=%s\n" - "Processors=%d\n" - "BogoMips per CPU=%.2f" - "Byte Order=%s\n", - processor->model_name, - processor->cache_size, - processor->bogomips, -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - "Little Endian" -#else - "Big Endian" -#endif - ); -} diff --git a/arch/linux/s390/resources.h b/arch/linux/s390/resources.h deleted file mode 120000 index 20a4815d..00000000 --- a/arch/linux/s390/resources.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/resources.h \ No newline at end of file diff --git a/arch/linux/s390/samba.h b/arch/linux/s390/samba.h deleted file mode 120000 index ebab9b11..00000000 --- a/arch/linux/s390/samba.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/samba.h \ No newline at end of file diff --git a/arch/linux/s390/sensors.h b/arch/linux/s390/sensors.h deleted file mode 120000 index 3b799377..00000000 --- a/arch/linux/s390/sensors.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/sensors.h \ No newline at end of file diff --git a/arch/linux/s390/storage.h b/arch/linux/s390/storage.h deleted file mode 120000 index 3ea886ce..00000000 --- a/arch/linux/s390/storage.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/storage.h \ No newline at end of file diff --git a/arch/linux/s390/uptime.h b/arch/linux/s390/uptime.h deleted file mode 120000 index a5bac980..00000000 --- a/arch/linux/s390/uptime.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/uptime.h \ No newline at end of file diff --git a/arch/linux/s390/usb.h b/arch/linux/s390/usb.h deleted file mode 120000 index aee3046c..00000000 --- a/arch/linux/s390/usb.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/usb.h \ No newline at end of file diff --git a/arch/linux/sh/alsa.h b/arch/linux/sh/alsa.h deleted file mode 120000 index 0216845a..00000000 --- a/arch/linux/sh/alsa.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/alsa.h \ No newline at end of file diff --git a/arch/linux/sh/battery.h b/arch/linux/sh/battery.h deleted file mode 120000 index e4c794f2..00000000 --- a/arch/linux/sh/battery.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/battery.h \ No newline at end of file diff --git a/arch/linux/sh/boots.h b/arch/linux/sh/boots.h deleted file mode 120000 index e7ef0408..00000000 --- a/arch/linux/sh/boots.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/boots.h \ No newline at end of file diff --git a/arch/linux/sh/devmemory.h b/arch/linux/sh/devmemory.h deleted file mode 120000 index 5b1b866f..00000000 --- a/arch/linux/sh/devmemory.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/devmemory.h \ No newline at end of file diff --git a/arch/linux/sh/filesystem.h b/arch/linux/sh/filesystem.h deleted file mode 120000 index 6b325b40..00000000 --- a/arch/linux/sh/filesystem.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/filesystem.h \ No newline at end of file diff --git a/arch/linux/sh/inputdevices.h b/arch/linux/sh/inputdevices.h deleted file mode 120000 index b9226a29..00000000 --- a/arch/linux/sh/inputdevices.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/inputdevices.h \ No newline at end of file diff --git a/arch/linux/sh/loadavg.h b/arch/linux/sh/loadavg.h deleted file mode 120000 index daaed6d5..00000000 --- a/arch/linux/sh/loadavg.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/loadavg.h \ No newline at end of file diff --git a/arch/linux/sh/memory.h b/arch/linux/sh/memory.h deleted file mode 120000 index 5ffc013e..00000000 --- a/arch/linux/sh/memory.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/memory.h \ No newline at end of file diff --git a/arch/linux/sh/modules.h b/arch/linux/sh/modules.h deleted file mode 120000 index 8ce5a808..00000000 --- a/arch/linux/sh/modules.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/modules.h \ No newline at end of file diff --git a/arch/linux/sh/net.h b/arch/linux/sh/net.h deleted file mode 120000 index 72d77b26..00000000 --- a/arch/linux/sh/net.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/net.h \ No newline at end of file diff --git a/arch/linux/sh/nfs.h b/arch/linux/sh/nfs.h deleted file mode 120000 index 3d1048da..00000000 --- a/arch/linux/sh/nfs.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/nfs.h \ No newline at end of file diff --git a/arch/linux/sh/os.h b/arch/linux/sh/os.h deleted file mode 120000 index ef547be5..00000000 --- a/arch/linux/sh/os.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/os.h \ No newline at end of file diff --git a/arch/linux/sh/pci.h b/arch/linux/sh/pci.h deleted file mode 120000 index 63760048..00000000 --- a/arch/linux/sh/pci.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/pci.h \ No newline at end of file diff --git a/arch/linux/sh/processor.h b/arch/linux/sh/processor.h deleted file mode 100644 index de33ee91..00000000 --- a/arch/linux/sh/processor.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -struct _Processor { - gchar *model_name; - gchar *vendor_id; - gfloat bogomips, cpu_mhz; -}; - -static GSList * -__scan_processors(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen("/proc/cpuinfo", "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("machine", processor->model_name); - get_str("cpu type", processor->vendor_id); - get_float("bogomips", processor->bogomips); - processor->cpu_mhz = processor->bogomips; - } - g_strfreev(tmp); - } - - fclose(cpuinfo); - - return g_slist_append(NULL, processor); -} - -static gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[Processor]\n" - "System Type=%s\n" - "CPU Model=%s\n" - "Frequency=%.2fMHz\n" - "BogoMIPS=%.2f\n" - "Byte Order=%s\n", - processor->model_name, - processor->vendor_id, - processor->cpu_mhz, - processor->bogomips, -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - "Little Endian" -#else - "Big Endian" -#endif - ); -} diff --git a/arch/linux/sh/resources.h b/arch/linux/sh/resources.h deleted file mode 120000 index 20a4815d..00000000 --- a/arch/linux/sh/resources.h +++ /dev/null @@ -1 +0,0 @@ -../../../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 deleted file mode 120000 index 9227f722..00000000 --- a/arch/linux/sh/samba.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/samba.h \ No newline at end of file diff --git a/arch/linux/sh/sensors.h b/arch/linux/sh/sensors.h deleted file mode 120000 index 35e5f37a..00000000 --- a/arch/linux/sh/sensors.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/sensors.h \ No newline at end of file diff --git a/arch/linux/sh/storage.h b/arch/linux/sh/storage.h deleted file mode 120000 index 55b68de3..00000000 --- a/arch/linux/sh/storage.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/storage.h \ No newline at end of file diff --git a/arch/linux/sh/uptime.h b/arch/linux/sh/uptime.h deleted file mode 120000 index 78c026ff..00000000 --- a/arch/linux/sh/uptime.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/uptime.h \ No newline at end of file diff --git a/arch/linux/sh/usb.h b/arch/linux/sh/usb.h deleted file mode 120000 index 8b8fbb5d..00000000 --- a/arch/linux/sh/usb.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/usb.h \ No newline at end of file diff --git a/arch/linux/sparc/alsa.h b/arch/linux/sparc/alsa.h deleted file mode 120000 index 0216845a..00000000 --- a/arch/linux/sparc/alsa.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/alsa.h \ No newline at end of file diff --git a/arch/linux/sparc/battery.h b/arch/linux/sparc/battery.h deleted file mode 120000 index e4c794f2..00000000 --- a/arch/linux/sparc/battery.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/battery.h \ No newline at end of file diff --git a/arch/linux/sparc/boots.h b/arch/linux/sparc/boots.h deleted file mode 120000 index 97384500..00000000 --- a/arch/linux/sparc/boots.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/boots.h \ No newline at end of file diff --git a/arch/linux/sparc/devmemory.h b/arch/linux/sparc/devmemory.h deleted file mode 120000 index f8a833e7..00000000 --- a/arch/linux/sparc/devmemory.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/devmemory.h \ No newline at end of file diff --git a/arch/linux/sparc/filesystem.h b/arch/linux/sparc/filesystem.h deleted file mode 120000 index 6b325b40..00000000 --- a/arch/linux/sparc/filesystem.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/filesystem.h \ No newline at end of file diff --git a/arch/linux/sparc/inputdevices.h b/arch/linux/sparc/inputdevices.h deleted file mode 120000 index b9226a29..00000000 --- a/arch/linux/sparc/inputdevices.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/inputdevices.h \ No newline at end of file diff --git a/arch/linux/sparc/loadavg.h b/arch/linux/sparc/loadavg.h deleted file mode 120000 index daaed6d5..00000000 --- a/arch/linux/sparc/loadavg.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/loadavg.h \ No newline at end of file diff --git a/arch/linux/sparc/memory.h b/arch/linux/sparc/memory.h deleted file mode 120000 index 5ffc013e..00000000 --- a/arch/linux/sparc/memory.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/memory.h \ No newline at end of file diff --git a/arch/linux/sparc/modules.h b/arch/linux/sparc/modules.h deleted file mode 120000 index 8ce5a808..00000000 --- a/arch/linux/sparc/modules.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/modules.h \ No newline at end of file diff --git a/arch/linux/sparc/net.h b/arch/linux/sparc/net.h deleted file mode 120000 index 72d77b26..00000000 --- a/arch/linux/sparc/net.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/net.h \ No newline at end of file diff --git a/arch/linux/sparc/nfs.h b/arch/linux/sparc/nfs.h deleted file mode 120000 index 3d1048da..00000000 --- a/arch/linux/sparc/nfs.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/nfs.h \ No newline at end of file diff --git a/arch/linux/sparc/os.h b/arch/linux/sparc/os.h deleted file mode 120000 index ef547be5..00000000 --- a/arch/linux/sparc/os.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/os.h \ No newline at end of file diff --git a/arch/linux/sparc/pci.h b/arch/linux/sparc/pci.h deleted file mode 120000 index 63760048..00000000 --- a/arch/linux/sparc/pci.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/pci.h \ No newline at end of file diff --git a/arch/linux/sparc/processor.h b/arch/linux/sparc/processor.h deleted file mode 100644 index 0272c963..00000000 --- a/arch/linux/sparc/processor.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -struct _Processor { - gchar *model_name; - gchar *has_fpu; - gfloat cpu_mhz; -}; - -static GSList * -__scan_processors(void) -{ - Processor *processor; - FILE *cpuinfo; - gchar buffer[128]; - - cpuinfo = fopen("/proc/cpuinfo", "r"); - if (!cpuinfo) - return NULL; - - processor = g_new0(Processor, 1); - while (fgets(buffer, 128, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("cpu", processor->model_name); - get_str("fpu", processor->has_fpu); - } - g_strfreev(tmp); - } - - fclose(cpuinfo); - - processor->cpu_mhz = 0.0f; - - return g_slist_append(NULL, processor); -} - -static gchar * -processor_get_info(GSList *processors) -{ - Processor *processor = (Processor *)processors->data; - - return g_strdup_printf("[Processor]\n" - "CPU=%s\n" - "FPU=%s\n", - processor->model_name, - processor->has_fpu); -} diff --git a/arch/linux/sparc/resources.h b/arch/linux/sparc/resources.h deleted file mode 120000 index 20a4815d..00000000 --- a/arch/linux/sparc/resources.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/resources.h \ No newline at end of file diff --git a/arch/linux/sparc/samba.h b/arch/linux/sparc/samba.h deleted file mode 120000 index 9227f722..00000000 --- a/arch/linux/sparc/samba.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/samba.h \ No newline at end of file diff --git a/arch/linux/sparc/sensors.h b/arch/linux/sparc/sensors.h deleted file mode 120000 index 35e5f37a..00000000 --- a/arch/linux/sparc/sensors.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/sensors.h \ No newline at end of file diff --git a/arch/linux/sparc/storage.h b/arch/linux/sparc/storage.h deleted file mode 120000 index 55b68de3..00000000 --- a/arch/linux/sparc/storage.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/storage.h \ No newline at end of file diff --git a/arch/linux/sparc/uptime.h b/arch/linux/sparc/uptime.h deleted file mode 120000 index 78c026ff..00000000 --- a/arch/linux/sparc/uptime.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/uptime.h \ No newline at end of file diff --git a/arch/linux/sparc/usb.h b/arch/linux/sparc/usb.h deleted file mode 120000 index 8b8fbb5d..00000000 --- a/arch/linux/sparc/usb.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/usb.h \ No newline at end of file diff --git a/arch/linux/x86/alsa.h b/arch/linux/x86/alsa.h deleted file mode 120000 index 0216845a..00000000 --- a/arch/linux/x86/alsa.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/alsa.h \ No newline at end of file diff --git a/arch/linux/x86/battery.h b/arch/linux/x86/battery.h deleted file mode 120000 index e4c794f2..00000000 --- a/arch/linux/x86/battery.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/battery.h \ No newline at end of file diff --git a/arch/linux/x86/boots.h b/arch/linux/x86/boots.h deleted file mode 120000 index e7ef0408..00000000 --- a/arch/linux/x86/boots.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/boots.h \ No newline at end of file diff --git a/arch/linux/x86/devmemory.h b/arch/linux/x86/devmemory.h deleted file mode 120000 index f8a833e7..00000000 --- a/arch/linux/x86/devmemory.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/devmemory.h \ No newline at end of file diff --git a/arch/linux/x86/dmi.h b/arch/linux/x86/dmi.h deleted file mode 120000 index 1a285fbd..00000000 --- a/arch/linux/x86/dmi.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/dmi.h \ No newline at end of file diff --git a/arch/linux/x86/filesystem.h b/arch/linux/x86/filesystem.h deleted file mode 120000 index 6b325b40..00000000 --- a/arch/linux/x86/filesystem.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/filesystem.h \ No newline at end of file diff --git a/arch/linux/x86/inputdevices.h b/arch/linux/x86/inputdevices.h deleted file mode 120000 index b9226a29..00000000 --- a/arch/linux/x86/inputdevices.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/inputdevices.h \ No newline at end of file diff --git a/arch/linux/x86/loadavg.h b/arch/linux/x86/loadavg.h deleted file mode 120000 index daaed6d5..00000000 --- a/arch/linux/x86/loadavg.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/loadavg.h \ No newline at end of file diff --git a/arch/linux/x86/memory.h b/arch/linux/x86/memory.h deleted file mode 120000 index 5ffc013e..00000000 --- a/arch/linux/x86/memory.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/memory.h \ No newline at end of file diff --git a/arch/linux/x86/modules.h b/arch/linux/x86/modules.h deleted file mode 120000 index 8ce5a808..00000000 --- a/arch/linux/x86/modules.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/modules.h \ No newline at end of file diff --git a/arch/linux/x86/net.h b/arch/linux/x86/net.h deleted file mode 120000 index 72d77b26..00000000 --- a/arch/linux/x86/net.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/net.h \ No newline at end of file diff --git a/arch/linux/x86/nfs.h b/arch/linux/x86/nfs.h deleted file mode 120000 index 3d1048da..00000000 --- a/arch/linux/x86/nfs.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/nfs.h \ No newline at end of file diff --git a/arch/linux/x86/os.h b/arch/linux/x86/os.h deleted file mode 120000 index ef547be5..00000000 --- a/arch/linux/x86/os.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/os.h \ No newline at end of file diff --git a/arch/linux/x86/pci.h b/arch/linux/x86/pci.h deleted file mode 120000 index 63760048..00000000 --- a/arch/linux/x86/pci.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/pci.h \ No newline at end of file diff --git a/arch/linux/x86/processor.h b/arch/linux/x86/processor.h deleted file mode 100644 index 97fa4555..00000000 --- a/arch/linux/x86/processor.h +++ /dev/null @@ -1,538 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -typedef struct _ProcessorCache ProcessorCache; - -struct _ProcessorCache { - gint level; - gint number_of_sets; - gint physical_line_partition; - gint size; - gchar *type; - gint ways_of_associativity; -}; - -struct _Processor { - gchar *model_name; - gchar *vendor_id; - gchar *flags; - gint cache_size; - gfloat bogomips, cpu_mhz; - - gchar *has_fpu; - gchar *bug_fdiv, *bug_hlt, *bug_f00f, *bug_coma; - - gint model, family, stepping; - gchar *strmodel; - - gint id; - - GSList *cache; -}; - -/* - * This function is partly based on x86cpucaps - * by Osamu Kayasono - */ -static void get_processor_strfamily(Processor * processor) -{ - gint family = processor->family; - gint model = processor->model; - - if (g_str_equal(processor->vendor_id, "GenuineIntel")) { - if (family == 4) { - processor->strmodel = g_strdup("i486 series"); - } else if (family == 5) { - if (model < 4) { - processor->strmodel = g_strdup("Pentium Classic"); - } else { - processor->strmodel = g_strdup("Pentium MMX"); - } - } else if (family == 6) { - if (model <= 1) { - processor->strmodel = g_strdup("Pentium Pro"); - } else if (model < 7) { - processor->strmodel = g_strdup("Pentium II/Pentium II Xeon/Celeron"); - } else if (model == 9) { - processor->strmodel = g_strdup("Pentium M"); - } else { - processor->strmodel = g_strdup("Pentium III/Pentium III Xeon/Celeron"); - } - } else if (family > 6) { - processor->strmodel = g_strdup("Pentium 4"); - } else { - processor->strmodel = g_strdup("i386 class"); - } - } else if (g_str_equal(processor->vendor_id, "AuthenticAMD")) { - if (family == 4) { - if (model <= 9) { - processor->strmodel = g_strdup("AMD i80486 series"); - } else { - processor->strmodel = g_strdup("AMD 5x86"); - } - } else if (family == 5) { - if (model <= 3) { - processor->strmodel = g_strdup("AMD K5"); - } else if (model <= 7) { - processor->strmodel = g_strdup("AMD K6"); - } else if (model == 8) { - processor->strmodel = g_strdup("AMD K6-2"); - } else if (model == 9) { - processor->strmodel = g_strdup("AMD K6-III"); - } else { - processor->strmodel = g_strdup("AMD K6-2+/III+"); - } - } else if (family == 6) { - if (model == 1) { - processor->strmodel = g_strdup("AMD Athlon (K7)"); - } else if (model == 2) { - processor->strmodel = g_strdup("AMD Athlon (K75)"); - } else if (model == 3) { - processor->strmodel = g_strdup("AMD Duron (Spitfire)"); - } else if (model == 4) { - processor->strmodel = g_strdup("AMD Athlon (Thunderbird)"); - } else if (model == 6) { - processor->strmodel = g_strdup("AMD Athlon XP/MP/4 (Palomino)"); - } else if (model == 7) { - processor->strmodel = g_strdup("AMD Duron (Morgan)"); - } else if (model == 8) { - processor->strmodel = g_strdup("AMD Athlon XP/MP (Thoroughbred)"); - } else if (model == 10) { - processor->strmodel = g_strdup("AMD Athlon XP/MP (Barton)"); - } else { - processor->strmodel = g_strdup("AMD Athlon (unknown)"); - } - } else if (family > 6) { - processor->strmodel = g_strdup("AMD Opteron/Athlon64/FX"); - } else { - processor->strmodel = g_strdup("AMD i386 class"); - } - } else if (g_str_equal(processor->vendor_id, "CyrixInstead")) { - if (family == 4) { - processor->strmodel = g_strdup("Cyrix 5x86"); - } else if (family == 5) { - processor->strmodel = g_strdup("Cyrix M1 (6x86)"); - } else if (family == 6) { - if (model == 0) { - processor->strmodel = g_strdup("Cyrix M2 (6x86MX)"); - } else if (model <= 5) { - processor->strmodel = g_strdup("VIA Cyrix III (M2 core)"); - } else if (model == 6) { - processor->strmodel = g_strdup("VIA Cyrix III (WinChip C5A)"); - } else if (model == 7) { - processor->strmodel = g_strdup("VIA Cyrix III (WinChip C5B/C)"); - } else { - processor->strmodel = g_strdup("VIA Cyrix III (WinChip C5C-T)"); - } - } else { - processor->strmodel = g_strdup("Cyrix i386 class"); - } - } else if (g_str_equal(processor->vendor_id, "CentaurHauls")) { - if (family == 5) { - if (model <= 4) { - processor->strmodel = g_strdup("Centaur WinChip C6"); - } else if (model <= 8) { - processor->strmodel = g_strdup("Centaur WinChip 2"); - } else { - processor->strmodel = g_strdup("Centaur WinChip 2A"); - } - } else { - processor->strmodel = g_strdup("Centaur i386 class"); - } - } else if (g_str_equal(processor->vendor_id, "GenuineTMx86")) { - processor->strmodel = g_strdup("Transmeta Crusoe TM3x00/5x00"); - } else { - processor->strmodel = g_strdup("Unknown"); - } -} - -static gchar *__cache_get_info_as_string(Processor *processor) -{ - gchar *result = g_strdup(""); - GSList *cache_list; - ProcessorCache *cache; - - if (!processor->cache) { - return g_strdup("Cache information not available=\n"); - } - - for (cache_list = processor->cache; cache_list; cache_list = cache_list->next) { - cache = (ProcessorCache *)cache_list->data; - - result = h_strdup_cprintf("Level %d (%s)=%d-way set-associative, %d sets, %dKB size\n", - result, - cache->level, - cache->type, - cache->ways_of_associativity, - cache->number_of_sets, - cache->size); - } - - return result; -} - -static void __cache_obtain_info(Processor *processor, gint processor_number) -{ - ProcessorCache *cache; - gchar *endpoint, *entry, *index; - gint i; - - endpoint = g_strdup_printf("/sys/devices/system/cpu/cpu%d/cache", processor_number); - - for (i = 0; ; i++) { - cache = g_new0(ProcessorCache, 1); - - index = g_strdup_printf("index%d/", i); - - entry = g_strconcat(index, "type", NULL); - cache->type = h_sysfs_read_string(endpoint, entry); - g_free(entry); - - if (!cache->type) { - g_free(cache); - g_free(index); - goto fail; - } - - entry = g_strconcat(index, "level", NULL); - cache->level = h_sysfs_read_int(endpoint, entry); - g_free(entry); - - entry = g_strconcat(index, "number_of_sets", NULL); - cache->number_of_sets = h_sysfs_read_int(endpoint, entry); - g_free(entry); - - entry = g_strconcat(index, "physical_line_partition", NULL); - cache->physical_line_partition = h_sysfs_read_int(endpoint, entry); - g_free(entry); - - entry = g_strconcat(index, "size", NULL); - cache->size = h_sysfs_read_int(endpoint, entry); - g_free(entry); - - - entry = g_strconcat(index, "ways_of_associativity", NULL); - cache->ways_of_associativity = h_sysfs_read_int(endpoint, entry); - g_free(entry); - - g_free(index); - - processor->cache = g_slist_append(processor->cache, cache); - } - -fail: - g_free(endpoint); -} - -static GSList *__scan_processors(void) -{ - GSList *procs = NULL; - Processor *processor = NULL; - FILE *cpuinfo; - gchar buffer[256]; - gint processor_number = 0; - - cpuinfo = fopen("/proc/cpuinfo", "r"); - if (!cpuinfo) - return NULL; - - while (fgets(buffer, 256, cpuinfo)) { - gchar **tmp = g_strsplit(buffer, ":", 2); - - if (g_str_has_prefix(tmp[0], "processor")) { - if (processor) { - get_processor_strfamily(processor); - procs = g_slist_append(procs, processor); - } - - processor = g_new0(Processor, 1); - - __cache_obtain_info(processor, processor_number++); - } - - if (tmp[0] && tmp[1]) { - tmp[0] = g_strstrip(tmp[0]); - tmp[1] = g_strstrip(tmp[1]); - - get_str("model name", processor->model_name); - get_str("vendor_id", processor->vendor_id); - get_str("flags", processor->flags); - get_int("cache size", processor->cache_size); - get_float("cpu MHz", processor->cpu_mhz); - get_float("bogomips", processor->bogomips); - - get_str("fpu", processor->has_fpu); - - get_str("fdiv_bug", processor->bug_fdiv); - get_str("hlt_bug", processor->bug_hlt); - get_str("f00f_bug", processor->bug_f00f); - get_str("coma_bug", processor->bug_coma); - - get_int("model", processor->model); - get_int("cpu family", processor->family); - get_int("stepping", processor->stepping); - - get_int("processor", processor->id); - } - g_strfreev(tmp); - } - - if (processor) { - get_processor_strfamily(processor); - procs = g_slist_append(procs, processor); - } - - fclose(cpuinfo); - - return procs; -} - -/* - * Sources: - * - Linux' cpufeature.h - * - http://gentoo-wiki.com/Cpuinfo - * - Intel IA-32 Architecture Software Development Manual - */ -static struct { - char *name, *meaning; -} flag_meaning[] = { - { "3dnow", "3DNow! Technology" }, - { "3dnowext", "Extended 3DNow! Technology" }, - { "fpu", "Floating Point Unit" }, - { "vme", "Virtual 86 Mode Extension" }, - { "de", "Debug Extensions - I/O breakpoints" }, - { "pse", "Page Size Extensions (4MB pages)" }, - { "tsc", "Time Stamp Counter and RDTSC instruction" }, - { "msr", "Model Specific Registers" }, - { "pae", "Physical Address Extensions" }, - { "mce", "Machine Check Architeture" }, - { "cx8", "CMPXCHG8 instruction" }, - { "apic", "Advanced Programmable Interrupt Controller" }, - { "sep", "Fast System Call (SYSENTER/SYSEXIT)" }, - { "mtrr", "Memory Type Range Registers" }, - { "pge", "Page Global Enable" }, - { "mca", "Machine Check Architecture" }, - { "cmov", "Conditional Move instruction" }, - { "pat", "Page Attribute Table" }, - { "pse36", "36bit Page Size Extensions" }, - { "psn", "96 bit Processor Serial Number" }, - { "mmx", "MMX technology" }, - { "mmxext", "Extended MMX Technology" }, - { "cflush", "Cache Flush" }, - { "dtes", "Debug Trace Store" }, - { "fxsr", "FXSAVE and FXRSTOR instructions" }, - { "kni", "Streaming SIMD instructions" }, - { "xmm", "Streaming SIMD instructions" }, - { "ht", "HyperThreading" }, - { "mp", "Multiprocessing Capable" }, - { "sse", "SSE instructions" }, - { "sse2", "SSE2 (WNI) instructions" }, - { "acc", "Automatic Clock Control" }, - { "ia64", "IA64 Instructions" }, - { "syscall", "SYSCALL and SYSEXIT instructions" }, - { "nx", "No-execute Page Protection" }, - { "xd", "Execute Disable" }, - { "clflush", "Cache Line Flush instruction" }, - { "acpi", "Thermal Monitor and Software Controlled Clock" }, - { "dts", "Debug Store" }, - { "ss", "Self Snoop" }, - { "tm", "Thermal Monitor" }, - { "pbe", "Pending Break Enable" }, - { "pb", "Pending Break Enable" }, - { "pn", "Processor serial number" }, - { "ds", "Debug Store" }, - { "xmm2", "Streaming SIMD Extensions-2" }, - { "xmm3", "Streaming SIMD Extensions-3" }, - { "selfsnoop", "CPU self snoop" }, - { "rdtscp", "RDTSCP" }, - { "recovery", "CPU in recovery mode" }, - { "longrun", "Longrun power control" }, - { "lrti", "LongRun table interface" }, - { "cxmmx", "Cyrix MMX extensions" }, - { "k6_mtrr", "AMD K6 nonstandard MTRRs" }, - { "cyrix_arr", "Cyrix ARRs (= MTRRs)" }, - { "centaur_mcr","Centaur MCRs (= MTRRs)" }, - { "constant_tsc","TSC ticks at a constant rate" }, - { "up", "smp kernel running on up" }, - { "fxsave_leak","FXSAVE leaks FOP/FIP/FOP" }, - { "arch_perfmon","Intel Architectural PerfMon" }, - { "pebs", "Precise-Event Based Sampling" }, - { "bts", "Branch Trace Store" }, - { "sync_rdtsc", "RDTSC synchronizes the CPU" }, - { "rep_good", "rep microcode works well on this CPU" }, - { "mwait", "Monitor/Mwait support" }, - { "ds_cpl", "CPL Qualified Debug Store" }, - { "est", "Enhanced SpeedStep" }, - { "tm2", "Thermal Monitor 2" }, - { "cid", "Context ID" }, - { "xtpr", "Send Task Priority Messages" }, - { "xstore", "on-CPU RNG present (xstore insn)" }, - { "xstore_en", "on-CPU RNG enabled" }, - { "xcrypt", "on-CPU crypto (xcrypt insn)" }, - { "xcrypt_en", "on-CPU crypto enabled" }, - { "ace2", "Advanced Cryptography Engine v2" }, - { "ace2_en", "ACE v2 enabled" }, - { "phe", "PadLock Hash Engine" }, - { "phe_en", "PHE enabled" }, - { "pmm", "PadLock Montgomery Multiplier" }, - { "pmm_en", "PMM enabled" }, - { "lahf_lm", "LAHF/SAHF in long mode" }, - { "cmp_legacy", "HyperThreading not valid" }, - { "lm", "LAHF/SAHF in long mode" }, - { "ds_cpl", "CPL Qualified Debug Store" }, - { "vmx", "Virtualization support (Intel)" }, - { "svm", "Virtualization support (AMD)" }, - { "est", "Enhanced SpeedStep" }, - { "tm2", "Thermal Monitor 2" }, - { "ssse3", "Supplemental Streaming SIMD Extension 3" }, - { "cx16", "CMPXCHG16B instruction" }, - { "xptr", "Send Task Priority Messages" }, - { "pebs", "Precise Event Based Sampling" }, - { "bts", "Branch Trace Store" }, - { "ida", "Intel Dynamic Acceleration" }, - { "arch_perfmon","Intel Architectural PerfMon" }, - { "pni", "Streaming SIMD Extension 3 (Prescott New Instruction)" }, - { "rep_good", "rep microcode works well on this CPU" }, - { "ts", "Thermal Sensor" }, - { "sse3", "Streaming SIMD Extension 3" }, - { "sse4", "Streaming SIMD Extension 4" }, - { "tni", "Tejas New Instruction" }, - { "nni", "Nehalem New Instruction" }, - { "tpr", "Task Priority Register" }, - { "vid", "Voltage Identifier" }, - { "fid", "Frequency Identifier" }, - { NULL, NULL }, -}; - -gchar *processor_get_capabilities_from_flags(gchar * strflags) -{ - /* FIXME: - * - Separate between processor capabilities, additional instructions and whatnot. - * - Use binary search or something faster than this O(n) cruft - */ - gchar **flags, **old; - gchar *tmp = NULL; - gint i, j = 0; - - flags = g_strsplit(strflags, " ", 0); - old = flags; - - while (flags[j]) { - gchar *meaning = ""; - for (i = 0; flag_meaning[i].name != NULL; i++) { - if (g_str_equal(flags[j], flag_meaning[i].name)) { - meaning = flag_meaning[i].meaning; - break; - } - } - - tmp = h_strdup_cprintf("%s=%s\n", tmp, flags[j], meaning); - j++; - } - - g_strfreev(old); - return tmp; -} - -static gchar *processor_get_detailed_info(Processor * processor) -{ - gchar *tmp, *ret, *cache_info; - - tmp = processor_get_capabilities_from_flags(processor->flags); - cache_info = __cache_get_info_as_string(processor); - - ret = g_strdup_printf("[Processor]\n" - "Name=%s\n" - "Family, model, stepping=%d, %d, %d (%s)\n" - "Vendor=%s\n" - "[Configuration]\n" - "Cache Size=%dkb\n" - "Frequency=%.2fMHz\n" - "BogoMIPS=%.2f\n" - "Byte Order=%s\n" - "[Features]\n" - "FDIV Bug=%s\n" - "HLT Bug=%s\n" - "F00F Bug=%s\n" - "Coma Bug=%s\n" - "Has FPU=%s\n" - "[Cache]\n" - "%s\n" - "[Capabilities]\n" - "%s", - processor->model_name, - processor->family, - processor->model, - processor->stepping, - processor->strmodel, - vendor_get_name(processor->vendor_id), - processor->cache_size, - processor->cpu_mhz, processor->bogomips, -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - "Little Endian", -#else - "Big Endian", -#endif - processor->bug_fdiv ? processor->bug_fdiv : "no", - processor->bug_hlt ? processor->bug_hlt : "no", - processor->bug_f00f ? processor->bug_f00f : "no", - processor->bug_coma ? processor->bug_coma : "no", - processor->has_fpu ? processor->has_fpu : "no", - cache_info, - tmp); - g_free(tmp); - g_free(cache_info); - - return ret; -} - -static gchar *processor_get_info(GSList * processors) -{ - Processor *processor; - - if (g_slist_length(processors) > 1) { - gchar *ret, *tmp, *hashkey; - GSList *l; - - tmp = g_strdup(""); - - for (l = processors; l; l = l->next) { - processor = (Processor *) l->data; - - tmp = g_strdup_printf("%s$CPU%d$%s=%.2fMHz\n", - tmp, processor->id, - processor->model_name, - processor->cpu_mhz); - - hashkey = g_strdup_printf("CPU%d", processor->id); - g_hash_table_insert(moreinfo, hashkey, - processor_get_detailed_info(processor)); - } - - ret = g_strdup_printf("[$ShellParam$]\n" - "ViewType=1\n" - "[Processors]\n" - "%s", tmp); - g_free(tmp); - - return ret; - } - - processor = (Processor *) processors->data; - return processor_get_detailed_info(processor); -} diff --git a/arch/linux/x86/resources.h b/arch/linux/x86/resources.h deleted file mode 120000 index 20a4815d..00000000 --- a/arch/linux/x86/resources.h +++ /dev/null @@ -1 +0,0 @@ -../../../arch/linux/common/resources.h \ No newline at end of file diff --git a/arch/linux/x86/samba.h b/arch/linux/x86/samba.h deleted file mode 120000 index 9227f722..00000000 --- a/arch/linux/x86/samba.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/samba.h \ No newline at end of file diff --git a/arch/linux/x86/sensors.h b/arch/linux/x86/sensors.h deleted file mode 120000 index 35e5f37a..00000000 --- a/arch/linux/x86/sensors.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/sensors.h \ No newline at end of file diff --git a/arch/linux/x86/storage.h b/arch/linux/x86/storage.h deleted file mode 120000 index 55b68de3..00000000 --- a/arch/linux/x86/storage.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/storage.h \ No newline at end of file diff --git a/arch/linux/x86/uptime.h b/arch/linux/x86/uptime.h deleted file mode 120000 index 78c026ff..00000000 --- a/arch/linux/x86/uptime.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/uptime.h \ No newline at end of file diff --git a/arch/linux/x86/usb.h b/arch/linux/x86/usb.h deleted file mode 120000 index 8b8fbb5d..00000000 --- a/arch/linux/x86/usb.h +++ /dev/null @@ -1 +0,0 @@ -../../linux/common/usb.h \ No newline at end of file diff --git a/arch/linux/x86_64 b/arch/linux/x86_64 deleted file mode 120000 index f4bad791..00000000 --- a/arch/linux/x86_64 +++ /dev/null @@ -1 +0,0 @@ -x86 \ No newline at end of file diff --git a/autopackage/default.apspec b/autopackage/default.apspec deleted file mode 100644 index a8598d01..00000000 --- a/autopackage/default.apspec +++ /dev/null @@ -1,58 +0,0 @@ -# -*- shell-script -*- -# Generated by mkapspec 0.2 -[Meta] -ShortName: hardinfo -SoftwareVersion: 0.5.1 -DisplayName: HardInfo -RootName: @hardinfo.org/hardinfo:$SOFTWAREVERSION -Summary: System profiler and benchmark tool -Maintainer: Leandro A. F. Pereira -Packager: Leandro A. F. Pereira -PackageVersion: 1 -CPUArchitectures: x86 -AutopackageTarget: 1.2 -Type: Application -License: GPL - -[BuildPrepare] -# If you're using autotools, the default should be enough. -# prepareBuild will set up apbuild and run configure for you. If you -# need to pass arguments to configure, just add them to prepareBuild: -# prepareBuild --enable-foo --disable-bar -export APBUILD_INCLUDE="/usr/local/gtk-headers/2.6" -export CC="apgcc" -prepareBuild - -[BuildUnprepare] -# If you're using prepareBuild above, there is no need to change this! -unprepareBuild - -[Globals] - -[Prepare] -require '@gtk.org/gtk' 2.6 -require '@gtk.org/glib' 2.6 -require '@gnome.org/libsoup' 8.0 - -[Imports] -# This command will tell makeinstaller what to include in the package. -# The selection comes from the files created by 'make install' or equivalent. -# Usually, you can leave this at the default -cd ../ -echo '*' | import - -[Install] -# See http://www.autopackage.org/api/ for details -installExe bin/* -installData share/* -copyFile lib/hardinfo/modules/benchmark.so $PREFIX/lib/hardinfo/modules/benchmark.so -copyFile lib/hardinfo/modules/computer.so $PREFIX/lib/hardinfo/modules/computer.so -copyFile lib/hardinfo/modules/devices.so $PREFIX/lib/hardinfo/modules/devices.so -copyFile lib/hardinfo/modules/network.so $PREFIX/lib/hardinfo/modules/network.so -installMenuItem "System" share/applications/hardinfo.desktop - -[Uninstall] -# Leaving this at the default is safe unless you use custom commands in -# "Install" to create files. By default, all autopackage API functions are -# logged. -uninstallFromLog diff --git a/benchmark.c b/benchmark.c deleted file mode 100644 index e31d6b34..00000000 --- a/benchmark.c +++ /dev/null @@ -1,421 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2009 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include -#include -#include - -#include -#include - -enum { - BENCHMARK_BLOWFISH, - BENCHMARK_CRYPTOHASH, - BENCHMARK_FIB, - BENCHMARK_NQUEENS, - BENCHMARK_FFT, - BENCHMARK_RAYTRACE, - BENCHMARK_N_ENTRIES -} Entries; - -void scan_fft(gboolean reload); -void scan_raytr(gboolean reload); -void scan_bfsh(gboolean reload); -void scan_cryptohash(gboolean reload); -void scan_fib(gboolean reload); -void scan_nqueens(gboolean reload); - -gchar *callback_fft(); -gchar *callback_raytr(); -gchar *callback_bfsh(); -gchar *callback_fib(); -gchar *callback_cryptohash(); -gchar *callback_nqueens(); - -static ModuleEntry entries[] = { - {"CPU Blowfish", "blowfish.png", callback_bfsh, scan_bfsh}, - {"CPU CryptoHash", "cryptohash.png", callback_cryptohash, scan_cryptohash}, - {"CPU Fibonacci", "nautilus.png", callback_fib, scan_fib}, - {"CPU N-Queens", "nqueens.png", callback_nqueens, scan_nqueens}, - {"FPU FFT", "fft.png", callback_fft, scan_fft}, - {"FPU Raytracing", "raytrace.png", callback_raytr, scan_raytr}, - {NULL} -}; - -typedef struct _ParallelBenchTask ParallelBenchTask; - -struct _ParallelBenchTask { - guint start, end; - gpointer data, callback; -}; - -gpointer benchmark_parallel_for_dispatcher(gpointer data) -{ - ParallelBenchTask *pbt = (ParallelBenchTask *)data; - gpointer (*callback)(unsigned int start, unsigned int end, void *data); - gpointer return_value; - - if ((callback = pbt->callback)) { - DEBUG("this is thread %p; items %d -> %d, data %p", g_thread_self(), - pbt->start, pbt->end, pbt->data); - return_value = callback(pbt->start, pbt->end, pbt->data); - DEBUG("this is thread %p; return value is %p", g_thread_self(), return_value); - } else { - DEBUG("this is thread %p; callback is NULL and it should't be!", g_thread_self()); - } - - g_free(pbt); - - return return_value; -} - -gdouble benchmark_parallel_for(guint start, guint end, - gpointer callback, gpointer callback_data) { - gchar *temp; - guint n_cores, iter_per_core, iter; - gdouble elapsed_time; - GSList *threads = NULL, *t; - GTimer *timer; - - timer = g_timer_new(); - - temp = module_call_method("devices::getProcessorCount"); - n_cores = temp ? atoi(temp) : 1; - g_free(temp); - - while (1) { - iter_per_core = (end - start) / n_cores; - - if (iter_per_core == 0) { - DEBUG("not enough items per core; disabling one"); - n_cores--; - } else { - break; - } - } - - DEBUG("processor has %d cores; processing %d elements (%d per core)", - n_cores, (end - start), iter_per_core); - - g_timer_start(timer); - for (iter = start; iter < end; iter += iter_per_core) { - ParallelBenchTask *pbt = g_new0(ParallelBenchTask, 1); - GThread *thread; - - DEBUG("launching thread %d", 1 + (iter / iter_per_core)); - - pbt->start = iter == 0 ? 0 : iter + 1; - pbt->end = iter + iter_per_core - 1; - pbt->data = callback_data; - pbt->callback = callback; - - if (pbt->end > end) - pbt->end = end; - - thread = g_thread_create((GThreadFunc) benchmark_parallel_for_dispatcher, - pbt, TRUE, NULL); - threads = g_slist_append(threads, thread); - - DEBUG("thread %d launched as context %p", 1 + (iter / iter_per_core), threads->data); - } - - DEBUG("waiting for all threads to finish"); - for (t = threads; t; t = t->next) { - DEBUG("waiting for thread with context %p", t->data); - g_thread_join((GThread *)t->data); - } - - g_timer_stop(timer); - elapsed_time = g_timer_elapsed(timer, NULL); - - g_slist_free(threads); - g_timer_destroy(timer); - - DEBUG("finishing; all threads took %f seconds to finish", elapsed_time); - - return elapsed_time; -} - -static gchar *__benchmark_include_results(gdouble result, - const gchar * benchmark, - ShellOrderType order_type) -{ - GKeyFile *conf; - gchar **machines; - gchar *path, *results = g_strdup(""), *return_value, *processor_frequency; - int i; - - conf = g_key_file_new(); - - path = g_build_filename(g_get_home_dir(), ".hardinfo", "benchmark.conf", NULL); - if (!g_file_test(path, G_FILE_TEST_EXISTS)) { - DEBUG("local benchmark.conf not found, trying system-wide"); - g_free(path); - path = g_build_filename(params.path_data, "benchmark.conf", NULL); - } - - g_key_file_load_from_file(conf, path, 0, NULL); - - machines = g_key_file_get_keys(conf, benchmark, NULL, NULL); - for (i = 0; machines && machines[i]; i++) { - gchar *value; - - value = g_key_file_get_value(conf, benchmark, machines[i], NULL); - results = g_strconcat(results, machines[i], "=", value, "\n", NULL); - - g_free(value); - } - - g_strfreev(machines); - g_free(path); - g_key_file_free(conf); - - processor_frequency = module_call_method("devices::getProcessorFrequency"); - return_value = g_strdup_printf("[$ShellParam$]\n" - "Zebra=1\n" - "OrderType=%d\n" - "ViewType=3\n" - "ColumnTitle$Extra1=CPU Clock\n" - "ColumnTitle$Progress=Results\n" - "ColumnTitle$TextValue=CPU\n" - "ShowColumnHeaders=true\n" - "[%s]\n" - "This Machine=%.3f|%s MHz\n" - "%s", order_type, benchmark, result, processor_frequency, results); - g_free(processor_frequency); - return return_value; -} - - - -static gchar *benchmark_include_results_reverse(gdouble result, - const gchar * benchmark) -{ - return __benchmark_include_results(result, benchmark, - SHELL_ORDER_DESCENDING); -} - -static gchar *benchmark_include_results(gdouble result, - const gchar * benchmark) -{ - return __benchmark_include_results(result, benchmark, - SHELL_ORDER_ASCENDING); -} - -static gdouble bench_results[BENCHMARK_N_ENTRIES]; - -#include -#include -#include -#include -#include -#include - -gchar *callback_fft() -{ - return benchmark_include_results(bench_results[BENCHMARK_FFT], - "FPU FFT"); -} - -gchar *callback_nqueens() -{ - return benchmark_include_results(bench_results[BENCHMARK_NQUEENS], - "CPU N-Queens"); -} - -gchar *callback_raytr() -{ - return benchmark_include_results(bench_results[BENCHMARK_RAYTRACE], - "FPU Raytracing"); -} - -gchar *callback_bfsh() -{ - return benchmark_include_results(bench_results[BENCHMARK_BLOWFISH], - "CPU Blowfish"); -} - -gchar *callback_cryptohash() -{ - return benchmark_include_results_reverse(bench_results[BENCHMARK_CRYPTOHASH], - "CPU CryptoHash"); -} - -gchar *callback_fib() -{ - return benchmark_include_results(bench_results[BENCHMARK_FIB], - "CPU Fibonacci"); -} - -#define RUN_WITH_HIGH_PRIORITY(fn) \ - do { \ - int old_priority = getpriority(PRIO_PROCESS, 0); \ - setpriority(PRIO_PROCESS, 0, -20); \ - fn(); \ - setpriority(PRIO_PROCESS, 0, old_priority); \ - } while (0); - -void scan_fft(gboolean reload) -{ - SCAN_START(); - RUN_WITH_HIGH_PRIORITY(benchmark_fft); - SCAN_END(); -} - -void scan_nqueens(gboolean reload) -{ - SCAN_START(); - RUN_WITH_HIGH_PRIORITY(benchmark_nqueens); - SCAN_END(); -} - -void scan_raytr(gboolean reload) -{ - SCAN_START(); - RUN_WITH_HIGH_PRIORITY(benchmark_raytrace); - SCAN_END(); -} - -void scan_bfsh(gboolean reload) -{ - SCAN_START(); - RUN_WITH_HIGH_PRIORITY(benchmark_fish); - SCAN_END(); -} - -void scan_cryptohash(gboolean reload) -{ - SCAN_START(); - RUN_WITH_HIGH_PRIORITY(benchmark_cryptohash); - SCAN_END(); -} - -void scan_fib(gboolean reload) -{ - SCAN_START(); - RUN_WITH_HIGH_PRIORITY(benchmark_fib); - SCAN_END(); -} - -const gchar *hi_note_func(gint entry) -{ - switch (entry) { - case BENCHMARK_CRYPTOHASH: - return "Results in MiB/second. Higher is better."; - - case BENCHMARK_FFT: - case BENCHMARK_RAYTRACE: - case BENCHMARK_BLOWFISH: - case BENCHMARK_FIB: - case BENCHMARK_NQUEENS: - return "Results in seconds. Lower is better."; - } - - return NULL; -} - -gchar *hi_module_get_name(void) -{ - return g_strdup("Benchmarks"); -} - -guchar hi_module_get_weight(void) -{ - return 240; -} - -ModuleEntry *hi_module_get_entries(void) -{ - return entries; -} - -ModuleAbout *hi_module_get_about(void) -{ - static ModuleAbout ma[] = { - { - .author = "Leandro A. F. Pereira", - .description = "Perform tasks and compare with other systems", - .version = VERSION, - .license = "GNU GPL version 2"} - }; - - return ma; -} - -static gchar *get_benchmark_results() -{ - void (*scan_callback) (gboolean rescan); - - gint i = G_N_ELEMENTS(entries) - 1; - gchar *machine = module_call_method("devices::getProcessorName"); - gchar *machineclock = module_call_method("devices::getProcessorFrequency"); - gchar *machineram = module_call_method("devices::getMemoryTotal"); - gchar *result = g_strdup_printf("[param]\n" - "machine=%s\n" - "machineclock=%s\n" - "machineram=%s\n" - "nbenchmarks=%d\n", - machine, - machineclock, - machineram, i); - for (; i >= 0; i--) { - if ((scan_callback = entries[i].scan_callback)) { - scan_callback(FALSE); - - result = h_strdup_cprintf("[bench%d]\n" - "name=%s\n" - "value=%f\n", - result, - i, entries[i].name, bench_results[i]); - } - } - - g_free(machine); - g_free(machineclock); - g_free(machineram); - - return result; -} - -void hi_module_init(void) -{ - static SyncEntry se[] = { - { - .fancy_name = "Send benchmark results", - .name = "SendBenchmarkResults", - .save_to = NULL, - .get_data = get_benchmark_results}, - { - .fancy_name = "Receive benchmark results", - .name = "RecvBenchmarkResults", - .save_to = "benchmark.conf", - .get_data = NULL} - }; - - sync_manager_add_entry(&se[0]); - sync_manager_add_entry(&se[1]); -} - -gchar **hi_module_get_dependencies(void) -{ - static gchar *deps[] = { "devices.so", NULL }; - - return deps; -} diff --git a/benchmark.conf b/benchmark.conf index 3b7c6bcd..ef2162da 100644 --- a/benchmark.conf +++ b/benchmark.conf @@ -1,18 +1,311 @@ -[CPU ZLib] -PowerPC 740/750 (280.00MHz)=2150.597408 -Intel(R) Celeron(R) M processor 1.50GHz=8761.604561 -[CPU Fibonacci] -Intel(R) Celeron(R) M processor 1.50GHz=8.1375674 -PowerPC 740/750 (280.00MHz)=58.07682 -[CPU MD5] -PowerPC 740/750 (280.00MHz)=7.115258 -Intel(R) Celeron(R) M processor 1.50GHz=38.6607998 -[CPU SHA1] -PowerPC 740/750 (280.00MHz)=6.761451 -Intel(R) Celeron(R) M processor 1.50GHz=49.6752776 -[CPU Blowfish] -Intel(R) Celeron(R) M processor 1.50GHz=26.1876862 -PowerPC 740/750 (280.00MHz)=172.816713 +[param] +last_update=1241368430 +[FPU FFT] +2x Intel(R) Pentium(R) DualCPUT3200@ 2.00GHz=5.500|2000 MHz|Unknown +Intel(R) Celeron(R) CPU 2.53GHz=10.122|2527 MHz|Unknown +Genuine Intel(R) CPU T1350@ 1.86GHz=83.465|1867 MHz|Unknown +2x AMD Turion(tm) 64 X2 Mobile Technology TL-60=8.225|2000 MHz|Unknown +2x AMD Turion(tm) X2 Dual-Core Mobile RM-70=8.312|500 MHz|Unknown +2x Intel(R) Core(TM) Duo CPUT2350@ 1.86GHz=5.356|1867 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T5750@ 2.00GHz=4.231|1994 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T9500@ 2.60GHz=3.124|2593 MHz|Unknown +2x AMD Athlon(tm) X2 Dual-Core QL-60=9.080|1900 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T5250@ 1.50GHz=5.507|1000 MHz|Unknown +Mobile AMD Athlon(tm) XP-M Processor 3000+=43.154|799 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 4000+=7.997|1000 MHz|Unknown +AMD Athlon(tm) XP processor 1800+=25.139|1533 MHz|Unknown +2x Genuine Intel(R) CPU2140@ 1.60GHz=5.442|1595 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ6600@ 2.40GHz=1.631|1603 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU P7350@ 2.00GHz=4.758|2000 MHz|Unknown +2x Genuine Intel(R) CPU T2080@ 1.73GHz=4.985|800 MHz|Unknown +Intel(R) Celeron(R) CPU 2.50GHz=14.459|2492 MHz|Unknown +Intel(R) Pentium(R) M processor 1.86GHz=11.875|1867 MHz|Unknown +2x Intel(R) Core(TM)2 CPU T5200@ 1.60GHz=6.486|1067 MHz|Unknown +2x Intel(R) Core(TM)2 CPU6320@ 1.86GHz=4.908|1600 MHz|Unknown +AMD Athlon(tm) XP=84.350|906 MHz|Unknown +AMD Athlon(tm) 64 Processor 3000+=25.187|1800 MHz|Unknown +2x Intel(R) Pentium(R) 4 CPU 2.60GHz=8.536|2600 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ9400@ 2.66GHz=1.485|2003 MHz|Unknown +Intel(R) Pentium(R) M processor 1600MHz=13.500|1600 MHz|Unknown +2x Pentium(R) Dual-Core CPU T4200@ 2.00GHz=4.615|1200 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPU @ 2.40GHz=1.696|2400 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ8300@ 2.50GHz=1.659|2497 MHz|Unknown +2x Intel(R) Core(TM)2 Extreme CPU X7900@ 2.80GHz=3.065|2800 MHz|Unknown +Intel(R) Celeron(R) D CPU 3.20GHz=8.552|3196 MHz|Unknown +AMD Sempron(tm) 2600+=20.952|1840 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 4400+=6.805|1000 MHz|Unknown +Intel(R) Celeron(R) CPU 2.66GHz=9.887|2666 MHz|Unknown +2x Intel(R) Core(TM) Duo CPUT2450@ 2.00GHz=4.331|800 MHz|Unknown +Intel(R) Celeron(R) M CPU520@ 1.60GHz=11.346|1600 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 3.06GHz=12.724|3058 MHz|Unknown +2x Intel(R) Core(TM)2 CPU4300@ 1.80GHz=5.368|1200 MHz|Unknown +2x Intel(R) Core(TM)2 CPU6400@ 2.13GHz=4.678|2128 MHz|Unknown +AMD Turion(tm) 64 Mobile Technology MK-36=19.958|800 MHz|Unknown +2x Intel(R) Core(TM)2 CPU6600@ 2.40GHz=3.546|1596 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T7250@ 2.00GHz=4.160|2001 MHz|Unknown +Intel(R) Celeron(R) M processor900MHz=24.212|900 MHz|Unknown +AMD Sempron(tm) Processor 3400+=17.114|1000 MHz|Unknown +AMD Athlon(tm) XP 2500+=27.327|1792 MHz|Unknown +AMD Sempron(tm) Processor 3000+=18.941|1800 MHz|Unknown +AMD Athlon(tm) XP 2200+=22.197|1782 MHz|Unknown +2x Intel(R) Pentium(R) 4 CPU 3.06GHz=7.454|3065 MHz|Unknown +2x AMD Processor model unknown=5.242|3006 MHz|Unknown +2x AMD Turion(tm) 64 X2 Mobile Technology TL-62=7.519|800 MHz|Unknown +[CPU CryptoHash] +4x Intel(R) Atom(TM) CPU330 @ 1.60GHz=105.569|1596 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T5250@ 1.50GHz=102.949|1000 MHz|Unknown +Intel(R) Celeron(R) M processor900MHz=24.338|900 MHz|Unknown +2x Intel(R) Core(TM)2 CPU E8400@ 3.00GHz=163.391|3000 MHz|Unknown +2x Intel(R) Xeon(R) CPU E5405@ 2.00GHz=117.480|1995 MHz|Unknown +2x Intel(R) Core(TM) Duo CPUT2450@ 2.00GHz=127.241|800 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 2.00GHz=24.650|1994 MHz|Unknown +4x AMD Phenom(tm) 9350e Quad-Core Processor=237.011|2000 MHz|Unknown +2x AMD Turion(tm) X2 Ultra Dual-Core Mobile ZM-82=100.065|600 MHz|Unknown +AMD Athlon(tm) XP 3000+=66.539|2158 MHz|Unknown +Intel(R) Celeron(R) M CPU520@ 1.60GHz=52.308|1600 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ6700@ 2.66GHz=264.055|2669 MHz|Unknown +AMD Athlon(tm) XP 1900+=31.633|1593 MHz|Unknown +2x Intel(R) Pentium(R) 4 CPU 3.20GHz=66.611|2400 MHz|Unknown +AMD Sempron(tm) 2600+=53.870|1840 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 3800+=94.123|2200 MHz|Unknown +2x AMD Turion(tm) 64 X2 Mobile Technology TL-62=119.427|800 MHz|Unknown +AMD Athlon(tm) XP 2000+=45.755|1667 MHz|Unknown +AMD Athlon(tm) 64 Processor 3500+=62.204|1000 MHz|Unknown +2x AMD Turion(tm) 64 X2 Mobile Technology TL-56=92.191|800 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 4000+=97.036|1000 MHz|Unknown +2x Intel(R) Pentium(R) D CPU 3.00GHz=96.755|3000 MHz|Unknown +Mobile AMD Sempron(tm) Processor 3600+=54.437|800 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ9650@ 3.00GHz=303.512|2997 MHz|Unknown +AMD Sempron(tm) Processor 3600+=43.977|1000 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T9400@ 2.53GHz=148.711|800 MHz|Unknown +2x AMD Turion(tm) 64 X2 Mobile Technology TL-58=101.693|1900 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU P7350@ 2.00GHz=103.950|2000 MHz|Unknown +VIA Esther processor 1500MHz=7.752|1499 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU P8600@ 2.40GHz=150.445|800 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T7700@ 2.40GHz=142.537|800 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T5550@ 1.83GHz=122.423|1829 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T7250@ 2.00GHz=121.915|2001 MHz|Unknown +2x Intel(R) Core(TM)2 CPU6700@ 2.66GHz=163.639|2667 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 2.40GHz=30.963|2400 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ9400@ 2.66GHz=296.869|2003 MHz|Unknown +AMD Athlon(tm) 64 Processor 3200+=42.300|1000 MHz|Unknown +2x Intel(R) Pentium(R) DualCPUT3200@ 2.00GHz=88.536|2000 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 2.26GHz=29.413|2267 MHz|Unknown +AMD Sempron(tm) Processor 3400+=53.845|1000 MHz|Unknown +AMD Sempron(tm) Processor 3000+=47.787|1800 MHz|Unknown +AMD Athlon(tm) XP 2400+=61.644|1991 MHz|Unknown +2x Intel(R) Atom(TM) CPU Z530 @ 1.60GHz=54.891|1067 MHz|Unknown +Pentium III (Coppermine)=26.992|700 MHz|Unknown +8x Intel(R) Core(TM) i7 CPU 920@ 2.67GHz=390.240|3799 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 6000+=146.744|3051 MHz|Unknown +AMD Turion(tm) 64 Mobile Technology ML-37=42.208|2000 MHz|Unknown +2x Intel(R) Xeon(R) CPU3040@ 1.86GHz=127.825|1862 MHz|Unknown +AMD Athlon(tm) XP 2500+=39.659|1792 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T9500@ 2.60GHz=172.640|2593 MHz|Unknown +[CPU N-Queens] +2x AMD Athlon(tm) 64 X2 Dual Core Processor 5400+=15.057|1000 MHz|Unknown +2x Genuine Intel(R) CPU T2080@ 1.73GHz=33.309|800 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T5450@ 1.66GHz=14.488|1000 MHz|Unknown +4x Intel(R) Core(TM)2 QuadCPU Q9300@ 2.50GHz=14.100|3000 MHz|Unknown +2x Intel(R) Atom(TM) CPU Z530 @ 1.60GHz=18.703|1067 MHz|Unknown +4x Intel(R) Atom(TM) CPU330 @ 1.60GHz=26.065|1596 MHz|Unknown +AMD Athlon(tm) XP 1600+=19.852|1398 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ6700@ 2.66GHz=17.009|2669 MHz|Unknown +2x Intel(R) Pentium(R) 4 CPU 2.60GHz=14.827|2600 MHz|Unknown +2x Intel(R) Core(TM)2 CPU6320@ 1.86GHz=16.536|1600 MHz|Unknown +2x Intel(R) Core(TM)2 Extreme CPU X7900@ 2.80GHz=7.020|2800 MHz|Unknown +4x Intel(R) Core(TM)2 QuadCPU Q9450@ 2.66GHz=12.973|2000 MHz|Unknown +2x Intel(R) Core(TM)2 CPU E8400@ 3.00GHz=7.841|3000 MHz|Unknown +Pentium III (Coppermine)=27.983|700 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 4000+=19.510|1000 MHz|Unknown +2x AMD Turion(tm) 64 X2 Mobile Technology TL-50=23.257|800 MHz|Unknown +2x Intel(R) Pentium(R) D CPU 3.40GHz=13.512|2400 MHz|Unknown +2x Pentium III (Coppermine)=35.147|999 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 3600+=22.980|1000 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 5200+=14.954|2705 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual-Core Processor TK-55=20.494|800 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU E6850@ 3.00GHz=7.522|1998 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU P8400@ 2.26GHz=10.388|800 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ9400@ 2.66GHz=18.246|2003 MHz|Unknown +AMD Athlon(tm) XP 1900+=26.739|1593 MHz|Unknown +2x Intel(R) Core(TM) Duo CPUT2350@ 1.86GHz=22.009|1867 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU E8400@ 3.00GHz=7.663|2997 MHz|Unknown +AMD Athlon(tm) XP 2800+=13.555|2087 MHz|Unknown +2x Genuine Intel(R) CPU T2500@ 2.00GHz=28.389|1000 MHz|Unknown +2x AMD Turion(tm) 64 X2 Mobile Technology TL-58=20.024|1900 MHz|Unknown +2x Intel(R) Pentium(R) 4 CPU 3.40GHz=15.298|2400 MHz|Unknown +Intel(R) Celeron(R) M processor900MHz=33.259|900 MHz|Unknown +2x AMD Athlon(tm) X2 Dual-Core QL-60=20.337|1900 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T5850@ 2.16GHz=10.372|2167 MHz|Unknown +Mobile AMD Athlon(tm) XP-M Processor 3000+=52.785|799 MHz|Unknown +4x AMD Phenom(tm) 9500 Quad-Core Processor=10.061|1100 MHz|Unknown +Intel(R) Celeron(R) M processor 1.40GHz=94.050|1395 MHz|Unknown +Mobile AMD Athlon(tm) XP 2800+=13.362|1459 MHz|Unknown +AMD Athlon(tm) 64 Processor 3000+=18.076|1800 MHz|Unknown +2x Genuine Intel(R) CPU L2400@ 1.66GHz=19.551|1000 MHz|Unknown +AMD Sempron(tm) Processor 2800+=17.227|1999 MHz|Unknown +AMD Sempron(tm) 2600+=14.693|1840 MHz|Unknown +Intel(R) Pentium(R) M processor 1600MHz=15.228|1600 MHz|Unknown +Genuine Intel(R) CPU 575@ 2.00GHz=15.876|1995 MHz|Unknown +2x Genuine Intel(R) CPU T2300@ 1.66GHz=27.251|1000 MHz|Unknown +Intel(R) Pentium(R) M processor 1.70GHz=22.545|600 MHz|Unknown +AMD Athlon(tm) XP processor 1800+=17.547|1533 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T5750@ 2.00GHz=11.140|1994 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T7250@ 2.00GHz=11.387|2001 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 1500MHz=28.460|1495 MHz|Unknown [FPU Raytracing] -Intel(R) Celeron(R) M processor 1.50GHz=40.8816714 -PowerPC 740/750 (280.00MHz)=161.312647 +2x Intel(R) Core(TM) Duo CPUT2450@ 2.00GHz=28.359|800 MHz|Unknown +AMD Athlon(tm) XP 2200+=29.739|1782 MHz|Unknown +2x Intel(R) Pentium(R) DualCPUT2370@ 1.73GHz=25.822|1733 MHz|Unknown +AMD Sempron(tm) Processor 3200+=30.191|1000 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual-Core Processor TK-55=16.469|800 MHz|Unknown +2x Intel(R) Core(TM)2 CPU6600@ 2.40GHz=11.244|1596 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T5270@ 1.40GHz=32.813|800 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual-Core Processor TK-53=18.472|800 MHz|Unknown +Intel(R) Pentium(R) M processor 1.86GHz=28.196|1867 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T5750@ 2.00GHz=16.383|1994 MHz|Unknown +AMD Turion(tm) 64 Mobile Technology ML-32=28.432|800 MHz|Unknown +Intel(R) Celeron(R) CPU530@ 1.73GHz=17.548|2593 MHz|Unknown +8x Intel(R) Core(TM) i7 CPU 920@ 2.67GHz=4.731|3799 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ9650@ 3.00GHz=18.842|2997 MHz|Unknown +AMD Turion(tm) 64 Mobile Technology MK-36=30.838|800 MHz|Unknown +2x Intel(R) Pentium(R) D CPU 3.40GHz=25.418|2400 MHz|Unknown +2x AMD Athlon(tm) X2 Dual-Core QL-60=18.295|1900 MHz|Unknown +Intel(R) Pentium(R) III CPU - S 1400MHz=33.361|1392 MHz|Unknown +4x AMD Phenom(tm) II X4 20 Processor=13.290|3654 MHz|Unknown +2x Intel(R) Core(TM)2 CPU E8400@ 3.00GHz=15.790|3000 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 2.66GHz=32.384|2676 MHz|Unknown +2x Intel(R) Pentium(R) 4 CPU 2.60GHz=57.371|2600 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU P9500@ 2.53GHz=5.507|2535 MHz|Unknown +Intel(R) Celeron(R) M processor900MHz=64.668|900 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 4800+=12.799|2512 MHz|Unknown +Intel(R) Pentium(R) M processor 1.73GHz=27.691|798 MHz|Unknown +2x Genuine Intel(R) CPU T2080@ 1.73GHz=31.108|800 MHz|Unknown +AMD Athlon(tm) 64 Processor 4000+=20.492|1000 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 2.53GHz=36.544|2525 MHz|Unknown +Intel(R) Celeron(R) CPU560@ 2.13GHz=21.147|2128 MHz|Unknown +2x Intel(R) Core(TM)2 Extreme CPU X7900@ 2.80GHz=18.268|2800 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T9400@ 2.53GHz=5.586|800 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 6400+=10.933|1000 MHz|Unknown +Intel(R) Celeron(R) M CPU420@ 1.60GHz=36.998|1599 MHz|Unknown +2x Intel(R) Xeon(R) CPU E5405@ 2.00GHz=17.808|1995 MHz|Unknown +2x Genuine Intel(R) CPU2140@ 1.60GHz=22.055|1595 MHz|Unknown +Intel(R) Pentium(R) M processor 1700MHz=27.284|600 MHz|Unknown +Pentium II (Deschutes)=124.072|401 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T8100@ 2.10GHz=23.759|2094 MHz|Unknown +2x Intel(R) Core(TM)2 CPU4300@ 1.80GHz=18.171|1200 MHz|Unknown +AMD Athlon(tm) XP 3000+=23.066|2158 MHz|Unknown +3x AMD Phenom(tm) 8450 Triple-Core Processor=18.564|1100 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU P8400@ 2.26GHz=12.067|800 MHz|Unknown +AMD Athlon(tm) XP 1800+=31.725|1540 MHz|Unknown +Intel(R) Celeron(R) CPU550@ 2.00GHz=23.904|1995 MHz|Unknown +2x Intel(R) Pentium(R) 4 CPU 3.20GHz=31.439|2400 MHz|Unknown +Intel(R) Pentium(R) M processor 1.80GHz=27.133|600 MHz|Unknown +Intel(R) Celeron(R) CPU 2.80GHz=81.047|2793 MHz|Unknown +Genuine Intel(R) CPU T1350@ 1.86GHz=222.178|1867 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 2.80GHz=28.658|2791 MHz|Unknown +[CPU Blowfish] +2x Intel(R) Pentium(R) D CPU 3.00GHz=10.838|3000 MHz|Unknown +Intel(R) Celeron(R) CPU540@ 1.86GHz=25.494|1861 MHz|Unknown +2x AMD Turion(tm) 64 X2 TL-58=12.576|800 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 3800+=10.707|2200 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 6400+=6.421|1000 MHz|Unknown +2x Intel(R) Core(TM)2 Extreme CPU X7900@ 2.80GHz=6.809|2800 MHz|Unknown +Intel(R) Pentium(R) M processor 1.70GHz=28.279|600 MHz|Unknown +3x AMD Phenom(tm) 8650 Triple-Core Processor=5.965|2300 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 2.40GHz=24.567|2400 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 4400+=7.918|1000 MHz|Unknown +4x AMD Phenom(tm) II X4 940 Processor=3.488|800 MHz|Unknown +2x Pentium III (Coppermine)=17.808|999 MHz|Unknown +2x Intel(R) Pentium(R) 4 CPU 3.20GHz=12.058|2400 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 1500MHz=46.556|1495 MHz|Unknown +2x AMD Turion(tm) 64 X2 Mobile Technology TL-58=10.104|1900 MHz|Unknown +Intel(R) Celeron(R) M processor 1.40GHz=80.940|1395 MHz|Unknown +Mobile AMD Athlon(tm) XP 2800+=18.040|1459 MHz|Unknown +Intel(R) Celeron(R) CPU420@ 1.60GHz=21.238|1600 MHz|Unknown +4x AMD Phenom(tm) 9750 Quad-Core Processor=4.291|1200 MHz|Unknown +2x Intel(R) Atom(TM) CPU N280 @ 1.66GHz=16.764|1000 MHz|Unknown +2x AMD Athlon(tm) X2 Dual-Core QL-60=10.585|1900 MHz|Unknown +2x Intel(R) Pentium(R) DualCPUT2370@ 1.73GHz=9.581|1733 MHz|Unknown +AMD Athlon(tm) XP 1900+=31.620|1593 MHz|Unknown +AMD Athlon(tm) XP 1800+=23.128|1540 MHz|Unknown +Intel(R) Pentium(R) M processor 1.73GHz=19.657|798 MHz|Unknown +AMD Sempron(tm) Processor 3200+=25.468|1000 MHz|Unknown +VIA Esther processor 1500MHz=41.594|1499 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ6700@ 2.66GHz=3.174|2669 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 5000+=7.489|1000 MHz|Unknown +2x Intel(R) Xeon(R) CPU3040@ 1.86GHz=9.113|1862 MHz|Unknown +2x Intel(R) Pentium(R) DualCPUT2310@ 1.46GHz=11.596|1463 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU P8400@ 2.26GHz=8.293|800 MHz|Unknown +2x AMD Turion(tm) X2 Dual-Core Mobile RM-74=8.970|600 MHz|Unknown +Genuine Intel(R) CPU 575@ 2.00GHz=20.357|1995 MHz|Unknown +2x AMD Turion(tm) 64 X2 Mobile Technology TL-62=8.836|800 MHz|Unknown +2x AMD Turion(tm) 64 X2 Mobile Technology TL-56=10.790|800 MHz|Unknown +Intel(R) Celeron(R) CPU 2.80GHz=40.872|2793 MHz|Unknown +2x Intel(R) Pentium(R) 4 CPU 2.80GHz=11.699|2800 MHz|Unknown +2x Genuine Intel(R) CPU2140@ 1.60GHz=10.672|1595 MHz|Unknown +2x AMD Athlon(tm) 7750 Dual-Core Processor=7.449|1350 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU E8400@ 3.00GHz=5.538|2997 MHz|Unknown +2x Intel(R) Core(TM)2 CPU T7400@ 2.16GHz=9.372|2161 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 2.53GHz=48.077|2525 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ9550@ 2.83GHz=3.244|2830 MHz|Unknown +2x Intel(R) Core(TM)2 CPU6700@ 2.66GHz=6.902|2667 MHz|Unknown +2x AMD Turion(tm) X2 Dual-Core Mobile RM-72=11.859|500 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T9400@ 2.53GHz=6.757|800 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 4800+=8.735|2512 MHz|Unknown +Intel(R) Celeron(R) M CPU520@ 1.60GHz=22.072|1600 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ8300@ 2.50GHz=3.346|2497 MHz|Unknown +[CPU SHA1] +[CPU MD5] +[CPU Fibonacci] +4x AMD Phenom(tm) 9500 Quad-Core Processor=3.061|1100 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T7250@ 2.00GHz=4.572|2001 MHz|Unknown +2x Intel(R) Pentium(R) 4 CPU 2.80GHz=4.603|2800 MHz|Unknown +AMD Athlon(tm) Processor=7.342|1210 MHz|Unknown +2x Intel(R) Core(TM)2 CPU T5200@ 1.60GHz=7.274|1067 MHz|Unknown +4x Intel(R) Atom(TM) CPU330 @ 1.60GHz=8.789|1596 MHz|Unknown +4x AMD Phenom(tm) 9150e Quad-Core Processor=3.281|900 MHz|Unknown +AMD Turion(tm) 64 Mobile Technology MK-36=6.202|800 MHz|Unknown +AMD Athlon(tm) 64 Processor 3200+=5.764|1000 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ9400@ 2.66GHz=2.759|2003 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T7500@ 2.20GHz=4.090|800 MHz|Unknown +AMD Athlon(tm) XP=33.451|906 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ6700@ 2.66GHz=3.537|2669 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 2.00GHz=8.698|1994 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU E6550@ 2.33GHz=3.657|2700 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T7100@ 1.80GHz=4.788|1801 MHz|Unknown +2x Dual Core AMD Opteron(tm) Processor 165=4.257|1979 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 2.40GHz=6.348|2400 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU P8600@ 2.40GHz=3.374|800 MHz|Unknown +2x AMD Turion(tm) X2 Dual-Core Mobile RM-70=4.974|500 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 2.53GHz=10.356|2525 MHz|Unknown +Unknown CPU Type=5.728|1660 MHz|Unknown +2x Pentium III (Coppermine)=10.217|999 MHz|Unknown +2x Intel(R) Core(TM)2 CPU T5600@ 1.83GHz=5.239|1000 MHz|Unknown +Intel(R) Celeron(R) CPU 3.06GHz=3.961|3059 MHz|Unknown +4x AMD Phenom(tm) 9850 Quad-Core Processor=2.594|1300 MHz|Unknown +2x Intel(R) Pentium(R) 4 CPU 3.00GHz=4.977|3458 MHz|Unknown +AMD Sempron(tm) Processor LE-1200=6.085|2109 MHz|Unknown +Intel(R) Pentium(R) 4 CPU 2.80GHz=5.654|2791 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 4000+=4.124|1000 MHz|Unknown +AMD Athlon(tm) XP 1600+=6.387|1398 MHz|Unknown +2x Genuine Intel(R) CPU T2050@ 1.60GHz=6.104|800 MHz|Unknown +Intel(R) Celeron(R) CPU560@ 2.13GHz=4.776|2128 MHz|Unknown +3x AMD Phenom(tm) 8650 Triple-Core Processor=3.093|2300 MHz|Unknown +8x Intel(R) Core(TM) i7 CPU 920@ 2.67GHz=2.787|3799 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 5000+=3.110|1000 MHz|Unknown +AMD Athlon(tm) XP 2500+=7.183|1792 MHz|Unknown +2x Intel(R) Xeon(R) CPU3040@ 1.86GHz=4.808|1862 MHz|Unknown +2x AMD Athlon(tm) X2 Dual-Core QL-60=4.354|1900 MHz|Unknown +2x Intel(R) Core(TM)2 CPU T7400@ 2.16GHz=4.984|2161 MHz|Unknown +2x AMD Turion(tm) 64 X2 Mobile Technology TL-60=4.189|2000 MHz|Unknown +2x AMD Turion(tm) 64 X2 Mobile Technology TL-52=5.447|1600 MHz|Unknown +2x AMD Athlon(tm) 64 X2 Dual Core Processor 6000+=2.747|3051 MHz|Unknown +2x Intel(R) Atom(TM) CPU N280 @ 1.66GHz=8.973|1000 MHz|Unknown +4x Intel(R) Core(TM)2 Quad CPUQ9550@ 2.83GHz=2.724|2830 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU T7300@ 2.00GHz=4.773|2001 MHz|Unknown +AMD Sempron(tm) Processor 3600+=5.696|1000 MHz|Unknown +AMD Athlon(tm)=4.475|2305 MHz|Unknown +2x AMD Athlon(tm) X2 Dual Core Processor BE-2300=4.373|1899 MHz|Unknown +2x Intel(R) Core(TM)2 Duo CPU E6750@ 2.66GHz=4.096|2671 MHz|Unknown +[CPU ZLib] diff --git a/binreloc.c b/binreloc.c deleted file mode 100644 index 1d1acfe6..00000000 --- a/binreloc.c +++ /dev/null @@ -1,672 +0,0 @@ -/* - * BinReloc - a library for creating relocatable executables - * Written by: Hongli Lai - * http://autopackage.org/ - * - * This source code is public domain. You can relicense this code - * under whatever license you want. - * - * See http://autopackage.org/docs/binreloc/ for - * more information and how to use this. - */ - -#ifndef __BINRELOC_C__ -#define __BINRELOC_C__ - -#include -#include -#include -#include -#include -#include -#include -#include "binreloc.h" -#include "config.h" - -G_BEGIN_DECLS -/** @internal - * Find the canonical filename of the executable. Returns the filename - * (which must be freed) or NULL on error. If the parameter 'error' is - * not NULL, the error code will be stored there, if an error occured. - */ -static char *_br_find_exe(GbrInitError * error) -{ - char *path, *path2, *line, *result; - size_t buf_size; - ssize_t size; - struct stat stat_buf; - FILE *f; - - /* Read from /proc/self/exe (symlink) */ - if (sizeof(path) > SSIZE_MAX) - buf_size = SSIZE_MAX - 1; - else - buf_size = PATH_MAX - 1; - path = (char *) g_try_malloc(buf_size); - if (path == NULL) { - /* Cannot allocate memory. */ - if (error) - *error = GBR_INIT_ERROR_NOMEM; - return NULL; - } - path2 = (char *) g_try_malloc(buf_size); - if (path2 == NULL) { - /* Cannot allocate memory. */ - if (error) - *error = GBR_INIT_ERROR_NOMEM; - g_free(path); - return NULL; - } - - strncpy(path2, "/proc/self/exe", buf_size - 1); - - while (1) { - int i; - - size = readlink(path2, path, buf_size - 1); - if (size == -1) { - /* Error. */ - g_free(path2); - break; - } - - /* readlink() success. */ - path[size] = '\0'; - - /* Check whether the symlink's target is also a symlink. - * We want to get the final target. */ - i = stat(path, &stat_buf); - if (i == -1) { - /* Error. */ - g_free(path2); - break; - } - - /* stat() success. */ - if (!S_ISLNK(stat_buf.st_mode)) { - /* path is not a symlink. Done. */ - g_free(path2); - return path; - } - - /* path is a symlink. Continue loop and resolve this. */ - strncpy(path, path2, buf_size - 1); - } - - - /* readlink() or stat() failed; this can happen when the program is - * running in Valgrind 2.2. Read from /proc/self/maps as fallback. */ - - buf_size = PATH_MAX + 128; - line = (char *) g_try_realloc(path, buf_size); - if (line == NULL) { - /* Cannot allocate memory. */ - g_free(path); - if (error) - *error = GBR_INIT_ERROR_NOMEM; - return NULL; - } - - f = fopen("/proc/self/maps", "r"); - if (f == NULL) { - g_free(line); - if (error) - *error = GBR_INIT_ERROR_OPEN_MAPS; - return NULL; - } - - /* The first entry should be the executable name. */ - result = fgets(line, (int) buf_size, f); - if (result == NULL) { - fclose(f); - g_free(line); - if (error) - *error = GBR_INIT_ERROR_READ_MAPS; - return NULL; - } - - /* Get rid of newline character. */ - buf_size = strlen(line); - if (buf_size <= 0) { - /* Huh? An empty string? */ - fclose(f); - g_free(line); - if (error) - *error = GBR_INIT_ERROR_INVALID_MAPS; - return NULL; - } - if (line[buf_size - 1] == 10) - line[buf_size - 1] = 0; - - /* Extract the filename; it is always an absolute path. */ - path = strchr(line, '/'); - - /* Sanity check. */ - if (strstr(line, " r-xp ") == NULL || path == NULL) { - fclose(f); - g_free(line); - if (error) - *error = GBR_INIT_ERROR_INVALID_MAPS; - return NULL; - } - - path = g_strdup(path); - g_free(line); - fclose(f); - return path; -} - - -/** @internal - * Find the canonical filename of the executable which owns symbol. - * Returns a filename which must be freed, or NULL on error. - */ -static char *_br_find_exe_for_symbol(const void *symbol, - GbrInitError * error) -{ -#define SIZE PATH_MAX + 100 - FILE *f; - size_t address_string_len; - char *address_string, line[SIZE], *found; - - if (symbol == NULL) - return (char *) NULL; - - f = fopen("/proc/self/maps", "r"); - if (f == NULL) - return (char *) NULL; - - address_string_len = 4; - address_string = (char *) g_try_malloc(address_string_len); - found = (char *) NULL; - - while (!feof(f)) { - char *start_addr, *end_addr, *end_addr_end, *file; - void *start_addr_p, *end_addr_p; - size_t len; - - if (fgets(line, SIZE, f) == NULL) - break; - - /* Sanity check. */ - if (strstr(line, " r-xp ") == NULL || strchr(line, '/') == NULL) - continue; - - /* Parse line. */ - start_addr = line; - end_addr = strchr(line, '-'); - file = strchr(line, '/'); - - /* More sanity check. */ - if (!(file > end_addr && end_addr != NULL && end_addr[0] == '-')) - continue; - - end_addr[0] = '\0'; - end_addr++; - end_addr_end = strchr(end_addr, ' '); - if (end_addr_end == NULL) - continue; - - end_addr_end[0] = '\0'; - len = strlen(file); - if (len == 0) - continue; - if (file[len - 1] == '\n') - file[len - 1] = '\0'; - - /* Get rid of "(deleted)" from the filename. */ - len = strlen(file); - if (len > 10 && strcmp(file + len - 10, " (deleted)") == 0) - file[len - 10] = '\0'; - - /* I don't know whether this can happen but better safe than sorry. */ - len = strlen(start_addr); - if (len != strlen(end_addr)) - continue; - - - /* Transform the addresses into a string in the form of 0xdeadbeef, - * then transform that into a pointer. */ - if (address_string_len < len + 3) { - address_string_len = len + 3; - address_string = - (char *) g_try_realloc(address_string, address_string_len); - } - - memcpy(address_string, "0x", 2); - memcpy(address_string + 2, start_addr, len); - address_string[2 + len] = '\0'; - sscanf(address_string, "%p", &start_addr_p); - - memcpy(address_string, "0x", 2); - memcpy(address_string + 2, end_addr, len); - address_string[2 + len] = '\0'; - sscanf(address_string, "%p", &end_addr_p); - - - if (symbol >= start_addr_p && symbol < end_addr_p) { - found = file; - break; - } - } - - g_free(address_string); - fclose(f); - - if (found == NULL) - return (char *) NULL; - else - return g_strdup(found); -} - - -static gchar *exe = NULL; - -static void set_gerror(GError ** error, GbrInitError errcode); - - -/** Initialize the BinReloc library (for applications). - * - * This function must be called before using any other BinReloc functions. - * It attempts to locate the application's canonical filename. - * - * @note If you want to use BinReloc for a library, then you should call - * gbr_init_lib() instead. - * - * @param error If BinReloc failed to initialize, then the error report will - * be stored in this variable. Set to NULL if you don't want an - * error report. See the #GbrInitError for a list of error - * codes. - * - * @returns TRUE on success, FALSE if BinReloc failed to initialize. - */ -gboolean gbr_init(GError ** error) -{ - GbrInitError errcode = 0; - - /* Locate the application's filename. */ - exe = _br_find_exe(&errcode); - if (exe != NULL) - /* Success! */ - return TRUE; - else { - /* Failed :-( */ - set_gerror(error, errcode); - return FALSE; - } -} - - -/** Initialize the BinReloc library (for libraries). - * - * This function must be called before using any other BinReloc functions. - * It attempts to locate the calling library's canonical filename. - * - * @note The BinReloc source code MUST be included in your library, or this - * function won't work correctly. - * - * @returns TRUE on success, FALSE if a filename cannot be found. - */ -gboolean gbr_init_lib(GError ** error) -{ - GbrInitError errcode = 0; - - exe = _br_find_exe_for_symbol((const void *) "", &errcode); - if (exe != NULL) - /* Success! */ - return TRUE; - else { - /* Failed :-( */ - set_gerror(error, errcode); - return exe != NULL; - } -} - - -static void set_gerror(GError ** error, GbrInitError errcode) -{ - gchar *error_message; - - if (error == NULL) - return; - - switch (errcode) { - case GBR_INIT_ERROR_NOMEM: - error_message = "Cannot allocate memory."; - break; - case GBR_INIT_ERROR_OPEN_MAPS: - error_message = "Unable to open /proc/self/maps for reading."; - break; - case GBR_INIT_ERROR_READ_MAPS: - error_message = "Unable to read from /proc/self/maps."; - break; - case GBR_INIT_ERROR_INVALID_MAPS: - error_message = "The file format of /proc/self/maps is invalid."; - break; - case GBR_INIT_ERROR_DISABLED: - error_message = "Binary relocation support is disabled."; - break; - default: - error_message = "Unknown error."; - break; - }; - g_set_error(error, g_quark_from_static_string("GBinReloc"), - errcode, "%s", error_message); -} - - -/** Find the canonical filename of the current application. - * - * @param default_exe A default filename which will be used as fallback. - * @returns A string containing the application's canonical filename, - * which must be freed when no longer necessary. If BinReloc is - * not initialized, or if the initialization function failed, - * then a copy of default_exe will be returned. If default_exe - * is NULL, then NULL will be returned. - */ -gchar *gbr_find_exe(const gchar * default_exe) -{ - if (exe == NULL) { - /* BinReloc is not initialized. */ - if (default_exe != NULL) - return g_strdup(default_exe); - else - return NULL; - } - return g_strdup(exe); -} - - -/** Locate the directory in which the current application is installed. - * - * The prefix is generated by the following pseudo-code evaluation: - * \code - * dirname(exename) - * \endcode - * - * @param default_dir A default directory which will used as fallback. - * @return A string containing the directory, which must be freed when no - * longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_dir - * will be returned. If default_dir is NULL, then NULL will be - * returned. - */ -gchar *gbr_find_exe_dir(const gchar * default_dir) -{ - if (exe == NULL) { - /* BinReloc not initialized. */ - if (default_dir != NULL) - return g_strdup(default_dir); - else - return NULL; - } - - return g_path_get_dirname(exe); -} - - -/** Locate the prefix in which the current application is installed. - * - * The prefix is generated by the following pseudo-code evaluation: - * \code - * dirname(dirname(exename)) - * \endcode - * - * @param default_prefix A default prefix which will used as fallback. - * @return A string containing the prefix, which must be freed when no - * longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_prefix - * will be returned. If default_prefix is NULL, then NULL will be - * returned. - */ -gchar *gbr_find_prefix(const gchar * default_prefix) -{ - gchar *dir1, *dir2; - - if (exe == NULL) { - /* BinReloc not initialized. */ - if (default_prefix != NULL) - return g_strdup(default_prefix); - else - return NULL; - } - - dir1 = g_path_get_dirname(exe); - dir2 = g_path_get_dirname(dir1); - g_free(dir1); - return dir2; -} - - -/** Locate the application's binary folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/bin" - * \endcode - * - * @param default_bin_dir A default path which will used as fallback. - * @return A string containing the bin folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_bin_dir will - * be returned. If default_bin_dir is NULL, then NULL will be returned. - */ -gchar *gbr_find_bin_dir(const gchar * default_bin_dir) -{ - gchar *prefix, *dir; - - prefix = gbr_find_prefix(NULL); - if (prefix == NULL) { - /* BinReloc not initialized. */ - if (default_bin_dir != NULL) - return g_strdup(default_bin_dir); - else - return NULL; - } - - dir = g_build_filename(prefix, "bin", NULL); - g_free(prefix); - return dir; -} - - -/** Locate the application's superuser binary folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/sbin" - * \endcode - * - * @param default_sbin_dir A default path which will used as fallback. - * @return A string containing the sbin folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_sbin_dir will - * be returned. If default_bin_dir is NULL, then NULL will be returned. - */ -gchar *gbr_find_sbin_dir(const gchar * default_sbin_dir) -{ - gchar *prefix, *dir; - - prefix = gbr_find_prefix(NULL); - if (prefix == NULL) { - /* BinReloc not initialized. */ - if (default_sbin_dir != NULL) - return g_strdup(default_sbin_dir); - else - return NULL; - } - - dir = g_build_filename(prefix, "sbin", NULL); - g_free(prefix); - return dir; -} - - -/** Locate the application's data folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/share" - * \endcode - * - * @param default_data_dir A default path which will used as fallback. - * @return A string containing the data folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_data_dir - * will be returned. If default_data_dir is NULL, then NULL will be - * returned. - */ -gchar *gbr_find_data_dir(const gchar * default_data_dir) -{ - gchar *prefix, *dir; - - prefix = gbr_find_prefix(NULL); - if (prefix == NULL) { - /* BinReloc not initialized. */ - if (default_data_dir != NULL) - return g_strdup(default_data_dir); - else - return NULL; - } - - dir = g_build_filename(prefix, "share", NULL); - g_free(prefix); - return dir; -} - - -/** Locate the application's localization folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/share/locale" - * \endcode - * - * @param default_locale_dir A default path which will used as fallback. - * @return A string containing the localization folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_locale_dir will be returned. - * If default_locale_dir is NULL, then NULL will be returned. - */ -gchar *gbr_find_locale_dir(const gchar * default_locale_dir) -{ - gchar *data_dir, *dir; - - data_dir = gbr_find_data_dir(NULL); - if (data_dir == NULL) { - /* BinReloc not initialized. */ - if (default_locale_dir != NULL) - return g_strdup(default_locale_dir); - else - return NULL; - } - - dir = g_build_filename(data_dir, "locale", NULL); - g_free(data_dir); - return dir; -} - - -/** Locate the application's library folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/lib" - * \endcode - * - * @param default_lib_dir A default path which will used as fallback. - * @return A string containing the library folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_lib_dir will be returned. - * If default_lib_dir is NULL, then NULL will be returned. - */ -gchar *gbr_find_lib_dir(const gchar * default_lib_dir) -{ - gchar *prefix, *dir; - - prefix = gbr_find_prefix(NULL); - if (prefix == NULL) { - /* BinReloc not initialized. */ - if (default_lib_dir != NULL) - return g_strdup(default_lib_dir); - else - return NULL; - } - -#ifdef ARCH_x86_64 - dir = g_build_filename(prefix, "lib64", NULL); -#else - dir = g_build_filename(prefix, "lib", NULL); -#endif - - g_free(prefix); - return dir; -} - - -/** Locate the application's libexec folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/libexec" - * \endcode - * - * @param default_libexec_dir A default path which will used as fallback. - * @return A string containing the libexec folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the initialization - * function failed, then a copy of default_libexec_dir will be returned. - * If default_libexec_dir is NULL, then NULL will be returned. - */ -gchar *gbr_find_libexec_dir(const gchar * default_libexec_dir) -{ - gchar *prefix, *dir; - - prefix = gbr_find_prefix(NULL); - if (prefix == NULL) { - /* BinReloc not initialized. */ - if (default_libexec_dir != NULL) - return g_strdup(default_libexec_dir); - else - return NULL; - } - - dir = g_build_filename(prefix, "libexec", NULL); - g_free(prefix); - return dir; -} - - -/** Locate the application's configuration files folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/etc" - * \endcode - * - * @param default_etc_dir A default path which will used as fallback. - * @return A string containing the etc folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the initialization - * function failed, then a copy of default_etc_dir will be returned. - * If default_etc_dir is NULL, then NULL will be returned. - */ -gchar *gbr_find_etc_dir(const gchar * default_etc_dir) -{ - gchar *prefix, *dir; - - prefix = gbr_find_prefix(NULL); - if (prefix == NULL) { - /* BinReloc not initialized. */ - if (default_etc_dir != NULL) - return g_strdup(default_etc_dir); - else - return NULL; - } - - dir = g_build_filename(prefix, "etc", NULL); - g_free(prefix); - return dir; -} - - -G_END_DECLS -#endif /* __BINRELOC_C__ */ diff --git a/binreloc.h b/binreloc.h deleted file mode 100644 index 3bf48bc6..00000000 --- a/binreloc.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * BinReloc - a library for creating relocatable executables - * Written by: Hongli Lai - * http://autopackage.org/ - * - * This source code is public domain. You can relicense this code - * under whatever license you want. - * - * See http://autopackage.org/docs/binreloc/ for - * more information and how to use this. - */ - -#ifndef __BINRELOC_H__ -#define __BINRELOC_H__ - -#include - -G_BEGIN_DECLS - - -/** These error codes can be returned by br_init(), br_init_lib(), gbr_init() or gbr_init_lib(). */ -typedef enum { - /** Cannot allocate memory. */ - GBR_INIT_ERROR_NOMEM, - /** Unable to open /proc/self/maps; see errno for details. */ - GBR_INIT_ERROR_OPEN_MAPS, - /** Unable to read from /proc/self/maps; see errno for details. */ - GBR_INIT_ERROR_READ_MAPS, - /** The file format of /proc/self/maps is invalid; kernel bug? */ - GBR_INIT_ERROR_INVALID_MAPS, - /** BinReloc is disabled (the ENABLE_BINRELOC macro is not defined). */ - GBR_INIT_ERROR_DISABLED -} GbrInitError; - - -#ifndef BINRELOC_RUNNING_DOXYGEN -/* Mangle symbol names to avoid symbol collisions with other ELF objects. */ - #define gbr_find_exe UfUy21856259474323_gbr_find_exe - #define gbr_find_exe_dir UfUy21856259474323_gbr_find_exe_dir - #define gbr_find_prefix UfUy21856259474323_gbr_find_prefix - #define gbr_find_bin_dir UfUy21856259474323_gbr_find_bin_dir - #define gbr_find_sbin_dir UfUy21856259474323_gbr_find_sbin_dir - #define gbr_find_data_dir UfUy21856259474323_gbr_find_data_dir - #define gbr_find_locale_dir UfUy21856259474323_gbr_find_locale_dir - #define gbr_find_lib_dir UfUy21856259474323_gbr_find_lib_dir - #define gbr_find_libexec_dir UfUy21856259474323_gbr_find_libexec_dir - #define gbr_find_etc_dir UfUy21856259474323_gbr_find_etc_dir - - -#endif -gboolean gbr_init (GError **error); -gboolean gbr_init_lib (GError **error); - -gchar *gbr_find_exe (const gchar *default_exe); -gchar *gbr_find_exe_dir (const gchar *default_dir); -gchar *gbr_find_prefix (const gchar *default_prefix); -gchar *gbr_find_bin_dir (const gchar *default_bin_dir); -gchar *gbr_find_sbin_dir (const gchar *default_sbin_dir); -gchar *gbr_find_data_dir (const gchar *default_data_dir); -gchar *gbr_find_locale_dir (const gchar *default_locale_dir); -gchar *gbr_find_lib_dir (const gchar *default_lib_dir); -gchar *gbr_find_libexec_dir (const gchar *default_libexec_dir); -gchar *gbr_find_etc_dir (const gchar *default_etc_dir); - - -G_END_DECLS - -#endif /* __BINRELOC_H__ */ diff --git a/blowfish.c b/blowfish.c deleted file mode 100644 index 034315ab..00000000 --- a/blowfish.c +++ /dev/null @@ -1,493 +0,0 @@ -/* -blowfish.c: C implementation of the Blowfish algorithm. - -Copyright (C) 1997 by Paul Kocher - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - - -COMMENTS ON USING THIS CODE: - -Normal usage is as follows: - [1] Allocate a BLOWFISH_CTX. (It may be too big for the stack.) - [2] Call Blowfish_Init with a pointer to your BLOWFISH_CTX, a pointer to - the key, and the number of bytes in the key. - [3] To encrypt a 64-bit block, call Blowfish_Encrypt with a pointer to - BLOWFISH_CTX, a pointer to the 32-bit left half of the plaintext - and a pointer to the 32-bit right half. The plaintext will be - overwritten with the ciphertext. - [4] Decryption is the same as encryption except that the plaintext and - ciphertext are reversed. - -Warning #1: The code does not check key lengths. (Caveat encryptor.) -Warning #2: Beware that Blowfish keys repeat such that "ab" = "abab". -Warning #3: It is normally a good idea to zeroize the BLOWFISH_CTX before - freeing it. -Warning #4: Endianness conversions are the responsibility of the caller. - (To encrypt bytes on a little-endian platforms, you'll probably want - to swap bytes around instead of just casting.) -Warning #5: Make sure to use a reasonable mode of operation for your - application. (If you don't know what CBC mode is, see Warning #7.) -Warning #6: This code is susceptible to timing attacks. -Warning #7: Security engineering is risky and non-intuitive. Have someone - check your work. If you don't know what you are doing, get help. - - -This is code is fast enough for most applications, but is not optimized for -speed. - -If you require this code under a license other than LGPL, please ask. (I -can be located using your favorite search engine.) Unfortunately, I do not -have time to provide unpaid support for everyone who uses this code. - - -- Paul Kocher -*/ - -#include "blowfish.h" - -#define N 16 -static const unsigned long ORIG_P[16 + 2] = - { 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L, 0xA4093822L, - 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L, 0x452821E6L, 0x38D01377L, - 0xBE5466CFL, 0x34E90C6CL, 0xC0AC29B7L, - 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L, 0x9216D5D9L, 0x8979FB1BL -}; - -static const unsigned long ORIG_S[4][256] = { - {0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L, 0xB8E1AFEDL, - 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L, 0x24A19947L, 0xB3916CF7L, - 0x0801F2E2L, 0x858EFC16L, 0x636920D8L, 0x71574E69L, 0xA458FEA3L, - 0xF4933D7EL, 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL, - 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L, 0xC5D1B023L, - 0x286085F0L, 0xCA417918L, 0xB8DB38EFL, 0x8E79DCB0L, 0x603A180EL, - 0x6C9E0E8BL, 0xB01E8A3EL, 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, - 0x55605C60L, 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L, - 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL, 0xA15486AFL, - 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL, 0x2BA9C55DL, 0x741831F6L, - 0xCE5C3E16L, 0x9B87931EL, 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, - 0x28958677L, 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L, - 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L, 0xEF845D5DL, - 0xE98575B1L, 0xDC262302L, 0xEB651B88L, 0x23893E81L, 0xD396ACC5L, - 0x0F6D6FF3L, 0x83F44239L, 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, - 0x9E1F9B5EL, 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L, - 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L, 0x6EEF0B6CL, - 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L, 0xA1F1651DL, 0x39AF0176L, - 0x66CA593EL, 0x82430E88L, 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, - 0x3B8B5EBEL, 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L, - 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL, 0x37D0D724L, - 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL, 0x075372C9L, 0x80991B7BL, - 0x25D479D8L, 0xF6E8DEF7L, 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, - 0x04C006BAL, 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L, - 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL, 0x6DFC511FL, - 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L, 0xBEE3D004L, 0xDE334AFDL, - 0x660F2807L, 0x192E4BB3L, 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, - 0xB9D3FBDBL, 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L, - 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L, 0x3C7516DFL, - 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL, 0x323DB5FAL, 0xFD238760L, - 0x53317B48L, 0x3E00DF82L, 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, - 0xDF1769DBL, 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L, - 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L, 0x10FA3D98L, - 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL, 0x9A53E479L, 0xB6F84565L, - 0xD28E49BCL, 0x4BFB9790L, 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, - 0xCEE4C6E8L, 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L, - 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L, 0xD08ED1D0L, - 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L, 0x8FF6E2FBL, 0xF2122B64L, - 0x8888B812L, 0x900DF01CL, 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, - 0xB3A8C1ADL, 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L, - 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L, 0xB4A84FE0L, - 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L, 0x165FA266L, 0x80957705L, - 0x93CC7314L, 0x211A1477L, 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, - 0xFB9D35CFL, 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L, - 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL, 0x2464369BL, - 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL, 0x78C14389L, 0xD95A537FL, - 0x207D5BA2L, 0x02E5B9C5L, 0x83260376L, 0x6295CFA9L, 0x11C81968L, - 0x4E734A41L, 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L, - 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L, 0x08BA6FB5L, - 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L, 0xB6636521L, 0xE7B9F9B6L, - 0xFF34052EL, 0xC5855664L, 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, - 0x6E85076AL}, {0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, - 0xC4192623L, 0xAD6EA6B0L, 0x49A7DF7DL, - 0x9CEE60B8L, 0x8FEDB266L, 0xECAA8C71L, - 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L, - 0x193602A5L, 0x75094C29L, 0xA0591340L, - 0xE4183A3EL, 0x3F54989AL, 0x5B429D65L, - 0x6B8FE4D6L, 0x99F73FD6L, 0xA1D29C07L, - 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L, - 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, - 0x021ECC5EL, 0x09686B3FL, 0x3EBAEFC9L, - 0x3C971814L, 0x6B6A70A1L, 0x687F3584L, - 0x52A0E286L, 0xB79C5305L, 0xAA500737L, - 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, - 0x5716F2B8L, 0xB03ADA37L, 0xF0500C0DL, - 0xF01C1F04L, 0x0200B3FFL, 0xAE0CF51AL, - 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL, - 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, - 0x22F54701L, 0x3AE5E581L, 0x37C2DADCL, - 0xC8B57634L, 0x9AF3DDA7L, 0xA9446146L, - 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L, - 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, - 0x183EB331L, 0x4E548B38L, 0x4F6DB908L, - 0x6F420D03L, 0xF60A04BFL, 0x2CB81290L, - 0x24977C79L, 0x5679B072L, 0xBCAF89AFL, - 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, - 0xDCCF3F2EL, 0x5512721FL, 0x2E6B7124L, - 0x501ADDE6L, 0x9F84CD87L, 0x7A584718L, - 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL, - 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, - 0xC464C3D2L, 0xEF1C1847L, 0x3215D908L, - 0xDD433B37L, 0x24C2BA16L, 0x12A14D43L, - 0x2A65C451L, 0x50940002L, 0x133AE4DDL, - 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, - 0x5F11199BL, 0x043556F1L, 0xD7A3C76BL, - 0x3C11183BL, 0x5924A509L, 0xF28FE6EDL, - 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL, - 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, - 0x5A3E2AB3L, 0x771FE71CL, 0x4E3D06FAL, - 0x2965DCB9L, 0x99E71D0FL, 0x803E89D6L, - 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL, - 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, - 0x1E0A2DF4L, 0xF2F74EA7L, 0x361D2B3DL, - 0x1939260FL, 0x19C27960L, 0x5223A708L, - 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L, - 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, - 0x018CFF28L, 0xC332DDEFL, 0xBE6C5AA5L, - 0x65582185L, 0x68AB9802L, 0xEECEA50FL, - 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L, - 0x1521B628L, 0x29076170L, 0xECDD4775L, - 0x619F1510L, 0x13CCA830L, 0xEB61BD96L, - 0x0334FE1EL, 0xAA0363CFL, 0xB5735C90L, - 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L, - 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, - 0xB2F3846EL, 0x648B1EAFL, 0x19BDF0CAL, - 0xA02369B9L, 0x655ABB50L, 0x40685A32L, - 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L, - 0x9B540B19L, 0x875FA099L, 0x95F7997EL, - 0x623D7DA8L, 0xF837889AL, 0x97E32D77L, - 0x11ED935FL, 0x16681281L, 0x0E358829L, - 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L, - 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, - 0x1AC24696L, 0xCDB30AEBL, 0x532E3054L, - 0x8FD948E4L, 0x6DBC3128L, 0x58EBF2EFL, - 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L, - 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, - 0x203E13E0L, 0x45EEE2B6L, 0xA3AAABEAL, - 0xDB6C4F15L, 0xFACB4FD0L, 0xC742F442L, - 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L, - 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, - 0x3D816250L, 0xCF62A1F2L, 0x5B8D2646L, - 0xFC8883A0L, 0xC1C7B6A3L, 0x7F1524C3L, - 0x69CB7492L, 0x47848A0BL, 0x5692B285L, - 0x095BBF00L, 0xAD19489DL, 0x1462B174L, - 0x23820E00L, 0x58428D2AL, 0x0C55F5EAL, - 0x1DADF43EL, 0x233F7061L, 0x3372F092L, - 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL, - 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, - 0xCE77326EL, 0xA6078084L, 0x19F8509EL, - 0xE8EFD855L, 0x61D99735L, 0xA969A7AAL, - 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL, - 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, - 0x0E1E9EC9L, 0xDB73DBD3L, 0x105588CDL, - 0x675FDA79L, 0xE3674340L, 0xC5C43465L, - 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L, - 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, - 0xDB83ADF7L}, {0xE93D5A68L, 0x948140F7L, - 0xF64C261CL, 0x94692934L, - 0x411520F7L, 0x7602D4F7L, - 0xBCF46B2EL, 0xD4A20068L, - 0xD4082471L, 0x3320F46AL, - 0x43B7D4B7L, 0x500061AFL, - 0x1E39F62EL, 0x97244546L, - 0x14214F74L, 0xBF8B8840L, - 0x4D95FC1DL, 0x96B591AFL, - 0x70F4DDD3L, 0x66A02F45L, - 0xBFBC09ECL, 0x03BD9785L, - 0x7FAC6DD0L, 0x31CB8504L, - 0x96EB27B3L, 0x55FD3941L, - 0xDA2547E6L, 0xABCA0A9AL, - 0x28507825L, 0x530429F4L, - 0x0A2C86DAL, 0xE9B66DFBL, - 0x68DC1462L, 0xD7486900L, - 0x680EC0A4L, 0x27A18DEEL, - 0x4F3FFEA2L, 0xE887AD8CL, - 0xB58CE006L, 0x7AF4D6B6L, - 0xAACE1E7CL, 0xD3375FECL, - 0xCE78A399L, 0x406B2A42L, - 0x20FE9E35L, 0xD9F385B9L, - 0xEE39D7ABL, 0x3B124E8BL, - 0x1DC9FAF7L, 0x4B6D1856L, - 0x26A36631L, 0xEAE397B2L, - 0x3A6EFA74L, 0xDD5B4332L, - 0x6841E7F7L, 0xCA7820FBL, - 0xFB0AF54EL, 0xD8FEB397L, - 0x454056ACL, 0xBA489527L, - 0x55533A3AL, 0x20838D87L, - 0xFE6BA9B7L, 0xD096954BL, - 0x55A867BCL, 0xA1159A58L, - 0xCCA92963L, 0x99E1DB33L, - 0xA62A4A56L, 0x3F3125F9L, - 0x5EF47E1CL, 0x9029317CL, - 0xFDF8E802L, 0x04272F70L, - 0x80BB155CL, 0x05282CE3L, - 0x95C11548L, 0xE4C66D22L, - 0x48C1133FL, 0xC70F86DCL, - 0x07F9C9EEL, 0x41041F0FL, - 0x404779A4L, 0x5D886E17L, - 0x325F51EBL, 0xD59BC0D1L, - 0xF2BCC18FL, 0x41113564L, - 0x257B7834L, 0x602A9C60L, - 0xDFF8E8A3L, 0x1F636C1BL, - 0x0E12B4C2L, 0x02E1329EL, - 0xAF664FD1L, 0xCAD18115L, - 0x6B2395E0L, 0x333E92E1L, - 0x3B240B62L, 0xEEBEB922L, - 0x85B2A20EL, 0xE6BA0D99L, - 0xDE720C8CL, 0x2DA2F728L, - 0xD0127845L, 0x95B794FDL, - 0x647D0862L, 0xE7CCF5F0L, - 0x5449A36FL, 0x877D48FAL, - 0xC39DFD27L, 0xF33E8D1EL, - 0x0A476341L, 0x992EFF74L, - 0x3A6F6EABL, 0xF4F8FD37L, - 0xA812DC60L, 0xA1EBDDF8L, - 0x991BE14CL, 0xDB6E6B0DL, - 0xC67B5510L, 0x6D672C37L, - 0x2765D43BL, 0xDCD0E804L, - 0xF1290DC7L, 0xCC00FFA3L, - 0xB5390F92L, 0x690FED0BL, - 0x667B9FFBL, 0xCEDB7D9CL, - 0xA091CF0BL, 0xD9155EA3L, - 0xBB132F88L, 0x515BAD24L, - 0x7B9479BFL, 0x763BD6EBL, - 0x37392EB3L, 0xCC115979L, - 0x8026E297L, 0xF42E312DL, - 0x6842ADA7L, 0xC66A2B3BL, - 0x12754CCCL, 0x782EF11CL, - 0x6A124237L, 0xB79251E7L, - 0x06A1BBE6L, 0x4BFB6350L, - 0x1A6B1018L, 0x11CAEDFAL, - 0x3D25BDD8L, 0xE2E1C3C9L, - 0x44421659L, 0x0A121386L, - 0xD90CEC6EL, 0xD5ABEA2AL, - 0x64AF674EL, 0xDA86A85FL, - 0xBEBFE988L, 0x64E4C3FEL, - 0x9DBC8057L, 0xF0F7C086L, - 0x60787BF8L, 0x6003604DL, - 0xD1FD8346L, 0xF6381FB0L, - 0x7745AE04L, 0xD736FCCCL, - 0x83426B33L, 0xF01EAB71L, - 0xB0804187L, 0x3C005E5FL, - 0x77A057BEL, 0xBDE8AE24L, - 0x55464299L, 0xBF582E61L, - 0x4E58F48FL, 0xF2DDFDA2L, - 0xF474EF38L, 0x8789BDC2L, - 0x5366F9C3L, 0xC8B38E74L, - 0xB475F255L, 0x46FCD9B9L, - 0x7AEB2661L, 0x8B1DDF84L, - 0x846A0E79L, 0x915F95E2L, - 0x466E598EL, 0x20B45770L, - 0x8CD55591L, 0xC902DE4CL, - 0xB90BACE1L, 0xBB8205D0L, - 0x11A86248L, 0x7574A99EL, - 0xB77F19B6L, 0xE0A9DC09L, - 0x662D09A1L, 0xC4324633L, - 0xE85A1F02L, 0x09F0BE8CL, - 0x4A99A025L, 0x1D6EFE10L, - 0x1AB93D1DL, 0x0BA5A4DFL, - 0xA186F20FL, 0x2868F169L, - 0xDCB7DA83L, 0x573906FEL, - 0xA1E2CE9BL, 0x4FCD7F52L, - 0x50115E01L, 0xA70683FAL, - 0xA002B5C4L, 0x0DE6D027L, - 0x9AF88C27L, 0x773F8641L, - 0xC3604C06L, 0x61A806B5L, - 0xF0177A28L, 0xC0F586E0L, - 0x006058AAL, 0x30DC7D62L, - 0x11E69ED7L, 0x2338EA63L, - 0x53C2DD94L, 0xC2C21634L, - 0xBBCBEE56L, 0x90BCB6DEL, - 0xEBFC7DA1L, 0xCE591D76L, - 0x6F05E409L, 0x4B7C0188L, - 0x39720A3DL, 0x7C927C24L, - 0x86E3725FL, 0x724D9DB9L, - 0x1AC15BB4L, 0xD39EB8FCL, - 0xED545578L, 0x08FCA5B5L, - 0xD83D7CD3L, 0x4DAD0FC4L, - 0x1E50EF5EL, 0xB161E6F8L, - 0xA28514D9L, 0x6C51133CL, - 0x6FD5C7E7L, 0x56E14EC4L, - 0x362ABFCEL, 0xDDC6C837L, - 0xD79A3234L, 0x92638212L, - 0x670EFA8EL, 0x406000E0L}, -{0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL, 0x5CB0679EL, - 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL, 0xD5118E9DL, 0xBF0F7315L, - 0xD62D1C7EL, 0xC700C47BL, 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, - 0x6A366EB4L, 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L, - 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L, 0x2939BBDBL, - 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L, 0xA1FAD5F0L, 0x6A2D519AL, - 0x63EF8CE2L, 0x9A86EE22L, 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, - 0x9CF2D0A4L, 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L, - 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L, 0xC72FEFD3L, - 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L, 0x80E4A915L, 0x87B08601L, - 0x9B09E6ADL, 0x3B3EE593L, 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, - 0x022B8B51L, 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L, - 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL, 0xE029AC71L, - 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL, 0xE8D3C48DL, 0x283B57CCL, - 0xF8D56629L, 0x79132E28L, 0x785F0191L, 0xED756055L, 0xF7960E44L, - 0xE3D35E8CL, 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL, - 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL, 0x1B3F6D9BL, - 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L, 0x7533D928L, 0xB155FDF5L, - 0x03563482L, 0x8ABA3CBBL, 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, - 0xCCAD925FL, 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L, - 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L, 0xA8B6E37EL, - 0xC3293D46L, 0x48DE5369L, 0x6413E680L, 0xA2AE0810L, 0xDD6DB224L, - 0x69852DFDL, 0x09072166L, 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, - 0x1C20C8AEL, 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL, - 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L, 0x72EACEA8L, - 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L, 0xD29BE463L, 0x542F5D9EL, - 0xAEC2771BL, 0xF64E6370L, 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, - 0xAF537D5DL, 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L, - 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L, 0x6F3F3B82L, - 0x3520AB82L, 0x011A1D4BL, 0x277227F8L, 0x611560B1L, 0xE7933FDCL, - 0xBB3A792BL, 0x344525BDL, 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, - 0xA01FBAC9L, 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L, - 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L, 0x0339C32AL, - 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL, 0xF79E59B7L, 0x43F5BB3AL, - 0xF2D519FFL, 0x27D9459CL, 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, - 0x9B941525L, 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L, - 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L, 0xE0EC6E0EL, - 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L, 0x9F1F9532L, 0xE0D392DFL, - 0xD3A0342BL, 0x8971F21EL, 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, - 0xC37632D8L, 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL, - 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL, 0x1618B166L, - 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L, 0xF523F357L, 0xA6327623L, - 0x93A83531L, 0x56CCCD02L, 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, - 0x88D273CCL, 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L, - 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL, 0xC9AA53FDL, - 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L, 0x71126905L, 0xB2040222L, - 0xB6CBCF7CL, 0xCD769C2BL, 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, - 0x2547ADF0L, 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L, - 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL, 0x1948C25CL, - 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L, 0x90D4F869L, 0xA65CDEA0L, - 0x3F09252DL, 0xC208E69FL, 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, - 0x3AC372E6L} -}; - -static unsigned long F(BLOWFISH_CTX * ctx, unsigned long x) -{ - unsigned short a, b, c, d; - unsigned long y; - d = (unsigned short) (x & 0xFF); - x >>= 8; - c = (unsigned short) (x & 0xFF); - x >>= 8; - b = (unsigned short) (x & 0xFF); - x >>= 8; - a = (unsigned short) (x & 0xFF); - y = ctx->S[0][a] + ctx->S[1][b]; - y = y ^ ctx->S[2][c]; - y = y + ctx->S[3][d]; - return y; -} - -void Blowfish_Encrypt(BLOWFISH_CTX * ctx, unsigned long *xl, - unsigned long *xr) -{ - unsigned long Xl; - unsigned long Xr; - unsigned long temp; - short i; - Xl = *xl; - Xr = *xr; - for (i = 0; i < N; ++i) { - Xl = Xl ^ ctx->P[i]; - Xr = F(ctx, Xl) ^ Xr; - temp = Xl; - Xl = Xr; - Xr = temp; - } - temp = Xl; - Xl = Xr; - Xr = temp; - Xr = Xr ^ ctx->P[N]; - Xl = Xl ^ ctx->P[N + 1]; - *xl = Xl; - *xr = Xr; -} - -void Blowfish_Decrypt(BLOWFISH_CTX * ctx, unsigned long *xl, - unsigned long *xr) -{ - unsigned long Xl; - unsigned long Xr; - unsigned long temp; - short i; - Xl = *xl; - Xr = *xr; - for (i = N + 1; i > 1; --i) { - Xl = Xl ^ ctx->P[i]; - Xr = F(ctx, Xl) ^ Xr; - - /* Exchange Xl and Xr */ - temp = Xl; - Xl = Xr; - Xr = temp; - } - - /* Exchange Xl and Xr */ - temp = Xl; - Xl = Xr; - Xr = temp; - Xr = Xr ^ ctx->P[1]; - Xl = Xl ^ ctx->P[0]; - *xl = Xl; - *xr = Xr; -} - -void Blowfish_Init(BLOWFISH_CTX * ctx, unsigned char *key, int keyLen) -{ - int i, j, k; - unsigned long data, datal, datar; - for (i = 0; i < 4; i++) { - for (j = 0; j < 256; j++) - ctx->S[i][j] = ORIG_S[i][j]; - } - j = 0; - for (i = 0; i < N + 2; ++i) { - data = 0x00000000; - for (k = 0; k < 4; ++k) { - data = (data << 8) | key[j]; - j = j + 1; - if (j >= keyLen) - j = 0; - } - ctx->P[i] = ORIG_P[i] ^ data; - } - datal = 0x00000000; - datar = 0x00000000; - for (i = 0; i < N + 2; i += 2) { - Blowfish_Encrypt(ctx, &datal, &datar); - ctx->P[i] = datal; - ctx->P[i + 1] = datar; - } - for (i = 0; i < 4; ++i) { - for (j = 0; j < 256; j += 2) { - Blowfish_Encrypt(ctx, &datal, &datar); - ctx->S[i][j] = datal; - ctx->S[i][j + 1] = datar; - } - } -} - - diff --git a/blowfish.h b/blowfish.h deleted file mode 100644 index 3f33e945..00000000 --- a/blowfish.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -blowfish.h: Header file for blowfish.c - -Copyright (C) 1997 by Paul Kocher - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -See blowfish.c for more information about this file. -*/ - - -typedef struct { - unsigned long P[16 + 2]; - unsigned long S[4][256]; -} BLOWFISH_CTX; - -void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen); -void Blowfish_Encrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr); -void Blowfish_Decrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr); - - - diff --git a/callbacks.c b/callbacks.c deleted file mode 100644 index 40ee07bc..00000000 --- a/callbacks.c +++ /dev/null @@ -1,270 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2009 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include - -void cb_sync_manager() -{ - sync_manager_show(); -} - -void cb_save_graphic() -{ - Shell *shell = shell_get_main_shell(); - GtkWidget *dialog; - gchar *filename; - - /* save the pixbuf to a png file */ - dialog = gtk_file_chooser_dialog_new("Save Image", - NULL, - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, - GTK_RESPONSE_ACCEPT, NULL); - - filename = g_strconcat(shell->selected->name, ".png", NULL); - gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename); - g_free(filename); - - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - gtk_widget_destroy(dialog); - - shell_status_update("Saving image..."); - - tree_view_save_image(filename); - - shell_status_update("Done."); - g_free(filename); - - return; - } - - gtk_widget_destroy(dialog); -} - -void cb_open_web_page() -{ - open_url("http://wiki.hardinfo.org"); -} - -void cb_open_online_docs() -{ - open_url("http://wiki.hardinfo.org/Documentation"); -} - -void cb_report_bug() -{ - open_url("http://wiki.hardinfo.org/BugReports"); -} - -void cb_donate() -{ - open_url("http://wiki.hardinfo.org/Donate"); -} - -void cb_refresh() -{ - shell_do_reload(); -} - -void cb_copy_to_clipboard() -{ - ShellModuleEntry *entry = shell_get_main_shell()->selected; - - if (entry) { - gchar *data = module_entry_function(entry); - GtkClipboard *clip = - gtk_clipboard_get(gdk_atom_intern("CLIPBOARD", FALSE)); - ReportContext *ctx = report_context_text_new(NULL); - - ctx->entry = entry; - - report_header(ctx); - report_table(ctx, data); - report_footer(ctx); - - gtk_clipboard_set_text(clip, ctx->output, -1); - - g_free(data); - report_context_free(ctx); - } -} - -void cb_side_pane() -{ - gboolean visible; - - visible = shell_action_get_active("SidePaneAction"); - shell_set_side_pane_visible(visible); -} - -void cb_toolbar() -{ - gboolean visible; - - visible = shell_action_get_active("ToolbarAction"); - shell_ui_manager_set_visible("/MainMenuBarAction", visible); -} - -void cb_about_module(GtkAction * action) -{ - Shell *shell = shell_get_main_shell(); - GSList *modules = shell->tree->modules; - ModuleAbout *ma; - gchar *name; - - g_object_get(G_OBJECT(action), "tooltip", &name, NULL); - - for (; modules; modules = modules->next) { - ShellModule *sm = (ShellModule *) modules->data; - - if (!g_str_equal(sm->name, name)) - continue; - - if ((ma = module_get_about(sm))) { - GtkWidget *about; - gchar *text; - - about = gtk_about_dialog_new(); - - text = g_strdup_printf("%s Module", sm->name); - gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(about), text); - g_free(text); - - gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about), - ma->version); - - text = g_strdup_printf("Written by %s\nLicensed under %s", - ma->author, ma->license); - gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about), text); - g_free(text); - - if (ma->description) - gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about), - ma->description); - - gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(about), sm->icon); - gtk_dialog_run(GTK_DIALOG(about)); - gtk_widget_destroy(about); - } else { - g_warning - ("No about information is associated with the %s module.", - name); - } - - break; - } - - g_free(name); -} - -void cb_about() -{ - GtkWidget *about; - const gchar *authors[] = { - "Author:", - "Leandro A. F. Pereira", - "", - "Contributors:", - "Agney Lopes Roth Ferraz", - "Andrey Esin", - "", - "Based on work by:", - "MD5 implementation by Colin Plumb (see md5.c for details)", - "SHA1 implementation by Steve Reid (see sha1.c for details)", - "Blowfish implementation by Paul Kocher (see blowfich.c for details)", - "Raytracing benchmark by John Walker (see fbench.c for details)", - "FFT benchmark by Scott Robert Ladd (see fftbench.c for details)", - "Some code partly based on x86cpucaps by Osamu Kayasono", - "Vendor list based on GtkSysInfo by Pissens Sebastien", - "DMI support based on code by Stewart Adam", - "SCSI support based on code by Pascal F. Martin", - NULL - }; - const gchar *artists[] = { - "Jakub Szypulka", - "Tango Project", - "The GNOME Project", - "VMWare, Inc. (USB icon from VMWare Workstation 6)", - NULL - }; - - about = gtk_about_dialog_new(); - gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(about), "HardInfo"); - gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about), VERSION); - gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about), - "Copyright \302\251 2003-2009 " - "Leandro A. F. Pereira"); - gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about), - "System information and benchmark tool"); - gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(about), - icon_cache_get_pixbuf("logo.png")); - - gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(about), - "HardInfo is free software; you can redistribute it and/or modify " - "it under the terms of the GNU General Public License as published by " - "the Free Software Foundation, version 2.\n\n" - "This program is distributed in the hope that it will be useful, " - "but WITHOUT ANY WARRANTY; without even the implied warranty of " - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " - "GNU General Public License for more details.\n\n" - "You should have received a copy of the GNU General Public License " - "along with this program; if not, write to the Free Software " - "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA"); -#if GTK_CHECK_VERSION(2,8,0) - gtk_about_dialog_set_wrap_license(GTK_ABOUT_DIALOG(about), TRUE); -#endif - - gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(about), authors); - gtk_about_dialog_set_artists(GTK_ABOUT_DIALOG(about), artists); - - gtk_dialog_run(GTK_DIALOG(about)); - gtk_widget_destroy(about); -} - -void cb_generate_report() -{ - Shell *shell = shell_get_main_shell(); - gboolean btn_refresh = shell_action_get_enabled("RefreshAction"); - gboolean btn_copy = shell_action_get_enabled("CopyAction"); - - report_dialog_show(shell->tree->model, shell->window); - - shell_action_set_enabled("RefreshAction", btn_refresh); - shell_action_set_enabled("CopyAction", btn_copy); -} - -void cb_quit(void) -{ - do { - gtk_main_quit(); - } while (gtk_main_level() > 1); -} diff --git a/callbacks.h b/callbacks.h deleted file mode 100644 index 88165f97..00000000 --- a/callbacks.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef __CALLBACKS_H__ -#define __CALLBACKS_H__ - -#include - -void cb_about(); -void cb_about_module(GtkAction *action); -void cb_generate_report(); -void cb_save_graphic(); -void cb_quit(); -void cb_refresh(); -void cb_copy_to_clipboard(); -void cb_side_pane(); -void cb_toolbar(); -void cb_open_web_page(); -void cb_open_online_docs(); -void cb_sync_manager(); -void cb_report_bug(); -void cb_donate(); - -#endif /* __CALLBACKS_H__ */ diff --git a/cmake/GNUInstallDirs.cmake b/cmake/GNUInstallDirs.cmake new file mode 100644 index 00000000..c3bb203a --- /dev/null +++ b/cmake/GNUInstallDirs.cmake @@ -0,0 +1,182 @@ +# - Define GNU standard installation directories +# Provides install directory variables as defined for GNU software: +# https://www.gnu.org/prep/standards/html_node/Directory-Variables.html +# Inclusion of this module defines the following variables: +# CMAKE_INSTALL_ - destination for files of a given type +# CMAKE_INSTALL_FULL_ - corresponding absolute path +# where is one of: +# BINDIR - user executables (bin) +# SBINDIR - system admin executables (sbin) +# LIBEXECDIR - program executables (libexec) +# SYSCONFDIR - read-only single-machine data (etc) +# SHAREDSTATEDIR - modifiable architecture-independent data (com) +# LOCALSTATEDIR - modifiable single-machine data (var) +# LIBDIR - object code libraries (lib or lib64) +# INCLUDEDIR - C header files (include) +# OLDINCLUDEDIR - C header files for non-gcc (/usr/include) +# DATAROOTDIR - read-only architecture-independent data root (share) +# DATADIR - read-only architecture-independent data (DATAROOTDIR) +# INFODIR - info documentation (DATAROOTDIR/info) +# LOCALEDIR - locale-dependent data (DATAROOTDIR/locale) +# MANDIR - man documentation (DATAROOTDIR/man) +# DOCDIR - documentation root (DATAROOTDIR/doc/PROJECT_NAME) +# Each CMAKE_INSTALL_ value may be passed to the DESTINATION options of +# install() commands for the corresponding file type. If the includer does +# not define a value the above-shown default will be used and the value will +# appear in the cache for editing by the user. +# Each CMAKE_INSTALL_FULL_ value contains an absolute path constructed +# from the corresponding destination by prepending (if necessary) the value +# of CMAKE_INSTALL_PREFIX. + +#============================================================================= +# Copyright 2011 Nikita Krupen'ko +# Copyright 2011 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +# Installation directories +# +if(NOT DEFINED CMAKE_INSTALL_BINDIR) + set(CMAKE_INSTALL_BINDIR "bin" CACHE PATH "user executables (bin)") +endif() + +if(NOT DEFINED CMAKE_INSTALL_SBINDIR) + set(CMAKE_INSTALL_SBINDIR "sbin" CACHE PATH "system admin executables (sbin)") +endif() + +if(NOT DEFINED CMAKE_INSTALL_LIBEXECDIR) + set(CMAKE_INSTALL_LIBEXECDIR "libexec" CACHE PATH "program executables (libexec)") +endif() + +if(NOT DEFINED CMAKE_INSTALL_SYSCONFDIR) + set(CMAKE_INSTALL_SYSCONFDIR "etc" CACHE PATH "read-only single-machine data (etc)") +endif() + +if(NOT DEFINED CMAKE_INSTALL_SHAREDSTATEDIR) + set(CMAKE_INSTALL_SHAREDSTATEDIR "com" CACHE PATH "modifiable architecture-independent data (com)") +endif() + +if(NOT DEFINED CMAKE_INSTALL_LOCALSTATEDIR) + set(CMAKE_INSTALL_LOCALSTATEDIR "var" CACHE PATH "modifiable single-machine data (var)") +endif() + +if(NOT DEFINED CMAKE_INSTALL_LIBDIR) + set(_LIBDIR_DEFAULT "lib") + # Override this default 'lib' with 'lib64' iff: + # - we are on Linux system but NOT cross-compiling + # - we are NOT on debian + # - we are on a 64 bits system + # reason is: amd64 ABI: http://www.x86-64.org/documentation/abi.pdf + # Note that the future of multi-arch handling may be even + # more complicated than that: https://wiki.debian.org/Multiarch + if(CMAKE_SYSTEM_NAME MATCHES "Linux" + AND NOT CMAKE_CROSSCOMPILING + AND NOT EXISTS "/etc/debian_version") + if(NOT DEFINED CMAKE_SIZEOF_VOID_P) + message(AUTHOR_WARNING + "Unable to determine default CMAKE_INSTALL_LIBDIR directory because no target architecture is known. " + "Please enable at least one language before including GNUInstallDirs.") + else() + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + set(_LIBDIR_DEFAULT "lib64") + endif() + endif() + endif() + set(CMAKE_INSTALL_LIBDIR "${_LIBDIR_DEFAULT}" CACHE PATH "object code libraries (${_LIBDIR_DEFAULT})") +endif() + +if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR) + set(CMAKE_INSTALL_INCLUDEDIR "include" CACHE PATH "C header files (include)") +endif() + +if(NOT DEFINED CMAKE_INSTALL_OLDINCLUDEDIR) + set(CMAKE_INSTALL_OLDINCLUDEDIR "/usr/include" CACHE PATH "C header files for non-gcc (/usr/include)") +endif() + +if(NOT DEFINED CMAKE_INSTALL_DATAROOTDIR) + set(CMAKE_INSTALL_DATAROOTDIR "share" CACHE PATH "read-only architecture-independent data root (share)") +endif() + +#----------------------------------------------------------------------------- +# Values whose defaults are relative to DATAROOTDIR. Store empty values in +# the cache and store the defaults in local variables if the cache values are +# not set explicitly. This auto-updates the defaults as DATAROOTDIR changes. + +if(NOT CMAKE_INSTALL_DATADIR) + set(CMAKE_INSTALL_DATADIR "" CACHE PATH "read-only architecture-independent data (DATAROOTDIR)") + set(CMAKE_INSTALL_DATADIR "${CMAKE_INSTALL_DATAROOTDIR}") +endif() + +if(NOT CMAKE_INSTALL_INFODIR) + set(CMAKE_INSTALL_INFODIR "" CACHE PATH "info documentation (DATAROOTDIR/info)") + set(CMAKE_INSTALL_INFODIR "${CMAKE_INSTALL_DATAROOTDIR}/info") +endif() + +if(NOT CMAKE_INSTALL_LOCALEDIR) + set(CMAKE_INSTALL_LOCALEDIR "" CACHE PATH "locale-dependent data (DATAROOTDIR/locale)") + set(CMAKE_INSTALL_LOCALEDIR "${CMAKE_INSTALL_DATAROOTDIR}/locale") +endif() + +if(NOT CMAKE_INSTALL_MANDIR) + set(CMAKE_INSTALL_MANDIR "" CACHE PATH "man documentation (DATAROOTDIR/man)") + set(CMAKE_INSTALL_MANDIR "${CMAKE_INSTALL_DATAROOTDIR}/man") +endif() + +if(NOT CMAKE_INSTALL_DOCDIR) + set(CMAKE_INSTALL_DOCDIR "" CACHE PATH "documentation root (DATAROOTDIR/doc/PROJECT_NAME)") + set(CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}") +endif() + +#----------------------------------------------------------------------------- + +mark_as_advanced( + CMAKE_INSTALL_BINDIR + CMAKE_INSTALL_SBINDIR + CMAKE_INSTALL_LIBEXECDIR + CMAKE_INSTALL_SYSCONFDIR + CMAKE_INSTALL_SHAREDSTATEDIR + CMAKE_INSTALL_LOCALSTATEDIR + CMAKE_INSTALL_LIBDIR + CMAKE_INSTALL_INCLUDEDIR + CMAKE_INSTALL_OLDINCLUDEDIR + CMAKE_INSTALL_DATAROOTDIR + CMAKE_INSTALL_DATADIR + CMAKE_INSTALL_INFODIR + CMAKE_INSTALL_LOCALEDIR + CMAKE_INSTALL_MANDIR + CMAKE_INSTALL_DOCDIR + ) + +# Result directories +# +foreach(dir + BINDIR + SBINDIR + LIBEXECDIR + SYSCONFDIR + SHAREDSTATEDIR + LOCALSTATEDIR + LIBDIR + INCLUDEDIR + OLDINCLUDEDIR + DATAROOTDIR + DATADIR + INFODIR + LOCALEDIR + MANDIR + DOCDIR + ) + if(NOT IS_ABSOLUTE ${CMAKE_INSTALL_${dir}}) + set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${dir}}") + else() + set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_${dir}}") + endif() +endforeach() diff --git a/cmake/Translations.cmake b/cmake/Translations.cmake new file mode 100644 index 00000000..476fb374 --- /dev/null +++ b/cmake/Translations.cmake @@ -0,0 +1,41 @@ +# Translations.cmake, CMake macros written for Marlin, feel free to re-use them + +macro(add_translations_directory NLS_PACKAGE) + add_custom_target (i18n ALL COMMENT “Building i18n messages.”) + find_program (MSGFMT_EXECUTABLE msgfmt) + file (GLOB PO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.po) + foreach (PO_INPUT ${PO_FILES}) + get_filename_component (PO_INPUT_BASE ${PO_INPUT} NAME_WE) + set (MO_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PO_INPUT_BASE}.mo) + add_custom_command (TARGET i18n COMMAND ${MSGFMT_EXECUTABLE} -o ${MO_OUTPUT} ${PO_INPUT}) + + install (FILES ${MO_OUTPUT} DESTINATION + share/locale/${PO_INPUT_BASE}/LC_MESSAGES + RENAME ${NLS_PACKAGE}.mo) + endforeach (PO_INPUT ${PO_FILES}) +endmacro(add_translations_directory) + + +macro(add_translations_catalog NLS_PACKAGE) + add_custom_target (pot COMMENT “Building translation catalog.”) + find_program (XGETTEXT_EXECUTABLE xgettext) + + + set(C_SOURCE "") + + foreach(FILES_INPUT ${ARGN}) + file (GLOB_RECURSE SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${FILES_INPUT}/*.c) + foreach(C_FILE ${SOURCE_FILES}) + set(C_SOURCE ${C_SOURCE} ${C_FILE}) + endforeach() + file (GLOB_RECURSE SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${FILES_INPUT}/*.vala) + foreach(C_FILE ${SOURCE_FILES}) + set(C_SOURCE ${C_SOURCE} ${C_FILE}) + endforeach() + endforeach() + + add_custom_command (TARGET pot COMMAND + ${XGETTEXT_EXECUTABLE} -d ${NLS_PACKAGE} -o ${CMAKE_CURRENT_SOURCE_DIR}/${NLS_PACKAGE}.pot + ${VALA_SOURCE} ${C_SOURCE} --keyword="_" --keyword="N_" --from-code=UTF-8 + ) +endmacro() diff --git a/computer.c b/computer.c deleted file mode 100644 index 558206e7..00000000 --- a/computer.c +++ /dev/null @@ -1,416 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2008 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -/* Callbacks */ -gchar *callback_summary(); -gchar *callback_os(); -gchar *callback_modules(); -gchar *callback_boots(); -gchar *callback_locales(); -gchar *callback_fs(); -gchar *callback_display(); -gchar *callback_network(); -gchar *callback_users(); -gchar *callback_env_var(); - -/* Scan callbacks */ -void scan_summary(gboolean reload); -void scan_os(gboolean reload); -void scan_modules(gboolean reload); -void scan_boots(gboolean reload); -void scan_locales(gboolean reload); -void scan_fs(gboolean reload); -void scan_display(gboolean reload); -void scan_network(gboolean reload); -void scan_users(gboolean reload); -void scan_env_var(gboolean reload); - -static ModuleEntry entries[] = { - {"Summary", "summary.png", callback_summary, scan_summary}, - {"Operating System", "os.png", callback_os, scan_os}, - {"Kernel Modules", "module.png", callback_modules, scan_modules}, - {"Boots", "boot.png", callback_boots, scan_boots}, - {"Languages", "language.png", callback_locales, scan_locales}, - {"Filesystems", "dev_removable.png", callback_fs, scan_fs}, - {"Display", "monitor.png", callback_display, scan_display}, - {"Environment Variables", "environment.png", callback_env_var, scan_env_var}, - {"Users", "users.png", callback_users, scan_users}, - {NULL}, -}; - -#include "computer.h" - -static GHashTable *moreinfo = NULL; -static gchar *module_list = NULL; -static Computer *computer = NULL; - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -gchar *hi_more_info(gchar * entry) -{ - gchar *info = (gchar *) g_hash_table_lookup(moreinfo, entry); - - if (info) - return g_strdup(info); - - return g_strdup_printf("[%s]", entry); -} - -gchar *hi_get_field(gchar * field) -{ - gchar *tmp; - - if (g_str_equal(field, "Memory")) { - MemoryInfo *mi = computer_get_memory(); - tmp = g_strdup_printf("%dMB (%dMB used)", mi->total, mi->used); - g_free(mi); - } else if (g_str_equal(field, "Uptime")) { - tmp = computer_get_formatted_uptime(); - } else if (g_str_equal(field, "Date/Time")) { - time_t t = time(NULL); - - tmp = g_new0(gchar, 64); - strftime(tmp, 64, "%c", localtime(&t)); - } else if (g_str_equal(field, "Load Average")) { - tmp = computer_get_formatted_loadavg(); - } else { - tmp = g_strdup(""); - } - - return tmp; -} - -void scan_summary(gboolean reload) -{ - SCAN_START(); - module_entry_scan_all_except(entries, 0); - computer->alsa = computer_get_alsainfo(); - SCAN_END(); -} - -void scan_os(gboolean reload) -{ - SCAN_START(); - computer->os = computer_get_os(); - SCAN_END(); -} - -void scan_modules(gboolean reload) -{ - SCAN_START(); - scan_modules_do(); - SCAN_END(); -} - -void scan_boots(gboolean reload) -{ - SCAN_START(); - scan_boots_real(); - SCAN_END(); -} - -void scan_locales(gboolean reload) -{ - SCAN_START(); - scan_os(FALSE); - scan_languages(computer->os); - SCAN_END(); -} - -void scan_fs(gboolean reload) -{ - SCAN_START(); - scan_filesystems(); - SCAN_END(); -} - -void scan_display(gboolean reload) -{ - SCAN_START(); - computer->display = computer_get_display(); - SCAN_END(); -} - -void scan_users(gboolean reload) -{ - SCAN_START(); - scan_users_do(); - SCAN_END(); -} - -gchar *callback_summary() -{ - gchar *processor_name, *alsa_cards, *input_devices, *printers, *storage_devices, *summary; - - processor_name = module_call_method("devices::getProcessorName"); - alsa_cards = computer_get_alsacards(computer); - input_devices = module_call_method("devices::getInputDevices"); - printers = module_call_method("devices::getPrinters"); - storage_devices = module_call_method("devices::getStorageDevices"); - - summary = g_strdup_printf("[$ShellParam$]\n" - "UpdateInterval$Memory=1000\n" - "UpdateInterval$Date/Time=1000\n" - "#ReloadInterval=5000\n" - "[Computer]\n" - "Processor=%s\n" - "Memory=...\n" - "Operating System=%s\n" - "User Name=%s\n" - "Date/Time=...\n" - "[Display]\n" - "Resolution=%dx%d pixels\n" - "OpenGL Renderer=%s\n" - "X11 Vendor=%s\n" - "[Multimedia]\n" - "\n%s\n" - "[Input Devices]\n%s\n" - "\n%s\n" - "\n%s\n", - processor_name, - computer->os->distro, - computer->os->username, - computer->display->width, - computer->display->height, - computer->display->ogl_renderer, - computer->display->vendor, - alsa_cards, - input_devices, printers, storage_devices); - - g_free(processor_name); - g_free(alsa_cards); - g_free(input_devices); - g_free(printers); - g_free(storage_devices); - - return summary; -} - -gchar *callback_os() -{ - return g_strdup_printf("[$ShellParam$]\n" - "UpdateInterval$Uptime=10000\n" - "UpdateInterval$Load Average=1000\n" - "[Version]\n" - "Kernel=%s\n" - "Compiled=%s\n" - "C Library=%s\n" - "Default C Compiler=%s\n" - "Distribution=%s\n" - "[Current Session]\n" - "Computer Name=%s\n" - "User Name=%s\n" - "#Language=%s\n" - "Home Directory=%s\n" - "Desktop Environment=%s\n" - "[Misc]\n" - "Uptime=...\n" - "Load Average=...", - computer->os->kernel, - computer->os->compiled_date, - computer->os->libc, - computer->os->gcc, - computer->os->distro, - computer->os->hostname, - computer->os->username, - computer->os->language, - computer->os->homedir, computer->os->desktop); -} - -gchar *callback_modules() -{ - return g_strdup_printf("[Loaded Modules]\n" - "%s" - "[$ShellParam$]\n" - "ViewType=1\n" - "ColumnTitle$TextValue=Name\n" - "ColumnTitle$Value=Description\n" - "ShowColumnHeaders=true\n", module_list); -} - -gchar *callback_boots() -{ - return g_strdup_printf("[$ShellParam$]\n" - "ColumnTitle$TextValue=Date & Time\n" - "ColumnTitle$Value=Kernel Version\n" - "ShowColumnHeaders=true\n" - "\n" - "%s", computer->os->boots); -} - -gchar *callback_locales() -{ - return g_strdup_printf("[$ShellParam$]\n" - "ViewType=1\n" - "ColumnTitle$TextValue=Language Code\n" - "ColumnTitle$Value=Name\n" - "ShowColumnHeaders=true\n" - "[Available Languages]\n" - "%s", computer->os->languages); -} - -gchar *callback_fs() -{ - return g_strdup_printf("[$ShellParam$]\n" - "ViewType=4\n" - "ReloadInterval=5000\n" - "Zebra=1\n" - "NormalizePercentage=false\n" - "ColumnTitle$Extra1=Mount Point\n" - "ColumnTitle$Progress=Usage\n" - "ColumnTitle$TextValue=Device\n" - "ShowColumnHeaders=true\n" - "[Mounted File Systems]\n%s\n", fs_list); -} - -gchar *callback_display() -{ - return g_strdup_printf("[Display]\n" - "Resolution=%dx%d pixels\n" - "Vendor=%s\n" - "Version=%s\n" - "[Monitors]\n" - "%s" - "[Extensions]\n" - "%s" - "[OpenGL]\n" - "Vendor=%s\n" - "Renderer=%s\n" - "Version=%s\n" - "Direct Rendering=%s\n", - computer->display->width, - computer->display->height, - computer->display->vendor, - computer->display->version, - computer->display->monitors, - computer->display->extensions, - computer->display->ogl_vendor, - computer->display->ogl_renderer, - computer->display->ogl_version, - computer->display->dri ? "Yes" : "No"); -} - -gchar *callback_users() -{ - return g_strdup_printf("[$ShellParam$]\n" - "ReloadInterval=10000\n" - "ViewType=1\n" - "[Users]\n" - "%s\n", users); -} - -gchar *get_os_kernel(void) -{ - scan_os(FALSE); - return computer->os->kernel; -} - -gchar *get_kernel_module_description(gchar *module) -{ - gchar *description; - - if (!_module_hash_table) { - scan_modules(FALSE); - } - - description = g_hash_table_lookup(_module_hash_table, module); - if (!description) { - return g_strdup(module); - } - - return g_strdup(description); -} - -ShellModuleMethod *hi_exported_methods(void) -{ - static ShellModuleMethod m[] = { - {"getOSKernel", get_os_kernel}, - {"getKernelModuleDescription", get_kernel_module_description}, - {NULL} - }; - - return m; -} - -ModuleEntry *hi_module_get_entries(void) -{ - return entries; -} - -gchar *hi_module_get_name(void) -{ - return g_strdup("Computer"); -} - -guchar hi_module_get_weight(void) -{ - return 80; -} - -gchar **hi_module_get_dependencies(void) -{ - static gchar *deps[] = { "devices.so", NULL }; - - return deps; -} - -void hi_module_init(void) -{ - computer = g_new0(Computer, 1); - moreinfo = - g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); -} - -ModuleAbout *hi_module_get_about(void) -{ - static ModuleAbout ma[] = { - { - .author = "Leandro A. F. Pereira", - .description = "Gathers high-level computer information", - .version = VERSION, - .license = "GNU GPL version 2"} - }; - - return ma; -} diff --git a/computer.h b/computer.h deleted file mode 100644 index b2874c69..00000000 --- a/computer.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __COMPUTER_H__ -#define __COMPUTER_H__ - -#define DB_PREFIX "/etc/" - -static struct { - gchar *file, *codename; -} distro_db[] = { - { DB_PREFIX "debian_version", "deb" }, - { DB_PREFIX "slackware-version", "slk" }, - { DB_PREFIX "mandrake-release", "mdk" }, - { DB_PREFIX "mandriva-release", "mdv" }, - { DB_PREFIX "fedora-release", "fdra" }, - { DB_PREFIX "coas", "coas" }, - { DB_PREFIX "environment.corel", "corel"}, - { DB_PREFIX "gentoo-release", "gnt" }, - { DB_PREFIX "conectiva-release", "cnc" }, - { DB_PREFIX "versão-conectiva", "cnc" }, - { DB_PREFIX "turbolinux-release", "tl" }, - { DB_PREFIX "yellowdog-release", "yd" }, - { DB_PREFIX "sabayon-release", "sbn" }, - { DB_PREFIX "arch-release", "arch" }, - { DB_PREFIX "enlisy-release", "enlsy"}, - { DB_PREFIX "SuSE-release", "suse" }, - { DB_PREFIX "sun-release", "sun" }, - { DB_PREFIX "zenwalk-version", "zen" }, - { DB_PREFIX "puppyversion", "ppy" }, - { DB_PREFIX "distro-release", "fl" }, - /* - * RedHat must be the *last* one to be checked, since - * some distros (like Mandrake) includes a redhat-relase - * file too. - */ - { DB_PREFIX "redhat-release", "rh" }, - { NULL, NULL } -}; - -typedef struct _Computer Computer; -typedef struct _OperatingSystem OperatingSystem; -typedef struct _MemoryInfo MemoryInfo; -typedef struct _UptimeInfo UptimeInfo; -typedef struct _LoadInfo LoadInfo; -typedef struct _DisplayInfo DisplayInfo; - -typedef struct _AlsaInfo AlsaInfo; -typedef struct _AlsaCard AlsaCard; - -typedef struct _FileSystem FileSystem; -typedef struct _FileSystemEntry FileSystemEntry; - -struct _AlsaCard { - gchar *alsa_name; - gchar *friendly_name; -/* - gchar *board; - gchar revision, compat_class; - gint subsys_vendorid, subsys_id; - - gint cap_dac_res, cap_adc_res; - gboolean cap_3d_enh; - - gint curr_mic_gain; - gboolean curr_3d_enh, - curr_loudness, - curr_simstereo; - gchar *curr_mic_select; -*/ -}; - -struct _AlsaInfo { - GSList *cards; -}; - -struct _DisplayInfo { - gchar *ogl_vendor, *ogl_renderer, *ogl_version; - gboolean dri; - - gchar *display_name, *vendor, *version; - gchar *extensions; - gchar *monitors; - - gint width, height; -}; - -struct _LoadInfo { - float load1, load5, load15; -}; - -struct _UptimeInfo { - int days, hours, minutes; -}; - -struct _Computer { - MemoryInfo *memory; - OperatingSystem *os; - DisplayInfo *display; - AlsaInfo *alsa; - - gchar *date_time; -}; - -struct _Processor { - gchar *model_name; - gchar *vendor_id; - gchar *flags; - gint cache_size; - gfloat bogomips, cpu_mhz; - - gchar *has_fpu; - gchar *bug_fdiv, *bug_hlt, *bug_f00f, *bug_coma; - - gint model, family, stepping; - gchar *strmodel; - - gint id; -}; - -struct _OperatingSystem { - gchar *kernel; - gchar *libc; - gchar *gcc; - gchar *distrocode, *distro; - gchar *hostname; - gchar *language; - gchar *homedir; - gchar *compiled_date; - - gchar *languages; - - gchar *desktop; - gchar *username; - - gchar *boots; -}; - -struct _MemoryInfo { - gint total, used, free, cached; - gfloat ratio; -}; - -#define get_str(field_name,ptr) \ - if (g_str_has_prefix(tmp[0], field_name)) { \ - ptr = g_strdup(tmp[1]); \ - g_strfreev(tmp); \ - continue; \ - } -#define get_int(field_name,ptr) \ - if (g_str_has_prefix(tmp[0], field_name)) { \ - ptr = atoi(tmp[1]); \ - g_strfreev(tmp); \ - continue; \ - } -#define get_float(field_name,ptr) \ - if (g_str_has_prefix(tmp[0], field_name)) { \ - ptr = atof(tmp[1]); \ - g_strfreev(tmp); \ - continue; \ - } - -#endif /* __COMPUTER_H__ */ diff --git a/config.h.cmake b/config.h.cmake new file mode 100644 index 00000000..1621a890 --- /dev/null +++ b/config.h.cmake @@ -0,0 +1,36 @@ +#ifndef __CONFIG_H__ +#define __CONFIG_H__ + +#define VERSION "@HARDINFO_VERSION@" + +#define ARCH "ARCH_@HARDINFO_ARCH@" +#define OS "@HARDINFO_OS@" +#define PLATFORM OS "-" ARCH +#define KERNEL "@CMAKE_SYSTEM_VERSION@" +#define HOSTNAME "" +#define ARCH_@HARDINFO_ARCH@ + +#define LIBDIR "@CMAKE_INSTALL_LIBDIR@" +#define LIBPREFIX "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/hardinfo" +#define PREFIX "@CMAKE_INSTALL_PREFIX@/share/hardinfo" + +#cmakedefine LIBSOUP_FOUND +#cmakedefine HARDINFO_DEBUG @HARDINFO_DEBUG@ + +#ifdef LIBSOUP_FOUND +# define HAS_LIBSOUP +#endif /* LIBSOUP_FOUND */ + +#if defined(HARDINFO_DEBUG) && (HARDINFO_DEBUG==1) +# define RELEASE 0 +# define DEBUG(msg,...) fprintf(stderr, "*** %s:%d (%s) *** " msg "\n", \ + __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__) +#else +# define RELEASE 1 +# define DEBUG(msg,...) +#endif /* HARDINFO_DEBUG */ + +#define ENABLE_BINRELOC 1 +#define HAS_LINUX_WE 1 + +#endif /* __CONFIG_H__ */ diff --git a/configure b/configure deleted file mode 100755 index b5903adf..00000000 --- a/configure +++ /dev/null @@ -1,247 +0,0 @@ -#!/usr/bin/env bash -# -# ToscoConf 0.04 -# Copyright (c) 2003-2004 Leandro Pereira -# All rights reserved. -# -# This script is in the Tosco Public License. It may be copied and/or -# modified, in whole or in part, provided that all copies must retain the -# above copyright notice, this condition and the following disclaimer. -# -# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# -# (yes, I did a copy&paste from the BSD license, eat me) -# -# --------------------------------------------------------------------------- - -PACKAGE=`basename ${PWD} | cut -d"-" -f1`; -VERSION=`basename ${PWD} | cut -d"-" -f2`; - -if [ "$PACKAGE" == "$VERSION" ]; then - VERSION=$(date +"%F.%H:%M:%S") - RELEASE=0 -else - RELEASE=1 -fi - -echo "ToscoConf (version 0.04) for $PACKAGE version $VERSION" - -# --------------------------------------------------------------------------- - -echo "Determining system architecture." -OS=`uname` -case $OS in - Linux) - ;; - *) - echo "$OS (not supported, yet!)" - exit ;; -esac - -PROC=`uname -m` -LIBDIR='/usr/lib' -case $PROC in - i?86) - ln -sf linux/x86 arch/this - ARCH="ARCH_i386" ;; - ppc*) - ln -sf linux/ppc arch/this - ARCH="ARCH_PPC" ;; - x86_64) - ln -sf linux/x86_64 arch/this - ARCH="ARCH_x86_64" - LIBDIR="/usr/lib64" ;; - mips*) - ln -sf linux/mips arch/this - ARCH="ARCH_MIPS" ;; - parisc*) - ln -sf linux/parisc arch/this - ARCH="ARCH_PARISC" ;; - sparc*) - ln -sf linux/sparc arch/this - ARCH="ARCH_SPARC" ;; - armv*) - ln -sf linux/armv4l arch/this - ARCH="ARCH_ARMV4L" ;; - ia64) - ln -sf linux/ia64 arch/this - ARCH="ARCH_IA64" ;; - alpha) - ln -sf linux/alpha arch/this - ARCH="ARCH_ALPHA" ;; - s390*) - ln -sf linux/s390 arch/this - ARCH="ARCH_S390" ;; - m68k) - ln -sf linux/m68k arch/this - ARCH="ARCH_m68k" ;; - sh*) - ln -sf linux/sh arch/this - ARCH="ARCH_sh" ;; - -esac - -if [ "x$ARCH" == "x" ]; then - echo "Your architecture is not supported yet. Please send the" - echo "output of the following commands to leandro@hardinfo.org:" - echo "" - echo " $ cat /proc/cpuinfo" - echo " $ uname -a" - echo " $ uname -m" - exit 1 -fi - -# --------------------------------------------------------------------------- - -echo "Compiling $PACKAGE for $OS $PROC ($ARCH)." -echo "" - -# --------------------------------------------------------------------------- - -GTK2=-1 -MIN_VERSION="2.6.0" -echo -n "Checking for GTK version >= ${MIN_VERSION}... " -for i in `which pkg-config`; do - $i --errors-to-stdout gtk+-2.0 \ - --atleast-version=$MIN_VERSION > /dev/null - case $? in - 0) - GTK_FLAGS=`pkg-config gtk+-2.0 --cflags` - GTK_LIBS=`pkg-config gtk+-2.0 --libs` - echo "found `pkg-config gtk+-2.0 --modversion`" - GTK2=1 - break ;; - *) - echo "not found." ;; - esac -done - -# -------------------------------------------------------------------------- - -if [ $GTK2 -eq -1 ]; then - echo -e "\nYou need the GTK libraries, including the development stuff." - echo "If you're using Debian, running the command as root:" - echo -e "\n\taptitude install libgtk2.0-dev\n" - echo "Will do the trick." - exit 1 -fi - -# --------------------------------------------------------------------------- - -SOUP=-1 -MIN_VERSION="2.4" -echo -n "Checking for libsoup version >= ${MIN_VERSION}... " -for i in `which pkg-config`; do - $i --errors-to-stdout libsoup-2.4 \ - --atleast-version=$MIN_VERSION > /dev/null - case $? in - 0) - SOUP_FLAGS=`pkg-config libsoup-2.4 --cflags --static` - SOUP_LIBS=`pkg-config libsoup-2.4 --libs --static` - echo "found `pkg-config libsoup-2.4 --modversion`" - SOUP=1 - break ;; - *) - echo "not found." ;; - esac -done - -# -------------------------------------------------------------------------- - -if [ $SOUP -eq -1 ]; then - echo "Disabling libsoup support. (Network Updater won't be available.)" -fi - -# -------------------------------------------------------------------------- - -echo -n "Checking for Linux Wireless Extensions (CONFIG_NET_RADIO)... " -if [ -e /proc/net/wireless ]; then - echo "found." - LINUX_WE=1 -else - echo "not found." - LINUX_WE=-1 -fi - -# -------------------------------------------------------------------------- - -if [ $LINUX_WE -eq -1 ]; then - echo "Disabling Linux Wireless Extensions support." -fi - -# -------------------------------------------------------------------------- - -echo -e "\nWriting config.h..." -rm -f config.h -echo -e "#ifndef __CONFIG_H__\n#define __CONFIG_H__\n" > config.h - -echo "#define VERSION \"$VERSION\"" >> config.h - -echo "#define $ARCH" >> config.h -echo "#define ARCH \"$ARCH\"" >> config.h - -echo "#define PLATFORM \"`uname`\"" >> config.h -echo "#define KERNEL \"`uname -r`\"" >> config.h -echo "#define HOSTNAME \"`hostname`\"" >> config.h - -echo "#define PREFIX \"/usr/share/hardinfo/\"" >> config.h -echo "#define LIBPREFIX \"/usr/lib/hardinfo/\"" >> config.h - -if [ "$SOUP" == "1" ]; then - echo "#define HAS_LIBSOUP" >> config.h -fi - -if [ "$LINUX_WE" == "1" ]; then - echo "#define HAS_LINUX_WE" >> config.h -fi - -if [ "$RELEASE" == "1" ]; then - echo "#define DEBUG(...)" >> config.h -else - echo '#define DEBUG(msg,...) fprintf(stderr, "*** %s:%d (%s) *** " msg "\n", \' >> config.h - echo ' __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)' >> config.h -fi - -echo "#define ENABLE_BINRELOC 1" >> config.h -echo "#define RELEASE $RELEASE" >> config.h - -echo -e "\n#endif /* __CONFIG_H__ */" >> config.h - -echo "Writing Makefile..." -rm -f Makefile - -echo "GTK_LIBS = -lpthread -lgthread-2.0 -lrt ${GTK_LIBS}" > Makefile -echo "GTK_CFLAGS = ${GTK_FLAGS}" >> Makefile -echo "SOUP_LIBS = ${SOUP_LIBS}" >> Makefile -echo "SOUP_CFLAGS = ${SOUP_FLAGS}" >> Makefile -echo "PACKAGE = `basename ${PWD}`" >> Makefile -echo "ARCHOPTS = " >> Makefile -echo "LIBDIR = $LIBDIR" >> Makefile - -cat Makefile.in >> Makefile - -echo -e "\nDone. Type \"make\" to compile the program.\n" - - -if [ "$RELEASE" == 0 ]; then - cat << EOF -********************************************************* -* This is work in progress! Please report bugs at: * -* http://developer.berlios.de/bugs/?group_id=5897 * -* Or send patches to: * -* http://developer.berlios.de/patch/?group_id=5897 * -********************************************************* -EOF -else - cat << EOF -If you get errors, probably you don't have the right libraries, -includes or utilities. However, if you're sure this is a bug in my -code, please send a patch (use "diff -u") to . -EOF -fi diff --git a/devices.c b/devices.c deleted file mode 100644 index 35c3ea27..00000000 --- a/devices.c +++ /dev/null @@ -1,460 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef __USE_XOPEN -#define __USE_XOPEN -#endif /* __USE_XOPEN */ - -#ifndef _XOPEN_SOURCE -#define _XOPEN_SOURCE -#endif /* _XOPEN_SOURCE */ - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -gchar *callback_processors(); -gchar *callback_memory(); -gchar *callback_battery(); -gchar *callback_pci(); -gchar *callback_sensors(); -gchar *callback_printers(); -gchar *callback_storage(); -gchar *callback_input(); -gchar *callback_usb(); -#if defined(ARCH_i386) || defined(ARCH_x86_64) -gchar *callback_dmi(); -#endif -gchar *callback_device_resources(); - -void scan_processors(gboolean reload); -void scan_memory(gboolean reload); -void scan_battery(gboolean reload); -void scan_pci(gboolean reload); -void scan_sensors(gboolean reload); -void scan_printers(gboolean reload); -void scan_storage(gboolean reload); -void scan_input(gboolean reload); -void scan_usb(gboolean reload); -#if defined(ARCH_i386) || defined(ARCH_x86_64) -void scan_dmi(gboolean reload); -#endif -void scan_device_resources(gboolean reload); - -static ModuleEntry entries[] = { - {"Processor", "processor.png", callback_processors, scan_processors}, - {"Memory", "memory.png", callback_memory, scan_memory}, - {"PCI Devices", "devices.png", callback_pci, scan_pci}, - {"USB Devices", "usb.png", callback_usb, scan_usb}, - {"Printers", "printer.png", callback_printers, scan_printers,}, - {"Battery", "battery.png", callback_battery, scan_battery}, - {"Sensors", "therm.png", callback_sensors, scan_sensors}, - {"Input Devices", "inputdevices.png", callback_input, scan_input}, - {"Storage", "hdd.png", callback_storage, scan_storage}, -#if defined(ARCH_i386) || defined(ARCH_x86_64) - {"DMI", "computer.png", callback_dmi, scan_dmi}, -#endif /* x86 or x86_64 */ - {"Resources", "resources.png", callback_device_resources, scan_device_resources}, - {NULL} -}; - -static GHashTable *moreinfo = NULL; -static GSList *processors = NULL; -static gchar *printer_list = NULL; -static gchar *pci_list = NULL; -static gchar *input_list = NULL; -static gchar *storage_list = NULL; -static gchar *battery_list = NULL; -static gchar *meminfo = NULL, *lginterval = NULL; - -#define WALK_UNTIL(x) while((*buf != '\0') && (*buf != x)) buf++ - -#define GET_STR(field_name,ptr) \ - if (!ptr && strstr(tmp[0], field_name)) { \ - ptr = g_markup_escape_text(g_strstrip(tmp[1]), strlen(tmp[1])); \ - g_strfreev(tmp); \ - continue; \ - } - -#define get_str(field_name,ptr) \ - if (g_str_has_prefix(tmp[0], field_name)) { \ - ptr = g_strdup(tmp[1]); \ - g_strfreev(tmp); \ - continue; \ - } -#define get_int(field_name,ptr) \ - if (g_str_has_prefix(tmp[0], field_name)) { \ - ptr = atoi(tmp[1]); \ - g_strfreev(tmp); \ - continue; \ - } -#define get_float(field_name,ptr) \ - if (g_str_has_prefix(tmp[0], field_name)) { \ - ptr = atof(tmp[1]); \ - g_strfreev(tmp); \ - continue; \ - } - -#include - -typedef struct _Processor Processor; - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(ARCH_i386) || defined(ARCH_x86_64) -#include -#endif /* x86 or x86_64 */ - -gchar *get_processor_name(void) -{ - scan_processors(FALSE); - - Processor *p = (Processor *) processors->data; - - if (g_slist_length(processors) > 1) { - return idle_free(g_strdup_printf("%dx %s", - g_slist_length(processors), - p->model_name)); - } else { - return p->model_name; - } -} - -gchar *get_storage_devices(void) -{ - scan_storage(FALSE); - - return storage_list; -} - -gchar *get_printers(void) -{ - scan_printers(FALSE); - - return printer_list; -} - -gchar *get_input_devices(void) -{ - scan_input(FALSE); - - return input_list; -} - -gchar *get_processor_count(void) -{ - scan_processors(FALSE); - - return g_strdup_printf("%d", g_slist_length(processors)); -} - -gchar *get_processor_frequency(void) -{ - Processor *p; - - scan_processors(FALSE); - - p = (Processor *)processors->data; - if (p->cpu_mhz == 0.0f) { - return g_strdup("Unknown"); - } else { - return g_strdup_printf("%.0f", p->cpu_mhz); - } -} - -gchar *get_pci_device_description(gchar *pci_id) -{ - gchar *description; - - if (!_pci_devices) { - scan_pci(FALSE); - } - - if ((description = g_hash_table_lookup(_pci_devices, pci_id))) { - return g_strdup(description); - } - - return NULL; -} - -gchar *get_memory_total(void) -{ - /* FIXME */ - return g_strdup("0.0"); -} - -ShellModuleMethod *hi_exported_methods(void) -{ - static ShellModuleMethod m[] = { - {"getProcessorCount", get_processor_count}, - {"getProcessorName", get_processor_name}, - {"getProcessorFrequency", get_processor_frequency}, - {"getMemoryTotal", get_memory_total}, - {"getStorageDevices", get_storage_devices}, - {"getPrinters", get_printers}, - {"getInputDevices", get_input_devices}, - {"getPCIDeviceDescription", get_pci_device_description}, - {NULL} - }; - - return m; -} - -gchar *hi_more_info(gchar * entry) -{ - gchar *info = (gchar *) g_hash_table_lookup(moreinfo, entry); - - if (info) - return g_strdup(info); - - return g_strdup("?"); -} - -gchar *hi_get_field(gchar * field) -{ - gchar *info = (gchar *) g_hash_table_lookup(moreinfo, field); - - if (info) - return g_strdup(info); - - return g_strdup(field); -} - -#if defined(ARCH_i386) || defined(ARCH_x86_64) -void scan_dmi(gboolean reload) -{ - SCAN_START(); - __scan_dmi(); - SCAN_END(); -} -#endif - -void scan_processors(gboolean reload) -{ - SCAN_START(); - if (!processors) - processors = __scan_processors(); - SCAN_END(); -} - -void scan_memory(gboolean reload) -{ - SCAN_START(); - __scan_memory(); - SCAN_END(); -} - -void scan_battery(gboolean reload) -{ - SCAN_START(); - __scan_battery(); - SCAN_END(); -} - -void scan_pci(gboolean reload) -{ - SCAN_START(); - __scan_pci(); - SCAN_END(); -} - -void scan_sensors(gboolean reload) -{ - SCAN_START(); - __scan_sensors(); - SCAN_END(); -} - -void scan_printers(gboolean reload) -{ - SCAN_START(); - __scan_printers(); - SCAN_END(); -} - -void scan_storage(gboolean reload) -{ - SCAN_START(); - g_free(storage_list); - storage_list = g_strdup(""); - - __scan_ide_devices(); - __scan_scsi_devices(); - SCAN_END(); -} - -void scan_input(gboolean reload) -{ - SCAN_START(); - __scan_input_devices(); - SCAN_END(); -} - -void scan_usb(gboolean reload) -{ - SCAN_START(); - __scan_usb(); - SCAN_END(); -} - -gchar *callback_processors() -{ - return processor_get_info(processors); -} - -#if defined(ARCH_i386) || defined(ARCH_x86_64) -gchar *callback_dmi() -{ - return dmi_info; -} -#endif - -gchar *callback_memory() -{ - return g_strdup_printf("[Memory]\n" - "%s\n" - "[$ShellParam$]\n" - "ViewType=2\n" - "LoadGraphSuffix= kB\n" - "RescanInterval=2000\n" - "%s\n", meminfo, lginterval); -} - -gchar *callback_battery() -{ - return g_strdup_printf("%s\n" - "[$ShellParam$]\n" - "ReloadInterval=4000\n", battery_list); -} - -gchar *callback_pci() -{ - return g_strdup_printf("[PCI Devices]\n" - "%s" - "[$ShellParam$]\n" "ViewType=1\n", pci_list); -} - -gchar *callback_sensors() -{ - return g_strdup_printf("[$ShellParam$]\n" - "ReloadInterval=5000\n" "%s", sensors); -} - -gchar *callback_printers() -{ - return g_strdup_printf("%s\n" - "[$ShellParam$]\n" - "ViewType=1\n" - "ReloadInterval=5000", printer_list); -} - -gchar *callback_storage() -{ - return g_strdup_printf("%s\n" - "[$ShellParam$]\n" - "ReloadInterval=5000\n" - "ViewType=1\n%s", storage_list, storage_icons); -} - -gchar *callback_input() -{ - return g_strdup_printf("[Input Devices]\n" - "%s" - "[$ShellParam$]\n" - "ViewType=1\n" - "ReloadInterval=5000\n%s", input_list, - input_icons); -} - -gchar *callback_usb() -{ - return g_strdup_printf("%s" - "[$ShellParam$]\n" - "ViewType=1\n" - "ReloadInterval=5000\n", usb_list); -} - -ModuleEntry *hi_module_get_entries(void) -{ - return entries; -} - -gchar *hi_module_get_name(void) -{ - return g_strdup("Devices"); -} - -guchar hi_module_get_weight(void) -{ - return 85; -} - -void hi_module_init(void) -{ - if (!g_file_test("/usr/share/misc/pci.ids", G_FILE_TEST_EXISTS)) { - static SyncEntry se = { - .fancy_name = "Update PCI ID listing", - .name = "GetPCIIds", - .save_to = "pci.ids", - .get_data = NULL - }; - - sync_manager_add_entry(&se); - } - - moreinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); - __init_memory_labels(); - __init_cups(); -} - -ModuleAbout *hi_module_get_about(void) -{ - static ModuleAbout ma[] = { - { - .author = "Leandro A. F. Pereira", - .description = "Gathers information about hardware devices", - .version = VERSION, - .license = "GNU GPL version 2"} - }; - - return ma; -} - -gchar **hi_module_get_dependencies(void) -{ - static gchar *deps[] = { "computer.so", NULL }; - - return deps; -} diff --git a/doc/index.hlp b/doc/index.hlp new file mode 100644 index 00000000..649a7a4a --- /dev/null +++ b/doc/index.hlp @@ -0,0 +1,35 @@ +# HardInfo Documentation + +## Introduction + +HardInfo can gather information about your system's hardware and operating system, perform benchmarks, and generate printable reports either in HTML or in plain text formats. + +## Feature Overview + +* Obtains information about basic hardware items; +* Obtains information about basic operating system items; +* Performs CPU and FPU benchmarks; +* Allows [network-updater.hlp synchronization of benchmark results] with other HardInfo users; +* Some tables can be [network-updater.hlp updated] from the Internet; +* Can be used either in local or in [remote.hlp remote] mode; +* Generates repots in HTML or plain text formats; +* Can be used either with a GTK+ GUI or on a terminal. + +## Using + +* [report-generation.hlp Generating Reports] +* [network-updater.hlp Using the Network Updater] +* [remote.hlp Obtaining Information from a Remote Machine] +* [benchmark.hlp Performing and Understanding Benchmarks] +* [command-line.hlp Using HardInfo from the command line] + +## Improving + +* [bug-reporting.hlp How to Report Bugs] +* [feature-requests.hlp How to Request a Feature] +* [http://hardinfo.org/developer Developer Documentation] + +## Following + +* [https://twitter.com/hardinfo Twitter] (for GitHub commits) +* [http://lists.hardinfo.org Mailing Lists] diff --git a/expr.c b/expr.c deleted file mode 100644 index 32e303d7..00000000 --- a/expr.c +++ /dev/null @@ -1,250 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -/* - * This is only used to compute sensor values, hence the only variable supported is '@'. - * The '`' operator (ln(x)) is not available, nor multi-line formulas. - */ - -#include -#include -#include -#include -#include - -#include "expr.h" -#include "config.h" - -static MathToken *new_operator(gchar op) -{ - MathToken *t = g_new0(MathToken, 1); - - t->val.op = op; - t->type = TOKEN_OPERATOR; /* operator */ - - return t; -} - -static MathToken *new_variable(gchar var) -{ - MathToken *t = g_new0(MathToken, 1); - - t->val.op = '@'; - t->type = TOKEN_VARIABLE; /* variable */ - - return t; -} - -static MathToken *new_value(gfloat value) -{ - MathToken *t = g_new0(MathToken, 1); - - t->val.value = value; - t->type = TOKEN_VALUE; /* value */ - - return t; -} - -static inline gint priority(char operation) -{ - switch (operation) { - case '^': - return 3; - case '*': - case '/': - return 2; - case '+': - case '-': - return 1; - case '(': - return 0; - } - - return 0; -} - -GSList *math_infix_to_postfix(GSList * infix) -{ - MathToken *stack[500]; - gint t_sp = 0; - - GSList *postfix = NULL, *p; - MathToken *top; - - for (p = infix; p; p = p->next) { - MathToken *t = (MathToken *) p->data; - - if (t->type == TOKEN_OPERATOR && t->val.op == '(') { - stack[++t_sp] = t; - } else if (t->type == TOKEN_OPERATOR && t->val.op == ')') { - for (top = stack[t_sp]; t_sp != 0 && top->val.op != '('; - top = stack[t_sp]) { - postfix = g_slist_append(postfix, stack[t_sp--]); - } - t_sp--; - } else if (t->type != TOKEN_OPERATOR) { - postfix = g_slist_append(postfix, t); - } else if (t_sp == 0) { - stack[++t_sp] = t; - } else { - while (t_sp != 0 - && priority(t->val.op) <= priority(stack[t_sp]->val.op)) - postfix = g_slist_append(postfix, stack[t_sp--]); - stack[++t_sp] = t; - } - } - - while (t_sp) - postfix = g_slist_append(postfix, stack[t_sp--]); - - return postfix; -} - -static inline gfloat __result(gfloat op1, gfloat op2, gchar operation) -{ - switch (operation) { - case '^': - return powf(op1, op2); - case '+': - return op1 + op2; - case '-': - return op1 - op2; - case '/': - return op1 / op2; - case '*': - return op1 * op2; - } - - return 0; -} - -gfloat math_postfix_eval(GSList * postfix, gfloat at_value) -{ - GSList *p; - gfloat stack[500]; - gint sp = 0; - - memset(stack, 0, sizeof(gfloat) * 500); - - for (p = postfix; p; p = p->next) { - MathToken *t = (MathToken *) p->data; - - if (t->type == TOKEN_VARIABLE) { - stack[++sp] = at_value; - } else if (t->type == TOKEN_VALUE) { - stack[++sp] = t->val.value; - } else { - gfloat op1, op2; - - op2 = stack[sp--]; - op1 = stack[sp]; - - stack[sp] = __result(op1, op2, t->val.op); - } - } - - return stack[sp]; -} - -GSList *math_string_to_infix(gchar * string) -{ - GSList *infix = NULL; - gchar *expr = string; - - for (; *expr; expr++) { - if (strchr("+-/*^()", *expr)) { - infix = g_slist_append(infix, new_operator(*expr)); - } else if (strchr("@", *expr)) { - infix = g_slist_append(infix, new_variable(*expr)); - } else if (strchr("-.1234567890", *expr)) { - gchar value[32], *v = value; - gfloat floatval; - - do { - *v++ = *expr++; - } while (*expr && strchr("-.1234567890", *expr)); - expr--; - *v = '\0'; - - sscanf(value, "%f", &floatval); - - infix = g_slist_append(infix, new_value(floatval)); - } else if (!isspace(*expr)) { - g_print("Invalid token: [%c][%d]\n", *expr, *expr); - math_infix_free(infix, TRUE); - return NULL; - } - } - - return infix; -} - -void math_infix_free(GSList * infix, gboolean free_tokens) -{ - GSList *p; - - if (!free_tokens) - for (p = infix; p; p = g_slist_delete_link(p, p)); - else - for (p = infix; p; p = g_slist_delete_link(p, p)) { - MathToken *t = (MathToken *) p->data; - g_free(t); - } -} - -GSList *math_string_to_postfix(gchar * string) -{ - GSList *infix; - GSList *postfix; - - infix = math_string_to_infix(string); - if (!infix) - return NULL; - - postfix = math_infix_to_postfix(infix); - math_infix_free(infix, FALSE); - - return postfix; -} - -gfloat math_string_eval(gchar * string, gfloat at_value) -{ - GSList *postfix; - gfloat val; - - postfix = math_string_to_postfix(string); - val = math_postfix_eval(postfix, at_value); - math_postfix_free(postfix, TRUE); - - return val; -} - -#ifdef MATH_TEST -int main(void) -{ - GSList *postfix; - - gchar *expr = "0.9*(@+(5.2*0.923+3*(2.0)))"; - - postfix = math_string_to_postfix(expr); - g_print("%s = %f (must be 18.71964)\n", expr, - math_postfix_eval(postfix, 10)); - math_postfix_free(postfix, TRUE); - - return 0; -} -#endif diff --git a/expr.h b/expr.h deleted file mode 100644 index 4bda6b72..00000000 --- a/expr.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __EXPR_H__ -#define __EXPR_H__ - -typedef struct _MathToken MathToken; - -typedef enum { - TOKEN_OPERATOR, - TOKEN_VARIABLE, - TOKEN_VALUE -} MathTokenType; - -struct _MathToken { - union { - gfloat value; - gchar op; - } val; - MathTokenType type; -}; - -#define math_postfix_free math_infix_free - -GSList *math_infix_to_postfix(GSList *infix); -void math_infix_free(GSList *infix, gboolean free_tokens); - -GSList *math_string_to_infix(gchar *string); -GSList *math_string_to_postfix(gchar *string); - -gfloat math_postfix_eval(GSList *postfix, gfloat at_value); -gfloat math_string_eval(gchar *string, gfloat at_value); - -#endif /* __EXPR_H__ */ diff --git a/fbench.c b/fbench.c deleted file mode 100644 index 20f01a35..00000000 --- a/fbench.c +++ /dev/null @@ -1,745 +0,0 @@ -/* - - John Walker's Floating Point Benchmark, derived from... - - Marinchip Interactive Lens Design System - - John Walker December 1980 - - By John Walker - http://www.fourmilab.ch/ - - This program may be used, distributed, and modified freely as - long as the origin information is preserved. - - This is a complete optical design raytracing algorithm, - stripped of its user interface and recast into portable C. It - not only determines execution speed on an extremely floating - point (including trig function) intensive real-world - application, it checks accuracy on an algorithm that is - exquisitely sensitive to errors. The performance of this - program is typically far more sensitive to changes in the - efficiency of the trigonometric library routines than the - average floating point program. - - The benchmark may be compiled in two modes. If the symbol - INTRIG is defined, built-in trigonometric and square root - routines will be used for all calculations. Timings made with - INTRIG defined reflect the machine's basic floating point - performance for the arithmetic operators. If INTRIG is not - defined, the system library functions are used. - Results with INTRIG not defined reflect the system's library - performance and/or floating point hardware support for trig - functions and square root. Results with INTRIG defined are a - good guide to general floating point performance, while - results with INTRIG undefined indicate the performance of an - application which is math function intensive. - - Special note regarding errors in accuracy: this program has - generated numbers identical to the last digit it formats and - checks on the following machines, floating point - architectures, and languages: - - Marinchip 9900 QBASIC IBM 370 double-precision (REAL * 8) format - - IBM PC / XT / AT Lattice C IEEE 64 bit, 80 bit temporaries - High C same, in line 80x87 code - BASICA "Double precision" - Quick BASIC IEEE double precision, software routines - - Sun 3 C IEEE 64 bit, 80 bit temporaries, - in-line 68881 code, in-line FPA code. - - MicroVAX II C Vax "G" format floating point - - Macintosh Plus MPW C SANE floating point, IEEE 64 bit format - implemented in ROM. - - Inaccuracies reported by this program should be taken VERY - SERIOUSLY INDEED, as the program has been demonstrated to be - invariant under changes in floating point format, as long as - the format is a recognised double precision format. If you - encounter errors, please remember that they are just as likely - to be in the floating point editing library or the - trigonometric libraries as in the low level operator code. - - The benchmark assumes that results are basically reliable, and - only tests the last result computed against the reference. If - you're running on a suspect system you can compile this - program with ACCURACY defined. This will generate a version - which executes as an infinite loop, performing the ray trace - and checking the results on every pass. All incorrect results - will be reported. - - Representative timings are given below. All have been - normalised as if run for 1000 iterations. - - Time in seconds Computer, Compiler, and notes - Normal INTRIG - - 3466.00 4031.00 Commodore 128, 2 Mhz 8510 with software floating - point. Abacus Software/Data-Becker Super-C 128, - version 3.00, run in fast (2 Mhz) mode. Note: - the results generated by this system differed - from the reference results in the 8th to 10th - decimal place. - - 3290.00 IBM PC/AT 6 Mhz, Microsoft/IBM BASICA version A3.00. - Run with the "/d" switch, software floating point. - - 2131.50 IBM PC/AT 6 Mhz, Lattice C version 2.14, small model. - This version of Lattice compiles subroutine - calls which either do software floating point - or use the 80x87. The machine on which I ran - this had an 80287, but the results were so bad - I wonder if it was being used. - - 1598.00 Macintosh Plus, MPW C, SANE Software floating point. - - 1582.13 Marinchip 9900 2 Mhz, QBASIC compiler with software - floating point. This was a QBASIC version of the - program which contained the identical algorithm. - - 404.00 IBM PC/AT 6 Mhz, Microsoft QuickBASIC version 2.0. - Software floating point. - - 165.15 IBM PC/AT 6 Mhz, Metaware High C version 1.3, small - model. This was compiled to call subroutines for - floating point, and the machine contained an 80287 - which was used by the subroutines. - - 143.20 Macintosh II, MPW C, SANE calls. I was unable to - determine whether SANE was using the 68881 chip or - not. - - 121.80 Sun 3/160 16 Mhz, Sun C. Compiled with -fsoft switch - which executes floating point in software. - - 78.78 110.11 IBM RT PC (Model 6150). IBM AIX 1.0 C compiler - with -O switch. - - 75.2 254.0 Microsoft Quick C 1.0, in-line 8087 instructions, - compiled with 80286 optimisation on. (Switches - were -Ol -FPi87-G2 -AS). Small memory model. - - 69.50 IBM PC/AT 6Mhz, Borland Turbo BASIC 1.0. Compiled - in "8087 required" mode to generate in-line - code for the math coprocessor. - - 66.96 IBM PC/AT 6Mhz, Microsoft QuickBASIC 4.0. This - release of QuickBASIC compiles code for the - 80287 math coprocessor. - - 66.36 206.35 IBM PC/AT 6Mhz, Metaware High C version 1.3, small - model. This was compiled with in-line code for the - 80287 math coprocessor. Trig functions still call - library routines. - - 63.07 220.43 IBM PC/AT, 6Mhz, Borland Turbo C, in-line 8087 code, - small model, word alignment, no stack checking, - 8086 code mode. - - 17.18 Apollo DN-3000, 12 Mhz 68020 with 68881, compiled - with in-line code for the 68881 coprocessor. - According to Apollo, the library routines are chosen - at runtime based on coprocessor presence. Since the - coprocessor was present, the library is supposed to - use in-line floating point code. - - 15.55 27.56 VAXstation II GPX. Compiled and executed under - VAX/VMS C. - - 15.14 37.93 Macintosh II, Unix system V. Green Hills 68020 - Unix compiler with in-line code for the 68881 - coprocessor (-O -ZI switches). - - 12.69 Sun 3/160 16 Mhz, Sun C. Compiled with -fswitch, - which calls a subroutine to select the fastest - floating point processor. This was using the 68881. - - 11.74 26.73 Compaq Deskpro 386, 16 Mhz 80386 with 16 Mhz 80387. - Metaware High C version 1.3, compiled with in-line - for the math coprocessor (but not optimised for the - 80386/80387). Trig functions still call library - routines. - - 8.43 30.49 Sun 3/160 16 Mhz, Sun C. Compiled with -f68881, - generating in-line MC68881 instructions. Trig - functions still call library routines. - - 6.29 25.17 Sun 3/260 25 Mhz, Sun C. Compiled with -f68881, - generating in-line MC68881 instructions. Trig - functions still call library routines. - - 4.57 Sun 3/260 25 Mhz, Sun FORTRAN 77. Compiled with - -O -f68881, generating in-line MC68881 instructions. - Trig functions are compiled in-line. This used - the FORTRAN 77 version of the program, FBFORT77.F. - - 4.00 14.20 Sun386i/25 Mhz model 250, Sun C compiler. - - 4.00 14.00 Sun386i/25 Mhz model 250, Metaware C. - - 3.10 12.00 Compaq 386/387 25 Mhz running SCO Xenix 2. - Compiled with Metaware HighC 386, optimized - for 386. - - 3.00 12.00 Compaq 386/387 25MHZ optimized for 386/387. - - 2.96 5.17 Sun 4/260, Sparc RISC processor. Sun C, - compiled with the -O2 switch for global - optimisation. - - 2.47 COMPAQ 486/25, secondary cache disabled, High C, - 486/387, inline f.p., small memory model. - - 2.20 3.40 Data General Motorola 88000, 16 Mhz, Gnu C. - - 1.56 COMPAQ 486/25, 128K secondary cache, High C, 486/387, - inline f.p., small memory model. - - 0.66 1.50 DEC Pmax, Mips processor. - - 0.63 0.91 Sun SparcStation 2, Sun C (SunOS 4.1.1) with - -O4 optimisation and "/usr/lib/libm.il" inline - floating point. - - 0.60 1.07 Intel 860 RISC processor, 33 Mhz, Greenhills - C compiler. - - 0.40 0.90 Dec 3MAX, MIPS 3000 processor, -O4. - - 0.31 0.90 IBM RS/6000, -O. - - 0.1129 0.2119 Dell Dimension XPS P133c, Pentium 133 MHz, - Windows 95, Microsoft Visual C 5.0. - - 0.0883 0.2166 Silicon Graphics Indigo, MIPS R4400, - 175 Mhz, "-O3". - - 0.0351 0.0561 Dell Dimension XPS R100, Pentium II 400 MHz, - Windows 98, Microsoft Visual C 5.0. - - 0.0312 0.0542 Sun Ultra 2, UltraSPARC V9, 300 MHz, Solaris - 2.5.1. - - 0.00862 0.01074 Dell Inspiron 9100, Pentium 4, 3.4 GHz, gcc -O3. - -*/ - -#include -#include -#include -#ifndef INTRIG -#include -#endif - -#define cot(x) (1.0 / tan(x)) - -#define TRUE 1 -#define FALSE 0 - -#define max_surfaces 10 - -/* Local variables */ - -/*static char tbfr[132];*/ - -static short current_surfaces; -static short paraxial; - -static double clear_aperture; - -static double aberr_lspher; -static double aberr_osc; -static double aberr_lchrom; - -static double max_lspher; -static double max_osc; -static double max_lchrom; - -static double radius_of_curvature; -static double object_distance; -static double ray_height; -static double axis_slope_angle; -static double from_index; -static double to_index; - -static double spectral_line[9]; -static double s[max_surfaces][5]; -static double od_sa[2][2]; - - /*static char outarr[8][80];*//* Computed output of program goes here */ - -int itercount; /* The iteration counter for the main loop - in the program is made global so that - the compiler should not be allowed to - optimise out the loop over the ray - tracing code. */ - -#ifndef ITERATIONS -#define ITERATIONS 1000 -#endif -int niter = ITERATIONS; /* Iteration counter */ - -#if 0 -static char *refarr[] = { /* Reference results. These happen to - be derived from a run on Microsoft - Quick BASIC on the IBM PC/AT. */ - - " Marginal ray 47.09479120920 0.04178472683", - " Paraxial ray 47.08372160249 0.04177864821", - "Longitudinal spherical aberration: -0.01106960671", - " (Maximum permissible): 0.05306749907", - "Offense against sine condition (coma): 0.00008954761", - " (Maximum permissible): 0.00250000000", - "Axial chromatic aberration: 0.00448229032", - " (Maximum permissible): 0.05306749907" -}; -#endif - -/* The test case used in this program is the design for a 4 inch - achromatic telescope objective used as the example in Wyld's - classic work on ray tracing by hand, given in Amateur Telescope - Making, Volume 3. */ - -static double testcase[4][4] = { - {27.05, 1.5137, 63.6, 0.52}, - {-16.68, 1, 0, 0.138}, - {-16.68, 1.6164, 36.7, 0.38}, - {-78.1, 1, 0, 0} -}; - -/* Internal trig functions (used only if INTRIG is defined). These - standard functions may be enabled to obtain timings that reflect - the machine's floating point performance rather than the speed of - its trig function evaluation. */ - -#ifdef INTRIG - -/* The following definitions should keep you from getting intro trouble - with compilers which don't let you redefine intrinsic functions. */ - -#define sin I_sin -#define cos I_cos -#define tan I_tan -#define sqrt I_sqrt -#define atan I_atan -#define atan2 I_atan2 -#define asin I_asin - -#define fabs(x) ((x < 0.0) ? -x : x) - -#define pic 3.1415926535897932 - -/* Commonly used constants */ - -static double pi = pic, - twopi = pic * 2.0, - piover4 = pic / 4.0, fouroverpi = 4.0 / pic, piover2 = pic / 2.0; - -/* Coefficients for ATAN evaluation */ - -static double atanc[] = { - 0.0, - 0.4636476090008061165, - 0.7853981633974483094, - 0.98279372324732906714, - 1.1071487177940905022, - 1.1902899496825317322, - 1.2490457723982544262, - 1.2924966677897852673, - 1.3258176636680324644 -}; - -/* aint(x) Return integer part of number. Truncates towards 0 */ - -double aint(x) -double x; -{ - long l; - - /* Note that this routine cannot handle the full floating point - number range. This function should be in the machine-dependent - floating point library! */ - - l = x; - if ((int) (-0.5) != 0 && l < 0) - l++; - x = l; - return x; -} - -/* sin(x) Return sine, x in radians */ - -static double sin(x) -double x; -{ - int sign; - double y, r, z; - - x = (((sign = (x < 0.0)) != 0) ? -x : x); - - if (x > twopi) - x -= (aint(x / twopi) * twopi); - - if (x > pi) { - x -= pi; - sign = !sign; - } - - if (x > piover2) - x = pi - x; - - if (x < piover4) { - y = x * fouroverpi; - z = y * y; - r = y * - (((((((-0.202253129293E-13 * z + 0.69481520350522E-11) * z - - 0.17572474176170806E-8) * z + - 0.313361688917325348E-6) * z - - 0.365762041821464001E-4) * z + - 0.249039457019271628E-2) * z - 0.0807455121882807815) * z + - 0.785398163397448310); - } else { - y = (piover2 - x) * fouroverpi; - z = y * y; - r = ((((((-0.38577620372E-12 * z + 0.11500497024263E-9) * z - - 0.2461136382637005E-7) * z + - 0.359086044588581953E-5) * z - - 0.325991886926687550E-3) * z + 0.0158543442438154109) * z - - 0.308425137534042452) * z + 1.0; - } - return sign ? -r : r; -} - -/* cos(x) Return cosine, x in radians, by identity */ - -static double cos(x) -double x; -{ - x = (x < 0.0) ? -x : x; - if (x > twopi) /* Do range reduction here to limit */ - x = x - (aint(x / twopi) * twopi); /* roundoff on add of PI/2 */ - return sin(x + piover2); -} - -/* tan(x) Return tangent, x in radians, by identity */ - -static double tan(x) -double x; -{ - return sin(x) / cos(x); -} - -/* sqrt(x) Return square root. Initial guess, then Newton- - Raphson refinement */ - -double sqrt(x) -double x; -{ - double c, cl, y; - int n; - - if (x == 0.0) - return 0.0; - - if (x < 0.0) { - fprintf(stderr, - "\nGood work! You tried to take the square root of %g", - x); - fprintf(stderr, - "\nunfortunately, that is too complex for me to handle.\n"); - exit(1); - } - - y = (0.154116 + 1.893872 * x) / (1.0 + 1.047988 * x); - - c = (y - x / y) / 2.0; - cl = 0.0; - for (n = 50; c != cl && n--;) { - y = y - c; - cl = c; - c = (y - x / y) / 2.0; - } - return y; -} - -/* atan(x) Return arctangent in radians, - range -pi/2 to pi/2 */ - -static double atan(x) -double x; -{ - int sign, l, y; - double a, b, z; - - x = (((sign = (x < 0.0)) != 0) ? -x : x); - l = 0; - - if (x >= 4.0) { - l = -1; - x = 1.0 / x; - y = 0; - goto atl; - } else { - if (x < 0.25) { - y = 0; - goto atl; - } - } - - y = aint(x / 0.5); - z = y * 0.5; - x = (x - z) / (x * z + 1); - - atl: - z = x * x; - b = ((((893025.0 * z + 49116375.0) * z + 425675250.0) * z + - 1277025750.0) * z + 1550674125.0) * z + 654729075.0; - a = (((13852575.0 * z + 216602100.0) * z + 891080190.0) * z + - 1332431100.0) * z + 654729075.0; - a = (a / b) * x + atanc[y]; - if (l) - a = piover2 - a; - return sign ? -a : a; -} - -/* atan2(y,x) Return arctangent in radians of y/x, - range -pi to pi */ - -static double atan2(y, x) -double y, x; -{ - double temp; - - if (x == 0.0) { - if (y == 0.0) /* Special case: atan2(0,0) = 0 */ - return 0.0; - else if (y > 0) - return piover2; - else - return -piover2; - } - temp = atan(y / x); - if (x < 0.0) { - if (y >= 0.0) - temp += pic; - else - temp -= pic; - } - return temp; -} - -/* asin(x) Return arcsine in radians of x */ - -static double asin(x) -double x; -{ - if (fabs(x) > 1.0) { - fprintf(stderr, - "\nInverse trig functions lose much of their gloss when"); - fprintf(stderr, - "\ntheir arguments are greater than 1, such as the"); - fprintf(stderr, "\nvalue %g you passed.\n", x); - exit(1); - } - return atan2(x, sqrt(1 - x * x)); -} -#endif - -/* Calculate passage through surface - - If the variable PARAXIAL is true, the trace through the - surface will be done using the paraxial approximations. - Otherwise, the normal trigonometric trace will be done. - - This routine takes the following inputs: - - RADIUS_OF_CURVATURE Radius of curvature of surface - being crossed. If 0, surface is - plane. - - OBJECT_DISTANCE Distance of object focus from - lens vertex. If 0, incoming - rays are parallel and - the following must be specified: - - RAY_HEIGHT Height of ray from axis. Only - relevant if OBJECT.DISTANCE == 0 - - AXIS_SLOPE_ANGLE Angle incoming ray makes with axis - at intercept - - FROM_INDEX Refractive index of medium being left - - TO_INDEX Refractive index of medium being - entered. - - The outputs are the following variables: - - OBJECT_DISTANCE Distance from vertex to object focus - after refraction. - - AXIS_SLOPE_ANGLE Angle incoming ray makes with axis - at intercept after refraction. - -*/ - -static void transit_surface() -{ - double iang, /* Incidence angle */ - rang, /* Refraction angle */ - iang_sin, /* Incidence angle sin */ - rang_sin, /* Refraction angle sin */ - old_axis_slope_angle, sagitta; - - if (paraxial) { - if (radius_of_curvature != 0.0) { - if (object_distance == 0.0) { - axis_slope_angle = 0.0; - iang_sin = ray_height / radius_of_curvature; - } else - iang_sin = ((object_distance - - radius_of_curvature) / radius_of_curvature) * - axis_slope_angle; - - rang_sin = (from_index / to_index) * iang_sin; - old_axis_slope_angle = axis_slope_angle; - axis_slope_angle = axis_slope_angle + iang_sin - rang_sin; - if (object_distance != 0.0) - ray_height = object_distance * old_axis_slope_angle; - object_distance = ray_height / axis_slope_angle; - return; - } - object_distance = object_distance * (to_index / from_index); - axis_slope_angle = axis_slope_angle * (from_index / to_index); - return; - } - - if (radius_of_curvature != 0.0) { - if (object_distance == 0.0) { - axis_slope_angle = 0.0; - iang_sin = ray_height / radius_of_curvature; - } else { - iang_sin = ((object_distance - - radius_of_curvature) / radius_of_curvature) * - sin(axis_slope_angle); - } - iang = asin(iang_sin); - rang_sin = (from_index / to_index) * iang_sin; - old_axis_slope_angle = axis_slope_angle; - axis_slope_angle = axis_slope_angle + iang - asin(rang_sin); - sagitta = sin((old_axis_slope_angle + iang) / 2.0); - sagitta = 2.0 * radius_of_curvature * sagitta * sagitta; - object_distance = - ((radius_of_curvature * sin(old_axis_slope_angle + iang)) * - cot(axis_slope_angle)) + sagitta; - return; - } - - rang = -asin((from_index / to_index) * sin(axis_slope_angle)); - object_distance = object_distance * ((to_index * - cos(-rang)) / (from_index * - cos - (axis_slope_angle))); - axis_slope_angle = -rang; -} - -/* Perform ray trace in specific spectral line */ - -static void trace_line(line, ray_h) -int line; -double ray_h; -{ - int i; - - object_distance = 0.0; - ray_height = ray_h; - from_index = 1.0; - - for (i = 1; i <= current_surfaces; i++) { - radius_of_curvature = s[i][1]; - to_index = s[i][2]; - if (to_index > 1.0) - to_index = to_index + ((spectral_line[4] - - spectral_line[line]) / - (spectral_line[3] - - spectral_line[6])) * ((s[i][2] - - 1.0) / s[i][3]); - transit_surface(); - from_index = to_index; - if (i < current_surfaces) - object_distance = object_distance - s[i][4]; - } -} - -/* Initialise when called the first time */ - -void fbench() -{ - int i, j; - double od_fline, od_cline; - - spectral_line[1] = 7621.0; /* A */ - spectral_line[2] = 6869.955; /* B */ - spectral_line[3] = 6562.816; /* C */ - spectral_line[4] = 5895.944; /* D */ - spectral_line[5] = 5269.557; /* E */ - spectral_line[6] = 4861.344; /* F */ - spectral_line[7] = 4340.477; /* G' */ - spectral_line[8] = 3968.494; /* H */ - - niter = 3000; - - /* Load test case into working array */ - - clear_aperture = 4.0; - current_surfaces = 4; - for (i = 0; i < current_surfaces; i++) - for (j = 0; j < 4; j++) - s[i + 1][j + 1] = testcase[i][j]; - - for (itercount = 0; itercount < niter; itercount++) { - for (paraxial = 0; paraxial <= 1; paraxial++) { - - /* Do main trace in D light */ - - trace_line(4, clear_aperture / 2.0); - od_sa[paraxial][0] = object_distance; - od_sa[paraxial][1] = axis_slope_angle; - } - paraxial = FALSE; - - /* Trace marginal ray in C */ - - trace_line(3, clear_aperture / 2.0); - od_cline = object_distance; - - /* Trace marginal ray in F */ - - trace_line(6, clear_aperture / 2.0); - od_fline = object_distance; - - aberr_lspher = od_sa[1][0] - od_sa[0][0]; - aberr_osc = 1.0 - (od_sa[1][0] * od_sa[1][1]) / - (sin(od_sa[0][1]) * od_sa[0][0]); - aberr_lchrom = od_fline - od_cline; - max_lspher = sin(od_sa[0][1]); - - /* D light */ - - max_lspher = 0.0000926 / (max_lspher * max_lspher); - max_osc = 0.0025; - max_lchrom = max_lspher; - } -} - -#ifdef __FBENCH_TEST__ -int main(void) -{ - fbench(); - - return 0; -} -#endif diff --git a/fftbench.c b/fftbench.c deleted file mode 100644 index 597c5693..00000000 --- a/fftbench.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - fftbench.c - - Written by Scott Robert Ladd (scott@coyotegulch.com) - No rights reserved. This is public domain software, for use by anyone. - - A number-crunching benchmark using LUP-decomposition to solve a large - linear equation. - - The code herein is design for the purpose of testing computational - performance; error handling is minimal. - - In fact, this is a weak implementation of the FFT; unfortunately, all - of my really nifty FFTs are in commercial code, and I haven't had time - to write a new FFT routine for this benchmark. I may add a Hartley - transform to the seat, too. - - Actual benchmark results can be found at: - http://www.coyotegulch.com - - Please do not use this information or algorithm in any way that might - upset the balance of the universe or otherwise cause a disturbance in - the space-time continuum. -*/ - -#include -#include -#include -#include -#include -#include - -// embedded random number generator; ala Park and Miller -static long seed = 1325; -static const long IA = 16807; -static const long IM = 2147483647; -static const double AM = 4.65661287525E-10; -static const long IQ = 127773; -static const long IR = 2836; -static const long MASK = 123459876; - -static double random_double() -{ - long k; - double result; - - seed ^= MASK; - k = seed / IQ; - seed = IA * (seed - k * IQ) - IR * k; - - if (seed < 0) - seed += IM; - - result = AM * seed; - seed ^= MASK; - - return result; -} - -static const int N = 800; -static const int NM1 = 799; // N - 1 -static const int NP1 = 801; // N + 1 - -static int *lup_decompose(double **a) -{ - int i, j, k, k2, t; - double p, temp; - - int *perm = (int *) malloc(sizeof(double) * N); - - for (i = 0; i < N; ++i) - perm[i] = i; - - for (k = 0; k < NM1; ++k) { - p = 0.0; - - for (i = k; i < N; ++i) { - temp = fabs(a[i][k]); - - if (temp > p) { - p = temp; - k2 = i; - } - } - - // check for invalid a - if (p == 0.0) - return NULL; - - // exchange rows - t = perm[k]; - perm[k] = perm[k2]; - perm[k2] = t; - - for (i = 0; i < N; ++i) { - temp = a[k][i]; - a[k][i] = a[k2][i]; - a[k2][i] = temp; - } - - for (i = k + 1; i < N; ++i) { - a[i][k] /= a[k][k]; - - for (j = k + 1; j < N; ++j) - a[i][j] -= a[i][k] * a[k][j]; - } - } - - return perm; -} - -static double *lup_solve(double **a, int *perm, double *b) -{ - int i, j, j2; - double sum, u; - - double *y = (double *) malloc(sizeof(double) * N); - double *x = (double *) malloc(sizeof(double) * N); - - for (i = 0; i < N; ++i) { - y[i] = 0.0; - x[i] = 0.0; - } - - for (i = 0; i < N; ++i) { - sum = 0.0; - j2 = 0; - - for (j = 1; j <= i; ++j) { - sum += a[i][j2] * y[j2]; - ++j2; - } - - y[i] = b[perm[i]] - sum; - } - - i = NM1; - - while (1) { - sum = 0.0; - u = a[i][i]; - - for (j = i + 1; j < N; ++j) - sum += a[i][j] * x[j]; - - x[i] = (y[i] - sum) / u; - - if (i == 0) - break; - - --i; - } - - free(y); - - return x; -} - -static double **a, *b, *r; -static int *p; - -void fft_bench_init(void) -{ - int i, j; - - // generate test data - a = (double **) malloc(sizeof(double *) * N); - - for (i = 0; i < N; ++i) { - a[i] = (double *) malloc(sizeof(double) * N); - - for (j = 0; j < N; ++j) - a[i][j] = random_double(); - } - - b = (double *) malloc(sizeof(double) * N); - - for (i = 0; i < N; ++i) - b[i] = random_double(); - -} - -void fft_bench_start(void) -{ - p = lup_decompose(a); - r = lup_solve(a, p, b); -} - -void fft_bench_finish(void) -{ - int i; - - // clean up - for (i = 0; i < N; ++i) - free(a[i]); - - free(a); - free(b); - free(p); - free(r); -} diff --git a/fftbench.h b/fftbench.h deleted file mode 100644 index 3598baf1..00000000 --- a/fftbench.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef __FFTBENCH_H__ -#define __FFTBENCH_H__ - -void fft_bench_init(void); -void fft_bench_start(void); -void fft_bench_finish(void); - -#endif /* __FFTBENCH_H__ */ - - diff --git a/hardinfo.c b/hardinfo.c deleted file mode 100644 index 651a39e0..00000000 --- a/hardinfo.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include - -#include -#include -#include -#include -#include - -#include - -ProgramParameters params = { 0 }; - -int main(int argc, char **argv) -{ - GSList *modules; - - DEBUG("HardInfo version " VERSION ". Debug version."); - - DEBUG("g_thread_init()"); - if (!g_thread_supported()) - g_thread_init(NULL); - - /* parse all command line parameters */ - parameters_init(&argc, &argv, ¶ms); - - /* show version information and quit */ - if (params.show_version) { - g_print("HardInfo version " VERSION "\n"); - g_print - ("Copyright (C) 2003-2009 Leandro A. F. Pereira. See COPYING for details.\n\n"); - - g_print("Compile-time options:\n" - " Release version: %s (%s)\n" - " BinReloc enabled: %s\n" - " Data prefix: %s\n" - " Library prefix: %s\n" - " Compiled on: %s %s (%s)\n", - RELEASE ? "Yes" : "No (" VERSION ")", ARCH, - ENABLE_BINRELOC ? "Yes" : "No", - PREFIX, LIBPREFIX, PLATFORM, KERNEL, HOSTNAME); - - DEBUG(" Debugging is enabled."); - - /* show also available modules */ - params.list_modules = TRUE; - } - - /* initialize the binreloc library, so we can load program data */ - if (!binreloc_init(FALSE)) - g_error("Failed to find runtime data.\n\n" - "\342\200\242 Is HardInfo correctly installed?\n" - "\342\200\242 See if %s and %s exists and you have read permision.", - PREFIX, LIBPREFIX); - - /* list all module names */ - if (params.list_modules) { - g_print("Modules:\n" - "%-20s%-15s%-12s\n", "File Name", "Name", "Version"); - - for (modules = modules_load_all(); modules; - modules = modules->next) { - ShellModule *module = (ShellModule *) modules->data; - ModuleAbout *ma = module_get_about(module); - gchar *name = g_path_get_basename(g_module_name(module->dll)); - - g_print("%-20s%-15s%-12s\n", name, module->name, ma->version); - - g_free(name); - } - - return 0; - } - - if (!params.create_report) { - /* we only try to open the UI if the user didn't asked for a - report. */ - params.gui_running = ui_init(&argc, &argv); - - /* as a fallback, if GTK+ initialization failed, run in report - generation mode. */ - if (!params.gui_running) - params.create_report = TRUE; - } - - if (params.use_modules) { - /* load only selected modules */ - DEBUG("loading user-selected modules"); - modules = modules_load_selected(); - } else { - /* load all modules */ - DEBUG("loading all modules"); - modules = modules_load_all(); - } - - /* initialize vendor database */ - vendor_init(); - - if (params.gui_running) { - /* initialize gui and start gtk+ main loop */ - icon_cache_init(); - stock_icons_init(); - - shell_init(modules); - - DEBUG("entering gtk+ main loop"); - - gtk_main(); - } else if (params.create_report) { - /* generate report */ - gchar *report; - - DEBUG("generating report"); - - report = report_create_from_module_list_format(modules, - params. - report_format); - g_print("%s", report); - - g_free(report); - } - - DEBUG("finished"); - return 0; -} diff --git a/hardinfo.desktop b/hardinfo.desktop deleted file mode 100644 index 523432f1..00000000 --- a/hardinfo.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Name=System Profiler and Benchmark -Name[pt_BR]=Informações e Testes do Sistema -Exec=hardinfo -Icon=/usr/share/hardinfo/pixmaps/logo.png -Terminal=false -Type=Application -StartupNotify=true -Categories=System; \ No newline at end of file diff --git a/hardinfo.desktop.cmake b/hardinfo.desktop.cmake new file mode 100644 index 00000000..4a94f8c5 --- /dev/null +++ b/hardinfo.desktop.cmake @@ -0,0 +1,14 @@ +[Desktop Entry] +Name=System Profiler and Benchmark +Name[es]=Informacion y Rendimiento del Sistema +Name[fr]=Informations et Benchmarks du Système +Name[pt_BR]=Informações e Testes do Sistema +Name[ru]=Информация о системе и тестирование +Comment=Displays system information +Comment[ru]=Показывает информацию о системе +Exec=@CMAKE_INSTALL_FULL_BINDIR@/hardinfo +Icon=@CMAKE_INSTALL_FULL_DATAROOTDIR@/hardinfo/pixmaps/logo.png +Terminal=false +Type=Application +StartupNotify=true +Categories=System; diff --git a/hardinfo.h b/hardinfo.h deleted file mode 100644 index 9f52f633..00000000 --- a/hardinfo.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef __HARDINFO_H__ -#define __HARDINFO_H__ - -#include -#include - -typedef struct _ModuleEntry ModuleEntry; -typedef struct _ModuleAbout ModuleAbout; -typedef struct _FileTypes FileTypes; -typedef struct _ProgramParameters ProgramParameters; - -struct _ProgramParameters { - gboolean create_report; - gboolean show_version; - gboolean gui_running; - gboolean list_modules; - gboolean autoload_deps; - - gint report_format; - - gchar **use_modules; - gchar *path_lib; - gchar *path_data; - gchar *argv0; -}; - -struct _FileTypes { - gchar *name; - gchar *mime_type; - gchar *extension; - gpointer data; -}; - -struct _ModuleEntry { - gchar *name; - gchar *icon; - gpointer callback; - gpointer scan_callback; -}; - -struct _ModuleAbout { - const gchar *description; - const gchar *author; - const gchar *version; - const gchar *license; -}; - -/* String utility functions */ -inline void remove_quotes(gchar *str); -inline char *strend(gchar *str, gchar chr); -inline void remove_linefeed(gchar *str); -gchar *strreplace(gchar *string, gchar *replace, gchar new_char); - -/* Widget utility functions */ -void widget_set_cursor(GtkWidget *widget, GdkCursorType cursor_type); -gint tree_view_get_visible_height(GtkTreeView *tv); -void tree_view_save_image(gchar *filename); - -/* File Chooser utility functions */ -void file_chooser_open_expander(GtkWidget *chooser); -void file_chooser_add_filters(GtkWidget *chooser, FileTypes *filters); -gchar *file_chooser_get_extension(GtkWidget *chooser, FileTypes *filters); -gchar *file_chooser_build_filename(GtkWidget *chooser, gchar *extension); -gpointer file_types_get_data_by_name(FileTypes *file_types, gchar *name); - -/* Misc utility functions */ -#if RELEASE == 1 -gpointer idle_free(gpointer ptr); -#else -gpointer __idle_free(gpointer ptr, gchar *f, gint l); -#define idle_free(p) __idle_free(p, __FILE__, __LINE__) -#endif /* RELEASE == 1 */ - - -gchar *find_program(gchar *program_name); -inline gchar *size_human_readable(gfloat size); -void nonblock_sleep(guint msec); -void open_url(gchar *url); -GSList *modules_load_selected(void); -GSList *modules_load_all(void); -ModuleAbout *module_get_about(ShellModule *module); -gchar *seconds_to_string(unsigned int seconds); - -gchar *h_strdup_cprintf(const gchar *format, gchar *source, ...); -gchar *h_strconcat(gchar *string1, ...); -void h_hash_table_remove_all (GHashTable *hash_table); - - -void module_entry_scan_all_except(ModuleEntry *entries, gint except_entry); -void module_entry_scan_all(ModuleEntry *entries); -void module_entry_reload(ShellModuleEntry *module_entry); -void module_entry_scan(ShellModuleEntry *module_entry); -gchar *module_entry_function(ShellModuleEntry *module_entry); -const gchar *module_entry_get_note(ShellModuleEntry *module_entry); - -/* BinReloc stuff */ -gboolean binreloc_init(gboolean try_hardcoded); - -/* GTK UI stuff */ -gboolean ui_init(int *argc, char ***argv); -void parameters_init(int *argc, char ***argv, ProgramParameters *params); -extern ProgramParameters params; - -/* Module stuff */ -gchar *module_call_method(gchar *method); -gchar *module_call_method_param(gchar * method, gchar * parameter); - -/* Sysfs stuff */ -gfloat h_sysfs_read_float(gchar *endpoint, gchar *entry); -gint h_sysfs_read_int(gchar *endpoint, gchar *entry); -gchar *h_sysfs_read_string(gchar *endpoint, gchar *entry); - -#define SCAN_START() static gboolean scanned = FALSE; if (reload) scanned = FALSE; if (scanned) return; -#define SCAN_END() scanned = TRUE; - -#endif /* __HARDINFO_H__ */ diff --git a/hardinfo/binreloc.c b/hardinfo/binreloc.c new file mode 100644 index 00000000..f47a3fae --- /dev/null +++ b/hardinfo/binreloc.c @@ -0,0 +1,668 @@ +/* + * BinReloc - a library for creating relocatable executables + * Written by: Hongli Lai + * http://autopackage.org/ + * + * This source code is public domain. You can relicense this code + * under whatever license you want. + * + * See http://autopackage.org/docs/binreloc/ for + * more information and how to use this. + */ + +#ifndef __BINRELOC_C__ +#define __BINRELOC_C__ + +#include +#include +#include +#include +#include +#include +#include +#include "binreloc.h" +#include "config.h" + +G_BEGIN_DECLS +/** @internal + * Find the canonical filename of the executable. Returns the filename + * (which must be freed) or NULL on error. If the parameter 'error' is + * not NULL, the error code will be stored there, if an error occured. + */ +static char *_br_find_exe(GbrInitError * error) +{ + char *path, *path2, *line, *result; + size_t buf_size; + ssize_t size; + struct stat stat_buf; + FILE *f; + + /* Read from /proc/self/exe (symlink) */ + if (sizeof(path) > SSIZE_MAX) + buf_size = SSIZE_MAX - 1; + else + buf_size = PATH_MAX - 1; + path = (char *) g_try_malloc(buf_size); + if (path == NULL) { + /* Cannot allocate memory. */ + if (error) + *error = GBR_INIT_ERROR_NOMEM; + return NULL; + } + path2 = (char *) g_try_malloc(buf_size); + if (path2 == NULL) { + /* Cannot allocate memory. */ + if (error) + *error = GBR_INIT_ERROR_NOMEM; + g_free(path); + return NULL; + } + + strncpy(path2, "/proc/self/exe", buf_size - 1); + + while (1) { + int i; + + size = readlink(path2, path, buf_size - 1); + if (size == -1) { + /* Error. */ + g_free(path2); + break; + } + + /* readlink() success. */ + path[size] = '\0'; + + /* Check whether the symlink's target is also a symlink. + * We want to get the final target. */ + i = stat(path, &stat_buf); + if (i == -1) { + /* Error. */ + g_free(path2); + break; + } + + /* stat() success. */ + if (!S_ISLNK(stat_buf.st_mode)) { + /* path is not a symlink. Done. */ + g_free(path2); + return path; + } + + /* path is a symlink. Continue loop and resolve this. */ + strncpy(path, path2, buf_size - 1); + } + + + /* readlink() or stat() failed; this can happen when the program is + * running in Valgrind 2.2. Read from /proc/self/maps as fallback. */ + + buf_size = PATH_MAX + 128; + line = (char *) g_try_realloc(path, buf_size); + if (line == NULL) { + /* Cannot allocate memory. */ + g_free(path); + if (error) + *error = GBR_INIT_ERROR_NOMEM; + return NULL; + } + + f = fopen("/proc/self/maps", "r"); + if (f == NULL) { + g_free(line); + if (error) + *error = GBR_INIT_ERROR_OPEN_MAPS; + return NULL; + } + + /* The first entry should be the executable name. */ + result = fgets(line, (int) buf_size, f); + if (result == NULL) { + fclose(f); + g_free(line); + if (error) + *error = GBR_INIT_ERROR_READ_MAPS; + return NULL; + } + + /* Get rid of newline character. */ + buf_size = strlen(line); + if (buf_size <= 0) { + /* Huh? An empty string? */ + fclose(f); + g_free(line); + if (error) + *error = GBR_INIT_ERROR_INVALID_MAPS; + return NULL; + } + if (line[buf_size - 1] == 10) + line[buf_size - 1] = 0; + + /* Extract the filename; it is always an absolute path. */ + path = strchr(line, '/'); + + /* Sanity check. */ + if (strstr(line, " r-xp ") == NULL || path == NULL) { + fclose(f); + g_free(line); + if (error) + *error = GBR_INIT_ERROR_INVALID_MAPS; + return NULL; + } + + path = g_strdup(path); + g_free(line); + fclose(f); + return path; +} + + +/** @internal + * Find the canonical filename of the executable which owns symbol. + * Returns a filename which must be freed, or NULL on error. + */ +static char *_br_find_exe_for_symbol(const void *symbol, + GbrInitError * error) +{ +#define SIZE PATH_MAX + 100 + FILE *f; + size_t address_string_len; + char *address_string, line[SIZE], *found; + + if (symbol == NULL) + return (char *) NULL; + + f = fopen("/proc/self/maps", "r"); + if (f == NULL) + return (char *) NULL; + + address_string_len = 4; + address_string = (char *) g_try_malloc(address_string_len); + found = (char *) NULL; + + while (!feof(f)) { + char *start_addr, *end_addr, *end_addr_end, *file; + void *start_addr_p, *end_addr_p; + size_t len; + + if (fgets(line, SIZE, f) == NULL) + break; + + /* Sanity check. */ + if (strstr(line, " r-xp ") == NULL || strchr(line, '/') == NULL) + continue; + + /* Parse line. */ + start_addr = line; + end_addr = strchr(line, '-'); + file = strchr(line, '/'); + + /* More sanity check. */ + if (!(file > end_addr && end_addr != NULL && end_addr[0] == '-')) + continue; + + end_addr[0] = '\0'; + end_addr++; + end_addr_end = strchr(end_addr, ' '); + if (end_addr_end == NULL) + continue; + + end_addr_end[0] = '\0'; + len = strlen(file); + if (len == 0) + continue; + if (file[len - 1] == '\n') + file[len - 1] = '\0'; + + /* Get rid of "(deleted)" from the filename. */ + len = strlen(file); + if (len > 10 && strcmp(file + len - 10, " (deleted)") == 0) + file[len - 10] = '\0'; + + /* I don't know whether this can happen but better safe than sorry. */ + len = strlen(start_addr); + if (len != strlen(end_addr)) + continue; + + + /* Transform the addresses into a string in the form of 0xdeadbeef, + * then transform that into a pointer. */ + if (address_string_len < len + 3) { + address_string_len = len + 3; + address_string = + (char *) g_try_realloc(address_string, address_string_len); + } + + memcpy(address_string, "0x", 2); + memcpy(address_string + 2, start_addr, len); + address_string[2 + len] = '\0'; + sscanf(address_string, "%p", &start_addr_p); + + memcpy(address_string, "0x", 2); + memcpy(address_string + 2, end_addr, len); + address_string[2 + len] = '\0'; + sscanf(address_string, "%p", &end_addr_p); + + + if (symbol >= start_addr_p && symbol < end_addr_p) { + found = file; + break; + } + } + + g_free(address_string); + fclose(f); + + if (found == NULL) + return (char *) NULL; + else + return g_strdup(found); +} + + +static gchar *exe = NULL; + +static void set_gerror(GError ** error, GbrInitError errcode); + + +/** Initialize the BinReloc library (for applications). + * + * This function must be called before using any other BinReloc functions. + * It attempts to locate the application's canonical filename. + * + * @note If you want to use BinReloc for a library, then you should call + * gbr_init_lib() instead. + * + * @param error If BinReloc failed to initialize, then the error report will + * be stored in this variable. Set to NULL if you don't want an + * error report. See the #GbrInitError for a list of error + * codes. + * + * @returns TRUE on success, FALSE if BinReloc failed to initialize. + */ +gboolean gbr_init(GError ** error) +{ + GbrInitError errcode = 0; + + /* Locate the application's filename. */ + exe = _br_find_exe(&errcode); + if (exe != NULL) + /* Success! */ + return TRUE; + else { + /* Failed :-( */ + set_gerror(error, errcode); + return FALSE; + } +} + + +/** Initialize the BinReloc library (for libraries). + * + * This function must be called before using any other BinReloc functions. + * It attempts to locate the calling library's canonical filename. + * + * @note The BinReloc source code MUST be included in your library, or this + * function won't work correctly. + * + * @returns TRUE on success, FALSE if a filename cannot be found. + */ +gboolean gbr_init_lib(GError ** error) +{ + GbrInitError errcode = 0; + + exe = _br_find_exe_for_symbol((const void *) "", &errcode); + if (exe != NULL) + /* Success! */ + return TRUE; + else { + /* Failed :-( */ + set_gerror(error, errcode); + return exe != NULL; + } +} + + +static void set_gerror(GError ** error, GbrInitError errcode) +{ + gchar *error_message; + + if (error == NULL) + return; + + switch (errcode) { + case GBR_INIT_ERROR_NOMEM: + error_message = "Cannot allocate memory."; + break; + case GBR_INIT_ERROR_OPEN_MAPS: + error_message = "Unable to open /proc/self/maps for reading."; + break; + case GBR_INIT_ERROR_READ_MAPS: + error_message = "Unable to read from /proc/self/maps."; + break; + case GBR_INIT_ERROR_INVALID_MAPS: + error_message = "The file format of /proc/self/maps is invalid."; + break; + case GBR_INIT_ERROR_DISABLED: + error_message = "Binary relocation support is disabled."; + break; + default: + error_message = "Unknown error."; + break; + }; + g_set_error(error, g_quark_from_static_string("GBinReloc"), + errcode, "%s", error_message); +} + + +/** Find the canonical filename of the current application. + * + * @param default_exe A default filename which will be used as fallback. + * @returns A string containing the application's canonical filename, + * which must be freed when no longer necessary. If BinReloc is + * not initialized, or if the initialization function failed, + * then a copy of default_exe will be returned. If default_exe + * is NULL, then NULL will be returned. + */ +gchar *gbr_find_exe(const gchar * default_exe) +{ + if (exe == NULL) { + /* BinReloc is not initialized. */ + if (default_exe != NULL) + return g_strdup(default_exe); + else + return NULL; + } + return g_strdup(exe); +} + + +/** Locate the directory in which the current application is installed. + * + * The prefix is generated by the following pseudo-code evaluation: + * \code + * dirname(exename) + * \endcode + * + * @param default_dir A default directory which will used as fallback. + * @return A string containing the directory, which must be freed when no + * longer necessary. If BinReloc is not initialized, or if the + * initialization function failed, then a copy of default_dir + * will be returned. If default_dir is NULL, then NULL will be + * returned. + */ +gchar *gbr_find_exe_dir(const gchar * default_dir) +{ + if (exe == NULL) { + /* BinReloc not initialized. */ + if (default_dir != NULL) + return g_strdup(default_dir); + else + return NULL; + } + + return g_path_get_dirname(exe); +} + + +/** Locate the prefix in which the current application is installed. + * + * The prefix is generated by the following pseudo-code evaluation: + * \code + * dirname(dirname(exename)) + * \endcode + * + * @param default_prefix A default prefix which will used as fallback. + * @return A string containing the prefix, which must be freed when no + * longer necessary. If BinReloc is not initialized, or if the + * initialization function failed, then a copy of default_prefix + * will be returned. If default_prefix is NULL, then NULL will be + * returned. + */ +gchar *gbr_find_prefix(const gchar * default_prefix) +{ + gchar *dir1, *dir2; + + if (exe == NULL) { + /* BinReloc not initialized. */ + if (default_prefix != NULL) + return g_strdup(default_prefix); + else + return NULL; + } + + dir1 = g_path_get_dirname(exe); + dir2 = g_path_get_dirname(dir1); + g_free(dir1); + return dir2; +} + + +/** Locate the application's binary folder. + * + * The path is generated by the following pseudo-code evaluation: + * \code + * prefix + "/bin" + * \endcode + * + * @param default_bin_dir A default path which will used as fallback. + * @return A string containing the bin folder's path, which must be freed when + * no longer necessary. If BinReloc is not initialized, or if the + * initialization function failed, then a copy of default_bin_dir will + * be returned. If default_bin_dir is NULL, then NULL will be returned. + */ +gchar *gbr_find_bin_dir(const gchar * default_bin_dir) +{ + gchar *prefix, *dir; + + prefix = gbr_find_prefix(NULL); + if (prefix == NULL) { + /* BinReloc not initialized. */ + if (default_bin_dir != NULL) + return g_strdup(default_bin_dir); + else + return NULL; + } + + dir = g_build_filename(prefix, "bin", NULL); + g_free(prefix); + return dir; +} + + +/** Locate the application's superuser binary folder. + * + * The path is generated by the following pseudo-code evaluation: + * \code + * prefix + "/sbin" + * \endcode + * + * @param default_sbin_dir A default path which will used as fallback. + * @return A string containing the sbin folder's path, which must be freed when + * no longer necessary. If BinReloc is not initialized, or if the + * initialization function failed, then a copy of default_sbin_dir will + * be returned. If default_bin_dir is NULL, then NULL will be returned. + */ +gchar *gbr_find_sbin_dir(const gchar * default_sbin_dir) +{ + gchar *prefix, *dir; + + prefix = gbr_find_prefix(NULL); + if (prefix == NULL) { + /* BinReloc not initialized. */ + if (default_sbin_dir != NULL) + return g_strdup(default_sbin_dir); + else + return NULL; + } + + dir = g_build_filename(prefix, "sbin", NULL); + g_free(prefix); + return dir; +} + + +/** Locate the application's data folder. + * + * The path is generated by the following pseudo-code evaluation: + * \code + * prefix + "/share" + * \endcode + * + * @param default_data_dir A default path which will used as fallback. + * @return A string containing the data folder's path, which must be freed when + * no longer necessary. If BinReloc is not initialized, or if the + * initialization function failed, then a copy of default_data_dir + * will be returned. If default_data_dir is NULL, then NULL will be + * returned. + */ +gchar *gbr_find_data_dir(const gchar * default_data_dir) +{ + gchar *prefix, *dir; + + prefix = gbr_find_prefix(NULL); + if (prefix == NULL) { + /* BinReloc not initialized. */ + if (default_data_dir != NULL) + return g_strdup(default_data_dir); + else + return NULL; + } + + dir = g_build_filename(prefix, "share", NULL); + g_free(prefix); + return dir; +} + + +/** Locate the application's localization folder. + * + * The path is generated by the following pseudo-code evaluation: + * \code + * prefix + "/share/locale" + * \endcode + * + * @param default_locale_dir A default path which will used as fallback. + * @return A string containing the localization folder's path, which must be freed when + * no longer necessary. If BinReloc is not initialized, or if the + * initialization function failed, then a copy of default_locale_dir will be returned. + * If default_locale_dir is NULL, then NULL will be returned. + */ +gchar *gbr_find_locale_dir(const gchar * default_locale_dir) +{ + gchar *data_dir, *dir; + + data_dir = gbr_find_data_dir(NULL); + if (data_dir == NULL) { + /* BinReloc not initialized. */ + if (default_locale_dir != NULL) + return g_strdup(default_locale_dir); + else + return NULL; + } + + dir = g_build_filename(data_dir, "locale", NULL); + g_free(data_dir); + return dir; +} + + +/** Locate the application's library folder. + * + * The path is generated by the following pseudo-code evaluation: + * \code + * prefix + "/lib" + * \endcode + * + * @param default_lib_dir A default path which will used as fallback. + * @return A string containing the library folder's path, which must be freed when + * no longer necessary. If BinReloc is not initialized, or if the + * initialization function failed, then a copy of default_lib_dir will be returned. + * If default_lib_dir is NULL, then NULL will be returned. + */ +gchar *gbr_find_lib_dir(const gchar * default_lib_dir) +{ + gchar *prefix, *dir; + + prefix = gbr_find_prefix(NULL); + if (prefix == NULL) { + /* BinReloc not initialized. */ + if (default_lib_dir != NULL) + return g_strdup(default_lib_dir); + else + return NULL; + } + + dir = g_build_filename(prefix, LIBDIR, NULL); + + g_free(prefix); + return dir; +} + + +/** Locate the application's libexec folder. + * + * The path is generated by the following pseudo-code evaluation: + * \code + * prefix + "/libexec" + * \endcode + * + * @param default_libexec_dir A default path which will used as fallback. + * @return A string containing the libexec folder's path, which must be freed when + * no longer necessary. If BinReloc is not initialized, or if the initialization + * function failed, then a copy of default_libexec_dir will be returned. + * If default_libexec_dir is NULL, then NULL will be returned. + */ +gchar *gbr_find_libexec_dir(const gchar * default_libexec_dir) +{ + gchar *prefix, *dir; + + prefix = gbr_find_prefix(NULL); + if (prefix == NULL) { + /* BinReloc not initialized. */ + if (default_libexec_dir != NULL) + return g_strdup(default_libexec_dir); + else + return NULL; + } + + dir = g_build_filename(prefix, "libexec", NULL); + g_free(prefix); + return dir; +} + + +/** Locate the application's configuration files folder. + * + * The path is generated by the following pseudo-code evaluation: + * \code + * prefix + "/etc" + * \endcode + * + * @param default_etc_dir A default path which will used as fallback. + * @return A string containing the etc folder's path, which must be freed when + * no longer necessary. If BinReloc is not initialized, or if the initialization + * function failed, then a copy of default_etc_dir will be returned. + * If default_etc_dir is NULL, then NULL will be returned. + */ +gchar *gbr_find_etc_dir(const gchar * default_etc_dir) +{ + gchar *prefix, *dir; + + prefix = gbr_find_prefix(NULL); + if (prefix == NULL) { + /* BinReloc not initialized. */ + if (default_etc_dir != NULL) + return g_strdup(default_etc_dir); + else + return NULL; + } + + dir = g_build_filename(prefix, "etc", NULL); + g_free(prefix); + return dir; +} + + +G_END_DECLS +#endif /* __BINRELOC_C__ */ diff --git a/hardinfo/expr.c b/hardinfo/expr.c new file mode 100644 index 00000000..32e303d7 --- /dev/null +++ b/hardinfo/expr.c @@ -0,0 +1,250 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +/* + * This is only used to compute sensor values, hence the only variable supported is '@'. + * The '`' operator (ln(x)) is not available, nor multi-line formulas. + */ + +#include +#include +#include +#include +#include + +#include "expr.h" +#include "config.h" + +static MathToken *new_operator(gchar op) +{ + MathToken *t = g_new0(MathToken, 1); + + t->val.op = op; + t->type = TOKEN_OPERATOR; /* operator */ + + return t; +} + +static MathToken *new_variable(gchar var) +{ + MathToken *t = g_new0(MathToken, 1); + + t->val.op = '@'; + t->type = TOKEN_VARIABLE; /* variable */ + + return t; +} + +static MathToken *new_value(gfloat value) +{ + MathToken *t = g_new0(MathToken, 1); + + t->val.value = value; + t->type = TOKEN_VALUE; /* value */ + + return t; +} + +static inline gint priority(char operation) +{ + switch (operation) { + case '^': + return 3; + case '*': + case '/': + return 2; + case '+': + case '-': + return 1; + case '(': + return 0; + } + + return 0; +} + +GSList *math_infix_to_postfix(GSList * infix) +{ + MathToken *stack[500]; + gint t_sp = 0; + + GSList *postfix = NULL, *p; + MathToken *top; + + for (p = infix; p; p = p->next) { + MathToken *t = (MathToken *) p->data; + + if (t->type == TOKEN_OPERATOR && t->val.op == '(') { + stack[++t_sp] = t; + } else if (t->type == TOKEN_OPERATOR && t->val.op == ')') { + for (top = stack[t_sp]; t_sp != 0 && top->val.op != '('; + top = stack[t_sp]) { + postfix = g_slist_append(postfix, stack[t_sp--]); + } + t_sp--; + } else if (t->type != TOKEN_OPERATOR) { + postfix = g_slist_append(postfix, t); + } else if (t_sp == 0) { + stack[++t_sp] = t; + } else { + while (t_sp != 0 + && priority(t->val.op) <= priority(stack[t_sp]->val.op)) + postfix = g_slist_append(postfix, stack[t_sp--]); + stack[++t_sp] = t; + } + } + + while (t_sp) + postfix = g_slist_append(postfix, stack[t_sp--]); + + return postfix; +} + +static inline gfloat __result(gfloat op1, gfloat op2, gchar operation) +{ + switch (operation) { + case '^': + return powf(op1, op2); + case '+': + return op1 + op2; + case '-': + return op1 - op2; + case '/': + return op1 / op2; + case '*': + return op1 * op2; + } + + return 0; +} + +gfloat math_postfix_eval(GSList * postfix, gfloat at_value) +{ + GSList *p; + gfloat stack[500]; + gint sp = 0; + + memset(stack, 0, sizeof(gfloat) * 500); + + for (p = postfix; p; p = p->next) { + MathToken *t = (MathToken *) p->data; + + if (t->type == TOKEN_VARIABLE) { + stack[++sp] = at_value; + } else if (t->type == TOKEN_VALUE) { + stack[++sp] = t->val.value; + } else { + gfloat op1, op2; + + op2 = stack[sp--]; + op1 = stack[sp]; + + stack[sp] = __result(op1, op2, t->val.op); + } + } + + return stack[sp]; +} + +GSList *math_string_to_infix(gchar * string) +{ + GSList *infix = NULL; + gchar *expr = string; + + for (; *expr; expr++) { + if (strchr("+-/*^()", *expr)) { + infix = g_slist_append(infix, new_operator(*expr)); + } else if (strchr("@", *expr)) { + infix = g_slist_append(infix, new_variable(*expr)); + } else if (strchr("-.1234567890", *expr)) { + gchar value[32], *v = value; + gfloat floatval; + + do { + *v++ = *expr++; + } while (*expr && strchr("-.1234567890", *expr)); + expr--; + *v = '\0'; + + sscanf(value, "%f", &floatval); + + infix = g_slist_append(infix, new_value(floatval)); + } else if (!isspace(*expr)) { + g_print("Invalid token: [%c][%d]\n", *expr, *expr); + math_infix_free(infix, TRUE); + return NULL; + } + } + + return infix; +} + +void math_infix_free(GSList * infix, gboolean free_tokens) +{ + GSList *p; + + if (!free_tokens) + for (p = infix; p; p = g_slist_delete_link(p, p)); + else + for (p = infix; p; p = g_slist_delete_link(p, p)) { + MathToken *t = (MathToken *) p->data; + g_free(t); + } +} + +GSList *math_string_to_postfix(gchar * string) +{ + GSList *infix; + GSList *postfix; + + infix = math_string_to_infix(string); + if (!infix) + return NULL; + + postfix = math_infix_to_postfix(infix); + math_infix_free(infix, FALSE); + + return postfix; +} + +gfloat math_string_eval(gchar * string, gfloat at_value) +{ + GSList *postfix; + gfloat val; + + postfix = math_string_to_postfix(string); + val = math_postfix_eval(postfix, at_value); + math_postfix_free(postfix, TRUE); + + return val; +} + +#ifdef MATH_TEST +int main(void) +{ + GSList *postfix; + + gchar *expr = "0.9*(@+(5.2*0.923+3*(2.0)))"; + + postfix = math_string_to_postfix(expr); + g_print("%s = %f (must be 18.71964)\n", expr, + math_postfix_eval(postfix, 10)); + math_postfix_free(postfix, TRUE); + + return 0; +} +#endif diff --git a/hardinfo/hardinfo.c b/hardinfo/hardinfo.c new file mode 100644 index 00000000..4a38fe1a --- /dev/null +++ b/hardinfo/hardinfo.c @@ -0,0 +1,158 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include +#include +#include +#include +#include + +#include + +ProgramParameters params = { 0 }; + +int main(int argc, char **argv) +{ + GSList *modules; + + bindtextdomain("hardinfo", "/usr/share/locale"); + textdomain("hardinfo"); + + DEBUG("HardInfo version " VERSION ". Debug version."); + + /* parse all command line parameters */ + parameters_init(&argc, &argv, ¶ms); + + /* show version information and quit */ + if (params.show_version) { + g_print("HardInfo version " VERSION "\n"); + g_print + (_("Copyright (C) 2003-2009 Leandro A. F. Pereira. See COPYING for details.\n\n")); + + g_print(_("Compile-time options:\n" + " Release version: %s (%s)\n" + " BinReloc enabled: %s\n" + " Data prefix: %s\n" + " Library prefix: %s\n" + " Compiled on: %s %s (%s)\n"), + RELEASE ? _("Yes") : "No (" VERSION ")", ARCH, + ENABLE_BINRELOC ? _("Yes") : _("No"), + PREFIX, LIBPREFIX, PLATFORM, KERNEL, HOSTNAME); + + DEBUG(" Debugging is enabled."); + + /* show also available modules */ + params.list_modules = TRUE; + } + + /* initialize the binreloc library, so we can load program data */ + if (!binreloc_init(FALSE)) + g_error(_("Failed to find runtime data.\n\n" + "\342\200\242 Is HardInfo correctly installed?\n" + "\342\200\242 See if %s and %s exists and you have read permision."), + PREFIX, LIBPREFIX); + + /* list all module names */ + if (params.list_modules) { + g_print(_("Modules:\n" + "%-20s%-15s%-12s\n"), _("File Name"), _("Name"), _("Version")); + + for (modules = modules_load_all(); modules; + modules = modules->next) { + ShellModule *module = (ShellModule *) modules->data; + ModuleAbout *ma = module_get_about(module); + gchar *name = g_path_get_basename(g_module_name(module->dll)); + + g_print("%-20s%-15s%-12s\n", name, module->name, ma->version); + + g_free(name); + } + + return 0; + } + + if (!params.create_report && !params.run_benchmark) { + /* we only try to open the UI if the user didn't ask for a report. */ + params.gui_running = ui_init(&argc, &argv); + + /* as a fallback, if GTK+ initialization failed, run in report + generation mode. */ + if (!params.gui_running) + params.create_report = TRUE; + } + + if (params.use_modules) { + /* load only selected modules */ + DEBUG("loading user-selected modules"); + modules = modules_load_selected(); + } else { + /* load all modules */ + DEBUG("loading all modules"); + modules = modules_load_all(); + } + + /* initialize vendor database */ + vendor_init(); + + /* initialize moreinfo */ + moreinfo_init(); + + if (params.run_benchmark) { + gchar *result; + + result = module_call_method_param("benchmark::runBenchmark", params.run_benchmark); + if (!result) { + g_error(_("Unknown benchmark ``%s'' or libbenchmark.so not loaded"), params.run_benchmark); + } else { + g_print("%s\n", result); + g_free(result); + } + } else if (params.gui_running) { + /* initialize gui and start gtk+ main loop */ + icon_cache_init(); + stock_icons_init(); + + shell_init(modules); + + DEBUG("entering gtk+ main loop"); + + gtk_main(); + } else if (params.create_report) { + /* generate report */ + gchar *report; + + DEBUG("generating report"); + + report = report_create_from_module_list_format(modules, + params. + report_format); + g_print("%s", report); + + g_free(report); + } else { + g_error(_("Don't know what to do. Exiting.")); + } + + moreinfo_shutdown(); + + DEBUG("finished"); + return 0; +} diff --git a/hardinfo/socket.c b/hardinfo/socket.c new file mode 100644 index 00000000..40cb8e50 --- /dev/null +++ b/hardinfo/socket.c @@ -0,0 +1,127 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "socket.h" + +Socket *sock_connect(gchar * host, gint port) +{ + struct sockaddr_in server; + Socket *s; + int sock; + + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock > 0) { + memset(&server, 0, sizeof(server)); + server.sin_family = AF_INET; + server.sin_addr.s_addr = inet_addr(host); + server.sin_port = htons(port); + + if (connect(sock, (struct sockaddr *) (void *) &server, sizeof(server)) < 0) { + goto cleanup; + } + + s = g_new0(Socket, 1); + s->sock = sock; + + return s; + } + +cleanup: + close(sock); + + return NULL; +} + +/* From: http://www.erlenstar.demon.co.uk/unix/faq_3.html#SEC26 */ +static inline int __sock_is_ready(Socket * s, int mode) +{ + int rc, fd = s->sock; + fd_set fds; + struct timeval tv; + + FD_ZERO(&fds); + FD_SET(fd, &fds); + tv.tv_sec = tv.tv_usec = 0; + + if (mode == 0) { + /* read */ + rc = select(fd + 1, &fds, NULL, NULL, &tv); + } else { + /* write */ + rc = select(fd + 1, NULL, &fds, NULL, &tv); + } + + if (rc < 0) + return -1; + + return FD_ISSET(fd, &fds) ? 1 : 0; +} + +int sock_ready_to_read(Socket * s) +{ + return __sock_is_ready(s, 0); +} + +int sock_ready_to_write(Socket * s) +{ + return __sock_is_ready(s, 1); +} + +int sock_read(Socket * s, gchar * buffer, gint size) +{ + if (size > 2 && sock_ready_to_read(s)) { + gint n; + + n = read(s->sock, buffer, size - 1); + if (n > 0) { + buffer[n] = '\0'; + } else { + return 0; + } + + return n; + } + + return 0; +} + +int sock_write(Socket * s, gchar * str) +{ + while (!sock_ready_to_write(s)); + + return write(s->sock, str, strlen(str)); +} + +void sock_close(Socket * s) +{ + shutdown(s->sock, 2); + close(s->sock); + g_free(s); +} diff --git a/hardinfo/util.c b/hardinfo/util.c new file mode 100644 index 00000000..40566eac --- /dev/null +++ b/hardinfo/util.c @@ -0,0 +1,1404 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + * Functions h_strdup_cprintf and h_strconcat are based on GLib version 2.4.6 + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#define KiB 1024 +#define MiB 1048576 +#define GiB 1073741824 +#define TiB 1099511627776 +#define PiB 1125899906842624 + +static GSList *modules_list = NULL; + +void sync_manager_clear_entries(void); + +gchar *find_program(gchar *program_name) +{ + int i; + char *temp; + static GHashTable *cache = NULL; + const char *path[] = { "/usr/local/bin", "/usr/local/sbin", + "/usr/bin", "/usr/sbin", + "/bin", "/sbin", + NULL }; + + /* we don't need to call stat() every time: cache the results */ + if (!cache) { + cache = g_hash_table_new(g_str_hash, g_str_equal); + } else if ((temp = g_hash_table_lookup(cache, program_name))) { + return g_strdup(temp); + } + + for (i = 0; path[i]; i++) { + temp = g_build_filename(path[i], program_name, NULL); + + if (g_file_test(temp, G_FILE_TEST_IS_EXECUTABLE)) { + g_hash_table_insert(cache, program_name, g_strdup(temp)); + return temp; + } + + g_free(temp); + } + + /* our search has failed; use GLib's search (which uses $PATH env var) */ + if ((temp = g_find_program_in_path(program_name))) { + g_hash_table_insert(cache, program_name, g_strdup(temp)); + return temp; + } + + return NULL; +} + +gchar *seconds_to_string(unsigned int seconds) +{ + unsigned int hours, minutes, days; + + minutes = seconds / 60; + hours = minutes / 60; + minutes %= 60; + days = hours / 24; + hours %= 24; + + gchar *wminutes; + gchar *whours; + gchar *wdays; + + wdays = ngettext("%d day, ", "%d days, ", days); + whours = ngettext("%d hour, ", "%d hours, ", hours); + wminutes = ngettext("%d minute", "%d minutes", minutes); + if (days < 1) { + if (hours < 1) + return g_strdup_printf(ngettext("%d minute", "%d minutes", minutes), minutes); + return g_strdup_printf(whours, wminutes); + } + return g_strdup_printf(wdays, whours, wminutes); +} + +inline gchar *size_human_readable(gfloat size) +{ + if (size < KiB) + return g_strdup_printf(_("%.1f B"), size); + if (size < MiB) + return g_strdup_printf(_("%.1f KiB"), size / KiB); + if (size < GiB) + return g_strdup_printf(_("%.1f MiB"), size / MiB); + if (size < TiB) + return g_strdup_printf(_("%.1f GiB"), size / GiB); + if (size < PiB) + return g_strdup_printf(_("%.1f TiB"), size / TiB); + + return g_strdup_printf(_("%.1f PiB"), size / PiB); +} + +inline char *strend(gchar * str, gchar chr) +{ + if (!str) + return NULL; + + char *p; + if ((p = g_utf8_strchr(str, -1, chr))) + *p = 0; + + return str; +} + +inline void remove_quotes(gchar * str) +{ + if (!str) + return; + + while (*str == '"') + *(str++) = ' '; + + strend(str, '"'); +} + +inline void remove_linefeed(gchar * str) +{ + strend(str, '\n'); +} + +void widget_set_cursor(GtkWidget * widget, GdkCursorType cursor_type) +{ + GdkCursor *cursor; + + if ((cursor = gdk_cursor_new(cursor_type))) { + gdk_window_set_cursor(GDK_WINDOW(widget->window), cursor); + gdk_display_flush(gtk_widget_get_display(widget)); + gdk_cursor_unref(cursor); + } + + while (gtk_events_pending()) + gtk_main_iteration(); +} + +static gboolean __nonblock_cb(gpointer data) +{ + gtk_main_quit(); + return FALSE; +} + +void nonblock_sleep(guint msec) +{ + g_timeout_add(msec, (GSourceFunc) __nonblock_cb, NULL); + gtk_main(); +} + +static void __expand_cb(GtkWidget * widget, gpointer data) +{ + if (GTK_IS_EXPANDER(widget)) { + gtk_expander_set_expanded(GTK_EXPANDER(widget), TRUE); + } else if (GTK_IS_CONTAINER(widget)) { + gtk_container_foreach(GTK_CONTAINER(widget), + (GtkCallback) __expand_cb, NULL); + } +} + +void file_chooser_open_expander(GtkWidget * chooser) +{ + gtk_container_foreach(GTK_CONTAINER(chooser), + (GtkCallback) __expand_cb, NULL); +} + +void file_chooser_add_filters(GtkWidget * chooser, FileTypes * filters) +{ + GtkFileFilter *filter; + gint i; + + for (i = 0; filters[i].name; i++) { + filter = gtk_file_filter_new(); + gtk_file_filter_add_mime_type(filter, filters[i].mime_type); + gtk_file_filter_set_name(filter, filters[i].name); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter); + } +} + +gchar *file_chooser_get_extension(GtkWidget * chooser, FileTypes * filters) +{ + GtkFileFilter *filter; + const gchar *filter_name; + gint i; + + filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(chooser)); + filter_name = gtk_file_filter_get_name(filter); + for (i = 0; filters[i].name; i++) { + if (g_str_equal(filter_name, filters[i].name)) { + return filters[i].extension; + } + } + + return NULL; +} + +gpointer file_types_get_data_by_name(FileTypes * filters, gchar * filename) +{ + gint i; + + for (i = 0; filters[i].name; i++) { + if (g_str_has_suffix(filename, filters[i].extension)) { + return filters[i].data; + } + } + + return NULL; +} + +gchar *file_chooser_build_filename(GtkWidget * chooser, gchar * extension) +{ + gchar *filename = + gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); + gchar *retval; + + if (g_str_has_suffix(filename, extension)) { + return filename; + } + + retval = g_strconcat(filename, extension, NULL); + g_free(filename); + + return retval; +} + +gboolean binreloc_init(gboolean try_hardcoded) +{ + GError *error = NULL; + gchar *tmp; + + DEBUG("initializing binreloc (hardcoded = %d)", try_hardcoded); + + /* If the runtime data directories we previously found, don't even try + to find them again. */ + if (params.path_data && params.path_lib) { + DEBUG("data and lib path already found."); + return TRUE; + } + + if (try_hardcoded || !gbr_init(&error)) { + /* We were asked to try hardcoded paths or BinReloc failed to initialize. */ + params.path_data = g_strdup(PREFIX); + params.path_lib = g_strdup(LIBPREFIX); + + if (error) { + g_error_free(error); + } + + DEBUG("%strying hardcoded paths.", + try_hardcoded ? "" : "binreloc init failed. "); + } else { + /* If we were able to initialize BinReloc, build the default data + and library paths. */ + DEBUG("done, trying to use binreloc paths."); + + tmp = gbr_find_data_dir(PREFIX); + params.path_data = g_build_filename(tmp, "hardinfo", NULL); + g_free(tmp); + + tmp = gbr_find_lib_dir(PREFIX); + params.path_lib = g_build_filename(tmp, "hardinfo", NULL); + g_free(tmp); + } + + DEBUG("searching for runtime data on these locations:"); + DEBUG(" lib: %s", params.path_lib); + DEBUG(" data: %s", params.path_data); + + /* Try to see if the uidefs.xml file isn't missing. This isn't the + definitive test, but it should do okay for most situations. */ + tmp = g_build_filename(params.path_data, "benchmark.data", NULL); + if (!g_file_test(tmp, G_FILE_TEST_EXISTS)) { + DEBUG("runtime data not found"); + + g_free(params.path_data); + g_free(params.path_lib); + g_free(tmp); + + params.path_data = params.path_lib = NULL; + + if (try_hardcoded) { + /* We tried the hardcoded paths, but still was unable to find the + runtime data. Give up. */ + DEBUG("giving up"); + return FALSE; + } else { + /* Even though BinReloc worked OK, the runtime data was not found. + Try the hardcoded paths. */ + DEBUG("trying to find elsewhere"); + return binreloc_init(TRUE); + } + } + g_free(tmp); + + DEBUG("runtime data found!"); + /* We found the runtime data; hope everything is fine */ + return TRUE; +} + +static void +log_handler(const gchar * log_domain, + GLogLevelFlags log_level, + const gchar * message, gpointer user_data) +{ + if (!params.gui_running) { + /* No GUI running: spit the message to the terminal */ + g_print("\n\n*** %s: %s\n\n", + (log_level & G_LOG_FLAG_FATAL) ? _("Error") : _("Warning"), + message); + } else { + /* Hooray! We have a GUI running! */ + GtkWidget *dialog; + + dialog = gtk_message_dialog_new_with_markup(NULL, GTK_DIALOG_MODAL, + (log_level & + G_LOG_FLAG_FATAL) ? + GTK_MESSAGE_ERROR : + GTK_MESSAGE_WARNING, + GTK_BUTTONS_CLOSE, + "%s\n\n%s", + (log_level & + G_LOG_FLAG_FATAL) ? + _("Fatal Error") : + _("Warning"), message); + + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + } +} + +void parameters_init(int *argc, char ***argv, ProgramParameters * param) +{ + static gboolean create_report = FALSE; + static gboolean show_version = FALSE; + static gboolean list_modules = FALSE; + static gboolean autoload_deps = FALSE; + static gboolean run_xmlrpc_server = FALSE; + static gchar *report_format = NULL; + static gchar *run_benchmark = NULL; + static gchar **use_modules = NULL; + + static GOptionEntry options[] = { + { + .long_name = "generate-report", + .short_name = 'r', + .arg = G_OPTION_ARG_NONE, + .arg_data = &create_report, + .description = N_("creates a report and prints to standard output")}, + { + .long_name = "report-format", + .short_name = 'f', + .arg = G_OPTION_ARG_STRING, + .arg_data = &report_format, + .description = N_("chooses a report format (text, html)")}, + { + .long_name = "run-benchmark", + .short_name = 'b', + .arg = G_OPTION_ARG_STRING, + .arg_data = &run_benchmark, + .description = N_("run benchmark; requires benchmark.so to be loaded")}, + { + .long_name = "list-modules", + .short_name = 'l', + .arg = G_OPTION_ARG_NONE, + .arg_data = &list_modules, + .description = N_("lists modules")}, + { + .long_name = "load-module", + .short_name = 'm', + .arg = G_OPTION_ARG_STRING_ARRAY, + .arg_data = &use_modules, + .description = N_("specify module to load")}, + { + .long_name = "autoload-deps", + .short_name = 'a', + .arg = G_OPTION_ARG_NONE, + .arg_data = &autoload_deps, + .description = N_("automatically load module dependencies")}, +#ifdef HAS_LIBSOUP + { + .long_name = "xmlrpc-server", + .short_name = 'x', + .arg = G_OPTION_ARG_NONE, + .arg_data = &run_xmlrpc_server, + .description = N_("run in XML-RPC server mode")}, +#endif /* HAS_LIBSOUP */ + { + .long_name = "version", + .short_name = 'v', + .arg = G_OPTION_ARG_NONE, + .arg_data = &show_version, + .description = N_("shows program version and quit")}, + {NULL} + }; + GOptionContext *ctx; + + ctx = g_option_context_new(_("- System Profiler and Benchmark tool")); + g_option_context_set_ignore_unknown_options(ctx, FALSE); + g_option_context_set_help_enabled(ctx, TRUE); + + g_option_context_add_main_entries(ctx, options, *(argv)[0]); + g_option_context_parse(ctx, argc, argv, NULL); + + g_option_context_free(ctx); + + if (*argc >= 2) { + g_print(_("Unrecognized arguments.\n" + "Try ``%s --help'' for more information.\n"), *(argv)[0]); + exit(1); + } + + param->create_report = create_report; + param->report_format = REPORT_FORMAT_TEXT; + param->show_version = show_version; + param->list_modules = list_modules; + param->use_modules = use_modules; + param->run_benchmark = run_benchmark; + param->autoload_deps = autoload_deps; + param->run_xmlrpc_server = run_xmlrpc_server; + param->argv0 = *(argv)[0]; + + if (report_format && g_str_equal(report_format, "html")) + param->report_format = REPORT_FORMAT_HTML; + + gchar *confdir = g_build_filename(g_get_home_dir(), ".hardinfo", NULL); + if (!g_file_test(confdir, G_FILE_TEST_EXISTS)) { + mkdir(confdir, 0744); + } + g_free(confdir); +} + +gboolean ui_init(int *argc, char ***argv) +{ + DEBUG("initializing gtk+ UI"); + + g_set_application_name("HardInfo"); + g_log_set_handler(NULL, + G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL | + G_LOG_LEVEL_ERROR, log_handler, NULL); + + return gtk_init_check(argc, argv); +} + +void open_url(gchar * url) +{ + const gchar *browsers[] = { + "xdg-open", "gnome-open", "kfmclient openURL", + "sensible-browser", "firefox", "epiphany", + "iceweasel", "seamonkey", "galeon", "mozilla", + "opera", "konqueror", "netscape", "links -g", + NULL + }; + gint i = 0; + gchar *browser = (gchar *)g_getenv("BROWSER"); + + if (!browser || *browser == '\0') { + browser = (gchar *)browsers[i++]; + } + + do { + gchar *cmdline = g_strdup_printf("%s '%s'", browser, url); + + if (g_spawn_command_line_async(cmdline, NULL)) { + g_free(cmdline); + return; + } + + g_free(cmdline); + + browser = (gchar *)browsers[i++]; + } while (browser); + + g_warning(_("Couldn't find a Web browser to open URL %s."), url); +} + +/* Copyright: Jens Låås, SLU 2002 */ +gchar *strreplacechr(gchar * string, gchar * replace, gchar new_char) +{ + gchar *s; + for (s = string; *s; s++) + if (strchr(replace, *s)) + *s = new_char; + + return string; +} + +gchar *strreplace(gchar *string, gchar *replace, gchar *replacement) +{ + gchar **tmp, *ret; + + tmp = g_strsplit(string, replace, 0); + ret = g_strjoinv(replacement, tmp); + g_strfreev(tmp); + + return ret; +} + +static GHashTable *__module_methods = NULL; + +static void module_register_methods(ShellModule * module) +{ + ShellModuleMethod *(*get_methods) (void); + gchar *method_name; + + if (__module_methods == NULL) { + __module_methods = g_hash_table_new(g_str_hash, g_str_equal); + } + + if (g_module_symbol + (module->dll, "hi_exported_methods", (gpointer) & get_methods)) { + ShellModuleMethod *methods; + + for (methods = get_methods(); methods->name; methods++) { + ShellModuleMethod method = *methods; + gchar *name = g_path_get_basename(g_module_name(module->dll)); + gchar *simple_name = strreplace(name, "lib", ""); + + strend(simple_name, '.'); + + method_name = g_strdup_printf("%s::%s", simple_name, method.name); + g_hash_table_insert(__module_methods, method_name, + method.function); + g_free(name); + g_free(simple_name); + } + } + +} + +gchar *module_call_method(gchar * method) +{ + gchar *(*function) (void); + + if (__module_methods == NULL) { + return NULL; + } + + function = g_hash_table_lookup(__module_methods, method); + return function ? g_strdup(function()) : NULL; +} + +/* 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)) : NULL; +} + +static gboolean remove_module_methods(gpointer key, gpointer value, gpointer data) +{ + return g_str_has_prefix(key, data); +} + +static void module_unload(ShellModule * module) +{ + GSList *entry; + + if (module->dll) { + gchar *name; + + if (module->deinit) { + DEBUG("cleaning up module \"%s\"", module->name); + module->deinit(); + } else { + DEBUG("module \"%s\" does not need cleanup", module->name); + } + + name = g_path_get_basename(g_module_name(module->dll)); + g_hash_table_foreach_remove(__module_methods, remove_module_methods, name); + + g_module_close(module->dll); + g_free(name); + } + + g_free(module->name); + g_object_unref(module->icon); + + for (entry = module->entries; entry; entry = entry->next) { + ShellModuleEntry *e = (ShellModuleEntry *)entry->data; + + g_source_remove_by_user_data(e); + g_free(e); + } + + g_slist_free(module->entries); + g_free(module); +} + + +void module_unload_all(void) +{ + Shell *shell; + GSList *module, *merge_id; + + shell = shell_get_main_shell(); + + sync_manager_clear_entries(); + shell_clear_timeouts(shell); + shell_clear_tree_models(shell); + shell_clear_field_updates(); + shell_set_title(shell, NULL); + + for (module = shell->tree->modules; module; module = module->next) { + module_unload((ShellModule *)module->data); + } + + for (merge_id = shell->merge_ids; merge_id; merge_id = merge_id->next) { + gtk_ui_manager_remove_ui(shell->ui_manager, + GPOINTER_TO_INT(merge_id->data)); + } + g_slist_free(shell->tree->modules); + g_slist_free(shell->merge_ids); + + shell->merge_ids = NULL; + shell->tree->modules = NULL; + shell->selected = NULL; +} + +static ShellModule *module_load(gchar * filename) +{ + ShellModule *module; + gchar *tmp; + + module = g_new0(ShellModule, 1); + + if (params.gui_running) { + gchar *tmpicon, *dot, *simple_name; + + tmpicon = g_strdup(filename); + dot = g_strrstr(tmpicon, "." G_MODULE_SUFFIX); + + *dot = '\0'; + + simple_name = strreplace(tmpicon, "lib", ""); + + tmp = g_strdup_printf("%s.png", simple_name); + module->icon = icon_cache_get_pixbuf(tmp); + + g_free(tmp); + g_free(tmpicon); + g_free(simple_name); + } + + tmp = g_build_filename(params.path_lib, "modules", filename, NULL); + module->dll = g_module_open(tmp, G_MODULE_BIND_LAZY); + DEBUG("gmodule resource for ``%s'' is %p", tmp, module->dll); + g_free(tmp); + + if (module->dll) { + void (*init) (void); + ModuleEntry *(*get_module_entries) (void); + gint(*weight_func) (void); + gchar *(*name_func) (void); + ModuleEntry *entries; + gint i = 0; + + if (!g_module_symbol(module->dll, "hi_module_get_entries", (gpointer) & get_module_entries) || + !g_module_symbol(module->dll, "hi_module_get_name", (gpointer) & name_func)) { + DEBUG("cannot find needed symbols; is ``%s'' a real module?", filename); + goto failed; + } + + if (g_module_symbol(module->dll, "hi_module_init", (gpointer) & init)) { + DEBUG("initializing module ``%s''", filename); + init(); + } + + g_module_symbol(module->dll, "hi_module_get_weight", + (gpointer) & weight_func); + + module->weight = weight_func ? weight_func() : 0; + module->name = name_func(); + + g_module_symbol(module->dll, "hi_module_get_about", + (gpointer) & (module->aboutfunc)); + g_module_symbol(module->dll, "hi_module_deinit", + (gpointer) & (module->deinit)); + g_module_symbol(module->dll, "hi_module_get_summary", + (gpointer) & (module->summaryfunc)); + + entries = get_module_entries(); + while (entries[i].name) { + ShellModuleEntry *entry = g_new0(ShellModuleEntry, 1); + + if (params.gui_running) { + entry->icon = icon_cache_get_pixbuf(entries[i].icon); + } + entry->icon_file = entries[i].icon; + + g_module_symbol(module->dll, "hi_more_info", + (gpointer) & (entry->morefunc)); + g_module_symbol(module->dll, "hi_get_field", + (gpointer) & (entry->fieldfunc)); + g_module_symbol(module->dll, "hi_note_func", + (gpointer) & (entry->notefunc)); + + entry->name = _(entries[i].name); //gettext unname N_() in computer.c line 67 etc... + entry->scan_func = entries[i].scan_callback; + entry->func = entries[i].callback; + entry->number = i; + entry->flags = entries[i].flags; + + module->entries = g_slist_append(module->entries, entry); + + i++; + } + + DEBUG("registering methods for module ``%s''", filename); + module_register_methods(module); + } else { + DEBUG("cannot g_module_open(``%s''). permission problem?", filename); + failed: + DEBUG("loading module %s failed: %s", filename, g_module_error()); + + g_free(module->name); + g_free(module); + module = NULL; + } + + return module; +} + +static gboolean module_in_module_list(gchar * module, gchar ** module_list) +{ + int i = 0; + + if (!module_list) + return TRUE; + + for (; module_list[i]; i++) { + if (g_str_equal(module_list[i], module)) + return TRUE; + } + + return FALSE; +} + +static gint module_cmp(gconstpointer m1, gconstpointer m2) +{ + ShellModule *a = (ShellModule *) m1; + ShellModule *b = (ShellModule *) m2; + + return a->weight - b->weight; +} + +#if 0 +static void module_entry_free(gpointer data, gpointer user_data) +{ + ShellModuleEntry *entry = (ShellModuleEntry *) data; + + if (entry) { + g_free(entry->name); + g_object_unref(entry->icon); + + g_free(entry); + } +} +#endif + +ModuleAbout *module_get_about(ShellModule * module) +{ + if (module->aboutfunc) { + return module->aboutfunc(); + } + + return NULL; +} + +static GSList *modules_check_deps(GSList * modules) +{ + GSList *mm; + ShellModule *module; + + for (mm = modules; mm; mm = mm->next) { + gchar **(*get_deps) (void); + gchar **deps; + gint i; + + module = (ShellModule *) mm->data; + + if (g_module_symbol(module->dll, "hi_module_get_dependencies", + (gpointer) & get_deps)) { + for (i = 0, deps = get_deps(); deps[i]; i++) { + GSList *l; + ShellModule *m; + gboolean found = FALSE; + + for (l = modules; l && !found; l = l->next) { + m = (ShellModule *) l->data; + gchar *name = g_path_get_basename(g_module_name(m->dll)); + + found = g_str_equal(name, deps[i]); + g_free(name); + } + + if (!found) { + if (params.autoload_deps) { + ShellModule *mod = module_load(deps[i]); + + if (mod) + modules = g_slist_append(modules, mod); + modules = modules_check_deps(modules); /* re-check dependencies */ + + break; + } + + if (params.gui_running) { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new(NULL, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + _("Module \"%s\" depends on module \"%s\", load it?"), + module->name, + deps[i]); + gtk_dialog_add_buttons(GTK_DIALOG(dialog), + GTK_STOCK_NO, + GTK_RESPONSE_REJECT, + GTK_STOCK_OPEN, + GTK_RESPONSE_ACCEPT, NULL); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == + GTK_RESPONSE_ACCEPT) { + ShellModule *mod = module_load(deps[i]); + + if (mod) + modules = g_slist_prepend(modules, mod); + modules = modules_check_deps(modules); /* re-check dependencies */ + } else { + g_error("HardInfo cannot run without loading the additional module."); + exit(1); + } + + gtk_widget_destroy(dialog); + } else { + g_error(_("Module \"%s\" depends on module \"%s\"."), + module->name, deps[i]); + } + } + } + } + } + + return modules; +} + + +GSList *modules_get_list() +{ + return modules_list; +} + +static GSList *modules_load(gchar ** module_list) +{ + GDir *dir; + GSList *modules = NULL; + ShellModule *module; + gchar *filename; + + filename = g_build_filename(params.path_lib, "modules", NULL); + dir = g_dir_open(filename, 0, NULL); + g_free(filename); + + if (dir) { + while ((filename = (gchar *) g_dir_read_name(dir))) { + if (g_strrstr(filename, "." G_MODULE_SUFFIX) && + module_in_module_list(filename, module_list) && + ((module = module_load(filename)))) { + modules = g_slist_prepend(modules, module); + } + } + + g_dir_close(dir); + } + + modules = modules_check_deps(modules); + + if (g_slist_length(modules) == 0) { + if (params.use_modules == NULL) { + g_error + (_("No module could be loaded. Check permissions on \"%s\" and try again."), + params.path_lib); + } else { + g_error + (_("No module could be loaded. Please use hardinfo -l to list all avai" + "lable modules and try again with a valid module list.")); + + } + } + + modules_list = g_slist_sort(modules, module_cmp); + return modules_list; +} + +GSList *modules_load_selected(void) +{ + return modules_load(params.use_modules); +} + +GSList *modules_load_all(void) +{ + return modules_load(NULL); +} + +gint tree_view_get_visible_height(GtkTreeView * tv) +{ + GtkTreePath *path; + GdkRectangle rect; + GtkTreeIter iter; + GtkTreeModel *model = gtk_tree_view_get_model(tv); + gint nrows = 1; + + path = gtk_tree_path_new_first(); + gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tv), path, NULL, &rect); + + /* FIXME: isn't there any easier way to tell the number of rows? */ + gtk_tree_model_get_iter_first(model, &iter); + do { + nrows++; + } while (gtk_tree_model_iter_next(model, &iter)); + + gtk_tree_path_free(path); + + return nrows * rect.height; +} + +void tree_view_save_image(gchar * filename) +{ + /* this is ridiculously complicated :/ why in the hell gtk+ makes this kind of + thing so difficult? */ + + /* FIXME: this does not work if the window (or part of it) isn't visible. does + anyone know how to fix this? :/ */ + Shell *shell = shell_get_main_shell(); + GtkWidget *widget = shell->info->view; + + PangoLayout *layout; + PangoContext *context; + PangoRectangle rect; + + GdkPixmap *pm; + GdkPixbuf *pb; + GdkGC *gc; + GdkColor black = { 0, 0, 0, 0 }; + GdkColor white = { 0, 65535, 65535, 65535 }; + + gint w, h, visible_height; + gchar *tmp; + + gboolean tv_enabled; + + /* present the window */ + gtk_window_present(GTK_WINDOW(shell->window)); + + /* if the treeview is disabled, we need to enable it so we get the + correct colors when saving. we make it insensitive later on if it + was this way before entering this function */ + tv_enabled = GTK_WIDGET_IS_SENSITIVE(widget); + gtk_widget_set_sensitive(widget, TRUE); + + gtk_widget_queue_draw(widget); + + /* unselect things in the information treeview */ + gtk_range_set_value(GTK_RANGE + (GTK_SCROLLED_WINDOW(shell->info->scroll)-> + vscrollbar), 0.0); + gtk_tree_selection_unselect_all(gtk_tree_view_get_selection + (GTK_TREE_VIEW(widget))); + while (gtk_events_pending()) + gtk_main_iteration(); + + /* initialize stuff */ + gc = gdk_gc_new(widget->window); + gdk_gc_set_background(gc, &black); + gdk_gc_set_foreground(gc, &white); + + context = gtk_widget_get_pango_context(widget); + layout = pango_layout_new(context); + + visible_height = tree_view_get_visible_height(GTK_TREE_VIEW(widget)); + + /* draw the title */ + tmp = g_strdup_printf("%s\n%s", + shell->selected->name, + shell->selected->notefunc(shell->selected-> + number)); + pango_layout_set_markup(layout, tmp, -1); + pango_layout_set_width(layout, widget->allocation.width * PANGO_SCALE); + pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); + pango_layout_get_pixel_extents(layout, NULL, &rect); + + w = widget->allocation.width; + h = visible_height + rect.height; + + pm = gdk_pixmap_new(widget->window, w, rect.height, -1); + gdk_draw_rectangle(GDK_DRAWABLE(pm), gc, TRUE, 0, 0, w, rect.height); + gdk_draw_layout_with_colors(GDK_DRAWABLE(pm), gc, 0, 0, layout, + &white, &black); + + /* copy the pixmap from the treeview and from the title */ + pb = gdk_pixbuf_get_from_drawable(NULL, + widget->window, + NULL, 0, 0, 0, 0, w, h); + pb = gdk_pixbuf_get_from_drawable(pb, + pm, + NULL, + 0, 0, + 0, visible_height, w, rect.height); + + /* save the pixbuf to a png file */ + gdk_pixbuf_save(pb, filename, "png", NULL, + "compression", "9", + "tEXt::hardinfo::version", VERSION, + "tEXt::hardinfo::arch", ARCH, NULL); + + /* unref */ + g_object_unref(pb); + g_object_unref(layout); + g_object_unref(pm); + g_object_unref(gc); + g_free(tmp); + + gtk_widget_set_sensitive(widget, tv_enabled); +} + +static gboolean __idle_free_do(gpointer ptr) +{ + g_free(ptr); + + return FALSE; +} + +#if RELEASE == 1 +gpointer idle_free(gpointer ptr) +#else +gpointer __idle_free(gpointer ptr, gchar * f, gint l) +#endif +{ + DEBUG("file: %s, line: %d, ptr %p", f, l, ptr); + + if (ptr) { + g_timeout_add(10000, __idle_free_do, ptr); + } + + return ptr; +} + +void module_entry_scan_all_except(ModuleEntry * entries, gint except_entry) +{ + ModuleEntry entry; + gint i = 0; + void (*scan_callback) (gboolean reload); + gchar *text; + + shell_view_set_enabled(FALSE); + + for (entry = entries[0]; entry.name; entry = entries[++i]) { + if (i == except_entry) + continue; + + text = g_strdup_printf(_("Scanning: %s..."), _(entry.name)); + shell_status_update(text); + g_free(text); + + if ((scan_callback = entry.scan_callback)) { + scan_callback(FALSE); + } + } + + shell_view_set_enabled(TRUE); + shell_status_update(_("Done.")); +} + +void module_entry_scan_all(ModuleEntry * entries) +{ + module_entry_scan_all_except(entries, -1); +} + +void module_entry_reload(ShellModuleEntry * module_entry) +{ + + if (module_entry->scan_func) { + module_entry->scan_func(TRUE); + } +} + +void module_entry_scan(ShellModuleEntry * module_entry) +{ + if (module_entry->scan_func) { + module_entry->scan_func(FALSE); + } +} + +gchar *module_entry_get_field(ShellModuleEntry * module_entry, gchar * field) +{ + if (module_entry->fieldfunc) { + return module_entry->fieldfunc(field); + } + + return NULL; +} + +gchar *module_entry_function(ShellModuleEntry * module_entry) +{ + if (module_entry->func) { + return module_entry->func(); + } + + return NULL; +} + +gchar *module_entry_get_moreinfo(ShellModuleEntry * module_entry, gchar * field) +{ + if (module_entry->morefunc) { + return module_entry->morefunc(field); + } + + return NULL; +} + +const gchar *module_entry_get_note(ShellModuleEntry * module_entry) +{ + if (module_entry->notefunc) { + return module_entry->notefunc(module_entry->number); + } + + return NULL; +} + +gchar *h_strdup_cprintf(const gchar * format, gchar * source, ...) +{ + gchar *buffer, *retn; + va_list args; + + va_start(args, source); + buffer = g_strdup_vprintf(format, args); + va_end(args); + + if (source) { + retn = g_strconcat(source, buffer, NULL); + g_free(buffer); + g_free(source); + } else { + retn = buffer; + } + + return retn; +} + +gchar *h_strconcat(gchar * string1, ...) +{ + gsize l; + va_list args; + gchar *s; + gchar *concat; + gchar *ptr; + + if (!string1) + return NULL; + + l = 1 + strlen(string1); + va_start(args, string1); + s = va_arg(args, gchar *); + while (s) { + l += strlen(s); + s = va_arg(args, gchar *); + } + va_end(args); + + concat = g_new(gchar, l); + ptr = concat; + + ptr = g_stpcpy(ptr, string1); + va_start(args, string1); + s = va_arg(args, gchar *); + while (s) { + ptr = g_stpcpy(ptr, s); + s = va_arg(args, gchar *); + } + va_end(args); + + g_free(string1); + + return concat; +} + +static gboolean h_hash_table_remove_all_true(gpointer key, gpointer data, gpointer user_data) +{ + return TRUE; +} + +void +h_hash_table_remove_all(GHashTable *hash_table) +{ + g_hash_table_foreach_remove(hash_table, + h_hash_table_remove_all_true, + NULL); +} + +gfloat +h_sysfs_read_float(gchar *endpoint, gchar *entry) +{ + gchar *tmp, *buffer; + gfloat return_value = 0.0f; + + tmp = g_build_filename(endpoint, entry, NULL); + if (g_file_get_contents(tmp, &buffer, NULL, NULL)) + return_value = atof(buffer); + + g_free(tmp); + g_free(buffer); + + return return_value; +} + +gint +h_sysfs_read_int(gchar *endpoint, gchar *entry) +{ + gchar *tmp, *buffer; + gint return_value = 0; + + tmp = g_build_filename(endpoint, entry, NULL); + if (g_file_get_contents(tmp, &buffer, NULL, NULL)) + return_value = atoi(buffer); + + g_free(tmp); + g_free(buffer); + + return return_value; +} + +gchar * +h_sysfs_read_string(gchar *endpoint, gchar *entry) +{ + gchar *tmp, *return_value; + + tmp = g_build_filename(endpoint, entry, NULL); + if (!g_file_get_contents(tmp, &return_value, NULL, NULL)) { + g_free(return_value); + + return_value = NULL; + } else { + return_value = g_strstrip(return_value); + } + + g_free(tmp); + + return return_value; +} + +static GHashTable *_moreinfo = NULL; + +void +moreinfo_init(void) +{ + if (G_UNLIKELY(_moreinfo)) { + DEBUG("moreinfo already initialized"); + return; + } + DEBUG("initializing moreinfo"); + _moreinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); +} + +void +moreinfo_shutdown(void) +{ + if (G_UNLIKELY(!_moreinfo)) { + DEBUG("moreinfo not initialized"); + return; + } + DEBUG("shutting down moreinfo"); + g_hash_table_destroy(_moreinfo); + _moreinfo = NULL; +} + +void +moreinfo_add_with_prefix(gchar *prefix, gchar *key, gchar *value) +{ + if (G_UNLIKELY(!_moreinfo)) { + DEBUG("moreinfo not initialized"); + return; + } + + if (prefix) { + gchar *hashkey = g_strconcat(prefix, ":", key, NULL); + g_hash_table_insert(_moreinfo, hashkey, value); + return; + } + + g_hash_table_insert(_moreinfo, g_strdup(key), value); +} + +void +moreinfo_add(gchar *key, gchar *value) +{ + moreinfo_add_with_prefix(NULL, key, value); +} + +static gboolean +_moreinfo_del_cb(gpointer key, gpointer value, gpointer data) +{ + return g_str_has_prefix(key, data); +} + +void +moreinfo_del_with_prefix(gchar *prefix) +{ + if (G_UNLIKELY(!_moreinfo)) { + DEBUG("moreinfo not initialized"); + return; + } + + g_hash_table_foreach_remove(_moreinfo, _moreinfo_del_cb, prefix); +} + +void +moreinfo_clear(void) +{ + if (G_UNLIKELY(!_moreinfo)) { + DEBUG("moreinfo not initialized"); + return; + } + h_hash_table_remove_all(_moreinfo); +} + +gchar * +moreinfo_lookup_with_prefix(gchar *prefix, gchar *key) +{ + if (G_UNLIKELY(!_moreinfo)) { + DEBUG("moreinfo not initialized"); + return 0; + } + + if (prefix) { + gchar *lookup_key = g_strconcat(prefix, ":", key, NULL); + gchar *result = g_hash_table_lookup(_moreinfo, lookup_key); + g_free(lookup_key); + return result; + } + + return g_hash_table_lookup(_moreinfo, key); +} + +gchar * +moreinfo_lookup(gchar *key) +{ + return moreinfo_lookup_with_prefix(NULL, key); +} + +#if !GLIB_CHECK_VERSION(2,44,0) +gboolean g_strv_contains(const gchar * const * strv, const gchar *str) { + /* g_strv_contains() requires glib>2.44 + * fallback for older versions */ + gint i = 0; + while(strv[i] != NULL) { + if (g_strcmp0(strv[i], str) == 0) + return 1; + i++; + } + return 0; +} +#endif diff --git a/hardinfo/vendor.c b/hardinfo/vendor.c new file mode 100644 index 00000000..86dba97a --- /dev/null +++ b/hardinfo/vendor.c @@ -0,0 +1,195 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira + * + * List of vendors based on GtkSysInfo (c) Pissens Sebastien. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include "vendor.h" +#include "syncmanager.h" +#include "config.h" +#include "hardinfo.h" + +static const Vendor vendors[] = { + {"ATI", "ATI Technologies", "www.ati.com"}, + {"nVidia", "NVIDIA", "www.nvidia.com"}, + {"3Com", "3Com", "www.3com.com"}, + {"Intel", "Intel", "www.intel.com"}, + {"Cirrus Logic", "Cirrus Logic", "www.cirrus.com"}, + {"VIA Technologies", "VIA Technologies", "www.via.com.tw"}, + {"VIA", "VIA Technologies", "www.via.com.tw"}, + {"hp", "Hewlett-Packard", "www.hp.com"}, + {"NEC Corporation", "NEC Coporation", "www.nec.com"}, + {"MAXTOR", "MAXTOR", "www.maxtor.com"}, + {"SAMSUNG", "SAMSUNG", "www.samsung.com"}, + {"PIONEER", "PIONEER", "www.pioneer-eur.com"}, + {"PLEXTOR", "PLEXTOR", "www.plextor.be"}, + {"Realtek Semiconductor", "Realtek", "www.realtek.com.tw"}, + {"TOSHIBA", "TOSHIBA", "www.toshiba.com"}, + {"LITE-ON", "LITE-ON", "www.liteonit.com"}, + {"WDC", "Western Digital", "www.wdc.com"}, + {"HL-DT-ST", "LG Electronics", "www.lge.com"}, + {"ST", "SEAGATE", "www.seagate.com"}, + {"Lexmark", "Lexmark", "www.lexmark.com"}, + {"_NEC", "NEC Corporation", "www.nec.com"}, + {"Creative Labs", "Creative Labs", "www.creative.com"}, + {"Brooktree", "Conexant", "www.brooktree.com"}, + {"Atheros", "Atheros Communications", "www.atheros.com"}, + {"MATSHITA", "Panasonic", "www.panasonic.com"}, + {"Silicon Image", "Silicon Image", "www.siliconimage.com"}, + {"Silicon Integrated Image", "Silicon Image", "www.siliconimage.com"}, + {"KYE", "KYE Systems", "www.genius-kye.com"}, + {"Broadcom", "Broadcom", "www.broadcom.com"}, + {"Apple", "Apple", "www.apple.com"}, + {"IBM", "IBM", "www.ibm.com"}, + {"Dell", "Dell Computer", "www.dell.com"}, + {"Logitech", "Logitech International", "www.logitech.com"}, + {"FUJITSU", "Fujitsu", "www.fujitsu.com"}, + {"CDU", "Sony", "www.sony.com"}, + {"SanDisk", "SanDisk", "www.sandisk.com"}, + {"ExcelStor", "ExcelStor Technology", "www.excelstor.com"}, + {"D-Link", "D-Link", "www.dlink.com.tw"}, + {"Giga-byte", "Gigabyte Technology", "www.gigabyte.com.tw"}, + {"Gigabyte", "Gigabyte Technology", "www.gigabyte.com.tw"}, + {"C-Media", "C-Media Electronics", "www.cmedia.com.tw"}, + {"Avermedia", "AVerMedia Technologies", "www.aver.com"}, + {"Philips", "Philips", "www.philips.com"}, + {"RaLink", "Ralink Technology", "www.ralinktech.com"}, + {"Siemens", "Siemens AG", "www.siemens.com"}, + {"HP", "Hewlett-Packard", "www.hp.com"}, + {"Hewlett-Packard", "Hewlett-Packard", "www.hp.com"}, + {"TEAC", "TEAC America", "www.teac.com"}, + {"Microsoft", "Microsoft", "www.microsoft.com"}, + {"Memorex", "Memorex Products", "www.memorex.com"}, + {"eMPIA", "eMPIA Technology", "www.empiatech.com.tw"}, + {"Canon", "Canon", "www.canon.com"}, + {"A4Tech", "A4tech", "www.a4tech.com"}, + {"ALCOR", "Alcor", "www.alcor.org"}, + {"Vimicro", "Vimicro", "www.vimicro.com"}, + {"OTi", "Ours Technology", "www.oti.com.tw"}, + {"BENQ", "BenQ", "www.benq.com"}, + {"Acer", "Acer", "www.acer.com"}, + {"QUANTUM", "Quantum", "www.quantum.com"}, + {"Kingston", "Kingston", "www.kingston.com"}, + {"Chicony", "Chicony", "www.chicony.com.tw"}, + {"Genius", "Genius", "www.genius.ru"}, + /* BIOS manufacturers */ + {"American Megatrends", "American Megatrends", "www.ami.com"}, + {"Award", "Award Software International", "www.award-bios.com"}, + {"Phoenix", "Phoenix Technologies", "www.phoenix.com"}, +}; + +static GSList *vendor_list = NULL; + +void vendor_init(void) +{ + gint i; + gchar *path; + static SyncEntry se = { + .fancy_name = "Update vendor list", + .name = "RecvVendorList", + .save_to = "vendor.conf", + .get_data = NULL + }; + + DEBUG("initializing vendor list"); + sync_manager_add_entry(&se); + + path = g_build_filename(g_get_home_dir(), ".hardinfo", "vendor.conf", NULL); + if (!g_file_test(path, G_FILE_TEST_EXISTS)) { + DEBUG("local vendor.conf not found, trying system-wise"); + g_free(path); + path = g_build_filename(params.path_data, "vendor.conf", NULL); + } + + if (g_file_test(path, G_FILE_TEST_EXISTS)) { + GKeyFile *vendors; + gchar *tmp; + gint num_vendors; + + DEBUG("loading %s", path); + + vendors = g_key_file_new(); + if (g_key_file_load_from_file(vendors, path, 0, NULL)) { + num_vendors = g_key_file_get_integer(vendors, "vendors", "number", NULL); + + for (i = num_vendors - 1; i >= 0; i--) { + Vendor *v = g_new0(Vendor, 1); + + tmp = g_strdup_printf("vendor%d", i); + + v->id = g_key_file_get_string(vendors, tmp, "id", NULL); + v->name = g_key_file_get_string(vendors, tmp, "name", NULL); + v->url = g_key_file_get_string(vendors, tmp, "url", NULL); + + vendor_list = g_slist_prepend(vendor_list, v); + + g_free(tmp); + } + } + + g_key_file_free(vendors); + } else { + DEBUG("system-wise vendor.conf not found, using internal database"); + + for (i = G_N_ELEMENTS(vendors) - 1; i >= 0; i--) { + vendor_list = g_slist_prepend(vendor_list, (gpointer) &vendors[i]); + } + } + + g_free(path); +} + +const gchar *vendor_get_name(const gchar * id) +{ + GSList *vendor; + + if (!id) { + return NULL; + } + + for (vendor = vendor_list; vendor; vendor = vendor->next) { + Vendor *v = (Vendor *)vendor->data; + + if (v && v->id && strstr(id, v->id)) { + return g_strdup(v->name); + } + } + + return id; +} + +const gchar *vendor_get_url(const gchar * id) +{ + GSList *vendor; + + if (!id) { + return NULL; + } + + for (vendor = vendor_list; vendor; vendor = vendor->next) { + Vendor *v = (Vendor *)vendor->data; + + if (v && v->id && strstr(id, v->id)) { + return g_strdup(v->url); + } + } + + return NULL; +} diff --git a/iconcache.c b/iconcache.c deleted file mode 100644 index c927ca5e..00000000 --- a/iconcache.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -#include -#include - -static GHashTable *cache = NULL; - -void icon_cache_init(void) -{ - DEBUG("initializing icon cache"); - if (!cache) { - cache = g_hash_table_new(g_str_hash, g_str_equal); - } else { - DEBUG("already initialized? huh?"); - } -} - -GdkPixbuf *icon_cache_get_pixbuf(const gchar * file) -{ - GdkPixbuf *icon; - - if (!cache) - icon_cache_init(); - - icon = g_hash_table_lookup(cache, file); - - if (!icon) { - gchar *path; - - path = g_build_filename(params.path_data, "pixmaps", file, NULL); - icon = gdk_pixbuf_new_from_file(path, NULL); - g_hash_table_insert(cache, g_strdup(file), icon); - - g_free(path); - } - - if (icon) { - g_object_ref(icon); - } - - return icon; -} - -GtkWidget *icon_cache_get_image(const gchar * file) -{ - GdkPixbuf *icon; - - icon = icon_cache_get_pixbuf(file); - return gtk_image_new_from_pixbuf(icon); -} - -GdkPixbuf *icon_cache_get_pixbuf_at_size(const gchar * file, gint wid, - gint hei) -{ - GdkPixbuf *icon; - - if (!cache) - icon_cache_init(); - - icon = g_hash_table_lookup(cache, file); - - if (!icon) { - gchar *path; - - path = g_build_filename(params.path_data, "pixmaps", file, NULL); - icon = gdk_pixbuf_new_from_file_at_size(path, wid, hei, NULL); - g_hash_table_insert(cache, g_strdup(file), icon); - - g_free(path); - } - - if (icon) { - g_object_ref(icon); - } - - return icon; -} - -GtkWidget *icon_cache_get_image_at_size(const gchar * file, gint wid, - gint hei) -{ - GdkPixbuf *icon; - - icon = icon_cache_get_pixbuf_at_size(file, wid, hei); - return gtk_image_new_from_pixbuf(icon); -} diff --git a/iconcache.h b/iconcache.h deleted file mode 100644 index 97f59a82..00000000 --- a/iconcache.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef __ICONCACHE_H__ -#define __ICONCACHE_H__ - -#include - -void icon_cache_init(void); -GdkPixbuf *icon_cache_get_pixbuf(const gchar *file); -GtkWidget *icon_cache_get_image(const gchar *file); -GdkPixbuf *icon_cache_get_pixbuf_at_size(const gchar *file, gint wid, gint hei); -GtkWidget *icon_cache_get_image_at_size(const gchar *file, gint wid, gint hei); - -#endif /* __ICONCACHE_H__ */ diff --git a/includes/alpha/processor-platform.h b/includes/alpha/processor-platform.h new file mode 100644 index 00000000..2ff3a728 --- /dev/null +++ b/includes/alpha/processor-platform.h @@ -0,0 +1,28 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __PROCESSOR_PLATFORM_H__ +#define __PROCESSOR_PLATFORM_H__ + +struct _Processor { + gchar *model_name; + gfloat bogomips, cpu_mhz; + gchar *strmodel; +}; + +#endif /* __PROCESSOR_PLATFORM_H__ */ diff --git a/includes/arm/processor-platform.h b/includes/arm/processor-platform.h new file mode 100644 index 00000000..290b9a62 --- /dev/null +++ b/includes/arm/processor-platform.h @@ -0,0 +1,41 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __PROCESSOR_PLATFORM_H__ +#define __PROCESSOR_PLATFORM_H__ + +struct _Processor { + gchar *model_name; + gchar *decoded_name; + gchar *flags; + gfloat bogomips; + + gfloat cpu_mhz; /* for devices.c, identical to cpukhz_max/1000 */ + gint cpukhz_max, cpukhz_min, cpukhz_cur; /* for arm/processor.c */ + gint id; + + gchar *cpu_implementer; + gchar *cpu_architecture; + gchar *cpu_variant; + gchar *cpu_part; + gchar *cpu_revision; + + gint mode; +}; + +#endif /* __PROCESSOR_PLATFORM_H__ */ diff --git a/includes/benchmark.h b/includes/benchmark.h new file mode 100644 index 00000000..8047d5c6 --- /dev/null +++ b/includes/benchmark.h @@ -0,0 +1,33 @@ +#ifndef __BENCHMARK_H__ +#define __BENCHMARK_H__ + +#include "hardinfo.h" + +extern ProgramParameters params; + +enum { + BENCHMARK_BLOWFISH, + BENCHMARK_CRYPTOHASH, + BENCHMARK_FIB, + BENCHMARK_NQUEENS, + BENCHMARK_FFT, + BENCHMARK_RAYTRACE, + BENCHMARK_GUI, + BENCHMARK_N_ENTRIES +} BenchmarkEntries; + +void benchmark_bfish(void); +void benchmark_cryptohash(void); +void benchmark_fft(void); +void benchmark_fib(void); +void benchmark_fish(void); +void benchmark_gui(void); +void benchmark_nqueens(void); +void benchmark_raytrace(void); + +gdouble benchmark_parallel_for(guint start, guint end, + gpointer callback, gpointer callback_data); + +extern gdouble bench_results[BENCHMARK_N_ENTRIES]; + +#endif /* __BENCHMARK_H__ */ \ No newline at end of file diff --git a/includes/binreloc.h b/includes/binreloc.h new file mode 100644 index 00000000..3bf48bc6 --- /dev/null +++ b/includes/binreloc.h @@ -0,0 +1,68 @@ +/* + * BinReloc - a library for creating relocatable executables + * Written by: Hongli Lai + * http://autopackage.org/ + * + * This source code is public domain. You can relicense this code + * under whatever license you want. + * + * See http://autopackage.org/docs/binreloc/ for + * more information and how to use this. + */ + +#ifndef __BINRELOC_H__ +#define __BINRELOC_H__ + +#include + +G_BEGIN_DECLS + + +/** These error codes can be returned by br_init(), br_init_lib(), gbr_init() or gbr_init_lib(). */ +typedef enum { + /** Cannot allocate memory. */ + GBR_INIT_ERROR_NOMEM, + /** Unable to open /proc/self/maps; see errno for details. */ + GBR_INIT_ERROR_OPEN_MAPS, + /** Unable to read from /proc/self/maps; see errno for details. */ + GBR_INIT_ERROR_READ_MAPS, + /** The file format of /proc/self/maps is invalid; kernel bug? */ + GBR_INIT_ERROR_INVALID_MAPS, + /** BinReloc is disabled (the ENABLE_BINRELOC macro is not defined). */ + GBR_INIT_ERROR_DISABLED +} GbrInitError; + + +#ifndef BINRELOC_RUNNING_DOXYGEN +/* Mangle symbol names to avoid symbol collisions with other ELF objects. */ + #define gbr_find_exe UfUy21856259474323_gbr_find_exe + #define gbr_find_exe_dir UfUy21856259474323_gbr_find_exe_dir + #define gbr_find_prefix UfUy21856259474323_gbr_find_prefix + #define gbr_find_bin_dir UfUy21856259474323_gbr_find_bin_dir + #define gbr_find_sbin_dir UfUy21856259474323_gbr_find_sbin_dir + #define gbr_find_data_dir UfUy21856259474323_gbr_find_data_dir + #define gbr_find_locale_dir UfUy21856259474323_gbr_find_locale_dir + #define gbr_find_lib_dir UfUy21856259474323_gbr_find_lib_dir + #define gbr_find_libexec_dir UfUy21856259474323_gbr_find_libexec_dir + #define gbr_find_etc_dir UfUy21856259474323_gbr_find_etc_dir + + +#endif +gboolean gbr_init (GError **error); +gboolean gbr_init_lib (GError **error); + +gchar *gbr_find_exe (const gchar *default_exe); +gchar *gbr_find_exe_dir (const gchar *default_dir); +gchar *gbr_find_prefix (const gchar *default_prefix); +gchar *gbr_find_bin_dir (const gchar *default_bin_dir); +gchar *gbr_find_sbin_dir (const gchar *default_sbin_dir); +gchar *gbr_find_data_dir (const gchar *default_data_dir); +gchar *gbr_find_locale_dir (const gchar *default_locale_dir); +gchar *gbr_find_lib_dir (const gchar *default_lib_dir); +gchar *gbr_find_libexec_dir (const gchar *default_libexec_dir); +gchar *gbr_find_etc_dir (const gchar *default_etc_dir); + + +G_END_DECLS + +#endif /* __BINRELOC_H__ */ diff --git a/includes/blowfish.h b/includes/blowfish.h new file mode 100644 index 00000000..3f33e945 --- /dev/null +++ b/includes/blowfish.h @@ -0,0 +1,33 @@ +/* +blowfish.h: Header file for blowfish.c + +Copyright (C) 1997 by Paul Kocher + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +See blowfish.c for more information about this file. +*/ + + +typedef struct { + unsigned long P[16 + 2]; + unsigned long S[4][256]; +} BLOWFISH_CTX; + +void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen); +void Blowfish_Encrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr); +void Blowfish_Decrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr); + + + diff --git a/includes/callbacks.h b/includes/callbacks.h new file mode 100644 index 00000000..d53e1861 --- /dev/null +++ b/includes/callbacks.h @@ -0,0 +1,45 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __CALLBACKS_H__ +#define __CALLBACKS_H__ + +#include + +void cb_about(); +void cb_about_module(GtkAction *action); +void cb_generate_report(); +void cb_save_graphic(); +void cb_quit(); +void cb_refresh(); +void cb_copy_to_clipboard(); +void cb_side_pane(); +void cb_toolbar(); +void cb_open_web_page(); +void cb_open_online_docs(); +void cb_open_online_docs_context(); +void cb_sync_manager(); +void cb_report_bug(); +void cb_donate(); +void cb_connect_to(); +void cb_manage_hosts(); +void cb_connect_host(GtkAction * action); +void cb_local_computer(); +void cb_act_as_server(); + +#endif /* __CALLBACKS_H__ */ diff --git a/includes/computer.h b/includes/computer.h new file mode 100644 index 00000000..c23acab6 --- /dev/null +++ b/includes/computer.h @@ -0,0 +1,190 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __COMPUTER_H__ +#define __COMPUTER_H__ + +#include "hardinfo.h" + +#define DB_PREFIX "/etc/" + +static struct { + gchar *file, *codename; +} distro_db[] = { + { DB_PREFIX "fatdog-version", "fatdog" }, + { DB_PREFIX "debian_version", "deb" }, + { DB_PREFIX "slackware-version", "slk" }, + { DB_PREFIX "mandrake-release", "mdk" }, + { DB_PREFIX "mandriva-release", "mdv" }, + { DB_PREFIX "fedora-release", "fdra" }, + { DB_PREFIX "coas", "coas" }, + { DB_PREFIX "environment.corel", "corel"}, + { DB_PREFIX "gentoo-release", "gnt" }, + { DB_PREFIX "conectiva-release", "cnc" }, + { DB_PREFIX "versão-conectiva", "cnc" }, + { DB_PREFIX "turbolinux-release", "tl" }, + { DB_PREFIX "yellowdog-release", "yd" }, + { DB_PREFIX "sabayon-release", "sbn" }, + { DB_PREFIX "arch-release", "arch" }, + { DB_PREFIX "enlisy-release", "enlsy"}, + { DB_PREFIX "SuSE-release", "suse" }, + { DB_PREFIX "sun-release", "sun" }, + { DB_PREFIX "zenwalk-version", "zen" }, + { DB_PREFIX "DISTRO_SPECS", "ppy" }, + { DB_PREFIX "puppyversion", "ppy" }, + { DB_PREFIX "distro-release", "fl" }, + { DB_PREFIX "vine-release", "vine" }, + { DB_PREFIX "PartedMagic-version", "pmag" }, + /* + * RedHat must be the *last* one to be checked, since + * some distros (like Mandrake) includes a redhat-relase + * file too. + */ + { DB_PREFIX "redhat-release", "rh" }, + { NULL, NULL } +}; + +typedef struct _Computer Computer; +typedef struct _OperatingSystem OperatingSystem; +typedef struct _MemoryInfo MemoryInfo; +typedef struct _UptimeInfo UptimeInfo; +typedef struct _LoadInfo LoadInfo; +typedef struct _DisplayInfo DisplayInfo; + +typedef struct _AlsaInfo AlsaInfo; +typedef struct _AlsaCard AlsaCard; + +typedef struct _FileSystem FileSystem; +typedef struct _FileSystemEntry FileSystemEntry; + +struct _AlsaCard { + gchar *alsa_name; + gchar *friendly_name; +/* + gchar *board; + gchar revision, compat_class; + gint subsys_vendorid, subsys_id; + + gint cap_dac_res, cap_adc_res; + gboolean cap_3d_enh; + + gint curr_mic_gain; + gboolean curr_3d_enh, + curr_loudness, + curr_simstereo; + gchar *curr_mic_select; +*/ +}; + +struct _AlsaInfo { + GSList *cards; +}; + +struct _DisplayInfo { + gchar *ogl_vendor, *ogl_renderer, *ogl_version; + gboolean dri; + + gchar *display_name, *vendor, *version; + gchar *extensions; + gchar *monitors; + + gint width, height; +}; + +struct _LoadInfo { + float load1, load5, load15; +}; + +struct _UptimeInfo { + int days, hours, minutes; +}; + +struct _Computer { + MemoryInfo *memory; + OperatingSystem *os; + DisplayInfo *display; + AlsaInfo *alsa; + + gchar *date_time; +}; + +struct _OperatingSystem { + gchar *kernel; + gchar *libc; + gchar *distrocode, *distro; + gchar *hostname; + gchar *language; + gchar *homedir; + gchar *kernel_version; + + gchar *languages; + + gchar *desktop; + gchar *username; + + gchar *boots; + + gchar *entropy_avail; +}; + +struct _MemoryInfo { + gint total, used, free, cached; + gfloat ratio; +}; + +#define get_str(field_name,ptr) \ + if (g_str_has_prefix(tmp[0], field_name)) { \ + ptr = g_strdup(tmp[1]); \ + g_strfreev(tmp); \ + continue; \ + } +#define get_int(field_name,ptr) \ + if (g_str_has_prefix(tmp[0], field_name)) { \ + ptr = atoi(tmp[1]); \ + g_strfreev(tmp); \ + continue; \ + } +#define get_float(field_name,ptr) \ + if (g_str_has_prefix(tmp[0], field_name)) { \ + ptr = atof(tmp[1]); \ + g_strfreev(tmp); \ + continue; \ + } + +extern gchar *users; +extern gchar *groups; +extern gchar *fs_list; +extern GHashTable *_module_hash_table; +extern Computer *computer; +extern gchar *module_list; + +gchar *computer_get_formatted_loadavg(); +gchar *computer_get_formatted_uptime(); +gchar *computer_get_alsacards(Computer * computer); +gchar *computer_get_entropy_avail(); + +OperatingSystem *computer_get_os(void); +AlsaInfo *computer_get_alsainfo(void); +MemoryInfo *computer_get_memory(void); +UptimeInfo *computer_get_uptime(void); +DisplayInfo *computer_get_display(void); + +void scan_modules_do(void); +void scan_filesystems(void); +void scan_users_do(void); + +#endif /* __COMPUTER_H__ */ diff --git a/includes/devices.h b/includes/devices.h new file mode 100644 index 00000000..09c1c36f --- /dev/null +++ b/includes/devices.h @@ -0,0 +1,95 @@ +#ifndef __DEVICES_H__ +#define __DEVICES_H__ + +#include "hardinfo.h" +#include "processor-platform.h" + +typedef struct _Processor Processor; + +#define WALK_UNTIL(x) while((*buf != '\0') && (*buf != x)) buf++ + +#define GET_STR(field_name,ptr) \ + if (!ptr && strstr(tmp[0], field_name)) { \ + ptr = g_markup_escape_text(g_strstrip(tmp[1]), strlen(tmp[1])); \ + g_strfreev(tmp); \ + continue; \ + } + +#define get_str(field_name,ptr) \ + if (g_str_has_prefix(tmp[0], field_name)) { \ + ptr = g_strdup(tmp[1]); \ + g_strfreev(tmp); \ + continue; \ + } +#define get_int(field_name,ptr) \ + if (g_str_has_prefix(tmp[0], field_name)) { \ + ptr = atoi(tmp[1]); \ + g_strfreev(tmp); \ + continue; \ + } +#define get_float(field_name,ptr) \ + if (g_str_has_prefix(tmp[0], field_name)) { \ + ptr = atof(tmp[1]); \ + g_strfreev(tmp); \ + continue; \ + } + + +/* Processor */ +GSList *processor_scan(void); +void get_processor_strfamily(Processor * processor); +void cpu_flags_init(void); +gchar *processor_get_capabilities_from_flags(gchar * strflags); +gchar *processor_get_detailed_info(Processor * processor); +gchar *processor_get_info(GSList * processors); + +/* Memory */ +void init_memory_labels(void); +void scan_memory_do(void); + +/* Printers */ +void init_cups(void); + +/* Battery */ +void scan_battery_do(void); + +/* PCI */ +void scan_pci_do(void); + +/* Printers */ +void scan_printers_do(void); + +/* Sensors */ +void scan_sensors_do(void); +void sensors_init(void); +void sensors_shutdown(void); + +#if defined(ARCH_x86) || defined(ARCH_x86_64) +/* SPD */ +void scan_spd_do(void); +#endif /* ARCH_x86 */ + +extern gchar *battery_list; +extern gchar *input_icons; +extern gchar *input_list; +extern gchar *lginterval; +extern gchar *meminfo; +extern gchar *pci_list; +extern gchar *printer_icons; +extern gchar *printer_list; +extern gchar *sensors; +extern gchar *storage_icons; +extern gchar *storage_list; +extern gchar *usb_list; +extern GHashTable *memlabels; +extern GHashTable *_pci_devices; +extern GHashTable *sensor_compute; +extern GHashTable *sensor_labels; +extern GModule *cups; + +#if defined(ARCH_x86) || defined(ARCH_x86_64) +extern gchar *dmi_info; +extern gchar *spd_info; +#endif + +#endif /* __DEVICES_H__ */ diff --git a/includes/egg-markdown.h b/includes/egg-markdown.h new file mode 100644 index 00000000..4475b9f0 --- /dev/null +++ b/includes/egg-markdown.h @@ -0,0 +1,84 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * Copyright (C) 2008 Richard Hughes + * Copyright (C) 2009 Leandro Pereira + * + * Licensed under the GNU General Public License Version 2 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __EGG_MARKDOWN_H +#define __EGG_MARKDOWN_H + +#include + +G_BEGIN_DECLS + +#define EGG_TYPE_MARKDOWN (egg_markdown_get_type ()) +#define EGG_MARKDOWN(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EGG_TYPE_MARKDOWN, EggMarkdown)) +#define EGG_MARKDOWN_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), EGG_TYPE_MARKDOWN, EggMarkdownClass)) +#define EGG_IS_MARKDOWN(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EGG_TYPE_MARKDOWN)) +#define EGG_IS_MARKDOWN_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EGG_TYPE_MARKDOWN)) +#define EGG_MARKDOWN_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EGG_TYPE_MARKDOWN, EggMarkdownClass)) +#define EGG_MARKDOWN_ERROR (egg_markdown_error_quark ()) +#define EGG_MARKDOWN_TYPE_ERROR (egg_markdown_error_get_type ()) + +#define EGG_MARKDOWN_MAX_LINE_LENGTH 2048 + +typedef struct EggMarkdownPrivate EggMarkdownPrivate; + +typedef struct +{ + GObject parent; + EggMarkdownPrivate *priv; +} EggMarkdown; + +typedef struct +{ + GObjectClass parent_class; + void (* active_changed) (EggMarkdown *self, + gboolean active); +} EggMarkdownClass; + +typedef enum { + EGG_MARKDOWN_OUTPUT_TEXT, + EGG_MARKDOWN_OUTPUT_PANGO, + EGG_MARKDOWN_OUTPUT_HTML, + EGG_MARKDOWN_OUTPUT_UNKNOWN +} EggMarkdownOutput; + +GType egg_markdown_get_type (void); +EggMarkdown *egg_markdown_new (void); +gboolean egg_markdown_set_output (EggMarkdown *self, + EggMarkdownOutput output); +gboolean egg_markdown_set_max_lines (EggMarkdown *self, + gint max_lines); +gboolean egg_markdown_set_smart_quoting (EggMarkdown *self, + gboolean smart_quoting); +gboolean egg_markdown_set_escape (EggMarkdown *self, + gboolean escape); +gboolean egg_markdown_set_autocode (EggMarkdown *self, + gboolean autocode); +gchar *egg_markdown_parse (EggMarkdown *self, + const gchar *text); +void egg_markdown_clear (EggMarkdown *self); +gchar *egg_markdown_get_link_uri (EggMarkdown *self, + const gint link_id); + +G_END_DECLS + +#endif /* __EGG_MARKDOWN_H */ + diff --git a/includes/expr.h b/includes/expr.h new file mode 100644 index 00000000..4bda6b72 --- /dev/null +++ b/includes/expr.h @@ -0,0 +1,48 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __EXPR_H__ +#define __EXPR_H__ + +typedef struct _MathToken MathToken; + +typedef enum { + TOKEN_OPERATOR, + TOKEN_VARIABLE, + TOKEN_VALUE +} MathTokenType; + +struct _MathToken { + union { + gfloat value; + gchar op; + } val; + MathTokenType type; +}; + +#define math_postfix_free math_infix_free + +GSList *math_infix_to_postfix(GSList *infix); +void math_infix_free(GSList *infix, gboolean free_tokens); + +GSList *math_string_to_infix(gchar *string); +GSList *math_string_to_postfix(gchar *string); + +gfloat math_postfix_eval(GSList *postfix, gfloat at_value); +gfloat math_string_eval(gchar *string, gfloat at_value); + +#endif /* __EXPR_H__ */ diff --git a/includes/fftbench.h b/includes/fftbench.h new file mode 100644 index 00000000..7c0afc3d --- /dev/null +++ b/includes/fftbench.h @@ -0,0 +1,19 @@ +#ifndef __FFTBENCH_H__ +#define __FFTBENCH_H__ + +#include + +typedef struct _FFTBench FFTBench; + +struct _FFTBench { + double **a, *b, *r; + int *p; +}; + +FFTBench *fft_bench_new(void); +void fft_bench_run(FFTBench *fftbench); +void fft_bench_free(FFTBench *fftbench); + +#endif /* __FFTBENCH_H__ */ + + diff --git a/includes/guibench.h b/includes/guibench.h new file mode 100644 index 00000000..d24403bc --- /dev/null +++ b/includes/guibench.h @@ -0,0 +1,24 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GUIBENCH_H__ +#define __GUIBENCH_H__ + +double guibench(void); + +#endif /* __GUIBENCH_H__ */ \ No newline at end of file diff --git a/includes/hardinfo.h b/includes/hardinfo.h new file mode 100644 index 00000000..70329ac7 --- /dev/null +++ b/includes/hardinfo.h @@ -0,0 +1,170 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __HARDINFO_H__ +#define __HARDINFO_H__ + +#include +#include "config.h" +#include "shell.h" +#include "vendor.h" +#include +#include +#define _(STRING) gettext(STRING) +#define N_(STRING) (STRING) + +typedef enum { + MODULE_FLAG_NONE = 0, + MODULE_FLAG_NO_REMOTE = 1<<0, + MODULE_FLAG_HAS_HELP = 1<<1, +} ModuleEntryFlags; + +typedef struct _ModuleEntry ModuleEntry; +typedef struct _ModuleAbout ModuleAbout; +typedef struct _FileTypes FileTypes; +typedef struct _ProgramParameters ProgramParameters; + +struct _ProgramParameters { + gboolean create_report; + gboolean show_version; + gboolean gui_running; + gboolean list_modules; + gboolean autoload_deps; + gboolean run_xmlrpc_server; + + gint report_format; + + gchar **use_modules; + gchar *run_benchmark; + gchar *path_lib; + gchar *path_data; + gchar *argv0; +}; + +struct _FileTypes { + gchar *name; + gchar *mime_type; + gchar *extension; + gpointer data; +}; + +struct _ModuleEntry { + gchar *name; + gchar *icon; + gpointer callback; + gpointer scan_callback; + guint32 flags; +}; + +struct _ModuleAbout { + const gchar *description; + const gchar *author; + const gchar *version; + const gchar *license; +}; + +/* String utility functions */ +inline void remove_quotes(gchar *str); +inline char *strend(gchar *str, gchar chr); +inline void remove_linefeed(gchar *str); +gchar *strreplacechr(gchar *string, gchar *replace, gchar new_char); +gchar *strreplace(gchar *string, gchar *replace, gchar *replacement); + +/* Widget utility functions */ +void widget_set_cursor(GtkWidget *widget, GdkCursorType cursor_type); +gint tree_view_get_visible_height(GtkTreeView *tv); +void tree_view_save_image(gchar *filename); + +/* File Chooser utility functions */ +void file_chooser_open_expander(GtkWidget *chooser); +void file_chooser_add_filters(GtkWidget *chooser, FileTypes *filters); +gchar *file_chooser_get_extension(GtkWidget *chooser, FileTypes *filters); +gchar *file_chooser_build_filename(GtkWidget *chooser, gchar *extension); +gpointer file_types_get_data_by_name(FileTypes *file_types, gchar *name); + +/* Misc utility functions */ +#if RELEASE == 1 +gpointer idle_free(gpointer ptr); +#else +gpointer __idle_free(gpointer ptr, gchar *f, gint l); +#define idle_free(p) __idle_free(p, __FILE__, __LINE__) +#endif /* RELEASE == 1 */ + +gchar *find_program(gchar *program_name); +inline gchar *size_human_readable(gfloat size); +void nonblock_sleep(guint msec); +void open_url(gchar *url); +GSList *modules_get_list(void); +GSList *modules_load_selected(void); +GSList *modules_load_all(void); +void module_unload_all(void); +ModuleAbout *module_get_about(ShellModule *module); +gchar *seconds_to_string(unsigned int seconds); + +gchar *h_strdup_cprintf(const gchar *format, gchar *source, ...); +gchar *h_strconcat(gchar *string1, ...); +void h_hash_table_remove_all (GHashTable *hash_table); + +void module_entry_scan_all_except(ModuleEntry *entries, gint except_entry); +void module_entry_scan_all(ModuleEntry *entries); +void module_entry_reload(ShellModuleEntry *module_entry); +void module_entry_scan(ShellModuleEntry *module_entry); +gchar *module_entry_function(ShellModuleEntry *module_entry); +const gchar *module_entry_get_note(ShellModuleEntry *module_entry); +gchar *module_entry_get_field(ShellModuleEntry * module_entry, gchar * field); +gchar *module_entry_get_moreinfo(ShellModuleEntry * module_entry, gchar * field); + +/* BinReloc stuff */ +gboolean binreloc_init(gboolean try_hardcoded); + +/* GTK UI stuff */ +gboolean ui_init(int *argc, char ***argv); +void parameters_init(int *argc, char ***argv, ProgramParameters *params); +extern ProgramParameters params; + +/* Module stuff */ +gchar *module_call_method(gchar *method); +gchar *module_call_method_param(gchar * method, gchar * parameter); + +/* Sysfs stuff */ +gfloat h_sysfs_read_float(gchar *endpoint, gchar *entry); +gint h_sysfs_read_int(gchar *endpoint, gchar *entry); +gchar *h_sysfs_read_string(gchar *endpoint, gchar *entry); + +#define SCAN_START() static gboolean scanned = FALSE; if (reload) scanned = FALSE; if (scanned) return; +#define SCAN_END() scanned = TRUE; + +#define _CONCAT(a,b) a ## b +#define CONCAT(a,b) _CONCAT(a,b) + +void moreinfo_init(void); +void moreinfo_shutdown(void); +void moreinfo_add_with_prefix(gchar *prefix, gchar *key, gchar *value); +void moreinfo_add(gchar *key, gchar *value); +void moreinfo_del_with_prefix(gchar *prefix); +void moreinfo_clear(void); +gchar *moreinfo_lookup_with_prefix(gchar *prefix, gchar *key); +gchar *moreinfo_lookup(gchar *key); + +#if !GLIB_CHECK_VERSION(2,44,0) + /* g_strv_contains() requires glib>2.44 + * fallback for older versions in hardinfo/util.c */ +gboolean g_strv_contains(const gchar * const * strv, const gchar *str); +#endif + +#endif /* __HARDINFO_H__ */ diff --git a/includes/help-viewer.h b/includes/help-viewer.h new file mode 100644 index 00000000..688ff325 --- /dev/null +++ b/includes/help-viewer.h @@ -0,0 +1,43 @@ +/* + * HelpViewer - Simple Help file browser + * Copyright (C) 2009 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __HELP_VIEWER_H__ +#define __HELP_VIEWER_H__ + +typedef struct _HelpViewer HelpViewer; + +struct _HelpViewer { + GtkWidget *window; + GtkWidget *status_bar; + + GtkWidget *btn_back, *btn_forward; + GtkWidget *text_view; + GtkWidget *text_search; + + gchar *current_file; + gchar *help_directory; + + GSList *back_stack, *forward_stack; +}; + +HelpViewer *help_viewer_new(const gchar *help_dir, const gchar *help_file); +void help_viewer_open_page(HelpViewer *help_viewer, const gchar *page); +void help_viewer_destroy(HelpViewer *help_viewer); + +#endif /* __HELP_VIEWER_H__ */ + diff --git a/includes/ia64/processor-platform.h b/includes/ia64/processor-platform.h new file mode 100644 index 00000000..1e30c5fc --- /dev/null +++ b/includes/ia64/processor-platform.h @@ -0,0 +1,29 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __PROCESSOR_PLATFORM_H__ +#define __PROCESSOR_PLATFORM_H__ + +struct _Processor { + gchar *model_name; + gchar *vendor_id; + gfloat bogomips, cpu_mhz; + gchar *strmodel; +}; + +#endif /* __PROCESSOR_PLATFORM_H__ */ diff --git a/includes/iconcache.h b/includes/iconcache.h new file mode 100644 index 00000000..97f59a82 --- /dev/null +++ b/includes/iconcache.h @@ -0,0 +1,30 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __ICONCACHE_H__ +#define __ICONCACHE_H__ + +#include + +void icon_cache_init(void); +GdkPixbuf *icon_cache_get_pixbuf(const gchar *file); +GtkWidget *icon_cache_get_image(const gchar *file); +GdkPixbuf *icon_cache_get_pixbuf_at_size(const gchar *file, gint wid, gint hei); +GtkWidget *icon_cache_get_image_at_size(const gchar *file, gint wid, gint hei); + +#endif /* __ICONCACHE_H__ */ diff --git a/includes/loadgraph.h b/includes/loadgraph.h new file mode 100644 index 00000000..1eae976f --- /dev/null +++ b/includes/loadgraph.h @@ -0,0 +1,75 @@ +/* + * Simple Load Graph + * Copyright (C) 2006 Leandro A. F. Pereira + * + * The Simple Load Graph is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License, version 2.1, as published by the Free Software Foundation. + * + * The Simple Load Graph is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with the Simple Load Graph; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA. + */ + + +#ifndef __LOADGRAPH_H__ +#define __LOADGRAPH_H__ + +#include +#include +#include +/*#include +#include +#define _(STRING) gettext(STRING) +#define N_(STRING) (STRING)*/ + + + +typedef struct _LoadGraph LoadGraph; + +typedef enum { + LG_COLOR_GREEN = 0x4FB05A, + LG_COLOR_BLUE = 0x4F58B0, + LG_COLOR_RED = 0xB04F4F +} LoadGraphColor; + +struct _LoadGraph { + GdkPixmap *buf; + GtkWidget *area; + + GdkGC *grid; + GdkGC *trace; + GdkGC *fill; + + gint *data; + gfloat scale; + + gint size; + gint width, height; + LoadGraphColor color; + + gint max_value, remax_count; + + PangoLayout *layout; + gchar *suffix; +}; + +LoadGraph *load_graph_new(gint size); +void load_graph_destroy(LoadGraph *lg); +void load_graph_configure_expose(LoadGraph *lg); +GtkWidget *load_graph_get_framed(LoadGraph *lg); + +void load_graph_update(LoadGraph *lg, gint value); +void load_graph_set_color(LoadGraph *lg, LoadGraphColor color); +void load_graph_clear(LoadGraph *lg); + +void load_graph_set_data_suffix(LoadGraph *lg, gchar *suffix); +gchar *load_graph_get_data_suffix(LoadGraph *lg); + +#endif /* __LOADGRAPH_H__ */ diff --git a/includes/m68k/processor-platform.h b/includes/m68k/processor-platform.h new file mode 100644 index 00000000..40bd2f96 --- /dev/null +++ b/includes/m68k/processor-platform.h @@ -0,0 +1,29 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __PROCESSOR_PLATFORM_H__ +#define __PROCESSOR_PLATFORM_H__ + +struct _Processor { + gchar *model_name; + gfloat bogomips, cpu_mhz; + + gchar *has_fpu; +}; + +#endif /* __PROCESSOR_PLATFORM_H__ */ diff --git a/includes/markdown-text-view.h b/includes/markdown-text-view.h new file mode 100644 index 00000000..648ea39c --- /dev/null +++ b/includes/markdown-text-view.h @@ -0,0 +1,70 @@ +/* + * Markdown Text View + * GtkTextView subclass that supports Markdown syntax + * + * Copyright (C) 2009 Leandro Pereira + * Portions Copyright (C) 2007-2008 Richard Hughes + * Portions Copyright (C) GTK+ Team (based on hypertext textview demo) + * + * Licensed under the GNU General Public License Version 2 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#ifndef __MARKDOWN_TEXTVIEW_H__ +#define __MARKDOWN_TEXTVIEW_H__ + +#include +#include "egg-markdown.h" + +G_BEGIN_DECLS +#define TYPE_MARKDOWN_TEXTVIEW (markdown_textview_get_type()) +#define MARKDOWN_TEXTVIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), TYPE_MARKDOWN_TEXTVIEW, MarkdownTextView)) +#define MARKDOWN_TEXTVIEW_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST((obj), MARKDOWN_TEXTVIEW, MarkdownTextViewClass)) +#define IS_MARKDOWN_TEXTVIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), TYPE_MARKDOWN_TEXTVIEW)) +#define IS_MARKDOWN_TEXTVIEW_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((obj), TYPE_MARKDOWN_TEXTVIEW)) +#define MARKDOWN_TEXTVIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TYPE_MARKDOWN_TEXTVIEW, MarkdownTextViewClass)) + +typedef struct _MarkdownTextView MarkdownTextView; +typedef struct _MarkdownTextViewClass MarkdownTextViewClass; + +struct _MarkdownTextView { + GtkTextView parent; + + EggMarkdown *markdown; + gboolean hovering_over_link; + gchar *image_directory; +}; + +struct _MarkdownTextViewClass { + GtkTextViewClass parent_class; + + void (*link_clicked) (MarkdownTextView *text_view, gchar *uri); + void (*hovering_over_link) (MarkdownTextView *text_view, gchar *uri); + void (*hovering_over_text) (MarkdownTextView *text_view); + void (*file_load_complete) (MarkdownTextView *text_view, gchar *file); +}; + +GtkWidget *markdown_textview_new(); +gboolean markdown_textview_load_file(MarkdownTextView * textview, + const gchar * file_name); +gboolean markdown_textview_set_text(MarkdownTextView * textview, + const gchar * text); +void markdown_textview_clear(MarkdownTextView * textview); +void markdown_textview_set_image_directory(MarkdownTextView * self, + const gchar * directory); +GType markdown_textview_get_type(); +G_END_DECLS + +#endif /* __MARKDOWN_TEXTVIEW_H__ */ diff --git a/includes/md5.h b/includes/md5.h new file mode 100644 index 00000000..1522170c --- /dev/null +++ b/includes/md5.h @@ -0,0 +1,26 @@ +/* See md5.c for explanation and copyright information. */ + +#ifndef MD5_H +#define MD5_H + +/* Unlike previous versions of this code, uint32 need not be exactly + 32 bits, merely 32 bits or more. Choosing a data type which is 32 + bits instead of 64 is not important; speed is considerably more + important. ANSI guarantees that "unsigned long" will be big enough, + and always using it seems to have few disadvantages. */ +typedef unsigned long uint32; + +struct MD5Context { + uint32 buf[4]; + uint32 bits[2]; + unsigned char in[64]; +}; + +void MD5Init (struct MD5Context *context); +void MD5Update (struct MD5Context *context, + unsigned char const *buf, unsigned len); +void MD5Final (unsigned char digest[16], + struct MD5Context *context); +void MD5Transform (uint32 buf[4], const unsigned char in[64]); + +#endif /* !MD5_H */ diff --git a/includes/menu.h b/includes/menu.h new file mode 100644 index 00000000..3c804008 --- /dev/null +++ b/includes/menu.h @@ -0,0 +1,26 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __MENU_H__ +#define __MENU_H__ + +#include + + +void menu_init(Shell *shell); + +#endif /* __MENU_H__ */ diff --git a/includes/mips/processor-platform.h b/includes/mips/processor-platform.h new file mode 100644 index 00000000..9bdae18b --- /dev/null +++ b/includes/mips/processor-platform.h @@ -0,0 +1,28 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __PROCESSOR_PLATFORM_H__ +#define __PROCESSOR_PLATFORM_H__ + +struct _Processor { + gchar *model_name; + gchar *vendor_id; + gfloat bogomips, cpu_mhz; +}; + +#endif /* __PROCESSOR_PLATFORM_H__ */ diff --git a/includes/network.h b/includes/network.h new file mode 100644 index 00000000..1e71126e --- /dev/null +++ b/includes/network.h @@ -0,0 +1,13 @@ +#ifndef __NETWORK_H__ +#define __NETWORK_H__ + +#include "hardinfo.h" + +extern gchar *smb_shares_list; +extern gchar *nfs_shares_list; +extern gchar *network_interfaces; +extern gchar *network_icons; + +void scan_net_interfaces(void); + +#endif /* __NETWORK_H__ */ \ No newline at end of file diff --git a/includes/nqueens.h b/includes/nqueens.h new file mode 100644 index 00000000..a4be93f0 --- /dev/null +++ b/includes/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/includes/parisc/processor-platform.h b/includes/parisc/processor-platform.h new file mode 100644 index 00000000..bfe8c45c --- /dev/null +++ b/includes/parisc/processor-platform.h @@ -0,0 +1,33 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __PROCESSOR_PLATFORM_H__ +#define __PROCESSOR_PLATFORM_H__ + +struct _Processor { + gchar *model_name; + gchar *vendor_id; + gchar *flags; + gfloat bogomips, cpu_mhz; + + gchar *has_fpu; + + gchar *strmodel; +}; + +#endif /* __PROCESSOR_PLATFORM_H__ */ diff --git a/includes/ppc/processor-platform.h b/includes/ppc/processor-platform.h new file mode 100644 index 00000000..90095750 --- /dev/null +++ b/includes/ppc/processor-platform.h @@ -0,0 +1,29 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __PROCESSOR_PLATFORM_H__ +#define __PROCESSOR_PLATFORM_H__ + +struct _Processor { + gchar *model_name; + gchar *vendor_id; + gint cache_size; + gfloat bogomips, cpu_mhz; +}; + +#endif /* __PROCESSOR_PLATFORM_H__ */ diff --git a/includes/remote.h b/includes/remote.h new file mode 100644 index 00000000..6a988a3b --- /dev/null +++ b/includes/remote.h @@ -0,0 +1,29 @@ +/* + * Remote Client + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __REMOTE_H__ +#define __REMOTE_H__ + +void remote_disconnect_all(gboolean ssh); +gboolean remote_connect_host(gchar * hostname); +void connect_dialog_show(GtkWidget * parent); +void host_manager_show(GtkWidget * parent); + +#endif /* __REMOTE_H__ */ + diff --git a/includes/report.h b/includes/report.h new file mode 100644 index 00000000..782621cb --- /dev/null +++ b/includes/report.h @@ -0,0 +1,93 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __REPORT_H__ +#define __REPORT_H__ +#include +#include + +typedef enum { + REPORT_FORMAT_HTML, + REPORT_FORMAT_TEXT, + N_REPORT_FORMAT +} ReportFormat; + +typedef enum { + REPORT_COL_PROGRESS = 1<<0, + REPORT_COL_VALUE = 1<<1, + REPORT_COL_EXTRA1 = 1<<2, + REPORT_COL_EXTRA2 = 1<<3, + REPORT_COL_TEXTVALUE= 1<<4 +} ReportColumn; + +typedef struct _ReportDialog ReportDialog; +typedef struct _ReportContext ReportContext; + +struct _ReportContext { + ShellModuleEntry *entry; + gchar *output; + + void (*header) (ReportContext *ctx); + void (*footer) (ReportContext *ctx); + void (*title) (ReportContext *ctx, gchar *text); + void (*subtitle) (ReportContext *ctx, gchar *text); + void (*subsubtitle) (ReportContext *ctx, gchar *text); + void (*keyvalue) (ReportContext *ctx, gchar *key, gchar *value); + + ReportFormat format; + + gboolean is_image_enabled; + gboolean first_table; + + gboolean show_column_headers; + guint columns; + GHashTable *column_titles; +}; + +struct _ReportDialog { + GtkWidget *dialog; + GtkWidget *filechooser; + GtkWidget *btn_cancel; + GtkWidget *btn_generate; + GtkWidget *btn_sel_all; + GtkWidget *btn_sel_none; + GtkWidget *treeview; + + GtkTreeModel *model; +}; + +void report_dialog_show(); + +ReportContext *report_context_html_new(); +ReportContext *report_context_text_new(); + +void report_header (ReportContext *ctx); +void report_footer (ReportContext *ctx); +void report_title (ReportContext *ctx, gchar *text); +void report_subtitle (ReportContext *ctx, gchar *text); +void report_subsubtitle (ReportContext *ctx, gchar *text); +void report_key_value (ReportContext *ctx, gchar *key, gchar *value); +void report_table (ReportContext *ctx, gchar *text); + +void report_create_from_module_list(ReportContext *ctx, GSList *modules); +gchar *report_create_from_module_list_format(GSList *modules, ReportFormat format); + +void report_context_free(ReportContext *ctx); +void report_module_list_free(GSList *modules); + +#endif /* __REPORT_H__ */ diff --git a/includes/s390/processor-platform.h b/includes/s390/processor-platform.h new file mode 100644 index 00000000..511fae6b --- /dev/null +++ b/includes/s390/processor-platform.h @@ -0,0 +1,28 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __PROCESSOR_PLATFORM_H__ +#define __PROCESSOR_PLATFORM_H__ + +struct _Processor { + gchar *vendor_id, *model_name; + gint cache_size; + gfloat bogomips, cpu_mhz; +}; + +#endif /* __PROCESSOR_PLATFORM_H__ */ diff --git a/includes/sh/processor-platform.h b/includes/sh/processor-platform.h new file mode 100644 index 00000000..9bdae18b --- /dev/null +++ b/includes/sh/processor-platform.h @@ -0,0 +1,28 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __PROCESSOR_PLATFORM_H__ +#define __PROCESSOR_PLATFORM_H__ + +struct _Processor { + gchar *model_name; + gchar *vendor_id; + gfloat bogomips, cpu_mhz; +}; + +#endif /* __PROCESSOR_PLATFORM_H__ */ diff --git a/includes/sha1.h b/includes/sha1.h new file mode 100644 index 00000000..573ff8ac --- /dev/null +++ b/includes/sha1.h @@ -0,0 +1,30 @@ +/* + * SHA-1 in C + * By Steve Reid + * 100% Public Domain + */ + +#ifndef __SHA1_H__ +#define __SHA1_H__ + +#include + +#ifndef LITTLE_ENDIAN +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define LITTLE_ENDIAN /* This should be #define'd if true. */ +#endif /* G_BYTE_ORDER */ +#endif /* LITTLE_ENDIAN */ + + +typedef struct { + guint32 state[5]; + guint32 count[2]; + guchar buffer[64]; +} SHA1_CTX; + +void SHA1Transform(guint32 state[5], guchar buffer[64]); +void SHA1Init(SHA1_CTX* context); +void SHA1Update(SHA1_CTX* context, guchar* data, unsigned int len); +void SHA1Final(guchar digest[20], SHA1_CTX* context); + +#endif /* __SHA1_H__ */ diff --git a/includes/shell.h b/includes/shell.h new file mode 100644 index 00000000..2eb9e6d2 --- /dev/null +++ b/includes/shell.h @@ -0,0 +1,225 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __SHELL_H__ +#define __SHELL_H__ + +#include + +#include "loadgraph.h" +#include "help-viewer.h" + +typedef struct _Shell Shell; +typedef struct _ShellTree ShellTree; +typedef struct _ShellInfoTree ShellInfoTree; +typedef struct _ShellNote ShellNote; +typedef struct _ShellSummary ShellSummary; + +typedef struct _ShellModule ShellModule; +typedef struct _ShellModuleMethod ShellModuleMethod; +typedef struct _ShellModuleEntry ShellModuleEntry; + +typedef struct _ShellFieldUpdate ShellFieldUpdate; +typedef struct _ShellFieldUpdateSource ShellFieldUpdateSource; + +typedef enum { + SHELL_ORDER_DESCENDING, + SHELL_ORDER_ASCENDING, +} ShellOrderType; + +typedef enum { + SHELL_PACK_RESIZE = 1 << 0, + SHELL_PACK_SHRINK = 1 << 1 +} ShellPackOptions; + +typedef enum { + SHELL_VIEW_NORMAL, + SHELL_VIEW_DUAL, + SHELL_VIEW_LOAD_GRAPH, + SHELL_VIEW_PROGRESS, + SHELL_VIEW_PROGRESS_DUAL, + SHELL_VIEW_SUMMARY, + SHELL_VIEW_N_VIEWS +} ShellViewType; + +typedef enum { + TREE_COL_PBUF, + TREE_COL_NAME, + TREE_COL_MODULE_ENTRY, + TREE_COL_MODULE, + TREE_COL_SEL, + TREE_NCOL +} ShellTreeColumns; + +typedef enum { + INFO_TREE_COL_NAME, + INFO_TREE_COL_VALUE, + INFO_TREE_COL_DATA, + INFO_TREE_COL_PBUF, + INFO_TREE_COL_PROGRESS, + INFO_TREE_COL_EXTRA1, + INFO_TREE_COL_EXTRA2, + INFO_TREE_NCOL +} ShellInfoTreeColumns; + +struct _Shell { + GtkWidget *window, *vbox; + GtkWidget *status, *progress; + GtkWidget *remote_label; + GtkWidget *notebook; + GtkWidget *hpaned, *vpaned; + + ShellTree *tree; + ShellInfoTree *info, *moreinfo; + ShellModule *selected_module; + ShellModuleEntry *selected; + ShellNote *note; + ShellSummary *summary; + LoadGraph *loadgraph; + + GtkActionGroup *action_group; + GtkUIManager *ui_manager; + GSList *merge_ids; + + ShellViewType view_type; + gboolean normalize_percentage; + + gint _pulses; + ShellOrderType _order_type; + + GKeyFile *hosts; + HelpViewer *help_viewer; +}; + +struct _ShellSummary { + GtkWidget *header; + GtkWidget *scroll; + GtkWidget *view; + + GSList *items; +}; + +struct _ShellTree { + GtkWidget *scroll; + GtkWidget *view; + GtkTreeModel *model; + GtkTreeSelection *selection; + + GSList *modules; +}; + +struct _ShellInfoTree { + GtkWidget *scroll; + GtkWidget *view; + GtkTreeModel *model; + GtkTreeSelection *selection; + + GtkTreeViewColumn *col_progress, *col_value, *col_extra1, *col_extra2, *col_textvalue; +}; + +struct _ShellNote { + GtkWidget *event_box; + GtkWidget *label; +}; + +struct _ShellModule { + gchar *name; + GdkPixbuf *icon; + GModule *dll; + + gpointer (*aboutfunc) (); + gchar *(*summaryfunc) (); + void (*deinit) (); + + guchar weight; + + GSList *entries; +}; + +struct _ShellModuleMethod { + gchar *name; + gpointer function; +}; + +struct _ShellModuleEntry { + gchar *name; + GdkPixbuf *icon; + gchar *icon_file; + gboolean selected; + gint number; + guint32 flags; + + gchar *(*func) (); + void (*scan_func) (); + + gchar *(*fieldfunc) (gchar * entry); + gchar *(*morefunc) (gchar * entry); + gchar *(*notefunc) (gint entry); +}; + +struct _ShellFieldUpdate { + ShellModuleEntry *entry; + gchar *field_name; +}; + +struct _ShellFieldUpdateSource { + guint source_id; + ShellFieldUpdate *sfu; +}; + +void shell_init(GSList *modules); +void shell_do_reload(void); + +Shell *shell_get_main_shell(); + +void shell_action_set_enabled(const gchar *action_name, + gboolean setting); +gboolean shell_action_get_enabled(const gchar *action_name); +gboolean shell_action_get_active(const gchar *action_name); +void shell_action_set_active(const gchar *action_name, + gboolean setting); +void shell_action_set_property(const gchar *action_name, + const gchar *property, + gboolean setting); + +void shell_set_side_pane_visible(gboolean setting); +void shell_set_note_from_entry(ShellModuleEntry *entry); +void shell_ui_manager_set_visible(const gchar *path, + gboolean setting); + +void shell_status_update(const gchar *message); +void shell_status_pulse(void); +void shell_status_set_percentage(gint percentage); +void shell_status_set_enabled(gboolean setting); + +void shell_view_set_enabled(gboolean setting); + +void shell_clear_timeouts(Shell *shell); +void shell_clear_tree_models(Shell *shell); +void shell_clear_field_updates(void); +void shell_set_title(Shell *shell, char *subtitle); + +void shell_add_modules_to_gui(gpointer _shell_module, gpointer _shell_tree); + +void shell_save_hosts_file(void); +void shell_update_remote_menu(void); + +void shell_set_remote_label(Shell *shell, gchar *label); + +#endif /* __SHELL_H__ */ + + diff --git a/includes/socket.h b/includes/socket.h new file mode 100644 index 00000000..7c44837e --- /dev/null +++ b/includes/socket.h @@ -0,0 +1,36 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __HI_SOCKET_H__ +#define __HI_SOCKET_H__ + +typedef struct _Socket Socket; + +struct _Socket { + gint sock; +}; + +Socket *sock_connect(gchar * host, gint port); +int sock_write(Socket * s, gchar * str); +int sock_read(Socket * s, gchar * buffer, gint size); +void sock_close(Socket * s); + +int sock_ready_to_read(Socket *s); +int sock_ready_to_write(Socket *s); + +#endif /* __HI_SOCKET_H__ */ diff --git a/includes/sparc/processor-platform.h b/includes/sparc/processor-platform.h new file mode 100644 index 00000000..bcf4c782 --- /dev/null +++ b/includes/sparc/processor-platform.h @@ -0,0 +1,28 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __PROCESSOR_PLATFORM_H__ +#define __PROCESSOR_PLATFORM_H__ + +struct _Processor { + gchar *model_name; + gchar *has_fpu; + gfloat cpu_mhz; +}; + +#endif /* __PROCESSOR_PLATFORM_H__ */ diff --git a/includes/ssh-conn.h b/includes/ssh-conn.h new file mode 100644 index 00000000..b1b0a9ca --- /dev/null +++ b/includes/ssh-conn.h @@ -0,0 +1,66 @@ +/* + Remote Client + HardInfo - Displays System Information + Copyright (C) 2003-2009 Leandro A. F. Pereira + + Based on ssh-method.c from GnomeVFS + Copyright (C) 1999 Free Software Foundation + Original author: Ian McKellar + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ +#ifndef __SSH_CONN_H__ +#define __SSH_CONN_H__ + +#include "config.h" +#ifdef HAS_LIBSOUP +#include + +typedef struct _SSHConn SSHConn; + +typedef enum { + SSH_CONN_OK, + SSH_CONN_NO_URI, + SSH_CONN_UNKNOWN_PROTOCOL, + SSH_CONN_UNKNOWN_ERROR, + SSH_CONN_CANNOT_SPAWN_SSH, + SSH_CONN_BAD_PARAMS, + SSH_CONN_PERMISSION_DENIED, + SSH_CONN_HOST_KEY_CHECK_FAIL, + SSH_CONN_REFUSED, + SSH_CONN_INVALID_USER_PASS, +} SSHConnResponse; + +struct _SSHConn { + SoupURI *uri; + int fd_read, fd_write, fd_error; + GPid pid; + gchar *askpass_path; + + gint exit_status; +}; + +SSHConnResponse ssh_new(SoupURI * uri, + SSHConn ** conn_return, gchar * command); +void ssh_close(SSHConn * conn); + +int ssh_write(SSHConn * conn, + gconstpointer buffer, gint num_bytes, gint * bytes_written); +int ssh_read(gint fd, gpointer buffer, gint num_bytes, gint * bytes_read); + +const char *ssh_conn_errors[10]; +#endif /* HAS_LIBSOUP */ +#endif /* __SSH_CONN_H__ */ diff --git a/includes/stock.h b/includes/stock.h new file mode 100644 index 00000000..706e5c51 --- /dev/null +++ b/includes/stock.h @@ -0,0 +1,34 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __STOCK_H__ +#define __STOCK_H__ + +#define HI_STOCK_REPORT "hi-stock-report" +#define HI_STOCK_INTERNET "hi-stock-internet" +#define HI_STOCK_MODULE "hi-stock-module" +#define HI_STOCK_ABOUT_MODULES "hi-stock-about-modules" +#define HI_STOCK_SYNC_MENU "hi-stock-sync-menu" +#define HI_STOCK_DONATE "hi-stock-donate" +#define HI_STOCK_SERVER "hi-stock-server" + +void stock_icons_init(void); +void stock_icon_register(gchar *filename, gchar *stock_id); +void stock_icon_register_pixbuf(GdkPixbuf *pixbuf, gchar *stock_id); + +#endif /* __STOCK_H__ */ diff --git a/includes/syncmanager.h b/includes/syncmanager.h new file mode 100644 index 00000000..ae0ed267 --- /dev/null +++ b/includes/syncmanager.h @@ -0,0 +1,42 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __SYNCMANAGER_H__ +#define __SYNCMANAGER_H__ + +#include + +typedef struct _SyncEntry SyncEntry; + +struct _SyncEntry { + gchar *name; + gchar *fancy_name; + gchar *save_to; + + gchar *(*get_data)(void); + void (*callback)(SyncEntry *entry, const gchar *response); + + gboolean selected; +}; + +void sync_manager_add_entry(SyncEntry *entry); +void sync_manager_clear_entries(void); +void sync_manager_show(GtkWidget *parent); +gint sync_manager_count_entries(void); + +#endif /* __SYNCMANAGER_H__ */ diff --git a/includes/test-utils.h b/includes/test-utils.h new file mode 100644 index 00000000..21cac6b5 --- /dev/null +++ b/includes/test-utils.h @@ -0,0 +1,24 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "libsoup/soup-types.h" + +void test_init (int argc, char **argv, GOptionEntry *entries); +void test_cleanup (void); + +extern int debug_level, errors; +extern gboolean expect_warning; +void debug_printf (int level, const char *format, ...) G_GNUC_PRINTF (2, 3); + +#ifdef HAVE_APACHE +void apache_init (void); +void apache_cleanup (void); +#endif + +SoupSession *soup_test_session_new (GType type, ...); +void soup_test_session_abort_unref (SoupSession *session); + +SoupServer *soup_test_server_new (gboolean in_own_thread); +SoupServer *soup_test_server_new_ssl (gboolean in_own_thread); + diff --git a/includes/uidefs.h b/includes/uidefs.h new file mode 100644 index 00000000..3bb1c88f --- /dev/null +++ b/includes/uidefs.h @@ -0,0 +1,63 @@ +#ifndef __UIDEFS_H__ +#define __UIDEFS_H__ + +#include "config.h" + +#if RELEASE +#define DEBUG_TOOLBAR_ITEMS +#else /* !RELEASE */ +#define DEBUG_TOOLBAR_ITEMS "" \ + "" +#endif /* !RELEASE */ + +#ifdef HAS_LIBSOUP +#define SYNC_MANAGER_ITEMS " " \ +" " + +#else /* !HAS_LIBSOUP */ +#define SYNC_MANAGER_ITEMS +#endif /* !HAS_LIBSOUP */ + +char *uidefs_str = "" \ +" " \ +" " \ +" " \ +" " \ +SYNC_MANAGER_ITEMS +/* + * Save Image is not ready for prime time. Yet. + * "" \ + */ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" "\ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +" " \ +DEBUG_TOOLBAR_ITEMS \ +" " \ +" " \ +""; + +#endif /* __UIDEFS_H__ */ diff --git a/includes/vendor.h b/includes/vendor.h new file mode 100644 index 00000000..778e2ea3 --- /dev/null +++ b/includes/vendor.h @@ -0,0 +1,33 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __VENDOR_H__ +#define __VENDOR_H__ + +typedef struct _Vendor Vendor; +struct _Vendor { + char *id; + char *name; + char *url; +}; + +void vendor_init(void); +const gchar *vendor_get_name(const gchar *id); +const gchar *vendor_get_url(const gchar *id); + +#endif /* __VENDOR_H__ */ diff --git a/includes/x86/processor-platform.h b/includes/x86/processor-platform.h new file mode 100644 index 00000000..bc27b620 --- /dev/null +++ b/includes/x86/processor-platform.h @@ -0,0 +1,56 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __PROCESSOR_PLATFORM_H__ +#define __PROCESSOR_PLATFORM_H__ + +typedef struct _ProcessorCache ProcessorCache; + +struct _ProcessorCache { + gint level; + gint number_of_sets; + gint physical_line_partition; + gint size; + gchar *type; + gint ways_of_associativity; +}; + +struct _Processor { + gchar *model_name; + gchar *vendor_id; + gchar *flags; + gchar *bugs; + gchar *pm; /* power management features */ + gint cache_size; + gfloat bogomips; + + gfloat cpu_mhz; /* for devices.c, identical to cpukhz_max/1000 */ + gint cpukhz_max, cpukhz_min, cpukhz_cur; /* for arm/processor.c */ + + gchar *has_fpu; + gchar *bug_fdiv, *bug_hlt, *bug_f00f, *bug_coma; + + gint model, family, stepping; + gchar *strmodel; + + gint id; + + GSList *cache; +}; + +#endif /* __PROCESSOR_PLATFORM_H__ */ diff --git a/includes/x86_64 b/includes/x86_64 new file mode 120000 index 00000000..de1ff735 --- /dev/null +++ b/includes/x86_64 @@ -0,0 +1 @@ +./x86 \ No newline at end of file diff --git a/includes/xmlrpc-client.h b/includes/xmlrpc-client.h new file mode 100644 index 00000000..32fad08c --- /dev/null +++ b/includes/xmlrpc-client.h @@ -0,0 +1,43 @@ +/* + * XMLRPC Client + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __XMLRPC_CLIENT_H__ +#define __XMLRPC_CLIENT_H__ + +#include "config.h" + +#ifdef HAS_LIBSOUP +#include + +void xmlrpc_init(void); +gint xmlrpc_get_integer(gchar *addr, + gchar *method, + const gchar *param_types, + ...); +gchar *xmlrpc_get_string(gchar *addr, + gchar *method, + const gchar *param_types, + ...); +GValueArray *xmlrpc_get_array(gchar *addr, + gchar *method, + const gchar *param_types, + ...); +#endif /* HAS_LIBSOUP */ + +#endif /* __XMLRPC_CLIENT_H__ */ diff --git a/includes/xmlrpc-server.h b/includes/xmlrpc-server.h new file mode 100644 index 00000000..e608b711 --- /dev/null +++ b/includes/xmlrpc-server.h @@ -0,0 +1,25 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XMLRPC_SERVER_H__ +#define __XMLRPC_SERVER_H__ + +void xmlrpc_server_start(GMainLoop *main_loop); +void xmlrpc_server_init(void); + +#endif /* __XMLRPC_SERVER_H__ */ + diff --git a/loadgraph.c b/loadgraph.c deleted file mode 100644 index c8503072..00000000 --- a/loadgraph.c +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Simple Load Graph - * Version 0.1 - Wed, Jan 11 2006 - * - initial release - * Version 0.1.1 - Fri, Jan 13 2006 - * - fixes autoscaling - * - add color - * - * Copyright (C) 2006 Leandro A. F. Pereira - * - * The Simple Load Graph is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License, version 2.1, as published by the Free Software Foundation. - * - * The Simple Load Graph is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the Simple Load Graph; if not, write to the Free - * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - * 02111-1307 USA. - */ - -#include "loadgraph.h" - -static void _draw(LoadGraph * lg); - -LoadGraph *load_graph_new(gint size) -{ - LoadGraph *lg; - - lg = g_new0(LoadGraph, 1); - - size++; - - lg->suffix = g_strdup(""); - lg->area = gtk_drawing_area_new(); - lg->size = (size * 3) / 2; - lg->data = g_new0(gint, lg->size); - - lg->scale = 1.0; - - lg->width = size * 6; - lg->height = size * 2; - - lg->max_value = 1; - lg->remax_count = 0; - - lg->layout = pango_layout_new(gtk_widget_get_pango_context(lg->area)); - - gtk_widget_set_size_request(lg->area, lg->width, lg->height); - gtk_widget_show(lg->area); - - return lg; -} - -void load_graph_set_data_suffix(LoadGraph * lg, gchar * suffix) -{ - g_free(lg->suffix); - lg->suffix = g_strdup(suffix); -} - -gchar *load_graph_get_data_suffix(LoadGraph * lg) -{ - return lg->suffix; -} - -GtkWidget *load_graph_get_framed(LoadGraph * lg) -{ - GtkWidget *align, *frame; - - align = gtk_alignment_new(0.5, 0.5, 0, 0); - gtk_widget_show(align); - - frame = gtk_frame_new(NULL); - gtk_widget_show(frame); - gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); - - gtk_container_add(GTK_CONTAINER(align), frame); - gtk_container_add(GTK_CONTAINER(frame), lg->area); - - return align; -} - -void load_graph_clear(LoadGraph * lg) -{ - gint i; - - for (i = 0; i < lg->size; i++) - lg->data[i] = 0; - - lg->scale = 1.0; - lg->max_value = 1; - lg->remax_count = 0; - - _draw(lg); -} - -void load_graph_set_color(LoadGraph * lg, LoadGraphColor color) -{ - lg->color = color; - gdk_rgb_gc_set_foreground(lg->trace, lg->color); - gdk_rgb_gc_set_foreground(lg->fill, lg->color - 0x303030); - gdk_rgb_gc_set_foreground(lg->grid, lg->color - 0xcdcdcd); -} - -void load_graph_destroy(LoadGraph * lg) -{ - g_free(lg->data); - gtk_widget_destroy(lg->area); - gdk_pixmap_unref(lg->buf); - g_object_unref(lg->trace); - g_object_unref(lg->grid); - g_object_unref(lg->fill); - g_object_unref(lg->layout); - g_free(lg); -} - -static gboolean _expose(GtkWidget * widget, GdkEventExpose * event, - gpointer user_data) -{ - LoadGraph *lg = (LoadGraph *) user_data; - GdkDrawable *draw = GDK_DRAWABLE(lg->buf); - - gdk_draw_drawable(lg->area->window, - lg->area->style->black_gc, - draw, 0, 0, 0, 0, lg->width, lg->height); - return FALSE; -} - -void load_graph_configure_expose(LoadGraph * lg) -{ - /* creates the backing store pixmap */ - gtk_widget_realize(lg->area); - lg->buf = gdk_pixmap_new(lg->area->window, lg->width, lg->height, -1); - - /* create the graphic contexts */ - lg->grid = gdk_gc_new(GDK_DRAWABLE(lg->buf)); - lg->trace = gdk_gc_new(GDK_DRAWABLE(lg->buf)); - lg->fill = gdk_gc_new(GDK_DRAWABLE(lg->buf)); - - /* the default color is green */ - load_graph_set_color(lg, LG_COLOR_GREEN); - - /* init graphic contexts */ - gdk_gc_set_line_attributes(lg->grid, - 1, GDK_LINE_ON_OFF_DASH, - GDK_CAP_NOT_LAST, GDK_JOIN_ROUND); - gdk_gc_set_dashes(lg->grid, 0, (gint8*)"\2\2", 2); - -#if 0 /* old-style grid */ - gdk_rgb_gc_set_foreground(lg->grid, 0x707070); -#endif - - gdk_gc_set_line_attributes(lg->trace, - 1, GDK_LINE_SOLID, - GDK_CAP_PROJECTING, GDK_JOIN_ROUND); - -#if 0 /* old-style fill */ - gdk_gc_set_line_attributes(lg->fill, - 1, GDK_LINE_SOLID, - GDK_CAP_BUTT, GDK_JOIN_BEVEL); -#endif - - /* configures the expose event */ - g_signal_connect(G_OBJECT(lg->area), "expose-event", - (GCallback) _expose, lg); -} - -static void _draw_label_and_line(LoadGraph * lg, gint position, gint value) -{ - gchar *tmp; - - /* draw lines */ - if (position > 0) - gdk_draw_line(GDK_DRAWABLE(lg->buf), lg->grid, 0, position, - lg->width, position); - else - position = -1 * position; - - /* draw label */ - tmp = - g_strdup_printf("%d%s", value, - lg->suffix); - - pango_layout_set_markup(lg->layout, tmp, -1); - pango_layout_set_width(lg->layout, - lg->area->allocation.width * PANGO_SCALE); - gdk_draw_layout(GDK_DRAWABLE(lg->buf), lg->trace, 2, position, - lg->layout); - - g_free(tmp); -} - -static void _draw(LoadGraph * lg) -{ - GdkDrawable *draw = GDK_DRAWABLE(lg->buf); - gint i, d; - - /* clears the drawing area */ - gdk_draw_rectangle(draw, lg->area->style->black_gc, - TRUE, 0, 0, lg->width, lg->height); - - - /* the graph */ - GdkPoint *points = g_new0(GdkPoint, lg->size + 1); - - for (i = 0; i < lg->size; i++) { - points[i].x = i * 4; - points[i].y = lg->height - lg->data[i] * lg->scale; - } - - points[0].x = points[1].x = 0; - points[0].y = points[i].y = lg->height; - points[i].x = points[i - 1].x = lg->width; - - gdk_draw_polygon(draw, lg->fill, TRUE, points, lg->size + 1); - gdk_draw_polygon(draw, lg->trace, FALSE, points, lg->size + 1); - - g_free(points); - - /* vertical bars */ - for (i = lg->width, d = 0; i > 1; i--, d++) - if ((d % 45) == 0 && d) - gdk_draw_line(draw, lg->grid, i, 0, i, lg->height); - - /* horizontal bars and labels; 25%, 50% and 75% */ - _draw_label_and_line(lg, -1, lg->max_value); - _draw_label_and_line(lg, lg->height / 4, 3 * (lg->max_value / 4)); - _draw_label_and_line(lg, lg->height / 2, lg->max_value / 2); - _draw_label_and_line(lg, 3 * (lg->height / 4), lg->max_value / 4); - -#if 0 /* old-style drawing */ - for (i = 0; i < lg->size; i++) { - gint this = lg->height - lg->data[i] * lg->scale; - gint next = lg->height - lg->data[i + 1] * lg->scale; - gint i4 = i * 4; - - gdk_draw_line(draw, lg->fill, i4, this, i4, lg->height); - gdk_draw_line(draw, lg->fill, i4 + 2, this, i4 + 2, lg->height); - } - - for (i = 0; i < lg->size; i++) { - gint this = lg->height - lg->data[i] * lg->scale; - gint next = lg->height - lg->data[i + 1] * lg->scale; - gint i4 = i * 4; - - gdk_draw_line(draw, lg->trace, i4, this, i4 + 2, - (this + next) / 2); - gdk_draw_line(draw, lg->trace, i4 + 2, (this + next) / 2, - i4 + 4, next); - } -#endif - - gtk_widget_queue_draw(lg->area); -} - -void load_graph_update(LoadGraph * lg, gint value) -{ - gint i; - - if (value < 0) - return; - - /* shift-right our data */ - for (i = 0; i < lg->size; i++) { - lg->data[i] = lg->data[i + 1]; - } - - /* insert the updated value */ - lg->data[i] = value; - - /* calculates the maximum value */ - if (lg->remax_count++ > 20) { - /* only finds the maximum amongst the data every 20 times */ - lg->remax_count = 0; - - gint max = lg->data[0]; - for (i = 1; i < lg->size; i++) { - if (lg->data[i] > max) - max = lg->data[i]; - } - - lg->max_value = max; - } else { - /* otherwise, select the maximum between the current maximum - and the supplied value */ - lg->max_value = MAX(value, lg->max_value); - } - - /* recalculates the scale; always use 90% of it */ - lg->scale = 0.90 * ((gfloat) lg->height / (gfloat) lg->max_value); - - /* redraw */ - _draw(lg); -} - -#ifdef LOADGRAPH_UNIT_TEST -gboolean lg_update(gpointer d) -{ - LoadGraph *lg = (LoadGraph *) d; - - static int i = 0; - static int j = 1; - - if (i > 150) { - j = -1; - } else if (i < 0) { - j = 1; - } - - i += j; - if (rand() % 10 > 8) - i *= 2; - if (rand() % 10 < 2) - i /= 2; - load_graph_update(lg, i + rand() % 50); - - return TRUE; -} - -int main(int argc, char **argv) -{ - LoadGraph *lg; - GtkWidget *window; - - gtk_init(&argc, &argv); - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_widget_show(window); - - lg = load_graph_new(50); - gtk_container_add(GTK_CONTAINER(window), load_graph_get_framed(lg)); - gtk_container_set_border_width(GTK_CONTAINER(window), 20); - load_graph_configure_expose(lg); - - lg_update(lg); - - g_timeout_add(100, lg_update, lg); - - gtk_main(); - - return 0; -} -#endif diff --git a/loadgraph.h b/loadgraph.h deleted file mode 100644 index 3a53f793..00000000 --- a/loadgraph.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Simple Load Graph - * Copyright (C) 2006 Leandro A. F. Pereira - * - * The Simple Load Graph is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License, version 2.1, as published by the Free Software Foundation. - * - * The Simple Load Graph is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the Simple Load Graph; if not, write to the Free - * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - * 02111-1307 USA. - */ - - -#ifndef __LOADGRAPH_H__ -#define __LOADGRAPH_H__ - -#include -#include -#include - -typedef struct _LoadGraph LoadGraph; - -typedef enum { - LG_COLOR_GREEN = 0x4FB05A, - LG_COLOR_BLUE = 0x4F58B0, - LG_COLOR_RED = 0xB04F4F -} LoadGraphColor; - -struct _LoadGraph { - GdkPixmap *buf; - GtkWidget *area; - - GdkGC *grid; - GdkGC *trace; - GdkGC *fill; - - gint *data; - gfloat scale; - - gint size; - gint width, height; - LoadGraphColor color; - - gint max_value, remax_count; - - PangoLayout *layout; - gchar *suffix; -}; - -LoadGraph *load_graph_new(gint size); -void load_graph_destroy(LoadGraph *lg); -void load_graph_configure_expose(LoadGraph *lg); -GtkWidget *load_graph_get_framed(LoadGraph *lg); - -void load_graph_update(LoadGraph *lg, gint value); -void load_graph_set_color(LoadGraph *lg, LoadGraphColor color); -void load_graph_clear(LoadGraph *lg); - -void load_graph_set_data_suffix(LoadGraph *lg, gchar *suffix); -gchar *load_graph_get_data_suffix(LoadGraph *lg); - -#endif /* __LOADGRAPH_H__ */ diff --git a/md5.c b/md5.c deleted file mode 100644 index 70f39c45..00000000 --- a/md5.c +++ /dev/null @@ -1,317 +0,0 @@ -/* - * This code implements the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to MD5Init, call MD5Update as - * needed on buffers full of bytes, and then call MD5Final, which - * will fill a supplied 16-byte array with the digest. - */ - -/* This code was modified in 1997 by Jim Kingdon of Cyclic Software to - not require an integer type which is exactly 32 bits. This work - draws on the changes for the same purpose by Tatu Ylonen - as part of SSH, but since I didn't actually use - that code, there is no copyright issue. I hereby disclaim - copyright in any changes I have made; this code remains in the - public domain. */ - -#include /* for memcpy() and memset() */ - -/* Add prototype support. */ -#ifndef PROTO -#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__) -#define PROTO(ARGS) ARGS -#else -#define PROTO(ARGS) () -#endif -#endif - -#include "md5.h" - -#if defined(__OPTIMIZE__) -#error You must compile this program without "-O". (Or else the benchmark results may be different!) -#endif - -/* Little-endian byte-swapping routines. Note that these do not - depend on the size of datatypes such as uint32, nor do they require - us to detect the endianness of the machine we are running on. It - is possible they should be macros for speed, but I would be - surprised if they were a performance bottleneck for MD5. */ - -static uint32 getu32(addr) -const unsigned char *addr; -{ - return (((((unsigned long) addr[3] << 8) | addr[2]) << 8) - | addr[1]) << 8 | addr[0]; -} - -static void putu32(data, addr) -uint32 data; -unsigned char *addr; -{ - addr[0] = (unsigned char) data; - addr[1] = (unsigned char) (data >> 8); - addr[2] = (unsigned char) (data >> 16); - addr[3] = (unsigned char) (data >> 24); -} - -/* - * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious - * initialization constants. - */ -void MD5Init(ctx) -struct MD5Context *ctx; -{ - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; - - ctx->bits[0] = 0; - ctx->bits[1] = 0; -} - -/* - * Update context to reflect the concatenation of another buffer full - * of bytes. - */ -void MD5Update(ctx, buf, len) -struct MD5Context *ctx; -unsigned char const *buf; -unsigned len; -{ - uint32 t; - - /* Update bitcount */ - - t = ctx->bits[0]; - if ((ctx->bits[0] = (t + ((uint32) len << 3)) & 0xffffffff) < t) - ctx->bits[1]++; /* Carry from low to high */ - ctx->bits[1] += len >> 29; - - t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ - - /* Handle any leading odd-sized chunks */ - - if (t) { - unsigned char *p = ctx->in + t; - - t = 64 - t; - if (len < t) { - memcpy(p, buf, len); - return; - } - memcpy(p, buf, t); - MD5Transform(ctx->buf, ctx->in); - buf += t; - len -= t; - } - - /* Process data in 64-byte chunks */ - - while (len >= 64) { - memcpy(ctx->in, buf, 64); - MD5Transform(ctx->buf, ctx->in); - buf += 64; - len -= 64; - } - - /* Handle any remaining bytes of data. */ - - memcpy(ctx->in, buf, len); -} - -/* - * Final wrapup - pad to 64-byte boundary with the bit pattern - * 1 0* (64-bit count of bits processed, MSB-first) - */ -void MD5Final(digest, ctx) -unsigned char digest[16]; -struct MD5Context *ctx; -{ - unsigned count; - unsigned char *p; - - /* Compute number of bytes mod 64 */ - count = (ctx->bits[0] >> 3) & 0x3F; - - /* Set the first char of padding to 0x80. This is safe since there is - always at least one byte free */ - p = ctx->in + count; - *p++ = 0x80; - - /* Bytes of padding needed to make 64 bytes */ - count = 64 - 1 - count; - - /* Pad out to 56 mod 64 */ - if (count < 8) { - /* Two lots of padding: Pad the first block to 64 bytes */ - memset(p, 0, count); - MD5Transform(ctx->buf, ctx->in); - - /* Now fill the next block with 56 bytes */ - memset(ctx->in, 0, 56); - } else { - /* Pad block to 56 bytes */ - memset(p, 0, count - 8); - } - - /* Append length in bits and transform */ - putu32(ctx->bits[0], ctx->in + 56); - putu32(ctx->bits[1], ctx->in + 60); - - MD5Transform(ctx->buf, ctx->in); - putu32(ctx->buf[0], digest); - putu32(ctx->buf[1], digest + 4); - putu32(ctx->buf[2], digest + 8); - putu32(ctx->buf[3], digest + 12); - memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ -} - -#ifndef ASM_MD5 - -/* The four core functions - F1 is optimized somewhat */ - -/* #define F1(x, y, z) (x & y | ~x & z) */ -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -/* This is the central step in the MD5 algorithm. */ -#define MD5STEP(f, w, x, y, z, data, s) \ - ( w += f(x, y, z) + data, w &= 0xffffffff, w = w<>(32-s), w += x ) - -/* - * The core of the MD5 algorithm, this alters an existing MD5 hash to - * reflect the addition of 16 longwords of new data. MD5Update blocks - * the data and converts bytes into longwords for this routine. - */ -void MD5Transform(buf, inraw) -uint32 buf[4]; -const unsigned char inraw[64]; -{ - register uint32 a, b, c, d; - uint32 in[16]; - int i; - - for (i = 0; i < 16; ++i) - in[i] = getu32(inraw + 4 * i); - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} -#endif - -#ifdef TEST -/* Simple test program. Can use it to manually run the tests from - RFC1321 for example. */ -#include - -int main(int argc, char **argv) -{ - struct MD5Context context; - unsigned char checksum[16]; - int i; - int j; - - if (argc < 2) { - fprintf(stderr, "usage: %s string-to-hash\n", argv[0]); - exit(1); - } - for (j = 1; j < argc; ++j) { - printf("MD5 (\"%s\") = ", argv[j]); - MD5Init(&context); - MD5Update(&context, argv[j], strlen(argv[j])); - MD5Final(checksum, &context); - for (i = 0; i < 16; i++) { - printf("%02x", (unsigned int) checksum[i]); - } - printf("\n"); - } - return 0; -} -#endif /* TEST */ diff --git a/md5.h b/md5.h deleted file mode 100644 index 1522170c..00000000 --- a/md5.h +++ /dev/null @@ -1,26 +0,0 @@ -/* See md5.c for explanation and copyright information. */ - -#ifndef MD5_H -#define MD5_H - -/* Unlike previous versions of this code, uint32 need not be exactly - 32 bits, merely 32 bits or more. Choosing a data type which is 32 - bits instead of 64 is not important; speed is considerably more - important. ANSI guarantees that "unsigned long" will be big enough, - and always using it seems to have few disadvantages. */ -typedef unsigned long uint32; - -struct MD5Context { - uint32 buf[4]; - uint32 bits[2]; - unsigned char in[64]; -}; - -void MD5Init (struct MD5Context *context); -void MD5Update (struct MD5Context *context, - unsigned char const *buf, unsigned len); -void MD5Final (unsigned char digest[16], - struct MD5Context *context); -void MD5Transform (uint32 buf[4], const unsigned char in[64]); - -#endif /* !MD5_H */ diff --git a/menu.c b/menu.c deleted file mode 100644 index 63601c39..00000000 --- a/menu.c +++ /dev/null @@ -1,182 +0,0 @@ -/* - * HardInfo - * Copyright(C) 2003-2007 Leandro A. F. Pereira. - * - * menu.c is based on UI Manager tutorial by Ryan McDougall - * Copyright(C) 2005 Ryan McDougall. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include -#include -#include - -#include - -#include -#include - -#include "uidefs.h" - -static GtkActionEntry entries[] = { - {"InformationMenuAction", NULL, "_Information"}, /* name, stock id, label */ - {"ViewMenuAction", NULL, "_View"}, - {"HelpMenuAction", NULL, "_Help"}, - {"HelpMenuModulesAction", HI_STOCK_ABOUT_MODULES, "About _Modules"}, - {"MainMenuBarAction", NULL, ""}, - - {"ReportAction", HI_STOCK_REPORT, /* name, stock id */ - "Generate _Report", "R", /* label, accelerator */ - NULL, /* tooltip */ - G_CALLBACK(cb_generate_report)}, - - {"SyncManagerAction", HI_STOCK_SYNC_MENU, - "_Network Updater...", NULL, - NULL, - G_CALLBACK(cb_sync_manager)}, - - {"OpenAction", GTK_STOCK_OPEN, - "_Open...", NULL, - NULL, - G_CALLBACK(cb_sync_manager)}, - - {"ConnectToAction", GTK_STOCK_CONNECT, - "_Connect to...", NULL, - NULL, - G_CALLBACK(cb_sync_manager)}, - - {"CopyAction", GTK_STOCK_COPY, - "_Copy to Clipboard", "C", - NULL, - G_CALLBACK(cb_copy_to_clipboard)}, - - {"SaveGraphAction", GTK_STOCK_SAVE_AS, - "_Save image as...", "S", - NULL, - G_CALLBACK(cb_save_graphic)}, - - {"RefreshAction", GTK_STOCK_REFRESH, - "_Refresh", "F5", - NULL, - G_CALLBACK(cb_refresh)}, - - {"OnlineDocsAction", GTK_STOCK_HELP, - "Contents (online)", "F1", - NULL, - G_CALLBACK(cb_open_online_docs)}, - - {"HomePageAction", HI_STOCK_INTERNET, - "_Open HardInfo Web Site", NULL, - NULL, - G_CALLBACK(cb_open_web_page)}, - - {"ReportBugAction", HI_STOCK_INTERNET, - "_Report bug", NULL, - NULL, - G_CALLBACK(cb_report_bug)}, - - {"DonateAction", HI_STOCK_DONATE, - "_Donate to the project", NULL, - NULL, - G_CALLBACK(cb_donate)}, - - {"AboutAction", GTK_STOCK_ABOUT, - "_About HardInfo", NULL, - "Displays program version information", - G_CALLBACK(cb_about)}, - - {"QuitAction", GTK_STOCK_QUIT, - "_Quit", "Q", - NULL, - G_CALLBACK(cb_quit)} -}; - -static GtkToggleActionEntry toggle_entries[] = { - {"SidePaneAction", NULL, - "_Side Pane", NULL, - "Toggles side pane visibility", - G_CALLBACK(cb_side_pane)}, - {"ToolbarAction", NULL, - "_Toolbar", NULL, - NULL, - G_CALLBACK(cb_toolbar)}, -}; - -/* Implement a handler for GtkUIManager's "add_widget" signal. The UI manager - * will emit this signal whenever it needs you to place a new widget it has. */ -static void -menu_add_widget(GtkUIManager * ui, GtkWidget * widget, - GtkContainer * container) -{ - gtk_box_pack_start(GTK_BOX(container), widget, FALSE, FALSE, 0); - gtk_widget_show(widget); -} - -void menu_init(Shell * shell) -{ - GtkWidget *menu_box; /* Packing box for the menu and toolbars */ - GtkActionGroup *action_group; /* Packing group for our Actions */ - GtkUIManager *menu_manager; /* The magic widget! */ - GError *error; /* For reporting exceptions or errors */ - GtkAccelGroup *accel_group; - - /* Create our objects */ - menu_box = shell->vbox; - action_group = gtk_action_group_new("HardInfo"); - menu_manager = gtk_ui_manager_new(); - - shell->action_group = action_group; - shell->ui_manager = menu_manager; - - /* Pack up our objects: - * menu_box -> window - * actions -> action_group - * action_group -> menu_manager */ - gtk_action_group_add_actions(action_group, entries, - G_N_ELEMENTS(entries), NULL); - gtk_action_group_add_toggle_actions(action_group, toggle_entries, - G_N_ELEMENTS(toggle_entries), - NULL); - gtk_ui_manager_insert_action_group(menu_manager, action_group, 0); - - /* Read in the UI from our XML file */ - error = NULL; - gtk_ui_manager_add_ui_from_string(menu_manager, uidefs_str, -1, - &error); - - if (error) { - g_error("Building menus failed: %s", error->message); - g_error_free(error); - return; - } - - /* Enable menu accelerators */ - accel_group = gtk_ui_manager_get_accel_group(menu_manager); - gtk_window_add_accel_group(GTK_WINDOW(shell->window), accel_group); - - /* Connect up important signals */ - /* This signal is necessary in order to place widgets from the UI manager - * into the menu_box */ - g_signal_connect(menu_manager, "add_widget", - G_CALLBACK(menu_add_widget), menu_box); - - /* Show the window and run the main loop, we're done! */ - gtk_widget_show(menu_box); - - gtk_toolbar_set_style(GTK_TOOLBAR - (gtk_ui_manager_get_widget - (shell->ui_manager, "/MainMenuBarAction")), - GTK_TOOLBAR_BOTH_HORIZ); -} diff --git a/menu.h b/menu.h deleted file mode 100644 index 361b2323..00000000 --- a/menu.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __MENU_H__ -#define __MENU_H__ - -#include - -void menu_init(Shell *shell); - -#endif /* __MENU_H__ */ diff --git a/modules/benchmark.c b/modules/benchmark.c new file mode 100644 index 00000000..94997df8 --- /dev/null +++ b/modules/benchmark.c @@ -0,0 +1,663 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include "benchmark.h" + +void scan_fft(gboolean reload); +void scan_raytr(gboolean reload); +void scan_bfsh(gboolean reload); +void scan_cryptohash(gboolean reload); +void scan_fib(gboolean reload); +void scan_nqueens(gboolean reload); +void scan_gui(gboolean reload); + +gchar *callback_fft(); +gchar *callback_raytr(); +gchar *callback_bfsh(); +gchar *callback_fib(); +gchar *callback_cryptohash(); +gchar *callback_nqueens(); +gchar *callback_gui(); + +static ModuleEntry entries[] = { + {N_("CPU Blowfish"), "blowfish.png", callback_bfsh, scan_bfsh, MODULE_FLAG_NONE}, + {N_("CPU CryptoHash"), "cryptohash.png", callback_cryptohash, scan_cryptohash, MODULE_FLAG_NONE}, + {N_("CPU Fibonacci"), "nautilus.png", callback_fib, scan_fib, MODULE_FLAG_NONE}, + {N_("CPU N-Queens"), "nqueens.png", callback_nqueens, scan_nqueens, MODULE_FLAG_NONE}, + {N_("FPU FFT"), "fft.png", callback_fft, scan_fft, MODULE_FLAG_NONE}, + {N_("FPU Raytracing"), "raytrace.png", callback_raytr, scan_raytr, MODULE_FLAG_NONE}, + {N_("GPU Drawing"), "module.png", callback_gui, scan_gui, MODULE_FLAG_NO_REMOTE}, + {NULL} +}; + +static gboolean sending_benchmark_results = FALSE; + +typedef struct _ParallelBenchTask ParallelBenchTask; + +struct _ParallelBenchTask { + gint thread_number; + guint start, end; + gpointer data, callback; +}; + +static gpointer benchmark_parallel_for_dispatcher(gpointer data) +{ + ParallelBenchTask *pbt = (ParallelBenchTask *)data; + gpointer (*callback)(unsigned int start, unsigned int end, void *data, gint thread_number); + gpointer return_value = NULL; + + if ((callback = pbt->callback)) { + DEBUG("this is thread %p; items %d -> %d, data %p", g_thread_self(), + pbt->start, pbt->end, pbt->data); + return_value = callback(pbt->start, pbt->end, pbt->data, pbt->thread_number); + DEBUG("this is thread %p; return value is %p", g_thread_self(), return_value); + } else { + DEBUG("this is thread %p; callback is NULL and it should't be!", g_thread_self()); + } + + g_free(pbt); + + return return_value; +} + +gdouble benchmark_parallel_for(guint start, guint end, + gpointer callback, gpointer callback_data) { + gchar *temp; + guint n_cores, iter_per_core, iter, thread_number = 0; + 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 (n_cores > 0) { + 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->thread_number = thread_number++; + pbt->start = iter == 0 ? 0 : iter; + pbt->end = iter + iter_per_core - 1; + pbt->data = callback_data; + pbt->callback = callback; + + if (pbt->end > end) + pbt->end = end; + + thread = g_thread_new("dispatcher", + (GThreadFunc)benchmark_parallel_for_dispatcher, pbt); + threads = g_slist_prepend(threads, thread); + + DEBUG("thread %d launched as context %p", thread_number, thread); + } + + DEBUG("waiting for all threads to finish"); + for (t = threads; t; t = t->next) { + DEBUG("waiting for thread with context %p", t->data); + 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 *clean_cpuname(gchar *cpuname) +{ + gchar *ret = NULL, *tmp; + gchar *remove[] = { + "(R)", "(r)", "(TM)", "(tm)", "Processor", + "Technology", "processor", "CPU", + "cpu", "Genuine", "Authentic", NULL + }; + gint i; + + ret = g_strdup(cpuname); + for (i = 0; remove[i]; i++) { + tmp = strreplace(ret, remove[i], ""); + g_free(ret); + ret = tmp; + } + + ret = strend(ret, '@'); + ret = g_strstrip(ret); + + tmp = g_strdup(ret); + g_free(ret); + + return tmp; +} + +static gchar *__benchmark_include_results(gdouble result, + const gchar * benchmark, + ShellOrderType order_type) +{ + GKeyFile *conf; + gchar **machines; + gchar *path, *results = g_strdup(""), *return_value, *processor_frequency; + int i; + + conf = g_key_file_new(); + + path = g_build_filename(g_get_home_dir(), ".hardinfo", "benchmark.conf", NULL); + if (!g_file_test(path, G_FILE_TEST_EXISTS)) { + DEBUG("local benchmark.conf not found, trying system-wide"); + g_free(path); + path = g_build_filename(params.path_data, "benchmark.conf", NULL); + } + + g_key_file_load_from_file(conf, path, 0, NULL); + + machines = g_key_file_get_keys(conf, benchmark, NULL, NULL); + for (i = 0; machines && machines[i]; i++) { + gchar *value, *cleaned_machine; + + value = g_key_file_get_value(conf, benchmark, machines[i], NULL); + cleaned_machine = clean_cpuname(machines[i]); + results = h_strconcat(results, cleaned_machine, "=", value, "\n", NULL); + + g_free(value); + g_free(cleaned_machine); + } + + g_strfreev(machines); + g_free(path); + g_key_file_free(conf); + + if (result > 0.0f) { + processor_frequency = module_call_method("devices::getProcessorFrequency"); + return_value = g_strdup_printf(_("[$ShellParam$]\n" + "Zebra=1\n" + "OrderType=%d\n" + "ViewType=3\n" + "ColumnTitle$Extra1=CPU Clock\n" + "ColumnTitle$Progress=Results\n" + "ColumnTitle$TextValue=CPU\n" + "ShowColumnHeaders=true\n" + "[%s]\n" + "This Machine=%.3f|%s MHz\n" + "%s"), order_type, benchmark, result, processor_frequency, results); + g_free(processor_frequency); + } else { + 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" + "%s"), order_type, benchmark, results); + } + return return_value; +} + + + +static gchar *benchmark_include_results_reverse(gdouble result, + const gchar * benchmark) +{ + return __benchmark_include_results(result, benchmark, + SHELL_ORDER_DESCENDING); +} + +static gchar *benchmark_include_results(gdouble result, + const gchar * benchmark) +{ + return __benchmark_include_results(result, benchmark, + SHELL_ORDER_ASCENDING); +} + +gdouble bench_results[BENCHMARK_N_ENTRIES]; + +gchar *callback_gui() +{ + return benchmark_include_results_reverse(bench_results[BENCHMARK_GUI], + "GPU Drawing"); +} + +gchar *callback_fft() +{ + return benchmark_include_results(bench_results[BENCHMARK_FFT], + "FPU FFT"); +} + +gchar *callback_nqueens() +{ + return benchmark_include_results(bench_results[BENCHMARK_NQUEENS], + "CPU N-Queens"); +} + +gchar *callback_raytr() +{ + return benchmark_include_results(bench_results[BENCHMARK_RAYTRACE], + "FPU Raytracing"); +} + +gchar *callback_bfsh() +{ + return benchmark_include_results(bench_results[BENCHMARK_BLOWFISH], + "CPU Blowfish"); +} + +gchar *callback_cryptohash() +{ + return benchmark_include_results_reverse(bench_results[BENCHMARK_CRYPTOHASH], + "CPU CryptoHash"); +} + +gchar *callback_fib() +{ + return benchmark_include_results(bench_results[BENCHMARK_FIB], + "CPU Fibonacci"); +} + +typedef struct _BenchmarkDialog BenchmarkDialog; +struct _BenchmarkDialog { + GtkWidget *dialog; + double result; +}; + +static gboolean do_benchmark_handler(GIOChannel *source, + GIOCondition condition, + gpointer data) +{ + BenchmarkDialog *bench_dialog = (BenchmarkDialog*)data; + GIOStatus status; + gchar *result; + gchar *buffer; + float float_result; + + status = g_io_channel_read_line(source, &result, NULL, NULL, NULL); + if (status != G_IO_STATUS_NORMAL) { + DEBUG("error while reading benchmark result"); + + bench_dialog->result = -1.0f; + gtk_widget_destroy(bench_dialog->dialog); + return FALSE; + } + + float_result = strtof(result, &buffer); + if (buffer == result) { + DEBUG("error while converting floating point value"); + bench_dialog->result = -1.0f; + } else { + bench_dialog->result = float_result; + } + + gtk_widget_destroy(bench_dialog->dialog); + g_free(result); + + return FALSE; +} + +static void do_benchmark(void (*benchmark_function)(void), int entry) +{ + int old_priority = 0; + + if (params.gui_running && !sending_benchmark_results) { + gchar *argv[] = { params.argv0, "-b", entries[entry].name, + "-m", "benchmark.so", "-a", NULL }; + GPid bench_pid; + gint bench_stdout; + GtkWidget *bench_dialog; + GtkWidget *bench_image; + BenchmarkDialog *benchmark_dialog; + GSpawnFlags spawn_flags = G_SPAWN_STDERR_TO_DEV_NULL; + gchar *bench_status; + + bench_status = g_strdup_printf(_("Benchmarking: %s."), entries[entry].name); + + shell_view_set_enabled(FALSE); + shell_status_update(bench_status); + + g_free(bench_status); + + bench_image = icon_cache_get_image("benchmark.png"); + gtk_widget_show(bench_image); + + bench_dialog = gtk_message_dialog_new(GTK_WINDOW(shell_get_main_shell()->window), + GTK_DIALOG_MODAL, + GTK_MESSAGE_INFO, + GTK_BUTTONS_NONE, + _("Benchmarking. Please do not move your mouse " \ + "or press any keys.")); + g_object_set_data(G_OBJECT(bench_dialog), "result", "0.0"); + gtk_dialog_add_buttons(GTK_DIALOG(bench_dialog), + _("Cancel"), GTK_RESPONSE_ACCEPT, NULL); + gtk_message_dialog_set_image(GTK_MESSAGE_DIALOG(bench_dialog), bench_image); + + while (gtk_events_pending()) { + gtk_main_iteration(); + } + + benchmark_dialog = g_new0(BenchmarkDialog, 1); + benchmark_dialog->dialog = bench_dialog; + benchmark_dialog->result = -1.0f; + + if (!g_path_is_absolute(params.argv0)) { + spawn_flags |= G_SPAWN_SEARCH_PATH; + } + + if (g_spawn_async_with_pipes(NULL, + argv, NULL, + spawn_flags, + NULL, NULL, + &bench_pid, + NULL, &bench_stdout, NULL, + NULL)) { + GIOChannel *channel; + guint watch_id; + + DEBUG("spawning benchmark; pid=%d", bench_pid); + + channel = g_io_channel_unix_new(bench_stdout); + watch_id = g_io_add_watch(channel, G_IO_IN, do_benchmark_handler, + benchmark_dialog); + + switch (gtk_dialog_run(GTK_DIALOG(bench_dialog))) { + case GTK_RESPONSE_NONE: + DEBUG("benchmark finished"); + break; + case GTK_RESPONSE_ACCEPT: + DEBUG("cancelling benchmark"); + + gtk_widget_destroy(bench_dialog); + g_source_remove(watch_id); + kill(bench_pid, SIGINT); + } + + bench_results[entry] = benchmark_dialog->result; + + g_io_channel_unref(channel); + shell_view_set_enabled(TRUE); + shell_status_set_enabled(TRUE); + g_free(benchmark_dialog); + + shell_status_update(_("Done.")); + + return; + } + + gtk_widget_destroy(bench_dialog); + g_free(benchmark_dialog); + shell_status_set_enabled(TRUE); + shell_status_update(_("Done.")); + } + + setpriority(PRIO_PROCESS, 0, -20); + benchmark_function(); + setpriority(PRIO_PROCESS, 0, old_priority); +} + +void scan_gui(gboolean reload) +{ + SCAN_START(); + + if (params.run_benchmark) { + int argc = 0; + + ui_init(&argc, NULL); + } + + if (params.gui_running || params.run_benchmark) { + do_benchmark(benchmark_gui, BENCHMARK_GUI); + } else { + bench_results[BENCHMARK_GUI] = 0.0f; + } + SCAN_END(); +} + +void scan_fft(gboolean reload) +{ + SCAN_START(); + do_benchmark(benchmark_fft, BENCHMARK_FFT); + SCAN_END(); +} + +void scan_nqueens(gboolean reload) +{ + SCAN_START(); + do_benchmark(benchmark_nqueens, BENCHMARK_NQUEENS); + SCAN_END(); +} + +void scan_raytr(gboolean reload) +{ + SCAN_START(); + do_benchmark(benchmark_raytrace, BENCHMARK_RAYTRACE); + SCAN_END(); +} + +void scan_bfsh(gboolean reload) +{ + SCAN_START(); + do_benchmark(benchmark_fish, BENCHMARK_BLOWFISH); + SCAN_END(); +} + +void scan_cryptohash(gboolean reload) +{ + SCAN_START(); + do_benchmark(benchmark_cryptohash, BENCHMARK_CRYPTOHASH); + SCAN_END(); +} + +void scan_fib(gboolean reload) +{ + SCAN_START(); + do_benchmark(benchmark_fib, BENCHMARK_FIB); + SCAN_END(); +} + +const gchar *hi_note_func(gint entry) +{ + switch (entry) { + case BENCHMARK_CRYPTOHASH: + return _("Results in MiB/second. Higher is better."); + + case BENCHMARK_GUI: + return _("Results in HIMarks. Higher is better."); + + case BENCHMARK_FFT: + case BENCHMARK_RAYTRACE: + case BENCHMARK_BLOWFISH: + case BENCHMARK_FIB: + case BENCHMARK_NQUEENS: + return _("Results in seconds. Lower is better."); + } + + return NULL; +} + +gchar *hi_module_get_name(void) +{ + return g_strdup(_("Benchmarks")); +} + +guchar hi_module_get_weight(void) +{ + return 240; +} + +ModuleEntry *hi_module_get_entries(void) +{ + return entries; +} + +ModuleAbout *hi_module_get_about(void) +{ + static ModuleAbout ma[] = { + { + .author = "Leandro A. F. Pereira", + .description = N_("Perform tasks and compare with other systems"), + .version = VERSION, + .license = "GNU GPL version 2"} + }; + + return ma; +} + +static gchar *get_benchmark_results() +{ + gint i; + void (*scan_callback) (gboolean rescan); + + sending_benchmark_results = TRUE; + + gchar *machine = module_call_method("devices::getProcessorName"); + gchar *machineclock = module_call_method("devices::getProcessorFrequency"); + gchar *machineram = module_call_method("devices::getMemoryTotal"); + gchar *result = g_strdup_printf("[param]\n" + "machine=%s\n" + "machineclock=%s\n" + "machineram=%s\n" + "nbenchmarks=%zu\n", + machine, + machineclock, + machineram, + G_N_ELEMENTS(entries) - 1); + for (i = 0; i < G_N_ELEMENTS(entries); i++) { + scan_callback = entries[i].scan_callback; + if (!scan_callback) + continue; + + if (bench_results[i] < 0.0) { + /* benchmark was cancelled */ + scan_callback(TRUE); + } else { + scan_callback(FALSE); + } + + result = h_strdup_cprintf("[bench%d]\n" + "name=%s\n" + "value=%f\n", + result, + i, entries[i].name, bench_results[i]); + } + + g_free(machine); + g_free(machineclock); + g_free(machineram); + + sending_benchmark_results = FALSE; + + return result; +} + +static gchar *run_benchmark(gchar *name) +{ + int i; + + DEBUG("name = %s", name); + + for (i = 0; entries[i].name; i++) { + if (g_str_equal(entries[i].name, name)) { + void (*scan_callback)(gboolean rescan); + + if ((scan_callback = entries[i].scan_callback)) { + scan_callback(FALSE); + + return g_strdup_printf("%f", bench_results[i]); + } + } + } + + return NULL; +} + +ShellModuleMethod *hi_exported_methods(void) +{ + static ShellModuleMethod m[] = { + {"runBenchmark", run_benchmark}, + {NULL} + }; + + return m; +} + +void hi_module_init(void) +{ + static SyncEntry se[] = { + { + .fancy_name = N_("Send benchmark results"), + .name = "SendBenchmarkResults", + .save_to = NULL, + .get_data = get_benchmark_results}, + { + .fancy_name = N_("Receive benchmark results"), + .name = "RecvBenchmarkResults", + .save_to = "benchmark.conf", + .get_data = NULL} + }; + + sync_manager_add_entry(&se[0]); + sync_manager_add_entry(&se[1]); + + int i; + for (i = 0; i < G_N_ELEMENTS(entries) - 1; i++) { + bench_results[i] = -1.0f; + } +} + +gchar **hi_module_get_dependencies(void) +{ + static gchar *deps[] = { "devices.so", NULL }; + + return deps; +} + diff --git a/modules/benchmark/blowfish.c b/modules/benchmark/blowfish.c new file mode 100644 index 00000000..feadc430 --- /dev/null +++ b/modules/benchmark/blowfish.c @@ -0,0 +1,533 @@ +/* +blowfish.c: C implementation of the Blowfish algorithm. + +Copyright (C) 1997 by Paul Kocher + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + + +COMMENTS ON USING THIS CODE: + +Normal usage is as follows: + [1] Allocate a BLOWFISH_CTX. (It may be too big for the stack.) + [2] Call Blowfish_Init with a pointer to your BLOWFISH_CTX, a pointer to + the key, and the number of bytes in the key. + [3] To encrypt a 64-bit block, call Blowfish_Encrypt with a pointer to + BLOWFISH_CTX, a pointer to the 32-bit left half of the plaintext + and a pointer to the 32-bit right half. The plaintext will be + overwritten with the ciphertext. + [4] Decryption is the same as encryption except that the plaintext and + ciphertext are reversed. + +Warning #1: The code does not check key lengths. (Caveat encryptor.) +Warning #2: Beware that Blowfish keys repeat such that "ab" = "abab". +Warning #3: It is normally a good idea to zeroize the BLOWFISH_CTX before + freeing it. +Warning #4: Endianness conversions are the responsibility of the caller. + (To encrypt bytes on a little-endian platforms, you'll probably want + to swap bytes around instead of just casting.) +Warning #5: Make sure to use a reasonable mode of operation for your + application. (If you don't know what CBC mode is, see Warning #7.) +Warning #6: This code is susceptible to timing attacks. +Warning #7: Security engineering is risky and non-intuitive. Have someone + check your work. If you don't know what you are doing, get help. + + +This is code is fast enough for most applications, but is not optimized for +speed. + +If you require this code under a license other than LGPL, please ask. (I +can be located using your favorite search engine.) Unfortunately, I do not +have time to provide unpaid support for everyone who uses this code. + + -- Paul Kocher +*/ + +#include "hardinfo.h" +#include "benchmark.h" +#include "blowfish.h" + +#define N 16 +static const unsigned long ORIG_P[16 + 2] = + { 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L, 0xA4093822L, + 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L, 0x452821E6L, 0x38D01377L, + 0xBE5466CFL, 0x34E90C6CL, 0xC0AC29B7L, + 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L, 0x9216D5D9L, 0x8979FB1BL +}; + +static const unsigned long ORIG_S[4][256] = { + {0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L, 0xB8E1AFEDL, + 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L, 0x24A19947L, 0xB3916CF7L, + 0x0801F2E2L, 0x858EFC16L, 0x636920D8L, 0x71574E69L, 0xA458FEA3L, + 0xF4933D7EL, 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL, + 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L, 0xC5D1B023L, + 0x286085F0L, 0xCA417918L, 0xB8DB38EFL, 0x8E79DCB0L, 0x603A180EL, + 0x6C9E0E8BL, 0xB01E8A3EL, 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, + 0x55605C60L, 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L, + 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL, 0xA15486AFL, + 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL, 0x2BA9C55DL, 0x741831F6L, + 0xCE5C3E16L, 0x9B87931EL, 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, + 0x28958677L, 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L, + 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L, 0xEF845D5DL, + 0xE98575B1L, 0xDC262302L, 0xEB651B88L, 0x23893E81L, 0xD396ACC5L, + 0x0F6D6FF3L, 0x83F44239L, 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, + 0x9E1F9B5EL, 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L, + 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L, 0x6EEF0B6CL, + 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L, 0xA1F1651DL, 0x39AF0176L, + 0x66CA593EL, 0x82430E88L, 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, + 0x3B8B5EBEL, 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L, + 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL, 0x37D0D724L, + 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL, 0x075372C9L, 0x80991B7BL, + 0x25D479D8L, 0xF6E8DEF7L, 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, + 0x04C006BAL, 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L, + 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL, 0x6DFC511FL, + 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L, 0xBEE3D004L, 0xDE334AFDL, + 0x660F2807L, 0x192E4BB3L, 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, + 0xB9D3FBDBL, 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L, + 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L, 0x3C7516DFL, + 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL, 0x323DB5FAL, 0xFD238760L, + 0x53317B48L, 0x3E00DF82L, 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, + 0xDF1769DBL, 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L, + 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L, 0x10FA3D98L, + 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL, 0x9A53E479L, 0xB6F84565L, + 0xD28E49BCL, 0x4BFB9790L, 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, + 0xCEE4C6E8L, 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L, + 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L, 0xD08ED1D0L, + 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L, 0x8FF6E2FBL, 0xF2122B64L, + 0x8888B812L, 0x900DF01CL, 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, + 0xB3A8C1ADL, 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L, + 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L, 0xB4A84FE0L, + 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L, 0x165FA266L, 0x80957705L, + 0x93CC7314L, 0x211A1477L, 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, + 0xFB9D35CFL, 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L, + 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL, 0x2464369BL, + 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL, 0x78C14389L, 0xD95A537FL, + 0x207D5BA2L, 0x02E5B9C5L, 0x83260376L, 0x6295CFA9L, 0x11C81968L, + 0x4E734A41L, 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L, + 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L, 0x08BA6FB5L, + 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L, 0xB6636521L, 0xE7B9F9B6L, + 0xFF34052EL, 0xC5855664L, 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, + 0x6E85076AL}, {0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, + 0xC4192623L, 0xAD6EA6B0L, 0x49A7DF7DL, + 0x9CEE60B8L, 0x8FEDB266L, 0xECAA8C71L, + 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L, + 0x193602A5L, 0x75094C29L, 0xA0591340L, + 0xE4183A3EL, 0x3F54989AL, 0x5B429D65L, + 0x6B8FE4D6L, 0x99F73FD6L, 0xA1D29C07L, + 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L, + 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, + 0x021ECC5EL, 0x09686B3FL, 0x3EBAEFC9L, + 0x3C971814L, 0x6B6A70A1L, 0x687F3584L, + 0x52A0E286L, 0xB79C5305L, 0xAA500737L, + 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, + 0x5716F2B8L, 0xB03ADA37L, 0xF0500C0DL, + 0xF01C1F04L, 0x0200B3FFL, 0xAE0CF51AL, + 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL, + 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, + 0x22F54701L, 0x3AE5E581L, 0x37C2DADCL, + 0xC8B57634L, 0x9AF3DDA7L, 0xA9446146L, + 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L, + 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, + 0x183EB331L, 0x4E548B38L, 0x4F6DB908L, + 0x6F420D03L, 0xF60A04BFL, 0x2CB81290L, + 0x24977C79L, 0x5679B072L, 0xBCAF89AFL, + 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, + 0xDCCF3F2EL, 0x5512721FL, 0x2E6B7124L, + 0x501ADDE6L, 0x9F84CD87L, 0x7A584718L, + 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL, + 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, + 0xC464C3D2L, 0xEF1C1847L, 0x3215D908L, + 0xDD433B37L, 0x24C2BA16L, 0x12A14D43L, + 0x2A65C451L, 0x50940002L, 0x133AE4DDL, + 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, + 0x5F11199BL, 0x043556F1L, 0xD7A3C76BL, + 0x3C11183BL, 0x5924A509L, 0xF28FE6EDL, + 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL, + 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, + 0x5A3E2AB3L, 0x771FE71CL, 0x4E3D06FAL, + 0x2965DCB9L, 0x99E71D0FL, 0x803E89D6L, + 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL, + 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, + 0x1E0A2DF4L, 0xF2F74EA7L, 0x361D2B3DL, + 0x1939260FL, 0x19C27960L, 0x5223A708L, + 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L, + 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, + 0x018CFF28L, 0xC332DDEFL, 0xBE6C5AA5L, + 0x65582185L, 0x68AB9802L, 0xEECEA50FL, + 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L, + 0x1521B628L, 0x29076170L, 0xECDD4775L, + 0x619F1510L, 0x13CCA830L, 0xEB61BD96L, + 0x0334FE1EL, 0xAA0363CFL, 0xB5735C90L, + 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L, + 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, + 0xB2F3846EL, 0x648B1EAFL, 0x19BDF0CAL, + 0xA02369B9L, 0x655ABB50L, 0x40685A32L, + 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L, + 0x9B540B19L, 0x875FA099L, 0x95F7997EL, + 0x623D7DA8L, 0xF837889AL, 0x97E32D77L, + 0x11ED935FL, 0x16681281L, 0x0E358829L, + 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L, + 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, + 0x1AC24696L, 0xCDB30AEBL, 0x532E3054L, + 0x8FD948E4L, 0x6DBC3128L, 0x58EBF2EFL, + 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L, + 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, + 0x203E13E0L, 0x45EEE2B6L, 0xA3AAABEAL, + 0xDB6C4F15L, 0xFACB4FD0L, 0xC742F442L, + 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L, + 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, + 0x3D816250L, 0xCF62A1F2L, 0x5B8D2646L, + 0xFC8883A0L, 0xC1C7B6A3L, 0x7F1524C3L, + 0x69CB7492L, 0x47848A0BL, 0x5692B285L, + 0x095BBF00L, 0xAD19489DL, 0x1462B174L, + 0x23820E00L, 0x58428D2AL, 0x0C55F5EAL, + 0x1DADF43EL, 0x233F7061L, 0x3372F092L, + 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL, + 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, + 0xCE77326EL, 0xA6078084L, 0x19F8509EL, + 0xE8EFD855L, 0x61D99735L, 0xA969A7AAL, + 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL, + 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, + 0x0E1E9EC9L, 0xDB73DBD3L, 0x105588CDL, + 0x675FDA79L, 0xE3674340L, 0xC5C43465L, + 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L, + 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, + 0xDB83ADF7L}, {0xE93D5A68L, 0x948140F7L, + 0xF64C261CL, 0x94692934L, + 0x411520F7L, 0x7602D4F7L, + 0xBCF46B2EL, 0xD4A20068L, + 0xD4082471L, 0x3320F46AL, + 0x43B7D4B7L, 0x500061AFL, + 0x1E39F62EL, 0x97244546L, + 0x14214F74L, 0xBF8B8840L, + 0x4D95FC1DL, 0x96B591AFL, + 0x70F4DDD3L, 0x66A02F45L, + 0xBFBC09ECL, 0x03BD9785L, + 0x7FAC6DD0L, 0x31CB8504L, + 0x96EB27B3L, 0x55FD3941L, + 0xDA2547E6L, 0xABCA0A9AL, + 0x28507825L, 0x530429F4L, + 0x0A2C86DAL, 0xE9B66DFBL, + 0x68DC1462L, 0xD7486900L, + 0x680EC0A4L, 0x27A18DEEL, + 0x4F3FFEA2L, 0xE887AD8CL, + 0xB58CE006L, 0x7AF4D6B6L, + 0xAACE1E7CL, 0xD3375FECL, + 0xCE78A399L, 0x406B2A42L, + 0x20FE9E35L, 0xD9F385B9L, + 0xEE39D7ABL, 0x3B124E8BL, + 0x1DC9FAF7L, 0x4B6D1856L, + 0x26A36631L, 0xEAE397B2L, + 0x3A6EFA74L, 0xDD5B4332L, + 0x6841E7F7L, 0xCA7820FBL, + 0xFB0AF54EL, 0xD8FEB397L, + 0x454056ACL, 0xBA489527L, + 0x55533A3AL, 0x20838D87L, + 0xFE6BA9B7L, 0xD096954BL, + 0x55A867BCL, 0xA1159A58L, + 0xCCA92963L, 0x99E1DB33L, + 0xA62A4A56L, 0x3F3125F9L, + 0x5EF47E1CL, 0x9029317CL, + 0xFDF8E802L, 0x04272F70L, + 0x80BB155CL, 0x05282CE3L, + 0x95C11548L, 0xE4C66D22L, + 0x48C1133FL, 0xC70F86DCL, + 0x07F9C9EEL, 0x41041F0FL, + 0x404779A4L, 0x5D886E17L, + 0x325F51EBL, 0xD59BC0D1L, + 0xF2BCC18FL, 0x41113564L, + 0x257B7834L, 0x602A9C60L, + 0xDFF8E8A3L, 0x1F636C1BL, + 0x0E12B4C2L, 0x02E1329EL, + 0xAF664FD1L, 0xCAD18115L, + 0x6B2395E0L, 0x333E92E1L, + 0x3B240B62L, 0xEEBEB922L, + 0x85B2A20EL, 0xE6BA0D99L, + 0xDE720C8CL, 0x2DA2F728L, + 0xD0127845L, 0x95B794FDL, + 0x647D0862L, 0xE7CCF5F0L, + 0x5449A36FL, 0x877D48FAL, + 0xC39DFD27L, 0xF33E8D1EL, + 0x0A476341L, 0x992EFF74L, + 0x3A6F6EABL, 0xF4F8FD37L, + 0xA812DC60L, 0xA1EBDDF8L, + 0x991BE14CL, 0xDB6E6B0DL, + 0xC67B5510L, 0x6D672C37L, + 0x2765D43BL, 0xDCD0E804L, + 0xF1290DC7L, 0xCC00FFA3L, + 0xB5390F92L, 0x690FED0BL, + 0x667B9FFBL, 0xCEDB7D9CL, + 0xA091CF0BL, 0xD9155EA3L, + 0xBB132F88L, 0x515BAD24L, + 0x7B9479BFL, 0x763BD6EBL, + 0x37392EB3L, 0xCC115979L, + 0x8026E297L, 0xF42E312DL, + 0x6842ADA7L, 0xC66A2B3BL, + 0x12754CCCL, 0x782EF11CL, + 0x6A124237L, 0xB79251E7L, + 0x06A1BBE6L, 0x4BFB6350L, + 0x1A6B1018L, 0x11CAEDFAL, + 0x3D25BDD8L, 0xE2E1C3C9L, + 0x44421659L, 0x0A121386L, + 0xD90CEC6EL, 0xD5ABEA2AL, + 0x64AF674EL, 0xDA86A85FL, + 0xBEBFE988L, 0x64E4C3FEL, + 0x9DBC8057L, 0xF0F7C086L, + 0x60787BF8L, 0x6003604DL, + 0xD1FD8346L, 0xF6381FB0L, + 0x7745AE04L, 0xD736FCCCL, + 0x83426B33L, 0xF01EAB71L, + 0xB0804187L, 0x3C005E5FL, + 0x77A057BEL, 0xBDE8AE24L, + 0x55464299L, 0xBF582E61L, + 0x4E58F48FL, 0xF2DDFDA2L, + 0xF474EF38L, 0x8789BDC2L, + 0x5366F9C3L, 0xC8B38E74L, + 0xB475F255L, 0x46FCD9B9L, + 0x7AEB2661L, 0x8B1DDF84L, + 0x846A0E79L, 0x915F95E2L, + 0x466E598EL, 0x20B45770L, + 0x8CD55591L, 0xC902DE4CL, + 0xB90BACE1L, 0xBB8205D0L, + 0x11A86248L, 0x7574A99EL, + 0xB77F19B6L, 0xE0A9DC09L, + 0x662D09A1L, 0xC4324633L, + 0xE85A1F02L, 0x09F0BE8CL, + 0x4A99A025L, 0x1D6EFE10L, + 0x1AB93D1DL, 0x0BA5A4DFL, + 0xA186F20FL, 0x2868F169L, + 0xDCB7DA83L, 0x573906FEL, + 0xA1E2CE9BL, 0x4FCD7F52L, + 0x50115E01L, 0xA70683FAL, + 0xA002B5C4L, 0x0DE6D027L, + 0x9AF88C27L, 0x773F8641L, + 0xC3604C06L, 0x61A806B5L, + 0xF0177A28L, 0xC0F586E0L, + 0x006058AAL, 0x30DC7D62L, + 0x11E69ED7L, 0x2338EA63L, + 0x53C2DD94L, 0xC2C21634L, + 0xBBCBEE56L, 0x90BCB6DEL, + 0xEBFC7DA1L, 0xCE591D76L, + 0x6F05E409L, 0x4B7C0188L, + 0x39720A3DL, 0x7C927C24L, + 0x86E3725FL, 0x724D9DB9L, + 0x1AC15BB4L, 0xD39EB8FCL, + 0xED545578L, 0x08FCA5B5L, + 0xD83D7CD3L, 0x4DAD0FC4L, + 0x1E50EF5EL, 0xB161E6F8L, + 0xA28514D9L, 0x6C51133CL, + 0x6FD5C7E7L, 0x56E14EC4L, + 0x362ABFCEL, 0xDDC6C837L, + 0xD79A3234L, 0x92638212L, + 0x670EFA8EL, 0x406000E0L}, +{0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL, 0x5CB0679EL, + 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL, 0xD5118E9DL, 0xBF0F7315L, + 0xD62D1C7EL, 0xC700C47BL, 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, + 0x6A366EB4L, 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L, + 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L, 0x2939BBDBL, + 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L, 0xA1FAD5F0L, 0x6A2D519AL, + 0x63EF8CE2L, 0x9A86EE22L, 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, + 0x9CF2D0A4L, 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L, + 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L, 0xC72FEFD3L, + 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L, 0x80E4A915L, 0x87B08601L, + 0x9B09E6ADL, 0x3B3EE593L, 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, + 0x022B8B51L, 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L, + 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL, 0xE029AC71L, + 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL, 0xE8D3C48DL, 0x283B57CCL, + 0xF8D56629L, 0x79132E28L, 0x785F0191L, 0xED756055L, 0xF7960E44L, + 0xE3D35E8CL, 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL, + 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL, 0x1B3F6D9BL, + 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L, 0x7533D928L, 0xB155FDF5L, + 0x03563482L, 0x8ABA3CBBL, 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, + 0xCCAD925FL, 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L, + 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L, 0xA8B6E37EL, + 0xC3293D46L, 0x48DE5369L, 0x6413E680L, 0xA2AE0810L, 0xDD6DB224L, + 0x69852DFDL, 0x09072166L, 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, + 0x1C20C8AEL, 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL, + 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L, 0x72EACEA8L, + 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L, 0xD29BE463L, 0x542F5D9EL, + 0xAEC2771BL, 0xF64E6370L, 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, + 0xAF537D5DL, 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L, + 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L, 0x6F3F3B82L, + 0x3520AB82L, 0x011A1D4BL, 0x277227F8L, 0x611560B1L, 0xE7933FDCL, + 0xBB3A792BL, 0x344525BDL, 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, + 0xA01FBAC9L, 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L, + 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L, 0x0339C32AL, + 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL, 0xF79E59B7L, 0x43F5BB3AL, + 0xF2D519FFL, 0x27D9459CL, 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, + 0x9B941525L, 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L, + 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L, 0xE0EC6E0EL, + 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L, 0x9F1F9532L, 0xE0D392DFL, + 0xD3A0342BL, 0x8971F21EL, 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, + 0xC37632D8L, 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL, + 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL, 0x1618B166L, + 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L, 0xF523F357L, 0xA6327623L, + 0x93A83531L, 0x56CCCD02L, 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, + 0x88D273CCL, 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L, + 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL, 0xC9AA53FDL, + 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L, 0x71126905L, 0xB2040222L, + 0xB6CBCF7CL, 0xCD769C2BL, 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, + 0x2547ADF0L, 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L, + 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL, 0x1948C25CL, + 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L, 0x90D4F869L, 0xA65CDEA0L, + 0x3F09252DL, 0xC208E69FL, 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, + 0x3AC372E6L} +}; + +static unsigned long F(BLOWFISH_CTX * ctx, unsigned long x) +{ + unsigned short a, b, c, d; + unsigned long y; + d = (unsigned short) (x & 0xFF); + x >>= 8; + c = (unsigned short) (x & 0xFF); + x >>= 8; + b = (unsigned short) (x & 0xFF); + x >>= 8; + a = (unsigned short) (x & 0xFF); + y = ctx->S[0][a] + ctx->S[1][b]; + y = y ^ ctx->S[2][c]; + y = y + ctx->S[3][d]; + return y; +} + +void Blowfish_Encrypt(BLOWFISH_CTX * ctx, unsigned long *xl, + unsigned long *xr) +{ + unsigned long Xl; + unsigned long Xr; + unsigned long temp; + short i; + Xl = *xl; + Xr = *xr; + for (i = 0; i < N; ++i) { + Xl = Xl ^ ctx->P[i]; + Xr = F(ctx, Xl) ^ Xr; + temp = Xl; + Xl = Xr; + Xr = temp; + } + temp = Xl; + Xl = Xr; + Xr = temp; + Xr = Xr ^ ctx->P[N]; + Xl = Xl ^ ctx->P[N + 1]; + *xl = Xl; + *xr = Xr; +} + +void Blowfish_Decrypt(BLOWFISH_CTX * ctx, unsigned long *xl, + unsigned long *xr) +{ + unsigned long Xl; + unsigned long Xr; + unsigned long temp; + short i; + Xl = *xl; + Xr = *xr; + for (i = N + 1; i > 1; --i) { + Xl = Xl ^ ctx->P[i]; + Xr = F(ctx, Xl) ^ Xr; + + /* Exchange Xl and Xr */ + temp = Xl; + Xl = Xr; + Xr = temp; + } + + /* Exchange Xl and Xr */ + temp = Xl; + Xl = Xr; + Xr = temp; + Xr = Xr ^ ctx->P[1]; + Xl = Xl ^ ctx->P[0]; + *xl = Xl; + *xr = Xr; +} + +void Blowfish_Init(BLOWFISH_CTX * ctx, unsigned char *key, int keyLen) +{ + int i, j, k; + unsigned long data, datal, datar; + for (i = 0; i < 4; i++) { + for (j = 0; j < 256; j++) + ctx->S[i][j] = ORIG_S[i][j]; + } + j = 0; + for (i = 0; i < N + 2; ++i) { + data = 0x00000000; + for (k = 0; k < 4; ++k) { + data = (data << 8) | key[j]; + j = j + 1; + if (j >= keyLen) + j = 0; + } + ctx->P[i] = ORIG_P[i] ^ data; + } + datal = 0x00000000; + datar = 0x00000000; + for (i = 0; i < N + 2; i += 2) { + Blowfish_Encrypt(ctx, &datal, &datar); + ctx->P[i] = datal; + ctx->P[i + 1] = datar; + } + for (i = 0; i < 4; ++i) { + for (j = 0; j < 256; j += 2) { + Blowfish_Encrypt(ctx, &datal, &datar); + ctx->S[i][j] = datal; + ctx->S[i][j + 1] = datar; + } + } +} + +static gpointer +parallel_blowfish(unsigned int start, unsigned int end, void *data, gint thread_number) +{ + BLOWFISH_CTX ctx; + unsigned int i; + unsigned long L, R; + + L = 0xBEBACAFE; + R = 0xDEADBEEF; + + for (i = start; i <= end; i++) { + Blowfish_Init(&ctx, (unsigned char*)data, 65536); + Blowfish_Encrypt(&ctx, &L, &R); + Blowfish_Decrypt(&ctx, &L, &R); + } + + return NULL; +} + +void +benchmark_fish(void) +{ + gchar *tmpsrc; + gchar *bdata_path; + + bdata_path = g_build_filename(params.path_data, "benchmark.data", NULL); + if (!g_file_get_contents(bdata_path, &tmpsrc, NULL, NULL)) { + bench_results[BENCHMARK_BLOWFISH] = -1.0f; + g_free(bdata_path); + return; + } + + shell_view_set_enabled(FALSE); + shell_status_update("Performing Blowfish benchmark..."); + + bench_results[BENCHMARK_BLOWFISH] = benchmark_parallel_for(0, 50000, parallel_blowfish, tmpsrc); + g_free(bdata_path); + g_free(tmpsrc); +} diff --git a/modules/benchmark/cryptohash.c b/modules/benchmark/cryptohash.c new file mode 100644 index 00000000..d97e85c7 --- /dev/null +++ b/modules/benchmark/cryptohash.c @@ -0,0 +1,79 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "md5.h" +#include "sha1.h" +#include "benchmark.h" + +static void inline md5_step(char *data, glong srclen) +{ + struct MD5Context ctx; + guchar checksum[16]; + + MD5Init(&ctx); + MD5Update(&ctx, (guchar *)data, srclen); + MD5Final(checksum, &ctx); +} + +static void inline sha1_step(char *data, glong srclen) +{ + SHA1_CTX ctx; + guchar checksum[20]; + + SHA1Init(&ctx); + SHA1Update(&ctx, (guchar*)data, srclen); + SHA1Final(checksum, &ctx); +} + +static gpointer cryptohash_for(unsigned int start, unsigned int end, void *data, gint thread_number) +{ + unsigned int i; + + for (i = start; i <= end; i++) { + if (i & 1) { + md5_step(data, 65536); + } else { + sha1_step(data, 65536); + } + } + + return NULL; +} + +void +benchmark_cryptohash(void) +{ + gdouble elapsed = 0; + gchar *tmpsrc, *bdata_path; + + bdata_path = g_build_filename(params.path_data, "benchmark.data", NULL); + if (!g_file_get_contents(bdata_path, &tmpsrc, NULL, NULL)) { + g_free(bdata_path); + return; + } + + shell_view_set_enabled(FALSE); + shell_status_update("Running CryptoHash benchmark..."); + + elapsed = benchmark_parallel_for(0, 5000, cryptohash_for, tmpsrc); + + g_free(bdata_path); + g_free(tmpsrc); + + bench_results[BENCHMARK_CRYPTOHASH] = 312.0 / elapsed; +} diff --git a/modules/benchmark/drawing.c b/modules/benchmark/drawing.c new file mode 100644 index 00000000..67a2c264 --- /dev/null +++ b/modules/benchmark/drawing.c @@ -0,0 +1,29 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "benchmark.h" +#include "guibench.h" + +void +benchmark_gui(void) +{ + shell_view_set_enabled(FALSE); + shell_status_update("Running drawing benchmark..."); + + bench_results[BENCHMARK_GUI] = guibench(); +} diff --git a/modules/benchmark/fbench.c b/modules/benchmark/fbench.c new file mode 100644 index 00000000..b5afc1bc --- /dev/null +++ b/modules/benchmark/fbench.c @@ -0,0 +1,745 @@ +/* + + John Walker's Floating Point Benchmark, derived from... + + Marinchip Interactive Lens Design System + + John Walker December 1980 + + By John Walker + https://www.fourmilab.ch/ + + This program may be used, distributed, and modified freely as + long as the origin information is preserved. + + This is a complete optical design raytracing algorithm, + stripped of its user interface and recast into portable C. It + not only determines execution speed on an extremely floating + point (including trig function) intensive real-world + application, it checks accuracy on an algorithm that is + exquisitely sensitive to errors. The performance of this + program is typically far more sensitive to changes in the + efficiency of the trigonometric library routines than the + average floating point program. + + The benchmark may be compiled in two modes. If the symbol + INTRIG is defined, built-in trigonometric and square root + routines will be used for all calculations. Timings made with + INTRIG defined reflect the machine's basic floating point + performance for the arithmetic operators. If INTRIG is not + defined, the system library functions are used. + Results with INTRIG not defined reflect the system's library + performance and/or floating point hardware support for trig + functions and square root. Results with INTRIG defined are a + good guide to general floating point performance, while + results with INTRIG undefined indicate the performance of an + application which is math function intensive. + + Special note regarding errors in accuracy: this program has + generated numbers identical to the last digit it formats and + checks on the following machines, floating point + architectures, and languages: + + Marinchip 9900 QBASIC IBM 370 double-precision (REAL * 8) format + + IBM PC / XT / AT Lattice C IEEE 64 bit, 80 bit temporaries + High C same, in line 80x87 code + BASICA "Double precision" + Quick BASIC IEEE double precision, software routines + + Sun 3 C IEEE 64 bit, 80 bit temporaries, + in-line 68881 code, in-line FPA code. + + MicroVAX II C Vax "G" format floating point + + Macintosh Plus MPW C SANE floating point, IEEE 64 bit format + implemented in ROM. + + Inaccuracies reported by this program should be taken VERY + SERIOUSLY INDEED, as the program has been demonstrated to be + invariant under changes in floating point format, as long as + the format is a recognised double precision format. If you + encounter errors, please remember that they are just as likely + to be in the floating point editing library or the + trigonometric libraries as in the low level operator code. + + The benchmark assumes that results are basically reliable, and + only tests the last result computed against the reference. If + you're running on a suspect system you can compile this + program with ACCURACY defined. This will generate a version + which executes as an infinite loop, performing the ray trace + and checking the results on every pass. All incorrect results + will be reported. + + Representative timings are given below. All have been + normalised as if run for 1000 iterations. + + Time in seconds Computer, Compiler, and notes + Normal INTRIG + + 3466.00 4031.00 Commodore 128, 2 Mhz 8510 with software floating + point. Abacus Software/Data-Becker Super-C 128, + version 3.00, run in fast (2 Mhz) mode. Note: + the results generated by this system differed + from the reference results in the 8th to 10th + decimal place. + + 3290.00 IBM PC/AT 6 Mhz, Microsoft/IBM BASICA version A3.00. + Run with the "/d" switch, software floating point. + + 2131.50 IBM PC/AT 6 Mhz, Lattice C version 2.14, small model. + This version of Lattice compiles subroutine + calls which either do software floating point + or use the 80x87. The machine on which I ran + this had an 80287, but the results were so bad + I wonder if it was being used. + + 1598.00 Macintosh Plus, MPW C, SANE Software floating point. + + 1582.13 Marinchip 9900 2 Mhz, QBASIC compiler with software + floating point. This was a QBASIC version of the + program which contained the identical algorithm. + + 404.00 IBM PC/AT 6 Mhz, Microsoft QuickBASIC version 2.0. + Software floating point. + + 165.15 IBM PC/AT 6 Mhz, Metaware High C version 1.3, small + model. This was compiled to call subroutines for + floating point, and the machine contained an 80287 + which was used by the subroutines. + + 143.20 Macintosh II, MPW C, SANE calls. I was unable to + determine whether SANE was using the 68881 chip or + not. + + 121.80 Sun 3/160 16 Mhz, Sun C. Compiled with -fsoft switch + which executes floating point in software. + + 78.78 110.11 IBM RT PC (Model 6150). IBM AIX 1.0 C compiler + with -O switch. + + 75.2 254.0 Microsoft Quick C 1.0, in-line 8087 instructions, + compiled with 80286 optimisation on. (Switches + were -Ol -FPi87-G2 -AS). Small memory model. + + 69.50 IBM PC/AT 6Mhz, Borland Turbo BASIC 1.0. Compiled + in "8087 required" mode to generate in-line + code for the math coprocessor. + + 66.96 IBM PC/AT 6Mhz, Microsoft QuickBASIC 4.0. This + release of QuickBASIC compiles code for the + 80287 math coprocessor. + + 66.36 206.35 IBM PC/AT 6Mhz, Metaware High C version 1.3, small + model. This was compiled with in-line code for the + 80287 math coprocessor. Trig functions still call + library routines. + + 63.07 220.43 IBM PC/AT, 6Mhz, Borland Turbo C, in-line 8087 code, + small model, word alignment, no stack checking, + 8086 code mode. + + 17.18 Apollo DN-3000, 12 Mhz 68020 with 68881, compiled + with in-line code for the 68881 coprocessor. + According to Apollo, the library routines are chosen + at runtime based on coprocessor presence. Since the + coprocessor was present, the library is supposed to + use in-line floating point code. + + 15.55 27.56 VAXstation II GPX. Compiled and executed under + VAX/VMS C. + + 15.14 37.93 Macintosh II, Unix system V. Green Hills 68020 + Unix compiler with in-line code for the 68881 + coprocessor (-O -ZI switches). + + 12.69 Sun 3/160 16 Mhz, Sun C. Compiled with -fswitch, + which calls a subroutine to select the fastest + floating point processor. This was using the 68881. + + 11.74 26.73 Compaq Deskpro 386, 16 Mhz 80386 with 16 Mhz 80387. + Metaware High C version 1.3, compiled with in-line + for the math coprocessor (but not optimised for the + 80386/80387). Trig functions still call library + routines. + + 8.43 30.49 Sun 3/160 16 Mhz, Sun C. Compiled with -f68881, + generating in-line MC68881 instructions. Trig + functions still call library routines. + + 6.29 25.17 Sun 3/260 25 Mhz, Sun C. Compiled with -f68881, + generating in-line MC68881 instructions. Trig + functions still call library routines. + + 4.57 Sun 3/260 25 Mhz, Sun FORTRAN 77. Compiled with + -O -f68881, generating in-line MC68881 instructions. + Trig functions are compiled in-line. This used + the FORTRAN 77 version of the program, FBFORT77.F. + + 4.00 14.20 Sun386i/25 Mhz model 250, Sun C compiler. + + 4.00 14.00 Sun386i/25 Mhz model 250, Metaware C. + + 3.10 12.00 Compaq 386/387 25 Mhz running SCO Xenix 2. + Compiled with Metaware HighC 386, optimized + for 386. + + 3.00 12.00 Compaq 386/387 25MHZ optimized for 386/387. + + 2.96 5.17 Sun 4/260, Sparc RISC processor. Sun C, + compiled with the -O2 switch for global + optimisation. + + 2.47 COMPAQ 486/25, secondary cache disabled, High C, + 486/387, inline f.p., small memory model. + + 2.20 3.40 Data General Motorola 88000, 16 Mhz, Gnu C. + + 1.56 COMPAQ 486/25, 128K secondary cache, High C, 486/387, + inline f.p., small memory model. + + 0.66 1.50 DEC Pmax, Mips processor. + + 0.63 0.91 Sun SparcStation 2, Sun C (SunOS 4.1.1) with + -O4 optimisation and "/usr/lib/libm.il" inline + floating point. + + 0.60 1.07 Intel 860 RISC processor, 33 Mhz, Greenhills + C compiler. + + 0.40 0.90 Dec 3MAX, MIPS 3000 processor, -O4. + + 0.31 0.90 IBM RS/6000, -O. + + 0.1129 0.2119 Dell Dimension XPS P133c, Pentium 133 MHz, + Windows 95, Microsoft Visual C 5.0. + + 0.0883 0.2166 Silicon Graphics Indigo², MIPS R4400, + 175 Mhz, "-O3". + + 0.0351 0.0561 Dell Dimension XPS R100, Pentium II 400 MHz, + Windows 98, Microsoft Visual C 5.0. + + 0.0312 0.0542 Sun Ultra 2, UltraSPARC V9, 300 MHz, Solaris + 2.5.1. + + 0.00862 0.01074 Dell Inspiron 9100, Pentium 4, 3.4 GHz, gcc -O3. + +*/ + +#include +#include +#include +#ifndef INTRIG +#include +#endif + +#define cot(x) (1.0 / tan(x)) + +#define TRUE 1 +#define FALSE 0 + +#define max_surfaces 10 + +/* Local variables */ + +/*static char tbfr[132];*/ + +static short current_surfaces; +static short paraxial; + +static double clear_aperture; + +static double aberr_lspher; +static double aberr_osc; +static double aberr_lchrom; + +static double max_lspher; +static double max_osc; +static double max_lchrom; + +static double radius_of_curvature; +static double object_distance; +static double ray_height; +static double axis_slope_angle; +static double from_index; +static double to_index; + +static double spectral_line[9]; +static double s[max_surfaces][5]; +static double od_sa[2][2]; + + /*static char outarr[8][80];*//* Computed output of program goes here */ + +static int itercount; /* The iteration counter for the main loop + in the program is made global so that + the compiler should not be allowed to + optimise out the loop over the ray + tracing code. */ + +#ifndef ITERATIONS +#define ITERATIONS 1000 +#endif +static int niter = ITERATIONS; /* Iteration counter */ + +#if 0 +static char *refarr[] = { /* Reference results. These happen to + be derived from a run on Microsoft + Quick BASIC on the IBM PC/AT. */ + + " Marginal ray 47.09479120920 0.04178472683", + " Paraxial ray 47.08372160249 0.04177864821", + "Longitudinal spherical aberration: -0.01106960671", + " (Maximum permissible): 0.05306749907", + "Offense against sine condition (coma): 0.00008954761", + " (Maximum permissible): 0.00250000000", + "Axial chromatic aberration: 0.00448229032", + " (Maximum permissible): 0.05306749907" +}; +#endif + +/* The test case used in this program is the design for a 4 inch + achromatic telescope objective used as the example in Wyld's + classic work on ray tracing by hand, given in Amateur Telescope + Making, Volume 3. */ + +static double testcase[4][4] = { + {27.05, 1.5137, 63.6, 0.52}, + {-16.68, 1, 0, 0.138}, + {-16.68, 1.6164, 36.7, 0.38}, + {-78.1, 1, 0, 0} +}; + +/* Internal trig functions (used only if INTRIG is defined). These + standard functions may be enabled to obtain timings that reflect + the machine's floating point performance rather than the speed of + its trig function evaluation. */ + +#ifdef INTRIG + +/* The following definitions should keep you from getting intro trouble + with compilers which don't let you redefine intrinsic functions. */ + +#define sin I_sin +#define cos I_cos +#define tan I_tan +#define sqrt I_sqrt +#define atan I_atan +#define atan2 I_atan2 +#define asin I_asin + +#define fabs(x) ((x < 0.0) ? -x : x) + +#define pic 3.1415926535897932 + +/* Commonly used constants */ + +static double pi = pic, + twopi = pic * 2.0, + piover4 = pic / 4.0, fouroverpi = 4.0 / pic, piover2 = pic / 2.0; + +/* Coefficients for ATAN evaluation */ + +static double atanc[] = { + 0.0, + 0.4636476090008061165, + 0.7853981633974483094, + 0.98279372324732906714, + 1.1071487177940905022, + 1.1902899496825317322, + 1.2490457723982544262, + 1.2924966677897852673, + 1.3258176636680324644 +}; + +/* aint(x) Return integer part of number. Truncates towards 0 */ + +double aint(x) +double x; +{ + long l; + + /* Note that this routine cannot handle the full floating point + number range. This function should be in the machine-dependent + floating point library! */ + + l = x; + if ((int) (-0.5) != 0 && l < 0) + l++; + x = l; + return x; +} + +/* sin(x) Return sine, x in radians */ + +static double sin(x) +double x; +{ + int sign; + double y, r, z; + + x = (((sign = (x < 0.0)) != 0) ? -x : x); + + if (x > twopi) + x -= (aint(x / twopi) * twopi); + + if (x > pi) { + x -= pi; + sign = !sign; + } + + if (x > piover2) + x = pi - x; + + if (x < piover4) { + y = x * fouroverpi; + z = y * y; + r = y * + (((((((-0.202253129293E-13 * z + 0.69481520350522E-11) * z - + 0.17572474176170806E-8) * z + + 0.313361688917325348E-6) * z - + 0.365762041821464001E-4) * z + + 0.249039457019271628E-2) * z - 0.0807455121882807815) * z + + 0.785398163397448310); + } else { + y = (piover2 - x) * fouroverpi; + z = y * y; + r = ((((((-0.38577620372E-12 * z + 0.11500497024263E-9) * z - + 0.2461136382637005E-7) * z + + 0.359086044588581953E-5) * z - + 0.325991886926687550E-3) * z + 0.0158543442438154109) * z - + 0.308425137534042452) * z + 1.0; + } + return sign ? -r : r; +} + +/* cos(x) Return cosine, x in radians, by identity */ + +static double cos(x) +double x; +{ + x = (x < 0.0) ? -x : x; + if (x > twopi) /* Do range reduction here to limit */ + x = x - (aint(x / twopi) * twopi); /* roundoff on add of PI/2 */ + return sin(x + piover2); +} + +/* tan(x) Return tangent, x in radians, by identity */ + +static double tan(x) +double x; +{ + return sin(x) / cos(x); +} + +/* sqrt(x) Return square root. Initial guess, then Newton- + Raphson refinement */ + +double sqrt(x) +double x; +{ + double c, cl, y; + int n; + + if (x == 0.0) + return 0.0; + + if (x < 0.0) { + fprintf(stderr, + "\nGood work! You tried to take the square root of %g", + x); + fprintf(stderr, + "\nunfortunately, that is too complex for me to handle.\n"); + exit(1); + } + + y = (0.154116 + 1.893872 * x) / (1.0 + 1.047988 * x); + + c = (y - x / y) / 2.0; + cl = 0.0; + for (n = 50; c != cl && n--;) { + y = y - c; + cl = c; + c = (y - x / y) / 2.0; + } + return y; +} + +/* atan(x) Return arctangent in radians, + range -pi/2 to pi/2 */ + +static double atan(x) +double x; +{ + int sign, l, y; + double a, b, z; + + x = (((sign = (x < 0.0)) != 0) ? -x : x); + l = 0; + + if (x >= 4.0) { + l = -1; + x = 1.0 / x; + y = 0; + goto atl; + } else { + if (x < 0.25) { + y = 0; + goto atl; + } + } + + y = aint(x / 0.5); + z = y * 0.5; + x = (x - z) / (x * z + 1); + + atl: + z = x * x; + b = ((((893025.0 * z + 49116375.0) * z + 425675250.0) * z + + 1277025750.0) * z + 1550674125.0) * z + 654729075.0; + a = (((13852575.0 * z + 216602100.0) * z + 891080190.0) * z + + 1332431100.0) * z + 654729075.0; + a = (a / b) * x + atanc[y]; + if (l) + a = piover2 - a; + return sign ? -a : a; +} + +/* atan2(y,x) Return arctangent in radians of y/x, + range -pi to pi */ + +static double atan2(y, x) +double y, x; +{ + double temp; + + if (x == 0.0) { + if (y == 0.0) /* Special case: atan2(0,0) = 0 */ + return 0.0; + else if (y > 0) + return piover2; + else + return -piover2; + } + temp = atan(y / x); + if (x < 0.0) { + if (y >= 0.0) + temp += pic; + else + temp -= pic; + } + return temp; +} + +/* asin(x) Return arcsine in radians of x */ + +static double asin(x) +double x; +{ + if (fabs(x) > 1.0) { + fprintf(stderr, + "\nInverse trig functions lose much of their gloss when"); + fprintf(stderr, + "\ntheir arguments are greater than 1, such as the"); + fprintf(stderr, "\nvalue %g you passed.\n", x); + exit(1); + } + return atan2(x, sqrt(1 - x * x)); +} +#endif + +/* Calculate passage through surface + + If the variable PARAXIAL is true, the trace through the + surface will be done using the paraxial approximations. + Otherwise, the normal trigonometric trace will be done. + + This routine takes the following inputs: + + RADIUS_OF_CURVATURE Radius of curvature of surface + being crossed. If 0, surface is + plane. + + OBJECT_DISTANCE Distance of object focus from + lens vertex. If 0, incoming + rays are parallel and + the following must be specified: + + RAY_HEIGHT Height of ray from axis. Only + relevant if OBJECT.DISTANCE == 0 + + AXIS_SLOPE_ANGLE Angle incoming ray makes with axis + at intercept + + FROM_INDEX Refractive index of medium being left + + TO_INDEX Refractive index of medium being + entered. + + The outputs are the following variables: + + OBJECT_DISTANCE Distance from vertex to object focus + after refraction. + + AXIS_SLOPE_ANGLE Angle incoming ray makes with axis + at intercept after refraction. + +*/ + +static void transit_surface() +{ + double iang, /* Incidence angle */ + rang, /* Refraction angle */ + iang_sin, /* Incidence angle sin */ + rang_sin, /* Refraction angle sin */ + old_axis_slope_angle, sagitta; + + if (paraxial) { + if (radius_of_curvature != 0.0) { + if (object_distance == 0.0) { + axis_slope_angle = 0.0; + iang_sin = ray_height / radius_of_curvature; + } else + iang_sin = ((object_distance - + radius_of_curvature) / radius_of_curvature) * + axis_slope_angle; + + rang_sin = (from_index / to_index) * iang_sin; + old_axis_slope_angle = axis_slope_angle; + axis_slope_angle = axis_slope_angle + iang_sin - rang_sin; + if (object_distance != 0.0) + ray_height = object_distance * old_axis_slope_angle; + object_distance = ray_height / axis_slope_angle; + return; + } + object_distance = object_distance * (to_index / from_index); + axis_slope_angle = axis_slope_angle * (from_index / to_index); + return; + } + + if (radius_of_curvature != 0.0) { + if (object_distance == 0.0) { + axis_slope_angle = 0.0; + iang_sin = ray_height / radius_of_curvature; + } else { + iang_sin = ((object_distance - + radius_of_curvature) / radius_of_curvature) * + sin(axis_slope_angle); + } + iang = asin(iang_sin); + rang_sin = (from_index / to_index) * iang_sin; + old_axis_slope_angle = axis_slope_angle; + axis_slope_angle = axis_slope_angle + iang - asin(rang_sin); + sagitta = sin((old_axis_slope_angle + iang) / 2.0); + sagitta = 2.0 * radius_of_curvature * sagitta * sagitta; + object_distance = + ((radius_of_curvature * sin(old_axis_slope_angle + iang)) * + cot(axis_slope_angle)) + sagitta; + return; + } + + rang = -asin((from_index / to_index) * sin(axis_slope_angle)); + object_distance = object_distance * ((to_index * + cos(-rang)) / (from_index * + cos + (axis_slope_angle))); + axis_slope_angle = -rang; +} + +/* Perform ray trace in specific spectral line */ + +static void trace_line(line, ray_h) +int line; +double ray_h; +{ + int i; + + object_distance = 0.0; + ray_height = ray_h; + from_index = 1.0; + + for (i = 1; i <= current_surfaces; i++) { + radius_of_curvature = s[i][1]; + to_index = s[i][2]; + if (to_index > 1.0) + to_index = to_index + ((spectral_line[4] - + spectral_line[line]) / + (spectral_line[3] - + spectral_line[6])) * ((s[i][2] - + 1.0) / s[i][3]); + transit_surface(); + from_index = to_index; + if (i < current_surfaces) + object_distance = object_distance - s[i][4]; + } +} + +/* Initialise when called the first time */ + +void fbench() +{ + int i, j; + double od_fline, od_cline; + + spectral_line[1] = 7621.0; /* A */ + spectral_line[2] = 6869.955; /* B */ + spectral_line[3] = 6562.816; /* C */ + spectral_line[4] = 5895.944; /* D */ + spectral_line[5] = 5269.557; /* E */ + spectral_line[6] = 4861.344; /* F */ + spectral_line[7] = 4340.477; /* G' */ + spectral_line[8] = 3968.494; /* H */ + + niter = 3000; + + /* Load test case into working array */ + + clear_aperture = 4.0; + current_surfaces = 4; + for (i = 0; i < current_surfaces; i++) + for (j = 0; j < 4; j++) + s[i + 1][j + 1] = testcase[i][j]; + + for (itercount = 0; itercount < niter; itercount++) { + for (paraxial = 0; paraxial <= 1; paraxial++) { + + /* Do main trace in D light */ + + trace_line(4, clear_aperture / 2.0); + od_sa[paraxial][0] = object_distance; + od_sa[paraxial][1] = axis_slope_angle; + } + paraxial = FALSE; + + /* Trace marginal ray in C */ + + trace_line(3, clear_aperture / 2.0); + od_cline = object_distance; + + /* Trace marginal ray in F */ + + trace_line(6, clear_aperture / 2.0); + od_fline = object_distance; + + aberr_lspher = od_sa[1][0] - od_sa[0][0]; + aberr_osc = 1.0 - (od_sa[1][0] * od_sa[1][1]) / + (sin(od_sa[0][1]) * od_sa[0][0]); + aberr_lchrom = od_fline - od_cline; + max_lspher = sin(od_sa[0][1]); + + /* D light */ + + max_lspher = 0.0000926 / (max_lspher * max_lspher); + max_osc = 0.0025; + max_lchrom = max_lspher; + } +} + +#ifdef __FBENCH_TEST__ +int main(void) +{ + fbench(); + + return 0; +} +#endif diff --git a/modules/benchmark/fft.c b/modules/benchmark/fft.c new file mode 100644 index 00000000..7c5889c8 --- /dev/null +++ b/modules/benchmark/fft.c @@ -0,0 +1,67 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "benchmark.h" +#include "fftbench.h" + +static gpointer fft_for(unsigned int start, unsigned int end, void *data, gint thread_number) +{ + unsigned int i; + FFTBench **benches = (FFTBench **)data; + FFTBench *fftbench = (FFTBench *)(benches[thread_number]); + + for (i = start; i <= end; i++) { + fft_bench_run(fftbench); + } + + return NULL; +} + +void +benchmark_fft(void) +{ + gdouble elapsed = 0; + int n_cores, i; + gchar *temp; + FFTBench **benches; + + shell_view_set_enabled(FALSE); + shell_status_update("Running FFT benchmark..."); + + /* Pre-allocate all benchmarks */ + temp = module_call_method("devices::getProcessorCount"); + n_cores = temp ? atoi(temp) : 1; + g_free(temp); + + benches = g_new0(FFTBench *, n_cores); + for (i = 0; i < n_cores; i++) { + benches[i] = fft_bench_new(); + } + + /* Run the benchmark */ + elapsed = benchmark_parallel_for(0, 4, fft_for, benches); + + /* Free up the memory */ + for (i = 0; i < n_cores; i++) { + fft_bench_free(benches[i]); + } + g_free(benches); + + bench_results[BENCHMARK_FFT] = elapsed; +} diff --git a/modules/benchmark/fftbench.c b/modules/benchmark/fftbench.c new file mode 100644 index 00000000..89fd5a73 --- /dev/null +++ b/modules/benchmark/fftbench.c @@ -0,0 +1,212 @@ +/* + fftbench.c + + Written by Scott Robert Ladd (scott@coyotegulch.com) + No rights reserved. This is public domain software, for use by anyone. + + A number-crunching benchmark using LUP-decomposition to solve a large + linear equation. + + The code herein is design for the purpose of testing computational + performance; error handling is minimal. + + In fact, this is a weak implementation of the FFT; unfortunately, all + of my really nifty FFTs are in commercial code, and I haven't had time + to write a new FFT routine for this benchmark. I may add a Hartley + transform to the seat, too. + + Actual benchmark results can be found at: + http://scottrobertladd.net/coyotegulch/ + + Please do not use this information or algorithm in any way that might + upset the balance of the universe or otherwise cause a disturbance in + the space-time continuum. +*/ + +#include +#include +#include +#include +#include +#include + +#include "fftbench.h" + +// embedded random number generator; ala Park and Miller +static long seed = 1325; +static const long IA = 16807; +static const long IM = 2147483647; +static const double AM = 4.65661287525E-10; +static const long IQ = 127773; +static const long IR = 2836; +static const long MASK = 123459876; + +static double random_double() +{ + long k; + double result; + + seed ^= MASK; + k = seed / IQ; + seed = IA * (seed - k * IQ) - IR * k; + + if (seed < 0) + seed += IM; + + result = AM * seed; + seed ^= MASK; + + return result; +} + +static const int N = 800; +static const int NM1 = 799; // N - 1 +static const int NP1 = 801; // N + 1 + +static void lup_decompose(FFTBench *fftbench) +{ + int i, j, k, k2, t; + double p, temp, **a; + + int *perm = (int *) malloc(sizeof(double) * N); + + fftbench->p = perm; + a = fftbench->a; + + for (i = 0; i < N; ++i) + perm[i] = i; + + for (k = 0; k < NM1; ++k) { + p = 0.0; + + for (i = k; i < N; ++i) { + temp = fabs(a[i][k]); + + if (temp > p) { + p = temp; + k2 = i; + } + } + + // check for invalid a + if (p == 0.0) + return; + + // exchange rows + t = perm[k]; + perm[k] = perm[k2]; + perm[k2] = t; + + for (i = 0; i < N; ++i) { + temp = a[k][i]; + a[k][i] = a[k2][i]; + a[k2][i] = temp; + } + + for (i = k + 1; i < N; ++i) { + a[i][k] /= a[k][k]; + + for (j = k + 1; j < N; ++j) + a[i][j] -= a[i][k] * a[k][j]; + } + } +} + +static double *lup_solve(FFTBench *fftbench) +{ + int i, j, j2; + double sum, u; + + double *y = (double *) malloc(sizeof(double) * N); + double *x = (double *) malloc(sizeof(double) * N); + + double **a = fftbench->a; + double *b = fftbench->b; + int *perm = fftbench->p; + + for (i = 0; i < N; ++i) { + y[i] = 0.0; + x[i] = 0.0; + } + + for (i = 0; i < N; ++i) { + sum = 0.0; + j2 = 0; + + for (j = 1; j <= i; ++j) { + sum += a[i][j2] * y[j2]; + ++j2; + } + + y[i] = b[perm[i]] - sum; + } + + i = NM1; + + while (1) { + sum = 0.0; + u = a[i][i]; + + for (j = i + 1; j < N; ++j) + sum += a[i][j] * x[j]; + + x[i] = (y[i] - sum) / u; + + if (i == 0) + break; + + --i; + } + + free(y); + + return x; +} + +FFTBench *fft_bench_new(void) +{ + FFTBench *fftbench; + int i, j; + + fftbench = g_new0(FFTBench, 1); + + // generate test data + fftbench->a = (double **) malloc(sizeof(double *) * N); + + for (i = 0; i < N; ++i) { + fftbench->a[i] = (double *) malloc(sizeof(double) * N); + + for (j = 0; j < N; ++j) + fftbench->a[i][j] = random_double(); + } + + fftbench->b = (double *) malloc(sizeof(double) * N); + + for (i = 0; i < N; ++i) + fftbench->b[i] = random_double(); + + return fftbench; +} + +void fft_bench_run(FFTBench *fftbench) +{ + lup_decompose(fftbench); + double *x = lup_solve(fftbench); + free(x); +} + +void fft_bench_free(FFTBench *fftbench) +{ + int i; + + // clean up + for (i = 0; i < N; ++i) + free(fftbench->a[i]); + + free(fftbench->a); + free(fftbench->b); + free(fftbench->p); + free(fftbench->r); + + g_free(fftbench); +} diff --git a/modules/benchmark/fib.c b/modules/benchmark/fib.c new file mode 100644 index 00000000..0f88be59 --- /dev/null +++ b/modules/benchmark/fib.c @@ -0,0 +1,50 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "benchmark.h" + +static gulong +fib(gulong n) +{ + if (n == 0) + return 0; + else if (n <= 2) + return 1; + return fib(n - 1) + fib(n - 2); +} + +void +benchmark_fib(void) +{ + GTimer *timer = g_timer_new(); + gdouble elapsed; + + shell_view_set_enabled(FALSE); + shell_status_update("Calculating the 42nd Fibonacci number..."); + + g_timer_reset(timer); + g_timer_start(timer); + + fib(42); + + g_timer_stop(timer); + elapsed = g_timer_elapsed(timer, NULL); + g_timer_destroy(timer); + + bench_results[BENCHMARK_FIB] = elapsed; +} diff --git a/modules/benchmark/guibench.c b/modules/benchmark/guibench.c new file mode 100644 index 00000000..b9573278 --- /dev/null +++ b/modules/benchmark/guibench.c @@ -0,0 +1,353 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "iconcache.h" +#include "config.h" + +#define N_ITERATIONS 100000 +#define PHRASE "I \342\231\245 HardInfo" + +typedef double (*BenchCallback)(GtkWindow *window); + +static double test_lines(GtkWindow *window); +static double test_shapes(GtkWindow *window); +static double test_filled_shapes(GtkWindow *window); +static double test_text(GtkWindow *window); +static double test_icons(GtkWindow *window); + +/* +Results on a AMD Athlon 3200+ (Barton), 1GB RAM, +nVidia Geforce 6200 with nvidia Xorg driver, +running Linux 2.6.28, Xorg 1.6.0, Ubuntu 9.04 +desktop, GNOME 2.26.1, composite enabled. + +Test Time Iter/Sec +Line Drawing 3.9570 25271.7663 +Shape Drawing 22.2499 4494.4065 +Filled Shape Drawing 4.0377 24766.2806 +Text Drawing 59.1565 1690.4309 +Icon Blitting 51.720941 1933.4528 + +Results are normalized according to these values. +A guibench() result of 1000.0 is roughly equivalent +to this same setup. +*/ + +static struct { + BenchCallback callback; + gchar *title; + gdouble weight; +} tests[] = { + { test_lines, "Line Drawing", 25271.77 }, + { test_shapes, "Shape Drawing", 4494.49 }, + { test_filled_shapes, "Filled Shape Drawing", 24766.28 }, + { test_text, "Text Drawing", 1690.43 }, + { test_icons, "Icon Blitting", 1933.45 }, + { NULL, NULL } +}; + +static gchar *phrase = NULL; + +static gboolean keypress_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data) +{ + const int magic[] = { 0x1b, 0x33, 0x3a, 0x35, 0x51 }; + const int states[] = { 0xff52, 0xff52, 0xff54, 0xff54, + 0xff51, 0xff53, 0xff51, 0xff53, + 0x62, 0x61 }; + static int state = 0; + + if (event->keyval == states[state]) { + state++; + } else { + state = 0; + } + + if (state == G_N_ELEMENTS(states)) { + int i; + + for (i = 0; i < G_N_ELEMENTS(magic); i++) { + phrase[i + 6] = magic[i] ^ (states[i] & (states[i] >> 8)); + } + + state = 0; + } + + return FALSE; +} + +static double test_icons(GtkWindow *window) +{ + GdkPixbuf *pixbufs[3]; + GdkGC *gc; + GRand *rand; + GTimer *timer; + double time; + GdkWindow *gdk_window = GTK_WIDGET(window)->window; + int icons; + + gdk_window_clear(gdk_window); + + rand = g_rand_new(); + gc = gdk_gc_new(GDK_DRAWABLE(gdk_window)); + timer = g_timer_new(); + + pixbufs[0] = icon_cache_get_pixbuf("logo.png"); + pixbufs[1] = icon_cache_get_pixbuf("syncmanager.png"); + pixbufs[2] = icon_cache_get_pixbuf("report-large.png"); + + g_timer_start(timer); + for (icons = N_ITERATIONS; icons >= 0; icons--) { + int x, y; + + x = g_rand_int_range(rand, 0, 800); + y = g_rand_int_range(rand, 0, 600); + + gdk_draw_pixbuf(GDK_DRAWABLE(gdk_window), gc, + pixbufs[icons % G_N_ELEMENTS(pixbufs)], + 0, 0, x, y, 48, 48, + GDK_RGB_DITHER_NONE, 0, 0); + + while (gtk_events_pending()) { + gtk_main_iteration(); + } + } + g_timer_stop(timer); + + time = g_timer_elapsed(timer, NULL); + + g_rand_free(rand); + gdk_gc_destroy(gc); + g_timer_destroy(timer); + + return time; +} + +static double test_text(GtkWindow *window) +{ + GRand *rand; + GTimer *timer; + GdkGC *gc; + double time; + PangoLayout *layout; + PangoFontDescription *font; + GdkWindow *gdk_window = GTK_WIDGET(window)->window; + int strings; + + gdk_window_clear(gdk_window); + + rand = g_rand_new(); + gc = gdk_gc_new(GDK_DRAWABLE(gdk_window)); + timer = g_timer_new(); + + font = pango_font_description_new(); + layout = pango_layout_new(gtk_widget_get_pango_context(GTK_WIDGET(window))); + pango_layout_set_text(layout, phrase, -1); + + g_timer_start(timer); + for (strings = N_ITERATIONS; strings >= 0; strings--) { + int x, y, size; + + x = g_rand_int_range(rand, 0, 800); + y = g_rand_int_range(rand, 0, 600); + size = g_rand_int_range(rand, 1, 96) * PANGO_SCALE; + + pango_font_description_set_size(font, size); + pango_layout_set_font_description(layout, font); + gdk_draw_layout(GDK_DRAWABLE(gdk_window), gc, x, y, layout); + + gdk_rgb_gc_set_foreground(gc, strings << 8); + + while (gtk_events_pending()) { + gtk_main_iteration(); + } + + } + g_timer_stop(timer); + + time = g_timer_elapsed(timer, NULL); + + g_rand_free(rand); + gdk_gc_destroy(gc); + g_timer_destroy(timer); + g_object_unref(layout); + pango_font_description_free(font); + + return time; +} + +static double test_filled_shapes(GtkWindow *window) +{ + GRand *rand; + GTimer *timer; + GdkGC *gc; + double time; + GdkWindow *gdk_window = GTK_WIDGET(window)->window; + int lines; + + gdk_window_clear(gdk_window); + + rand = g_rand_new(); + gc = gdk_gc_new(GDK_DRAWABLE(gdk_window)); + timer = g_timer_new(); + + g_timer_start(timer); + for (lines = N_ITERATIONS; lines >= 0; lines--) { + int x1, y1; + + x1 = g_rand_int_range(rand, 0, 800); + y1 = g_rand_int_range(rand, 0, 600); + + gdk_rgb_gc_set_foreground(gc, lines << 8); + + gdk_draw_rectangle(GDK_DRAWABLE(gdk_window), gc, TRUE, + x1, y1, + g_rand_int_range(rand, 0, 400), + g_rand_int_range(rand, 0, 300)); + + while (gtk_events_pending()) { + gtk_main_iteration(); + } + } + g_timer_stop(timer); + + time = g_timer_elapsed(timer, NULL); + + g_rand_free(rand); + gdk_gc_destroy(gc); + g_timer_destroy(timer); + + return time; +} + +static double test_shapes(GtkWindow *window) +{ + GRand *rand; + GTimer *timer; + GdkGC *gc; + double time; + GdkWindow *gdk_window = GTK_WIDGET(window)->window; + int lines; + + gdk_window_clear(gdk_window); + + rand = g_rand_new(); + gc = gdk_gc_new(GDK_DRAWABLE(gdk_window)); + timer = g_timer_new(); + + g_timer_start(timer); + for (lines = N_ITERATIONS; lines >= 0; lines--) { + int x1, y1; + + x1 = g_rand_int_range(rand, 0, 800); + y1 = g_rand_int_range(rand, 0, 600); + + gdk_rgb_gc_set_foreground(gc, lines << 8); + + gdk_draw_rectangle(GDK_DRAWABLE(gdk_window), gc, FALSE, + x1, y1, + g_rand_int_range(rand, 0, 400), + g_rand_int_range(rand, 0, 300)); + while (gtk_events_pending()) { + gtk_main_iteration(); + } + } + g_timer_stop(timer); + + time = g_timer_elapsed(timer, NULL); + + g_rand_free(rand); + gdk_gc_destroy(gc); + g_timer_destroy(timer); + + return time; +} + +static double test_lines(GtkWindow *window) +{ + GRand *rand; + GTimer *timer; + GdkGC *gc; + double time; + GdkWindow *gdk_window = GTK_WIDGET(window)->window; + int lines; + + gdk_window_clear(gdk_window); + + rand = g_rand_new(); + gc = gdk_gc_new(GDK_DRAWABLE(gdk_window)); + timer = g_timer_new(); + + g_timer_start(timer); + for (lines = N_ITERATIONS; lines >= 0; lines--) { + int x1, y1, x2, y2; + + x1 = g_rand_int_range(rand, 0, 800); + y1 = g_rand_int_range(rand, 0, 600); + x2 = g_rand_int_range(rand, 0, 800); + y2 = g_rand_int_range(rand, 0, 600); + + gdk_draw_line(GDK_DRAWABLE(gdk_window), gc, x1, y1, x2, y2); + gdk_rgb_gc_set_foreground(gc, lines << 8); + + while (gtk_events_pending()) { + gtk_main_iteration(); + } + } + g_timer_stop(timer); + + time = g_timer_elapsed(timer, NULL); + + g_rand_free(rand); + gdk_gc_destroy(gc); + g_timer_destroy(timer); + + return time; +} + +double guibench(void) +{ + GtkWidget *window; + gdouble score = 0.0f; + gint i; + + phrase = g_strdup(PHRASE); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_set_size_request(window, 800, 600); + gtk_window_set_title(GTK_WINDOW(window), "guibench"); + + gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS); + gtk_widget_show(window); + + g_signal_connect(window, "key-press-event", G_CALLBACK(keypress_event), NULL); + + for (i = 0; tests[i].title; i++) { + double time; + + gtk_window_set_title(GTK_WINDOW(window), tests[i].title); + time = tests[i].callback(GTK_WINDOW(window)); + score += (N_ITERATIONS / time) / tests[i].weight; + } + + gtk_widget_destroy(window); + g_free(phrase); + + return (score / i) * 1000.0f; +} diff --git a/modules/benchmark/md5.c b/modules/benchmark/md5.c new file mode 100644 index 00000000..f4032ddd --- /dev/null +++ b/modules/benchmark/md5.c @@ -0,0 +1,317 @@ +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + */ + +/* This code was modified in 1997 by Jim Kingdon of Cyclic Software to + not require an integer type which is exactly 32 bits. This work + draws on the changes for the same purpose by Tatu Ylonen + as part of SSH, but since I didn't actually use + that code, there is no copyright issue. I hereby disclaim + copyright in any changes I have made; this code remains in the + public domain. */ + +#include /* for memcpy() and memset() */ + +/* Add prototype support. */ +#ifndef PROTO +#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__) +#define PROTO(ARGS) ARGS +#else +#define PROTO(ARGS) () +#endif +#endif + +#include "md5.h" + +#if defined(__OPTIMIZE__) +#error You must compile this program without "-O". (Or else the benchmark results may be different!) +#endif + +/* Little-endian byte-swapping routines. Note that these do not + depend on the size of datatypes such as uint32, nor do they require + us to detect the endianness of the machine we are running on. It + is possible they should be macros for speed, but I would be + surprised if they were a performance bottleneck for MD5. */ + +static uint32 getu32(addr) +const unsigned char *addr; +{ + return (((((unsigned long) addr[3] << 8) | addr[2]) << 8) + | addr[1]) << 8 | addr[0]; +} + +static void putu32(data, addr) +uint32 data; +unsigned char *addr; +{ + addr[0] = (unsigned char) data; + addr[1] = (unsigned char) (data >> 8); + addr[2] = (unsigned char) (data >> 16); + addr[3] = (unsigned char) (data >> 24); +} + +/* + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + * initialization constants. + */ +void MD5Init(ctx) +struct MD5Context *ctx; +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; +} + +/* + * Update context to reflect the concatenation of another buffer full + * of bytes. + */ +void MD5Update(ctx, buf, len) +struct MD5Context *ctx; +unsigned char const *buf; +unsigned len; +{ + uint32 t; + + /* Update bitcount */ + + t = ctx->bits[0]; + if ((ctx->bits[0] = (t + ((uint32) len << 3)) & 0xffffffff) < t) + ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + + /* Handle any leading odd-sized chunks */ + + if (t) { + unsigned char *p = ctx->in + t; + + t = 64 - t; + if (len < t) { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + MD5Transform(ctx->buf, ctx->in); + buf += t; + len -= t; + } + + /* Process data in 64-byte chunks */ + + while (len >= 64) { + memcpy(ctx->in, buf, 64); + MD5Transform(ctx->buf, ctx->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + + memcpy(ctx->in, buf, len); +} + +/* + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) + */ +void MD5Final(digest, ctx) +unsigned char digest[16]; +struct MD5Context *ctx; +{ + unsigned count; + unsigned char *p; + + /* Compute number of bytes mod 64 */ + count = (ctx->bits[0] >> 3) & 0x3F; + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = ctx->in + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) { + /* Two lots of padding: Pad the first block to 64 bytes */ + memset(p, 0, count); + MD5Transform(ctx->buf, ctx->in); + + /* Now fill the next block with 56 bytes */ + memset(ctx->in, 0, 56); + } else { + /* Pad block to 56 bytes */ + memset(p, 0, count - 8); + } + + /* Append length in bits and transform */ + putu32(ctx->bits[0], ctx->in + 56); + putu32(ctx->bits[1], ctx->in + 60); + + MD5Transform(ctx->buf, ctx->in); + putu32(ctx->buf[0], digest); + putu32(ctx->buf[1], digest + 4); + putu32(ctx->buf[2], digest + 8); + putu32(ctx->buf[3], digest + 12); + memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ +} + +#ifndef ASM_MD5 + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w &= 0xffffffff, w = w<>(32-s), w += x ) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +void MD5Transform(buf, inraw) +uint32 buf[4]; +const unsigned char inraw[64]; +{ + register uint32 a, b, c, d; + uint32 in[16]; + int i; + + for (i = 0; i < 16; ++i) + in[i] = getu32(inraw + 4 * i); + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} +#endif + +#ifdef TEST +/* Simple test program. Can use it to manually run the tests from + RFC1321 for example. */ +#include + +int main(int argc, char **argv) +{ + struct MD5Context context; + unsigned char checksum[16]; + int i; + int j; + + if (argc < 2) { + fprintf(stderr, "usage: %s string-to-hash\n", argv[0]); + exit(1); + } + for (j = 1; j < argc; ++j) { + printf("MD5 (\"%s\") = ", argv[j]); + MD5Init(&context); + MD5Update(&context, argv[j], strlen(argv[j])); + MD5Final(checksum, &context); + for (i = 0; i < 16; i++) { + printf("%02x", (unsigned int) checksum[i]); + } + printf("\n"); + } + return 0; +} +#endif /* TEST */ diff --git a/modules/benchmark/nqueens.c b/modules/benchmark/nqueens.c new file mode 100644 index 00000000..a32ed8c1 --- /dev/null +++ b/modules/benchmark/nqueens.c @@ -0,0 +1,66 @@ +/* + * N-Queens Problem Solver + * Found somewhere on the Internet; can't remember where. Possibly Wikipedia. + */ +#include +#include +#include + +#include "hardinfo.h" +#include "benchmark.h" + +#define QUEENS 11 + +int row[QUEENS]; + +bool safe(int x, int y) +{ + int i; + for (i = 1; i <= y; i++) + if (row[y - i] == x || row[y - i] == x - i || row[y - i] == x + i) + return false; + return true; +} + +int nqueens(int y) +{ + int x; + + for (x = 0; x < QUEENS; x++) { + if (safe((row[y - 1] = x), y - 1)) { + if (y < QUEENS) { + nqueens(y + 1); + } else { + break; + } + } + } + + return 0; +} + +static gpointer nqueens_for(unsigned int start, unsigned int end, void *data, gint thread_number) +{ + unsigned int i; + + for (i = start; i <= end; i++) { + nqueens(0); + } + + return NULL; +} + +void +benchmark_nqueens(void) +{ + 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/modules/benchmark/raytrace.c b/modules/benchmark/raytrace.c new file mode 100644 index 00000000..2ee36a93 --- /dev/null +++ b/modules/benchmark/raytrace.c @@ -0,0 +1,47 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "benchmark.h" + +void fbench(); /* fbench.c */ + +static gpointer +parallel_raytrace(unsigned int start, unsigned int end, gpointer data, gint thread_number) +{ + unsigned int i; + + for (i = start; i <= end; i++) { + fbench(); + } + + return NULL; +} + +void +benchmark_raytrace(void) +{ + gdouble elapsed = 0; + + shell_view_set_enabled(FALSE); + shell_status_update("Performing John Walker's FBENCH..."); + + elapsed = benchmark_parallel_for(0, 1000, parallel_raytrace, NULL); + + bench_results[BENCHMARK_RAYTRACE] = elapsed; +} + diff --git a/modules/benchmark/sha1.c b/modules/benchmark/sha1.c new file mode 100644 index 00000000..b94ce254 --- /dev/null +++ b/modules/benchmark/sha1.c @@ -0,0 +1,329 @@ +/* +SHA-1 in C +By Steve Reid +100% Public Domain + +Test Vectors (from FIPS PUB 180-1) +"abc" + A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D +"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 +A million repetitions of "a" + 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F +*/ + + +/* #define SHA1HANDSOFF * Copies data before messing with it. */ + +#include +#include +#include + +#if defined(__OPTIMIZE__) +#error You must compile this program without "-O". +#endif + + +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) + +/* blk0() and blk() perform the initial expand. */ +/* I got the idea of expanding during the round function from SSLeay */ +#ifdef LITTLE_ENDIAN +#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ + |(rol(block->l[i],8)&0x00FF00FF)) +#else +#define blk0(i) block->l[i] +#endif +#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ + ^block->l[(i+2)&15]^block->l[i&15],1)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); +#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); +#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); + + +/* Hash a single 512-bit block. This is the core of the algorithm. */ + +void SHA1Transform(guint32 state[5], guchar buffer[64]) +{ + guint32 a, b, c, d, e; + typedef union { + guchar c[64]; + guint32 l[16]; + } CHAR64LONG16; + CHAR64LONG16 *block; +#ifdef SHA1HANDSOFF + static guchar workspace[64]; + block = (CHAR64LONG16 *) workspace; + memcpy(block, buffer, 64); +#else + block = (CHAR64LONG16 *) buffer; +#endif + /* Copy context->state[] to working vars */ + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0(a, b, c, d, e, 0); + R0(e, a, b, c, d, 1); + R0(d, e, a, b, c, 2); + R0(c, d, e, a, b, 3); + R0(b, c, d, e, a, 4); + R0(a, b, c, d, e, 5); + R0(e, a, b, c, d, 6); + R0(d, e, a, b, c, 7); + R0(c, d, e, a, b, 8); + R0(b, c, d, e, a, 9); + R0(a, b, c, d, e, 10); + R0(e, a, b, c, d, 11); + R0(d, e, a, b, c, 12); + R0(c, d, e, a, b, 13); + R0(b, c, d, e, a, 14); + R0(a, b, c, d, e, 15); + R1(e, a, b, c, d, 16); + R1(d, e, a, b, c, 17); + R1(c, d, e, a, b, 18); + R1(b, c, d, e, a, 19); + R2(a, b, c, d, e, 20); + R2(e, a, b, c, d, 21); + R2(d, e, a, b, c, 22); + R2(c, d, e, a, b, 23); + R2(b, c, d, e, a, 24); + R2(a, b, c, d, e, 25); + R2(e, a, b, c, d, 26); + R2(d, e, a, b, c, 27); + R2(c, d, e, a, b, 28); + R2(b, c, d, e, a, 29); + R2(a, b, c, d, e, 30); + R2(e, a, b, c, d, 31); + R2(d, e, a, b, c, 32); + R2(c, d, e, a, b, 33); + R2(b, c, d, e, a, 34); + R2(a, b, c, d, e, 35); + R2(e, a, b, c, d, 36); + R2(d, e, a, b, c, 37); + R2(c, d, e, a, b, 38); + R2(b, c, d, e, a, 39); + R3(a, b, c, d, e, 40); + R3(e, a, b, c, d, 41); + R3(d, e, a, b, c, 42); + R3(c, d, e, a, b, 43); + R3(b, c, d, e, a, 44); + R3(a, b, c, d, e, 45); + R3(e, a, b, c, d, 46); + R3(d, e, a, b, c, 47); + R3(c, d, e, a, b, 48); + R3(b, c, d, e, a, 49); + R3(a, b, c, d, e, 50); + R3(e, a, b, c, d, 51); + R3(d, e, a, b, c, 52); + R3(c, d, e, a, b, 53); + R3(b, c, d, e, a, 54); + R3(a, b, c, d, e, 55); + R3(e, a, b, c, d, 56); + R3(d, e, a, b, c, 57); + R3(c, d, e, a, b, 58); + R3(b, c, d, e, a, 59); + R4(a, b, c, d, e, 60); + R4(e, a, b, c, d, 61); + R4(d, e, a, b, c, 62); + R4(c, d, e, a, b, 63); + R4(b, c, d, e, a, 64); + R4(a, b, c, d, e, 65); + R4(e, a, b, c, d, 66); + R4(d, e, a, b, c, 67); + R4(c, d, e, a, b, 68); + R4(b, c, d, e, a, 69); + R4(a, b, c, d, e, 70); + R4(e, a, b, c, d, 71); + R4(d, e, a, b, c, 72); + R4(c, d, e, a, b, 73); + R4(b, c, d, e, a, 74); + R4(a, b, c, d, e, 75); + R4(e, a, b, c, d, 76); + R4(d, e, a, b, c, 77); + R4(c, d, e, a, b, 78); + R4(b, c, d, e, a, 79); + /* Add the working vars back into context.state[] */ + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + /* Wipe variables */ + a = b = c = d = e = 0; +} + + +/* SHA1Init - Initialize new context */ + +void SHA1Init(SHA1_CTX * context) +{ + /* SHA1 initialization constants */ + context->state[0] = 0x67452301; + context->state[1] = 0xEFCDAB89; + context->state[2] = 0x98BADCFE; + context->state[3] = 0x10325476; + context->state[4] = 0xC3D2E1F0; + context->count[0] = context->count[1] = 0; +} + + +/* Run your data through this. */ + +void SHA1Update(SHA1_CTX * context, guchar * data, guint32 len) +{ + guint32 i, j; + + j = (context->count[0] >> 3) & 63; + if ((context->count[0] += len << 3) < (len << 3)) + context->count[1]++; + context->count[1] += (len >> 29); + if ((j + len) > 63) { + memcpy(&context->buffer[j], data, (i = 64 - j)); + SHA1Transform(context->state, context->buffer); + for (; i + 63 < len; i += 64) { + SHA1Transform(context->state, &data[i]); + } + j = 0; + } else + i = 0; + memcpy(&context->buffer[j], &data[i], len - i); +} + + +/* Add padding and return the message digest. */ + +void SHA1Final(guchar digest[20], SHA1_CTX * context) +{ + guint32 i, j; + guchar finalcount[8]; + + for (i = 0; i < 8; i++) { + finalcount[i] = (guchar) ((context->count[(i >= 4 ? 0 : 1)] + >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */ + } + SHA1Update(context, (guchar *) "\200", 1); + while ((context->count[0] & 504) != 448) { + SHA1Update(context, (guchar *) "\0", 1); + } + SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ + for (i = 0; i < 20; i++) { + digest[i] = (guchar) + ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255); + } + /* Wipe variables */ + i = j = 0; + memset(context->buffer, 0, 64); + memset(context->state, 0, 20); + memset(context->count, 0, 8); + memset(&finalcount, 0, 8); +#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite it's own static vars */ + SHA1Transform(context->state, context->buffer); +#endif +} + +#ifdef SHA1_TEST +static char *b32_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; + +static void base32_encode_exactly(guchar * buf, gint len, + guchar * encbuf, gint enclen) +{ + gint i = 0; + guchar *ip = buf + len; + guchar *op = encbuf + enclen; + + switch (len % 5) { + case 0: + do { + g_assert(op - encbuf >= 8); + i = *--ip; /* Input #4 */ + *--op = b32_alphabet[i & 0x1f]; /* Ouput #7 */ + i >>= 5; /* upper <234>, input #4 */ + /* FALLTHROUGH */ + case 4: + i |= ((guint32) * --ip) << 3; /* had 3 bits in `i' */ + *--op = b32_alphabet[i & 0x1f]; /* Output #6 */ + i >>= 5; /* upper <401234>, input #3 */ + *--op = b32_alphabet[i & 0x1f]; /* Output #5 */ + i >>= 5; /* upper <4>, input #3 */ + /* FALLTHROUGH */ + case 3: + i |= ((guint32) * --ip) << 1; /* had 1 bits in `i' */ + *--op = b32_alphabet[i & 0x1f]; /* Output #4 */ + i >>= 5; /* upper <1234>, input #2 */ + /* FALLTHROUGH */ + case 2: + i |= ((guint32) * --ip) << 4; /* had 4 bits in `i' */ + *--op = b32_alphabet[i & 0x1f]; /* Output #3 */ + i >>= 5; /* upper <3401234>, input #1 */ + *--op = b32_alphabet[i & 0x1f]; /* Output #2 */ + i >>= 5; /* upper <34>, input #1 */ + /* FALLTHROUGH */ + case 1: + i |= ((guint32) * --ip) << 2; /* had 2 bits in `i' */ + *--op = b32_alphabet[i & 0x1f]; /* Output #1 */ + i >>= 5; /* upper <01234>, input #0 */ + *--op = b32_alphabet[i & 0x1f]; /* Output #0 */ + i >>= 5; /* Holds nothing, MBZ */ + g_assert(i == 0); + g_assert(op >= encbuf); + } while (op > encbuf); + } +} + + + +/*************************************************************/ + +int main(int argc, char **argv) +{ + gint i, j; + SHA1_CTX context; + guchar digest[20], buffer[16384]; + FILE *file; + + if (argc > 2) { + puts("Public domain SHA-1 implementation - by Steve Reid "); + puts("Produces the SHA-1 hash of a file, or stdin if no file is specified."); + exit(0); + } + if (argc < 2) { + file = stdin; + } else { + if (!(file = fopen(argv[1], "rb"))) { + fputs("Unable to open file.", stderr); + exit(-1); + } + } + SHA1Init(&context); + while (!feof(file)) { /* note: what if ferror(file) */ + i = fread(buffer, 1, 16384, file); + SHA1Update(&context, buffer, i); + } + SHA1Final(digest, &context); + fclose(file); + + for (i = 0; i < 5; i++) { + for (j = 0; j < 4; j++) { + printf("%02X", digest[i*4+j]); + } + putchar(' '); + } + putchar('\n'); + + { + guchar tmp[33]; + tmp[32] = '\0'; + base32_encode_exactly(digest, 20, tmp, 32); + printf("%s\n", tmp); + } + + exit(0); +} +#endif /* SHA1_TEST */ diff --git a/modules/computer.c b/modules/computer.c new file mode 100644 index 00000000..eda405e8 --- /dev/null +++ b/modules/computer.c @@ -0,0 +1,716 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2008 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include "computer.h" + +/* Callbacks */ +gchar *callback_summary(); +gchar *callback_os(); +gchar *callback_modules(); +gchar *callback_boots(); +gchar *callback_locales(); +gchar *callback_fs(); +gchar *callback_display(); +gchar *callback_network(); +gchar *callback_users(); +gchar *callback_groups(); +gchar *callback_env_var(); +#if GLIB_CHECK_VERSION(2,14,0) +gchar *callback_dev(); +#endif /* GLIB_CHECK_VERSION(2,14,0) */ + +/* Scan callbacks */ +void scan_summary(gboolean reload); +void scan_os(gboolean reload); +void scan_modules(gboolean reload); +void scan_boots(gboolean reload); +void scan_locales(gboolean reload); +void scan_fs(gboolean reload); +void scan_display(gboolean reload); +void scan_network(gboolean reload); +void scan_users(gboolean reload); +void scan_groups(gboolean reload); +void scan_env_var(gboolean reload); +#if GLIB_CHECK_VERSION(2,14,0) +void scan_dev(gboolean reload); +#endif /* GLIB_CHECK_VERSION(2,14,0) */ + +static ModuleEntry entries[] = { + {N_("Summary"), "summary.png", callback_summary, scan_summary, MODULE_FLAG_NONE}, + {N_("Operating System"), "os.png", callback_os, scan_os, MODULE_FLAG_NONE}, + {N_("Kernel Modules"), "module.png", callback_modules, scan_modules, MODULE_FLAG_NONE}, + {N_("Boots"), "boot.png", callback_boots, scan_boots, MODULE_FLAG_NONE}, + {N_("Languages"), "language.png", callback_locales, scan_locales, MODULE_FLAG_NONE}, + {N_("Filesystems"), "dev_removable.png", callback_fs, scan_fs, MODULE_FLAG_NONE}, + {N_("Display"), "monitor.png", callback_display, scan_display, MODULE_FLAG_NONE}, + {N_("Environment Variables"), "environment.png", callback_env_var, scan_env_var, MODULE_FLAG_NONE}, +#if GLIB_CHECK_VERSION(2,14,0) + {N_("Development"), "devel.png", callback_dev, scan_dev, MODULE_FLAG_NONE}, +#endif /* GLIB_CHECK_VERSION(2,14,0) */ + {N_("Users"), "users.png", callback_users, scan_users, MODULE_FLAG_NONE}, + {N_("Groups"), "users.png", callback_groups, scan_groups, MODULE_FLAG_NONE}, + {NULL}, +}; + +gchar *module_list = NULL; +Computer *computer = NULL; + +gchar *hi_more_info(gchar * entry) +{ + gchar *info = moreinfo_lookup_with_prefix("COMP", entry); + + if (info) + return g_strdup(info); + + return g_strdup_printf("[%s]", entry); +} + +gchar *hi_get_field(gchar * field) +{ + gchar *tmp; + + if (g_str_equal(field, _("Memory"))) { + MemoryInfo *mi = computer_get_memory(); + tmp = g_strdup_printf(_("%dMB (%dMB used)"), mi->total, mi->used); + g_free(mi); + } else if (g_str_equal(field, _("Uptime"))) { + tmp = computer_get_formatted_uptime(); + } else if (g_str_equal(field, _("Date/Time"))) { + time_t t = time(NULL); + + tmp = g_new0(gchar, 64); + strftime(tmp, 64, "%c", localtime(&t)); + } else if (g_str_equal(field, _("Load Average"))) { + tmp = computer_get_formatted_loadavg(); + } else if (g_str_equal(field, _("Available entropy in /dev/random"))) { + tmp = computer_get_entropy_avail(); + } else { + tmp = g_strdup_printf("Unknown field: %s", field); + } + return tmp; +} + +void scan_summary(gboolean reload) +{ + SCAN_START(); + module_entry_scan_all_except(entries, 0); + computer->alsa = computer_get_alsainfo(); + SCAN_END(); +} + +void scan_os(gboolean reload) +{ + SCAN_START(); + computer->os = computer_get_os(); + SCAN_END(); +} + +void scan_modules(gboolean reload) +{ + SCAN_START(); + scan_modules_do(); + SCAN_END(); +} + +void scan_boots(gboolean reload) +{ + SCAN_START(); + scan_boots_real(); + SCAN_END(); +} + +void scan_locales(gboolean reload) +{ + SCAN_START(); + scan_os(FALSE); + scan_languages(computer->os); + SCAN_END(); +} + +void scan_fs(gboolean reload) +{ + SCAN_START(); + scan_filesystems(); + SCAN_END(); +} + +void scan_display(gboolean reload) +{ + SCAN_START(); + computer->display = computer_get_display(); + SCAN_END(); +} + +void scan_users(gboolean reload) +{ + SCAN_START(); + scan_users_do(); + SCAN_END(); +} + +void scan_groups(gboolean reload) +{ + SCAN_START(); + scan_groups_do(); + SCAN_END(); +} + +#if GLIB_CHECK_VERSION(2,14,0) +static gchar *dev_list = NULL; +void scan_dev(gboolean reload) +{ + SCAN_START(); + + int i; + struct { + gchar *compiler_name; + gchar *version_command; + gchar *regex; + gboolean stdout; + } detect_lang[] = { + { N_("Scripting Languages"), NULL, FALSE }, + { N_("CPython"), "python -V", "\\d+\\.\\d+\\.\\d+", TRUE }, + { N_("Perl"), "perl -v", "\\d+\\.\\d+\\.\\d+", TRUE }, + { N_("PHP"), "php --version", "\\d+\\.\\d+\\.\\S+", TRUE}, + { N_("Ruby"), "ruby --version", "\\d+\\.\\d+\\.\\d+", TRUE }, + { N_("Bash"), "bash --version", "\\d+\\.\\d+\\.\\S+", TRUE}, + { N_("Compilers"), NULL, FALSE }, + { N_("C (GCC)"), "gcc -v", "\\d+\\.\\d+\\.\\d+", FALSE }, + { N_("C (Clang)"), "clang -v", "\\d+\\.\\d+", FALSE }, + { N_("D (dmd)"), "dmd --help", "\\d+\\.\\d+", TRUE }, + { N_("Java"), "javac -version", "\\d+\\.\\d+\\.\\d+", FALSE }, + { N_("CSharp (Mono, old)"), "mcs --version", "\\d+\\.\\d+\\.\\d+\\.\\d+", TRUE }, + { N_("CSharp (Mono)"), "gmcs --version", "\\d+\\.\\d+\\.\\d+\\.\\d+", TRUE }, + { N_("Vala"), "valac --version", "\\d+\\.\\d+\\.\\d+", TRUE }, + { N_("Haskell (GHC)"), "ghc -v", "\\d+\\.\\d+\\.\\d+", FALSE }, + { N_("FreePascal"), "fpc -iV", "\\d+\\.\\d+\\.?\\d*", TRUE }, + { N_("Go"), "go version", "\\d+\\.\\d+\\.?\\d* ", TRUE }, + { N_("Tools"), NULL, FALSE }, + { N_("make"), "make --version", "\\d+\\.\\d+", TRUE }, + { N_("GDB"), "gdb --version", "\\d+\\.\\S+", TRUE }, + { N_("strace"), "strace -V", "\\d+\\.\\d+\\.?\\d*", TRUE }, + { N_("valgrind"), "valgrind --version", "\\d+\\.\\d+\\.\\S+", TRUE }, + { N_("QMake"), "qmake --version", "\\d+\\.\\S+", TRUE}, + { N_("CMake"), "cmake --version", "\\d+\\.\\d+\\.?\\d*", TRUE}, + }; + + g_free(dev_list); + + dev_list = g_strdup(""); + + for (i = 0; i < G_N_ELEMENTS(detect_lang); i++) { + gchar *version = NULL; + gchar *output; + gchar *temp; + GRegex *regex; + GMatchInfo *match_info; + gboolean found; + + if (!detect_lang[i].regex) { + dev_list = h_strdup_cprintf("[%s]\n", dev_list, detect_lang[i].compiler_name); + continue; + } + + if (detect_lang[i].stdout) { + found = g_spawn_command_line_sync(detect_lang[i].version_command, &output, NULL, NULL, NULL); + } else { + found = g_spawn_command_line_sync(detect_lang[i].version_command, NULL, &output, NULL, NULL); + } + + if (found) { + regex = g_regex_new(detect_lang[i].regex, 0, 0, NULL); + + g_regex_match(regex, output, 0, &match_info); + if (g_match_info_matches(match_info)) { + version = g_match_info_fetch(match_info, 0); + } + + g_match_info_free(match_info); + g_regex_unref(regex); + g_free(output); + } + + if (version) { + dev_list = h_strdup_cprintf("%s=%s\n", dev_list, detect_lang[i].compiler_name, version); + g_free(version); + } else { + dev_list = h_strdup_cprintf(_("%s=Not found\n"), dev_list, detect_lang[i].compiler_name); + } + + temp = g_strdup_printf(_("Detecting version: %s"), + detect_lang[i].compiler_name); + shell_status_update(temp); + g_free(temp); + } + + SCAN_END(); +} + +gchar *callback_dev() +{ + return g_strdup_printf(_("[$ShellParam$]\n" + "ColumnTitle$TextValue=Program\n" + "ColumnTitle$Value=Version\n" + "ShowColumnHeaders=true\n" + "%s"), dev_list); +} +#endif /* GLIB_CHECK_VERSION(2,14,0) */ + +/* Table based off imvirt by Thomas Liske + Copyright (c) 2008 IBH IT-Service GmbH under GPLv2. */ +gchar *computer_get_virtualization() +{ + gboolean found = FALSE; + gint i, j; + gchar *files[] = { + "/proc/scsi/scsi", + "/proc/cpuinfo", + "/var/log/dmesg", + NULL + }; + const static struct { + gchar *str; + gchar *vmtype; + } vm_types[] = { + /* VMware */ + { "VMware", "Virtual (VMware)" }, + { ": VMware Virtual IDE CDROM Drive", "Virtual (VMware)" }, + /* QEMU */ + { "QEMU", "Virtual (QEMU)" }, + { "QEMU Virtual CPU", "Virtual (QEMU)" }, + { ": QEMU HARDDISK", "Virtual (QEMU)" }, + { ": QEMU CD-ROM", "Virtual (QEMU)" }, + /* Generic Virtual Machine */ + { ": Virtual HD,", "Virtual (Unknown)" }, + { ": Virtual CD,", "Virtual (Unknown)" }, + /* Virtual Box */ + { "VBOX", "Virtual (VirtualBox)" }, + { ": VBOX HARDDISK", "Virtual (VirtualBox)" }, + { ": VBOX CD-ROM", "Virtual (VirtualBox)" }, + /* Xen */ + { "Xen virtual console", "Virtual (Xen)" }, + { "Xen reported: ", "Virtual (Xen)" }, + { "xen-vbd: registered block device", "Virtual (Xen)" }, + /* Generic */ + { " hypervisor", "Virtual (hypervisor present)"} , + { NULL } + }; + + DEBUG("Detecting virtual machine"); + + if (g_file_test("/proc/xen", G_FILE_TEST_EXISTS)) { + DEBUG("/proc/xen found; assuming Xen"); + return g_strdup("Xen"); + } + + for (i = 0; files[i+1]; i++) { + gchar buffer[512]; + FILE *file; + + if ((file = fopen(files[i], "r"))) { + while (!found && fgets(buffer, 512, file)) { + for (j = 0; vm_types[j+1].str; j++) { + if (strstr(buffer, vm_types[j].str)) { + found = TRUE; + break; + } + } + } + + fclose(file); + + if (found) { + DEBUG("%s found (by reading file %s)", + vm_types[j].vmtype, files[i]); + return g_strdup(vm_types[j].vmtype); + } + } + + } + + DEBUG("no virtual machine detected; assuming physical machine"); + + return g_strdup(_("Physical machine")); +} + +gchar *callback_summary() +{ + gchar *processor_name, *alsa_cards; + gchar *input_devices, *printers; + gchar *storage_devices, *summary; + gchar *virt; + + processor_name = module_call_method("devices::getProcessorName"); + alsa_cards = computer_get_alsacards(computer); + input_devices = module_call_method("devices::getInputDevices"); + printers = module_call_method("devices::getPrinters"); + storage_devices = module_call_method("devices::getStorageDevices"); + virt = computer_get_virtualization(); + + summary = g_strdup_printf(_("[$ShellParam$]\n" + "UpdateInterval$Memory=1000\n" + "UpdateInterval$Date/Time=1000\n" + "#ReloadInterval=5000\n" + "[Computer]\n" + "Processor=%s\n" + "Memory=...\n" + "Machine Type=%s\n" + "Operating System=%s\n" + "User Name=%s\n" + "Date/Time=...\n" + "[Display]\n" + "Resolution=%dx%d pixels\n" + "OpenGL Renderer=%s\n" + "X11 Vendor=%s\n" + "\n%s\n" + "[Input Devices]\n%s\n" + "\n%s\n" + "\n%s\n"), + processor_name, + virt, + computer->os->distro, + computer->os->username, + computer->display->width, + computer->display->height, + computer->display->ogl_renderer, + computer->display->vendor, + alsa_cards, + input_devices, printers, storage_devices); + + g_free(processor_name); + g_free(alsa_cards); + g_free(input_devices); + g_free(printers); + g_free(storage_devices); + g_free(virt); + + return summary; +} + +gchar *callback_os() +{ + return g_strdup_printf(_("[$ShellParam$]\n" + "UpdateInterval$Uptime=10000\n" + "UpdateInterval$Load Average=1000\n" + "UpdateInterval$Available entropy in /dev/random=1000\n" + "[Version]\n" + "Kernel=%s\n" + "Version=%s\n" + "C Library=%s\n" + "Distribution=%s\n" + "[Current Session]\n" + "Computer Name=%s\n" + "User Name=%s\n" + "#Language=%s\n" + "Home Directory=%s\n" + "Desktop Environment=%s\n" + "[Misc]\n" + "Uptime=...\n" + "Load Average=...\n" + "Available entropy in /dev/random=..."), + computer->os->kernel, + computer->os->kernel_version, + computer->os->libc, + computer->os->distro, + computer->os->hostname, + computer->os->username, + computer->os->language, + computer->os->homedir, + computer->os->desktop); +} + +gchar *callback_modules() +{ + return g_strdup_printf(_("[Loaded Modules]\n" + "%s" + "[$ShellParam$]\n" + "ViewType=1\n" + "ColumnTitle$TextValue=Name\n" + "ColumnTitle$Value=Description\n" + "ShowColumnHeaders=true\n"), module_list); +} + +gchar *callback_boots() +{ + return g_strdup_printf(_("[$ShellParam$]\n" + "ColumnTitle$TextValue=Date & Time\n" + "ColumnTitle$Value=Kernel Version\n" + "ShowColumnHeaders=true\n" + "\n" + "%s"), computer->os->boots); +} + +gchar *callback_locales() +{ + return g_strdup_printf(_("[$ShellParam$]\n" + "ViewType=1\n" + "ColumnTitle$TextValue=Language Code\n" + "ColumnTitle$Value=Name\n" + "ShowColumnHeaders=true\n" + "[Available Languages]\n" + "%s"), computer->os->languages); +} + +gchar *callback_fs() +{ + return g_strdup_printf(_("[$ShellParam$]\n" + "ViewType=4\n" + "ReloadInterval=5000\n" + "Zebra=1\n" + "NormalizePercentage=false\n" + "ColumnTitle$Extra1=Mount Point\n" + "ColumnTitle$Progress=Usage\n" + "ColumnTitle$TextValue=Device\n" + "ShowColumnHeaders=true\n" + "[Mounted File Systems]\n%s\n"), fs_list); +} + +gchar *callback_display() +{ + return g_strdup_printf(_("[Display]\n" + "Resolution=%dx%d pixels\n" + "Vendor=%s\n" + "Version=%s\n" + "[Monitors]\n" + "%s" + "[Extensions]\n" + "%s" + "[OpenGL]\n" + "Vendor=%s\n" + "Renderer=%s\n" + "Version=%s\n" + "Direct Rendering=%s\n"), + computer->display->width, + computer->display->height, + computer->display->vendor, + computer->display->version, + computer->display->monitors, + computer->display->extensions, + computer->display->ogl_vendor, + computer->display->ogl_renderer, + computer->display->ogl_version, + computer->display->dri ? _("Y_es") : _("No")); +} + +gchar *callback_users() +{ + return g_strdup_printf("[$ShellParam$]\n" + "ReloadInterval=10000\n" + "ViewType=1\n" + "[Users]\n" + "%s\n", users); +} + +gchar *callback_groups() +{ + return g_strdup_printf(_("[$ShellParam$]\n" + "ReloadInterval=10000\n" + "ColumnTitle$TextValue=Name\n" + "ColumnTitle$Value=Group ID\n" + "ShowColumnHeaders=true\n" + "[Groups]\n" + "%s\n"), groups); +} + +gchar *get_os_kernel(void) +{ + scan_os(FALSE); + return g_strdup(computer->os->kernel); +} + +gchar *get_os(void) +{ + scan_os(FALSE); + return g_strdup(computer->os->distro); +} + +gchar *get_display_summary(void) +{ + scan_display(FALSE); + + return g_strdup_printf("%dx%d\n" + "%s\n" + "%s", + computer->display->width, + computer->display->height, + computer->display->ogl_renderer, + computer->display->vendor); +} + +gchar *get_kernel_module_description(gchar *module) +{ + gchar *description; + + if (!_module_hash_table) { + scan_modules(FALSE); + } + + description = g_hash_table_lookup(_module_hash_table, module); + if (!description) { + return NULL; + } + + return g_strdup(description); +} + +gchar *get_audio_cards(void) +{ + if (!computer->alsa) { + computer->alsa = computer_get_alsainfo(); + } + + return computer_get_alsacards(computer); +} + +ShellModuleMethod *hi_exported_methods(void) +{ + static ShellModuleMethod m[] = { + {"getOSKernel", get_os_kernel}, + {"getOS", get_os}, + {"getDisplaySummary", get_display_summary}, + {"getAudioCards", get_audio_cards}, + {"getKernelModuleDescription", get_kernel_module_description}, + {NULL} + }; + + return m; +} + +ModuleEntry *hi_module_get_entries(void) +{ + return entries; +} + +gchar *hi_module_get_name(void) +{ + return g_strdup(_("Computer")); +} + +guchar hi_module_get_weight(void) +{ + return 80; +} + +gchar **hi_module_get_dependencies(void) +{ + static gchar *deps[] = { "devices.so", NULL }; + + return deps; +} + +gchar *hi_module_get_summary(void) +{ + return g_strdup("[Operating System]\n" + "Icon=os.png\n" + "Method=computer::getOS\n" + "[CPU]\n" + "Icon=processor.png\n" + "Method=devices::getProcessorName\n" + "[RAM]\n" + "Icon=memory.png\n" + "Method=devices::getMemoryTotal\n" + "[Motherboard]\n" + "Icon=module.png\n" + "Method=devices::getMotherboard\n" + "[Graphics]\n" + "Icon=monitor.png\n" + "Method=computer::getDisplaySummary\n" + "[Storage]\n" + "Icon=hdd.png\n" + "Method=devices::getStorageDevices\n" + "[Printers]\n" + "Icon=printer.png\n" + "Method=devices::getPrinters\n" + "[Audio]\n" + "Icon=audio.png\n" + "Method=computer::getAudioCards\n"); +} + +void hi_module_deinit(void) +{ + if (computer->os) { + g_free(computer->os->kernel); + g_free(computer->os->libc); + g_free(computer->os->distrocode); + g_free(computer->os->distro); + g_free(computer->os->hostname); + g_free(computer->os->language); + g_free(computer->os->homedir); + g_free(computer->os->kernel_version); + g_free(computer->os->languages); + g_free(computer->os->desktop); + g_free(computer->os->username); + g_free(computer->os->boots); + g_free(computer->os); + } + + if (computer->display) { + g_free(computer->display->ogl_vendor); + g_free(computer->display->ogl_renderer); + g_free(computer->display->ogl_version); + g_free(computer->display->display_name); + g_free(computer->display->vendor); + g_free(computer->display->version); + g_free(computer->display->extensions); + g_free(computer->display->monitors); + g_free(computer->display); + } + + if (computer->alsa) { + g_slist_free(computer->alsa->cards); + g_free(computer->alsa); + } + + g_free(computer->date_time); + g_free(computer); + + moreinfo_del_with_prefix("COMP"); +} + +void hi_module_init(void) +{ + computer = g_new0(Computer, 1); +} + +ModuleAbout *hi_module_get_about(void) +{ + static ModuleAbout ma[] = { + { + .author = "Leandro A. F. Pereira", + .description = N_("Gathers high-level computer information"), + .version = VERSION, + .license = "GNU GPL version 2"} + }; + + return ma; +} + diff --git a/modules/computer/alsa.c b/modules/computer/alsa.c new file mode 100644 index 00000000..e1e7b946 --- /dev/null +++ b/modules/computer/alsa.c @@ -0,0 +1,71 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "computer.h" + +gchar * +computer_get_alsacards(Computer * computer) +{ + GSList *p; + gchar *tmp = g_strdup(_("[Audio Devices]\n")); + gint n = 0; + + if (computer->alsa) { + for (p = computer->alsa->cards; p; p = p->next) { + AlsaCard *ac = (AlsaCard *) p->data; + + tmp = h_strdup_cprintf(_("Audio Adapter#%d=%s\n"), + tmp, ++n, ac->friendly_name); + } + } + + return tmp; +} + +AlsaInfo * +computer_get_alsainfo(void) +{ + AlsaInfo *ai; + AlsaCard *ac; + FILE *cards; + gchar buffer[128]; + + cards = fopen("/proc/asound/cards", "r"); + if (!cards) + return NULL; + + ai = g_new0(AlsaInfo, 1); + + while (fgets(buffer, 128, cards)) { + gchar **tmp; + + ac = g_new0(AlsaCard, 1); + + tmp = g_strsplit(buffer, ":", 0); + + ac->friendly_name = g_strdup(tmp[1]); + ai->cards = g_slist_append(ai->cards, ac); + + g_strfreev(tmp); + (void)fgets(buffer, 128, cards); /* skip next line */ + } + fclose(cards); + + return ai; +} diff --git a/modules/computer/boots.c b/modules/computer/boots.c new file mode 100644 index 00000000..478e89ac --- /dev/null +++ b/modules/computer/boots.c @@ -0,0 +1,65 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "hardinfo.h" +#include "computer.h" + +void +scan_boots_real(void) +{ + FILE *last; + char buffer[256]; + + scan_os(FALSE); + + if (!computer->os->boots) + computer->os->boots = g_strdup(_("[Boots]\n")); + else + return; + + last = popen("last", "r"); + if (last) { + while (fgets(buffer, 256, last)) { + if (strstr(buffer, "system boot")) { + gchar **tmp, *buf = buffer; + + strend(buffer, '\n'); + + while (*buf) { + if (*buf == ' ' && *(buf + 1) == ' ') { + memmove(buf, buf + 1, strlen(buf) + 1); + + buf--; + } else { + buf++; + } + } + + tmp = g_strsplit(buffer, " ", 0); + computer->os->boots = h_strdup_cprintf("\n%s %s %s %s=%s|%s", + computer->os->boots, + tmp[4], tmp[5], tmp[6], tmp[7], tmp[3], tmp[8]); + g_strfreev(tmp); + } + } + + pclose(last); + } +} diff --git a/modules/computer/display.c b/modules/computer/display.c new file mode 100644 index 00000000..2c98b144 --- /dev/null +++ b/modules/computer/display.c @@ -0,0 +1,148 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "hardinfo.h" +#include "computer.h" + +static void +get_glx_info(DisplayInfo *di) +{ + gchar *output; + if (g_spawn_command_line_sync("glxinfo", &output, NULL, NULL, NULL)) { + gchar **output_lines; + gint i = 0; + + for (output_lines = g_strsplit(output, "\n", 0); + output_lines && output_lines[i]; + i++) { + if (strstr(output_lines[i], "OpenGL")) { + gchar **tmp = g_strsplit(output_lines[i], ":", 0); + + tmp[1] = g_strchug(tmp[1]); + + get_str("OpenGL vendor str", di->ogl_vendor); + get_str("OpenGL renderer str", di->ogl_renderer); + get_str("OpenGL version str", di->ogl_version); + + g_strfreev(tmp); + } else if (strstr(output_lines[i], "direct rendering: Yes")) { + di->dri = TRUE; + } + } + + g_free(output); + g_strfreev(output_lines); + + if (!di->ogl_vendor) + di->ogl_vendor = "Unknown"; + if (!di->ogl_renderer) + di->ogl_renderer = "Unknown"; + if (!di->ogl_version) + di->ogl_version = "Unknown"; + } else { + di->ogl_vendor = di->ogl_renderer = di->ogl_version = "Unknown"; + } + +} + +static void +get_x11_info(DisplayInfo *di) +{ + gchar *output; + + if (g_spawn_command_line_sync("xdpyinfo", &output, NULL, NULL, NULL)) { + gchar **output_lines, **old; + + output_lines = g_strsplit(output, "\n", 0); + g_free(output); + + old = output_lines; + while (*(output_lines++)) { + gchar **tmp = g_strsplit(*output_lines, ":", 0); + + if (tmp[1] && tmp[0]) { + tmp[1] = g_strchug(tmp[1]); + + get_str("vendor string", di->vendor); + get_str("X.Org version", di->version); + get_str("XFree86 version", di->version); + + if (g_str_has_prefix(tmp[0], "number of extensions")) { + int n; + + di->extensions = g_strdup(""); + + for (n = atoi(tmp[1]); n; n--) { + di->extensions = h_strconcat(di->extensions, + g_strstrip(*(++output_lines)), + "=\n", + NULL); + } + g_strfreev(tmp); + + break; + } + } + + g_strfreev(tmp); + } + + g_strfreev(old); + } + + GdkScreen *screen = gdk_screen_get_default(); + + if (screen && GDK_IS_SCREEN(screen)) { + gint n_monitors = gdk_screen_get_n_monitors(screen); + gint i; + + di->monitors = NULL; + for (i = 0; i < n_monitors; i++) { + GdkRectangle rect; + + gdk_screen_get_monitor_geometry(screen, i, &rect); + + di->monitors = h_strdup_cprintf(_("Monitor %d=%dx%d pixels\n"), + di->monitors, i, rect.width, rect.height); + } + } else { + di->monitors = ""; + } +} + +DisplayInfo * +computer_get_display(void) +{ + DisplayInfo *di = g_new0(DisplayInfo, 1); + + GdkScreen *screen = gdk_screen_get_default(); + + if (screen && GDK_IS_SCREEN(screen)) { + di->width = gdk_screen_get_width(screen); + di->height = gdk_screen_get_height(screen); + } else { + di->width = di->height = 0; + } + + get_glx_info(di); + get_x11_info(di); + + return di; +} diff --git a/modules/computer/environment.c b/modules/computer/environment.c new file mode 100644 index 00000000..2a8d235c --- /dev/null +++ b/modules/computer/environment.c @@ -0,0 +1,45 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2008 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "computer.h" + +static gchar *_env = NULL; +void scan_env_var(gboolean reload) +{ + SCAN_START(); + + gchar **envlist; + gint i; + + g_free(_env); + + _env = g_strdup(_("[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 g_strdup(_env); +} diff --git a/modules/computer/filesystem.c b/modules/computer/filesystem.c new file mode 100644 index 00000000..a7162777 --- /dev/null +++ b/modules/computer/filesystem.c @@ -0,0 +1,103 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Some code from xfce4-mount-plugin, version 0.4.3 + * Copyright (C) 2005 Jean-Baptiste jb_dul@yahoo.com + * Distributed under the terms of GNU GPL 2. + */ + +#include +#include +#include "hardinfo.h" +#include "computer.h" + +gchar *fs_list = NULL; + +void +scan_filesystems(void) +{ + FILE *mtab; + gchar buf[1024]; + struct statfs sfs; + int count = 0; + + g_free(fs_list); + fs_list = g_strdup(""); + moreinfo_del_with_prefix("COMP:FS"); + + mtab = fopen("/etc/mtab", "r"); + if (!mtab) + return; + + while (fgets(buf, 1024, mtab)) { + gfloat size, used, avail; + gchar **tmp; + + tmp = g_strsplit(buf, " ", 0); + if (!statfs(tmp[1], &sfs)) { + gfloat use_ratio; + + size = (float) sfs.f_bsize * (float) sfs.f_blocks; + avail = (float) sfs.f_bsize * (float) sfs.f_bavail; + used = size - avail; + + if (size == 0.0f) { + continue; + } + + if (avail == 0.0f) { + use_ratio = 100.0f; + } else { + use_ratio = 100.0f * (used / size); + } + + gchar *strsize = size_human_readable(size), + *stravail = size_human_readable(avail), + *strused = size_human_readable(used); + + gchar *strhash; + + strreplacechr(tmp[0], "#", '_'); + strhash = g_strdup_printf("[%s]\n" + "Filesystem=%s\n" + "Mounted As=%s\n" + "Mount Point=%s\n" + "Size=%s\n" + "Used=%s\n" + "Available=%s\n", + tmp[0], + tmp[2], + strstr(tmp[3], "rw") ? "Read-Write" : + "Read-Only", tmp[1], strsize, strused, + stravail); + gchar *key = g_strdup_printf("FS%d", ++count); + moreinfo_add_with_prefix("COMP", key, strhash); + g_free(key); + + fs_list = h_strdup_cprintf("$FS%d$%s=%.2f %% (%s of %s)|%s\n", + fs_list, + count, tmp[0], use_ratio, stravail, strsize, tmp[1]); + + g_free(strsize); + g_free(stravail); + g_free(strused); + } + g_strfreev(tmp); + } + + fclose(mtab); +} diff --git a/modules/computer/groups.c b/modules/computer/groups.c new file mode 100644 index 00000000..244b8000 --- /dev/null +++ b/modules/computer/groups.c @@ -0,0 +1,45 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2012 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "hardinfo.h" +#include "computer.h" + +gchar *groups = NULL; + +void +scan_groups_do(void) +{ + struct group *group_; + + setgrent(); + group_ = getgrent(); + if (!group_) + return; + + g_free(groups); + groups = g_strdup(""); + + while (group_) { + groups = h_strdup_cprintf("%s=%d\n", groups, group_->gr_name, group_->gr_gid); + group_ = getgrent(); + } + + endgrent(); +} diff --git a/modules/computer/languages.c b/modules/computer/languages.c new file mode 100644 index 00000000..5877c41c --- /dev/null +++ b/modules/computer/languages.c @@ -0,0 +1,112 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "hardinfo.h" +#include "computer.h" + +void +scan_languages(OperatingSystem * os) +{ + FILE *locale; + gchar buf[512], *retval = NULL; + + locale = popen("locale -va && echo", "r"); + if (!locale) + return; + + gchar name[32]; + gchar *title = NULL, + *source = NULL, + *address = NULL, + *email = NULL, + *language = NULL, + *territory = NULL, + *revision = NULL, + *date = NULL, + *codeset = NULL; + + while (fgets(buf, 512, locale)) { + if (!strncmp(buf, "locale:", 7)) { + sscanf(buf, "locale: %s", name); + (void)fgets(buf, 128, locale); + } else if (strchr(buf, '|')) { + gchar **tmp = g_strsplit(buf, "|", 2); + + tmp[0] = g_strstrip(tmp[0]); + + if (tmp[1]) { + tmp[1] = g_strstrip(tmp[1]); + + get_str("title", title); + get_str("source", source); + get_str("address", address); + get_str("email", email); + get_str("language", language); + get_str("territory", territory); + get_str("revision", revision); + get_str("date", date); + get_str("codeset", codeset); + } + + g_strfreev(tmp); + } else { + gchar *currlocale; + + retval = h_strdup_cprintf("$%s$%s=%s\n", retval, name, name, title); + +#define FIELD(f) f ? f : "(Unknown)" + currlocale = g_strdup_printf("[Locale Information]\n" + "Name=%s (%s)\n" + "Source=%s\n" + "Address=%s\n" + "Email=%s\n" + "Language=%s\n" + "Territory=%s\n" + "Revision=%s\n" + "Date=%s\n" + "Codeset=%s\n", + name, FIELD(title), + FIELD(source), FIELD(address), + FIELD(email), FIELD(language), + FIELD(territory), FIELD(revision), + FIELD(date), FIELD(codeset)); +#undef FIELD + + moreinfo_add_with_prefix("COMP", name, currlocale); + + g_free(title); + g_free(source); + g_free(address); + g_free(email); + g_free(language); + g_free(territory); + g_free(revision); + g_free(date); + g_free(codeset); + + title = source = address = email = language = territory = \ + revision = date = codeset = NULL; + } + } + + fclose(locale); + + os->languages = retval; +} diff --git a/modules/computer/loadavg.c b/modules/computer/loadavg.c new file mode 100644 index 00000000..7311dbf0 --- /dev/null +++ b/modules/computer/loadavg.c @@ -0,0 +1,68 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "hardinfo.h" +#include "computer.h" + +static gboolean +computer_get_loadinfo(LoadInfo *li) +{ + FILE *procloadavg; + char buf[64]; + int ret; + + procloadavg = fopen("/proc/loadavg", "r"); + if (!procloadavg) + return FALSE; + + if (!fgets(buf, sizeof(buf), procloadavg)) { + fclose(procloadavg); + return FALSE; + } + + ret = sscanf(buf, "%f %f %f", &li->load1, &li->load5, &li->load15); + if (ret != 3) { + size_t len = strlen(buf); + size_t i; + + for (i = 0; i < len; i++) { + if (buf[i] == '.') + buf[i] = ','; + } + + ret = sscanf(buf, "%f %f %f", &li->load1, &li->load5, &li->load15); + } + + fclose(procloadavg); + + return ret == 3; +} + +gchar * +computer_get_formatted_loadavg() +{ + LoadInfo li; + + if (!computer_get_loadinfo(&li)) + return g_strdup(_("Couldn't obtain load average")); + + return g_strdup_printf("%.2f, %.2f, %.2f", li.load1, li.load5, + li.load15); +} diff --git a/modules/computer/memory.c b/modules/computer/memory.c new file mode 100644 index 00000000..3d320e8a --- /dev/null +++ b/modules/computer/memory.c @@ -0,0 +1,59 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "computer.h" + +MemoryInfo * +computer_get_memory(void) +{ + MemoryInfo *mi; + FILE *procmem; + gchar buffer[128]; + + procmem = fopen("/proc/meminfo", "r"); + if (!procmem) + return NULL; + mi = g_new0(MemoryInfo, 1); + + while (fgets(buffer, 128, procmem)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + + tmp[0] = g_strstrip(tmp[0]); + tmp[1] = g_strstrip(tmp[1]); + + get_int("MemTotal", mi->total); + get_int("MemFree", mi->free); + get_int("Cached", mi->cached); + + g_strfreev(tmp); + } + fclose(procmem); + + mi->used = mi->total - mi->free; + + mi->total /= 1000; + mi->cached /= 1000; + mi->used /= 1000; + mi->free /= 1000; + + mi->used -= mi->cached; + mi->ratio = 1 - (gdouble) mi->used / mi->total; + + return mi; +} diff --git a/modules/computer/modules.c b/modules/computer/modules.c new file mode 100644 index 00000000..bbc05f42 --- /dev/null +++ b/modules/computer/modules.c @@ -0,0 +1,169 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "hardinfo.h" +#include "computer.h" + +#define GET_STR(field_name,ptr) \ + if (!ptr && strstr(tmp[0], field_name)) { \ + ptr = g_markup_escape_text(g_strstrip(tmp[1]), strlen(tmp[1])); \ + g_strfreev(tmp); \ + continue; \ + } + +GHashTable *_module_hash_table = NULL; + +void +scan_modules_do(void) +{ + FILE *lsmod; + gchar buffer[1024]; + gchar *lsmod_path; + + if (!_module_hash_table) { + _module_hash_table = g_hash_table_new(g_str_hash, g_str_equal); + } + + g_free(module_list); + + module_list = NULL; + moreinfo_del_with_prefix("COMP:MOD"); + + lsmod_path = find_program("lsmod"); + if (!lsmod_path) + return; + lsmod = popen(lsmod_path, "r"); + if (!lsmod) { + g_free(lsmod_path); + return; + } + + (void)fgets(buffer, 1024, lsmod); /* Discards the first line */ + + while (fgets(buffer, 1024, lsmod)) { + gchar *buf, *strmodule, *hashkey; + gchar *author = NULL, + *description = NULL, + *license = NULL, + *deps = NULL, *vermagic = NULL, *filename = NULL, modname[64]; + FILE *modi; + glong memory; + + shell_status_pulse(); + + buf = buffer; + + sscanf(buf, "%s %ld", modname, &memory); + + hashkey = g_strdup_printf("MOD%s", modname); + buf = g_strdup_printf("/sbin/modinfo %s 2>/dev/null", modname); + + modi = popen(buf, "r"); + while (fgets(buffer, 1024, modi)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + + GET_STR("author", author); + GET_STR("description", description); + GET_STR("license", license); + GET_STR("depends", deps); + GET_STR("vermagic", vermagic); + GET_STR("filename", filename); + + g_strfreev(tmp); + } + pclose(modi); + g_free(buf); + + /* old modutils includes quotes in some strings; strip them */ + /*remove_quotes(modname); + remove_quotes(description); + remove_quotes(vermagic); + remove_quotes(author); + remove_quotes(license); */ + + /* old modutils displays when there's no value for a + given field; this is not desirable in the module name + display, so change it to an empty string */ + if (description && g_str_equal(description, "<none>")) { + g_free(description); + description = g_strdup(""); + + g_hash_table_insert(_module_hash_table, + g_strdup(modname), + g_strdup_printf("Kernel module (%s)", modname)); + } else { + g_hash_table_insert(_module_hash_table, + g_strdup(modname), + g_strdup(description)); + } + + /* append this module to the list of modules */ + module_list = h_strdup_cprintf("$%s$%s=%s\n", + module_list, + hashkey, + modname, + description ? description : ""); + +#define NONE_IF_NULL(var) (var) ? (var) : "N/A" + + /* create the module information string */ + strmodule = g_strdup_printf("[Module Information]\n" + "Path=%s\n" + "Used Memory=%.2fKiB\n" + "[Description]\n" + "Name=%s\n" + "Description=%s\n" + "Version Magic=%s\n" + "[Copyright]\n" + "Author=%s\n" + "License=%s\n", + NONE_IF_NULL(filename), + memory / 1024.0, + modname, + NONE_IF_NULL(description), + NONE_IF_NULL(vermagic), + NONE_IF_NULL(author), + NONE_IF_NULL(license)); + + /* if there are dependencies, append them to that string */ + if (deps && strlen(deps)) { + gchar **tmp = g_strsplit(deps, ",", 0); + + strmodule = h_strconcat(strmodule, + "\n[Dependencies]\n", + g_strjoinv("=\n", tmp), + "=\n", NULL); + g_strfreev(tmp); + g_free(deps); + } + + moreinfo_add_with_prefix("COMP", hashkey, strmodule); + g_free(hashkey); + + g_free(license); + g_free(description); + g_free(author); + g_free(vermagic); + g_free(filename); + } + pclose(lsmod); + + g_free(lsmod_path); +} diff --git a/modules/computer/os.c b/modules/computer/os.c new file mode 100644 index 00000000..3caf6c26 --- /dev/null +++ b/modules/computer/os.c @@ -0,0 +1,258 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "hardinfo.h" +#include "computer.h" + +static gchar * +get_libc_version(void) +{ + FILE *libc; + gchar buf[256], *tmp, *p; + char *libc_paths[] = { + "/lib/ld-uClibc.so.0", "/lib64/ld-uClibc.so.0", + "/lib/libc.so.6", "/lib64/libc.so.6" + }; + int i; + + for (i=0; i < 4; i++) { + if (g_file_test(libc_paths[i], G_FILE_TEST_EXISTS)) break; + } + switch (i) { + case 0: case 1: return g_strdup("uClibc Library"); + case 2: case 3: break; // gnu libc, continue processing + default: goto err; + } + + libc = popen(libc_paths[i], "r"); + if (!libc) goto err; + + (void)fgets(buf, 256, libc); + if (pclose(libc)) goto err; + + tmp = strstr(buf, "version "); + if (!tmp) goto err; + + p = strchr(tmp, ','); + if (p) *p = '\0'; + else goto err; + + return g_strdup_printf(_("GNU C Library version %s (%sstable)"), + strchr(tmp, ' ') + 1, + strstr(buf, " stable ") ? "" : _("un")); + err: + return g_strdup(_("Unknown")); +} + +#include + +void +detect_desktop_environment(OperatingSystem * os) +{ + const gchar *tmp = g_getenv("GNOME_DESKTOP_SESSION_ID"); + FILE *version; + char vers[16]; + + if (tmp) { + /* FIXME: this might not be true, as the gnome-panel in path + may not be the one that's running. + see where the user's running panel is and run *that* to + obtain the version. */ + version = popen("gnome-about --gnome-version", "r"); + if (version) { + (void)fscanf(version, _("Version: %s"), vers); + if (pclose(version)) + goto unknown; + } else { + goto unknown; + } + + os->desktop = g_strdup_printf("GNOME %s", vers); + } else if (g_getenv("KDE_FULL_SESSION")) { + + if (g_getenv("KDE_SESSION_VERSION") && strstr(g_getenv("KDE_SESSION_VERSION"),(gchar *)"4")) { + version = popen("kwin --version", "r"); + } else { + version = popen("kcontrol --version", "r"); + } + + if (version) { + char buf[32]; + + (void)fgets(buf, 32, version); + + (void)fscanf(version, "KDE: %s", vers); + if (pclose(version)) + goto unknown; + } else { + goto unknown; + } + + os->desktop = g_strdup_printf("KDE %s", vers); + } else { + unknown: + os->desktop = NULL; + + if (!g_getenv("DISPLAY")) { + os->desktop = g_strdup(_("Terminal")); + } else { + GdkScreen *screen = gdk_screen_get_default(); + + if (screen && GDK_IS_SCREEN(screen)) { + const gchar *windowman; + + windowman = gdk_x11_screen_get_window_manager_name(screen); + if (g_str_equal(windowman, "Xfwm4")) { + /* FIXME: check if xprop -root | grep XFCE_DESKTOP_WINDOW is defined */ + os->desktop = g_strdup("XFCE 4"); + } else if ((tmp = g_getenv("XDG_CURRENT_DESKTOP"))) { + os->desktop = g_strdup(tmp); + if ((tmp = g_getenv("DESKTOP_SESSION")) && !g_str_equal(os->desktop, tmp)) { + g_free(os->desktop); + os->desktop = g_strdup(tmp); + } + } + + if (!os->desktop) { + os->desktop = g_strdup_printf(_("Unknown (Window Manager: %s)"), + windowman); + } + } else { + os->desktop = g_strdup(_("Unknown")); + } + } + } +} + +gchar * +computer_get_entropy_avail(void) +{ + gint bits = h_sysfs_read_int("/proc/sys/kernel/random", "entropy_avail"); + if (bits < 200) + return g_strdup_printf("%d bits (low)", bits); + if (bits < 3000) + return g_strdup_printf("%d bits (medium)", bits); + return g_strdup_printf("%d bits (healthy)", bits); +} + +OperatingSystem * +computer_get_os(void) +{ + struct utsname utsbuf; + OperatingSystem *os; + int i; + + os = g_new0(OperatingSystem, 1); + + /* Attempt to get the Distribution name; try using /etc/lsb-release first, + then doing the legacy method (checking for /etc/$DISTRO-release files) */ + if (g_file_test("/etc/lsb-release", G_FILE_TEST_EXISTS)) { + FILE *release; + gchar buffer[128]; + + release = popen("lsb_release -d", "r"); + if (release) { + (void)fgets(buffer, 128, release); + pclose(release); + + os->distro = buffer; + os->distro = g_strdup(os->distro + strlen("Description:\t")); + } + } else if (g_file_test("/etc/arch-release", G_FILE_TEST_EXISTS)) { + os->distrocode = g_strdup("arch"); + os->distro = g_strdup("Arch Linux"); + } else { + for (i = 0;; i++) { + if (distro_db[i].file == NULL) { + os->distrocode = g_strdup("unk"); + os->distro = g_strdup(_("Unknown distribution")); + break; + } + + if (g_file_test(distro_db[i].file, G_FILE_TEST_EXISTS)) { + FILE *distro_ver; + char buf[128]; + + distro_ver = fopen(distro_db[i].file, "r"); + if (distro_ver) { + (void)fgets(buf, 128, distro_ver); + fclose(distro_ver); + } else { + continue; + } + + buf[strlen(buf) - 1] = 0; + + if (!os->distro) { + /* + * HACK: Some Debian systems doesn't include + * the distribuition name in /etc/debian_release, + * so add them here. + */ + if (!strncmp(distro_db[i].codename, "deb", 3) && + ((buf[0] >= '0' && buf[0] <= '9') || buf[0] != 'D')) { + os->distro = g_strdup_printf + ("Debian GNU/Linux %s", buf); + } else { + os->distro = g_strdup(buf); + } + } + + if (g_str_equal(distro_db[i].codename, "ppy")) { + gchar *tmp; + tmp = g_strdup_printf("Puppy Linux"); + g_free(os->distro); + os->distro = tmp; + } + + if (g_str_equal(distro_db[i].codename, "fatdog")) { + gchar *tmp; + tmp = g_strdup_printf("Fatdog64 [%.10s]", os->distro); + g_free(os->distro); + os->distro = tmp; + } + + os->distrocode = g_strdup(distro_db[i].codename); + + break; + } + } + } + + os->distro = g_strstrip(os->distro); + + /* Kernel and hostname info */ + uname(&utsbuf); + os->kernel_version = g_strdup(utsbuf.version); + os->kernel = g_strdup_printf("%s %s (%s)", utsbuf.sysname, + utsbuf.release, utsbuf.machine); + os->hostname = g_strdup(utsbuf.nodename); + os->language = g_strdup(g_getenv("LC_MESSAGES")); + os->homedir = g_strdup(g_get_home_dir()); + os->username = g_strdup_printf("%s (%s)", + g_get_user_name(), g_get_real_name()); + os->libc = get_libc_version(); + scan_languages(os); + detect_desktop_environment(os); + + os->entropy_avail = computer_get_entropy_avail(); + + return os; +} diff --git a/modules/computer/uptime.c b/modules/computer/uptime.c new file mode 100644 index 00000000..8eb563fa --- /dev/null +++ b/modules/computer/uptime.c @@ -0,0 +1,76 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "hardinfo.h" +#include "computer.h" + +UptimeInfo * +computer_get_uptime(void) +{ + UptimeInfo *ui = g_new0(UptimeInfo, 1); + FILE *procuptime; + gulong minutes; + + if ((procuptime = fopen("/proc/uptime", "r")) != NULL) { + (void)fscanf(procuptime, "%lu", &minutes); + ui->minutes = minutes / 60; + fclose(procuptime); + } else { + return NULL; + } + + ui->hours = ui->minutes / 60; + ui->minutes %= 60; + ui->days = ui->hours / 24; + ui->hours %= 24; + + return ui; +} + +gchar * +computer_get_formatted_uptime() +{ + UptimeInfo *ui; + gchar *tmp; + + ui = computer_get_uptime(); + + /* FIXME: Use ngettext */ +#define plural(x) ((x > 1) ? "s" : "") + + if (ui->days < 1) { + if (ui->hours < 1) { + tmp = + g_strdup_printf("%d minute%s", ui->minutes, + plural(ui->minutes)); + } else { + tmp = + g_strdup_printf("%d hour%s, %d minute%s", ui->hours, + plural(ui->hours), ui->minutes, + plural(ui->minutes)); + } + } else { + tmp = + g_strdup_printf("%d day%s, %d hour%s and %d minute%s", + ui->days, plural(ui->days), ui->hours, + plural(ui->hours), ui->minutes, + plural(ui->minutes)); + } + + g_free(ui); + return tmp; +} diff --git a/modules/computer/users.c b/modules/computer/users.c new file mode 100644 index 00000000..e8f891ac --- /dev/null +++ b/modules/computer/users.c @@ -0,0 +1,60 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include "hardinfo.h" +#include "computer.h" + +gchar *users = NULL; + +void +scan_users_do(void) +{ + struct passwd *passwd_; + passwd_ = getpwent(); + if (!passwd_) + return; + + if (users) { + g_free(users); + moreinfo_del_with_prefix("COMP:USER"); + } + + users = g_strdup(""); + + while (passwd_) { + gchar *key = g_strdup_printf("USER%s", passwd_->pw_name); + gchar *val = g_strdup_printf("[User Information]\n" + "User ID=%d\n" + "Group ID=%d\n" + "Home directory=%s\n" + "Default shell=%s\n", + (gint) passwd_->pw_uid, + (gint) passwd_->pw_gid, + passwd_->pw_dir, + passwd_->pw_shell); + moreinfo_add_with_prefix("COMP", key, val); + + strend(passwd_->pw_gecos, ','); + users = h_strdup_cprintf("$%s$%s=%s\n", users, key, passwd_->pw_name, passwd_->pw_gecos); + passwd_ = getpwent(); + g_free(key); + } + + endpwent(); +} diff --git a/modules/devices.c b/modules/devices.c new file mode 100644 index 00000000..87bb8a80 --- /dev/null +++ b/modules/devices.c @@ -0,0 +1,613 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __USE_XOPEN +#define __USE_XOPEN +#endif /* __USE_XOPEN */ + +#ifndef _XOPEN_SOURCE +#define _XOPEN_SOURCE +#endif /* _XOPEN_SOURCE */ + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "devices.h" + +gchar *callback_processors(); +gchar *callback_memory(); +gchar *callback_battery(); +gchar *callback_pci(); +gchar *callback_sensors(); +gchar *callback_printers(); +gchar *callback_storage(); +gchar *callback_input(); +gchar *callback_usb(); +#if defined(ARCH_x86) || defined(ARCH_x86_64) +gchar *callback_dmi(); +gchar *callback_spd(); +#endif +gchar *callback_device_resources(); + +void scan_processors(gboolean reload); +void scan_memory(gboolean reload); +void scan_battery(gboolean reload); +void scan_pci(gboolean reload); +void scan_sensors(gboolean reload); +void scan_printers(gboolean reload); +void scan_storage(gboolean reload); +void scan_input(gboolean reload); +void scan_usb(gboolean reload); +#if defined(ARCH_x86) || defined(ARCH_x86_64) +void scan_dmi(gboolean reload); +void scan_spd(gboolean reload); +#endif +void scan_device_resources(gboolean reload); + +gboolean root_required_for_resources(void); + +gchar *hi_more_info(gchar *entry); + +enum { + ENTRY_PROCESSOR, + ENTRY_MEMORY, + ENTRY_PCI, + ENTRY_USB, + ENTRY_PRINTERS, + ENTRY_BATTERY, + ENTRY_SENSORS, + ENTRY_INPUT, + ENTRY_STORAGE, + ENTRY_DMI, + ENTRY_SPD, + ENTRY_RESOURCES +}; + +static ModuleEntry entries[] = { + [ENTRY_PROCESSOR] = {N_("Processor"), "processor.png", callback_processors, scan_processors, MODULE_FLAG_NONE}, + [ENTRY_MEMORY] = {N_("Memory"), "memory.png", callback_memory, scan_memory, MODULE_FLAG_NONE}, + [ENTRY_PCI] = {N_("PCI Devices"), "devices.png", callback_pci, scan_pci, MODULE_FLAG_NONE}, + [ENTRY_USB] = {N_("USB Devices"), "usb.png", callback_usb, scan_usb, MODULE_FLAG_NONE}, + [ENTRY_PRINTERS] = {N_("Printers"), "printer.png", callback_printers, scan_printers, MODULE_FLAG_NONE}, + [ENTRY_BATTERY] = {N_("Battery"), "battery.png", callback_battery, scan_battery, MODULE_FLAG_NONE}, + [ENTRY_SENSORS] = {N_("Sensors"), "therm.png", callback_sensors, scan_sensors, MODULE_FLAG_NONE}, + [ENTRY_INPUT] = {N_("Input Devices"), "inputdevices.png", callback_input, scan_input, MODULE_FLAG_NONE}, + [ENTRY_STORAGE] = {N_("Storage"), "hdd.png", callback_storage, scan_storage, MODULE_FLAG_NONE}, +#if defined(ARCH_x86) || defined(ARCH_x86_64) + [ENTRY_DMI] = {N_("DMI"), "computer.png", callback_dmi, scan_dmi, MODULE_FLAG_NONE}, + [ENTRY_SPD] = {N_("Memory SPD"), "memory.png", callback_spd, scan_spd, MODULE_FLAG_NONE}, +#endif /* x86 or x86_64 */ + [ENTRY_RESOURCES] = {N_("Resources"), "resources.png", callback_device_resources, scan_device_resources, MODULE_FLAG_NONE}, + {NULL} +}; + +static GSList *processors = NULL; +gchar *printer_list = NULL; +gchar *printer_icons = NULL; +gchar *pci_list = NULL; +gchar *input_list = NULL; +gchar *storage_list = NULL; +gchar *battery_list = NULL; +gchar *meminfo = NULL; +gchar *lginterval = NULL; + +#include + +gchar *get_processor_name(void) +{ + scan_processors(FALSE); + + Processor *p = (Processor *) processors->data; + + if (g_slist_length(processors) > 1) { + return idle_free(g_strdup_printf("%dx %s", + g_slist_length(processors), + p->model_name)); + } else { + return p->model_name; + } +} + +gchar *get_storage_devices(void) +{ + scan_storage(FALSE); + + return storage_list; +} + +gchar *get_printers(void) +{ + scan_printers(FALSE); + + return printer_list; +} + +gchar *get_input_devices(void) +{ + scan_input(FALSE); + + return input_list; +} + +gchar *get_processor_count(void) +{ + scan_processors(FALSE); + + return g_strdup_printf("%d", g_slist_length(processors)); +} + +gchar *get_processor_frequency(void) +{ + Processor *p; + + scan_processors(FALSE); + + p = (Processor *)processors->data; + if (p->cpu_mhz == 0.0f) { + return g_strdup(N_("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) +{ + scan_memory(FALSE); + return moreinfo_lookup ("DEV:Total Memory"); //hi_more_info(N_("Total Memory")); +} + +/* information table from: http://elinux.org/RPi_HardwareHistory */ +static struct { + char *value, *intro, *model, *pcb, *mem, *mfg; +} rpi_boardinfo[] = { +/* Value Introduction Model Name PCB rev. Memory Manufacturer * + * Raspberry Pi %s */ + { "Beta", "Q1 2012", "B (Beta)", "?", "256MB", "(Beta board)" }, + { "0002", "Q1 2012", "B", "1.0", "256MB", "?" }, + { "0003", "Q3 2012", "B (ECN0001)", "1.0", "256MB", "(Fuses mod and D14 removed)" }, + { "0004", "Q3 2012", "B", "2.0", "256MB", "Sony" }, + { "0005", "Q4 2012", "B", "2.0", "256MB", "Qisda" }, + { "0006", "Q4 2012", "B", "2.0", "256MB", "Egoman" }, + { "0007", "Q1 2013", "A", "2.0", "256MB", "Egoman" }, + { "0008", "Q1 2013", "A", "2.0", "256MB", "Sony" }, + { "0009", "Q1 2013", "A", "2.0", "256MB", "Qisda" }, + { "000d", "Q4 2012", "B", "2.0", "512MB", "Egoman" }, + { "000e", "Q4 2012", "B", "2.0", "512MB", "Sony" }, + { "000f", "Q4 2012", "B", "2.0", "512MB", "Qisda" }, + { "0010", "Q3 2014", "B+", "1.0", "512MB", "Sony" }, + { "0011", "Q2 2014", "Compute Module 1", "1.0", "512MB", "Sony" }, + { "0012", "Q4 2014", "A+", "1.1", "256MB", "Sony" }, + { "0013", "Q1 2015", "B+", "1.2", "512MB", "?" }, + { "0014", "Q2 2014", "Compute Module 1", "1.0", "512MB", "Embest" }, + { "0015", "?", "A+", "1.1", "256MB/512MB", "Embest" }, + { "a01040", "Unknown", "2 Model B", "1.0", "1GB", "Sony" }, + { "a01041", "Q1 2015", "2 Model B", "1.1", "1GB", "Sony" }, + { "a21041", "Q1 2015", "2 Model B", "1.1", "1GB", "Embest" }, + { "a22042", "Q3 2016", "2 Model B", "1.2", "1GB", "Embest" }, /* (with BCM2837) */ + { "900021", "Q3 2016", "A+", "1.1", "512MB", "Sony" }, + { "900032", "Q2 2016?", "B+", "1.2", "512MB", "Sony" }, + { "900092", "Q4 2015", "Zero", "1.2", "512MB", "Sony" }, + { "900093", "Q2 2016", "Zero", "1.3", "512MB", "Sony" }, + { "920093", "Q4 2016?", "Zero", "1.3", "512MB", "Embest" }, + { "9000c1", "Q1 2017", "Zero W", "1.1", "512MB", "Sony" }, + { "a02082", "Q1 2016", "3 Model B", "1.2", "1GB", "Sony" }, + { "a020a0", "Q1 2017", "Compute Module 3 or CM3 Lite", "1.0", "1GB", "Sony" }, + { "a22082", "Q1 2016", "3 Model B", "1.2", "1GB", "Embest" }, + { "a32082", "Q4 2016", "3 Model B", "1.2", "1GB", "Sony Japan" }, + { NULL, NULL, NULL, NULL, NULL, NULL } +}; + +static gchar *rpi_get_boardname(void) { + int i = 0, c = 0; + gchar *ret = NULL; + gchar *soc = NULL; + gchar *revision = NULL; + int overvolt = 0; + FILE *cpuinfo; + gchar buffer[128]; + + cpuinfo = fopen("/proc/cpuinfo", "r"); + if (!cpuinfo) + return NULL; + while (fgets(buffer, 128, cpuinfo)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + tmp[0] = g_strstrip(tmp[0]); + tmp[1] = g_strstrip(tmp[1]); + get_str("Revision", revision); + get_str("Hardware", soc); + } + fclose(cpuinfo); + + if (revision == NULL || soc == NULL) { + g_free(soc); + g_free(revision); + return NULL; + } + + if (g_str_has_prefix(revision, "1000")) + overvolt = 1; + + while (rpi_boardinfo[i].value != NULL) { + if (overvolt) + /* +4 to ignore the 1000 prefix */ + c = g_strcmp0(revision+4, rpi_boardinfo[i].value); + else + c = g_strcmp0(revision, rpi_boardinfo[i].value); + + if (c == 0) { + ret = g_strdup_printf("Raspberry Pi %s (%s) pcb-rev:%s soc:%s mem:%s mfg-by:%s%s", + rpi_boardinfo[i].model, rpi_boardinfo[i].intro, + rpi_boardinfo[i].pcb, soc, + rpi_boardinfo[i].mem, rpi_boardinfo[i].mfg, + (overvolt) ? " (over-volted)" : "" ); + break; + } + i++; + } + g_free(soc); + g_free(revision); + return ret; +} + +gchar *get_motherboard(void) +{ + char *board_name, *board_vendor; +#if defined(ARCH_x86) || defined(ARCH_x86_64) + scan_dmi(FALSE); + + board_name = moreinfo_lookup("DEV:DMI:Board:Name"); + board_vendor = moreinfo_lookup("DEV:DMI:Board:Vendor"); + + if (board_name && board_vendor && *board_name && *board_vendor) + return g_strconcat(board_vendor, " ", board_name, NULL); + else if (board_name && *board_name) + return g_strconcat(board_name, _(" (vendor unknown)"), NULL); + else if (board_vendor && *board_vendor) + return g_strconcat(board_vendor, _(" (model unknown)"), NULL); +#else + /* use device tree "model" */ + if (g_file_get_contents("/proc/device-tree/model", &board_vendor, NULL, NULL)) { + + /* if a raspberry pi, try and get a more detailed name */ + if (g_str_has_prefix(board_vendor, "Raspberry Pi")) { + board_name = rpi_get_boardname(); + if (board_name != NULL) { + g_free(board_vendor); + return board_name; + } + } + + return board_vendor; + } +#endif + + return g_strdup(_("Unknown")); +} + +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}, + {"getMotherboard", get_motherboard}, + {NULL} + }; + + return m; +} + +gchar *hi_more_info(gchar * entry) +{ + gchar *info = moreinfo_lookup_with_prefix("DEV", entry); + + if (info) + return g_strdup(info); + + return g_strdup("?"); +} + +gchar *hi_get_field(gchar * field) +{ + gchar *info = moreinfo_lookup_with_prefix("DEV", field); + + if (info) + return g_strdup(info); + + return g_strdup(field); +} + +#if defined(ARCH_x86) || defined(ARCH_x86_64) +void scan_dmi(gboolean reload) +{ + SCAN_START(); + __scan_dmi(); + SCAN_END(); +} + +void scan_spd(gboolean reload) +{ + SCAN_START(); + scan_spd_do(); + SCAN_END(); +} +#endif + +void scan_processors(gboolean reload) +{ + SCAN_START(); + if (!processors) + processors = processor_scan(); + SCAN_END(); +} + +void scan_memory(gboolean reload) +{ + SCAN_START(); + scan_memory_do(); + SCAN_END(); +} + +void scan_battery(gboolean reload) +{ + SCAN_START(); + scan_battery_do(); + SCAN_END(); +} + +void scan_pci(gboolean reload) +{ + SCAN_START(); + scan_pci_do(); + SCAN_END(); +} + +void scan_sensors(gboolean reload) +{ + SCAN_START(); + scan_sensors_do(); + SCAN_END(); +} + +void scan_printers(gboolean reload) +{ + SCAN_START(); + scan_printers_do(); + SCAN_END(); +} + +void scan_storage(gboolean reload) +{ + SCAN_START(); + g_free(storage_list); + storage_list = g_strdup(""); + + __scan_ide_devices(); + __scan_scsi_devices(); + SCAN_END(); +} + +void scan_input(gboolean reload) +{ + SCAN_START(); + __scan_input_devices(); + SCAN_END(); +} + +void scan_usb(gboolean reload) +{ + SCAN_START(); + __scan_usb(); + SCAN_END(); +} + +gchar *callback_processors() +{ + return processor_get_info(processors); +} + +#if defined(ARCH_x86) || defined(ARCH_x86_64) +gchar *callback_dmi() +{ + return g_strdup(dmi_info); +} + +gchar *callback_spd() +{ + return g_strdup(spd_info); +} +#endif + +gchar *callback_memory() +{ + return g_strdup_printf("[Memory]\n" + "%s\n" + "[$ShellParam$]\n" + "ViewType=2\n" + "LoadGraphSuffix= kB\n" + "RescanInterval=2000\n" + "%s\n", meminfo, lginterval); +} + +gchar *callback_battery() +{ + return g_strdup_printf("%s\n" + "[$ShellParam$]\n" + "ReloadInterval=4000\n", battery_list); +} + +gchar *callback_pci() +{ + return g_strdup_printf("[PCI Devices]\n" + "%s" + "[$ShellParam$]\n" "ViewType=1\n", pci_list); +} + +gchar *callback_sensors() +{ + return g_strdup_printf("[$ShellParam$]\n" + "ReloadInterval=5000\n" "%s", sensors); +} + +gchar *callback_printers() +{ + return g_strdup_printf("%s\n" + "[$ShellParam$]\n" + "ViewType=1\n" + "ReloadInterval=5000\n" + "%s", printer_list, printer_icons); +} + +gchar *callback_storage() +{ + return g_strdup_printf("%s\n" + "[$ShellParam$]\n" + "ReloadInterval=5000\n" + "ViewType=1\n%s", storage_list, storage_icons); +} + +gchar *callback_input() +{ + return g_strdup_printf("[Input Devices]\n" + "%s" + "[$ShellParam$]\n" + "ViewType=1\n" + "ReloadInterval=5000\n%s", input_list, + input_icons); +} + +gchar *callback_usb() +{ + return g_strdup_printf("%s" + "[$ShellParam$]\n" + "ViewType=1\n" + "ReloadInterval=5000\n", usb_list); +} + +ModuleEntry *hi_module_get_entries(void) +{ + return entries; +} + +gchar *hi_module_get_name(void) +{ + return g_strdup(_("Devices")); +} + +guchar hi_module_get_weight(void) +{ + return 85; +} + +void hi_module_init(void) +{ + if (!g_file_test("/usr/share/misc/pci.ids", G_FILE_TEST_EXISTS)) { + static SyncEntry se = { + .fancy_name = N_("Update PCI ID listing"), + .name = "GetPCIIds", + .save_to = "pci.ids", + .get_data = NULL + }; + + sync_manager_add_entry(&se); + } + +#if defined(ARCH_x86) || defined(ARCH_x86_64) + { + static SyncEntry se = { + .fancy_name = N_("Update CPU feature database"), + .name = "RecvCPUFlags", + .save_to = "cpuflags.conf", + .get_data = NULL + }; + + sync_manager_add_entry(&se); + } +#endif /* defined(ARCH_x86) */ + + init_memory_labels(); + init_cups(); + sensors_init(); +} + +void hi_module_deinit(void) +{ + moreinfo_del_with_prefix("DEV"); + sensors_shutdown(); + g_hash_table_destroy(memlabels); + g_module_close(cups); +} + +ModuleAbout *hi_module_get_about(void) +{ + static ModuleAbout ma[] = { + { + .author = "Leandro A. F. Pereira", + .description = N_("Gathers information about hardware devices"), + .version = VERSION, + .license = "GNU GPL version 2"} + }; + + return ma; +} + +gchar **hi_module_get_dependencies(void) +{ + static gchar *deps[] = { "computer.so", NULL }; + + return deps; +} + +const gchar *hi_note_func(gint entry) +{ + if (entry == ENTRY_RESOURCES) { + if (root_required_for_resources()) { + return g_strdup_printf(_("Resource information requires superuser privileges")); + } + } + return NULL; +} diff --git a/modules/devices/alpha/processor.c b/modules/devices/alpha/processor.c new file mode 100644 index 00000000..f55526f7 --- /dev/null +++ b/modules/devices/alpha/processor.c @@ -0,0 +1,78 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "devices.h" + +GSList * +processor_scan(void) +{ + Processor *processor; + FILE *cpuinfo; + gchar buffer[128]; + + cpuinfo = fopen("/proc/cpuinfo", "r"); + if (!cpuinfo) + return NULL; + + processor = g_new0(Processor, 1); + while (fgets(buffer, 128, cpuinfo)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + + if (tmp[0] && tmp[1]) { + tmp[0] = g_strstrip(tmp[0]); + tmp[1] = g_strstrip(tmp[1]); + + get_str("cpu model", processor->model_name); + get_float("BogoMIPS", processor->bogomips); + get_str("platform string", processor->strmodel); + + } + g_strfreev(tmp); + } + + gchar *tmp = g_strconcat("Alpha ", processor->model_name, NULL); + g_free(processor->model_name); + processor->model_name = tmp; + processor->cpu_mhz = 0.0f; + + fclose(cpuinfo); + + return g_slist_append(NULL, processor); +} + +gchar * +processor_get_info(GSList *processors) +{ + Processor *processor = (Processor *)processors->data; + + return g_strdup_printf("[Processor]\n" + "Model=%s\n" + "Platform String=%s\n" + "BogoMIPS=%.2f" + "Byte Order=%s\n", + processor->model_name, + processor->strmodel, + processor->bogomips, +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + "Little Endian" +#else + "Big Endian" +#endif + ); +} diff --git a/modules/devices/arm/arm_data.c b/modules/devices/arm/arm_data.c new file mode 100644 index 00000000..246cb643 --- /dev/null +++ b/modules/devices/arm/arm_data.c @@ -0,0 +1,215 @@ +/* + * rpiz - https://github.com/bp0/rpiz + * Copyright (C) 2017 Burt P. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include +#include "arm_data.h" + +/* sources: + * https://unix.stackexchange.com/a/43563 + * git:linux/arch/arm/kernel/setup.c + * git:linux/arch/arm64/kernel/cpuinfo.c + */ +static struct { + char *name, *meaning; +} tab_flag_meaning[] = { + /* arm/hw_cap */ + { "swp", "SWP instruction (atomic read-modify-write)" }, + { "half", "Half-word loads and stores" }, + { "thumb", "Thumb (16-bit instruction set)" }, + { "26bit", "26-Bit Model (Processor status register folded into program counter)" }, + { "fastmult", "32x32->64-bit multiplication" }, + { "fpa", "Floating point accelerator" }, + { "vfp", "VFP (early SIMD vector floating point instructions)" }, + { "edsp", "DSP extensions (the 'e' variant of the ARM9 CPUs, and all others above)" }, + { "java", "Jazelle (Java bytecode accelerator)" }, + { "iwmmxt", "SIMD instructions similar to Intel MMX" }, + { "crunch", "MaverickCrunch coprocessor (if kernel support enabled)" }, + { "thumbee", "ThumbEE" }, + { "neon", "Advanced SIMD/NEON on AArch32" }, + { "evtstrm", "kernel event stream using generic architected timer" }, + { "vfpv3", "VFP version 3" }, + { "vfpv3d16", "VFP version 3 with 16 D-registers" }, + { "vfpv4", "VFP version 4 with fast context switching" }, + { "vfpd32", "VFP with 32 D-registers" }, + { "tls", "TLS register" }, + { "idiva", "SDIV and UDIV hardware division in ARM mode" }, + { "idivt", "SDIV and UDIV hardware division in Thumb mode" }, + { "lpae", "40-bit Large Physical Address Extension" }, + /* arm/hw_cap2 */ + { "pmull", "64x64->128-bit F2m multiplication (arch>8)" }, + { "aes", "Crypto:AES (arch>8)" }, + { "sha1", "Crypto:SHA1 (arch>8)" }, + { "sha2", "Crypto:SHA2 (arch>8)" }, + { "crc32", "CRC32 checksum instructions (arch>8)" }, + /* arm64/hw_cap */ + { "fp", "" }, + { "asimd", "Advanced SIMD/NEON on AArch64 (arch>8)" }, + { "atomics", "" }, + { "fphp", "" }, + { "asimdhp", "" }, + { "cpuid", "" }, + { "asimdrdm", "" }, + { "jscvt", "" }, + { "fcma", "" }, + { "lrcpc", "" }, + + { NULL, NULL}, +}; + +static struct { + int code; char *name; +} tab_arm_implementer[] = { + { 0x41, "ARM" }, + { 0x44, "Intel (formerly DEC) StrongARM" }, + { 0x4e, "nVidia" }, + { 0x54, "Texas Instruments" }, + { 0x56, "Marvell" }, + { 0x69, "Intel XScale" }, + { 0, NULL}, +}; + +static struct { + /* source: t = tested, d = official docs, f = web */ + int code; char *part_desc; +} tab_arm_arm_part[] = { /* only valid for implementer 0x41 ARM */ + /*d */ { 0x920, "ARM920" }, + /*d */ { 0x926, "ARM926" }, + /*d */ { 0x946, "ARM946" }, + /*d */ { 0x966, "ARM966" }, + /*d */ { 0xb02, "ARM11 MPCore" }, + /*d */ { 0xb36, "ARM1136" }, + /*d */ { 0xb56, "ARM1156" }, + /*dt*/ { 0xb76, "ARM1176" }, + /*dt*/ { 0xc05, "Cortex-A5" }, + /*d */ { 0xc07, "Cortex-A7 MPCore" }, + /*dt*/ { 0xc08, "Cortex-A8" }, + /*dt*/ { 0xc09, "Cortex-A9" }, + /*d */ { 0xc0e, "Cortex-A17 MPCore" }, + /*d */ { 0xc0f, "Cortex-A15" }, + /*d */ { 0xd01, "Cortex-A32" }, + /*dt*/ { 0xd03, "Cortex-A53" }, + /*d */ { 0xd04, "Cortex-A35" }, + /*d */ { 0xd07, "Cortex-A57 MPCore" }, + /*d */ { 0xd08, "Cortex-A72" }, + /*d */ { 0xd09, "Cortex-A73" }, + { 0, NULL}, +}; + +static char all_flags[1024] = ""; + +#define APPEND_FLAG(f) strcat(all_flags, f); strcat(all_flags, " "); +const char *arm_flag_list() { + int i = 0, built = 0; + built = strlen(all_flags); + if (!built) { + while(tab_flag_meaning[i].name != NULL) { + APPEND_FLAG(tab_flag_meaning[i].name); + i++; + } + } + return all_flags; +} + +const char *arm_flag_meaning(const char *flag) { + int i = 0; + if (flag) + while(tab_flag_meaning[i].name != NULL) { + if (strcmp(tab_flag_meaning[i].name, flag) == 0) + return tab_flag_meaning[i].meaning; + i++; + } + return NULL; +} + +static int code_match(int c0, const char* code1) { + int c1; + if (code1 == NULL) return 0; + c1 = strtol(code1, NULL, 0); + return (c0 == c1) ? 1 : 0; +} + +const char *arm_implementer(const char *code) { + int i = 0; + if (code) + while(tab_arm_implementer[i].code) { + if (code_match(tab_arm_implementer[i].code, code)) + return tab_arm_implementer[i].name; + i++; + } + return NULL; +} + +const char *arm_part(const char *imp_code, const char *part_code) { + int i = 0; + if (imp_code && part_code) { + if (code_match(0x41, imp_code)) { + /* 0x41=ARM parts */ + while(tab_arm_arm_part[i].code) { + if (code_match(tab_arm_arm_part[i].code, part_code)) + return tab_arm_arm_part[i].part_desc; + i++; + } + } + } + return NULL; +} + +char *arm_decoded_name(const char *imp, const char *part, const char *var, const char *rev, const char *arch, const char *model_name) { + char *dnbuff; + char *imp_name = NULL, *part_desc = NULL; + int r = 0, p = 0; + dnbuff = malloc(256); + if (dnbuff) { + memset(dnbuff, 0, 256); + + if (imp && arch && part && rev) { + /* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0395b/CIHCAGHH.html + * variant and revision can be rendered r{variant}p{revision} */ + r = strtol(var, NULL, 0); + p = strtol(rev, NULL, 0); + imp_name = (char*) arm_implementer(imp); + part_desc = (char*) arm_part(imp, part); + if (imp_name || part_desc) { + sprintf(dnbuff, "%s %s r%dp%d (arch:%s)", + (imp_name) ? imp_name : imp, + (part_desc) ? part_desc : part, + r, p, arch); + } else { + /* fallback for now */ + sprintf(dnbuff, "%s [imp:%s part:%s r%dp%d arch:%s]", + model_name, + (imp_name) ? imp_name : imp, + (part_desc) ? part_desc : part, + r, p, arch); + } + } else { + /* prolly not ARM arch at all */ + if (model_name) + sprintf(dnbuff, "%s", model_name); + else { + free(dnbuff); + return NULL; + } + } + } + return dnbuff; +} diff --git a/modules/devices/arm/arm_data.h b/modules/devices/arm/arm_data.h new file mode 100644 index 00000000..4d1d4cf9 --- /dev/null +++ b/modules/devices/arm/arm_data.h @@ -0,0 +1,38 @@ +/* + * rpiz - https://github.com/bp0/rpiz + * Copyright (C) 2017 Burt P. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _ARMDATA_H_ +#define _ARMDATA_H_ + +/* table lookups */ +const char *arm_implementer(const char *code); +const char *arm_part(const char *imp_code, const char *part_code); + +/* cpu_implementer, cpu_part, cpu_variant, cpu_revision, cpu_architecture from /proc/cpuinfo + * model_name is returned as a fallback if not enough data is known */ +char *arm_decoded_name( + const char *imp, const char *part, const char *var, const char *rev, + const char *arch, const char *model_name); + +/* cpu flags from /proc/cpuinfo */ +const char *arm_flag_list(void); /* list of all known flags */ +const char *arm_flag_meaning(const char *flag); /* lookup flag meaning */ + +#endif diff --git a/modules/devices/arm/processor.c b/modules/devices/arm/processor.c new file mode 100644 index 00000000..c94f41e5 --- /dev/null +++ b/modules/devices/arm/processor.c @@ -0,0 +1,340 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "devices.h" + +#include "arm_data.h" +#include "arm_data.c" + +enum { + ARM_A32 = 0, + ARM_A64 = 1, + ARM_A32_ON_A64 = 2, +}; + +static const gchar *arm_mode_str[] = { + "A32", + "A64", + "A32 on A64", +}; + +GHashTable *cpu_flags = NULL; /* FIXME: when is it freed? */ + +static void +populate_cpu_flags_list_internal() +{ + int i; + gchar **afl, *fm; + + cpu_flags = g_hash_table_new(g_str_hash, g_str_equal); + afl = g_strsplit(arm_flag_list(), " ", 0); + while(afl[i] != NULL) { + fm = (char *)arm_flag_meaning(afl[i]); + if (g_strcmp0(afl[i], "") != 0) + g_hash_table_insert(cpu_flags, afl[i], (fm) ? fm : ""); + i++; + } +} + +static gint get_cpu_int(const gchar* file, gint cpuid) { + gchar *tmp0 = NULL; + gchar *tmp1 = NULL; + gint ret = 0; + + tmp0 = g_strdup_printf("/sys/devices/system/cpu/cpu%d/%s", cpuid, file); + g_file_get_contents(tmp0, &tmp1, NULL, NULL); + if (tmp1) + ret = atol(tmp1); + g_free(tmp0); + g_free(tmp1); + return ret; +} + +int processor_has_flag(gchar * strflags, gchar * strflag) +{ + gchar **flags; + gint ret = 0; + if (strflags == NULL || strflag == NULL) + return 0; + flags = g_strsplit(strflags, " ", 0); + ret = g_strv_contains((const gchar * const *)flags, strflag); + g_strfreev(flags); + return ret; +} + +#define PROC_CPUINFO "/proc/cpuinfo" + +GSList * +processor_scan(void) +{ + GSList *procs = NULL; + Processor *processor = NULL; + FILE *cpuinfo; + gchar buffer[128]; + gchar *rep_pname = NULL; + gchar *tmpfreq_str = NULL; + GSList *pi = NULL; + + cpuinfo = fopen(PROC_CPUINFO, "r"); + if (!cpuinfo) + return NULL; + +#define CHECK_FOR(k) (g_str_has_prefix(tmp[0], k)) + while (fgets(buffer, 128, cpuinfo)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + if (tmp[0] && tmp[1]) { + tmp[0] = g_strstrip(tmp[0]); + tmp[1] = g_strstrip(tmp[1]); + } else { + g_strfreev(tmp); + continue; + } + + get_str("Processor", rep_pname); + + if ( CHECK_FOR("processor") ) { + /* finish previous */ + if (processor) { + procs = g_slist_append(procs, processor); + } + + /* start next */ + processor = g_new0(Processor, 1); + processor->id = atol(tmp[1]); + + if (rep_pname) + processor->model_name = g_strdup(rep_pname); + + g_strfreev(tmp); + continue; + } + + if (!processor && + ( CHECK_FOR("model name") + || CHECK_FOR("Features") + || CHECK_FOR("BogoMIPS") ) ) { + + /* single proc/core may not have "processor : n" */ + processor = g_new0(Processor, 1); + processor->id = 0; + + if (rep_pname) + processor->model_name = g_strdup(rep_pname); + } + + if (processor) { + get_str("model name", processor->model_name); + get_str("Features", processor->flags); + get_float("BogoMIPS", processor->bogomips); + + get_str("CPU implementer", processor->cpu_implementer); + get_str("CPU architecture", processor->cpu_architecture); + get_str("CPU variant", processor->cpu_variant); + get_str("CPU part", processor->cpu_part); + get_str("CPU revision", processor->cpu_revision); + } + g_strfreev(tmp); + } + + if (processor) + procs = g_slist_append(procs, processor); + + g_free(rep_pname); + fclose(cpuinfo); + + /* re-duplicate missing data for /proc/cpuinfo variant that de-duplicated it */ +#define REDUP(f) if (dproc->f && !processor->f) processor->f = g_strdup(dproc->f); + Processor *dproc; + GSList *l; + l = procs = g_slist_reverse(procs); + while (l) { + processor = l->data; + if (processor->flags) { + dproc = processor; + } else if (dproc) { + REDUP(flags); + REDUP(cpu_implementer); + REDUP(cpu_architecture); + REDUP(cpu_variant); + REDUP(cpu_part); + REDUP(cpu_revision); + } + l = g_slist_next(l); + } + procs = g_slist_reverse(procs); + + /* data not from /proc/cpuinfo */ + for (pi = procs; pi; pi = pi->next) { + processor = (Processor *) pi->data; + + /* strings can't be null or segfault later */ +#define UNKIFNULL(f) if (processor->f == NULL) processor->f = g_strdup("(Unknown)"); +#define EMPIFNULL(f) if (processor->f == NULL) processor->f = g_strdup(""); + UNKIFNULL(model_name); + EMPIFNULL(flags); + UNKIFNULL(cpu_implementer); + UNKIFNULL(cpu_architecture); + UNKIFNULL(cpu_variant); + UNKIFNULL(cpu_part); + UNKIFNULL(cpu_revision); + + processor->decoded_name = arm_decoded_name( + processor->cpu_implementer, processor->cpu_part, + processor->cpu_variant, processor->cpu_revision, + processor->cpu_architecture, processor->model_name); + + /* freq */ + processor->cpukhz_cur = get_cpu_int("cpufreq/scaling_cur_freq", processor->id); + processor->cpukhz_min = get_cpu_int("cpufreq/scaling_min_freq", processor->id); + processor->cpukhz_max = get_cpu_int("cpufreq/scaling_max_freq", processor->id); + if (processor->cpukhz_max) + processor->cpu_mhz = processor->cpukhz_max / 1000; + else + processor->cpu_mhz = 0.0f; + + /* mode */ + processor->mode = ARM_A32; + if ( processor_has_flag(processor->flags, "pmull") + || processor_has_flag(processor->flags, "crc32") ) { +#ifdef __aarch64__ + processor->mode = ARM_A64; +#else + processor->mode = ARM_A32_ON_A64; +#endif + } + } + + return procs; +} + +gchar *processor_get_capabilities_from_flags(gchar * strflags) +{ + gchar **flags, **old; + gchar *tmp = NULL; + gint j = 0; + + if (!cpu_flags) + populate_cpu_flags_list_internal(); + + flags = g_strsplit(strflags, " ", 0); + old = flags; + + while (flags[j]) { + gchar *meaning = g_hash_table_lookup(cpu_flags, flags[j]); + + if (meaning) { + tmp = h_strdup_cprintf("%s=%s\n", tmp, flags[j], meaning); + } else { + tmp = h_strdup_cprintf("%s=\n", tmp, flags[j]); + } + j++; + } + if (tmp == NULL || g_strcmp0(tmp, "") == 0) + tmp = g_strdup_printf("%s=%s\n", "empty", _("Empty List")); + + g_strfreev(old); + return tmp; +} + +gchar * +processor_get_detailed_info(Processor *processor) +{ + gchar *tmp_flags, *tmp_imp, *tmp_part, *ret; + tmp_flags = processor_get_capabilities_from_flags(processor->flags); + tmp_imp = (char*)arm_implementer(processor->cpu_implementer); + tmp_part = (char *)arm_part(processor->cpu_implementer, processor->cpu_part); + ret = g_strdup_printf("[Processor]\n" + "Linux Name=%s\n" + "Decoded Name=%s\n" + "Mode=%s\n" + "BogoMips=%.2f\n" + "Endianesss=" +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + "Little Endian" +#else + "Big Endian" +#endif + "\n" + "[Frequency Scaling]\n" + "Minimum=%d kHz\n" + "Maximum=%d kHz\n" + "Current=%d kHz\n" + "[ARM]\n" + "Implementer=[%s] %s\n" + "Part=[%s] %s\n" + "Architecture=%s\n" + "Variant=%s\n" + "Revision=%s\n" + "[Capabilities]\n" + "%s" + "%s", + processor->model_name, + processor->decoded_name, + arm_mode_str[processor->mode], + processor->bogomips, + processor->cpukhz_min, + processor->cpukhz_max, + processor->cpukhz_cur, + processor->cpu_implementer, (tmp_imp) ? tmp_imp : "", + processor->cpu_part, (tmp_part) ? tmp_part : "", + processor->cpu_architecture, + processor->cpu_variant, + processor->cpu_revision, + tmp_flags, + ""); + g_free(tmp_flags); + return ret; +} + +gchar *processor_get_info(GSList * processors) +{ + Processor *processor; + + if (g_slist_length(processors) > 1) { + gchar *ret, *tmp, *hashkey; + GSList *l; + + tmp = g_strdup(""); + + for (l = processors; l; l = l->next) { + processor = (Processor *) l->data; + + tmp = g_strdup_printf(_("%s$CPU%d$%s=%.2fMHz\n"), + tmp, processor->id, + processor->model_name, + processor->cpu_mhz); + + hashkey = g_strdup_printf("CPU%d", processor->id); + moreinfo_add_with_prefix("DEV", hashkey, + processor_get_detailed_info(processor)); + g_free(hashkey); + } + + ret = g_strdup_printf("[$ShellParam$]\n" + "ViewType=1\n" + "[Processors]\n" + "%s", tmp); + g_free(tmp); + + return ret; + } + + processor = (Processor *) processors->data; + return processor_get_detailed_info(processor); +} diff --git a/modules/devices/battery.c b/modules/devices/battery.c new file mode 100644 index 00000000..cbcebb12 --- /dev/null +++ b/modules/devices/battery.c @@ -0,0 +1,388 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include "hardinfo.h" +#include "devices.h" + +const struct { + gchar *key, *name; +} ups_fields[] = { + { "UPS Status", NULL }, + { "STATUS", "Status" }, + { "TIMELEFT", "Time Left" }, + { "LINEV", "Line Voltage" }, + { "LOADPCT", "Load Percent" }, + + { "UPS Battery Information", NULL }, + { "BATTV", "Battery Voltage" }, + { "BCHARGE", "Battery Charge" }, + { "BATTDATE", "Battery Date" }, + + { "UPS Information", NULL }, + { "APCMODEL", "Model" }, + { "FIRMWARE", "Firmware Version" }, + { "SERIALNO", "Serial Number" }, + { "UPSMODE", "UPS Mode" }, + { "CABLE", "Cable" }, + { "UPSNAME", "UPS Name" }, + + { "UPS Nominal Values", NULL }, + { "NOMINV", "Voltage" }, + { "NOMBATTV", "Battery Voltage" }, + { "NOMPOWER", "Power" } +}; + + +static void +__scan_battery_apcupsd(void) +{ + GHashTable *ups_data; + FILE *apcaccess; + char buffer[512], *apcaccess_path; + int i; + + apcaccess_path = find_program("apcaccess"); + if (apcaccess_path && (apcaccess = popen(apcaccess_path, "r"))) { + /* first line isn't important */ + if (fgets(buffer, 512, apcaccess)) { + /* allocate the key, value hash table */ + ups_data = g_hash_table_new(g_str_hash, g_str_equal); + + /* read up all the apcaccess' output, saving it in the key, value hash table */ + while (fgets(buffer, 512, apcaccess)) { + buffer[9] = '\0'; + + g_hash_table_insert(ups_data, + g_strdup(g_strstrip(buffer)), + g_strdup(g_strstrip(buffer + 10))); + } + + /* builds the ups info string, respecting the field order as found in ups_fields */ + for (i = 0; i < G_N_ELEMENTS(ups_fields); i++) { + if (!ups_fields[i].name) { + /* there's no name: make a group with the key as its name */ + battery_list = h_strdup_cprintf("[%s]\n", battery_list, ups_fields[i].key); + } else { + /* there's a name: adds a line */ + battery_list = h_strdup_cprintf("%s=%s\n", battery_list, + ups_fields[i].name, + g_hash_table_lookup(ups_data, ups_fields[i].key)); + } + } + + g_hash_table_destroy(ups_data); + } + + pclose(apcaccess); + } + + g_free(apcaccess_path); +} + +static void +__scan_battery_acpi(void) +{ + gchar *acpi_path; + + gchar *present = NULL; + gchar *capacity = NULL; + gchar *technology = NULL; + gchar *voltage = NULL; + gchar *model = NULL, *serial = NULL, *type = NULL; + gchar *state = NULL, *rate = NULL; + gchar *remaining = NULL; + gchar *manufacturer = NULL; + + acpi_path = g_strdup("/proc/acpi/battery"); + if (g_file_test(acpi_path, G_FILE_TEST_EXISTS)) { + GDir *acpi; + + if ((acpi = g_dir_open(acpi_path, 0, NULL))) { + const gchar *entry; + + while ((entry = g_dir_read_name(acpi))) { + gchar *path = g_strdup_printf("%s/%s/info", acpi_path, entry); + FILE *f; + gchar buffer[256]; + gdouble charge_rate = 1.0; + + f = fopen(path, "r"); + g_free(path); + + if (!f) + goto cleanup; + + while (fgets(buffer, 256, f)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + + GET_STR("present", present); + GET_STR("design capacity", capacity); + GET_STR("battery technology", technology); + GET_STR("design voltage", voltage); + GET_STR("model number", model); + GET_STR("serial number", serial); + GET_STR("battery type", type); + GET_STR("OEM info", manufacturer); + + g_strfreev(tmp); + } + fclose(f); + + path = g_strdup_printf("%s/%s/state", acpi_path, entry); + f = fopen(path, "r"); + g_free(path); + + if (!f) + goto cleanup; + + while (fgets(buffer, 256, f)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + + GET_STR("charging state", state); + GET_STR("present rate", rate); + GET_STR("remaining capacity", remaining); + + g_strfreev(tmp); + } + + fclose(f); + + const gchar *url = vendor_get_url(manufacturer); + if (url) { + char *tmp = g_strdup_printf("%s (%s)", vendor_get_name(manufacturer), url); + g_free(manufacturer); + manufacturer = tmp; + } + + if (g_str_equal(present, "yes")) { + if (remaining && capacity) + charge_rate = atof(remaining) / atof(capacity); + else + charge_rate = 0; + + battery_list = h_strdup_cprintf(_("\n[Battery: %s]\n" + "State=%s (load: %s)\n" + "Capacity=%s / %s (%.2f%%)\n" + "Battery Technology=%s (%s)\n" + "Manufacturer=%s\n" + "Model Number=%s\n" + "Serial Number=%s\n"), + battery_list, + entry, + state, rate, + remaining, capacity, charge_rate * 100.0, + technology, type, + manufacturer, + model, + serial); + } + + cleanup: + g_free(present); + g_free(capacity); + g_free(technology); + g_free(type); + g_free(model); + g_free(serial); + g_free(state); + g_free(remaining); + g_free(rate); + g_free(manufacturer); + + present = capacity = technology = type = \ + model = serial = state = remaining = rate = manufacturer = NULL; + } + + g_dir_close(acpi); + } + } + + g_free(acpi_path); +} + +static gchar * +read_contents(const gchar *base, const gchar *key) +{ + gchar *value; + gchar *path; + + path = g_strdup_printf("%s/%s", base, key); + if (!path) + return NULL; + + if (!g_file_get_contents(path, &value, NULL, NULL)) { + free(path); + return NULL; + } + + free(path); + return g_strchomp(value); +} + +static void +__scan_battery_sysfs_add_battery(const gchar *name) +{ + gchar *path = g_strdup_printf("/sys/class/power_supply/%s", name); + gchar *status, *capacity, *capacity_level, *technology, *manufacturer, + *model_name, *serial_number; + + if (!path) + return; + + status = read_contents(path, "status"); + capacity = read_contents(path, "capacity"); + capacity_level = read_contents(path, "capacity_level"); + technology = read_contents(path, "technology"); + manufacturer = read_contents(path, "manufacturer"); + model_name = read_contents(path, "model_name"); + serial_number = read_contents(path, "serial_number"); + + battery_list = h_strdup_cprintf(_("\n[Battery: %s]\n" + "State=%s\n" + "Capacity=%s / %s\n" + "Battery Technology=%s\n" + "Manufacturer=%s\n" + "Model Number=%s\n" + "Serial Number=%s\n"), + battery_list, + name, + status, + capacity, capacity_level, + technology, + manufacturer, + model_name, + serial_number); + + free(status); + free(capacity); + free(capacity_level); + free(technology); + free(manufacturer); + free(model_name); + free(serial_number); +} + +static void +__scan_battery_sysfs(void) +{ + GDir *dir; + const gchar *entry; + + dir = g_dir_open("/sys/class/power_supply", 0, NULL); + if (!dir) + return; + + while ((entry = g_dir_read_name(dir))) { + if (g_str_has_prefix(entry, "BAT")) + __scan_battery_sysfs_add_battery(entry); + } + + g_dir_close(dir); +} + +static void +__scan_battery_apm(void) +{ + FILE *procapm; + static char *sremaining = NULL, *stotal = NULL; + static unsigned int last_time = 0; + static int percentage = 0; + const char *ac_status[] = { "Battery", + "AC Power", + "Charging" }; + int ac_bat; + char apm_bios_ver[16], apm_drv_ver[16]; + char trash[10]; + + if ((procapm = fopen("/proc/apm", "r"))) { + int old_percentage = percentage; + + (void)fscanf(procapm, "%s %s %s 0x%x %s %s %d%%", + apm_drv_ver, apm_bios_ver, trash, + &ac_bat, trash, trash, &percentage); + fclose(procapm); + + if (last_time == 0) { + last_time = time(NULL); + sremaining = stotal = NULL; + } + + if (old_percentage - percentage > 0) { + if (sremaining && stotal) { + g_free(sremaining); + g_free(stotal); + } + + int secs_remaining = (time(NULL) - last_time) * percentage / + (old_percentage - percentage); + sremaining = seconds_to_string(secs_remaining); + stotal = seconds_to_string((secs_remaining * 100) / percentage); + + last_time = time(NULL); + } + } else { + return; + } + + if (stotal && sremaining) { + battery_list = h_strdup_cprintf(_("\n[Battery (APM)]\n" + "Charge=%d%%\n" + "Remaining Charge=%s of %s\n" + "Using=%s\n" + "APM driver version=%s\n" + "APM BIOS version=%s\n"), + battery_list, + percentage, + sremaining, stotal, + ac_status[ac_bat], + apm_drv_ver, apm_bios_ver); + } else { + battery_list = h_strdup_cprintf(_("\n[Battery (APM)]\n" + "Charge=%d%%\n" + "Using=%s\n" + "APM driver version=%s\n" + "APM BIOS version=%s\n"), + battery_list, + percentage, + ac_status[ac_bat], + apm_drv_ver, apm_bios_ver); + + } +} + +void +scan_battery_do(void) +{ + g_free(battery_list); + battery_list = g_strdup(""); + + __scan_battery_sysfs(); + __scan_battery_acpi(); + __scan_battery_apm(); + __scan_battery_apcupsd(); + + if (*battery_list == '\0') { + g_free(battery_list); + + battery_list = g_strdup(_("[No batteries]\n" + "No batteries found on this system=\n")); + } +} diff --git a/modules/devices/devmemory.c b/modules/devices/devmemory.c new file mode 100644 index 00000000..7131536c --- /dev/null +++ b/modules/devices/devmemory.c @@ -0,0 +1,108 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include "devices.h" + +GHashTable *memlabels = NULL; + +void scan_memory_do(void) +{ + gchar **keys, *tmp; + static gint offset = -1; + gint i; + + if (offset == -1) { + /* gah. linux 2.4 adds three lines of data we don't need in + /proc/meminfo */ + gchar *os_kernel = module_call_method("computer::getOSKernel"); + if (os_kernel) { + offset = strstr(os_kernel, "Linux 2.4") ? 3 : 0; + g_free(os_kernel); + } else { + offset = 0; + } + } + + g_file_get_contents("/proc/meminfo", &meminfo, NULL, NULL); + + keys = g_strsplit(meminfo, "\n", 0); + + g_free(meminfo); + g_free(lginterval); + + meminfo = g_strdup(""); + lginterval = g_strdup(""); + + for (i = offset; keys[i]; i++) { + gchar **newkeys = g_strsplit(keys[i], ":", 0); + + if (!newkeys[0]) { + g_strfreev(newkeys); + break; + } + + g_strstrip(newkeys[1]); + + if ((tmp = g_hash_table_lookup(memlabels, newkeys[0]))) { + g_free(newkeys[0]); + newkeys[0] = g_strdup(tmp); + } + + moreinfo_add_with_prefix("DEV", newkeys[0], g_strdup(newkeys[1])); + + tmp = g_strconcat(meminfo, newkeys[0], "=", newkeys[1], "\n", NULL); + g_free(meminfo); + meminfo = tmp; + + tmp = g_strconcat(lginterval, + "UpdateInterval$", newkeys[0], "=1000\n", NULL); + g_free(lginterval); + lginterval = tmp; + + g_strfreev(newkeys); + } + g_strfreev(keys); +} + +void init_memory_labels(void) +{ + static const struct { + char *proc_label; + char *real_label; + } proc2real[] = { + { "MemTotal", N_("Total Memory") }, + { "MemFree", N_("Free Memory") }, + { "SwapCached", N_("Cached Swap") }, + { "HighTotal", N_("High Memory") }, + { "HighFree", N_("Free High Memory") }, + { "LowTotal", N_("Low Memory") }, + { "LowFree", N_("Free Low Memory") }, + { "SwapTotal", N_("Virtual Memory") }, + { "SwapFree", N_("Free Virtual Memory") }, + { NULL }, + }; + gint i; + + memlabels = g_hash_table_new(g_str_hash, g_str_equal); + + for (i = 0; proc2real[i].proc_label; i++) { + g_hash_table_insert(memlabels, proc2real[i].proc_label, + _(proc2real[i].real_label)); + } +} diff --git a/modules/devices/dmi.c b/modules/devices/dmi.c new file mode 100644 index 00000000..61cea65d --- /dev/null +++ b/modules/devices/dmi.c @@ -0,0 +1,209 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +/* + * DMI support based on patch by Stewart Adam + */ +#include +#include + +#include "devices.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" }, +}; + +gchar *dmi_info = NULL; + +static void add_to_moreinfo(const char *group, const char *key, char *value) +{ + char *new_key = g_strconcat("DMI:", group, ":", key, NULL); + moreinfo_add_with_prefix("DEV", new_key, g_strdup(g_strstrip(value))); +} + +gboolean dmi_get_info_dmidecode() +{ + FILE *dmi_pipe; + gchar buffer[256]; + const gchar *group; + DMIInfo *info; + gboolean dmi_failed = FALSE; + gint i; + + if (dmi_info) { + g_free(dmi_info); + dmi_info = NULL; + } + + for (i = 0; i < G_N_ELEMENTS(dmi_info_table); i++) { + info = &dmi_info_table[i]; + + if (*(info->name) == '$') { + group = info->name + 1; + dmi_info = h_strdup_cprintf("[%s]\n", dmi_info, group); + } else { + gchar *temp; + + if (!info->param) + continue; + + temp = g_strconcat("dmidecode -s ", info->param, NULL); + if ((dmi_pipe = popen(temp, "r"))) { + g_free(temp); + + (void)fgets(buffer, 256, dmi_pipe); + if (pclose(dmi_pipe)) { + dmi_failed = TRUE; + break; + } + + add_to_moreinfo(group, info->name, buffer); + + const gchar *url = vendor_get_url(buffer); + if (url) { + const gchar *vendor = vendor_get_name(buffer); + if (g_strstr_len(vendor, -1, g_strstrip(buffer)) || + g_strstr_len(g_strstrip(buffer), -1, vendor)) { + dmi_info = h_strdup_cprintf("%s=%s (%s)\n", + dmi_info, + info->name, + g_strstrip(buffer), + url); + } else { + dmi_info = h_strdup_cprintf("%s=%s (%s, %s)\n", + dmi_info, + info->name, + g_strstrip(buffer), + vendor, url); + } + } else { + dmi_info = h_strdup_cprintf("%s=%s\n", + dmi_info, + info->name, + buffer); + } + } else { + g_free(temp); + dmi_failed = TRUE; + break; + } + } + } + + if (dmi_failed) { + g_free(dmi_info); + dmi_info = NULL; + } + + return !dmi_failed; +} + +gboolean dmi_get_info_sys() +{ + FILE *dmi_file; + gchar buffer[256]; + const gchar *group = NULL; + DMIInfo *info; + gboolean dmi_failed = FALSE; + gint i; + + if (dmi_info) { + g_free(dmi_info); + dmi_info = NULL; + } + + for (i = 0; i < G_N_ELEMENTS(dmi_info_table); i++) { + info = &dmi_info_table[i]; + + if (*(info->name) == '$') { + group = info->name + 1; + dmi_info = h_strdup_cprintf("[%s]\n", dmi_info, group); + } else if (group && info->file) { + if ((dmi_file = fopen(info->file, "r"))) { + (void)fgets(buffer, 256, dmi_file); + fclose(dmi_file); + + add_to_moreinfo(group, info->name, buffer); + + const gchar *url = vendor_get_url(buffer); + if (url) { + const gchar *vendor = vendor_get_name(buffer); + if (g_strstr_len(vendor, -1, g_strstrip(buffer)) || + g_strstr_len(g_strstrip(buffer), -1, vendor)) { + dmi_info = h_strdup_cprintf("%s=%s (%s)\n", + dmi_info, + info->name, + g_strstrip(buffer), + url); + } else { + dmi_info = h_strdup_cprintf("%s=%s (%s, %s)\n", + dmi_info, + info->name, + g_strstrip(buffer), + vendor, url); + } + } else { + dmi_info = h_strdup_cprintf("%s=%s\n", + dmi_info, + info->name, + g_strstrip(buffer)); + } + } else { + dmi_failed = TRUE; + break; + } + } + } + + if (dmi_failed) { + g_free(dmi_info); + dmi_info = NULL; + } + + return !dmi_failed; +} + +void __scan_dmi() +{ + gboolean dmi_ok; + + dmi_ok = dmi_get_info_sys(); + + if (!dmi_ok) { + dmi_ok = dmi_get_info_dmidecode(); + } + + if (!dmi_ok) { + dmi_info = g_strdup("[No DMI information]\n" + "There was an error retrieving the information.=\n" + "Please try running HardInfo as root.=\n"); + } +} diff --git a/modules/devices/ia64/processor.c b/modules/devices/ia64/processor.c new file mode 100644 index 00000000..55e5e3a8 --- /dev/null +++ b/modules/devices/ia64/processor.c @@ -0,0 +1,78 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "devices.h" + +GSList * +processor_scan(void) +{ + Processor *processor; + FILE *cpuinfo; + gchar buffer[128]; + + cpuinfo = fopen("/proc/cpuinfo", "r"); + if (!cpuinfo) + return NULL; + + processor = g_new0(Processor, 1); + while (fgets(buffer, 128, cpuinfo)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + + if (tmp[0] && tmp[1]) { + tmp[0] = g_strstrip(tmp[0]); + tmp[1] = g_strstrip(tmp[1]); + + get_str("vendor", processor->model_name); + get_str("arch", processor->vendor_id); + get_str("family", processor->strmodel); + get_float("BogoMIPS", processor->bogomips); + + } + g_strfreev(tmp); + } + + processor->cpu_mhz = 0.0f; + + fclose(cpuinfo); + + return g_slist_append(NULL, processor); +} + +gchar * +processor_get_info(GSList *processors) +{ + Processor *processor = (Processor *)processors->data; + + return g_strdup_printf("[Processor]\n" + "Model=%s\n" + "Architecture=%s\n" + "Family=%sMHz\n" + "BogoMIPS=%s\n" + "Byte Order=%s\n", + processor->model_name, + processor->vendor_id, + processor->strmodel, + processor->bogomips, +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + "Little Endian" +#else + "Big Endian" +#endif + ); +} diff --git a/modules/devices/inputdevices.c b/modules/devices/inputdevices.c new file mode 100644 index 00000000..d3f8847f --- /dev/null +++ b/modules/devices/inputdevices.c @@ -0,0 +1,140 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "hardinfo.h" +#include "devices.h" + +gchar *input_icons = NULL; + +static struct { + char *name; + char *icon; +} input_devices[] = { + { "Keyboard", "keyboard.png" }, + { "Joystick", "joystick.png" }, + { "Mouse", "mouse.png" }, + { "Speaker", "audio.png" }, + { "Unknown", "module.png" }, +}; + +void +__scan_input_devices(void) +{ + FILE *dev; + gchar buffer[1024]; + gchar *tmp, *name = NULL, *phys = NULL; + gint bus = 0, vendor = 0, product = 0, version = 0; + int d = 0, n = 0; + + dev = fopen("/proc/bus/input/devices", "r"); + if (!dev) + return; + + if (input_list) { + moreinfo_del_with_prefix("DEV:INP"); + g_free(input_list); + g_free(input_icons); + } + input_list = g_strdup(""); + input_icons = g_strdup(""); + + while (fgets(buffer, sizeof(buffer), dev)) { + tmp = buffer; + + switch (*tmp) { + case 'N': + tmp = strreplacechr(tmp + strlen("N: Name="), "=", ':'); + name = g_strdup(tmp); + remove_quotes(name); + break; + case 'P': + phys = g_strdup(tmp + strlen("P: Phys=")); + break; + case 'I': + sscanf(tmp, "I: Bus=%x Vendor=%x Product=%x Version=%x", + &bus, &vendor, &product, &version); + break; + case 'H': + if (strstr(tmp, "kbd")) + d = 0; //INPUT_KEYBOARD; + else if (strstr(tmp, "js")) + d = 1; //INPUT_JOYSTICK; + else if (strstr(tmp, "mouse")) + d = 2; //INPUT_MOUSE; + else + d = 4; //INPUT_UNKNOWN; + break; + case '\n': + if (name && strstr(name, "PC Speaker")) { + d = 3; // INPUT_PCSPKR + } + + tmp = g_strdup_printf("INP%d", ++n); + input_list = h_strdup_cprintf("$%s$%s=\n", + input_list, + tmp, name); + input_icons = h_strdup_cprintf("Icon$%s$%s=%s\n", + input_icons, + tmp, name, + input_devices[d].icon); + gchar *strhash = g_strdup_printf("[Device Information]\n" + "Name=%s\n" + "Type=%s\n" + "Bus=0x%x\n", + name, + input_devices[d].name, + bus); + + const gchar *url = vendor_get_url(name); + if (url) { + strhash = h_strdup_cprintf("Vendor=%s (%s)\n", + strhash, + vendor_get_name(name), + url); + } else { + strhash = h_strdup_cprintf("Vendor=%x\n", + strhash, + vendor); + } + + strhash = h_strdup_cprintf("Product=0x%x\n" + "Version=0x%x\n", + strhash, product, version); + + if (phys && phys[1] != 0) { + strhash = h_strdup_cprintf("Connected to=%s\n", + strhash, phys); + } + + if (phys && strstr(phys, "ir")) { + strhash = h_strdup_cprintf("InfraRed port=yes\n", + strhash); + } + + moreinfo_add_with_prefix("DEV", tmp, strhash); + g_free(tmp); + + g_free(phys); + g_free(name); + } + } + + fclose(dev); +} diff --git a/modules/devices/m68k/processor.c b/modules/devices/m68k/processor.c new file mode 100644 index 00000000..d9902428 --- /dev/null +++ b/modules/devices/m68k/processor.c @@ -0,0 +1,79 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "devices.h" + +GSList * +processor_scan(void) +{ + Processor *processor; + FILE *cpuinfo; + gchar buffer[128]; + + cpuinfo = fopen("/proc/cpuinfo", "r"); + if (!cpuinfo) + return NULL; + + processor = g_new0(Processor, 1); + while (fgets(buffer, 128, cpuinfo)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + + if (tmp[0] && tmp[1]) { + tmp[0] = g_strstrip(tmp[0]); + tmp[1] = g_strstrip(tmp[1]); + + get_str("CPU", processor->model_name); + get_float("Clocking", processor->cpu_mhz); + get_float("bogomips", processor->bogomips); + + get_str("FPU", processor->has_fpu); + } + g_strfreev(tmp); + } + + gchar *tmp; + tmp = g_strconcat("Motorola ", processor->model_name, NULL); + g_free(processor->model_name); + processor->model_name = tmp; + + fclose(cpuinfo); + + return g_slist_append(NULL, processor); +} + +gchar * +processor_get_info(GSList *processors) +{ + Processor *processor = (Processor *)processors->data; + + return g_strdup_printf("[Processor]\n" + "Name=%s\n" + "Frequency=%.2fMHz\n" + "BogoMips=%.2f\n" + "Byte Order=%s\n", + processor->model_name, + processor->cpu_mhz, + processor->bogomips, +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + "Little Endian" +#else + "Big Endian" +#endif + ); +} diff --git a/modules/devices/mips/processor.c b/modules/devices/mips/processor.c new file mode 100644 index 00000000..86c9b958 --- /dev/null +++ b/modules/devices/mips/processor.c @@ -0,0 +1,75 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "devices.h" + +GSList * +processor_scan(void) +{ + Processor *processor; + FILE *cpuinfo; + gchar buffer[128]; + + cpuinfo = fopen("/proc/cpuinfo", "r"); + if (!cpuinfo) + return NULL; + + processor = g_new0(Processor, 1); + while (fgets(buffer, 128, cpuinfo)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + + if (tmp[0] && tmp[1]) { + tmp[0] = g_strstrip(tmp[0]); + tmp[1] = g_strstrip(tmp[1]); + + get_str("system type", processor->model_name); + get_str("cpu model", processor->vendor_id); + get_float("cpu MHz", processor->cpu_mhz); + get_float("BogoMIPS", processor->bogomips); + } + g_strfreev(tmp); + } + + fclose(cpuinfo); + + return g_slist_append(NULL, processor); +} + +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/modules/devices/parisc/processor.c b/modules/devices/parisc/processor.c new file mode 100644 index 00000000..83672126 --- /dev/null +++ b/modules/devices/parisc/processor.c @@ -0,0 +1,87 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "devices.h" + +GSList * +processors_scan(void) +{ + Processor *processor; + FILE *cpuinfo; + gchar buffer[128]; + + cpuinfo = fopen("/proc/cpuinfo", "r"); + if (!cpuinfo) + return NULL; + + processor = g_new0(Processor, 1); + while (fgets(buffer, 128, cpuinfo)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + + if (tmp[0] && tmp[1]) { + tmp[0] = g_strstrip(tmp[0]); + tmp[1] = g_strstrip(tmp[1]); + + get_str("cpu family", processor->model_name); + get_str("cpu", processor->vendor_id); + get_float("cpu MHz", processor->cpu_mhz); + get_float("bogomips", processor->bogomips); + + get_str("model name", processor->strmodel); + + get_int("I-cache", processor->has_fpu); + get_int("D-cache", processor->flags); + + } + g_strfreev(tmp); + } + + fclose(cpuinfo); + + return g_slist_append(NULL, processor); +} + +gchar * +processor_get_info(GSList *processors) +{ + Processor *processor = (Processor *)processors->data; + + return g_strdup_printf("[Processor]\n" + "CPU Family=%s\n" + "CPU=%s\n" + "Frequency=%.2fMHz\n" + "Bogomips=%.2f\n" + "Model Name=%s\n" + "Byte Order=%s\n" + "[Cache]\n" + "I-Cache=%s\n" + "D-Cache=%s\n", + processor->model_name, + processor->vendor_id, + processor->cpu_mhz, + processor->bogomips, + processor->strmodel, +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + "Little Endian", +#else + "Big Endian", +#endif + processor->has_fpu, + processor->flags); +} diff --git a/modules/devices/pci.c b/modules/devices/pci.c new file mode 100644 index 00000000..91ff914d --- /dev/null +++ b/modules/devices/pci.c @@ -0,0 +1,247 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + * TODO: This thing must be rewritten. We really should have a struct with all the + * PCI stuff we'll present to the user, and hash them by the PCI ID + * (domain:bus:device.function). + * This way we'll have ways to better organize the output, instead of relying + * on the order the information appears on lspci's output. + * Also, the "Resources" thing might be better implemented (and we won't need + * copies of information scattered everywhere like we do today). + */ + +#include + +#include "hardinfo.h" +#include "devices.h" + +GHashTable *_pci_devices = NULL; + +void +scan_pci_do(void) +{ + FILE *lspci; + gchar buffer[256], *buf, *strhash = NULL, *strdevice = NULL; + gchar *category = NULL, *name = NULL, *icon, *lspci_path, *command_line = NULL; + gint n = 0, x = 0; + + if ((lspci_path = find_program("lspci")) == NULL) { + goto pci_error; + } else { + command_line = g_strdup_printf("%s -v", lspci_path); + } + + if (!_pci_devices) { + _pci_devices = g_hash_table_new(g_str_hash, g_str_equal); + } + + buf = g_build_filename(g_get_home_dir(), ".hardinfo", "pci.ids", NULL); + if (!g_file_test(buf, G_FILE_TEST_EXISTS)) { + DEBUG("using system-provided PCI IDs"); + g_free(buf); + if (!(lspci = popen(command_line, "r"))) { + goto pci_error; + } + } else { + gchar *tmp; + + tmp = g_strdup_printf("%s -i '%s'", command_line, buf); + g_free(buf); + buf = tmp; + + DEBUG("using updated PCI IDs (from %s)", buf); + if (!(lspci = popen(tmp, "r"))) { + g_free(buf); + goto pci_error; + } else { + g_free(buf); + } + } + + while (fgets(buffer, 256, lspci)) { + buf = g_strstrip(buffer); + + if (!strncmp(buf, "Flags", 5)) { + gint irq = 0, freq = 0, latency = 0, i; + gchar **list; + gboolean bus_master; + + buf += 7; + + bus_master = FALSE; + + list = g_strsplit(buf, ", ", 10); + for (i = 0; i <= 10; i++) { + if (!list[i]) + break; + + if (!strncmp(list[i], "IRQ", 3)) + sscanf(list[i], "IRQ %d", &irq); + else if (strstr(list[i], "Mhz")) + sscanf(list[i], "%dMhz", &freq); + else if (!strncmp(list[i], "bus master", 10)) + bus_master = TRUE; + else if (!strncmp(list[i], "latency", 7)) + sscanf(list[i], "latency %d", &latency); + } + g_strfreev(list); + + if (irq) + strdevice = h_strdup_cprintf("IRQ=%d\n", strdevice, irq); + if (freq) + strdevice = h_strdup_cprintf("Frequency=%dMHz\n", strdevice, freq); + if (latency) + strdevice = h_strdup_cprintf("Latency=%d\n", strdevice, latency); + + strdevice = h_strdup_cprintf("Bus Master=%s\n", strdevice, bus_master ? "Yes" : "No"); + } else if (!strncmp(buf, "Kernel modules", 14)) { + WALK_UNTIL(' '); + WALK_UNTIL(':'); + buf++; + + strdevice = h_strdup_cprintf("Kernel modules=%s\n", strdevice, buf); + } else if (!strncmp(buf, "Subsystem", 9)) { + WALK_UNTIL(' '); + buf++; + const gchar *oem_vendor_url = vendor_get_url(buf); + if (oem_vendor_url) + strdevice = h_strdup_cprintf("OEM Vendor=%s (%s)\n", + strdevice, + vendor_get_name(buf), + oem_vendor_url); + } else if (!strncmp(buf, "Capabilities", 12) + && !strstr(buf, "only to root") && + !strstr(buf, "access denied")) { + WALK_UNTIL(' '); + WALK_UNTIL(']'); + buf++; + strdevice = h_strdup_cprintf("Capability#%d=%s\n", strdevice, ++x, buf); + } else if (!strncmp(buf, "Memory at", 9) && strstr(buf, "[size=")) { + gint mem; + gchar unit; + gboolean prefetch; + gboolean _32bit; + + prefetch = strstr(buf, "non-prefetchable") ? FALSE : TRUE; + _32bit = strstr(buf, "32-bit") ? TRUE : FALSE; + + WALK_UNTIL('['); + sscanf(buf, "[size=%d%c", &mem, &unit); + + strdevice = h_strdup_cprintf("Memory#%d=%d%cB (%s%s)\n", + strdevice, ++x, + mem, + (unit == ']') ? ' ' : unit, + _32bit ? "32-bit, " : "", + prefetch ? "prefetchable" : + "non-prefetchable"); + + } else if (!strncmp(buf, "I/O ports at", 12)) { + guint io_addr, io_size; + + sscanf(buf, "I/O ports at %x [size=%d]", &io_addr, &io_size); + + strdevice = + h_strdup_cprintf("I/O ports at#%d=0x%x - 0x%x\n", + strdevice, ++x, io_addr, + io_addr + io_size - 1); + } else if ((buf[0] >= '0' && buf[0] <= '9') && (buf[4] == ':' || buf[2] == ':')) { + gint bus, device, function, domain; + gpointer start, end; + + if (strdevice != NULL && strhash != NULL) { + moreinfo_add_with_prefix("DEV", strhash, strdevice); + g_free(strhash); + g_free(category); + g_free(name); + } + + if (buf[4] == ':') { + sscanf(buf, "%x:%x:%x.%d", &domain, &bus, &device, &function); + } else { + /* lspci without domain field */ + sscanf(buf, "%x:%x.%x", &bus, &device, &function); + domain = 0; + } + + WALK_UNTIL(' '); + + start = buf; + + WALK_UNTIL(':'); + end = buf + 1; + *buf = 0; + + buf = start + 1; + category = g_strdup(buf); + + buf = end; + + if (strstr(category, "RAM memory")) icon = "mem"; + else if (strstr(category, "Multimedia")) icon = "media"; + else if (strstr(category, "USB")) icon = "usb"; + else icon = "pci"; + + name = g_strdup(buf); + g_hash_table_insert(_pci_devices, + g_strdup_printf("0000:%02x:%02x.%x", bus, device, function), + name); + + strhash = g_strdup_printf("PCI%d", n); + strdevice = g_strdup_printf("[Device Information]\n" + "Name=%s\n" + "Class=%s\n" + "Domain=%d\n" + "Bus, device, function=%d, %d, %d\n", + name, category, domain, bus, + device, function); + + const gchar *url = vendor_get_url(name); + if (url) { + strdevice = h_strdup_cprintf("Vendor=%s (%s)\n", + strdevice, + vendor_get_name(name), + url); + } + + g_hash_table_insert(_pci_devices, + g_strdup_printf("0000:%02x:%02x.%x", bus, device, function), + g_strdup(name)); + + pci_list = h_strdup_cprintf("$PCI%d$%s=%s\n", pci_list, n, category, name); + + n++; + } + } + + if (pclose(lspci)) { +pci_error: + /* error (no pci, perhaps?) */ + pci_list = g_strconcat(pci_list, "No PCI devices found=\n", NULL); + } else if (strhash) { + /* insert the last device */ + moreinfo_add_with_prefix("DEV", strhash, strdevice); + g_free(strhash); + g_free(category); + g_free(name); + } + + g_free(lspci_path); + g_free(command_line); +} diff --git a/modules/devices/ppc/processor.c b/modules/devices/ppc/processor.c new file mode 100644 index 00000000..a7988f97 --- /dev/null +++ b/modules/devices/ppc/processor.c @@ -0,0 +1,85 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "devices.h" + +GSList * +processor_scan(void) +{ + Processor *processor; + FILE *cpuinfo; + gchar buffer[128]; + + cpuinfo = fopen("/proc/cpuinfo", "r"); + if (!cpuinfo) + return NULL; + + processor = g_new0(Processor, 1); + while (fgets(buffer, 128, cpuinfo)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + + if (tmp[0] && tmp[1]) { + tmp[0] = g_strstrip(tmp[0]); + tmp[1] = g_strstrip(tmp[1]); + + get_str("cpu", processor->model_name); + get_str("machine", processor->vendor_id); + get_int("L2 cache", processor->cache_size); + get_float("clock", processor->cpu_mhz); + get_float("bogomips", processor->bogomips); + + } + g_strfreev(tmp); + } + + gchar *tmp = g_strdup_printf("PowerPC %s (%.2fMHz)", + processor->model_name, + processor->cpu_mhz); + g_free(processor->model_name); + processor->model_name = tmp; + + fclose(cpuinfo); + + return g_slist_append(NULL, processor); +} + +gchar * +processor_get_info(GSList *processors) +{ + Processor *processor = (Processor *)processors->data; + + return g_strdup_printf("[Processor]\n" + "Machine=%s\n" + "CPU=%s\n" + "L2 Cache=%dkB\n" + "Frequency=%.2fMHz\n" + "BogoMips=%.2f\n" + "Byte Order=%s\n", + processor->vendor_id, + processor->model_name, + processor->cache_size, + processor->cpu_mhz, + processor->bogomips, +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + "Little Endian" +#else + "Big Endian" +#endif + ); +} diff --git a/modules/devices/printers.c b/modules/devices/printers.c new file mode 100644 index 00000000..77b52a43 --- /dev/null +++ b/modules/devices/printers.c @@ -0,0 +1,266 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include + +#include "devices.h" + +typedef struct _CUPSDest CUPSDest; +typedef struct _CUPSOption CUPSOption; + +struct _CUPSOption { + char *name, *value; +}; + +struct _CUPSDest { + char *name, *instance; + int is_default; + int num_options; + CUPSOption *options; +}; + +static int (*cups_dests_get) (CUPSDest **dests) = NULL; +static int (*cups_dests_free) (int num_dests, CUPSDest *dests) = NULL; +static gboolean cups_init = FALSE; + +GModule *cups; + +void +init_cups(void) +{ + const char *libcups[] = { "libcups", "libcups.so", "libcups.so.1", "libcups.so.2", NULL }; + + if (!(cups_dests_get && cups_dests_free)) { + int i; + + for (i = 0; libcups[i] != NULL; i++) { + cups = g_module_open(libcups[i], G_MODULE_BIND_LAZY); + if (cups) + break; + } + + if (!cups) { + cups_init = FALSE; + return; + } + + if (!g_module_symbol(cups, "cupsGetDests", (gpointer) & cups_dests_get) + || !g_module_symbol(cups, "cupsFreeDests", (gpointer) & cups_dests_free)) { + g_module_close(cups); + cups_init = FALSE; + } + } + + cups_init = TRUE; +} + +gchar *__cups_callback_ptype(gchar *strvalue) +{ + if (strvalue) { + unsigned value = atoi(strvalue); + gchar *output = g_strdup("\n"); + + if (value & 0x0004) + output = h_strdup_cprintf(_("\342\232\254 Can do black and white printing=\n"), output); + if (value & 0x0008) + output = h_strdup_cprintf(_("\342\232\254 Can do color printing=\n"), output); + if (value & 0x0010) + output = h_strdup_cprintf(_("\342\232\254 Can do duplexing=\n"), output); + if (value & 0x0020) + output = h_strdup_cprintf(_("\342\232\254 Can do staple output=\n"), output); + if (value & 0x0040) + output = h_strdup_cprintf(_("\342\232\254 Can do copies=\n"), output); + if (value & 0x0080) + output = h_strdup_cprintf(_("\342\232\254 Can collate copies=\n"), output); + if (value & 0x80000) + output = h_strdup_cprintf(_("\342\232\254 Printer is rejecting jobs=\n"), output); + if (value & 0x1000000) + output = h_strdup_cprintf(_("\342\232\254 Printer was automatically discovered and added=\n"), output); + + return output; + } else { + return g_strdup(_("Unknown")); + } +} + +gchar *__cups_callback_state(gchar *value) +{ + if (!value) { + return g_strdup(_("Unknown")); + } + + if (g_str_equal(value, "3")) { + return g_strdup(_("Idle")); + } else if (g_str_equal(value, "4")) { + return g_strdup(_("Printing a Job")); + } else if (g_str_equal(value, "5")) { + return g_strdup(_("Stopped")); + } else { + return g_strdup(_("Unknown")); + } +} + +gchar *__cups_callback_state_change_time(gchar *value) +{ + struct tm tm; + char buf[255]; + + if (value) { + strptime(value, "%s", &tm); + strftime(buf, sizeof(buf), "%c", &tm); + + return g_strdup(buf); + } else { + return g_strdup(_("Unknown")); + } +} + +gchar *__cups_callback_boolean(gchar *value) +{ + if (value) { + return g_strdup(g_str_equal(value, "1") ? _("Yes") : _("No")); + } else { + return g_strdup(_("Unknown")); + } +} + +const struct { + char *key, *name; + gchar *(*callback)(gchar *value); +} cups_fields[] = { + { "Printer Information", NULL, NULL }, + { "printer-info", "Destination Name", NULL }, + { "printer-make-and-model", "Make and Model", NULL }, + + { "Capabilities", NULL, NULL }, + { "printer-type", "#", __cups_callback_ptype }, + + { "Printer State", NULL, NULL }, + { "printer-state", "State", __cups_callback_state }, + { "printer-state-change-time", "Change Time", __cups_callback_state_change_time }, + { "printer-state-reasons", "State Reasons" }, + + { "Sharing Information", NULL, NULL }, + { "printer-is-shared", "Shared?", __cups_callback_boolean }, + { "printer-location", "Physical Location" }, + { "auth-info-required", "Authentication Required", __cups_callback_boolean }, + + { "Jobs", NULL, NULL }, + { "job-hold-until", "Hold Until", NULL }, + { "job-priority", "Priority", NULL }, + { "printer-is-accepting-jobs", "Accepting Jobs", __cups_callback_boolean }, + + { "Media", NULL, NULL }, + { "media", "Media", NULL }, + { "finishings", "Finishings", NULL }, + { "copies", "Copies", NULL }, +}; + +void +scan_printers_do(void) +{ + int num_dests, i, j; + CUPSDest *dests; + gchar *prn_id, *prn_moreinfo; + + g_free(printer_list); + g_free(printer_icons); + + if (!cups_init) { + init_cups(); + + printer_icons = g_strdup(""); + printer_list = g_strdup(_("[Printers]\n" + "No suitable CUPS library found=")); + return; + } + + /* remove old devices from global device table */ + moreinfo_del_with_prefix("DEV:PRN"); + + num_dests = cups_dests_get(&dests); + if (num_dests > 0) { + printer_list = g_strdup_printf(_("[Printers (CUPS)]\n")); + printer_icons = g_strdup(""); + for (i = 0; i < num_dests; i++) { + GHashTable *options; + + options = g_hash_table_new(g_str_hash, g_str_equal); + + for (j = 0; j < dests[i].num_options; j++) { + g_hash_table_insert(options, + g_strdup(dests[i].options[j].name), + g_strdup(dests[i].options[j].value)); + } + + prn_id = g_strdup_printf("PRN%d", i); + + printer_list = h_strdup_cprintf("\n$%s$%s=%s\n", + printer_list, + prn_id, + dests[i].name, + dests[i].is_default ? "Default" : ""); + printer_icons = h_strdup_cprintf("\nIcon$%s$%s=printer.png", + printer_icons, + prn_id, + dests[i].name); + + prn_moreinfo = g_strdup(""); + for (j = 0; j < G_N_ELEMENTS(cups_fields); j++) { + if (!cups_fields[j].name) { + prn_moreinfo = h_strdup_cprintf("[%s]\n", + prn_moreinfo, + cups_fields[j].key); + } else { + gchar *temp; + + temp = g_hash_table_lookup(options, cups_fields[j].key); + + if (cups_fields[j].callback) { + temp = cups_fields[j].callback(temp); + } else { + if (temp) { + /* FIXME Do proper escaping */ + temp = g_strdup(strreplacechr(temp, "&=", ' ')); + } else { + temp = g_strdup(_("Unknown")); + } + } + + prn_moreinfo = h_strdup_cprintf("%s=%s\n", + prn_moreinfo, + cups_fields[j].name, + temp); + + g_free(temp); + } + } + + moreinfo_add_with_prefix("DEV", prn_id, prn_moreinfo); + g_free(prn_id); + g_hash_table_destroy(options); + } + + cups_dests_free(num_dests, dests); + } else { + printer_list = g_strdup(_("[Printers]\n" + "No printers found=\n")); + } +} diff --git a/modules/devices/resources.c b/modules/devices/resources.c new file mode 100644 index 00000000..15cb8f21 --- /dev/null +++ b/modules/devices/resources.c @@ -0,0 +1,119 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2008 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "devices.h" + +static gchar *_resources = NULL; +static gboolean _require_root = FALSE; + +#if GLIB_CHECK_VERSION(2,14,0) +static GRegex *_regex_pci = NULL, + *_regex_module = NULL; + +static gchar *_resource_obtain_name(gchar *name) +{ + gchar *temp; + + if (!_regex_pci && !_regex_module) { + _regex_pci = g_regex_new("^[0-9a-fA-F]{4}:[0-9a-fA-F]{2}:" + "[0-9a-fA-F]{2}\\.[0-9a-fA-F]{1}$", + 0, 0, NULL); + _regex_module = g_regex_new("^[0-9a-zA-Z\\_\\-]+$", 0, 0, NULL); + } + + name = g_strstrip(name); + + if (g_regex_match(_regex_pci, name, 0, NULL)) { + temp = module_call_method_param("devices::getPCIDeviceDescription", name); + if (temp) { + return g_strdup_printf("PCI %s", (gchar *)idle_free(temp)); + } + } else if (g_regex_match(_regex_module, name, 0, NULL)) { + temp = module_call_method_param("computer::getKernelModuleDescription", name); + if (temp) { + return g_strdup_printf("Module %s", (gchar *)idle_free(temp)); + } + } + + return g_strdup(name); +} +#else +static gchar *_resource_obtain_name(gchar *name) +{ + return g_strdup(name); +} +#endif + +void scan_device_resources(gboolean reload) +{ + SCAN_START(); + FILE *io; + gchar buffer[256]; + gint i; + gint zero_to_zero_addr = 0; + + struct { + gchar *file; + gchar *description; + } resources[] = { + { "/proc/ioports", "[I/O Ports]\n" }, + { "/proc/iomem", "[Memory]\n" }, + { "/proc/dma", "[DMA]\n" } + }; + + g_free(_resources); + _resources = g_strdup(""); + + for (i = 0; i < G_N_ELEMENTS(resources); i++) { + if ((io = fopen(resources[i].file, "r"))) { + _resources = h_strconcat(_resources, resources[i].description, NULL); + + while (fgets(buffer, 256, io)) { + gchar **temp = g_strsplit(buffer, ":", 2); + gchar *name = _resource_obtain_name(temp[1]); + + if (strstr(temp[0], "0000-0000")) + zero_to_zero_addr++; + + _resources = h_strdup_cprintf("%s=%s\n", _resources, + temp[0], name); + + g_strfreev(temp); + g_free(name); + } + + fclose(io); + } + } + + _require_root = zero_to_zero_addr > 16; + + SCAN_END(); +} + +gchar *callback_device_resources(void) +{ + return g_strdup(_resources); +} + +gboolean root_required_for_resources(void) +{ + return _require_root; +} diff --git a/modules/devices/s390/processor.c b/modules/devices/s390/processor.c new file mode 100644 index 00000000..99f1c8bd --- /dev/null +++ b/modules/devices/s390/processor.c @@ -0,0 +1,78 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "devices.h" + +GSList * +processor_scan(void) +{ + Processor *processor; + FILE *cpuinfo; + gchar buffer[128]; + + cpuinfo = fopen("/proc/cpuinfo", "r"); + if (!cpuinfo) + return NULL; + + processor = g_new0(Processor, 1); + while (fgets(buffer, 128, cpuinfo)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + + if (tmp[0] && tmp[1]) { + tmp[0] = g_strstrip(tmp[0]); + tmp[1] = g_strstrip(tmp[1]); + + get_str("vendor_id", processor->vendor_id); + get_float("# processors", processor->cache_size); + get_int("bogomips per cpu", processor->bogomips); + + } + g_strfreev(tmp); + } + + processor->cpu_mhz = 0.0f; + + processor->model_name = g_strconcat("S390 ", processor->vendor_id, NULL); + g_free(processor->vendor_id); + + fclose(cpuinfo); + + return g_slist_append(NULL, processor); +} + +gchar * +processor_get_info(GSList *processors) +{ + Processor *processor = (Processor *)processors->data; + + return g_strdup_printf("[Processor]\n" + "Model=%s\n" + "Processors=%d\n" + "BogoMips per CPU=%.2f" + "Byte Order=%s\n", + processor->model_name, + processor->cache_size, + processor->bogomips, +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + "Little Endian" +#else + "Big Endian" +#endif + ); +} diff --git a/modules/devices/sensors.c b/modules/devices/sensors.c new file mode 100644 index 00000000..84e89361 --- /dev/null +++ b/modules/devices/sensors.c @@ -0,0 +1,444 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "devices.h" +#include "expr.h" +#include "hardinfo.h" +#include "socket.h" + +gchar *sensors = NULL; +GHashTable *sensor_compute = NULL; +GHashTable *sensor_labels = NULL; + +static void read_sensor_labels(gchar * driver) +{ + FILE *conf; + gchar buf[256], *line, *p; + gboolean lock = FALSE; + gint i; + + /* Try to open lm-sensors config file sensors3.conf */ + conf = fopen("/etc/sensors3.conf", "r"); + + /* If it fails, try to open sensors.conf */ + if (!conf) conf = fopen("/etc/sensors.conf", "r"); + + if (!conf) { + /* Cannot open config file. */ + return; + } + + while (fgets(buf, 256, conf)) { + line = buf; + + remove_linefeed(line); + strend(line, '#'); + + if (*line == '\0') { + continue; + } else if (lock && strstr(line, "label")) { /* label lines */ + gchar **names = g_strsplit(strstr(line, "label") + 5, " ", 0); + gchar *name = NULL, *value = NULL; + + for (i = 0; names[i]; i++) { + if (names[i][0] == '\0') + continue; + + if (!name) + name = g_strdup(names[i]); + else if (!value) + value = g_strdup(names[i]); + else + value = g_strconcat(value, " ", names[i], NULL); + } + + remove_quotes(value); + g_hash_table_insert(sensor_labels, name, value); + + g_strfreev(names); + } else if (lock && strstr(line, "ignore")) { /* ignore lines */ + p = strstr(line, "ignore") + 6; + if (!strchr(p, ' ')) + continue; + + while (*p == ' ') + p++; + g_hash_table_insert(sensor_labels, g_strdup(p), "ignore"); + } else if (lock && strstr(line, "compute")) { /* compute lines */ + gchar **formulas = + g_strsplit(strstr(line, "compute") + 7, " ", 0); + gchar *name = NULL, *formula = NULL; + + for (i = 0; formulas[i]; i++) { + if (formulas[i][0] == '\0') + continue; + if (formulas[i][0] == ',') + break; + + if (!name) + name = g_strdup(formulas[i]); + else if (!formula) + formula = g_strdup(formulas[i]); + else + formula = g_strconcat(formula, formulas[i], NULL); + } + + g_strfreev(formulas); + g_hash_table_insert(sensor_compute, name, + math_string_to_postfix(formula)); + } else if (g_str_has_prefix(line, "chip")) { /* chip lines (delimiter) */ + if (lock == FALSE) { + gchar **chips = g_strsplit(line, " ", 0); + + for (i = 1; chips[i]; i++) { + strend(chips[i], '*'); + + if (g_str_has_prefix(chips[i] + 1, driver)) { + lock = TRUE; + break; + } + } + + g_strfreev(chips); + } else { + break; + } + } + } + + fclose(conf); +} + +static gchar *get_sensor_label(gchar * sensor) +{ + gchar *ret; + + ret = g_hash_table_lookup(sensor_labels, sensor); + if (!ret) + ret = g_strdup(sensor); + else + ret = g_strdup(ret); + + return ret; +} + +static float adjust_sensor(gchar * name, float value) +{ + GSList *postfix; + + postfix = g_hash_table_lookup(sensor_compute, name); + if (!postfix) + return value; + + return math_postfix_eval(postfix, value); +} + +static char *get_sensor_path(int number, const char *prefix) +{ + return g_strdup_printf("/sys/class/hwmon/hwmon%d/%s", number, prefix); +} + +static char *determine_driver_for_hwmon_path(char *path) +{ + char *tmp, *driver; + + tmp = g_strdup_printf("%s/device/driver", path); + driver = g_file_read_link(tmp, NULL); + g_free(tmp); + + if (driver) { + tmp = g_path_get_basename(driver); + g_free(driver); + driver = tmp; + } else { + tmp = g_strdup_printf("%s/device", path); + driver = g_file_read_link(tmp, NULL); + g_free(tmp); + } + + if (!driver) { + tmp = g_strdup_printf("%s/name", path); + if (!g_file_get_contents(tmp, &driver, NULL, NULL)) { + driver = g_strdup("unknown"); + } else { + driver = g_strstrip(driver); + } + g_free(tmp); + } + + return driver; +} + +struct HwmonSensor { + const char *friendly_name; + const char *path_format; + const char *key_format; + const char *value_format; + const float adjust_ratio; + const int begin_at; +}; + +static const struct HwmonSensor hwmon_sensors[] = { + { "Cooling Fans", "%s/fan%d_input", "fan%d", "%s (%s)=%.0fRPM\n", 1.0, 1 }, + { "Temperature", "%s/temp%d_input", "temp%d", "%s (%s)=%.2f\302\260C\n", 1000.0, 1 }, + { "Voltage Values", "%s/in%d_input", "in%d", "%s (%s)=%.3fV\n", 1000.0, 0 }, + { NULL, NULL, NULL, NULL, 0.0, 0 }, +}; + +static const char *hwmon_prefix[] = { "device", "", NULL }; + +static void read_sensors_hwmon(void) +{ + int hwmon, count; + gchar *path_hwmon, *path_sensor, *tmp, *driver, *name, *mon; + const char **prefix; + + for (prefix = hwmon_prefix; *prefix; prefix++) { + hwmon = 0; + path_hwmon = get_sensor_path(hwmon, *prefix); + while (path_hwmon && g_file_test(path_hwmon, G_FILE_TEST_EXISTS)) { + const struct HwmonSensor *sensor; + + driver = determine_driver_for_hwmon_path(path_hwmon); + DEBUG("hwmon%d has driver=%s", hwmon, driver); + + if (!sensor_labels) { + read_sensor_labels(driver); + } + + for (sensor = hwmon_sensors; sensor->friendly_name; sensor++) { + char *output = NULL; + DEBUG("current sensor type=%s", sensor->friendly_name); + + for (count = sensor->begin_at;; count++) { + path_sensor = g_strdup_printf(sensor->path_format, path_hwmon, count); + DEBUG("should be reading from %s", path_sensor); + if (!g_file_get_contents(path_sensor, &tmp, NULL, NULL)) { + g_free(path_sensor); + if (count<256) + continue; // brute-force find all + else + break; + } + + mon = g_strdup_printf(sensor->key_format, count); + name = get_sensor_label(mon); + if (!g_str_equal(name, "ignore")) { + output = h_strdup_cprintf(sensor->value_format, + output, name, driver, + adjust_sensor(mon, + atof(tmp) / sensor->adjust_ratio)); + } + + g_free(tmp); + g_free(mon); + g_free(name); + g_free(path_sensor); + } + + if (output) { + sensors = g_strconcat(sensors, "[", sensor->friendly_name, "]\n", output, "\n", NULL); + g_free(output); + } + } + + g_free(path_hwmon); + g_free(driver); + + path_hwmon = get_sensor_path(++hwmon, *prefix); + } + + g_free(path_hwmon); + } +} + +static void read_sensors_acpi(void) +{ + const gchar *path_tz = "/proc/acpi/thermal_zone"; + + if (g_file_test(path_tz, G_FILE_TEST_EXISTS)) { + GDir *tz; + + if ((tz = g_dir_open(path_tz, 0, NULL))) { + const gchar *entry; + gchar *temp = g_strdup(""); + + while ((entry = g_dir_read_name(tz))) { + gchar *path = + g_strdup_printf("%s/%s/temperature", path_tz, entry); + gchar *contents; + + if (g_file_get_contents(path, &contents, NULL, NULL)) { + int temperature; + + sscanf(contents, "temperature: %d C", &temperature); + + temp = h_strdup_cprintf("\n%s=%d\302\260C\n", + temp, entry, temperature); + + g_free(contents); + } + } + + if (*temp != '\0') + sensors = + h_strdup_cprintf("\n[ACPI Thermal Zone]\n%s", + sensors, temp); + + g_dir_close(tz); + } + } + +} + +static void read_sensors_sys_thermal(void) +{ + const gchar *path_tz = "/sys/class/thermal"; + + if (g_file_test(path_tz, G_FILE_TEST_EXISTS)) { + GDir *tz; + + if ((tz = g_dir_open(path_tz, 0, NULL))) { + const gchar *entry; + gchar *temp = g_strdup(""); + + while ((entry = g_dir_read_name(tz))) { + gchar *path = + g_strdup_printf("%s/%s/temp", path_tz, entry); + gchar *contents; + + if (g_file_get_contents(path, &contents, NULL, NULL)) { + int temperature; + + sscanf(contents, "%d", &temperature); + + temp = h_strdup_cprintf("\n%s=%.2f\302\260C\n", + temp, entry, (1.0*temperature/1000)); + + g_free(contents); + } + } + + if (*temp != '\0') + sensors = + h_strdup_cprintf("\n[ACPI Thermal Zone (sysfs)]\n%s", + sensors, temp); + + g_dir_close(tz); + } + } + +} + +static void read_sensors_omnibook(void) +{ + const gchar *path_ob = "/proc/omnibook/temperature"; + gchar *contents; + + if (g_file_get_contents(path_ob, &contents, NULL, NULL)) { + int temperature; + + sscanf(contents, "CPU temperature: %d C", &temperature); + + sensors = h_strdup_cprintf("\n[Omnibook]\n" + "CPU temperature=%d\302\260C\n", + sensors, temperature); + + g_free(contents); + } +} + +static void read_sensors_hddtemp(void) +{ + Socket *s; + static gchar *old = NULL; + gchar buffer[1024]; + gint len = 0; + + if ((s = sock_connect("127.0.0.1", 7634))) { + while (!len) + len = sock_read(s, buffer, sizeof(buffer)); + sock_close(s); + + if (len > 2 && buffer[0] == '|' && buffer[1] == '/') { + gchar **disks; + int i; + + g_free(old); + + old = g_strdup("[Hard Disk Temperature]\n"); + + disks = g_strsplit(buffer, "\n", 0); + for (i = 0; disks[i]; i++) { + gchar **fields = g_strsplit(disks[i] + 1, "|", 5); + + /* + * 0 -> /dev/hda + * 1 -> FUJITSU MHV2080AH + * 2 -> 41 + * 3 -> C + */ + old = h_strdup_cprintf("\n%s (%s)=%s\302\260%s\n", + old, + fields[1], fields[0], + fields[2], fields[3]); + + g_strfreev(fields); + } + + g_strfreev(disks); + } + } else { + g_free(old); + old = NULL; + } + + if (old) { + sensors = g_strconcat(sensors, "\n", old, NULL); + } +} + +void scan_sensors_do(void) +{ + g_free(sensors); + + sensors = g_strdup(""); + + read_sensors_hwmon(); + read_sensors_acpi(); + read_sensors_sys_thermal(); + read_sensors_omnibook(); + read_sensors_hddtemp(); + + /* FIXME: Add support for ibm acpi and more sensors */ +} + +void sensors_init(void) +{ + sensor_labels = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, g_free); + sensor_compute = g_hash_table_new(g_str_hash, g_str_equal); +} + +void sensors_shutdown(void) +{ + g_hash_table_destroy(sensor_labels); + g_hash_table_destroy(sensor_compute); +} diff --git a/modules/devices/sh/processor.c b/modules/devices/sh/processor.c new file mode 100644 index 00000000..cbd9a60a --- /dev/null +++ b/modules/devices/sh/processor.c @@ -0,0 +1,75 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "devices.h" + +GSList * +processor_scan(void) +{ + Processor *processor; + FILE *cpuinfo; + gchar buffer[128]; + + cpuinfo = fopen("/proc/cpuinfo", "r"); + if (!cpuinfo) + return NULL; + + processor = g_new0(Processor, 1); + while (fgets(buffer, 128, cpuinfo)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + + if (tmp[0] && tmp[1]) { + tmp[0] = g_strstrip(tmp[0]); + tmp[1] = g_strstrip(tmp[1]); + + get_str("machine", processor->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); +} + +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/modules/devices/sparc/processor.c b/modules/devices/sparc/processor.c new file mode 100644 index 00000000..594117a7 --- /dev/null +++ b/modules/devices/sparc/processor.c @@ -0,0 +1,64 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "devices.h" + +GSList * +processor_scan(void) +{ + Processor *processor; + FILE *cpuinfo; + gchar buffer[128]; + + cpuinfo = fopen("/proc/cpuinfo", "r"); + if (!cpuinfo) + return NULL; + + processor = g_new0(Processor, 1); + while (fgets(buffer, 128, cpuinfo)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + + if (tmp[0] && tmp[1]) { + tmp[0] = g_strstrip(tmp[0]); + tmp[1] = g_strstrip(tmp[1]); + + get_str("cpu", processor->model_name); + get_str("fpu", processor->has_fpu); + } + g_strfreev(tmp); + } + + fclose(cpuinfo); + + processor->cpu_mhz = 0.0f; + + return g_slist_append(NULL, processor); +} + +gchar * +processor_get_info(GSList *processors) +{ + Processor *processor = (Processor *)processors->data; + + return g_strdup_printf("[Processor]\n" + "CPU=%s\n" + "FPU=%s\n", + processor->model_name, + processor->has_fpu); +} diff --git a/modules/devices/spd-decode.c b/modules/devices/spd-decode.c new file mode 100644 index 00000000..ac1dd52b --- /dev/null +++ b/modules/devices/spd-decode.c @@ -0,0 +1,1509 @@ +/* + * spd-decode.c + * Copyright (c) 2010 Leandro A. F. Pereira + * + * Based on decode-dimms.pl + * Copyright 1998, 1999 Philip Edelbrock + * modified by Christian Zuckschwerdt + * modified by Burkart Lingner + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include + +#include "hardinfo.h" +#include "devices.h" + +typedef enum { + UNKNOWN, + DIRECT_RAMBUS, + RAMBUS, + FPM_DRAM, + EDO, + PIPELINED_NIBBLE, + SDR_SDRAM, + MULTIPLEXED_ROM, + DDR_SGRAM, + DDR_SDRAM, + DDR2_SDRAM, + DDR3_SDRAM +} RamType; + +char *spd_info = NULL; + +static const char *ram_types[] = { + "Unknown", + "Direct Rambus", + "Rambus", + "FPM DRAM", + "EDO", + "Pipelined Nibble", + "SDR SDRAM", + "Multiplexed ROM", + "DDR SGRAM", + "DDR SDRAM", + "DDR2 SDRAM", + "DDR3 SDRAM" +}; + +static const char *vendors1[] = { "AMD", "AMI", "Fairchild", "Fujitsu", + "GTE", "Harris", "Hitachi", "Inmos", + "Intel", "I.T.T.", "Intersil", + "Monolithic Memories", + "Mostek", + "Freescale (former Motorola)", + "National", "NEC", + "RCA", "Raytheon", + "Conexant (Rockwell)", "Seeq", + "NXP (former Signetics, Philips Semi.)", + "Synertek", + "Texas Instruments", "Toshiba", + "Xicor", "Zilog", "Eurotechnique", + "Mitsubishi", + "Lucent (AT&T)", "Exel", "Atmel", + "SGS/Thomson", + "Lattice Semi.", "NCR", + "Wafer Scale Integration", "IBM", + "Tristar", "Visic", + "Intl. CMOS Technology", "SSSI", + "MicrochipTechnology", "Ricoh Ltd.", + "VLSI", "Micron Technology", + "Hyundai Electronics", + "OKI Semiconductor", "ACTEL", + "Sharp", + "Catalyst", "Panasonic", "IDT", + "Cypress", + "DEC", "LSI Logic", + "Zarlink (former Plessey)", "UTMC", + "Thinking Machine", "Thomson CSF", + "Integrated CMOS (Vertex)", + "Honeywell", + "Tektronix", "Sun Microsystems", + "SST", "ProMos/Mosel Vitelic", + "Infineon (former Siemens)", + "Macronix", "Xerox", "Plus Logic", + "SunDisk", "Elan Circuit Tech.", + "European Silicon Str.", + "Apple Computer", + "Xilinx", "Compaq", + "Protocol Engines", "SCI", + "Seiko Instruments", "Samsung", + "I3 Design System", "Klic", + "Crosspoint Solutions", + "Alliance Semiconductor", "Tandem", + "Hewlett-Packard", + "Intg. Silicon Solutions", + "Brooktree", "New Media", + "MHS Electronic", + "Performance Semi.", + "Winbond Electronic", + "Kawasaki Steel", + "Bright Micro", + "TECMAR", "Exar", "PCMCIA", + "LG Semi (former Goldstar)", + "Northern Telecom", "Sanyo", + "Array Microsystems", + "Crystal Semiconductor", + "Analog Devices", "PMC-Sierra", + "Asparix", "Convex Computer", + "Quality Semiconductor", + "Nimbus Technology", "Transwitch", + "Micronas (ITT Intermetall)", + "Cannon", "Altera", "NEXCOM", + "QUALCOMM", + "Sony", "Cray Research", + "AMS(Austria Micro)", "Vitesse", + "Aster Electronics", + "Bay Networks (Synoptic)", + "Zentrum or ZMD", + "TRW", + "Thesys", "Solbourne Computer", + "Allied-Signal", "Dialog", + "Media Vision", + "Level One Communication" +}; + +static const char *vendors2[] = { "Cirrus Logic", + "National Instruments", + "ILC Data Device", + "Alcatel Mietec", + "Micro Linear", + "Univ. of NC", + "JTAG Technologies", + "BAE Systems", + "Nchip", + "Galileo Tech", + "Bestlink Systems", + "Graychip", + "GENNUM", + "VideoLogic", + "Robert Bosch", + "Chip Express", + "DATARAM", + "United Microelec Corp.", + "TCSI", + "Smart Modular", + "Hughes Aircraft", + "Lanstar Semiconductor", + "Qlogic", "Kingston", + "Music Semi", + "Ericsson Components", + "SpaSE", + "Eon Silicon Devices", + "Programmable Micro Corp", + "DoD", + "Integ. Memories Tech.", + "Corollary Inc.", + "Dallas Semiconductor", + "Omnivision", + "EIV(Switzerland)", + "Novatel Wireless", + "Zarlink (former Mitel)", + "Clearpoint", + "Cabletron", + "STEC (former Silicon Technology)", + "Vanguard", + "Hagiwara Sys-Com", + "Vantis", "Celestica", + "Century", + "Hal Computers", + "Rohm Company Ltd.", + "Juniper Networks", + "Libit Signal Processing", + "Mushkin Enhanced Memory", + "Tundra Semiconductor", + "Adaptec Inc.", + "LightSpeed Semi.", + "ZSP Corp.", + "AMIC Technology", + "Adobe Systems", + "Dynachip", + "PNY Electronics", + "Newport Digital", + "MMC Networks", + "T Square", + "Seiko Epson", + "Broadcom", + "Viking Components", + "V3 Semiconductor", + "Flextronics (former Orbit)", + "Suwa Electronics", + "Transmeta", + "Micron CMS", + "American Computer & Digital Components Inc", + "Enhance 3000 Inc", + "Tower Semiconductor", + "CPU Design", + "Price Point", + "Maxim Integrated Product", + "Tellabs", + "Centaur Technology", + "Unigen Corporation", + "Transcend Information", + "Memory Card Technology", + "CKD Corporation Ltd.", + "Capital Instruments, Inc.", + "Aica Kogyo, Ltd.", + "Linvex Technology", + "MSC Vertriebs GmbH", + "AKM Company, Ltd.", + "Dynamem, Inc.", + "NERA ASA", + "GSI Technology", + "Dane-Elec (C Memory)", + "Acorn Computers", + "Lara Technology", + "Oak Technology, Inc.", + "Itec Memory", + "Tanisys Technology", + "Truevision", + "Wintec Industries", + "Super PC Memory", + "MGV Memory", + "Galvantech", + "Gadzoox Nteworks", + "Multi Dimensional Cons.", + "GateField", + "Integrated Memory System", + "Triscend", "XaQti", + "Goldenram", + "Clear Logic", + "Cimaron Communications", + "Nippon Steel Semi. Corp.", + "Advantage Memory", + "AMCC", + "LeCroy", + "Yamaha Corporation", + "Digital Microwave", + "NetLogic Microsystems", + "MIMOS Semiconductor", + "Advanced Fibre", + "BF Goodrich Data.", + "Epigram", + "Acbel Polytech Inc.", + "Apacer Technology", + "Admor Memory", + "FOXCONN", + "Quadratics Superconductor", + "3COM", +}; + +static const char *vendors3[] = { "Camintonn Corporation", "ISOA Incorporated", + "Agate Semiconductor", "ADMtek Incorporated", + "HYPERTEC", "Adhoc Technologies", "MOSAID Technologies", + "Ardent Technologies", + "Switchcore", "Cisco Systems, Inc.", "Allayer Technologies", + "WorkX AG", + "Oasis Semiconductor", "Novanet Semiconductor", "E-M Solutions", + "Power General", + "Advanced Hardware Arch.", "Inova Semiconductors GmbH", "Telocity", + "Delkin Devices", + "Symagery Microsystems", "C-Port Corporation", + "SiberCore Technologies", "Southland Microsystems", + "Malleable Technologies", "Kendin Communications", + "Great Technology Microcomputer", "Sanmina Corporation", + "HADCO Corporation", "Corsair", "Actrans System Inc.", + "ALPHA Technologies", + "Silicon Laboratories, Inc. (Cygnal)", "Artesyn Technologies", + "Align Manufacturing", "Peregrine Semiconductor", + "Chameleon Systems", "Aplus Flash Technology", "MIPS Technologies", + "Chrysalis ITS", + "ADTEC Corporation", "Kentron Technologies", "Win Technologies", + "Tachyon Semiconductor (former ASIC Designs Inc.)", + "Extreme Packet Devices", "RF Micro Devices", "Siemens AG", + "Sarnoff Corporation", + "Itautec Philco SA", "Radiata Inc.", "Benchmark Elect. (AVEX)", + "Legend", + "SpecTek Incorporated", "Hi/fn", "Enikia Incorporated", + "SwitchOn Networks", + "AANetcom Incorporated", "Micro Memory Bank", "ESS Technology", + "Virata Corporation", + "Excess Bandwidth", "West Bay Semiconductor", "DSP Group", + "Newport Communications", + "Chip2Chip Incorporated", "Phobos Corporation", + "Intellitech Corporation", "Nordic VLSI ASA", + "Ishoni Networks", "Silicon Spice", "Alchemy Semiconductor", + "Agilent Technologies", + "Centillium Communications", "W.L. Gore", "HanBit Electronics", + "GlobeSpan", + "Element 14", "Pycon", "Saifun Semiconductors", "Sibyte, Incorporated", + "MetaLink Technologies", "Feiya Technology", "I & C Technology", + "Shikatronics", + "Elektrobit", "Megic", "Com-Tier", "Malaysia Micro Solutions", + "Hyperchip", "Gemstone Communications", "Anadigm (former Anadyne)", + "3ParData", + "Mellanox Technologies", "Tenx Technologies", "Helix AG", "Domosys", + "Skyup Technology", "HiNT Corporation", "Chiaro", + "MDT Technologies GmbH (former MCI Computer GMBH)", + "Exbit Technology A/S", "Integrated Technology Express", "AVED Memory", + "Legerity", + "Jasmine Networks", "Caspian Networks", "nCUBE", + "Silicon Access Networks", + "FDK Corporation", "High Bandwidth Access", "MultiLink Technology", + "BRECIS", + "World Wide Packets", "APW", "Chicory Systems", "Xstream Logic", + "Fast-Chip", "Zucotto Wireless", "Realchip", "Galaxy Power", + "eSilicon", "Morphics Technology", "Accelerant Networks", + "Silicon Wave", + "SandCraft", "Elpida" +}; + +static const char *vendors4[] = { "Solectron", "Optosys Technologies", + "Buffalo (former Melco)", + "TriMedia Technologies", + "Cyan Technologies", "Global Locate", + "Optillion", + "Terago Communications", + "Ikanos Communications", + "Princeton Technology", + "Nanya Technology", + "Elite Flash Storage", + "Mysticom", "LightSand Communications", + "ATI Technologies", + "Agere Systems", + "NeoMagic", "AuroraNetics", "Golden Empire", + "Mushkin", + "Tioga Technologies", "Netlist", "TeraLogic", + "Cicada Semiconductor", + "Centon Electronics", "Tyco Electronics", + "Magis Works", "Zettacom", + "Cogency Semiconductor", "Chipcon AS", + "Aspex Technology", + "F5 Networks", + "Programmable Silicon Solutions", + "ChipWrights", + "Acorn Networks", + "Quicklogic", + "Kingmax Semiconductor", "BOPS", "Flasys", + "BitBlitz Communications", + "eMemory Technology", "Procket Networks", + "Purple Ray", + "Trebia Networks", + "Delta Electronics", "Onex Communications", + "Ample Communications", + "Memory Experts Intl", + "Astute Networks", "Azanda Network Devices", + "Dibcom", "Tekmos", + "API NetWorks", "Bay Microsystems", + "Firecron Ltd", + "Resonext Communications", + "Tachys Technologies", "Equator Technology", + "Concept Computer", + "SILCOM", + "3Dlabs", "c't Magazine", "Sanera Systems", + "Silicon Packets", + "Viasystems Group", "Simtek", + "Semicon Devices Singapore", + "Satron Handelsges", + "Improv Systems", "INDUSYS GmbH", "Corrent", + "Infrant Technologies", + "Ritek Corp", "empowerTel Networks", + "Hypertec", + "Cavium Networks", + "PLX Technology", "Massana Design", + "Intrinsity", + "Valence Semiconductor", + "Terawave Communications", + "IceFyre Semiconductor", "Primarion", + "Picochip Designs Ltd", + "Silverback Systems", + "Jade Star Technologies", + "Pijnenburg Securealink", + "TakeMS International AG", + "Cambridge Silicon Radio", + "Swissbit", "Nazomi Communications", + "eWave System", + "Rockwell Collins", "Picocel Co., Ltd.", + "Alphamosaic Ltd", + "Sandburst", + "SiCon Video", "NanoAmp Solutions", + "Ericsson Technology", + "PrairieComm", + "Mitac International", "Layer N Networks", + "MtekVision", + "Allegro Networks", + "Marvell Semiconductors", + "Netergy Microelectronic", "NVIDIA", + "Internet Machines", + "Peak Electronics", + "Litchfield Communication", + "Accton Technology", + "Teradiant Networks", + "Europe Technologies", "Cortina Systems", + "RAM Components", + "Raqia Networks", + "ClearSpeed", "Matsushita Battery", + "Xelerated", + "SimpleTech", + "Utron Technology", "Astec International", + "AVM gmbH", + "Redux Communications", + "Dot Hill Systems", "TeraChip" +}; + +static const char *vendors5[] = { "T-RAM Incorporated", + "Innovics Wireless", "Teknovus", "KeyEye Communications", + "Runcom Technologies", "RedSwitch", "Dotcast", + "Silicon Mountain Memory", + "Signia Technologies", "Pixim", "Galazar Networks", + "White Electronic Designs", + "Patriot Scientific", "Neoaxiom Corporation", "3Y Power Technology", + "Europe Technologies", + "Potentia Power Systems", "C-guys Incorporated", + "Digital Communications Technology Incorporated", + "Silicon-Based Technology", + "Fulcrum Microsystems", "Positivo Informatica Ltd", + "XIOtech Corporation", "PortalPlayer", + "Zhiying Software", "Direct2Data", "Phonex Broadband", + "Skyworks Solutions", + "Entropic Communications", "Pacific Force Technology", "Zensys A/S", + "Legend Silicon Corp.", + "sci-worx GmbH", "SMSC (former Oasis Silicon Systems)", + "Renesas Technology", "Raza Microelectronics", + "Phyworks", "MediaTek", "Non-cents Productions", "US Modular", + "Wintegra Ltd", "Mathstar", "StarCore", "Oplus Technologies", + "Mindspeed", "Just Young Computer", "Radia Communications", "OCZ", + "Emuzed", "LOGIC Devices", "Inphi Corporation", "Quake Technologies", + "Vixel", "SolusTek", "Kongsberg Maritime", "Faraday Technology", + "Altium Ltd.", "Insyte", "ARM Ltd.", "DigiVision", + "Vativ Technologies", "Endicott Interconnect Technologies", "Pericom", + "Bandspeed", + "LeWiz Communications", "CPU Technology", "Ramaxel Technology", + "DSP Group", + "Axis Communications", "Legacy Electronics", "Chrontel", + "Powerchip Semiconductor", + "MobilEye Technologies", "Excel Semiconductor", "A-DATA Technology", + "VirtualDigm", + "G Skill Intl", "Quanta Computer", "Yield Microelectronics", + "Afa Technologies", + "KINGBOX Technology Co. Ltd.", "Ceva", "iStor Networks", + "Advance Modules", + "Microsoft", "Open-Silicon", "Goal Semiconductor", + "ARC International", + "Simmtec", "Metanoia", "Key Stream", "Lowrance Electronics", + "Adimos", "SiGe Semiconductor", "Fodus Communications", + "Credence Systems Corp.", + "Genesis Microchip Inc.", "Vihana, Inc.", "WIS Technologies", + "GateChange Technologies", + "High Density Devices AS", "Synopsys", "Gigaram", + "Enigma Semiconductor Inc.", + "Century Micro Inc.", "Icera Semiconductor", + "Mediaworks Integrated Systems", "O'Neil Product Development", + "Supreme Top Technology Ltd.", "MicroDisplay Corporation", + "Team Group Inc.", "Sinett Corporation", + "Toshiba Corporation", "Tensilica", "SiRF Technology", "Bacoc Inc.", + "SMaL Camera Technologies", "Thomson SC", "Airgo Networks", + "Wisair Ltd.", + "SigmaTel", "Arkados", "Compete IT gmbH Co. KG", + "Eudar Technology Inc.", + "Focus Enhancements", "Xyratex" +}; + +static const char *vendors6[] = { "Specular Networks", + "Patriot Memory", + "U-Chip Technology Corp.", + "Silicon Optix", + "Greenfield Networks", + "CompuRAM GmbH", "Stargen, Inc.", + "NetCell Corporation", + "Excalibrus Technologies Ltd", + "SCM Microsystems", + "Xsigo Systems, Inc.", + "CHIPS & Systems Inc", + "Tier 1 Multichip Solutions", + "CWRL Labs", "Teradici", + "Gigaram, Inc.", + "g2 Microsystems", + "PowerFlash Semiconductor", + "P.A. Semi, Inc.", + "NovaTech Solutions, S.A.", + "c2 Microsystems, Inc.", + "Level5 Networks", + "COS Memory AG", + "Innovasic Semiconductor", + "02IC Co. Ltd", "Tabula, Inc.", + "Crucial Technology", + "Chelsio Communications", + "Solarflare Communications", + "Xambala Inc.", "EADS Astrium", + "ATO Semicon Co. Ltd.", + "Imaging Works, Inc.", + "Astute Networks, Inc.", "Tzero", + "Emulex", + "Power-One", "Pulse~LINK Inc.", + "Hon Hai Precision Industry", + "White Rock Networks Inc.", + "Telegent Systems USA, Inc.", + "Atrua Technologies, Inc.", + "Acbel Polytech Inc.", + "eRide Inc.", + "ULi Electronics Inc.", + "Magnum Semiconductor Inc.", + "neoOne Technology, Inc.", + "Connex Technology, Inc.", + "Stream Processors, Inc.", + "Focus Enhancements", + "Telecis Wireless, Inc.", + "uNav Microelectronics", + "Tarari, Inc.", "Ambric, Inc.", + "Newport Media, Inc.", "VMTS", + "Enuclia Semiconductor, Inc.", + "Virtium Technology Inc.", + "Solid State System Co., Ltd.", + "Kian Tech LLC", + "Artimi", + "Power Quotient International", + "Avago Technologies", + "ADTechnology", "Sigma Designs", + "SiCortex, Inc.", + "Ventura Technology Group", + "eASIC", "M.H.S. SAS", + "Micro Star International", + "Rapport Inc.", + "Makway International", + "Broad Reach Engineering Co.", + "Semiconductor Mfg Intl Corp", + "SiConnect", "FCI USA Inc.", + "Validity Sensors", + "Coney Technology Co. Ltd.", + "Spans Logic", "Neterion Inc.", + "Qimonda", + "New Japan Radio Co. Ltd.", + "Velogix", "Montalvo Systems", + "iVivity Inc.", + "Walton Chaintech", + "AENEON", + "Lorom Industrial Co. Ltd.", + "Radiospire Networks", + "Sensio Technologies, Inc.", + "Nethra Imaging", + "Hexon Technology Pte Ltd", + "CompuStocx (CSX)", + "Methode Electronics, Inc.", + "Connect One Ltd.", + "Opulan Technologies", + "Septentrio NV", + "Goldenmars Technology Inc.", + "Kreton Corporation", + "Cochlear Ltd.", + "Altair Semiconductor", + "NetEffect, Inc.", + "Spansion, Inc.", + "Taiwan Semiconductor Mfg", + "Emphany Systems Inc.", + "ApaceWave Technologies", + "Mobilygen Corporation", "Tego", + "Cswitch Corporation", + "Haier (Beijing) IC Design Co.", + "MetaRAM", + "Axel Electronics Co. Ltd.", + "Tilera Corporation", + "Aquantia", + "Vivace Semiconductor", + "Redpine Signals", "Octalica", + "InterDigital Communications", + "Avant Technology", + "Asrock, Inc.", "Availink", + "Quartics, Inc.", + "Element CXI", + "Innovaciones Microelectronicas", + "VeriSilicon Microelectronics", + "W5 Networks" +}; + +static const char *vendors7[] = { "MOVEKING", "Mavrix Technology, Inc.", + "CellGuide Ltd.", "Faraday Technology", + "Diablo Technologies, Inc.", "Jennic", "Octasic", + "Molex Incorporated", + "3Leaf Networks", + "Bright Micron Technology", "Netxen", "NextWave Broadband Inc.", + "DisplayLink", "ZMOS Technology", + "Tec-Hill", "Multigig, Inc.", "Amimon", "Euphonic Technologies, Inc.", + "BRN Phoenix", + "InSilica", "Ember Corporation", "Avexir Technologies Corporation", + "Echelon Corporation", + "Edgewater Computer Systems", "XMOS Semiconductor Ltd.", + "GENUSION, Inc.", "Memory Corp NV", + "SiliconBlue Technologies", "Rambus Inc." +}; + +static const char **vendors[7] = { vendors1, vendors2, vendors3, vendors4, vendors5, vendors6, + vendors7 +}; + +/* + * We consider that no data was written to this area of the SPD EEPROM if + * all bytes read 0x00 or all bytes read 0xff + */ +static int spd_written(unsigned char *bytes, int len) +{ + do { + if (*bytes == 0x00 || *bytes == 0xFF) + return 1; + } while (--len && bytes++); + + return 0; +} + +static int parity(int value) +{ + value ^= value >> 16; + value ^= value >> 8; + value ^= value >> 4; + value &= 0xf; + + return (0x6996 >> value) & 1; +} + +static void decode_sdr_module_size(unsigned char *bytes, int *size) +{ + int i, k = 0; + + i = (bytes[3] & 0x0f) + (bytes[4] & 0x0f) - 17; + if (bytes[5] <= 8 && bytes[17] <= 8) { + k = bytes[5] * bytes[17]; + } + + if (i > 0 && i <= 12 && k > 0) { + if (size) { + *size = (1 << i) * k; + } + } else { + if (size) { + *size = -1; + } + } +} + +static void decode_sdr_module_timings(unsigned char *bytes, float *tcl, float *trcd, float *trp, float *tras) +{ + float cas[3], ctime; + int i, j; + + for (i = 0, j = 0; j < 7; j++) { + if (bytes[18] & 1 << j) { + cas[i++] = j + 1; + } + } + + ctime = (bytes[9] >> 4 + bytes[9] & 0xf) * 0.1; + + if (trcd) { + *trcd = ceil(bytes[29] / ctime); + } + if (trp) { + *trp = ceil(bytes[27] / ctime); + } + if (tras) { + *tras = ceil(bytes[30] / ctime); + } + if (tcl) { + *tcl = cas[i]; + } +} + +static void decode_sdr_module_row_address_bits(unsigned char *bytes, char **bits) +{ + char *temp; + + switch (bytes[3]) { + case 0: + temp = "Undefined"; + break; + case 1: + temp = "1/16"; + break; + case 2: + temp = "2/27"; + break; + case 3: + temp = "3/18"; + break; + default: + /* printf("%d\n", bytes[3]); */ + temp = "Unknown"; + } + + if (bits) { + *bits = temp; + } +} + +static void decode_sdr_module_col_address_bits(unsigned char *bytes, char **bits) +{ + char *temp; + + switch (bytes[4]) { + case 0: + temp = "Undefined"; + break; + case 1: + temp = "1/16"; + break; + case 2: + temp = "2/17"; + break; + case 3: + temp = "3/18"; + break; + default: + /*printf("%d\n", bytes[4]); */ + temp = "Unknown"; + } + + if (bits) { + *bits = temp; + } +} + +static void decode_sdr_module_number_of_rows(unsigned char *bytes, int *rows) +{ + if (rows) { + *rows = bytes[5]; + } +} + +static void decode_sdr_module_data_with(unsigned char *bytes, int *width) +{ + if (width) { + if (bytes[7] > 1) { + *width = 0; + } else { + *width = (bytes[7] * 0xff) + bytes[6]; + } + } +} + +static void decode_sdr_module_interface_signal_levels(unsigned char *bytes, char **signal_levels) +{ + char *temp; + + switch (bytes[8]) { + case 0: + temp = "5.0 Volt/TTL"; + break; + case 1: + temp = "LVTTL"; + break; + case 2: + temp = "HSTL 1.5"; + break; + case 3: + temp = "SSTL 3.3"; + break; + case 4: + temp = "SSTL 2.5"; + break; + case 255: + temp = "New Table"; + break; + default: + temp = "Undefined"; + } + + if (signal_levels) { + *signal_levels = temp; + } +} + +static void decode_sdr_module_configuration_type(unsigned char *bytes, char **module_config_type) +{ + char *temp; + + switch (bytes[11]) { + case 0: + temp = "No parity"; + break; + case 1: + temp = "Parity"; + break; + case 2: + temp = "ECC"; + break; + default: + temp = "Undefined"; + } + + if (module_config_type) { + *module_config_type = temp; + } +} + +static void decode_sdr_module_refresh_type(unsigned char *bytes, char **refresh_type) +{ + char *temp; + + if (bytes[12] & 0x80) { + temp = "Self refreshing"; + } else { + temp = "Not self refreshing"; + } + + if (refresh_type) { + *refresh_type = temp; + } +} + +static void decode_sdr_module_refresh_rate(unsigned char *bytes, char **refresh_rate) +{ + char *temp; + + switch (bytes[12] & 0x7f) { + case 0: + temp = "Normal (15.625us)"; + break; + case 1: + temp = "Reduced (3.9us)"; + break; + case 2: + temp = "Reduced (7.8us)"; + break; + case 3: + temp = "Extended (31.3us)"; + break; + case 4: + temp = "Extended (62.5us)"; + break; + case 5: + temp = "Extended (125us)"; + break; + default: + temp = "Undefined"; + } + + if (refresh_rate) { + *refresh_rate = temp; + } +} + +static gchar *decode_sdr_sdram(unsigned char *bytes, int *size) +{ + int rows, data_width; + float tcl, trcd, trp, tras; + char *row_address_bits, *col_address_bits, *signal_level; + char *module_config_type, *refresh_type, *refresh_rate; + + decode_sdr_module_size(bytes, size); + decode_sdr_module_timings(bytes, &tcl, &trcd, &trp, &tras); + decode_sdr_module_row_address_bits(bytes, &row_address_bits); + decode_sdr_module_col_address_bits(bytes, &col_address_bits); + decode_sdr_module_number_of_rows(bytes, &rows); + decode_sdr_module_data_with(bytes, &data_width); + decode_sdr_module_interface_signal_levels(bytes, &signal_level); + decode_sdr_module_configuration_type(bytes, &module_config_type); + decode_sdr_module_refresh_type(bytes, &refresh_type); + decode_sdr_module_refresh_rate(bytes, &refresh_rate); + + /* TODO: + - RAS to CAS delay + - Supported CAS latencies + - Supported CS latencies + - Supported WE latencies + - Cycle Time / Access time + - SDRAM module attributes + - SDRAM device attributes + - Row densities + - Other misc stuff + */ + + return g_strdup_printf("[Module Information]\n" + "Module type=SDR\n" + "SPD revision=%d\n" + "Row address bits=%s\n" + "Column address bits=%s\n" + "Number of rows=%d\n" + "Data width=%d bits\n" + "Interface signal levels=%s\n" + "Configuration type=%s\n" + "Refresh=%s (%s)\n" + "[Timings]\n" + "tCL=%.2f\n" + "tRCD=%.2f\n" + "tRP=%.2f\n" + "tRAS=%.2f\n", + bytes[62], + row_address_bits, col_address_bits, rows, + data_width, signal_level, module_config_type, + refresh_type, refresh_rate, tcl, trcd, trp, tras); +} + +static void decode_ddr_module_speed(unsigned char *bytes, float *ddrclk, int *pcclk) +{ + float temp, clk; + int tbits, pc; + + temp = (bytes[9] >> 4) + (bytes[9] & 0xf) * 0.1; + clk = 2 * (1000 / temp); + tbits = (bytes[7] * 256) + bytes[6]; + + if (bytes[11] == 2 || bytes[11] == 1) { + tbits -= 8; + } + + pc = clk * tbits / 8; + if (pc % 100 > 50) { + pc += 100; + } + pc -= pc % 100; + + if (ddrclk) + *ddrclk = (int) clk; + + if (pcclk) + *pcclk = pc; +} + +static void decode_ddr_module_size(unsigned char *bytes, int *size) +{ + int i, k; + + i = (bytes[3] & 0x0f) + (bytes[4] & 0x0f) - 17; + k = (bytes[5] <= 8 && bytes[17] <= 8) ? bytes[5] * bytes[17] : 0; + + if (i > 0 && i <= 12 && k > 0) { + if (size) { + *size = (1 << i) * k; + } + } else { + if (size) { + *size = -1; + } + } +} + +static void *decode_ddr_module_timings(unsigned char *bytes, float *tcl, float *trcd, float *trp, float *tras) +{ + float ctime; + float highest_cas = 0; + int i; + + for (i = 0; i < 7; i++) { + if (bytes[18] & (1 << i)) { + highest_cas = 1 + i * 0.5f; + } + } + + ctime = (bytes[9] >> 4) + (bytes[9] & 0xf) * 0.1; + + if (trcd) { + *trcd = (bytes[29] >> 2) + ((bytes[29] & 3) * 0.25); + *trcd = ceil(*trcd / ctime); + } + + if (trp) { + *trp = (bytes[27] >> 2) + ((bytes[27] & 3) * 0.25); + *trp = ceil(*trp / ctime); + } + + if (tras) { + *tras = bytes[30]; + *tras = ceil(*tras / ctime); + } + + if (tcl) { + *tcl = highest_cas; + } +} + +static gchar *decode_ddr_sdram(unsigned char *bytes, int *size) +{ + float ddr_clock; + float tcl, trcd, trp, tras; + int pc_speed; + + decode_ddr_module_speed(bytes, &ddr_clock, &pc_speed); + decode_ddr_module_size(bytes, size); + decode_ddr_module_timings(bytes, &tcl, &trcd, &trp, &tras); + + return g_strdup_printf("[Module Information]\n" + "Module type=DDR %.2fMHz (PC%d)\n" + "SPD revision=%d.%d\n" + "[Timings]\n" + "tCL=%.2f\n" + "tRCD=%.2f\n" + "tRP=%.2f\n" + "tRAS=%.2f\n", ddr_clock, pc_speed, bytes[62] >> 4, bytes[62] & 0xf, tcl, trcd, trp, tras); +} + +static float decode_ddr2_module_ctime(unsigned char byte) +{ + float ctime; + + ctime = (byte >> 4); + byte &= 0xf; + + if (byte <= 9) { + ctime += byte * 0.1; + } else if (byte == 10) { + ctime += 0.25; + } else if (byte == 11) { + ctime += 0.33; + } else if (byte == 12) { + ctime += 0.66; + } else if (byte == 13) { + ctime += 0.75; + } + + return ctime; +} + +static void decode_ddr2_module_speed(unsigned char *bytes, float *ddr_clock, int *pc2_speed) +{ + float ctime; + float ddrclk; + int tbits, pcclk; + + ctime = decode_ddr2_module_ctime(bytes[9]); + ddrclk = 2 * (1000 / ctime); + + tbits = (bytes[7] * 256) + bytes[6]; + if (bytes[11] & 0x03) { + tbits -= 8; + } + + pcclk = ddrclk * tbits / 8; + pcclk -= pcclk % 100; + + if (ddr_clock) { + *ddr_clock = (int) ddrclk; + } + if (pc2_speed) { + *pc2_speed = pcclk; + } +} + +static void decode_ddr2_module_size(unsigned char *bytes, int *size) +{ + int i, k; + + i = (bytes[3] & 0x0f) + (bytes[4] & 0x0f) - 17; + k = ((bytes[5] & 0x7) + 1) * bytes[17]; + + if (i > 0 && i <= 12 && k > 0) { + if (*size) { + *size = ((1 << i) * k); + } + } else { + if (*size) { + *size = 0; + } + } +} + +static void decode_ddr2_module_timings(unsigned char *bytes, float *trcd, float *trp, float *tras, float *tcl) +{ + float ctime; + float highest_cas = 0; + int i; + + for (i = 0; i < 7; i++) { + if (bytes[18] & (1 << i)) { + highest_cas = i; + } + } + + ctime = decode_ddr2_module_ctime(bytes[9]); + + if (trcd) { + *trcd = ceil(((bytes[29] >> 2) + ((bytes[29] & 3) * 0.25)) / ctime); + } + + if (trp) { + *trp = ceil(((bytes[27] >> 2) + ((bytes[27] & 3) * 0.25)) / ctime); + } + + if (tras) { + *tras = ceil(bytes[30] / ctime); + } + + if (tcl) { + *tcl = highest_cas; + } +} + +static gchar *decode_ddr2_sdram(unsigned char *bytes, int *size) +{ + float ddr_clock; + float trcd, trp, tras, tcl; + int pc2_speed; + + decode_ddr2_module_speed(bytes, &ddr_clock, &pc2_speed); + decode_ddr2_module_size(bytes, size); + decode_ddr2_module_timings(bytes, &trcd, &trp, &tras, &tcl); + + return g_strdup_printf("[Module Information]\n" + "Module type=DDR2 %.2f MHz (PC2-%d)\n" + "SPD revision=%d.%d\n" + "[Timings]\n" + "tCL=%.2f\n" + "tRCD=%.2f\n" + "tRP=%.2f\n" + "tRAS=%.2f\n", ddr_clock, pc2_speed, bytes[62] >> 4, bytes[62] & 0xf, tcl, trcd, trp, tras); +} + +static void decode_ddr3_module_speed(unsigned char *bytes, float *ddr_clock, int *pc3_speed) +{ + float ctime; + float ddrclk; + int tbits, pcclk; + float mtb = 0.125; + + if (bytes[10] == 1 && bytes[11] == 8) + mtb = 0.125; + if (bytes[10] == 1 && bytes[11] == 15) + mtb = 0.0625; + ctime = mtb * bytes[12]; + + ddrclk = 2 * (1000 / ctime); + + tbits = 64; + switch (bytes[8]) { + case 1: + tbits = 16; + break; + case 4: + tbits = 32; + break; + case 3: + case 0xb: + tbits = 64; + break; + } + + pcclk = ddrclk * tbits / 8; + pcclk -= pcclk % 100; + + if (ddr_clock) { + *ddr_clock = (int) ddrclk; + } + if (pc3_speed) { + *pc3_speed = pcclk; + } +} + +static void decode_ddr3_module_size(unsigned char *bytes, int *size) +{ + *size = 512 << bytes[4]; +} + +static void decode_ddr3_module_timings(unsigned char *bytes, float *trcd, float *trp, float *tras, float *tcl) +{ + float ctime; + float highest_cas = 0; + int i; + float mtb = 0.125; + + if (bytes[10] == 1 && bytes[11] == 8) + mtb = 0.125; + if (bytes[10] == 1 && bytes[11] == 15) + mtb = 0.0625; + ctime = mtb * bytes[12]; + + switch (bytes[14]) { + case 6: + highest_cas = 5; + break; + case 4: + highest_cas = 6; + break; + case 0xc: + highest_cas = 7; + break; + case 0x1e: + highest_cas = 8; + break; + } + if (trcd) { + *trcd = bytes[18] * mtb; + } + + if (trp) { + *trp = bytes[20] * mtb; + } + + if (tras) { + *tras = (bytes[22] + bytes[21] & 0xf) * mtb; + } + + if (tcl) { + *tcl = highest_cas; + } +} + +static void decode_ddr3_module_type(unsigned char *bytes, const char **type) +{ + switch (bytes[3]) { + case 0x00: + *type = "Undefined"; + break; + case 0x01: + *type = "RDIMM (Registered Long DIMM)"; + break; + case 0x02: + *type = "UDIMM (Unbuffered Long DIMM)"; + break; + case 0x03: + *type = "SODIMM (Small Outline DIMM)"; + break; + default: + *type = "Unknown"; + } +} + +static gchar *decode_ddr3_sdram(unsigned char *bytes, int *size) +{ + float ddr_clock; + float trcd, trp, tras, tcl; + int pc3_speed; + const char *type; + + decode_ddr3_module_speed(bytes, &ddr_clock, &pc3_speed); + decode_ddr3_module_size(bytes, size); + decode_ddr3_module_timings(bytes, &trcd, &trp, &tras, &tcl); + decode_ddr3_module_type(bytes, &type); + + return g_strdup_printf("[Module Information]\n" + "Module type=DDR3 %.2f MHz (PC3-%d)\n" + "SPD revision=%d.%d\n" + "Type=%s\n" + "[Timings]\n" + "tCL=%.2f\n" + "tRCD=%.3fns\n" + "tRP=%.3fns\n" + "tRAS=%.3fns\n", + ddr_clock, pc3_speed, + bytes[1] >> 4, bytes[1] & 0xf, + type, + tcl, + trcd, + trp, + tras); +} + +static void decode_ddr3_part_number(unsigned char *bytes, char *part_number) +{ + int i; + if (part_number) { + for (i = 128; i <= 145; i++) + *part_number++ = bytes[i]; + *part_number = '\0'; + } +} + +static void decode_ddr3_manufacturer(unsigned char *bytes, char **manufacturer) +{ + char *out = "Unknown"; + + end: + if (manufacturer) { + *manufacturer = out; + } +} + +static void decode_module_manufacturer(unsigned char *bytes, char **manufacturer) +{ + char *out = "Unknown"; + unsigned char first; + int ai = 0; + int len = 8; + unsigned char *initial = bytes; + + if (!spd_written(bytes, 8)) { + out = "Undefined"; + goto end; + } + + do { + ai++; + } while ((--len && (*bytes++ == 0x7f))); + first = *--bytes; + + if (ai == 0) { + out = "Invalid"; + goto end; + } + + if (parity(first) != 1) { + out = "Invalid"; + goto end; + } + + out = (char *) vendors[ai - 1][(first & 0x7f) - 1]; + + end: + if (manufacturer) { + *manufacturer = out; + } +} + +static void decode_module_part_number(unsigned char *bytes, char *part_number) +{ + if (part_number) { + bytes += 8 + 64; + + while (*bytes++ && *bytes >= 32 && *bytes < 127) { + *part_number++ = *bytes; + } + *part_number = '\0'; + } +} + +static int decode_ram_type(unsigned char *bytes) +{ + if (bytes[0] < 4) { + switch (bytes[2]) { + case 1: + return DIRECT_RAMBUS; + case 17: + return RAMBUS; + } + } else { + switch (bytes[2]) { + case 1: + return FPM_DRAM; + case 2: + return EDO; + case 3: + return PIPELINED_NIBBLE; + case 4: + return SDR_SDRAM; + case 5: + return MULTIPLEXED_ROM; + case 6: + return DDR_SGRAM; + case 7: + return DDR_SDRAM; + case 8: + return DDR2_SDRAM; + case 11: + return DDR3_SDRAM; + } + } + + return UNKNOWN; +} + +static void read_spd(char *spd_path, int offset, size_t size, int use_sysfs, unsigned char *bytes_out) +{ + if (use_sysfs) { + FILE *spd; + gchar *temp_path; + + temp_path = g_strdup_printf("%s/eeprom", spd_path); + if ((spd = fopen(temp_path, "rb"))) { + fseek(spd, offset, SEEK_SET); + fread(bytes_out, 1, size, spd); + fclose(spd); + } + + g_free(temp_path); + } else { + int i; + + for (i = 0; i <= 3; i++) { + FILE *spd; + char *temp_path; + + temp_path = g_strdup_printf("%s/%02x", spd_path, offset + i * 16); + if ((spd = fopen(temp_path, "rb"))) { + fread(bytes_out + i * 16, 1, 16, spd); + fclose(spd); + } + + g_free(temp_path); + } + } +} + +static gchar *decode_dimms(GSList * dimm_list, gboolean use_sysfs) +{ + GSList *dimm; + GString *output; + gint count = 0; + + output = g_string_new(""); + + for (dimm = dimm_list; dimm; dimm = dimm->next, count++) { + gchar *spd_path = (gchar *) dimm->data; + gchar *manufacturer; + gchar *detailed_info; + gchar *moreinfo_key; + gchar part_number[32]; + unsigned char bytes[256]; + int module_size; + RamType ram_type; + + shell_status_pulse(); + + read_spd(spd_path, 0, 256, use_sysfs, bytes); + ram_type = decode_ram_type(bytes); + + switch (ram_type) { + case DDR2_SDRAM: + detailed_info = decode_ddr2_sdram(bytes, &module_size); + decode_module_part_number(bytes, part_number); + decode_module_manufacturer(bytes + 64, &manufacturer); + break; + case DDR3_SDRAM: + detailed_info = decode_ddr3_sdram(bytes, &module_size); + decode_ddr3_part_number(bytes, part_number); + decode_ddr3_manufacturer(bytes, &manufacturer); + break; + case DDR_SDRAM: + detailed_info = decode_ddr_sdram(bytes, &module_size); + decode_module_part_number(bytes, part_number); + decode_module_manufacturer(bytes + 64, &manufacturer); + break; + case SDR_SDRAM: + detailed_info = decode_sdr_sdram(bytes, &module_size); + decode_module_part_number(bytes, part_number); + decode_module_manufacturer(bytes + 64, &manufacturer); + break; + default: + DEBUG("Unsupported EEPROM type: %s\n", ram_types[ram_type]); + continue; + } + + + + gchar *key = g_strdup_printf("MEM%d", count); + moreinfo_add_with_prefix("DEV", key, g_strdup(detailed_info)); + g_free(key); + g_string_append_printf(output, "$MEM%d$%d=%s|%d MB|%s\n", count, count, part_number, module_size, manufacturer); + + g_free(spd_path); + g_free(detailed_info); + } + + return g_string_free(output, FALSE); +} + +void scan_spd_do(void) +{ + GDir *dir = NULL; + GSList *dimm_list = NULL; + gboolean use_sysfs = FALSE; + gchar *dir_entry; + gchar *list; + + if (g_file_test("/sys/bus/i2c/drivers/eeprom", G_FILE_TEST_EXISTS)) { + dir = g_dir_open("/sys/bus/i2c/drivers/eeprom", 0, NULL); + use_sysfs = TRUE; + } else if (g_file_test("/proc/sys/dev/sensors", G_FILE_TEST_EXISTS)) { + dir = g_dir_open("/proc/sys/dev/sensors", 0, NULL); + } + + if (!dir) { + g_free(spd_info); + if (!g_file_test("/sys/module/eeprom", G_FILE_TEST_EXISTS)) { + spd_info = g_strdup(_("[SPD]\n" + "Please load the eeprom module to obtain information about memory SPD=\n" + "[$ShellParam$]\n" + "ReloadInterval=500\n")); + } else { + spd_info = g_strdup(_("[SPD]\n" "Reading memory SPD not supported on this system=\n")); + } + + return; + } + + while ((dir_entry = (char *) g_dir_read_name(dir))) { + if (use_sysfs && isdigit(dir_entry[0])) { + dimm_list = g_slist_prepend(dimm_list, g_strdup_printf("/sys/bus/i2c/drivers/eeprom/%s", dir_entry)); + } else if (g_str_has_prefix(dir_entry, "eeprom-")) { + dimm_list = g_slist_prepend(dimm_list, g_strdup_printf("/proc/sys/dev/sensors/%s", dir_entry)); + } + } + + g_dir_close(dir); + + list = decode_dimms(dimm_list, use_sysfs); + g_slist_free(dimm_list); + + g_free(spd_info); + spd_info = g_strdup_printf("[SPD]\n" + "%s\n" + "[$ShellParam$]\n" + "ViewType=1\n" + "ColumnTitle$TextValue=Bank\n" + "ColumnTitle$Extra1=Size\n" + "ColumnTitle$Extra2=Manufacturer\n" + "ColumnTitle$Value=Model\n" "ShowColumnHeaders=true\n", list); + g_free(list); +} diff --git a/modules/devices/storage.c b/modules/devices/storage.c new file mode 100644 index 00000000..0c393682 --- /dev/null +++ b/modules/devices/storage.c @@ -0,0 +1,371 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "hardinfo.h" +#include "devices.h" + +gchar *storage_icons = NULL; + +/* SCSI support by Pascal F.Martin */ +void +__scan_scsi_devices(void) +{ + FILE *proc_scsi; + gchar buffer[256], *buf; + gint n = 0; + gint scsi_controller = 0; + gint scsi_channel = 0; + gint scsi_id = 0 ; + gint scsi_lun = 0; + gchar *vendor = NULL, *revision = NULL, *model = NULL; + gchar *scsi_storage_list; + + /* remove old devices from global device table */ + moreinfo_del_with_prefix("DEV:SCSI"); + + if (!g_file_test("/proc/scsi/scsi", G_FILE_TEST_EXISTS)) + return; + + scsi_storage_list = g_strdup(_("\n[SCSI Disks]\n")); + + if ((proc_scsi = fopen("/proc/scsi/scsi", "r"))) { + while (fgets(buffer, 256, proc_scsi)) { + buf = g_strstrip(buffer); + if (!strncmp(buf, "Host: scsi", 10)) { + sscanf(buf, + "Host: scsi%d Channel: %d Id: %d Lun: %d", + &scsi_controller, &scsi_channel, &scsi_id, &scsi_lun); + + n++; + } else if (!strncmp(buf, "Vendor: ", 8)) { + buf[17] = '\0'; + buf[41] = '\0'; + buf[53] = '\0'; + + vendor = g_strdup(g_strstrip(buf + 8)); + model = g_strdup_printf("%s %s", vendor, g_strstrip(buf + 24)); + revision = g_strdup(g_strstrip(buf + 46)); + } else if (!strncmp(buf, "Type: ", 8)) { + char *p; + gchar *type = NULL, *icon = NULL; + + if (!(p = strstr(buf, "ANSI SCSI revision"))) { + p = strstr(buf, "ANSI SCSI revision"); + } + + if (p != NULL) { + while (*(--p) == ' '); + *(++p) = 0; + + static struct { + char *type; + char *label; + char *icon; + } type2icon[] = { + { "Direct-Access", "Disk", "hdd"}, + { "Sequential-Access", "Tape", "tape"}, + { "Printer", "Printer", "lpr"}, + { "WORM", "CD-ROM", "cdrom"}, + { "CD-ROM", "CD-ROM", "cdrom"}, + { "Scanner", "Scanner", "scanner"}, + { "Flash Disk", "USB Flash Disk", "usbfldisk" }, + { NULL, "Generic", "scsi"} + }; + int i; + + if (model && strstr(model, "Flash Disk")) { + type = "Flash Disk"; + icon = "usbfldisk"; + } else { + for (i = 0; type2icon[i].type != NULL; i++) + if (g_str_equal(buf + 8, type2icon[i].type)) + break; + + type = type2icon[i].label; + icon = type2icon[i].icon; + } + } + + gchar *devid = g_strdup_printf("SCSI%d", n); + scsi_storage_list = h_strdup_cprintf("$%s$%s=\n", scsi_storage_list, devid, model); + storage_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", storage_icons, devid, model, icon); + + gchar *strhash = g_strdup_printf(_("[Device Information]\n" + "Model=%s\n"), model); + + const gchar *url = vendor_get_url(model); + if (url) { + strhash = h_strdup_cprintf(_("Vendor=%s (%s)\n"), + strhash, + vendor_get_name(model), + url); + } else { + strhash = h_strdup_cprintf(_("Vendor=%s\n"), + strhash, + vendor_get_name(model)); + } + + strhash = h_strdup_cprintf(_("Type=%s\n" + "Revision=%s\n" + "[SCSI Controller]\n" + "Controller=scsi%d\n" + "Channel=%d\n" + "ID=%d\n" "LUN=%d\n"), + strhash, + type, + revision, + scsi_controller, + scsi_channel, + scsi_id, + scsi_lun); + moreinfo_add_with_prefix("DEV", devid, strhash); + g_free(devid); + + g_free(model); + g_free(revision); + g_free(vendor); + + scsi_controller = scsi_channel = scsi_id = scsi_lun = 0; + } + } + fclose(proc_scsi); + } + + if (n) { + storage_list = h_strconcat(storage_list, scsi_storage_list, NULL); + g_free(scsi_storage_list); + } +} + +void __scan_ide_devices(void) +{ + FILE *proc_ide; + gchar *device, iface, *model, *media, *pgeometry = NULL, *lgeometry = NULL; + gint n = 0, i = 0, cache, nn = 0; + gchar *capab = NULL, *speed = NULL, *driver = NULL, *ide_storage_list; + + /* remove old devices from global device table */ + moreinfo_del_with_prefix("DEV:IDE"); + + ide_storage_list = g_strdup(_("\n[IDE Disks]\n")); + + iface = 'a'; + for (i = 0; i <= 16; i++) { + device = g_strdup_printf("/proc/ide/hd%c/model", iface); + if (g_file_test(device, G_FILE_TEST_EXISTS)) { + gchar buf[128]; + + cache = 0; + + proc_ide = fopen(device, "r"); + if (!proc_ide) + continue; + + (void) fgets(buf, 128, proc_ide); + fclose(proc_ide); + + buf[strlen(buf) - 1] = 0; + + model = g_strdup(buf); + + g_free(device); + + device = g_strdup_printf("/proc/ide/hd%c/media", iface); + proc_ide = fopen(device, "r"); + if (!proc_ide) { + free(model); + continue; + } + + (void) fgets(buf, 128, proc_ide); + fclose(proc_ide); + buf[strlen(buf) - 1] = 0; + + media = g_strdup(buf); + if (g_str_equal(media, "cdrom")) { + /* obtain cd-rom drive information from cdrecord */ + GTimer *timer; + gchar *tmp = g_strdup_printf("cdrecord dev=/dev/hd%c -prcap 2>/dev/stdout", iface); + FILE *prcap; + + if ((prcap = popen(tmp, "r"))) { + /* we need a timeout so cdrecord does not try to get information on cd drives + with inserted media, which is not possible currently. half second should be + enough. */ + timer = g_timer_new(); + g_timer_start(timer); + + while (fgets(buf, 128, prcap) + && g_timer_elapsed(timer, NULL) < 0.5) { + if (g_str_has_prefix(buf, " Does")) { + if (g_str_has_suffix(buf, "media\n") + && !strstr(buf, "speed")) { + gchar *media_type = g_strstrip(strstr(buf, "Does ")); + gchar **ttmp = g_strsplit(media_type, " ", 0); + + capab = h_strdup_cprintf("\nCan %s#%d=%s\n", capab, ttmp[1], ++nn, ttmp[2]); + + g_strfreev(ttmp); + } else if (strstr(buf, "Buffer-Underrun-Free")) { + capab = + h_strdup_cprintf + ("\nSupports BurnProof=%s\n", capab, strstr(buf, "Does not") ? "No" : "Yes"); + } else if (strstr(buf, "multi-session")) { + capab = + h_strdup_cprintf + ("\nCan read multi-session CDs=%s\n", + capab, strstr(buf, "Does not") ? "No" : "Yes"); + } else if (strstr(buf, "audio CDs")) { + capab = + h_strdup_cprintf + ("\nCan play audio CDs=%s\n", capab, strstr(buf, "Does not") ? "No" : "Yes"); + } else if (strstr(buf, "PREVENT/ALLOW")) { + capab = + h_strdup_cprintf + ("\nCan lock media=%s\n", capab, strstr(buf, "Does not") ? "No" : "Yes"); + } + } else if ((strstr(buf, "read") + || strstr(buf, "write")) + && strstr(buf, "kB/s")) { + speed = + g_strconcat(speed ? speed : "", strreplacechr(g_strstrip(buf), ":", '='), "\n", NULL); + } else if (strstr(buf, "Device seems to be")) { + driver = g_strdup_printf(_("Driver=%s\n"), strchr(buf, ':') + 1); + } + } + + pclose(prcap); + g_timer_destroy(timer); + } + + g_free(tmp); + } + g_free(device); + + device = g_strdup_printf("/proc/ide/hd%c/cache", iface); + if (g_file_test(device, G_FILE_TEST_EXISTS)) { + proc_ide = fopen(device, "r"); + if (proc_ide) { + (void) fscanf(proc_ide, "%d", &cache); + fclose(proc_ide); + } else { + cache = 0; + } + } + g_free(device); + + device = g_strdup_printf("/proc/ide/hd%c/geometry", iface); + if (g_file_test(device, G_FILE_TEST_EXISTS)) { + gchar *tmp; + + proc_ide = fopen(device, "r"); + if (proc_ide) { + (void) fgets(buf, 64, proc_ide); + for (tmp = buf; *tmp; tmp++) { + if (*tmp >= '0' && *tmp <= '9') + break; + } + + pgeometry = g_strdup(g_strstrip(tmp)); + + (void) fgets(buf, 64, proc_ide); + for (tmp = buf; *tmp; tmp++) { + if (*tmp >= '0' && *tmp <= '9') + break; + } + lgeometry = g_strdup(g_strstrip(tmp)); + + fclose(proc_ide); + } else { + pgeometry = g_strdup("Unknown"); + lgeometry = g_strdup("Unknown"); + } + + } + g_free(device); + + n++; + + gchar *devid = g_strdup_printf("IDE%d", n); + + ide_storage_list = h_strdup_cprintf("$%s$%s=\n", ide_storage_list, devid, model); + storage_icons = + h_strdup_cprintf("Icon$%s$%s=%s.png\n", storage_icons, + devid, model, g_str_equal(media, "cdrom") ? "cdrom" : "hdd"); + + gchar *strhash = g_strdup_printf(_("[Device Information]\n" "Model=%s\n"), + model); + + const gchar *url = vendor_get_url(model); + + if (url) { + strhash = h_strdup_cprintf(_("Vendor=%s (%s)\n"), strhash, vendor_get_name(model), url); + } else { + strhash = h_strdup_cprintf(_("Vendor=%s\n"), strhash, vendor_get_name(model)); + } + + strhash = h_strdup_cprintf(_("Device Name=hd%c\n" + "Media=%s\n" "Cache=%dkb\n"), strhash, iface, media, cache); + if (driver) { + strhash = h_strdup_cprintf("%s\n", strhash, driver); + + g_free(driver); + driver = NULL; + } + + if (pgeometry && lgeometry) { + strhash = h_strdup_cprintf(_("[Geometry]\n" + "Physical=%s\n" "Logical=%s\n"), strhash, pgeometry, lgeometry); + + g_free(pgeometry); + pgeometry = NULL; + g_free(lgeometry); + lgeometry = NULL; + } + + if (capab) { + strhash = h_strdup_cprintf(_("[Capabilities]\n%s"), strhash, capab); + + g_free(capab); + capab = NULL; + } + + if (speed) { + strhash = h_strdup_cprintf(_("[Speeds]\n%s"), strhash, speed); + + g_free(speed); + speed = NULL; + } + + moreinfo_add_with_prefix("DEV", devid, strhash); + g_free(devid); + g_free(model); + } else { + g_free(device); + } + + iface++; + } + + if (n) { + storage_list = h_strconcat(storage_list, ide_storage_list, NULL); + g_free(ide_storage_list); + } +} diff --git a/modules/devices/usb.c b/modules/devices/usb.c new file mode 100644 index 00000000..3a93a3b6 --- /dev/null +++ b/modules/devices/usb.c @@ -0,0 +1,381 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2008 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +/* + * FIXME: + * - listing with sysfs does not generate device hierarchy + */ + +#include + +#include "hardinfo.h" +#include "devices.h" + +gchar *usb_list = NULL; + +void __scan_usb_sysfs_add_device(gchar * endpoint, int n) +{ + gchar *manufacturer, *product, *mxpwr, *tmp, *strhash; + gint bus, classid, vendor, prodid; + gfloat version, speed; + + classid = h_sysfs_read_int(endpoint, "bDeviceClass"); + vendor = h_sysfs_read_int(endpoint, "idVendor"); + prodid = h_sysfs_read_int(endpoint, "idProduct"); + bus = h_sysfs_read_int(endpoint, "busnum"); + speed = h_sysfs_read_float(endpoint, "speed"); + version = h_sysfs_read_float(endpoint, "version"); + + if (!(mxpwr = h_sysfs_read_string(endpoint, "bMaxPower"))) { + mxpwr = g_strdup("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); + + moreinfo_add_with_prefix("DEV", tmp, strhash); + g_free(tmp); + g_free(manufacturer); + g_free(product); + g_free(mxpwr); +} + +gboolean __scan_usb_sysfs(void) +{ + GDir *sysfs; + gchar *filename; + const gchar *sysfs_path = "/sys/class/usb_endpoint"; + gint usb_device_number = 0; + + if (!(sysfs = g_dir_open(sysfs_path, 0, NULL))) { + return FALSE; + } + + if (usb_list) { + moreinfo_del_with_prefix("DEV:USB"); + g_free(usb_list); + } + usb_list = g_strdup("[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); + + return usb_device_number > 0; +} + +gboolean __scan_usb_procfs(void) +{ + FILE *dev; + gchar buffer[128]; + gchar *tmp, *manuf = NULL, *product = NULL, *mxpwr = NULL; + gint bus = 0, level = 0, port = 0, classid = 0, trash; + gint vendor = 0, prodid = 0; + gfloat ver = 0.0f, rev = 0.0f, speed = 0.0f; + int n = 0; + + dev = fopen("/proc/bus/usb/devices", "r"); + if (!dev) + return 0; + + if (usb_list) { + moreinfo_del_with_prefix("DEV:USB"); + g_free(usb_list); + } + usb_list = g_strdup("[USB Devices]\n"); + + while (fgets(buffer, 128, dev)) { + tmp = buffer; + + switch (*tmp) { + case 'T': + sscanf(tmp, + "T: Bus=%d Lev=%d Prnt=%d Port=%d Cnt=%d Dev#=%d Spd=%f", + &bus, &level, &trash, &port, &trash, &trash, &speed); + break; + case 'D': + sscanf(tmp, "D: Ver=%f Cls=%x", &ver, &classid); + break; + case 'P': + sscanf(tmp, "P: Vendor=%x ProdID=%x Rev=%f", &vendor, &prodid, &rev); + break; + case 'S': + if (strstr(tmp, "Manufacturer=")) { + manuf = g_strdup(strchr(tmp, '=') + 1); + remove_linefeed(manuf); + } else if (strstr(tmp, "Product=")) { + product = g_strdup(strchr(tmp, '=') + 1); + remove_linefeed(product); + } + break; + case 'C': + mxpwr = strstr(buffer, "MxPwr=") + 6; + + tmp = g_strdup_printf("USB%d", ++n); + + if (product && *product == '\0') { + g_free(product); + if (classid == 9) { + product = g_strdup_printf("USB %.2f Hub", ver); + } else { + product = g_strdup_printf("Unknown USB %.2f Device (class %d)", ver, classid); + } + } + + if (classid == 9) { /* hub */ + usb_list = h_strdup_cprintf("[%s#%d]\n", usb_list, product, n); + } else { /* everything else */ + usb_list = h_strdup_cprintf("$%s$%s=\n", usb_list, tmp, product); + + const gchar *url = vendor_get_url(manuf); + if (url) { + gchar *tmp = g_strdup_printf("%s (%s)", vendor_get_name(manuf), + url); + g_free(manuf); + manuf = tmp; + } + + gchar *strhash = g_strdup_printf("[Device Information]\n" "Product=%s\n", + product); + if (manuf && strlen(manuf)) + strhash = h_strdup_cprintf("Manufacturer=%s\n", strhash, manuf); + + strhash = h_strdup_cprintf("[Port #%d]\n" + "Speed=%.2fMbit/s\n" + "Max Current=%s\n" + "[Misc]\n" + "USB Version=%.2f\n" + "Revision=%.2f\n" + "Class=0x%x\n" + "Vendor=0x%x\n" + "Product ID=0x%x\n" + "Bus=%d\n" "Level=%d\n", + strhash, port, speed, mxpwr, ver, rev, classid, vendor, prodid, bus, level); + + moreinfo_add_with_prefix("DEV", tmp, strhash); + g_free(tmp); + } + + g_free(manuf); + g_free(product); + manuf = g_strdup(""); + product = g_strdup(""); + port = classid = 0; + } + } + + fclose(dev); + + return n > 0; +} + + +void __scan_usb_lsusb_add_device(char *buffer, int bufsize, FILE * lsusb, int usb_device_number) +{ + gint bus, device, vendor_id, product_id; + gchar *version = NULL, *product = NULL, *vendor = NULL, *dev_class = NULL, *int_class = NULL; + gchar *max_power = NULL, *name = NULL; + gchar *tmp, *strhash; + long position = 0; + + g_strstrip(buffer); + sscanf(buffer, "Bus %d Device %d: ID %x:%x", &bus, &device, &vendor_id, &product_id); + name = g_strdup(buffer + 33); + + for (fgets(buffer, bufsize, lsusb); position >= 0 && fgets(buffer, bufsize, lsusb); position = ftell(lsusb)) { + g_strstrip(buffer); + + if (g_str_has_prefix(buffer, "idVendor")) { + g_free(vendor); + vendor = g_strdup(buffer + 26); + } else if (g_str_has_prefix(buffer, "idProduct")) { + g_free(product); + product = g_strdup(buffer + 26); + } else if (g_str_has_prefix(buffer, "MaxPower")) { + g_free(max_power); + max_power = g_strdup(buffer + 9); + } else if (g_str_has_prefix(buffer, "bcdUSB")) { + g_free(version); + version = g_strdup(buffer + 7); + } else if (g_str_has_prefix(buffer, "bDeviceClass")) { + g_free(dev_class); + dev_class = g_strdup(buffer + 14); + } else if (g_str_has_prefix(buffer, "bInterfaceClass")) { + g_free(int_class); + int_class = g_strdup(buffer + 16); + } else if (g_str_has_prefix(buffer, "Bus ")) { + /* device separator */ + fseek(lsusb, position, SEEK_SET); + break; + } + } + + if (dev_class && strstr(dev_class, "0 (Defined at Interface level)")) { + g_free(dev_class); + if (int_class) { + dev_class = int_class; + } else { + dev_class = g_strdup("Unknown"); + } + } else + dev_class = g_strdup("Unknown"); + + tmp = g_strdup_printf("USB%d", usb_device_number); + usb_list = h_strdup_cprintf("$%s$%s=\n", usb_list, tmp, name); + + strhash = g_strdup_printf("[Device Information]\n" + "Product=%s\n" + "Manufacturer=%s\n" + "Max Current=%s\n" + "[Misc]\n" + "USB Version=%s\n" + "Class=%s\n" + "Vendor=0x%x\n" + "Product ID=0x%x\n" + "Bus=%d\n", + product ? g_strstrip(product) : "Unknown", + vendor ? g_strstrip(vendor) : "Unknown", + max_power ? g_strstrip(max_power) : "Unknown", + version ? g_strstrip(version) : "Unknown", + dev_class ? g_strstrip(dev_class) : "Unknown", vendor_id, product_id, bus); + + moreinfo_add_with_prefix("DEV", tmp, strhash); + g_free(vendor); + g_free(product); + g_free(max_power); + g_free(dev_class); + g_free(version); + g_free(tmp); + g_free(name); +} + +gboolean __scan_usb_lsusb(void) +{ + static gchar *lsusb_path = NULL; + int usb_device_number = 0; + FILE *lsusb; + FILE *temp_lsusb; + char buffer[512], *temp; + + if (!lsusb_path) { + if (!(lsusb_path = find_program("lsusb"))) { + DEBUG("lsusb not found"); + + return FALSE; + } + } + + temp = g_strdup_printf("%s -v | tr '[]' '()'", lsusb_path); + if (!(lsusb = popen(temp, "r"))) { + DEBUG("cannot run %s", lsusb_path); + + g_free(temp); + return FALSE; + } + + temp_lsusb = tmpfile(); + if (!temp_lsusb) { + DEBUG("cannot create temporary file for lsusb"); + pclose(lsusb); + return FALSE; + } + + while (fgets(buffer, sizeof(buffer), lsusb)) { + fputs(buffer, temp_lsusb); + } + + pclose(lsusb); + + // rewind file so we can read from it + fseek(temp_lsusb, 0, SEEK_SET); + + g_free(temp); + + if (usb_list) { + moreinfo_del_with_prefix("DEV:USB"); + g_free(usb_list); + } + usb_list = g_strdup("[USB Devices]\n"); + + while (fgets(buffer, sizeof(buffer), temp_lsusb)) { + if (g_str_has_prefix(buffer, "Bus ")) { + __scan_usb_lsusb_add_device(buffer, sizeof(buffer), temp_lsusb, ++usb_device_number); + } + } + + fclose(temp_lsusb); + + return usb_device_number > 0; +} + +void __scan_usb(void) +{ + if (!__scan_usb_procfs()) { + if (!__scan_usb_sysfs()) { + __scan_usb_lsusb(); + } + } +} diff --git a/modules/devices/x86/processor.c b/modules/devices/x86/processor.c new file mode 100644 index 00000000..7935a83d --- /dev/null +++ b/modules/devices/x86/processor.c @@ -0,0 +1,727 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2006 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "hardinfo.h" +#include "devices.h" + +/* + * This function is partly based on x86cpucaps + * by Osamu Kayasono + */ +void get_processor_strfamily(Processor * processor) +{ + gint family = processor->family; + gint model = processor->model; + + if (g_str_equal(processor->vendor_id, "GenuineIntel")) { + if (family == 4) { + processor->strmodel = g_strdup("i486 series"); + } else if (family == 5) { + if (model < 4) { + processor->strmodel = g_strdup("Pentium Classic"); + } else { + processor->strmodel = g_strdup("Pentium MMX"); + } + } else if (family == 6) { + if (model <= 1) { + processor->strmodel = g_strdup("Pentium Pro"); + } else if (model < 7) { + processor->strmodel = g_strdup("Pentium II/Pentium II Xeon/Celeron"); + } else if (model == 9) { + processor->strmodel = g_strdup("Pentium M"); + } else { + processor->strmodel = g_strdup("Pentium III/Pentium III Xeon/Celeron/Core Duo/Core Duo 2"); + } + } else if (family > 6) { + processor->strmodel = g_strdup("Pentium 4"); + } else { + processor->strmodel = g_strdup("i386 class"); + } + } else if (g_str_equal(processor->vendor_id, "AuthenticAMD")) { + if (family == 4) { + if (model <= 9) { + processor->strmodel = g_strdup("AMD i80486 series"); + } else { + processor->strmodel = g_strdup("AMD 5x86"); + } + } else if (family == 5) { + if (model <= 3) { + processor->strmodel = g_strdup("AMD K5"); + } else if (model <= 7) { + processor->strmodel = g_strdup("AMD K6"); + } else if (model == 8) { + processor->strmodel = g_strdup("AMD K6-2"); + } else if (model == 9) { + processor->strmodel = g_strdup("AMD K6-III"); + } else { + processor->strmodel = g_strdup("AMD K6-2+/III+"); + } + } else if (family == 6) { + if (model == 1) { + processor->strmodel = g_strdup("AMD Athlon (K7)"); + } else if (model == 2) { + processor->strmodel = g_strdup("AMD Athlon (K75)"); + } else if (model == 3) { + processor->strmodel = g_strdup("AMD Duron (Spitfire)"); + } else if (model == 4) { + processor->strmodel = g_strdup("AMD Athlon (Thunderbird)"); + } else if (model == 6) { + processor->strmodel = g_strdup("AMD Athlon XP/MP/4 (Palomino)"); + } else if (model == 7) { + processor->strmodel = g_strdup("AMD Duron (Morgan)"); + } else if (model == 8) { + processor->strmodel = g_strdup("AMD Athlon XP/MP (Thoroughbred)"); + } else if (model == 10) { + processor->strmodel = g_strdup("AMD Athlon XP/MP (Barton)"); + } else { + processor->strmodel = g_strdup("AMD Athlon (unknown)"); + } + } else if (family > 6) { + processor->strmodel = g_strdup("AMD Opteron/Athlon64/FX"); + } else { + processor->strmodel = g_strdup("AMD i386 class"); + } + } else if (g_str_equal(processor->vendor_id, "CyrixInstead")) { + if (family == 4) { + processor->strmodel = g_strdup("Cyrix 5x86"); + } else if (family == 5) { + processor->strmodel = g_strdup("Cyrix M1 (6x86)"); + } else if (family == 6) { + if (model == 0) { + processor->strmodel = g_strdup("Cyrix M2 (6x86MX)"); + } else if (model <= 5) { + processor->strmodel = g_strdup("VIA Cyrix III (M2 core)"); + } else if (model == 6) { + processor->strmodel = g_strdup("VIA Cyrix III (WinChip C5A)"); + } else if (model == 7) { + processor->strmodel = g_strdup("VIA Cyrix III (WinChip C5B/C)"); + } else { + processor->strmodel = g_strdup("VIA Cyrix III (WinChip C5C-T)"); + } + } else { + processor->strmodel = g_strdup("Cyrix i386 class"); + } + } else if (g_str_equal(processor->vendor_id, "CentaurHauls")) { + if (family == 5) { + if (model <= 4) { + processor->strmodel = g_strdup("Centaur WinChip C6"); + } else if (model <= 8) { + processor->strmodel = g_strdup("Centaur WinChip 2"); + } else { + processor->strmodel = g_strdup("Centaur WinChip 2A"); + } + } else { + processor->strmodel = g_strdup("Centaur i386 class"); + } + } else if (g_str_equal(processor->vendor_id, "GenuineTMx86")) { + processor->strmodel = g_strdup("Transmeta Crusoe TM3x00/5x00"); + } else { + processor->strmodel = g_strdup("Unknown"); + } +} + +static gchar *__cache_get_info_as_string(Processor *processor) +{ + gchar *result = g_strdup(""); + GSList *cache_list; + ProcessorCache *cache; + + if (!processor->cache) { + return g_strdup(_("Cache information not available=\n")); + } + + for (cache_list = processor->cache; cache_list; cache_list = cache_list->next) { + cache = (ProcessorCache *)cache_list->data; + + result = h_strdup_cprintf("Level %d (%s)=%d-way set-associative, %d sets, %dKB size\n", + result, + cache->level, + cache->type, + cache->ways_of_associativity, + cache->number_of_sets, + cache->size); + } + + return result; +} + +static void __cache_obtain_info(Processor *processor) +{ + ProcessorCache *cache; + gchar *endpoint, *entry, *index; + gint i; + gint processor_number = processor->id; + + endpoint = g_strdup_printf("/sys/devices/system/cpu/cpu%d/cache", processor_number); + + for (i = 0; ; i++) { + cache = g_new0(ProcessorCache, 1); + + index = g_strdup_printf("index%d/", i); + + entry = g_strconcat(index, "type", NULL); + cache->type = h_sysfs_read_string(endpoint, entry); + g_free(entry); + + if (!cache->type) { + g_free(cache); + g_free(index); + goto fail; + } + + entry = g_strconcat(index, "level", NULL); + cache->level = h_sysfs_read_int(endpoint, entry); + g_free(entry); + + entry = g_strconcat(index, "number_of_sets", NULL); + cache->number_of_sets = h_sysfs_read_int(endpoint, entry); + g_free(entry); + + entry = g_strconcat(index, "physical_line_partition", NULL); + cache->physical_line_partition = h_sysfs_read_int(endpoint, entry); + g_free(entry); + + entry = g_strconcat(index, "size", NULL); + cache->size = h_sysfs_read_int(endpoint, entry); + g_free(entry); + + + entry = g_strconcat(index, "ways_of_associativity", NULL); + cache->ways_of_associativity = h_sysfs_read_int(endpoint, entry); + g_free(entry); + + g_free(index); + + processor->cache = g_slist_append(processor->cache, cache); + } + +fail: + g_free(endpoint); +} + +int processor_has_flag(gchar * strflags, gchar * strflag) +{ + gchar **flags; + gint ret = 0; + if (strflags == NULL || strflag == NULL) + return 0; + flags = g_strsplit(strflags, " ", 0); + ret = g_strv_contains((const gchar * const *)flags, strflag); + g_strfreev(flags); + return ret; +} + +static gint get_cpu_int(const gchar* file, gint cpuid) { + gchar *tmp0 = NULL; + gchar *tmp1 = NULL; + gint ret = 0; + + tmp0 = g_strdup_printf("/sys/devices/system/cpu/cpu%d/%s", cpuid, file); + g_file_get_contents(tmp0, &tmp1, NULL, NULL); + if (tmp1) + ret = atol(tmp1); + + g_free(tmp0); + g_free(tmp1); + return ret; +} + +GSList *processor_scan(void) +{ + GSList *procs = NULL, *l = NULL; + Processor *processor = NULL; + FILE *cpuinfo; + gchar buffer[512]; + + cpuinfo = fopen("/proc/cpuinfo", "r"); + if (!cpuinfo) + return NULL; + + while (fgets(buffer, 512, cpuinfo)) { + gchar **tmp = g_strsplit(buffer, ":", 2); + if (!tmp[1] || !tmp[0]) { + g_strfreev(tmp); + continue; + } + + tmp[0] = g_strstrip(tmp[0]); + tmp[1] = g_strstrip(tmp[1]); + + if (g_str_has_prefix(tmp[0], "processor")) { + /* finish previous */ + if (processor) + procs = g_slist_append(procs, processor); + + /* start next */ + processor = g_new0(Processor, 1); + processor->id = atol(tmp[1]); + g_strfreev(tmp); + continue; + } + + if (processor) { + get_str("model name", processor->model_name); + get_str("vendor_id", processor->vendor_id); + get_str("flags", processor->flags); + get_str("bugs", processor->bugs); + get_str("power management", processor->pm); + get_int("cache size", processor->cache_size); + get_float("cpu MHz", processor->cpu_mhz); + get_float("bogomips", processor->bogomips); + + get_str("fpu", processor->has_fpu); + + get_str("fdiv_bug", processor->bug_fdiv); + get_str("hlt_bug", processor->bug_hlt); + get_str("f00f_bug", processor->bug_f00f); + get_str("coma_bug", processor->bug_coma); + + get_int("model", processor->model); + get_int("cpu family", processor->family); + get_int("stepping", processor->stepping); + } + g_strfreev(tmp); + } + + /* finish last */ + if (processor) + procs = g_slist_append(procs, processor); + + for (l = procs; l; l = l->next) { + processor = (Processor *) l->data; + + get_processor_strfamily(processor); + __cache_obtain_info(processor); + + if (processor->bugs == NULL || g_strcmp0(processor->bugs, "") == 0) { + g_free(processor->bugs); + /* make bugs list on old kernels that don't offer one */ + processor->bugs = g_strdup_printf("%s%s%s%s%s%s%s%s%s%s", + /* the oldest bug workarounds indicated in /proc/cpuinfo */ + processor->bug_fdiv ? " fdiv" : "", + processor->bug_hlt ? " _hlt" : "", + processor->bug_f00f ? " f00f" : "", + processor->bug_coma ? " coma" : "", + /* these bug workarounds were reported as "features" in older kernels */ + processor_has_flag(processor->flags, "fxsave_leak") ? " fxsave_leak" : "", + processor_has_flag(processor->flags, "clflush_monitor") ? " clflush_monitor" : "", + processor_has_flag(processor->flags, "11ap") ? " 11ap" : "", + processor_has_flag(processor->flags, "tlb_mmatch") ? " tlb_mmatch" : "", + processor_has_flag(processor->flags, "apic_c1e") ? " apic_c1e" : "", + ""); /* just to make adding lines easier */ + g_strchug(processor->bugs); + } + + if (processor->pm == NULL || g_strcmp0(processor->pm, "") == 0) { + g_free(processor->pm); + /* make power management list on old kernels that don't offer one */ + processor->pm = g_strdup_printf("%s%s", + /* "hw_pstate" -> "hwpstate" */ + processor_has_flag(processor->flags, "hw_pstate") ? " hwpstate" : "", + ""); /* just to make adding lines easier */ + g_strchug(processor->pm); + } + + /* freq */ + processor->cpukhz_cur = get_cpu_int("cpufreq/scaling_cur_freq", processor->id); + processor->cpukhz_min = get_cpu_int("cpufreq/scaling_min_freq", processor->id); + processor->cpukhz_max = get_cpu_int("cpufreq/scaling_max_freq", processor->id); + if (processor->cpukhz_max) + processor->cpu_mhz = processor->cpukhz_max / 1000; + } + + fclose(cpuinfo); + + return procs; +} + +/* + * Sources: + * - Linux' cpufeature.h + * - http://gentoo-wiki.com/Cpuinfo + * - Intel IA-32 Architecture Software Development Manual + * - https://unix.stackexchange.com/questions/43539/what-do-the-flags-in-proc-cpuinfo-mean + */ +static struct { + char *name, *meaning; +} flag_meaning[] = { + { "3dnow", "3DNow! Technology" }, + { "3dnowext", "Extended 3DNow! Technology" }, + { "fpu", "Floating Point Unit" }, + { "vme", "Virtual 86 Mode Extension" }, + { "de", "Debug Extensions - I/O breakpoints" }, + { "pse", "Page Size Extensions (4MB pages)" }, + { "tsc", "Time Stamp Counter and RDTSC instruction" }, + { "msr", "Model Specific Registers" }, + { "pae", "Physical Address Extensions" }, + { "mce", "Machine Check Architeture" }, + { "cx8", "CMPXCHG8 instruction" }, + { "apic", "Advanced Programmable Interrupt Controller" }, + { "sep", "Fast System Call (SYSENTER/SYSEXIT)" }, + { "mtrr", "Memory Type Range Registers" }, + { "pge", "Page Global Enable" }, + { "mca", "Machine Check Architecture" }, + { "cmov", "Conditional Move instruction" }, + { "pat", "Page Attribute Table" }, + { "pse36", "36bit Page Size Extensions" }, + { "psn", "96 bit Processor Serial Number" }, + { "mmx", "MMX technology" }, + { "mmxext", "Extended MMX Technology" }, + { "cflush", "Cache Flush" }, + { "dtes", "Debug Trace Store" }, + { "fxsr", "FXSAVE and FXRSTOR instructions" }, + { "kni", "Streaming SIMD instructions" }, + { "xmm", "Streaming SIMD instructions" }, + { "ht", "HyperThreading" }, + { "mp", "Multiprocessing Capable" }, + { "sse", "SSE instructions" }, + { "sse2", "SSE2 (WNI) instructions" }, + { "acc", "Automatic Clock Control" }, + { "ia64", "IA64 Instructions" }, + { "syscall", "SYSCALL and SYSEXIT instructions" }, + { "nx", "No-execute Page Protection" }, + { "xd", "Execute Disable" }, + { "clflush", "Cache Line Flush instruction" }, + { "acpi", "Thermal Monitor and Software Controlled Clock" }, + { "dts", "Debug Store" }, + { "ss", "Self Snoop" }, + { "tm", "Thermal Monitor" }, + { "pbe", "Pending Break Enable" }, + { "pb", "Pending Break Enable" }, + { "pn", "Processor serial number" }, + { "ds", "Debug Store" }, + { "xmm2", "Streaming SIMD Extensions-2" }, + { "xmm3", "Streaming SIMD Extensions-3" }, + { "selfsnoop", "CPU self snoop" }, + { "rdtscp", "RDTSCP" }, + { "recovery", "CPU in recovery mode" }, + { "longrun", "Longrun power control" }, + { "lrti", "LongRun table interface" }, + { "cxmmx", "Cyrix MMX extensions" }, + { "k6_mtrr", "AMD K6 nonstandard MTRRs" }, + { "cyrix_arr", "Cyrix ARRs (= MTRRs)" }, + { "centaur_mcr","Centaur MCRs (= MTRRs)" }, + { "constant_tsc","TSC ticks at a constant rate" }, + { "up", "smp kernel running on up" }, + { "fxsave_leak","FXSAVE leaks FOP/FIP/FOP" }, + { "arch_perfmon","Intel Architectural PerfMon" }, + { "pebs", "Precise-Event Based Sampling" }, + { "bts", "Branch Trace Store" }, + { "sync_rdtsc", "RDTSC synchronizes the CPU" }, + { "rep_good", "rep microcode works well on this CPU" }, + { "mwait", "Monitor/Mwait support" }, + { "ds_cpl", "CPL Qualified Debug Store" }, + { "est", "Enhanced SpeedStep" }, + { "tm2", "Thermal Monitor 2" }, + { "cid", "Context ID" }, + { "xtpr", "Send Task Priority Messages" }, + { "xstore", "on-CPU RNG present (xstore insn)" }, + { "xstore_en", "on-CPU RNG enabled" }, + { "xcrypt", "on-CPU crypto (xcrypt insn)" }, + { "xcrypt_en", "on-CPU crypto enabled" }, + { "ace2", "Advanced Cryptography Engine v2" }, + { "ace2_en", "ACE v2 enabled" }, + { "phe", "PadLock Hash Engine" }, + { "phe_en", "PHE enabled" }, + { "pmm", "PadLock Montgomery Multiplier" }, + { "pmm_en", "PMM enabled" }, + { "lahf_lm", "LAHF/SAHF in long mode" }, + { "cmp_legacy", "HyperThreading not valid" }, + { "lm", "LAHF/SAHF in long mode" }, + { "ds_cpl", "CPL Qualified Debug Store" }, + { "vmx", "Virtualization support (Intel)" }, + { "svm", "Virtualization support (AMD)" }, + { "est", "Enhanced SpeedStep" }, + { "tm2", "Thermal Monitor 2" }, + { "ssse3", "Supplemental Streaming SIMD Extension 3" }, + { "cx16", "CMPXCHG16B instruction" }, + { "xptr", "Send Task Priority Messages" }, + { "pebs", "Precise Event Based Sampling" }, + { "bts", "Branch Trace Store" }, + { "ida", "Intel Dynamic Acceleration" }, + { "arch_perfmon","Intel Architectural PerfMon" }, + { "pni", "Streaming SIMD Extension 3 (Prescott New Instruction)" }, + { "rep_good", "rep microcode works well on this CPU" }, + { "ts", "Thermal Sensor" }, + { "sse3", "Streaming SIMD Extension 3" }, + { "sse4", "Streaming SIMD Extension 4" }, + { "tni", "Tejas New Instruction" }, + { "nni", "Nehalem New Instruction" }, + { "tpr", "Task Priority Register" }, + { "vid", "Voltage Identifier" }, + { "fid", "Frequency Identifier" }, + { "dtes64", "64-bit Debug Store" }, + { "monitor", "Monitor/Mwait support" }, + { "sse4_1", "Streaming SIMD Extension 4.1" }, + { "sse4_2", "Streaming SIMD Extension 4.2" }, + { "nopl", "NOPL instructions" }, + { "cxmmx", "Cyrix MMX extensions" }, + { "xtopology", "CPU topology enum extensions" }, + { "nonstop_tsc", "TSC does not stop in C states" }, + { "eagerfpu", "Non lazy FPU restor" }, + { "pclmulqdq", "Perform a Carry-Less Multiplication of Quadword instruction" }, + { "smx", "Safer mode: TXT (TPM support)" }, + { "pdcm", "Performance capabilities" }, + { "pcid", "Process Context Identifiers" }, + { "x2apic", "x2APIC" }, + { "popcnt", "Set bit count instructions" }, + { "aes", "Advanced Encryption Standard" }, + { "aes-ni", "Advanced Encryption Standard (New Instructions)" }, + { "xsave", "Save Processor Extended States" }, + { "avx", "Advanced Vector Instructions" }, + { NULL, NULL }, +}; + +static struct { + char *name, *meaning; +} bug_meaning[] = { + { "f00f", "Intel F00F bug" }, + { "fdiv", "FPU FDIV" }, + { "coma", "Cyrix 6x86 coma" }, + { "tlb_mmatch", "AMD Erratum 383" }, + { "apic_c1e", "AMD Erratum 400" }, + { "11ap", "Bad local APIC aka 11AP" }, + { "fxsave_leak", "FXSAVE leaks FOP/FIP/FOP" }, + { "clflush_monitor", "AAI65, CLFLUSH required before MONITOR" }, + { "sysret_ss_attrs", "SYSRET doesn't fix up SS attrs" }, + { "espfix", "IRET to 16-bit SS corrupts ESP/RSP high bits" }, + { "null_seg", "Nulling a selector preserves the base" }, /* see: detect_null_seg_behavior() */ + { "swapgs_fence","SWAPGS without input dep on GS" }, + { "monitor", "IPI required to wake up remote CPU" }, + { "amd_e400", "AMD Erratum 400" }, + { NULL, NULL }, +}; + +/* from arch/x86/kernel/cpu/powerflags.h */ +static struct { + char *name, *meaning; +} pm_meaning[] = { + { "ts", "temperature sensor" }, + { "fid", "frequency id control" }, + { "vid", "voltage id control" }, + { "ttp", "thermal trip" }, + { "tm", "hardware thermal control" }, + { "stc", "software thermal control" }, + { "100mhzsteps", "100 MHz multiplier control" }, + { "hwpstate", "hardware P-state control" }, +/* { "", "tsc invariant mapped to constant_tsc" }, */ + { "cpb", "core performance boost" }, + { "eff_freq_ro", "Readonly aperf/mperf" }, + { "proc_feedback", "processor feedback interface" }, + { "acc_power", "accumulated power mechanism" }, + { NULL, NULL }, +}; + +GHashTable *cpu_flags = NULL; + +static void +populate_cpu_flags_list_internal() +{ + int i; + + DEBUG("using internal CPU flags database"); + + for (i = 0; flag_meaning[i].name != NULL; i++) { + g_hash_table_insert(cpu_flags, flag_meaning[i].name, + flag_meaning[i].meaning); + } + for (i = 0; bug_meaning[i].name != NULL; i++) { + g_hash_table_insert(cpu_flags, bug_meaning[i].name, + bug_meaning[i].meaning); + } + for (i = 0; pm_meaning[i].name != NULL; i++) { + g_hash_table_insert(cpu_flags, pm_meaning[i].name, + pm_meaning[i].meaning); + } +} + +void cpu_flags_init(void) +{ + gint i; + gchar *path; + + cpu_flags = g_hash_table_new(g_str_hash, g_str_equal); + + path = g_build_filename(g_get_home_dir(), ".hardinfo", "cpuflags.conf", NULL); + if (!g_file_test(path, G_FILE_TEST_EXISTS)) { + populate_cpu_flags_list_internal(); + } else { + GKeyFile *flags_file; + + DEBUG("using %s as CPU flags database", path); + + flags_file = g_key_file_new(); + if (g_key_file_load_from_file(flags_file, path, 0, NULL)) { + gchar **flag_keys; + + flag_keys = g_key_file_get_keys(flags_file, "flags", + NULL, NULL); + if (!flag_keys) { + DEBUG("error while using %s as CPU flags database, falling back to internal", + path); + populate_cpu_flags_list_internal(); + } else { + for (i = 0; flag_keys[i]; i++) { + gchar *meaning; + + meaning = g_key_file_get_string(flags_file, "flags", + flag_keys[i], NULL); + + g_hash_table_insert(cpu_flags, g_strdup(flag_keys[i]), meaning); + + /* can't free meaning */ + } + + g_strfreev(flag_keys); + } + } + + g_key_file_free(flags_file); + } + + g_free(path); +} + +gchar *processor_get_capabilities_from_flags(gchar * strflags) +{ + /* FIXME: + * - Separate between processor capabilities, additional instructions and whatnot. + */ + gchar **flags, **old; + gchar *tmp = NULL; + gint j = 0; + + if (!cpu_flags) { + cpu_flags_init(); + } + + flags = g_strsplit(strflags, " ", 0); + old = flags; + + while (flags[j]) { + gchar *meaning = g_hash_table_lookup(cpu_flags, flags[j]); + + if (meaning) { + tmp = h_strdup_cprintf("%s=%s\n", tmp, flags[j], meaning); + } else { + tmp = h_strdup_cprintf("%s=\n", tmp, flags[j]); + } + j++; + } + if (tmp == NULL || g_strcmp0(tmp, "") == 0) + tmp = g_strdup_printf("%s=%s\n", "empty", _("Empty List")); + + g_strfreev(old); + return tmp; +} + +gchar *processor_get_detailed_info(Processor * processor) +{ + gchar *tmp_flags, *tmp_bugs, *tmp_pm, *ret, *cache_info; + + tmp_flags = processor_get_capabilities_from_flags(processor->flags); + tmp_bugs = processor_get_capabilities_from_flags(processor->bugs); + tmp_pm = processor_get_capabilities_from_flags(processor->pm); + cache_info = __cache_get_info_as_string(processor); + + ret = g_strdup_printf(_("[Processor]\n" + "Name=%s\n" + "Family, model, stepping=%d, %d, %d (%s)\n" + "Vendor=%s\n" + "[Configuration]\n" + "Cache Size=%dkb\n" + "Frequency=%.2fMHz\n" + "BogoMIPS=%.2f\n" + "Byte Order=%s\n" + "[Frequency Scaling]\n" + "Minimum=%d kHz\n" + "Maximum=%d kHz\n" + "Current=%d kHz\n" + "[Features]\n" + "Has FPU=%s\n" + "[Cache]\n" + "%s\n" + "[Power Management]\n" + "%s" + "[Bugs]\n" + "%s" + "[Capabilities]\n" + "%s"), + processor->model_name, + processor->family, + processor->model, + processor->stepping, + processor->strmodel, + vendor_get_name(processor->vendor_id), + processor->cache_size, + processor->cpu_mhz, processor->bogomips, +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + "Little Endian", +#else + "Big Endian", +#endif + processor->cpukhz_min, + processor->cpukhz_max, + processor->cpukhz_cur, + processor->has_fpu ? processor->has_fpu : "no", + cache_info, + tmp_pm, tmp_bugs, tmp_flags); + g_free(tmp_flags); + g_free(tmp_bugs); + g_free(tmp_pm); + g_free(cache_info); + + return ret; +} + +gchar *processor_get_info(GSList * processors) +{ + Processor *processor; + + if (g_slist_length(processors) > 1) { + gchar *ret, *tmp, *hashkey; + GSList *l; + + tmp = g_strdup(""); + + for (l = processors; l; l = l->next) { + processor = (Processor *) l->data; + + tmp = g_strdup_printf(_("%s$CPU%d$%s=%.2fMHz\n"), + tmp, processor->id, + processor->model_name, + processor->cpu_mhz); + + hashkey = g_strdup_printf("CPU%d", processor->id); + moreinfo_add_with_prefix("DEV", hashkey, + processor_get_detailed_info(processor)); + g_free(hashkey); + } + + ret = g_strdup_printf("[$ShellParam$]\n" + "ViewType=1\n" + "[Processors]\n" + "%s", tmp); + g_free(tmp); + + return ret; + } + + processor = (Processor *) processors->data; + return processor_get_detailed_info(processor); +} diff --git a/modules/devices/x86_64 b/modules/devices/x86_64 new file mode 120000 index 00000000..de1ff735 --- /dev/null +++ b/modules/devices/x86_64 @@ -0,0 +1 @@ +./x86 \ No newline at end of file diff --git a/modules/network.c b/modules/network.c new file mode 100644 index 00000000..18f8ba65 --- /dev/null +++ b/modules/network.c @@ -0,0 +1,438 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2008 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include + +#include "network.h" + +/* Callbacks */ +gchar *callback_network(); +gchar *callback_route(); +gchar *callback_dns(); +gchar *callback_connections(); +gchar *callback_shares(); +gchar *callback_arp(); +gchar *callback_statistics(); + +/* Scan callbacks */ +void scan_network(gboolean reload); +void scan_route(gboolean reload); +void scan_dns(gboolean reload); +void scan_connections(gboolean reload); +void scan_shares(gboolean reload); +void scan_arp(gboolean reload); +void scan_statistics(gboolean reload); + +static ModuleEntry entries[] = { + {N_("Interfaces"), "network-interface.png", callback_network, scan_network, MODULE_FLAG_NONE}, + {N_("IP Connections"), "network-connections.png", callback_connections, scan_connections, MODULE_FLAG_NONE}, + {N_("Routing Table"), "network.png", callback_route, scan_route, MODULE_FLAG_NONE}, + {N_("ARP Table"), "module.png", callback_arp, scan_arp, MODULE_FLAG_NONE}, + {N_("DNS Servers"), "dns.png", callback_dns, scan_dns, MODULE_FLAG_NONE}, + {N_("Statistics"), "network-statistics.png", callback_statistics, scan_statistics, MODULE_FLAG_NONE}, + {N_("Shared Directories"), "shares.png", callback_shares, scan_shares, MODULE_FLAG_NONE}, + {NULL}, +}; + +void scan_shares(gboolean reload) +{ + SCAN_START(); + scan_samba(); + scan_nfs_shared_directories(); + SCAN_END(); +} + +static gchar *__statistics = NULL; +void scan_statistics(gboolean reload) +{ + FILE *netstat; + gchar buffer[256]; + gchar *netstat_path; + + 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")) { + gchar *ip; + struct sockaddr_in sa; + char hbuf[NI_MAXHOST]; + + ip = g_strstrip(buffer + sizeof("nameserver")); + + sa.sin_family = AF_INET; + sa.sin_addr.s_addr = inet_addr(ip); + + if (getnameinfo((struct sockaddr *)&sa, sizeof(sa), hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD)) { + __nameservers = h_strdup_cprintf("%s=\n", + __nameservers, + ip); + } else { + __nameservers = h_strdup_cprintf("%s=%s\n", + __nameservers, + ip, hbuf); + + } + + shell_status_pulse(); + } + } + fclose(resolv); + } + + SCAN_END(); +} + +void scan_network(gboolean reload) +{ + SCAN_START(); + scan_net_interfaces(); + SCAN_END(); +} + +static gchar *__routing_table = NULL; +void scan_route(gboolean reload) +{ + FILE *route; + gchar buffer[256]; + gchar *route_path; + + SCAN_START(); + + g_free(__routing_table); + __routing_table = g_strdup(""); + + if ((route_path = find_program("route"))) { + gchar *command_line = g_strdup_printf("%s -n", route_path); + + if ((route = popen(command_line, "r"))) { + /* eat first two lines */ + (void)fgets(buffer, 256, route); + (void)fgets(buffer, 256, route); + + while (fgets(buffer, 256, route)) { + buffer[15] = '\0'; + buffer[31] = '\0'; + buffer[47] = '\0'; + buffer[53] = '\0'; + + __routing_table = h_strdup_cprintf("%s / %s=%s|%s|%s\n", + __routing_table, + g_strstrip(buffer), g_strstrip(buffer + 16), + g_strstrip(buffer + 72), + g_strstrip(buffer + 48), + g_strstrip(buffer + 32)); + } + + pclose(route); + } + + g_free(command_line); + g_free(route_path); + } + + SCAN_END(); +} + +static gchar *__arp_table = NULL; +void scan_arp(gboolean reload) +{ + FILE *arp; + gchar buffer[256]; + + SCAN_START(); + + g_free(__arp_table); + __arp_table = g_strdup(""); + + if ((arp = fopen("/proc/net/arp", "r"))) { + /* eat first line */ + (void)fgets(buffer, 256, arp); + + while (fgets(buffer, 256, arp)) { + buffer[15] = '\0'; + buffer[58] = '\0'; + + __arp_table = h_strdup_cprintf("%s=%s|%s\n", + __arp_table, + g_strstrip(buffer), + g_strstrip(buffer + 72), + g_strstrip(buffer + 41)); + } + + fclose(arp); + } + + SCAN_END(); +} + +static gchar *__connections = NULL; +void scan_connections(gboolean reload) +{ + FILE *netstat; + gchar buffer[256]; + gchar *netstat_path; + + SCAN_START(); + + g_free(__connections); + __connections = g_strdup(""); + + if ((netstat_path = find_program("netstat"))) { + gchar *command_line = g_strdup_printf("%s -an", netstat_path); + + if ((netstat = popen("netstat -an", "r"))) { + while (fgets(buffer, 256, netstat)) { + buffer[6] = '\0'; + buffer[43] = '\0'; + buffer[67] = '\0'; + + if (g_str_has_prefix(buffer, "tcp") || g_str_has_prefix(buffer, "udp")) { + __connections = h_strdup_cprintf("%s=%s|%s|%s\n", + __connections, + g_strstrip(buffer + 20), /* local address */ + g_strstrip(buffer), /* protocol */ + g_strstrip(buffer + 44), /* foreign address */ + g_strstrip(buffer + 68)); /* state */ + } + } + + pclose(netstat); + } + + g_free(command_line); + g_free(netstat_path); + } + + SCAN_END(); +} + +gchar *callback_arp() +{ + return g_strdup_printf(_("[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" + "[$ShellParam$]\n" + "ColumnTitle$TextValue=IP Address\n" + "ColumnTitle$Value=Name\n" + "ShowColumnHeaders=true\n"), __nameservers); +} + +gchar *callback_connections() +{ + return g_strdup_printf(_("[Connections]\n" + "%s\n" + "[$ShellParam$]\n" + "ReloadInterval=3000\n" + "ColumnTitle$TextValue=Local Address\n" + "ColumnTitle$Value=Protocol\n" + "ColumnTitle$Extra1=Foreign Address\n" + "ColumnTitle$Extra2=State\n" + "ShowColumnHeaders=true\n"), + __connections); +} + +gchar *callback_network() +{ + return g_strdup_printf(_("%s\n" + "[$ShellParam$]\n" + "ReloadInterval=3000\n" + "ViewType=1\n" + "ColumnTitle$TextValue=Interface\n" + "ColumnTitle$Value=IP Address\n" + "ColumnTitle$Extra1=Sent\n" + "ColumnTitle$Extra2=Received\n" + "ShowColumnHeaders=true\n" + "%s"), + network_interfaces, + network_icons); +} + +gchar *callback_route() +{ + return g_strdup_printf(_("[IP routing table]\n" + "%s\n" + "[$ShellParam$]\n" + "ViewType=0\n" + "ReloadInterval=3000\n" + "ColumnTitle$TextValue=Destination / Gateway\n" + "ColumnTitle$Value=Interface\n" + "ColumnTitle$Extra1=Flags\n" + "ColumnTitle$Extra2=Mask\n" + "ShowColumnHeaders=true\n"), + __routing_table); +} + +gchar *callback_statistics() +{ + return g_strdup_printf("%s\n" + "[$ShellParam$]\n" + "ReloadInterval=3000\n", + __statistics); +} + +gchar *hi_more_info(gchar * entry) +{ + gchar *info = moreinfo_lookup_with_prefix("NET", entry); + + if (info) + return g_strdup(info); + + return g_strdup_printf("[%s]", entry); +} + +ModuleEntry *hi_module_get_entries(void) +{ + return entries; +} + +gchar *hi_module_get_name(void) +{ + return g_strdup(_("Network")); +} + +guchar hi_module_get_weight(void) +{ + return 160; +} + +void hi_module_init(void) +{ +} + +void hi_module_deinit(void) +{ + moreinfo_del_with_prefix("NET"); + + g_free(smb_shares_list); + g_free(nfs_shares_list); + g_free(network_interfaces); + g_free(network_icons); + + g_free(__statistics); + g_free(__nameservers); + g_free(__arp_table); + g_free(__routing_table); + g_free(__connections); +} + +ModuleAbout *hi_module_get_about(void) +{ + static ModuleAbout ma[] = { + { + .author = "Leandro A. F. Pereira", + .description = N_("Gathers information about this computer's network connection"), + .version = VERSION, + .license = "GNU GPL version 2"} + }; + + return ma; +} diff --git a/modules/network/net.c b/modules/network/net.c new file mode 100644 index 00000000..ebb0612a --- /dev/null +++ b/modules/network/net.c @@ -0,0 +1,452 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2008 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +/* + * Wireless Extension Example + * http://www.krugle.org/examples/p-OZYzuisV6gyQIaTu/iwconfig.c + */ + +#include "config.h" + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include + +#ifdef HAS_LINUX_WE +#include +#include +#else +#include +#endif /* HAS_LINUX_WE */ + +#include "hardinfo.h" +#include "network.h" + +gchar *network_interfaces = NULL, *network_icons = NULL; + +typedef struct _NetInfo NetInfo; +struct _NetInfo { + char name[16]; + int mtu; + unsigned char mac[8]; + char ip[16]; + char mask[16]; + char broadcast[16]; + +#ifdef HAS_LINUX_WE + char wi_essid[IW_ESSID_MAX_SIZE + 1]; + int wi_rate; + int wi_mode, wi_status; + gboolean wi_has_txpower; + struct iw_param wi_txpower; + int wi_quality_level, wi_signal_level, wi_noise_level; + gboolean is_wireless; +#endif +}; + +#ifdef HAS_LINUX_WE +const gchar *wi_operation_modes[] = { "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 (strchr(buf1, '.')) { + sscanf(buf1, "%d %d. %d. %d %d %d %d %d %d %d", + &(netinfo->wi_status), + &(netinfo->wi_quality_level), + &(netinfo->wi_signal_level), + &(netinfo->wi_noise_level), + &trash, &trash, &trash, &trash, &trash, &trash); + } else { + sscanf(buf1, "%d %d %d %d %d %d %d %d %d %d", + &(netinfo->wi_status), + &(netinfo->wi_quality_level), + &(netinfo->wi_signal_level), + &(netinfo->wi_noise_level), + &trash, &trash, &trash, &trash, &trash, + &trash); + } + + break; + } + } + fclose(wrls); + } + + if (!netinfo->is_wireless) + return; + + strncpy(wi_req.ifr_name, netinfo->name, 16); + + /* obtain essid */ + wi_req.u.essid.pointer = netinfo->wi_essid; + wi_req.u.essid.length = IW_ESSID_MAX_SIZE + 1; + wi_req.u.essid.flags = 0; + + if (ioctl(fd, SIOCGIWESSID, &wi_req) < 0) { + strcpy(netinfo->wi_essid, ""); + } else { + netinfo->wi_essid[wi_req.u.essid.length] = '\0'; + } + + /* obtain bit rate */ + if (ioctl(fd, SIOCGIWRATE, &wi_req) < 0) { + netinfo->wi_rate = 0; + } else { + netinfo->wi_rate = wi_req.u.bitrate.value; + } + + /* obtain operation mode */ + if (ioctl(fd, SIOCGIWMODE, &wi_req) < 0) { + netinfo->wi_mode = 0; + } else { + if (wi_req.u.mode >= 0 && wi_req.u.mode < 6) { + netinfo->wi_mode = wi_req.u.mode; + } else { + netinfo->wi_mode = 6; + } + } + +#if WIRELESS_EXT >= 10 + /* obtain txpower */ + if (ioctl(fd, SIOCGIWTXPOW, &wi_req) < 0) { + netinfo->wi_has_txpower = FALSE; + } else { + netinfo->wi_has_txpower = TRUE; + + memcpy(&netinfo->wi_txpower, &wi_req.u.txpower, sizeof(struct iw_param)); + } +#else + netinfo->wi_has_txpower = FALSE; +#endif /* WIRELESS_EXT >= 10 */ +} +#endif /* HAS_LINUX_WE */ + +void get_net_info(char *if_name, NetInfo * netinfo) +{ + struct ifreq ifr; + int fd; + + fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); + + /* IPv4 */ + ifr.ifr_addr.sa_family = AF_INET; + strncpy(netinfo->name, if_name, sizeof(netinfo->name)); + + /* MTU */ + strcpy(ifr.ifr_name, if_name); + if (ioctl(fd, SIOCGIFMTU, &ifr) < 0) { + netinfo->mtu = 0; + } else { + netinfo->mtu = ifr.ifr_mtu; + } + + /* HW Address */ + strcpy(ifr.ifr_name, if_name); + if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { + memset(netinfo->mac, 0, 8); + } else { + memcpy(netinfo->mac, ifr.ifr_ifru.ifru_hwaddr.sa_data, 8); + } + + /* IP Address */ + strcpy(ifr.ifr_name, if_name); + if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) { + netinfo->ip[0] = 0; + } else { + snprintf(netinfo->ip, sizeof(netinfo->ip), "%s", + inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> + sin_addr)); + } + + /* Mask Address */ + strcpy(ifr.ifr_name, if_name); + if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) { + netinfo->mask[0] = 0; + } else { + snprintf(netinfo->mask, sizeof(netinfo->mask), "%s", + inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> + sin_addr)); + } + + /* Broadcast Address */ + strcpy(ifr.ifr_name, if_name); + if (ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0) { + netinfo->broadcast[0] = 0; + } else { + snprintf(netinfo->broadcast, sizeof(netinfo->broadcast), "%s", + inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> + sin_addr)); + } + +#ifdef HAS_LINUX_WE + get_wireless_info(fd, netinfo); +#endif + + shutdown(fd, 0); + close(fd); +} + +static struct { + char *type; + char *label; + char *icon; +} netdev2type[] = { + { "eth", "Ethernet", "network-interface" }, + { "lo", "Loopback", "network" }, + { "ppp", "Point-to-Point", "modem" }, + { "ath", "Wireless", "wireless" }, + { "wlan", "Wireless", "wireless" }, + { "ra", "Wireless", "wireless" }, + { "wl", "Wireless", "wireless" }, + { "wmaster", "Wireless", "wireless" }, + { "tun", "Virtual Point-to-Point (TUN)", "network" }, + { "tap", "Ethernet (TAP)", "network" }, + { "plip", "Parallel Line Internet Protocol", "network" }, + { "irlan", "Infrared", "network" }, + { "slip", "Serial Line Internet Protocol", "network" }, + { "isdn", "Integrated Services Digital Network", "modem" }, + { "sit", "IPv6-over-IPv4 Tunnel", "network" }, + { "vmnet8", "VMWare Virtual Network Interface (NAT)", "computer" }, + { "vmnet", "VMWare Virtual Network Interface", "computer" }, + { "pan", "Personal Area Network (PAN)", "bluetooth" }, + { "bnep", "Bluetooth", "bluetooth" }, + { "br", "Bridge Interface", "network" }, + { "ham", "Hamachi Virtual Personal Network", "network"}, + { "net", "Ethernet", "network-interface" }, + { "ifb", "Intermediate Functional Block", "network" }, + { "gre", "GRE Network Tunnel", "network" }, + { "msh", "Mesh Network", "wireless" }, + { "wmaster", "Wireless Master Interface", "wireless" }, + { "vboxnet", "VirtualBox Virtual Network Interface", "network" }, + { NULL, "Unknown", "network" }, +}; + +static void net_get_iface_type(gchar * name, gchar ** type, gchar ** icon, NetInfo *ni) +{ + int i; + +#ifdef HAS_LINUX_WE + if (ni->is_wireless) { + *type = "Wireless"; + *icon = "wireless"; + + return; + } +#endif + + for (i = 0; netdev2type[i].type; i++) { + if (g_str_has_prefix(name, netdev2type[i].type)) + break; + } + + *type = netdev2type[i].label; + *icon = netdev2type[i].icon; +} + +static gboolean +remove_net_devices(gpointer key, gpointer value, gpointer data) +{ + return g_str_has_prefix(key, "NET"); +} + +static void scan_net_interfaces_24(void) +{ + FILE *proc_net; + NetInfo ni; + gchar buffer[256]; + gchar *devid, *detailed; + gdouble recv_bytes; + gdouble recv_errors; + gdouble recv_packets; + + gdouble trans_bytes; + gdouble trans_errors; + gdouble trans_packets; + + if (!g_file_test("/proc/net/dev", G_FILE_TEST_EXISTS)) { + if (network_interfaces) { + g_free(network_interfaces); + network_interfaces = g_strdup("[Network Interfaces]\n" + "None found=\n"); + } + + return; + } + + g_free(network_interfaces); + + g_free(network_icons); + + network_interfaces = g_strdup("[Network Interfaces]\n"); + network_icons = g_strdup(""); + + proc_net = fopen("/proc/net/dev", "r"); + if (!proc_net) + return; + + while (fgets(buffer, 256, proc_net)) { + if (strchr(buffer, ':')) { + gint trash; + gchar ifacename[16]; + gchar *buf = buffer; + gchar *iface_type, *iface_icon; + gint i; + + buf = g_strstrip(buf); + + memset(ifacename, 0, 16); + + for (i = 0; buffer[i] != ':' && i < 16; i++) { + ifacename[i] = buffer[i]; + } + + buf = strchr(buf, ':') + 1; + + /* iface: bytes packets errs drop fifo frame compressed multicast */ + sscanf(buf, "%lf %lf %lf %d %d %d %d %d %lf %lf %lf", + &recv_bytes, &recv_packets, + &recv_errors, &trash, &trash, &trash, &trash, + &trash, &trans_bytes, &trans_packets, &trans_errors); + + gdouble recv_mb = recv_bytes / 1048576.0; + gdouble trans_mb = trans_bytes / 1048576.0; + + get_net_info(ifacename, &ni); + + devid = g_strdup_printf("NET%s", ifacename); + + network_interfaces = + h_strdup_cprintf + ("$%s$%s=%s|%.2lfMiB|%.2lfMiB\n", + network_interfaces, devid, ifacename, ni.ip[0] ? ni.ip : "", + trans_mb, recv_mb); + net_get_iface_type(ifacename, &iface_type, &iface_icon, &ni); + + network_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", + network_icons, devid, + ifacename, iface_icon); + + detailed = g_strdup_printf("[Network Adapter Properties]\n" + "Interface Type=%s\n" + "Hardware Address (MAC)=%02x:%02x:%02x:%02x:%02x:%02x\n" + "MTU=%d\n" + "[Transfer Details]\n" + "Bytes Received=%.0lf (%.2fMiB)\n" + "Bytes Sent=%.0lf (%.2fMiB)\n", + iface_type, + ni.mac[0], ni.mac[1], + ni.mac[2], ni.mac[3], + ni.mac[4], ni.mac[5], + ni.mtu, + recv_bytes, recv_mb, + trans_bytes, trans_mb); + +#ifdef HAS_LINUX_WE + if (ni.is_wireless) { + gchar *txpower; + + if (ni.wi_has_txpower) { + gint mw, dbm; + + if (ni.wi_txpower.flags & IW_TXPOW_MWATT) { + mw = ni.wi_txpower.value; + dbm = (int) ceil(10.0 * log10((double) ni.wi_txpower.value)); + } else { + dbm = ni.wi_txpower.value; + mw = (int) floor(pow(10.0, ((double) dbm / 10.0))); + } + + txpower = g_strdup_printf("%ddBm (%dmW)", dbm, mw); + } else { + txpower = g_strdup("Unknown"); + } + + detailed = h_strdup_cprintf("\n[Wireless Properties]\n" + "Network Name (SSID)=%s\n" + "Bit Rate=%dMb/s\n" + "Transmission Power=%s\n" + "Mode=%s\n" + "Status=%d\n" + "Link Quality=%d\n" + "Signal / Noise=%d dBm / %d dBm\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"); + } + + moreinfo_add_with_prefix("NET", devid, detailed); + g_free(devid); + } + } + fclose(proc_net); +} + +void scan_net_interfaces(void) +{ + /* FIXME: See if we're running Linux 2.6 and if /sys is mounted, then use + that instead of /proc/net/dev */ + + /* remove old devices from global device table */ + moreinfo_del_with_prefix("NET"); + + scan_net_interfaces_24(); +} diff --git a/modules/network/nfs.c b/modules/network/nfs.c new file mode 100644 index 00000000..54bbfe0e --- /dev/null +++ b/modules/network/nfs.c @@ -0,0 +1,59 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "hardinfo.h" +#include "network.h" + +gchar *nfs_shares_list = NULL; + +void +scan_nfs_shared_directories(void) +{ + FILE *exports; + gint count = 0; + gchar buf[512]; + + g_free(nfs_shares_list); + + nfs_shares_list = g_strdup(""); + + if ((exports = fopen("/etc/exports", "r"))) { + while (fgets(buf, 512, exports)) { + if (buf[0] != '/') + continue; + + strend(buf, ' '); + strend(buf, '\t'); + + nfs_shares_list = h_strdup_cprintf("%s=\n", + nfs_shares_list, buf); + count++; + } + + fclose(exports); + } + + if (!count) { + g_free(nfs_shares_list); + + nfs_shares_list = g_strdup("No NFS exports=\n"); + } +} + diff --git a/modules/network/samba.c b/modules/network/samba.c new file mode 100644 index 00000000..71ba6ab6 --- /dev/null +++ b/modules/network/samba.c @@ -0,0 +1,124 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "hardinfo.h" +#include "network.h" + +gchar *smb_shares_list = NULL; + +void scan_samba_from_string(gchar *str, gsize length); +void scan_samba_usershares(void); + +void +scan_samba(void) +{ + gchar *str; + gsize length; + + if (smb_shares_list) { + g_free(smb_shares_list); + smb_shares_list = g_strdup(""); + } + + if (g_file_get_contents("/etc/samba/smb.conf", + &str, &length, NULL)) { + shell_status_update("Scanning SAMBA shares..."); + scan_samba_from_string(str, length); + g_free(str); + } + + scan_samba_usershares(); +} + +void +scan_samba_usershares(void) +{ + FILE *usershare_list; + + if ((usershare_list = popen("net usershare list", "r"))) { + char buffer[512]; + + shell_status_update("Scanning SAMBA user shares..."); + + while (fgets(buffer, 512, usershare_list)) { + gchar *usershare, *cmdline; + gsize length; + + cmdline = g_strdup_printf("net usershare info '%s'", + strend(buffer, '\n')); + if (g_spawn_command_line_sync(cmdline, + &usershare, NULL, + NULL, NULL)) { + length = strlen(usershare); + scan_samba_from_string(usershare, length); + g_free(usershare); + } + + g_free(cmdline); + + shell_status_pulse(); + } + + pclose(usershare_list); + } +} + +void +scan_samba_from_string(gchar *str, gsize length) +{ + GKeyFile *keyfile; + GError *error = NULL; + gchar **groups; + gint i = 0; + + keyfile = g_key_file_new(); + + gchar *_smbconf = str; + for (; *_smbconf; _smbconf++) + if (*_smbconf == ';') *_smbconf = '\0'; + + if (!g_key_file_load_from_data(keyfile, str, length, 0, &error)) { + smb_shares_list = g_strdup("Cannot parse smb.conf=\n"); + if (error) + g_error_free(error); + goto cleanup; + } + + groups = g_key_file_get_groups(keyfile, NULL); + while (groups[i]) { + shell_status_pulse(); + + if (g_key_file_has_key(keyfile, groups[i], "path", NULL)) { + gchar *path = g_key_file_get_string(keyfile, groups[i], "path", NULL); + smb_shares_list = h_strdup_cprintf("%s=%s\n", + smb_shares_list, + groups[i], path); + g_free(path); + } + + i++; + } + + g_strfreev(groups); + + cleanup: + g_key_file_free(keyfile); +} + diff --git a/modules/placeholder b/modules/placeholder deleted file mode 100644 index e69de29b..00000000 diff --git a/network.c b/network.c deleted file mode 100644 index d3397412..00000000 --- a/network.c +++ /dev/null @@ -1,403 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2008 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -static GHashTable *moreinfo = NULL; - -/* Callbacks */ -gchar *callback_network(); -gchar *callback_route(); -gchar *callback_dns(); -gchar *callback_connections(); -gchar *callback_shares(); -gchar *callback_arp(); -gchar *callback_statistics(); - -/* Scan callbacks */ -void scan_network(gboolean reload); -void scan_route(gboolean reload); -void scan_dns(gboolean reload); -void scan_connections(gboolean reload); -void scan_shares(gboolean reload); -void scan_arp(gboolean reload); -void scan_statistics(gboolean reload); - -static ModuleEntry entries[] = { - {"Interfaces", "network-interface.png", callback_network, scan_network}, - {"IP Connections", "network-connections.png", callback_connections, scan_connections}, - {"Routing Table", "network.png", callback_route, scan_route}, - {"ARP Table", "module.png", callback_arp, scan_arp}, - {"DNS Servers", "dns.png", callback_dns, scan_dns}, - {"Statistics", "network-statistics.png", callback_statistics, scan_statistics}, - {"Shared Directories", "shares.png", callback_shares, scan_shares}, - {NULL}, -}; - -#include -#include -#include - -void scan_shares(gboolean reload) -{ - SCAN_START(); - scan_samba_shared_directories(); - scan_nfs_shared_directories(); - SCAN_END(); -} - -static gchar *__statistics = NULL; -void scan_statistics(gboolean reload) -{ - FILE *netstat; - gchar buffer[256]; - gchar *netstat_path; - - SCAN_START(); - - g_free(__statistics); - __statistics = g_strdup(""); - - if ((netstat_path = find_program("netstat"))) { - gchar *command_line = g_strdup_printf("%s -s", netstat_path); - - if ((netstat = popen(command_line, "r"))) { - while (fgets(buffer, 256, netstat)) { - if (!isspace(buffer[0]) && strchr(buffer, ':')) { - gchar *tmp; - - tmp = g_ascii_strup(strend(buffer, ':'), -1); - - __statistics = h_strdup_cprintf("[%s]\n", - __statistics, - tmp); - - g_free(tmp); - } else if (isdigit(buffer[4])) { - gchar *tmp1 = buffer + 4, - *tmp2 = tmp1; - - while (*tmp2 && !isspace(*tmp2)) tmp2++; - *tmp2 = 0; - tmp2++; - - *tmp2 = toupper(*tmp2); - - __statistics = h_strdup_cprintf("%s=%s\n", - __statistics, - g_strstrip(tmp1), - g_strstrip(tmp2)); - } - } - - pclose(netstat); - } - - g_free(command_line); - g_free(netstat_path); - } - - SCAN_END(); -} - -static gchar *__nameservers = NULL; -void scan_dns(gboolean reload) -{ - FILE *resolv; - gchar buffer[256]; - - SCAN_START(); - - g_free(__nameservers); - __nameservers = g_strdup(""); - - if ((resolv = fopen("/etc/resolv.conf", "r"))) { - while (fgets(buffer, 256, resolv)) { - if (g_str_has_prefix(buffer, "nameserver")) { - __nameservers = h_strdup_cprintf("%s=\n", - __nameservers, - g_strstrip(buffer + sizeof("nameserver"))); - } - } - fclose(resolv); - } - - SCAN_END(); -} - -void scan_network(gboolean reload) -{ - SCAN_START(); - scan_net_interfaces(); - SCAN_END(); -} - -static gchar *__routing_table = NULL; -void scan_route(gboolean reload) -{ - FILE *route; - gchar buffer[256]; - gchar *route_path; - - SCAN_START(); - - g_free(__routing_table); - __routing_table = g_strdup(""); - - if ((route_path = find_program("route"))) { - gchar *command_line = g_strdup_printf("%s -n", route_path); - - if ((route = popen(command_line, "r"))) { - /* eat first two lines */ - (void)fgets(buffer, 256, route); - (void)fgets(buffer, 256, route); - - while (fgets(buffer, 256, route)) { - buffer[15] = '\0'; - buffer[31] = '\0'; - buffer[47] = '\0'; - buffer[53] = '\0'; - - __routing_table = h_strdup_cprintf("%s / %s=%s|%s|%s\n", - __routing_table, - g_strstrip(buffer), g_strstrip(buffer + 16), - g_strstrip(buffer + 72), - g_strstrip(buffer + 48), - g_strstrip(buffer + 32)); - } - - pclose(route); - } - - g_free(command_line); - g_free(route_path); - } - - SCAN_END(); -} - -static gchar *__arp_table = NULL; -void scan_arp(gboolean reload) -{ - FILE *arp; - gchar buffer[256]; - - SCAN_START(); - - g_free(__arp_table); - __arp_table = g_strdup(""); - - if ((arp = fopen("/proc/net/arp", "r"))) { - /* eat first line */ - (void)fgets(buffer, 256, arp); - - while (fgets(buffer, 256, arp)) { - buffer[15] = '\0'; - buffer[58] = '\0'; - - __arp_table = h_strdup_cprintf("%s=%s|%s\n", - __arp_table, - g_strstrip(buffer), - g_strstrip(buffer + 72), - g_strstrip(buffer + 41)); - } - - pclose(arp); - } - - SCAN_END(); -} - -static gchar *__connections = NULL; -void scan_connections(gboolean reload) -{ - FILE *netstat; - gchar buffer[256]; - gchar *netstat_path; - - SCAN_START(); - - g_free(__connections); - __connections = g_strdup(""); - - if ((netstat_path = find_program("netstat"))) { - gchar *command_line = g_strdup_printf("%s -an", netstat_path); - - if ((netstat = popen("netstat -an", "r"))) { - while (fgets(buffer, 256, netstat)) { - buffer[6] = '\0'; - buffer[43] = '\0'; - buffer[67] = '\0'; - - if (g_str_has_prefix(buffer, "tcp") || g_str_has_prefix(buffer, "udp")) { - __connections = h_strdup_cprintf("%s=%s|%s|%s\n", - __connections, - g_strstrip(buffer + 20), /* local address */ - g_strstrip(buffer), /* protocol */ - g_strstrip(buffer + 44), /* foreign address */ - g_strstrip(buffer + 68)); /* state */ - } - } - - pclose(netstat); - } - - g_free(command_line); - g_free(netstat_path); - } - - SCAN_END(); -} - -gchar *callback_arp() -{ - return g_strdup_printf("[ARP Table]\n" - "%s\n" - "[$ShellParam$]\n" - "ReloadInterval=3000\n" - "ColumnTitle$TextValue=IP Address\n" - "ColumnTitle$Value=Interface\n" - "ColumnTitle$Extra1=MAC Address\n" - "ShowColumnHeaders=true\n", - __arp_table); -} - -gchar *callback_shares() -{ - return g_strdup_printf("[SAMBA]\n" - "%s\n" - "[NFS]\n" - "%s", smb_shares_list, nfs_shares_list); -} - -gchar *callback_dns() -{ - return g_strdup_printf("[Name servers]\n" - "%s\n", __nameservers); -} - -gchar *callback_connections() -{ - return g_strdup_printf("[Connections]\n" - "%s\n" - "[$ShellParam$]\n" - "ReloadInterval=3000\n" - "ColumnTitle$TextValue=Local Address\n" - "ColumnTitle$Value=Protocol\n" - "ColumnTitle$Extra1=Foreign Address\n" - "ColumnTitle$Extra2=State\n" - "ShowColumnHeaders=true\n", - __connections); -} - -gchar *callback_network() -{ - return g_strdup_printf("%s\n" - "[$ShellParam$]\n" - "ReloadInterval=3000\n" - "ViewType=1\n" - "ColumnTitle$TextValue=Interface\n" - "ColumnTitle$Value=IP Address\n" - "ColumnTitle$Extra1=Sent\n" - "ColumnTitle$Extra2=Received\n" - "ShowColumnHeaders=true\n" - "%s", - network_interfaces, - network_icons); -} - -gchar *callback_route() -{ - return g_strdup_printf("[IP routing table]\n" - "%s\n" - "[$ShellParam$]\n" - "ViewType=0\n" - "ReloadInterval=3000\n" - "ColumnTitle$TextValue=Destination / Gateway\n" - "ColumnTitle$Value=Interface\n" - "ColumnTitle$Extra1=Flags\n" - "ColumnTitle$Extra2=Mask\n" - "ShowColumnHeaders=true\n", - __routing_table); -} - -gchar *callback_statistics() -{ - return g_strdup_printf("%s\n" - "[$ShellParam$]\n" - "ReloadInterval=3000\n", - __statistics); -} - -gchar *hi_more_info(gchar * entry) -{ - gchar *info = (gchar *) g_hash_table_lookup(moreinfo, entry); - - if (info) - return g_strdup(info); - - return g_strdup_printf("[%s]", entry); -} - -ModuleEntry *hi_module_get_entries(void) -{ - return entries; -} - -gchar *hi_module_get_name(void) -{ - return g_strdup("Network"); -} - -guchar hi_module_get_weight(void) -{ - return 160; -} - -void hi_module_init(void) -{ - moreinfo = - g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); -} - -ModuleAbout *hi_module_get_about(void) -{ - static ModuleAbout ma[] = { - { - .author = "Leandro A. F. Pereira", - .description = "Gathers information about this computer's network connection", - .version = VERSION, - .license = "GNU GPL version 2"} - }; - - return ma; -} diff --git a/nqueens.c b/nqueens.c deleted file mode 100644 index 838731c4..00000000 --- a/nqueens.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - * N-Queens Problem Solver - * Found somewhere on the Internet; can't remember where. Possibly Wikipedia. - */ -#include -#include -#include - -#define QUEENS 11 - -int row[QUEENS]; - -bool safe(int x, int y) -{ - int i; - for (i = 1; i <= y; i++) - if (row[y - i] == x || row[y - i] == x - i || row[y - i] == x + i) - return false; - return true; -} - -int nqueens(int y) -{ - int x; - - for (x = 0; x < QUEENS; x++) { - if (safe((row[y - 1] = x), y - 1)) { - if (y < QUEENS) { - nqueens(y + 1); - } else { - break; - } - } - } - - return 0; -} diff --git a/nqueens.h b/nqueens.h deleted file mode 100644 index a4be93f0..00000000 --- a/nqueens.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * 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/about-modules.png b/pixmaps/about-modules.png index 0d49f9df..98086442 100644 Binary files a/pixmaps/about-modules.png and b/pixmaps/about-modules.png differ diff --git a/pixmaps/audio.png b/pixmaps/audio.png index 93d99aa4..cc0d9ec5 100644 Binary files a/pixmaps/audio.png and b/pixmaps/audio.png differ diff --git a/pixmaps/battery.png b/pixmaps/battery.png index ad456749..172c2389 100644 Binary files a/pixmaps/battery.png and b/pixmaps/battery.png differ diff --git a/pixmaps/benchmark.png b/pixmaps/benchmark.png index 927681cf..b807f11d 100644 Binary files a/pixmaps/benchmark.png and b/pixmaps/benchmark.png differ diff --git a/pixmaps/blowfish.png b/pixmaps/blowfish.png index 22c68614..54a9ba83 100644 Binary files a/pixmaps/blowfish.png and b/pixmaps/blowfish.png differ diff --git a/pixmaps/bluetooth.png b/pixmaps/bluetooth.png index 7f002131..4621658b 100644 Binary files a/pixmaps/bluetooth.png and b/pixmaps/bluetooth.png differ diff --git a/pixmaps/boot.png b/pixmaps/boot.png index aef0e91a..1151e48d 100644 Binary files a/pixmaps/boot.png and b/pixmaps/boot.png differ diff --git a/pixmaps/cdrom.png b/pixmaps/cdrom.png index af2c8261..52a23974 100644 Binary files a/pixmaps/cdrom.png and b/pixmaps/cdrom.png differ diff --git a/pixmaps/close.png b/pixmaps/close.png index 9b43c0a7..7d702c5b 100644 Binary files a/pixmaps/close.png and b/pixmaps/close.png differ diff --git a/pixmaps/compress.png b/pixmaps/compress.png index e5dee194..1c4530ba 100644 Binary files a/pixmaps/compress.png and b/pixmaps/compress.png differ diff --git a/pixmaps/computer.png b/pixmaps/computer.png index 8b3716cf..b00cb150 100644 Binary files a/pixmaps/computer.png and b/pixmaps/computer.png differ diff --git a/pixmaps/cryptohash.png b/pixmaps/cryptohash.png index e2eb5d29..b62f29ed 100644 Binary files a/pixmaps/cryptohash.png and b/pixmaps/cryptohash.png differ diff --git a/pixmaps/dev_removable.png b/pixmaps/dev_removable.png index f4873104..d6c91e49 100644 Binary files a/pixmaps/dev_removable.png and b/pixmaps/dev_removable.png differ diff --git a/pixmaps/devel.png b/pixmaps/devel.png new file mode 100644 index 00000000..8aeebd6e Binary files /dev/null and b/pixmaps/devel.png differ diff --git a/pixmaps/devices.png b/pixmaps/devices.png index 8ea7357b..c21504c6 100644 Binary files a/pixmaps/devices.png and b/pixmaps/devices.png differ diff --git a/pixmaps/dialog-information.png b/pixmaps/dialog-information.png index 07cf0102..83b69935 100644 Binary files a/pixmaps/dialog-information.png and b/pixmaps/dialog-information.png differ diff --git a/pixmaps/dialog-warning.png b/pixmaps/dialog-warning.png index 45b64a79..d5c4be43 100644 Binary files a/pixmaps/dialog-warning.png and b/pixmaps/dialog-warning.png differ diff --git a/pixmaps/dns.png b/pixmaps/dns.png index d4bfb82b..44dbb3fb 100644 Binary files a/pixmaps/dns.png and b/pixmaps/dns.png differ diff --git a/pixmaps/environment.png b/pixmaps/environment.png index ceb0fb99..2f580752 100644 Binary files a/pixmaps/environment.png and b/pixmaps/environment.png differ diff --git a/pixmaps/face-grin.png b/pixmaps/face-grin.png index d15cf2d4..cc45e7cf 100644 Binary files a/pixmaps/face-grin.png and b/pixmaps/face-grin.png differ diff --git a/pixmaps/fft.png b/pixmaps/fft.png index 3a44038c..ed16da14 100644 Binary files a/pixmaps/fft.png and b/pixmaps/fft.png differ diff --git a/pixmaps/hdd.png b/pixmaps/hdd.png index da413059..d0350343 100644 Binary files a/pixmaps/hdd.png and b/pixmaps/hdd.png differ diff --git a/pixmaps/home.png b/pixmaps/home.png new file mode 100644 index 00000000..74a83d04 Binary files /dev/null and b/pixmaps/home.png differ diff --git a/pixmaps/inputdevices.png b/pixmaps/inputdevices.png index 985bcde5..aea0f1d7 100644 Binary files a/pixmaps/inputdevices.png and b/pixmaps/inputdevices.png differ diff --git a/pixmaps/internet.png b/pixmaps/internet.png index a5889683..ca76ef6c 100644 Binary files a/pixmaps/internet.png and b/pixmaps/internet.png differ diff --git a/pixmaps/joystick.png b/pixmaps/joystick.png index 18f77392..368b1793 100644 Binary files a/pixmaps/joystick.png and b/pixmaps/joystick.png differ diff --git a/pixmaps/keyboard.png b/pixmaps/keyboard.png index 4a63e535..9d0eecf6 100644 Binary files a/pixmaps/keyboard.png and b/pixmaps/keyboard.png differ diff --git a/pixmaps/logo.png b/pixmaps/logo.png index 48d49419..9d0484a5 100644 Binary files a/pixmaps/logo.png and b/pixmaps/logo.png differ diff --git a/pixmaps/memory.png b/pixmaps/memory.png index 16a45b9f..25ffba99 100644 Binary files a/pixmaps/memory.png and b/pixmaps/memory.png differ diff --git a/pixmaps/modem.png b/pixmaps/modem.png index 8d1ea2b0..450e4039 100644 Binary files a/pixmaps/modem.png and b/pixmaps/modem.png differ diff --git a/pixmaps/module.png b/pixmaps/module.png index 2bb2adfc..7c389a20 100644 Binary files a/pixmaps/module.png and b/pixmaps/module.png differ diff --git a/pixmaps/monitor.png b/pixmaps/monitor.png index 58fc213e..fbe38d64 100644 Binary files a/pixmaps/monitor.png and b/pixmaps/monitor.png differ diff --git a/pixmaps/mouse.png b/pixmaps/mouse.png index c1bbc79d..8baa74dc 100644 Binary files a/pixmaps/mouse.png and b/pixmaps/mouse.png differ diff --git a/pixmaps/nautilus.png b/pixmaps/nautilus.png index 945d4d74..2eac9171 100644 Binary files a/pixmaps/nautilus.png and b/pixmaps/nautilus.png differ diff --git a/pixmaps/network-connections.png b/pixmaps/network-connections.png index 883a003b..0e9124a7 100644 Binary files a/pixmaps/network-connections.png and b/pixmaps/network-connections.png differ diff --git a/pixmaps/network-interface.png b/pixmaps/network-interface.png index 51c8b16f..0a765eb4 100644 Binary files a/pixmaps/network-interface.png and b/pixmaps/network-interface.png differ diff --git a/pixmaps/network-statistics.png b/pixmaps/network-statistics.png index 18a118a2..e9c6a8be 100644 Binary files a/pixmaps/network-statistics.png and b/pixmaps/network-statistics.png differ diff --git a/pixmaps/network.png b/pixmaps/network.png index caebd989..5f95ba3e 100644 Binary files a/pixmaps/network.png and b/pixmaps/network.png differ diff --git a/pixmaps/nqueens.png b/pixmaps/nqueens.png index 17499732..e33e857d 100644 Binary files a/pixmaps/nqueens.png and b/pixmaps/nqueens.png differ diff --git a/pixmaps/os.png b/pixmaps/os.png index 4decc893..2c07199b 100644 Binary files a/pixmaps/os.png and b/pixmaps/os.png differ diff --git a/pixmaps/printer.png b/pixmaps/printer.png index 3c3aa974..20861df9 100644 Binary files a/pixmaps/printer.png and b/pixmaps/printer.png differ diff --git a/pixmaps/processor.png b/pixmaps/processor.png index 7b2a3fb1..b5dfa01f 100644 Binary files a/pixmaps/processor.png and b/pixmaps/processor.png differ diff --git a/pixmaps/raytrace.png b/pixmaps/raytrace.png index 60bfc64a..9340a293 100644 Binary files a/pixmaps/raytrace.png and b/pixmaps/raytrace.png differ diff --git a/pixmaps/report-large.png b/pixmaps/report-large.png index 694c9211..d2dcafba 100644 Binary files a/pixmaps/report-large.png and b/pixmaps/report-large.png differ diff --git a/pixmaps/report.png b/pixmaps/report.png index dc566f59..40d5fc8a 100644 Binary files a/pixmaps/report.png and b/pixmaps/report.png differ diff --git a/pixmaps/resources.png b/pixmaps/resources.png index 308acb27..c23587bb 100644 Binary files a/pixmaps/resources.png and b/pixmaps/resources.png differ diff --git a/pixmaps/server-large.png b/pixmaps/server-large.png new file mode 100644 index 00000000..98799715 Binary files /dev/null and b/pixmaps/server-large.png differ diff --git a/pixmaps/server.png b/pixmaps/server.png new file mode 100644 index 00000000..3f7b69b7 Binary files /dev/null and b/pixmaps/server.png differ diff --git a/pixmaps/shares.png b/pixmaps/shares.png index 91ccf9b7..a05befe5 100644 Binary files a/pixmaps/shares.png and b/pixmaps/shares.png differ diff --git a/pixmaps/status-curr.png b/pixmaps/status-curr.png deleted file mode 100644 index 1ee5a29e..00000000 Binary files a/pixmaps/status-curr.png and /dev/null differ diff --git a/pixmaps/status-done.png b/pixmaps/status-done.png deleted file mode 100644 index fa39fd70..00000000 Binary files a/pixmaps/status-done.png and /dev/null differ diff --git a/pixmaps/summary.png b/pixmaps/summary.png index b66871a9..8451f99e 100644 Binary files a/pixmaps/summary.png and b/pixmaps/summary.png differ diff --git a/pixmaps/syncmanager-small.png b/pixmaps/syncmanager-small.png index 58f19c68..2a522619 100644 Binary files a/pixmaps/syncmanager-small.png and b/pixmaps/syncmanager-small.png differ diff --git a/pixmaps/syncmanager.png b/pixmaps/syncmanager.png index 9f019ac5..46da6412 100644 Binary files a/pixmaps/syncmanager.png and b/pixmaps/syncmanager.png differ diff --git a/pixmaps/therm.png b/pixmaps/therm.png index 73f80da6..8db7a2cc 100644 Binary files a/pixmaps/therm.png and b/pixmaps/therm.png differ diff --git a/pixmaps/usb.png b/pixmaps/usb.png index af28b288..d35176a4 100644 Binary files a/pixmaps/usb.png and b/pixmaps/usb.png differ diff --git a/pixmaps/users.png b/pixmaps/users.png index bced28cf..bf3cabb1 100644 Binary files a/pixmaps/users.png and b/pixmaps/users.png differ diff --git a/pixmaps/wireless.png b/pixmaps/wireless.png index 2d7851fa..c5a5bf92 100644 Binary files a/pixmaps/wireless.png and b/pixmaps/wireless.png differ diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt new file mode 100644 index 00000000..95dbdfea --- /dev/null +++ b/po/CMakeLists.txt @@ -0,0 +1,3 @@ +include(Translations) +add_translations_directory("hardinfo") +add_translations_catalog("hardinfo" ../shell/ ../modules/ ../hardinfo/ ../remote/ ../help-viewer/ ) \ No newline at end of file diff --git a/po/HOWTO.txt b/po/HOWTO.txt new file mode 100644 index 00000000..6773d6ea --- /dev/null +++ b/po/HOWTO.txt @@ -0,0 +1,2 @@ +update .pot : make pot in build/ +update .po files after .pot update : ? diff --git a/po/de.po b/po/de.po new file mode 100644 index 00000000..a74622ea --- /dev/null +++ b/po/de.po @@ -0,0 +1,1707 @@ +# German translations for PACKAGE package +# German translation for PACKAGE. +# Copyright (C) 2016 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Alexander Münch , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-10 10:11+0200\n" +"PO-Revision-Date: 2016-06-10 12:11+0200\n" +"Last-Translator: Alexander Münch \n" +"Language-Team: German\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.8.7.1\n" + +#: shell//callbacks.c:71 +#, c-format +msgid "Remote: %s" +msgstr "" + +#: shell//callbacks.c:117 +msgid "Disconnecting..." +msgstr "" + +#: shell//callbacks.c:120 +msgid "Unloading modules..." +msgstr "" + +#: shell//callbacks.c:123 +msgid "Loading local modules..." +msgstr "" + +#: shell//callbacks.c:130 shell//callbacks.c:162 shell//shell.c:314 +#: shell//shell.c:816 shell//shell.c:1800 modules//benchmark.c:431 +#: modules//benchmark.c:439 hardinfo//util.c:1112 +msgid "Done." +msgstr "Fertig." + +#: shell//callbacks.c:142 +msgid "Save Image" +msgstr "" + +#: shell//callbacks.c:158 +msgid "Saving image..." +msgstr "" + +#: shell//callbacks.c:236 +msgid "No context help available." +msgstr "" + +#: shell//callbacks.c:318 +#, c-format +msgid "%s Module" +msgstr "" + +#: shell//callbacks.c:325 +#, c-format +msgid "" +"Written by %s\n" +"Licensed under %s" +msgstr "" +"Programmiert von %s\n" +"Lizenziert unter %s" + +#: shell//callbacks.c:339 +#, c-format +msgid "No about information is associated with the %s module." +msgstr "" + +#: shell//callbacks.c:353 +msgid "Author:" +msgstr "" + +#: shell//callbacks.c:356 +msgid "Contributors:" +msgstr "Mitwirkende:" + +#: shell//callbacks.c:360 +msgid "Based on work by:" +msgstr "" + +#: shell//callbacks.c:361 +msgid "MD5 implementation by Colin Plumb (see md5.c for details)" +msgstr "" + +#: shell//callbacks.c:362 +msgid "SHA1 implementation by Steve Reid (see sha1.c for details)" +msgstr "" + +#: shell//callbacks.c:363 +msgid "Blowfish implementation by Paul Kocher (see blowfich.c for details)" +msgstr "" + +#: shell//callbacks.c:364 +msgid "Raytracing benchmark by John Walker (see fbench.c for details)" +msgstr "" + +#: shell//callbacks.c:365 +msgid "FFT benchmark by Scott Robert Ladd (see fftbench.c for details)" +msgstr "" + +#: shell//callbacks.c:366 +msgid "Some code partly based on x86cpucaps by Osamu Kayasono" +msgstr "" + +#: shell//callbacks.c:367 +msgid "Vendor list based on GtkSysInfo by Pissens Sebastien" +msgstr "" + +#: shell//callbacks.c:368 +msgid "DMI support based on code by Stewart Adam" +msgstr "" + +#: shell//callbacks.c:369 +msgid "SCSI support based on code by Pascal F. Martin" +msgstr "" + +#: shell//callbacks.c:373 +msgid "Jakub Szypulka" +msgstr "Jakub Szypulka" + +#: shell//callbacks.c:374 +msgid "Tango Project" +msgstr "" + +#: shell//callbacks.c:375 +msgid "The GNOME Project" +msgstr "" + +#: shell//callbacks.c:376 +msgid "VMWare, Inc. (USB icon from VMWare Workstation 6)" +msgstr "" + +#: shell//callbacks.c:387 +msgid "System information and benchmark tool" +msgstr "System-Informationen und Benchmark-Werkzeug" + +#: shell//callbacks.c:392 +msgid "" +"HardInfo is free software; you can redistribute it and/or modify it under " +"the terms of the GNU General Public License as published by the Free " +"Software Foundation, version 2.\n" +"\n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +"\n" +"You should have received a copy of the GNU General Public License along with " +"this program; if not, write to the Free Software Foundation, Inc., 51 " +"Franklin St, Fifth Floor, Boston, MA 02110-1301 USA" +msgstr "" + +#: shell//menu.c:35 +msgid "_Information" +msgstr "_Informationen" + +#: shell//menu.c:36 +msgid "_Remote" +msgstr "" + +#: shell//menu.c:37 +msgid "_View" +msgstr "_Ansicht" + +#: shell//menu.c:38 +msgid "_Help" +msgstr "_Hilfe" + +#: shell//menu.c:39 +msgid "About _Modules" +msgstr "Über _Module" + +#: shell//menu.c:43 +msgid "Generate _Report" +msgstr "_Bericht generieren" + +#: shell//menu.c:48 +msgid "_Network Updater..." +msgstr "_Netzwerk-Updater…" + +#: shell//menu.c:53 +msgid "_Open..." +msgstr "" + +#: shell//menu.c:58 +msgid "_Connect to..." +msgstr "" + +#: shell//menu.c:63 +msgid "_Manage hosts..." +msgstr "" + +#: shell//menu.c:68 +msgid "_Local computer" +msgstr "" + +#: shell//menu.c:73 +msgid "_Copy to Clipboard" +msgstr "In die Zwischenablage _kopieren" + +#: shell//menu.c:74 +msgid "Copy to clipboard" +msgstr "In die Zwischenablage kopieren" + +#: shell//menu.c:78 +msgid "_Save image as..." +msgstr "" + +#: shell//menu.c:83 +msgid "_Refresh" +msgstr "_Aktualisieren" + +#: shell//menu.c:88 +msgid "Contents" +msgstr "Inhalt" + +#: shell//menu.c:93 shell//shell.c:1794 shell//shell.c:1811 +msgid "Context help" +msgstr "Kontexthilfe" + +#: shell//menu.c:98 +msgid "_Open HardInfo Web Site" +msgstr "HardInfo-_Webseite öffnen" + +#: shell//menu.c:103 +msgid "_Report bug" +msgstr "Fehler _melden" + +#: shell//menu.c:108 +msgid "_Donate to the project" +msgstr "_Spende zum Projekt" + +#: shell//menu.c:113 +msgid "_About HardInfo" +msgstr "_Über HardInfo" + +#: shell//menu.c:114 +msgid "Displays program version information" +msgstr "" + +#: shell//menu.c:118 +msgid "_Quit" +msgstr "_Beenden" + +#: shell//menu.c:125 +msgid "_Side Pane" +msgstr "_Seitenleiste" + +#: shell//menu.c:126 +msgid "Toggles side pane visibility" +msgstr "" + +#: shell//menu.c:129 +msgid "_Toolbar" +msgstr "_Symbolleiste" + +#: shell//menu.c:133 +msgid "_Accept connections" +msgstr "" + +#: shell//report.c:492 +msgid "Save File" +msgstr "Datei speichern" + +#: shell//report.c:616 +msgid "Cannot create ReportContext. Programming bug?" +msgstr "" + +#: shell//report.c:634 +msgid "Open the report with your web browser?" +msgstr "Den Bericht in deinem Webbrowser öffnen?" + +#: shell//report.c:662 +msgid "Generating report..." +msgstr "Generiere Bericht…" + +#: shell//report.c:672 +msgid "Report saved." +msgstr "Bericht gespeichert." + +#: shell//report.c:674 +msgid "Error while creating the report." +msgstr "Fehler beim Erzeugen des Berichts." + +#: shell//report.c:776 +msgid "Generate Report" +msgstr "Bericht generieren" + +#: shell//report.c:793 +msgid "" +"Generate Report\n" +"Please choose the information that you wish to view in your report:" +msgstr "" +"Bericht generieren\n" +"Bitte wähle die Informationen, die du in deinen Bereich einbeziehen möchtest:" + +#: shell//report.c:853 +msgid "Select _None" +msgstr "_Nichts auswählen" + +#: shell//report.c:860 +msgid "Select _All" +msgstr "_Alles auswählen" + +#: shell//report.c:878 +msgid "_Generate" +msgstr "_Generieren" + +#: shell//shell.c:407 +#, c-format +msgid "%s - System Information" +msgstr "%s - System-Informationen" + +#: shell//shell.c:412 +msgid "System Information" +msgstr "System-Informationen" + +#: shell//shell.c:803 +msgid "Loading modules..." +msgstr "" + +#: shell//shell.c:1654 +#, c-format +msgid "%s → Summary" +msgstr "%s → Zusammenfassung" + +#: shell//shell.c:1762 +msgid "Updating..." +msgstr "Aktualisiere…" + +#: shell//syncmanager.c:69 +msgid "" +"Synchronize with Central Database\n" +"The following information may be synchronized with the HardInfo central " +"database." +msgstr "" +"Synchronisieren mit zentraler Datenbank\n" +"Die folgenden Informationen können mit der zentralen HardInfo-Datenbank " +"synchronisiert werden." + +#: shell//syncmanager.c:72 +msgid "" +"Synchronizing\n" +"This may take some time." +msgstr "" +"Synchronisiere\n" +"Dies kann kurz dauern." + +#: shell//syncmanager.c:132 +msgid "" +"HardInfo was compiled without libsoup support. (Network Updater requires it.)" +msgstr "" + +#: shell//syncmanager.c:161 shell//syncmanager.c:185 +#, c-format +msgid "%s (error #%d)" +msgstr "%s (Fehlercode #%d)" + +#: shell//syncmanager.c:170 shell//syncmanager.c:194 +msgid "Could not parse XML-RPC response" +msgstr "" + +#: shell//syncmanager.c:267 +#, c-format +msgid "" +"Server says it supports API version %d, but this version of HardInfo only " +"supports API version %d." +msgstr "" + +#: shell//syncmanager.c:362 +msgid "Contacting HardInfo Central Database" +msgstr "Kontaktiere zentrale HardInfo-Datenbank" + +#: shell//syncmanager.c:363 +msgid "Cleaning up" +msgstr "Aufräumen" + +#: shell//syncmanager.c:480 +#, c-format +msgid "%s (canceled)" +msgstr "%s (abgebrochen)" + +#: shell//syncmanager.c:497 +#, c-format +msgid "%s (failed)" +msgstr "%s (gescheitert)" + +#: shell//syncmanager.c:509 +#, c-format +msgid "" +"Failed while performing \"%s\". Please file a bug report if this problem " +"persists. (Use the Help→Report bug option.)\n" +"\n" +"Details: %s" +msgstr "" + +#: shell//syncmanager.c:518 +#, c-format +msgid "" +"Failed while performing \"%s\". Please file a bug report if this problem " +"persists. (Use the Help→Report bug option.)" +msgstr "" + +#: shell//syncmanager.c:646 +msgid "Network Updater" +msgstr "Netzwerk-Updater" + +#: shell//syncmanager.c:727 +msgid "_Synchronize" +msgstr "_Synchronisieren" + +#: modules//benchmark.c:50 +msgid "CPU Blowfish" +msgstr "CPU Blowfish" + +#: modules//benchmark.c:51 +msgid "CPU CryptoHash" +msgstr "CPU Crypto-Hash" + +#: modules//benchmark.c:52 +msgid "CPU Fibonacci" +msgstr "CPU Fibonacci" + +#: modules//benchmark.c:53 +msgid "CPU N-Queens" +msgstr "CPU Damenproblem" + +#: modules//benchmark.c:54 +msgid "FPU FFT" +msgstr "FPU FFT" + +#: modules//benchmark.c:55 +msgid "FPU Raytracing" +msgstr "FPU Raytracing" + +#: modules//benchmark.c:56 +msgid "GPU Drawing" +msgstr "GPU Zeichnen" + +#: modules//benchmark.c:222 +#, c-format +msgid "" +"[$ShellParam$]\n" +"Zebra=1\n" +"OrderType=%d\n" +"ViewType=3\n" +"ColumnTitle$Extra1=CPU Clock\n" +"ColumnTitle$Progress=Results\n" +"ColumnTitle$TextValue=CPU\n" +"ShowColumnHeaders=true\n" +"[%s]\n" +"This Machine=%.3f|%s MHz\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"Zebra=1\n" +"OrderType=%d\n" +"ViewType=3\n" +"ColumnTitle$Extra1=CPU-Takt\n" +"ColumnTitle$Progress=Ergebnisse\n" +"ColumnTitle$TextValue=CPU\n" +"ShowColumnHeaders=true\n" +"[%s]\n" +"Diese Maschine=%.3f|%s MHz\n" +"%s" + +#: modules//benchmark.c:235 +#, c-format +msgid "" +"[$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" +"%s" +msgstr "" +"[$ShellParam$]\n" +"Zebra=1\n" +"OrderType=%d\n" +"ViewType=3\n" +"ColumnTitle$Extra1=CPU-Takt\n" +"ColumnTitle$Progress=Ergebnisse\n" +"ColumnTitle$TextValue=CPU\n" +"ShowColumnHeaders=true\n" +"[%s]\n" +"%s" + +#: modules//benchmark.c:363 +#, c-format +msgid "Benchmarking: %s." +msgstr "Benchmarke: %s." + +#: modules//benchmark.c:377 +msgid "Benchmarking. Please do not move your mouse or press any keys." +msgstr "Benchmarke. Bitte bewege den Mauszeiger nicht und drücke keine Tasten." + +#: modules//benchmark.c:381 +msgid "Cancel" +msgstr "Abbrechen" + +#: modules//benchmark.c:511 +msgid "Results in MiB/second. Higher is better." +msgstr "Ergebnisse in MiB/Sekunde. Höhere Werte sind besser." + +#: modules//benchmark.c:514 +msgid "Results in HIMarks. Higher is better." +msgstr "Ergebnisse in HIMarks. Höhere Werte sind besser." + +#: modules//benchmark.c:521 +msgid "Results in seconds. Lower is better." +msgstr "Ergebnisse in Sekunden. Niedrigere Werte sind besser." + +#: modules//benchmark.c:529 +msgid "Benchmarks" +msgstr "Benchmarks" + +#: modules//benchmark.c:547 +msgid "Perform tasks and compare with other systems" +msgstr "Erledigt Aufgaben und vergleicht die Ergebnisse mit anderen Systemen" + +#: modules//benchmark.c:634 +msgid "Send benchmark results" +msgstr "Übermittle Benchmark-Ergebnisse" + +#: modules//benchmark.c:639 +msgid "Receive benchmark results" +msgstr "Lade Benchmark-Ergebnisse" + +#: modules//computer.c:68 +msgid "Summary" +msgstr "Zusammenfassung" + +#: modules//computer.c:69 +msgid "Operating System" +msgstr "Betriebssystem" + +#: modules//computer.c:70 +msgid "Kernel Modules" +msgstr "Kernel-Module" + +#: modules//computer.c:71 +msgid "Boots" +msgstr "Systemstarts" + +#: modules//computer.c:72 +msgid "Languages" +msgstr "Sprachen" + +#: modules//computer.c:73 +msgid "Filesystems" +msgstr "Dateisysteme" + +#: modules//computer.c:74 +msgid "Display" +msgstr "Anzeige" + +#: modules//computer.c:75 +msgid "Environment Variables" +msgstr "Umgebungsvariablen" + +#: modules//computer.c:77 +msgid "Development" +msgstr "Entwicklung" + +#: modules//computer.c:79 +msgid "Users" +msgstr "Benutzer" + +#: modules//computer.c:80 +msgid "Groups" +msgstr "Gruppen" + +#: modules//computer.c:104 +#, c-format +msgid "%dMB (%dMB used)" +msgstr "" + +#: modules//computer.c:200 +msgid "Scripting Languages" +msgstr "Script-Sprachen" + +#: modules//computer.c:201 +msgid "CPython" +msgstr "CPython" + +#: modules//computer.c:202 +msgid "Perl" +msgstr "Perl" + +#: modules//computer.c:203 +msgid "PHP" +msgstr "PHP" + +#: modules//computer.c:204 +msgid "Ruby" +msgstr "Ruby" + +#: modules//computer.c:205 +msgid "Bash" +msgstr "Bash" + +#: modules//computer.c:206 +msgid "Compilers" +msgstr "Compiler" + +#: modules//computer.c:207 +msgid "C (GCC)" +msgstr "C (GCC)" + +#: modules//computer.c:208 +msgid "C (Clang)" +msgstr "C (Clang)" + +#: modules//computer.c:209 +msgid "D (dmd)" +msgstr "D (dmd)" + +#: modules//computer.c:210 +msgid "Java" +msgstr "Java" + +#: modules//computer.c:211 +msgid "CSharp (Mono, old)" +msgstr "CSharp (Mono, old)" + +#: modules//computer.c:212 +msgid "CSharp (Mono)" +msgstr "CSharp (Mono)" + +#: modules//computer.c:213 +msgid "Vala" +msgstr "Vala" + +#: modules//computer.c:214 +msgid "Haskell (GHC)" +msgstr "Haskell (GHC)" + +#: modules//computer.c:215 +msgid "FreePascal" +msgstr "FreePascal" + +#: modules//computer.c:216 +msgid "Tools" +msgstr "Werkzeug-Programme" + +#: modules//computer.c:217 +msgid "make" +msgstr "make" + +#: modules//computer.c:218 +msgid "GDB" +msgstr "GDB" + +#: modules//computer.c:219 +msgid "strace" +msgstr "strace" + +#: modules//computer.c:220 +msgid "valgrind" +msgstr "valgrind" + +#: modules//computer.c:221 +msgid "QMake" +msgstr "QMake" + +#: modules//computer.c:264 +#, c-format +msgid "%s=Not found\n" +msgstr "%s=Nicht gefunden\n" + +#: modules//computer.c:267 +#, c-format +msgid "Detecting version: %s" +msgstr "" + +#: modules//computer.c:278 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Program\n" +"ColumnTitle$Value=Version\n" +"ShowColumnHeaders=true\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Programm\n" +"ColumnTitle$Value=Version\n" +"ShowColumnHeaders=true\n" +"%s" + +#: modules//computer.c:358 +msgid "Physical machine" +msgstr "Physikalische Maschine" + +#: modules//computer.c:375 +#, c-format +msgid "" +"[$ShellParam$]\n" +"UpdateInterval$Memory=1000\n" +"UpdateInterval$Date/Time=1000\n" +"#ReloadInterval=5000\n" +"[Computer]\n" +"Processor=%s\n" +"Memory=...\n" +"Machine Type=%s\n" +"Operating System=%s\n" +"User Name=%s\n" +"Date/Time=...\n" +"[Display]\n" +"Resolution=%dx%d pixels\n" +"OpenGL Renderer=%s\n" +"X11 Vendor=%s\n" +"\n" +"%s\n" +"[Input Devices]\n" +"%s\n" +"\n" +"%s\n" +"\n" +"%s\n" +msgstr "" +"[$ShellParam$]\n" +"UpdateInterval$Memory=1000\n" +"UpdateInterval$Date/Time=1000\n" +"#ReloadInterval=5000\n" +"[Computer]\n" +"Prozessor=%s\n" +"Memory=...\n" +"Maschinen-Typ=%s\n" +"Betriebssystem=%s\n" +"Benutzername=%s\n" +"Date/Time=...\n" +"[Anzeige]\n" +"Auflösung=%dx%d Pixel\n" +"OpenGL-Renderer=%s\n" +"X11-Hersteller=%s\n" +"\n" +"%s\n" +"[Eingabegeräte]\n" +"%s\n" +"\n" +"%s\n" +"\n" +"%s\n" + +#: modules//computer.c:417 +#, fuzzy, c-format +msgid "" +"[$ShellParam$]\n" +"UpdateInterval$Uptime=10000\n" +"UpdateInterval$Load Average=1000\n" +"[Version]\n" +"Kernel=%s\n" +"Version=%s\n" +"C Library=%s\n" +"Distribution=%s\n" +"[Current Session]\n" +"Computer Name=%s\n" +"User Name=%s\n" +"#Language=%s\n" +"Home Directory=%s\n" +"Desktop Environment=%s\n" +"[Misc]\n" +"Uptime=...\n" +"Load Average=..." +msgstr "" +"[$ShellParam$]\n" +"UpdateInterval$Uptime=10000\n" +"UpdateInterval$Load Average=1000\n" +"[Version]\n" +"Kernel=%s\n" +"Version=%s\n" +"C-Library=%s\n" +"Distribution=%s\n" +"[Aktuelle Sitzung]\n" +"Computername=%s\n" +"Benutzername=%s\n" +"#Sprache=%s\n" +"Stammverzeichnis=%s\n" +"Desktop-Umgebung=%s\n" +"[Verschiedenes]\n" +"Uptime=...\n" +"Load Average=..." + +#: modules//computer.c:446 +#, c-format +msgid "" +"[Loaded Modules]\n" +"%s[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Name\n" +"ColumnTitle$Value=Description\n" +"ShowColumnHeaders=true\n" +msgstr "" +"[Geladene Module]\n" +"%s[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Name\n" +"ColumnTitle$Value=Beschreibung\n" +"ShowColumnHeaders=true\n" + +#: modules//computer.c:457 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Date & Time\n" +"ColumnTitle$Value=Kernel Version\n" +"ShowColumnHeaders=true\n" +"\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Datum & Uhrzeit\n" +"ColumnTitle$Value=Kernel-Version\n" +"ShowColumnHeaders=true\n" +"\n" +"%s" + +#: modules//computer.c:467 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Language Code\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" +"[Available Languages]\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Sprach-Code\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" +"[Available Languages]\n" +"%s" + +#: modules//computer.c:478 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ViewType=4\n" +"ReloadInterval=5000\n" +"Zebra=1\n" +"NormalizePercentage=false\n" +"ColumnTitle$Extra1=Mount Point\n" +"ColumnTitle$Progress=Usage\n" +"ColumnTitle$TextValue=Device\n" +"ShowColumnHeaders=true\n" +"[Mounted File Systems]\n" +"%s\n" +msgstr "" +"[$ShellParam$]\n" +"ViewType=4\n" +"ReloadInterval=5000\n" +"Zebra=1\n" +"NormalizePercentage=false\n" +"ColumnTitle$Extra1=Mount-Punkt\n" +"ColumnTitle$Progress=Verwendung\n" +"ColumnTitle$TextValue=Gerät\n" +"ShowColumnHeaders=true\n" +"[Mounted File Systems]\n" +"%s\n" + +#: modules//computer.c:492 +#, c-format +msgid "" +"[Display]\n" +"Resolution=%dx%d pixels\n" +"Vendor=%s\n" +"Version=%s\n" +"[Monitors]\n" +"%s[Extensions]\n" +"%s[OpenGL]\n" +"Vendor=%s\n" +"Renderer=%s\n" +"Version=%s\n" +"Direct Rendering=%s\n" +msgstr "" +"[Anzeige]\n" +"Auflösung=%dx%d Pixel\n" +"Hersteller=%s\n" +"Version=%s\n" +"[Bildschirme]\n" +"%s[Erweiterungen]\n" +"%s[OpenGL]\n" +"Hersteller=%s\n" +"Renderer=%s\n" +"Version=%s\n" +"Direct-Rendering=%s\n" + +#: modules//computer.c:514 +msgid "Y_es" +msgstr "_Ja" + +#: modules//computer.c:514 modules//devices/printers.c:138 +#: hardinfo//hardinfo.c:63 +msgid "No" +msgstr "Nein" + +#: modules//computer.c:528 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ReloadInterval=10000\n" +"ColumnTitle$TextValue=Name\n" +"ColumnTitle$Value=Group ID\n" +"ShowColumnHeaders=true\n" +"[Groups]\n" +"%s\n" +msgstr "" +"[$ShellParam$]\n" +"ReloadInterval=10000\n" +"ColumnTitle$TextValue=Name\n" +"ColumnTitle$Value=Gruppen-ID\n" +"ShowColumnHeaders=true\n" +"[Gruppen]\n" +"%s\n" + +#: modules//computer.c:608 +msgid "Computer" +msgstr "Computer" + +#: modules//computer.c:702 +msgid "Gathers high-level computer information" +msgstr "Sammelt high-level Computer-Informationen" + +#: modules//computer/alsa.c:26 +msgid "[Audio Devices]\n" +msgstr "[Audio-Geräte]\n" + +#: modules//computer/alsa.c:33 +#, c-format +msgid "Audio Adapter#%d=%s\n" +msgstr "" + +#: modules//computer/boots.c:33 +msgid "[Boots]\n" +msgstr "[Systemstarts]\n" + +#: modules//computer/display.c:122 +#, c-format +msgid "Monitor %d=%dx%d pixels\n" +msgstr "Bildschirm %d=%dx%d Pixel\n" + +#: modules//computer/environment.c:32 +msgid "[Environment Variables]\n" +msgstr "[Umgebungsvariablen]\n" + +#: modules//computer/os.c:57 +#, c-format +msgid "GNU C Library version %s (%sstable)" +msgstr "" + +#: modules//computer/os.c:59 +msgid "un" +msgstr "" + +#: modules//computer/os.c:61 modules//computer/os.c:138 modules//devices.c:154 +#: modules//devices.c:197 modules//devices/printers.c:99 +#: modules//devices/printers.c:106 modules//devices/printers.c:116 +#: modules//devices/printers.c:131 modules//devices/printers.c:140 +#: modules//devices/printers.c:243 +msgid "Unknown" +msgstr "" + +#: modules//computer/os.c:80 +#, c-format +msgid "Version: %s" +msgstr "" + +#: modules//computer/os.c:114 +msgid "Terminal" +msgstr "" + +#: modules//computer/os.c:134 +#, c-format +msgid "Unknown (Window Manager: %s)" +msgstr "" + +#: modules//computer/os.c:174 +msgid "Unknown distribution" +msgstr "" + +#: modules//devices.c:74 +msgid "Processor" +msgstr "Prozessor" + +#: modules//devices.c:75 +msgid "Memory" +msgstr "Hauptspeicher" + +#: modules//devices.c:76 +msgid "PCI Devices" +msgstr "PCI-Geräte" + +#: modules//devices.c:77 +msgid "USB Devices" +msgstr "USB-Geräte" + +#: modules//devices.c:78 +msgid "Printers" +msgstr "Drucker" + +#: modules//devices.c:79 +msgid "Battery" +msgstr "Akku" + +#: modules//devices.c:80 +msgid "Sensors" +msgstr "Sensoren" + +#: modules//devices.c:81 +msgid "Input Devices" +msgstr "Eingabegeräte" + +#: modules//devices.c:82 +msgid "Storage" +msgstr "Speicher" + +#: modules//devices.c:84 +msgid "DMI" +msgstr "DMI" + +#: modules//devices.c:85 +msgid "Memory SPD" +msgstr "Hauptspeicher (SPD)" + +#: modules//devices.c:87 +msgid "Resources" +msgstr "Ressourcen" + +#: modules//devices.c:193 +msgid " (vendor unknown)" +msgstr " (unbekannter Hersteller)" + +#: modules//devices.c:195 +msgid " (model unknown)" +msgstr " (unbekanntes Modell)" + +#: modules//devices.c:412 +msgid "Devices" +msgstr "Geräte" + +#: modules//devices.c:424 +msgid "Update PCI ID listing" +msgstr "" + +#: modules//devices.c:436 +msgid "Update CPU feature database" +msgstr "" + +#: modules//devices.c:464 +msgid "Gathers information about hardware devices" +msgstr "Sammelt Informationen über die Hardware-Geräte" + +#: modules//devices/battery.c:181 +#, c-format +msgid "" +"\n" +"[Battery: %s]\n" +"State=%s (load: %s)\n" +"Capacity=%s / %s (%.2f%%)\n" +"Battery Technology=%s (%s)\n" +"Manufacturer=%s\n" +"Model Number=%s\n" +"Serial Number=%s\n" +msgstr "" +"\n" +"[Akku: %s]\n" +"Status=%s (load: %s)\n" +"Kapazität=%s / %s (%.2f%%)\n" +"Akku-Technologie=%s (%s)\n" +"Hersteller=%s\n" +"Modellnummer=%s\n" +"Seriennummer=%s\n" + +#: modules//devices/battery.c:258 +#, c-format +msgid "" +"\n" +"[Battery: %s]\n" +"State=%s\n" +"Capacity=%s / %s\n" +"Battery Technology=%s\n" +"Manufacturer=%s\n" +"Model Number=%s\n" +"Serial Number=%s\n" +msgstr "" +"\n" +"[Akku: %s]\n" +"Status=%s\n" +"Kapazität=%s / %s\n" +"Akku-Technologie=%s\n" +"Hersteller=%s\n" +"Modellnummer=%s\n" +"Seriennummer=%s\n" + +#: modules//devices/battery.c:346 +#, fuzzy, c-format +msgid "" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Remaining Charge=%s of %s\n" +"Using=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" +msgstr "" +"\n" +"[Akku (APM)]\n" +"Ladung=%d%%\n" +"Verbleibende Ladung=%s von %s\n" +"Using=%s\n" +"APM Driver-Version=%s\n" +"APM BIOS-Version=%s\n" + +#: modules//devices/battery.c:358 +#, fuzzy, c-format +msgid "" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Using=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" +msgstr "" +"\n" +"[Akku (APM)]\n" +"Ladung=%d%%\n" +"Using=%s\n" +"APM Driver-Version=%s\n" +"APM BIOS-Version=%s\n" + +#: modules//devices/battery.c:385 +msgid "" +"[No batteries]\n" +"No batteries found on this system=\n" +msgstr "" +"[Keine Akkus]\n" +"Keine Akkus in diesem System gefunden=\n" + +#: modules//devices/printers.c:81 +msgid "⚬ Can do black and white printing=\n" +msgstr "⚬ Kann schwarz/weiß drucken=\n" + +#: modules//devices/printers.c:83 +msgid "⚬ Can do color printing=\n" +msgstr "⚬ Kann farbig drucken=\n" + +#: modules//devices/printers.c:85 +msgid "⚬ Can do duplexing=\n" +msgstr "⚬ Kann zweiseitig drucken (Duplexdruck)=\n" + +#: modules//devices/printers.c:87 +msgid "⚬ Can do staple output=\n" +msgstr "⚬ Kann Ausdrucke stapeln=\n" + +#: modules//devices/printers.c:89 +msgid "⚬ Can do copies=\n" +msgstr "⚬ Kann kopieren=\n" + +#: modules//devices/printers.c:91 +msgid "⚬ Can collate copies=\n" +msgstr "⚬ Kann Ausdruck sortieren=\n" + +#: modules//devices/printers.c:93 +msgid "⚬ Printer is rejecting jobs=\n" +msgstr "⚬ Drucker weist Aufträge zurück=\n" + +#: modules//devices/printers.c:95 +msgid "⚬ Printer was automatically discovered and added=\n" +msgstr "⚬ Drucker wurde automatisch entdeckt und hinzugefügt=\n" + +#: modules//devices/printers.c:110 +msgid "Idle" +msgstr "" + +#: modules//devices/printers.c:112 +msgid "Printing a Job" +msgstr "" + +#: modules//devices/printers.c:114 +msgid "Stopped" +msgstr "" + +#: modules//devices/printers.c:138 hardinfo//hardinfo.c:62 +#: hardinfo//hardinfo.c:63 +msgid "Yes" +msgstr "Ja" + +#: modules//devices/printers.c:190 +msgid "" +"[Printers]\n" +"No suitable CUPS library found=" +msgstr "" +"[Drucker]\n" +"Keine passende CUPS-Bibliothek gefunden=" + +#: modules//devices/printers.c:200 +msgid "[Printers (CUPS)]\n" +msgstr "[Drucker (CUPS)]\n" + +#: modules//devices/printers.c:263 +msgid "" +"[Printers]\n" +"No printers found=\n" +msgstr "" +"[Printers]\n" +"Keine Drucker gefunden=\n" + +#: modules//devices/storage.c:46 +msgid "" +"\n" +"[SCSI Disks]\n" +msgstr "" +"\n" +"[SCSI-Geräte]\n" + +#: modules//devices/storage.c:110 modules//devices/storage.c:297 +#, c-format +msgid "" +"[Device Information]\n" +"Model=%s\n" +msgstr "" +"[Geräte-Informationen]\n" +"Modell=%s\n" + +#: modules//devices/storage.c:115 modules//devices/storage.c:304 +#, c-format +msgid "Vendor=%s (%s)\n" +msgstr "Hersteller=%s (%s)\n" + +#: modules//devices/storage.c:120 modules//devices/storage.c:309 +#, c-format +msgid "Vendor=%s\n" +msgstr "Hersteller=%s\n" + +#: modules//devices/storage.c:125 +#, c-format +msgid "" +"Type=%s\n" +"Revision=%s\n" +"[SCSI Controller]\n" +"Controller=scsi%d\n" +"Channel=%d\n" +"ID=%d\n" +"LUN=%d\n" +msgstr "" + +#: modules//devices/storage.c:169 +msgid "" +"\n" +"[IDE Disks]\n" +msgstr "" +"\n" +"[IDE-Geräte]\n" + +#: modules//devices/storage.c:242 +#, c-format +msgid "Driver=%s\n" +msgstr "Treiber=%s\n" + +#: modules//devices/storage.c:314 +#, c-format +msgid "" +"Device Name=hd%c\n" +"Media=%s\n" +"Cache=%dkb\n" +msgstr "" + +#: modules//devices/storage.c:329 +#, c-format +msgid "" +"[Geometry]\n" +"Physical=%s\n" +"Logical=%s\n" +msgstr "" +"[Geometrie]\n" +"Physikalisch=%s\n" +"Logisch=%s\n" + +#: modules//devices/storage.c:341 +#, c-format +msgid "" +"[Capabilities]\n" +"%s" +msgstr "" +"[Fähigkeiten]\n" +"%s" + +#: modules//devices/storage.c:348 +#, c-format +msgid "" +"[Speeds]\n" +"%s" +msgstr "" +"[Geschwindigkeiten]\n" +"%s" + +#: modules//devices/x86/processor.c:145 modules//devices/x86_64/processor.c:145 +msgid "Cache information not available=\n" +msgstr "" + +#: modules//devices/x86/processor.c:484 modules//devices/x86_64/processor.c:484 +#, c-format +msgid "" +"[Processor]\n" +"Name=%s\n" +"Family, model, stepping=%d, %d, %d (%s)\n" +"Vendor=%s\n" +"[Configuration]\n" +"Cache Size=%dkb\n" +"Frequency=%.2fMHz\n" +"BogoMIPS=%.2f\n" +"Byte Order=%s\n" +"[Features]\n" +"FDIV Bug=%s\n" +"HLT Bug=%s\n" +"F00F Bug=%s\n" +"Coma Bug=%s\n" +"Has FPU=%s\n" +"[Cache]\n" +"%s\n" +"[Capabilities]\n" +"%s" +msgstr "" +"[Prozessor]\n" +"Name=%s\n" +"Familie, Modell, Stufung=%d, %d, %d (%s)\n" +"Hersteller=%s\n" +"[Konfiguration]\n" +"Cache-Größe=%dkb\n" +"Taktfrequenz=%.2fMHz\n" +"BogoMIPS=%.2f\n" +"Byte-Reihenfolge=%s\n" +"[Funktionen]\n" +"FDIV-Bug=%s\n" +"HLT-Bug=%s\n" +"F00F-Bug=%s\n" +"Coma-Bug=%s\n" +"Hat FPU=%s\n" +"[Cache]\n" +"%s\n" +"[Fähigkeiten]\n" +"%s" + +#: modules//devices/x86/processor.c:542 modules//devices/x86_64/processor.c:542 +#, c-format +msgid "%s$CPU%d$%s=%.2fMHz\n" +msgstr "%s$CPU%d$%s=%.2fMHz\n" + +#: modules//network.c:59 +msgid "Interfaces" +msgstr "Schnittstellen" + +#: modules//network.c:60 +msgid "IP Connections" +msgstr "IP-Verbindungen" + +#: modules//network.c:61 +msgid "Routing Table" +msgstr "Routing-Tabelle" + +#: modules//network.c:62 +msgid "ARP Table" +msgstr "ARP-Tabelle" + +#: modules//network.c:63 +msgid "DNS Servers" +msgstr "DNS-Server" + +#: modules//network.c:64 +msgid "Statistics" +msgstr "Statistiken" + +#: modules//network.c:65 +msgid "Shared Directories" +msgstr "Freigegebene Verzeichnisse" + +#: modules//network.c:300 +#, c-format +msgid "" +"[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" +msgstr "" +"[ARP Table]\n" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ColumnTitle$TextValue=IP-Adresse\n" +"ColumnTitle$Value=Schnittstelle\n" +"ColumnTitle$Extra1=MAC-Adresse\n" +"ShowColumnHeaders=true\n" + +#: modules//network.c:321 +#, c-format +msgid "" +"[Name servers]\n" +"%s\n" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=IP Address\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" +msgstr "" +"[DNS-Server]\n" +"%s\n" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=IP-Adresse\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" + +#: modules//network.c:331 +#, c-format +msgid "" +"[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" +msgstr "" +"[Connections]\n" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ColumnTitle$TextValue=Lokale Adresse\n" +"ColumnTitle$Value=Protokoll\n" +"ColumnTitle$Extra1=Fremde Adresse\n" +"ColumnTitle$Extra2=Status\n" +"ShowColumnHeaders=true\n" + +#: modules//network.c:345 +#, c-format +msgid "" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Interface\n" +"ColumnTitle$Value=IP Address\n" +"ColumnTitle$Extra1=Sent\n" +"ColumnTitle$Extra2=Received\n" +"ShowColumnHeaders=true\n" +"%s" +msgstr "" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Schnittstelle\n" +"ColumnTitle$Value=IP-Adresse\n" +"ColumnTitle$Extra1=Gesendet\n" +"ColumnTitle$Extra2=Empfangen\n" +"ShowColumnHeaders=true\n" +"%s" + +#: modules//network.c:361 +#, c-format +msgid "" +"[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" +msgstr "" +"[IP routing table]\n" +"%s\n" +"[$ShellParam$]\n" +"ViewType=0\n" +"ReloadInterval=3000\n" +"ColumnTitle$TextValue=Ziel / Vorgaberoute\n" +"ColumnTitle$Value=Schnittstelle\n" +"ColumnTitle$Extra1=Flags\n" +"ColumnTitle$Extra2=Netz-Maske\n" +"ShowColumnHeaders=true\n" + +#: modules//network.c:399 +msgid "Network" +msgstr "Netzwerk" + +#: modules//network.c:432 +msgid "Gathers information about this computer's network connection" +msgstr "Sammelt Informationen über die Netzwerk-Verbindung dieses Computers" + +#: hardinfo//hardinfo.c:54 +msgid "" +"Copyright (C) 2003-2009 Leandro A. F. Pereira. See COPYING for details.\n" +"\n" +msgstr "" + +#: hardinfo//hardinfo.c:56 +#, c-format +msgid "" +"Compile-time options:\n" +" Release version: %s (%s)\n" +" BinReloc enabled: %s\n" +" Data prefix: %s\n" +" Library prefix: %s\n" +" Compiled on: %s %s (%s)\n" +msgstr "" + +#: hardinfo//hardinfo.c:74 +#, c-format +msgid "" +"Failed to find runtime data.\n" +"\n" +"• Is HardInfo correctly installed?\n" +"• See if %s and %s exists and you have read permision." +msgstr "" + +#: hardinfo//hardinfo.c:81 +#, c-format +msgid "" +"Modules:\n" +"%-20s%-15s%-12s\n" +msgstr "" + +#: hardinfo//hardinfo.c:82 +msgid "File Name" +msgstr "" + +#: hardinfo//hardinfo.c:82 +msgid "Name" +msgstr "Name" + +#: hardinfo//hardinfo.c:82 +msgid "Version" +msgstr "" + +#: hardinfo//hardinfo.c:135 +#, c-format +msgid "Unknown benchmark ``%s'' or libbenchmark.so not loaded" +msgstr "" + +#: hardinfo//hardinfo.c:163 +msgid "Don't know what to do. Exiting." +msgstr "" + +#: hardinfo//util.c:104 hardinfo//util.c:107 hardinfo//util.c:112 +#, c-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d Minute" +msgstr[1] "%d Minuten" + +#: hardinfo//util.c:106 +#, c-format +msgid "%d hour, " +msgid_plural "%d hours, " +msgstr[0] "%d Stunde, " +msgstr[1] "%d Stunden, " + +#: hardinfo//util.c:110 +#, c-format +msgid "%d day, " +msgid_plural "%d days, " +msgstr[0] "%d Tag, " +msgstr[1] "%d Tage, " + +#: hardinfo//util.c:111 +#, c-format +msgid "%d hour and " +msgid_plural "%d hours and " +msgstr[0] "%d Stunde und " +msgstr[1] "%d Stunden und " + +#: hardinfo//util.c:118 +#, c-format +msgid "%.1f B" +msgstr "%.1f Byte(s)" + +#: hardinfo//util.c:120 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: hardinfo//util.c:122 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: hardinfo//util.c:124 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: hardinfo//util.c:126 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: hardinfo//util.c:128 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: hardinfo//util.c:342 +msgid "Error" +msgstr "Fehler" + +#: hardinfo//util.c:342 hardinfo//util.c:358 +msgid "Warning" +msgstr "Warnung" + +#: hardinfo//util.c:357 +msgid "Fatal Error" +msgstr "Kritischer Fehler" + +#: hardinfo//util.c:382 +msgid "creates a report and prints to standard output" +msgstr "" + +#: hardinfo//util.c:388 +msgid "chooses a report format (text, html)" +msgstr "" + +#: hardinfo//util.c:394 +msgid "run benchmark; requires benchmark.so to be loaded" +msgstr "" + +#: hardinfo//util.c:400 +msgid "lists modules" +msgstr "" + +#: hardinfo//util.c:406 +msgid "specify module to load" +msgstr "" + +#: hardinfo//util.c:412 +msgid "automatically load module dependencies" +msgstr "" + +#: hardinfo//util.c:419 +msgid "run in XML-RPC server mode" +msgstr "" + +#: hardinfo//util.c:426 +msgid "shows program version and quit" +msgstr "" + +#: hardinfo//util.c:431 +msgid "- System Profiler and Benchmark tool" +msgstr "- System-Profiler und Benchmark-Werkzeug" + +#: hardinfo//util.c:441 +#, c-format +msgid "" +"Unrecognized arguments.\n" +"Try ``%s --help'' for more information.\n" +msgstr "" + +#: hardinfo//util.c:507 +#, c-format +msgid "Couldn't find a Web browser to open URL %s." +msgstr "Konnte keinen Web-Browser finden, um die URL %s zu öffnen." + +#: hardinfo//util.c:854 +#, c-format +msgid "Module \"%s\" depends on module \"%s\", load it?" +msgstr "" + +#: hardinfo//util.c:877 +#, c-format +msgid "Module \"%s\" depends on module \"%s\"." +msgstr "" + +#: hardinfo//util.c:922 +#, c-format +msgid "No module could be loaded. Check permissions on \"%s\" and try again." +msgstr "" + +#: hardinfo//util.c:926 +msgid "" +"No module could be loaded. Please use hardinfo -l to list all available " +"modules and try again with a valid module list." +msgstr "" + +#: hardinfo//util.c:1102 +#, c-format +msgid "Scanning: %s..." +msgstr "" diff --git a/po/es.po b/po/es.po new file mode 100644 index 00000000..4ba67e7a --- /dev/null +++ b/po/es.po @@ -0,0 +1,1676 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: hardinfo\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-01-05 17:29+0100\n" +"PO-Revision-Date: 2013-02-18 17:11-0300\n" +"Last-Translator: Fernando López \n" +"Language-Team: Fernando López \n" +"Language: Spanish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Spanish\n" + +#: shell//report.c:492 +msgid "Save File" +msgstr "Guardar archivo" + +#: shell//report.c:616 +msgid "Cannot create ReportContext. Programming bug?" +msgstr "No se puede crear ReportContext. ¿Error del programa?" + +#: shell//report.c:634 +msgid "Open the report with your web browser?" +msgstr "¿Abrir el reporte en el navegador web?" + +#: shell//report.c:662 +msgid "Generating report..." +msgstr "Generando reporte..." + +#: shell//report.c:672 +msgid "Report saved." +msgstr "Reporte guardado." + +#: shell//report.c:674 +msgid "Error while creating the report." +msgstr "Error creando el reporte." + +#: shell//report.c:776 +msgid "Generate Report" +msgstr "Generar reporte" + +#: shell//report.c:793 +msgid "" +"Generate Report\n" +"Please choose the information that you wish to view in your report:" +msgstr "" +"Generar reporte\n" +"Por favor elija la información que desea ver en el reporte:" + +#: shell//report.c:853 +msgid "Select _None" +msgstr "_Deseleccionar todo" + +#: shell//report.c:860 +msgid "Select _All" +msgstr "_Seleccionar todo" + +#: shell//report.c:878 +msgid "_Generate" +msgstr "_Generar" + +#: shell//menu.c:35 +msgid "_Information" +msgstr "_Información" + +#: shell//menu.c:36 +msgid "_Remote" +msgstr "_Remoto" + +#: shell//menu.c:37 +msgid "_View" +msgstr "_Ver" + +#: shell//menu.c:38 +msgid "_Help" +msgstr "_Ayuda" + +#: shell//menu.c:39 +msgid "About _Modules" +msgstr "Acerca de los _módulos" + +#: shell//menu.c:43 +msgid "Generate _Report" +msgstr "Generar _reporte" + +#: shell//menu.c:48 +msgid "_Network Updater..." +msgstr "_Actualizador por red..." + +#: shell//menu.c:53 +msgid "_Open..." +msgstr "_Abrir..." + +#: shell//menu.c:58 +msgid "_Connect to..." +msgstr "_Conectar a..." + +#: shell//menu.c:63 +msgid "_Manage hosts..." +msgstr "_Configurar hosts..." + +#: shell//menu.c:68 +msgid "_Local computer" +msgstr "_Equipo local" + +#: shell//menu.c:73 +msgid "_Copy to Clipboard" +msgstr "_Copiar al portapapeles" + +#: shell//menu.c:74 +msgid "Copy to clipboard" +msgstr "Copiar al portapapeles" + +#: shell//menu.c:78 +msgid "_Save image as..." +msgstr "_Guardar imagen como..." + +#: shell//menu.c:83 +msgid "_Refresh" +msgstr "_Refrescar" + +#: shell//menu.c:88 +msgid "Contents" +msgstr "Contenidos" + +#: shell//menu.c:93 +#: shell//shell.c:1790 +#: shell//shell.c:1807 +msgid "Context help" +msgstr "Ayuda contextual" + +#: shell//menu.c:98 +msgid "_Open HardInfo Web Site" +msgstr "_Abrir sitio web de Hardinfo" + +#: shell//menu.c:103 +msgid "_Report bug" +msgstr "_Reportar un error" + +#: shell//menu.c:108 +msgid "_Donate to the project" +msgstr "_Donar al proyecto" + +#: shell//menu.c:113 +msgid "_About HardInfo" +msgstr "_Acerca de Hardinfo" + +#: shell//menu.c:114 +msgid "Displays program version information" +msgstr "Muestra la información de versión del programa" + +#: shell//menu.c:118 +msgid "_Quit" +msgstr "_Salir" + +#: shell//menu.c:125 +msgid "_Side Pane" +msgstr "_Panel lateral" + +#: shell//menu.c:126 +msgid "Toggles side pane visibility" +msgstr "Cambia la visibilidad del panel lateral" + +#: shell//menu.c:129 +msgid "_Toolbar" +msgstr "_Barra de herramientas" + +#: shell//menu.c:133 +msgid "_Accept connections" +msgstr "_Aceptar conexiones" + +#: shell//callbacks.c:71 +#, c-format +msgid "Remote: %s" +msgstr "Remoto: %s" + +#: shell//callbacks.c:117 +msgid "Disconnecting..." +msgstr "Desconectando..." + +#: shell//callbacks.c:120 +msgid "Unloading modules..." +msgstr "Descargando módulos..." + +#: shell//callbacks.c:123 +msgid "Loading local modules..." +msgstr "Cargando módulos locales..." + +#: shell//callbacks.c:130 +#: shell//callbacks.c:162 +#: shell//shell.c:314 +#: shell//shell.c:814 +#: shell//shell.c:1796 +#: modules//benchmark.c:431 +#: modules//benchmark.c:439 +#: hardinfo//util.c:1106 +msgid "Done." +msgstr "Hecho." + +#: shell//callbacks.c:142 +msgid "Save Image" +msgstr "Guardar imagen" + +#: shell//callbacks.c:158 +msgid "Saving image..." +msgstr "Guardando imagen" + +#: shell//callbacks.c:236 +msgid "No context help available." +msgstr "No hay ayuda contextual disponible" + +#: shell//callbacks.c:318 +#, c-format +msgid "%s Module" +msgstr "%s módulo" + +#: shell//callbacks.c:325 +#, c-format +msgid "" +"Written by %s\n" +"Licensed under %s" +msgstr "" +"Escrito por %s\n" +"Licencia %s" + +#: shell//callbacks.c:339 +#, c-format +msgid "No about information is associated with the %s module." +msgstr "No hay información \"acerca de\" asociada al módulo %s." + +#: shell//callbacks.c:353 +msgid "Author:" +msgstr "Autor:" + +#: shell//callbacks.c:356 +msgid "Contributors:" +msgstr "Contribuyentes:" + +#: shell//callbacks.c:360 +msgid "Based on work by:" +msgstr "Basado en el trabajo de:" + +#: shell//callbacks.c:361 +msgid "MD5 implementation by Colin Plumb (see md5.c for details)" +msgstr "Implementación de MD5 por Colin Plumb (ver md5.c para detalles)" + +#: shell//callbacks.c:362 +msgid "SHA1 implementation by Steve Reid (see sha1.c for details)" +msgstr "Implementación de SHA1 por Steve Reid (ver sha1.c para detalles)" + +#: shell//callbacks.c:363 +msgid "Blowfish implementation by Paul Kocher (see blowfich.c for details)" +msgstr "" +"Implementación de Blowfish por Paul Kocher (ver blowfich.c para detalles)" + +#: shell//callbacks.c:364 +msgid "Raytracing benchmark by John Walker (see fbench.c for details)" +msgstr "" +"Benchmark de trazado de rayos por John Walker (ver fbench.c para detalles)" + +#: shell//callbacks.c:365 +msgid "FFT benchmark by Scott Robert Ladd (see fftbench.c for details)" +msgstr "Benchmark de FFT por Scott Robert Ladd (ver fftbench.c para detalles)" + +#: shell//callbacks.c:366 +msgid "Some code partly based on x86cpucaps by Osamu Kayasono" +msgstr "Parte del código parcialmente basado en x86cpucaps por Osamu Kayasono" + +#: shell//callbacks.c:367 +msgid "Vendor list based on GtkSysInfo by Pissens Sebastien" +msgstr "Lista de proveedores basada en GtkSysInfo por Pissens Sebastien" + +#: shell//callbacks.c:368 +msgid "DMI support based on code by Stewart Adam" +msgstr "Soporte DMI basado en código de Stewart Adam" + +#: shell//callbacks.c:369 +msgid "SCSI support based on code by Pascal F. Martin" +msgstr "Soporte SCSI basado en código de Pascal F. Martin" + +#: shell//callbacks.c:373 +msgid "Jakub Szypulka" +msgstr "" + +#: shell//callbacks.c:374 +msgid "Tango Project" +msgstr "Proyecto Tango" + +#: shell//callbacks.c:375 +msgid "The GNOME Project" +msgstr "El proyecto GNOME" + +#: shell//callbacks.c:376 +msgid "VMWare, Inc. (USB icon from VMWare Workstation 6)" +msgstr "VMWare, Inc. (icono USB de VMWare Workstation 6)" + +#: shell//callbacks.c:387 +msgid "System information and benchmark tool" +msgstr "Herramienta de información del sistema y benchmark" + +#: shell//callbacks.c:392 +msgid "" +"HardInfo is free software; you can redistribute it and/or modify it under " +"the terms of the GNU General Public License as published by the Free " +"Software Foundation, version 2.\n" +"\n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +"\n" +"You should have received a copy of the GNU General Public License along with " +"this program; if not, write to the Free Software Foundation, Inc., 51 " +"Franklin St, Fifth Floor, Boston, MA 02110-1301 USA" +msgstr "" + +#: shell//shell.c:407 +#, c-format +msgid "%s - System Information" +msgstr "%s - Información del sistema" + +#: shell//shell.c:412 +msgid "System Information" +msgstr "Información del sistema" + +#: shell//shell.c:801 +msgid "Loading modules..." +msgstr "Cargando módulos..." + +#: shell//shell.c:1650 +#, c-format +msgid "%s → Summary" +msgstr "%s → Resumen" + +#: shell//shell.c:1758 +msgid "Updating..." +msgstr "Actualizando..." + +#: shell//syncmanager.c:69 +msgid "" +"Synchronize with Central Database\n" +"The following information may be synchronized with the HardInfo central " +"database." +msgstr "" +"Sincronizar con base de datos central\n" +"La siguiente información puede ser sincronizada con la base de datos " +"central de Hardinfo." + +#: shell//syncmanager.c:72 +msgid "" +"Synchronizing\n" +"This may take some time." +msgstr "" +"Sincronizando\n" +"Esto puede tomar algún tiempo." + +#: shell//syncmanager.c:132 +msgid "" +"HardInfo was compiled without libsoup support. (Network Updater requires it.)" +msgstr "" +"HardInfo fue compilado sin soporte para libsoup. (El actualizador por red lo " +"requiere.)" + +#: shell//syncmanager.c:161 +#: shell//syncmanager.c:185 +#, c-format +msgid "%s (error #%d)" +msgstr "%s (error #%d)" + +#: shell//syncmanager.c:170 +#: shell//syncmanager.c:194 +msgid "Could not parse XML-RPC response" +msgstr "No se pudo procesar la respuesta XML-RPC" + +#: shell//syncmanager.c:267 +#, c-format +msgid "" +"Server says it supports API version %d, but this version of HardInfo only " +"supports API version %d." +msgstr "" +"El servidor dice que soporta la versión de la API %d, pero esta versión de " +"HardInfo solo soporta la versión de la API %d." + +#: shell//syncmanager.c:362 +msgid "Contacting HardInfo Central Database" +msgstr "Contactando base de datos central de Hardinfo" + +#: shell//syncmanager.c:363 +msgid "Cleaning up" +msgstr "Limpiando" + +#: shell//syncmanager.c:480 +#, c-format +msgid "%s (canceled)" +msgstr "%s (cancelado)" + +#: shell//syncmanager.c:497 +#, c-format +msgid "%s (failed)" +msgstr "%s (falló)" + +#: shell//syncmanager.c:509 +#, c-format +msgid "" +"Failed while performing \"%s\". Please file a bug report if this problem " +"persists. (Use the Help→Report bug option.)\n" +"\n" +"Details: %s" +msgstr "" +"Falló realizando \"%s\". Por favor reporte el error si este problema " +"persiste. (Use la opción Ayuda→Reportar error.)\n" +"\n" +"Detalles: %s" + +#: shell//syncmanager.c:518 +#, c-format +msgid "" +"Failed while performing \"%s\". Please file a bug report if this problem " +"persists. (Use the Help→Report bug option.)" +msgstr "" +"Falló realizando \"%s\". Por favor reporte el error si este problema " +"persiste. (Use la opción Ayuda→Reportar error.)" + +#: shell//syncmanager.c:646 +msgid "Network Updater" +msgstr "Actualizador por red" + +#: shell//syncmanager.c:727 +msgid "_Synchronize" +msgstr "_Sincronizar" + +#: modules//computer.c:68 +msgid "Summary" +msgstr "Resumen" + +#: modules//computer.c:69 +msgid "Operating System" +msgstr "Sistema operativo" + +#: modules//computer.c:70 +msgid "Kernel Modules" +msgstr "Módulos del kernel" + +#: modules//computer.c:71 +msgid "Boots" +msgstr "Arranques" + +#: modules//computer.c:72 +msgid "Languages" +msgstr "Idiomas" + +#: modules//computer.c:73 +msgid "Filesystems" +msgstr "Sistemas de archivos" + +#: modules//computer.c:74 +msgid "Display" +msgstr "Pantalla" + +#: modules//computer.c:75 +msgid "Environment Variables" +msgstr "Variables de entorno" + +#: modules//computer.c:77 +msgid "Development" +msgstr "Desarrollo" + +#: modules//computer.c:79 +msgid "Users" +msgstr "Usuarios" + +#: modules//computer.c:80 +msgid "Groups" +msgstr "Grupos" + +#: modules//computer.c:104 +#, c-format +msgid "%dMB (%dMB used)" +msgstr "%dMB (%dMB usados)" + +#: modules//computer.c:200 +msgid "Scripting Languages" +msgstr "Lenguajes de scripting" + +#: modules//computer.c:201 +msgid "CPython" +msgstr "" + +#: modules//computer.c:202 +msgid "Perl" +msgstr "" + +#: modules//computer.c:203 +msgid "PHP" +msgstr "" + +#: modules//computer.c:204 +msgid "Ruby" +msgstr "" + +#: modules//computer.c:205 +msgid "Bash" +msgstr "" + +#: modules//computer.c:206 +msgid "Compilers" +msgstr "Compiladores" + +#: modules//computer.c:207 +msgid "C (GCC)" +msgstr "" + +#: modules//computer.c:208 +msgid "Java" +msgstr "" + +#: modules//computer.c:209 +msgid "CSharp (Mono, old)" +msgstr "CSharp (Mono, antiguo)" + +#: modules//computer.c:210 +msgid "CSharp (Mono)" +msgstr "" + +#: modules//computer.c:211 +msgid "Vala" +msgstr "" + +#: modules//computer.c:212 +msgid "Haskell (GHC)" +msgstr "" + +#: modules//computer.c:213 +msgid "FreePascal" +msgstr "" + +#: modules//computer.c:214 +msgid "Tools" +msgstr "Herramientas" + +#: modules//computer.c:262 +#, c-format +msgid "%s=Not found\n" +msgstr "%s=No encontrado\n" + +#: modules//computer.c:265 +#, c-format +msgid "Detecting version: %s" +msgstr "Detectando versión: %s" + +#: modules//computer.c:276 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Program\n" +"ColumnTitle$Value=Version\n" +"ShowColumnHeaders=true\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Programa\n" +"ColumnTitle$Value=Versión\n" +"ShowColumnHeaders=true\n" +"%s" + +#: modules//computer.c:356 +msgid "Physical machine" +msgstr "Equipo físico" + +#: modules//computer.c:373 +#, c-format +msgid "" +"[$ShellParam$]\n" +"UpdateInterval$Memory=1000\n" +"UpdateInterval$Date/Time=1000\n" +"#ReloadInterval=5000\n" +"[Computer]\n" +"Processor=%s\n" +"Memory=...\n" +"Machine Type=%s\n" +"Operating System=%s\n" +"User Name=%s\n" +"Date/Time=...\n" +"[Display]\n" +"Resolution=%dx%d pixels\n" +"OpenGL Renderer=%s\n" +"X11 Vendor=%s\n" +"\n" +"%s\n" +"[Input Devices]\n" +"%s\n" +"\n" +"%s\n" +"\n" +"%s\n" +msgstr "" +"[$ShellParam$]\n" +"UpdateInterval$Memoria=1000\n" +"UpdateInterval$Fecha/Hora=1000\n" +"#ReloadInterval=5000\n" +"[Equipo]\n" +"Procesador=%s\n" +"Memoria=...\n" +"Tipo de equipo=%s\n" +"Sistema operativo=%s\n" +"Nombre de usuario=%s\n" +"Fecha/Hora=...\n" +"[Pantalla]\n" +"Resolución=%dx%d pixels\n" +"OpenGL Renderer=%s\n" +"Proveedor X11=%s\n" +"\n" +"%s\n" +"[Dispositivos de entrada]\n" +"%s\n" +"\n" +"%s\n" +"\n" +"%s\n" + +#: modules//computer.c:415 +#, c-format +msgid "" +"[$ShellParam$]\n" +"UpdateInterval$Uptime=10000\n" +"UpdateInterval$Load Average=1000\n" +"[Version]\n" +"Kernel=%s\n" +"Version=%s\n" +"C Library=%s\n" +"Distribution=%s\n" +"[Current Session]\n" +"Computer Name=%s\n" +"User Name=%s\n" +"#Language=%s\n" +"Home Directory=%s\n" +"Desktop Environment=%s\n" +"[Misc]\n" +"Uptime=...\n" +"Load Average=..." +msgstr "" +"[$ShellParam$]\n" +"UpdateInterval$Uptime=10000\n" +"UpdateInterval$Load Average=1000\n" +"[Versión]\n" +"Núcleo=%s\n" +"Versión=%s\n" +"Biblioteca C=%s\n" +"Distribución=%s\n" +"[Sesión actual]\n" +"Nombre del equipo=%s\n" +"Nombre de usuario=%s\n" +"#Idioma=%s\n" +"Directorio personal=%s\n" +"Entorno de escritorio=%s\n" +"[Misc]\n" +"Uptime=...\n" +"Load Average=..." + +#: modules//computer.c:444 +#, c-format +msgid "" +"[Loaded Modules]\n" +"%s[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Name\n" +"ColumnTitle$Value=Description\n" +"ShowColumnHeaders=true\n" +msgstr "" +"[Módulos cargados]\n" +"%s[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Nombre\n" +"ColumnTitle$Value=Descripción\n" +"ShowColumnHeaders=true\n" + +#: modules//computer.c:455 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Date & Time\n" +"ColumnTitle$Value=Kernel Version\n" +"ShowColumnHeaders=true\n" +"\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Fecha y hora\n" +"ColumnTitle$Value=Versión del núcleo\n" +"ShowColumnHeaders=true\n" +"\n" +"%s" + +#: modules//computer.c:465 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Language Code\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" +"[Available Languages]\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Código del idioma\n" +"ColumnTitle$Value=Nombre\n" +"ShowColumnHeaders=true\n" +"[Idiomas disponibles]\n" +"%s" + +#: modules//computer.c:476 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ViewType=4\n" +"ReloadInterval=5000\n" +"Zebra=1\n" +"NormalizePercentage=false\n" +"ColumnTitle$Extra1=Mount Point\n" +"ColumnTitle$Progress=Usage\n" +"ColumnTitle$TextValue=Device\n" +"ShowColumnHeaders=true\n" +"[Mounted File Systems]\n" +"%s\n" +msgstr "" +"[$ShellParam$]\n" +"ViewType=4\n" +"ReloadInterval=5000\n" +"Zebra=1\n" +"NormalizePercentage=false\n" +"ColumnTitle$Extra1=Punto de montaje\n" +"ColumnTitle$Progress=Uso\n" +"ColumnTitle$TextValue=Dispositivo\n" +"ShowColumnHeaders=true\n" +"[Sistemas de archivos montados]\n" +"%s\n" + +#: modules//computer.c:490 +#, c-format +msgid "" +"[Display]\n" +"Resolution=%dx%d pixels\n" +"Vendor=%s\n" +"Version=%s\n" +"[Monitors]\n" +"%s[Extensions]\n" +"%s[OpenGL]\n" +"Vendor=%s\n" +"Renderer=%s\n" +"Version=%s\n" +"Direct Rendering=%s\n" +msgstr "" +"[Pantalla]\n" +"Resolución=%dx%d pixels\n" +"Proveedor=%s\n" +"Versión=%s\n" +"[Monitores]\n" +"%s[Extensiones]\n" +"%s[OpenGL]\n" +"Proveedor=%s\n" +"Renderer=%s\n" +"Versión=%s\n" +"Direct Rendering=%s\n" + +#: modules//computer.c:512 +msgid "Y_es" +msgstr "_Sí" + +#: modules//computer.c:512 +#: modules//devices/printers.c:138 +#: hardinfo//hardinfo.c:63 +msgid "No" +msgstr "_No" + +#: modules//computer.c:526 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ReloadInterval=10000\n" +"ColumnTitle$TextValue=Name\n" +"ColumnTitle$Value=Group ID\n" +"ShowColumnHeaders=true\n" +"[Groups]\n" +"%s\n" +msgstr "" +"[$ShellParam$]\n" +"ReloadInterval=10000\n" +"ColumnTitle$TextValue=Nombre\n" +"ColumnTitle$Value=ID del grupo\n" +"ShowColumnHeaders=true\n" +"[Grupos]\n" +"%s\n" + +#: modules//computer.c:606 +msgid "Computer" +msgstr "Equipo" + +#: modules//computer.c:700 +msgid "Gathers high-level computer information" +msgstr "Obtiene información del equipo de alto nivel" + +#: modules//devices.c:74 +msgid "Processor" +msgstr "Procesador" + +#: modules//devices.c:75 +msgid "Memory" +msgstr "Memoria" + +#: modules//devices.c:76 +msgid "PCI Devices" +msgstr "Dispositivos PCI" + +#: modules//devices.c:77 +msgid "USB Devices" +msgstr "Dispositivos USB" + +#: modules//devices.c:78 +msgid "Printers" +msgstr "Impresoras" + +#: modules//devices.c:79 +msgid "Battery" +msgstr "Batería" + +#: modules//devices.c:80 +msgid "Sensors" +msgstr "Sensores" + +#: modules//devices.c:81 +msgid "Input Devices" +msgstr "Dispositivos de entrada" + +#: modules//devices.c:82 +msgid "Storage" +msgstr "Almacenamiento" + +#: modules//devices.c:84 +msgid "DMI" +msgstr "" + +#: modules//devices.c:85 +msgid "Memory SPD" +msgstr "Memoria SPD" + +#: modules//devices.c:87 +msgid "Resources" +msgstr "Recursos" + +#: modules//devices.c:154 +#: modules//devices.c:197 +#: modules//computer/os.c:53 +#: modules//computer/os.c:130 +#: modules//devices/printers.c:99 +#: modules//devices/printers.c:106 +#: modules//devices/printers.c:116 +#: modules//devices/printers.c:131 +#: modules//devices/printers.c:140 +#: modules//devices/printers.c:243 +msgid "Unknown" +msgstr "Desconocido" + +#: modules//devices.c:178 +msgid "Total Memory" +msgstr "Memoria total" + +#: modules//devices.c:193 +msgid " (vendor unknown)" +msgstr " (proveedor desconocido)" + +#: modules//devices.c:195 +msgid " (model unknown)" +msgstr " (modelo desconocido)" + +#: modules//devices.c:412 +msgid "Devices" +msgstr "Dispositivos" + +#: modules//devices.c:424 +msgid "Update PCI ID listing" +msgstr "Actualizar listado de ids PCI" + +#: modules//devices.c:436 +msgid "Update CPU feature database" +msgstr "Actualizar base de datos de características de CPU" + +#: modules//devices.c:464 +msgid "Gathers information about hardware devices" +msgstr "Obtiene información acerca de los dispositivos de hardware" + +#: modules//computer/boots.c:33 +msgid "[Boots]\n" +msgstr "[Arranques]\n" + +#: modules//computer/environment.c:32 +msgid "[Environment Variables]\n" +msgstr "[Variables de entorno]\n" + +#: modules//computer/display.c:83 +msgid "vendor string" +msgstr "cadena del proveedor" + +#: modules//computer/display.c:84 +msgid "X.Org version" +msgstr "Versión de X.Org" + +#: modules//computer/display.c:85 +msgid "XFree86 version" +msgstr "Versión de XFree86" + +#: modules//computer/display.c:122 +#, c-format +msgid "Monitor %d=%dx%d pixels\n" +msgstr "Monitor %d=%dx%d pixels\n" + +#: modules//computer/alsa.c:26 +msgid "[Audio Devices]\n" +msgstr "[Dispositivos de audio]\n" + +#: modules//computer/alsa.c:33 +#, c-format +msgid "Audio Adapter#%d=%s\n" +msgstr "Adaptador de audio#%d=%s\n" + +#: modules//computer/os.c:49 +#, c-format +msgid "GNU C Library version %s (%sstable)" +msgstr "Versión de la biblioteca GNU C %s (%sestable)" + +#: modules//computer/os.c:51 +msgid "un" +msgstr "in" + +#: modules//computer/os.c:72 +#, c-format +msgid "Version: %s" +msgstr "Versión: %s" + +#: modules//computer/os.c:106 +msgid "Terminal" +msgstr "Terminal" + +#: modules//computer/os.c:126 +#, c-format +msgid "Unknown (Window Manager: %s)" +msgstr "Desconocido (Gestor de ventanas: %s)" + +#: modules//computer/os.c:166 +msgid "Unknown distribution" +msgstr "Distribución desconocida" + +#: modules//devices/battery.c:181 +#, c-format +msgid "" +"\n" +"[Battery: %s]\n" +"State=%s (load: %s)\n" +"Capacity=%s / %s (%.2f%%)\n" +"Battery Technology=%s (%s)\n" +"Manufacturer=%s\n" +"Model Number=%s\n" +"Serial Number=%s\n" +msgstr "" +"\n" +"[Batería: %s]\n" +"Estado=%s (carga: %s)\n" +"Capacidad=%s / %s (%.2f%%)\n" +"Tecnología de la batería=%s (%s)\n" +"Fabricante=%s\n" +"Numero de modelo=%s\n" +"Numero de serie=%s\n" + +#: modules//devices/battery.c:266 +#, c-format +msgid "" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Remaining Charge=%s of %s\n" +"Using=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" +msgstr "" +"\n" +"[Batería (APM)]\n" +"Carga=%d%%\n" +"Carga restante=%s of %s\n" +"Usando=%s\n" +"Versión del driver APM=%s\n" +"APM BIOS version=%s\n" + +#: modules//devices/battery.c:278 +#, c-format +msgid "" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Using=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" +msgstr "" +"\n" +"[Batería (APM)]\n" +"Carga=%d%%\n" +"Usando=%s\n" +"Versión del driver APM=%s\n" +"Versión del BIOS APM=%s\n" + +#: modules//devices/battery.c:304 +msgid "" +"[No batteries]\n" +"No batteries found on this system=\n" +msgstr "" +"[Sin baterías]\n" +"No se encontraron baterías en este sistema=\n" + +#: modules//devices/printers.c:81 +msgid "⚬ Can do black and white printing=\n" +msgstr "⚬ Puede imprimir en blanco y negro=\n" + +#: modules//devices/printers.c:83 +msgid "⚬ Can do color printing=\n" +msgstr "⚬ Puede imprimir en color=\n" + +#: modules//devices/printers.c:85 +msgid "⚬ Can do duplexing=\n" +msgstr "⚬ Can do duplexing=\n" + +#: modules//devices/printers.c:87 +msgid "⚬ Can do staple output=\n" +msgstr "⚬ Puede engrapar la salida=\n" + +#: modules//devices/printers.c:89 +msgid "⚬ Can do copies=\n" +msgstr "⚬ Puede hacer copias=\n" + +#: modules//devices/printers.c:91 +msgid "⚬ Can collate copies=\n" +msgstr "⚬ Puede compaginar copias=\n" + +#: modules//devices/printers.c:93 +msgid "⚬ Printer is rejecting jobs=\n" +msgstr "⚬ La impresora está rechazando trabajos=\n" + +#: modules//devices/printers.c:95 +msgid "⚬ Printer was automatically discovered and added=\n" +msgstr "⚬ La impresora fue encontrada automáticamente y agregada=\n" + +#: modules//devices/printers.c:110 +msgid "Idle" +msgstr "Ocioso" + +#: modules//devices/printers.c:112 +msgid "Printing a Job" +msgstr "Imprimiendo un trabajo" + +#: modules//devices/printers.c:114 +msgid "Stopped" +msgstr "Detenido" + +#: modules//devices/printers.c:138 +#: hardinfo//hardinfo.c:62 +#: hardinfo//hardinfo.c:63 +msgid "Yes" +msgstr "Sí" + +#: modules//devices/printers.c:190 +msgid "" +"[Printers]\n" +"No suitable CUPS library found=" +msgstr "" +"[Impresoras]\n" +"No se encontró ninguna biblioteca CUPS usable=" + +#: modules//devices/printers.c:200 +msgid "[Printers (CUPS)]\n" +msgstr "[Impresoras (CUPS)]\n" + +#: modules//devices/printers.c:263 +msgid "" +"[Printers]\n" +"No printers found=\n" +msgstr "" +"[Impresoras]\n" +"No se encontraron impresoras=\n" + +#: modules//devices/storage.c:46 +msgid "" +"\n" +"[SCSI Disks]\n" +msgstr "" +"\n" +"[Discos SCSI]\n" + +#: modules//devices/storage.c:110 +#: modules//devices/storage.c:297 +#, c-format +msgid "" +"[Device Information]\n" +"Model=%s\n" +msgstr "" +"[Información de dispositivo]\n" +"Modelo=%s\n" + +#: modules//devices/storage.c:115 +#: modules//devices/storage.c:304 +#, c-format +msgid "Vendor=%s (%s)\n" +msgstr "Proveedor=%s (%s)\n" + +#: modules//devices/storage.c:120 +#: modules//devices/storage.c:309 +#, c-format +msgid "Vendor=%s\n" +msgstr "Proveedor=%s\n" + +#: modules//devices/storage.c:125 +#, c-format +msgid "" +"Type=%s\n" +"Revision=%s\n" +"[SCSI Controller]\n" +"Controller=scsi%d\n" +"Channel=%d\n" +"ID=%d\n" +"LUN=%d\n" +msgstr "" +"Tipo=%s\n" +"Revisión=%s\n" +"[Controladora SCSI]\n" +"Controladora=scsi%d\n" +"Canal=%d\n" +"ID=%d\n" +"LUN=%d\n" + +#: modules//devices/storage.c:169 +msgid "" +"\n" +"[IDE Disks]\n" +msgstr "" +"\n" +"[Discos IDE]\n" + +#: modules//devices/storage.c:242 +#, c-format +msgid "Driver=%s\n" +msgstr "Driver=%s\n" + +#: modules//devices/storage.c:314 +#, c-format +msgid "" +"Device Name=hd%c\n" +"Media=%s\n" +"Cache=%dkb\n" +msgstr "" +"Nombre del dispositivo=hd%c\n" +"Medio=%s\n" +"Cache=%dkb\n" + +#: modules//devices/storage.c:329 +#, c-format +msgid "" +"[Geometry]\n" +"Physical=%s\n" +"Logical=%s\n" +msgstr "" +"[Geometría]\n" +"Física=%s\n" +"Lógica=%s\n" + +#: modules//devices/storage.c:341 +#, c-format +msgid "" +"[Capabilities]\n" +"%s" +msgstr "" +"[Capacidades]\n" +"%s" + +#: modules//devices/storage.c:348 +#, c-format +msgid "" +"[Speeds]\n" +"%s" +msgstr "" +"[Velocidades]\n" +"%s" + +#: modules//network.c:59 +msgid "Interfaces" +msgstr "Interfaces" + +#: modules//network.c:60 +msgid "IP Connections" +msgstr "Conexiones IP" + +#: modules//network.c:61 +msgid "Routing Table" +msgstr "Tabla de ruteo" + +#: modules//network.c:62 +msgid "ARP Table" +msgstr "Tabla ARP" + +#: modules//network.c:63 +msgid "DNS Servers" +msgstr "Servidores DNS" + +#: modules//network.c:64 +msgid "Statistics" +msgstr "Estadísticas" + +#: modules//network.c:65 +msgid "Shared Directories" +msgstr "Directorios compartidos" + +#: modules//network.c:300 +#, c-format +msgid "" +"[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" +msgstr "" +"[Tabla ARP]\n" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ColumnTitle$TextValue=Dirección IP\n" +"ColumnTitle$Value=Interfaz\n" +"ColumnTitle$Extra1=Dirección MAC\n" +"ShowColumnHeaders=true\n" + +#: modules//network.c:321 +#, c-format +msgid "" +"[Name servers]\n" +"%s\n" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=IP Address\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" +msgstr "" +"[Servidores de nombres]\n" +"%s\n" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=IP Address\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" + +#: modules//network.c:331 +#, c-format +msgid "" +"[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" +msgstr "" +"[Conexiones]\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" + +#: modules//network.c:345 +#, c-format +msgid "" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Interface\n" +"ColumnTitle$Value=IP Address\n" +"ColumnTitle$Extra1=Sent\n" +"ColumnTitle$Extra2=Received\n" +"ShowColumnHeaders=true\n" +"%s" +msgstr "" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Interfaz\n" +"ColumnTitle$Value=Dirección IP\n" +"ColumnTitle$Extra1=Enviado\n" +"ColumnTitle$Extra2=Recibido\n" +"ShowColumnHeaders=true\n" +"%s" + +#: modules//network.c:361 +#, c-format +msgid "" +"[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" +msgstr "" +"[Tabla de ruteo IP]\n" +"%s\n" +"[$ShellParam$]\n" +"ViewType=0\n" +"ReloadInterval=3000\n" +"ColumnTitle$TextValue=Destino / Puerta de enlace\n" +"ColumnTitle$Value=Interfaz\n" +"ColumnTitle$Extra1=Flags\n" +"ColumnTitle$Extra2=Máscara\n" +"ShowColumnHeaders=true\n" + +#: modules//network.c:399 +msgid "Network" +msgstr "Red" + +#: modules//network.c:432 +msgid "Gathers information about this computer's network connection" +msgstr "Obtiene información sobre la conexión de red de esta computadora" + +#: modules//benchmark.c:50 +msgid "CPU Blowfish" +msgstr "" + +#: modules//benchmark.c:51 +msgid "CPU CryptoHash" +msgstr "" + +#: modules//benchmark.c:52 +msgid "CPU Fibonacci" +msgstr "" + +#: modules//benchmark.c:53 +msgid "CPU N-Queens" +msgstr "CPU N-Reinas" + +#: modules//benchmark.c:54 +msgid "FPU FFT" +msgstr "" + +#: modules//benchmark.c:55 +msgid "FPU Raytracing" +msgstr "FPU trazado de rayos" + +#: modules//benchmark.c:56 +msgid "GPU Drawing" +msgstr "GPU dibujo" + +#: modules//benchmark.c:222 +#, c-format +msgid "" +"[$ShellParam$]\n" +"Zebra=1\n" +"OrderType=%d\n" +"ViewType=3\n" +"ColumnTitle$Extra1=CPU Clock\n" +"ColumnTitle$Progress=Results\n" +"ColumnTitle$TextValue=CPU\n" +"ShowColumnHeaders=true\n" +"[%s]\n" +"This Machine=%.3f|%s MHz\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"Zebra=1\n" +"OrderType=%d\n" +"ViewType=3\n" +"ColumnTitle$Extra1=Reloj de la CPU\n" +"ColumnTitle$Progress=Resultados\n" +"ColumnTitle$TextValue=CPU\n" +"ShowColumnHeaders=true\n" +"[%s]\n" +"Este equipo=%.3f|%s MHz\n" +"%s" + +#: modules//benchmark.c:235 +#, c-format +msgid "" +"[$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" +"%s" +msgstr "" +"[$ShellParam$]\n" +"Zebra=1\n" +"OrderType=%d\n" +"ViewType=3\n" +"ColumnTitle$Extra1=Reloj del equipo CPU\n" +"ColumnTitle$Progress=Resultados\n" +"ColumnTitle$TextValue=CPU\n" +"ShowColumnHeaders=true\n" +"[%s]\n" +"%s" + +#: modules//benchmark.c:363 +#, c-format +msgid "Benchmarking: %s." +msgstr "Ejecutando benchmark: %s." + +#: modules//benchmark.c:377 +msgid "Benchmarking. Please do not move your mouse or press any keys." +msgstr "Ejecutando benchmarks. Por favor no mueva el mouse ni use el teclado." + +#: modules//benchmark.c:381 +msgid "Cancel" +msgstr "Cancelar" + +#: modules//benchmark.c:511 +msgid "Results in MiB/second. Higher is better." +msgstr "Resultados en MiB/segundo. Más alto es mejor." + +#: modules//benchmark.c:514 +msgid "Results in HIMarks. Higher is better." +msgstr "Resultados en HIMarks. Más alto es mejor." + +#: modules//benchmark.c:521 +msgid "Results in seconds. Lower is better." +msgstr "Resultados en segundos. Más bajo es mejor." + +#: modules//benchmark.c:529 +msgid "Benchmarks" +msgstr "Benchmarks" + +#: modules//benchmark.c:547 +msgid "Perform tasks and compare with other systems" +msgstr "Realizar tareas y comparar con otros sistemas" + +#: modules//benchmark.c:634 +msgid "Send benchmark results" +msgstr "Enviar resultados de los benchmark" + +#: modules//benchmark.c:639 +msgid "Receive benchmark results" +msgstr "Recibir resultados de los benchmark" + +#: hardinfo//util.c:102 +#: hardinfo//util.c:105 +#: hardinfo//util.c:110 +#, c-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuto" +msgstr[1] "%d minutos" + +#: hardinfo//util.c:104 +#, c-format +msgid "%d hour, " +msgid_plural "%d hours, " +msgstr[0] "%d hora, " +msgstr[1] "%d horas, " + +#: hardinfo//util.c:108 +#, c-format +msgid "%d day, " +msgid_plural "%d days, " +msgstr[0] "%d día, " +msgstr[1] "%d días, " + +#: hardinfo//util.c:109 +#, c-format +msgid "%d hour and " +msgid_plural "%d hours and " +msgstr[0] "%d hora y " +msgstr[1] "%d horas y " + +#: hardinfo//util.c:116 +#, c-format +msgid "%.1f B" +msgstr "" + +#: hardinfo//util.c:118 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: hardinfo//util.c:120 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: hardinfo//util.c:122 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: hardinfo//util.c:336 +msgid "Error" +msgstr "Error" + +#: hardinfo//util.c:336 +#: hardinfo//util.c:352 +msgid "Warning" +msgstr "Advertencia" + +#: hardinfo//util.c:351 +msgid "Fatal Error" +msgstr "Error fatal" + +#: hardinfo//util.c:376 +msgid "creates a report and prints to standard output" +msgstr "crea un reporte y lo imprime en la salida estándar" + +#: hardinfo//util.c:382 +msgid "chooses a report format (text, html)" +msgstr "elige un formato para el reporte (texto, html)" + +#: hardinfo//util.c:388 +msgid "run benchmark; requires benchmark.so to be loaded" +msgstr "correr benchmark; requiere benchmark.so para ser cargado" + +#: hardinfo//util.c:394 +msgid "lists modules" +msgstr "lista los módulos" + +#: hardinfo//util.c:400 +msgid "specify module to load" +msgstr "especificar módulo a cargar" + +#: hardinfo//util.c:406 +msgid "automatically load module dependencies" +msgstr "cargar automáticamente las dependencias de los módulos" + +#: hardinfo//util.c:413 +msgid "run in XML-RPC server mode" +msgstr "correr en modo servidor XML-RPC" + +#: hardinfo//util.c:420 +msgid "shows program version and quit" +msgstr "muestra la versión del programa y sale" + +#: hardinfo//util.c:425 +msgid "- System Profiler and Benchmark tool" +msgstr "- Analizador de sistema y herramienta de benchmark" + +#: hardinfo//util.c:435 +#, c-format +msgid "" +"Unrecognized arguments.\n" +"Try ``%s --help'' for more information.\n" +msgstr "" +"Argumentos no reconocidos.\n" +"Intente ``%s --help'' para más información.\n" + +#: hardinfo//util.c:501 +#, c-format +msgid "Couldn't find a Web browser to open URL %s." +msgstr "No se pudo encontrar un navegador Web para abrir la URL %s." + +#: hardinfo//util.c:848 +#, c-format +msgid "Module \"%s\" depends on module \"%s\", load it?" +msgstr "El módulo \"%s\" depende del módulo \"%s\", ¿desea cargarlo?" + +#: hardinfo//util.c:871 +#, c-format +msgid "Module \"%s\" depends on module \"%s\"." +msgstr "El módulo \"%s\" depende del módulo \"%s\"." + +#: hardinfo//util.c:916 +#, c-format +msgid "No module could be loaded. Check permissions on \"%s\" and try again." +msgstr "" +"No se puede cargar ningún módulo. Verifique los permisos en \"%s\" y " +"pruebe de nuevo." + +#: hardinfo//util.c:920 +msgid "" +"No module could be loaded. Please use hardinfo -l to list all available " +"modules and try again with a valid module list." +msgstr "" +"No se pudo cargar ningún módulo. Por favor use hardinfo -l para listar " +"todoslos módulos disponibles e intente de nuevo con una lista válida de " +"módulos." + +#: hardinfo//util.c:1096 +#, c-format +msgid "Scanning: %s..." +msgstr "Escaneando: %s..." + +#: hardinfo//hardinfo.c:54 +msgid "" +"Copyright (C) 2003-2009 Leandro A. F. Pereira. See COPYING for details.\n" +"\n" +msgstr "" +"Copyright (C) 2003-2009 Leandro A. F. Pereira. Vea COPYING para más " +"detalles.\n" +"\n" + +#: hardinfo//hardinfo.c:56 +#, c-format +msgid "" +"Compile-time options:\n" +" Release version: %s (%s)\n" +" BinReloc enabled: %s\n" +" Data prefix: %s\n" +" Library prefix: %s\n" +" Compiled on: %s %s (%s)\n" +msgstr "" +"Opciones de compilado:\n" +" Versión: %s (%s)\n" +" BinReloc habilitado: %s\n" +" Prefijo de datos: %s\n" +" Prefijo de bibliotecas: %s\n" +" Compilado en: %s %s (%s)\n" + +#: hardinfo//hardinfo.c:74 +#, c-format +msgid "" +"Failed to find runtime data.\n" +"\n" +"• Is HardInfo correctly installed?\n" +"• See if %s and %s exists and you have read permision." +msgstr "" +"Falló en encontrar datos del programa.\n" +"\n" +"• ¿HardInfo está correctamente instalado?\n" +"• Vea si %s y %s existen y usted tiene permisos de lectura." + +#: hardinfo//hardinfo.c:81 +#, c-format +msgid "" +"Modules:\n" +"%-20s%-15s%-12s\n" +msgstr "" +"Módulos:\n" +"%-20s%-15s%-12s\n" + +#: hardinfo//hardinfo.c:82 +msgid "File Name" +msgstr "Nombre de archivo" + +#: hardinfo//hardinfo.c:82 +msgid "Name" +msgstr "Nombre" + +#: hardinfo//hardinfo.c:82 +msgid "Version" +msgstr "Versión" + +#: hardinfo//hardinfo.c:135 +#, c-format +msgid "Unknown benchmark ``%s'' or libbenchmark.so not loaded" +msgstr "Benchmark desconocido ``%s'' o no se cargó libbenchmark.so" + +#: hardinfo//hardinfo.c:163 +msgid "Don't know what to do. Exiting." +msgstr "No se puede determinar que hacer. Saliendo." diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 00000000..3faae3ad --- /dev/null +++ b/po/fr.po @@ -0,0 +1,1644 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Yo L , 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: hardinfo\n" +"Report-Msgid-Bugs-To: https://github.com/lpereira/hardinfo\n" +"POT-Creation-Date: 2014-01-01\n" +"PO-Revision-Date: 2014-09-03\n" +"Last-Translator: yolateng0 @olala22000\n" +"Language-Team: LeFlood\n" +"Language: french\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +"X-Generator: Poedit 1.5.4\n" +"X-Poedit-KeywordsList: HardInfo\n" + +#: shell//callbacks.c:71 +#, c-format +msgid "Remote: %s" +msgstr "Accès: %s" + +#: shell//callbacks.c:117 +msgid "Disconnecting..." +msgstr "Déconnexion ..." + +#: shell//callbacks.c:120 +msgid "Unloading modules..." +msgstr "Déconnexion des modules" + +#: shell//callbacks.c:123 +msgid "Loading local modules..." +msgstr "Chargement des modules locaux" + +#: shell//callbacks.c:130 +#: shell//callbacks.c:162 +#: shell//shell.c:314 +#: shell//shell.c:814 +#: shell//shell.c:1796 +#: modules//benchmark.c:431 +#: modules//benchmark.c:439 +#: hardinfo//util.c:1106 +msgid "Done." +msgstr "Réalisé." + +#: shell//callbacks.c:142 +msgid "Save Image" +msgstr "Sauvergarder l'image" + +#: shell//callbacks.c:158 +msgid "Saving image..." +msgstr "Sauvegarde de l'image" + +#: shell//callbacks.c:236 +msgid "No context help available." +msgstr "Pas d'aide disponible pour cela." + +#: shell//callbacks.c:318 +#, c-format +msgid "%s Module" +msgstr "%s Module" + +#: shell//callbacks.c:325 +#, c-format +msgid "" +"Written by %s\n" +"Licensed under %s" +msgstr "" +"Ecrit par %s\n" +"Sous Licence %s" + +#: shell//callbacks.c:339 +#, c-format +msgid "No about information is associated with the %s module." +msgstr "Pas d'information associée au module %s." + +#: shell//callbacks.c:353 +msgid "Author:" +msgstr "Auteur:" + +#: shell//callbacks.c:356 +msgid "Contributors:" +msgstr "Contributeurs:" + +#: shell//callbacks.c:360 +msgid "Based on work by:" +msgstr "Basé sur le travail de:" + +#: shell//callbacks.c:361 +msgid "MD5 implementation by Colin Plumb (see md5.c for details)" +msgstr "Implémentation MD5 par Colin Plumb (voir md5.c pour les détails)" + +#: shell//callbacks.c:362 +msgid "SHA1 implementation by Steve Reid (see sha1.c for details)" +msgstr "implémentation SHA1 par Steve Reid (voir sha1.c pour les détails)" + +#: shell//callbacks.c:363 +msgid "Blowfish implementation by Paul Kocher (see blowfich.c for details)" +msgstr "Implémentation Blowfish par Paul Kocher (voir blowchih.c pour de plus amples détails" + +#: shell//callbacks.c:364 +msgid "Raytracing benchmark by John Walker (see fbench.c for details)" +msgstr "Raytracing benchmark par John Walker (voir fbench.c pour de plus amples détails)" + +#: shell//callbacks.c:365 +msgid "FFT benchmark by Scott Robert Ladd (see fftbench.c for details)" +msgstr "FFT benchmark par Scott Robert Ladd (voir fftbench.c pour les détails)" + +#: shell//callbacks.c:366 +msgid "Some code partly based on x86cpucaps by Osamu Kayasono" +msgstr "Une partie du code est basé sur x86cpucaps par Osamu Kayasono" + +#: shell//callbacks.c:367 +msgid "Vendor list based on GtkSysInfo by Pissens Sebastien" +msgstr "La liste des fabricants est basée sur GtkSysInfo par Pissens Sebastien" + +#: shell//callbacks.c:368 +msgid "DMI support based on code by Stewart Adam" +msgstr "Les supports DMI sont basés sur le code de Stewart Adam" + +#: shell//callbacks.c:369 +msgid "SCSI support based on code by Pascal F. Martin" +msgstr "Les supports SCSI sont basés sur le code de Pascal F. Martin" + +#: shell//callbacks.c:373 +msgid "Jakub Szypulka" +msgstr "Jakub Szypulka" + +#: shell//callbacks.c:374 +msgid "Tango Project" +msgstr "Projet Tango" + +#: shell//callbacks.c:375 +msgid "The GNOME Project" +msgstr "Le Projet Gnome" + +#: shell//callbacks.c:376 +msgid "VMWare, Inc. (USB icon from VMWare Workstation 6)" +msgstr "VMWare, Inc. (USB icône sur VMWare Workstation 6)" + +#: shell//callbacks.c:387 +msgid "System information and benchmark tool" +msgstr "Information du systeme et outil d'évaluation" + +#: shell//callbacks.c:392 +msgid "" +"HardInfo is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.\n" +"\n" +"This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. \n" +"\n" +"You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA" +msgstr "" +"HardInfo est un logiciel libre, vous pouvez le redistribuer et / ou le modifier sousles termes de la Licence Publique Générale GNU telle que publiée par la FreeSoftware Foundation, version 2 \n" +"\n" +"Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE, sans même la garantie implicite de COMMERCIALISATION ou D'ADAPTATION À UN USAGE PARTICULIER. Voir la Licence Publique Générale GNU pour plus de détail. \n" +"\n" +"Vous devriez avoir reçu une copie de la Licence Publique Générale GNU avec ce programme; sinon, écrire à la Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA" + +#: shell//menu.c:35 +msgid "_Information" +msgstr "_Information" + +#: shell//menu.c:36 +msgid "_Remote" +msgstr "_Périphériques distants" + +#: shell//menu.c:37 +msgid "_View" +msgstr "_Voir" + +#: shell//menu.c:38 +msgid "_Help" +msgstr "_Aide" + +#: shell//menu.c:39 +msgid "About _Modules" +msgstr "A propos des _modules" + +#: shell//menu.c:43 +msgid "Generate _Report" +msgstr "Générer _Rapport" + +#: shell//menu.c:48 +msgid "_Network Updater..." +msgstr "_Mise à jour des données" + +#: shell//menu.c:53 +msgid "_Open..." +msgstr "_Ouvrir..." + +#: shell//menu.c:58 +msgid "_Connect to..." +msgstr "_Connection à ..." + +#: shell//menu.c:63 +msgid "_Manage hosts..." +msgstr "_Gestion hosts..." + +#: shell//menu.c:68 +msgid "_Local computer" +msgstr "_Ordinateur local..." + +#: shell//menu.c:73 +msgid "_Copy to Clipboard" +msgstr "_Copier dans le presse-papier" + +#: shell//menu.c:74 +msgid "Copy to clipboard" +msgstr "Copie dans le presse-papier" + +#: shell//menu.c:78 +msgid "_Save image as..." +msgstr "_Sauvegarde sous" + +#: shell//menu.c:83 +msgid "_Refresh" +msgstr "_Rafraichir" + +#: shell//menu.c:88 +msgid "Contents" +msgstr "Contenus" + +#: shell//menu.c:93 +#: shell//shell.c:1790 +#: shell//shell.c:1807 +msgid "Context help" +msgstr "Contenu de l'aide" + +#: shell//menu.c:98 +msgid "_Open HardInfo Web Site" +msgstr "_HardInfo Site Web" + +#: shell//menu.c:103 +msgid "_Report bug" +msgstr "_Rapporter un bug" + +#: shell//menu.c:108 +msgid "_Donate to the project" +msgstr "_Aider le projet" + +#: shell//menu.c:113 +msgid "_About HardInfo" +msgstr "_A Propos de HardInfo" + +#: shell//menu.c:114 +msgid "Displays program version information" +msgstr "Affiche les informations de version du programme" + +#: shell//menu.c:118 +msgid "_Quit" +msgstr "_Quitter" + +#: shell//menu.c:125 +msgid "_Side Pane" +msgstr "_Volet latéral" + +#: shell//menu.c:126 +msgid "Toggles side pane visibility" +msgstr "Basculer visibilité du panneau latéral " + +#: shell//menu.c:129 +msgid "_Toolbar" +msgstr "_Barre d'outils" + +#: shell//menu.c:133 +msgid "_Accept connections" +msgstr "_Accepter la connection" + +#: shell//report.c:492 +msgid "Save File" +msgstr "Sauvegarder le fichier" + +#: shell//report.c:616 +msgid "Cannot create ReportContext. Programming bug?" +msgstr "Impossible de créer un rapport général. Bug?" + +#: shell//report.c:634 +msgid "Open the report with your web browser?" +msgstr "Ouvrez le rapport avec votre navigateur Web?" + +#: shell//report.c:662 +msgid "Generating report..." +msgstr "Création du rapport..." + +#: shell//report.c:672 +msgid "Report saved." +msgstr "Rapport sauvegardé" + +#: shell//report.c:674 +msgid "Error while creating the report." +msgstr "Erreur lors de la création du rapport." + +#: shell//report.c:776 +msgid "Generate Report" +msgstr "Réalisation du Rapport" + +#: shell//report.c:793 +msgid "" +"Generate Report\n" +"Please choose the information that you wish to view in your report:" +msgstr "" +" Générer un rapport \n" +" S'il vous plaît choisissez les informations que vous souhaitez afficher dans votre rapport:" + +#: shell//report.c:853 +msgid "Select _None" +msgstr "Désélectionner _Tout" + +#: shell//report.c:860 +msgid "Select _All" +msgstr "Sélectionner _Tout" + +#: shell//report.c:878 +msgid "_Generate" +msgstr "_Création" + +#: shell//shell.c:407 +#, c-format +msgid "%s - System Information" +msgstr "%s - Informations du Système" + +#: shell//shell.c:412 +msgid "System Information" +msgstr "Informations du Système" + +#: shell//shell.c:801 +msgid "Loading modules..." +msgstr "Chargement des modules..." + +#: shell//shell.c:1650 +#, c-format +msgid "%s → Summary" +msgstr "%s → Résumé" + +#: shell//shell.c:1758 +msgid "Updating..." +msgstr "Mise à jour..." + +#: shell//syncmanager.c:69 +msgid "" +"Synchronize with Central Database\n" +"The following information may be synchronized with the HardInfo central database." +msgstr "" +"Synchroniser avec la base de données centrale\n" +"Les informations suivantes seront synchronisées avec la base de données de HardInfo." + +#: shell//syncmanager.c:72 +msgid "" +"Synchronizing\n" +"This may take some time." +msgstr "" +"Synchronisation\n" +"Cela peut prendre un certain temps." + +#: shell//syncmanager.c:132 +msgid "HardInfo was compiled without libsoup support. (Network Updater requires it.)" +msgstr "HARDiNFO a été compilé sans le support libsoup. (Mise à jour des données l'exige.)" + +#: shell//syncmanager.c:161 +#: shell//syncmanager.c:185 +#, c-format +msgid "%s (error #%d)" +msgstr "%s (erreur #%d)" + +#: shell//syncmanager.c:170 +#: shell//syncmanager.c:194 +msgid "Could not parse XML-RPC response" +msgstr "Impossible d'analyser la réponse XML-RPC" + +#: shell//syncmanager.c:267 +#, c-format +msgid "Server says it supports API version %d, but this version of HardInfo only supports API version %d." +msgstr "Le serveur dit qu'il supporte la version de l'API %d, mais cette version de HARDiNFO supporte seulement le support version de l'API %d." + +#: shell//syncmanager.c:362 +msgid "Contacting HardInfo Central Database" +msgstr "En contact avec la base de données centrale du site HARDiNFO" + +#: shell//syncmanager.c:363 +msgid "Cleaning up" +msgstr "Nettoyage" + +#: shell//syncmanager.c:480 +#, c-format +msgid "%s (canceled)" +msgstr "%s (annuler) " + +#: shell//syncmanager.c:497 +#, c-format +msgid "%s (failed)" +msgstr "%s (Echec)" + +#: shell//syncmanager.c:509 +#, c-format +msgid "" +"Failed while performing \"%s\". Please file a bug report if this problem persists. (Use the Help→Report bug option.)\n" +"\n" +"Details: %s" +msgstr "" +"Échec lors de l'exécution de \"%s\". S'il vous plaît remplissez un rapport de bug si ce problème persiste. (Utilisez l'option Aide → Rapport de Bug.)\n" +"\n" +"Détails: %s" + +#: shell//syncmanager.c:518 +#, c-format +msgid "Failed while performing \"%s\". Please file a bug report if this problem persists. (Use the Help→Report bug option.)" +msgstr "Échec lors de l'exécution de \"%s\". S'il vous plaît remplissez un rapport de bug si ce problème persiste. (Utilisez l'option Aide → Rapport de Bug.)" + +#: shell//syncmanager.c:646 +msgid "Network Updater" +msgstr "Mises à jour" + +#: shell//syncmanager.c:727 +msgid "_Synchronize" +msgstr "_Synchronisation" + +#: modules//benchmark.c:50 +msgid "CPU Blowfish" +msgstr "Test CPU Blowfish" + +#: modules//benchmark.c:51 +msgid "CPU CryptoHash" +msgstr "Test CPU CryptoHash" + +#: modules//benchmark.c:52 +msgid "CPU Fibonacci" +msgstr "Test CPU Fibonacci " + +#: modules//benchmark.c:53 +msgid "CPU N-Queens" +msgstr "Test CPU N-Queens" + +#: modules//benchmark.c:54 +msgid "FPU FFT" +msgstr "Test FPU FFT" + +#: modules//benchmark.c:55 +msgid "FPU Raytracing" +msgstr "Test FPU Raytracing" + +#: modules//benchmark.c:56 +msgid "GPU Drawing" +msgstr "Test GPU Drawing" + +#: modules//benchmark.c:222 +#, c-format +msgid "" +"[$ShellParam$]\n" +"Zebra=1\n" +"OrderType=%d\n" +"ViewType=3\n" +"ColumnTitle$Extra1=CPU Clock\n" +"ColumnTitle$Progress=Results\n" +"ColumnTitle$TextValue=CPU\n" +"ShowColumnHeaders=true\n" +"[%s]\n" +"This Machine=%.3f|%s MHz\n" +"%s" +msgstr "" +"[$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" +"Cet Ordinateur=%.3f|%s MHz\n" +"%s" + +#: modules//benchmark.c:235 +#, c-format +msgid "" +"[$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" +"%s" +msgstr "" +"[$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" +"%s" + +#: modules//benchmark.c:363 +#, c-format +msgid "Benchmarking: %s." +msgstr "Benchmarking: %s." + +#: modules//benchmark.c:377 +msgid "Benchmarking. Please do not move your mouse or press any keys." +msgstr "Benchmarking. S'il vous plaît ne pas déplacer votre souris ou appuyer sur les touches" + +#: modules//benchmark.c:381 +msgid "Cancel" +msgstr "Annuler" + +#: modules//benchmark.c:511 +msgid "Results in MiB/second. Higher is better." +msgstr "Résultats en MiB/seconde. Plus c'est élevé meilleur c'est." + +#: modules//benchmark.c:514 +msgid "Results in HIMarks. Higher is better." +msgstr "Résultats en HIMarks. Plus c'est élevé meilleur c'est." + +#: modules//benchmark.c:521 +msgid "Results in seconds. Lower is better." +msgstr "Résultats en secondes. Plus c'est bas meilleur c'est." + +#: modules//benchmark.c:529 +msgid "Benchmarks" +msgstr "Benchmarks" + +#: modules//benchmark.c:547 +msgid "Perform tasks and compare with other systems" +msgstr "Effectuer des tâches et les comparer avec d'autres systèmes" + +#: modules//benchmark.c:634 +msgid "Send benchmark results" +msgstr "Envoyer vos résultats de référence" + +#: modules//benchmark.c:639 +msgid "Receive benchmark results" +msgstr "Recevoir les résultats de benchmark" + +#: modules//computer/alsa.c:26 +msgid "[Audio Devices]\n" +msgstr "[Audio Devices]\n" + +#: modules//computer/alsa.c:33 +#, c-format +msgid "Audio Adapter#%d=%s\n" +msgstr "Adapteur Audio#%d=%s\n" + +#: modules//computer/boots.c:33 +msgid "[Boots]\n" +msgstr "[Boots]\n" + +#: modules//computer/display.c:83 +msgid "vendor string" +msgstr "fabricant" + +#: modules//computer/display.c:84 +msgid "X.Org version" +msgstr "version de X.Org" + +#: modules//computer/display.c:85 +msgid "XFree86 version" +msgstr "version de XFree86 " + +#: modules//computer/display.c:122 +#, c-format +msgid "Monitor %d=%dx%d pixels\n" +msgstr "Moniteur %d=%dx%d pixels\n" + +#: modules//computer/environment.c:32 +msgid "[Environment Variables]\n" +msgstr "[Environment Variables]\n" + +#: modules//computer/os.c:49 +#, c-format +msgid "GNU C Library version %s (%sstable)" +msgstr "GNU C Library version %s (%sstable)" + +#: modules//computer/os.c:51 +msgid "un" +msgstr "un" + +#: modules//computer/os.c:53 +#: modules//computer/os.c:130 +#: modules//devices/printers.c:99 +#: modules//devices/printers.c:106 +#: modules//devices/printers.c:116 +#: modules//devices/printers.c:131 +#: modules//devices/printers.c:140 +#: modules//devices/printers.c:243 +#: modules//devices.c:154 +#: modules//devices.c:197 +msgid "Unknown" +msgstr "Inconnu" + +#: modules//computer/os.c:72 +#, c-format +msgid "Version: %s" +msgstr "Version: %s" + +#: modules//computer/os.c:106 +msgid "Terminal" +msgstr "Terminal" + +#: modules//computer/os.c:126 +#, c-format +msgid "Unknown (Window Manager: %s)" +msgstr "Unknown (gestionnaire de fenêtres: %s)" + +#: modules//computer/os.c:166 +msgid "Unknown distribution" +msgstr "Distribution inconnue" + +#: modules//computer.c:68 +msgid "Summary" +msgstr "Résumé" + +#: modules//computer.c:69 +msgid "Operating System" +msgstr "Systeme d'exploitation" + +#: modules//computer.c:70 +msgid "Kernel Modules" +msgstr "Modules du kernel" + +#: modules//computer.c:71 +msgid "Boots" +msgstr "Boots" + +#: modules//computer.c:72 +msgid "Languages" +msgstr "Langues" + +#: modules//computer.c:73 +msgid "Filesystems" +msgstr "Fichiers Systeme" + +#: modules//computer.c:74 +msgid "Display" +msgstr "Affichage" + +#: modules//computer.c:75 +msgid "Environment Variables" +msgstr "Variables d'environnement" + +#: modules//computer.c:77 +msgid "Development" +msgstr "Developpement" + +#: modules//computer.c:79 +msgid "Users" +msgstr "Utilisateurs" + +#: modules//computer.c:80 +msgid "Groups" +msgstr "Groupes" + +#: modules//computer.c:104 +#, c-format +msgid "%dMB (%dMB used)" +msgstr "%dMB (%dMB utilisé)" + +#: modules//computer.c:200 +msgid "Scripting Languages" +msgstr "Type de script" + +#: modules//computer.c:201 +msgid "CPython" +msgstr "CPython" + +#: modules//computer.c:202 +msgid "Perl" +msgstr "Perl" + +#: modules//computer.c:203 +msgid "PHP" +msgstr "PHP" + +#: modules//computer.c:204 +msgid "Ruby" +msgstr "Ruby" + +#: modules//computer.c:205 +msgid "Bash" +msgstr "Bash" + +#: modules//computer.c:206 +msgid "Compilers" +msgstr "Compilateurs" + +#: modules//computer.c:207 +msgid "C (GCC)" +msgstr "C (GCC)" + +#: modules//computer.c:208 +msgid "Java" +msgstr "Java" + +#: modules//computer.c:209 +msgid "CSharp (Mono, old)" +msgstr "CSharp (Mono, old)" + +#: modules//computer.c:210 +msgid "CSharp (Mono)" +msgstr "CSharp (Mono)" + +#: modules//computer.c:211 +msgid "Vala" +msgstr "Vala" + +#: modules//computer.c:212 +msgid "Haskell (GHC)" +msgstr "Haskell (GHC)" + +#: modules//computer.c:213 +msgid "FreePascal" +msgstr "FreePascal" + +#: modules//computer.c:214 +msgid "Tools" +msgstr "Outils" + +#: modules//computer.c:262 +#, c-format +msgid "%s=Not found\n" +msgstr "%s=Non trouvé\n" + +#: modules//computer.c:265 +#, c-format +msgid "Detecting version: %s" +msgstr "Version détectée: %s" + +#: modules//computer.c:276 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Program\n" +"ColumnTitle$Value=Version\n" +"ShowColumnHeaders=true\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Programme\n" +"ColumnTitle$Value=Version\n" +"ShowColumnHeaders=true\n" +"%s" + +#: modules//computer.c:356 +msgid "Physical machine" +msgstr "Machine physique" + +#: modules//computer.c:373 +#, c-format +msgid "" +"[$ShellParam$]\n" +"UpdateInterval$Memory=1000\n" +"UpdateInterval$Date/Time=1000\n" +"#ReloadInterval=5000\n" +"[Computer]\n" +"Processor=%s\n" +"Memory=...\n" +"Machine Type=%s\n" +"Operating System=%s\n" +"User Name=%s\n" +"Date/Time=...\n" +"[Display]\n" +"Resolution=%dx%d pixels\n" +"OpenGL Renderer=%s\n" +"X11 Vendor=%s\n" +"\n" +"%s\n" +"[Input Devices]\n" +"%s\n" +"\n" +"%s\n" +"\n" +"%s\n" +msgstr "" +"[$ShellParam$]\n" +"UpdateInterval$Memory=1000\n" +"UpdateInterval$Date/Time=1000\n" +"#ReloadInterval=5000\n" +"[Computer]\n" +"Processeur=%s\n" +"Memoire=...\n" +"Machine Type=%s\n" +"Systeme d'exploitation=%s\n" +"Utilisateur=%s\n" +"Date/Heure=...\n" +"[Display]\n" +"Résolution=%dx%d pixels\n" +"OpenGL Renderer=%s\n" +"X11 Vendor=%s\n" +"\n" +"%s\n" +"[Input Devices]\n" +"%s\n" +"\n" +"%s\n" +"\n" +"%s\n" + +#: modules//computer.c:415 +#, c-format +msgid "" +"[$ShellParam$]\n" +"UpdateInterval$Uptime=10000\n" +"UpdateInterval$Load Average=1000\n" +"[Version]\n" +"Kernel=%s\n" +"Version=%s\n" +"C Library=%s\n" +"Distribution=%s\n" +"[Current Session]\n" +"Computer Name=%s\n" +"User Name=%s\n" +"#Language=%s\n" +"Home Directory=%s\n" +"Desktop Environment=%s\n" +"[Misc]\n" +"Uptime=...\n" +"Load Average=..." +msgstr "" +"[$ShellParam$]\n" +"UpdateInterval$Uptime=10000\n" +"UpdateInterval$Load Average=1000\n" +"[Version]\n" +"Kernel=%s\n" +"Version=%s\n" +"C Library=%s\n" +"Distribution=%s\n" +"[Current Session]\n" +"Ordinateur=%s\n" +"Utilisateur=%s\n" +"#Language=%s\n" +"Dossier Home=%s\n" +"Environnement de bureau=%s\n" +"[Misc]\n" +"durée de fonctionnent=...\n" +"Charge moyenne=..." + +#: modules//computer.c:444 +#, c-format +msgid "" +"[Loaded Modules]\n" +"%s[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Name\n" +"ColumnTitle$Value=Description\n" +"ShowColumnHeaders=true\n" +msgstr "" +"[Loaded Modules]\n" +"%s[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Name\n" +"ColumnTitle$Value=Description\n" +"ShowColumnHeaders=true\n" + +#: modules//computer.c:455 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Date & Time\n" +"ColumnTitle$Value=Kernel Version\n" +"ShowColumnHeaders=true\n" +"\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Date & Time\n" +"ColumnTitle$Value=Kernel Version\n" +"ShowColumnHeaders=true\n" +"\n" +"%s" + +#: modules//computer.c:465 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Language Code\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" +"[Available Languages]\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Type Code\n" +"ColumnTitle$Value=Nom\n" +"ShowColumnHeaders=true\n" +"[Available Langages]\n" +"%s" + +#: modules//computer.c:476 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ViewType=4\n" +"ReloadInterval=5000\n" +"Zebra=1\n" +"NormalizePercentage=false\n" +"ColumnTitle$Extra1=Mount Point\n" +"ColumnTitle$Progress=Usage\n" +"ColumnTitle$TextValue=Device\n" +"ShowColumnHeaders=true\n" +"[Mounted File Systems]\n" +"%s\n" +msgstr "" +"[$ShellParam$]\n" +"ViewType=4\n" +"ReloadInterval=5000\n" +"Zebra=1\n" +"NormalizePercentage=false\n" +"ColumnTitle$Extra1=Point de montage\n" +"ColumnTitle$Progress=Usage\n" +"ColumnTitle$TextValue=Périphérique\n" +"ShowColumnHeaders=true\n" +"[Mounted File Systems]\n" +"%s\n" + +#: modules//computer.c:490 +#, c-format +msgid "" +"[Display]\n" +"Resolution=%dx%d pixels\n" +"Vendor=%s\n" +"Version=%s\n" +"[Monitors]\n" +"%s[Extensions]\n" +"%s[OpenGL]\n" +"Vendor=%s\n" +"Renderer=%s\n" +"Version=%s\n" +"Direct Rendering=%s\n" +msgstr "" +"[Affichage]\n" +"Resolution=%dx%d pixels\n" +"Fabricant=%s\n" +"Version=%s\n" +"[Monitors]\n" +"%s[Extensions]\n" +"%s[OpenGL]\n" +"Vendeur=%s\n" +"Renderer=%s\n" +"Version=%s\n" +"Direct Rendering=%s\n" + +#: modules//computer.c:512 +msgid "Y_es" +msgstr "O_ui" + +#: modules//computer.c:512 +#: modules//devices/printers.c:138 +#: hardinfo//hardinfo.c:63 +msgid "No" +msgstr "Non" + +#: modules//computer.c:526 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ReloadInterval=10000\n" +"ColumnTitle$TextValue=Name\n" +"ColumnTitle$Value=Group ID\n" +"ShowColumnHeaders=true\n" +"[Groups]\n" +"%s\n" +msgstr "" +"[$ShellParam$]\n" +"ReloadInterval=10000\n" +"ColumnTitle$TextValue=Nom\n" +"ColumnTitle$Value=Group ID\n" +"ShowColumnHeaders=true\n" +"[Groups]\n" +"%s\n" + +#: modules//computer.c:606 +msgid "Computer" +msgstr "Ordinateur" + +#: modules//computer.c:700 +msgid "Gathers high-level computer information" +msgstr "Collecte des informations de l'ordinateur" + +#: modules//devices/battery.c:181 +#, c-format +msgid "" +"\n" +"[Battery: %s]\n" +"State=%s (load: %s)\n" +"Capacity=%s / %s (%.2f%%)\n" +"Battery Technology=%s (%s)\n" +"Manufacturer=%s\n" +"Model Number=%s\n" +"Serial Number=%s\n" +msgstr "" +"\n" +"[Battery: %s]\n" +"Etat=%s (load: %s)\n" +"Capacité=%s / %s (%.2f%%)\n" +"Technologie=%s (%s)\n" +"Fabriquant=%s\n" +"Modele=%s\n" +"Numéro de série=%s\n" + +#: modules//devices/battery.c:266 +#, c-format +msgid "" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Remaining Charge=%s of %s\n" +"Using=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" +msgstr"" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Charge restante=%s of %s\n" +"Etat=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" + +#: modules//devices/battery.c:278 +#, c-format +msgid "" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Using=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" +msgstr "" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Etat=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" + +#: modules//devices/battery.c:304 +msgid "" +"[No batteries]\n" +"No batteries found on this system=\n" +msgstr "" +"[Aucune batterie]\n" +"Aucune batterie trouvée sur ce système=\n" + +#: modules//devices/printers.c:81 +msgid "⚬ Can do black and white printing=\n" +msgstr "⚬ Impression en noir et blanc =\n" + +#: modules//devices/printers.c:83 +msgid "⚬ Can do color printing=\n" +msgstr "⚬ Imprimer en couleur=\n" + +#: modules//devices/printers.c:85 +msgid "⚬ Can do duplexing=\n" +msgstr "⚬ Imprimer recto verso=\n" + +#: modules//devices/printers.c:87 +msgid "⚬ Can do staple output=\n" +msgstr "⚬ Agrafer les feuilles imprimées=\n" + +#: modules//devices/printers.c:89 +msgid "⚬ Can do copies=\n" +msgstr "⚬ Réaliser copies=\n" + +#: modules//devices/printers.c:91 +msgid "⚬ Can collate copies=\n" +msgstr "⚬ Assembler des copies=\n" + +#: modules//devices/printers.c:93 +msgid "⚬ Printer is rejecting jobs=\n" +msgstr "⚬ Imprimante rejette cette tâche=\n" + +#: modules//devices/printers.c:95 +msgid "⚬ Printer was automatically discovered and added=\n" +msgstr "⚬ Imprimante a été automatiquement détecté et ajouté=\n" + +#: modules//devices/printers.c:110 +msgid "Idle" +msgstr "Inoccupé" + +#: modules//devices/printers.c:112 +msgid "Printing a Job" +msgstr "Impression" + +#: modules//devices/printers.c:114 +msgid "Stopped" +msgstr "Arrêt" + +#: modules//devices/printers.c:138 +#: hardinfo//hardinfo.c:62 +#: hardinfo//hardinfo.c:63 +msgid "Yes" +msgstr "Oui" + +#: modules//devices/printers.c:190 +msgid "" +"[Printers]\n" +"No suitable CUPS library found=" +msgstr "" +"[Printers]\n" +"Aucune suite de librairie CUPS trouvée=" + +#: modules//devices/printers.c:200 +msgid "[Printers (CUPS)]\n" +msgstr "[Printers (CUPS)]\n" + +#: modules//devices/printers.c:263 +msgid "" +"[Printers]\n" +"No printers found=\n" +msgstr "" +"[Printers]\n" +"Aucune imprimante trouvée=\n" + +#: modules//devices/storage.c:46 +msgid "" +"\n" +"[SCSI Disks]\n" +msgstr "" +"\n" +"[SCSI Disks]\n" + +#: modules//devices/storage.c:110 +#: modules//devices/storage.c:297 +#, c-format +msgid "" +"[Device Information]\n" +"Model=%s\n" +msgstr "" +"[Device Information]\n" +"Modele=%s\n" + +#: modules//devices/storage.c:115 +#: modules//devices/storage.c:304 +#, c-format +msgid "Vendor=%s (%s)\n" +msgstr "Vendeur=%s (%s)\n" + +#: modules//devices/storage.c:120 +#: modules//devices/storage.c:309 +#, c-format +msgid "Vendor=%s\n" +msgstr "Vendeur=%s\n" + +#: modules//devices/storage.c:125 +#, c-format +msgid "" +"Type=%s\n" +"Revision=%s\n" +"[SCSI Controller]\n" +"Controller=scsi%d\n" +"Channel=%d\n" +"ID=%d\n" +"LUN=%d\n" +msgstr "" +"Type=%s\n" +"Revision=%s\n" +"[SCSI Controller]\n" +"Controleur=scsi%d\n" +"Channel=%d\n" +"ID=%d\n" +"LUN=%d\n" + +#: modules//devices/storage.c:169 +msgid "" +"\n" +"[IDE Disks]\n" +msgstr "" +"\n" +"[IDE Disks]\n" + +#: modules//devices/storage.c:242 +#, c-format +msgid "Driver=%s\n" +msgstr "Driver=%s\n" + +#: modules//devices/storage.c:314 +#, c-format +msgid "" +"Devise Name=hd%c\n" +"Media=%s\n" +"Cache=%dkb\n" +msgstr "" +"Nom Périphérique=hd%c\n" +"Media=%s\n" +"Cache=%dkb\n" + +#: modules//devices/storage.c:329 +#, c-format +msgid "" +"[Geometry]\n" +"Physical=%s\n" +"Logical=%s\n" +msgstr "" +"[Geometry]\n" +"Physique=%s\n" +"Logique=%s\n" + +#: modules//devices/storage.c:341 +#, c-format +msgid "" +"[Capabilities]\n" +"%s" +msgstr "" +"[Capabilities]\n" +"%s" + +#: modules//devices/storage.c:348 +#, c-format +msgid "" +"[Speeds]\n" +"%s" +msgstr "" +"[Speeds]\n" +"%s" + +#: modules//devices.c:74 +msgid "Processor" +msgstr "Processeur" + +#: modules//devices.c:75 +msgid "Memory" +msgstr "Mémoire" + +#: modules//devices.c:76 +msgid "PCI Devices" +msgstr "Périphériques PCI" + +#: modules//devices.c:77 +msgid "USB Devices" +msgstr "Périphériques USB" + +#: modules//devices.c:78 +msgid "Printers" +msgstr "Imprimantes" + +#: modules//devices.c:79 +msgid "Battery" +msgstr "Batterie" + +#: modules//devices.c:80 +msgid "Sensors" +msgstr "Capteurs" + +#: modules//devices.c:81 +msgid "Input Devices" +msgstr "Périphériques d'entrée" + +#: modules//devices.c:82 +msgid "Storage" +msgstr "Stockage" + +#: modules//devices.c:84 +msgid "DMI" +msgstr "DMI" + +#: modules//devices.c:85 +msgid "Memory SPD" +msgstr "Mémoire SPD" + +#: modules//devices.c:87 +msgid "Resources" +msgstr "Ressources" + +#: modules//devices.c:178 +msgid "Total Memory" +msgstr "Mémoire totale" + +#: modules//devices.c:193 +msgid " (vendor unknown)" +msgstr " (Fabricant inconnu)" + +#: modules//devices.c:195 +msgid " (model unknown)" +msgstr " (modèle inconnu)" + +#: modules//devices.c:412 +msgid "Devices" +msgstr "Périphériques" + +#: modules//devices.c:424 +msgid "Update PCI ID listing" +msgstr "Mise à jour de la liste ID PCI " + +#: modules//devices.c:436 +msgid "Update CPU feature database" +msgstr "Mise à jour des bases de données caractéristiques CPU" + +#: modules//devices.c:464 +msgid "Gathers information about hardware devices" +msgstr "Collecte des informations des périphériques" + +#: modules//network.c:59 +msgid "Interfaces" +msgstr "Interfaces" + +#: modules//network.c:60 +msgid "IP Connections" +msgstr "Connections IP" + +#: modules//network.c:61 +msgid "Routing Table" +msgstr "Table de Routage" + +#: modules//network.c:62 +msgid "ARP Table" +msgstr "Table ARP" + +#: modules//network.c:63 +msgid "DNS Servers" +msgstr "Serveurs DNS" + +#: modules//network.c:64 +msgid "Statistics" +msgstr "Statistiques" + +#: modules//network.c:65 +msgid "Shared Directories" +msgstr "Dossiers d'interopérabilités" + +#: modules//network.c:300 +#, c-format +msgid "" +"[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" +msgstr "" +"[ARP Table]\n" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ColumnTitle$TextValue=IP Addresse\n" +"ColumnTitle$Value=Interface\n" +"ColumnTitle$Extra1=MAC Address\n" +"ShowColumnHeaders=true\n" + +#: modules//network.c:321 +#, c-format +msgid "" +"[Name servers]\n" +"%s\n" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=IP Address\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" +msgstr "" +"[Name servers]\n" +"%s\n" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=IP Address\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" + +#: modules//network.c:331 +#, c-format +msgid "" +"[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" +msgstr "" +"[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" + +#: modules//network.c:345 +#, c-format +msgid "" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Interface\n" +"ColumnTitle$Value=IP Address\n" +"ColumnTitle$Extra1=Sent\n" +"ColumnTitle$Extra2=Received\n" +"ShowColumnHeaders=true\n" +"%s" +msgstr "" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Interface\n" +"ColumnTitle$Value=Addresse IP\n" +"ColumnTitle$Extra1=Envoyé\n" +"ColumnTitle$Extra2=Reçue\n" +"ShowColumnHeaders=true\n" +"%s" + +#: modules//network.c:361 +#, c-format +msgid "" +"[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" +msgstr "" + +#: modules//network.c:399 +msgid "Network" +msgstr "Réseau" + +#: modules//network.c:432 +msgid "Gathers information about this computer's network connection" +msgstr "Collecte des informations sur les connexions réseau de cet ordinateur" + +#: hardinfo//hardinfo.c:54 +msgid "" +"Copyright (C) 2003-2009 Leandro A. F. Pereira. See COPYING for details.\n" +"\n" +msgstr "" +"Copyright (C) 2003-2009 Leandro A. F. Pereira. voir COPYING pour les details.\n" +"\n" + +#: hardinfo//hardinfo.c:56 +#, c-format +msgid "" +"Compile-time options:\n" +" Release version: %s (%s)\n" +" BinReloc enabled: %s\n" +" Data prefix: %s\n" +" Library prefix: %s\n" +" Compiled on: %s %s (%s)\n" +msgstr "" +"Compile-time options:\n" +" Version: %s (%s)\n" +" BinReloc activé: %s\n" +" Data prefix: %s\n" +" Library prefix: %s\n" +" Compilation: %s %s (%s)\n" + +#: hardinfo//hardinfo.c:74 +#, c-format +msgid "" +"Failed to find runtime data.\n" +"\n" +"• Is HardInfo correctly installed?\n" +"• See if %s and %s exists and you have read permision." +msgstr "" +"Impossible de trouver les données d'exécution.\n" +"\n" +"• Est ce que HardInfo est correctement installé?\n" +"• Voir si %s et %s existes et que vous avez bien les privilèges." + +#: hardinfo//hardinfo.c:81 +#, c-format +msgid "" +"Modules:\n" +"%-20s%-15s%-12s\n" +msgstr "" +"Modules:\n" +"%-20s%-15s%-12s\n" + +#: hardinfo//hardinfo.c:82 +msgid "File Name" +msgstr "Nom du fichier" + +#: hardinfo//hardinfo.c:82 +msgid "Name" +msgstr "Nom" + +#: hardinfo//hardinfo.c:82 +msgid "Version" +msgstr "Version" + +#: hardinfo//hardinfo.c:135 +#, c-format +msgid "Unknown benchmark ``%s'' or libbenchmark.so not loaded" +msgstr "Benchmark inconnu ``%s'' ou libbenchmark.so non chargé" + +#: hardinfo//hardinfo.c:163 +msgid "Don't know what to do. Exiting." +msgstr "Que faire. Sortie." + +#: hardinfo//util.c:102 +#: hardinfo//util.c:105 +#: hardinfo//util.c:110 +#, c-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minute" +msgstr[1] "%d minutes" + +#: hardinfo//util.c:104 +#, c-format +msgid "%d hour, " +msgid_plural "%d hours, " +msgstr[0] "%d heure, " +msgstr[1] "%d heures, " + +#: hardinfo//util.c:108 +#, c-format +msgid "%d day, " +msgid_plural "%d days, " +msgstr[0] "%d jour, " +msgstr[1] "%d jours, " + +#: hardinfo//util.c:109 +#, c-format +msgid "%d hour and " +msgid_plural "%d hours and " +msgstr[0] "%d heure et " +msgstr[1] "%d heures et " + +#: hardinfo//util.c:116 +#, c-format +msgid "%.1f B" +msgstr "%.1f B" + +#: hardinfo//util.c:118 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: hardinfo//util.c:120 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: hardinfo//util.c:122 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: hardinfo//util.c:336 +msgid "Error" +msgstr "Erreur" + +#: hardinfo//util.c:336 +#: hardinfo//util.c:352 +msgid "Warning" +msgstr "Attention" + +#: hardinfo//util.c:351 +msgid "Fatal Error" +msgstr "Erreur Fatale" + +#: hardinfo//util.c:376 +msgid "creates a report and prints to standard output" +msgstr "crée un rapport et imprime sur la sortie standard" + +#: hardinfo//util.c:382 +msgid "chooses a report format (text, html)" +msgstr "choisir un format de rapport (texte, html)" + +#: hardinfo//util.c:388 +msgid "run benchmark; requires benchmark.so to be loaded" +msgstr "Envoyé le benchmark; nécessite benchmark.so" + +#: hardinfo//util.c:394 +msgid "lists modules" +msgstr "Listes des modules" + +#: hardinfo//util.c:400 +msgid "specify module to load" +msgstr "spécifie les modules à charger" + +#: hardinfo//util.c:406 +msgid "automatically load module dependencies" +msgstr "charger automatiquement les dépendances entre modules" + +#: hardinfo//util.c:413 +msgid "run in XML-RPC server mode" +msgstr "fonctionner en mode serveur XML-RPC" + +#: hardinfo//util.c:420 +msgid "shows program version and quit" +msgstr "Affiche la version du programme et quitter" + +#: hardinfo//util.c:425 +msgid "- System Profiler and Benchmark tool" +msgstr "- Profil du Systeme et outil d'évaluation Benchmark" + +#: hardinfo//util.c:435 +#, c-format +msgid "" +"Unrecognized arguments.\n" +"Try ``%s --help'' for more information.\n" +msgstr "" +"commandes inconnues.\n" +"taper ``%s --help'' pour plus d'informations.\n" + +#: hardinfo//util.c:501 +#, c-format +msgid "Couldn't find a Web browser to open URL %s." +msgstr "Impossible de trouver un navigateur Web pour ouvrir l'URL %s." + +#: hardinfo//util.c:848 +#, c-format +msgid "Module \"%s\" depends on module \"%s\", load it?" +msgstr "Module \"%s\" depends du module \"%s\", le charger?" + +#: hardinfo//util.c:871 +#, c-format +msgid "Module \"%s\" depends on module \"%s\"." +msgstr "Module \"%s\" depends du module \"%s\"." + +#: hardinfo//util.c:916 +#, c-format +msgid "No module could be loaded. Check permissions on \"%s\" and try again." +msgstr "Aucun module peut être chargé. Vérifiez les permissions sur \"%s\" et essayez à nouveau." + +#: hardinfo//util.c:920 +msgid "No module could be loaded. Please use hardinfo -l to list all available modules and try again with a valid module list." +msgstr "Aucun module peut être chargé. S'il vous plaît utiliser hardinfo -l pour répertorier tous les modules disponibles et essayez à nouveau avec une liste de modules valides." + +#: hardinfo//util.c:1096 +#, c-format +msgid "Scanning: %s..." +msgstr "Scanne: %s..." + + + + diff --git a/po/hardinfo.pot b/po/hardinfo.pot new file mode 100644 index 00000000..9d83a3e5 --- /dev/null +++ b/po/hardinfo.pot @@ -0,0 +1,1498 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-10 10:11+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: shell//callbacks.c:71 +#, c-format +msgid "Remote: %s" +msgstr "" + +#: shell//callbacks.c:117 +msgid "Disconnecting..." +msgstr "" + +#: shell//callbacks.c:120 +msgid "Unloading modules..." +msgstr "" + +#: shell//callbacks.c:123 +msgid "Loading local modules..." +msgstr "" + +#: shell//callbacks.c:130 +#: shell//callbacks.c:162 +#: shell//shell.c:314 +#: shell//shell.c:816 +#: shell//shell.c:1800 +#: modules//benchmark.c:431 +#: modules//benchmark.c:439 +#: hardinfo//util.c:1112 +msgid "Done." +msgstr "" + +#: shell//callbacks.c:142 +msgid "Save Image" +msgstr "" + +#: shell//callbacks.c:158 +msgid "Saving image..." +msgstr "" + +#: shell//callbacks.c:236 +msgid "No context help available." +msgstr "" + +#: shell//callbacks.c:318 +#, c-format +msgid "%s Module" +msgstr "" + +#: shell//callbacks.c:325 +#, c-format +msgid "" +"Written by %s\n" +"Licensed under %s" +msgstr "" + +#: shell//callbacks.c:339 +#, c-format +msgid "No about information is associated with the %s module." +msgstr "" + +#: shell//callbacks.c:353 +msgid "Author:" +msgstr "" + +#: shell//callbacks.c:356 +msgid "Contributors:" +msgstr "" + +#: shell//callbacks.c:360 +msgid "Based on work by:" +msgstr "" + +#: shell//callbacks.c:361 +msgid "MD5 implementation by Colin Plumb (see md5.c for details)" +msgstr "" + +#: shell//callbacks.c:362 +msgid "SHA1 implementation by Steve Reid (see sha1.c for details)" +msgstr "" + +#: shell//callbacks.c:363 +msgid "Blowfish implementation by Paul Kocher (see blowfich.c for details)" +msgstr "" + +#: shell//callbacks.c:364 +msgid "Raytracing benchmark by John Walker (see fbench.c for details)" +msgstr "" + +#: shell//callbacks.c:365 +msgid "FFT benchmark by Scott Robert Ladd (see fftbench.c for details)" +msgstr "" + +#: shell//callbacks.c:366 +msgid "Some code partly based on x86cpucaps by Osamu Kayasono" +msgstr "" + +#: shell//callbacks.c:367 +msgid "Vendor list based on GtkSysInfo by Pissens Sebastien" +msgstr "" + +#: shell//callbacks.c:368 +msgid "DMI support based on code by Stewart Adam" +msgstr "" + +#: shell//callbacks.c:369 +msgid "SCSI support based on code by Pascal F. Martin" +msgstr "" + +#: shell//callbacks.c:373 +msgid "Jakub Szypulka" +msgstr "" + +#: shell//callbacks.c:374 +msgid "Tango Project" +msgstr "" + +#: shell//callbacks.c:375 +msgid "The GNOME Project" +msgstr "" + +#: shell//callbacks.c:376 +msgid "VMWare, Inc. (USB icon from VMWare Workstation 6)" +msgstr "" + +#: shell//callbacks.c:387 +msgid "System information and benchmark tool" +msgstr "" + +#: shell//callbacks.c:392 +msgid "" +"HardInfo is free software; you can redistribute it and/or modify it under " +"the terms of the GNU General Public License as published by the Free " +"Software Foundation, version 2.\n" +"\n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +"\n" +"You should have received a copy of the GNU General Public License along with " +"this program; if not, write to the Free Software Foundation, Inc., 51 " +"Franklin St, Fifth Floor, Boston, MA 02110-1301 USA" +msgstr "" + +#: shell//menu.c:35 +msgid "_Information" +msgstr "" + +#: shell//menu.c:36 +msgid "_Remote" +msgstr "" + +#: shell//menu.c:37 +msgid "_View" +msgstr "" + +#: shell//menu.c:38 +msgid "_Help" +msgstr "" + +#: shell//menu.c:39 +msgid "About _Modules" +msgstr "" + +#: shell//menu.c:43 +msgid "Generate _Report" +msgstr "" + +#: shell//menu.c:48 +msgid "_Network Updater..." +msgstr "" + +#: shell//menu.c:53 +msgid "_Open..." +msgstr "" + +#: shell//menu.c:58 +msgid "_Connect to..." +msgstr "" + +#: shell//menu.c:63 +msgid "_Manage hosts..." +msgstr "" + +#: shell//menu.c:68 +msgid "_Local computer" +msgstr "" + +#: shell//menu.c:73 +msgid "_Copy to Clipboard" +msgstr "" + +#: shell//menu.c:74 +msgid "Copy to clipboard" +msgstr "" + +#: shell//menu.c:78 +msgid "_Save image as..." +msgstr "" + +#: shell//menu.c:83 +msgid "_Refresh" +msgstr "" + +#: shell//menu.c:88 +msgid "Contents" +msgstr "" + +#: shell//menu.c:93 +#: shell//shell.c:1794 +#: shell//shell.c:1811 +msgid "Context help" +msgstr "" + +#: shell//menu.c:98 +msgid "_Open HardInfo Web Site" +msgstr "" + +#: shell//menu.c:103 +msgid "_Report bug" +msgstr "" + +#: shell//menu.c:108 +msgid "_Donate to the project" +msgstr "" + +#: shell//menu.c:113 +msgid "_About HardInfo" +msgstr "" + +#: shell//menu.c:114 +msgid "Displays program version information" +msgstr "" + +#: shell//menu.c:118 +msgid "_Quit" +msgstr "" + +#: shell//menu.c:125 +msgid "_Side Pane" +msgstr "" + +#: shell//menu.c:126 +msgid "Toggles side pane visibility" +msgstr "" + +#: shell//menu.c:129 +msgid "_Toolbar" +msgstr "" + +#: shell//menu.c:133 +msgid "_Accept connections" +msgstr "" + +#: shell//report.c:492 +msgid "Save File" +msgstr "" + +#: shell//report.c:616 +msgid "Cannot create ReportContext. Programming bug?" +msgstr "" + +#: shell//report.c:634 +msgid "Open the report with your web browser?" +msgstr "" + +#: shell//report.c:662 +msgid "Generating report..." +msgstr "" + +#: shell//report.c:672 +msgid "Report saved." +msgstr "" + +#: shell//report.c:674 +msgid "Error while creating the report." +msgstr "" + +#: shell//report.c:776 +msgid "Generate Report" +msgstr "" + +#: shell//report.c:793 +msgid "" +"Generate Report\n" +"Please choose the information that you wish to view in your report:" +msgstr "" + +#: shell//report.c:853 +msgid "Select _None" +msgstr "" + +#: shell//report.c:860 +msgid "Select _All" +msgstr "" + +#: shell//report.c:878 +msgid "_Generate" +msgstr "" + +#: shell//shell.c:407 +#, c-format +msgid "%s - System Information" +msgstr "" + +#: shell//shell.c:412 +msgid "System Information" +msgstr "" + +#: shell//shell.c:803 +msgid "Loading modules..." +msgstr "" + +#: shell//shell.c:1654 +#, c-format +msgid "%s → Summary" +msgstr "" + +#: shell//shell.c:1762 +msgid "Updating..." +msgstr "" + +#: shell//syncmanager.c:69 +msgid "" +"Synchronize with Central Database\n" +"The following information may be synchronized with the HardInfo central " +"database." +msgstr "" + +#: shell//syncmanager.c:72 +msgid "" +"Synchronizing\n" +"This may take some time." +msgstr "" + +#: shell//syncmanager.c:132 +msgid "" +"HardInfo was compiled without libsoup support. (Network Updater requires it.)" +msgstr "" + +#: shell//syncmanager.c:161 +#: shell//syncmanager.c:185 +#, c-format +msgid "%s (error #%d)" +msgstr "" + +#: shell//syncmanager.c:170 +#: shell//syncmanager.c:194 +msgid "Could not parse XML-RPC response" +msgstr "" + +#: shell//syncmanager.c:267 +#, c-format +msgid "" +"Server says it supports API version %d, but this version of HardInfo only " +"supports API version %d." +msgstr "" + +#: shell//syncmanager.c:362 +msgid "Contacting HardInfo Central Database" +msgstr "" + +#: shell//syncmanager.c:363 +msgid "Cleaning up" +msgstr "" + +#: shell//syncmanager.c:480 +#, c-format +msgid "%s (canceled)" +msgstr "" + +#: shell//syncmanager.c:497 +#, c-format +msgid "%s (failed)" +msgstr "" + +#: shell//syncmanager.c:509 +#, c-format +msgid "" +"Failed while performing \"%s\". Please file a bug report if this problem " +"persists. (Use the Help→Report bug option.)\n" +"\n" +"Details: %s" +msgstr "" + +#: shell//syncmanager.c:518 +#, c-format +msgid "" +"Failed while performing \"%s\". Please file a bug report if this problem " +"persists. (Use the Help→Report bug option.)" +msgstr "" + +#: shell//syncmanager.c:646 +msgid "Network Updater" +msgstr "" + +#: shell//syncmanager.c:727 +msgid "_Synchronize" +msgstr "" + +#: modules//benchmark.c:50 +msgid "CPU Blowfish" +msgstr "" + +#: modules//benchmark.c:51 +msgid "CPU CryptoHash" +msgstr "" + +#: modules//benchmark.c:52 +msgid "CPU Fibonacci" +msgstr "" + +#: modules//benchmark.c:53 +msgid "CPU N-Queens" +msgstr "" + +#: modules//benchmark.c:54 +msgid "FPU FFT" +msgstr "" + +#: modules//benchmark.c:55 +msgid "FPU Raytracing" +msgstr "" + +#: modules//benchmark.c:56 +msgid "GPU Drawing" +msgstr "" + +#: modules//benchmark.c:222 +#, c-format +msgid "" +"[$ShellParam$]\n" +"Zebra=1\n" +"OrderType=%d\n" +"ViewType=3\n" +"ColumnTitle$Extra1=CPU Clock\n" +"ColumnTitle$Progress=Results\n" +"ColumnTitle$TextValue=CPU\n" +"ShowColumnHeaders=true\n" +"[%s]\n" +"This Machine=%.3f|%s MHz\n" +"%s" +msgstr "" + +#: modules//benchmark.c:235 +#, c-format +msgid "" +"[$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" +"%s" +msgstr "" + +#: modules//benchmark.c:363 +#, c-format +msgid "Benchmarking: %s." +msgstr "" + +#: modules//benchmark.c:377 +msgid "Benchmarking. Please do not move your mouse or press any keys." +msgstr "" + +#: modules//benchmark.c:381 +msgid "Cancel" +msgstr "" + +#: modules//benchmark.c:511 +msgid "Results in MiB/second. Higher is better." +msgstr "" + +#: modules//benchmark.c:514 +msgid "Results in HIMarks. Higher is better." +msgstr "" + +#: modules//benchmark.c:521 +msgid "Results in seconds. Lower is better." +msgstr "" + +#: modules//benchmark.c:529 +msgid "Benchmarks" +msgstr "" + +#: modules//benchmark.c:547 +msgid "Perform tasks and compare with other systems" +msgstr "" + +#: modules//benchmark.c:634 +msgid "Send benchmark results" +msgstr "" + +#: modules//benchmark.c:639 +msgid "Receive benchmark results" +msgstr "" + +#: modules//computer.c:68 +msgid "Summary" +msgstr "" + +#: modules//computer.c:69 +msgid "Operating System" +msgstr "" + +#: modules//computer.c:70 +msgid "Kernel Modules" +msgstr "" + +#: modules//computer.c:71 +msgid "Boots" +msgstr "" + +#: modules//computer.c:72 +msgid "Languages" +msgstr "" + +#: modules//computer.c:73 +msgid "Filesystems" +msgstr "" + +#: modules//computer.c:74 +msgid "Display" +msgstr "" + +#: modules//computer.c:75 +msgid "Environment Variables" +msgstr "" + +#: modules//computer.c:77 +msgid "Development" +msgstr "" + +#: modules//computer.c:79 +msgid "Users" +msgstr "" + +#: modules//computer.c:80 +msgid "Groups" +msgstr "" + +#: modules//computer.c:104 +#, c-format +msgid "%dMB (%dMB used)" +msgstr "" + +#: modules//computer.c:200 +msgid "Scripting Languages" +msgstr "" + +#: modules//computer.c:201 +msgid "CPython" +msgstr "" + +#: modules//computer.c:202 +msgid "Perl" +msgstr "" + +#: modules//computer.c:203 +msgid "PHP" +msgstr "" + +#: modules//computer.c:204 +msgid "Ruby" +msgstr "" + +#: modules//computer.c:205 +msgid "Bash" +msgstr "" + +#: modules//computer.c:206 +msgid "Compilers" +msgstr "" + +#: modules//computer.c:207 +msgid "C (GCC)" +msgstr "" + +#: modules//computer.c:208 +msgid "C (Clang)" +msgstr "" + +#: modules//computer.c:209 +msgid "D (dmd)" +msgstr "" + +#: modules//computer.c:210 +msgid "Java" +msgstr "" + +#: modules//computer.c:211 +msgid "CSharp (Mono, old)" +msgstr "" + +#: modules//computer.c:212 +msgid "CSharp (Mono)" +msgstr "" + +#: modules//computer.c:213 +msgid "Vala" +msgstr "" + +#: modules//computer.c:214 +msgid "Haskell (GHC)" +msgstr "" + +#: modules//computer.c:215 +msgid "FreePascal" +msgstr "" + +#: modules//computer.c:216 +msgid "Tools" +msgstr "" + +#: modules//computer.c:217 +msgid "make" +msgstr "" + +#: modules//computer.c:218 +msgid "GDB" +msgstr "" + +#: modules//computer.c:219 +msgid "strace" +msgstr "" + +#: modules//computer.c:220 +msgid "valgrind" +msgstr "" + +#: modules//computer.c:221 +msgid "QMake" +msgstr "" + +#: modules//computer.c:264 +#, c-format +msgid "%s=Not found\n" +msgstr "" + +#: modules//computer.c:267 +#, c-format +msgid "Detecting version: %s" +msgstr "" + +#: modules//computer.c:278 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Program\n" +"ColumnTitle$Value=Version\n" +"ShowColumnHeaders=true\n" +"%s" +msgstr "" + +#: modules//computer.c:358 +msgid "Physical machine" +msgstr "" + +#: modules//computer.c:375 +#, c-format +msgid "" +"[$ShellParam$]\n" +"UpdateInterval$Memory=1000\n" +"UpdateInterval$Date/Time=1000\n" +"#ReloadInterval=5000\n" +"[Computer]\n" +"Processor=%s\n" +"Memory=...\n" +"Machine Type=%s\n" +"Operating System=%s\n" +"User Name=%s\n" +"Date/Time=...\n" +"[Display]\n" +"Resolution=%dx%d pixels\n" +"OpenGL Renderer=%s\n" +"X11 Vendor=%s\n" +"\n" +"%s\n" +"[Input Devices]\n" +"%s\n" +"\n" +"%s\n" +"\n" +"%s\n" +msgstr "" + +#: modules//computer.c:417 +#, c-format +msgid "" +"[$ShellParam$]\n" +"UpdateInterval$Uptime=10000\n" +"UpdateInterval$Load Average=1000\n" +"[Version]\n" +"Kernel=%s\n" +"Version=%s\n" +"C Library=%s\n" +"Distribution=%s\n" +"[Current Session]\n" +"Computer Name=%s\n" +"User Name=%s\n" +"#Language=%s\n" +"Home Directory=%s\n" +"Desktop Environment=%s\n" +"[Misc]\n" +"Uptime=...\n" +"Load Average=..." +msgstr "" + +#: modules//computer.c:446 +#, c-format +msgid "" +"[Loaded Modules]\n" +"%s[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Name\n" +"ColumnTitle$Value=Description\n" +"ShowColumnHeaders=true\n" +msgstr "" + +#: modules//computer.c:457 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Date & Time\n" +"ColumnTitle$Value=Kernel Version\n" +"ShowColumnHeaders=true\n" +"\n" +"%s" +msgstr "" + +#: modules//computer.c:467 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Language Code\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" +"[Available Languages]\n" +"%s" +msgstr "" + +#: modules//computer.c:478 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ViewType=4\n" +"ReloadInterval=5000\n" +"Zebra=1\n" +"NormalizePercentage=false\n" +"ColumnTitle$Extra1=Mount Point\n" +"ColumnTitle$Progress=Usage\n" +"ColumnTitle$TextValue=Device\n" +"ShowColumnHeaders=true\n" +"[Mounted File Systems]\n" +"%s\n" +msgstr "" + +#: modules//computer.c:492 +#, c-format +msgid "" +"[Display]\n" +"Resolution=%dx%d pixels\n" +"Vendor=%s\n" +"Version=%s\n" +"[Monitors]\n" +"%s[Extensions]\n" +"%s[OpenGL]\n" +"Vendor=%s\n" +"Renderer=%s\n" +"Version=%s\n" +"Direct Rendering=%s\n" +msgstr "" + +#: modules//computer.c:514 +msgid "Y_es" +msgstr "" + +#: modules//computer.c:514 +#: modules//devices/printers.c:138 +#: hardinfo//hardinfo.c:63 +msgid "No" +msgstr "" + +#: modules//computer.c:528 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ReloadInterval=10000\n" +"ColumnTitle$TextValue=Name\n" +"ColumnTitle$Value=Group ID\n" +"ShowColumnHeaders=true\n" +"[Groups]\n" +"%s\n" +msgstr "" + +#: modules//computer.c:608 +msgid "Computer" +msgstr "" + +#: modules//computer.c:702 +msgid "Gathers high-level computer information" +msgstr "" + +#: modules//computer/alsa.c:26 +msgid "[Audio Devices]\n" +msgstr "" + +#: modules//computer/alsa.c:33 +#, c-format +msgid "Audio Adapter#%d=%s\n" +msgstr "" + +#: modules//computer/boots.c:33 +msgid "[Boots]\n" +msgstr "" + +#: modules//computer/display.c:122 +#, c-format +msgid "Monitor %d=%dx%d pixels\n" +msgstr "" + +#: modules//computer/environment.c:32 +msgid "[Environment Variables]\n" +msgstr "" + +#: modules//computer/os.c:57 +#, c-format +msgid "GNU C Library version %s (%sstable)" +msgstr "" + +#: modules//computer/os.c:59 +msgid "un" +msgstr "" + +#: modules//computer/os.c:61 +#: modules//computer/os.c:138 +#: modules//devices.c:154 +#: modules//devices.c:197 +#: modules//devices/printers.c:99 +#: modules//devices/printers.c:106 +#: modules//devices/printers.c:116 +#: modules//devices/printers.c:131 +#: modules//devices/printers.c:140 +#: modules//devices/printers.c:243 +msgid "Unknown" +msgstr "" + +#: modules//computer/os.c:80 +#, c-format +msgid "Version: %s" +msgstr "" + +#: modules//computer/os.c:114 +msgid "Terminal" +msgstr "" + +#: modules//computer/os.c:134 +#, c-format +msgid "Unknown (Window Manager: %s)" +msgstr "" + +#: modules//computer/os.c:174 +msgid "Unknown distribution" +msgstr "" + +#: modules//devices.c:74 +msgid "Processor" +msgstr "" + +#: modules//devices.c:75 +msgid "Memory" +msgstr "" + +#: modules//devices.c:76 +msgid "PCI Devices" +msgstr "" + +#: modules//devices.c:77 +msgid "USB Devices" +msgstr "" + +#: modules//devices.c:78 +msgid "Printers" +msgstr "" + +#: modules//devices.c:79 +msgid "Battery" +msgstr "" + +#: modules//devices.c:80 +msgid "Sensors" +msgstr "" + +#: modules//devices.c:81 +msgid "Input Devices" +msgstr "" + +#: modules//devices.c:82 +msgid "Storage" +msgstr "" + +#: modules//devices.c:84 +msgid "DMI" +msgstr "" + +#: modules//devices.c:85 +msgid "Memory SPD" +msgstr "" + +#: modules//devices.c:87 +msgid "Resources" +msgstr "" + +#: modules//devices.c:193 +msgid " (vendor unknown)" +msgstr "" + +#: modules//devices.c:195 +msgid " (model unknown)" +msgstr "" + +#: modules//devices.c:412 +msgid "Devices" +msgstr "" + +#: modules//devices.c:424 +msgid "Update PCI ID listing" +msgstr "" + +#: modules//devices.c:436 +msgid "Update CPU feature database" +msgstr "" + +#: modules//devices.c:464 +msgid "Gathers information about hardware devices" +msgstr "" + +#: modules//devices/battery.c:181 +#, c-format +msgid "" +"\n" +"[Battery: %s]\n" +"State=%s (load: %s)\n" +"Capacity=%s / %s (%.2f%%)\n" +"Battery Technology=%s (%s)\n" +"Manufacturer=%s\n" +"Model Number=%s\n" +"Serial Number=%s\n" +msgstr "" + +#: modules//devices/battery.c:258 +#, c-format +msgid "" +"\n" +"[Battery: %s]\n" +"State=%s\n" +"Capacity=%s / %s\n" +"Battery Technology=%s\n" +"Manufacturer=%s\n" +"Model Number=%s\n" +"Serial Number=%s\n" +msgstr "" + +#: modules//devices/battery.c:346 +#, c-format +msgid "" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Remaining Charge=%s of %s\n" +"Using=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" +msgstr "" + +#: modules//devices/battery.c:358 +#, c-format +msgid "" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Using=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" +msgstr "" + +#: modules//devices/battery.c:385 +msgid "" +"[No batteries]\n" +"No batteries found on this system=\n" +msgstr "" + +#: modules//devices/printers.c:81 +msgid "⚬ Can do black and white printing=\n" +msgstr "" + +#: modules//devices/printers.c:83 +msgid "⚬ Can do color printing=\n" +msgstr "" + +#: modules//devices/printers.c:85 +msgid "⚬ Can do duplexing=\n" +msgstr "" + +#: modules//devices/printers.c:87 +msgid "⚬ Can do staple output=\n" +msgstr "" + +#: modules//devices/printers.c:89 +msgid "⚬ Can do copies=\n" +msgstr "" + +#: modules//devices/printers.c:91 +msgid "⚬ Can collate copies=\n" +msgstr "" + +#: modules//devices/printers.c:93 +msgid "⚬ Printer is rejecting jobs=\n" +msgstr "" + +#: modules//devices/printers.c:95 +msgid "⚬ Printer was automatically discovered and added=\n" +msgstr "" + +#: modules//devices/printers.c:110 +msgid "Idle" +msgstr "" + +#: modules//devices/printers.c:112 +msgid "Printing a Job" +msgstr "" + +#: modules//devices/printers.c:114 +msgid "Stopped" +msgstr "" + +#: modules//devices/printers.c:138 +#: hardinfo//hardinfo.c:62 +#: hardinfo//hardinfo.c:63 +msgid "Yes" +msgstr "" + +#: modules//devices/printers.c:190 +msgid "" +"[Printers]\n" +"No suitable CUPS library found=" +msgstr "" + +#: modules//devices/printers.c:200 +msgid "[Printers (CUPS)]\n" +msgstr "" + +#: modules//devices/printers.c:263 +msgid "" +"[Printers]\n" +"No printers found=\n" +msgstr "" + +#: modules//devices/storage.c:46 +msgid "" +"\n" +"[SCSI Disks]\n" +msgstr "" + +#: modules//devices/storage.c:110 +#: modules//devices/storage.c:297 +#, c-format +msgid "" +"[Device Information]\n" +"Model=%s\n" +msgstr "" + +#: modules//devices/storage.c:115 +#: modules//devices/storage.c:304 +#, c-format +msgid "Vendor=%s (%s)\n" +msgstr "" + +#: modules//devices/storage.c:120 +#: modules//devices/storage.c:309 +#, c-format +msgid "Vendor=%s\n" +msgstr "" + +#: modules//devices/storage.c:125 +#, c-format +msgid "" +"Type=%s\n" +"Revision=%s\n" +"[SCSI Controller]\n" +"Controller=scsi%d\n" +"Channel=%d\n" +"ID=%d\n" +"LUN=%d\n" +msgstr "" + +#: modules//devices/storage.c:169 +msgid "" +"\n" +"[IDE Disks]\n" +msgstr "" + +#: modules//devices/storage.c:242 +#, c-format +msgid "Driver=%s\n" +msgstr "" + +#: modules//devices/storage.c:314 +#, c-format +msgid "" +"Device Name=hd%c\n" +"Media=%s\n" +"Cache=%dkb\n" +msgstr "" + +#: modules//devices/storage.c:329 +#, c-format +msgid "" +"[Geometry]\n" +"Physical=%s\n" +"Logical=%s\n" +msgstr "" + +#: modules//devices/storage.c:341 +#, c-format +msgid "" +"[Capabilities]\n" +"%s" +msgstr "" + +#: modules//devices/storage.c:348 +#, c-format +msgid "" +"[Speeds]\n" +"%s" +msgstr "" + +#: modules//devices/x86/processor.c:145 +#: modules//devices/x86_64/processor.c:145 +msgid "Cache information not available=\n" +msgstr "" + +#: modules//devices/x86/processor.c:484 +#: modules//devices/x86_64/processor.c:484 +#, c-format +msgid "" +"[Processor]\n" +"Name=%s\n" +"Family, model, stepping=%d, %d, %d (%s)\n" +"Vendor=%s\n" +"[Configuration]\n" +"Cache Size=%dkb\n" +"Frequency=%.2fMHz\n" +"BogoMIPS=%.2f\n" +"Byte Order=%s\n" +"[Features]\n" +"FDIV Bug=%s\n" +"HLT Bug=%s\n" +"F00F Bug=%s\n" +"Coma Bug=%s\n" +"Has FPU=%s\n" +"[Cache]\n" +"%s\n" +"[Capabilities]\n" +"%s" +msgstr "" + +#: modules//devices/x86/processor.c:542 +#: modules//devices/x86_64/processor.c:542 +#, c-format +msgid "%s$CPU%d$%s=%.2fMHz\n" +msgstr "" + +#: modules//network.c:59 +msgid "Interfaces" +msgstr "" + +#: modules//network.c:60 +msgid "IP Connections" +msgstr "" + +#: modules//network.c:61 +msgid "Routing Table" +msgstr "" + +#: modules//network.c:62 +msgid "ARP Table" +msgstr "" + +#: modules//network.c:63 +msgid "DNS Servers" +msgstr "" + +#: modules//network.c:64 +msgid "Statistics" +msgstr "" + +#: modules//network.c:65 +msgid "Shared Directories" +msgstr "" + +#: modules//network.c:300 +#, c-format +msgid "" +"[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" +msgstr "" + +#: modules//network.c:321 +#, c-format +msgid "" +"[Name servers]\n" +"%s\n" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=IP Address\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" +msgstr "" + +#: modules//network.c:331 +#, c-format +msgid "" +"[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" +msgstr "" + +#: modules//network.c:345 +#, c-format +msgid "" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Interface\n" +"ColumnTitle$Value=IP Address\n" +"ColumnTitle$Extra1=Sent\n" +"ColumnTitle$Extra2=Received\n" +"ShowColumnHeaders=true\n" +"%s" +msgstr "" + +#: modules//network.c:361 +#, c-format +msgid "" +"[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" +msgstr "" + +#: modules//network.c:399 +msgid "Network" +msgstr "" + +#: modules//network.c:432 +msgid "Gathers information about this computer's network connection" +msgstr "" + +#: hardinfo//hardinfo.c:54 +msgid "" +"Copyright (C) 2003-2009 Leandro A. F. Pereira. See COPYING for details.\n" +"\n" +msgstr "" + +#: hardinfo//hardinfo.c:56 +#, c-format +msgid "" +"Compile-time options:\n" +" Release version: %s (%s)\n" +" BinReloc enabled: %s\n" +" Data prefix: %s\n" +" Library prefix: %s\n" +" Compiled on: %s %s (%s)\n" +msgstr "" + +#: hardinfo//hardinfo.c:74 +#, c-format +msgid "" +"Failed to find runtime data.\n" +"\n" +"• Is HardInfo correctly installed?\n" +"• See if %s and %s exists and you have read permision." +msgstr "" + +#: hardinfo//hardinfo.c:81 +#, c-format +msgid "" +"Modules:\n" +"%-20s%-15s%-12s\n" +msgstr "" + +#: hardinfo//hardinfo.c:82 +msgid "File Name" +msgstr "" + +#: hardinfo//hardinfo.c:82 +msgid "Name" +msgstr "" + +#: hardinfo//hardinfo.c:82 +msgid "Version" +msgstr "" + +#: hardinfo//hardinfo.c:135 +#, c-format +msgid "Unknown benchmark ``%s'' or libbenchmark.so not loaded" +msgstr "" + +#: hardinfo//hardinfo.c:163 +msgid "Don't know what to do. Exiting." +msgstr "" + +#: hardinfo//util.c:104 +#: hardinfo//util.c:107 +#: hardinfo//util.c:112 +#, c-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +#: hardinfo//util.c:106 +#, c-format +msgid "%d hour, " +msgid_plural "%d hours, " +msgstr[0] "" +msgstr[1] "" + +#: hardinfo//util.c:110 +#, c-format +msgid "%d day, " +msgid_plural "%d days, " +msgstr[0] "" +msgstr[1] "" + +#: hardinfo//util.c:111 +#, c-format +msgid "%d hour and " +msgid_plural "%d hours and " +msgstr[0] "" +msgstr[1] "" + +#: hardinfo//util.c:118 +#, c-format +msgid "%.1f B" +msgstr "" + +#: hardinfo//util.c:120 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: hardinfo//util.c:122 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: hardinfo//util.c:124 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: hardinfo//util.c:126 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: hardinfo//util.c:128 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: hardinfo//util.c:342 +msgid "Error" +msgstr "" + +#: hardinfo//util.c:342 +#: hardinfo//util.c:358 +msgid "Warning" +msgstr "" + +#: hardinfo//util.c:357 +msgid "Fatal Error" +msgstr "" + +#: hardinfo//util.c:382 +msgid "creates a report and prints to standard output" +msgstr "" + +#: hardinfo//util.c:388 +msgid "chooses a report format (text, html)" +msgstr "" + +#: hardinfo//util.c:394 +msgid "run benchmark; requires benchmark.so to be loaded" +msgstr "" + +#: hardinfo//util.c:400 +msgid "lists modules" +msgstr "" + +#: hardinfo//util.c:406 +msgid "specify module to load" +msgstr "" + +#: hardinfo//util.c:412 +msgid "automatically load module dependencies" +msgstr "" + +#: hardinfo//util.c:419 +msgid "run in XML-RPC server mode" +msgstr "" + +#: hardinfo//util.c:426 +msgid "shows program version and quit" +msgstr "" + +#: hardinfo//util.c:431 +msgid "- System Profiler and Benchmark tool" +msgstr "" + +#: hardinfo//util.c:441 +#, c-format +msgid "" +"Unrecognized arguments.\n" +"Try ``%s --help'' for more information.\n" +msgstr "" + +#: hardinfo//util.c:507 +#, c-format +msgid "Couldn't find a Web browser to open URL %s." +msgstr "" + +#: hardinfo//util.c:854 +#, c-format +msgid "Module \"%s\" depends on module \"%s\", load it?" +msgstr "" + +#: hardinfo//util.c:877 +#, c-format +msgid "Module \"%s\" depends on module \"%s\"." +msgstr "" + +#: hardinfo//util.c:922 +#, c-format +msgid "No module could be loaded. Check permissions on \"%s\" and try again." +msgstr "" + +#: hardinfo//util.c:926 +msgid "" +"No module could be loaded. Please use hardinfo -l to list all available " +"modules and try again with a valid module list." +msgstr "" + +#: hardinfo//util.c:1102 +#, c-format +msgid "Scanning: %s..." +msgstr "" diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 00000000..ca33d0a0 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,1812 @@ +msgid "" +msgstr "" +"Project-Id-Version: hardinfo puppy\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-09-01 22:24+0300\n" +"PO-Revision-Date: \n" +"Last-Translator: Sergey Rodin \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Russian\n" +"X-Poedit-Country: UKRAINE\n" +"X-Poedit-SourceCharset: utf-8\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: shell/callbacks.c:71 +#, c-format +msgid "Remote: %s" +msgstr "Удалённо: %s" + +#: shell/callbacks.c:117 +msgid "Disconnecting..." +msgstr "Отключение..." + +#: shell/callbacks.c:120 +msgid "Unloading modules..." +msgstr "Выгрузка модулей..." + +#: shell/callbacks.c:123 +msgid "Loading local modules..." +msgstr "Загрузка локальных модулей..." + +#: shell/callbacks.c:130 +#: shell/callbacks.c:162 +#: shell/shell.c:314 +#: shell/shell.c:814 +#: shell/shell.c:1796 +#: modules/benchmark.c:431 +#: modules/benchmark.c:439 +#: hardinfo/util.c:1106 +msgid "Done." +msgstr "Выполнено." + +#: shell/callbacks.c:142 +msgid "Save Image" +msgstr "Сохранить изображение" + +#: shell/callbacks.c:158 +msgid "Saving image..." +msgstr "Сохранение изображения..." + +#: shell/callbacks.c:236 +msgid "No context help available." +msgstr "Контекстная справка недоступна" + +#: shell/callbacks.c:318 +#, c-format +msgid "%s Module" +msgstr "%s модуль" + +#: shell/callbacks.c:325 +#, c-format +msgid "" +"Written by %s\n" +"Licensed under %s" +msgstr "" +"Автор программы %s\n" +"Лицензия %s" + +#: shell/callbacks.c:339 +#, c-format +msgid "No about information is associated with the %s module." +msgstr "Нет информации о модуле %s." + +#: shell/callbacks.c:353 +msgid "Author:" +msgstr "Автор:" + +#: shell/callbacks.c:356 +msgid "Contributors:" +msgstr "Участники:" + +#: shell/callbacks.c:360 +msgid "Based on work by:" +msgstr "Основан на работах:" + +#: shell/callbacks.c:361 +msgid "MD5 implementation by Colin Plumb (see md5.c for details)" +msgstr "Реализация MD5 от Colin Plumb (см. подробности в md5.c)" + +#: shell/callbacks.c:362 +msgid "SHA1 implementation by Steve Reid (see sha1.c for details)" +msgstr "Реализация SHA1 от Steve Reid (см. подробности в sha1.c) " + +#: shell/callbacks.c:363 +msgid "Blowfish implementation by Paul Kocher (see blowfich.c for details)" +msgstr "Реализация Blowfish от Paul Kocher (см. подробности в blowfich.c)" + +#: shell/callbacks.c:364 +msgid "Raytracing benchmark by John Walker (see fbench.c for details)" +msgstr "Тест Raytracing от John Walker (см. подробности в fbench.c)" + +#: shell/callbacks.c:365 +msgid "FFT benchmark by Scott Robert Ladd (see fftbench.c for details)" +msgstr "Тест FFT Скотта от Robert Ladd (см. подробности в fbench.c)" + +#: shell/callbacks.c:366 +msgid "Some code partly based on x86cpucaps by Osamu Kayasono" +msgstr "Часть кода основана на x86cpucaps от Osamu Kayasono" + +#: shell/callbacks.c:367 +msgid "Vendor list based on GtkSysInfo by Pissens Sebastien" +msgstr "Список поставщиков основан на GtkSysInfo от Pissens Sebastien" + +#: shell/callbacks.c:368 +msgid "DMI support based on code by Stewart Adam" +msgstr "Поддержка DMI основана на коде от Stewart Adam" + +#: shell/callbacks.c:369 +msgid "SCSI support based on code by Pascal F. Martin" +msgstr "Поддержка SCSI основана на коде от Pascal F. Martin" + +#: shell/callbacks.c:373 +#, fuzzy +msgid "Jakub Szypulka" +msgstr "Jakub Szypulka" + +#: shell/callbacks.c:374 +msgid "Tango Project" +msgstr "Проект Tango" + +#: shell/callbacks.c:375 +msgid "The GNOME Project" +msgstr "Проект GNOME" + +#: shell/callbacks.c:376 +msgid "VMWare, Inc. (USB icon from VMWare Workstation 6)" +msgstr "VMWare, Inc. (значок USB из VMWare Workstation 6)" + +#: shell/callbacks.c:387 +msgid "System information and benchmark tool" +msgstr "Информация о системе и тестирование" + +#: shell/callbacks.c:392 +msgid "" +"HardInfo is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.\n" +"\n" +"This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n" +"\n" +"You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA" +msgstr "" +"HardInfo — это свободное программное обеспечение; вы можете распространять его и/или изменять под условиями Общей общественной лицензии GNU, которая была опубликована Фондом свободного программного обеспечения, версия 2.\n" +"\n" +"Эта программа распространятся в надежде, что она будет полезной, но БЕЗ КАКОЙ-ЛИБО ГАРАНТИИ; даже без предполагаемой гарантии ПРИГОДНОСТИ ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ. См. подробности в Общественной лицензии GNU.\n" +"\n" +"Вы должны были получить копию Общественной лицензии GNU вместе с этой программой; если нет, пишите в Фонд свободного программного обеспечения, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA" + +#: shell/menu.c:35 +msgid "_Information" +msgstr "_Информация" + +#: shell/menu.c:36 +msgid "_Remote" +msgstr "_Удалённо" + +#: shell/menu.c:37 +msgid "_View" +msgstr "_Вид" + +#: shell/menu.c:38 +msgid "_Help" +msgstr "_Справка" + +#: shell/menu.c:39 +msgid "About _Modules" +msgstr "О _модулях" + +#: shell/menu.c:43 +msgid "Generate _Report" +msgstr "Создать _отчёт" + +#: shell/menu.c:48 +msgid "_Network Updater..." +msgstr "_Обновление через сеть..." + +#: shell/menu.c:53 +msgid "_Open..." +msgstr "_Открыть..." + +#: shell/menu.c:58 +msgid "_Connect to..." +msgstr "_Подключиться к..." + +#: shell/menu.c:63 +msgid "_Manage hosts..." +msgstr "_Управление хостами..." + +#: shell/menu.c:68 +msgid "_Local computer" +msgstr "_Локальный компьютер" + +#: shell/menu.c:73 +msgid "_Copy to Clipboard" +msgstr "_Копировать в буфер" + +#: shell/menu.c:74 +msgid "Copy to clipboard" +msgstr "Копировать в буфер обмена" + +#: shell/menu.c:78 +msgid "_Save image as..." +msgstr "_Сохранить изображение как..." + +#: shell/menu.c:83 +msgid "_Refresh" +msgstr "_Обновить" + +#: shell/menu.c:88 +msgid "Contents" +msgstr "Содержание" + +#: shell/menu.c:93 +#: shell/shell.c:1790 +#: shell/shell.c:1807 +msgid "Context help" +msgstr "Контекстная справка" + +#: shell/menu.c:98 +msgid "_Open HardInfo Web Site" +msgstr "_Открыть веб-сайт Hardinfo" + +#: shell/menu.c:103 +msgid "_Report bug" +msgstr "_Сообщить об ошибке" + +#: shell/menu.c:108 +msgid "_Donate to the project" +msgstr "_Поддержать проект" + +#: shell/menu.c:113 +msgid "_About HardInfo" +msgstr "_О HardInfo" + +#: shell/menu.c:114 +msgid "Displays program version information" +msgstr "Показывает информацию о версии программы" + +#: shell/menu.c:118 +msgid "_Quit" +msgstr "_Выход" + +#: shell/menu.c:125 +msgid "_Side Pane" +msgstr "_Боковая панель" + +#: shell/menu.c:126 +msgid "Toggles side pane visibility" +msgstr "Управляет боковой панелью" + +#: shell/menu.c:129 +msgid "_Toolbar" +msgstr "_Панель инструментов" + +#: shell/menu.c:133 +msgid "_Accept connections" +msgstr "_Принимать подключения" + +#: shell/report.c:492 +msgid "Save File" +msgstr "Сохранить файл" + +#: shell/report.c:616 +msgid "Cannot create ReportContext. Programming bug?" +msgstr "Не могу создать ReportContext. Ошибка программирования?" + +#: shell/report.c:634 +msgid "Open the report with your web browser?" +msgstr "Открыть отчёт в веб-браузере?" + +#: shell/report.c:662 +msgid "Generating report..." +msgstr "Создаётся отчёт..." + +#: shell/report.c:672 +msgid "Report saved." +msgstr "Отчёт сохранён." + +#: shell/report.c:674 +msgid "Error while creating the report." +msgstr "Ошибка во время создания отчёта." + +#: shell/report.c:776 +msgid "Generate Report" +msgstr "Создать отчёт" + +#: shell/report.c:793 +msgid "" +"Generate Report\n" +"Please choose the information that you wish to view in your report:" +msgstr "" +"Создать отчёт\n" +"Пожалуйста выберите информацию, которую вы хотите видеть в отчёте:" + +#: shell/report.c:853 +msgid "Select _None" +msgstr "Выбор: нет" + +#: shell/report.c:860 +msgid "Select _All" +msgstr "Выбор: все" + +#: shell/report.c:878 +msgid "_Generate" +msgstr "_Сгенерировать" + +#: shell/shell.c:407 +#, c-format +msgid "%s - System Information" +msgstr "%s - Информация о системе" + +#: shell/shell.c:412 +msgid "System Information" +msgstr "Информация о системе" + +#: shell/shell.c:801 +msgid "Loading modules..." +msgstr "Загрузка модулей..." + +#: shell/shell.c:1650 +#, c-format +msgid "%s → Summary" +msgstr "%s → " + +#: shell/shell.c:1758 +msgid "Updating..." +msgstr "Обновление..." + +#: shell/syncmanager.c:69 +msgid "" +"Synchronize with Central Database\n" +"The following information may be synchronized with the HardInfo central database." +msgstr "" +"Синхронизировать с центральной базой данных\n" +"Следующая информация может быть синхронизирована с центральной базой данных HardInfo." + +#: shell/syncmanager.c:72 +msgid "" +"Synchronizing\n" +"This may take some time." +msgstr "" +"Синхронизация\n" +"Это может занять какое-то время." + +#: shell/syncmanager.c:132 +msgid "HardInfo was compiled without libsoup support. (Network Updater requires it.)" +msgstr "HardInfo был скомпилирован без поддержки libsoup. (Нужен для сетевого обновления.)" + +#: shell/syncmanager.c:161 +#: shell/syncmanager.c:185 +#, c-format +msgid "%s (error #%d)" +msgstr "%s (ошибка #%d)" + +#: shell/syncmanager.c:170 +#: shell/syncmanager.c:194 +msgid "Could not parse XML-RPC response" +msgstr "Не могу разобрать XML-RPC ответ" + +#: shell/syncmanager.c:267 +#, c-format +msgid "Server says it supports API version %d, but this version of HardInfo only supports API version %d." +msgstr "Сервер говорит, что поддерживает API версии %d, но эта версия HardInfo поддерживает API только версии %d." + +#: shell/syncmanager.c:362 +msgid "Contacting HardInfo Central Database" +msgstr "Подключение к центральной базе данных Hardinfo" + +#: shell/syncmanager.c:363 +msgid "Cleaning up" +msgstr "Очистка" + +#: shell/syncmanager.c:480 +#, c-format +msgid "%s (canceled)" +msgstr "%s (отменен)" + +#: shell/syncmanager.c:497 +#, c-format +msgid "%s (failed)" +msgstr "%s (ошибка)" + +#: shell/syncmanager.c:509 +#, c-format +msgid "" +"Failed while performing \"%s\". Please file a bug report if this problem persists. (Use the Help→Report bug option.)\n" +"\n" +"Details: %s" +msgstr "" +"Ошибка во время выполнения \"%s\". Если проблема будет повторяться, пожалуйста, сообщите об ошибке. (Используйте опцию в меню Справка.)\n" +"\n" +"Подробности: %s" + +#: shell/syncmanager.c:518 +#, c-format +msgid "Failed while performing \"%s\". Please file a bug report if this problem persists. (Use the Help→Report bug option.)" +msgstr "Ошибка во время выполнения \"%s\". Если проблема будет повторяться, пожалуйста, сообщите об ошибке. (Используйте опцию в меню Справка.)" + +#: shell/syncmanager.c:646 +msgid "Network Updater" +msgstr "Сетевое обновление" + +#: shell/syncmanager.c:727 +msgid "_Synchronize" +msgstr "_Синхронизировать" + +#: modules/benchmark.c:50 +#, fuzzy +msgid "CPU Blowfish" +msgstr "ЦПУ МГц" + +#: modules/benchmark.c:51 +#, fuzzy +msgid "CPU CryptoHash" +msgstr "ЦПУ МГц" + +#: modules/benchmark.c:52 +#, fuzzy +msgid "CPU Fibonacci" +msgstr "ЦПУ МГц" + +#: modules/benchmark.c:53 +#, fuzzy +msgid "CPU N-Queens" +msgstr "ЦПУ МГц" + +#: modules/benchmark.c:54 +msgid "FPU FFT" +msgstr "" + +#: modules/benchmark.c:55 +msgid "FPU Raytracing" +msgstr "" + +#: modules/benchmark.c:56 +msgid "GPU Drawing" +msgstr "" + +#: modules/benchmark.c:222 +#, c-format +msgid "" +"[$ShellParam$]\n" +"Zebra=1\n" +"OrderType=%d\n" +"ViewType=3\n" +"ColumnTitle$Extra1=CPU Clock\n" +"ColumnTitle$Progress=Results\n" +"ColumnTitle$TextValue=CPU\n" +"ShowColumnHeaders=true\n" +"[%s]\n" +"This Machine=%.3f|%s MHz\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"Zebra=1\n" +"OrderType=%d\n" +"ViewType=3\n" +"ColumnTitle$Extra1=Частота процессора\n" +"ColumnTitle$Progress=Результаты\n" +"ColumnTitle$TextValue=Процессор\n" +"ShowColumnHeaders=true\n" +"[%s]\n" +"Эта машина=%.3f|%s MHz\n" +"%s" + +#: modules/benchmark.c:235 +#, c-format +msgid "" +"[$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" +"%s" +msgstr "" +"[$ShellParam$]\n" +"Zebra=1\n" +"OrderType=%d\n" +"ViewType=3\n" +"ColumnTitle$Extra1=Частота процессора\n" +"ColumnTitle$Progress=Результаты\n" +"ColumnTitle$TextValue=Процессор\n" +"ShowColumnHeaders=true\n" +"[%s]\n" +"%s" + +#: modules/benchmark.c:363 +#, c-format +msgid "Benchmarking: %s." +msgstr "Тестирование: %s" + +#: modules/benchmark.c:377 +msgid "Benchmarking. Please do not move your mouse or press any keys." +msgstr "Тестирование. Пожалуйста, не двигайте мышь и не нажимайте на кнопки." + +#: modules/benchmark.c:381 +msgid "Cancel" +msgstr "Отмена" + +#: modules/benchmark.c:511 +msgid "Results in MiB/second. Higher is better." +msgstr "Результаты в МиБ/сек. Чем выше, тем лучше." + +#: modules/benchmark.c:514 +msgid "Results in HIMarks. Higher is better." +msgstr "Результаты в HIMarks. Чем выше, тем лучше." + +#: modules/benchmark.c:521 +msgid "Results in seconds. Lower is better." +msgstr "Результат в секундах. Чем ниже, тем лучше." + +#: modules/benchmark.c:529 +msgid "Benchmarks" +msgstr "Тесты" + +#: modules/benchmark.c:547 +msgid "Perform tasks and compare with other systems" +msgstr "Выполняет задания и сравнивает с другими системами" + +#: modules/benchmark.c:634 +msgid "Send benchmark results" +msgstr "Отправить результаты тестирования" + +#: modules/benchmark.c:639 +msgid "Receive benchmark results" +msgstr "Принять результаты тестирования" + +#: modules/computer.c:68 +msgid "Summary" +msgstr "Общая информация" + +#: modules/computer.c:69 +msgid "Operating System" +msgstr "Операционная система" + +#: modules/computer.c:70 +msgid "Kernel Modules" +msgstr "Модули ядра" + +#: modules/computer.c:71 +msgid "Boots" +msgstr "Загрузки" + +#: modules/computer.c:72 +msgid "Languages" +msgstr "Языки" + +#: modules/computer.c:73 +msgid "Filesystems" +msgstr "Файловые системы" + +#: modules/computer.c:74 +msgid "Display" +msgstr "Дисплей" + +#: modules/computer.c:75 +msgid "Environment Variables" +msgstr "Переменные среды" + +#: modules/computer.c:77 +msgid "Development" +msgstr "Разработка" + +#: modules/computer.c:79 +msgid "Users" +msgstr "Пользователи" + +#: modules/computer.c:80 +msgid "Groups" +msgstr "Группы" + +#: modules/computer.c:104 +#, c-format +msgid "%dMB (%dMB used)" +msgstr "%dМб (%dМб занято)" + +#: modules/computer.c:200 +msgid "Scripting Languages" +msgstr "Скриптовые языки" + +#: modules/computer.c:201 +msgid "CPython" +msgstr "" + +#: modules/computer.c:202 +#, fuzzy +msgid "Perl" +msgstr "Perl" + +#: modules/computer.c:203 +msgid "PHP" +msgstr "" + +#: modules/computer.c:204 +msgid "Ruby" +msgstr "" + +#: modules/computer.c:205 +msgid "Bash" +msgstr "" + +#: modules/computer.c:206 +msgid "Compilers" +msgstr "Компиляторы" + +#: modules/computer.c:207 +msgid "C (GCC)" +msgstr "" + +#: modules/computer.c:208 +#, fuzzy +msgid "Java" +msgstr "Язык программирования Java" + +#: modules/computer.c:209 +#, fuzzy +msgid "CSharp (Mono, old)" +msgstr "Найдена старая установка %s." + +#: modules/computer.c:210 +#, fuzzy +msgid "CSharp (Mono)" +msgstr "Моноширинный шрифт" + +#: modules/computer.c:211 +#, fuzzy +msgid "Vala" +msgstr "базы данных vala" + +#: modules/computer.c:212 +msgid "Haskell (GHC)" +msgstr "" + +#: modules/computer.c:213 +msgid "FreePascal" +msgstr "" + +#: modules/computer.c:214 +msgid "Tools" +msgstr "Инструменты" + +#: modules/computer.c:262 +#, c-format +msgid "%s=Not found\n" +msgstr "%s=Не найдено\n" + +#: modules/computer.c:265 +#, c-format +msgid "Detecting version: %s" +msgstr "Определена версия: %s" + +#: modules/computer.c:276 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Program\n" +"ColumnTitle$Value=Version\n" +"ShowColumnHeaders=true\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Программа\n" +"ColumnTitle$Value=Версия\n" +"ShowColumnHeaders=true\n" +"%s" + +#: modules/computer.c:356 +msgid "Physical machine" +msgstr "Физическая машина" + +# Memory и Date/Time не переводить — не будут обновляться! +#: modules/computer.c:373 +#, c-format +msgid "" +"[$ShellParam$]\n" +"UpdateInterval$Memory=1000\n" +"UpdateInterval$Date/Time=1000\n" +"#ReloadInterval=5000\n" +"[Computer]\n" +"Processor=%s\n" +"Memory=...\n" +"Machine Type=%s\n" +"Operating System=%s\n" +"User Name=%s\n" +"Date/Time=...\n" +"[Display]\n" +"Resolution=%dx%d pixels\n" +"OpenGL Renderer=%s\n" +"X11 Vendor=%s\n" +"\n" +"%s\n" +"[Input Devices]\n" +"%s\n" +"\n" +"%s\n" +"\n" +"%s\n" +msgstr "" +"[$ShellParam$]\n" +"UpdateInterval$Память=1000\n" +"UpdateInterval$Date/Time=1000\n" +"#ReloadInterval=5000\n" +"[Компьютер]\n" +"Процессор=%s\n" +"Память=...\n" +"Тип машины=%s\n" +"Операционная система=%s\n" +"Пользователь=%s\n" +"Date/Time=...\n" +"[Дисплей]\n" +"Разрешение=%dx%d пикс.\n" +"Рендер OpenGL=%s\n" +"Поставщик X11=%s\n" +"\n" +"%s\n" +"[Устройства ввода]\n" +"%s\n" +"\n" +"%s\n" +"\n" +"%s\n" + +# Uptime, Load Average и Available entropy in /dev/random не переводить — не будут обновляться! +#: modules/computer.c:415 +#, c-format +msgid "" +"[$ShellParam$]\n" +"UpdateInterval$Uptime=10000\n" +"UpdateInterval$Load Average=1000\n" +"UpdateInterval$Available entropy in /dev/random=1000\n" +"[Version]\n" +"Kernel=%s\n" +"Version=%s\n" +"C Library=%s\n" +"Distribution=%s\n" +"[Current Session]\n" +"Computer Name=%s\n" +"User Name=%s\n" +"#Language=%s\n" +"Home Directory=%s\n" +"Desktop Environment=%s\n" +"[Misc]\n" +"Uptime=...\n" +"Load Average=...\n" +"Available entropy in /dev/random=..." +msgstr "" +"[$ShellParam$]\n" +"UpdateInterval$Uptime=10000\n" +"UpdateInterval$Load Average=1000\n" +"UpdateInterval$Available entropy in /dev/random=1000\n" +"[Версия]\n" +"Ядро=%s\n" +"Версия=%s\n" +"Библиотека C=%s\n" +"Дистрибутив=%s\n" +"[Текущая сессия]\n" +"Имя компьютера=%s\n" +"Пользователь=%s\n" +"#Язык=%s\n" +"Домашний каталог=%s\n" +"Окружение рабочего стола=%s\n" +"[Разное]\n" +"Uptime=...\n" +"Load Average=...\n" +"Available entropy in /dev/random=..." + +#: modules/computer.c:444 +#, c-format +msgid "" +"[Loaded Modules]\n" +"%s[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Name\n" +"ColumnTitle$Value=Description\n" +"ShowColumnHeaders=true\n" +msgstr "" +"[Loaded Modules]\n" +"%s[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Имя\n" +"ColumnTitle$Value=Описание\n" +"ShowColumnHeaders=true\n" + +#: modules/computer.c:455 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Date & Time\n" +"ColumnTitle$Value=Kernel Version\n" +"ShowColumnHeaders=true\n" +"\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=Дата и время\n" +"ColumnTitle$Value=Версия ядра\n" +"ShowColumnHeaders=true\n" +"\n" +"%s" + +#: modules/computer.c:465 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Language Code\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" +"[Available Languages]\n" +"%s" +msgstr "" +"[$ShellParam$]\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Код языка\n" +"ColumnTitle$Value=Название\n" +"ShowColumnHeaders=true\n" +"[Available Languages]\n" +"%s" + +#: modules/computer.c:476 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ViewType=4\n" +"ReloadInterval=5000\n" +"Zebra=1\n" +"NormalizePercentage=false\n" +"ColumnTitle$Extra1=Mount Point\n" +"ColumnTitle$Progress=Usage\n" +"ColumnTitle$TextValue=Device\n" +"ShowColumnHeaders=true\n" +"[Mounted File Systems]\n" +"%s\n" +msgstr "" +"[$ShellParam$]\n" +"ViewType=4\n" +"ReloadInterval=5000\n" +"Zebra=1\n" +"NormalizePercentage=false\n" +"ColumnTitle$Extra1=Точка монтирования\n" +"ColumnTitle$Progress=Использование\n" +"ColumnTitle$TextValue=Устройство\n" +"ShowColumnHeaders=true\n" +"[Mounted File Systems]\n" +"%s\n" + +#: modules/computer.c:490 +#, c-format +msgid "" +"[Display]\n" +"Resolution=%dx%d pixels\n" +"Vendor=%s\n" +"Version=%s\n" +"[Monitors]\n" +"%s[Extensions]\n" +"%s[OpenGL]\n" +"Vendor=%s\n" +"Renderer=%s\n" +"Version=%s\n" +"Direct Rendering=%s\n" +msgstr "" +"[Дисплей]\n" +"Разрешение=%dx%d пикс.\n" +"Поставщик=%s\n" +"Версия=%s\n" +"[Монитор]\n" +"%s[Расширения]\n" +"%s[OpenGL]\n" +"Поставщик=%s\n" +"Рендер=%s\n" +"Версия=%s\n" +"Графическое ускорение=%s\n" + +#: modules/computer.c:512 +msgid "Y_es" +msgstr "Есть" + +#: modules/computer.c:512 +#: modules/devices/printers.c:138 +msgid "No" +msgstr "Нет" + +#: modules/computer.c:526 +#, c-format +msgid "" +"[$ShellParam$]\n" +"ReloadInterval=10000\n" +"ColumnTitle$TextValue=Name\n" +"ColumnTitle$Value=Group ID\n" +"ShowColumnHeaders=true\n" +"[Groups]\n" +"%s\n" +msgstr "" +"[$ShellParam$]\n" +"ReloadInterval=10000\n" +"ColumnTitle$TextValue=Имя\n" +"ColumnTitle$Value=ID группы\n" +"ShowColumnHeaders=true\n" +"[Groups]\n" +"%s\n" + +#: modules/computer.c:606 +msgid "Computer" +msgstr "Компьютер" + +#: modules/computer.c:700 +msgid "Gathers high-level computer information" +msgstr "Собирает высокоуровневую информацию о компьютере" + +#: modules/devices.c:74 +msgid "Processor" +msgstr "Процессор" + +#: modules/devices.c:75 +msgid "Memory" +msgstr "Память" + +#: modules/devices.c:76 +msgid "PCI Devices" +msgstr "Устройства PCI" + +#: modules/devices.c:77 +msgid "USB Devices" +msgstr "Устройства USB" + +#: modules/devices.c:78 +msgid "Printers" +msgstr "Принтеры" + +#: modules/devices.c:79 +msgid "Battery" +msgstr "Батарея" + +#: modules/devices.c:80 +msgid "Sensors" +msgstr "Сенсоры" + +#: modules/devices.c:81 +msgid "Input Devices" +msgstr "Устройства ввода" + +#: modules/devices.c:82 +msgid "Storage" +msgstr "Устройства хранения" + +#: modules/devices.c:84 +msgid "DMI" +msgstr "" + +#: modules/devices.c:85 +msgid "Memory SPD" +msgstr "Память SPD" + +#: modules/devices.c:87 +msgid "Resources" +msgstr "Ресурсы" + +#: modules/devices.c:154 +#: modules/devices.c:197 +#: modules/devices/printers.c:99 +#: modules/devices/printers.c:106 +#: modules/devices/printers.c:116 +#: modules/devices/printers.c:131 +#: modules/devices/printers.c:140 +#: modules/devices/printers.c:243 +#: modules/computer/os.c:53 +#: modules/computer/os.c:130 +msgid "Unknown" +msgstr "Неизвестно" + +#: modules/devices.c:193 +msgid " (vendor unknown)" +msgstr "(поставщик неизвестен)" + +#: modules/devices.c:195 +msgid " (model unknown)" +msgstr "(модель неизвестна)" + +#: modules/devices.c:412 +msgid "Devices" +msgstr "Устройства" + +#: modules/devices.c:424 +msgid "Update PCI ID listing" +msgstr "Обновить список PCI ID" + +#: modules/devices.c:436 +msgid "Update CPU feature database" +msgstr "Обновить базу данных функций процессора" + +#: modules/devices.c:464 +msgid "Gathers information about hardware devices" +msgstr "Собирает информацию об устройствах" + +#: modules/devices.c:500 +msgid "Resource information requires superuser privileges" +msgstr "Для вывода информации о ресурсах нужны права администратора" + +#: modules/network.c:59 +msgid "Interfaces" +msgstr "Интерфейсы" + +#: modules/network.c:60 +msgid "IP Connections" +msgstr "IP Подключения" + +#: modules/network.c:61 +msgid "Routing Table" +msgstr "Таблица маршрутизации" + +#: modules/network.c:62 +msgid "ARP Table" +msgstr "Таблица ARP" + +#: modules/network.c:63 +msgid "DNS Servers" +msgstr "DNS сервера" + +#: modules/network.c:64 +msgid "Statistics" +msgstr "Статистика" + +#: modules/network.c:65 +msgid "Shared Directories" +msgstr "Общие каталоги" + +#: modules/network.c:300 +#, c-format +msgid "" +"[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" +msgstr "" +"[Таблица ARP]\n" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ColumnTitle$TextValue=IP-адрес\n" +"ColumnTitle$Value=Интерфейс\n" +"ColumnTitle$Extra1=MAC-адрес\n" +"ShowColumnHeaders=true\n" + +#: modules/network.c:321 +#, c-format +msgid "" +"[Name servers]\n" +"%s\n" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=IP Address\n" +"ColumnTitle$Value=Name\n" +"ShowColumnHeaders=true\n" +msgstr "" +"[Name servers]\n" +"%s\n" +"[$ShellParam$]\n" +"ColumnTitle$TextValue=IP-адрес\n" +"ColumnTitle$Value=Имя\n" +"ShowColumnHeaders=true\n" + +#: modules/network.c:331 +#, c-format +msgid "" +"[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" +msgstr "" +"[Connections]\n" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ColumnTitle$TextValue=Локальный адрес\n" +"ColumnTitle$Value=Протокол\n" +"ColumnTitle$Extra1=Удалённый адрес\n" +"ColumnTitle$Extra2=Состояние\n" +"ShowColumnHeaders=true\n" + +#: modules/network.c:345 +#, c-format +msgid "" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Interface\n" +"ColumnTitle$Value=IP Address\n" +"ColumnTitle$Extra1=Sent\n" +"ColumnTitle$Extra2=Received\n" +"ShowColumnHeaders=true\n" +"%s" +msgstr "" +"%s\n" +"[$ShellParam$]\n" +"ReloadInterval=3000\n" +"ViewType=1\n" +"ColumnTitle$TextValue=Интерфейс\n" +"ColumnTitle$Value=IP-адрес\n" +"ColumnTitle$Extra1=Отправлено\n" +"ColumnTitle$Extra2=Получено\n" +"ShowColumnHeaders=true\n" +"%s" + +#: modules/network.c:361 +#, c-format +msgid "" +"[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" +msgstr "" +"[IP routing table]\n" +"%s\n" +"[$ShellParam$]\n" +"ViewType=0\n" +"ReloadInterval=3000\n" +"ColumnTitle$TextValue=Цель / Шлюз\n" +"ColumnTitle$Value=Интерфейс\n" +"ColumnTitle$Extra1=Флаги\n" +"ColumnTitle$Extra2=Маска\n" +"ShowColumnHeaders=true\n" + +#: modules/network.c:399 +msgid "Network" +msgstr "Сеть" + +#: modules/network.c:432 +msgid "Gathers information about this computer's network connection" +msgstr "Собирает информацию о сетевых подключениях" + +#: modules/computer/alsa.c:26 +msgid "[Audio Devices]\n" +msgstr "[Аудио устройства]\n" + +#: modules/computer/alsa.c:33 +#, c-format +msgid "Audio Adapter#%d=%s\n" +msgstr "Звуковая карта#%d=%s\n" + +#: modules/computer/boots.c:33 +msgid "[Boots]\n" +msgstr "[Загрузки]\n" + +#: modules/computer/display.c:83 +msgid "vendor string" +msgstr "строка поставщика" + +#: modules/computer/display.c:84 +msgid "X.Org version" +msgstr "Версия X.Org" + +#: modules/computer/display.c:85 +msgid "XFree86 version" +msgstr "Версия XFree86" + +#: modules/computer/display.c:122 +#, c-format +msgid "Monitor %d=%dx%d pixels\n" +msgstr "Монитор %d=%dx%d пикселей\n" + +#: modules/computer/environment.c:32 +msgid "[Environment Variables]\n" +msgstr "[Переменные среды]\n" + +#: modules/devices/devmemory.c:89 +msgid "Total Memory" +msgstr "Общая память" + +#: modules/devices/devmemory.c:90 +msgid "Free Memory" +msgstr "Свободная память" + +#: modules/devices/devmemory.c:91 +msgid "Cached Swap" +msgstr "Кэш подкачки" + +#: modules/devices/devmemory.c:92 +msgid "High Memory" +msgstr "Высокая память" + +#: modules/devices/devmemory.c:93 +msgid "Free High Memory" +msgstr "Свободная высокая память" + +#: modules/devices/devmemory.c:94 +msgid "Low Memory" +msgstr "Низкая память" + +#: modules/devices/devmemory.c:95 +msgid "Free Low Memory" +msgstr "Свободная низкая память" + +#: modules/devices/devmemory.c:96 +msgid "Virtual Memory" +msgstr "Виртуальная память" + +#: modules/devices/devmemory.c:97 +msgid "Free Virtual Memory" +msgstr "Свободная виртуальная память" + +#: modules/devices/spd-decode.c:1475 +msgid "" +"[SPD]\n" +"Please load the eeprom module to obtain information about memory SPD=\n" +"[$ShellParam$]\n" +"ReloadInterval=500\n" +msgstr "" +"[SPD]\n" +"Пожалуйста, загрузите модуль eeprom для получения информации о памяти SPD=\n" +"[$ShellParam$]\n" +"ReloadInterval=500\n" + +#: modules/devices/spd-decode.c:1480 +msgid "" +"[SPD]\n" +"Reading memory SPD not supported on this system=\n" +msgstr "" +"[SPD]\n" +"Чтение памяти SPD не поддерживается на данной системе=\n" + +#: hardinfo/util.c:102 +#: hardinfo/util.c:105 +#: hardinfo/util.c:110 +#, c-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d минута" +msgstr[1] "%d минуты" +msgstr[2] "%d минут" + +#: hardinfo/util.c:104 +#, c-format +msgid "%d hour, " +msgid_plural "%d hours, " +msgstr[0] "%d час" +msgstr[1] "%d часа" +msgstr[2] "%d часов" + +#: hardinfo/util.c:108 +#, c-format +msgid "%d day, " +msgid_plural "%d days, " +msgstr[0] "%d день" +msgstr[1] "%d дня" +msgstr[2] "%d дней" + +#: hardinfo/util.c:109 +#, c-format +msgid "%d hour and " +msgid_plural "%d hours and " +msgstr[0] "%d час и" +msgstr[1] "%d часа и" +msgstr[2] "%d часов и" + +#: hardinfo/util.c:116 +#, c-format +msgid "%.1f B" +msgstr "%.1f Б" + +#: hardinfo/util.c:118 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f КиБ" + +#: hardinfo/util.c:120 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f МиБ" + +#: hardinfo/util.c:122 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f ГиБ" + +#: hardinfo/util.c:336 +msgid "Error" +msgstr "Ошибка" + +#: hardinfo/util.c:336 +#: hardinfo/util.c:352 +msgid "Warning" +msgstr "Предупреждение" + +#: hardinfo/util.c:351 +msgid "Fatal Error" +msgstr "Фатальная ошибка" + +#: hardinfo/util.c:376 +msgid "creates a report and prints to standard output" +msgstr "создаёт отчёт и выводит на стандартный вывод" + +#: hardinfo/util.c:382 +msgid "chooses a report format (text, html)" +msgstr "выбирает формат отчёта (text, html)" + +#: hardinfo/util.c:388 +msgid "run benchmark; requires benchmark.so to be loaded" +msgstr "запуск теста; требует, чтобы benchmark.so был загружен" + +#: hardinfo/util.c:394 +msgid "lists modules" +msgstr "список модулей" + +#: hardinfo/util.c:400 +msgid "specify module to load" +msgstr "укажите модуль для загрузки" + +#: hardinfo/util.c:406 +msgid "automatically load module dependencies" +msgstr "автоматически загружает зависимости модулей" + +#: hardinfo/util.c:413 +msgid "run in XML-RPC server mode" +msgstr "запуск в режиме сервера XML-RPC" + +#: hardinfo/util.c:420 +msgid "shows program version and quit" +msgstr "показывает версию программы и выходит" + +#: hardinfo/util.c:425 +msgid "- System Profiler and Benchmark tool" +msgstr "- Инструмент для тестирования и проверки свойств системы" + +#: hardinfo/util.c:435 +#, c-format +msgid "" +"Unrecognized arguments.\n" +"Try ``%s --help'' for more information.\n" +msgstr "" +"Неизвестные аргументы.\n" +"Используйте `%s --help' для справки.\n" + +#: hardinfo/util.c:501 +#, c-format +msgid "Couldn't find a Web browser to open URL %s." +msgstr "Не удаётся найти веб-браузер для открытия URL %s." + +#: hardinfo/util.c:848 +#, c-format +msgid "Module \"%s\" depends on module \"%s\", load it?" +msgstr "Модуль \"%s\" зависит от модуля \"%s\", загрузить его?" + +#: hardinfo/util.c:871 +#, c-format +msgid "Module \"%s\" depends on module \"%s\"." +msgstr "Модуль \"%s\" зависит от модуля \"%s\"." + +#: hardinfo/util.c:916 +#, c-format +msgid "No module could be loaded. Check permissions on \"%s\" and try again." +msgstr "Модули не могут быть загружены. Проверьте разрешения на \"%s\" и попробуйте снова." + +#: hardinfo/util.c:920 +msgid "No module could be loaded. Please use hardinfo -l to list all available modules and try again with a valid module list." +msgstr "Не удается загрузить модули. Пожалуйста, используйте hardinfo -l для получения списка доступных модулей и попробуйте снова с правильным списком модулей." + +#: hardinfo/util.c:1096 +#, c-format +msgid "Scanning: %s..." +msgstr "Сканирование: %s..." + +#: modules/devices/x86/processor.c:145 +msgid "Cache information not available=\n" +msgstr "Информация о кэше недоступна=\n" + +#: modules/devices/x86/processor.c:484 +#, c-format +msgid "" +"[Processor]\n" +"Name=%s\n" +"Family, model, stepping=%d, %d, %d (%s)\n" +"Vendor=%s\n" +"[Configuration]\n" +"Cache Size=%dkb\n" +"Frequency=%.2fMHz\n" +"BogoMIPS=%.2f\n" +"Byte Order=%s\n" +"[Features]\n" +"FDIV Bug=%s\n" +"HLT Bug=%s\n" +"F00F Bug=%s\n" +"Coma Bug=%s\n" +"Has FPU=%s\n" +"[Cache]\n" +"%s\n" +"[Capabilities]\n" +"%s" +msgstr "" +"[Процессор]\n" +"Название=%s\n" +"Семейство, модель, степпинг=%d, %d, %d (%s)\n" +"Производитель=%s\n" +"[Конфигурация]\n" +"Размер кэша=%dкб\n" +"Частота=%.2fМГц\n" +"BogoMIPS=%.2f\n" +"Порядок байтов=%s\n" +"[Функции]\n" +"Ошибка FDIV=%s\n" +"Ошибка HLT=%s\n" +"Ошибка F00F=%s\n" +"Ошибка Coma=%s\n" +"FPU=%s\n" +"[Кэш]\n" +"%s\n" +"[Возможности]\n" +"%s" + +#: modules/devices/x86/processor.c:542 +#, c-format +msgid "%s$CPU%d$%s=%.2fMHz\n" +msgstr "%s$CPU%d$%s=%.2fМГц\n" + +#: modules/devices/printers.c:81 +msgid "⚬ Can do black and white printing=\n" +msgstr "⚬ Может печатать черно-белым=\n" + +#: modules/devices/printers.c:83 +msgid "⚬ Can do color printing=\n" +msgstr "⚬ Может печатать цветным=\n" + +#: modules/devices/printers.c:85 +#, fuzzy +msgid "⚬ Can do duplexing=\n" +msgstr "Не исправлять:" + +#: modules/devices/printers.c:87 +#, fuzzy +msgid "⚬ Can do staple output=\n" +msgstr "Выходной файл не может быть переименован." + +#: modules/devices/printers.c:89 +msgid "⚬ Can do copies=\n" +msgstr "⚬ Можно делать копии=\n" + +#: modules/devices/printers.c:91 +msgid "⚬ Can collate copies=\n" +msgstr "⚬ Can collate copies=\n" + +#: modules/devices/printers.c:93 +msgid "⚬ Printer is rejecting jobs=\n" +msgstr "⚬ Printer is rejecting jobs=\n" + +#: modules/devices/printers.c:95 +msgid "⚬ Printer was automatically discovered and added=\n" +msgstr "⚬ Принтер был автоматически найден и добавлен=\n" + +#: modules/devices/printers.c:110 +msgid "Idle" +msgstr "Неактивен" + +#: modules/devices/printers.c:112 +msgid "Printing a Job" +msgstr "Печатается задача" + +#: modules/devices/printers.c:114 +msgid "Stopped" +msgstr "Остановлен" + +#: modules/devices/printers.c:138 +msgid "Yes" +msgstr "Да" + +#: modules/devices/printers.c:190 +msgid "" +"[Printers]\n" +"No suitable CUPS library found=" +msgstr "" +"[Принтеры]\n" +"Подходящей библиотеки CUPS не найдено=" + +#: modules/devices/printers.c:200 +msgid "[Printers (CUPS)]\n" +msgstr "[Принтеры (CUPS)]\n" + +#: modules/devices/printers.c:263 +msgid "" +"[Printers]\n" +"No printers found=\n" +msgstr "" +"[Принтеры]\n" +"Принтеры не найдены=\n" + +#: modules/computer/os.c:49 +#, c-format +msgid "GNU C Library version %s (%sstable)" +msgstr "Библиотека GNU C версии %s (%s стабильна)" + +#: modules/computer/os.c:51 +msgid "un" +msgstr "не" + +#: modules/computer/os.c:72 +#, c-format +msgid "Version: %s" +msgstr "Версия: %s" + +#: modules/computer/os.c:106 +msgid "Terminal" +msgstr "Терминал" + +#: modules/computer/os.c:126 +#, c-format +msgid "Unknown (Window Manager: %s)" +msgstr "Неизвестно (Оконный менеджер: %s)" + +#: modules/computer/os.c:166 +msgid "Unknown distribution" +msgstr "Неизвестный дистрибутив" + +#: modules/devices/battery.c:181 +#, c-format +msgid "" +"\n" +"[Battery: %s]\n" +"State=%s (load: %s)\n" +"Capacity=%s / %s (%.2f%%)\n" +"Battery Technology=%s (%s)\n" +"Manufacturer=%s\n" +"Model Number=%s\n" +"Serial Number=%s\n" +msgstr "" +"\n" +"[Батарея: %s]\n" +"Состояние=%s (нагрузка: %s)\n" +"Емкость=%s / %s (%.2f%%)\n" +"Технология батареи=%s (%s)\n" +"Изготовитель=%s\n" +"Номер модели=%s\n" +"Серийный номер=%s\n" + +#: modules/devices/battery.c:266 +#, c-format +msgid "" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Remaining Charge=%s of %s\n" +"Using=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" +msgstr "" +"\n" +"[Батарея (APM)]\n" +"Заряд=%d%%\n" +"Оставшийся заряд=%s из %s\n" +"Используется=%s\n" +"APM драйвер версии=%s\n" +"APM BIOS версии=%s\n" + +#: modules/devices/battery.c:278 +#, c-format +msgid "" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Using=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" +msgstr "" +"\n" +"[Батарея (APM)]\n" +"Заряд=%d%%\n" +"Используется=%s\n" +"APM драйвер версии=%s\n" +"APM BIOS версии=%s\n" + +#: modules/devices/battery.c:304 +msgid "" +"[No batteries]\n" +"No batteries found on this system=\n" +msgstr "" +"[No batteries]\n" +"Батареи не найдены на этой системе=\n" + +#: modules/devices/storage.c:46 +msgid "" +"\n" +"[SCSI Disks]\n" +msgstr "" +"\n" +"[SCSI диски]\n" + +#: modules/devices/storage.c:110 +#: modules/devices/storage.c:297 +#, c-format +msgid "" +"[Device Information]\n" +"Model=%s\n" +msgstr "" +"[Информация об устройстве]\n" +"Модель=%s\n" + +#: modules/devices/storage.c:115 +#: modules/devices/storage.c:304 +#, c-format +msgid "Vendor=%s (%s)\n" +msgstr "Изготовитель=%s (%s)\n" + +#: modules/devices/storage.c:120 +#: modules/devices/storage.c:309 +#, c-format +msgid "Vendor=%s\n" +msgstr "Изготовитель=%s\n" + +#: modules/devices/storage.c:125 +#, c-format +msgid "" +"Type=%s\n" +"Revision=%s\n" +"[SCSI Controller]\n" +"Controller=scsi%d\n" +"Channel=%d\n" +"ID=%d\n" +"LUN=%d\n" +msgstr "" + +#: modules/devices/storage.c:169 +msgid "" +"\n" +"[IDE Disks]\n" +msgstr "" +"\n" +"[IDE диски]\n" + +#: modules/devices/storage.c:242 +#, c-format +msgid "Driver=%s\n" +msgstr "Драйвер=%s\n" + +#: modules/devices/storage.c:314 +#, c-format +msgid "" +"Device Name=hd%c\n" +"Media=%s\n" +"Cache=%dkb\n" +msgstr "" +"Имя устройства=hd%c\n" +"Медиа=%s\n" +"Кэш=%dkb\n" + +#: modules/devices/storage.c:329 +#, c-format +msgid "" +"[Geometry]\n" +"Physical=%s\n" +"Logical=%s\n" +msgstr "" +"[Геометрия]\n" +"Физическая=%s\n" +"Логическая=%s\n" + +#: modules/devices/storage.c:341 +#, c-format +msgid "" +"[Capabilities]\n" +"%s" +msgstr "" +"[Возможности]\n" +"%s" + +#: modules/devices/storage.c:348 +#, c-format +msgid "" +"[Speeds]\n" +"%s" +msgstr "" +"[Скорости]\n" +"%s" + +#~ msgid "" +#~ "[$ShellParam$]\n" +#~ "ReloadInterval=10000\n" +#~ "ViewType=1\n" +#~ "[Users]\n" +#~ "%s\n" +#~ msgstr "" +#~ "[$ShellParam$]\n" +#~ "ReloadInterval=10000\n" +#~ "ViewType=1\n" +#~ "[Пользователи]\n" +#~ "%s\n" + +#, fuzzy +#~ msgid "" +#~ "[Operating System]\n" +#~ "Icon=os.png\n" +#~ "Method=computer::getOS\n" +#~ "[CPU]\n" +#~ "Icon=processor.png\n" +#~ "Method=devices::getProcessorName\n" +#~ "[RAM]\n" +#~ "Icon=memory.png\n" +#~ "Method=devices::getMemoryTotal\n" +#~ "[Motherboard]\n" +#~ "Icon=module.png\n" +#~ "Method=devices::getMotherboard\n" +#~ "[Graphics]\n" +#~ "Icon=monitor.png\n" +#~ "Method=computer::getDisplaySummary\n" +#~ "[Storage]\n" +#~ "Icon=hdd.png\n" +#~ "Method=devices::getStorageDevices\n" +#~ "[Printers]\n" +#~ "Icon=printer.png\n" +#~ "Method=devices::getPrinters\n" +#~ "[Audio]\n" +#~ "Icon=audio.png\n" +#~ "Method=computer::getAudioCards\n" +#~ msgstr "" +#~ "[Operating System]\n" +#~ "Icon=os.png\n" +#~ "Method=computer::getOS\n" +#~ "[CPU]\n" +#~ "Icon=processor.png\n" +#~ "Method=devices::getProcessorName\n" +#~ "[RAM]\n" +#~ "Icon=memory.png\n" +#~ "Method=devices::getMemoryTotal\n" +#~ "[Motherboard]\n" +#~ "Icon=module.png\n" +#~ "Method=devices::getMotherboard\n" +#~ "[Graphics]\n" +#~ "Icon=monitor.png\n" +#~ "Method=computer::getDisplaySummary\n" +#~ "[Storage]\n" +#~ "Icon=hdd.png\n" +#~ "Method=devices::getStorageDevices\n" +#~ "[Printers]\n" +#~ "Icon=printer.png\n" +#~ "Method=devices::getPrinters\n" +#~ "[Audio]\n" +#~ "Icon=audio.png\n" +#~ "Method=computer::getAudioCards\n" +#~ msgid "Uptime" +#~ msgstr "Время работы" +#~ msgid "Date/Time" +#~ msgstr "Дата/время" + +# Должно совпадать с таким-же полем в строке 430 computer.c +#~ msgid "Load Average" +#~ msgstr "Средняя нагрузка" +#~ msgid "" +#~ "[Memory]\n" +#~ "%s\n" +#~ "[$ShellParam$]\n" +#~ "ViewType=2\n" +#~ "LoadGraphSuffix= kB\n" +#~ "RescanInterval=2000\n" +#~ "%s\n" +#~ msgstr "" +#~ "[Memory]\n" +#~ "%s\n" +#~ "[$ShellParam$]\n" +#~ "ViewType=2\n" +#~ "LoadGraphSuffix= kB\n" +#~ "RescanInterval=2000\n" +#~ "%s\n" +#~ msgid "" +#~ "[PCI Devices]\n" +#~ "%s[$ShellParam$]\n" +#~ "ViewType=1\n" +#~ msgstr "" +#~ "[PCI Devices]\n" +#~ "%s[$ShellParam$]\n" +#~ "ViewType=1\n" +#~ msgid "" +#~ "[Input Devices]\n" +#~ "%s[$ShellParam$]\n" +#~ "ViewType=1\n" +#~ "ReloadInterval=5000\n" +#~ "%s" +#~ msgstr "" +#~ "[Input Devices]\n" +#~ "%s[$ShellParam$]\n" +#~ "ViewType=1\n" +#~ "ReloadInterval=5000\n" +#~ "%s" +#~ msgid "HardInfo cannot run without loading the additional module." +#~ msgstr "HardInfo не может быть запущен без дополнительного модуля." +#, fuzzy +#~ msgid "AboutModule%s" +#~ msgstr "О _модулях" diff --git a/report.c b/report.c deleted file mode 100644 index 39e96faf..00000000 --- a/report.c +++ /dev/null @@ -1,875 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2008 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include -#include -#include -#include -#include - -static ReportDialog *report_dialog_new(GtkTreeModel * model, - GtkWidget * parent); -static void set_all_active(ReportDialog * rd, gboolean setting); - -static FileTypes file_types[] = { - {"HTML (*.html)", "text/html", ".html", report_context_html_new}, - {"Plain Text (*.txt)", "text/plain", ".txt", report_context_text_new}, - {NULL, NULL, NULL, NULL} -}; - -void report_header(ReportContext * ctx) -{ - ctx->header(ctx); -} - -void report_footer(ReportContext * ctx) -{ - ctx->footer(ctx); -} - -void report_title(ReportContext * ctx, gchar * text) -{ - ctx->title(ctx, text); -} - -void report_subtitle(ReportContext * ctx, gchar * text) -{ - ctx->subtitle(ctx, text); -} - -void report_subsubtitle(ReportContext * ctx, gchar * text) -{ - ctx->subsubtitle(ctx, text); -} - -void report_key_value(ReportContext * ctx, gchar * key, gchar * value) -{ - ctx->keyvalue(ctx, key, value); -} - -gint report_get_visible_columns(ReportContext *ctx) -{ - gint columns; - - /* Column count starts at two, since we always have at least - two columns visible. */ - columns = 2; - - /* Either the Progress column or the Value column is available at - the same time. So we don't count them. */ - - if (ctx->columns & REPORT_COL_EXTRA1) - columns++; - - if (ctx->columns & REPORT_COL_EXTRA2) - columns++; - - return columns; -} - -void report_context_configure(ReportContext * ctx, GKeyFile * keyfile) -{ - gchar **keys; - const gchar *group = "$ShellParam$"; - - /* FIXME: sometime in the future we'll save images in the report. this - flag will be set if we should support that. - - so i don't forget how to encode the images inside the html files: - http://en.wikipedia.org/wiki/Data:_URI_scheme */ - - ctx->is_image_enabled = (g_key_file_get_boolean(keyfile, - group, - "ViewType", - NULL) == SHELL_VIEW_PROGRESS); - - - keys = g_key_file_get_keys(keyfile, group, NULL, NULL); - if (keys) { - gint i = 0; - - for (; keys[i]; i++) { - gchar *key = keys[i]; - - if (g_str_equal(key, "ShowColumnHeaders")) { - ctx->show_column_headers = g_key_file_get_boolean(keyfile, group, key, NULL); - } else if (g_str_has_prefix(key, "ColumnTitle")) { - gchar *value, *title = strchr(key, '$') + 1; - - value = g_key_file_get_value(keyfile, group, key, NULL); - if (g_str_equal(title, "Extra1")) { - ctx->columns |= REPORT_COL_EXTRA1; - } else if (g_str_equal(title, "Extra2")) { - ctx->columns |= REPORT_COL_EXTRA2; - } else if (g_str_equal(title, "Value")) { - ctx->columns |= REPORT_COL_VALUE; - } else if (g_str_equal(title, "TextValue")) { - ctx->columns |= REPORT_COL_TEXTVALUE; - } else if (g_str_equal(title, "Progress")) { - ctx->columns |= REPORT_COL_PROGRESS; - } - - g_hash_table_replace(ctx->column_titles, title, g_strdup(value)); - - g_free(value); - } else if (g_str_equal(key, "ViewType")) { - if (g_key_file_get_integer(keyfile, group, "ViewType", NULL) == SHELL_VIEW_PROGRESS) { - ctx->columns &= ~REPORT_COL_VALUE; - ctx->columns |= REPORT_COL_PROGRESS; - } - } - } - - g_strfreev(keys); - } - -} - -void report_table(ReportContext * ctx, gchar * text) -{ - GKeyFile *key_file = g_key_file_new(); - gchar **groups; - gint i; - - /* make only "Value" column visible ("Key" column is always visible) */ - ctx->columns = REPORT_COL_VALUE; - ctx->show_column_headers = FALSE; - - /**/ - g_key_file_load_from_data(key_file, text, strlen(text), 0, NULL); - groups = g_key_file_get_groups(key_file, NULL); - - for (i = 0; groups[i]; i++) { - if (groups[i][0] == '$') { - report_context_configure(ctx, key_file); - break; - } - } - - for (i = 0; groups[i]; i++) { - gchar *group, *tmpgroup; - gchar **keys; - gint j; - - if (groups[i][0] == '$') { - continue; - } - - group = groups[i]; - - tmpgroup = g_strdup(group); - strend(group, '#'); - - report_subsubtitle(ctx, group); - -#if 0 - if (ctx->is_image_enabled) { - report_embed_image(ctx, key_file, group); - } else { -#endif - keys = g_key_file_get_keys(key_file, tmpgroup, NULL, NULL); - for (j = 0; keys[j]; j++) { - gchar *key = keys[j]; - gchar *value; - - value = g_key_file_get_value(key_file, tmpgroup, key, NULL); - - if (g_utf8_validate(key, -1, NULL) && g_utf8_validate(value, -1, NULL)) { - strend(key, '#'); - - if (g_str_equal(value, "...")) { - g_free(value); - if (!(value = ctx->entry->fieldfunc(key))) { - value = g_strdup("..."); - } - } - - if (*key == '$') { - report_key_value(ctx, strchr(key + 1, '$') + 1, - value); - } else { - report_key_value(ctx, key, value); - } - - } - - g_free(value); - } - - g_strfreev(keys); -#if 0 - } -#endif - g_free(tmpgroup); - } - - g_strfreev(groups); - g_key_file_free(key_file); -} - -static void report_html_header(ReportContext * ctx) -{ - if (ctx->output) - g_free(ctx->output); - - ctx->output = - g_strdup_printf - ("\n" - "\n" "HardInfo (%s) System Report\n" - "\n" - "\n" "\n", - VERSION); -} - -static void report_html_footer(ReportContext * ctx) -{ - ctx->output = h_strconcat(ctx->output, - "", NULL); -} - -static void report_html_title(ReportContext * ctx, gchar * text) -{ - if (!ctx->first_table) { - ctx->output = h_strdup_cprintf("", ctx->output); - } - - ctx->output = h_strdup_cprintf("

%s

", ctx->output, text); -} - -static void report_html_subtitle(ReportContext * ctx, gchar * text) -{ - gint columns = report_get_visible_columns(ctx); - - if (!ctx->first_table) { - ctx->output = h_strdup_cprintf("", ctx->output); - } else { - ctx->first_table = FALSE; - } - - ctx->output = h_strdup_cprintf("\n", - ctx->output, - columns, - text); -} - -static void report_html_subsubtitle(ReportContext * ctx, gchar * text) -{ - gint columns = report_get_visible_columns(ctx); - - ctx->output = h_strdup_cprintf("\n", - ctx->output, - columns, - text); -} - -static void -report_html_key_value(ReportContext * ctx, gchar * key, gchar * value) -{ - gint columns = report_get_visible_columns(ctx); - gchar **values; - gint i; - - if (columns == 2) { - ctx->output = h_strdup_cprintf("" - "\n", - ctx->output, - key, value); - } else { - values = g_strsplit(value, "|", columns); - - ctx->output = h_strdup_cprintf("\n\n", ctx->output, key); - - for (i = columns - 2; i >= 0; i--) { - ctx->output = h_strdup_cprintf("", - ctx->output, - values[i]); - } - - ctx->output = h_strdup_cprintf("\n", ctx->output); - - g_strfreev(values); - } -} - -static void report_text_header(ReportContext * ctx) -{ - if (ctx->output) - g_free(ctx->output); - - ctx->output = g_strdup(""); -} - -static void report_text_footer(ReportContext * ctx) -{ -} - -static void report_text_title(ReportContext * ctx, gchar * text) -{ - gchar *str = (gchar *) ctx->output; - int i = strlen(text); - - str = h_strdup_cprintf("\n%s\n", str, text); - for (; i; i--) - str = h_strconcat(str, "*", NULL); - - str = h_strconcat(str, "\n\n", NULL); - ctx->output = str; -} - -static void report_text_subtitle(ReportContext * ctx, gchar * text) -{ - gchar *str = ctx->output; - int i = strlen(text); - - str = h_strdup_cprintf("\n%s\n", str, text); - for (; i; i--) - str = h_strconcat(str, "-", NULL); - - str = h_strconcat(str, "\n\n", NULL); - ctx->output = str; -} - -static void report_text_subsubtitle(ReportContext * ctx, gchar * text) -{ - ctx->output = h_strdup_cprintf("-%s-\n", ctx->output, text); -} - -static void -report_text_key_value(ReportContext * ctx, gchar * key, gchar * value) -{ - gint columns = report_get_visible_columns(ctx); - gchar **values; - gint i; - - if (columns == 2) { - if (strlen(value)) - ctx->output = h_strdup_cprintf("%s\t\t: %s\n", ctx->output, key, value); - else - ctx->output = h_strdup_cprintf("%s\n", ctx->output, key); - } else { - values = g_strsplit(value, "|", columns); - - ctx->output = h_strdup_cprintf("%s\t", ctx->output, key); - - for (i = columns - 2; i >= 0; i--) { - ctx->output = h_strdup_cprintf("%s\t", - ctx->output, - values[i]); - } - - ctx->output = h_strdup_cprintf("\n", ctx->output); - - g_strfreev(values); - } -} - -static GSList *report_create_module_list_from_dialog(ReportDialog * rd) -{ - ShellModule *module; - GSList *modules = NULL; - GtkTreeModel *model = rd->model; - GtkTreeIter iter; - - gtk_tree_model_get_iter_first(model, &iter); - do { - gboolean selected; - gchar *name; - - gtk_tree_model_get(model, &iter, TREE_COL_SEL, &selected, -1); - if (!selected) - continue; - - module = g_new0(ShellModule, 1); - - gtk_tree_model_get(model, &iter, TREE_COL_NAME, &name, -1); - module->name = name; - module->entries = NULL; - - if (gtk_tree_model_iter_has_child(model, &iter)) { - ShellModuleEntry *entry; - - gint children = gtk_tree_model_iter_n_children(model, &iter); - gint i; - - for (i = 0; i < children; i++) { - GtkTreeIter child; - - gtk_tree_model_iter_nth_child(model, &child, &iter, i); - - gtk_tree_model_get(model, &child, TREE_COL_SEL, &selected, - -1); - if (!selected) - continue; - - gtk_tree_model_get(model, &child, TREE_COL_DATA, &entry, - -1); - module->entries = g_slist_append(module->entries, entry); - } - } - - modules = g_slist_append(modules, module); - } while (gtk_tree_model_iter_next(rd->model, &iter)); - - return modules; -} - -static void -report_create_inner_from_module_list(ReportContext * ctx, GSList * modules) -{ - for (; modules; modules = modules->next) { - ShellModule *module = (ShellModule *) modules->data; - GSList *entries; - - if (!params.gui_running) - fprintf(stderr, "\033[40;32m%s\033[0m\n", module->name); - - report_title(ctx, module->name); - - for (entries = module->entries; entries; entries = entries->next) { - ShellModuleEntry *entry = (ShellModuleEntry *) entries->data; - - if (!params.gui_running) - fprintf(stderr, "\033[2K\033[40;32;1m %s\033[0m\n", - entry->name); - - ctx->entry = entry; - report_subtitle(ctx, entry->name); - module_entry_scan(entry); - report_table(ctx, module_entry_function(entry)); - } - } -} - -void report_module_list_free(GSList * modules) -{ - GSList *m; - - for (m = modules; m; m = m->next) { - ShellModule *module = (ShellModule *) m->data; - - g_slist_free(module->entries); - } - - g_slist_free(modules); -} - -static gchar *report_get_filename(void) -{ - GtkWidget *dialog; - gchar *filename = NULL; - - dialog = gtk_file_chooser_dialog_new("Save File", - NULL, - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, - GTK_RESPONSE_ACCEPT, NULL); - - gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), - "hardinfo_report"); - - file_chooser_add_filters(dialog, file_types); - file_chooser_open_expander(dialog); - - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - gchar *ext = file_chooser_get_extension(dialog, file_types); - filename = file_chooser_build_filename(dialog, ext); - } - gtk_widget_destroy(dialog); - return filename; -} - -ReportContext *report_context_html_new() -{ - ReportContext *ctx; - - ctx = g_new0(ReportContext, 1); - ctx->header = report_html_header; - ctx->footer = report_html_footer; - ctx->title = report_html_title; - ctx->subtitle = report_html_subtitle; - ctx->subsubtitle = report_html_subsubtitle; - ctx->keyvalue = report_html_key_value; - - ctx->output = g_strdup(""); - ctx->format = REPORT_FORMAT_HTML; - - ctx->column_titles = g_hash_table_new(g_str_hash, g_str_equal); - ctx->first_table = TRUE; - - return ctx; -} - -ReportContext *report_context_text_new() -{ - ReportContext *ctx; - - ctx = g_new0(ReportContext, 1); - ctx->header = report_text_header; - ctx->footer = report_text_footer; - ctx->title = report_text_title; - ctx->subtitle = report_text_subtitle; - ctx->subsubtitle = report_text_subsubtitle; - ctx->keyvalue = report_text_key_value; - - ctx->output = g_strdup(""); - ctx->format = REPORT_FORMAT_TEXT; - - ctx->column_titles = g_hash_table_new(g_str_hash, g_str_equal); - ctx->first_table = TRUE; - - return ctx; -} - -void report_context_free(ReportContext * ctx) -{ - g_hash_table_destroy(ctx->column_titles); - g_free(ctx->output); - g_free(ctx); -} - -void report_create_from_module_list(ReportContext * ctx, GSList * modules) -{ - report_header(ctx); - - report_create_inner_from_module_list(ctx, modules); - report_module_list_free(modules); - - report_footer(ctx); -} - -gchar *report_create_from_module_list_format(GSList * modules, - ReportFormat format) -{ - ReportContext *(*create_context) (); - ReportContext *ctx; - gchar *retval; - - if (format >= N_REPORT_FORMAT) - return NULL; - - create_context = file_types[format].data; - if (!create_context) - return NULL; - - ctx = create_context(); - - report_create_from_module_list(ctx, modules); - retval = g_strdup(ctx->output); - - report_context_free(ctx); - - return retval; -} - -static gboolean report_generate(ReportDialog * rd) -{ - GSList *modules; - ReportContext *ctx; - ReportContext *(*create_context) (); - gchar *file; - FILE *stream; - - if (!(file = report_get_filename())) - return FALSE; - - if (!(stream = fopen(file, "w+"))) { - g_free(file); - return FALSE; - } - - create_context = file_types_get_data_by_name(file_types, file); - - if (!create_context) { - g_warning("Cannot create ReportContext. Programming bug?"); - g_free(file); - return FALSE; - } - - ctx = create_context(); - modules = report_create_module_list_from_dialog(rd); - - report_create_from_module_list(ctx, modules); - fputs(ctx->output, stream); - fclose(stream); - - if (ctx->format == REPORT_FORMAT_HTML) { - GtkWidget *dialog; - dialog = gtk_message_dialog_new(NULL, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, - "Open the report with your web browser?"); - gtk_dialog_add_buttons(GTK_DIALOG(dialog), - GTK_STOCK_NO, GTK_RESPONSE_REJECT, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) - open_url(file); - - gtk_widget_destroy(dialog); - } - - report_context_free(ctx); - g_free(file); - - return TRUE; -} - -void report_dialog_show(GtkTreeModel * model, GtkWidget * parent) -{ - gboolean success; - ReportDialog *rd = report_dialog_new(model, parent); - - if (gtk_dialog_run(GTK_DIALOG(rd->dialog)) == GTK_RESPONSE_ACCEPT) { - shell_status_update("Generating report..."); - gtk_widget_hide(rd->dialog); - shell_view_set_enabled(FALSE); - shell_status_set_enabled(TRUE); - - success = report_generate(rd); - - shell_status_set_enabled(FALSE); - - if (success) - shell_status_update("Report saved."); - else - shell_status_update("Error while creating the report."); - } - - set_all_active(rd, FALSE); - gtk_widget_destroy(rd->dialog); - g_free(rd); -} - -static void -set_children_active(GtkTreeModel * model, GtkTreeIter * iter, - gboolean setting) -{ - if (gtk_tree_model_iter_has_child(model, iter)) { - gint children = gtk_tree_model_iter_n_children(model, iter); - - gtk_tree_store_set(GTK_TREE_STORE(model), iter, TREE_COL_SEL, - setting, -1); - - for (children--; children >= 0; children--) { - GtkTreeIter child; - - gtk_tree_model_iter_nth_child(model, &child, iter, children); - gtk_tree_store_set(GTK_TREE_STORE(model), &child, TREE_COL_SEL, - setting, -1); - } - } -} - -static void set_all_active(ReportDialog * rd, gboolean setting) -{ - GtkTreeIter iter; - GtkTreeModel *model = rd->model; - - gtk_tree_model_get_iter_first(model, &iter); - - do { - set_children_active(model, &iter, setting); - } while (gtk_tree_model_iter_next(model, &iter)); -} - -static void report_dialog_sel_none(GtkWidget * widget, ReportDialog * rd) -{ - set_all_active(rd, FALSE); -} - -static void report_dialog_sel_all(GtkWidget * widget, ReportDialog * rd) -{ - set_all_active(rd, TRUE); -} - -static void -report_dialog_sel_toggle(GtkCellRendererToggle * cellrenderertoggle, - gchar * path_str, ReportDialog * rd) -{ - GtkTreeModel *model = rd->model; - GtkTreeIter iter; - GtkTreePath *path = gtk_tree_path_new_from_string(path_str); - gboolean active; - - gtk_tree_model_get_iter(model, &iter, path); - gtk_tree_model_get(model, &iter, TREE_COL_SEL, &active, -1); - - active = !active; - gtk_tree_store_set(GTK_TREE_STORE(model), &iter, TREE_COL_SEL, active, - -1); - set_children_active(model, &iter, active); - - gtk_tree_path_free(path); -} - -static ReportDialog - * report_dialog_new(GtkTreeModel * model, GtkWidget * parent) -{ - ReportDialog *rd; - GtkWidget *dialog; - GtkWidget *dialog1_vbox; - GtkWidget *scrolledwindow2; - GtkWidget *treeview2; - GtkWidget *vbuttonbox3; - GtkWidget *button3; - GtkWidget *button6; - GtkWidget *dialog1_action_area; - GtkWidget *button8; - GtkWidget *button7; - GtkWidget *label; - GtkWidget *hbox; - - GtkTreeViewColumn *column; - GtkCellRenderer *cr_text, *cr_pbuf, *cr_toggle; - - rd = g_new0(ReportDialog, 1); - - dialog = gtk_dialog_new(); - gtk_window_set_title(GTK_WINDOW(dialog), "Generate Report"); - gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); - gtk_window_set_default_size(GTK_WINDOW(dialog), 420, 260); - gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent)); - gtk_window_set_position(GTK_WINDOW(dialog), - GTK_WIN_POS_CENTER_ON_PARENT); - gtk_window_set_type_hint(GTK_WINDOW(dialog), - GDK_WINDOW_TYPE_HINT_DIALOG); - - dialog1_vbox = GTK_DIALOG(dialog)->vbox; - gtk_box_set_spacing(GTK_BOX(dialog1_vbox), 5); - gtk_container_set_border_width(GTK_CONTAINER(dialog1_vbox), 4); - gtk_widget_show(dialog1_vbox); - - hbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, FALSE, FALSE, 0); - - label = gtk_label_new("Generate Report\n" - "Please choose the information that you wish " - "to view in your report:"); - gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); - gtk_label_set_use_markup(GTK_LABEL(label), TRUE); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - - gtk_box_pack_start(GTK_BOX(hbox), - icon_cache_get_image("report-large.png"), - FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); - gtk_widget_show_all(hbox); - - hbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, TRUE, TRUE, 0); - gtk_widget_show(hbox); - - scrolledwindow2 = gtk_scrolled_window_new(NULL, NULL); - gtk_widget_show(scrolledwindow2); - gtk_box_pack_start(GTK_BOX(hbox), scrolledwindow2, TRUE, TRUE, - 0); - gtk_widget_set_size_request(scrolledwindow2, -1, 200); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow2), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW - (scrolledwindow2), GTK_SHADOW_IN); - - treeview2 = gtk_tree_view_new_with_model(model); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview2), FALSE); - gtk_widget_show(treeview2); - gtk_container_add(GTK_CONTAINER(scrolledwindow2), treeview2); - - column = gtk_tree_view_column_new(); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview2), column); - - cr_toggle = gtk_cell_renderer_toggle_new(); - gtk_tree_view_column_pack_start(column, cr_toggle, FALSE); - g_signal_connect(cr_toggle, "toggled", - G_CALLBACK(report_dialog_sel_toggle), rd); - gtk_tree_view_column_add_attribute(column, cr_toggle, "active", - TREE_COL_SEL); - - cr_pbuf = gtk_cell_renderer_pixbuf_new(); - gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE); - gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf", - TREE_COL_PBUF); - - cr_text = gtk_cell_renderer_text_new(); - gtk_tree_view_column_pack_start(column, cr_text, TRUE); - gtk_tree_view_column_add_attribute(column, cr_text, "markup", - TREE_COL_NAME); - - vbuttonbox3 = gtk_vbutton_box_new(); - gtk_widget_show(vbuttonbox3); - gtk_box_pack_start(GTK_BOX(hbox), vbuttonbox3, FALSE, TRUE, 0); - gtk_box_set_spacing(GTK_BOX(vbuttonbox3), 5); - gtk_button_box_set_layout(GTK_BUTTON_BOX(vbuttonbox3), - GTK_BUTTONBOX_START); - - button3 = gtk_button_new_with_mnemonic("Select _None"); - gtk_widget_show(button3); - gtk_container_add(GTK_CONTAINER(vbuttonbox3), button3); - GTK_WIDGET_SET_FLAGS(button3, GTK_CAN_DEFAULT); - g_signal_connect(button3, "clicked", - G_CALLBACK(report_dialog_sel_none), rd); - - button6 = gtk_button_new_with_mnemonic("Select _All"); - gtk_widget_show(button6); - gtk_container_add(GTK_CONTAINER(vbuttonbox3), button6); - GTK_WIDGET_SET_FLAGS(button6, GTK_CAN_DEFAULT); - g_signal_connect(button6, "clicked", G_CALLBACK(report_dialog_sel_all), - rd); - - dialog1_action_area = GTK_DIALOG(dialog)->action_area; - gtk_widget_show(dialog1_action_area); - gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog1_action_area), - GTK_BUTTONBOX_END); - - button8 = gtk_button_new_from_stock(GTK_STOCK_CANCEL); - gtk_widget_show(button8); - gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button8, - GTK_RESPONSE_CANCEL); - GTK_WIDGET_SET_FLAGS(button8, GTK_CAN_DEFAULT); - - button7 = gtk_button_new_with_mnemonic("_Generate"); - gtk_widget_show(button7); - gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button7, - GTK_RESPONSE_ACCEPT); - GTK_WIDGET_SET_FLAGS(button7, GTK_CAN_DEFAULT); - - rd->dialog = dialog; - rd->btn_cancel = button8; - rd->btn_generate = button7; - rd->btn_sel_all = button6; - rd->btn_sel_none = button3; - rd->treeview = treeview2; - rd->model = model; - - gtk_tree_view_collapse_all(GTK_TREE_VIEW(treeview2)); - set_all_active(rd, TRUE); - - return rd; -} diff --git a/report.h b/report.h deleted file mode 100644 index 782621cb..00000000 --- a/report.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef __REPORT_H__ -#define __REPORT_H__ -#include -#include - -typedef enum { - REPORT_FORMAT_HTML, - REPORT_FORMAT_TEXT, - N_REPORT_FORMAT -} ReportFormat; - -typedef enum { - REPORT_COL_PROGRESS = 1<<0, - REPORT_COL_VALUE = 1<<1, - REPORT_COL_EXTRA1 = 1<<2, - REPORT_COL_EXTRA2 = 1<<3, - REPORT_COL_TEXTVALUE= 1<<4 -} ReportColumn; - -typedef struct _ReportDialog ReportDialog; -typedef struct _ReportContext ReportContext; - -struct _ReportContext { - ShellModuleEntry *entry; - gchar *output; - - void (*header) (ReportContext *ctx); - void (*footer) (ReportContext *ctx); - void (*title) (ReportContext *ctx, gchar *text); - void (*subtitle) (ReportContext *ctx, gchar *text); - void (*subsubtitle) (ReportContext *ctx, gchar *text); - void (*keyvalue) (ReportContext *ctx, gchar *key, gchar *value); - - ReportFormat format; - - gboolean is_image_enabled; - gboolean first_table; - - gboolean show_column_headers; - guint columns; - GHashTable *column_titles; -}; - -struct _ReportDialog { - GtkWidget *dialog; - GtkWidget *filechooser; - GtkWidget *btn_cancel; - GtkWidget *btn_generate; - GtkWidget *btn_sel_all; - GtkWidget *btn_sel_none; - GtkWidget *treeview; - - GtkTreeModel *model; -}; - -void report_dialog_show(); - -ReportContext *report_context_html_new(); -ReportContext *report_context_text_new(); - -void report_header (ReportContext *ctx); -void report_footer (ReportContext *ctx); -void report_title (ReportContext *ctx, gchar *text); -void report_subtitle (ReportContext *ctx, gchar *text); -void report_subsubtitle (ReportContext *ctx, gchar *text); -void report_key_value (ReportContext *ctx, gchar *key, gchar *value); -void report_table (ReportContext *ctx, gchar *text); - -void report_create_from_module_list(ReportContext *ctx, GSList *modules); -gchar *report_create_from_module_list_format(GSList *modules, ReportFormat format); - -void report_context_free(ReportContext *ctx); -void report_module_list_free(GSList *modules); - -#endif /* __REPORT_H__ */ diff --git a/sha1.c b/sha1.c deleted file mode 100644 index b94ce254..00000000 --- a/sha1.c +++ /dev/null @@ -1,329 +0,0 @@ -/* -SHA-1 in C -By Steve Reid -100% Public Domain - -Test Vectors (from FIPS PUB 180-1) -"abc" - A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D -"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" - 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 -A million repetitions of "a" - 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F -*/ - - -/* #define SHA1HANDSOFF * Copies data before messing with it. */ - -#include -#include -#include - -#if defined(__OPTIMIZE__) -#error You must compile this program without "-O". -#endif - - -#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) - -/* blk0() and blk() perform the initial expand. */ -/* I got the idea of expanding during the round function from SSLeay */ -#ifdef LITTLE_ENDIAN -#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ - |(rol(block->l[i],8)&0x00FF00FF)) -#else -#define blk0(i) block->l[i] -#endif -#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ - ^block->l[(i+2)&15]^block->l[i&15],1)) - -/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); -#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); -#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); - - -/* Hash a single 512-bit block. This is the core of the algorithm. */ - -void SHA1Transform(guint32 state[5], guchar buffer[64]) -{ - guint32 a, b, c, d, e; - typedef union { - guchar c[64]; - guint32 l[16]; - } CHAR64LONG16; - CHAR64LONG16 *block; -#ifdef SHA1HANDSOFF - static guchar workspace[64]; - block = (CHAR64LONG16 *) workspace; - memcpy(block, buffer, 64); -#else - block = (CHAR64LONG16 *) buffer; -#endif - /* Copy context->state[] to working vars */ - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - /* 4 rounds of 20 operations each. Loop unrolled. */ - R0(a, b, c, d, e, 0); - R0(e, a, b, c, d, 1); - R0(d, e, a, b, c, 2); - R0(c, d, e, a, b, 3); - R0(b, c, d, e, a, 4); - R0(a, b, c, d, e, 5); - R0(e, a, b, c, d, 6); - R0(d, e, a, b, c, 7); - R0(c, d, e, a, b, 8); - R0(b, c, d, e, a, 9); - R0(a, b, c, d, e, 10); - R0(e, a, b, c, d, 11); - R0(d, e, a, b, c, 12); - R0(c, d, e, a, b, 13); - R0(b, c, d, e, a, 14); - R0(a, b, c, d, e, 15); - R1(e, a, b, c, d, 16); - R1(d, e, a, b, c, 17); - R1(c, d, e, a, b, 18); - R1(b, c, d, e, a, 19); - R2(a, b, c, d, e, 20); - R2(e, a, b, c, d, 21); - R2(d, e, a, b, c, 22); - R2(c, d, e, a, b, 23); - R2(b, c, d, e, a, 24); - R2(a, b, c, d, e, 25); - R2(e, a, b, c, d, 26); - R2(d, e, a, b, c, 27); - R2(c, d, e, a, b, 28); - R2(b, c, d, e, a, 29); - R2(a, b, c, d, e, 30); - R2(e, a, b, c, d, 31); - R2(d, e, a, b, c, 32); - R2(c, d, e, a, b, 33); - R2(b, c, d, e, a, 34); - R2(a, b, c, d, e, 35); - R2(e, a, b, c, d, 36); - R2(d, e, a, b, c, 37); - R2(c, d, e, a, b, 38); - R2(b, c, d, e, a, 39); - R3(a, b, c, d, e, 40); - R3(e, a, b, c, d, 41); - R3(d, e, a, b, c, 42); - R3(c, d, e, a, b, 43); - R3(b, c, d, e, a, 44); - R3(a, b, c, d, e, 45); - R3(e, a, b, c, d, 46); - R3(d, e, a, b, c, 47); - R3(c, d, e, a, b, 48); - R3(b, c, d, e, a, 49); - R3(a, b, c, d, e, 50); - R3(e, a, b, c, d, 51); - R3(d, e, a, b, c, 52); - R3(c, d, e, a, b, 53); - R3(b, c, d, e, a, 54); - R3(a, b, c, d, e, 55); - R3(e, a, b, c, d, 56); - R3(d, e, a, b, c, 57); - R3(c, d, e, a, b, 58); - R3(b, c, d, e, a, 59); - R4(a, b, c, d, e, 60); - R4(e, a, b, c, d, 61); - R4(d, e, a, b, c, 62); - R4(c, d, e, a, b, 63); - R4(b, c, d, e, a, 64); - R4(a, b, c, d, e, 65); - R4(e, a, b, c, d, 66); - R4(d, e, a, b, c, 67); - R4(c, d, e, a, b, 68); - R4(b, c, d, e, a, 69); - R4(a, b, c, d, e, 70); - R4(e, a, b, c, d, 71); - R4(d, e, a, b, c, 72); - R4(c, d, e, a, b, 73); - R4(b, c, d, e, a, 74); - R4(a, b, c, d, e, 75); - R4(e, a, b, c, d, 76); - R4(d, e, a, b, c, 77); - R4(c, d, e, a, b, 78); - R4(b, c, d, e, a, 79); - /* Add the working vars back into context.state[] */ - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - /* Wipe variables */ - a = b = c = d = e = 0; -} - - -/* SHA1Init - Initialize new context */ - -void SHA1Init(SHA1_CTX * context) -{ - /* SHA1 initialization constants */ - context->state[0] = 0x67452301; - context->state[1] = 0xEFCDAB89; - context->state[2] = 0x98BADCFE; - context->state[3] = 0x10325476; - context->state[4] = 0xC3D2E1F0; - context->count[0] = context->count[1] = 0; -} - - -/* Run your data through this. */ - -void SHA1Update(SHA1_CTX * context, guchar * data, guint32 len) -{ - guint32 i, j; - - j = (context->count[0] >> 3) & 63; - if ((context->count[0] += len << 3) < (len << 3)) - context->count[1]++; - context->count[1] += (len >> 29); - if ((j + len) > 63) { - memcpy(&context->buffer[j], data, (i = 64 - j)); - SHA1Transform(context->state, context->buffer); - for (; i + 63 < len; i += 64) { - SHA1Transform(context->state, &data[i]); - } - j = 0; - } else - i = 0; - memcpy(&context->buffer[j], &data[i], len - i); -} - - -/* Add padding and return the message digest. */ - -void SHA1Final(guchar digest[20], SHA1_CTX * context) -{ - guint32 i, j; - guchar finalcount[8]; - - for (i = 0; i < 8; i++) { - finalcount[i] = (guchar) ((context->count[(i >= 4 ? 0 : 1)] - >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */ - } - SHA1Update(context, (guchar *) "\200", 1); - while ((context->count[0] & 504) != 448) { - SHA1Update(context, (guchar *) "\0", 1); - } - SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ - for (i = 0; i < 20; i++) { - digest[i] = (guchar) - ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255); - } - /* Wipe variables */ - i = j = 0; - memset(context->buffer, 0, 64); - memset(context->state, 0, 20); - memset(context->count, 0, 8); - memset(&finalcount, 0, 8); -#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite it's own static vars */ - SHA1Transform(context->state, context->buffer); -#endif -} - -#ifdef SHA1_TEST -static char *b32_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; - -static void base32_encode_exactly(guchar * buf, gint len, - guchar * encbuf, gint enclen) -{ - gint i = 0; - guchar *ip = buf + len; - guchar *op = encbuf + enclen; - - switch (len % 5) { - case 0: - do { - g_assert(op - encbuf >= 8); - i = *--ip; /* Input #4 */ - *--op = b32_alphabet[i & 0x1f]; /* Ouput #7 */ - i >>= 5; /* upper <234>, input #4 */ - /* FALLTHROUGH */ - case 4: - i |= ((guint32) * --ip) << 3; /* had 3 bits in `i' */ - *--op = b32_alphabet[i & 0x1f]; /* Output #6 */ - i >>= 5; /* upper <401234>, input #3 */ - *--op = b32_alphabet[i & 0x1f]; /* Output #5 */ - i >>= 5; /* upper <4>, input #3 */ - /* FALLTHROUGH */ - case 3: - i |= ((guint32) * --ip) << 1; /* had 1 bits in `i' */ - *--op = b32_alphabet[i & 0x1f]; /* Output #4 */ - i >>= 5; /* upper <1234>, input #2 */ - /* FALLTHROUGH */ - case 2: - i |= ((guint32) * --ip) << 4; /* had 4 bits in `i' */ - *--op = b32_alphabet[i & 0x1f]; /* Output #3 */ - i >>= 5; /* upper <3401234>, input #1 */ - *--op = b32_alphabet[i & 0x1f]; /* Output #2 */ - i >>= 5; /* upper <34>, input #1 */ - /* FALLTHROUGH */ - case 1: - i |= ((guint32) * --ip) << 2; /* had 2 bits in `i' */ - *--op = b32_alphabet[i & 0x1f]; /* Output #1 */ - i >>= 5; /* upper <01234>, input #0 */ - *--op = b32_alphabet[i & 0x1f]; /* Output #0 */ - i >>= 5; /* Holds nothing, MBZ */ - g_assert(i == 0); - g_assert(op >= encbuf); - } while (op > encbuf); - } -} - - - -/*************************************************************/ - -int main(int argc, char **argv) -{ - gint i, j; - SHA1_CTX context; - guchar digest[20], buffer[16384]; - FILE *file; - - if (argc > 2) { - puts("Public domain SHA-1 implementation - by Steve Reid "); - puts("Produces the SHA-1 hash of a file, or stdin if no file is specified."); - exit(0); - } - if (argc < 2) { - file = stdin; - } else { - if (!(file = fopen(argv[1], "rb"))) { - fputs("Unable to open file.", stderr); - exit(-1); - } - } - SHA1Init(&context); - while (!feof(file)) { /* note: what if ferror(file) */ - i = fread(buffer, 1, 16384, file); - SHA1Update(&context, buffer, i); - } - SHA1Final(digest, &context); - fclose(file); - - for (i = 0; i < 5; i++) { - for (j = 0; j < 4; j++) { - printf("%02X", digest[i*4+j]); - } - putchar(' '); - } - putchar('\n'); - - { - guchar tmp[33]; - tmp[32] = '\0'; - base32_encode_exactly(digest, 20, tmp, 32); - printf("%s\n", tmp); - } - - exit(0); -} -#endif /* SHA1_TEST */ diff --git a/sha1.h b/sha1.h deleted file mode 100644 index 573ff8ac..00000000 --- a/sha1.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SHA-1 in C - * By Steve Reid - * 100% Public Domain - */ - -#ifndef __SHA1_H__ -#define __SHA1_H__ - -#include - -#ifndef LITTLE_ENDIAN -#if G_BYTE_ORDER == G_LITTLE_ENDIAN -#define LITTLE_ENDIAN /* This should be #define'd if true. */ -#endif /* G_BYTE_ORDER */ -#endif /* LITTLE_ENDIAN */ - - -typedef struct { - guint32 state[5]; - guint32 count[2]; - guchar buffer[64]; -} SHA1_CTX; - -void SHA1Transform(guint32 state[5], guchar buffer[64]); -void SHA1Init(SHA1_CTX* context); -void SHA1Update(SHA1_CTX* context, guchar* data, unsigned int len); -void SHA1Final(guchar digest[20], SHA1_CTX* context); - -#endif /* __SHA1_H__ */ diff --git a/shell.c b/shell.c deleted file mode 100644 index 2fb36010..00000000 --- a/shell.c +++ /dev/null @@ -1,1493 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -#include -#include - -#include - -#include - -#include -#include -#include -#include -#include - -#include - -/* - * Internal Prototypes ******************************************************** - */ - -static void create_window(); -static ShellTree *tree_new(void); -static ShellInfoTree *info_tree_new(gboolean extra); - -static void module_selected(gpointer data); -static void module_selected_show_info(ShellModuleEntry * entry, - gboolean reload); -static void info_selected(GtkTreeSelection * ts, gpointer data); -static void info_selected_show_extra(gchar * data); -static gboolean reload_section(gpointer data); -static gboolean rescan_section(gpointer data); -static gboolean update_field(gpointer data); - -/* - * Globals ******************************************************************** - */ - -static Shell *shell = NULL; -static GHashTable *update_tbl = NULL; -static GSList *update_sfusrc = NULL; - -/* - * Code :) ******************************************************************** - */ - -Shell *shell_get_main_shell(void) -{ - return shell; -} - -void shell_ui_manager_set_visible(const gchar * path, gboolean setting) -{ - GtkWidget *widget; - - if (!params.gui_running) - return; - - widget = gtk_ui_manager_get_widget(shell->ui_manager, path); - if (!widget) - return; - - if (setting) - gtk_widget_show(widget); - else - gtk_widget_hide(widget); -} - -void shell_action_set_property(const gchar * action_name, - const gchar * property, gboolean setting) -{ - GtkAction *action; - - if (!params.gui_running) - return; - - action = gtk_action_group_get_action(shell->action_group, action_name); - if (action) { - GValue value = { 0 }; - - g_value_init(&value, G_TYPE_BOOLEAN); - g_value_set_boolean(&value, setting); - - g_object_set_property(G_OBJECT(action), property, &value); - - g_value_unset(&value); - } -} - -void shell_action_set_enabled(const gchar * action_name, gboolean setting) -{ - if (params.gui_running && shell->action_group) { - GtkAction *action; - - action = - gtk_action_group_get_action(shell->action_group, action_name); - if (action) { - gtk_action_set_sensitive(action, setting); - } - } -} - -gboolean shell_action_get_enabled(const gchar * action_name) -{ - GtkAction *action; - - if (!params.gui_running) - return FALSE; - - action = gtk_action_group_get_action(shell->action_group, action_name); - if (action) { - return gtk_action_get_sensitive(action); - } - - return FALSE; -} - -void shell_set_side_pane_visible(gboolean setting) -{ - if (!params.gui_running) - return; - - if (setting) - gtk_widget_show(shell->tree->scroll); - else - gtk_widget_hide(shell->tree->scroll); -} - -gboolean shell_action_get_active(const gchar * action_name) -{ - GtkAction *action; - GSList *proxies; - - /* FIXME: Ugh. Are you sure there isn't any simpler way? O_o */ - if (!params.gui_running) - return FALSE; - - action = gtk_action_group_get_action(shell->action_group, action_name); - if (action) { - proxies = gtk_action_get_proxies(action); - - for (; proxies; proxies = proxies->next) { - GtkWidget *widget = (GtkWidget *) proxies->data; - - if (GTK_IS_CHECK_MENU_ITEM(widget)) { - return - gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM - (widget)); - } - } - } - - return FALSE; -} - -void shell_action_set_active(const gchar * action_name, gboolean setting) -{ - GtkAction *action; - GSList *proxies; - - /* FIXME: Ugh. Are you sure there isn't any simpler way? O_o */ - if (!params.gui_running) - return; - - action = gtk_action_group_get_action(shell->action_group, action_name); - if (action) { - proxies = gtk_action_get_proxies(action); - - for (; proxies; proxies = proxies->next) { - GtkWidget *widget = (GtkWidget *) proxies->data; - - if (GTK_IS_CHECK_MENU_ITEM(widget)) { - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), - setting); - return; - } - } - } -} - -void shell_status_pulse(void) -{ - if (params.gui_running) { - if (shell->_pulses++ == 5) { - /* we're pulsing for some time, disable the interface and change the cursor - to a hourglass */ - shell_view_set_enabled(FALSE); - } - - gtk_progress_bar_pulse(GTK_PROGRESS_BAR(shell->progress)); - while (gtk_events_pending()) - gtk_main_iteration(); - } else { - static gint counter = 0; - - fprintf(stderr, "\033[2K\033[40;37;1m %c\033[0m\r", - "|/-\\"[counter++ % 4]); - } -} - -void shell_status_set_percentage(gint percentage) -{ - if (params.gui_running) { - gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(shell->progress), - (float) percentage / 100.0); - while (gtk_events_pending()) - gtk_main_iteration(); - } else { - if (percentage < 1 || percentage >= 100) { - fprintf(stderr, "\033[2K"); - } else { - gchar pbar[] = "----------"; - - memset(pbar, '#', percentage / 10); - - fprintf(stderr, "\r\033[40;37;1m%3d%% \033[40;34;1m" - "%s\033[0m\r", percentage, pbar); - } - } -} - -void shell_view_set_enabled(gboolean setting) -{ - if (!params.gui_running) - return; - - if (setting) { - shell->_pulses = 0; - widget_set_cursor(shell->window, GDK_LEFT_PTR); - } else { - widget_set_cursor(shell->window, GDK_WATCH); - } - - gtk_widget_set_sensitive(shell->hpaned, setting); - shell_action_set_enabled("ViewMenuAction", setting); - shell_action_set_enabled("RefreshAction", setting); - shell_action_set_enabled("CopyAction", setting); - shell_action_set_enabled("ReportAction", setting); - shell_action_set_enabled("SyncManagerAction", setting && sync_manager_count_entries() > 0); - shell_action_set_enabled("SaveGraphAction", - setting ? shell->view_type == - SHELL_VIEW_PROGRESS : FALSE); -} - -void shell_status_set_enabled(gboolean setting) -{ - if (!params.gui_running) - return; - - if (setting) - gtk_widget_show(shell->progress); - else { - gtk_widget_hide(shell->progress); - shell_view_set_enabled(TRUE); - - shell_status_update("Done."); - } -} - -void shell_do_reload(void) -{ - if (!params.gui_running || !shell->selected) - return; - - shell_action_set_enabled("RefreshAction", FALSE); - shell_action_set_enabled("CopyAction", FALSE); - shell_action_set_enabled("ReportAction", FALSE); - - shell_status_set_enabled(TRUE); - - module_entry_reload(shell->selected); - module_selected(NULL); - - shell_action_set_enabled("RefreshAction", TRUE); - shell_action_set_enabled("CopyAction", TRUE); - shell_action_set_enabled("ReportAction", TRUE); -} - -void shell_status_update(const gchar * message) -{ - if (params.gui_running) { - gtk_label_set_markup(GTK_LABEL(shell->status), message); - gtk_progress_bar_pulse(GTK_PROGRESS_BAR(shell->progress)); - while (gtk_events_pending()) - gtk_main_iteration(); - } else { - fprintf(stderr, "\033[2K\033[40;37;1m %s\033[0m\r", message); - } -} - -static void destroy_me(void) -{ - cb_quit(); -} - -static void close_note(GtkWidget * widget, gpointer user_data) -{ - gtk_widget_hide(shell->note->frame); -} - -static ShellNote *note_new(void) -{ - ShellNote *note; - GtkWidget *hbox, *icon, *button; - - note = g_new0(ShellNote, 1); - note->label = gtk_label_new(""); - note->frame = gtk_frame_new(NULL); - button = gtk_button_new(); - - icon = icon_cache_get_image("close.png"); - gtk_widget_show(icon); - gtk_container_add(GTK_CONTAINER(button), icon); - gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); - g_signal_connect(G_OBJECT(button), "clicked", (GCallback) close_note, - NULL); - - hbox = gtk_hbox_new(FALSE, 3); - icon = icon_cache_get_image("dialog-information.png"); - - gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), note->label, FALSE, FALSE, 0); - gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); - - gtk_container_set_border_width(GTK_CONTAINER(hbox), 5); - gtk_container_add(GTK_CONTAINER(note->frame), hbox); - gtk_widget_show_all(hbox); - - return note; -} - -static void create_window(void) -{ - GtkWidget *vbox, *hbox; - - shell = g_new0(Shell, 1); - - shell->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_icon(GTK_WINDOW(shell->window), - icon_cache_get_pixbuf("logo.png")); - gtk_window_set_title(GTK_WINDOW(shell->window), "System Information"); - gtk_window_set_default_size(GTK_WINDOW(shell->window), 800, 600); - g_signal_connect(G_OBJECT(shell->window), "destroy", destroy_me, NULL); - - vbox = gtk_vbox_new(FALSE, 0); - gtk_widget_show(vbox); - gtk_container_add(GTK_CONTAINER(shell->window), vbox); - shell->vbox = vbox; - - menu_init(shell); - - hbox = gtk_hbox_new(FALSE, 5); - gtk_widget_show(hbox); - gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); - - shell->progress = gtk_progress_bar_new(); - gtk_widget_set_size_request(shell->progress, 80, 10); - gtk_widget_hide(shell->progress); - gtk_box_pack_end(GTK_BOX(hbox), shell->progress, FALSE, FALSE, 5); - - shell->status = gtk_label_new(""); - gtk_misc_set_alignment(GTK_MISC(shell->status), 0.0, 0.5); - gtk_widget_show(shell->status); - gtk_box_pack_start(GTK_BOX(hbox), shell->status, FALSE, FALSE, 5); - - shell->hpaned = gtk_hpaned_new(); - gtk_widget_show(shell->hpaned); - gtk_box_pack_end(GTK_BOX(vbox), shell->hpaned, TRUE, TRUE, 0); - gtk_paned_set_position(GTK_PANED(shell->hpaned), 210); - - vbox = gtk_vbox_new(FALSE, 5); - gtk_widget_show(vbox); - gtk_paned_add2(GTK_PANED(shell->hpaned), vbox); - - shell->note = note_new(); - gtk_box_pack_end(GTK_BOX(vbox), shell->note->frame, FALSE, FALSE, 0); - - shell->vpaned = gtk_vpaned_new(); - gtk_box_pack_start(GTK_BOX(vbox), shell->vpaned, TRUE, TRUE, 0); - gtk_widget_show(shell->vpaned); - - shell->notebook = gtk_notebook_new(); - gtk_paned_add2(GTK_PANED(shell->vpaned), shell->notebook); - - gtk_widget_show(shell->window); - while (gtk_events_pending()) - gtk_main_iteration(); -} - -static void view_menu_select_entry(gpointer data, gpointer data2) -{ - GtkTreePath *path; - GtkTreeIter *iter = (GtkTreeIter *) data2; - - path = gtk_tree_model_get_path(shell->tree->model, iter); - - gtk_tree_selection_select_path(shell->tree->selection, path); - gtk_tree_view_set_cursor(GTK_TREE_VIEW(shell->tree->view), path, NULL, - FALSE); - gtk_tree_path_free(path); -} - -static void add_module_to_menu(gchar * name, GdkPixbuf * pixbuf) -{ - gchar *about_module = g_strdup_printf("AboutModule%s", name); - - GtkActionEntry entries[] = { - { - name, /* name */ - name, /* stockid */ - name, /* label */ - NULL, /* accelerator */ - NULL, /* tooltip */ - NULL, /* callback */ - }, - { - about_module, - name, - name, - NULL, - name, - (GCallback) cb_about_module, - }, - }; - - stock_icon_register_pixbuf(pixbuf, name); - - gtk_action_group_add_actions(shell->action_group, entries, 2, NULL); - - gtk_ui_manager_add_ui(shell->ui_manager, - gtk_ui_manager_new_merge_id(shell->ui_manager), - "/menubar/ViewMenu/LastSep", - name, name, GTK_UI_MANAGER_MENU, TRUE); - - gtk_ui_manager_add_ui(shell->ui_manager, - gtk_ui_manager_new_merge_id(shell->ui_manager), - "/menubar/HelpMenu/HelpMenuModules/LastSep", - about_module, about_module, GTK_UI_MANAGER_AUTO, - TRUE); -} - -static void -add_module_entry_to_view_menu(gchar * module, gchar * name, - GdkPixbuf * pixbuf, GtkTreeIter * iter) -{ - GtkActionEntry entries[] = { - { - name, /* name */ - name, /* stockid */ - name, /* label */ - NULL, /* accelerator */ - NULL, /* tooltip */ - (GCallback) view_menu_select_entry, /* callback */ - }, - }; - - stock_icon_register_pixbuf(pixbuf, name); - gtk_action_group_add_actions(shell->action_group, entries, 1, iter); - - gtk_ui_manager_add_ui(shell->ui_manager, - gtk_ui_manager_new_merge_id(shell->ui_manager), - g_strdup_printf("/menubar/ViewMenu/%s", module), - name, name, GTK_UI_MANAGER_AUTO, FALSE); -} - -static void add_modules_to_gui(gpointer data, gpointer user_data) -{ - ShellTree *shelltree = (ShellTree *) user_data; - ShellModule *module = (ShellModule *) data; - GtkTreeStore *store = GTK_TREE_STORE(shelltree->model); - GtkTreeIter parent; - - if (!module) { - return; - } - - gtk_tree_store_append(store, &parent, NULL); - gtk_tree_store_set(store, &parent, TREE_COL_NAME, module->name, - TREE_COL_DATA, NULL, TREE_COL_SEL, FALSE, -1); - - if (module->icon) { - gtk_tree_store_set(store, &parent, TREE_COL_PBUF, module->icon, - -1); - } - - add_module_to_menu(module->name, module->icon); - - if (module->entries) { - ShellModuleEntry *entry; - GSList *p; - - for (p = module->entries; p; p = g_slist_next(p)) { - GtkTreeIter child; - entry = (ShellModuleEntry *) p->data; - - gtk_tree_store_append(store, &child, &parent); - gtk_tree_store_set(store, &child, TREE_COL_NAME, entry->name, - TREE_COL_DATA, entry, - TREE_COL_SEL, FALSE, -1); - - if (entry->icon) { - gtk_tree_store_set(store, &child, TREE_COL_PBUF, - entry->icon, -1); - } - - add_module_entry_to_view_menu(module->name, entry->name, - entry->icon, - gtk_tree_iter_copy(&child)); - - shell_status_pulse(); - } - - } -} - -static void __tree_iter_destroy(gpointer data) -{ - gtk_tree_iter_free((GtkTreeIter *) data); -} - -void shell_init(GSList * modules) -{ - if (shell) { - g_error("Shell already created"); - return; - } - - DEBUG("initializing shell"); - - create_window(); - - shell_action_set_property("CopyAction", "is-important", TRUE); - shell_action_set_property("RefreshAction", "is-important", TRUE); - shell_action_set_property("ReportAction", "is-important", TRUE); - - shell->tree = tree_new(); - shell->info = info_tree_new(FALSE); - shell->moreinfo = info_tree_new(TRUE); - shell->loadgraph = load_graph_new(75); - update_tbl = g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, __tree_iter_destroy); - - gtk_paned_pack1(GTK_PANED(shell->hpaned), shell->tree->scroll, - SHELL_PACK_RESIZE, SHELL_PACK_SHRINK); - gtk_paned_pack1(GTK_PANED(shell->vpaned), shell->info->scroll, - SHELL_PACK_RESIZE, SHELL_PACK_SHRINK); - - gtk_notebook_append_page(GTK_NOTEBOOK(shell->notebook), - shell->moreinfo->scroll, NULL); - gtk_notebook_append_page(GTK_NOTEBOOK(shell->notebook), - load_graph_get_framed(shell->loadgraph), - NULL); - - gtk_notebook_set_show_tabs(GTK_NOTEBOOK(shell->notebook), FALSE); - gtk_notebook_set_show_border(GTK_NOTEBOOK(shell->notebook), FALSE); - - shell_status_set_enabled(TRUE); - shell_status_update("Loading modules..."); - - shell->tree->modules = modules ? modules : modules_load_all(); - - g_slist_foreach(shell->tree->modules, add_modules_to_gui, shell->tree); - gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->tree->view)); - - gtk_widget_show_all(shell->hpaned); - - load_graph_configure_expose(shell->loadgraph); - gtk_widget_hide(shell->notebook); - gtk_widget_hide(shell->note->frame); - - shell_status_update("Done."); - shell_status_set_enabled(FALSE); - - shell_action_set_enabled("RefreshAction", FALSE); - shell_action_set_enabled("CopyAction", FALSE); - shell_action_set_enabled("SaveGraphAction", FALSE); - shell_action_set_active("SidePaneAction", TRUE); - shell_action_set_active("ToolbarAction", TRUE); - -#ifndef HAS_LIBSOUP - shell_action_set_enabled("SyncManagerAction", FALSE); -#else - shell_action_set_enabled("SyncManagerAction", sync_manager_count_entries() > 0); -#endif -} - -static gboolean update_field(gpointer data) -{ - ShellFieldUpdate *fu; - GtkTreeIter *iter; - - fu = (ShellFieldUpdate *) data; - g_return_val_if_fail(fu != NULL, FALSE); - - DEBUG("update_field [%s]", fu->field_name); - - iter = g_hash_table_lookup(update_tbl, fu->field_name); - g_return_val_if_fail(iter != NULL, FALSE); - - /* if the entry is still selected, update it */ - if (iter && fu->entry->selected && fu->entry->fieldfunc) { - GtkTreeStore *store = GTK_TREE_STORE(shell->info->model); - gchar *value = fu->entry->fieldfunc(fu->field_name); - - /* - * this function is also used to feed the load graph when ViewType - * is SHELL_VIEW_LOAD_GRAPH - */ - if (shell->view_type == SHELL_VIEW_LOAD_GRAPH && - gtk_tree_selection_iter_is_selected(shell->info->selection, - iter)) { - load_graph_update(shell->loadgraph, atoi(value)); - } - - gtk_tree_store_set(store, iter, INFO_TREE_COL_VALUE, value, -1); - - g_free(value); - return TRUE; - } - - if (update_sfusrc) { - GSList *sfu; - - for (sfu = update_sfusrc; sfu; sfu = sfu->next) { - g_free(sfu->data); - } - - g_slist_free(update_sfusrc); - update_sfusrc = NULL; - } - - /* otherwise, cleanup and destroy the timeout */ - g_free(fu->field_name); - g_free(fu); - - return FALSE; -} - -#define RANGE_SET_VALUE(tree,scrollbar,value) \ - gtk_range_set_value(GTK_RANGE \ - (GTK_SCROLLED_WINDOW(shell->tree->scroll)-> \ - scrollbar), value); - -static gboolean reload_section(gpointer data) -{ - ShellModuleEntry *entry = (ShellModuleEntry *) data; - - /* if the entry is still selected, update it */ - if (entry->selected) { - GtkTreePath *path = NULL; - GtkTreeIter iter; - - /* avoid drawing the window while we reload */ - gdk_window_freeze_updates(shell->window->window); - - /* gets the current selected path */ - if (gtk_tree_selection_get_selected - (shell->info->selection, &shell->info->model, &iter)) { - path = gtk_tree_model_get_path(shell->info->model, &iter); - } - - /* update the information, clear the treeview and populate it again */ - module_entry_reload(entry); - info_selected_show_extra(NULL); /* clears the more info store */ - module_selected_show_info(entry, TRUE); - - /* if there was a selection, reselect it */ - if (path) { - gtk_tree_selection_select_path(shell->info->selection, path); - gtk_tree_view_set_cursor(GTK_TREE_VIEW(shell->info->view), path, NULL, - FALSE); - gtk_tree_path_free(path); - } - - /* make the window drawable again */ - gdk_window_thaw_updates(shell->window->window); - } - - /* destroy the timeout: it'll be set up again */ - return FALSE; -} - -static gboolean rescan_section(gpointer data) -{ - ShellModuleEntry *entry = (ShellModuleEntry *) data; - - module_entry_reload(entry); - - return entry->selected; -} - -gint -info_tree_compare_val_func(GtkTreeModel * model, - GtkTreeIter * a, - GtkTreeIter * b, gpointer userdata) -{ - gint ret = 0; - gchar *col1, *col2; - - gtk_tree_model_get(model, a, INFO_TREE_COL_VALUE, &col1, -1); - gtk_tree_model_get(model, b, INFO_TREE_COL_VALUE, &col2, -1); - - if (col1 == NULL || col2 == NULL) { - if (col1 == NULL && col2 == NULL) - return 0; - - ret = (col1 == NULL) ? -1 : 1; - } else { - ret = shell->_order_type ? (atof(col1) < atof(col2)) : - (atof(col1) > atof(col2)); - } - - g_free(col1); - g_free(col2); - - return ret; -} - -static void set_view_type(ShellViewType viewtype, gboolean reload) -{ - if (viewtype < SHELL_VIEW_NORMAL || viewtype >= SHELL_VIEW_N_VIEWS) - viewtype = SHELL_VIEW_NORMAL; - - shell->normalize_percentage = TRUE; - shell->view_type = viewtype; - - /* reset to the default model */ - gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), - shell->info->model); - - /* reset to the default view columns */ - if (!reload) { - gtk_tree_view_column_set_visible(shell->info->col_extra1, FALSE); - gtk_tree_view_column_set_visible(shell->info->col_extra2, FALSE); - gtk_tree_view_column_set_visible(shell->info->col_progress, FALSE); - gtk_tree_view_column_set_visible(shell->info->col_value, TRUE); - } - - /* turn off the rules hint */ - gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(shell->info->view), FALSE); - - /* turn off the save graphic action */ - shell_action_set_enabled("SaveGraphAction", FALSE); - - switch (viewtype) { - default: - case SHELL_VIEW_NORMAL: - gtk_widget_hide(shell->notebook); - - if (!reload) { - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info->view), FALSE); - } - break; - case SHELL_VIEW_DUAL: - gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 0); - gtk_widget_show(shell->notebook); - break; - case SHELL_VIEW_LOAD_GRAPH: - gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 1); - gtk_widget_show(shell->notebook); - load_graph_clear(shell->loadgraph); - - gtk_paned_set_position(GTK_PANED(shell->vpaned), - shell->hpaned->allocation.height - - shell->loadgraph->height - 16); - break; - case SHELL_VIEW_PROGRESS_DUAL: - gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 0); - gtk_widget_show(shell->notebook); - /* fallthrough */ - case SHELL_VIEW_PROGRESS: - shell_action_set_enabled("SaveGraphAction", TRUE); - - if (!reload) { - gtk_tree_view_column_set_visible(shell->info->col_progress, TRUE); - gtk_tree_view_column_set_visible(shell->info->col_value, FALSE); - } - - if (viewtype == SHELL_VIEW_PROGRESS) - gtk_widget_hide(shell->notebook); - break; - } -} - -static void -group_handle_special(GKeyFile * key_file, ShellModuleEntry * entry, - gchar * group, gchar ** keys, gboolean reload) -{ - if (g_str_equal(group, "$ShellParam$")) { - gboolean headers_visible = FALSE; - gint i; - - for (i = 0; keys[i]; i++) { - gchar *key = keys[i]; - - if (g_str_has_prefix(key, "UpdateInterval")) { - ShellFieldUpdate *fu = g_new0(ShellFieldUpdate, 1); - ShellFieldUpdateSource *sfutbl; - gint ms; - - ms = g_key_file_get_integer(key_file, group, key, NULL); - - fu->field_name = g_strdup(strchr(key, '$') + 1); - fu->entry = entry; - - sfutbl = g_new0(ShellFieldUpdateSource, 1); - sfutbl->source_id = g_timeout_add(ms, update_field, fu); - sfutbl->sfu = fu; - - update_sfusrc = g_slist_prepend(update_sfusrc, sfutbl); - } else if (g_str_equal(key, "NormalizePercentage")) { - shell->normalize_percentage = g_key_file_get_boolean(key_file, group, key, NULL); - } else if (g_str_equal(key, "LoadGraphSuffix")) { - gchar *suffix = - g_key_file_get_value(key_file, group, key, NULL); - load_graph_set_data_suffix(shell->loadgraph, suffix); - g_free(suffix); - } else if (g_str_equal(key, "ReloadInterval")) { - gint ms; - - ms = g_key_file_get_integer(key_file, group, key, NULL); - - g_timeout_add(ms, reload_section, entry); - } else if (g_str_equal(key, "RescanInterval")) { - gint ms; - - ms = g_key_file_get_integer(key_file, group, key, NULL); - - g_timeout_add(ms, rescan_section, entry); - } else if (g_str_equal(key, "ShowColumnHeaders")) { - headers_visible = g_key_file_get_boolean(key_file, group, key, NULL); - } else if (g_str_has_prefix(key, "ColumnTitle")) { - GtkTreeViewColumn *column = NULL; - gchar *value, *title = strchr(key, '$') + 1; - - value = g_key_file_get_value(key_file, group, key, NULL); - - if (g_str_equal(title, "Extra1")) { - column = shell->info->col_extra1; - } else if (g_str_equal(title, "Extra2")) { - column = shell->info->col_extra2; - } else if (g_str_equal(title, "Value")) { - column = shell->info->col_value; - } else if (g_str_equal(title, "TextValue")) { - column = shell->info->col_textvalue; - } else if (g_str_equal(title, "Progress")) { - column = shell->info->col_progress; - } - - if (column) { - gtk_tree_view_column_set_title(column, value); - gtk_tree_view_column_set_visible(column, TRUE); - } - - g_free(value); - } else if (g_str_equal(key, "OrderType")) { - shell->_order_type = g_key_file_get_integer(key_file, - group, - key, NULL); - } else if (g_str_equal(key, "ViewType")) { - set_view_type(g_key_file_get_integer(key_file, group, - key, NULL), reload); - } else if (g_str_has_prefix(key, "Icon")) { - GtkTreeIter *iter = g_hash_table_lookup(update_tbl, - strchr(key, - '$') + 1); - - if (iter) { - gchar *file = - g_key_file_get_value(key_file, group, key, NULL); - gtk_tree_store_set(GTK_TREE_STORE(shell->info->model), - iter, INFO_TREE_COL_PBUF, - icon_cache_get_pixbuf_at_size(file, - 22, - 22), - -1); - g_free(file); - } - } else if (g_str_equal(key, "Zebra")) { - gtk_tree_view_set_rules_hint(GTK_TREE_VIEW - (shell->info->view), - g_key_file_get_boolean - (key_file, group, key, NULL)); - } - } - - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info->view), headers_visible); - } else { - g_warning("Unknown parameter group: ``%s''", group); - } -} - -static void -group_handle_normal(GKeyFile * key_file, ShellModuleEntry * entry, - gchar * group, gchar ** keys, gsize ngroups) -{ - GtkTreeIter parent; - GtkTreeStore *store = GTK_TREE_STORE(shell->info->model); - gchar *tmp = g_strdup(group); - gint i; - - if (ngroups > 1) { - gtk_tree_store_append(store, &parent, NULL); - - strend(tmp, '#'); - gtk_tree_store_set(store, &parent, INFO_TREE_COL_NAME, tmp, -1); - g_free(tmp); - } - - for (i = 0; keys[i]; i++) { - gchar *key = keys[i]; - gchar *value; - GtkTreeIter child; - - value = g_key_file_get_value(key_file, group, key, NULL); - if (entry->fieldfunc && value && g_str_equal(value, "...")) { - g_free(value); - value = entry->fieldfunc(key); - } - - if ((key && value) && g_utf8_validate(key, -1, NULL) && g_utf8_validate(value, -1, NULL)) { - if (ngroups == 1) { - gtk_tree_store_append(store, &child, NULL); - } else { - gtk_tree_store_append(store, &child, &parent); - } - - /* FIXME: use g_key_file_get_string_list? */ - if (strchr(value, '|')) { - gchar **columns = g_strsplit(value, "|", 0); - - gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, columns[0], -1); - if (columns[1]) { - gtk_tree_store_set(store, &child, INFO_TREE_COL_EXTRA1, columns[1], -1); - if (columns[2]) { - gtk_tree_store_set(store, &child, INFO_TREE_COL_EXTRA2, columns[2], -1); - } - } - - g_strfreev(columns); - } else { - gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, value, -1); - } - - strend(key, '#'); - - if (*key == '$') { - gchar **tmp; - - tmp = g_strsplit(++key, "$", 0); - - gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, - tmp[1], INFO_TREE_COL_DATA, tmp[0], -1); - - g_strfreev(tmp); - } else { - gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, key, - INFO_TREE_COL_DATA, NULL, -1); - } - - g_hash_table_insert(update_tbl, g_strdup(key), - gtk_tree_iter_copy(&child)); - - } - - g_free(value); - } -} - -static void -moreinfo_handle_normal(GKeyFile * key_file, gchar * group, gchar ** keys) -{ - GtkTreeIter parent; - GtkTreeStore *store = GTK_TREE_STORE(shell->moreinfo->model); - gint i; - - gtk_tree_store_append(store, &parent, NULL); - gtk_tree_store_set(store, &parent, INFO_TREE_COL_NAME, group, -1); - - for (i = 0; keys[i]; i++) { - gchar *key = keys[i]; - GtkTreeIter child; - gchar *value; - - value = g_key_file_get_value(key_file, group, key, NULL); - - if (g_utf8_validate(key, -1, NULL) - && g_utf8_validate(value, -1, NULL)) { - strend(key, '#'); - - gtk_tree_store_append(store, &child, &parent); - gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, - value, INFO_TREE_COL_NAME, key, -1); - } - - g_free(value); - } -} - -static void update_progress() -{ - GtkTreeModel *model = shell->info->model; - GtkTreeStore *store = GTK_TREE_STORE(model); - GtkTreeIter iter, fiter; - gchar *tmp; - gdouble maxv = 0, maxp = 0, cur, floatval; - - gtk_tree_model_get_iter_first(model, &fiter); - - /* finds the maximum value */ - if (shell->normalize_percentage) { - iter = fiter; - do { - gtk_tree_model_get(model, &iter, INFO_TREE_COL_VALUE, &tmp, -1); - - cur = atof(tmp); - maxv = MAX(maxv, cur); - - g_free(tmp); - } while (gtk_tree_model_iter_next(model, &iter)); - } else { - maxv = 100.0f; - } - - /* calculates the relative percentage and finds the maximum percentage */ - if (shell->_order_type == SHELL_ORDER_ASCENDING) { - iter = fiter; - do { - gtk_tree_model_get(model, &iter, INFO_TREE_COL_VALUE, &tmp, -1); - - cur = 100 - 100 * atof(tmp) / maxv; - maxp = MAX(cur, maxp); - - g_free(tmp); - } while (gtk_tree_model_iter_next(model, &iter)); - - maxp = 100 - maxp; - } - - /* fix the maximum relative percentage */ - iter = fiter; - do { - char *strval; - - gtk_tree_model_get(model, &iter, INFO_TREE_COL_VALUE, &tmp, -1); - floatval = atof(tmp); - strval = g_strdup(tmp); - g_free(tmp); - - cur = 100 * floatval / maxv; - - if (shell->_order_type == SHELL_ORDER_ASCENDING) - cur = 100 - cur + maxp; - - if (strchr(strval, ' ')) { - tmp = g_strdup_printf("%.2f%s", floatval, strchr(strval, ' ')); - } else { - tmp = g_strdup_printf("%.2f", floatval); - } - - tmp = strreplace(tmp, ",", '.'); - gtk_tree_store_set(store, &iter, INFO_TREE_COL_PROGRESS, cur, - INFO_TREE_COL_VALUE, tmp, -1); - g_free(tmp); - g_free(strval); - } while (gtk_tree_model_iter_next(model, &iter)); - - /* now sort everything up. that wasn't as hard as i thought :) */ - GtkTreeSortable *sortable = GTK_TREE_SORTABLE(shell->info->model); - - gtk_tree_sortable_set_sort_func(sortable, INFO_TREE_COL_VALUE, - info_tree_compare_val_func, 0, NULL); - gtk_tree_sortable_set_sort_column_id(sortable, - INFO_TREE_COL_VALUE, - GTK_SORT_DESCENDING); - gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), - GTK_TREE_MODEL(sortable)); -} - -void shell_set_note_from_entry(ShellModuleEntry * entry) -{ - if (entry->notefunc) { - const gchar *note = module_entry_get_note(entry); - - if (note) { - gtk_label_set_markup(GTK_LABEL(shell->note->label), note); - gtk_widget_show(shell->note->frame); - } else { - gtk_widget_hide(shell->note->frame); - } - } else { - gtk_widget_hide(shell->note->frame); - } -} - -static void -module_selected_show_info(ShellModuleEntry * entry, gboolean reload) -{ - GKeyFile *key_file = g_key_file_new(); - GtkTreeStore *store; - gchar *key_data, **groups; - gboolean has_shell_param = FALSE; - gint i; - gsize ngroups; - - module_entry_scan(entry); - key_data = module_entry_function(entry); - - /* */ - gdk_window_freeze_updates(shell->info->view->window); - - g_object_ref(shell->info->model); - gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), NULL); - - /* reset the view type to normal */ - set_view_type(SHELL_VIEW_NORMAL, reload); - - if (!reload) { - /* recreate the iter hash table */ - h_hash_table_remove_all(update_tbl); - } - - if (update_sfusrc) { - GSList *sfusrc; - - for (sfusrc = update_sfusrc; sfusrc; sfusrc = sfusrc->next) { - ShellFieldUpdateSource *src = - (ShellFieldUpdateSource *) sfusrc->data; - - g_source_remove(src->source_id); - g_free(src->sfu->field_name); - g_free(src->sfu); - g_free(src); - } - - g_slist_free(update_sfusrc); - update_sfusrc = NULL; - } - - store = GTK_TREE_STORE(shell->info->model); - - gtk_tree_store_clear(store); - - g_key_file_load_from_data(key_file, key_data, strlen(key_data), 0, - NULL); - groups = g_key_file_get_groups(key_file, &ngroups); - - for (i = 0; groups[i]; i++) - if (groups[i][0] == '$') - ngroups--; - - for (i = 0; groups[i]; i++) { - gchar *group = groups[i]; - gchar **keys = g_key_file_get_keys(key_file, group, NULL, NULL); - - if (*group == '$') { - group_handle_special(key_file, entry, group, keys, reload); - has_shell_param = TRUE; - } else { - group_handle_normal(key_file, entry, group, keys, ngroups); - } - - g_strfreev(keys); - } - - /* */ - if (!has_shell_param) { - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info->view), FALSE); - } - - /* */ - g_object_unref(shell->info->model); - gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), shell->info->model); - gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->info->view)); - - gdk_window_thaw_updates(shell->info->view->window); - shell_set_note_from_entry(entry); - - if (shell->view_type == SHELL_VIEW_PROGRESS || shell->view_type == SHELL_VIEW_PROGRESS_DUAL) { - update_progress(); - } - -#if GTK_CHECK_VERSION(2,12,0) - if (ngroups == 1) { - gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(shell->info->view), - FALSE); - } else { - gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(shell->info->view), - TRUE); - } -#endif - - g_strfreev(groups); - g_key_file_free(key_file); - g_free(key_data); -} - -static void info_selected_show_extra(gchar * data) -{ - GtkTreeStore *store; - - store = GTK_TREE_STORE(shell->moreinfo->model); - gtk_tree_store_clear(store); - - if (!shell->selected->morefunc) - return; - - if (data) { - GKeyFile *key_file = g_key_file_new(); - gchar *key_data = shell->selected->morefunc(data); - gchar **groups; - gint i; - - g_key_file_load_from_data(key_file, key_data, strlen(key_data), 0, - NULL); - groups = g_key_file_get_groups(key_file, NULL); - - for (i = 0; groups[i]; i++) { - gchar *group = groups[i]; - gchar **keys = - g_key_file_get_keys(key_file, group, NULL, NULL); - - moreinfo_handle_normal(key_file, group, keys); - } - - gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->moreinfo->view)); - - g_strfreev(groups); - g_key_file_free(key_file); - g_free(key_data); - } -} - -static void module_selected(gpointer data) -{ - ShellTree *shelltree = shell->tree; - GtkTreeModel *model = GTK_TREE_MODEL(shelltree->model); - GtkTreeIter parent; - ShellModuleEntry *entry; - static ShellModuleEntry *current = NULL; - static gboolean updating = FALSE; - - /* Gets the currently selected item on the left-side TreeView; if there is no - selection, silently return */ - if (!gtk_tree_selection_get_selected - (shelltree->selection, &model, &parent)) { - return; - } - - /* Mark the currently selected module as "unselected"; this is used to kill the - update timeout. */ - if (current) { - current->selected = FALSE; - } - - if (updating) { - return; - } else { - updating = TRUE; - } - - /* Get the current selection and shows its related info */ - gtk_tree_model_get(model, &parent, TREE_COL_DATA, &entry, -1); - if (entry && !entry->selected) { - gchar *title; - - shell_status_set_enabled(TRUE); - shell_status_update("Updating..."); - - entry->selected = TRUE; - shell->selected = entry; - module_selected_show_info(entry, FALSE); - - info_selected_show_extra(NULL); /* clears the more info store */ - gtk_tree_view_columns_autosize(GTK_TREE_VIEW(shell->info->view)); - - /* urgh. why don't GTK do this when the model is cleared? */ - RANGE_SET_VALUE(info, vscrollbar, 0.0); - RANGE_SET_VALUE(info, hscrollbar, 0.0); - RANGE_SET_VALUE(moreinfo, vscrollbar, 0.0); - RANGE_SET_VALUE(moreinfo, hscrollbar, 0.0); - - shell_status_update("Done."); - shell_status_set_enabled(FALSE); - - title = g_strdup_printf("%s - System Information", entry->name); - gtk_window_set_title(GTK_WINDOW(shell->window), title); - g_free(title); - - shell_action_set_enabled("RefreshAction", TRUE); - shell_action_set_enabled("CopyAction", TRUE); - } else { - gtk_window_set_title(GTK_WINDOW(shell->window), - "System Information"); - shell_action_set_enabled("RefreshAction", FALSE); - shell_action_set_enabled("CopyAction", FALSE); - - gtk_tree_store_clear(GTK_TREE_STORE(shell->info->model)); - set_view_type(SHELL_VIEW_NORMAL, FALSE); - } - - current = entry; - updating = FALSE; -} - -static void info_selected(GtkTreeSelection * ts, gpointer data) -{ - ShellInfoTree *info = (ShellInfoTree *) data; - GtkTreeModel *model = GTK_TREE_MODEL(info->model); - GtkTreeIter parent; - gchar *datacol; - - if (!gtk_tree_selection_get_selected(ts, &model, &parent)) - return; - - gtk_tree_model_get(model, &parent, INFO_TREE_COL_DATA, &datacol, -1); - info_selected_show_extra(datacol); - gtk_tree_view_columns_autosize(GTK_TREE_VIEW(shell->moreinfo->view)); -} - -static ShellInfoTree *info_tree_new(gboolean extra) -{ - ShellInfoTree *info; - GtkWidget *treeview, *scroll; - GtkTreeModel *model; - GtkTreeStore *store; - GtkTreeViewColumn *column; - GtkCellRenderer *cr_text, *cr_pbuf, *cr_progress; - GtkTreeSelection *sel; - - info = g_new0(ShellInfoTree, 1); - - scroll = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW - (scroll), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_ALWAYS); - - store = - gtk_tree_store_new(INFO_TREE_NCOL, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_FLOAT, - G_TYPE_STRING, G_TYPE_STRING); - model = GTK_TREE_MODEL(store); - treeview = gtk_tree_view_new_with_model(model); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); - gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(treeview), TRUE); - - info->col_progress = column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_visible(column, FALSE); - gtk_tree_view_column_set_min_width(column, 240); - gtk_tree_view_column_set_clickable(column, TRUE); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - - cr_progress = gtk_cell_renderer_progress_new(); - gtk_tree_view_column_pack_start(column, cr_progress, TRUE); - gtk_tree_view_column_add_attribute(column, cr_progress, "value", - INFO_TREE_COL_PROGRESS); - gtk_tree_view_column_add_attribute(column, cr_progress, "text", - INFO_TREE_COL_VALUE); - gtk_tree_view_column_set_visible(column, FALSE); - - info->col_textvalue = column = gtk_tree_view_column_new(); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - gtk_tree_view_column_set_clickable(column, TRUE); - - cr_pbuf = gtk_cell_renderer_pixbuf_new(); - gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE); - gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf", - INFO_TREE_COL_PBUF); - - cr_text = gtk_cell_renderer_text_new(); - gtk_tree_view_column_pack_start(column, cr_text, TRUE); - gtk_tree_view_column_add_attribute(column, cr_text, "markup", - INFO_TREE_COL_NAME); - - info->col_extra1 = column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_visible(column, FALSE); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - gtk_tree_view_column_set_clickable(column, TRUE); - - cr_text = gtk_cell_renderer_text_new(); - gtk_tree_view_column_pack_start(column, cr_text, FALSE); - gtk_tree_view_column_add_attribute(column, cr_text, "markup", - INFO_TREE_COL_EXTRA1); - - info->col_extra2 = column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_visible(column, FALSE); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - gtk_tree_view_column_set_clickable(column, TRUE); - - cr_text = gtk_cell_renderer_text_new(); - gtk_tree_view_column_pack_start(column, cr_text, FALSE); - gtk_tree_view_column_add_attribute(column, cr_text, "markup", - INFO_TREE_COL_EXTRA2); - - info->col_value = column = gtk_tree_view_column_new(); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - gtk_tree_view_column_set_clickable(column, TRUE); - - cr_text = gtk_cell_renderer_text_new(); - gtk_tree_view_column_pack_start(column, cr_text, FALSE); - gtk_tree_view_column_add_attribute(column, cr_text, "markup", - INFO_TREE_COL_VALUE); - - sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); - - if (!extra) - g_signal_connect(G_OBJECT(sel), "changed", - (GCallback) info_selected, info); - - gtk_container_add(GTK_CONTAINER(scroll), treeview); - - info->scroll = scroll; - info->view = treeview; - info->model = model; - info->selection = sel; - - gtk_widget_show_all(scroll); - - return info; -} - -static ShellTree *tree_new() -{ - ShellTree *shelltree; - GtkWidget *treeview, *scroll; - GtkTreeModel *model; - GtkTreeStore *store; - GtkCellRenderer *cr_text, *cr_pbuf; - GtkTreeViewColumn *column; - GtkTreeSelection *sel; - - shelltree = g_new0(ShellTree, 1); - - scroll = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW - (scroll), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), - GTK_POLICY_NEVER, - GTK_POLICY_AUTOMATIC); - - store = gtk_tree_store_new(TREE_NCOL, GDK_TYPE_PIXBUF, G_TYPE_STRING, - G_TYPE_POINTER, G_TYPE_BOOLEAN); - model = GTK_TREE_MODEL(store); - treeview = gtk_tree_view_new_with_model(model); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); - - column = gtk_tree_view_column_new(); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - - cr_pbuf = gtk_cell_renderer_pixbuf_new(); - cr_text = gtk_cell_renderer_text_new(); - gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE); - gtk_tree_view_column_pack_start(column, cr_text, TRUE); - - gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf", - TREE_COL_PBUF); - gtk_tree_view_column_add_attribute(column, cr_text, "markup", - TREE_COL_NAME); - - sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); - g_signal_connect(G_OBJECT(sel), "changed", (GCallback) module_selected, - NULL); - - gtk_container_add(GTK_CONTAINER(scroll), treeview); - - shelltree->scroll = scroll; - shelltree->view = treeview; - shelltree->model = model; - shelltree->modules = NULL; - shelltree->selection = sel; - - gtk_widget_show_all(scroll); - - return shelltree; -} diff --git a/shell.h b/shell.h deleted file mode 100644 index 56b7765f..00000000 --- a/shell.h +++ /dev/null @@ -1,185 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __SHELL_H__ -#define __SHELL_H__ - -#include -#include - -typedef struct _Shell Shell; -typedef struct _ShellTree ShellTree; -typedef struct _ShellInfoTree ShellInfoTree; -typedef struct _ShellNote ShellNote; - -typedef struct _ShellModule ShellModule; -typedef struct _ShellModuleMethod ShellModuleMethod; -typedef struct _ShellModuleEntry ShellModuleEntry; - -typedef struct _ShellFieldUpdate ShellFieldUpdate; -typedef struct _ShellFieldUpdateSource ShellFieldUpdateSource; - -typedef enum { - SHELL_ORDER_DESCENDING, - SHELL_ORDER_ASCENDING, -} ShellOrderType; - -typedef enum { - SHELL_PACK_RESIZE = 1 << 0, - SHELL_PACK_SHRINK = 1 << 1 -} ShellPackOptions; - -typedef enum { - SHELL_VIEW_NORMAL, - SHELL_VIEW_DUAL, - SHELL_VIEW_LOAD_GRAPH, - SHELL_VIEW_PROGRESS, - SHELL_VIEW_PROGRESS_DUAL, - SHELL_VIEW_N_VIEWS -} ShellViewType; - -typedef enum { - TREE_COL_PBUF, - TREE_COL_NAME, - TREE_COL_DATA, - TREE_COL_SEL, - TREE_NCOL -} ShellTreeColumns; - -typedef enum { - INFO_TREE_COL_NAME, - INFO_TREE_COL_VALUE, - INFO_TREE_COL_DATA, - INFO_TREE_COL_PBUF, - INFO_TREE_COL_PROGRESS, - INFO_TREE_COL_EXTRA1, - INFO_TREE_COL_EXTRA2, - INFO_TREE_NCOL -} ShellInfoTreeColumns; - -struct _Shell { - GtkWidget *window, *vbox; - GtkWidget *status, *progress; - GtkWidget *notebook; - GtkWidget *hpaned, *vpaned; - - ShellTree *tree; - ShellInfoTree *info, *moreinfo; - ShellModuleEntry *selected; - ShellNote *note; - LoadGraph *loadgraph; - - GtkActionGroup *action_group; - GtkUIManager *ui_manager; - - ShellViewType view_type; - gboolean normalize_percentage; - - gint _pulses; - ShellOrderType _order_type; -}; - -struct _ShellTree { - GtkWidget *scroll; - GtkWidget *view; - GtkTreeModel *model; - GtkTreeSelection *selection; - - GSList *modules; -}; - -struct _ShellInfoTree { - GtkWidget *scroll; - GtkWidget *view; - GtkTreeModel *model; - GtkTreeSelection *selection; - - GtkTreeViewColumn *col_progress, *col_value, *col_extra1, *col_extra2, *col_textvalue; -}; - -struct _ShellNote { - GtkWidget *frame; - GtkWidget *label; -}; - -struct _ShellModule { - gchar *name; - GdkPixbuf *icon; - GModule *dll; - - guchar weight; - - GSList *entries; -}; - -struct _ShellModuleMethod { - gchar *name; - gpointer function; -}; - -struct _ShellModuleEntry { - gchar *name; - GdkPixbuf *icon; - gboolean selected; - gint number; - - gchar *(*func) (); - void (*scan_func) (); - - gchar *(*fieldfunc) (gchar * entry); - gchar *(*morefunc) (gchar * entry); - gchar *(*notefunc) (gint entry); -}; - -struct _ShellFieldUpdate { - ShellModuleEntry *entry; - gchar *field_name; -}; - -struct _ShellFieldUpdateSource { - guint source_id; - ShellFieldUpdate *sfu; -}; - -void shell_init(GSList *modules); -void shell_do_reload(void); - -Shell *shell_get_main_shell(); - -void shell_action_set_enabled(const gchar *action_name, - gboolean setting); -gboolean shell_action_get_enabled(const gchar *action_name); -gboolean shell_action_get_active(const gchar *action_name); -void shell_action_set_active(const gchar *action_name, - gboolean setting); -void shell_action_set_property(const gchar *action_name, - const gchar *property, - gboolean setting); - -void shell_set_side_pane_visible(gboolean setting); -void shell_set_note_from_entry(ShellModuleEntry *entry); -void shell_ui_manager_set_visible(const gchar *path, - gboolean setting); - -void shell_status_update(const gchar *message); -void shell_status_pulse(void); -void shell_status_set_percentage(gint percentage); -void shell_status_set_enabled(gboolean setting); - -void shell_view_set_enabled(gboolean setting); - -#endif /* __SHELL_H__ */ diff --git a/shell/callbacks.c b/shell/callbacks.c new file mode 100644 index 00000000..d5ac34da --- /dev/null +++ b/shell/callbacks.c @@ -0,0 +1,265 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include "hardinfo.h" +#include "callbacks.h" +#include "iconcache.h" + +#include "shell.h" +#include "report.h" +#include "syncmanager.h" +#include "xmlrpc-server.h" + +#include "config.h" + +void cb_sync_manager() +{ + Shell *shell = shell_get_main_shell(); + + sync_manager_show(shell->window); +} + +void cb_save_graphic() +{ + Shell *shell = shell_get_main_shell(); + GtkWidget *dialog; + gchar *filename; + + /* save the pixbuf to a png file */ + dialog = gtk_file_chooser_dialog_new(_("Save Image"), + NULL, + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, + GTK_RESPONSE_ACCEPT, NULL); + + filename = g_strconcat(shell->selected->name, ".png", NULL); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename); + g_free(filename); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + gtk_widget_destroy(dialog); + + shell_status_update(_("Saving image...")); + + tree_view_save_image(filename); + + shell_status_update(_("Done.")); + g_free(filename); + + return; + } + + gtk_widget_destroy(dialog); +} + +void cb_open_web_page() +{ + open_url("http://www.hardinfo.org"); +} + +void cb_report_bug() +{ + open_url("https://github.com/lpereira/hardinfo"); +} + +void cb_refresh() +{ + shell_do_reload(); +} + +void cb_copy_to_clipboard() +{ + ShellModuleEntry *entry = shell_get_main_shell()->selected; + + if (entry) { + gchar *data = module_entry_function(entry); + GtkClipboard *clip = + gtk_clipboard_get(gdk_atom_intern("CLIPBOARD", FALSE)); + ReportContext *ctx = report_context_text_new(NULL); + + ctx->entry = entry; + + report_header(ctx); + report_table(ctx, data); + report_footer(ctx); + + gtk_clipboard_set_text(clip, ctx->output, -1); + + g_free(data); + report_context_free(ctx); + } +} + +void cb_side_pane() +{ + gboolean visible; + + visible = shell_action_get_active("SidePaneAction"); + shell_set_side_pane_visible(visible); +} + +void cb_toolbar() +{ + gboolean visible; + + visible = shell_action_get_active("ToolbarAction"); + shell_ui_manager_set_visible("/MainMenuBarAction", visible); +} + +void cb_about_module(GtkAction * action) +{ + Shell *shell = shell_get_main_shell(); + GSList *modules = shell->tree->modules; + ModuleAbout *ma; + gchar *name; + + g_object_get(G_OBJECT(action), "tooltip", &name, NULL); + + for (; modules; modules = modules->next) { + ShellModule *sm = (ShellModule *) modules->data; + + if (!g_str_equal(sm->name, name)) + continue; + + if ((ma = module_get_about(sm))) { + GtkWidget *about; + gchar *text; + + about = gtk_about_dialog_new(); + + text = g_strdup_printf(_("%s Module"), sm->name); + gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(about), text); + g_free(text); + + gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about), + ma->version); + + text = g_strdup_printf(_("Written by %s\nLicensed under %s"), + ma->author, ma->license); + gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about), text); + g_free(text); + + if (ma->description) + gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about), + ma->description); + + gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(about), sm->icon); + gtk_dialog_run(GTK_DIALOG(about)); + gtk_widget_destroy(about); + } else { + g_warning + (_("No about information is associated with the %s module."), + name); + } + + break; + } + + g_free(name); +} + +void cb_about() +{ + GtkWidget *about; + const gchar *authors[] = { + _("Author:"), + "Leandro A. F. Pereira", + "", + _("Contributors:"), + "Agney Lopes Roth Ferraz", + "Andrey Esin", + "", + _("Based on work by:"), + _("MD5 implementation by Colin Plumb (see md5.c for details)"), + _("SHA1 implementation by Steve Reid (see sha1.c for details)"), + _("Blowfish implementation by Paul Kocher (see blowfich.c for details)"), + _("Raytracing benchmark by John Walker (see fbench.c for details)"), + _("FFT benchmark by Scott Robert Ladd (see fftbench.c for details)"), + _("Some code partly based on x86cpucaps by Osamu Kayasono"), + _("Vendor list based on GtkSysInfo by Pissens Sebastien"), + _("DMI support based on code by Stewart Adam"), + _("SCSI support based on code by Pascal F. Martin"), + NULL + }; + const gchar *artists[] = { + _("Jakub Szypulka"), + _("Tango Project"), + _("The GNOME Project"), + _("VMWare, Inc. (USB icon from VMWare Workstation 6)"), + NULL + }; + + about = gtk_about_dialog_new(); + gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(about), "HardInfo"); + gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about), VERSION); + gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about), + "Copyright \302\251 2003-2016 " + "Leandro A. F. Pereira"); + gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about), + _("System information and benchmark tool")); + gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(about), + icon_cache_get_pixbuf("logo.png")); + + gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(about), + _("HardInfo is free software; you can redistribute it and/or modify " + "it under the terms of the GNU General Public License as published by " + "the Free Software Foundation, version 2.\n\n" + "This program is distributed in the hope that it will be useful, " + "but WITHOUT ANY WARRANTY; without even the implied warranty of " + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " + "GNU General Public License for more details.\n\n" + "You should have received a copy of the GNU General Public License " + "along with this program; if not, write to the Free Software " + "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA")); +#if GTK_CHECK_VERSION(2,8,0) + gtk_about_dialog_set_wrap_license(GTK_ABOUT_DIALOG(about), TRUE); +#endif + + gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(about), authors); + gtk_about_dialog_set_artists(GTK_ABOUT_DIALOG(about), artists); + + gtk_dialog_run(GTK_DIALOG(about)); + gtk_widget_destroy(about); +} + +void cb_generate_report() +{ + Shell *shell = shell_get_main_shell(); + gboolean btn_refresh = shell_action_get_enabled("RefreshAction"); + gboolean btn_copy = shell_action_get_enabled("CopyAction"); + + report_dialog_show(shell->tree->model, shell->window); + + shell_action_set_enabled("RefreshAction", btn_refresh); + shell_action_set_enabled("CopyAction", btn_copy); +} + +void cb_quit(void) +{ + do { + gtk_main_quit(); + } while (gtk_main_level() > 1); + + exit(0); +} diff --git a/shell/iconcache.c b/shell/iconcache.c new file mode 100644 index 00000000..74b19b0c --- /dev/null +++ b/shell/iconcache.c @@ -0,0 +1,100 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include +#include +#include + +static GHashTable *cache = NULL; + +void icon_cache_init(void) +{ + if (!cache) { + DEBUG("initializing icon cache"); + cache = g_hash_table_new(g_str_hash, g_str_equal); + } +} + +GdkPixbuf *icon_cache_get_pixbuf(const gchar * file) +{ + GdkPixbuf *icon; + + if (!cache) + icon_cache_init(); + + icon = g_hash_table_lookup(cache, file); + + if (!icon) { + gchar *path; + + path = g_build_filename(params.path_data, "pixmaps", file, NULL); + icon = gdk_pixbuf_new_from_file(path, NULL); + g_hash_table_insert(cache, g_strdup(file), icon); + + g_free(path); + } + + if (icon) { + g_object_ref(icon); + } + + return icon; +} + +GtkWidget *icon_cache_get_image(const gchar * file) +{ + GdkPixbuf *icon; + + icon = icon_cache_get_pixbuf(file); + return gtk_image_new_from_pixbuf(icon); +} + +GdkPixbuf *icon_cache_get_pixbuf_at_size(const gchar * file, gint wid, + gint hei) +{ + GdkPixbuf *icon; + + if (!cache) + icon_cache_init(); + + icon = g_hash_table_lookup(cache, file); + + if (!icon) { + gchar *path; + + path = g_build_filename(params.path_data, "pixmaps", file, NULL); + icon = gdk_pixbuf_new_from_file_at_size(path, wid, hei, NULL); + g_hash_table_insert(cache, g_strdup(file), icon); + + g_free(path); + } + + if (icon) { + g_object_ref(icon); + } + + return icon; +} + +GtkWidget *icon_cache_get_image_at_size(const gchar * file, gint wid, + gint hei) +{ + GdkPixbuf *icon; + + icon = icon_cache_get_pixbuf_at_size(file, wid, hei); + return gtk_image_new_from_pixbuf(icon); +} diff --git a/shell/loadgraph.c b/shell/loadgraph.c new file mode 100644 index 00000000..8fbeef48 --- /dev/null +++ b/shell/loadgraph.c @@ -0,0 +1,349 @@ +/* + * Simple Load Graph + * Version 0.1 - Wed, Jan 11 2006 + * - initial release + * Version 0.1.1 - Fri, Jan 13 2006 + * - fixes autoscaling + * - add color + * + * Copyright (C) 2006 Leandro A. F. Pereira + * + * The Simple Load Graph is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License, version 2.1, as published by the Free Software Foundation. + * + * The Simple Load Graph is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with the Simple Load Graph; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA. + */ + +#include "loadgraph.h" + +static void _draw(LoadGraph * lg); + +LoadGraph *load_graph_new(gint size) +{ + LoadGraph *lg; + + lg = g_new0(LoadGraph, 1); + + size++; + + lg->suffix = g_strdup(""); + lg->area = gtk_drawing_area_new(); + lg->size = (size * 3) / 2; + lg->data = g_new0(gint, lg->size); + + lg->scale = 1.0; + + lg->width = size * 6; + lg->height = size * 2; + + lg->max_value = 1; + lg->remax_count = 0; + + lg->layout = pango_layout_new(gtk_widget_get_pango_context(lg->area)); + + gtk_widget_set_size_request(lg->area, lg->width, lg->height); + gtk_widget_show(lg->area); + + return lg; +} + +void load_graph_set_data_suffix(LoadGraph * lg, gchar * suffix) +{ + g_free(lg->suffix); + lg->suffix = g_strdup(suffix); +} + +gchar *load_graph_get_data_suffix(LoadGraph * lg) +{ + return lg->suffix; +} + +GtkWidget *load_graph_get_framed(LoadGraph * lg) +{ + GtkWidget *align, *frame; + + align = gtk_alignment_new(0.5, 0.5, 0, 0); + gtk_widget_show(align); + + frame = gtk_frame_new(NULL); + gtk_widget_show(frame); + gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); + + gtk_container_add(GTK_CONTAINER(align), frame); + gtk_container_add(GTK_CONTAINER(frame), lg->area); + + return align; +} + +void load_graph_clear(LoadGraph * lg) +{ + gint i; + + for (i = 0; i < lg->size; i++) + lg->data[i] = 0; + + lg->scale = 1.0; + lg->max_value = 1; + lg->remax_count = 0; + + _draw(lg); +} + +void load_graph_set_color(LoadGraph * lg, LoadGraphColor color) +{ + lg->color = color; + gdk_rgb_gc_set_foreground(lg->trace, lg->color); + gdk_rgb_gc_set_foreground(lg->fill, lg->color - 0x303030); + gdk_rgb_gc_set_foreground(lg->grid, lg->color - 0xcdcdcd); +} + +void load_graph_destroy(LoadGraph * lg) +{ + g_free(lg->data); + gtk_widget_destroy(lg->area); + gdk_pixmap_unref(lg->buf); + g_object_unref(lg->trace); + g_object_unref(lg->grid); + g_object_unref(lg->fill); + g_object_unref(lg->layout); + g_free(lg); +} + +static gboolean _expose(GtkWidget * widget, GdkEventExpose * event, + gpointer user_data) +{ + LoadGraph *lg = (LoadGraph *) user_data; + GdkDrawable *draw = GDK_DRAWABLE(lg->buf); + + gdk_draw_drawable(lg->area->window, + lg->area->style->black_gc, + draw, 0, 0, 0, 0, lg->width, lg->height); + return FALSE; +} + +void load_graph_configure_expose(LoadGraph * lg) +{ + /* creates the backing store pixmap */ + gtk_widget_realize(lg->area); + lg->buf = gdk_pixmap_new(lg->area->window, lg->width, lg->height, -1); + + /* create the graphic contexts */ + lg->grid = gdk_gc_new(GDK_DRAWABLE(lg->buf)); + lg->trace = gdk_gc_new(GDK_DRAWABLE(lg->buf)); + lg->fill = gdk_gc_new(GDK_DRAWABLE(lg->buf)); + + /* the default color is green */ + load_graph_set_color(lg, LG_COLOR_GREEN); + + /* init graphic contexts */ + gdk_gc_set_line_attributes(lg->grid, + 1, GDK_LINE_ON_OFF_DASH, + GDK_CAP_NOT_LAST, GDK_JOIN_ROUND); + gdk_gc_set_dashes(lg->grid, 0, (gint8*)"\2\2", 2); + +#if 0 /* old-style grid */ + gdk_rgb_gc_set_foreground(lg->grid, 0x707070); +#endif + + gdk_gc_set_line_attributes(lg->trace, + 1, GDK_LINE_SOLID, + GDK_CAP_PROJECTING, GDK_JOIN_ROUND); + +#if 0 /* old-style fill */ + gdk_gc_set_line_attributes(lg->fill, + 1, GDK_LINE_SOLID, + GDK_CAP_BUTT, GDK_JOIN_BEVEL); +#endif + + /* configures the expose event */ + g_signal_connect(G_OBJECT(lg->area), "expose-event", + (GCallback) _expose, lg); +} + +static void _draw_label_and_line(LoadGraph * lg, gint position, gint value) +{ + gchar *tmp; + + /* draw lines */ + if (position > 0) + gdk_draw_line(GDK_DRAWABLE(lg->buf), lg->grid, 0, position, + lg->width, position); + else + position = -1 * position; + + /* draw label */ + tmp = + g_strdup_printf("%d%s", value, + lg->suffix); + + pango_layout_set_markup(lg->layout, tmp, -1); + pango_layout_set_width(lg->layout, + lg->area->allocation.width * PANGO_SCALE); + gdk_draw_layout(GDK_DRAWABLE(lg->buf), lg->trace, 2, position, + lg->layout); + + g_free(tmp); +} + +static void _draw(LoadGraph * lg) +{ + GdkDrawable *draw = GDK_DRAWABLE(lg->buf); + gint i, d; + + /* clears the drawing area */ + gdk_draw_rectangle(draw, lg->area->style->black_gc, + TRUE, 0, 0, lg->width, lg->height); + + + /* the graph */ + GdkPoint *points = g_new0(GdkPoint, lg->size + 1); + + for (i = 0; i < lg->size; i++) { + points[i].x = i * 4; + points[i].y = lg->height - lg->data[i] * lg->scale; + } + + points[0].x = points[1].x = 0; + points[0].y = points[i].y = lg->height; + points[i].x = points[i - 1].x = lg->width; + + gdk_draw_polygon(draw, lg->fill, TRUE, points, lg->size + 1); + gdk_draw_polygon(draw, lg->trace, FALSE, points, lg->size + 1); + + g_free(points); + + /* vertical bars */ + for (i = lg->width, d = 0; i > 1; i--, d++) + if ((d % 45) == 0 && d) + gdk_draw_line(draw, lg->grid, i, 0, i, lg->height); + + /* horizontal bars and labels; 25%, 50% and 75% */ + _draw_label_and_line(lg, -1, lg->max_value); + _draw_label_and_line(lg, lg->height / 4, 3 * (lg->max_value / 4)); + _draw_label_and_line(lg, lg->height / 2, lg->max_value / 2); + _draw_label_and_line(lg, 3 * (lg->height / 4), lg->max_value / 4); + +#if 0 /* old-style drawing */ + for (i = 0; i < lg->size; i++) { + gint this = lg->height - lg->data[i] * lg->scale; + gint next = lg->height - lg->data[i + 1] * lg->scale; + gint i4 = i * 4; + + gdk_draw_line(draw, lg->fill, i4, this, i4, lg->height); + gdk_draw_line(draw, lg->fill, i4 + 2, this, i4 + 2, lg->height); + } + + for (i = 0; i < lg->size; i++) { + gint this = lg->height - lg->data[i] * lg->scale; + gint next = lg->height - lg->data[i + 1] * lg->scale; + gint i4 = i * 4; + + gdk_draw_line(draw, lg->trace, i4, this, i4 + 2, + (this + next) / 2); + gdk_draw_line(draw, lg->trace, i4 + 2, (this + next) / 2, + i4 + 4, next); + } +#endif + + gtk_widget_queue_draw(lg->area); +} + +void load_graph_update(LoadGraph * lg, gint value) +{ + gint i; + + if (value < 0) + return; + + /* shift-right our data */ + for (i = 0; i < lg->size - 1; i++) { + lg->data[i] = lg->data[i + 1]; + } + + /* insert the updated value */ + lg->data[i] = value; + + /* calculates the maximum value */ + if (lg->remax_count++ > 20) { + /* only finds the maximum amongst the data every 20 times */ + lg->remax_count = 0; + + gint max = lg->data[0]; + for (i = 1; i < lg->size; i++) { + if (lg->data[i] > max) + max = lg->data[i]; + } + + lg->max_value = max; + } else { + /* otherwise, select the maximum between the current maximum + and the supplied value */ + lg->max_value = MAX(value, lg->max_value); + } + + /* recalculates the scale; always use 90% of it */ + lg->scale = 0.90 * ((gfloat) lg->height / (gfloat) lg->max_value); + + /* redraw */ + _draw(lg); +} + +#ifdef LOADGRAPH_UNIT_TEST +gboolean lg_update(gpointer d) +{ + LoadGraph *lg = (LoadGraph *) d; + + static int i = 0; + static int j = 1; + + if (i > 150) { + j = -1; + } else if (i < 0) { + j = 1; + } + + i += j; + if (rand() % 10 > 8) + i *= 2; + if (rand() % 10 < 2) + i /= 2; + load_graph_update(lg, i + rand() % 50); + + return TRUE; +} + +int main(int argc, char **argv) +{ + + + LoadGraph *lg; + GtkWidget *window; + + gtk_init(&argc, &argv); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_show(window); + + lg = load_graph_new(50); + gtk_container_add(GTK_CONTAINER(window), load_graph_get_framed(lg)); + gtk_container_set_border_width(GTK_CONTAINER(window), 20); + load_graph_configure_expose(lg); + + lg_update(lg); + + g_timeout_add(100, lg_update, lg); + + gtk_main(); + + return 0; +} +#endif diff --git a/shell/menu.c b/shell/menu.c new file mode 100644 index 00000000..f5724d31 --- /dev/null +++ b/shell/menu.c @@ -0,0 +1,171 @@ +/* + * HardInfo + * Copyright(C) 2003-2007 Leandro A. F. Pereira. + * + * menu.c is based on UI Manager tutorial by Ryan McDougall + * Copyright(C) 2005 Ryan McDougall. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#include + +#include +#include + + +#include "uidefs.h" + +static GtkActionEntry entries[] = { + {"InformationMenuAction", NULL, N_("_Information")}, /* name, stock id, label */ + {"RemoteMenuAction", NULL, N_("_Remote")}, + {"ViewMenuAction", NULL, N_("_View")}, + {"HelpMenuAction", NULL, N_("_Help")}, + {"HelpMenuModulesAction", HI_STOCK_ABOUT_MODULES, N_("About _Modules")}, + {"MainMenuBarAction", NULL, ""}, + + {"ReportAction", HI_STOCK_REPORT, /* name, stock id */ + N_("Generate _Report"), "R", /* label, accelerator */ + NULL, /* tooltip */ + G_CALLBACK(cb_generate_report)}, + + {"SyncManagerAction", HI_STOCK_SYNC_MENU, + N_("_Network Updater..."), NULL, + NULL, + G_CALLBACK(cb_sync_manager)}, + + {"OpenAction", GTK_STOCK_OPEN, + N_("_Open..."), NULL, + NULL, + G_CALLBACK(cb_sync_manager)}, + + {"CopyAction", GTK_STOCK_COPY, + N_("_Copy to Clipboard"), "C", + N_("Copy to clipboard"), + G_CALLBACK(cb_copy_to_clipboard)}, + + {"SaveGraphAction", GTK_STOCK_SAVE_AS, + N_("_Save image as..."), "S", + NULL, + G_CALLBACK(cb_save_graphic)}, + + {"RefreshAction", GTK_STOCK_REFRESH, + N_("_Refresh"), "F5", + NULL, + G_CALLBACK(cb_refresh)}, + + {"HomePageAction", HI_STOCK_INTERNET, + N_("_Open HardInfo Web Site"), NULL, + NULL, + G_CALLBACK(cb_open_web_page)}, + + {"ReportBugAction", HI_STOCK_INTERNET, + N_("_Report bug"), NULL, + NULL, + G_CALLBACK(cb_report_bug)}, + + {"AboutAction", GTK_STOCK_ABOUT, + N_("_About HardInfo"), NULL, + N_("Displays program version information"), + G_CALLBACK(cb_about)}, + + {"QuitAction", GTK_STOCK_QUIT, + N_("_Quit"), "Q", + NULL, + G_CALLBACK(cb_quit)} +}; + +static GtkToggleActionEntry toggle_entries[] = { + {"SidePaneAction", NULL, + N_("_Side Pane"), NULL, + N_("Toggles side pane visibility"), + G_CALLBACK(cb_side_pane)}, + {"ToolbarAction", NULL, + N_("_Toolbar"), NULL, + NULL, + G_CALLBACK(cb_toolbar)}, +}; + +/* Implement a handler for GtkUIManager's "add_widget" signal. The UI manager + * will emit this signal whenever it needs you to place a new widget it has. */ +static void +menu_add_widget(GtkUIManager * ui, GtkWidget * widget, + GtkContainer * container) +{ + gtk_box_pack_start(GTK_BOX(container), widget, FALSE, FALSE, 0); + gtk_widget_show(widget); +} + +void menu_init(Shell * shell) +{ + GtkWidget *menu_box; /* Packing box for the menu and toolbars */ + GtkActionGroup *action_group; /* Packing group for our Actions */ + GtkUIManager *menu_manager; /* The magic widget! */ + GError *error; /* For reporting exceptions or errors */ + GtkAccelGroup *accel_group; + + /* Create our objects */ + menu_box = shell->vbox; + action_group = gtk_action_group_new("HardInfo"); + menu_manager = gtk_ui_manager_new(); + + shell->action_group = action_group; + shell->ui_manager = menu_manager; + + /* Pack up our objects: + * menu_box -> window + * actions -> action_group + * action_group -> menu_manager */ + gtk_action_group_set_translation_domain( action_group, "hardinfo" );//gettext + gtk_action_group_add_actions(action_group, entries, + G_N_ELEMENTS(entries), NULL); + gtk_action_group_add_toggle_actions(action_group, toggle_entries, + G_N_ELEMENTS(toggle_entries), + NULL); + gtk_ui_manager_insert_action_group(menu_manager, action_group, 0); + + + /* Read in the UI from our XML file */ + error = NULL; + gtk_ui_manager_add_ui_from_string(menu_manager, uidefs_str, -1, + &error); + + if (error) { + g_error("Building menus failed: %s", error->message); + g_error_free(error); + return; + } + + /* Enable menu accelerators */ + accel_group = gtk_ui_manager_get_accel_group(menu_manager); + gtk_window_add_accel_group(GTK_WINDOW(shell->window), accel_group); + + /* Connect up important signals */ + /* This signal is necessary in order to place widgets from the UI manager + * into the menu_box */ + g_signal_connect(menu_manager, "add_widget", + G_CALLBACK(menu_add_widget), menu_box); + + /* Show the window and run the main loop, we're done! */ + gtk_widget_show(menu_box); + + gtk_toolbar_set_style(GTK_TOOLBAR + (gtk_ui_manager_get_widget + (shell->ui_manager, "/MainMenuBarAction")), + GTK_TOOLBAR_BOTH_HORIZ); +} diff --git a/shell/report.c b/shell/report.c new file mode 100644 index 00000000..3b5d3bdb --- /dev/null +++ b/shell/report.c @@ -0,0 +1,900 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2008 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +static ReportDialog *report_dialog_new(GtkTreeModel * model, + GtkWidget * parent); +static void set_all_active(ReportDialog * rd, gboolean setting); + +static FileTypes file_types[] = { + {"HTML (*.html)", "text/html", ".html", report_context_html_new}, + {"Plain Text (*.txt)", "text/plain", ".txt", report_context_text_new}, + {NULL, NULL, NULL, NULL} +}; + +void report_header(ReportContext * ctx) +{ + ctx->header(ctx); +} + +void report_footer(ReportContext * ctx) +{ + ctx->footer(ctx); +} + +void report_title(ReportContext * ctx, gchar * text) +{ + ctx->title(ctx, text); +} + +void report_subtitle(ReportContext * ctx, gchar * text) +{ + ctx->subtitle(ctx, text); +} + +void report_subsubtitle(ReportContext * ctx, gchar * text) +{ + ctx->subsubtitle(ctx, text); +} + +void report_key_value(ReportContext * ctx, gchar * key, gchar * value) +{ + ctx->keyvalue(ctx, key, value); +} + +gint report_get_visible_columns(ReportContext *ctx) +{ + gint columns; + + /* Column count starts at two, since we always have at least + two columns visible. */ + columns = 2; + + /* Either the Progress column or the Value column is available at + the same time. So we don't count them. */ + + if (ctx->columns & REPORT_COL_EXTRA1) + columns++; + + if (ctx->columns & REPORT_COL_EXTRA2) + columns++; + + return columns; +} + +void report_context_configure(ReportContext * ctx, GKeyFile * keyfile) +{ + gchar **keys; + const gchar *group = "$ShellParam$"; + + /* FIXME: sometime in the future we'll save images in the report. this + flag will be set if we should support that. + + so i don't forget how to encode the images inside the html files: + https://en.wikipedia.org/wiki/Data:_URI_scheme */ + + ctx->is_image_enabled = (g_key_file_get_boolean(keyfile, + group, + "ViewType", + NULL) == SHELL_VIEW_PROGRESS); + + + keys = g_key_file_get_keys(keyfile, group, NULL, NULL); + if (keys) { + gint i = 0; + + for (; keys[i]; i++) { + gchar *key = keys[i]; + + if (g_str_equal(key, "ShowColumnHeaders")) { + ctx->show_column_headers = g_key_file_get_boolean(keyfile, group, key, NULL); + } else if (g_str_has_prefix(key, "ColumnTitle")) { + gchar *value, *title = strchr(key, '$'); + + if (!title) { + DEBUG("couldn't find column title"); + break; + } + title++; + if (!*title) { + DEBUG("title is empty"); + break; + } + + 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, + g_strdup(title), g_strdup(value)); + } else if (g_str_equal(key, "ViewType")) { + if (g_key_file_get_integer(keyfile, group, "ViewType", NULL) == SHELL_VIEW_PROGRESS) { + ctx->columns &= ~REPORT_COL_VALUE; + ctx->columns |= REPORT_COL_PROGRESS; + } + } + } + + g_strfreev(keys); + } + +} + +void report_table(ReportContext * ctx, gchar * text) +{ + GKeyFile *key_file = g_key_file_new(); + gchar **groups; + gint i; + + /* make only "Value" column visible ("Key" column is always visible) */ + ctx->columns = REPORT_COL_VALUE; + ctx->show_column_headers = FALSE; + + /**/ + g_key_file_load_from_data(key_file, text, strlen(text), 0, NULL); + groups = g_key_file_get_groups(key_file, NULL); + + for (i = 0; groups[i]; i++) { + if (groups[i][0] == '$') { + report_context_configure(ctx, key_file); + break; + } + } + + for (i = 0; groups[i]; i++) { + gchar *group, *tmpgroup; + gchar **keys; + gint j; + + if (groups[i][0] == '$') { + continue; + } + + group = groups[i]; + + tmpgroup = g_strdup(group); + strend(group, '#'); + + report_subsubtitle(ctx, group); + +#if 0 + if (ctx->is_image_enabled) { + report_embed_image(ctx, key_file, group); + } else { +#endif + keys = g_key_file_get_keys(key_file, tmpgroup, NULL, NULL); + for (j = 0; keys[j]; j++) { + gchar *key = keys[j]; + gchar *value; + + value = g_key_file_get_value(key_file, tmpgroup, key, NULL); + + if (g_utf8_validate(key, -1, NULL) && g_utf8_validate(value, -1, NULL)) { + strend(key, '#'); + + if (g_str_equal(value, "...")) { + g_free(value); + if (!(value = ctx->entry->fieldfunc(key))) { + value = g_strdup("..."); + } + } + + if (*key == '$') { + report_key_value(ctx, strchr(key + 1, '$') + 1, + value); + } else { + report_key_value(ctx, key, value); + } + + } + + g_free(value); + } + + g_strfreev(keys); +#if 0 + } +#endif + g_free(tmpgroup); + } + + g_strfreev(groups); + g_key_file_free(key_file); +} + +static void report_html_header(ReportContext * ctx) +{ + g_free(ctx->output); + + ctx->output = + g_strdup_printf + ("\n" + "\n" "HardInfo (%s) System Report\n" + "\n" + "\n" "\n", + VERSION); +} + +static void report_html_footer(ReportContext * ctx) +{ + ctx->output = h_strconcat(ctx->output, + "
%s
%s
%s%s
%s%s
", NULL); +} + +static void report_html_title(ReportContext * ctx, gchar * text) +{ + if (!ctx->first_table) { + ctx->output = h_strdup_cprintf("", ctx->output); + } + + ctx->output = h_strdup_cprintf("

%s

", ctx->output, text); +} + +static void report_html_subtitle(ReportContext * ctx, gchar * text) +{ + gint columns = report_get_visible_columns(ctx); + + if (!ctx->first_table) { + ctx->output = h_strdup_cprintf("", ctx->output); + } else { + ctx->first_table = FALSE; + } + + ctx->output = h_strdup_cprintf("\n", + ctx->output, + columns, + text); +} + +static void report_html_subsubtitle(ReportContext * ctx, gchar * text) +{ + gint columns = report_get_visible_columns(ctx); + + ctx->output = h_strdup_cprintf("\n", + ctx->output, + columns, + text); +} + +static void +report_html_key_value(ReportContext * ctx, gchar * key, gchar * value) +{ + gint columns = report_get_visible_columns(ctx); + gchar **values; + gint i; + + if (columns == 2) { + ctx->output = h_strdup_cprintf("" + "\n", + ctx->output, + key, value); + } else { + values = g_strsplit(value, "|", columns); + + ctx->output = h_strdup_cprintf("\n\n", ctx->output, key); + + for (i = columns - 2; i >= 0; i--) { + ctx->output = h_strdup_cprintf("", + ctx->output, + values[i]); + } + + ctx->output = h_strdup_cprintf("\n", ctx->output); + + g_strfreev(values); + } +} + +static void report_text_header(ReportContext * ctx) +{ + g_free(ctx->output); + + ctx->output = g_strdup(""); +} + +static void report_text_footer(ReportContext * ctx) +{ +} + +static void report_text_title(ReportContext * ctx, gchar * text) +{ + gchar *str = (gchar *) ctx->output; + int i = strlen(text); + + str = h_strdup_cprintf("\n%s\n", str, text); + for (; i; i--) + str = h_strconcat(str, "*", NULL); + + str = h_strconcat(str, "\n\n", NULL); + ctx->output = str; +} + +static void report_text_subtitle(ReportContext * ctx, gchar * text) +{ + gchar *str = ctx->output; + int i = strlen(text); + + str = h_strdup_cprintf("\n%s\n", str, text); + for (; i; i--) + str = h_strconcat(str, "-", NULL); + + str = h_strconcat(str, "\n\n", NULL); + ctx->output = str; +} + +static void report_text_subsubtitle(ReportContext * ctx, gchar * text) +{ + ctx->output = h_strdup_cprintf("-%s-\n", ctx->output, text); +} + +static void +report_text_key_value(ReportContext * ctx, gchar * key, gchar * value) +{ + gint columns = report_get_visible_columns(ctx); + gchar **values; + gint i; + + if (columns == 2) { + if (strlen(value)) + ctx->output = h_strdup_cprintf("%s\t\t: %s\n", ctx->output, key, value); + else + ctx->output = h_strdup_cprintf("%s\n", ctx->output, key); + } else { + values = g_strsplit(value, "|", columns); + + ctx->output = h_strdup_cprintf("%s\t", ctx->output, key); + + for (i = columns - 2; i >= 0; i--) { + ctx->output = h_strdup_cprintf("%s\t", + ctx->output, + values[i]); + } + + ctx->output = h_strdup_cprintf("\n", ctx->output); + + g_strfreev(values); + } +} + +static GSList *report_create_module_list_from_dialog(ReportDialog * rd) +{ + ShellModule *module; + GSList *modules = NULL; + GtkTreeModel *model = rd->model; + GtkTreeIter iter; + + gtk_tree_model_get_iter_first(model, &iter); + do { + gboolean selected; + gchar *name; + + gtk_tree_model_get(model, &iter, TREE_COL_SEL, &selected, -1); + if (!selected) + continue; + + module = g_new0(ShellModule, 1); + + gtk_tree_model_get(model, &iter, TREE_COL_NAME, &name, -1); + module->name = name; + module->entries = NULL; + + if (gtk_tree_model_iter_has_child(model, &iter)) { + ShellModuleEntry *entry; + + gint children = gtk_tree_model_iter_n_children(model, &iter); + gint i; + + for (i = 0; i < children; i++) { + GtkTreeIter child; + + gtk_tree_model_iter_nth_child(model, &child, &iter, i); + + gtk_tree_model_get(model, &child, TREE_COL_SEL, &selected, + -1); + if (!selected) + continue; + + gtk_tree_model_get(model, &child, TREE_COL_MODULE_ENTRY, &entry, + -1); + module->entries = g_slist_append(module->entries, entry); + } + } + + modules = g_slist_append(modules, module); + } while (gtk_tree_model_iter_next(rd->model, &iter)); + + return modules; +} + +static void +report_create_inner_from_module_list(ReportContext * ctx, GSList * modules) +{ + for (; modules; modules = modules->next) { + ShellModule *module = (ShellModule *) modules->data; + GSList *entries; + + if (!params.gui_running) + fprintf(stderr, "\033[40;32m%s\033[0m\n", module->name); + + report_title(ctx, module->name); + + for (entries = module->entries; entries; entries = entries->next) { + ShellModuleEntry *entry = (ShellModuleEntry *) entries->data; + + if (!params.gui_running) + fprintf(stderr, "\033[2K\033[40;32;1m %s\033[0m\n", + entry->name); + + ctx->entry = entry; + report_subtitle(ctx, entry->name); + module_entry_scan(entry); + report_table(ctx, module_entry_function(entry)); + } + } +} + +void report_module_list_free(GSList * modules) +{ + GSList *m; + + for (m = modules; m; m = m->next) { + ShellModule *module = (ShellModule *) m->data; + + g_slist_free(module->entries); + } + + g_slist_free(modules); +} + +static gchar *report_get_filename(void) +{ + GtkWidget *dialog; + gchar *filename = NULL; + + dialog = gtk_file_chooser_dialog_new(_("Save File"), + NULL, + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, + GTK_RESPONSE_ACCEPT, NULL); + + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), + "hardinfo_report"); + + file_chooser_add_filters(dialog, file_types); + file_chooser_open_expander(dialog); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { + gchar *ext = file_chooser_get_extension(dialog, file_types); + filename = file_chooser_build_filename(dialog, ext); + } + gtk_widget_destroy(dialog); + return filename; +} + +ReportContext *report_context_html_new() +{ + ReportContext *ctx; + + ctx = g_new0(ReportContext, 1); + ctx->header = report_html_header; + ctx->footer = report_html_footer; + ctx->title = report_html_title; + ctx->subtitle = report_html_subtitle; + ctx->subsubtitle = report_html_subsubtitle; + ctx->keyvalue = report_html_key_value; + + ctx->output = g_strdup(""); + ctx->format = REPORT_FORMAT_HTML; + + ctx->column_titles = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, g_free); + ctx->first_table = TRUE; + + return ctx; +} + +ReportContext *report_context_text_new() +{ + ReportContext *ctx; + + ctx = g_new0(ReportContext, 1); + ctx->header = report_text_header; + ctx->footer = report_text_footer; + ctx->title = report_text_title; + ctx->subtitle = report_text_subtitle; + ctx->subsubtitle = report_text_subsubtitle; + ctx->keyvalue = report_text_key_value; + + ctx->output = g_strdup(""); + ctx->format = REPORT_FORMAT_TEXT; + + ctx->column_titles = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, g_free); + ctx->first_table = TRUE; + + return ctx; +} + +void report_context_free(ReportContext * ctx) +{ + g_hash_table_destroy(ctx->column_titles); + g_free(ctx->output); + g_free(ctx); +} + +void report_create_from_module_list(ReportContext * ctx, GSList * modules) +{ + report_header(ctx); + + report_create_inner_from_module_list(ctx, modules); + report_module_list_free(modules); + + report_footer(ctx); +} + +gchar *report_create_from_module_list_format(GSList * modules, + ReportFormat format) +{ + ReportContext *(*create_context) (); + ReportContext *ctx; + gchar *retval; + + if (format >= N_REPORT_FORMAT) + return NULL; + + create_context = file_types[format].data; + if (!create_context) + return NULL; + + ctx = create_context(); + + report_create_from_module_list(ctx, modules); + retval = g_strdup(ctx->output); + + report_context_free(ctx); + + return retval; +} + +static gboolean report_generate(ReportDialog * rd) +{ + GSList *modules; + ReportContext *ctx; + ReportContext *(*create_context) (); + gchar *file; + FILE *stream; + + if (!(file = report_get_filename())) + return FALSE; + + if (!(stream = fopen(file, "w+"))) { + g_free(file); + return FALSE; + } + + create_context = file_types_get_data_by_name(file_types, file); + + if (!create_context) { + g_warning(_("Cannot create ReportContext. Programming bug?")); + g_free(file); + fclose(stream); + return FALSE; + } + + ctx = create_context(); + modules = report_create_module_list_from_dialog(rd); + + report_create_from_module_list(ctx, modules); + fputs(ctx->output, stream); + fclose(stream); + + if (ctx->format == REPORT_FORMAT_HTML) { + GtkWidget *dialog; + dialog = gtk_message_dialog_new(NULL, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + _("Open the report with your web browser?")); + gtk_dialog_add_buttons(GTK_DIALOG(dialog), + GTK_STOCK_NO, GTK_RESPONSE_REJECT, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { + gchar *temp; + + temp = g_strdup_printf("file://%s", file); + open_url(temp); + + g_free(temp); + } + + gtk_widget_destroy(dialog); + } + + report_context_free(ctx); + g_free(file); + + return TRUE; +} + +void report_dialog_show(GtkTreeModel * model, GtkWidget * parent) +{ + gboolean success; + ReportDialog *rd = report_dialog_new(model, parent); + + if (gtk_dialog_run(GTK_DIALOG(rd->dialog)) == GTK_RESPONSE_ACCEPT) { + shell_status_update(_("Generating report...")); + gtk_widget_hide(rd->dialog); + shell_view_set_enabled(FALSE); + shell_status_set_enabled(TRUE); + + success = report_generate(rd); + + shell_status_set_enabled(FALSE); + + if (success) + shell_status_update(_("Report saved.")); + else + shell_status_update(_("Error while creating the report.")); + } + + set_all_active(rd, FALSE); + gtk_widget_destroy(rd->dialog); + g_free(rd); +} + +static void +set_children_active(GtkTreeModel * model, GtkTreeIter * iter, + gboolean setting) +{ + if (gtk_tree_model_iter_has_child(model, iter)) { + gint children = gtk_tree_model_iter_n_children(model, iter); + + gtk_tree_store_set(GTK_TREE_STORE(model), iter, TREE_COL_SEL, + setting, -1); + + for (children--; children >= 0; children--) { + GtkTreeIter child; + + gtk_tree_model_iter_nth_child(model, &child, iter, children); + gtk_tree_store_set(GTK_TREE_STORE(model), &child, TREE_COL_SEL, + setting, -1); + } + } +} + +static void set_all_active(ReportDialog * rd, gboolean setting) +{ + GtkTreeIter iter; + GtkTreeModel *model = rd->model; + + gtk_tree_model_get_iter_first(model, &iter); + + do { + set_children_active(model, &iter, setting); + } while (gtk_tree_model_iter_next(model, &iter)); +} + +static void report_dialog_sel_none(GtkWidget * widget, ReportDialog * rd) +{ + set_all_active(rd, FALSE); +} + +static void report_dialog_sel_all(GtkWidget * widget, ReportDialog * rd) +{ + set_all_active(rd, TRUE); +} + +static void +report_dialog_sel_toggle(GtkCellRendererToggle * cellrenderertoggle, + gchar * path_str, ReportDialog * rd) +{ + GtkTreeModel *model = rd->model; + GtkTreeIter iter; + GtkTreePath *path = gtk_tree_path_new_from_string(path_str); + gboolean active; + + gtk_tree_model_get_iter(model, &iter, path); + gtk_tree_model_get(model, &iter, TREE_COL_SEL, &active, -1); + + active = !active; + gtk_tree_store_set(GTK_TREE_STORE(model), &iter, TREE_COL_SEL, active, + -1); + set_children_active(model, &iter, active); + + if (active) { + GtkTreeIter parent; + + if (gtk_tree_model_iter_parent(model, &parent, &iter)) { + gtk_tree_store_set(GTK_TREE_STORE(model), &parent, + TREE_COL_SEL, active, -1); + } + } + + gtk_tree_path_free(path); +} + +static ReportDialog + * report_dialog_new(GtkTreeModel * model, GtkWidget * parent) +{ + ReportDialog *rd; + GtkWidget *dialog; + GtkWidget *dialog1_vbox; + GtkWidget *scrolledwindow2; + GtkWidget *treeview2; + GtkWidget *vbuttonbox3; + GtkWidget *button3; + GtkWidget *button6; + GtkWidget *dialog1_action_area; + GtkWidget *button8; + GtkWidget *button7; + GtkWidget *label; + GtkWidget *hbox; + + GtkTreeViewColumn *column; + GtkCellRenderer *cr_text, *cr_pbuf, *cr_toggle; + + rd = g_new0(ReportDialog, 1); + + dialog = gtk_dialog_new(); + gtk_window_set_title(GTK_WINDOW(dialog), _("Generate Report")); + gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); + gtk_window_set_default_size(GTK_WINDOW(dialog), 420, 260); + gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent)); + gtk_window_set_position(GTK_WINDOW(dialog), + GTK_WIN_POS_CENTER_ON_PARENT); + gtk_window_set_type_hint(GTK_WINDOW(dialog), + GDK_WINDOW_TYPE_HINT_DIALOG); + + dialog1_vbox = GTK_DIALOG(dialog)->vbox; + gtk_box_set_spacing(GTK_BOX(dialog1_vbox), 5); + gtk_container_set_border_width(GTK_CONTAINER(dialog1_vbox), 4); + gtk_widget_show(dialog1_vbox); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, FALSE, FALSE, 0); + + label = gtk_label_new(_("Generate Report\n" + "Please choose the information that you wish " + "to view in your report:")); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + gtk_box_pack_start(GTK_BOX(hbox), + icon_cache_get_image("report-large.png"), + FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); + gtk_widget_show_all(hbox); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, TRUE, TRUE, 0); + gtk_widget_show(hbox); + + scrolledwindow2 = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrolledwindow2); + gtk_box_pack_start(GTK_BOX(hbox), scrolledwindow2, TRUE, TRUE, + 0); + gtk_widget_set_size_request(scrolledwindow2, -1, 200); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow2), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW + (scrolledwindow2), GTK_SHADOW_IN); + + treeview2 = gtk_tree_view_new_with_model(model); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview2), FALSE); + gtk_widget_show(treeview2); + gtk_container_add(GTK_CONTAINER(scrolledwindow2), treeview2); + + column = gtk_tree_view_column_new(); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview2), column); + + cr_toggle = gtk_cell_renderer_toggle_new(); + gtk_tree_view_column_pack_start(column, cr_toggle, FALSE); + g_signal_connect(cr_toggle, "toggled", + G_CALLBACK(report_dialog_sel_toggle), rd); + gtk_tree_view_column_add_attribute(column, cr_toggle, "active", + TREE_COL_SEL); + + cr_pbuf = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE); + gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf", + TREE_COL_PBUF); + + cr_text = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, cr_text, TRUE); + gtk_tree_view_column_add_attribute(column, cr_text, "markup", + TREE_COL_NAME); + + vbuttonbox3 = gtk_vbutton_box_new(); + gtk_widget_show(vbuttonbox3); + gtk_box_pack_start(GTK_BOX(hbox), vbuttonbox3, FALSE, TRUE, 0); + gtk_box_set_spacing(GTK_BOX(vbuttonbox3), 5); + gtk_button_box_set_layout(GTK_BUTTON_BOX(vbuttonbox3), + GTK_BUTTONBOX_START); + + button3 = gtk_button_new_with_mnemonic(_("Select _None")); + gtk_widget_show(button3); + gtk_container_add(GTK_CONTAINER(vbuttonbox3), button3); + GTK_WIDGET_SET_FLAGS(button3, GTK_CAN_DEFAULT); + g_signal_connect(button3, "clicked", + G_CALLBACK(report_dialog_sel_none), rd); + + button6 = gtk_button_new_with_mnemonic(_("Select _All")); + gtk_widget_show(button6); + gtk_container_add(GTK_CONTAINER(vbuttonbox3), button6); + GTK_WIDGET_SET_FLAGS(button6, GTK_CAN_DEFAULT); + g_signal_connect(button6, "clicked", G_CALLBACK(report_dialog_sel_all), + rd); + + dialog1_action_area = GTK_DIALOG(dialog)->action_area; + gtk_widget_show(dialog1_action_area); + gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog1_action_area), + GTK_BUTTONBOX_END); + + button8 = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + gtk_widget_show(button8); + gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button8, + GTK_RESPONSE_CANCEL); + GTK_WIDGET_SET_FLAGS(button8, GTK_CAN_DEFAULT); + + button7 = gtk_button_new_with_mnemonic(_("_Generate")); + gtk_widget_show(button7); + gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button7, + GTK_RESPONSE_ACCEPT); + GTK_WIDGET_SET_FLAGS(button7, GTK_CAN_DEFAULT); + + rd->dialog = dialog; + rd->btn_cancel = button8; + rd->btn_generate = button7; + rd->btn_sel_all = button6; + rd->btn_sel_none = button3; + rd->treeview = treeview2; + rd->model = model; + + gtk_tree_view_collapse_all(GTK_TREE_VIEW(treeview2)); + set_all_active(rd, TRUE); + + return rd; +} diff --git a/shell/shell.c b/shell/shell.c new file mode 100644 index 00000000..bf866e84 --- /dev/null +++ b/shell/shell.c @@ -0,0 +1,1876 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include +#include + +#include +#include + +#include "config.h" + +#include "hardinfo.h" + +#include "shell.h" +#include "syncmanager.h" +#include "iconcache.h" +#include "menu.h" +#include "stock.h" + +#include "callbacks.h" + +/* + * Internal Prototypes ******************************************************** + */ + +static void create_window(); +static ShellTree *tree_new(void); +static ShellInfoTree *info_tree_new(gboolean extra); + +static void module_selected(gpointer data); +static void module_selected_show_info(ShellModuleEntry * entry, + gboolean reload); +static void info_selected(GtkTreeSelection * ts, gpointer data); +static void info_selected_show_extra(gchar * data); +static gboolean reload_section(gpointer data); +static gboolean rescan_section(gpointer data); +static gboolean update_field(gpointer data); + +/* + * Globals ******************************************************************** + */ + +static Shell *shell = NULL; +static GHashTable *update_tbl = NULL; +static GSList *update_sfusrc = NULL; + +/* + * Code :) ******************************************************************** + */ + +Shell *shell_get_main_shell(void) +{ + return shell; +} + +void shell_ui_manager_set_visible(const gchar * path, gboolean setting) +{ + GtkWidget *widget; + + if (!params.gui_running) + return; + + widget = gtk_ui_manager_get_widget(shell->ui_manager, path); + if (!widget) + return; + + if (setting) + gtk_widget_show(widget); + else + gtk_widget_hide(widget); +} + +void shell_clear_tree_models(Shell *shell) +{ + gtk_tree_store_clear(GTK_TREE_STORE(shell->tree->model)); + gtk_tree_store_clear(GTK_TREE_STORE(shell->info->model)); + gtk_tree_store_clear(GTK_TREE_STORE(shell->moreinfo->model)); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info->view), FALSE); +} + +void shell_clear_timeouts(Shell *shell) +{ + h_hash_table_remove_all(update_tbl); +} + +void shell_action_set_property(const gchar * action_name, + const gchar * property, gboolean setting) +{ + GtkAction *action; + + if (!params.gui_running) + return; + + action = gtk_action_group_get_action(shell->action_group, action_name); + if (action) { + GValue value = { 0 }; + + g_value_init(&value, G_TYPE_BOOLEAN); + g_value_set_boolean(&value, setting); + + g_object_set_property(G_OBJECT(action), property, &value); + + g_value_unset(&value); + } +} + +void shell_action_set_label(const gchar * action_name, gchar * label) +{ +#if GTK_CHECK_VERSION(2,16,0) + if (params.gui_running && shell->action_group) { + GtkAction *action; + + action = + gtk_action_group_get_action(shell->action_group, action_name); + if (action) { + gtk_action_set_label(action, label); + } + } +#endif +} + +void shell_action_set_enabled(const gchar * action_name, gboolean setting) +{ + if (params.gui_running && shell->action_group) { + GtkAction *action; + + action = + gtk_action_group_get_action(shell->action_group, action_name); + if (action) { + gtk_action_set_sensitive(action, setting); + } + } +} + +gboolean shell_action_get_enabled(const gchar * action_name) +{ + GtkAction *action; + + if (!params.gui_running) + return FALSE; + + action = gtk_action_group_get_action(shell->action_group, action_name); + if (action) { + return gtk_action_get_sensitive(action); + } + + return FALSE; +} + +void shell_set_side_pane_visible(gboolean setting) +{ + if (!params.gui_running) + return; + + if (setting) + gtk_widget_show(shell->tree->scroll); + else + gtk_widget_hide(shell->tree->scroll); +} + +gboolean shell_action_get_active(const gchar * action_name) +{ + GtkAction *action; + GSList *proxies; + + /* FIXME: Ugh. Are you sure there isn't any simpler way? O_o */ + if (!params.gui_running) + return FALSE; + + action = gtk_action_group_get_action(shell->action_group, action_name); + if (action) { + proxies = gtk_action_get_proxies(action); + + for (; proxies; proxies = proxies->next) { + GtkWidget *widget = (GtkWidget *) proxies->data; + + if (GTK_IS_CHECK_MENU_ITEM(widget)) { + return + gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM + (widget)); + } + } + } + + return FALSE; +} + +void shell_action_set_active(const gchar * action_name, gboolean setting) +{ + GtkAction *action; + GSList *proxies; + + /* FIXME: Ugh. Are you sure there isn't any simpler way? O_o */ + if (!params.gui_running) + return; + + action = gtk_action_group_get_action(shell->action_group, action_name); + if (action) { + proxies = gtk_action_get_proxies(action); + + for (; proxies; proxies = proxies->next) { + GtkWidget *widget = (GtkWidget *) proxies->data; + + if (GTK_IS_CHECK_MENU_ITEM(widget)) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), + setting); + return; + } + } + } +} + +void shell_status_pulse(void) +{ + if (params.gui_running) { + if (shell->_pulses++ == 5) { + /* we're pulsing for some time, disable the interface and change the cursor + to a hourglass */ + shell_view_set_enabled(FALSE); + } + + gtk_progress_bar_pulse(GTK_PROGRESS_BAR(shell->progress)); + while (gtk_events_pending()) + gtk_main_iteration(); + } else { + static gint counter = 0; + + fprintf(stderr, "\033[2K\033[40;37;1m %c\033[0m\r", + "|/-\\"[counter++ % 4]); + } +} + +void shell_status_set_percentage(gint percentage) +{ + if (params.gui_running) { + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(shell->progress), + (float) percentage / 100.0); + while (gtk_events_pending()) + gtk_main_iteration(); + } else { + if (percentage < 1 || percentage >= 100) { + fprintf(stderr, "\033[2K"); + } else { + gchar pbar[] = "----------"; + + memset(pbar, '#', percentage / 10); + + fprintf(stderr, "\r\033[40;37;1m%3d%% \033[40;34;1m" + "%s\033[0m\r", percentage, pbar); + } + } +} + +void shell_view_set_enabled(gboolean setting) +{ + if (!params.gui_running) + return; + + if (setting) { + shell->_pulses = 0; + widget_set_cursor(shell->window, GDK_LEFT_PTR); + } else { + widget_set_cursor(shell->window, GDK_WATCH); + } + + gtk_widget_set_sensitive(shell->hpaned, setting); + shell_action_set_enabled("ViewMenuAction", setting); + shell_action_set_enabled("ConnectToAction", setting); + shell_action_set_enabled("RefreshAction", setting); + shell_action_set_enabled("CopyAction", setting); + shell_action_set_enabled("ReportAction", setting); + shell_action_set_enabled("SyncManagerAction", setting && sync_manager_count_entries() > 0); + shell_action_set_enabled("SaveGraphAction", + setting ? shell->view_type == + SHELL_VIEW_PROGRESS : FALSE); +} + +void shell_status_set_enabled(gboolean setting) +{ + if (!params.gui_running) + return; + + if (setting) + gtk_widget_show(shell->progress); + else { + gtk_widget_hide(shell->progress); + shell_view_set_enabled(TRUE); + + shell_status_update(_("Done.")); + } +} + +void shell_do_reload(void) +{ + if (!params.gui_running || !shell->selected) + return; + + shell_action_set_enabled("RefreshAction", FALSE); + shell_action_set_enabled("CopyAction", FALSE); + shell_action_set_enabled("ReportAction", FALSE); + + shell_status_set_enabled(TRUE); + + module_entry_reload(shell->selected); + module_selected(NULL); + + shell_action_set_enabled("RefreshAction", TRUE); + shell_action_set_enabled("CopyAction", TRUE); + shell_action_set_enabled("ReportAction", TRUE); +} + +void shell_status_update(const gchar * message) +{ + if (params.gui_running) { + gtk_label_set_markup(GTK_LABEL(shell->status), message); + gtk_progress_bar_pulse(GTK_PROGRESS_BAR(shell->progress)); + while (gtk_events_pending()) + gtk_main_iteration(); + } else { + fprintf(stderr, "\033[2K\033[40;37;1m %s\033[0m\r", message); + } +} + +static void destroy_me(void) +{ + cb_quit(); +} + +static void close_note(GtkWidget * widget, gpointer user_data) +{ + gtk_widget_hide(shell->note->event_box); +} + +static ShellNote *note_new(void) +{ + ShellNote *note; + GtkWidget *hbox, *icon, *button; + GtkWidget *border_box; + /* colors stolen from gtkinfobar.c */ + GdkColor info_default_border_color = { 0, 0xb800, 0xad00, 0x9d00 }; + GdkColor info_default_fill_color = { 0, 0xff00, 0xff00, 0xbf00 }; + + note = g_new0(ShellNote, 1); + note->label = gtk_label_new(""); + note->event_box = gtk_event_box_new(); + button = gtk_button_new(); + + border_box = gtk_event_box_new(); + gtk_container_set_border_width(GTK_CONTAINER(border_box), 1); + gtk_container_add(GTK_CONTAINER(note->event_box), border_box); + gtk_widget_show(border_box); + + gtk_widget_modify_bg(border_box, GTK_STATE_NORMAL, &info_default_fill_color); + gtk_widget_modify_bg(note->event_box, GTK_STATE_NORMAL, &info_default_border_color); + + icon = icon_cache_get_image("close.png"); + gtk_widget_show(icon); + gtk_container_add(GTK_CONTAINER(button), icon); + gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); + g_signal_connect(G_OBJECT(button), "clicked", (GCallback) close_note, + NULL); + + hbox = gtk_hbox_new(FALSE, 3); + icon = icon_cache_get_image("dialog-information.png"); + + gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), note->label, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); + + gtk_container_set_border_width(GTK_CONTAINER(hbox), 2); + gtk_container_add(GTK_CONTAINER(border_box), hbox); + gtk_widget_show_all(hbox); + + return note; +} + +void shell_set_title(Shell *shell, gchar *subtitle) +{ + if (subtitle) { + gchar *tmp; + + tmp = g_strdup_printf(_("%s - System Information"), subtitle); + gtk_window_set_title(GTK_WINDOW(shell->window), tmp); + + g_free(tmp); + } else { + gtk_window_set_title(GTK_WINDOW(shell->window), _("System Information")); + } +} + +static void create_window(void) +{ + GtkWidget *vbox, *hbox; + + shell = g_new0(Shell, 1); + + shell->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_icon(GTK_WINDOW(shell->window), + icon_cache_get_pixbuf("logo.png")); + shell_set_title(shell, NULL); + gtk_window_set_default_size(GTK_WINDOW(shell->window), 800, 600); + g_signal_connect(G_OBJECT(shell->window), "destroy", destroy_me, NULL); + + vbox = gtk_vbox_new(FALSE, 0); + gtk_widget_show(vbox); + gtk_container_add(GTK_CONTAINER(shell->window), vbox); + shell->vbox = vbox; + + menu_init(shell); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_widget_show(hbox); + gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); + + shell->progress = gtk_progress_bar_new(); + gtk_widget_set_size_request(shell->progress, 80, 10); + gtk_widget_hide(shell->progress); + gtk_box_pack_end(GTK_BOX(hbox), shell->progress, FALSE, FALSE, 5); + + shell->status = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(shell->status), 0.0, 0.5); + gtk_widget_show(shell->status); + gtk_box_pack_start(GTK_BOX(hbox), shell->status, FALSE, FALSE, 5); + + shell->hpaned = gtk_hpaned_new(); + gtk_widget_show(shell->hpaned); + gtk_box_pack_end(GTK_BOX(vbox), shell->hpaned, TRUE, TRUE, 0); + gtk_paned_set_position(GTK_PANED(shell->hpaned), 210); + + vbox = gtk_vbox_new(FALSE, 5); + gtk_widget_show(vbox); + gtk_paned_add2(GTK_PANED(shell->hpaned), vbox); + + shell->note = note_new(); + gtk_box_pack_end(GTK_BOX(vbox), shell->note->event_box, FALSE, FALSE, 0); + + shell->vpaned = gtk_vpaned_new(); + gtk_box_pack_start(GTK_BOX(vbox), shell->vpaned, TRUE, TRUE, 0); + gtk_widget_show(shell->vpaned); + + shell->notebook = gtk_notebook_new(); + gtk_paned_add2(GTK_PANED(shell->vpaned), shell->notebook); + + gtk_widget_show(shell->window); + while (gtk_events_pending()) + gtk_main_iteration(); +} + +static void view_menu_select_entry(gpointer data, gpointer data2) +{ + GtkTreePath *path; + GtkTreeIter *iter = (GtkTreeIter *) data2; + + path = gtk_tree_model_get_path(shell->tree->model, iter); + + gtk_tree_selection_select_path(shell->tree->selection, path); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(shell->tree->view), path, NULL, + FALSE); + gtk_tree_path_free(path); +} + +static void menu_item_set_icon_always_visible(Shell *shell, + gchar *parent_path, + gchar *item_id) +{ + GtkWidget *menuitem; + gchar *path; + + path = g_strdup_printf("%s/%s", parent_path, item_id); + menuitem = gtk_ui_manager_get_widget(shell->ui_manager, path); +#if GTK_CHECK_VERSION(2, 18, 0) + gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM(menuitem), TRUE); +#endif + g_free(path); +} + +static void add_module_to_menu(gchar * name, GdkPixbuf * pixbuf) +{ + GtkAction *action; + GtkWidget *menuitem; + gchar *about_module = g_strdup_printf("AboutModule%s", name); + gchar *path; + gint merge_id; + + GtkActionEntry entries[] = { + { + name, /* name */ + name, /* stockid */ + name, /* label */ + NULL, /* accelerator */ + NULL, /* tooltip */ + NULL, /* callback */ + }, + { + about_module, + name, + name, + NULL, + name, + (GCallback) cb_about_module, + }, + }; + + stock_icon_register_pixbuf(pixbuf, name); + + if ((action = gtk_action_group_get_action(shell->action_group, name))) { + gtk_action_group_remove_action(shell->action_group, action); + } + + if ((action = gtk_action_group_get_action(shell->action_group, about_module))) { + gtk_action_group_remove_action(shell->action_group, action); + } + + gtk_action_group_add_actions(shell->action_group, entries, 2, NULL); + + merge_id = gtk_ui_manager_new_merge_id(shell->ui_manager); + gtk_ui_manager_add_ui(shell->ui_manager, + merge_id, + "/menubar/ViewMenu/LastSep", + name, name, GTK_UI_MANAGER_MENU, TRUE); + shell->merge_ids = g_slist_prepend(shell->merge_ids, GINT_TO_POINTER(merge_id)); + + merge_id = gtk_ui_manager_new_merge_id(shell->ui_manager); + gtk_ui_manager_add_ui(shell->ui_manager, + merge_id, + "/menubar/HelpMenu/HelpMenuModules/LastSep", + about_module, about_module, GTK_UI_MANAGER_AUTO, + TRUE); + shell->merge_ids = g_slist_prepend(shell->merge_ids, GINT_TO_POINTER(merge_id)); + + menu_item_set_icon_always_visible(shell, "/menubar/ViewMenu", name); +} + +static void +add_module_entry_to_view_menu(gchar * module, gchar * name, + GdkPixbuf * pixbuf, GtkTreeIter * iter) +{ + GtkAction *action; + GtkWidget *menuitem; + gint merge_id; + gchar *path; + GtkActionEntry entry = { + name, /* name */ + name, /* stockid */ + name, /* label */ + NULL, /* accelerator */ + NULL, /* tooltip */ + (GCallback) view_menu_select_entry, /* callback */ + }; + + stock_icon_register_pixbuf(pixbuf, name); + + if ((action = gtk_action_group_get_action(shell->action_group, name))) { + gtk_action_group_remove_action(shell->action_group, action); + } + + gtk_action_group_add_actions(shell->action_group, &entry, 1, iter); + + merge_id = gtk_ui_manager_new_merge_id(shell->ui_manager); + path = g_strdup_printf("/menubar/ViewMenu/%s", module); + gtk_ui_manager_add_ui(shell->ui_manager, + merge_id, + path, + name, name, GTK_UI_MANAGER_AUTO, FALSE); + shell->merge_ids = g_slist_prepend(shell->merge_ids, GINT_TO_POINTER(merge_id)); + + menu_item_set_icon_always_visible(shell, path, name); + + g_free(path); +} + +void shell_add_modules_to_gui(gpointer _shell_module, gpointer _shell_tree) +{ + ShellModule *module = (ShellModule *) _shell_module; + ShellTree *shelltree = (ShellTree *) _shell_tree; + GtkTreeStore *store = GTK_TREE_STORE(shelltree->model); + GtkTreeIter parent; + + if (!module) { + return; + } + + gtk_tree_store_append(store, &parent, NULL); + gtk_tree_store_set(store, &parent, + TREE_COL_NAME, module->name, + TREE_COL_MODULE, module, + TREE_COL_MODULE_ENTRY, NULL, + TREE_COL_SEL, FALSE, + -1); + + if (module->icon) { + gtk_tree_store_set(store, &parent, TREE_COL_PBUF, module->icon, + -1); + } + + add_module_to_menu(module->name, module->icon); + + if (module->entries) { + ShellModuleEntry *entry; + GSList *p; + + for (p = module->entries; p; p = g_slist_next(p)) { + GtkTreeIter child; + entry = (ShellModuleEntry *) p->data; + + gtk_tree_store_append(store, &child, &parent); + gtk_tree_store_set(store, &child, TREE_COL_NAME, entry->name, + TREE_COL_MODULE_ENTRY, entry, + TREE_COL_SEL, FALSE, -1); + + if (entry->icon) { + gtk_tree_store_set(store, &child, TREE_COL_PBUF, + entry->icon, -1); + } + + add_module_entry_to_view_menu(module->name, entry->name, + entry->icon, + gtk_tree_iter_copy(&child)); + + shell_status_pulse(); + } + + } +} + +static void __tree_iter_destroy(gpointer data) +{ + gtk_tree_iter_free((GtkTreeIter *) data); +} + +ShellSummary *summary_new(void) +{ + ShellSummary *summary; + + summary = g_new0(ShellSummary, 1); + summary->scroll = gtk_scrolled_window_new(NULL, NULL); + summary->view = gtk_vbox_new(FALSE, 5); + summary->items = NULL; + + gtk_container_set_border_width(GTK_CONTAINER(summary->view), 6); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(summary->scroll), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(summary->scroll), + summary->view); + gtk_widget_show_all(summary->scroll); + + return summary; +} + +void shell_init(GSList * modules) +{ + if (shell) { + g_error("Shell already created"); + return; + } + + DEBUG("initializing shell"); + + create_window(); + + shell_action_set_property("ConnectToAction", "is-important", TRUE); + shell_action_set_property("CopyAction", "is-important", TRUE); + shell_action_set_property("RefreshAction", "is-important", TRUE); + shell_action_set_property("ReportAction", "is-important", TRUE); + shell_action_set_property("ReportBugAction", "is-important", TRUE); + + shell->tree = tree_new(); + shell->info = info_tree_new(FALSE); + shell->moreinfo = info_tree_new(TRUE); + shell->loadgraph = load_graph_new(75); + shell->summary = summary_new(); + + update_tbl = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, __tree_iter_destroy); + + gtk_paned_pack1(GTK_PANED(shell->hpaned), shell->tree->scroll, + SHELL_PACK_RESIZE, SHELL_PACK_SHRINK); + gtk_paned_pack1(GTK_PANED(shell->vpaned), shell->info->scroll, + SHELL_PACK_RESIZE, SHELL_PACK_SHRINK); + + gtk_notebook_append_page(GTK_NOTEBOOK(shell->notebook), + shell->moreinfo->scroll, NULL); + gtk_notebook_append_page(GTK_NOTEBOOK(shell->notebook), + load_graph_get_framed(shell->loadgraph), + NULL); + gtk_notebook_append_page(GTK_NOTEBOOK(shell->notebook), + shell->summary->scroll, NULL); + + gtk_notebook_set_show_tabs(GTK_NOTEBOOK(shell->notebook), FALSE); + gtk_notebook_set_show_border(GTK_NOTEBOOK(shell->notebook), FALSE); + + shell_status_set_enabled(TRUE); + shell_status_update(_("Loading modules...")); + + shell->tree->modules = modules ? modules : modules_load_all(); + + g_slist_foreach(shell->tree->modules, shell_add_modules_to_gui, shell->tree); + gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->tree->view)); + + gtk_widget_show_all(shell->hpaned); + + load_graph_configure_expose(shell->loadgraph); + gtk_widget_hide(shell->notebook); + gtk_widget_hide(shell->note->event_box); + + shell_status_update(_("Done.")); + shell_status_set_enabled(FALSE); + + shell_action_set_enabled("RefreshAction", FALSE); + shell_action_set_enabled("CopyAction", FALSE); + shell_action_set_enabled("SaveGraphAction", FALSE); + shell_action_set_active("SidePaneAction", TRUE); + shell_action_set_active("ToolbarAction", TRUE); + +#ifndef HAS_LIBSOUP + shell_action_set_enabled("SyncManagerAction", FALSE); +#else + shell_action_set_enabled("SyncManagerAction", sync_manager_count_entries() > 0); +#endif +} + +static gboolean update_field(gpointer data) +{ + ShellFieldUpdate *fu; + GtkTreeIter *iter; + + fu = (ShellFieldUpdate *) data; + g_return_val_if_fail(fu != NULL, FALSE); + + DEBUG("update_field [%s]", fu->field_name); + + iter = g_hash_table_lookup(update_tbl, fu->field_name); + if (!iter) { + return FALSE; + } + + /* if the entry is still selected, update it */ + if (iter && fu->entry->selected && fu->entry->fieldfunc) { + GtkTreeStore *store = GTK_TREE_STORE(shell->info->model); + gchar *value = fu->entry->fieldfunc(_(fu->field_name)); + + /* + * this function is also used to feed the load graph when ViewType + * is SHELL_VIEW_LOAD_GRAPH + */ + if (shell->view_type == SHELL_VIEW_LOAD_GRAPH && + gtk_tree_selection_iter_is_selected(shell->info->selection, + iter)) { + load_graph_update(shell->loadgraph, atoi(value)); + } + + gtk_tree_store_set(store, iter, INFO_TREE_COL_VALUE, value, -1); + + g_free(value); + return TRUE; + } + + if (update_sfusrc) { + GSList *sfu; + + for (sfu = update_sfusrc; sfu; sfu = sfu->next) { + g_free(sfu->data); + } + + g_slist_free(update_sfusrc); + update_sfusrc = NULL; + } + + /* otherwise, cleanup and destroy the timeout */ + g_free(fu->field_name); + g_free(fu); + + return FALSE; +} + +#define RANGE_SET_VALUE(tree,scrollbar,value) \ + do { \ + GtkRange CONCAT(*range, __LINE__) = GTK_RANGE(GTK_SCROLLED_WINDOW(shell->tree->scroll)->scrollbar); \ + gtk_range_set_value(CONCAT(range, __LINE__), value); \ + gtk_adjustment_value_changed(GTK_ADJUSTMENT(gtk_range_get_adjustment(CONCAT(range, __LINE__)))); \ + } while (0) +#define RANGE_GET_VALUE(tree,scrollbar) \ + gtk_range_get_value(GTK_RANGE \ + (GTK_SCROLLED_WINDOW(shell->tree->scroll)-> \ + scrollbar)) + +static gboolean reload_section(gpointer data) +{ + ShellModuleEntry *entry = (ShellModuleEntry *) data; + + /* if the entry is still selected, update it */ + if (entry->selected) { + GtkTreePath *path = NULL; + GtkTreeIter iter; + double pos_info_scroll, pos_more_scroll; + + /* save current position */ + pos_info_scroll = RANGE_GET_VALUE(info, vscrollbar); + pos_more_scroll = RANGE_GET_VALUE(moreinfo, vscrollbar); + + /* avoid drawing the window while we reload */ + gdk_window_freeze_updates(shell->window->window); + + /* gets the current selected path */ + if (gtk_tree_selection_get_selected + (shell->info->selection, &shell->info->model, &iter)) { + path = gtk_tree_model_get_path(shell->info->model, &iter); + } + + /* update the information, clear the treeview and populate it again */ + module_entry_reload(entry); + info_selected_show_extra(NULL); /* clears the more info store */ + module_selected_show_info(entry, TRUE); + + /* if there was a selection, reselect it */ + if (path) { + gtk_tree_selection_select_path(shell->info->selection, path); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(shell->info->view), path, NULL, + FALSE); + gtk_tree_path_free(path); + } else { + /* restore position */ + RANGE_SET_VALUE(info, vscrollbar, pos_info_scroll); + RANGE_SET_VALUE(moreinfo, vscrollbar, pos_more_scroll); + } + + /* make the window drawable again */ + gdk_window_thaw_updates(shell->window->window); + } + + /* destroy the timeout: it'll be set up again */ + return FALSE; +} + +static gboolean rescan_section(gpointer data) +{ + ShellModuleEntry *entry = (ShellModuleEntry *) data; + + module_entry_reload(entry); + + return entry->selected; +} + +static gint +compare_float(float a, float b) +{ + return (a > b) - (a < b); +} + +static gint +info_tree_compare_val_func(GtkTreeModel * model, + GtkTreeIter * a, + GtkTreeIter * b, gpointer userdata) +{ + gint ret = 0; + gchar *col1, *col2; + + gtk_tree_model_get(model, a, INFO_TREE_COL_VALUE, &col1, -1); + gtk_tree_model_get(model, b, INFO_TREE_COL_VALUE, &col2, -1); + + if (!col1 && !col2) + ret = 0; + else if (!col1) + ret = -1; + else if (!col2) + ret = 1; + else if (shell->_order_type == SHELL_ORDER_ASCENDING) + ret = compare_float(atof(col2), atof(col1)); + else + ret = compare_float(atof(col1), atof(col2)); + + g_free(col1); + g_free(col2); + + return ret; +} + +static void set_view_type(ShellViewType viewtype, gboolean reload) +{ + if (viewtype < SHELL_VIEW_NORMAL || viewtype >= SHELL_VIEW_N_VIEWS) + viewtype = SHELL_VIEW_NORMAL; + + shell->normalize_percentage = TRUE; + shell->view_type = viewtype; + + /* reset to the default model */ + gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), + shell->info->model); + + /* reset to the default view columns */ + if (!reload) { + gtk_tree_view_column_set_visible(shell->info->col_extra1, FALSE); + gtk_tree_view_column_set_visible(shell->info->col_extra2, FALSE); + gtk_tree_view_column_set_visible(shell->info->col_progress, FALSE); + gtk_tree_view_column_set_visible(shell->info->col_value, TRUE); + } + + /* turn off the rules hint */ + gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(shell->info->view), FALSE); + + /* turn off the save graphic action */ + shell_action_set_enabled("SaveGraphAction", FALSE); + + close_note(NULL, NULL); + + switch (viewtype) { + default: + case SHELL_VIEW_NORMAL: + gtk_widget_show(shell->info->scroll); + 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_widget_show(shell->info->scroll); + gtk_widget_show(shell->moreinfo->scroll); + gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 0); + gtk_widget_show(shell->notebook); + + gtk_paned_set_position(GTK_PANED(shell->vpaned), + shell->hpaned->allocation.height / 2); + break; + case SHELL_VIEW_LOAD_GRAPH: + gtk_widget_show(shell->info->scroll); + gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 1); + gtk_widget_show(shell->notebook); + load_graph_clear(shell->loadgraph); + + gtk_paned_set_position(GTK_PANED(shell->vpaned), + shell->hpaned->allocation.height - + shell->loadgraph->height - 16); + break; + case SHELL_VIEW_PROGRESS_DUAL: + gtk_widget_show(shell->notebook); + gtk_widget_show(shell->moreinfo->scroll); + + gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 0); + /* fallthrough */ + case SHELL_VIEW_PROGRESS: + gtk_widget_show(shell->info->scroll); + shell_action_set_enabled("SaveGraphAction", TRUE); + + if (!reload) { + gtk_tree_view_column_set_visible(shell->info->col_progress, TRUE); + gtk_tree_view_column_set_visible(shell->info->col_value, FALSE); + } + + if (viewtype == SHELL_VIEW_PROGRESS) + gtk_widget_hide(shell->notebook); + break; + case SHELL_VIEW_SUMMARY: + gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 2); + + gtk_widget_show(shell->notebook); + gtk_widget_hide(shell->info->scroll); + gtk_widget_hide(shell->moreinfo->scroll); + } +} + +static void +group_handle_special(GKeyFile * key_file, ShellModuleEntry * entry, + gchar * group, gchar ** keys, gboolean reload) +{ + if (g_str_equal(group, "$ShellParam$")) { + gboolean headers_visible = FALSE; + gint i; + + for (i = 0; keys[i]; i++) { + gchar *key = keys[i]; + + if (g_str_has_prefix(key, "UpdateInterval")) { + ShellFieldUpdate *fu = g_new0(ShellFieldUpdate, 1); + ShellFieldUpdateSource *sfutbl; + gint ms; + + ms = g_key_file_get_integer(key_file, group, key, NULL); + + fu->field_name = g_strdup(g_utf8_strchr(key, -1, '$') + 1); + fu->entry = entry; + + sfutbl = g_new0(ShellFieldUpdateSource, 1); + sfutbl->source_id = g_timeout_add(ms, update_field, fu); + sfutbl->sfu = fu; + + update_sfusrc = g_slist_prepend(update_sfusrc, sfutbl); + } else if (g_str_equal(key, "NormalizePercentage")) { + shell->normalize_percentage = g_key_file_get_boolean(key_file, group, key, NULL); + } else if (g_str_equal(key, "LoadGraphSuffix")) { + gchar *suffix = + g_key_file_get_value(key_file, group, key, NULL); + load_graph_set_data_suffix(shell->loadgraph, suffix); + g_free(suffix); + } else if (g_str_equal(key, "ReloadInterval")) { + gint ms; + + ms = g_key_file_get_integer(key_file, group, key, NULL); + + g_timeout_add(ms, reload_section, entry); + } else if (g_str_equal(key, "RescanInterval")) { + gint ms; + + ms = g_key_file_get_integer(key_file, group, key, NULL); + + g_timeout_add(ms, rescan_section, entry); + } else if (g_str_equal(key, "ShowColumnHeaders")) { + headers_visible = g_key_file_get_boolean(key_file, group, key, NULL); + } else if (g_str_has_prefix(key, "ColumnTitle")) { + GtkTreeViewColumn *column = NULL; + gchar *value, *title = g_utf8_strchr(key, -1, '$') + 1; + + value = g_key_file_get_value(key_file, group, key, NULL); + + if (g_str_equal(title, "Extra1")) { + column = shell->info->col_extra1; + } else if (g_str_equal(title, "Extra2")) { + column = shell->info->col_extra2; + } else if (g_str_equal(title, "Value")) { + column = shell->info->col_value; + } else if (g_str_equal(title, "TextValue")) { + column = shell->info->col_textvalue; + } else if (g_str_equal(title, "Progress")) { + column = shell->info->col_progress; + } + + if (column) { + gtk_tree_view_column_set_title(column, value); + gtk_tree_view_column_set_visible(column, TRUE); + } + + g_free(value); + } else if (g_str_equal(key, "OrderType")) { + shell->_order_type = g_key_file_get_integer(key_file, + group, + key, NULL); + } else if (g_str_equal(key, "ViewType")) { + set_view_type(g_key_file_get_integer(key_file, group, + key, NULL), reload); + } else if (g_str_has_prefix(key, "Icon")) { + GtkTreeIter *iter = g_hash_table_lookup(update_tbl, + g_utf8_strchr(key, + -1, '$') + 1); + + if (iter) { + gchar *file = + g_key_file_get_value(key_file, group, key, NULL); + gtk_tree_store_set(GTK_TREE_STORE(shell->info->model), + iter, INFO_TREE_COL_PBUF, + icon_cache_get_pixbuf_at_size(file, + 22, + 22), + -1); + g_free(file); + } + } else if (g_str_equal(key, "Zebra")) { + gtk_tree_view_set_rules_hint(GTK_TREE_VIEW + (shell->info->view), + g_key_file_get_boolean + (key_file, group, key, NULL)); + } + } + + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info->view), headers_visible); + } else { + g_warning("Unknown parameter group: ``%s''", group); + } +} + +static void +group_handle_normal(GKeyFile * key_file, ShellModuleEntry * entry, + gchar * group, gchar ** keys, gsize ngroups) +{ + GtkTreeIter parent; + GtkTreeStore *store = GTK_TREE_STORE(shell->info->model); + gchar *tmp = g_strdup(group); + gint i; + + if (ngroups > 1) { + gtk_tree_store_append(store, &parent, NULL); + + strend(tmp, '#'); + gtk_tree_store_set(store, &parent, INFO_TREE_COL_NAME, tmp, -1); + g_free(tmp); + } + + for (i = 0; keys[i]; i++) { + gchar *key = keys[i]; + gchar *value; + GtkTreeIter child; + + value = g_key_file_get_value(key_file, group, key, NULL); + if (entry->fieldfunc && value && g_str_equal(value, "...")) { + g_free(value); + value = entry->fieldfunc(_(key)); + } + + if ((key && value) && g_utf8_validate(key, -1, NULL) && g_utf8_validate(value, -1, NULL)) { + if (ngroups == 1) { + gtk_tree_store_append(store, &child, NULL); + } else { + gtk_tree_store_append(store, &child, &parent); + } + + /* FIXME: use g_key_file_get_string_list? */ + if (g_utf8_strchr(value, -1, '|')) { + gchar **columns = g_strsplit(value, "|", 0); + + gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, columns[0], -1); + if (columns[1]) { + gtk_tree_store_set(store, &child, INFO_TREE_COL_EXTRA1, columns[1], -1); + if (columns[2]) { + gtk_tree_store_set(store, &child, INFO_TREE_COL_EXTRA2, columns[2], -1); + } + } + + g_strfreev(columns); + } else { + gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, value, -1); + } + + strend(key, '#'); + + if (*key == '$') { + gchar **tmp; + + tmp = g_strsplit(++key, "$", 0); + + gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, + tmp[1], INFO_TREE_COL_DATA, tmp[0], -1); + + g_strfreev(tmp); + } else { + gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, _(key), + INFO_TREE_COL_DATA, NULL, -1); + } + + g_hash_table_insert(update_tbl, g_strdup(key), + gtk_tree_iter_copy(&child)); + + } + + g_free(value); + } +} + +static void +moreinfo_handle_normal(GKeyFile * key_file, gchar * group, gchar ** keys) +{ + GtkTreeIter parent; + GtkTreeStore *store = GTK_TREE_STORE(shell->moreinfo->model); + gint i; + + gtk_tree_store_append(store, &parent, NULL); + gtk_tree_store_set(store, &parent, INFO_TREE_COL_NAME, group, -1); + + for (i = 0; keys[i]; i++) { + gchar *key = keys[i]; + GtkTreeIter child; + gchar *value; + + value = g_key_file_get_value(key_file, group, key, NULL); + + if (g_utf8_validate(key, -1, NULL) + && g_utf8_validate(value, -1, NULL)) { + strend(key, '#'); + + gtk_tree_store_append(store, &child, &parent); + gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, + value, INFO_TREE_COL_NAME, key, -1); + } + + g_free(value); + } +} + +static void update_progress() +{ + GtkTreeModel *model = shell->info->model; + GtkTreeStore *store = GTK_TREE_STORE(model); + GtkTreeIter iter, fiter; + gchar *tmp; + gdouble maxv = INT_MIN, minv = INT_MAX, coeff, cur; + + if (!gtk_tree_model_get_iter_first(model, &fiter)) + return; + + /* finds the maximum value */ + if (shell->normalize_percentage) { + iter = fiter; + do { + gtk_tree_model_get(model, &iter, INFO_TREE_COL_VALUE, &tmp, -1); + + cur = atof(tmp); + if (cur > maxv) + maxv = cur; + if (cur < minv) + minv = cur; + + g_free(tmp); + } while (gtk_tree_model_iter_next(model, &iter)); + + if (minv - maxv < 0.001) + maxv += 1.0f; + } else { + minv = 1.0f; + maxv = 100.0f; + } + + coeff = (100.0f - 1.0f) / (maxv - minv); + + /* fix the maximum relative percentage */ + iter = fiter; + do { + char *space; + char formatted[128]; + gdouble pct; + + gtk_tree_model_get(model, &iter, INFO_TREE_COL_VALUE, &tmp, -1); + cur = atof(tmp); + space = g_utf8_strchr(tmp, -1, ' '); + + pct = coeff * (cur - minv) + 1.0f; + if (shell->_order_type == SHELL_ORDER_ASCENDING) + pct = 100.0 - pct; + pct = ceil(pct); + + if (space) { + snprintf(formatted, sizeof(formatted), "%.2f%s", cur, space); + } else { + snprintf(formatted, sizeof(formatted), "%.2f", cur); + } + + gtk_tree_store_set(store, &iter, INFO_TREE_COL_PROGRESS, pct, + INFO_TREE_COL_VALUE, strreplacechr(formatted, ",", + '.'), -1); + + g_free(tmp); + } while (gtk_tree_model_iter_next(model, &iter)); + + /* now sort everything up. that wasn't as hard as i thought :) */ + GtkTreeSortable *sortable = GTK_TREE_SORTABLE(shell->info->model); + + gtk_tree_sortable_set_sort_func(sortable, INFO_TREE_COL_VALUE, + info_tree_compare_val_func, 0, NULL); + gtk_tree_sortable_set_sort_column_id(sortable, INFO_TREE_COL_VALUE, + GTK_SORT_DESCENDING); + gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), + GTK_TREE_MODEL(sortable)); +} + +void shell_set_note_from_entry(ShellModuleEntry * entry) +{ + if (entry->notefunc) { + const gchar *note = module_entry_get_note(entry); + + if (note) { + gtk_label_set_markup(GTK_LABEL(shell->note->label), note); + gtk_widget_show(shell->note->event_box); + } else { + gtk_widget_hide(shell->note->event_box); + } + } else { + gtk_widget_hide(shell->note->event_box); + } +} + +void shell_clear_field_updates(void) +{ + if (update_sfusrc) { + GSList *sfusrc; + + for (sfusrc = update_sfusrc; sfusrc; sfusrc = sfusrc->next) { + ShellFieldUpdateSource *src = + (ShellFieldUpdateSource *) sfusrc->data; + g_source_remove(src->source_id); + g_free(src->sfu->field_name); + g_free(src->sfu); + g_free(src); + } + + g_slist_free(update_sfusrc); + update_sfusrc = NULL; + } +} + +static void +module_selected_show_info(ShellModuleEntry * entry, gboolean reload) +{ + GKeyFile *key_file = g_key_file_new(); + GtkTreeStore *store; + gchar *key_data, **groups; + gboolean has_shell_param = FALSE; + gint i; + gsize ngroups; + + module_entry_scan(entry); + key_data = module_entry_function(entry); + + /* */ + gdk_window_freeze_updates(shell->info->view->window); + + g_object_ref(shell->info->model); + gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), NULL); + + /* reset the view type to normal */ + set_view_type(SHELL_VIEW_NORMAL, reload); + + if (!reload) { + /* recreate the iter hash table */ + h_hash_table_remove_all(update_tbl); + } + + shell_clear_field_updates(); + + store = GTK_TREE_STORE(shell->info->model); + + gtk_tree_store_clear(store); + + g_key_file_load_from_data(key_file, key_data, strlen(key_data), 0, + NULL); + groups = g_key_file_get_groups(key_file, &ngroups); + + for (i = 0; groups[i]; i++) + if (groups[i][0] == '$') + ngroups--; + + for (i = 0; groups[i]; i++) { + gchar *group = groups[i]; + gchar **keys = g_key_file_get_keys(key_file, group, NULL, NULL); + + if (*group == '$') { + group_handle_special(key_file, entry, group, keys, reload); + has_shell_param = TRUE; + } else { + group_handle_normal(key_file, entry, group, keys, ngroups); + } + + g_strfreev(keys); + } + + /* */ + if (!has_shell_param) { + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info->view), FALSE); + } + + /* */ + g_object_unref(shell->info->model); + gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), shell->info->model); + gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->info->view)); + + gdk_window_thaw_updates(shell->info->view->window); + shell_set_note_from_entry(entry); + + if (shell->view_type == SHELL_VIEW_PROGRESS || shell->view_type == SHELL_VIEW_PROGRESS_DUAL) { + update_progress(); + } + +#if GTK_CHECK_VERSION(2,12,0) + if (ngroups == 1) { + gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(shell->info->view), + FALSE); + } else { + gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(shell->info->view), + TRUE); + } +#endif + + g_strfreev(groups); + g_key_file_free(key_file); + g_free(key_data); +} + +static void info_selected_show_extra(gchar * data) +{ + GtkTreeStore *store; + + store = GTK_TREE_STORE(shell->moreinfo->model); + gtk_tree_store_clear(store); + + if (!shell->selected->morefunc) + return; + + if (data) { + GKeyFile *key_file = g_key_file_new(); + gchar *key_data = shell->selected->morefunc(data); + gchar **groups; + gint i; + + g_key_file_load_from_data(key_file, key_data, strlen(key_data), 0, + NULL); + groups = g_key_file_get_groups(key_file, NULL); + + for (i = 0; groups[i]; i++) { + gchar *group = groups[i]; + gchar **keys = + g_key_file_get_keys(key_file, group, NULL, NULL); + + moreinfo_handle_normal(key_file, group, keys); + } + + gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->moreinfo->view)); + + g_strfreev(groups); + g_key_file_free(key_file); + g_free(key_data); + } +} + +static gchar *shell_summary_clear_value(gchar *value) +{ + GKeyFile *keyfile; + gchar *return_value; + + keyfile = g_key_file_new(); + if (!value) return_value = g_strdup(""); + else + if (g_key_file_load_from_data(keyfile, value, + strlen(value), 0, NULL)) { + gchar **groups; + gint group; + + return_value = g_strdup(""); + + groups = g_key_file_get_groups(keyfile, NULL); + for (group = 0; groups[group]; group++) { + gchar **keys; + gint key; + + keys = g_key_file_get_keys(keyfile, groups[group], NULL, NULL); + for (key = 0; keys[key]; key++) { + gchar *temp = keys[key]; + + if (*temp == '$') { + temp++; + while (*temp && *temp != '$') + temp++; + temp++; + + return_value = h_strdup_cprintf("%s\n", return_value, temp); + } else { + return_value = g_key_file_get_string(keyfile, groups[group], + keys[key], NULL); + } + } + + g_strfreev(keys); + } + + g_strfreev(groups); + } else { + return_value = g_strdup(value); + } + + g_key_file_free(keyfile); + + return g_strstrip(return_value); +} + +static void shell_summary_add_item(ShellSummary *summary, + gchar *icon, + gchar *name, + gchar *value) +{ + GtkWidget *frame; + GtkWidget *frame_label_box; + GtkWidget *frame_image; + GtkWidget *frame_label; + GtkWidget *content; + GtkWidget *alignment; + gchar *temp; + + temp = shell_summary_clear_value(value); + + /* creates the frame */ + frame = gtk_frame_new(NULL); + gtk_frame_set_shadow_type(GTK_FRAME(frame), + GTK_SHADOW_NONE); + + frame_label_box = gtk_hbox_new(FALSE, 5); + frame_image = icon_cache_get_image(icon); + frame_label = gtk_label_new(name); + gtk_label_set_use_markup(GTK_LABEL(frame_label), TRUE); + gtk_box_pack_start(GTK_BOX(frame_label_box), frame_image, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(frame_label_box), frame_label, FALSE, FALSE, 0); + + alignment = gtk_alignment_new(0.5, 0.5, 1, 1); + gtk_widget_show(alignment); + gtk_container_add(GTK_CONTAINER(frame), alignment); + gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 48, 0); + + content = gtk_label_new(temp); + gtk_misc_set_alignment(GTK_MISC(content), 0.0, 0.5); + gtk_container_add(GTK_CONTAINER(alignment), content); + + gtk_widget_show_all(frame); + gtk_widget_show_all(frame_label_box); + + gtk_frame_set_label_widget(GTK_FRAME(frame), frame_label_box); + + /* pack the item on the summary screen */ + gtk_box_pack_start(GTK_BOX(shell->summary->view), frame, FALSE, FALSE, 4); + + /* add the item to the list of summary items */ + summary->items = g_slist_prepend(summary->items, frame); + + g_free(temp); +} + +static void shell_summary_clear(ShellSummary *summary) +{ + GSList *item; + + for (item = summary->items; item; item = item->next) { + gtk_widget_destroy(GTK_WIDGET(item->data)); + } + + g_slist_free(summary->items); + summary->items = NULL; + + if (summary->header) gtk_widget_destroy(summary->header); + summary->header = NULL; +} +static void shell_summary_create_header(ShellSummary *summary, + gchar *title) +{ + GtkWidget *header, *label; + gchar *temp; + + temp = g_strdup_printf(_("%s \342\206\222 Summary"), title); + + header = gtk_menu_item_new_with_label(temp); + gtk_menu_item_select(GTK_MENU_ITEM(header)); + gtk_widget_show(header); + + label = gtk_bin_get_child(GTK_BIN(header)); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + + gtk_box_pack_start(GTK_BOX(shell->summary->view), header, FALSE, FALSE, 4); + + summary->header = header; + + g_free(temp); +} + +static void shell_show_summary(void) +{ + GKeyFile *keyfile; + gchar *summary; + + set_view_type(SHELL_VIEW_SUMMARY, FALSE); + shell_summary_clear(shell->summary); + shell_summary_create_header(shell->summary, shell->selected_module->name); + + keyfile = g_key_file_new(); + summary = shell->selected_module->summaryfunc(); + + if (g_key_file_load_from_data(keyfile, summary, + strlen(summary), 0, NULL)) { + gchar **groups; + gint group; + + groups = g_key_file_get_groups(keyfile, NULL); + + for (group = 0; groups[group]; group++) { + gchar *icon, *method, *method_result; + + shell_status_pulse(); + + icon = g_key_file_get_string(keyfile, groups[group], "Icon", NULL); + method = g_key_file_get_string(keyfile, groups[group], "Method", NULL); + if (method) { + method_result = module_call_method(method); + } else { + method_result = g_strdup("N/A"); + } + + shell_summary_add_item(shell->summary, + icon, groups[group], method_result); + shell_status_pulse(); + + g_free(icon); + g_free(method); + g_free(method_result); + } + + g_strfreev(groups); + } else { + DEBUG("error while parsing summary"); + set_view_type(SHELL_VIEW_NORMAL, FALSE); + } + + g_free(summary); + g_key_file_free(keyfile); + + shell_view_set_enabled(TRUE); +} + +static void module_selected(gpointer data) +{ + ShellTree *shelltree = shell->tree; + GtkTreeModel *model = GTK_TREE_MODEL(shelltree->model); + GtkTreeIter iter, parent; + ShellModuleEntry *entry; + static ShellModuleEntry *current = NULL; + static gboolean updating = FALSE; + + /* Gets the currently selected item on the left-side TreeView; if there is no + selection, silently return */ + if (!gtk_tree_selection_get_selected(shelltree->selection, &model, &iter)) { + return; + } + + /* Mark the currently selected module as "unselected"; this is used to kill the + update timeout. */ + if (current) { + current->selected = FALSE; + } + + if (updating) { + return; + } else { + updating = TRUE; + } + + if (!gtk_tree_model_iter_parent(model, &parent, &iter)) { + memcpy(&parent, &iter, sizeof(iter)); + } + + gtk_tree_model_get(model, &parent, TREE_COL_MODULE, &shell->selected_module, -1); + + /* Get the current selection and shows its related info */ + gtk_tree_model_get(model, &iter, TREE_COL_MODULE_ENTRY, &entry, -1); + if (entry && !entry->selected) { + gchar *title; + + shell_status_set_enabled(TRUE); + shell_status_update(_("Updating...")); + + entry->selected = TRUE; + shell->selected = entry; + module_selected_show_info(entry, FALSE); + + info_selected_show_extra(NULL); /* clears the more info store */ + gtk_tree_view_columns_autosize(GTK_TREE_VIEW(shell->info->view)); + + /* urgh. why don't GTK do this when the model is cleared? */ + RANGE_SET_VALUE(info, vscrollbar, 0.0); + RANGE_SET_VALUE(info, hscrollbar, 0.0); + RANGE_SET_VALUE(moreinfo, vscrollbar, 0.0); + RANGE_SET_VALUE(moreinfo, hscrollbar, 0.0); + + title = g_strdup_printf("%s - %s", shell->selected_module->name, entry->name); + shell_set_title(shell, title); + g_free(title); + + shell_action_set_enabled("RefreshAction", TRUE); + shell_action_set_enabled("CopyAction", TRUE); + + shell_status_update(_("Done.")); + shell_status_set_enabled(FALSE); + } else { + shell_set_title(shell, NULL); + shell_action_set_enabled("RefreshAction", FALSE); + shell_action_set_enabled("CopyAction", FALSE); + + gtk_tree_store_clear(GTK_TREE_STORE(shell->info->model)); + set_view_type(SHELL_VIEW_NORMAL, FALSE); + + if (shell->selected_module->summaryfunc) { + shell_show_summary(); + } + } + + current = entry; + updating = FALSE; +} + +static void info_selected(GtkTreeSelection * ts, gpointer data) +{ + ShellInfoTree *info = (ShellInfoTree *) data; + GtkTreeModel *model = GTK_TREE_MODEL(info->model); + GtkTreeIter parent; + gchar *datacol; + + if (!gtk_tree_selection_get_selected(ts, &model, &parent)) + return; + + if (shell->view_type == SHELL_VIEW_NORMAL || + shell->view_type == SHELL_VIEW_PROGRESS) { + gtk_tree_selection_unselect_all(ts); + return; + } + + gtk_tree_model_get(model, &parent, INFO_TREE_COL_DATA, &datacol, -1); + info_selected_show_extra(datacol); + gtk_tree_view_columns_autosize(GTK_TREE_VIEW(shell->moreinfo->view)); +} + +static ShellInfoTree *info_tree_new(gboolean extra) +{ + ShellInfoTree *info; + GtkWidget *treeview, *scroll; + GtkTreeModel *model; + GtkTreeStore *store; + GtkTreeViewColumn *column; + GtkCellRenderer *cr_text, *cr_pbuf, *cr_progress; + GtkTreeSelection *sel; + + info = g_new0(ShellInfoTree, 1); + + scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW + (scroll), GTK_SHADOW_IN); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_ALWAYS); + + store = + gtk_tree_store_new(INFO_TREE_NCOL, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_FLOAT, + G_TYPE_STRING, G_TYPE_STRING); + model = GTK_TREE_MODEL(store); + treeview = gtk_tree_view_new_with_model(model); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); + gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(treeview), TRUE); + + info->col_progress = column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_visible(column, FALSE); + gtk_tree_view_column_set_min_width(column, 240); + gtk_tree_view_column_set_clickable(column, TRUE); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + cr_progress = gtk_cell_renderer_progress_new(); + gtk_tree_view_column_pack_start(column, cr_progress, TRUE); + gtk_tree_view_column_add_attribute(column, cr_progress, "value", + INFO_TREE_COL_PROGRESS); + gtk_tree_view_column_add_attribute(column, cr_progress, "text", + INFO_TREE_COL_VALUE); + gtk_tree_view_column_set_visible(column, FALSE); + + info->col_textvalue = column = gtk_tree_view_column_new(); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + gtk_tree_view_column_set_clickable(column, TRUE); + + cr_pbuf = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE); + gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf", + INFO_TREE_COL_PBUF); + + cr_text = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, cr_text, TRUE); + gtk_tree_view_column_add_attribute(column, cr_text, "markup", + INFO_TREE_COL_NAME); + + info->col_extra1 = column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_visible(column, FALSE); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + gtk_tree_view_column_set_clickable(column, TRUE); + + cr_text = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, cr_text, FALSE); + gtk_tree_view_column_add_attribute(column, cr_text, "markup", + INFO_TREE_COL_EXTRA1); + + info->col_extra2 = column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_visible(column, FALSE); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + gtk_tree_view_column_set_clickable(column, TRUE); + + cr_text = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, cr_text, FALSE); + gtk_tree_view_column_add_attribute(column, cr_text, "markup", + INFO_TREE_COL_EXTRA2); + + info->col_value = column = gtk_tree_view_column_new(); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + gtk_tree_view_column_set_clickable(column, TRUE); + + cr_text = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, cr_text, FALSE); + gtk_tree_view_column_add_attribute(column, cr_text, "markup", + INFO_TREE_COL_VALUE); + + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); + + if (!extra) + g_signal_connect(G_OBJECT(sel), "changed", + (GCallback) info_selected, info); + + gtk_container_add(GTK_CONTAINER(scroll), treeview); + + info->scroll = scroll; + info->view = treeview; + info->model = model; + info->selection = sel; + + gtk_widget_show_all(scroll); + + return info; +} + +static ShellTree *tree_new() +{ + ShellTree *shelltree; + GtkWidget *treeview, *scroll; + GtkTreeModel *model; + GtkTreeStore *store; + GtkCellRenderer *cr_text, *cr_pbuf; + GtkTreeViewColumn *column; + GtkTreeSelection *sel; + + shelltree = g_new0(ShellTree, 1); + + scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW + (scroll), GTK_SHADOW_IN); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + + store = gtk_tree_store_new(TREE_NCOL, GDK_TYPE_PIXBUF, G_TYPE_STRING, + G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_BOOLEAN); + model = GTK_TREE_MODEL(store); + treeview = gtk_tree_view_new_with_model(model); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); + +#if GTK_CHECK_VERSION(2,12,0) + gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(treeview), FALSE); + gtk_tree_view_set_level_indentation(GTK_TREE_VIEW(treeview), 24); +#endif + + column = gtk_tree_view_column_new(); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + cr_pbuf = gtk_cell_renderer_pixbuf_new(); + cr_text = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE); + gtk_tree_view_column_pack_start(column, cr_text, TRUE); + + gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf", + TREE_COL_PBUF); + gtk_tree_view_column_add_attribute(column, cr_text, "markup", + TREE_COL_NAME); + + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); + g_signal_connect(G_OBJECT(sel), "changed", (GCallback) module_selected, + NULL); + + gtk_container_add(GTK_CONTAINER(scroll), treeview); + + shelltree->scroll = scroll; + shelltree->view = treeview; + shelltree->model = model; + shelltree->modules = NULL; + shelltree->selection = sel; + + gtk_widget_show_all(scroll); + + return shelltree; +} diff --git a/shell/stock.c b/shell/stock.c new file mode 100644 index 00000000..ad1a0135 --- /dev/null +++ b/shell/stock.c @@ -0,0 +1,91 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include + +static struct { + gchar *filename; + gchar *stock_id; +} stock_icons[] = { + { "report.png", HI_STOCK_REPORT}, + { "internet.png", HI_STOCK_INTERNET}, + { "module.png", HI_STOCK_MODULE}, + { "about-modules.png", HI_STOCK_ABOUT_MODULES}, + { "syncmanager-small.png", HI_STOCK_SYNC_MENU}, + { "face-grin.png", HI_STOCK_DONATE}, + { "server.png", HI_STOCK_SERVER}, +}; + +static GtkIconFactory *icon_factory; + +void stock_icon_register(gchar * filename, gchar * stock_id) +{ + GtkIconSet *icon_set; + GtkIconSource *icon_source; + + icon_set = gtk_icon_set_new(); + icon_source = gtk_icon_source_new(); + + gtk_icon_source_set_pixbuf(icon_source, + icon_cache_get_pixbuf(filename)); + gtk_icon_set_add_source(icon_set, icon_source); + gtk_icon_source_free(icon_source); + + gtk_icon_factory_add(icon_factory, stock_id, icon_set); + + gtk_icon_set_unref(icon_set); +} + +void stock_icon_register_pixbuf(GdkPixbuf * pixbuf, gchar * stock_id) +{ + GtkIconSet *icon_set; + GtkIconSource *icon_source; + + icon_set = gtk_icon_set_new(); + icon_source = gtk_icon_source_new(); + + gtk_icon_source_set_pixbuf(icon_source, pixbuf); + gtk_icon_set_add_source(icon_set, icon_source); + gtk_icon_source_free(icon_source); + + gtk_icon_factory_add(icon_factory, stock_id, icon_set); + + gtk_icon_set_unref(icon_set); +} + +void stock_icons_init(void) +{ + gint i; + guint n_stock_icons = G_N_ELEMENTS(stock_icons); + + DEBUG("initializing stock icons"); + + icon_factory = gtk_icon_factory_new(); + + for (i = 0; i < n_stock_icons; i++) { + stock_icon_register(stock_icons[i].filename, + stock_icons[i].stock_id); + } + + gtk_icon_factory_add_default(icon_factory); + + g_object_unref(icon_factory); +} diff --git a/shell/syncmanager.c b/shell/syncmanager.c new file mode 100644 index 00000000..0b95e720 --- /dev/null +++ b/shell/syncmanager.c @@ -0,0 +1,768 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "syncmanager.h" +#include "iconcache.h" +#include "hardinfo.h" +#include "config.h" + +#ifdef HAS_LIBSOUP +#include + +#include +#include + +typedef struct _SyncDialog SyncDialog; +typedef struct _SyncNetArea SyncNetArea; +typedef struct _SyncNetAction SyncNetAction; + +struct _SyncNetArea { + GtkWidget *vbox; +}; + +struct _SyncNetAction { + gchar *name; + gboolean(*do_action) (SyncDialog * sd, gpointer sna); + + SyncEntry *entry; + GError *error; +}; + +struct _SyncDialog { + GtkWidget *dialog; + GtkWidget *label; + + GtkWidget *button_sync; + GtkWidget *button_cancel; + GtkWidget *button_close; + + GtkWidget *scroll_box; + + SyncNetArea *sna; + + gboolean flag_cancel:1; +}; + +static GSList *entries = NULL; +static SoupSession *session = NULL; +static GMainLoop *loop; +static GQuark err_quark; + +#define XMLRPC_SERVER_URI "https://xmlrpc.hardinfo.org/" +#define XMLRPC_SERVER_API_VERSION 1 + +#define LABEL_SYNC_DEFAULT _("Synchronize with Central Database\n" \ + "The following information may be synchronized " \ + "with the HardInfo central database.") +#define LABEL_SYNC_SYNCING _("Synchronizing\n" \ + "This may take some time.") + +static SyncDialog *sync_dialog_new(GtkWidget *parent); +static void sync_dialog_destroy(SyncDialog * sd); +static void sync_dialog_start_sync(SyncDialog * sd); + +static SyncNetArea *sync_dialog_netarea_new(void); +static void sync_dialog_netarea_destroy(SyncNetArea * sna); +static void sync_dialog_netarea_show(SyncDialog * sd); +#if 0 +static void sync_dialog_netarea_hide(SyncDialog * sd); +#endif +static void sync_dialog_netarea_start_actions(SyncDialog * sd, + SyncNetAction * sna, gint n); + +#define SNA_ERROR(code,message,...) if (!sna->error) { \ + sna->error = g_error_new(err_quark, code, message, \ + ##__VA_ARGS__); \ + } +#endif /* HAS_LIBSOUP */ + + +gint sync_manager_count_entries(void) +{ +#ifdef HAS_LIBSOUP + return g_slist_length(entries); +#else + return 0; +#endif +} + +void sync_manager_add_entry(SyncEntry * entry) +{ +#ifdef HAS_LIBSOUP + DEBUG("registering syncmanager entry ''%s''", entry->fancy_name); + + entry->selected = TRUE; + entries = g_slist_append(entries, entry); +#else + DEBUG("libsoup support is disabled."); +#endif /* HAS_LIBSOUP */ +} + +void sync_manager_clear_entries(void) +{ +#ifdef HAS_LIBSOUP + DEBUG("clearing syncmanager entries"); + + g_slist_free(entries); + entries = NULL; +#else + DEBUG("libsoup support is disabled."); +#endif /* HAS_LIBSOUP */ +} + +void sync_manager_show(GtkWidget *parent) +{ +#ifndef HAS_LIBSOUP + g_warning + (_("HardInfo was compiled without libsoup support. (Network Updater requires it.)")); +#else /* !HAS_LIBSOUP */ + SyncDialog *sd = sync_dialog_new(parent); + + err_quark = g_quark_from_static_string("syncmanager"); + + if (gtk_dialog_run(GTK_DIALOG(sd->dialog)) == GTK_RESPONSE_ACCEPT) { + shell_view_set_enabled(FALSE); + shell_status_set_enabled(TRUE); + + sync_dialog_start_sync(sd); + + shell_status_set_enabled(FALSE); + shell_view_set_enabled(TRUE); + } + + sync_dialog_destroy(sd); +#endif /* HAS_LIBSOUP */ +} + +#ifdef HAS_LIBSOUP +static gint _soup_get_xmlrpc_value_int(SoupMessage * msg, + SyncNetAction * sna) +{ + gint int_value = -1; + + sna->error = NULL; + + if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { + SNA_ERROR(1, _("%s (error #%d)"), msg->reason_phrase, + msg->status_code); + goto bad; + } + + GVariant *value = soup_xmlrpc_parse_response(msg->response_body->data, + msg->response_body->length, + "h", NULL); + if (!value) { + SNA_ERROR(2, _("Could not parse XML-RPC response")); + goto bad; + } + + int_value = g_variant_get_int32(value); + g_variant_unref(value); + +bad: + return int_value; +} + +static gchar *_soup_get_xmlrpc_value_string(SoupMessage * msg, + SyncNetAction * sna) +{ + gchar *string = NULL; + + sna->error = NULL; + + if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { + SNA_ERROR(1, _("%s (error #%d)"), msg->reason_phrase, + msg->status_code); + goto bad; + } + + GVariant *value = soup_xmlrpc_parse_response(msg->response_body->data, + msg->response_body->length, + "s", NULL); + if (!value) { + SNA_ERROR(2, _("Could not parse XML-RPC response")); + goto bad; + } + + string = g_strdup(g_variant_get_string(value, NULL)); + g_variant_unref(value); + +bad: + return string; +} + +static gboolean _soup_xmlrpc_call(gchar * method, SyncNetAction * sna, + SoupSessionCallback callback) +{ + SoupMessage *msg; + + sna->error = NULL; + + msg = soup_xmlrpc_message_new(XMLRPC_SERVER_URI, method, NULL, NULL); + if (!msg) + return FALSE; + + DEBUG("calling xmlrpc method %s", method); + + soup_session_queue_message(session, msg, callback, sna); + g_main_run(loop); + + return TRUE; +} + +static gboolean _soup_xmlrpc_call_with_parameters(gchar * method, + SyncNetAction * sna, + SoupSessionCallback + callback, ...) +{ + SoupMessage *msg; + GVariantBuilder builder; + GVariant *parameters; + gchar *argument, *body; + va_list ap; + + sna->error = NULL; + + msg = soup_message_new("POST", XMLRPC_SERVER_URI); + + DEBUG("calling xmlrpc method %s", method); + if (!msg) + return FALSE; + + g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY); + va_start(ap, callback); + while ((argument = va_arg(ap, gchar *))) { + g_variant_builder_add(&builder, "s", argument); + DEBUG("with parameter: %s", argument); + } + va_end(ap); + parameters = g_variant_builder_end(&builder); + g_variant_builder_unref(&builder); + + body = soup_xmlrpc_build_request(method, parameters, NULL); + g_variant_unref(parameters); + if (body) { + soup_message_set_request(msg, "text/xml", + SOUP_MEMORY_TAKE, body, strlen(body)); + + soup_session_queue_message(session, msg, callback, sna); + g_main_run(loop); + + return TRUE; + } + + return FALSE; +} + +static void _action_check_api_version_got_response(SoupSession * session, + SoupMessage * msg, + gpointer user_data) +{ + SyncNetAction *sna = (SyncNetAction *) user_data; + gint version = _soup_get_xmlrpc_value_int(msg, sna); + + if (version != XMLRPC_SERVER_API_VERSION) { + SNA_ERROR(5, _("Server says it supports API version %d, but " + "this version of HardInfo only supports API " + "version %d."), version, XMLRPC_SERVER_API_VERSION); + } + + g_main_quit(loop); +} + +static gboolean _action_check_api_version(SyncDialog * sd, + gpointer user_data) +{ + SyncNetAction *sna = (SyncNetAction *) user_data; + + if (!_soup_xmlrpc_call("server.getAPIVersion", sna, + _action_check_api_version_got_response)) + return FALSE; + + return sna->error ? FALSE : TRUE; +} + +static void _action_call_function_got_response(SoupSession * session, + SoupMessage * msg, + gpointer user_data) +{ + SyncNetAction *sna = (SyncNetAction *) user_data; + gchar *string; + + if ((string = _soup_get_xmlrpc_value_string(msg, sna)) && + sna->entry->save_to) { + DEBUG("received string: %s\n", string); + gchar *filename = g_build_filename(g_get_home_dir(), ".hardinfo", + sna->entry->save_to, NULL); + + DEBUG("saving to %s", filename); + + g_file_set_contents(filename, string, -1, NULL); + g_free(filename); + } + + if (sna->entry->callback) { + sna->entry->callback(sna->entry, string); + } + + g_free(string); + g_main_quit(loop); +} + +static gboolean _action_call_function(SyncDialog * sd, gpointer user_data) +{ + SyncNetAction *sna = (SyncNetAction *) user_data; + + if (sna->entry) { + gchar *str_data = NULL; + + if (sna->entry->get_data) + str_data = sna->entry->get_data(); + + if (!_soup_xmlrpc_call_with_parameters("sync.callFunctionEx", sna, + _action_call_function_got_response, + VERSION, ARCH, + sna->entry->name, + str_data, NULL)) { + g_free(str_data); + + return FALSE; + } + + g_free(str_data); + } + + return sna->error ? FALSE : TRUE; +} + +static gboolean _cancel_sync(GtkWidget * widget, gpointer data) +{ + SyncDialog *sd = (SyncDialog *) data; + + if (session) { + soup_session_abort(session); + } + + sd->flag_cancel = TRUE; + g_main_quit(loop); + + gtk_widget_set_sensitive(widget, FALSE); + + return FALSE; +} + +static SyncNetAction *sync_manager_get_selected_actions(gint * n) +{ + gint i; + GSList *entry; + SyncNetAction *actions; + SyncNetAction + action_check_api = { _("Contacting HardInfo Central Database"), _action_check_api_version }, + action_clean_up = { _("Cleaning up"), NULL}; + + actions = g_new0(SyncNetAction, 2 + g_slist_length(entries)); + + for (entry = entries, i = 1; entry; entry = entry->next) { + SyncEntry *e = (SyncEntry *) entry->data; + + if (e->selected) { + SyncNetAction sna = + { e->fancy_name, _action_call_function, e }; + + actions[i++] = sna; + } + } + + actions[0] = action_check_api; + actions[i++] = action_clean_up; + + *n = i; + return actions; +} + +static SoupURI *sync_manager_get_proxy(void) +{ + const gchar *conf; + + if (!(conf = g_getenv("HTTP_PROXY"))) { + if (!(conf = g_getenv("http_proxy"))) { + return NULL; + } + } + + return soup_uri_new(conf); +} + +static void sync_dialog_start_sync(SyncDialog * sd) +{ + gint nactions; + SyncNetAction *actions; + + if (!session) { + SoupURI *proxy = sync_manager_get_proxy(); + + session = soup_session_new_with_options(SOUP_SESSION_TIMEOUT, 10, + SOUP_SESSION_PROXY_URI, + proxy, NULL); + /* Crashes if we unref the proxy? O_o */ + /*if (proxy) + g_object_unref(proxy); */ + } + + loop = g_main_loop_new(NULL, TRUE); + + gtk_widget_hide(sd->button_sync); + sync_dialog_netarea_show(sd); + g_signal_connect(G_OBJECT(sd->button_cancel), "clicked", + (GCallback) _cancel_sync, sd); + + actions = sync_manager_get_selected_actions(&nactions); + sync_dialog_netarea_start_actions(sd, actions, nactions); + g_free(actions); + + if (sd->flag_cancel) { + gtk_widget_hide(sd->button_cancel); + gtk_widget_show(sd->button_close); + + /* wait for the user to close the dialog */ + g_main_run(loop); + } + + g_main_loop_unref(loop); +} + +static void sync_dialog_netarea_start_actions(SyncDialog * sd, + SyncNetAction sna[], gint n) +{ + gint i; + GtkWidget **labels; + GtkWidget **status_labels; + const gchar *done_str = "\342\234\223"; + const gchar *error_str = "\342\234\227"; + const gchar *curr_str = "\342\226\266"; + const gchar *empty_str = "\302\240\302\240"; + + labels = g_new0(GtkWidget *, n); + status_labels = g_new0(GtkWidget *, n); + + for (i = 0; i < n; i++) { + GtkWidget *hbox; + + hbox = gtk_hbox_new(FALSE, 5); + + labels[i] = gtk_label_new(sna[i].name); + status_labels[i] = gtk_label_new(empty_str); + + gtk_label_set_use_markup(GTK_LABEL(labels[i]), TRUE); + gtk_label_set_use_markup(GTK_LABEL(status_labels[i]), TRUE); + + gtk_misc_set_alignment(GTK_MISC(labels[i]), 0.0, 0.5); + gtk_misc_set_alignment(GTK_MISC(status_labels[i]), 1.0, 0.5); + + gtk_box_pack_start(GTK_BOX(hbox), status_labels[i], FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), labels[i], TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(sd->sna->vbox), hbox, FALSE, FALSE, 3); + + gtk_widget_show_all(hbox); + } + + while (gtk_events_pending()) + gtk_main_iteration(); + + for (i = 0; i < n; i++) { + gchar *markup; + + if (sd->flag_cancel) { + markup = + g_strdup_printf(_("%s (canceled)"), + sna[i].name); + gtk_label_set_markup(GTK_LABEL(labels[i]), markup); + g_free(markup); + + gtk_label_set_markup(GTK_LABEL(status_labels[i]), error_str); + break; + } + + markup = g_strdup_printf("%s", sna[i].name); + gtk_label_set_markup(GTK_LABEL(labels[i]), markup); + g_free(markup); + + gtk_label_set_markup(GTK_LABEL(status_labels[i]), curr_str); + + if (sna[i].do_action && !sna[i].do_action(sd, &sna[i])) { + markup = + g_strdup_printf(_("%s (failed)"), + sna[i].name); + gtk_label_set_markup(GTK_LABEL(labels[i]), markup); + g_free(markup); + + sd->flag_cancel = TRUE; + + gtk_label_set_markup(GTK_LABEL(status_labels[i]), error_str); + if (sna[i].error) { + if (sna[i].error->code != 1) { + /* the user has not cancelled something... */ + g_warning + (_("Failed while performing \"%s\". Please file a bug report " + "if this problem persists. (Use the Help\342\206\222Report" + " bug option.)\n\nDetails: %s"), sna[i].name, + sna[i].error->message); + } + + g_error_free(sna[i].error); + } else { + g_warning + (_("Failed while performing \"%s\". Please file a bug report " + "if this problem persists. (Use the Help\342\206\222Report" + " bug option.)"), sna[i].name); + } + break; + } + + gtk_label_set_markup(GTK_LABEL(status_labels[i]), done_str); + gtk_label_set_markup(GTK_LABEL(labels[i]), sna[i].name); + } + + g_free(labels); + g_free(status_labels); +} + +static SyncNetArea *sync_dialog_netarea_new(void) +{ + SyncNetArea *sna = g_new0(SyncNetArea, 1); + + sna->vbox = gtk_vbox_new(FALSE, 0); + + gtk_container_set_border_width(GTK_CONTAINER(sna->vbox), 10); + + gtk_widget_show_all(sna->vbox); + gtk_widget_hide(sna->vbox); + + return sna; +} + +static void sync_dialog_netarea_destroy(SyncNetArea * sna) +{ + g_return_if_fail(sna != NULL); + + g_free(sna); +} + +static void sync_dialog_netarea_show(SyncDialog * sd) +{ + g_return_if_fail(sd && sd->sna); + + gtk_widget_hide(GTK_WIDGET(sd->scroll_box)); + gtk_widget_show(GTK_WIDGET(sd->sna->vbox)); + + gtk_label_set_markup(GTK_LABEL(sd->label), LABEL_SYNC_SYNCING); + gtk_window_set_default_size(GTK_WINDOW(sd->dialog), 0, 0); + gtk_window_reshow_with_initial_size(GTK_WINDOW(sd->dialog)); +} + +#if 0 +static void sync_dialog_netarea_hide(SyncDialog * sd) +{ + g_return_if_fail(sd && sd->sna); + + gtk_widget_show(GTK_WIDGET(sd->scroll_box)); + gtk_widget_hide(GTK_WIDGET(sd->sna->vbox)); + + gtk_label_set_markup(GTK_LABEL(sd->label), LABEL_SYNC_DEFAULT); + gtk_window_reshow_with_initial_size(GTK_WINDOW(sd->dialog)); +} +#endif + +static void populate_store(GtkListStore * store) +{ + GSList *entry; + SyncEntry *e; + + gtk_list_store_clear(store); + + for (entry = entries; entry; entry = entry->next) { + GtkTreeIter iter; + + e = (SyncEntry *) entry->data; + + e->selected = TRUE; + + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, 0, TRUE, 1, e->fancy_name, 2, e, + -1); + } +} + +static void +sel_toggle(GtkCellRendererToggle * cellrenderertoggle, + gchar * path_str, GtkTreeModel * model) +{ + GtkTreeIter iter; + GtkTreePath *path = gtk_tree_path_new_from_string(path_str); + SyncEntry *se; + gboolean active; + + gtk_tree_model_get_iter(model, &iter, path); + gtk_tree_model_get(model, &iter, 0, &active, 2, &se, -1); + + se->selected = !active; + + gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, se->selected, -1); + gtk_tree_path_free(path); +} + +static void close_clicked(void) +{ + g_main_quit(loop); +} + +static SyncDialog *sync_dialog_new(GtkWidget *parent) +{ + SyncDialog *sd; + GtkWidget *dialog; + GtkWidget *dialog1_vbox; + GtkWidget *scrolledwindow2; + GtkWidget *treeview2; + GtkWidget *dialog1_action_area; + GtkWidget *button8; + GtkWidget *button7; + GtkWidget *button6; + GtkWidget *label; + GtkWidget *hbox; + + GtkTreeViewColumn *column; + GtkTreeModel *model; + GtkListStore *store; + GtkCellRenderer *cr_text, *cr_toggle; + + sd = g_new0(SyncDialog, 1); + sd->sna = sync_dialog_netarea_new(); + + dialog = gtk_dialog_new(); + gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent)); + gtk_window_set_title(GTK_WINDOW(dialog), _("Network Updater")); + gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); + gtk_window_set_icon(GTK_WINDOW(dialog), + icon_cache_get_pixbuf("syncmanager.png")); + gtk_window_set_default_size(GTK_WINDOW(dialog), 420, 260); + gtk_window_set_position(GTK_WINDOW(dialog), + GTK_WIN_POS_CENTER_ON_PARENT); + gtk_window_set_type_hint(GTK_WINDOW(dialog), + GDK_WINDOW_TYPE_HINT_DIALOG); + + gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); + + dialog1_vbox = GTK_DIALOG(dialog)->vbox; + gtk_box_set_spacing(GTK_BOX(dialog1_vbox), 5); + gtk_container_set_border_width(GTK_CONTAINER(dialog1_vbox), 4); + gtk_widget_show(dialog1_vbox); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, FALSE, FALSE, 0); + + label = gtk_label_new(LABEL_SYNC_DEFAULT); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + gtk_box_pack_start(GTK_BOX(hbox), + icon_cache_get_image("syncmanager.png"), + FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); + gtk_widget_show_all(hbox); + + + gtk_box_pack_start(GTK_BOX(dialog1_vbox), sd->sna->vbox, TRUE, TRUE, + 0); + + scrolledwindow2 = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrolledwindow2); + gtk_box_pack_start(GTK_BOX(dialog1_vbox), scrolledwindow2, TRUE, TRUE, + 0); + gtk_widget_set_size_request(scrolledwindow2, -1, 200); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow2), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW + (scrolledwindow2), GTK_SHADOW_IN); + + store = + gtk_list_store_new(3, G_TYPE_BOOLEAN, G_TYPE_STRING, + G_TYPE_POINTER); + model = GTK_TREE_MODEL(store); + + treeview2 = gtk_tree_view_new_with_model(model); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview2), FALSE); + gtk_widget_show(treeview2); + gtk_container_add(GTK_CONTAINER(scrolledwindow2), treeview2); + + column = gtk_tree_view_column_new(); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview2), column); + + cr_toggle = gtk_cell_renderer_toggle_new(); + gtk_tree_view_column_pack_start(column, cr_toggle, FALSE); + g_signal_connect(cr_toggle, "toggled", G_CALLBACK(sel_toggle), model); + gtk_tree_view_column_add_attribute(column, cr_toggle, "active", 0); + + cr_text = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, cr_text, TRUE); + gtk_tree_view_column_add_attribute(column, cr_text, "markup", 1); + + populate_store(store); + + dialog1_action_area = GTK_DIALOG(dialog)->action_area; + gtk_widget_show(dialog1_action_area); + gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog1_action_area), + GTK_BUTTONBOX_END); + + button8 = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + gtk_widget_show(button8); + gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button8, + GTK_RESPONSE_CANCEL); + GTK_WIDGET_SET_FLAGS(button8, GTK_CAN_DEFAULT); + + button7 = gtk_button_new_with_mnemonic(_("_Synchronize")); + gtk_widget_show(button7); + gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button7, + GTK_RESPONSE_ACCEPT); + GTK_WIDGET_SET_FLAGS(button7, GTK_CAN_DEFAULT); + + button6 = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + g_signal_connect(G_OBJECT(button6), "clicked", + (GCallback) close_clicked, NULL); + gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button6, + GTK_RESPONSE_ACCEPT); + GTK_WIDGET_SET_FLAGS(button6, GTK_CAN_DEFAULT); + + sd->dialog = dialog; + sd->button_sync = button7; + sd->button_cancel = button8; + sd->button_close = button6; + sd->scroll_box = scrolledwindow2; + sd->label = label; + + return sd; +} + +static void sync_dialog_destroy(SyncDialog * sd) +{ + gtk_widget_destroy(sd->dialog); + sync_dialog_netarea_destroy(sd->sna); + g_free(sd); +} +#endif /* HAS_LIBSOUP */ diff --git a/socket.c b/socket.c deleted file mode 100644 index cada32b6..00000000 --- a/socket.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "socket.h" - -Socket *sock_connect(gchar * host, gint port) -{ - struct sockaddr_in server; - Socket *s; - int sock; - - sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock > 0) { - memset(&server, 0, sizeof(server)); - server.sin_family = AF_INET; - server.sin_addr.s_addr = inet_addr(host); - server.sin_port = htons(port); - - if (connect - (sock, (struct sockaddr *) (void *) &server, - sizeof(server)) < 0) { - return NULL; - } - - s = g_new0(Socket, 1); - s->sock = sock; - - return s; - } - - return NULL; -} - -/* From: http://www.erlenstar.demon.co.uk/unix/faq_3.html#SEC26 */ -static inline int __sock_is_ready(Socket * s, int mode) -{ - int rc, fd = s->sock; - fd_set fds; - struct timeval tv; - - FD_ZERO(&fds); - FD_SET(fd, &fds); - tv.tv_sec = tv.tv_usec = 0; - - if (mode == 0) { - /* read */ - rc = select(fd + 1, &fds, NULL, NULL, &tv); - } else { - /* write */ - rc = select(fd + 1, NULL, &fds, NULL, &tv); - } - - if (rc < 0) - return -1; - - return FD_ISSET(fd, &fds) ? 1 : 0; -} - -int sock_ready_to_read(Socket * s) -{ - return __sock_is_ready(s, 0); -} - -int sock_ready_to_write(Socket * s) -{ - return __sock_is_ready(s, 1); -} - -int sock_read(Socket * s, gchar * buffer, gint size) -{ - if (sock_ready_to_read(s)) { - gint n; - - n = read(s->sock, buffer, size); - if (n > 0) { - buffer[n] = '\0'; - } else { - return 0; - } - - return n; - } - - return 0; -} - -int sock_write(Socket * s, gchar * str) -{ - while (!sock_ready_to_write(s)); - - return write(s->sock, str, strlen(str)); -} - -void sock_close(Socket * s) -{ - close(s->sock); - g_free(s); -} diff --git a/socket.h b/socket.h deleted file mode 100644 index 7c44837e..00000000 --- a/socket.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef __HI_SOCKET_H__ -#define __HI_SOCKET_H__ - -typedef struct _Socket Socket; - -struct _Socket { - gint sock; -}; - -Socket *sock_connect(gchar * host, gint port); -int sock_write(Socket * s, gchar * str); -int sock_read(Socket * s, gchar * buffer, gint size); -void sock_close(Socket * s); - -int sock_ready_to_read(Socket *s); -int sock_ready_to_write(Socket *s); - -#endif /* __HI_SOCKET_H__ */ diff --git a/stock.c b/stock.c deleted file mode 100644 index 5c1a3490..00000000 --- a/stock.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include -#include - -static struct { - gchar *filename; - gchar *stock_id; -} stock_icons[] = { - { "report.png", HI_STOCK_REPORT}, - { "internet.png", HI_STOCK_INTERNET}, - { "module.png", HI_STOCK_MODULE}, - { "about-modules.png", HI_STOCK_ABOUT_MODULES}, - { "syncmanager-small.png", HI_STOCK_SYNC_MENU}, - { "face-grin.png", HI_STOCK_DONATE}, -}; - -static GtkIconFactory *icon_factory; - -void stock_icon_register(gchar * filename, gchar * stock_id) -{ - GtkIconSet *icon_set; - GtkIconSource *icon_source; - - icon_set = gtk_icon_set_new(); - icon_source = gtk_icon_source_new(); - - gtk_icon_source_set_pixbuf(icon_source, - icon_cache_get_pixbuf(filename)); - gtk_icon_set_add_source(icon_set, icon_source); - gtk_icon_source_free(icon_source); - - gtk_icon_factory_add(icon_factory, stock_id, icon_set); - - gtk_icon_set_unref(icon_set); -} - -void stock_icon_register_pixbuf(GdkPixbuf * pixbuf, gchar * stock_id) -{ - GtkIconSet *icon_set; - GtkIconSource *icon_source; - - icon_set = gtk_icon_set_new(); - icon_source = gtk_icon_source_new(); - - gtk_icon_source_set_pixbuf(icon_source, pixbuf); - gtk_icon_set_add_source(icon_set, icon_source); - gtk_icon_source_free(icon_source); - - gtk_icon_factory_add(icon_factory, stock_id, icon_set); - - gtk_icon_set_unref(icon_set); -} - -void stock_icons_init(void) -{ - gint i; - guint n_stock_icons = G_N_ELEMENTS(stock_icons); - - DEBUG("initializing stock icons"); - - icon_factory = gtk_icon_factory_new(); - - for (i = 0; i < n_stock_icons; i++) { - stock_icon_register(stock_icons[i].filename, - stock_icons[i].stock_id); - } - - gtk_icon_factory_add_default(icon_factory); - - g_object_unref(icon_factory); -} diff --git a/stock.h b/stock.h deleted file mode 100644 index f8c61275..00000000 --- a/stock.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef __STOCK_H__ -#define __STOCK_H__ - -#define HI_STOCK_REPORT "hi-stock-report" -#define HI_STOCK_INTERNET "hi-stock-internet" -#define HI_STOCK_MODULE "hi-stock-module" -#define HI_STOCK_ABOUT_MODULES "hi-stock-about-modules" -#define HI_STOCK_SYNC_MENU "hi-stock-sync-menu" -#define HI_STOCK_DONATE "hi-stock-donate" - -void stock_icons_init(void); -void stock_icon_register(gchar *filename, gchar *stock_id); -void stock_icon_register_pixbuf(GdkPixbuf *pixbuf, gchar *stock_id); - -#endif /* __STOCK_H__ */ diff --git a/syncmanager.c b/syncmanager.c deleted file mode 100644 index 37788a7b..00000000 --- a/syncmanager.c +++ /dev/null @@ -1,748 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2009 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "syncmanager.h" -#include "iconcache.h" -#include "hardinfo.h" -#include "config.h" - -#ifdef HAS_LIBSOUP -#include - -#include -#include - -typedef struct _SyncDialog SyncDialog; -typedef struct _SyncNetArea SyncNetArea; -typedef struct _SyncNetAction SyncNetAction; - -struct _SyncNetArea { - GtkWidget *vbox; -}; - -struct _SyncNetAction { - gchar *name; - gboolean(*do_action) (SyncDialog * sd, gpointer sna); - - SyncEntry *entry; - GError *error; -}; - -struct _SyncDialog { - GtkWidget *dialog; - GtkWidget *label; - - GtkWidget *button_sync; - GtkWidget *button_cancel; - GtkWidget *button_close; - - GtkWidget *scroll_box; - - SyncNetArea *sna; - - gboolean flag_cancel:1; -}; - -static GSList *entries = NULL; -static SoupSession *session = NULL; -static GMainLoop *loop; -static GQuark err_quark; - -#define XMLRPC_SERVER_URI "http://hardinfo.berlios.de/xmlrpc/" -#define XMLRPC_SERVER_API_VERSION 1 - -#define LABEL_SYNC_DEFAULT "Synchronize with Central Database\n" \ - "The following information may be synchronized " \ - "with the HardInfo central database." -#define LABEL_SYNC_SYNCING "Synchronizing\n" \ - "This may take some time." - -static SyncDialog *sync_dialog_new(void); -static void sync_dialog_destroy(SyncDialog * sd); -static void sync_dialog_start_sync(SyncDialog * sd); - -static SyncNetArea *sync_dialog_netarea_new(void); -static void sync_dialog_netarea_destroy(SyncNetArea * sna); -static void sync_dialog_netarea_show(SyncDialog * sd); -#if 0 -static void sync_dialog_netarea_hide(SyncDialog * sd); -#endif -static void sync_dialog_netarea_start_actions(SyncDialog * sd, - SyncNetAction * sna, gint n); - -#define SNA_ERROR(code,message,...) if (!sna->error) { \ - sna->error = g_error_new(err_quark, code, message, \ - ##__VA_ARGS__); \ - } -#endif /* HAS_LIBSOUP */ - - -gint sync_manager_count_entries(void) -{ -#ifdef HAS_LIBSOUP - return g_slist_length(entries); -#else - return 0; -#endif -} - -void sync_manager_add_entry(SyncEntry * entry) -{ -#ifdef HAS_LIBSOUP - DEBUG("registering syncmanager entry ''%s''", entry->fancy_name); - - entry->selected = TRUE; - entries = g_slist_append(entries, entry); -#else - DEBUG("libsoup support is disabled."); -#endif /* HAS_LIBSOUP */ -} - -void sync_manager_show(void) -{ -#ifndef HAS_LIBSOUP - g_warning - ("HardInfo was compiled without libsoup support. (Network Updater requires it.)"); -#else /* !HAS_LIBSOUP */ - SyncDialog *sd = sync_dialog_new(); - - err_quark = g_quark_from_static_string("syncmanager"); - - if (gtk_dialog_run(GTK_DIALOG(sd->dialog)) == GTK_RESPONSE_ACCEPT) { - shell_view_set_enabled(FALSE); - shell_status_set_enabled(TRUE); - - sync_dialog_start_sync(sd); - - shell_status_set_enabled(FALSE); - shell_view_set_enabled(TRUE); - } - - sync_dialog_destroy(sd); -#endif /* HAS_LIBSOUP */ -} - -#ifdef HAS_LIBSOUP -static gint _soup_get_xmlrpc_value_int(SoupMessage * msg, - SyncNetAction * sna) -{ - gint int_value = -1; - - sna->error = NULL; - - if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { - SNA_ERROR(1, "%s (error #%d)", msg->reason_phrase, - msg->status_code); - goto bad; - } - - if (!soup_xmlrpc_extract_method_response(msg->response_body->data, - msg->response_body->length, - NULL, - G_TYPE_INT, &int_value)) { - SNA_ERROR(2, "Could not parse XML-RPC response"); - } - - bad: - return int_value; -} - -static gchar *_soup_get_xmlrpc_value_string(SoupMessage * msg, - SyncNetAction * sna) -{ - gchar *string = NULL; - - sna->error = NULL; - - if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { - SNA_ERROR(1, "%s (error #%d)", msg->reason_phrase, - msg->status_code); - goto bad; - } - - if (!soup_xmlrpc_extract_method_response(msg->response_body->data, - msg->response_body->length, - NULL, - G_TYPE_STRING, &string)) { - SNA_ERROR(2, "Could not parse XML-RPC response"); - } - - bad: - return string; -} - -static gboolean _soup_xmlrpc_call(gchar * method, SyncNetAction * sna, - SoupSessionCallback callback) -{ - SoupMessage *msg; - - sna->error = NULL; - - msg = soup_xmlrpc_request_new(XMLRPC_SERVER_URI, method, - G_TYPE_INVALID); - if (!msg) - return FALSE; - - DEBUG("calling xmlrpc method %s", method); - - soup_session_queue_message(session, msg, callback, sna); - g_main_run(loop); - - return TRUE; -} - -static gboolean _soup_xmlrpc_call_with_parameters(gchar * method, - SyncNetAction * sna, - SoupSessionCallback - callback, ...) -{ - SoupMessage *msg; - GValueArray *parameters; - gchar *argument, *body; - va_list ap; - - sna->error = NULL; - - msg = soup_message_new("POST", XMLRPC_SERVER_URI); - - DEBUG("calling xmlrpc method %s", method); - if (!msg) - return FALSE; - - parameters = g_value_array_new(1); - va_start(ap, callback); - while ((argument = va_arg(ap, gchar *))) { - soup_value_array_append(parameters, G_TYPE_STRING, argument); - DEBUG("with parameter: %s", argument); - } - va_end(ap); - - body = soup_xmlrpc_build_method_call(method, parameters->values, - parameters->n_values); - g_value_array_free(parameters); - soup_message_set_request(msg, "text/xml", - SOUP_MEMORY_TAKE, body, strlen (body)); - - soup_session_queue_message(session, msg, callback, sna); - g_main_run(loop); - - return TRUE; -} - -static void _action_check_api_version_got_response(SoupSession * session, - SoupMessage * msg, - gpointer user_data) -{ - SyncNetAction *sna = (SyncNetAction *) user_data; - gint version = _soup_get_xmlrpc_value_int(msg, sna); - - if (version != XMLRPC_SERVER_API_VERSION) { - SNA_ERROR(5, "Server says it supports API version %d, but " - "this version of HardInfo only supports API " - "version %d.", version, XMLRPC_SERVER_API_VERSION); - } - - g_main_quit(loop); -} - -static gboolean _action_check_api_version(SyncDialog * sd, - gpointer user_data) -{ - SyncNetAction *sna = (SyncNetAction *) user_data; - - if (!_soup_xmlrpc_call("server.getAPIVersion", sna, - _action_check_api_version_got_response)) - return FALSE; - - return sna->error ? FALSE : TRUE; -} - -static void _action_call_function_got_response(SoupSession * session, - SoupMessage * msg, - gpointer user_data) -{ - SyncNetAction *sna = (SyncNetAction *) user_data; - gchar *string; - - if ((string = _soup_get_xmlrpc_value_string(msg, sna)) && - sna->entry->save_to) { - DEBUG("received string: %s\n", string); - gchar *filename = g_build_filename(g_get_home_dir(), ".hardinfo", - sna->entry->save_to, NULL); - - DEBUG("saving to %s", filename); - - g_file_set_contents(filename, string, -1, NULL); - g_free(filename); - } - - if (sna->entry->callback) { - sna->entry->callback(sna->entry, string); - } - - g_free(string); - g_main_quit(loop); -} - -static gboolean _action_call_function(SyncDialog * sd, gpointer user_data) -{ - SyncNetAction *sna = (SyncNetAction *) user_data; - - if (sna->entry) { - gchar *str_data = NULL; - - if (sna->entry->get_data) - str_data = sna->entry->get_data(); - - if (!_soup_xmlrpc_call_with_parameters("sync.callFunctionEx", sna, - _action_call_function_got_response, - VERSION, ARCH, - sna->entry->name, - str_data, NULL)) { - if (str_data) - g_free(str_data); - - return FALSE; - } - - if (str_data) - g_free(str_data); - } - - return sna->error ? FALSE : TRUE; -} - -static gboolean _cancel_sync(GtkWidget * widget, gpointer data) -{ - SyncDialog *sd = (SyncDialog *) data; - - if (session) { - soup_session_abort(session); - } - - sd->flag_cancel = TRUE; - g_main_quit(loop); - - gtk_widget_set_sensitive(widget, FALSE); - - return FALSE; -} - -static SyncNetAction *sync_manager_get_selected_actions(gint * n) -{ - gint i; - GSList *entry; - SyncNetAction *actions; - SyncNetAction - action_check_api = { "Contacting HardInfo Central Database", _action_check_api_version }, - action_clean_up = { "Cleaning up", NULL}; - - actions = g_new0(SyncNetAction, 2 + g_slist_length(entries)); - - for (entry = entries, i = 1; entry; entry = entry->next) { - SyncEntry *e = (SyncEntry *) entry->data; - - if (e->selected) { - SyncNetAction sna = - { e->fancy_name, _action_call_function, e }; - - actions[i++] = sna; - } - } - - actions[0] = action_check_api; - actions[i++] = action_clean_up; - - *n = i; - return actions; -} - -static SoupURI *sync_manager_get_proxy(void) -{ - const gchar *conf; - - if (!(conf = g_getenv("HTTP_PROXY"))) { - if (!(conf = g_getenv("http_proxy"))) { - return NULL; - } - } - - return soup_uri_new(conf); -} - -static void sync_dialog_start_sync(SyncDialog * sd) -{ - gint nactions; - SyncNetAction *actions; - - if (!session) { - SoupURI *proxy = sync_manager_get_proxy(); - - session = - soup_session_async_new_with_options(SOUP_SESSION_TIMEOUT, 10, - SOUP_SESSION_PROXY_URI, - proxy, NULL); - /* Crashes if we unref the proxy? O_o */ - /*if (proxy) - g_object_unref(proxy); */ - } - - loop = g_main_loop_new(NULL, TRUE); - - gtk_widget_hide(sd->button_sync); - sync_dialog_netarea_show(sd); - g_signal_connect(G_OBJECT(sd->button_cancel), "clicked", - (GCallback) _cancel_sync, sd); - - actions = sync_manager_get_selected_actions(&nactions); - sync_dialog_netarea_start_actions(sd, actions, nactions); - g_free(actions); - - if (sd->flag_cancel) { - gtk_widget_hide(sd->button_cancel); - gtk_widget_show(sd->button_close); - - /* wait for the user to close the dialog */ - g_main_run(loop); - } - - g_main_loop_unref(loop); -} - -static void sync_dialog_netarea_start_actions(SyncDialog * sd, - SyncNetAction sna[], gint n) -{ - gint i; - GtkWidget **labels; - GtkWidget **icons; - GdkPixbuf *done_icon = icon_cache_get_pixbuf("status-done.png"); - GdkPixbuf *curr_icon = icon_cache_get_pixbuf("status-curr.png"); - - labels = g_new0(GtkWidget *, n); - icons = g_new0(GtkWidget *, n); - - for (i = 0; i < n; i++) { - GtkWidget *hbox; - - hbox = gtk_hbox_new(FALSE, 5); - - labels[i] = gtk_label_new(sna[i].name); - icons[i] = gtk_image_new(); - - gtk_widget_set_size_request(icons[i], - gdk_pixbuf_get_width(done_icon), - gdk_pixbuf_get_height(done_icon)); - - gtk_label_set_use_markup(GTK_LABEL(labels[i]), TRUE); - gtk_misc_set_alignment(GTK_MISC(labels[i]), 0.0, 0.5); - - gtk_box_pack_start(GTK_BOX(hbox), icons[i], FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), labels[i], TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(sd->sna->vbox), hbox, FALSE, FALSE, 3); - - gtk_widget_show_all(hbox); - } - - while (gtk_events_pending()) - gtk_main_iteration(); - - for (i = 0; i < n; i++) { - gchar *markup; - - if (sd->flag_cancel) { - markup = - g_strdup_printf("%s (canceled)", - sna[i].name); - gtk_label_set_markup(GTK_LABEL(labels[i]), markup); - g_free(markup); - - gtk_image_set_from_pixbuf(GTK_IMAGE(icons[i]), - icon_cache_get_pixbuf - ("dialog-error.png")); - break; - } - - markup = g_strdup_printf("%s", sna[i].name); - gtk_label_set_markup(GTK_LABEL(labels[i]), markup); - g_free(markup); - - gtk_image_set_from_pixbuf(GTK_IMAGE(icons[i]), curr_icon); - - if (sna[i].do_action && !sna[i].do_action(sd, &sna[i])) { - markup = - g_strdup_printf("%s (failed)", - sna[i].name); - gtk_label_set_markup(GTK_LABEL(labels[i]), markup); - g_free(markup); - - sd->flag_cancel = TRUE; - - gtk_image_set_from_pixbuf(GTK_IMAGE(icons[i]), - icon_cache_get_pixbuf - ("dialog-error.png")); - if (sna[i].error) { - if (sna[i].error->code != 1) { - /* the user has not cancelled something... */ - g_warning - ("Failed while performing \"%s\". Please file a bug report " - "if this problem persists. (Use the Help\342\206\222Report" - " bug option.)\n\nDetails: %s", sna[i].name, - sna[i].error->message); - } - - g_error_free(sna[i].error); - } else { - g_warning - ("Failed while performing \"%s\". Please file a bug report " - "if this problem persists. (Use the Help\342\206\222Report" - " bug option.)", sna[i].name); - } - break; - } - - gtk_image_set_from_pixbuf(GTK_IMAGE(icons[i]), done_icon); - gtk_label_set_markup(GTK_LABEL(labels[i]), sna[i].name); - } - - g_free(labels); - g_free(icons); -} - -static SyncNetArea *sync_dialog_netarea_new(void) -{ - SyncNetArea *sna = g_new0(SyncNetArea, 1); - - sna->vbox = gtk_vbox_new(FALSE, 0); - - gtk_container_set_border_width(GTK_CONTAINER(sna->vbox), 10); - - gtk_widget_show_all(sna->vbox); - gtk_widget_hide(sna->vbox); - - return sna; -} - -static void sync_dialog_netarea_destroy(SyncNetArea * sna) -{ - g_return_if_fail(sna != NULL); - - g_free(sna); -} - -static void sync_dialog_netarea_show(SyncDialog * sd) -{ - g_return_if_fail(sd && sd->sna); - - gtk_widget_hide(GTK_WIDGET(sd->scroll_box)); - gtk_widget_show(GTK_WIDGET(sd->sna->vbox)); - - gtk_label_set_markup(GTK_LABEL(sd->label), LABEL_SYNC_SYNCING); - gtk_window_set_default_size(GTK_WINDOW(sd->dialog), 0, 0); - gtk_window_reshow_with_initial_size(GTK_WINDOW(sd->dialog)); -} - -#if 0 -static void sync_dialog_netarea_hide(SyncDialog * sd) -{ - g_return_if_fail(sd && sd->sna); - - gtk_widget_show(GTK_WIDGET(sd->scroll_box)); - gtk_widget_hide(GTK_WIDGET(sd->sna->vbox)); - - gtk_label_set_markup(GTK_LABEL(sd->label), LABEL_SYNC_DEFAULT); - gtk_window_reshow_with_initial_size(GTK_WINDOW(sd->dialog)); -} -#endif - -static void populate_store(GtkListStore * store) -{ - GSList *entry; - SyncEntry *e; - - gtk_list_store_clear(store); - - for (entry = entries; entry; entry = entry->next) { - GtkTreeIter iter; - - e = (SyncEntry *) entry->data; - - e->selected = TRUE; - - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, 0, TRUE, 1, e->fancy_name, 2, e, - -1); - } -} - -static void -sel_toggle(GtkCellRendererToggle * cellrenderertoggle, - gchar * path_str, GtkTreeModel * model) -{ - GtkTreeIter iter; - GtkTreePath *path = gtk_tree_path_new_from_string(path_str); - SyncEntry *se; - gboolean active; - - gtk_tree_model_get_iter(model, &iter, path); - gtk_tree_model_get(model, &iter, 0, &active, 2, &se, -1); - - se->selected = !active; - - gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, se->selected, -1); - gtk_tree_path_free(path); -} - -static void close_clicked(void) -{ - g_main_quit(loop); -} - -static SyncDialog *sync_dialog_new(void) -{ - SyncDialog *sd; - GtkWidget *dialog; - GtkWidget *dialog1_vbox; - GtkWidget *scrolledwindow2; - GtkWidget *treeview2; - GtkWidget *dialog1_action_area; - GtkWidget *button8; - GtkWidget *button7; - GtkWidget *button6; - GtkWidget *label; - GtkWidget *hbox; - - GtkTreeViewColumn *column; - GtkTreeModel *model; - GtkListStore *store; - GtkCellRenderer *cr_text, *cr_toggle; - - sd = g_new0(SyncDialog, 1); - sd->sna = sync_dialog_netarea_new(); - - dialog = gtk_dialog_new(); - gtk_window_set_title(GTK_WINDOW(dialog), "Network Updater"); - gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); - gtk_window_set_icon(GTK_WINDOW(dialog), - icon_cache_get_pixbuf("syncmanager.png")); - gtk_window_set_default_size(GTK_WINDOW(dialog), 420, 260); - gtk_window_set_position(GTK_WINDOW(dialog), - GTK_WIN_POS_CENTER_ON_PARENT); - gtk_window_set_type_hint(GTK_WINDOW(dialog), - GDK_WINDOW_TYPE_HINT_DIALOG); - - gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); - - dialog1_vbox = GTK_DIALOG(dialog)->vbox; - gtk_box_set_spacing(GTK_BOX(dialog1_vbox), 5); - gtk_container_set_border_width(GTK_CONTAINER(dialog1_vbox), 4); - gtk_widget_show(dialog1_vbox); - - hbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, FALSE, FALSE, 0); - - label = gtk_label_new(LABEL_SYNC_DEFAULT); - gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); - gtk_label_set_use_markup(GTK_LABEL(label), TRUE); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - - gtk_box_pack_start(GTK_BOX(hbox), - icon_cache_get_image("syncmanager.png"), - FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); - gtk_widget_show_all(hbox); - - - gtk_box_pack_start(GTK_BOX(dialog1_vbox), sd->sna->vbox, TRUE, TRUE, - 0); - - scrolledwindow2 = gtk_scrolled_window_new(NULL, NULL); - gtk_widget_show(scrolledwindow2); - gtk_box_pack_start(GTK_BOX(dialog1_vbox), scrolledwindow2, TRUE, TRUE, - 0); - gtk_widget_set_size_request(scrolledwindow2, -1, 200); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow2), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW - (scrolledwindow2), GTK_SHADOW_IN); - - store = - gtk_list_store_new(3, G_TYPE_BOOLEAN, G_TYPE_STRING, - G_TYPE_POINTER); - model = GTK_TREE_MODEL(store); - - treeview2 = gtk_tree_view_new_with_model(model); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview2), FALSE); - gtk_widget_show(treeview2); - gtk_container_add(GTK_CONTAINER(scrolledwindow2), treeview2); - - column = gtk_tree_view_column_new(); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview2), column); - - cr_toggle = gtk_cell_renderer_toggle_new(); - gtk_tree_view_column_pack_start(column, cr_toggle, FALSE); - g_signal_connect(cr_toggle, "toggled", G_CALLBACK(sel_toggle), model); - gtk_tree_view_column_add_attribute(column, cr_toggle, "active", 0); - - cr_text = gtk_cell_renderer_text_new(); - gtk_tree_view_column_pack_start(column, cr_text, TRUE); - gtk_tree_view_column_add_attribute(column, cr_text, "markup", 1); - - populate_store(store); - - dialog1_action_area = GTK_DIALOG(dialog)->action_area; - gtk_widget_show(dialog1_action_area); - gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog1_action_area), - GTK_BUTTONBOX_END); - - button8 = gtk_button_new_from_stock(GTK_STOCK_CANCEL); - gtk_widget_show(button8); - gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button8, - GTK_RESPONSE_CANCEL); - GTK_WIDGET_SET_FLAGS(button8, GTK_CAN_DEFAULT); - - button7 = gtk_button_new_with_mnemonic("_Synchronize"); - gtk_widget_show(button7); - gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button7, - GTK_RESPONSE_ACCEPT); - GTK_WIDGET_SET_FLAGS(button7, GTK_CAN_DEFAULT); - - button6 = gtk_button_new_from_stock(GTK_STOCK_CLOSE); - g_signal_connect(G_OBJECT(button6), "clicked", - (GCallback) close_clicked, NULL); - gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button6, - GTK_RESPONSE_ACCEPT); - GTK_WIDGET_SET_FLAGS(button6, GTK_CAN_DEFAULT); - - sd->dialog = dialog; - sd->button_sync = button7; - sd->button_cancel = button8; - sd->button_close = button6; - sd->scroll_box = scrolledwindow2; - sd->label = label; - - return sd; -} - -static void sync_dialog_destroy(SyncDialog * sd) -{ - gtk_widget_destroy(sd->dialog); - sync_dialog_netarea_destroy(sd->sna); - g_free(sd); -} -#endif /* HAS_LIBSOUP */ diff --git a/syncmanager.h b/syncmanager.h deleted file mode 100644 index 360c012a..00000000 --- a/syncmanager.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef __SYNCMANAGER_H__ -#define __SYNCMANAGER_H__ - -#include - -typedef struct _SyncEntry SyncEntry; - -struct _SyncEntry { - gchar *name; - gchar *fancy_name; - gchar *save_to; - - gchar *(*get_data)(void); - void (*callback)(SyncEntry *entry, const gchar *response); - - gboolean selected; -}; - -void sync_manager_add_entry(SyncEntry *entry); -void sync_manager_show(void); -gint sync_manager_count_entries(void); - -#endif /* __SYNCMANAGER_H__ */ diff --git a/uidefs.h b/uidefs.h deleted file mode 100644 index 333c9ce5..00000000 --- a/uidefs.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef __UIDEFS_H__ -#define __UIDEFS_H__ - -char *uidefs_str = "" \ -" " \ -" " \ -/*" " \ -" " \ -" " \*/ -" " \ -/*" " \ */ -" " \ -/* - * Save Image is not ready for prime time. Yet. - * "" \ - */ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -" " \ -""; - -#endif /* __UIDEFS_H__ */ diff --git a/util.c b/util.c deleted file mode 100644 index 266ce4eb..00000000 --- a/util.c +++ /dev/null @@ -1,1160 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* - * Functions h_strdup_cprintf and h_strconcat are based on GLib version 2.4.6 - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - */ - -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -#define KiB 1024 -#define MiB 1048576 -#define GiB 1073741824 - -gchar *find_program(gchar *program_name) -{ - int i; - char *temp; - static GHashTable *cache = NULL; - const char *path[] = { "/bin", "/sbin", - "/usr/bin", "/usr/sbin", - "/usr/local/bin", "/usr/local/sbin", - NULL }; - - /* we don't need to call stat() every time: cache the results */ - if (!cache) { - cache = g_hash_table_new(g_str_hash, g_str_equal); - } else if ((temp = g_hash_table_lookup(cache, program_name))) { - return g_strdup(temp); - } - - for (i = 0; path[i]; i++) { - temp = g_build_filename(path[i], program_name, NULL); - - if (g_file_test(temp, G_FILE_TEST_IS_EXECUTABLE)) { - g_hash_table_insert(cache, program_name, g_strdup(temp)); - return temp; - } - - g_free(temp); - } - - /* our search has failed; use GLib's search (which uses $PATH env var) */ - if ((temp = g_find_program_in_path(program_name))) { - g_hash_table_insert(cache, program_name, g_strdup(temp)); - return temp; - } - - return NULL; -} - -gchar *seconds_to_string(unsigned int seconds) -{ - unsigned int hours, minutes, days; - - minutes = seconds / 60; - hours = minutes / 60; - minutes %= 60; - days = hours / 24; - hours %= 24; - -#define plural(x) ((x > 1) ? "s" : "") - - if (days < 1) { - if (hours < 1) { - return g_strdup_printf("%d minute%s", minutes, - plural(minutes)); - } else { - return g_strdup_printf("%d hour%s, %d minute%s", - hours, - plural(hours), minutes, - plural(minutes)); - } - } - - return g_strdup_printf("%d day%s, %d hour%s and %d minute%s", - days, plural(days), hours, - plural(hours), minutes, plural(minutes)); -} - -inline gchar *size_human_readable(gfloat size) -{ - if (size < KiB) - return g_strdup_printf("%.1f B", size); - if (size < MiB) - return g_strdup_printf("%.1f KiB", size / KiB); - if (size < GiB) - return g_strdup_printf("%.1f MiB", size / MiB); - - return g_strdup_printf("%.1f GiB", size / GiB); -} - -inline char *strend(gchar * str, gchar chr) -{ - if (!str) - return NULL; - - char *p; - if ((p = strchr(str, chr))) - *p = 0; - - return str; -} - -inline void remove_quotes(gchar * str) -{ - if (!str) - return; - - while (*str == '"') - *(str++) = ' '; - - strend(str, '"'); -} - -inline void remove_linefeed(gchar * str) -{ - strend(str, '\n'); -} - -void widget_set_cursor(GtkWidget * widget, GdkCursorType cursor_type) -{ - GdkCursor *cursor; - - if ((cursor = gdk_cursor_new(cursor_type))) { - gdk_window_set_cursor(GDK_WINDOW(widget->window), cursor); - gdk_display_flush(gtk_widget_get_display(widget)); - gdk_cursor_unref(cursor); - } - - while (gtk_events_pending()) - gtk_main_iteration(); -} - -static gboolean __nonblock_cb(gpointer data) -{ - gtk_main_quit(); - return FALSE; -} - -void nonblock_sleep(guint msec) -{ - g_timeout_add(msec, (GSourceFunc) __nonblock_cb, NULL); - gtk_main(); -} - -static void __expand_cb(GtkWidget * widget, gpointer data) -{ - if (GTK_IS_EXPANDER(widget)) { - gtk_expander_set_expanded(GTK_EXPANDER(widget), TRUE); - } else if (GTK_IS_CONTAINER(widget)) { - gtk_container_foreach(GTK_CONTAINER(widget), - (GtkCallback) __expand_cb, NULL); - } -} - -void file_chooser_open_expander(GtkWidget * chooser) -{ - gtk_container_foreach(GTK_CONTAINER(chooser), - (GtkCallback) __expand_cb, NULL); -} - -void file_chooser_add_filters(GtkWidget * chooser, FileTypes * filters) -{ - GtkFileFilter *filter; - gint i; - - for (i = 0; filters[i].name; i++) { - filter = gtk_file_filter_new(); - gtk_file_filter_add_mime_type(filter, filters[i].mime_type); - gtk_file_filter_set_name(filter, filters[i].name); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter); - } -} - -gchar *file_chooser_get_extension(GtkWidget * chooser, FileTypes * filters) -{ - GtkFileFilter *filter; - const gchar *filter_name; - gint i; - - filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(chooser)); - filter_name = gtk_file_filter_get_name(filter); - for (i = 0; filters[i].name; i++) { - if (g_str_equal(filter_name, filters[i].name)) { - return filters[i].extension; - } - } - - return NULL; -} - -gpointer file_types_get_data_by_name(FileTypes * filters, gchar * filename) -{ - gint i; - - for (i = 0; filters[i].name; i++) { - if (g_str_has_suffix(filename, filters[i].extension)) { - return filters[i].data; - } - } - - return NULL; -} - -gchar *file_chooser_build_filename(GtkWidget * chooser, gchar * extension) -{ - gchar *filename = - gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); - gchar *retval; - - if (g_str_has_suffix(filename, extension)) { - return filename; - } - - retval = g_strconcat(filename, extension, NULL); - g_free(filename); - - return retval; -} - -gboolean binreloc_init(gboolean try_hardcoded) -{ - GError *error = NULL; - gchar *tmp; - - DEBUG("initializing binreloc (hardcoded = %d)", try_hardcoded); - - /* If the runtime data directories we previously found, don't even try - to find them again. */ - if (params.path_data && params.path_lib) { - DEBUG("data and lib path already found."); - return TRUE; - } - - if (try_hardcoded || !gbr_init(&error)) { - /* We were asked to try hardcoded paths or BinReloc failed to initialize. */ - params.path_data = g_strdup(PREFIX); - params.path_lib = g_strdup(LIBPREFIX); - - if (error) { - g_error_free(error); - } - - DEBUG("%strying hardcoded paths.", - try_hardcoded ? "" : "binreloc init failed. "); - } else { - /* If we were able to initialize BinReloc, build the default data - and library paths. */ - DEBUG("done, trying to use binreloc paths."); - - tmp = gbr_find_data_dir(PREFIX); - params.path_data = g_build_filename(tmp, "hardinfo", NULL); - g_free(tmp); - - tmp = gbr_find_lib_dir(PREFIX); - params.path_lib = g_build_filename(tmp, "hardinfo", NULL); - g_free(tmp); - } - - DEBUG("searching for runtime data on these locations:"); - DEBUG(" lib: %s", params.path_lib); - DEBUG(" data: %s", params.path_data); - - /* Try to see if the uidefs.xml file isn't missing. This isn't the - definitive test, but it should do okay for most situations. */ - tmp = g_build_filename(params.path_data, "benchmark.data", NULL); - if (!g_file_test(tmp, G_FILE_TEST_EXISTS)) { - DEBUG("runtime data not found"); - - g_free(params.path_data); - g_free(params.path_lib); - g_free(tmp); - - params.path_data = params.path_lib = NULL; - - if (try_hardcoded) { - /* We tried the hardcoded paths, but still was unable to find the - runtime data. Give up. */ - DEBUG("giving up"); - return FALSE; - } else { - /* Even though BinReloc worked OK, the runtime data was not found. - Try the hardcoded paths. */ - DEBUG("trying to find elsewhere"); - return binreloc_init(TRUE); - } - } - g_free(tmp); - - DEBUG("runtime data found!"); - /* We found the runtime data; hope everything is fine */ - return TRUE; -} - -static void -log_handler(const gchar * log_domain, - GLogLevelFlags log_level, - const gchar * message, gpointer user_data) -{ - if (!params.gui_running) { - /* No GUI running: spit the message to the terminal */ - g_print("\n\n*** %s: %s\n\n", - (log_level & G_LOG_FLAG_FATAL) ? "Error" : "Warning", - message); - } else { - /* Hooray! We have a GUI running! */ - GtkWidget *dialog; - - dialog = gtk_message_dialog_new_with_markup(NULL, GTK_DIALOG_MODAL, - (log_level & - G_LOG_FLAG_FATAL) ? - GTK_MESSAGE_ERROR : - GTK_MESSAGE_WARNING, - GTK_BUTTONS_CLOSE, - "%s\n\n%s", - (log_level & - G_LOG_FLAG_FATAL) ? - "Fatal Error" : - "Warning", message); - - gtk_dialog_run(GTK_DIALOG(dialog)); - gtk_widget_destroy(dialog); - } -} - -void parameters_init(int *argc, char ***argv, ProgramParameters * param) -{ - static gboolean create_report = FALSE; - static gboolean show_version = FALSE; - static gboolean list_modules = FALSE; - static gboolean autoload_deps = FALSE; - static gchar *report_format = NULL; - static gchar **use_modules = NULL; - - static GOptionEntry options[] = { - { - .long_name = "generate-report", - .short_name = 'r', - .arg = G_OPTION_ARG_NONE, - .arg_data = &create_report, - .description = "creates a report and prints to standard output"}, - { - .long_name = "report-format", - .short_name = 'f', - .arg = G_OPTION_ARG_STRING, - .arg_data = &report_format, - .description = "chooses a report format (text, html)"}, - { - .long_name = "list-modules", - .short_name = 'l', - .arg = G_OPTION_ARG_NONE, - .arg_data = &list_modules, - .description = "lists modules"}, - { - .long_name = "load-module", - .short_name = 'm', - .arg = G_OPTION_ARG_STRING_ARRAY, - .arg_data = &use_modules, - .description = "specify module to load"}, - { - .long_name = "autoload-deps", - .short_name = 'a', - .arg = G_OPTION_ARG_NONE, - .arg_data = &autoload_deps, - .description = "automatically load module dependencies"}, - { - .long_name = "version", - .short_name = 'v', - .arg = G_OPTION_ARG_NONE, - .arg_data = &show_version, - .description = "shows program version and quit"}, - {NULL} - }; - GOptionContext *ctx; - - ctx = g_option_context_new("- System Profiler and Benchmark tool"); - g_option_context_set_ignore_unknown_options(ctx, FALSE); - g_option_context_set_help_enabled(ctx, TRUE); - - g_option_context_add_main_entries(ctx, options, *(argv)[0]); - g_option_context_parse(ctx, argc, argv, NULL); - - g_option_context_free(ctx); - - if (*argc >= 2) { - g_print("Unrecognized arguments.\n" - "Try ``%s --help'' for more information.\n", *(argv)[0]); - exit(1); - } - - param->create_report = create_report; - param->report_format = REPORT_FORMAT_TEXT; - param->show_version = show_version; - param->list_modules = list_modules; - param->use_modules = use_modules; - param->autoload_deps = autoload_deps; - param->argv0 = *(argv)[0]; - - if (report_format && g_str_equal(report_format, "html")) - param->report_format = REPORT_FORMAT_HTML; - - gchar *confdir = g_build_filename(g_get_home_dir(), ".hardinfo", NULL); - if (!g_file_test(confdir, G_FILE_TEST_EXISTS)) { - mkdir(confdir, 0744); - } - g_free(confdir); -} - -gboolean ui_init(int *argc, char ***argv) -{ - DEBUG("initializing gtk+ UI"); - - g_set_application_name("HardInfo"); - g_log_set_handler(NULL, - G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL | - G_LOG_LEVEL_ERROR, log_handler, NULL); - - return gtk_init_check(argc, argv); -} - -void open_url(gchar * url) -{ - const gchar *browsers[] = { - "xdg-open", "gnome-open", "kfmclient openURL", - "sensible-browser", "firefox", "epiphany", - "iceweasel", "seamonkey", "galeon", "mozilla", - "opera", "konqueror", "netscape", "links -g", - NULL - }; - gint i = 0; - gchar *browser = (gchar *)g_getenv("BROWSER"); - - if (!browser || *browser == '\0') { - browser = (gchar *)browsers[i++]; - } - - do { - gchar *cmdline = g_strdup_printf("%s '%s'", browser, url); - - if (g_spawn_command_line_async(cmdline, NULL)) { - g_free(cmdline); - return; - } - - g_free(cmdline); - - browser = (gchar *)browsers[i++]; - } while (browser); - - g_warning("Couldn't find a Web browser to open URL %s.", url); -} - -/* Copyright: Jens Låås, SLU 2002 */ -gchar *strreplace(gchar * string, gchar * replace, gchar new_char) -{ - gchar *s; - for (s = string; *s; s++) - if (strchr(replace, *s)) - *s = new_char; - - return string; -} - -static GHashTable *__module_methods = NULL; - -static void module_register_methods(ShellModule * module) -{ - ShellModuleMethod *(*get_methods) (void); - gchar *method_name; - - if (__module_methods == NULL) { - __module_methods = g_hash_table_new(g_str_hash, g_str_equal); - } - - if (g_module_symbol - (module->dll, "hi_exported_methods", (gpointer) & get_methods)) { - ShellModuleMethod *methods; - - for (methods = get_methods(); methods->name; methods++) { - ShellModuleMethod method = *methods; - gchar *name = g_path_get_basename(g_module_name(module->dll)); - - strend(name, '.'); - - method_name = g_strdup_printf("%s::%s", name, method.name); - g_hash_table_insert(__module_methods, method_name, - method.function); - g_free(name); - } - } - -} - -gchar *module_call_method(gchar * method) -{ - gchar *(*function) (void); - - if (__module_methods == NULL) { - return NULL; - } - - function = g_hash_table_lookup(__module_methods, method); - return function ? g_strdup(function()) : - g_strdup_printf("{Unknown method: \"%s\"}", method); -} - -/* FIXME: varargs? */ -gchar *module_call_method_param(gchar * method, gchar * parameter) -{ - gchar *(*function) (gchar *param); - - if (__module_methods == NULL) { - return NULL; - } - - function = g_hash_table_lookup(__module_methods, method); - return function ? g_strdup(function(parameter)) : - g_strdup_printf("{Unknown method: \"%s\"}", method); -} - -static ShellModule *module_load(gchar * filename) -{ - ShellModule *module; - gchar *tmp; - - module = g_new0(ShellModule, 1); - - if (params.gui_running) { - gchar *tmpicon; - - tmpicon = g_strdup(filename); - gchar *dot = g_strrstr(tmpicon, "." G_MODULE_SUFFIX); - - *dot = '\0'; - - tmp = g_strdup_printf("%s.png", tmpicon); - module->icon = icon_cache_get_pixbuf(tmp); - - g_free(tmp); - g_free(tmpicon); - } - - tmp = g_build_filename(params.path_lib, "modules", filename, NULL); - module->dll = g_module_open(tmp, G_MODULE_BIND_LAZY); - g_free(tmp); - - if (module->dll) { - void (*init) (void); - ModuleEntry *(*get_module_entries) (void); - gint(*weight_func) (void); - gchar *(*name_func) (void); - ModuleEntry *entries; - gint i = 0; - - if (!g_module_symbol - (module->dll, "hi_module_get_entries", - (gpointer) & get_module_entries) - || !g_module_symbol(module->dll, "hi_module_get_name", - (gpointer) & name_func)) { - goto failed; - } - - if (g_module_symbol - (module->dll, "hi_module_init", (gpointer) & init)) { - init(); - } - - g_module_symbol(module->dll, "hi_module_get_weight", - (gpointer) & weight_func); - - module->weight = weight_func ? weight_func() : 0; - module->name = name_func(); - - entries = get_module_entries(); - while (entries[i].name) { - ShellModuleEntry *entry = g_new0(ShellModuleEntry, 1); - - if (params.gui_running) { - entry->icon = icon_cache_get_pixbuf(entries[i].icon); - } - - g_module_symbol(module->dll, "hi_more_info", - (gpointer) & (entry->morefunc)); - g_module_symbol(module->dll, "hi_get_field", - (gpointer) & (entry->fieldfunc)); - g_module_symbol(module->dll, "hi_note_func", - (gpointer) & (entry->notefunc)); - - entry->name = entries[i].name; - entry->scan_func = entries[i].scan_callback; - entry->func = entries[i].callback; - entry->number = i; - - module->entries = g_slist_append(module->entries, entry); - - i++; - } - - module_register_methods(module); - } else { - failed: - DEBUG("loading module %s failed", filename); - - g_free(module->name); - g_free(module); - module = NULL; - } - - return module; -} - -static gboolean module_in_module_list(gchar * module, gchar ** module_list) -{ - int i = 0; - - if (!module_list) - return TRUE; - - for (; module_list[i]; i++) { - if (g_str_equal(module_list[i], module)) - return TRUE; - } - - return FALSE; -} - -static gint module_cmp(gconstpointer m1, gconstpointer m2) -{ - ShellModule *a = (ShellModule *) m1; - ShellModule *b = (ShellModule *) m2; - - return a->weight - b->weight; -} - -static void module_entry_free(gpointer data, gpointer user_data) -{ - ShellModuleEntry *entry = (ShellModuleEntry *) data; - - if (entry) { - g_free(entry->name); - g_object_unref(entry->icon); - - g_free(entry); - } -} - -void module_free(ShellModule * module) -{ - g_free(module->name); - g_object_unref(module->icon); - g_module_close(module->dll); - - DEBUG("module_free: module->entries, %p\n", module->entries); - g_slist_foreach(module->entries, (GFunc) module_entry_free, NULL); - g_slist_free(module->entries); - - g_free(module); -} - -ModuleAbout *module_get_about(ShellModule * module) -{ - ModuleAbout *(*get_about) (void); - - if (g_module_symbol(module->dll, "hi_module_get_about", - (gpointer) & get_about)) { - return get_about(); - } - - return NULL; -} - -static GSList *modules_check_deps(GSList * modules) -{ - GSList *mm; - ShellModule *module; - - for (mm = modules; mm; mm = mm->next) { - gchar **(*get_deps) (void); - gchar **deps; - gint i; - - module = (ShellModule *) mm->data; - - if (g_module_symbol(module->dll, "hi_module_get_dependencies", - (gpointer) & get_deps)) { - for (i = 0, deps = get_deps(); deps[i]; i++) { - GSList *l; - ShellModule *m; - gboolean found = FALSE; - - for (l = modules; l && !found; l = l->next) { - m = (ShellModule *) l->data; - gchar *name = g_path_get_basename(g_module_name(m->dll)); - - found = g_str_equal(name, deps[i]); - g_free(name); - } - - if (!found) { - if (params.autoload_deps) { - ShellModule *mod = module_load(deps[i]); - - if (mod) - modules = g_slist_append(modules, mod); - modules = modules_check_deps(modules); /* re-check dependencies */ - - break; - } - - if (params.gui_running) { - GtkWidget *dialog; - - dialog = gtk_message_dialog_new(NULL, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, - "Module \"%s\" depends on module \"%s\", load it?", - module->name, - deps[i]); - gtk_dialog_add_buttons(GTK_DIALOG(dialog), - GTK_STOCK_NO, - GTK_RESPONSE_REJECT, - GTK_STOCK_OPEN, - GTK_RESPONSE_ACCEPT, NULL); - - if (gtk_dialog_run(GTK_DIALOG(dialog)) == - GTK_RESPONSE_ACCEPT) { - ShellModule *mod = module_load(deps[i]); - - if (mod) - modules = g_slist_prepend(modules, mod); - modules = modules_check_deps(modules); /* re-check dependencies */ - } else { - g_error("HardInfo cannot run without loading the additional module."); - exit(1); - } - - gtk_widget_destroy(dialog); - } else { - g_error("Module \"%s\" depends on module \"%s\".", - module->name, deps[i]); - } - } - } - } - } - - return modules; -} - -static GSList *modules_load(gchar ** module_list) -{ - GDir *dir; - GSList *modules = NULL; - ShellModule *module; - gchar *filename; - - filename = g_build_filename(params.path_lib, "modules", NULL); - dir = g_dir_open(filename, 0, NULL); - g_free(filename); - - if (dir) { - while ((filename = (gchar *) g_dir_read_name(dir))) { - if (g_strrstr(filename, "." G_MODULE_SUFFIX) && - module_in_module_list(filename, module_list) && - ((module = module_load(filename)))) { - modules = g_slist_prepend(modules, module); - } - } - - g_dir_close(dir); - } - - modules = modules_check_deps(modules); - - if (g_slist_length(modules) == 0) { - if (params.use_modules == NULL) { - g_error - ("No module could be loaded. Check permissions on \"%s\" and try again.", - params.path_lib); - } else { - g_error - ("No module could be loaded. Please use hardinfo -l to list all avai" - "lable modules and try again with a valid module list."); - - } - } - - return g_slist_sort(modules, module_cmp); -} - -GSList *modules_load_selected(void) -{ - return modules_load(params.use_modules); -} - -GSList *modules_load_all(void) -{ - return modules_load(NULL); -} - -gint tree_view_get_visible_height(GtkTreeView * tv) -{ - GtkTreePath *path; - GdkRectangle rect; - GtkTreeIter iter; - GtkTreeModel *model = gtk_tree_view_get_model(tv); - gint nrows = 1; - - path = gtk_tree_path_new_first(); - gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tv), path, NULL, &rect); - - /* FIXME: isn't there any easier way to tell the number of rows? */ - gtk_tree_model_get_iter_first(model, &iter); - do { - nrows++; - } while (gtk_tree_model_iter_next(model, &iter)); - - gtk_tree_path_free(path); - - return nrows * rect.height; -} - -void tree_view_save_image(gchar * filename) -{ - /* this is ridiculously complicated :/ why in the hell gtk+ makes this kind of - thing so difficult? */ - - /* FIXME: this does not work if the window (or part of it) isn't visible. does - anyone know how to fix this? :/ */ - Shell *shell = shell_get_main_shell(); - GtkWidget *widget = shell->info->view; - - PangoLayout *layout; - PangoContext *context; - PangoRectangle rect; - - GdkPixmap *pm; - GdkPixbuf *pb; - GdkGC *gc; - GdkColor black = { 0, 0, 0, 0 }; - GdkColor white = { 0, 65535, 65535, 65535 }; - - gint w, h, visible_height; - gchar *tmp; - - gboolean tv_enabled; - - /* present the window */ - gtk_window_present(GTK_WINDOW(shell->window)); - - /* if the treeview is disabled, we need to enable it so we get the - correct colors when saving. we make it insensitive later on if it - was this way before entering this function */ - tv_enabled = GTK_WIDGET_IS_SENSITIVE(widget); - gtk_widget_set_sensitive(widget, TRUE); - - gtk_widget_queue_draw(widget); - - /* unselect things in the information treeview */ - gtk_range_set_value(GTK_RANGE - (GTK_SCROLLED_WINDOW(shell->info->scroll)-> - vscrollbar), 0.0); - gtk_tree_selection_unselect_all(gtk_tree_view_get_selection - (GTK_TREE_VIEW(widget))); - while (gtk_events_pending()) - gtk_main_iteration(); - - /* initialize stuff */ - gc = gdk_gc_new(widget->window); - gdk_gc_set_background(gc, &black); - gdk_gc_set_foreground(gc, &white); - - context = gtk_widget_get_pango_context(widget); - layout = pango_layout_new(context); - - visible_height = tree_view_get_visible_height(GTK_TREE_VIEW(widget)); - - /* draw the title */ - tmp = g_strdup_printf("%s\n%s", - shell->selected->name, - shell->selected->notefunc(shell->selected-> - number)); - pango_layout_set_markup(layout, tmp, -1); - pango_layout_set_width(layout, widget->allocation.width * PANGO_SCALE); - pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); - pango_layout_get_pixel_extents(layout, NULL, &rect); - - w = widget->allocation.width; - h = visible_height + rect.height; - - pm = gdk_pixmap_new(widget->window, w, rect.height, -1); - gdk_draw_rectangle(GDK_DRAWABLE(pm), gc, TRUE, 0, 0, w, rect.height); - gdk_draw_layout_with_colors(GDK_DRAWABLE(pm), gc, 0, 0, layout, - &white, &black); - - /* copy the pixmap from the treeview and from the title */ - pb = gdk_pixbuf_get_from_drawable(NULL, - widget->window, - NULL, 0, 0, 0, 0, w, h); - pb = gdk_pixbuf_get_from_drawable(pb, - pm, - NULL, - 0, 0, - 0, visible_height, w, rect.height); - - /* save the pixbuf to a png file */ - gdk_pixbuf_save(pb, filename, "png", NULL, - "compression", "9", - "tEXt::hardinfo::version", VERSION, - "tEXt::hardinfo::arch", ARCH, NULL); - - /* unref */ - g_object_unref(pb); - g_object_unref(layout); - g_object_unref(pm); - g_object_unref(gc); - g_free(tmp); - - gtk_widget_set_sensitive(widget, tv_enabled); -} - -static gboolean __idle_free_do(gpointer ptr) -{ - if (ptr) { - g_free(ptr); - } - - return FALSE; -} - -#if RELEASE == 1 -gpointer idle_free(gpointer ptr) -#else -gpointer __idle_free(gpointer ptr, gchar * f, gint l) -#endif -{ - DEBUG("file: %s, line: %d, ptr %p", f, l, ptr); - - if (ptr) { - g_timeout_add(10000, __idle_free_do, ptr); - } - - return ptr; -} - -void module_entry_scan_all_except(ModuleEntry * entries, gint except_entry) -{ - ModuleEntry entry; - gint i = 0; - void (*scan_callback) (gboolean reload); - gchar *text; - - shell_view_set_enabled(FALSE); - - for (entry = entries[0]; entry.name; entry = entries[++i]) { - if (i == except_entry) - continue; - - text = g_strdup_printf("Scanning: %s...", entry.name); - shell_status_update(text); - g_free(text); - - if ((scan_callback = entry.scan_callback)) { - scan_callback(FALSE); - } - } - - shell_view_set_enabled(TRUE); - shell_status_update("Done."); -} - -void module_entry_scan_all(ModuleEntry * entries) -{ - module_entry_scan_all_except(entries, -1); -} - -void module_entry_reload(ShellModuleEntry * module_entry) -{ - if (module_entry->scan_func) { - module_entry->scan_func(TRUE); - } -} - -void module_entry_scan(ShellModuleEntry * module_entry) -{ - if (module_entry->scan_func) { - module_entry->scan_func(FALSE); - } -} - -gchar *module_entry_function(ShellModuleEntry * module_entry) -{ - if (module_entry->func) { - return g_strdup(module_entry->func()); - } - - return g_strdup("[Error]\n" "Invalid module="); -} - -const gchar *module_entry_get_note(ShellModuleEntry * module_entry) -{ - return module_entry->notefunc(module_entry->number); -} - -gchar *h_strdup_cprintf(const gchar * format, gchar * source, ...) -{ - gchar *buffer, *retn; - va_list args; - - va_start(args, source); - buffer = g_strdup_vprintf(format, args); - va_end(args); - - if (source) { - retn = g_strconcat(source, buffer, NULL); - g_free(buffer); - g_free(source); - } else { - retn = buffer; - } - - return retn; -} - -gchar *h_strconcat(gchar * string1, ...) -{ - gsize l; - va_list args; - gchar *s; - gchar *concat; - gchar *ptr; - - if (!string1) - return NULL; - - l = 1 + strlen(string1); - va_start(args, string1); - s = va_arg(args, gchar *); - while (s) { - l += strlen(s); - s = va_arg(args, gchar *); - } - va_end(args); - - concat = g_new(gchar, l); - ptr = concat; - - ptr = g_stpcpy(ptr, string1); - va_start(args, string1); - s = va_arg(args, gchar *); - while (s) { - ptr = g_stpcpy(ptr, s); - s = va_arg(args, gchar *); - } - va_end(args); - - g_free(string1); - - return concat; -} - -static gboolean h_hash_table_remove_all_true(gpointer key, gpointer data, gpointer user_data) -{ - return TRUE; -} - -void -h_hash_table_remove_all(GHashTable *hash_table) -{ - g_hash_table_foreach_remove(hash_table, - h_hash_table_remove_all_true, - NULL); -} - -gfloat -h_sysfs_read_float(gchar *endpoint, gchar *entry) -{ - gchar *tmp, *buffer; - gfloat return_value = 0.0f; - - tmp = g_build_filename(endpoint, entry, NULL); - if (g_file_get_contents(tmp, &buffer, NULL, NULL)) - return_value = atof(buffer); - - g_free(tmp); - g_free(buffer); - - return return_value; -} - -gint -h_sysfs_read_int(gchar *endpoint, gchar *entry) -{ - gchar *tmp, *buffer; - gint return_value = 0; - - tmp = g_build_filename(endpoint, entry, NULL); - if (g_file_get_contents(tmp, &buffer, NULL, NULL)) - return_value = atoi(buffer); - - g_free(tmp); - g_free(buffer); - - return return_value; -} - -gchar * -h_sysfs_read_string(gchar *endpoint, gchar *entry) -{ - gchar *tmp, *return_value; - - tmp = g_build_filename(endpoint, entry, NULL); - if (!g_file_get_contents(tmp, &return_value, NULL, NULL)) { - g_free(return_value); - - return_value = NULL; - } else { - return_value = g_strstrip(return_value); - } - - g_free(tmp); - - return return_value; -} - diff --git a/vendor.c b/vendor.c deleted file mode 100644 index 0897341a..00000000 --- a/vendor.c +++ /dev/null @@ -1,193 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2009 Leandro A. F. Pereira - * - * List of vendors based on GtkSysInfo (c) Pissens Sebastien. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include - -#include "vendor.h" -#include "syncmanager.h" -#include "config.h" -#include "hardinfo.h" - -static const Vendor vendors[] = { - {"ATI", "ATI Technologies", "www.ati.com"}, - {"nVidia", "NVIDIA", "www.nvidia.com"}, - {"3Com", "3Com", "www.3com.com"}, - {"Intel", "Intel", "www.intel.com"}, - {"Cirrus Logic", "Cirrus Logic", "www.cirrus.com"}, - {"VIA Technologies", "VIA Technologies", "www.via.com.tw"}, - {"VIA", "VIA Technologies", "www.via.com.tw"}, - {"hp", "Hewlett-Packard", "www.hp.com"}, - {"NEC Corporation", "NEC Coporation", "www.nec.com"}, - {"MAXTOR", "MAXTOR", "www.maxtor.com"}, - {"SAMSUNG", "SAMSUNG", "www.samsung.com"}, - {"PIONEER", "PIONEER", "www.pioneer-eur.com"}, - {"PLEXTOR", "PLEXTOR", "www.plextor.be"}, - {"Realtek Semiconductor", "Realtek", "www.realtek.com.tw"}, - {"TOSHIBA", "TOSHIBA", "www.toshiba.com"}, - {"LITE-ON", "LITE-ON", "www.liteonit.com"}, - {"WDC", "Western Digital", "www.wdc.com"}, - {"HL-DT-ST", "LG Electronics", "www.lge.com"}, - {"ST", "SEAGATE", "www.seagate.com"}, - {"Lexmark", "Lexmark", "www.lexmark.com"}, - {"_NEC", "NEC Corporation", "www.nec.com"}, - {"Creative Labs", "Creative Labs", "www.creative.com"}, - {"Brooktree", "Conexant", "www.brooktree.com"}, - {"Atheros", "Atheros Communications", "www.atheros.com"}, - {"MATSHITA", "Panasonic", "www.panasonic.com"}, - {"Silicon Image", "Silicon Image", "www.siliconimage.com"}, - {"Silicon Integrated Image", "Silicon Image", "www.siliconimage.com"}, - {"KYE", "KYE Systems", "www.genius-kye.com"}, - {"Broadcom", "Broadcom", "www.broadcom.com"}, - {"Apple", "Apple", "www.apple.com"}, - {"IBM", "IBM", "www.ibm.com"}, - {"Dell", "Dell Computer", "www.dell.com"}, - {"Logitech", "Logitech International", "www.logitech.com"}, - {"FUJITSU", "Fujitsu", "www.fujitsu.com"}, - {"CDU", "Sony", "www.sony.com"}, - {"SanDisk", "SanDisk", "www.sandisk.com"}, - {"ExcelStor", "ExcelStor Technology", "www.excelstor.com"}, - {"D-Link", "D-Link", "www.dlink.com.tw"}, - {"Giga-byte", "Gigabyte Technology", "www.gigabyte.com.tw"}, - {"Gigabyte", "Gigabyte Technology", "www.gigabyte.com.tw"}, - {"C-Media", "C-Media Electronics", "www.cmedia.com.tw"}, - {"Avermedia", "AVerMedia Technologies", "www.aver.com"}, - {"Philips", "Philips", "www.philips.com"}, - {"RaLink", "Ralink Technology", "www.ralinktech.com"}, - {"Siemens", "Siemens AG", "www.siemens.com"}, - {"HP", "Hewlett-Packard", "www.hp.com"}, - {"Hewlett-Packard", "Hewlett-Packard", "www.hp.com"}, - {"TEAC", "TEAC America", "www.teac.com"}, - {"Microsoft", "Microsoft", "www.microsoft.com"}, - {"Memorex", "Memorex Products", "www.memorex.com"}, - {"eMPIA", "eMPIA Technology", "www.empiatech.com.tw"}, - {"Canon", "Canon", "www.canon.com"}, - {"A4Tech", "A4tech", "www.a4tech.com"}, - {"ALCOR", "Alcor", "www.alcor.org"}, - {"Vimicro", "Vimicro", "www.vimicro.com"}, - {"OTi", "Ours Technology", "www.oti.com.tw"}, - {"BENQ", "BenQ", "www.benq.com"}, - {"Acer", "Acer", "www.acer.com"}, - /* BIOS manufacturers */ - {"American Megatrends", "American Megatrends", "www.ami.com"}, - {"Award", "Award Software International", "www.award-bios.com"}, - {"Phoenix", "Phoenix Technologies", "www.phoenix.com"}, -}; - -static GSList *vendor_list = NULL; - -void vendor_init(void) -{ - gint i; - gchar *path; - static SyncEntry se = { - .fancy_name = "Update vendor list", - .name = "RecvVendorList", - .save_to = "vendor.conf", - .get_data = NULL - }; - - DEBUG("initializing vendor list"); - sync_manager_add_entry(&se); - - path = g_build_filename(g_get_home_dir(), ".hardinfo", "vendor.conf", NULL); - if (!g_file_test(path, G_FILE_TEST_EXISTS)) { - DEBUG("local vendor.conf not found, trying system-wise"); - g_free(path); - path = g_build_filename(params.path_data, "vendor.conf", NULL); - } - - if (g_file_test(path, G_FILE_TEST_EXISTS)) { - GKeyFile *vendors; - gchar *tmp; - gint num_vendors; - - DEBUG("loading %s", path); - - vendors = g_key_file_new(); - if (g_key_file_load_from_file(vendors, path, 0, NULL)) { - num_vendors = g_key_file_get_integer(vendors, "vendors", "number", NULL); - - for (i = num_vendors - 1; i >= 0; i--) { - Vendor *v = g_new0(Vendor, 1); - - tmp = g_strdup_printf("vendor%d", i); - - v->id = g_key_file_get_string(vendors, tmp, "id", NULL); - v->name = g_key_file_get_string(vendors, tmp, "name", NULL); - v->url = g_key_file_get_string(vendors, tmp, "url", NULL); - - vendor_list = g_slist_prepend(vendor_list, v); - - g_free(tmp); - } - } - - g_key_file_free(vendors); - } else { - DEBUG("system-wise vendor.conf not found, using internal database"); - - for (i = G_N_ELEMENTS(vendors) - 1; i >= 0; i--) { - vendor_list = g_slist_prepend(vendor_list, (gpointer) &vendors[i]); - } - } - - g_free(path); -} - -const gchar *vendor_get_name(const gchar * id) -{ - GSList *vendor; - int i; - - if (!id) { - return NULL; - } - - for (vendor = vendor_list; vendor; vendor = vendor->next) { - Vendor *v = (Vendor *)vendor->data; - - if (v && v->id && strstr(id, v->id)) { - return g_strdup(v->name); - } - } - - return id; -} - -const gchar *vendor_get_url(const gchar * id) -{ - GSList *vendor; - int i; - - if (!id) { - return NULL; - } - - for (vendor = vendor_list; vendor; vendor = vendor->next) { - Vendor *v = (Vendor *)vendor->data; - - if (v && v->id && strstr(id, v->id)) { - return g_strdup(v->url); - } - } - - return NULL; -} diff --git a/vendor.h b/vendor.h deleted file mode 100644 index 778e2ea3..00000000 --- a/vendor.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef __VENDOR_H__ -#define __VENDOR_H__ - -typedef struct _Vendor Vendor; -struct _Vendor { - char *id; - char *name; - char *url; -}; - -void vendor_init(void); -const gchar *vendor_get_name(const gchar *id); -const gchar *vendor_get_url(const gchar *id); - -#endif /* __VENDOR_H__ */ -- cgit v1.2.3
%s
%s
%s%s
%s%s