| #ifdef HAVE_CONFIG_H |
| #include <config.h> |
| #endif |
| |
| #include <stdio.h> |
| #include <errno.h> |
| #include <math.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <kstat.h> |
| |
| 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 <sys/systeminfo.h> |
| 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 <sys/smbios.h> |
| 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 |
| |