Skip to content

Commit e1067bd

Browse files
adding new metadata to host info flag
1 parent a57668b commit e1067bd

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed

code/logic/common.c

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,16 @@ static void _show_host(void) {
178178
if (pizza_sys_hostinfo_get_system(&system_info) == 0) {
179179
pizza_io_printf("{blue}Operating System: {cyan}%s{reset}\n", system_info.os_name);
180180
pizza_io_printf("{blue}OS Version: {cyan}%s{reset}\n", system_info.os_version);
181+
pizza_io_printf("{blue}Architecture: {cyan}%s{reset}\n", system_info.os_arch);
182+
pizza_io_printf("{blue}Build: {cyan}%s{reset}\n", system_info.os_build);
183+
pizza_io_printf("{blue}Release: {cyan}%s{reset}\n", system_info.os_release);
184+
pizza_io_printf("{blue}Codename: {cyan}%s{reset}\n", system_info.os_codename);
185+
pizza_io_printf("{blue}Description: {cyan}%s{reset}\n", system_info.os_description);
186+
pizza_io_printf("{blue}Vendor: {cyan}%s{reset}\n", system_info.os_vendor);
187+
pizza_io_printf("{blue}Family: {cyan}%s{reset}\n", system_info.os_family);
188+
pizza_io_printf("{blue}Type: {cyan}%s{reset}\n", system_info.os_type);
189+
pizza_io_printf("{blue}Platform: {cyan}%s{reset}\n", system_info.os_platform);
190+
pizza_io_printf("{blue}Machine: {cyan}%s{reset}\n", system_info.os_machine);
181191
pizza_io_printf("{blue}Kernel Version: {cyan}%s{reset}\n", system_info.kernel_version);
182192
} else {
183193
pizza_io_printf("{red}Error retrieving system information.{reset}\n");
@@ -606,23 +616,108 @@ int pizza_sys_hostinfo_get_system(pizza_sys_hostinfo_system_t *info) {
606616
if (!info) return -1;
607617
#ifdef _WIN32
608618
OSVERSIONINFO osvi;
619+
SYSTEM_INFO sysinfo;
609620
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
610621
if (!GetVersionEx(&osvi)) return -1;
622+
GetSystemInfo(&sysinfo);
623+
611624
snprintf(info->os_name, sizeof(info->os_name), "Windows");
612625
snprintf(info->os_version, sizeof(info->os_version), "%lu.%lu", osvi.dwMajorVersion, osvi.dwMinorVersion);
626+
snprintf(info->os_arch, sizeof(info->os_arch), "%u", sysinfo.wProcessorArchitecture);
627+
snprintf(info->os_build, sizeof(info->os_build), "%lu", osvi.dwBuildNumber);
628+
snprintf(info->os_release, sizeof(info->os_release), "%lu", osvi.dwBuildNumber);
629+
snprintf(info->os_codename, sizeof(info->os_codename), "N/A");
630+
snprintf(info->os_description, sizeof(info->os_description), "Microsoft Windows");
631+
snprintf(info->os_vendor, sizeof(info->os_vendor), "Microsoft");
632+
snprintf(info->os_family, sizeof(info->os_family), "Windows NT");
633+
snprintf(info->os_type, sizeof(info->os_type), "Desktop");
634+
snprintf(info->os_platform, sizeof(info->os_platform), "win32");
635+
snprintf(info->os_machine, sizeof(info->os_machine), "%u", sysinfo.dwProcessorType);
613636
snprintf(info->kernel_version, sizeof(info->kernel_version), "%lu", osvi.dwBuildNumber);
614637
#elif defined(__APPLE__)
615638
struct utsname sysinfo;
616639
if (uname(&sysinfo) != 0) return -1;
617640
strncpy(info->os_name, sysinfo.sysname, sizeof(info->os_name) - 1);
641+
info->os_name[sizeof(info->os_name) - 1] = '\0';
618642
strncpy(info->os_version, sysinfo.version, sizeof(info->os_version) - 1);
643+
info->os_version[sizeof(info->os_version) - 1] = '\0';
644+
strncpy(info->os_arch, sysinfo.machine, sizeof(info->os_arch) - 1);
645+
info->os_arch[sizeof(info->os_arch) - 1] = '\0';
646+
strncpy(info->os_build, sysinfo.release, sizeof(info->os_build) - 1);
647+
info->os_build[sizeof(info->os_build) - 1] = '\0';
648+
strncpy(info->os_release, sysinfo.release, sizeof(info->os_release) - 1);
649+
info->os_release[sizeof(info->os_release) - 1] = '\0';
650+
snprintf(info->os_codename, sizeof(info->os_codename), "Darwin");
651+
snprintf(info->os_description, sizeof(info->os_description), "Apple macOS");
652+
snprintf(info->os_vendor, sizeof(info->os_vendor), "Apple");
653+
snprintf(info->os_family, sizeof(info->os_family), "Unix");
654+
snprintf(info->os_type, sizeof(info->os_type), "Desktop");
655+
snprintf(info->os_platform, sizeof(info->os_platform), "darwin");
656+
strncpy(info->os_machine, sysinfo.machine, sizeof(info->os_machine) - 1);
657+
info->os_machine[sizeof(info->os_machine) - 1] = '\0';
619658
strncpy(info->kernel_version, sysinfo.release, sizeof(info->kernel_version) - 1);
659+
info->kernel_version[sizeof(info->kernel_version) - 1] = '\0';
620660
#else
621661
struct utsname sysinfo;
622662
if (uname(&sysinfo) != 0) return -1;
623663
strncpy(info->os_name, sysinfo.sysname, sizeof(info->os_name) - 1);
664+
info->os_name[sizeof(info->os_name) - 1] = '\0';
624665
strncpy(info->os_version, sysinfo.version, sizeof(info->os_version) - 1);
666+
info->os_version[sizeof(info->os_version) - 1] = '\0';
667+
strncpy(info->os_arch, sysinfo.machine, sizeof(info->os_arch) - 1);
668+
info->os_arch[sizeof(info->os_arch) - 1] = '\0';
669+
strncpy(info->os_build, sysinfo.release, sizeof(info->os_build) - 1);
670+
info->os_build[sizeof(info->os_build) - 1] = '\0';
671+
strncpy(info->os_release, sysinfo.release, sizeof(info->os_release) - 1);
672+
info->os_release[sizeof(info->os_release) - 1] = '\0';
673+
snprintf(info->os_codename, sizeof(info->os_codename), "Linux");
674+
snprintf(info->os_description, sizeof(info->os_description), "GNU/Linux");
675+
// Try to detect Linux vendor from /etc/os-release or /etc/lsb-release
676+
FILE *fp = fopen("/etc/os-release", "r");
677+
char vendor[128] = "Unknown";
678+
if (fp) {
679+
char line[256];
680+
while (fgets(line, sizeof(line), fp)) {
681+
if (strncmp(line, "ID=", 3) == 0) {
682+
char *val = line + 3;
683+
// Remove newline and quotes
684+
char *nline = strchr(val, '\n');
685+
if (nline) *nline = '\0';
686+
if (*val == '"' || *val == '\'') val++;
687+
size_t len = strlen(val);
688+
if (len > 0 && (val[len - 1] == '"' || val[len - 1] == '\'')) val[len - 1] = '\0';
689+
strncpy(vendor, val, sizeof(vendor) - 1);
690+
vendor[sizeof(vendor) - 1] = '\0';
691+
break;
692+
}
693+
}
694+
fclose(fp);
695+
} else {
696+
// Fallback: try /etc/lsb-release
697+
fp = fopen("/etc/lsb-release", "r");
698+
if (fp) {
699+
char line[256];
700+
while (fgets(line, sizeof(line), fp)) {
701+
if (strncmp(line, "DISTRIB_ID=", 11) == 0) {
702+
char *val = line + 11;
703+
char *nline = strchr(val, '\n');
704+
if (nline) *nline = '\0';
705+
strncpy(vendor, val, sizeof(vendor) - 1);
706+
vendor[sizeof(vendor) - 1] = '\0';
707+
break;
708+
}
709+
}
710+
fclose(fp);
711+
}
712+
}
713+
snprintf(info->os_vendor, sizeof(info->os_vendor), "%s", vendor);
714+
snprintf(info->os_family, sizeof(info->os_family), "Unix");
715+
snprintf(info->os_type, sizeof(info->os_type), "Desktop/Server");
716+
snprintf(info->os_platform, sizeof(info->os_platform), "linux");
717+
strncpy(info->os_machine, sysinfo.machine, sizeof(info->os_machine) - 1);
718+
info->os_machine[sizeof(info->os_machine) - 1] = '\0';
625719
strncpy(info->kernel_version, sysinfo.release, sizeof(info->kernel_version) - 1);
720+
info->kernel_version[sizeof(info->kernel_version) - 1] = '\0';
626721
#endif
627722
return 0;
628723
}

code/logic/fossil/pizza/common.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,16 @@ typedef struct {
385385
typedef struct {
386386
char os_name[128];
387387
char os_version[128];
388+
char os_arch[64];
389+
char os_build[64];
390+
char os_release[64];
391+
char os_codename[64];
392+
char os_description[256];
393+
char os_vendor[128];
394+
char os_family[64];
395+
char os_type[64];
396+
char os_platform[64];
397+
char os_machine[64];
388398
char kernel_version[128];
389399
} pizza_sys_hostinfo_system_t;
390400

0 commit comments

Comments
 (0)