More doc updates for BusyBox, with fixes to apps for bugs revealed
[oweals/busybox.git] / ls.c
diff --git a/ls.c b/ls.c
index f23c1e086d385b32e38c7a38ac726ee52fc7df05..0c7f6522cea486c270dac3a268c726ed23f8e209 100644 (file)
--- a/ls.c
+++ b/ls.c
  * it more portable.
  *
  * KNOWN BUGS:
- * 1. messy output if you mix files and directories on the command line
- * 2. ls -l of a directory doesn't give "total <blocks>" header
- * 3. ls of a symlink to a directory doesn't list directory contents
- * 4. hidden files can make column width too large
+ * 1. ls -l of a directory doesn't give "total <blocks>" header
+ * 2. ls of a symlink to a directory doesn't list directory contents
+ * 3. hidden files can make column width too large
+ *
  * NON-OPTIMAL BEHAVIOUR:
  * 1. autowidth reads directories twice
  * 2. if you do a short directory listing without filetype characters
 #define APPCHAR(mode)  ("\0|\0\0/\0\0\0\0\0@\0=\0\0\0" [TYPEINDEX(mode)])
 #endif
 
-#ifndef MAJOR
-#define MAJOR(dev) (((dev)>>8)&0xff)
-#define MINOR(dev) ((dev)&0xff)
-#endif
-
 #define FMT_AUTO       0
 #define FMT_LONG       1                       /* one record per line, extended info */
 #define FMT_SINGLE     2                       /* one record per line */
 #define DISP_FULLTIME  32              /* show extended time display */
 #define DIR_NOLIST     64                      /* show directory as itself, not contents */
 #define DISP_DIRNAME   128             /* show directory name (for internal use) */
-#define DIR_RECURSE    256                     /* -R (not yet implemented) */
+
+#ifndef MAJOR
+#define MAJOR(dev) (((dev)>>8)&0xff)
+#define MINOR(dev) ((dev)&0xff)
+#endif
 
 static unsigned char display_fmt = FMT_AUTO;
 static unsigned short opts = 0;
 static unsigned short column = 0;
 
 #ifdef BB_FEATURE_AUTOWIDTH
-static unsigned short terminal_width = 0, column_width = 0;
+static unsigned short terminal_width = 0;
+static unsigned short column_width = 0;
+static unsigned short toplevel_column_width = 0;
 #else
 #define terminal_width TERMINAL_WIDTH
 #define column_width   COLUMN_WIDTH
@@ -349,6 +350,9 @@ static int list_item(const char *name)
                goto listerr;
 
        if (!S_ISDIR(info.st_mode) || (opts & DIR_NOLIST)) {
+#ifdef BB_FEATURE_AUTOWIDTH
+               column_width = toplevel_column_width;
+#endif
                list_single(name, &info, name);
                return 0;
        }
@@ -407,6 +411,15 @@ static int list_item(const char *name)
                list_single(entry->d_name, &info, fullname);
        }
        closedir(dir);
+
+       if (opts & DISP_DIRNAME) {      /* separate the directory */
+               if (column) {
+                       wr("\n", 1);
+               }
+               wr("\n", 1);
+               column = 0;
+       }
+
        return 0;
 
   direrr:
@@ -436,10 +449,33 @@ static const char ls_usage[] = "ls [-1a"
 #ifdef BB_FEATURE_LS_FILETYPES
        "F"
 #endif
-#ifdef FEATURE_RECURSIVE
-       "R"
+       "] [filenames...]\n\n"
+       "Options:\n"
+       "\t-a\tdo not hide entries starting with .\n"
+#ifdef BB_FEATURE_LS_TIMESTAMPS
+       "\t-c\twith -l: show ctime (the time of last\n"
+    "\t\tmodification of file status information)\n"
+#endif
+       "\t-d\tlist directory entries instead of contents\n"
+#ifdef BB_FEATURE_LS_TIMESTAMPS
+       "\t-e\tlist both full date and full time\n"
 #endif
-       "] [filenames...]\n";
+       "\t-l\tuse a long listing format\n"
+       "\t-n\tlist numeric UIDs and GIDs instead of names\n"
+#ifdef BB_FEATURE_LS_FILETYPES
+       "\t-p\tappend indicator (one of /=@|) to entries\n"
+#endif
+#ifdef BB_FEATURE_LS_TIMESTAMPS
+       "\t-u\twith -l: show access time (the time of last\n"
+       "\t\taccess of the file)\n"
+#endif
+       "\t-x\tlist entries by lines instead of by columns\n"
+       "\t-A\tdo not list implied . and ..\n"
+       "\t-C\tlist entries by columns\n"
+#ifdef BB_FEATURE_LS_FILETYPES
+       "\t-F\tappend indicator (one of */=@|) to entries\n"
+#endif
+       ;
 
 extern int ls_main(int argc, char **argv)
 {
@@ -494,11 +530,6 @@ extern int ls_main(int argc, char **argv)
                        case 'd':
                                opts |= DIR_NOLIST;
                                break;
-#ifdef FEATURE_RECURSIVE
-                       case 'R':
-                               opts |= DIR_RECURSE;
-                               break;
-#endif
 #ifdef BB_FEATURE_LS_TIMESTAMPS
                        case 'u':
                                time_fmt = TIME_ACCESS;
@@ -530,8 +561,8 @@ extern int ls_main(int argc, char **argv)
        for (i = argi; i < argc; i++) {
                int len = strlen(argv[i]);
 
-               if (column_width < len)
-                       column_width = len;
+               if (toplevel_column_width < len)
+                       toplevel_column_width = len;
        }
 #endif