|
|
@ -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); |
|
|
|
} |