summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2022-04-11 19:11:56 -0400
committerJakob Kaivo <jkk@ung.org>2022-04-11 19:11:56 -0400
commitce021cb8bee8dd2a6e4faf8a05eacdffd7c88787 (patch)
tree11cdcf94ac33839712aba6663d8133e35e3217eb
parent8beeead5fdc891138f5a6c476bd56a277b31e71f (diff)
implement -R
-rw-r--r--ls.c47
1 files changed, 41 insertions, 6 deletions
diff --git a/ls.c b/ls.c
index b6b1959..d792ebc 100644
--- a/ls.c
+++ b/ls.c
@@ -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;