File: getload.c

package info (click to toggle)
ttyload 0.5-4
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 216 kB
  • ctags: 122
  • sloc: ansic: 700; makefile: 87; sh: 5
file content (64 lines) | stat: -rw-r--r-- 1,558 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#define	LOADFILE	"/proc/loadavg"

/* What the contents of the proc file look like, as an example:
 * 0.00 0.00 0.00 1/59 10941
 */

#include "ttyload.h"

#include <stdio.h>		/* for perror */
#include <stdlib.h>		/* for exit() */
#include <unistd.h>		/* for sleep() */

void	getload(load_list *loadavgs)
{
    float	theload[3];
    FILE	*loadfile;
    int		ret;

    /* just for sanity: */
    if(!loadavgs)
    {
    	fprintf(stderr, "getload called without loadavgs pointer.\n");
	exit(2);
    }

    if(!(loadfile = fopen(LOADFILE, "r")))
    {
    	perror("Open of " LOADFILE " failed");
	exit(1);
    }

    ret = fscanf(loadfile, "%f %f %f ", &(theload[0]), &(theload[1]), &(theload[2]));

    if(fclose(loadfile) != 0)
    {
    	perror("Close of " LOADFILE " failed?!");
	exit(1);
    }

    /* so the caller _can_ (maybe not _will_) know how we did */
    loadavgs->numloads	= ret;
    loadavgs->one_minute	= theload[0] * 1024;
    loadavgs->five_minute	= theload[1] * 1024;
    loadavgs->fifteen_minute	= theload[2] * 1024;

    /* a little warning thing... should probably be re-written
     * for the Linux/fscanf stuff, this is a hold-over from the
     * solaris stuff.  */
    switch(ret)
    {
	case 2:
	    fprintf(stderr, "15 minute Load average is unreliable.\n");
	    sleep(5);
	    break;
	case 1:
	    fprintf(stderr, "5 and 15 minute load averages are unreliable.\n");
	    sleep(5);
	    break;
	case 0:
	    fprintf(stderr, "Sorry, couldn't get any load "
	    	"averages.  This is, therefore,  pointless.\n");
	    exit(1);
    }
}