[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