diff options
-rw-r--r-- | ls.c | 47 |
1 files changed, 41 insertions, 6 deletions
@@ -68,9 +68,9 @@ static enum { BLOCKS_NONE, BLOCKS_POSIX, BLOCKS_KIBI } ls_blocks = BLOCKS_NONE; static int ls_print_inodes = 0; static int ls_questionable = 0; -static int recurse = 0; static int reverse = 0; static int stat_flags = AT_SYMLINK_NOFOLLOW; +static size_t nftw_dirlen = 0; struct file_info { char *path; @@ -154,7 +154,7 @@ static int ls_compare_files(const void *op_a, const void *op_b) return (reverse ? -1 : 1) * ret; } -static int ls_dir(char *dir, int showdirname) +static int ls_dir(const char *dir, int showdirname) { size_t nfiles = 0; struct file_info *files = NULL; @@ -528,6 +528,30 @@ static int ls_compare_operands(const void *op_a, const void *op_b) return strcoll(a->path, b->path); } +static int ls_nftw(const char *path, const struct stat *st, int type, struct FTW *ftw) +{ + (void)st; + (void)ftw; + + if (type != FTW_D) { + return 0; + } + + if (ls_hidden == HIDE_ALL && path[nftw_dirlen + 1] == '.') { + return 0; + } + + static int firstpass = 1; + if (firstpass) { + firstpass = 0; + } else { + printf("\n"); + } + + ls_dir(path, 1); + return 0; +} + int main(int argc, char *argv[]) { setlocale(LC_ALL, ""); @@ -537,6 +561,7 @@ int main(int argc, char *argv[]) enum { NONE, OPERANDS, ALL } links = NONE; int list_dirs_separately = 1; + int recursive = 0; int c; while ((c = getopt(argc, argv, "ACFRSacdgfiklmnopqrstux1HL")) != -1) { @@ -562,7 +587,7 @@ int main(int argc, char *argv[]) break; case 'R': /** run recursively **/ - recurse = 1; + recursive = 1; break; case 'S': /** sort by size **/ @@ -586,7 +611,7 @@ int main(int argc, char *argv[]) ls_hidden = HIDE_NONE; //display = ROWS; //format ^= BLOCKS; - recurse = 0; + recursive = 0; break; case 'g': /** like -l, but without owner **/ @@ -723,7 +748,12 @@ int main(int argc, char *argv[]) } while (op->path != NULL) { - ls_dir(op->path, (size_t)argc > nfiles + 1); + if (recursive) { + nftw_dirlen = strlen(op->path); + nftw(op->path, ls_nftw, 10000, FTW_PHYS); + } else { + ls_dir(op->path, (size_t)argc > nfiles + 1); + } op++; if (op->path) { printf("\n"); @@ -731,7 +761,12 @@ int main(int argc, char *argv[]) } if (argc == 0) { - return ls_dir(".", 0); + if (recursive) { + nftw_dirlen = 1; + nftw(".", ls_nftw, 10000, FTW_PHYS); + } else { + ret = ls_dir(".", 0); + } } return ret; |