2021-02-18 22:25:36 +01:00
#include "fastfetch.h"
2022-01-10 15:20:51 +01:00
#include <ctype.h>
2021-04-15 18:59:26 +02:00
#define FF_HOST_MODULE_NAME "Host"
2022-06-14 17:10:46 +02:00
#define FF_HOST_NUM_FORMAT_ARGS 15
2021-04-15 18:59:26 +02:00
2021-05-14 16:03:19 +02:00
static bool hostValueSet ( FFstrbuf * value )
2021-04-23 20:59:13 +02:00
{
2021-06-16 10:50:16 +02:00
ffStrbufTrimRight ( value , '\n' );
2021-05-14 16:03:19 +02:00
ffStrbufTrim ( value , ' ' );
2021-04-23 20:59:13 +02:00
return
value -> length > 0 &&
2021-06-16 10:50:16 +02:00
ffStrbufStartsWithIgnCaseS ( value , "To be filled" ) != true &&
ffStrbufStartsWithIgnCaseS ( value , "To be set" ) != true &&
ffStrbufStartsWithIgnCaseS ( value , "OEM" ) != true &&
ffStrbufStartsWithIgnCaseS ( value , "O.E.M." ) != true &&
2021-04-23 20:59:13 +02:00
ffStrbufIgnCaseCompS ( value , "None" ) != 0 &&
2021-06-16 10:50:16 +02:00
ffStrbufIgnCaseCompS ( value , "System Product" ) != 0 &&
2021-05-14 16:03:19 +02:00
ffStrbufIgnCaseCompS ( value , "System Product Name" ) != 0 &&
2021-06-16 10:50:16 +02:00
ffStrbufIgnCaseCompS ( value , "System Product Version" ) != 0 &&
ffStrbufIgnCaseCompS ( value , "System Name" ) != 0 &&
2021-06-14 23:22:14 +02:00
ffStrbufIgnCaseCompS ( value , "System Version" ) != 0 &&
2021-06-16 10:50:16 +02:00
ffStrbufIgnCaseCompS ( value , "Default string" ) != 0 &&
ffStrbufIgnCaseCompS ( value , "Undefined" ) != 0 &&
ffStrbufIgnCaseCompS ( value , "Not Specified" ) != 0 &&
ffStrbufIgnCaseCompS ( value , "Not Applicable" ) != 0 &&
ffStrbufIgnCaseCompS ( value , "INVALID" ) != 0 &&
2021-06-15 18:12:33 +02:00
ffStrbufIgnCaseCompS ( value , "Type1ProductConfigId" ) != 0 &&
2021-06-16 10:50:16 +02:00
ffStrbufIgnCaseCompS ( value , "All Series" ) != 0
2021-04-23 20:59:13 +02:00
;
}
2022-01-10 15:24:10 +01:00
#ifndef __ANDROID__
2022-01-10 15:20:51 +01:00
static void getHostValue ( const char * devicesPath , const char * classPath , FFstrbuf * buffer )
2021-06-16 10:50:16 +02:00
{
2021-06-16 12:20:56 +02:00
ffGetFileContent ( devicesPath , buffer );
2021-06-16 10:50:16 +02:00
2021-06-16 12:20:56 +02:00
if ( buffer -> length == 0 )
ffGetFileContent ( classPath , buffer );
2021-06-16 10:50:16 +02:00
}
2022-01-10 15:24:10 +01:00
#endif
2021-06-16 10:50:16 +02:00
2021-02-27 18:30:05 +01:00
void ffPrintHost ( FFinstance * instance )
2021-02-18 22:25:36 +01:00
{
2021-04-15 18:59:26 +02:00
if ( ffPrintFromCache ( instance , FF_HOST_MODULE_NAME , & instance -> config . hostKey , & instance -> config . hostFormat , FF_HOST_NUM_FORMAT_ARGS ))
2021-02-22 16:52:51 +01:00
return ;
2022-06-14 17:10:46 +02:00
FFstrbuf product_family ;
ffStrbufInit ( & product_family );
2022-01-10 15:20:51 +01:00
#ifndef __ANDROID__
2022-06-14 17:10:46 +02:00
getHostValue ( "/sys/devices/virtual/dmi/id/product_family" , "/sys/class/dmi/id/product_family" , & product_family );
if ( ! hostValueSet ( & product_family ))
ffStrbufClear ( & product_family );
2022-01-10 15:20:51 +01:00
#else
2022-06-14 17:10:46 +02:00
ffSettingsGetAndroidProperty ( "ro.product.device" , & product_family );
2022-01-10 15:20:51 +01:00
#endif
2021-06-16 10:50:16 +02:00
2022-06-14 17:10:46 +02:00
FFstrbuf product_name ;
ffStrbufInit ( & product_name );
2022-01-10 15:20:51 +01:00
#ifndef __ANDROID__
2022-06-14 17:10:46 +02:00
getHostValue ( "/sys/devices/virtual/dmi/id/product_name" , "/sys/class/dmi/id/product_name" , & product_name );
2021-06-16 10:50:16 +02:00
2022-06-14 17:10:46 +02:00
if ( product_name . length == 0 )
ffGetFileContent ( "/sys/firmware/devicetree/base/model" , & product_name );
2021-06-16 10:50:16 +02:00
2022-06-14 17:10:46 +02:00
if ( product_name . length == 0 )
ffGetFileContent ( "/tmp/sysinfo/model" , & product_name );
2021-06-16 12:20:56 +02:00
2022-06-14 17:10:46 +02:00
if ( ffStrbufStartsWithS ( & product_name , "Standard PC" ))
2022-01-10 15:20:51 +01:00
{
FFstrbuf copy ;
2022-06-14 17:10:46 +02:00
ffStrbufInitCopy ( & copy , & product_name );
ffStrbufSetS ( & product_name , "KVM/QEMU " );
ffStrbufAppend ( & product_name , & copy );
2022-01-10 15:20:51 +01:00
ffStrbufDestroy ( & copy );
}
2022-06-14 17:10:46 +02:00
if ( ! hostValueSet ( & product_name ))
ffStrbufClear ( & product_name );
2022-01-10 15:20:51 +01:00
#else
2022-06-14 17:10:46 +02:00
ffSettingsGetAndroidProperty ( "ro.product.brand" , & product_name );
if ( product_name . length > 0 ){
product_name . chars [ 0 ] = ( char ) toupper ( product_name . chars [ 0 ]);
ffStrbufAppendC ( & product_name , ' ' );
2022-01-10 15:20:51 +01:00
}
2021-06-16 10:50:16 +02:00
2022-06-14 17:10:46 +02:00
if ( ! ffSettingsGetAndroidProperty ( "ro.product.model" , & product_name ))
ffSettingsGetAndroidProperty ( "ro.product.name" , & product_name );
2021-06-16 10:50:16 +02:00
2022-06-14 17:10:46 +02:00
ffStrbufTrimRight ( & product_name , ' ' );
2022-01-10 15:20:51 +01:00
#endif
2021-03-12 12:16:41 +01:00
2022-06-14 17:10:46 +02:00
if ( product_family . length == 0 && product_name . length == 0 )
2021-04-03 21:51:50 +02:00
{
2022-06-14 17:10:46 +02:00
ffStrbufDestroy ( & product_family );
ffStrbufDestroy ( & product_name );
ffPrintError ( instance , FF_HOST_MODULE_NAME , 0 , & instance -> config . hostKey , & instance -> config . hostFormat , FF_HOST_NUM_FORMAT_ARGS , "neither product_family nor product_name is set by O.E.M." );
2021-04-03 21:51:50 +02:00
return ;
}
2022-06-14 17:10:46 +02:00
#ifdef __ANDROID__
#define FF_HOST_DATA(name)
FFstrbuf product_name ; \
ffStrbufInitA ( & product_name , 0 );
#else
#define FF_HOST_DATA(name) \
FFstrbuf name; \
ffStrbufInit(&name); \
getHostValue("/sys/devices/virtual/dmi/id/"#name, "/sys/class/dmi/id/"#name, &name); \
if(!hostValueSet(&name)) \
ffStrbufClear(&name);
#endif
FF_HOST_DATA ( product_version )
FF_HOST_DATA ( product_sku )
FF_HOST_DATA ( bios_date )
FF_HOST_DATA ( bios_release )
FF_HOST_DATA ( bios_vendor )
FF_HOST_DATA ( bios_version )
FF_HOST_DATA ( board_name )
FF_HOST_DATA ( board_vendor )
FF_HOST_DATA ( board_version )
FF_HOST_DATA ( chassis_type )
FF_HOST_DATA ( chassis_vendor )
FF_HOST_DATA ( chassis_version )
FF_HOST_DATA ( sys_vendor )
2021-06-16 10:50:16 +02:00
FFstrbuf host ;
ffStrbufInit ( & host );
2021-03-19 20:57:07 +01:00
2022-06-14 17:10:46 +02:00
if ( product_name . length > 0 )
ffStrbufAppend ( & host , & product_name );
2021-03-23 19:48:52 +01:00
else
2022-06-14 17:10:46 +02:00
ffStrbufAppend ( & host , & product_family );
2021-04-15 18:59:26 +02:00
2022-06-14 17:10:46 +02:00
if ( product_version . length > 0 )
2021-06-16 10:50:16 +02:00
{
2021-04-15 18:59:26 +02:00
ffStrbufAppendC ( & host , ' ' );
2022-06-14 17:10:46 +02:00
ffStrbufAppend ( & host , & product_version );
2021-03-23 19:48:52 +01:00
}
2021-02-22 16:52:51 +01:00
2022-04-08 15:50:49 +02:00
ffPrintAndWriteToCache ( instance , FF_HOST_MODULE_NAME , & instance -> config . hostKey , & host , & instance -> config . hostFormat , FF_HOST_NUM_FORMAT_ARGS , ( FFformatarg []) {
2022-06-14 17:10:46 +02:00
{ FF_FORMAT_ARG_TYPE_STRBUF , & product_family },
{ FF_FORMAT_ARG_TYPE_STRBUF , & product_name },
{ FF_FORMAT_ARG_TYPE_STRBUF , & product_version },
{ FF_FORMAT_ARG_TYPE_STRBUF , & product_sku },
{ FF_FORMAT_ARG_TYPE_STRBUF , & bios_date },
{ FF_FORMAT_ARG_TYPE_STRBUF , & bios_release },
{ FF_FORMAT_ARG_TYPE_STRBUF , & bios_vendor },
{ FF_FORMAT_ARG_TYPE_STRBUF , & bios_version },
{ FF_FORMAT_ARG_TYPE_STRBUF , & board_name },
{ FF_FORMAT_ARG_TYPE_STRBUF , & board_vendor },
{ FF_FORMAT_ARG_TYPE_STRBUF , & board_version },
{ FF_FORMAT_ARG_TYPE_STRBUF , & chassis_type },
{ FF_FORMAT_ARG_TYPE_STRBUF , & chassis_vendor },
{ FF_FORMAT_ARG_TYPE_STRBUF , & chassis_version },
{ FF_FORMAT_ARG_TYPE_STRBUF , & sys_vendor }
2021-04-15 18:59:26 +02:00
});
2021-03-21 16:52:17 +01:00
2022-06-14 17:10:46 +02:00
ffStrbufDestroy ( & product_family );
ffStrbufDestroy ( & product_name );
//On Android, all of them get initialized without heap, so no need to destroy them.
#ifndef __ANDROID__
ffStrbufDestroy ( & product_version );
ffStrbufDestroy ( & product_sku );
ffStrbufDestroy ( & bios_date );
ffStrbufDestroy ( & bios_release );
ffStrbufDestroy ( & bios_vendor );
ffStrbufDestroy ( & bios_version );
ffStrbufDestroy ( & board_name );
ffStrbufDestroy ( & board_vendor );
ffStrbufDestroy ( & board_version );
ffStrbufDestroy ( & chassis_type );
ffStrbufDestroy ( & chassis_vendor );
ffStrbufDestroy ( & chassis_version );
ffStrbufDestroy ( & sys_vendor );
#endif
2021-03-27 18:14:19 +01:00
}