summaryrefslogtreecommitdiff
path: root/src/loadav.c
diff options
context:
space:
mode:
authorjnweiger <jnweiger>2005-12-16 18:37:23 +0000
committerjnweiger <jnweiger>2005-12-16 18:37:23 +0000
commitb3e7420c1fe103e5a3d71c3b74cf0843bee23317 (patch)
treeb4103eac70f404e174ddd795a8702626a5c6793f /src/loadav.c
parent522f11a34fb4e4efea730fd937837a156cc5feb0 (diff)
downloadscreen-b3e7420c1fe103e5a3d71c3b74cf0843bee23317.tar.gz
old version screen-3.9.11 Feb 14 2002
Diffstat (limited to 'src/loadav.c')
-rw-r--r--src/loadav.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/src/loadav.c b/src/loadav.c
index 6462ea9..44fa99f 100644
--- a/src/loadav.c
+++ b/src/loadav.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1993-2000
+/* Copyright (c) 1993-2002
* Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
* Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
* Copyright (c) 1987 Oliver Laumann
@@ -72,15 +72,42 @@ static int
GetLoadav()
{
FILE *fp;
- double d[3];
+ char buf[128], *s;
int i;
+ double d, e;
if ((fp = secfopen("/proc/loadavg", "r")) == NULL)
return 0;
- fscanf(fp, "%lf %lf %lf\n", d, d + 1, d + 2);
+ *buf = 0;
+ fgets(buf, sizeof(buf), fp);
fclose(fp);
+ /* can't use fscanf because the decimal point symbol depends on
+ * the locale but the kernel uses always '.'.
+ */
+ s = buf;
for (i = 0; i < (LOADAV_NUM > 3 ? 3 : LOADAV_NUM); i++)
- loadav[i] = d[i];
+ {
+ d = e = 0;
+ while(*s == ' ')
+ s++;
+ if (*s == 0)
+ break;
+ for(;;)
+ {
+ if (*s == '.')
+ e = 1;
+ else if (*s >= '0' && *s <= '9')
+ {
+ d = d * 10 + (*s - '0');
+ if (e)
+ e *= 10;
+ }
+ else
+ break;
+ s++;
+ }
+ loadav[i] = e ? d / e : d;
+ }
return i;
}
#endif /* linux */