uptime.c - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
uptime.c (2446B) | |
--- | |
1 #define _BSD_SOURCE | |
2 #define _GNU_SOURCE | |
3 #include <unistd.h> | |
4 #include <stdio.h> | |
5 #include <stdlib.h> | |
6 #include <stdarg.h> | |
7 #include <string.h> | |
8 #include <strings.h> | |
9 #include <sys/time.h> | |
10 #include <sys/sysinfo.h> | |
11 #include <time.h> | |
12 #include <sys/types.h> | |
13 #include <dirent.h> | |
14 #include <sys/statvfs.h> | |
15 | |
16 | |
17 #include <X11/Xlib.h> | |
18 | |
19 char *tzparis = "Europe/Paris"; | |
20 | |
21 static Display *dpy; | |
22 | |
23 char * | |
24 smprintf(char *fmt, ...) | |
25 { | |
26 va_list fmtargs; | |
27 char *buf = NULL; | |
28 | |
29 va_start(fmtargs, fmt); | |
30 if (vasprintf(&buf, fmt, fmtargs) == -1){ | |
31 fprintf(stderr, "malloc vasprintf\n"); | |
32 exit(1); | |
33 } | |
34 va_end(fmtargs); | |
35 | |
36 return buf; | |
37 } | |
38 | |
39 void | |
40 settz(char *tzname) | |
41 { | |
42 setenv("TZ", tzname, 1); | |
43 } | |
44 | |
45 char * | |
46 mktimes(char *fmt, char *tzname) | |
47 { | |
48 char buf[129]; | |
49 time_t tim; | |
50 struct tm *timtm; | |
51 | |
52 memset(buf, 0, sizeof(buf)); | |
53 settz(tzname); | |
54 tim = time(NULL); | |
55 timtm = localtime(&tim); | |
56 if (timtm == NULL) { | |
57 perror("localtime"); | |
58 exit(1); | |
59 } | |
60 | |
61 if (!strftime(buf, sizeof(buf)-1, fmt, timtm)) { | |
62 fprintf(stderr, "strftime == 0\n"); | |
63 exit(1); | |
64 } | |
65 | |
66 return smprintf(buf); | |
67 } | |
68 | |
69 void | |
70 setstatus(char *str) | |
71 { | |
72 XStoreName(dpy, DefaultRootWindow(dpy), str); | |
73 XSync(dpy, False); | |
74 } | |
75 | |
76 char * | |
77 loadavg(void) | |
78 { | |
79 double avgs[3]; | |
80 | |
81 if (getloadavg(avgs, 3) < 0) { | |
82 perror("getloadavg"); | |
83 exit(1); | |
84 } | |
85 | |
86 return smprintf("%.2f %.2f %.2f", avgs[0], avgs[1], avgs[2]); | |
87 } | |
88 | |
89 | |
90 char * | |
91 up() { | |
92 struct sysinfo info; | |
93 int h,m = 0; | |
94 sysinfo(&info); | |
95 h = info.uptime/3600; | |
96 m = (info.uptime - h*3600 )/60; | |
97 return smprintf("%dh%dm",h,m); | |
98 } | |
99 | |
100 | |
101 int runevery(time_t *ltime, int sec){ | |
102 /* return 1 if sec elapsed since last run | |
103 * else return 0 | |
104 */ | |
105 time_t now = time(NULL); | |
106 | |
107 if ( difftime(now, *ltime ) >= sec) | |
108 { | |
109 *ltime = now; | |
110 return(1); | |
111 } | |
112 else | |
113 return(0); | |
114 } | |
115 | |
116 int | |
117 main(void) | |
118 { | |
119 char *status = NULL; | |
120 char *tmprs = NULL; | |
121 char *avgs = NULL; | |
122 time_t count60 = 0; | |
123 char *uptm = NULL; | |
124 | |
125 if (!(dpy = XOpenDisplay(NULL))) { | |
126 fprintf(stderr, "dwmstatus: cannot open display.\n"); | |
127 return 1; | |
128 } | |
129 | |
130 for (;;sleep(1)) { | |
131 /* checks every minutes */ | |
132 if ( runevery(&count60, 60) ) | |
133 { | |
134 free(tmprs); | |
135 free(uptm); | |
136 tmprs = mktimes("%d/%m/%y %H:%M", tzparis); | |
137 uptm = up(); | |
138 } | |
139 /* checks every second */ | |
140 avgs = loadavg(); | |
141 | |
142 status = smprintf("%s | Up:%s | %s", | |
143 avgs, uptm, tmprs); | |
144 setstatus(status); | |
145 free(avgs); | |
146 free(status); | |
147 } | |
148 | |
149 XCloseDisplay(dpy); | |
150 | |
151 return 0; | |
152 } | |
153 |