dum de dum
[monky] / common.c
1 #include "conky.h"
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <ctype.h>
6 #include <errno.h>
7 #include <sys/time.h>
8
9 struct information info;
10
11 void update_uname()
12 {
13         uname(&info.uname_s);
14 }
15
16 double get_time()
17 {
18         struct timeval tv;
19         gettimeofday(&tv, 0);
20         return tv.tv_sec + tv.tv_usec / 1000000.0;
21 }
22
23 FILE *open_file(const char *file, int *reported)
24 {
25         FILE *fp = fopen(file, "r");
26         if (!fp) {
27                 if (!reported || *reported == 0) {
28                         ERR("can't open %s: %s", file, strerror(errno));
29                         if (reported)
30                                 *reported = 1;
31                 }
32                 return 0;
33         }
34
35         return fp;
36 }
37
38 void variable_substitute(const char *s, char *dest, unsigned int n)
39 {
40         while (*s && n > 1) {
41                 if (*s == '$') {
42                         s++;
43                         if (*s != '$') {
44                                 char buf[256];
45                                 const char *a, *var;
46                                 unsigned int len;
47
48                                 /* variable is either $foo or ${foo} */
49                                 if (*s == '{') {
50                                         s++;
51                                         a = s;
52                                         while (*s && *s != '}')
53                                                 s++;
54                                 } else {
55                                         a = s;
56                                         while (*s
57                                                && (isalnum((int) *s)
58                                                    || *s == '_'))
59                                                 s++;
60                                 }
61
62                                 /* copy variable to buffer and look it up */
63                                 len = (s - a > 255) ? 255 : (s - a);
64                                 strncpy(buf, a, len);
65                                 buf[len] = '\0';
66
67                                 if (*s == '}')
68                                         s++;
69
70                                 var = getenv(buf);
71
72                                 if (var) {
73                                         /* add var to dest */
74                                         len = strlen(var);
75                                         if (len >= n)
76                                                 len = n - 1;
77                                         strncpy(dest, var, len);
78                                         dest += len;
79                                         n -= len;
80                                 }
81                                 continue;
82                         }
83                 }
84
85                 *dest++ = *s++;
86                 n--;
87         }
88
89         *dest = '\0';
90 }
91
92 /* network interface stuff */
93
94 static struct net_stat netstats[16];
95
96 struct net_stat *get_net_stat(const char *dev)
97 {
98         unsigned int i;
99
100         if (!dev)
101                 return 0;
102
103         /* find interface stat */
104         for (i = 0; i < 16; i++) {
105                 if (netstats[i].dev && strcmp(netstats[i].dev, dev) == 0)
106                         return &netstats[i];
107         }
108
109         /* wasn't found? add it */
110         if (i == 16) {
111                 for (i = 0; i < 16; i++) {
112                         if (netstats[i].dev == 0) {
113                                 netstats[i].dev = strdup(dev);
114                                 return &netstats[i];
115                         }
116                 }
117         }
118
119         CRIT_ERR("too many interfaces used (limit is 16)");
120         return 0;
121 }
122
123 void format_seconds(char *buf, unsigned int n, long t)
124 {
125         if (t >= 24 * 60 * 60)  /* hours necessary when there are days? */
126                 snprintf(buf, n, "%ldd %ldh %ldm", t / 60 / 60 / 24,
127                          (t / 60 / 60) % 24, (t / 60) % 60);
128         else if (t >= 60 * 60)
129                 snprintf(buf, n, "%ldh %ldm", (t / 60 / 60) % 24,
130                          (t / 60) % 60);
131         else
132                 snprintf(buf, n, "%ldm %lds", t / 60, t % 60);
133 }
134
135 void format_seconds_short(char *buf, unsigned int n, long t)
136 {
137         if (t >= 24 * 60 * 60)
138                 snprintf(buf, n, "%ldd %ldh", t / 60 / 60 / 24,
139                          (t / 60 / 60) % 24);
140         else if (t >= 60 * 60)
141                 snprintf(buf, n, "%ldh %ldm", (t / 60 / 60) % 24,
142                          (t / 60) % 60);
143         else
144                 snprintf(buf, n, "%ldm", t / 60);
145 }
146
147 static double last_meminfo_update;
148 static double last_fs_update;
149
150 unsigned int need_mask;
151
152 void update_stuff()
153 {
154         unsigned int i;
155         info.mask = 0;
156
157         if (no_buffers)
158                 need_mask |= 1 << INFO_BUFFERS;
159
160         /* clear speeds and up status in case device was removed and doesn't get
161          * updated */
162
163         for (i = 0; i < 16; i++) {
164                 if (netstats[i].dev) {
165                         netstats[i].up = 0;
166                         netstats[i].recv_speed = 0.0;
167                         netstats[i].trans_speed = 0.0;
168                 }
169         }
170
171         prepare_update();
172
173 #define NEED(a) ((need_mask & (1 << a)) && ((info.mask & (1 << a)) == 0))
174
175         if (NEED(INFO_UPTIME))
176                 update_uptime();
177
178         if (NEED(INFO_PROCS))
179                 update_total_processes();
180
181         if (NEED(INFO_RUN_PROCS))
182                 update_running_processes();
183
184         if (NEED(INFO_CPU))
185                 update_cpu_usage();
186
187         if (NEED(INFO_NET))
188                 update_net_stats();
189
190         if (NEED(INFO_WIFI))
191                 update_wifi_stats();
192
193         if (NEED(INFO_MAIL))
194                 update_mail_count();
195
196         if (NEED(INFO_TOP))
197                 update_top();
198
199 #ifdef MLDONKEY
200   if (NEED(INFO_MLDONKEY)) get_mldonkey_status(&mlconfig, &mlinfo);
201 #endif
202   
203 #ifdef SETI
204         if (NEED(INFO_SETI))
205                 update_seti();
206 #endif
207
208 #ifdef MPD
209         if (NEED(INFO_MPD))
210                 update_mpd();
211 #endif
212
213         if (NEED(INFO_LOADAVG))
214                 update_load_average();
215
216 #ifdef METAR
217    if (NEED(INFO_METAR) && current_update_time - last_metar_update > 1200.9 && info.looped) {
218         update_metar();
219         last_metar_update = current_update_time;
220    }
221 #endif
222
223
224         if ((NEED(INFO_MEM) || NEED(INFO_BUFFERS)) &&
225             current_update_time - last_meminfo_update > 6.9) {
226                 update_meminfo();
227                 if (no_buffers)
228                         info.mem -= info.bufmem;
229                 last_meminfo_update = current_update_time;
230         }
231
232         /* update_fs_stat() won't do anything if there aren't fs -things */
233         if (NEED(INFO_FS) && current_update_time - last_fs_update > 12.9) {
234                 update_fs_stats();
235                 last_fs_update = current_update_time;
236         }
237 }