uptime.c - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) 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