aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeandro A. F. Pereira <leandro@hardinfo.org>2019-08-10 16:48:51 -0700
committerGitHub <noreply@github.com>2019-08-10 16:48:51 -0700
commitb9157b3f6520f46e788157fbfe9753b209efe9b7 (patch)
tree80d72e25837f3b569734ba476df84d3462617e29
parent7db082583f72598e2118553faf1ba3206d7c3ee7 (diff)
parent4827b88fa34807425640d2a9f07bbf4ac4119ab3 (diff)
Merge branch 'master' into usb3
-rw-r--r--CMakeLists.txt6
-rw-r--r--data/benchmark.conf4
-rw-r--r--deps/sysobj_early/data/arm.ids133
-rw-r--r--deps/sysobj_early/data/sdcard.ids2
-rw-r--r--deps/sysobj_early/data/vendor.ids (renamed from data/vendor.ids)161
-rw-r--r--deps/sysobj_early/include/appf.h40
-rw-r--r--deps/sysobj_early/include/auto_free.h19
-rw-r--r--deps/sysobj_early/include/nice_name.h32
-rw-r--r--deps/sysobj_early/include/util_sysobj.h53
-rw-r--r--deps/sysobj_early/src/appf.c63
-rw-r--r--deps/sysobj_early/src/auto_free.c61
-rw-r--r--deps/sysobj_early/src/nice_name.c157
-rw-r--r--deps/sysobj_early/src/util_sysobj.c303
-rw-r--r--hardinfo/dt_util.c30
-rw-r--r--hardinfo/gg_key_file_parse_string_as_value.c109
-rw-r--r--hardinfo/gpu_util.c18
-rw-r--r--hardinfo/info.c13
-rw-r--r--hardinfo/udisks2_util.c2
-rw-r--r--hardinfo/vendor.c19
-rw-r--r--includes/dt_util.h6
-rw-r--r--modules/benchmark.c3
-rw-r--r--modules/computer/ubuntu_flavors.c6
-rw-r--r--modules/devices/arm/arm_data.c112
-rw-r--r--modules/devices/arm/arm_data.h5
-rw-r--r--modules/devices/arm/processor.c11
-rw-r--r--modules/devices/devicetree.c5
-rw-r--r--modules/devices/dmi_memory.c25
-rw-r--r--modules/devices/x86/processor.c6
-rw-r--r--shell/shell.c106
29 files changed, 1277 insertions, 233 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 875041d0..ef4f8a9f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -120,9 +120,10 @@ set(HARDINFO_MODULES
set(HARDINFO_RESOURCES
"data/benchmark.conf"
"data/benchmark.data"
- "data/vendor.ids"
+ "deps/sysobj_early/data/vendor.ids"
"deps/sysobj_early/data/sdcard.ids"
"deps/sysobj_early/data/usb.ids"
+ "deps/sysobj_early/data/arm.ids"
)
set(HARDINFO_MANPAGES
@@ -221,6 +222,9 @@ add_library(sysobj_early STATIC
deps/sysobj_early/src/strstr_word.c
deps/sysobj_early/src/auto_free.c
deps/sysobj_early/src/util_ids.c
+ deps/sysobj_early/src/util_sysobj.c
+ deps/sysobj_early/src/appf.c
+ deps/sysobj_early/src/nice_name.c
deps/sysobj_early/gui/uri_handler.c
)
set_target_properties(sysobj_early PROPERTIES COMPILE_FLAGS "-std=c99 -Wall -Wextra -Wno-parentheses -Wno-unused-function")
diff --git a/data/benchmark.conf b/data/benchmark.conf
index 87bda07a..5f28cca5 100644
--- a/data/benchmark.conf
+++ b/data/benchmark.conf
@@ -322,6 +322,7 @@ PowerPC 740/750=58.07682|280.00 MHz|Unknown
Raspberry_Pi_Model_B_Rev_1;Broadcom_BCM2835;900_00=0.550000; 7.000921; 1; 2|1|Raspberry Pi Model B Rev 1|Broadcom BCM2835|1x ARM ARM1176 r0p7 (AArch32)|1x 900.00 MHz|233612|1|1|1||Broadcom VideoCore IV
ASUS_PRIME_B350_PLUS;AMD_Ryzen_5_1600_Six_Core_Processor;38400_00=97.400000; 7.000335; 12; 2|12|ASUS PRIME B350-PLUS|AMD Ryzen 5 1600 Six-Core Processor|1 physical processor; 6 cores; 12 threads|12x 3200.00 MHz|16423392|1|6|12|Radeon RX 560 Series (POLARIS11, DRM 3.26.0, 4.18.0-10-generic, LLVM 7.0.0)|AMD/ATI Baffin
HP_18E7_(HP_ProDesk_600_G1_SFF);Intel(R)_Core(TM)_i5_4570_CPU___3_20GHz;14400_00=49.490000; 7.000286; 4; 2|4|HP 18E7 (HP ProDesk 600 G1 SFF)|Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz|1 physical processor; 4 cores; 4 threads|4x 3600.00 MHz|8075460|1|4|4|Mesa DRI Intel(R) Haswell Desktop|Intel Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
+Raspberry_Pi_4_Model_B_Rev_1_1;Broadcom_BCM2838;6000_00=12.300000; 7.000401; 4; 2; zlib 1.2.11 (built against: 1.2.11)|4|Raspberry Pi 4 Model B Rev 1.1|Broadcom BCM2838|4x ARM Cortex-A72 r0p3 (AArch32)|4x 1500.00 MHz|3999788|1|4|4|llvmpipe (LLVM 6.0, 128 bits)|Broadcom VideoCore IV
[GPU Drawing]
@@ -335,6 +336,7 @@ Raspberry_Pi_3_Model_B_Plus_Rev_1_3;Broadcom_BCM2837;5600_00 = 3.130000; 7.00043
Firefly_ROC_RK3328_CC;Rockchip_RK3328;5568_00 = 2.580000; 7.000278; 1|1|Firefly ROC-RK3328-CC|Rockchip RK3328|4x ARM Cortex-A53 r0p4 (AArch64)|4x 1392.00 MHz|946208|1|4|4||ARM Mali 450
Hewlett_Packard_18E7_(HP_ProDesk_600_G1_SFF);Intel(R)_Core(TM)_i5_4570_CPU___3_20GHz;14400_00=11.060000; 7.000100; 1|1|Hewlett-Packard 18E7 (HP ProDesk 600 G1 SFF)|Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz|1 physical processor; 4 cores; 4 threads|4x 3600.00 MHz|8078144|1|4|4||Intel Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
Dell_Computer_0U1426_A00_(PowerEdge_1650);Intel(R)_Pentium(R)_III_CPU___S_________1400MHz;2781_40=4.510000; 7.000350; 1|1|Dell Computer 0U1426 A00 (PowerEdge 1650)|Intel(R) Pentium(R) III CPU - S 1400MHz|2 physical processors; 2 cores; 2 threads|2x 1390.70 MHz|1547816|2|2|2||AMD/ATI Rage XL PCI
+Raspberry_Pi_4_Model_B_Rev_1_1;Broadcom_BCM2838;6000_00=4.060000; 7.000188; 1; -1; |1|Raspberry Pi 4 Model B Rev 1.1|Broadcom BCM2838|4x ARM Cortex-A72 r0p3 (AArch32)|4x 1500.00 MHz|3999788|1|4|4|llvmpipe (LLVM 6.0, 128 bits)|Broadcom VideoCore IV
[CPU Blowfish (Multi-thread)]
ASUS_PRIME_B350_PLUS;AMD_Ryzen_5_1600_Six_Core_Processor;38400_00 = 105.7600000 7.000394; 12|12|ASUS PRIME B350-PLUS|AMD Ryzen 5 1600 Six-Core Processor|1 physical processor; 6 cores; 12 threads|12x 3200.00 MHz|16423384|1|6|12|Radeon RX 560 Series (POLARIS11, DRM 3.26.0, 4.18.0-10-generic, LLVM 7.0.0)|AMD/ATI Baffin
@@ -346,6 +348,7 @@ Raspberry_Pi_3_Model_B_Plus_Rev_1_3;Broadcom_BCM2837;5600_00 = 12.430000; 7.0005
Firefly_ROC_RK3328_CC;Rockchip_RK3328;5568_00 = 11.820000; 7.000721; 4|4|Firefly ROC-RK3328-CC|Rockchip RK3328|4x ARM Cortex-A53 r0p4 (AArch64)|4x 1392.00 MHz|946208|1|4|4||ARM Mali 450
Hewlett_Packard_18E7_(HP_ProDesk_600_G1_SFF);Intel(R)_Core(TM)_i5_4570_CPU___3_20GHz;14400_00=42.070000; 7.000221; 4|4|Hewlett-Packard 18E7 (HP ProDesk 600 G1 SFF)|Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz|1 physical processor; 4 cores; 4 threads|4x 3600.00 MHz|8078144|1|4|4||Intel Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
Dell_Computer_0U1426_A00_(PowerEdge_1650);Intel(R)_Pentium(R)_III_CPU___S_________1400MHz;2781_40=9.020000; 7.000464; 2|2|Dell Computer 0U1426 A00 (PowerEdge 1650)|Intel(R) Pentium(R) III CPU - S 1400MHz|2 physical processors; 2 cores; 2 threads|2x 1390.70 MHz|1547816|2|2|2||AMD/ATI Rage XL PCI
+Raspberry_Pi_4_Model_B_Rev_1_1;Broadcom_BCM2838;6000_00=16.240000; 7.000591; 4; -1; |4|Raspberry Pi 4 Model B Rev 1.1|Broadcom BCM2838|4x ARM Cortex-A72 r0p3 (AArch32)|4x 1500.00 MHz|3999788|1|4|4|llvmpipe (LLVM 6.0, 128 bits)|Broadcom VideoCore IV
[CPU Blowfish (Multi-core)]
ASUS_PRIME_B350_PLUS;AMD_Ryzen_5_1600_Six_Core_Processor;38400_00 = 55.190000; 7.000318; 6|6|ASUS PRIME B350-PLUS|AMD Ryzen 5 1600 Six-Core Processor|1 physical processor; 6 cores; 12 threads|12x 3200.00 MHz|16423384|1|6|12|Radeon RX 560 Series (POLARIS11, DRM 3.26.0, 4.18.0-10-generic, LLVM 7.0.0)|AMD/ATI Baffin
@@ -356,3 +359,4 @@ Raspberry_Pi_2_Model_B_Rev_1_1;Broadcom_BCM2836;3600_00 = 6.940000; 7.001310; 4|
Raspberry_Pi_3_Model_B_Plus_Rev_1_3;Broadcom_BCM2837;5600_00 = 12.440000; 7.000483; 4|4|Raspberry Pi 3 Model B Plus Rev 1.3|Broadcom BCM2837|4x ARM Cortex-A53 r0p4 (AArch32)|4x 1400.00 MHz|948952|1|4|4|Gallium 0.4 on llvmpipe (LLVM 3.9, 128 bits)|Broadcom VideoCore IV
Firefly_ROC_RK3328_CC;Rockchip_RK3328;5568_00 = 11.720000; 7.000391; 4|4|Firefly ROC-RK3328-CC|Rockchip RK3328|4x ARM Cortex-A53 r0p4 (AArch64)|4x 1392.00 MHz|946208|1|4|4||ARM Mali 450
Hewlett_Packard_18E7_(HP_ProDesk_600_G1_SFF);Intel(R)_Core(TM)_i5_4570_CPU___3_20GHz;14400_00=42.060000; 7.000452; 4|4|Hewlett-Packard 18E7 (HP ProDesk 600 G1 SFF)|Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz|1 physical processor; 4 cores; 4 threads|4x 3600.00 MHz|8078144|1|4|4||Intel Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
+Raspberry_Pi_4_Model_B_Rev_1_1;Broadcom_BCM2838;6000_00=16.240000; 7.000684; 4; -1; |4|Raspberry Pi 4 Model B Rev 1.1|Broadcom BCM2838|4x ARM Cortex-A72 r0p3 (AArch32)|4x 1500.00 MHz|3999788|1|4|4|llvmpipe (LLVM 6.0, 128 bits)|Broadcom VideoCore IV
diff --git a/deps/sysobj_early/data/arm.ids b/deps/sysobj_early/data/arm.ids
new file mode 100644
index 00000000..8e256ec3
--- /dev/null
+++ b/deps/sysobj_early/data/arm.ids
@@ -0,0 +1,133 @@
+#
+# List of ARM CPU IDs
+# in a format similar to pci.ids/usb.ids.
+#
+# Version: 2018.12.22
+# Maintained by: Burt P. (pburt0@gmail.com)
+# https://github.com/bp0/armids
+#
+# Syntax:
+# implementer implementer_name
+# part part_name <-- single tab
+#
+# <implementer> is two hex digits, <part> is three hex digits, keep in order.
+# Comments start with '#'.
+#
+# This file can be distributed under the GNU General Public License
+# (version 2 or higher).
+#
+# Based on lscpu-arm.c by Riku Voipio <riku.voipio@iki.fi>
+#
+# The information here is gathered from
+# - ARM manuals
+# - Linux kernel: arch/armX/include/asm/cputype.h
+# - GCC sources: config/arch/arch-cores.def
+# - Ancient wisdom
+#
+
+41 ARM
+ 810 ARM810
+ 920 ARM920
+ 922 ARM922
+ 926 ARM926
+ 940 ARM940
+ 946 ARM946
+ 966 ARM966
+ a20 ARM1020
+ a22 ARM1022
+ a26 ARM1026
+ b02 ARM11 MPCore
+ b36 ARM1136
+ b56 ARM1156
+ b76 ARM1176
+ c05 Cortex-A5
+ c07 Cortex-A7
+ c08 Cortex-A8
+ c09 Cortex-A9
+ c0d Cortex-A17 # Originally A12
+ c0f Cortex-A15
+ c0e Cortex-A17
+ c14 Cortex-R4
+ c15 Cortex-R5
+ c17 Cortex-R7
+ c18 Cortex-R8
+ c20 Cortex-M0
+ c21 Cortex-M1
+ c23 Cortex-M3
+ c24 Cortex-M4
+ c27 Cortex-M7
+ c60 Cortex-M0+
+ d01 Cortex-A32
+ d03 Cortex-A53
+ d04 Cortex-A35
+ d05 Cortex-A55
+ d07 Cortex-A57
+ d08 Cortex-A72
+ d09 Cortex-A73
+ d0a Cortex-A75
+ d13 Cortex-R52
+ d20 Cortex-M23
+ d21 Cortex-M33
+42 Broadcom
+ 00f Brahma B15
+ 100 Brahma B53
+ 516 ThunderX2
+43 Cavium
+ 0a0 ThunderX
+ 0a1 ThunderX 88XX
+ 0a2 ThunderX 81XX
+ 0a3 ThunderX 83XX
+ 0af ThunderX2 99xx
+44 DEC
+ a10 SA110
+ a11 SA1100
+4e nVidia
+ 000 Denver
+ 003 Denver 2
+50 APM
+ 000 X-Gene
+51 Qualcomm
+ 00f Scorpion
+ 02d Scorpion
+ 04d Krait
+ 06f Krait
+ 201 Kryo
+ 205 Kryo
+ 211 Kryo
+ 800 Falkor V1/Kryo
+ 801 Kryo V2
+ c00 Falkor
+ c01 Saphira
+53 Samsung
+ 001 exynos-m1
+54 Texas Instruments
+56 Marvell
+ 131 Feroceon 88FR131
+ 581 PJ4/PJ4b
+ 584 PJ4B-MP
+66 Faraday
+ 526 FA526
+ 626 FA626
+69 Intel
+ 200 i80200
+ 210 PXA250A
+ 212 PXA210A
+ 242 i80321-400
+ 243 i80321-600
+ 290 PXA250B/PXA26x
+ 292 PXA210B
+ 2c2 i80321-400-B0
+ 2c3 i80321-600-B0
+ 2d0 PXA250C/PXA255/PXA26x
+ 2d2 PXA210C
+ 2e3 i80219
+ 411 PXA27x
+ 41c IPX425-533
+ 41d IPX425-400
+ 41f IPX425-266
+ 682 PXA32x
+ 683 PXA930/PXA935
+ 688 PXA30x
+ 689 PXA31x
+ b11 SA1110
+ c12 IPX1200
diff --git a/deps/sysobj_early/data/sdcard.ids b/deps/sysobj_early/data/sdcard.ids
index 8827f673..08dfc49b 100644
--- a/deps/sysobj_early/data/sdcard.ids
+++ b/deps/sysobj_early/data/sdcard.ids
@@ -35,7 +35,7 @@ MANFID 00009c Angelbird / Hoodman
OEMID 3432 Kingston # "42"
OEMID 4144 ADATA # "AD"
OEMID 4245 Lexar / Angelbird / Hoodman # "BE"
-OEMID 4a45 Transcend # "JE"
+OEMID 4a45 Transcend Information # "JE"
OEMID 4a54 Sony # "JT"
OEMID 4a60 Transcend Information # "J`"
OEMID 5041 Panasonic # "PA"
diff --git a/data/vendor.ids b/deps/sysobj_early/data/vendor.ids
index d57940ff..8c7d8b6f 100644
--- a/data/vendor.ids
+++ b/deps/sysobj_early/data/vendor.ids
@@ -260,8 +260,12 @@ name Harmony Semiconductor
name_short Harmony
match_string Harmony
-name Atheros Communications
- url www.atheros.com
+name Qualcomm (formerly Atheros)
+ name_short Qualcomm (Atheros)
+ url www.qualcomm.com
+ wikipedia Qualcomm Atheros
+ ansi_color 0;94;47
+ match_string Qualcomm Atheros
match_string Atheros
name Panasonic Industry Company
@@ -521,6 +525,78 @@ name STMicroelectronics
match_string STMicroelectronics
match_string ST Micro
+name ST-Ericsson
+ wikipedia ST-Ericsson
+ ansi_color 0;97;43
+ match_string ST-Ericsson
+ match_string ST Ericsson
+ match_string STEricsson
+
+name Telefonaktiebolaget LM Ericsson
+ name_short Ericsson
+ url ericsson.com
+ wikipedia Ericsson
+ ansi_color 0;94;107
+ match_string Ericsson
+
+name Socket Mobile
+ url www.socketmobile.com
+ match_string Socket Communications
+ match_string Socket Mobile
+ match_string Socket
+
+name GCT Semiconductor
+ name_short GCT
+ url www.gctsemi.com
+ match_string GCT Semiconductor
+ match_string_case GCT
+
+name Murata Manufacturing
+ name_short Murata
+ url www.murata.com
+ wikipedia Murata Manufacturing
+ ansi_color 0;31;107
+ match_string Murata
+
+name Murata Manufacturing (formerly SyChip Electronic Technology)
+ name_short Murata (SyChip)
+ ansi_color 0;31;107
+ match_string SyChip
+
+name Spectec Computer
+ name_short Spectec
+ url spectec.com.tw
+ match_string Spectec
+
+name Siano Mobile Silicon
+ match_string Siano Mobile Silicon
+
+# NOT Globalsat Group
+name Globalsat Technology
+ match_string Globalsat Technology
+
+name C-guys
+ url www.c-guys.net
+ match_string C-guys
+
+name Ricoh
+ url www.ricoh.com
+ wikipedia Ricoh
+ ansi_color 0;91;107
+ match_string Ricoh
+
+name Brother Industries
+ name_short Brother
+ url www.brother.com
+ wikipedia Brother Industries
+ ansi_color 0;34;107
+ match_string Brother
+
+name AboCom Systems
+ url www.abocom.com.tw
+ match_string AboCom Systems
+ match_string AboCom
+
name Micron Technology
name_short Micron
url www.micron.com
@@ -538,6 +614,7 @@ name Toshiba Samsung Storage Technology
url www.tsst.co.kr
wikipedia Toshiba Samsung Storage Technology
ansi_color 0;34;107
+ match_string TSSTcorp
match_string_case TSST
name Seagate Technology
@@ -689,6 +766,21 @@ name Elitegroup Computer Systems
ansi_color 0;36;41
match_string_case ECS
+name JMicron Technology
+ name_short JMicron
+ url www.jmicron.com
+ wikipedia JMicron
+ ansi_color 0;34;107
+ match_string JMicron Technology
+ match_string JMicron USA Technology
+ match_string JMicron
+
+name Sabrent
+ url www.sabrent.com
+ wikipedia Sabrent
+ ansi_color 0;30;44
+ match_string Sabrent
+ match_string Arkview
name Sanyo Electric
name_short SANYO
@@ -790,6 +882,7 @@ name Red Hat
url www.redhat.com
ansi_color 0;31;40
match_string Red Hat
+ match_string RedHat
name Sun Microsystems
name_short Sun
@@ -910,6 +1003,70 @@ name DMP Electronics
note x86 processor vendor ID
match_string Vortex86 SoC
+name Digital Equipment Corporation
+ name_short DEC
+ note Dead; various parts to Intel, Compaq, HP
+ match_string_case DEC
+ match_string Digital Equipment
+ match_string Digital
+
+name Marvell Technology Group
+ name_short Marvell
+ url www.marvell.com
+ wikipedia Marvell Technology Group
+ ansi_color 0;97;41
+ match_string Marvell
+
+name Marvell (formerly Cavium)
+ name_short Marvell (Cavium)
+ url cavium.com
+ wikipedia Cavium
+ ansi_color 0;97;41
+ match_string Cavium
+
+name Applied Micro Circuits
+ name_short APM
+ wikipedia Applied Micro Circuits Corporation
+ match_string Applied Micro Circuits
+ match_string AppliedMicro
+ match_string_case APM
+ match_string_case AMCC
+
+name Faraday Technology
+ name_short Faraday
+ url www.faraday-tech.com
+ wikipedia Faraday Technology
+ match_string Faraday Technology
+ match_string Faraday
+
+name Texas Instruments
+ name_short TI
+ url ti.com
+ wikipedia Texas Instruments
+ ansi_color 0;97;40
+ match_string Texas Instruments
+ match_string_case TI
+
+name Allwinner Technology
+ name_short AllWinner
+ url www.allwinnertech.com
+ wikipedia Allwinner Technology
+ ansi_color 0;97;44
+ match_string AllWinner
+
+name Amlogic
+ name_short AMLogic
+ url www.amlogic.com
+ wikipedia Amlogic
+ ansi_color 0;94;107
+ match_string Amlogic
+
+name MediaTek
+ url www.mediatek.com
+ wikipedia MediaTek
+ ansi_color 0;97;43
+ match_string MediaTek
+
#
# x86 VM vendor strings
#
diff --git a/deps/sysobj_early/include/appf.h b/deps/sysobj_early/include/appf.h
new file mode 100644
index 00000000..b99f9373
--- /dev/null
+++ b/deps/sysobj_early/include/appf.h
@@ -0,0 +1,40 @@
+/*
+ * sysobj - https://github.com/bp0/verbose-spork
+ * Copyright (C) 2018 Burt P. <pburt0@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef _APPF_H_
+#define _APPF_H_
+
+/* Appends a formatted element to a string, adding an optional
+ * separator string if the string is not empty.
+ * The string is created if str is null.
+ * ex: ret = appf(ret, "; ", "%s = %d", name, value); */
+char *appf(char *str, const char *sep, const char *fmt, ...)
+ __attribute__ ((format (printf, 3, 4)));
+
+/* Same as above except that str is untouched.
+ * ex: ret = appf(keeper, "; ", "%s = %d", name, value); */
+char *appfdup(const char *str, const char *sep, const char *fmt, ...)
+ __attribute__ ((format (printf, 3, 4)));
+
+/* for convenience */
+#define appfsp(str, fmt, ...) appf(str, " ", fmt, __VA_ARGS__)
+#define appfnl(str, fmt, ...) appf(str, "\n", fmt, __VA_ARGS__)
+
+#endif
diff --git a/deps/sysobj_early/include/auto_free.h b/deps/sysobj_early/include/auto_free.h
index e038783d..bddaa321 100644
--- a/deps/sysobj_early/include/auto_free.h
+++ b/deps/sysobj_early/include/auto_free.h
@@ -36,20 +36,29 @@
/* the minimum time between auto_free(p) and free(p) */
#define AF_DELAY_SECONDS 10
+#define AF_USE_SYSOBJ 0
+
#if (DEBUG_AUTO_FREE > 0)
-#define auto_free(p) auto_free_(p, __FILE__, __LINE__, __FUNCTION__)
+#define auto_free(p) auto_free_ex_(p, (GDestroyNotify)g_free, __FILE__, __LINE__, __FUNCTION__)
#define auto_free_ex(p, f) auto_free_ex_(p, f, __FILE__, __LINE__, __FUNCTION__)
+#define auto_free_on_exit(p) auto_free_on_exit_ex_(p, (GDestroyNotify)g_free, __FILE__, __LINE__, __FUNCTION__)
+#define auto_free_on_exit_ex(p, f) auto_free_on_exit_ex_(p, f, __FILE__, __LINE__, __FUNCTION__)
#else
-#define auto_free(p) auto_free_(p, NULL, 0, NULL)
+#define auto_free(p) auto_free_ex_(p, (GDestroyNotify)g_free, NULL, 0, NULL)
#define auto_free_ex(p, f) auto_free_ex_(p, f, NULL, 0, NULL)
+#define auto_free_on_exit(p) auto_free_on_exit_ex_(p, (GDestroyNotify)g_free, NULL, 0, NULL)
+#define auto_free_on_exit_ex(p, f) auto_free_on_exit_ex_(p, f, NULL, 0, NULL)
#endif
-gpointer auto_free_(gpointer p, const char *file, int line, const char *func);
gpointer auto_free_ex_(gpointer p, GDestroyNotify f, const char *file, int line, const char *func);
+gpointer auto_free_on_exit_ex_(gpointer p, GDestroyNotify f, const char *file, int line, const char *func);
-/* free all the auto_free marked items in the current thread */
+/* free all the auto_free marked items in the
+ * current thread with age > AF_DELAY_SECONDS */
void free_auto_free();
-/* call at thread termination */
+/* call at thread termination:
+ * free all the auto_free marked items in the
+ * current thread regardless of age */
void free_auto_free_thread_final();
/* call at program termination */
diff --git a/deps/sysobj_early/include/nice_name.h b/deps/sysobj_early/include/nice_name.h
new file mode 100644
index 00000000..80031c91
--- /dev/null
+++ b/deps/sysobj_early/include/nice_name.h
@@ -0,0 +1,32 @@
+/*
+ * sysobj - https://github.com/bp0/verbose-spork
+ * Copyright (C) 2018 Burt P. <pburt0@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef _NICE_NAME_H_
+#define _NICE_NAME_H_
+
+/* cleaned in-place */
+void nice_name_x86_cpuid_model_string(char *cpuid_model_string);
+
+/* Intel Graphics may have very long names,
+ * like "Intel Corporation Seventh Generation Something Core Something Something Integrated Graphics Processor Revision Ninety-four"
+ * cleaned in-place */
+void nice_name_intel_gpu_device(char *pci_ids_device_string);
+
+#endif
diff --git a/deps/sysobj_early/include/util_sysobj.h b/deps/sysobj_early/include/util_sysobj.h
new file mode 100644
index 00000000..1bff3d5a
--- /dev/null
+++ b/deps/sysobj_early/include/util_sysobj.h
@@ -0,0 +1,53 @@
+/*
+ * sysobj - https://github.com/bp0/verbose-spork
+ * Copyright (C) 2018 Burt P. <pburt0@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef _UTIL_SYSOBJ_H_
+#define _UTIL_SYSOBJ_H_
+
+#include <glib.h>
+#include "appf.h"
+
+/* string eq */
+#define SEQ(s1, s2) (g_strcmp0((s1), (s2)) == 0)
+
+/* handy for static halp */
+#define BULLET "\u2022"
+#define REFLINK(URI) "<a href=\"" URI "\">" URI "</a>"
+#define REFLINKT(TEXT, URI) "<a href=\"" URI "\">" TEXT "</a>"
+
+gboolean util_have_root();
+void util_null_trailing_slash(gchar *str); /* in-place */
+void util_compress_space(gchar *str); /* in-place, multiple whitespace replaced by one space */
+void util_strstrip_double_quotes_dumb(gchar *str); /* in-place, strips any double-quotes from the start and end of str */
+gchar *util_build_fn(const gchar *base, const gchar *name); /* returns "<base>[/<name>]" */
+gchar *util_canonicalize_path(const gchar *path); /* resolve . and .., but not symlinks */
+gchar *util_normalize_path(const gchar *path, const gchar *relto); /* resolve . and .., and symlinks */
+gsize util_count_lines(const gchar *str); /* doesn't count empty last line */
+gchar *util_escape_markup(gchar *v, gboolean replacing);
+int util_get_did(gchar *str, const gchar *lbl); /* ("cpu6", "cpu") -> 6, returns -1 if error */
+int util_maybe_num(gchar *str); /* returns the guessed base, 0 for not num */
+gchar *util_find_line_value(gchar *data, gchar *key, gchar delim);
+gchar *util_strchomp_float(gchar* str_float); /* in-place, must use , or . for decimal sep */
+gchar *util_safe_name(const gchar *name, gboolean lower_case); /* make a string into a name nice and safe for file name */
+
+/* to quiet -Wunused-parameter nagging. */
+#define PARAM_NOT_UNUSED(p) (void)p
+
+#endif
diff --git a/deps/sysobj_early/src/appf.c b/deps/sysobj_early/src/appf.c
new file mode 100644
index 00000000..432e0f30
--- /dev/null
+++ b/deps/sysobj_early/src/appf.c
@@ -0,0 +1,63 @@
+/*
+ * sysobj - https://github.com/bp0/verbose-spork
+ * Copyright (C) 2018 Burt P. <pburt0@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "appf.h"
+#define _GNU_SOURCE /* for vasprintf() */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+
+char *appf(char *str, const char *sep, const char *fmt, ...) {
+ char *buf = NULL;
+ int inlen, seplen, len;
+ va_list args;
+ va_start(args, fmt);
+ len = vasprintf(&buf, fmt, args);
+ va_end(args);
+ if (len < 0) return str;
+ if (!str) return buf;
+ inlen = strlen(str);
+ seplen = (inlen && sep) ? strlen(sep) : 0;
+ str = realloc(str, inlen + seplen + len + 1);
+ if (seplen) strcpy(str + inlen, sep);
+ strcpy(str + inlen + seplen, buf);
+ free(buf);
+ return str;
+}
+
+char *appfdup(const char *str, const char *sep, const char *fmt, ...) {
+ char *buf = NULL, *ret = NULL;
+ int inlen, seplen, len;
+ va_list args;
+ va_start(args, fmt);
+ len = vasprintf(&buf, fmt, args);
+ va_end(args);
+ if (len < 0) return NULL;
+ if (!str) return buf;
+ inlen = strlen(str);
+ seplen = (inlen && sep) ? strlen(sep) : 0;
+ ret = malloc(inlen + seplen + len + 1);
+ strcpy(ret, str);
+ if (seplen) strcpy(ret + inlen, sep);
+ strcpy(ret + inlen + seplen, buf);
+ free(buf);
+ return ret;
+}
diff --git a/deps/sysobj_early/src/auto_free.c b/deps/sysobj_early/src/auto_free.c
index 78f11690..3d75c169 100644
--- a/deps/sysobj_early/src/auto_free.c
+++ b/deps/sysobj_early/src/auto_free.c
@@ -19,15 +19,26 @@
*/
#include "auto_free.h"
+#if (AF_USE_SYSOBJ)
+#include "sysobj.h"
+#else
#include <stdio.h>
-//#include "sysobj.h"
+#define sysobj_elapsed() af_elapsed()
+#define sysobj_stats af_stats
+static struct {
+ double auto_free_next;
+ unsigned long long
+ auto_freed,
+ auto_free_len;
+} af_stats;
+#endif
static GMutex free_lock;
static GSList *free_list = NULL;
static gboolean free_final = FALSE;
static GTimer *auto_free_timer = NULL;
static guint free_event_source = 0;
-#define _elapsed() (auto_free_timer ? g_timer_elapsed(auto_free_timer, NULL) : 0)
+#define af_elapsed() (auto_free_timer ? g_timer_elapsed(auto_free_timer, NULL) : 0)
#define auto_free_msg(msg, ...) fprintf (stderr, "[%s] " msg "\n", __FUNCTION__, ##__VA_ARGS__) /**/
@@ -49,7 +60,7 @@ gboolean free_auto_free_sf(gpointer trash) {
return G_SOURCE_REMOVE;
}
free_auto_free();
- //sysobj_stats.auto_free_next = sysobj_elapsed() + AF_SECONDS;
+ sysobj_stats.auto_free_next = sysobj_elapsed() + AF_SECONDS;
return G_SOURCE_CONTINUE;
}
@@ -73,7 +84,7 @@ gpointer auto_free_ex_(gpointer p, GDestroyNotify f, const char *file, int line,
* will be called at sysobj_cleanup() and when exiting
* threads, as in sysobj_foreach(). */
free_event_source = g_timeout_add_seconds(AF_SECONDS, (GSourceFunc)free_auto_free_sf, NULL);
- //sysobj_stats.auto_free_next = sysobj_elapsed() + AF_SECONDS;
+ sysobj_stats.auto_free_next = sysobj_elapsed() + AF_SECONDS;
}
auto_free_item *z = g_new0(auto_free_item, 1);
@@ -83,22 +94,41 @@ gpointer auto_free_ex_(gpointer p, GDestroyNotify f, const char *file, int line,
z->file = file;
z->line = line;
z->func = func;
- z->stamp = _elapsed();
+ z->stamp = af_elapsed();
g_mutex_lock(&free_lock);
free_list = g_slist_prepend(free_list, z);
- //sysobj_stats.auto_free_len++;
+ sysobj_stats.auto_free_len++;
g_mutex_unlock(&free_lock);
return p;
}
-gpointer auto_free_(gpointer p, const char *file, int line, const char *func) {
- return auto_free_ex_(p, (GDestroyNotify)g_free, file, line, func);
+gpointer auto_free_on_exit_ex_(gpointer p, GDestroyNotify f, const char *file, int line, const char *func) {
+ if (!p) return p;
+
+ auto_free_item *z = g_new0(auto_free_item, 1);
+ z->ptr = p;
+ z->f_free = f;
+ z->thread = g_thread_self();
+ z->file = file;
+ z->line = line;
+ z->func = func;
+ z->stamp = -1.0;
+ g_mutex_lock(&free_lock);
+ free_list = g_slist_prepend(free_list, z);
+ sysobj_stats.auto_free_len++;
+ g_mutex_unlock(&free_lock);
+ return p;
}
static struct { GDestroyNotify fptr; char *name; }
free_function_tab[] = {
{ (GDestroyNotify) g_free, "g_free" },
- // ...
+#if (AF_USE_SYSOBJ)
+ { (GDestroyNotify) sysobj_free, "sysobj_free" },
+ { (GDestroyNotify) class_free, "class_free" },
+ { (GDestroyNotify) sysobj_filter_free, "sysobj_filter_free" },
+ { (GDestroyNotify) sysobj_virt_free, "sysobj_virt_free" },
+#endif
{ NULL, "(null)" },
};
@@ -106,18 +136,17 @@ static void free_auto_free_ex(gboolean thread_final) {
GThread *this_thread = g_thread_self();
GSList *l = NULL, *n = NULL;
long long unsigned fc = 0;
- double now = _elapsed();
+ double now = af_elapsed();
if (!free_list) return;
g_mutex_lock(&free_lock);
- if (DEBUG_AUTO_FREE) {
- unsigned long long ll = g_slist_length(free_list);
- auto_free_msg("%llu total items in queue, but will free from thread %p only... ", ll, this_thread);
- }
+ if (DEBUG_AUTO_FREE)
+ auto_free_msg("%llu total items in queue, but will free from thread %p only... ", sysobj_stats.auto_free_len, this_thread);
for(l = free_list; l; l = n) {
auto_free_item *z = (auto_free_item*)l->data;
n = l->next;
+ if (!free_final && z->stamp < 0) continue;
double age = now - z->stamp;
if (free_final || (z->thread == this_thread && (thread_final || age > AF_DELAY_SECONDS) ) ) {
if (DEBUG_AUTO_FREE == 2) {
@@ -143,8 +172,8 @@ static void free_auto_free_ex(gboolean thread_final) {
}
if (DEBUG_AUTO_FREE)
auto_free_msg("... freed %llu (from thread %p)", fc, this_thread);
- //sysobj_stats.auto_freed += fc;
- //sysobj_stats.auto_free_len -= fc;
+ sysobj_stats.auto_freed += fc;
+ sysobj_stats.auto_free_len -= fc;
g_mutex_unlock(&free_lock);
}
diff --git a/deps/sysobj_early/src/nice_name.c b/deps/sysobj_early/src/nice_name.c
new file mode 100644
index 00000000..c3c8d3ce
--- /dev/null
+++ b/deps/sysobj_early/src/nice_name.c
@@ -0,0 +1,157 @@
+/*
+ * sysobj - https://github.com/bp0/verbose-spork
+ * Copyright (C) 2018 Burt P. <pburt0@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#define _GNU_SOURCE
+#include <string.h>
+#include <ctype.h>
+
+#include "nice_name.h"
+#include "util_sysobj.h"
+
+/* export */
+/* replaces the extra chars with spaces, then when done with a series of
+ * str_shorten()s, use util_compress_space() to squeeze. */
+gboolean str_shorten(gchar *str, const gchar *find, const gchar *replace) {
+ if (!str || !find || !replace) return FALSE;
+ long unsigned lf = strlen(find);
+ long unsigned lr = strlen(replace);
+ gchar *p = strstr(str, find);
+ if (p) {
+ if (lr > lf) lr = lf;
+ gchar *buff = g_strnfill(lf, ' ');
+ strncpy(buff, replace, lr);
+ strncpy(p, buff, lf);
+ g_free(buff);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void nice_name_x86_cpuid_model_string(char *cpuid_model_string) {
+ static gboolean move_vendor_to_front = TRUE;
+ static gboolean remove_amd_compute_cores = FALSE;
+ static gboolean remove_amd_xn_ncore_redundancy = TRUE;
+ static gboolean remove_processor_cpu_apu_etc = TRUE;
+ static gboolean remove_mhz_ghz = TRUE;
+
+ if (!cpuid_model_string) return;
+ g_strstrip(cpuid_model_string);
+
+ while(str_shorten(cpuid_model_string, "Genuine Intel", "Intel")) {};
+ while(str_shorten(cpuid_model_string, "(R)", "")) {};
+ while(str_shorten(cpuid_model_string, "(r)", "")) {};
+ while(str_shorten(cpuid_model_string, "(TM)", "")) {};
+ while(str_shorten(cpuid_model_string, "(tm)", "")) {};
+ while(str_shorten(cpuid_model_string, "(c)", "")) {};
+ while(str_shorten(cpuid_model_string, "(C)", "")) {};
+ while(str_shorten(cpuid_model_string, "@", "")) {};
+
+ if (move_vendor_to_front) {
+ /* vendor not at the beginning, try to move there.
+ * ex: Mobile AMD Sempron(tm) Processor 3600+
+ * ex: Dual Core AMD Opteron(tm) Processor 165 */
+ char *intel = strstr(cpuid_model_string, "Intel ");
+ char *amd = strstr(cpuid_model_string, "AMD ");
+ if (amd || intel) {
+ if (amd && !intel) {
+ if (amd != cpuid_model_string) {
+ int l = amd - cpuid_model_string;
+ memmove(cpuid_model_string+4, cpuid_model_string, l);
+ memcpy(cpuid_model_string, "AMD ", 4);
+ }
+ } else if (intel && !amd) {
+ int l = intel - cpuid_model_string;
+ memmove(cpuid_model_string+6, cpuid_model_string, l);
+ memcpy(cpuid_model_string, "Intel ", 6);
+ }
+ }
+ }
+
+ if (g_str_has_prefix(cpuid_model_string, "AMD")) {
+ while(str_shorten(cpuid_model_string, "Mobile Technology", "Mobile")) {};
+
+ if (remove_amd_compute_cores) {
+ if (strcasestr(cpuid_model_string, " COMPUTE CORES ")) {
+ /* ex: AMD FX-9800P RADEON R7, 12 COMPUTE CORES 4C+8G */
+ char *comma = strchr(cpuid_model_string, ',');
+ if (comma) *comma = 0;
+ }
+ }
+
+ if (remove_amd_xn_ncore_redundancy) {
+ /* remove Xn n-core redundancy */
+ if (strstr(cpuid_model_string, "X2")) {
+ str_shorten(cpuid_model_string, "Dual Core", "");
+ str_shorten(cpuid_model_string, "Dual-Core", "");
+ }
+ if (strstr(cpuid_model_string, "X3"))
+ str_shorten(cpuid_model_string, "Triple-Core", "");
+ if (strstr(cpuid_model_string, "X4"))
+ str_shorten(cpuid_model_string, "Quad-Core", "");
+ }
+ }
+
+ if (g_str_has_prefix(cpuid_model_string, "Cyrix")) {
+ while(str_shorten(cpuid_model_string, "tm ", "")) {};
+ }
+
+ if (remove_processor_cpu_apu_etc) {
+ while(str_shorten(cpuid_model_string, " CPU", "")) {};
+ while(str_shorten(cpuid_model_string, " APU", "")) {};
+ while(str_shorten(cpuid_model_string, " Integrated Processor", "")) {};
+ while(str_shorten(cpuid_model_string, " Processor", "")) {};
+ while(str_shorten(cpuid_model_string, " processor", "")) {};
+ } else {
+ while(str_shorten(cpuid_model_string, " processor", " Processor")) {};
+ }
+
+ if (remove_mhz_ghz) {
+ /* 1400MHz, 1.6+ GHz, etc */
+ char *u = NULL;
+ while((u = strcasestr(cpuid_model_string, "GHz"))
+ || (u = strcasestr(cpuid_model_string, "MHz")) ) {
+ if (u[3] == '+') u[3] = ' ';
+ strncpy(u, " ", 3);
+ while(isspace(*u)) {u--;}
+ while (isdigit(*u) || *u == '.' || *u == '+')
+ { *u = ' '; u--;}
+ }
+ }
+
+ /* finalize */
+ util_compress_space(cpuid_model_string);
+ g_strstrip(cpuid_model_string);
+}
+
+/* Intel Graphics may have very long names,
+ * like "Intel Corporation Seventh Generation Something Core Something Something Integrated Graphics Processor Revision Ninety-four" */
+void nice_name_intel_gpu_device(char *pci_ids_device_string) {
+ while(str_shorten(pci_ids_device_string, "(R)", "")) {}; /* Intel(R) -> Intel */
+ str_shorten(pci_ids_device_string, "Graphics Controller", "Graphics");
+ str_shorten(pci_ids_device_string, "Graphics Device", "Graphics");
+ str_shorten(pci_ids_device_string, "Generation", "Gen");
+ str_shorten(pci_ids_device_string, "Core Processor", "Core");
+ str_shorten(pci_ids_device_string, "Atom Processor", "Atom");
+ str_shorten(pci_ids_device_string, "Xeon Processor", "Xeon");
+ str_shorten(pci_ids_device_string, "Celeron Processor", "Celeron");
+ str_shorten(pci_ids_device_string, "Pentium Processor", "Pentium");
+ util_compress_space(pci_ids_device_string);
+ g_strstrip(pci_ids_device_string);
+}
diff --git a/deps/sysobj_early/src/util_sysobj.c b/deps/sysobj_early/src/util_sysobj.c
new file mode 100644
index 00000000..de3ec8b2
--- /dev/null
+++ b/deps/sysobj_early/src/util_sysobj.c
@@ -0,0 +1,303 @@
+/*
+ * sysobj - https://github.com/bp0/verbose-spork
+ * Copyright (C) 2018 Burt P. <pburt0@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#define _GNU_SOURCE
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h> /* for realpath() */
+#include <unistd.h> /* for getuid() */
+#include <ctype.h> /* for isxdigit(), etc. */
+
+#include "util_sysobj.h"
+
+gchar *util_build_fn(const gchar *base, const gchar *name) {
+ gchar *ret = NULL;
+ gboolean slash = TRUE;
+
+ if (!base) return NULL;
+ if (base[strlen(base)-1] == '/')
+ slash = FALSE;
+
+ if (name) {
+ if (*name == '/') slash = FALSE;
+ ret = g_strdup_printf("%s%s%s", base, slash ? "/" : "", name);
+ } else
+ ret = g_strdup(base);
+
+ util_null_trailing_slash(ret);
+ return ret;
+}
+
+gboolean util_have_root() {
+ return (getuid() == 0) ? TRUE : FALSE;
+}
+
+void util_compress_space(gchar *str) {
+ gchar *p = str, *t = str;
+ if (str && *str) {
+ int n = 0;
+ while(*p) {
+ if (isspace(*p) ) {
+ if (!n)
+ *t++ = ' ';
+ n++;
+ } else {
+ n = 0;
+ if (t != p)
+ *t = *p;
+ t++;
+ }
+ p++;
+ }
+ }
+ if (t != p)
+ *t = 0;
+}
+
+void util_null_trailing_slash(gchar *str) {
+ if (str && *str) {
+ if (str[strlen(str)-1] == '/' )
+ str[strlen(str)-1] = 0;
+ }
+}
+
+gsize util_count_lines(const gchar *str) {
+ gchar **lines = NULL;
+ gsize count = 0;
+
+ if (str) {
+ lines = g_strsplit(str, "\n", 0);
+ count = g_strv_length(lines);
+ if (count && *lines[count-1] == 0) {
+ /* if the last line is empty, don't count it */
+ count--;
+ }
+ g_strfreev(lines);
+ }
+
+ return count;
+}
+
+int util_get_did(gchar *str, const gchar *lbl) {
+ int id = -2;
+ gchar tmpfmt[128] = "";
+ gchar tmpchk[128] = "";
+ sprintf(tmpfmt, "%s%s", lbl, "%d");
+ if ( sscanf(str, tmpfmt, &id) ) {
+ sprintf(tmpchk, tmpfmt, id);
+ if ( SEQ(str, tmpchk) )
+ return id;
+ }
+ return -1;
+}
+
+gchar *util_escape_markup(gchar *v, gboolean replacing) {
+ gchar *clean, *tmp;
+ gchar **vl;
+ if (v == NULL) return NULL;
+
+ vl = g_strsplit(v, "&", -1);
+ if (g_strv_length(vl) > 1)
+ clean = g_strjoinv("&amp;", vl);
+ else
+ clean = g_strdup(v);
+ g_strfreev(vl);
+
+ vl = g_strsplit(clean, "<", -1);
+ if (g_strv_length(vl) > 1) {
+ tmp = g_strjoinv("&lt;", vl);
+ g_free(clean);
+ clean = tmp;
+ }
+ g_strfreev(vl);
+
+ vl = g_strsplit(clean, ">", -1);
+ if (g_strv_length(vl) > 1) {
+ tmp = g_strjoinv("&gt;", vl);
+ g_free(clean);
+ clean = tmp;
+ }
+ g_strfreev(vl);
+
+ if (replacing)
+ g_free((gpointer)v);
+ return clean;
+}
+
+void util_strstrip_double_quotes_dumb(gchar *str) {
+ if (!str) return;
+ g_strstrip(str);
+ gchar *front = str, *back = str + strlen(str) - 1;
+ if (back <= front) return;
+ while(*front == '"') { *front = 'X'; front++; }
+ while(*back == '"') { *back = 0; back--; }
+ int nl = strlen(front);
+ memmove(str, front, nl);
+ str[nl] = 0;
+}
+
+/* "194.110 MHz" -> "194.11 MHz"
+ * "5,0 golden rings" -> "5 golden rings" */
+gchar *util_strchomp_float(gchar* str_float) {
+ if (!str_float) return NULL;
+ char *dot = strchr(str_float, '.');
+ char *comma = strchr(str_float, ',');
+ char *p = NULL, *dec = NULL, *src = NULL, *target = NULL;
+ if (!dot && !comma) return str_float;
+ if (dot > comma)
+ dec = dot;
+ else
+ dec = comma;
+ p = dec + 1;
+ while(isdigit(*p)) p++;
+ target = src = p;
+ p--;
+ while(*p == '0') { target = p; p--; };
+ if (target == dec + 1)
+ target = dec;
+ if (target != src)
+ memmove(target, src, strlen(src)+1);
+ return str_float;
+}
+
+/* resolve . and .., but not symlinks */
+gchar *util_normalize_path(const gchar *path, const gchar *relto) {
+ gchar *resolved = NULL;
+#if GLIB_CHECK_VERSION(2, 58, 0)
+ resolved = g_canonicalize_filename(path, relto);
+#else
+ /* burt's hack version */
+ gchar *frt = relto ? g_strdup(relto) : NULL;
+ util_null_trailing_slash(frt);
+ gchar *fpath = frt
+ ? g_strdup_printf("%s%s%s", frt, (*path == '/') ? "" : "/", path)
+ : g_strdup(path);
+ g_free(frt);
+
+ /* note: **parts will own all the part strings throughout */
+ gchar **parts = g_strsplit(fpath, "/", -1);
+ gsize i, pn = g_strv_length(parts);
+ GList *lparts = NULL, *l = NULL, *n = NULL, *p = NULL;
+ for (i = 0; i < pn; i++)
+ lparts = g_list_append(lparts, parts[i]);
+
+ i = 0;
+ gchar *part = NULL;
+ l = lparts;
+ while(l) {
+ n = l->next; p = l->prev;
+ part = l->data;
+
+ if (SEQ(part, ".") )
+ lparts = g_list_delete_link(lparts, l);
+
+ if (SEQ(part, "..") ) {
+ if (p)
+ lparts = g_list_delete_link(lparts, p);
+ lparts = g_list_delete_link(lparts, l);
+ }
+
+ l = n;
+ }
+
+ resolved = g_strdup("");
+ l = lparts;
+ while(l) {
+ resolved = g_strdup_printf("%s%s/", resolved, (gchar*)l->data );
+ l = l->next;
+ }
+ g_list_free(lparts);
+ util_null_trailing_slash(resolved);
+ g_free(fpath);
+
+ g_strfreev(parts);
+#endif
+
+ return resolved;
+}
+
+/* resolve . and .. and symlinks */
+gchar *util_canonicalize_path(const gchar *path) {
+ char *resolved = realpath(path, NULL);
+ gchar *ret = g_strdup(resolved); /* free with g_free() instead of free() */
+ free(resolved);
+ return ret;
+}
+
+int util_maybe_num(gchar *str) {
+ int r = 10, i = 0, l = (str) ? strlen(str) : 0;
+ if (!l || l > 32) return 0;
+ gchar *chk = g_strdup(str);
+ g_strstrip(chk);
+ l = strlen(chk);
+ if (l > 2 && !strncmp(chk, "0x", 2)) {
+ i = 2; r = 16;
+ }
+ for (; i < l; i++) {
+ if (isxdigit(chk[i])) {
+ if (!isdigit(chk[i]))
+ r = 16;
+ } else {
+ r = 0;
+ break;
+ }
+ }
+ g_free(chk);
+ return r;
+}
+
+gchar *util_safe_name(const gchar *name, gboolean lower_case) {
+ if (!name) return NULL;
+ const gchar *p = name;
+ gchar *buff = g_new0(gchar, strlen(name) + 1);
+ gchar *t = buff;
+ while(*p) {
+ gboolean ok = g_ascii_isalnum(*p);
+ if (*p == '.' || *p == '-') ok = TRUE;
+ if (*p == '/') ok = FALSE;
+ *t = ok ? *p : '_';
+ t++;
+ p = g_utf8_next_char(p);
+ }
+ gchar *ret = lower_case ? g_ascii_strdown(buff, -1) : g_strdup(buff);
+ g_free(buff);
+ return ret;
+}
+
+gchar *util_find_line_value(gchar *data, gchar *key, gchar delim) {
+ gchar *ret = NULL;
+ gchar **lines = g_strsplit(data, "\n", -1);
+ gsize line_count = g_strv_length(lines);
+ gsize i = 0;
+ for (i = 0; i < line_count; i++) {
+ gchar *line = lines[i];
+ gchar *value = g_utf8_strchr(line, -1, delim);
+ if (!value) continue;
+ *value = 0;
+ value = g_strstrip(value+1);
+ gchar *lkey = g_strstrip(line);
+
+ if (SEQ(lkey, key) ) {
+ ret = g_strdup(value);
+ }
+ }
+ g_strfreev(lines);
+ return ret;
+}
diff --git a/hardinfo/dt_util.c b/hardinfo/dt_util.c
index da38fd91..2d1b60a0 100644
--- a/hardinfo/dt_util.c
+++ b/hardinfo/dt_util.c
@@ -27,6 +27,7 @@
#include <endian.h>
#include "hardinfo.h"
#include "dt_util.h"
+#include "appf.h"
static struct {
char *name; int type;
@@ -682,14 +683,14 @@ char *dtr_list_override(dtr_obj *obj) {
src += 4; consumed += 4;
l = strlen(src) + 1; /* consume the null */
str = dtr_list_str0(src, l);
- ret = appf(ret, "<%s -> %s>", ph, str);
+ ret = appfsp(ret, "<%s -> %s>", ph, str);
src += l; consumed += l;
free(ph);
free(str);
}
if (consumed < obj->length) {
str = dtr_list_byte((uint8_t*)src, obj->length - consumed);
- ret = appf(ret, "%s", str);
+ ret = appfsp(ret, "%s", str);
free(str);
}
return ret;
@@ -720,7 +721,7 @@ char *dtr_list_phref(dtr_obj *obj, char *ext_cell_prop) {
ph = dtr_elem_phref(obj->dt, obj->data_int[i], 0, NULL); i++;
if (ext_cells > count - i) ext_cells = count - i;
ext = dtr_list_hex((obj->data_int + i), ext_cells); i+=ext_cells;
- ret = appf(ret, "<%s%s%s>",
+ ret = appfsp(ret, "<%s%s%s>",
ph, (ext_cells) ? " " : "", ext);
g_free(ph);
g_free(ext);
@@ -748,7 +749,7 @@ char *dtr_list_interrupts(dtr_obj *obj) {
while (i < count) {
icells = UMIN(icells, count - i);
ext = dtr_list_hex((obj->data_int + i), icells); i+=icells;
- ret = appf(ret, "<%s>", ext);
+ ret = appfsp(ret, "<%s>", ext);
}
return ret;
@@ -782,7 +783,7 @@ char *dtr_list_reg(dtr_obj *obj) {
consumed = 0;
while (consumed + (tup_len * 4) <= obj->length) {
tup_str = dtr_list_hex(next, tup_len);
- ret = appf(ret, "<%s>", tup_str);
+ ret = appfsp(ret, "<%s>", tup_str);
free(tup_str);
consumed += (tup_len * 4);
next += tup_len;
@@ -1184,22 +1185,3 @@ char *dtr_maps_info(dtr *s) {
g_free(sy_map);
return ret;
}
-
-char *appf(char *src, char *fmt, ...) {
- gchar *buf, *ret;
- va_list args;
-
- va_start(args, fmt);
- buf = g_strdup_vprintf(fmt, args);
- va_end(args);
-
- if (src != NULL) {
- ret = g_strdup_printf("%s%s%s", src, sp_sep(src), buf);
- g_free(buf);
- g_free(src);
- } else
- ret = buf;
-
- return ret;
-}
-
diff --git a/hardinfo/gg_key_file_parse_string_as_value.c b/hardinfo/gg_key_file_parse_string_as_value.c
new file mode 100644
index 00000000..496b1d35
--- /dev/null
+++ b/hardinfo/gg_key_file_parse_string_as_value.c
@@ -0,0 +1,109 @@
+/* From: gkeyfile.c - key file parser
+ *
+ * Copyright 2004 Red Hat, Inc.
+ * Copyright 2009-2010 Collabora Ltd.
+ * Copyright 2009 Nokia Corporation
+ *
+ * Written by Ray Strode <rstrode@redhat.com>
+ * Matthias Clasen <mclasen@redhat.com>
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+static gchar *
+gg_key_file_parse_string_as_value (const gchar *string, const gchar list_separator)
+{
+ gchar *value, *p, *q;
+ gsize length;
+ gboolean parsing_leading_space;
+
+ length = strlen (string) + 1;
+
+ /* Worst case would be that every character needs to be escaped.
+ * In other words every character turns to two characters. */
+ value = g_new (gchar, 2 * length);
+
+ p = (gchar *) string;
+ q = value;
+ parsing_leading_space = TRUE;
+ while (p < (string + length - 1))
+ {
+ gchar escaped_character[3] = { '\\', 0, 0 };
+
+ switch (*p)
+ {
+ case ' ':
+ if (parsing_leading_space)
+ {
+ escaped_character[1] = 's';
+ strcpy (q, escaped_character);
+ q += 2;
+ }
+ else
+ {
+ *q = *p;
+ q++;
+ }
+ break;
+ case '\t':
+ if (parsing_leading_space)
+ {
+ escaped_character[1] = 't';
+ strcpy (q, escaped_character);
+ q += 2;
+ }
+ else
+ {
+ *q = *p;
+ q++;
+ }
+ break;
+ case '\n':
+ escaped_character[1] = 'n';
+ strcpy (q, escaped_character);
+ q += 2;
+ break;
+ case '\r':
+ escaped_character[1] = 'r';
+ strcpy (q, escaped_character);
+ q += 2;
+ break;
+ case '\\':
+ escaped_character[1] = '\\';
+ strcpy (q, escaped_character);
+ q += 2;
+ parsing_leading_space = FALSE;
+ break;
+ default:
+ if (list_separator && *p == list_separator)
+ {
+ escaped_character[1] = list_separator;
+ strcpy (q, escaped_character);
+ q += 2;
+ parsing_leading_space = TRUE;
+ }
+ else
+ {
+ *q = *p;
+ q++;
+ parsing_leading_space = FALSE;
+ }
+ break;
+ }
+ p++;
+ }
+ *q = '\0';
+
+ return value;
+}
diff --git a/hardinfo/gpu_util.c b/hardinfo/gpu_util.c
index 17c79a73..b203b426 100644
--- a/hardinfo/gpu_util.c
+++ b/hardinfo/gpu_util.c
@@ -20,7 +20,7 @@
#include "hardinfo.h"
#include "gpu_util.h"
-
+#include "nice_name.h"
#include "cpu_util.h" /* for EMPIFNULL() */
nvgpu *nvgpu_new() {
@@ -229,16 +229,12 @@ static void make_nice_name(gpud *s) {
/* try and a get a "short name" for the vendor */
vendor_str = vendor_get_shortest_name(vendor_str);
- /* These two former special cases are currently handled by the vendor_get_shortest_name()
- * function well enough, but the notes are preserved here. */
- /* nvidia PCI strings are pretty nice already,
- * just shorten the company name */
- // s->nice_name = g_strdup_printf("%s %s", "nVidia", device_str);
- /* Intel Graphics may have very long names, like "Intel Corporation Seventh Generation Something Core Something Something Integrated Graphics Processor Revision Ninety-four"
- * but for now at least shorten "Intel Corporation" to just "Intel" */
- // s->nice_name = g_strdup_printf("%s %s", "Intel", device_str);
-
- if (strstr(vendor_str, "AMD")) {
+ if (strstr(vendor_str, "Intel")) {
+ gchar *device_str_clean = strdup(device_str);
+ nice_name_intel_gpu_device(device_str_clean);
+ s->nice_name = g_strdup_printf("%s %s", vendor_str, device_str_clean);
+ g_free(device_str_clean);
+ } else if (strstr(vendor_str, "AMD")) {
/* AMD PCI strings are crazy stupid because they use the exact same
* chip and device id for a zillion "different products" */
char *full_name = strdup(device_str);
diff --git a/hardinfo/info.c b/hardinfo/info.c
index bfc11fc2..cf6af9f9 100644
--- a/hardinfo/info.c
+++ b/hardinfo/info.c
@@ -17,6 +17,13 @@
*/
#include "hardinfo.h"
+#include "util_sysobj.h" /* for SEQ() */
+
+/* Using a slightly modified gg_key_file_parse_string_as_value()
+ * from GLib in flatten(), to escape characters and the separator.
+ * The function is not public in GLib and we don't have a GKeyFile
+ * to pass it anyway. */
+#include "gg_key_file_parse_string_as_value.c"
static const gchar *info_column_titles[] = {
"TextValue", "Value", "Progress", "Extra1", "Extra2"
@@ -267,7 +274,9 @@ static void flatten_group(GString *output, const struct InfoGroup *group, guint
tp);
}
- g_string_append_printf(output, "%s=%s\n", field->name, field->value);
+ gchar *escaped_value = gg_key_file_parse_string_as_value(field->value, '|');
+ g_string_append_printf(output, "%s=%s\n", field->name, escaped_value);
+ g_free(escaped_value);
}
} else if (group->computed) {
g_string_append_printf(output, "%s\n", group->computed);
@@ -369,8 +378,6 @@ gchar *info_flatten(struct Info *info)
return g_string_free(values, FALSE);
}
-#define SEQ(a,b) (g_strcmp0(a,b) == 0)
-
struct InfoField *info_find_field(struct Info *info, const gchar *tag, const gchar *name) {
struct InfoGroup *group;
struct InfoField *field;
diff --git a/hardinfo/udisks2_util.c b/hardinfo/udisks2_util.c
index 0687b14a..8aa54f72 100644
--- a/hardinfo/udisks2_util.c
+++ b/hardinfo/udisks2_util.c
@@ -30,7 +30,7 @@ void find_sdcard_ids_file() {
};
int n;
for(n = 0; file_search_order[n]; n++) {
- if (!access(file_search_order[n], R_OK))
+ if (!sdcard_ids_file && !access(file_search_order[n], R_OK))
sdcard_ids_file = file_search_order[n];
else
g_free(file_search_order[n]);
diff --git a/hardinfo/vendor.c b/hardinfo/vendor.c
index bd2642d8..83c99fcf 100644
--- a/hardinfo/vendor.c
+++ b/hardinfo/vendor.c
@@ -26,9 +26,7 @@
#include "config.h"
#include "hardinfo.h"
#include "strstr_word.h"
-
-#include "dt_util.h" /* for appf() */
-#define SEQ(a,b) (g_strcmp0(a,b) == 0)
+#include "util_sysobj.h" /* for appfsp() and SEQ() */
/* { match_string, match_rule, name, url } */
static Vendor vendors_builtin[] = {
@@ -347,14 +345,14 @@ const Vendor *vendor_match(const gchar *id_str, ...) {
if (id_str) {
c++;
tl += strlen(id_str);
- tmp = appf(tmp, "%s", id_str);
+ tmp = appfsp(tmp, "%s", id_str);
va_start(ap, id_str);
p = va_arg(ap, gchar*);
while(p) {
c++;
tl += strlen(p);
- tmp = appf(tmp, "%s", p);
+ tmp = appfsp(tmp, "%s", p);
p = va_arg(ap, gchar*);
}
va_end(ap);
@@ -425,6 +423,11 @@ gchar *vendor_get_link(const gchar *id_str)
gchar *vendor_get_link_from_vendor(const Vendor *v)
{
+ gboolean label_link_ok = FALSE;
+#if GTK_CHECK_VERSION(2, 18, 0)
+ label_link_ok = TRUE;
+#endif
+
if (!v) {
return g_strdup(_("Unknown"));
}
@@ -433,7 +436,7 @@ gchar *vendor_get_link_from_vendor(const Vendor *v)
return g_strdup(v->name);
}
- if (params.markup_ok) {
+ if (params.markup_ok && label_link_ok) {
const gchar *prefix;
if (!strncmp(v->url, "http://", sizeof("http://") - 1) ||
@@ -506,14 +509,14 @@ vendor_list vendors_match(const gchar *id_str, ...) {
if (id_str) {
c++;
tl += strlen(id_str);
- tmp = appf(tmp, "%s", id_str);
+ tmp = appfsp(tmp, "%s", id_str);
va_start(ap, id_str);
p = va_arg(ap, gchar*);
while(p) {
c++;
tl += strlen(p);
- tmp = appf(tmp, "%s", p);
+ tmp = appfsp(tmp, "%s", p);
p = va_arg(ap, gchar*);
}
va_end(ap);
diff --git a/includes/dt_util.h b/includes/dt_util.h
index 0c5dcfa8..bec9af1c 100644
--- a/includes/dt_util.h
+++ b/includes/dt_util.h
@@ -86,12 +86,6 @@ const char *dtr_find_device_tree_root(void);
/* write to the message log */
void dtr_msg(dtr *s, char *fmt, ...);
-#define sp_sep(STR) (strlen(STR) ? " " : "")
-/* appends an element to a string, adding a space if
- * the string is not empty.
- * ex: ret = appf(ret, "%s=%s\n", name, value); */
-char *appf(char *src, char *fmt, ...);
-
/* operating-points v0,v1,v2 */
typedef struct {
uint32_t version; /* opp version, 0 = clock-frequency only */
diff --git a/modules/benchmark.c b/modules/benchmark.c
index 60b3e9f4..dc71be90 100644
--- a/modules/benchmark.c
+++ b/modules/benchmark.c
@@ -322,10 +322,11 @@ gchar *hi_get_field(gchar * field)
}
static void br_mi_add(char **results_list, bench_result *b, gboolean select) {
+ static unsigned int ri = 0; /* to ensure key is unique */
gchar *ckey, *rkey;
ckey = hardinfo_clean_label(b->machine->cpu_name, 0);
- rkey = strdup(b->machine->mid);
+ rkey = g_strdup_printf("%s__%d", b->machine->mid, ri++);
*results_list = h_strdup_cprintf("$%s%s$%s=%.2f|%s\n", *results_list,
select ? "*" : "", rkey, ckey,
diff --git a/modules/computer/ubuntu_flavors.c b/modules/computer/ubuntu_flavors.c
index ff64eb56..20e83c82 100644
--- a/modules/computer/ubuntu_flavors.c
+++ b/modules/computer/ubuntu_flavors.c
@@ -19,9 +19,7 @@
#include <hardinfo.h>
#include "distro_flavors.h"
-
-#include "dt_util.h" /* for appf() */
-#define SEQ(s,m) (g_strcmp0(s, m) == 0)
+#include "util_sysobj.h" /* for appfsp() */
static const UbuntuFlavor ubuntu_flavors[] = {
{ "Vanilla Server", "distros/ubuntu.svg", "https://ubuntu.org", "ubuntu-server" },
@@ -59,7 +57,7 @@ GSList *ubuntu_flavors_scan(void) {
gchar *cmd_line = g_strdup("apt-cache policy");
int i;
for(i = 0; ubuntu_flavors[i].base.name; i++) {
- cmd_line = appf(cmd_line, "%s", ubuntu_flavors[i].package);
+ cmd_line = appfsp(cmd_line, "%s", ubuntu_flavors[i].package);
}
if (!i)
return NULL;
diff --git a/modules/devices/arm/arm_data.c b/modules/devices/arm/arm_data.c
index 60e8ea34..4ca77be9 100644
--- a/modules/devices/arm/arm_data.c
+++ b/modules/devices/arm/arm_data.c
@@ -82,47 +82,6 @@ static struct {
};
static struct {
- int code; char *name;
-} tab_arm_implementer[] = {
- { 0x41, "ARM" },
- { 0x44, "Intel (formerly DEC) StrongARM" },
- { 0x4e, "nVidia" },
- { 0x54, "Texas Instruments" },
- { 0x56, "Marvell" },
- { 0x69, "Intel XScale" },
- { 0, NULL},
-};
-
-static struct {
- /* source: t = tested, d = official docs, f = web */
- int code; char *part_desc;
-} tab_arm_arm_part[] = { /* only valid for implementer 0x41 ARM */
- /*d */ { 0x920, "ARM920" },
- /*d */ { 0x926, "ARM926" },
- /*d */ { 0x946, "ARM946" },
- /*d */ { 0x966, "ARM966" },
- /*d */ { 0xb02, "ARM11 MPCore" },
- /*d */ { 0xb36, "ARM1136" },
- /*d */ { 0xb56, "ARM1156" },
- /*dt*/ { 0xb76, "ARM1176" },
- /*dt*/ { 0xc05, "Cortex-A5" },
- /*d */ { 0xc07, "Cortex-A7 MPCore" },
- /*dt*/ { 0xc08, "Cortex-A8" },
- /*dt*/ { 0xc09, "Cortex-A9" },
- /*d */ { 0xc0e, "Cortex-A17 MPCore" },
- /*d */ { 0xc0f, "Cortex-A15" },
- /*d */ { 0xd01, "Cortex-A32" },
- /*dt*/ { 0xd03, "Cortex-A53" },
- /*d */ { 0xd04, "Cortex-A35" },
- /*d */ { 0xd05, "Cortex-A55" },
- /*d */ { 0xd07, "Cortex-A57 MPCore" },
- /*d */ { 0xd08, "Cortex-A72" },
- /*d */ { 0xd09, "Cortex-A73" },
- /*d */ { 0xd0a, "Cortex-A75" },
- { 0, NULL},
-};
-
-static struct {
char *code; char *name; char *more;
} tab_arm_arch[] = {
{ "7", "AArch32", "AArch32 (ARMv7)" },
@@ -161,37 +120,47 @@ const char *arm_flag_meaning(const char *flag) {
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++;
+#include "util_ids.h"
+
+gchar *arm_ids_file = NULL;
+
+void find_arm_ids_file() {
+ if (arm_ids_file) return;
+ char *file_search_order[] = {
+ g_build_filename(g_get_user_config_dir(), "hardinfo", "arm.ids", NULL),
+ g_build_filename(params.path_data, "arm.ids", NULL),
+ NULL
+ };
+ int n;
+ for(n = 0; file_search_order[n]; n++) {
+ if (!arm_ids_file && !access(file_search_order[n], R_OK))
+ arm_ids_file = (gchar*) auto_free_on_exit( file_search_order[n] );
+ else
+ g_free(file_search_order[n]);
}
- 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;
+void arm_part(const char *imp_code, const char *part_code, char **imp, char **part) {
+ gchar *qpath = NULL;
+ ids_query_result result = {};
+ unsigned int i,p;
+
+ if (!arm_ids_file)
+ find_arm_ids_file();
+
+ i = strtol(imp_code, NULL, 0);
+ p = strtol(part_code, NULL, 0);
+ qpath = g_strdup_printf("%02x/%03x", i, p);
+ scan_ids_file(arm_ids_file, qpath, &result, -1);
+ g_free(qpath);
+ if (imp)
+ *imp = result.results[0]
+ ? g_strdup(result.results[0])
+ : NULL;
+ if (part)
+ *part = result.results[1]
+ ? g_strdup(result.results[1])
+ : NULL;
}
const char *arm_arch(const char *cpuinfo_arch_str) {
@@ -229,8 +198,7 @@ char *arm_decoded_name(const char *imp, const char *part, const char *var, const
* 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);
+ arm_part(imp, part, &imp_name, &part_desc);
arch_name = (char*) arm_arch(arch);
if (imp_name || part_desc) {
if (arch_name != arch)
@@ -251,6 +219,8 @@ char *arm_decoded_name(const char *imp, const char *part, const char *var, const
(part_desc) ? part_desc : part,
r, p, arch);
}
+ g_free(imp_name);
+ g_free(part_desc);
} else {
/* prolly not ARM arch at all */
if (model_name)
diff --git a/modules/devices/arm/arm_data.h b/modules/devices/arm/arm_data.h
index 63b3c906..0e93d323 100644
--- a/modules/devices/arm/arm_data.h
+++ b/modules/devices/arm/arm_data.h
@@ -22,13 +22,12 @@
#define _ARMDATA_H_
/* table lookups */
-const char *arm_implementer(const char *code);
-const char *arm_part(const char *imp_code, const char *part_code);
+void arm_part(const char *imp_code, const char *part_code, char **imp, char **part);
const char *arm_arch(const char *cpuinfo_arch_str);
const char *arm_arch_more(const char *cpuinfo_arch_str);
/* cpu_implementer, cpu_part, cpu_variant, cpu_revision, cpu_architecture from /proc/cpuinfo
- * model_name is returned as a fallback if not enough data is known */
+ * strdup(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);
diff --git a/modules/devices/arm/processor.c b/modules/devices/arm/processor.c
index 87200335..a1b7f81a 100644
--- a/modules/devices/arm/processor.c
+++ b/modules/devices/arm/processor.c
@@ -311,10 +311,10 @@ gchar *clocks_summary(GSList * processors)
gchar *
processor_get_detailed_info(Processor *processor)
{
- gchar *tmp_flags, *tmp_imp, *tmp_part, *tmp_arch, *tmp_cpufreq, *tmp_topology, *ret;
+ gchar *tmp_flags, *tmp_imp = NULL, *tmp_part = NULL,
+ *tmp_arch, *tmp_cpufreq, *tmp_topology, *ret;
tmp_flags = processor_get_capabilities_from_flags(processor->flags);
- tmp_imp = (char*)arm_implementer(processor->cpu_implementer);
- tmp_part = (char*)arm_part(processor->cpu_implementer, processor->cpu_part);
+ arm_part(processor->cpu_implementer, processor->cpu_part, &tmp_imp, &tmp_part);
tmp_arch = (char*)arm_arch_more(processor->cpu_architecture);
tmp_topology = cputopo_section_str(processor->cputopo);
@@ -375,9 +375,10 @@ gchar *processor_name(GSList *processors) {
char *vendor;
char *soc;
} dt_compat_searches[] = {
- { "brcm,bcm2837", "Broadcom", "BCM2837" }, // RPi 1
+ { "brcm,bcm2838", "Broadcom", "BCM2838" }, // RPi 4
+ { "brcm,bcm2837", "Broadcom", "BCM2837" }, // RPi 3
{ "brcm,bcm2836", "Broadcom", "BCM2836" }, // RPi 2
- { "brcm,bcm2835", "Broadcom", "BCM2835" }, // RPi 3
+ { "brcm,bcm2835", "Broadcom", "BCM2835" }, // RPi 1
{ "rockchip,rk3288", "Rockchip", "RK3288" }, // Asus Tinkerboard
{ "rockchip,rk3328", "Rockchip", "RK3328" }, // Firefly Renegade
{ "rockchip,rk3399", "Rockchip", "RK3399" }, // Firefly Renegade Elite
diff --git a/modules/devices/devicetree.c b/modules/devices/devicetree.c
index 1f2549dd..4fd52cbb 100644
--- a/modules/devices/devicetree.c
+++ b/modules/devices/devicetree.c
@@ -28,6 +28,7 @@
#include "devices.h"
#include "cpu_util.h"
#include "dt_util.h"
+#include "appf.h"
gchar *dtree_info = NULL;
const char *dtree_mem_str = NULL; /* used by memory devices when nothing else is available */
@@ -267,12 +268,12 @@ static void add_keys(dtr *dt, char *np) {
static char *msg_section(dtr *dt, int dump) {
gchar *aslbl = NULL;
gchar *messages = dtr_messages(dt);
- gchar *ret = g_strdup_printf("[%s]\n", _("Messages"));
+ gchar *ret = g_strdup_printf("[%s]", _("Messages"));
gchar **lines = g_strsplit(messages, "\n", 0);
int i = 0;
while(lines[i] != NULL) {
aslbl = hardinfo_clean_label(lines[i], 0);
- ret = appf(ret, "%s=\n", aslbl);
+ ret = appfnl(ret, "%s=", aslbl);
g_free(aslbl);
i++;
}
diff --git a/modules/devices/dmi_memory.c b/modules/devices/dmi_memory.c
index 33181de2..8e9e25c3 100644
--- a/modules/devices/dmi_memory.c
+++ b/modules/devices/dmi_memory.c
@@ -26,7 +26,7 @@
extern const char *dtree_mem_str; /* in devicetree.c */
-#include "dt_util.h" /* for appf() */
+#include "util_sysobj.h" /* for appfsp() */
#define dmi_spd_msg(...) /* fprintf (stderr, __VA_ARGS__) */
typedef uint64_t dmi_mem_size;
@@ -51,7 +51,6 @@ static const char empty_icon[] = "module.png";
#define UNKIFNULL2(f) ((f) ? f : _("(Unknown)"))
#define UNKIFEMPTY2(f) ((*f) ? f : _("(Unknown)"))
-#define SEQ(s,m) (g_strcmp0(s, m) == 0)
#define STR_IGNORE(str, ignore) if (SEQ(str, ignore)) { *str = 0; null_if_empty(&str); }
const char *problem_marker() {
@@ -682,7 +681,7 @@ gchar *memory_devices_get_info() {
for(i = 1; i < N_RAM_TYPES; i++) {
int bit = 1 << (i-1);
if (a->ram_types & bit)
- types_str = appf(types_str, "%s", GET_RAM_TYPE_STR(i));
+ types_str = appfsp(types_str, "%s", GET_RAM_TYPE_STR(i));
}
gchar *details = g_strdup_printf("[%s]\n"
@@ -824,7 +823,7 @@ gchar *memory_devices_get_info() {
for(i = 1; i < N_RAM_TYPES; i++) {
int bit = 1 << (i-1);
if (mem->spd_ram_types & bit)
- types_str = appf(types_str, "%s", GET_RAM_TYPE_STR(i));
+ types_str = appfsp(types_str, "%s", GET_RAM_TYPE_STR(i));
}
gchar *details = g_strdup_printf("[%s]\n"
@@ -924,7 +923,7 @@ gchar *memory_devices_get_system_memory_types_str() {
for(i = 1; i < N_RAM_TYPES; i++) {
int bit = 1 << (i-1);
if (rtypes & bit)
- types_str = appf(types_str, "%s", GET_RAM_TYPE_STR(i));
+ types_str = appfsp(types_str, "%s", GET_RAM_TYPE_STR(i));
}
ret = g_strdup(UNKIFNULL2(types_str));
g_free(types_str);
@@ -954,9 +953,9 @@ static gchar *note_state = NULL;
gboolean memory_devices_hinote(const char **msg) {
- gchar *want_dmi = _(" <b><i>dmidecode</i></b> utility available\n");
- gchar *want_root = _(" ... <i>and</i> HardInfo running with superuser privileges\n");
- gchar *want_eeprom = _(" <b><i>eeprom</i></b> module loaded (for SDR, DDR, DDR2, DDR3)\n");
+ gchar *want_dmi = _(" <b><i>dmidecode</i></b> utility available");
+ gchar *want_root = _(" ... <i>and</i> HardInfo running with superuser privileges");
+ gchar *want_eeprom = _(" <b><i>eeprom</i></b> module loaded (for SDR, DDR, DDR2, DDR3)");
gchar *want_ee1004 = _(" ... <i>or</i> <b><i>ee1004</i></b> module loaded <b>and configured!</b> (for DDR4)");
gboolean has_root = (getuid() == 0);
@@ -968,11 +967,11 @@ gboolean memory_devices_hinote(const char **msg) {
char *bullet_no = "<big><b>\u2022<tt> </tt></b></big>";
g_free(note_state);
- note_state = g_strdup(_("Memory information requires <b>one or both</b> of the following:\n"));
- note_state = appf(note_state, "<tt>1. </tt>%s%s", has_dmi ? bullet_yes : bullet_no, want_dmi);
- note_state = appf(note_state, "<tt> </tt>%s%s", has_root ? bullet_yes : bullet_no, want_root);
- note_state = appf(note_state, "<tt>2. </tt>%s%s", has_eeprom ? bullet_yes : bullet_no, want_eeprom);
- note_state = appf(note_state, "<tt> </tt>%s%s", has_ee1004 ? bullet_yes : bullet_no, want_ee1004);
+ note_state = g_strdup(_("Memory information requires <b>one or both</b> of the following:"));
+ note_state = appfnl(note_state, "<tt>1. </tt>%s%s", has_dmi ? bullet_yes : bullet_no, want_dmi);
+ note_state = appfnl(note_state, "<tt> </tt>%s%s", has_root ? bullet_yes : bullet_no, want_root);
+ note_state = appfnl(note_state, "<tt>2. </tt>%s%s", has_eeprom ? bullet_yes : bullet_no, want_eeprom);
+ note_state = appfnl(note_state, "<tt> </tt>%s%s", has_ee1004 ? bullet_yes : bullet_no, want_ee1004);
gboolean ddr3_ee1004 = ((dmi_ram_types & (1<<DDR3_SDRAM)) && has_ee1004);
diff --git a/modules/devices/x86/processor.c b/modules/devices/x86/processor.c
index 768a70fa..538206c1 100644
--- a/modules/devices/x86/processor.c
+++ b/modules/devices/x86/processor.c
@@ -19,7 +19,7 @@
#include "hardinfo.h"
#include "devices.h"
#include "cpu_util.h"
-
+#include "nice_name.h"
#include "x86_data.h"
#include "x86_data.c"
@@ -567,6 +567,8 @@ GSList *processor_scan(void)
if (processor->cpufreq->cpukhz_max)
processor->cpu_mhz = processor->cpufreq->cpukhz_max / 1000;
+
+ nice_name_x86_cpuid_model_string(processor->model_name);
}
return procs;
@@ -648,7 +650,7 @@ gchar *processor_get_detailed_info(Processor * processor)
processor->model,
processor->stepping,
processor->strmodel,
- _("Vendor"), idle_free(vendor_get_link(processor->vendor_id)),
+ _("Vendor"), (char*)idle_free(vendor_get_link(processor->vendor_id)),
_("Microcode Version"), processor->microcode,
_("Configuration"),
_("Cache Size"), processor->cache_size, _("kb"),
diff --git a/shell/shell.c b/shell/shell.c
index 31836d62..106f6722 100644
--- a/shell/shell.c
+++ b/shell/shell.c
@@ -1271,70 +1271,68 @@ static void group_handle_normal(GKeyFile *key_file,
g_free(tmp);
}
+ g_key_file_set_list_separator(key_file, '|');
+
for (i = 0; keys[i]; i++) {
gchar *key = keys[i];
- gchar *value;
+ gchar **values;
+ gsize vcount = 0;
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);
+ values = g_key_file_get_string_list(key_file, group, key, &vcount, NULL);
+ if (!vcount) {
+ /* Check for empty value */
+ values = g_new0(gchar*, 2);
+ values[0] = g_key_file_get_string(key_file, group, key, NULL);
+ if (values[0]) {
+ vcount = 1;
} else {
- gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, value,
- -1);
+ g_strfreev(values);
+ continue;
}
+ }
- strend(key, '#');
-
- struct UpdateTableItem *item = g_new0(struct UpdateTableItem, 1);
- item->is_iter = TRUE;
- item->iter = gtk_tree_iter_copy(&child);
- gchar *flags, *tag, *name;
- key_get_components(key, &flags, &tag, &name, NULL, NULL, TRUE);
+ if (entry->fieldfunc && values[0] && g_str_equal(values[0], "...")) {
+ g_free(values[0]);
+ values[0] = entry->fieldfunc(key);
+ }
- if (flags) {
- gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, name,
- INFO_TREE_COL_DATA, flags, -1);
- g_hash_table_insert(update_tbl, tag, item);
- g_free(name);
- } else {
- gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, key,
- INFO_TREE_COL_DATA, NULL, -1);
- g_hash_table_insert(update_tbl, name, item);
- g_free(tag);
- }
- g_free(flags);
+ if (ngroups == 1) {
+ gtk_tree_store_append(store, &child, NULL);
+ } else {
+ gtk_tree_store_append(store, &child, &parent);
+ }
+ if (vcount > 0)
+ gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE,
+ values[0], -1);
+ if (vcount > 1)
+ gtk_tree_store_set(store, &child, INFO_TREE_COL_EXTRA1,
+ values[1], -1);
+ if (vcount > 2)
+ gtk_tree_store_set(store, &child, INFO_TREE_COL_EXTRA2,
+ values[2], -1);
+
+ struct UpdateTableItem *item = g_new0(struct UpdateTableItem, 1);
+ item->is_iter = TRUE;
+ item->iter = gtk_tree_iter_copy(&child);
+ gchar *flags, *tag, *name;
+ key_get_components(key, &flags, &tag, &name, NULL, NULL, TRUE);
+
+ if (flags) {
+ gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, name,
+ INFO_TREE_COL_DATA, flags, -1);
+ g_hash_table_insert(update_tbl, tag, item);
+ g_free(name);
+ } else {
+ gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, key,
+ INFO_TREE_COL_DATA, NULL, -1);
+ g_hash_table_insert(update_tbl, name, item);
+ g_free(tag);
}
+ g_free(flags);
- g_free(value);
+ g_strfreev(values);
}
}
@@ -1564,7 +1562,7 @@ static void module_selected_show_info_detail(GKeyFile *key_file,
gchar *name, *label, *tag;
key_get_components(keys[j], NULL, &tag, &name, &label, NULL, TRUE);
- value = g_key_file_get_value(key_file, groups[i], keys[j], NULL);
+ value = g_key_file_get_string(key_file, groups[i], keys[j], NULL);
if (entry && entry->fieldfunc && value && g_str_equal(value, "...")) {
g_free(value);