diff options
author | Matt Turner <mattst88@gmail.com> | 2008-11-11 21:27:09 +0000 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2008-11-11 21:27:09 +0000 |
commit | 91b4edf69e5adf9c40edcaff38b880218b7b0d9d (patch) | |
tree | 85b654192fa2ce167f4899f6f0a4ca14b1acdb13 /hardware.c |
Initial Import
git-svn-id: svn://mattst88.com/svn/cleanbench/trunk@1 0d43b9a7-5ab2-4d7b-af9d-f64450cef757
Diffstat (limited to 'hardware.c')
-rw-r--r-- | hardware.c | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/hardware.c b/hardware.c new file mode 100644 index 0000000..4838b2f --- /dev/null +++ b/hardware.c @@ -0,0 +1,202 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#define BUF_SIZ 1024 + +/****************** +** output_string ** +******************* +** Displays a string on the screen. Also, if the flag +** write_to_file is set, outputs the string to the output file. +** Note, this routine presumes that you've included a carriage +** return at the end of the buffer. +*/ +static void output_string(const char *buffer, const int write_to_file, + FILE *global_ofile){ + printf("%s",buffer); + if(write_to_file!=0) + fprintf(global_ofile,"%s",buffer); + return; +} + + +/****************** +** removeNewLine ** +******************* +** Removes a trailing newline character if present +*/ +static void removeNewLine(char * s) { + if(strlen(s)>0 && s[strlen(s)-1] == '\n') { + s[strlen(s)-1] = '\0'; + } +} + + +/*************** +** runCommand ** +**************** +** Run the system command through a pipe +** The pointer result must point to a pre-allocated array of at least BUF_SIZ +*/ +static void runCommand (const char *command, char *result) { + FILE * pipe; + + pipe = popen(command, "r"); + if(pipe == NULL) { + /* command failed */ + result[0] = '\0'; + } else { + if(NULL == fgets(result, BUF_SIZ, pipe)){ + /* command failed */ + result[0] = '\0'; + } + pclose(pipe); + } + removeNewLine(result); +} + + +/******************** +** readProcCpuInfo ** +********************* +** Reads and parses /proc/cpuinfo on a Linux system +** The pointers must point to pre-allocated arrays of at least BUF_SIZ +*/ +static void readProcCpuInfo (char *model, char *cache) { + FILE * info; + char * cp; + int cpus = 0; + char * buffer_end; + char buffer[BUF_SIZ]; + char vendor_id[BUF_SIZ]; + char model_name[BUF_SIZ]; + char cpu_MHz[BUF_SIZ]; + int i; + float f; + + vendor_id[0] = model_name[0] = cpu_MHz[0] = model[0] = cache[0] = '\0'; + info = fopen("/proc/cpuinfo", "r"); + if(info != NULL) { + /* command did not fail */ + while(NULL != fgets(buffer, BUF_SIZ, info)){ + buffer_end = buffer + strlen(buffer); + cp = buffer; + if(! strncmp(buffer, "processor", 9)) { + cpus++; + } else if(! strncmp(buffer, "vendor_id", 9)) { + cp+=strlen("vendor_id"); + while(cp < buffer_end && ( *cp == ' ' || *cp == ':'|| *cp == '\t')) + cp++; + if(cp<buffer_end) { + strcpy(vendor_id, cp); + } + removeNewLine(vendor_id); + } else if(! strncmp(buffer, "model name", 10)) { + cp+=strlen("model name"); + while(cp < buffer_end && ( *cp == ' ' || *cp == ':'|| *cp == '\t')) + cp++; + if(cp<buffer_end) { + strcpy(model_name, cp); + } + removeNewLine(model_name); + } else if(! strncmp(buffer, "cpu MHz", 7)) { + cp+=strlen("cpu MHz"); + while(cp < buffer_end && ( *cp == ' ' || *cp == ':'|| *cp == '\t')) + cp++; + if(cp<buffer_end) { + strcpy(cpu_MHz, cp); + } + removeNewLine(cpu_MHz); + } else if(! strncmp(buffer, "cache size", 10)) { + cp+=strlen("cache size"); + while(cp < buffer_end && ( *cp == ' ' || *cp == ':'|| *cp == '\t')) + cp++; + if(cp<buffer_end) { + strcpy(cache, cp); + } + removeNewLine(cache); + } + } + if(cpus>1) { + if (cpus==2) { + strcpy(model, "Dual"); + } else { + sprintf(model, "%d CPU", cpus); + } + } + cp = model + strlen(model); + if(vendor_id[0] != '\0'){ + if(cp != model){ + *cp++ = ' '; + } + strcpy(cp, vendor_id); + cp += strlen(vendor_id); + } + if(model_name[0] != '\0'){ + if(cp != model){ + *cp++ = ' '; + } + strcpy(cp, model_name); + cp += strlen(model_name); + } + if(cpu_MHz[0] != '\0'){ + if(cp != model){ + *cp++ = ' '; + } + f = atof(cpu_MHz); + i = (int)(f+0.5f); + sprintf(cpu_MHz, "%dMHz", i); + strcpy(cp, cpu_MHz); + cp += strlen(cpu_MHz); + } + fclose(info); + } +} + + +/************* +** hardware ** +************** +** Runs the system command "uname -s -r" +** Reads /proc/cpuinfo if on a linux system +** Writes output +*/ +void hardware(const int write_to_file, FILE *global_ofile) { + char buffer[BUF_SIZ]; + char os[BUF_SIZ]; + char model[BUF_SIZ]; + char cache[BUF_SIZ]; + char os_command[] = "uname -s -r"; +#ifdef NO_UNAME + os[0] = '\0'; +#else + runCommand(os_command, os); +#endif + if(NULL != strstr(os, "Linux")) { + readProcCpuInfo (model, cache); + } else { + model[0] = '\0'; + cache[0] = '\0'; + } + sprintf(buffer, "CPU : %s\n", model); + output_string(buffer, write_to_file, global_ofile); + sprintf(buffer, "L2 Cache : %s\n", cache); + output_string(buffer, write_to_file, global_ofile); + sprintf(buffer, "OS : %s\n", os); + output_string(buffer, write_to_file, global_ofile); +} + + +/************************ +** main for hardware.c ** +************************* +** For testing of code only +** Should be commented out +*/ +/* +int main(int argc, char * argv[]) { + hardware(0, NULL); + return 0; +} +*/ |