diff options
author | jnweiger <jnweiger> | 2005-12-16 18:37:23 +0000 |
---|---|---|
committer | jnweiger <jnweiger> | 2005-12-16 18:37:23 +0000 |
commit | b3e7420c1fe103e5a3d71c3b74cf0843bee23317 (patch) | |
tree | b4103eac70f404e174ddd795a8702626a5c6793f /src/loadav.c | |
parent | 522f11a34fb4e4efea730fd937837a156cc5feb0 (diff) | |
download | screen-b3e7420c1fe103e5a3d71c3b74cf0843bee23317.tar.gz |
old version screen-3.9.11 Feb 14 2002
Diffstat (limited to 'src/loadav.c')
-rw-r--r-- | src/loadav.c | 35 |
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 */ |