summaryrefslogtreecommitdiff
path: root/hardware.c
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2008-11-11 21:27:09 +0000
committerMatt Turner <mattst88@gmail.com>2008-11-11 21:27:09 +0000
commit91b4edf69e5adf9c40edcaff38b880218b7b0d9d (patch)
tree85b654192fa2ce167f4899f6f0a4ca14b1acdb13 /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.c202
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;
+}
+*/