diff options
Diffstat (limited to 'lsx.c')
| -rw-r--r-- | lsx.c | 21 | 
1 files changed, 13 insertions, 8 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> @@ -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);  }  | 
