summaryrefslogtreecommitdiffstats
path: root/SysArchMeter.c
diff options
context:
space:
mode:
authorahgamut <41098605+ahgamut@users.noreply.github.com>2021-01-27 15:15:48 +0530
committerBenBE <BenBE@geshi.org>2021-01-31 20:08:09 +0100
commit51e79ddc07c0b3e070b5fe395703ce7ffe1878b9 (patch)
tree247d028a3be0a3e63ac64bd8bd1438647bf379e5 /SysArchMeter.c
parent7bfa466abe65ff14d530ae16c344cdc06d5145ea (diff)
[#480] SysArchMeter to view kernel/arch info
At start, SysArchMeter calls the uname function to obtain the kernel version and architecture. If available, the distro version is obtained by calling lsb_release. The obtained values are stored in static variables and used when updating the meter.
Diffstat (limited to 'SysArchMeter.c')
-rw-r--r--SysArchMeter.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/SysArchMeter.c b/SysArchMeter.c
new file mode 100644
index 00000000..083d079d
--- /dev/null
+++ b/SysArchMeter.c
@@ -0,0 +1,83 @@
+/*
+htop - SysArchMeter.c
+(C) 2021 htop dev team
+Released under the GNU GPLv2, see the COPYING file
+in the source distribution for its full text.
+*/
+#include "config.h" // IWYU pragma: keep
+
+#include "SysArchMeter.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/utsname.h>
+
+#include "XUtils.h"
+
+
+static const int SysArchMeter_attributes[] = {HOSTNAME};
+
+static void SysArchMeter_updateValues(Meter* this, char* buffer, size_t size) {
+ static struct utsname uname_info;
+ static int uname_result;
+ static char distro[3][64] = { {'\0'}, {'\0'}, {'\0'} };
+ static bool loaded_data = false;
+
+ (void)this;
+
+ if(!loaded_data) {
+ uname_result = uname(&uname_info);
+ FILE* fp = popen("lsb_release --id --release --codename", "r");
+ if(fp) {
+ char line[96] = {'\0'};
+ size_t n = 0;
+
+ while(fgets(line, sizeof(line), fp)) {
+ n = strcspn(line, ":");
+ if(n > 0 && (n + 1) < strlen(line)) {
+ char* value = String_trim(&line[n + 1]);
+ line[n] = '\0';
+
+ if(String_eq(line, "Distributor ID"))
+ snprintf(distro[0], sizeof(distro[0]), "%s", value);
+ else if(String_eq(line, "Release"))
+ snprintf(distro[1], sizeof(distro[1]), "%s", value);
+ else if(String_eq(line, "Codename"))
+ snprintf(distro[2], sizeof(distro[2]), "%s", value);
+
+ free(value);
+ }
+ }
+ if(!distro[0][0])
+ snprintf(distro[0], sizeof(distro[0]), "Unknown");
+ pclose(fp);
+ }
+ loaded_data = true;
+ }
+
+ if(uname_result == 0) {
+ if (distro[1][0] && distro[2][0])
+ snprintf(buffer, size, "%s %s [%s] / %s %s (%s)", uname_info.sysname, uname_info.release, uname_info.machine, distro[0], distro[1], distro[2]);
+ else if(distro[1][0])
+ snprintf(buffer, size, "%s %s [%s] / %s %s", uname_info.sysname, uname_info.release, uname_info.machine, distro[0], distro[1]);
+ else
+ snprintf(buffer, size, "%s %s [%s]", uname_info.sysname, uname_info.release, uname_info.machine);
+ } else {
+ snprintf(buffer, size, "Unknown");
+ }
+}
+
+const MeterClass SysArchMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete
+ },
+ .updateValues = SysArchMeter_updateValues,
+ .defaultMode = TEXT_METERMODE,
+ .maxItems = 0,
+ .total = 100.0,
+ .attributes = SysArchMeter_attributes,
+ .name = "System",
+ .uiName = "System",
+ .caption = "System: ",
+};

© 2014-2024 Faster IT GmbH | imprint | privacy policy