File: linux.c

package info (click to toggle)
lbcd 3.5.2-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,708 kB
  • sloc: ansic: 11,073; sh: 1,816; perl: 503; makefile: 165
file content (89 lines) | stat: -rw-r--r-- 1,796 bytes parent folder | download | duplicates (4)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
 * lbcd kernel code for Linux.
 *
 * Written by Larry Schwimmer
 * Copyright 1997, 1998, 2009, 2012
 *     The Board of Trustees of the Leland Stanford Junior University
 *
 * See LICENSE for licensing terms.
 */

#include <config.h>
#include <portable/system.h>

#include <time.h>

#include <server/internal.h>
#include <util/messages.h>


/*
 * Get the current load average from the kernel and return the one minute,
 * five minute, and fifteen minute averages in the given parameters.  Returns
 * 0 on success and -1 on failure.
 */
int
kernel_getload(double *l1, double *l5, double *l15)
{
    FILE *fp;

    fp = fopen("/proc/loadavg", "r");
    if (fp == NULL) {
        syswarn("cannot open /proc/loadavg");
        return -1;
    }
    if (fscanf(fp, "%lf %lf %lf", l1, l5, l15) < 3) {
        fclose(fp);
        warn("cannot parse /proc/loadavg");
        return -1;
    }
    fclose(fp);
    return 0;
}


/*
 * Get the system uptime and return it in the boottime parameter.  Returns 0
 * on success and -1 on failure.
 */
int
kernel_getboottime(time_t *boottime)
{
    FILE *fp;
    double uptime;
    time_t curr;

    fp = fopen("/proc/uptime", "r");
    if (fp == NULL) {
        syswarn("cannot open /proc/uptime");
        return -1;
    }
    if (fscanf(fp, "%lf", &uptime) < 1) {
        fclose(fp);
        warn("cannot parse /proc/uptime");
        return -1;
    }
    fclose(fp);
    curr = time(NULL);
    *boottime = curr - uptime;
    return 0;
}


/*
 * Test routine.
 */
#ifdef MAIN
int
main(void)
{
    double l1, l5, l15;
    time_t boottime;

    if (kernel_getload(&l1, &l5, &l15) == 0)
        printf("load %.02f %.02f %.02f\n", l1, l5, l15);
    if (kernel_getboottime(&boottime) == 0)
        printf("booted at %s", ctime(&boottime));
    return 0;
}
#endif