@@ -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}
0 commit comments