blob: 15a14a69757682c105dee640aa89a35fa1f65700 [file] [log] [blame]
#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