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