cvsdist 530f2db
--- netkit-rusers-0.17/rpc.rstatd/rstat_proc.c.buffer	Thu May 30 16:24:12 2002
cvsdist 530f2db
+++ netkit-rusers-0.17/rpc.rstatd/rstat_proc.c	Thu May 30 16:59:13 2002
cvsdist 530f2db
@@ -402,14 +402,26 @@
cvsdist 530f2db
 {
cvsdist 530f2db
   static int stat;
cvsdist 530f2db
 #define	BUFFSIZE	1024
cvsdist 530f2db
-  char buff[BUFFSIZE];
cvsdist 530f2db
+  char *buff = NULL;
cvsdist 530f2db
+  off_t buffsize = 1;
cvsdist 530f2db
   int ndisks;
cvsdist 530f2db
   
cvsdist 530f2db
   if ((stat=open("/proc/stat", O_RDONLY, 0)) != -1) {
cvsdist 530f2db
     char* b;
cvsdist 530f2db
-    buff[BUFFSIZE-1] = 0;  /* ensure null termination in buffer */
cvsdist 530f2db
-    read(stat,buff,BUFFSIZE-1);
cvsdist 530f2db
+    b = buff;
cvsdist 530f2db
+
cvsdist 530f2db
+    do {
cvsdist 530f2db
+      buffsize += BUFFSIZE;
cvsdist 530f2db
+      buff = realloc(buff, buffsize);
cvsdist 530f2db
+      if (buff == NULL) {
cvsdist 530f2db
+	perror("getstat(): realloc");
cvsdist 530f2db
+	abort();
cvsdist 530f2db
+      }
cvsdist 530f2db
+      b = buff + buffsize - BUFFSIZE - 1;
cvsdist 530f2db
+    } while (read(stat,b,BUFFSIZE) == BUFFSIZE);
cvsdist 530f2db
     close(stat);
cvsdist 530f2db
+    buff[buffsize - 1] = '\0';
cvsdist 530f2db
+    
cvsdist 530f2db
     *itot = 0; 
cvsdist 530f2db
     *i1 = 1;   /* ensure assert below will fail if the sscanf bombs */
cvsdist 530f2db
     b = strstr(buff, "cpu ");
cvsdist 530f2db
@@ -437,7 +449,10 @@
cvsdist 530f2db
     b = strstr(buff, "ctxt ");
cvsdist 530f2db
     if(b)
cvsdist 530f2db
     sscanf(b, "ctxt %u", ct);
cvsdist 530f2db
-    assert(*itot>*i1);
cvsdist 530f2db
+    /* avoid breaking with certain kernels where all the
cvsdist 530f2db
+       interrupt numbers have 1000000000 added to the value */
cvsdist 530f2db
+    /*    assert(*itot>*i1); */
cvsdist 530f2db
+    free(buff);
cvsdist 530f2db
   }
cvsdist 530f2db
 }
cvsdist 530f2db