From 51e79ddc07c0b3e070b5fe395703ce7ffe1878b9 Mon Sep 17 00:00:00 2001 From: ahgamut <41098605+ahgamut@users.noreply.github.com> Date: Wed, 27 Jan 2021 15:15:48 +0530 Subject: [#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. --- SysArchMeter.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 SysArchMeter.c (limited to 'SysArchMeter.c') 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 +#include +#include + +#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: ", +}; -- cgit v1.2.3