]> git.itanic.dy.fi Git - rrdd/blob - parser.c
Move string manipulation functions to string.c
[rrdd] / parser.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <error.h>
5
6 #include "parser.h"
7 #include "process.h"
8 #include "string.h"
9
10 #define STATFILE "/proc/stat"
11
12 int cpu_parser(char *data)
13 {
14         char buf[1024];
15         char *str = buf;
16         FILE *file = fopen(STATFILE, "r");
17         int user, nice, sys, idle, wait, irq, softirq;
18
19         if (file == NULL) {
20                 fprintf(stderr, "Failed to open file %s\n", STATFILE);
21                 return -1;
22         }
23
24         if (!fgets(buf, 1024, file)) {
25                 fprintf(stderr, "Failed to read file %s\n", STATFILE);
26                 fclose(file);
27                 return -1;
28         }
29
30         user    = dec_to_int(str, &str);
31         nice    = dec_to_int(str, &str);
32         sys     = dec_to_int(str, &str);
33         idle    = dec_to_int(str, &str);
34         wait    = dec_to_int(str, &str);
35         irq     = dec_to_int(str, &str);
36         softirq = dec_to_int(str, &str);
37
38         sprintf(data, "%d:%d:%d:%d:%d:%d:%d",
39                 user, nice, sys, idle, wait, irq, softirq);
40
41         fclose(file);
42         return 0;
43 }
44
45 #define MEMFILE "/proc/meminfo"
46
47 int mem_parser(char *data)
48 {
49         char buf[1024], word[1024];
50         int free = 0, buffered = 0, cache = 0, active = 0, inactive = 0,
51                 swapfree = 0, anon = 0, slab = 0, tables = 0;
52         FILE *file = fopen(MEMFILE, "r");
53
54         if (file == NULL) {
55                 fprintf(stderr, "Failed to open file %s\n", MEMFILE);
56                 return -1;
57         }
58
59         while (fgets(buf, 1024, file)) {
60                 get_word(buf, 0, word, 1024);
61                 
62                 if (!strcmp(word, "MemFree:")) {
63                         free = dec_to_int(buf, 0);
64                 } else if (!strcmp(word, "Buffers:")) {
65                         buffered = dec_to_int(buf, 0);
66                 } else if (!strcmp(word, "Cached:")) {
67                         cache = dec_to_int(buf, 0);
68                 } else if (!strcmp(word, "Active:")) {
69                         active = dec_to_int(buf, 0);
70                 } else if (!strcmp(word, "Inactive:")) {
71                         inactive = dec_to_int(buf, 0);
72                 } else if (!strcmp(word, "SwapFree:")) {
73                         swapfree = dec_to_int(buf, 0);
74                 } else if (!strcmp(word, "AnonPages:")) {
75                                 anon = dec_to_int(buf, 0);
76                 } else if (!strcmp(word, "Slab:")) {
77                         slab = dec_to_int(buf, 0);
78                 } else if (!strcmp(word, "PageTables:")) {
79                         tables = dec_to_int(buf, 0);
80                 }
81         }
82         fclose(file);
83
84         sprintf(data, "%f:%f:%f:%f:%f:%f:%f:%f:%f",
85                 free / 1024.0,
86                 buffered / 1024.0,
87                 cache / 1024.0,
88                 active / 1024.0,
89                 inactive / 1024.0,
90                 swapfree / 1024.0,
91                 anon / 1024.0,
92                 slab / 1024.0,
93                 tables / 1024.0);
94
95         return 0;
96 }
97
98 int cpu_mem_parser(char *data)
99 {
100         char cpu[1024], mem[1024];
101
102         cpu_parser(cpu);
103         mem_parser(mem);
104         sprintf(data, "%s:%s", cpu, mem);
105
106         return 0;
107 }
108
109 int digitemp_parser(char *data)
110 {
111         const char digitemp_cmd[] = "/usr/bin/digitemp";
112         char *const digitemp_args[] = { "", "-o2", "-a", "-q", 0 };
113         FILE *readf, *writef;
114         int pid;
115         char buf[1024], *bptr = buf;
116         float t1, t2, t3;
117
118         pid = run_piped_stream(digitemp_cmd, digitemp_args, &readf, &writef);
119         if (pid < 0) {
120                 fprintf(stderr, "Failed to parse digitemp");
121                 sprintf(data, "U:U");
122                 return -1;
123         }
124
125         fgets(buf, 1024, readf);
126
127 /*
128         get_word(bptr, &bptr, t1, 16);
129         *bptr++ = 0;
130         get_word(bptr, &bptr, t2, 16);
131         *bptr++ = 0;
132         get_word(bptr, &bptr, t3, 16);
133         *bptr++ = 0;
134 */
135         t1 = dec_to_float(bptr, &bptr);
136         t2 = dec_to_float(bptr, &bptr);
137         t3 = dec_to_float(bptr, &bptr);
138
139         t2 += 2.16;
140         t3 += -0.44;
141
142         while (fgets(buf, 1024, readf));
143         harvest_zombies(pid);
144         sprintf(data, "%.2f:%.2f", t3, t2);
145         return 0;
146 }
147
148 int digitemp_parser_mod(char *data)
149 {
150         char buf[1024];
151         int ret;
152
153         ret = digitemp_parser(buf);
154         sprintf(data, "U:%s", buf);
155
156         return ret;
157 }