diff --git a/TODO b/TODO index e2fafd5..8062d4e 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,7 @@ With "micro-" prefix *Todo: -**ls (file) +**ls (file, indicator, GetPerm and print) tail expr uniq diff --git a/coreutils/ls.c b/coreutils/ls.c index c56bc5a..5ec6ad8 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -19,6 +19,7 @@ unsigned int a_flag; unsigned int l_flag; unsigned int F_flag; unsigned int c_flag; +unsigned int R_flag; unsigned int p_flag; struct d_node { @@ -232,7 +233,7 @@ int ls(const char *dir_name, int label, struct winsize w) { if (dir == NULL) return 1; - if (label) + if (label || R_flag) printf("\n%s:\n", dir_name); /* pipe print */ @@ -247,13 +248,18 @@ int ls(const char *dir_name, int label, struct winsize w) { else col_print(dir, files, w); + if (R_flag) + for (size_t i = 0; i < files; i++) + if (S_ISDIR(dir[i]->stats.st_mode)) + ls(dir[i]->name, 1, w); + dfree(dir); return 0; } int main(int argc, char **argv) { int opt; - while ((opt = getopt(argc, argv, "alFc")) != -1) { + while ((opt = getopt(argc, argv, "alFcR")) != -1) { switch (opt) { case 'a': a_flag = 1; @@ -271,8 +277,12 @@ int main(int argc, char **argv) { c_flag = 1; break; + case 'R': + R_flag = 1; + break; + default: - printf("ls [dir1 dir2...]\n\t[-a Show hidden files]\n\t[-l Use a long listing format]\n\t[-F Append indicator to names]\n\t[-c color mode]\n"); + printf("ls [dir1 dir2...]\n\t[-a Show hidden files]\n\t[-l Use a long listing format]\n\t[-F Append indicator to names]\n\t[-c Color mode] [-R Recursive]\n"); return 0; } }