Comment on kernel stuff
[oweals/busybox.git] / coreutils / ls.c
index 6ab11c4e5f21dcbbea41db921b1026fef4722533..0644cde877e7e4eb777a039a7a1afba61c5fcd6a 100644 (file)
 /************************************************************************/
 
 #include "internal.h"
-#if !defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1)
-# include <linux/types.h>
-#else
 # include <sys/types.h>
-#endif
 #include <sys/stat.h>
 #include <stdio.h>
 #include <unistd.h>
@@ -86,8 +82,9 @@
 #define DISP_DOT       8                       /* show . and .. */
 #define DISP_NUMERIC   16              /* numeric uid and gid */
 #define DISP_FULLTIME  32              /* show extended time display */
-#define DIR_NOLIST     64                      /* show directory as itself, not contents */
+#define DIR_NOLIST             64              /* show directory as itself, not contents */
 #define DISP_DIRNAME   128             /* show directory name (for internal use) */
+#define DISP_RECURSIVE 256             /* Do a recursive listing */
 
 #ifndef MAJOR
 #define MAJOR(dev) (((dev)>>8)&0xff)
@@ -344,7 +341,7 @@ static int list_item(const char *name)
        struct stat info;
        DIR *dir;
        struct dirent *entry;
-       char fullname[MAXNAMLEN + 1], *fnend;
+       char fullname[BUFSIZ + 1], *fnend;
 
        if (lstat(name, &info))
                goto listerr;
@@ -448,6 +445,9 @@ static const char ls_usage[] = "ls [-1a"
        "xAC"
 #ifdef BB_FEATURE_LS_FILETYPES
        "F"
+#endif
+#ifdef BB_FEATURE_LS_RECURSIVE
+       "R"
 #endif
        "] [filenames...]\n"
 #ifndef BB_FEATURE_TRIVIAL_HELP
@@ -477,9 +477,24 @@ static const char ls_usage[] = "ls [-1a"
 #ifdef BB_FEATURE_LS_FILETYPES
        "\t-F\tappend indicator (one of */=@|) to entries\n"
 #endif
+#ifdef BB_FEATURE_LS_RECURSIVE
+       "\t-R\tlist subdirectories recursively\n"
+#endif
 #endif
        ;
 
+
+#ifdef BB_FEATURE_LS_RECURSIVE
+static int dirAction(const char *fileName, struct stat *statbuf, void* junk)
+{
+       int i;
+       fprintf(stdout, "\n%s:\n", fileName);
+       i = list_item(fileName);
+       newline();
+       return (i);
+}
+#endif
+
 extern int ls_main(int argc, char **argv)
 {
        int argi = 1, i;
@@ -544,6 +559,13 @@ extern int ls_main(int argc, char **argv)
                                opts |= DISP_FULLTIME;
                                break;
 #endif
+#ifdef BB_FEATURE_LS_RECURSIVE
+                       case 'R':
+                               opts |= DISP_RECURSIVE;
+                               break;
+#endif
+                       case 'g': /* ignore -- for ftp servers */
+                               break;
                        default:
                                goto print_usage_message;
                        }
@@ -570,12 +592,25 @@ extern int ls_main(int argc, char **argv)
 #endif
 
        /* process files specified, or current directory if none */
-       i = 0;
-       if (argi == argc)
-               i = list_item(".");
-       while (argi < argc)
-               i |= list_item(argv[argi++]);
-       newline();
+#ifdef BB_FEATURE_LS_RECURSIVE
+       if (opts & DISP_RECURSIVE) {
+               i = 0;
+               if (argi == argc) {
+                       i = recursiveAction(".", TRUE, FALSE, FALSE, NULL, dirAction, NULL);
+               }
+               while (argi < argc) {
+                       i |= recursiveAction(argv[argi++], TRUE, FALSE, FALSE, NULL, dirAction, NULL);
+               }
+       } else 
+#endif
+       {
+               i = 0;
+               if (argi == argc)
+                       i = list_item(".");
+               while (argi < argc)
+                       i |= list_item(argv[argi++]);
+               newline();
+       }
        exit(i);
 
   print_usage_message: