1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
/* getsysinfo.c *\
\* I was trying to make this easier to add other platforms/ */
/* architectures. Feel free to add yours, and send me the patch. *\
\*----------------------------------------------------------------*/
/* Initial gernic Linux and Irix -- Vince Weaver *\
\* Added Linux mc6800 support -- Christian Marillat */
/* Added Cyrix 6x86 support" -- Adam J. Thornton */
#include <stdio.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/utsname.h>
#include <string.h>
#include "sysinfo_common.h"
int external_bogomips(char *bogomips_total);
void get_os_info(char *os_name,char *os_version,char *os_revision,
char *host_name,char *uptime)
{
struct utsname buf;
uname( &buf);
strcpy(os_name,buf.sysname);
strcpy(os_version,buf.release);
strcpy(os_revision,buf.version);
strcpy(os_revision,"Compiled ");
strcat(os_revision,buf.version);
strcpy(host_name,buf.nodename);
strcpy(uptime,linux_get_proc_uptime(uptime));
/*
printf("machine: %s\n",buf.machine);
printf("domain: %s\n",buf.domainname);*/
}
void get_hardware_info(char *cpuinfo,char *bogo_total,int skip_bogomips)
{
FILE *fff;
int cpus=0;
struct stat buff;
long long int mem;
float bogomips=0.0;
char temp_string2[BUFSIZ],model[BUFSIZ],vendor[BUFSIZ],chip[BUFSIZ];
char temp_string[BUFSIZ],bogomips_total[BUFSIZ];
float total_bogo=0.0;
/*Anyone have more than 9 cpu's yet?*/
char ordinal[10][10]={"Zero","One","Two","Three","Four","Five","Six",
"Seven","Eight","Nine"};
/* Print CPU Type and BogoMips -- Handles SMP Correctly now *\
\* To debug other architectures, create copies of the proc files and */
/* fopen() them. */
if ((fff=fopen("/proc/cpuinfo","r") )!=NULL) {
while ( fscanf(fff,"%s",(char *)&temp_string2)!=EOF) {
if (cpus==0) {
if ( !(strcmp(temp_string2,"cpu")) ){
fscanf(fff,"%s%s",(char *)&temp_string,(char *)&chip);
/* Work around 2.0.x <-> 2.1.x incompatibilities? */
if (chip[0]==':') {
fscanf(fff,"%s",(char *)&temp_string);
sprintf(chip,"%s86",temp_string);
}
}
if ( !(strcmp(temp_string2,"model")) ) {
fscanf(fff,"%s",(char *)&temp_string);
read_string_from_disk(fff,(char *)&model);
sscanf(model,"%s",(char *)&temp_string);
/* Fix Ugly Look Proc info with custom */
if ( !(strcmp(temp_string,"K6")))
sprintf(model,"%s","K6");
if ( !(strncmp(temp_string,"6x86L",5)))
sprintf(model,"%s","6x86");
if ( !(strncmp(temp_string,"K5",2)))
sprintf(model,"%s","K5");
if ( !(strcmp(temp_string,"unknown")))
sprintf(model,"%s",chip);
}
if (!(strcmp(temp_string2,"vendor_id"))) {
fscanf(fff,"%s",(char *)&temp_string);
read_string_from_disk(fff,(char *)&vendor);
sscanf(vendor,"%s",(char *)&temp_string);
if ( !(strcmp(temp_string,"AuthenticAMD"))) {
sprintf(vendor,"%s","AMD ");
/* Does the following line fix things on K6 systems with *\
\* 2.0.3x? It is very hard to add support for older */
/* kernels without breaking a different chip type. *\
\* 2.1.x fixes this. Hopefully 2.2 is out soon. */
/* If it breaks K6-3D, someone with one send me a *\
\* /proc/cpuinfo */
if (model[0]=='6') sprintf(model,"%s","K6");
}
if ( !(strcmp(temp_string,"GenuineIntel"))) {
sprintf(vendor,"%s","Intel ");
/* Report Pentium MMX's right on Intel? */
if ( !strcmp(chip,"586") ) {
sprintf(model,"%s","Pentium");
}
}
if ( !(strcmp(temp_string,"CyrixInstead"))) {
sprintf(vendor,"%s","Cyrix ");
}
if ( !(strcmp(temp_string,"CentaurHauls"))) {
/* I've heard that all the cpuinfo stuff my centaur *\
\* Is fully user customizable and it can masquerade */
/* As any chip type. However this should catch the *\
\* default type. */
sprintf(vendor,"%s","Centaur");
}
if ( !(strcmp(temp_string,"TransmetaNow"))) {
sprintf(vendor,"%s","Transmeta");
/* Hehe this is a joke. No I have no clue what *\
\* Transmeta does. ;) */
}
if ( !(strcmp(temp_string,"unknown"))) {
vendor[0]='\0';
}
}
}
if ( !(my_string_comp(temp_string2,"bogomips")) ) {
cpus++;
fscanf(fff,"%s%f",(char *)&bogomips_total,&bogomips);
total_bogo+=bogomips;
}
}
}
stat("/proc/kcore",&buff);
mem=buff.st_size;
mem/=1024; mem/=1024;
sprintf(cpuinfo,"%s %s%s Processor%s %ldM RAM",ordinal[cpus],vendor,
model,(cpus>1)?"s,":",",(long int)mem);
sprintf(bogo_total,"%.2f Bogomips Total",total_bogo);
}
|