]> git.itanic.dy.fi Git - buddywatch/blob - buddywatch.c
Read delay parameter from the command line
[buddywatch] / buddywatch.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <ctype.h>
5 #include <time.h>
6
7 #define MAX_ORDER 11
8
9 int main(int argc, char *argv[])
10 {
11         long long int buddy[MAX_ORDER], bud[MAX_ORDER], tot;
12         long int i;
13         double delay = 1;
14         FILE *file;
15         char str[1024], *s;
16         int ret = 0;
17         struct timespec sleep;
18
19         if (argc > 1)
20                 ret = sscanf(argv[1], "%lf", &delay);
21
22         sleep.tv_sec = (time_t)delay;
23         sleep.tv_nsec = ((long)(delay * 1000 * 1000 * 1000) %
24                         (1000l * 1000l * 1000l));
25
26         while (1) 
27         {
28                 file = fopen("/proc/buddyinfo", "r");
29                 if (!file)
30                         perror("fopen failed");
31
32                 for (i = 0; i < MAX_ORDER; i++)
33                         buddy[i] = 0;
34
35                 while (fgets(str, sizeof(str), file)) {
36                         for (i = 0; i < sizeof(str); i++)
37                                 if (str[i] == 'z')
38                                         break;
39
40                         for (; i < sizeof(str); i++)
41                                 if (isspace(str[i]))
42                                         break;
43
44                         for (; i < sizeof(str); i++)
45                                 if (!isspace(str[i]))
46                                         break;
47
48                         for (; i < sizeof(str); i++)
49                                 if (isspace(str[i]))
50                                         break;
51
52                         s = &str[i];
53
54                         i = sscanf(s, " %lld %lld %lld %lld"
55                                    "%lld %lld %lld %lld %lld %lld %lld\n",
56                                    &bud[0], &bud[1], &bud[2], &bud[3], &bud[4],
57                                    &bud[5], &bud[6], &bud[7], &bud[8], &bud[9],
58                                    &bud[10]);
59                         for (i = 0; i < MAX_ORDER; i++)
60                                 buddy[i] += bud[i];
61                 }
62
63                 tot = 0;
64                 for (i = 0; i < MAX_ORDER; i++) {
65                         printf("% 5lld.%02lldM",
66                                 (buddy[i] * (1 << (i + 2))) >> 10,
67                                 (buddy[i] * (1 << (i + 2))) % 1024 * 100 / 1024);
68                         tot += buddy[i] * (1 << (i + 2));
69                 }
70                 printf("% 5lldM\n", tot >> 10);
71
72                 nanosleep(&sleep, NULL);
73
74                 fclose(file);
75         }
76         return 0;
77 }