cvsdist 9592a4a
--- netkit-rusers-0.17/rpc.rstatd/GNUmakefile.procps	2004-07-12 17:41:48.179608944 +0200
cvsdist 9592a4a
+++ netkit-rusers-0.17/rpc.rstatd/GNUmakefile	2004-07-12 17:41:48.190607585 +0200
cvsdist 9592a4a
@@ -6,10 +6,6 @@
cvsdist 9592a4a
 CFLAGS += -DGNU_LIBC -D_GNU_SOURCE
cvsdist 9592a4a
 endif
cvsdist 9592a4a
 
cvsdist 9592a4a
-#LIBS += -lproc
cvsdist 9592a4a
-# XXX FIXME!
cvsdist 9592a4a
-LIBS += /lib/$(shell cd /lib && echo libproc.so.*)
cvsdist 9592a4a
-
cvsdist 9592a4a
 RPCGEN=rpcgen
cvsdist 9592a4a
 
cvsdist 9592a4a
 # Warning, do not put this in the current directory without updating
cvsdist 9592a4a
--- netkit-rusers-0.17/rpc.rstatd/rstat_proc.c.procps	2004-07-12 17:41:48.174609561 +0200
cvsdist 9592a4a
+++ netkit-rusers-0.17/rpc.rstatd/rstat_proc.c	2004-07-12 17:55:36.605332290 +0200
cvsdist 9592a4a
@@ -45,6 +45,7 @@
cvsdist 9592a4a
 #include <string.h>
cvsdist 9592a4a
 #include <signal.h>
cvsdist 9592a4a
 #include <fcntl.h>
cvsdist 9592a4a
+#include <locale.h>
cvsdist 9592a4a
 
cvsdist 9592a4a
 #include <limits.h>
cvsdist 9592a4a
 #include <rpc/rpc.h>
cvsdist 9592a4a
@@ -596,27 +597,71 @@
cvsdist 9592a4a
 #define	_DELTA(_x, _i)	( (_x)[(_i)] )
cvsdist 9592a4a
 #endif
cvsdist 9592a4a
 
cvsdist 9592a4a
-extern int uptime(double *, double *);
cvsdist 9592a4a
-extern void loadavg(double *, double *, double *);
cvsdist 9592a4a
-
cvsdist 9592a4a
 static void
cvsdist 9592a4a
 convert_stats(void)
cvsdist 9592a4a
 {
cvsdist 9592a4a
 	static int tog = 0;
cvsdist 9592a4a
 	double up;
cvsdist 9592a4a
 	int i;
cvsdist 9592a4a
+	int fd;
cvsdist 9592a4a
+	static char buf[1024];
cvsdist 9592a4a
+	char *savelocale;
cvsdist 9592a4a
 
cvsdist 9592a4a
 	hz = sysconf(_SC_CLK_TCK);
cvsdist 9592a4a
 	gettimeofday(&tm, (struct timezone *) 0);
cvsdist 9592a4a
 
cvsdist 9592a4a
-	i = uptime(&up, NULL);
cvsdist 9592a4a
+	fd = open("/proc/uptime", O_RDONLY);
cvsdist 9592a4a
+	if (fd == -1) {
cvsdist 9592a4a
+		fprintf(stderr, "Error opening /proc/uptime, please make sure /proc is mounted.\n");
cvsdist 9592a4a
+		exit(1);
cvsdist 9592a4a
+	}
cvsdist 9592a4a
+
cvsdist 9592a4a
+	i = read(fd, buf, sizeof(buf) - 1);
cvsdist 9592a4a
+	if (i < 0) {
cvsdist 9592a4a
+		perror("/proc/uptime");
cvsdist 9592a4a
+		close(fd);
cvsdist 9592a4a
+		exit(1);
cvsdist 9592a4a
+	}
cvsdist 9592a4a
+	buf[i] = '\0';
cvsdist 9592a4a
+	savelocale = setlocale(LC_NUMERIC, NULL);
cvsdist 9592a4a
+	setlocale(LC_NUMERIC, "C");
cvsdist 9592a4a
+	if (sscanf(buf, "%lf", &up) < 1) {
cvsdist 9592a4a
+		fprintf(stderr, "bad data in /proc/uptime\n");
cvsdist 9592a4a
+		exit(1);
cvsdist 9592a4a
+	}
cvsdist 9592a4a
+	setlocale(LC_NUMERIC, savelocale);
cvsdist 9592a4a
+	close(fd);
cvsdist 9592a4a
+
cvsdist 9592a4a
+	i = (int)up;
cvsdist 9592a4a
+
cvsdist 9592a4a
 	btm.tv_sec = tm.tv_sec - i;
cvsdist 9592a4a
 	btm.tv_usec = 0;
cvsdist 9592a4a
 	up -= i;
cvsdist 9592a4a
 	if (up > 0)
cvsdist 9592a4a
 		btm.tv_usec = 1000000 * up;
cvsdist 9592a4a
 
cvsdist 9592a4a
-	loadavg(&avrun[0], &avrun[1], &avrun[2]);
cvsdist 9592a4a
+	fd = open("/proc/loadavg", O_RDONLY);
cvsdist 9592a4a
+	if (fd == -1) {
cvsdist 9592a4a
+		fprintf(stderr, "Error opening /proc/loadavg, please make sure /proc is mounted.\n");
cvsdist 9592a4a
+		exit(1);
cvsdist 9592a4a
+	}
cvsdist 9592a4a
+
cvsdist 9592a4a
+	i = read(fd, buf, sizeof(buf) - 1);
cvsdist 9592a4a
+	if (i < 0) {
cvsdist 9592a4a
+		perror("/proc/loadavg");
cvsdist 9592a4a
+		close(fd);
cvsdist 9592a4a
+		exit(1);
cvsdist 9592a4a
+	}
cvsdist 9592a4a
+	buf[i] = '\0';
cvsdist 9592a4a
+	savelocale = setlocale(LC_NUMERIC, NULL);
cvsdist 9592a4a
+	setlocale(LC_NUMERIC, "C");
cvsdist 9592a4a
+	if (sscanf(buf, "%lf %lf %lf", &avrun[0], &avrun[1], &avrun[2]) < 3) {
cvsdist 9592a4a
+		fprintf(stderr, "bad data in /proc/loadavg\n");
cvsdist 9592a4a
+		exit(1);
cvsdist 9592a4a
+	}
cvsdist 9592a4a
+	setlocale(LC_NUMERIC, savelocale);
cvsdist 9592a4a
+	close(fd);
cvsdist 9592a4a
+
cvsdist 9592a4a
 	getstat(cpu_use+tog,cpu_nic+tog,cpu_sys+tog,cpu_idl+tog,
cvsdist 9592a4a
 		pgpgin+tog,pgpgout+tog,pswpin+tog,pswpout+tog,
cvsdist 9592a4a
 		inter+tog,ticks+tog,ctxt+tog, disk+tog);