2 * Conky, a system monitor, based on torsmo
4 * This program is licensed under BSD license, read COPYING
17 struct information info;
28 return tv.tv_sec + (tv.tv_usec / 1000000.0);
31 FILE *open_file(const char *file, int *reported)
33 FILE *fp = fopen(file, "r");
35 if (!reported || *reported == 0) {
36 ERR("can't open %s: %s", file, strerror(errno));
46 void variable_substitute(const char *s, char *dest, unsigned int n)
56 /* variable is either $foo or ${foo} */
60 while (*s && *s != '}')
64 while (*s && (isalnum((int) *s)
69 /* copy variable to buffer and look it up */
70 len = (s - a > 255) ? 255 : (s - a);
84 strncpy(dest, var, len);
99 /* network interface stuff */
101 static struct net_stat netstats[16];
103 struct net_stat *get_net_stat(const char *dev)
110 /* find interface stat */
111 for (i = 0; i < 16; i++) {
112 if (netstats[i].dev && strcmp(netstats[i].dev, dev) == 0)
116 /* wasn't found? add it */
118 for (i = 0; i < 16; i++) {
119 if (netstats[i].dev == 0) {
120 netstats[i].dev = strdup(dev);
126 CRIT_ERR("too many interfaces used (limit is 16)");
130 void clear_net_stats (void)
132 memset (netstats, 0, sizeof(netstats));
135 void format_seconds(char *buf, unsigned int n, long t)
137 if (t >= 24 * 60 * 60) /* hours necessary when there are days? */
138 snprintf(buf, n, "%ldd %ldh %ldm", t / 60 / 60 / 24,
139 (t / 60 / 60) % 24, (t / 60) % 60);
140 else if (t >= 60 * 60)
141 snprintf(buf, n, "%ldh %ldm", (t / 60 / 60) % 24,
144 snprintf(buf, n, "%ldm %lds", t / 60, t % 60);
147 void format_seconds_short(char *buf, unsigned int n, long t)
149 if (t >= 24 * 60 * 60)
150 snprintf(buf, n, "%ldd %ldh", t / 60 / 60 / 24,
152 else if (t >= 60 * 60)
153 snprintf(buf, n, "%ldh %ldm", (t / 60 / 60) % 24,
156 snprintf(buf, n, "%ldm", t / 60);
159 static double last_meminfo_update;
160 static double last_fs_update;
162 unsigned long long need_mask;
163 #define NEED(a) ((need_mask & (1 << a)) && ((info.mask & (1 << a)) == 0))
171 need_mask |= 1 << INFO_BUFFERS;
173 /* clear speeds and up status in case device was removed and doesn't get
176 for (i = 0; i < 16; i++) {
177 if (netstats[i].dev) {
179 netstats[i].recv_speed = 0.0;
180 netstats[i].trans_speed = 0.0;
186 if (NEED(INFO_UPTIME))
189 if (NEED(INFO_PROCS))
190 update_total_processes();
192 if (NEED(INFO_RUN_PROCS))
193 update_running_processes();
201 if (NEED(INFO_DISKIO))
210 #if defined(__linux__)
213 #endif /* __linux__ */
221 if (NEED(INFO_XMMS2))
226 if (NEED(INFO_AUDACIOUS))
235 if (NEED(INFO_LOADAVG))
236 update_load_average();
239 if ((NEED(INFO_MEM) || NEED(INFO_BUFFERS) || NEED(INFO_TOP)) &&
240 current_update_time - last_meminfo_update > 6.9) {
243 info.mem -= info.bufmem;
245 last_meminfo_update = current_update_time;
251 /* update_fs_stat() won't do anything if there aren't fs -things */
252 if (NEED(INFO_FS) && current_update_time - last_fs_update > 12.9) {
254 last_fs_update = current_update_time;
256 #ifdef TCP_PORT_MONITOR
257 if (NEED(INFO_TCP_PORT_MONITOR))
258 update_tcp_port_monitor_collection( info.p_tcp_port_monitor_collection );
260 if (NEED(INFO_ENTROPY))
264 int round_to_int(float f)
267 double delta = f - intval;
268 if (!(delta < 0.5)) {