#ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include static kstat_ctl_t *kc = NULL; static kid_t kcid = 0; static void find_cpu_model_freq(char **cpu_model, int *frequency) { kstat_t *ksp; kid_t nkcid; kstat_named_t *knp; int i,found_brand,found_freq; found_brand = 0; found_freq = 0; kc = kstat_open(); if (NULL == kc) { *cpu_model = strdup("kstat_open"); *frequency = -1; return; } ksp = kstat_lookup(kc, "cpu_info", 0, NULL); if ((NULL == ksp) || ((ksp) && (KSTAT_TYPE_NAMED != ksp->ks_type))) { *cpu_model = strdup("kstat_lookup"); *frequency = -1; kstat_close(kc); return; } nkcid = kstat_read(kc, ksp, NULL); if (-1 == nkcid) { *cpu_model = strdup("kstat_read"); *frequency = -1; kstat_close(kc); return; } for (i = ksp->ks_ndata, knp = ksp->ks_data; i > 0; knp++, i--) { if (!strcmp("brand", knp->name)) { *cpu_model = strdup(KSTAT_NAMED_STR_PTR(knp)); found_brand = 1; } else if (!strcmp("clock_MHz",knp->name)) { *frequency = (int)knp->value.ui32; found_freq = 1; } } if (!found_brand) *cpu_model = strdup("CPU Not Found"); if (!found_freq) *frequency = -1; kstat_close(kc); } static void find_system_model_sysinfo(char **system_model) { #include char model_str[37]; char *token1,*token2; long ret; /* sysinfo is kind enough to zero-terminate for us. we will be ignoring the leading SUNW, if present so use 37 instead of 35 in case the platform name is long */ ret = sysinfo(SI_PLATFORM,model_str,37); if (-1 != ret) { /* however, it seems to shove potentially redundant information at us and include a comma, which we have no desire to include, so we will ass-u-me we can do a couple strtok calls to be rid of that */ token1 = strtok(model_str,","); token2 = strtok(NULL,","); if (token2) *system_model = strdup(token2); else *system_model = strdup(model_str); } else *system_model = strdup("sysinfo"); } static void find_system_model(char **system_model) { /* the .h file will be there even on a SPARC system, so we have to check for both the .h and the libarary... */ #if defined(HAVE_SYS_SMBIOS_H) && defined(HAVE_LIBSMBIOS) #include smbios_hdl_t *smbios_handle; smbios_info_t info; int error; int ret; id_t ret_id_t; /* much of this is wild guessing based on web searches, sys/smbios.h, and experimentation. my thanks to a helpful person familiar with libsmbios who got me started. feel free to make yourself known as you see fit :) rick jones 2008-03-12 */ smbios_handle = smbios_open(NULL,SMB_VERSION,0,&error); if (NULL == smbios_handle) { /* fall-back on sysinfo for the system model info, we don't really care why we didn't get a handle, just that we didn't get one */ #if defined(NETPERF_STANDALONE_DEBUG) printf("smbios_open returned NULL, error %d errno %d %s\n", error,errno,strerror(errno)); #endif find_system_model_sysinfo(system_model); return; } ret = smbios_info_common(smbios_handle,256,&info); if (0 == ret) *system_model = strdup(info.smbi_product); else { /* we ass-u-me that while there was smbios on the system it didn't have the smbi_product information we seek, so once again we fallback to sysinfo. this is getting tiresome isn't it?-) raj 2008-03-12 */ #if defined(NETPERF_STANDALONE_DEBUG) printf("smbios_info_common returned %d errno %d %s\n", ret,errno,strerror(errno)); #endif find_system_model_sysinfo(system_model); } smbios_close(smbios_handle); #else find_system_model_sysinfo(system_model); #endif return; } void find_system_info(char **system_model, char **cpu_model, int *cpu_frequency) { int ret; find_system_model(system_model); find_cpu_model_freq(cpu_model,cpu_frequency); } #if defined(NETPERF_STANDALONE_DEBUG) int main(int argc, char *argv[]) { char *system_model; char *cpu_model; int frequency; find_system_info(&system_model,&cpu_model,&frequency); printf("system_model %s, cpu_model %s, frequency %d\n", system_model, cpu_model, frequency); } #endif