diff options
| -rw-r--r-- | dmenu.c | 2 | ||||
| -rwxr-xr-x | dmenu_run | 5 | ||||
| -rw-r--r-- | lsx.c | 21 | 
3 files changed, 18 insertions, 10 deletions
| @@ -41,7 +41,6 @@ static void usage(void);  static char text[BUFSIZ] = "";  static int bh, mw, mh;  static int inputw, promptw; -static int lines = 0;  static size_t cursor = 0;  static const char *font = NULL;  static const char *prompt = NULL; @@ -49,6 +48,7 @@ static const char *normbgcolor = "#cccccc";  static const char *normfgcolor = "#000000";  static const char *selbgcolor  = "#0066ff";  static const char *selfgcolor  = "#ffffff"; +static unsigned int lines = 0;  static unsigned long normcol[ColLast];  static unsigned long selcol[ColLast];  static Atom utf8; @@ -1,9 +1,12 @@  #!/bin/sh  CACHE=${XDG_CACHE_HOME:-"$HOME/.cache"}/dmenu_run +if [ ! -d "`dirname "$CACHE"`" ]; then +	CACHE=$HOME/.dmenu_cache +fi  (  	IFS=:  	if test "`ls -dt $PATH "$CACHE" 2> /dev/null | sed 1q`" != "$CACHE"; then -		mkdir -p "`dirname "$CACHE"`" && lsx $PATH | sort -u > "$CACHE" +		lsx $PATH | sort -u > "$CACHE"  	fi  )  cmd=`dmenu "$@" < "$CACHE"` && exec sh -c "$cmd" @@ -1,5 +1,6 @@  /* See LICENSE file for copyright and license details. */  #include <dirent.h> +#include <errno.h>  #include <limits.h>  #include <stdio.h>  #include <stdlib.h> @@ -8,6 +9,8 @@  static void lsx(const char *dir); +static int status = EXIT_SUCCESS; +  int  main(int argc, char *argv[]) {  	int i; @@ -16,7 +19,7 @@ main(int argc, char *argv[]) {  		lsx(".");  	else for(i = 1; i < argc; i++)  		lsx(argv[i]); -	return EXIT_SUCCESS; +	return status;  }  void @@ -26,13 +29,15 @@ lsx(const char *dir) {  	struct stat st;  	DIR *dp; -	if(!(dp = opendir(dir))) { -		perror(dir); -		return; -	} -	while((d = readdir(dp))) +	for(dp = opendir(dir); dp && (d = readdir(dp)); errno = 0)  		if(snprintf(buf, sizeof buf, "%s/%s", dir, d->d_name) < (int)sizeof buf -		&& !stat(buf, &st) && S_ISREG(st.st_mode) && access(buf, X_OK) == 0) +		&& access(buf, X_OK) == 0 && stat(buf, &st) == 0 && S_ISREG(st.st_mode))  			puts(d->d_name); -	closedir(dp); + +	if(errno != 0) { +		status = EXIT_FAILURE; +		perror(dir); +	} +	if(dp) +		closedir(dp);  } | 
