--- boinc-5.4.11.orig/client/hostinfo_unix.C	2006-03-02 08:17:17.000000000 +0100
+++ boinc-5.4.11/client/hostinfo_unix.C	2007-02-03 01:32:36.491942808 +0100
@@ -323,7 +323,168 @@
     fclose(f);
 }
 
-#else   // not mips or alpha
+#elif __ia64__
+
+void parse_cpuinfo(HOST_INFO& host) {
+    char buf[256];
+    int system_found=0,model_found=0;
+    int n;
+    host.m_cache = 0;
+
+    FILE* f = fopen("/proc/cpuinfo", "r");
+    if (!f) return;
+
+    while (fgets(buf, 256, f)) {
+        if ( (strstr(buf, "vendor     : ") == buf) &&
+             (system_found == 0) ) {
+            system_found = 1;
+            strncpy(host.p_vendor, strchr(buf, ':') + 2, sizeof(host.p_vendor) - 1);
+            char * p = strchr(host.p_vendor, '\n');
+            if (p) {
+                *p = '\0';
+            }
+        }
+        if ( (strstr(buf, "family     : ") == buf) &&
+             (model_found == 0) ) {
+            model_found = 1;
+            strncpy(host.p_model, strchr(buf, ':') + 2, sizeof(host.p_model) - 1);
+            char * p = strchr(host.p_model, '\n');
+            if (p) {
+                *p = '\0';
+            }
+        }
+    }
+
+    fclose(f);
+}
+
+#elif __hppa__
+
+void parse_cpuinfo(HOST_INFO& host) {
+    char buf[256];
+    int system_found=0,model_found=0,icache_found=0,dcache_found=0;
+    int n;
+    host.m_cache = 0;
+
+    FILE* f = fopen("/proc/cpuinfo", "r");
+    if (!f) return;
+
+    while (fgets(buf, 256, f)) {
+        if ( (strstr(buf, "cpu\t\t: ") == buf) &&
+             (system_found == 0) ) {
+            system_found = 1;
+            strncpy(host.p_vendor, strchr(buf, ':') + 2, sizeof(host.p_vendor) - 1);
+            char * p = strchr(host.p_vendor, '\n');
+            if (p) {
+                *p = '\0';
+            }
+        }
+        if ( (strstr(buf, "model name\t: ") == buf) &&
+             (model_found == 0) ) {
+            model_found = 1;
+            strncpy(host.p_model, strchr(buf, ':') + 2, sizeof(host.p_model) - 1);
+            char * p = strchr(host.p_model, '\n');
+            if (p) {
+                *p = '\0';
+            }
+        }
+        if ( (strstr(buf, "I-cache\t\t: ") == buf) &&
+             (icache_found == 0) ) {
+            icache_found = 1;
+            sscanf(buf, "I-cache\t\t: %d", &n);
+            host.m_cache += n*1024;
+        }
+        if ( (strstr(buf, "D-cache\t\t: ") == buf) &&
+             (dcache_found == 0) ) {
+            dcache_found = 1;
+            sscanf(buf, "D-cache\t\t: %d", &n);
+            host.m_cache += n*1024;
+        }
+    }
+
+    fclose(f);
+}
+
+#elif __powerpc__
+
+void parse_cpuinfo(HOST_INFO& host) {
+    char buf[256];
+    int system_found=0,model_found=0,cache_found=0;
+    int n;
+    char* coma=NULL;
+    host.m_cache=0;
+
+    FILE* f = fopen("/proc/cpuinfo", "r");
+    if (!f) return;
+
+    while (fgets(buf, 256, f)) {
+        if ( (strstr(buf, "machine\t\t: ") == buf) &&
+             (system_found == 0) ) {
+            system_found = 1;
+            strncpy(host.p_vendor, strchr(buf, ':') + 2, sizeof(host.p_vendor) - 1);
+            char * p = strchr(host.p_vendor, '\n');
+            if (p) {
+                *p = '\0';
+            }
+        }
+        if ( (strstr(buf, "cpu\t\t: ") == buf) &&
+             (model_found == 0) ) {
+            model_found = 1;
+	    if ((coma = strrchr(buf, ',')))
+	    	*coma = '\0';	/* we don't want the ", altivec supported" */
+            strncpy(host.p_model, strchr(buf, ':') + 2, sizeof(host.p_model) - 1);
+            char * p = strchr(host.p_model, '\n');
+            if (p) {
+                *p = '\0';
+            }
+        }
+        if ( (strstr(buf, "L2-cache\t: ") == buf) &&
+             (cache_found == 0) ) {
+            cache_found = 1;
+            sscanf(buf, "L2-cache\t: %d", &n);
+            host.m_cache = n*1024;
+        }
+    }
+
+    fclose(f);
+}
+
+#elif __sparc__
+
+void parse_cpuinfo(HOST_INFO& host) {
+    char buf[256];
+    int system_found=0,model_found=0;
+    int n;
+    host.m_cache=0;
+
+    FILE* f = fopen("/proc/cpuinfo", "r");
+    if (!f) return;
+
+    while (fgets(buf, 256, f)) {
+        if ( (strstr(buf, "type\t\t: ") == buf) &&
+             (system_found == 0) ) {
+            system_found = 1;
+            strncpy(host.p_vendor, strchr(buf, ':') + 2, sizeof(host.p_vendor) - 1);
+            char * p = strchr(host.p_vendor, '\n');
+            if (p) {
+                *p = '\0';
+            }
+        }
+        if ( (strstr(buf, "cpu\t\t: ") == buf) &&
+             (model_found == 0) ) {
+            model_found = 1;
+            strncpy(host.p_model, strchr(buf, ':') + 2, sizeof(host.p_model) - 1);
+            char * p = strchr(host.p_model, '\n');
+            if (p) {
+                *p = '\0';
+            }
+        }
+    }
+
+    fclose(f);
+}
+
+#else   // not mips or alpha or ia64 or hppa or powerpc or sparc
 
 // Unfortunately the format of /proc/cpuinfo is not standardized.
 // See http://people.nl.linux.org/~hch/cpuinfo/ for some examples.
