#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#ifdef NETPERF_STANDALONE_DEBUG
#include <errno.h>
#endif

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

static void
find_cpu_model(char **cpu_model) {
  char linebuf[256];
  char *cret;
  int  ret;
  int  c;

  FILE *proccpu;

  proccpu = fopen("/proc/cpuinfo","r");

  if (NULL == proccpu) {
    *cpu_model = strdup("fopen");
    return;
  }

  do {
    cret = fgets(linebuf,256,proccpu);
    if (NULL != cret) {
      char *target;
      /* OK, so does it start with "model name" ? */
      if (strstr(linebuf,"model name") != NULL) {
	/* one for the money "model name" */
	target = strtok(linebuf,":");
	/* two for the show (the actual model name) */
	target = strtok(NULL,":");
	/* three to get ready - strip the eol */
	target[strlen(target)-1] = 0;
	/* and four to go! */
	*cpu_model = strdup(target+1);
	return;
      }
    }
  } while (!feof(proccpu));
  *cpu_model = strdup("model_name");
}

static int
find_cpu_freq() {
  char linebuf[256];
  char *cret;
  int  ret;
  int  c;

  FILE *proccpu;

  proccpu = fopen("/proc/cpuinfo","r");

  if (NULL == proccpu) {
    return -1;
  }

  do {
    cret = fgets(linebuf,256,proccpu);
    if (NULL != cret) {
      char *target;
      /* OK, so does it start with "model name" ? */
      if (strstr(linebuf,"cpu MHz") != NULL) {
	target = strtok(linebuf,":");
	target = strtok(NULL,":");
	return rint(strtod(target+1,NULL));
      }
    }
  } while (!feof(proccpu));
  return -1;
}

static void 
find_system_model(char **system_model) {
#if defined(HAVE_LIBSMBIOS)
#if defined(HAVE_SMBIOS_SYSTEMINFO_H)
#include <smbios/SystemInfo.h>
#else
  /* take our best shot - the interface seems simple and stable enough
     that we don't have to require the -dev package be installed */
  extern const char *SMBIOSGetSystemName();
#endif

  char *temp_model;

  /* SMBIOSGetSystemModel allocated */
  temp_model = (char *) SMBIOSGetSystemName();
  if (temp_model)
    *system_model = temp_model;
  else
    *system_model = strdup("SMBIOSGetSystemModel");

#else
  /* we do not even have the library so there isn't much to do here
     unless someone wants to teach netperf how to find and parse
     SMBIOS all by its lonesome. raj 2008-03-13 */
  *system_model = strdup("Teach Me SMBIOS");
#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(cpu_model);
  *cpu_frequency = find_cpu_freq();

}

#ifdef 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);

  return 0;

}

#endif
