diff options
| -rw-r--r-- | lsx.c | 16 | 
1 files changed, 9 insertions, 7 deletions
@@ -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> @@ -28,14 +29,15 @@ lsx(const char *dir) {  	struct stat st;  	DIR *dp; -	if(!(dp = opendir(dir))) { +	for(dp = opendir(dir); dp && (d = readdir(dp)); errno = 0) +		if(snprintf(buf, sizeof buf, "%s/%s", dir, d->d_name) < (int)sizeof buf +		&& access(buf, X_OK) == 0 && stat(buf, &st) == 0 && S_ISREG(st.st_mode)) +			puts(d->d_name); + +	if(errno != 0) {  		status = EXIT_FAILURE;  		perror(dir); -		return;  	} -	while((d = readdir(dp))) -		if(snprintf(buf, sizeof buf, "%s/%s", dir, d->d_name) < (int)sizeof buf -		&& stat(buf, &st) == 0 && S_ISREG(st.st_mode) && access(buf, X_OK) == 0) -			puts(d->d_name); -	closedir(dp); +	if(dp) +		closedir(dp);  }  | 
