[wiki] [sites] Improvements to barM.c: * Made it more secure by using functions that are aware of the buffer   size and by checking return values. * Remove the need to spawn a process every second to run uname and get   free ram. * Remove the need for looping in bash -- there is no advantage of using   a bash loop and running the process every second as opposed to making   the program loop. * Cache uname at the beginning of the program. There is no reason to   update this every second || ComputerNerd
 
commit 28dbe0efac4bcf43f674c9920f95f6e7e90051c1
Author: ComputerNerd <theprogrammernerd_AT_gmail.com>
Date:   Sun Jun 14 14:59:21 2015 -0500
    Improvements to barM.c:
    * Made it more secure by using functions that are aware of the buffer
      size and by checking return values.
    * Remove the need to spawn a process every second to run uname and get
      free ram.
    * Remove the need for looping in bash -- there is no advantage of using
      a bash loop and running the process every second as opposed to making
      the program loop.
    * Cache uname at the beginning of the program. There is no reason to
      update this every second
diff --git a/dwm.suckless.org/dwmstatus/barM.c b/dwm.suckless.org/dwmstatus/barM.c
index f45f18a..221724d 100644
--- a/dwm.suckless.org/dwmstatus/barM.c
+++ b/dwm.suckless.org/dwmstatus/barM.c
_AT_@ -1,16 +1,16 @@
 /*
- * Copyright (C) 2014,2015 levi0x0
+ * Copyright (C) 2014,2015 levi0x0 with enhancements by ProgrammerNerd
  * 
  * barM (bar_monitor or BarMonitor) is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
  * of the License, or (at your option) any later version.
  * 
- *  This is a new version of bar monitor, less lines of code more effective.
+ *  This is a new version of bar monitor, even less lines of code more effective.
  *
  *  Read main() to configure your new status Bar.
  *
- *  compile: gcc -o barM barM.c -lX11
+ *  compile: gcc -o barM barM.c -O2 -s -lX11
  *  
  *  mv barM /usr/local/bin/
  */
_AT_@ -21,67 +21,78 @@
 #include <string.h>
 #include <stdarg.h>
 #include <X11/Xlib.h>
+#include <sys/utsname.h>
+#include <sys/sysinfo.h>
 
 /*
  *  Put this in your .xinitrc file: 
  *
- *      while true;do 
- *              $(barM)
- *      done &
+ *  barM&
  *  
  */
 
-#define VERSION "0.11"
-#define TIME_FORMAT "(%H:%M) (%d-%m-%Y)"
+#define VERSION "0.12"
+#define TIME_FORMAT "%H:%M) (%d-%m-%Y"
 #define MAXSTR  1024
 
-static char status[MAXSTR];
-
-/*append here your commands*/
-char *commands[] = {"uname",
-                    "free -mh | awk 'NR==2{print $3\"/\"$2}'"
+static const char * date(void);
+static const char * getuname(void);
+static const char * ram(void);
+static void XSetRoot(const char *name);
+/*Append here your functions.*/
+static const char*(*const functab[])(void)={
+        ram,date
 };
 
-/* will append the buffer to status*/
-void sprint(char *format, ...) {
-        va_list li;
-        static char s[MAXSTR];
-        va_start(li, format);
-        vsprintf(s, format, li);
-        va_end(li);
-
-        strcat(status, s);
+int main(void){
+        char status[MAXSTR];
+        /* It is foolish to repeatedly update uname. */
+        int ret;
+        {struct utsname u;
+        if(uname(&u)){
+                perror("uname failed");
+                return 1;
+        }
+        ret=snprintf(status,sizeof(status),"(%s %s %s) ",u.sysname,u.nodename,u.release);}
+        char*off=status+ret;
+        if(off>=(status+MAXSTR)){
+                XSetRoot(status);
+                return 1;/*This should not happen*/
+        }
+        for(;;){
+                int left=sizeof(status)-ret,i;
+                char*sta=off;
+                for(i = 0; i<sizeof(functab)/sizeof(functab[0]); ++i ) {
+                        int ret=snprintf(sta,left,"(%s) ",functab[i]());
+                        sta+=ret;
+                        left-=ret;
+                        if(sta>=(status+MAXSTR))/*When snprintf has to resort to truncating a string it will return the length as if it were not truncated.*/
+                                break;
+                }
+                XSetRoot(status);
+                sleep(1);
+        }
+        return 0;
 }
 
-/* returen the date*/
-char * date(void) {
+/* Returns the date*/
+static const char * date(void){
         static char date[MAXSTR];
-
         time_t now = time(0);
 
         strftime(date, MAXSTR, TIME_FORMAT, localtime(&now));
         return date;
 }
-
-
-/* open a pipe for a new coomand and return the output*/
-char * spawn(char *c) {
-        FILE *proc;
-        static char buffer[MAXSTR];
-
-        if ((proc = popen(c, "r")) == NULL ) {
-                fprintf(stderr, "[barM] Failed to execute the command.
");
-                exit(1);;
-        }
-
-        fscanf(proc, "%[^
]", buffer);
-        pclose(proc);
-
-        return buffer;
+/* Returns a string that contains the amount of free and available ram in megabytes*/
+static const char * ram(void){
+        static char ram[MAXSTR];
+        struct sysinfo s;
+        sysinfo(&s);
+        snprintf(ram,sizeof(ram),"%.1fM,%.1fM",((double)(s.totalram-s.freeram))/1048576.,((double)s.totalram)/1048576.);
+        return ram;
 }
 
-
-void XSetRoot(char *name) {
+static void XSetRoot(const char *name){
         Display *display;
 
         if (( display = XOpenDisplay(0x0)) == NULL ) {
_AT_@ -95,17 +106,3 @@ void XSetRoot(char *name) {
         XCloseDisplay(display);
 }
 
-int main(int argc, char **argv) { 
-        int i = 0;
-        for(i = 0; commands[i]; i++ ) {
-                sprint("(%s) ", spawn(commands[i]));
-        }
-
-        sprint("%s", date());
-        XSetRoot(status);
-
-        /* sleep by default you dont need to add it to your bash*/
-        sleep(1);
-
-        return 0;
-}
Received on Sun Jun 14 2015 - 22:03:39 CEST
This archive was generated by hypermail 2.3.0
: Thu Jun 18 2015 - 18:41:54 CEST