Add a compile-time check to ensure that filetype
[platform/upstream/coreutils.git] / src / ls.c
1 /* `dir', `vdir' and `ls' directory listing programs for GNU.
2    Copyright (C) 85, 88, 90, 91, 1995-2006 Free Software Foundation, Inc.
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2, or (at your option)
7    any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software Foundation,
16    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
17
18 /* If ls_mode is LS_MULTI_COL,
19    the multi-column format is the default regardless
20    of the type of output device.
21    This is for the `dir' program.
22
23    If ls_mode is LS_LONG_FORMAT,
24    the long format is the default regardless of the
25    type of output device.
26    This is for the `vdir' program.
27
28    If ls_mode is LS_LS,
29    the output format depends on whether the output
30    device is a terminal.
31    This is for the `ls' program.  */
32
33 /* Written by Richard Stallman and David MacKenzie.  */
34
35 /* Color support by Peter Anvin <Peter.Anvin@linux.org> and Dennis
36    Flaherty <dennisf@denix.elk.miles.com> based on original patches by
37    Greg Lee <lee@uhunix.uhcc.hawaii.edu>.  */
38
39 #include <config.h>
40 #include <sys/types.h>
41
42 #if HAVE_TERMIOS_H
43 # include <termios.h>
44 #endif
45 #if HAVE_STROPTS_H
46 # include <stropts.h>
47 #endif
48 #if HAVE_SYS_IOCTL_H
49 # include <sys/ioctl.h>
50 #endif
51
52 #ifdef WINSIZE_IN_PTEM
53 # include <sys/stream.h>
54 # include <sys/ptem.h>
55 #endif
56
57 #include <stdio.h>
58 #include <assert.h>
59 #include <setjmp.h>
60 #include <grp.h>
61 #include <pwd.h>
62 #include <getopt.h>
63 #include <signal.h>
64
65 /* Use SA_NOCLDSTOP as a proxy for whether the sigaction machinery is
66    present.  */
67 #ifndef SA_NOCLDSTOP
68 # define SA_NOCLDSTOP 0
69 # define sigprocmask(How, Set, Oset) /* empty */
70 # define sigset_t int
71 # if ! HAVE_SIGINTERRUPT
72 #  define siginterrupt(sig, flag) /* empty */
73 # endif
74 #endif
75
76 /* Get mbstate_t, mbrtowc(), mbsinit(), wcwidth().  */
77 #if HAVE_WCHAR_H
78 # include <wchar.h>
79 #endif
80
81 /* Get iswprint().  */
82 #if HAVE_WCTYPE_H
83 # include <wctype.h>
84 #endif
85 #if !defined iswprint && !HAVE_ISWPRINT
86 # define iswprint(wc) 1
87 #endif
88
89 #ifndef HAVE_DECL_WCWIDTH
90 "this configure-time declaration test was not run"
91 #endif
92 #if !HAVE_DECL_WCWIDTH
93 int wcwidth ();
94 #endif
95
96 /* If wcwidth() doesn't exist, assume all printable characters have
97    width 1.  */
98 #ifndef wcwidth
99 # if !HAVE_WCWIDTH
100 #  define wcwidth(wc) ((wc) == 0 ? 0 : iswprint (wc) ? 1 : -1)
101 # endif
102 #endif
103
104 #include "system.h"
105 #include <fnmatch.h>
106
107 #include "acl.h"
108 #include "argmatch.h"
109 #include "dev-ino.h"
110 #include "dirname.h"
111 #include "dirfd.h"
112 #include "error.h"
113 #include "filenamecat.h"
114 #include "hard-locale.h"
115 #include "hash.h"
116 #include "human.h"
117 #include "filemode.h"
118 #include "inttostr.h"
119 #include "ls.h"
120 #include "lstat.h"
121 #include "mbswidth.h"
122 #include "obstack.h"
123 #include "quote.h"
124 #include "quotearg.h"
125 #include "same.h"
126 #include "stat-time.h"
127 #include "strftime.h"
128 #include "strverscmp.h"
129 #include "xstrtol.h"
130 #include "xreadlink.h"
131
132 #define PROGRAM_NAME (ls_mode == LS_LS ? "ls" \
133                       : (ls_mode == LS_MULTI_COL \
134                          ? "dir" : "vdir"))
135
136 #define AUTHORS "Richard Stallman", "David MacKenzie"
137
138 #define obstack_chunk_alloc malloc
139 #define obstack_chunk_free free
140
141 /* Return an int indicating the result of comparing two integers.
142    Subtracting doesn't always work, due to overflow.  */
143 #define longdiff(a, b) ((a) < (b) ? -1 : (a) > (b))
144
145 #if ! HAVE_STRUCT_STAT_ST_AUTHOR
146 # define st_author st_uid
147 #endif
148
149 enum filetype
150   {
151     unknown,
152     fifo,
153     chardev,
154     directory,
155     blockdev,
156     normal,
157     symbolic_link,
158     sock,
159     whiteout,
160     arg_directory
161   };
162
163 /* Display letters and indicators for each filetype.
164    Keep these in sync with enum filetype.  */
165 static char const filetype_letter[] = "?pcdb-lswd";
166
167 /* Ensure that filetype and filetype_letter have the same
168    number of elements.  */
169 verify (sizeof filetype_letter - 1 == arg_directory + 1);
170
171 #define FILETYPE_INDICATORS                             \
172   {                                                     \
173     C_ORPHAN, C_FIFO, C_CHR, C_DIR, C_BLK, C_FILE,      \
174     C_LINK, C_SOCK, C_FILE, C_DIR                       \
175   }
176
177
178 struct fileinfo
179   {
180     /* The file name.  */
181     char *name;
182
183     struct stat stat;
184     bool stat_ok;
185
186     /* For symbolic link, name of the file linked to, otherwise zero.  */
187     char *linkname;
188
189     /* For symbolic link and long listing, st_mode of file linked to, otherwise
190        zero.  */
191     mode_t linkmode;
192
193     /* For symbolic link and color printing, true if linked-to file
194        exists, otherwise false.  */
195     bool linkok;
196
197     enum filetype filetype;
198
199 #if USE_ACL
200     /* For long listings, true if the file has an access control list.  */
201     bool have_acl;
202 #endif
203   };
204
205 #if USE_ACL
206 # define FILE_HAS_ACL(F) ((F)->have_acl)
207 #else
208 # define FILE_HAS_ACL(F) 0
209 #endif
210
211 #define LEN_STR_PAIR(s) sizeof (s) - 1, s
212
213 /* Null is a valid character in a color indicator (think about Epson
214    printers, for example) so we have to use a length/buffer string
215    type.  */
216
217 struct bin_str
218   {
219     size_t len;                 /* Number of bytes */
220     const char *string;         /* Pointer to the same */
221   };
222
223 char *getgroup ();
224 char *getuser ();
225
226 #if ! HAVE_TCGETPGRP
227 # define tcgetpgrp(Fd) 0
228 #endif
229
230 static size_t quote_name (FILE *out, const char *name,
231                           struct quoting_options const *options,
232                           size_t *width);
233 static char *make_link_name (char const *name, char const *linkname);
234 static int decode_switches (int argc, char **argv);
235 static bool file_ignored (char const *name);
236 static uintmax_t gobble_file (char const *name, enum filetype type,
237                               ino_t inode, bool command_line_arg,
238                               char const *dirname);
239 static void print_color_indicator (const char *name, mode_t mode, int linkok,
240                                    bool stat_ok, enum filetype type);
241 static void put_indicator (const struct bin_str *ind);
242 static void add_ignore_pattern (const char *pattern);
243 static void attach (char *dest, const char *dirname, const char *name);
244 static void clear_files (void);
245 static void extract_dirs_from_files (char const *dirname,
246                                      bool command_line_arg);
247 static void get_link_name (char const *filename, struct fileinfo *f,
248                            bool command_line_arg);
249 static void indent (size_t from, size_t to);
250 static size_t calculate_columns (bool by_columns);
251 static void print_current_files (void);
252 static void print_dir (char const *name, char const *realname,
253                        bool command_line_arg);
254 static void print_file_name_and_frills (const struct fileinfo *f);
255 static void print_horizontal (void);
256 static int format_user_width (uid_t u);
257 static int format_group_width (gid_t g);
258 static void print_long_format (const struct fileinfo *f);
259 static void print_many_per_line (void);
260 static void print_name_with_quoting (const char *p, mode_t mode,
261                                      int linkok, bool stat_ok,
262                                      enum filetype type,
263                                      struct obstack *stack);
264 static void prep_non_filename_text (void);
265 static void print_type_indicator (bool stat_ok, mode_t mode,
266                                   enum filetype type);
267 static void print_with_commas (void);
268 static void queue_directory (char const *name, char const *realname,
269                              bool command_line_arg);
270 static void sort_files (void);
271 static void parse_ls_color (void);
272 void usage (int status);
273
274 /* The name this program was run with.  */
275 char *program_name;
276
277 /* Initial size of hash table.
278    Most hierarchies are likely to be shallower than this.  */
279 #define INITIAL_TABLE_SIZE 30
280
281 /* The set of `active' directories, from the current command-line argument
282    to the level in the hierarchy at which files are being listed.
283    A directory is represented by its device and inode numbers (struct dev_ino).
284    A directory is added to this set when ls begins listing it or its
285    entries, and it is removed from the set just after ls has finished
286    processing it.  This set is used solely to detect loops, e.g., with
287    mkdir loop; cd loop; ln -s ../loop sub; ls -RL  */
288 static Hash_table *active_dir_set;
289
290 #define LOOP_DETECT (!!active_dir_set)
291
292 /* The table of files in the current directory:
293
294    `files' points to a vector of `struct fileinfo', one per file.
295    `nfiles' is the number of elements space has been allocated for.
296    `files_index' is the number actually in use.  */
297
298 /* Address of block containing the files that are described.  */
299 static struct fileinfo *files;  /* FIXME: rename this to e.g. cwd_file */
300
301 /* Length of block that `files' points to, measured in files.  */
302 static size_t nfiles;  /* FIXME: rename this to e.g. cwd_n_alloc */
303
304 /* Index of first unused in `files'.  */
305 static size_t files_index;  /* FIXME: rename this to e.g. cwd_n_used */
306
307 /* When true, in a color listing, color each symlink name according to the
308    type of file it points to.  Otherwise, color them according to the `ln'
309    directive in LS_COLORS.  Dangling (orphan) symlinks are treated specially,
310    regardless.  This is set when `ln=target' appears in LS_COLORS.  */
311
312 static bool color_symlink_as_referent;
313
314 /* mode of appropriate file for colorization */
315 #define FILE_OR_LINK_MODE(File) \
316     ((color_symlink_as_referent & (File)->linkok) \
317      ? (File)->linkmode : (File)->stat.st_mode)
318
319
320 /* Record of one pending directory waiting to be listed.  */
321
322 struct pending
323   {
324     char *name;
325     /* If the directory is actually the file pointed to by a symbolic link we
326        were told to list, `realname' will contain the name of the symbolic
327        link, otherwise zero.  */
328     char *realname;
329     bool command_line_arg;
330     struct pending *next;
331   };
332
333 static struct pending *pending_dirs;
334
335 /* Current time in seconds and nanoseconds since 1970, updated as
336    needed when deciding whether a file is recent.  */
337
338 static time_t current_time = TYPE_MINIMUM (time_t);
339 static int current_time_ns = -1;
340
341 /* Whether any of the files has an ACL.  This affects the width of the
342    mode column.  */
343
344 #if USE_ACL
345 static bool any_has_acl;
346 #else
347 enum { any_has_acl = false };
348 #endif
349
350 /* The number of columns to use for columns containing inode numbers,
351    block sizes, link counts, owners, groups, authors, major device
352    numbers, minor device numbers, and file sizes, respectively.  */
353
354 static int inode_number_width;
355 static int block_size_width;
356 static int nlink_width;
357 static int owner_width;
358 static int group_width;
359 static int author_width;
360 static int major_device_number_width;
361 static int minor_device_number_width;
362 static int file_size_width;
363
364 /* Option flags */
365
366 /* long_format for lots of info, one per line.
367    one_per_line for just names, one per line.
368    many_per_line for just names, many per line, sorted vertically.
369    horizontal for just names, many per line, sorted horizontally.
370    with_commas for just names, many per line, separated by commas.
371
372    -l (and other options that imply -l), -1, -C, -x and -m control
373    this parameter.  */
374
375 enum format
376   {
377     long_format,                /* -l and other options that imply -l */
378     one_per_line,               /* -1 */
379     many_per_line,              /* -C */
380     horizontal,                 /* -x */
381     with_commas                 /* -m */
382   };
383
384 static enum format format;
385
386 /* `full-iso' uses full ISO-style dates and times.  `long-iso' uses longer
387    ISO-style time stamps, though shorter than `full-iso'.  `iso' uses shorter
388    ISO-style time stamps.  `locale' uses locale-dependent time stamps.  */
389 enum time_style
390   {
391     full_iso_time_style,        /* --time-style=full-iso */
392     long_iso_time_style,        /* --time-style=long-iso */
393     iso_time_style,             /* --time-style=iso */
394     locale_time_style           /* --time-style=locale */
395   };
396
397 static char const *const time_style_args[] =
398 {
399   "full-iso", "long-iso", "iso", "locale", NULL
400 };
401 static enum time_style const time_style_types[] =
402 {
403   full_iso_time_style, long_iso_time_style, iso_time_style,
404   locale_time_style
405 };
406 ARGMATCH_VERIFY (time_style_args, time_style_types);
407
408 /* Type of time to print or sort by.  Controlled by -c and -u.
409    The values of each item of this enum are important since they are
410    used as indices in the sort functions array (see sort_files()).  */
411
412 enum time_type
413   {
414     time_mtime,                 /* default */
415     time_ctime,                 /* -c */
416     time_atime,                 /* -u */
417     time_numtypes               /* the number of elements of this enum */
418   };
419
420 static enum time_type time_type;
421
422 /* The file characteristic to sort by.  Controlled by -t, -S, -U, -X, -v.
423    The values of each item of this enum are important since they are
424    used as indices in the sort functions array (see sort_files()).  */
425
426 enum sort_type
427   {
428     sort_none = -1,             /* -U */
429     sort_name,                  /* default */
430     sort_extension,             /* -X */
431     sort_size,                  /* -S */
432     sort_version,               /* -v */
433     sort_time,                  /* -t */
434     sort_numtypes               /* the number of elements of this enum */
435   };
436
437 static enum sort_type sort_type;
438
439 /* Direction of sort.
440    false means highest first if numeric,
441    lowest first if alphabetic;
442    these are the defaults.
443    true means the opposite order in each case.  -r  */
444
445 static bool sort_reverse;
446
447 /* True means to display owner information.  -g turns this off.  */
448
449 static bool print_owner = true;
450
451 /* True means to display author information.  */
452
453 static bool print_author;
454
455 /* True means to display group information.  -G and -o turn this off.  */
456
457 static bool print_group = true;
458
459 /* True means print the user and group id's as numbers rather
460    than as names.  -n  */
461
462 static bool numeric_ids;
463
464 /* True means mention the size in blocks of each file.  -s  */
465
466 static bool print_block_size;
467
468 /* Human-readable options for output.  */
469 static int human_output_opts;
470
471 /* The units to use when printing sizes other than file sizes.  */
472 static uintmax_t output_block_size;
473
474 /* Likewise, but for file sizes.  */
475 static uintmax_t file_output_block_size = 1;
476
477 /* Follow the output with a special string.  Using this format,
478    Emacs' dired mode starts up twice as fast, and can handle all
479    strange characters in file names.  */
480 static bool dired;
481
482 /* `none' means don't mention the type of files.
483    `slash' means mention directories only, with a '/'.
484    `file_type' means mention file types.
485    `classify' means mention file types and mark executables.
486
487    Controlled by -F, -p, and --indicator-style.  */
488
489 enum indicator_style
490   {
491     none,       /*     --indicator-style=none */
492     slash,      /* -p, --indicator-style=slash */
493     file_type,  /*     --indicator-style=file-type */
494     classify    /* -F, --indicator-style=classify */
495   };
496
497 static enum indicator_style indicator_style;
498
499 /* Names of indicator styles.  */
500 static char const *const indicator_style_args[] =
501 {
502   "none", "slash", "file-type", "classify", NULL
503 };
504 static enum indicator_style const indicator_style_types[] =
505 {
506   none, slash, file_type, classify
507 };
508 ARGMATCH_VERIFY (indicator_style_args, indicator_style_types);
509
510 /* True means use colors to mark types.  Also define the different
511    colors as well as the stuff for the LS_COLORS environment variable.
512    The LS_COLORS variable is now in a termcap-like format.  */
513
514 static bool print_with_color;
515
516 enum color_type
517   {
518     color_never,                /* 0: default or --color=never */
519     color_always,               /* 1: --color=always */
520     color_if_tty                /* 2: --color=tty */
521   };
522
523 enum Dereference_symlink
524   {
525     DEREF_UNDEFINED = 1,
526     DEREF_NEVER,
527     DEREF_COMMAND_LINE_ARGUMENTS,       /* -H */
528     DEREF_COMMAND_LINE_SYMLINK_TO_DIR,  /* the default, in certain cases */
529     DEREF_ALWAYS                        /* -L */
530   };
531
532 enum indicator_no
533   {
534     C_LEFT, C_RIGHT, C_END, C_NORM, C_FILE, C_DIR, C_LINK, C_FIFO, C_SOCK,
535     C_BLK, C_CHR, C_MISSING, C_ORPHAN, C_EXEC, C_DOOR, C_SETUID, C_SETGID,
536     C_STICKY, C_OTHER_WRITABLE, C_STICKY_OTHER_WRITABLE
537   };
538
539 static const char *const indicator_name[]=
540   {
541     "lc", "rc", "ec", "no", "fi", "di", "ln", "pi", "so",
542     "bd", "cd", "mi", "or", "ex", "do", "su", "sg", "st",
543     "ow", "tw", NULL
544   };
545
546 struct color_ext_type
547   {
548     struct bin_str ext;         /* The extension we're looking for */
549     struct bin_str seq;         /* The sequence to output when we do */
550     struct color_ext_type *next;        /* Next in list */
551   };
552
553 static struct bin_str color_indicator[] =
554   {
555     { LEN_STR_PAIR ("\033[") },         /* lc: Left of color sequence */
556     { LEN_STR_PAIR ("m") },             /* rc: Right of color sequence */
557     { 0, NULL },                        /* ec: End color (replaces lc+no+rc) */
558     { LEN_STR_PAIR ("0") },             /* no: Normal */
559     { LEN_STR_PAIR ("0") },             /* fi: File: default */
560     { LEN_STR_PAIR ("01;34") },         /* di: Directory: bright blue */
561     { LEN_STR_PAIR ("01;36") },         /* ln: Symlink: bright cyan */
562     { LEN_STR_PAIR ("33") },            /* pi: Pipe: yellow/brown */
563     { LEN_STR_PAIR ("01;35") },         /* so: Socket: bright magenta */
564     { LEN_STR_PAIR ("01;33") },         /* bd: Block device: bright yellow */
565     { LEN_STR_PAIR ("01;33") },         /* cd: Char device: bright yellow */
566     { 0, NULL },                        /* mi: Missing file: undefined */
567     { 0, NULL },                        /* or: Orphaned symlink: undefined */
568     { LEN_STR_PAIR ("01;32") },         /* ex: Executable: bright green */
569     { LEN_STR_PAIR ("01;35") },         /* do: Door: bright magenta */
570     { LEN_STR_PAIR ("37;41") },         /* su: setuid: white on red */
571     { LEN_STR_PAIR ("30;43") },         /* sg: setgid: black on yellow */
572     { LEN_STR_PAIR ("37;44") },         /* st: sticky: black on blue */
573     { LEN_STR_PAIR ("34;42") },         /* ow: other-writable: blue on green */
574     { LEN_STR_PAIR ("30;42") },         /* tw: ow w/ sticky: black on green */
575   };
576
577 /* FIXME: comment  */
578 static struct color_ext_type *color_ext_list = NULL;
579
580 /* Buffer for color sequences */
581 static char *color_buf;
582
583 /* True means to check for orphaned symbolic link, for displaying
584    colors.  */
585
586 static bool check_symlink_color;
587
588 /* True means mention the inode number of each file.  -i  */
589
590 static bool print_inode;
591
592 /* What to do with symbolic links.  Affected by -d, -F, -H, -l (and
593    other options that imply -l), and -L.  */
594
595 static enum Dereference_symlink dereference;
596
597 /* True means when a directory is found, display info on its
598    contents.  -R  */
599
600 static bool recursive;
601
602 /* True means when an argument is a directory name, display info
603    on it itself.  -d  */
604
605 static bool immediate_dirs;
606
607 /* True means that directories are grouped before files. */
608
609 static bool directories_first;
610
611 /* Which files to ignore.  */
612
613 static enum
614 {
615   /* Ignore files whose names start with `.', and files specified by
616      --hide and --ignore.  */
617   IGNORE_DEFAULT,
618
619   /* Ignore `.', `..', and files specified by --ignore.  */
620   IGNORE_DOT_AND_DOTDOT,
621
622   /* Ignore only files specified by --ignore.  */
623   IGNORE_MINIMAL
624 } ignore_mode;
625
626 /* A linked list of shell-style globbing patterns.  If a non-argument
627    file name matches any of these patterns, it is ignored.
628    Controlled by -I.  Multiple -I options accumulate.
629    The -B option adds `*~' and `.*~' to this list.  */
630
631 struct ignore_pattern
632   {
633     const char *pattern;
634     struct ignore_pattern *next;
635   };
636
637 static struct ignore_pattern *ignore_patterns;
638
639 /* Similar to IGNORE_PATTERNS, except that -a or -A causes this
640    variable itself to be ignored.  */
641 static struct ignore_pattern *hide_patterns;
642
643 /* True means output nongraphic chars in file names as `?'.
644    (-q, --hide-control-chars)
645    qmark_funny_chars and the quoting style (-Q, --quoting-style=WORD) are
646    independent.  The algorithm is: first, obey the quoting style to get a
647    string representing the file name;  then, if qmark_funny_chars is set,
648    replace all nonprintable chars in that string with `?'.  It's necessary
649    to replace nonprintable chars even in quoted strings, because we don't
650    want to mess up the terminal if control chars get sent to it, and some
651    quoting methods pass through control chars as-is.  */
652 static bool qmark_funny_chars;
653
654 /* Quoting options for file and dir name output.  */
655
656 static struct quoting_options *filename_quoting_options;
657 static struct quoting_options *dirname_quoting_options;
658
659 /* The number of chars per hardware tab stop.  Setting this to zero
660    inhibits the use of TAB characters for separating columns.  -T */
661 static size_t tabsize;
662
663 /* True means print each directory name before listing it.  */
664
665 static bool print_dir_name;
666
667 /* The line length to use for breaking lines in many-per-line format.
668    Can be set with -w.  */
669
670 static size_t line_length;
671
672 /* If true, the file listing format requires that stat be called on
673    each file.  */
674
675 static bool format_needs_stat;
676
677 /* Similar to `format_needs_stat', but set if only the file type is
678    needed.  */
679
680 static bool format_needs_type;
681
682 /* An arbitrary limit on the number of bytes in a printed time stamp.
683    This is set to a relatively small value to avoid the need to worry
684    about denial-of-service attacks on servers that run "ls" on behalf
685    of remote clients.  1000 bytes should be enough for any practical
686    time stamp format.  */
687
688 enum { TIME_STAMP_LEN_MAXIMUM = MAX (1000, INT_STRLEN_BOUND (time_t)) };
689
690 /* strftime formats for non-recent and recent files, respectively, in
691    -l output.  */
692
693 static char const *long_time_format[2] =
694   {
695     /* strftime format for non-recent files (older than 6 months), in
696        -l output.  This should contain the year, month and day (at
697        least), in an order that is understood by people in your
698        locale's territory.  Please try to keep the number of used
699        screen columns small, because many people work in windows with
700        only 80 columns.  But make this as wide as the other string
701        below, for recent files.  */
702     N_("%b %e  %Y"),
703     /* strftime format for recent files (younger than 6 months), in -l
704        output.  This should contain the month, day and time (at
705        least), in an order that is understood by people in your
706        locale's territory.  Please try to keep the number of used
707        screen columns small, because many people work in windows with
708        only 80 columns.  But make this as wide as the other string
709        above, for non-recent files.  */
710     N_("%b %e %H:%M")
711   };
712
713 /* The set of signals that are caught.  */
714
715 static sigset_t caught_signals;
716
717 /* If nonzero, the value of the pending fatal signal.  */
718
719 static sig_atomic_t volatile interrupt_signal;
720
721 /* A count of the number of pending stop signals that have been received.  */
722
723 static sig_atomic_t volatile stop_signal_count;
724
725 /* Desired exit status.  */
726
727 static int exit_status;
728
729 /* Exit statuses.  */
730 enum
731   {
732     /* "ls" had a minor problem (e.g., it could not stat a directory
733        entry).  */
734     LS_MINOR_PROBLEM = 1,
735
736     /* "ls" had more serious trouble.  */
737     LS_FAILURE = 2
738   };
739
740 /* For long options that have no equivalent short option, use a
741    non-character as a pseudo short option, starting with CHAR_MAX + 1.  */
742 enum
743 {
744   AUTHOR_OPTION = CHAR_MAX + 1,
745   BLOCK_SIZE_OPTION,
746   COLOR_OPTION,
747   DEREFERENCE_COMMAND_LINE_SYMLINK_TO_DIR_OPTION,
748   FILE_TYPE_INDICATOR_OPTION,
749   FORMAT_OPTION,
750   FULL_TIME_OPTION,
751   GROUP_DIRECTORIES_FIRST_OPTION,
752   HIDE_OPTION,
753   INDICATOR_STYLE_OPTION,
754
755   /* FIXME: --kilobytes is deprecated (but not -k); remove in late 2006 */
756   KILOBYTES_LONG_OPTION,
757
758   QUOTING_STYLE_OPTION,
759   SHOW_CONTROL_CHARS_OPTION,
760   SI_OPTION,
761   SORT_OPTION,
762   TIME_OPTION,
763   TIME_STYLE_OPTION
764 };
765
766 static struct option const long_options[] =
767 {
768   {"all", no_argument, NULL, 'a'},
769   {"escape", no_argument, NULL, 'b'},
770   {"directory", no_argument, NULL, 'd'},
771   {"dired", no_argument, NULL, 'D'},
772   {"full-time", no_argument, NULL, FULL_TIME_OPTION},
773   {"group-directories-first", no_argument, NULL,
774    GROUP_DIRECTORIES_FIRST_OPTION},
775   {"human-readable", no_argument, NULL, 'h'},
776   {"inode", no_argument, NULL, 'i'},
777   {"kilobytes", no_argument, NULL, KILOBYTES_LONG_OPTION},
778   {"numeric-uid-gid", no_argument, NULL, 'n'},
779   {"no-group", no_argument, NULL, 'G'},
780   {"hide-control-chars", no_argument, NULL, 'q'},
781   {"reverse", no_argument, NULL, 'r'},
782   {"size", no_argument, NULL, 's'},
783   {"width", required_argument, NULL, 'w'},
784   {"almost-all", no_argument, NULL, 'A'},
785   {"ignore-backups", no_argument, NULL, 'B'},
786   {"classify", no_argument, NULL, 'F'},
787   {"file-type", no_argument, NULL, FILE_TYPE_INDICATOR_OPTION},
788   {"si", no_argument, NULL, SI_OPTION},
789   {"dereference-command-line", no_argument, NULL, 'H'},
790   {"dereference-command-line-symlink-to-dir", no_argument, NULL,
791    DEREFERENCE_COMMAND_LINE_SYMLINK_TO_DIR_OPTION},
792   {"hide", required_argument, NULL, HIDE_OPTION},
793   {"ignore", required_argument, NULL, 'I'},
794   {"indicator-style", required_argument, NULL, INDICATOR_STYLE_OPTION},
795   {"dereference", no_argument, NULL, 'L'},
796   {"literal", no_argument, NULL, 'N'},
797   {"quote-name", no_argument, NULL, 'Q'},
798   {"quoting-style", required_argument, NULL, QUOTING_STYLE_OPTION},
799   {"recursive", no_argument, NULL, 'R'},
800   {"format", required_argument, NULL, FORMAT_OPTION},
801   {"show-control-chars", no_argument, NULL, SHOW_CONTROL_CHARS_OPTION},
802   {"sort", required_argument, NULL, SORT_OPTION},
803   {"tabsize", required_argument, NULL, 'T'},
804   {"time", required_argument, NULL, TIME_OPTION},
805   {"time-style", required_argument, NULL, TIME_STYLE_OPTION},
806   {"color", optional_argument, NULL, COLOR_OPTION},
807   {"block-size", required_argument, NULL, BLOCK_SIZE_OPTION},
808   {"author", no_argument, NULL, AUTHOR_OPTION},
809   {GETOPT_HELP_OPTION_DECL},
810   {GETOPT_VERSION_OPTION_DECL},
811   {NULL, 0, NULL, 0}
812 };
813
814 static char const *const format_args[] =
815 {
816   "verbose", "long", "commas", "horizontal", "across",
817   "vertical", "single-column", NULL
818 };
819 static enum format const format_types[] =
820 {
821   long_format, long_format, with_commas, horizontal, horizontal,
822   many_per_line, one_per_line
823 };
824 ARGMATCH_VERIFY (format_args, format_types);
825
826 static char const *const sort_args[] =
827 {
828   "none", "time", "size", "extension", "version", NULL
829 };
830 static enum sort_type const sort_types[] =
831 {
832   sort_none, sort_time, sort_size, sort_extension, sort_version
833 };
834 ARGMATCH_VERIFY (sort_args, sort_types);
835
836 static char const *const time_args[] =
837 {
838   "atime", "access", "use", "ctime", "status", NULL
839 };
840 static enum time_type const time_types[] =
841 {
842   time_atime, time_atime, time_atime, time_ctime, time_ctime
843 };
844 ARGMATCH_VERIFY (time_args, time_types);
845
846 static char const *const color_args[] =
847 {
848   /* force and none are for compatibility with another color-ls version */
849   "always", "yes", "force",
850   "never", "no", "none",
851   "auto", "tty", "if-tty", NULL
852 };
853 static enum color_type const color_types[] =
854 {
855   color_always, color_always, color_always,
856   color_never, color_never, color_never,
857   color_if_tty, color_if_tty, color_if_tty
858 };
859 ARGMATCH_VERIFY (color_args, color_types);
860
861 /* Information about filling a column.  */
862 struct column_info
863 {
864   bool valid_len;
865   size_t line_len;
866   size_t *col_arr;
867 };
868
869 /* Array with information about column filledness.  */
870 static struct column_info *column_info;
871
872 /* Maximum number of columns ever possible for this display.  */
873 static size_t max_idx;
874
875 /* The minimum width of a column is 3: 1 character for the name and 2
876    for the separating white space.  */
877 #define MIN_COLUMN_WIDTH        3
878
879
880 /* This zero-based index is used solely with the --dired option.
881    When that option is in effect, this counter is incremented for each
882    byte of output generated by this program so that the beginning
883    and ending indices (in that output) of every file name can be recorded
884    and later output themselves.  */
885 static size_t dired_pos;
886
887 #define DIRED_PUTCHAR(c) do {putchar ((c)); ++dired_pos;} while (0)
888
889 /* Write S to STREAM and increment DIRED_POS by S_LEN.  */
890 #define DIRED_FPUTS(s, stream, s_len) \
891     do {fputs ((s), (stream)); dired_pos += s_len;} while (0)
892
893 /* Like DIRED_FPUTS, but for use when S is a literal string.  */
894 #define DIRED_FPUTS_LITERAL(s, stream) \
895     do {fputs ((s), (stream)); dired_pos += sizeof((s)) - 1;} while (0)
896
897 #define DIRED_INDENT()                                                  \
898     do                                                                  \
899       {                                                                 \
900         if (dired)                                                      \
901           DIRED_FPUTS_LITERAL ("  ", stdout);                           \
902       }                                                                 \
903     while (0)
904
905 /* With --dired, store pairs of beginning and ending indices of filenames.  */
906 static struct obstack dired_obstack;
907
908 /* With --dired, store pairs of beginning and ending indices of any
909    directory names that appear as headers (just before `total' line)
910    for lists of directory entries.  Such directory names are seen when
911    listing hierarchies using -R and when a directory is listed with at
912    least one other command line argument.  */
913 static struct obstack subdired_obstack;
914
915 /* Save the current index on the specified obstack, OBS.  */
916 #define PUSH_CURRENT_DIRED_POS(obs)                                     \
917   do                                                                    \
918     {                                                                   \
919       if (dired)                                                        \
920         obstack_grow ((obs), &dired_pos, sizeof (dired_pos));           \
921     }                                                                   \
922   while (0)
923
924 /* With -R, this stack is used to help detect directory cycles.
925    The device/inode pairs on this stack mirror the pairs in the
926    active_dir_set hash table.  */
927 static struct obstack dev_ino_obstack;
928
929 /* Push a pair onto the device/inode stack.  */
930 #define DEV_INO_PUSH(Dev, Ino)                                          \
931   do                                                                    \
932     {                                                                   \
933       struct dev_ino *di;                                               \
934       obstack_blank (&dev_ino_obstack, sizeof (struct dev_ino));        \
935       di = -1 + (struct dev_ino *) obstack_next_free (&dev_ino_obstack); \
936       di->st_dev = (Dev);                                               \
937       di->st_ino = (Ino);                                               \
938     }                                                                   \
939   while (0)
940
941 /* Pop a dev/ino struct off the global dev_ino_obstack
942    and return that struct.  */
943 static struct dev_ino
944 dev_ino_pop (void)
945 {
946   assert (sizeof (struct dev_ino) <= obstack_object_size (&dev_ino_obstack));
947   obstack_blank (&dev_ino_obstack, -(int) (sizeof (struct dev_ino)));
948   return *(struct dev_ino *) obstack_next_free (&dev_ino_obstack);
949 }
950
951 #define ASSERT_MATCHING_DEV_INO(Name, Di)       \
952   do                                            \
953     {                                           \
954       struct stat sb;                           \
955       assert (Name);                            \
956       assert (0 <= stat (Name, &sb));           \
957       assert (sb.st_dev == Di.st_dev);          \
958       assert (sb.st_ino == Di.st_ino);          \
959     }                                           \
960   while (0)
961
962
963 /* Write to standard output PREFIX, followed by the quoting style and
964    a space-separated list of the integers stored in OS all on one line.  */
965
966 static void
967 dired_dump_obstack (const char *prefix, struct obstack *os)
968 {
969   size_t n_pos;
970
971   n_pos = obstack_object_size (os) / sizeof (dired_pos);
972   if (n_pos > 0)
973     {
974       size_t i;
975       size_t *pos;
976
977       pos = (size_t *) obstack_finish (os);
978       fputs (prefix, stdout);
979       for (i = 0; i < n_pos; i++)
980         printf (" %lu", (unsigned long int) pos[i]);
981       putchar ('\n');
982     }
983 }
984
985 static size_t
986 dev_ino_hash (void const *x, size_t table_size)
987 {
988   struct dev_ino const *p = x;
989   return (uintmax_t) p->st_ino % table_size;
990 }
991
992 static bool
993 dev_ino_compare (void const *x, void const *y)
994 {
995   struct dev_ino const *a = x;
996   struct dev_ino const *b = y;
997   return SAME_INODE (*a, *b) ? true : false;
998 }
999
1000 static void
1001 dev_ino_free (void *x)
1002 {
1003   free (x);
1004 }
1005
1006 /* Add the device/inode pair (P->st_dev/P->st_ino) to the set of
1007    active directories.  Return true if there is already a matching
1008    entry in the table.  */
1009
1010 static bool
1011 visit_dir (dev_t dev, ino_t ino)
1012 {
1013   struct dev_ino *ent;
1014   struct dev_ino *ent_from_table;
1015   bool found_match;
1016
1017   ent = xmalloc (sizeof *ent);
1018   ent->st_ino = ino;
1019   ent->st_dev = dev;
1020
1021   /* Attempt to insert this entry into the table.  */
1022   ent_from_table = hash_insert (active_dir_set, ent);
1023
1024   if (ent_from_table == NULL)
1025     {
1026       /* Insertion failed due to lack of memory.  */
1027       xalloc_die ();
1028     }
1029
1030   found_match = (ent_from_table != ent);
1031
1032   if (found_match)
1033     {
1034       /* ent was not inserted, so free it.  */
1035       free (ent);
1036     }
1037
1038   return found_match;
1039 }
1040
1041 static void
1042 free_pending_ent (struct pending *p)
1043 {
1044   free (p->name);
1045   free (p->realname);
1046   free (p);
1047 }
1048
1049 static bool
1050 is_colored (enum indicator_no type)
1051 {
1052   size_t len = color_indicator[type].len;
1053   char const *s = color_indicator[type].string;
1054   return ! (len == 0
1055             || (len == 1 && strncmp (s, "0", 1) == 0)
1056             || (len == 2 && strncmp (s, "00", 2) == 0));
1057 }
1058
1059 static void
1060 restore_default_color (void)
1061 {
1062   put_indicator (&color_indicator[C_LEFT]);
1063   put_indicator (&color_indicator[C_RIGHT]);
1064 }
1065
1066 /* An ordinary signal was received; arrange for the program to exit.  */
1067
1068 static void
1069 sighandler (int sig)
1070 {
1071   if (! SA_NOCLDSTOP)
1072     signal (sig, SIG_IGN);
1073   if (! interrupt_signal)
1074     interrupt_signal = sig;
1075 }
1076
1077 /* A SIGTSTP was received; arrange for the program to suspend itself.  */
1078
1079 static void
1080 stophandler (int sig)
1081 {
1082   if (! SA_NOCLDSTOP)
1083     signal (sig, stophandler);
1084   if (! interrupt_signal)
1085     stop_signal_count++;
1086 }
1087
1088 /* Process any pending signals.  If signals are caught, this function
1089    should be called periodically.  Ideally there should never be an
1090    unbounded amount of time when signals are not being processed.
1091    Signal handling can restore the default colors, so callers must
1092    immediately change colors after invoking this function.  */
1093
1094 static void
1095 process_signals (void)
1096 {
1097   while (interrupt_signal | stop_signal_count)
1098     {
1099       int sig;
1100       int stops;
1101       sigset_t oldset;
1102
1103       restore_default_color ();
1104       fflush (stdout);
1105
1106       sigprocmask (SIG_BLOCK, &caught_signals, &oldset);
1107
1108       /* Reload interrupt_signal and stop_signal_count, in case a new
1109          signal was handled before sigprocmask took effect.  */
1110       sig = interrupt_signal;
1111       stops = stop_signal_count;
1112
1113       /* SIGTSTP is special, since the application can receive that signal
1114          more than once.  In this case, don't set the signal handler to the
1115          default.  Instead, just raise the uncatchable SIGSTOP.  */
1116       if (stops)
1117         {
1118           stop_signal_count = stops - 1;
1119           sig = SIGSTOP;
1120         }
1121       else
1122         signal (sig, SIG_DFL);
1123
1124       /* Exit or suspend the program.  */
1125       raise (sig);
1126       sigprocmask (SIG_SETMASK, &oldset, NULL);
1127
1128       /* If execution reaches here, then the program has been
1129          continued (after being suspended).  */
1130     }
1131 }
1132
1133 int
1134 main (int argc, char **argv)
1135 {
1136   int i;
1137   struct pending *thispend;
1138   int n_files;
1139
1140   /* The signals that are trapped, and the number of such signals.  */
1141   static int const sig[] = { SIGHUP, SIGINT, SIGPIPE,
1142                              SIGQUIT, SIGTERM, SIGTSTP };
1143   enum { nsigs = sizeof sig / sizeof sig[0] };
1144
1145 #if ! SA_NOCLDSTOP
1146   bool caught_sig[nsigs];
1147 #endif
1148
1149   initialize_main (&argc, &argv);
1150   program_name = argv[0];
1151   setlocale (LC_ALL, "");
1152   bindtextdomain (PACKAGE, LOCALEDIR);
1153   textdomain (PACKAGE);
1154
1155   initialize_exit_failure (LS_FAILURE);
1156   atexit (close_stdout);
1157
1158 #define N_ENTRIES(Array) (sizeof Array / sizeof *(Array))
1159   assert (N_ENTRIES (color_indicator) + 1 == N_ENTRIES (indicator_name));
1160
1161   exit_status = EXIT_SUCCESS;
1162   print_dir_name = true;
1163   pending_dirs = NULL;
1164
1165   i = decode_switches (argc, argv);
1166
1167   if (print_with_color)
1168     parse_ls_color ();
1169
1170   /* Test print_with_color again, because the call to parse_ls_color
1171      may have just reset it -- e.g., if LS_COLORS is invalid.  */
1172   if (print_with_color)
1173     {
1174       /* Avoid following symbolic links when possible.  */
1175       if (is_colored (C_ORPHAN)
1176           || is_colored (C_EXEC)
1177           || (is_colored (C_MISSING) && format == long_format))
1178         check_symlink_color = true;
1179
1180       /* If the standard output is a controlling terminal, watch out
1181          for signals, so that the colors can be restored to the
1182          default state if "ls" is suspended or interrupted.  */
1183
1184       if (0 <= tcgetpgrp (STDOUT_FILENO))
1185         {
1186           int j;
1187 #if SA_NOCLDSTOP
1188           struct sigaction act;
1189
1190           sigemptyset (&caught_signals);
1191           for (j = 0; j < nsigs; j++)
1192             {
1193               sigaction (sig[j], NULL, &act);
1194               if (act.sa_handler != SIG_IGN)
1195                 sigaddset (&caught_signals, sig[j]);
1196             }
1197
1198           act.sa_mask = caught_signals;
1199           act.sa_flags = SA_RESTART;
1200
1201           for (j = 0; j < nsigs; j++)
1202             if (sigismember (&caught_signals, sig[j]))
1203               {
1204                 act.sa_handler = sig[j] == SIGTSTP ? stophandler : sighandler;
1205                 sigaction (sig[j], &act, NULL);
1206               }
1207 #else
1208           for (j = 0; j < nsigs; j++)
1209             {
1210               caught_sig[j] = (signal (sig[j], SIG_IGN) != SIG_IGN);
1211               if (caught_sig[j])
1212                 {
1213                   signal (sig[j], sig[j] == SIGTSTP ? stophandler : sighandler);
1214                   siginterrupt (sig[j], 0);
1215                 }
1216             }
1217 #endif
1218         }
1219
1220       prep_non_filename_text ();
1221     }
1222
1223   if (dereference == DEREF_UNDEFINED)
1224     dereference = ((immediate_dirs
1225                     || indicator_style == classify
1226                     || format == long_format)
1227                    ? DEREF_NEVER
1228                    : DEREF_COMMAND_LINE_SYMLINK_TO_DIR);
1229
1230   /* When using -R, initialize a data structure we'll use to
1231      detect any directory cycles.  */
1232   if (recursive)
1233     {
1234       active_dir_set = hash_initialize (INITIAL_TABLE_SIZE, NULL,
1235                                         dev_ino_hash,
1236                                         dev_ino_compare,
1237                                         dev_ino_free);
1238       if (active_dir_set == NULL)
1239         xalloc_die ();
1240
1241       obstack_init (&dev_ino_obstack);
1242     }
1243
1244   format_needs_stat = sort_type == sort_time || sort_type == sort_size
1245     || format == long_format
1246     || print_block_size;
1247   format_needs_type = (! format_needs_stat
1248                        && (recursive
1249                            || print_with_color
1250                            || indicator_style != none
1251                            || directories_first));
1252
1253   if (dired)
1254     {
1255       obstack_init (&dired_obstack);
1256       obstack_init (&subdired_obstack);
1257     }
1258
1259   nfiles = 100;
1260   files = xnmalloc (nfiles, sizeof *files);
1261   files_index = 0;
1262
1263   clear_files ();
1264
1265   n_files = argc - i;
1266
1267   if (n_files <= 0)
1268     {
1269       if (immediate_dirs)
1270         gobble_file (".", directory, NOT_AN_INODE_NUMBER, true, "");
1271       else
1272         queue_directory (".", NULL, true);
1273     }
1274   else
1275     do
1276       gobble_file (argv[i++], unknown, NOT_AN_INODE_NUMBER, true, "");
1277     while (i < argc);
1278
1279   if (files_index)
1280     {
1281       sort_files ();
1282       if (!immediate_dirs)
1283         extract_dirs_from_files (NULL, true);
1284       /* `files_index' might be zero now.  */
1285     }
1286
1287   /* In the following if/else blocks, it is sufficient to test `pending_dirs'
1288      (and not pending_dirs->name) because there may be no markers in the queue
1289      at this point.  A marker may be enqueued when extract_dirs_from_files is
1290      called with a non-empty string or via print_dir.  */
1291   if (files_index)
1292     {
1293       print_current_files ();
1294       if (pending_dirs)
1295         DIRED_PUTCHAR ('\n');
1296     }
1297   else if (n_files <= 1 && pending_dirs && pending_dirs->next == 0)
1298     print_dir_name = false;
1299
1300   while (pending_dirs)
1301     {
1302       thispend = pending_dirs;
1303       pending_dirs = pending_dirs->next;
1304
1305       if (LOOP_DETECT)
1306         {
1307           if (thispend->name == NULL)
1308             {
1309               /* thispend->name == NULL means this is a marker entry
1310                  indicating we've finished processing the directory.
1311                  Use its dev/ino numbers to remove the corresponding
1312                  entry from the active_dir_set hash table.  */
1313               struct dev_ino di = dev_ino_pop ();
1314               struct dev_ino *found = hash_delete (active_dir_set, &di);
1315               /* ASSERT_MATCHING_DEV_INO (thispend->realname, di); */
1316               assert (found);
1317               dev_ino_free (found);
1318               free_pending_ent (thispend);
1319               continue;
1320             }
1321         }
1322
1323       print_dir (thispend->name, thispend->realname,
1324                  thispend->command_line_arg);
1325
1326       free_pending_ent (thispend);
1327       print_dir_name = true;
1328     }
1329
1330   if (print_with_color)
1331     {
1332       int j;
1333
1334       restore_default_color ();
1335       fflush (stdout);
1336
1337       /* Restore the default signal handling.  */
1338 #if SA_NOCLDSTOP
1339       for (j = 0; j < nsigs; j++)
1340         if (sigismember (&caught_signals, sig[j]))
1341           signal (sig[j], SIG_DFL);
1342 #else
1343       for (j = 0; j < nsigs; j++)
1344         if (caught_sig[j])
1345           signal (sig[j], SIG_DFL);
1346 #endif
1347
1348       /* Act on any signals that arrived before the default was restored.
1349          This can process signals out of order, but there doesn't seem to
1350          be an easy way to do them in order, and the order isn't that
1351          important anyway.  */
1352       for (j = stop_signal_count; j; j--)
1353         raise (SIGSTOP);
1354       j = interrupt_signal;
1355       if (j)
1356         raise (j);
1357     }
1358
1359   if (dired)
1360     {
1361       /* No need to free these since we're about to exit.  */
1362       dired_dump_obstack ("//DIRED//", &dired_obstack);
1363       dired_dump_obstack ("//SUBDIRED//", &subdired_obstack);
1364       printf ("//DIRED-OPTIONS// --quoting-style=%s\n",
1365               quoting_style_args[get_quoting_style (filename_quoting_options)]);
1366     }
1367
1368   if (LOOP_DETECT)
1369     {
1370       assert (hash_get_n_entries (active_dir_set) == 0);
1371       hash_free (active_dir_set);
1372     }
1373
1374   exit (exit_status);
1375 }
1376
1377 /* Set all the option flags according to the switches specified.
1378    Return the index of the first non-option argument.  */
1379
1380 static int
1381 decode_switches (int argc, char **argv)
1382 {
1383   int c;
1384   char *time_style_option = NULL;
1385
1386   /* Record whether there is an option specifying sort type.  */
1387   bool sort_type_specified = false;
1388
1389   qmark_funny_chars = false;
1390
1391   /* initialize all switches to default settings */
1392
1393   switch (ls_mode)
1394     {
1395     case LS_MULTI_COL:
1396       /* This is for the `dir' program.  */
1397       format = many_per_line;
1398       set_quoting_style (NULL, escape_quoting_style);
1399       break;
1400
1401     case LS_LONG_FORMAT:
1402       /* This is for the `vdir' program.  */
1403       format = long_format;
1404       set_quoting_style (NULL, escape_quoting_style);
1405       break;
1406
1407     case LS_LS:
1408       /* This is for the `ls' program.  */
1409       if (isatty (STDOUT_FILENO))
1410         {
1411           format = many_per_line;
1412           /* See description of qmark_funny_chars, above.  */
1413           qmark_funny_chars = true;
1414         }
1415       else
1416         {
1417           format = one_per_line;
1418           qmark_funny_chars = false;
1419         }
1420       break;
1421
1422     default:
1423       abort ();
1424     }
1425
1426   time_type = time_mtime;
1427   sort_type = sort_name;
1428   sort_reverse = false;
1429   numeric_ids = false;
1430   print_block_size = false;
1431   indicator_style = none;
1432   print_inode = false;
1433   dereference = DEREF_UNDEFINED;
1434   recursive = false;
1435   immediate_dirs = false;
1436   ignore_mode = IGNORE_DEFAULT;
1437   ignore_patterns = NULL;
1438   hide_patterns = NULL;
1439
1440   /* FIXME: put this in a function.  */
1441   {
1442     char const *q_style = getenv ("QUOTING_STYLE");
1443     if (q_style)
1444       {
1445         int i = ARGMATCH (q_style, quoting_style_args, quoting_style_vals);
1446         if (0 <= i)
1447           set_quoting_style (NULL, quoting_style_vals[i]);
1448         else
1449           error (0, 0,
1450          _("ignoring invalid value of environment variable QUOTING_STYLE: %s"),
1451                  quotearg (q_style));
1452       }
1453   }
1454
1455   {
1456     char const *ls_block_size = getenv ("LS_BLOCK_SIZE");
1457     human_output_opts = human_options (ls_block_size, false,
1458                                        &output_block_size);
1459     if (ls_block_size || getenv ("BLOCK_SIZE"))
1460       file_output_block_size = output_block_size;
1461   }
1462
1463   line_length = 80;
1464   {
1465     char const *p = getenv ("COLUMNS");
1466     if (p && *p)
1467       {
1468         unsigned long int tmp_ulong;
1469         if (xstrtoul (p, NULL, 0, &tmp_ulong, NULL) == LONGINT_OK
1470             && 0 < tmp_ulong && tmp_ulong <= SIZE_MAX)
1471           {
1472             line_length = tmp_ulong;
1473           }
1474         else
1475           {
1476             error (0, 0,
1477                _("ignoring invalid width in environment variable COLUMNS: %s"),
1478                    quotearg (p));
1479           }
1480       }
1481   }
1482
1483 #ifdef TIOCGWINSZ
1484   {
1485     struct winsize ws;
1486
1487     if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &ws) != -1
1488         && 0 < ws.ws_col && ws.ws_col == (size_t) ws.ws_col)
1489       line_length = ws.ws_col;
1490   }
1491 #endif
1492
1493   {
1494     char const *p = getenv ("TABSIZE");
1495     tabsize = 8;
1496     if (p)
1497       {
1498         unsigned long int tmp_ulong;
1499         if (xstrtoul (p, NULL, 0, &tmp_ulong, NULL) == LONGINT_OK
1500             && tmp_ulong <= SIZE_MAX)
1501           {
1502             tabsize = tmp_ulong;
1503           }
1504         else
1505           {
1506             error (0, 0,
1507              _("ignoring invalid tab size in environment variable TABSIZE: %s"),
1508                    quotearg (p));
1509           }
1510       }
1511   }
1512
1513   while ((c = getopt_long (argc, argv,
1514                            "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UX1",
1515                            long_options, NULL)) != -1)
1516     {
1517       switch (c)
1518         {
1519         case 'a':
1520           ignore_mode = IGNORE_MINIMAL;
1521           break;
1522
1523         case 'b':
1524           set_quoting_style (NULL, escape_quoting_style);
1525           break;
1526
1527         case 'c':
1528           time_type = time_ctime;
1529           break;
1530
1531         case 'd':
1532           immediate_dirs = true;
1533           break;
1534
1535         case 'f':
1536           /* Same as enabling -a -U and disabling -l -s.  */
1537           ignore_mode = IGNORE_MINIMAL;
1538           sort_type = sort_none;
1539           sort_type_specified = true;
1540           /* disable -l */
1541           if (format == long_format)
1542             format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
1543           print_block_size = false;     /* disable -s */
1544           print_with_color = false;     /* disable --color */
1545           break;
1546
1547         case FILE_TYPE_INDICATOR_OPTION: /* --file-type */
1548           indicator_style = file_type;
1549           break;
1550
1551         case 'g':
1552           format = long_format;
1553           print_owner = false;
1554           break;
1555
1556         case 'h':
1557           human_output_opts = human_autoscale | human_SI | human_base_1024;
1558           file_output_block_size = output_block_size = 1;
1559           break;
1560
1561         case 'i':
1562           print_inode = true;
1563           break;
1564
1565         case KILOBYTES_LONG_OPTION:
1566           error (0, 0,
1567                  _("the --kilobytes option is deprecated; use -k instead"));
1568           /* fall through */
1569         case 'k':
1570           human_output_opts = 0;
1571           file_output_block_size = output_block_size = 1024;
1572           break;
1573
1574         case 'l':
1575           format = long_format;
1576           break;
1577
1578         case 'm':
1579           format = with_commas;
1580           break;
1581
1582         case 'n':
1583           numeric_ids = true;
1584           format = long_format;
1585           break;
1586
1587         case 'o':  /* Just like -l, but don't display group info.  */
1588           format = long_format;
1589           print_group = false;
1590           break;
1591
1592         case 'p':
1593           indicator_style = slash;
1594           break;
1595
1596         case 'q':
1597           qmark_funny_chars = true;
1598           break;
1599
1600         case 'r':
1601           sort_reverse = true;
1602           break;
1603
1604         case 's':
1605           print_block_size = true;
1606           break;
1607
1608         case 't':
1609           sort_type = sort_time;
1610           sort_type_specified = true;
1611           break;
1612
1613         case 'u':
1614           time_type = time_atime;
1615           break;
1616
1617         case 'v':
1618           sort_type = sort_version;
1619           sort_type_specified = true;
1620           break;
1621
1622         case 'w':
1623           {
1624             unsigned long int tmp_ulong;
1625             if (xstrtoul (optarg, NULL, 0, &tmp_ulong, NULL) != LONGINT_OK
1626                 || ! (0 < tmp_ulong && tmp_ulong <= SIZE_MAX))
1627               error (LS_FAILURE, 0, _("invalid line width: %s"),
1628                      quotearg (optarg));
1629             line_length = tmp_ulong;
1630             break;
1631           }
1632
1633         case 'x':
1634           format = horizontal;
1635           break;
1636
1637         case 'A':
1638           if (ignore_mode == IGNORE_DEFAULT)
1639             ignore_mode = IGNORE_DOT_AND_DOTDOT;
1640           break;
1641
1642         case 'B':
1643           add_ignore_pattern ("*~");
1644           add_ignore_pattern (".*~");
1645           break;
1646
1647         case 'C':
1648           format = many_per_line;
1649           break;
1650
1651         case 'D':
1652           dired = true;
1653           break;
1654
1655         case 'F':
1656           indicator_style = classify;
1657           break;
1658
1659         case 'G':               /* inhibit display of group info */
1660           print_group = false;
1661           break;
1662
1663         case 'H':
1664           dereference = DEREF_COMMAND_LINE_ARGUMENTS;
1665           break;
1666
1667         case DEREFERENCE_COMMAND_LINE_SYMLINK_TO_DIR_OPTION:
1668           dereference = DEREF_COMMAND_LINE_SYMLINK_TO_DIR;
1669           break;
1670
1671         case 'I':
1672           add_ignore_pattern (optarg);
1673           break;
1674
1675         case 'L':
1676           dereference = DEREF_ALWAYS;
1677           break;
1678
1679         case 'N':
1680           set_quoting_style (NULL, literal_quoting_style);
1681           break;
1682
1683         case 'Q':
1684           set_quoting_style (NULL, c_quoting_style);
1685           break;
1686
1687         case 'R':
1688           recursive = true;
1689           break;
1690
1691         case 'S':
1692           sort_type = sort_size;
1693           sort_type_specified = true;
1694           break;
1695
1696         case 'T':
1697           {
1698             unsigned long int tmp_ulong;
1699             if (xstrtoul (optarg, NULL, 0, &tmp_ulong, NULL) != LONGINT_OK
1700                 || SIZE_MAX < tmp_ulong)
1701               error (LS_FAILURE, 0, _("invalid tab size: %s"),
1702                      quotearg (optarg));
1703             tabsize = tmp_ulong;
1704             break;
1705           }
1706
1707         case 'U':
1708           sort_type = sort_none;
1709           sort_type_specified = true;
1710           break;
1711
1712         case 'X':
1713           sort_type = sort_extension;
1714           sort_type_specified = true;
1715           break;
1716
1717         case '1':
1718           /* -1 has no effect after -l.  */
1719           if (format != long_format)
1720             format = one_per_line;
1721           break;
1722
1723         case AUTHOR_OPTION:
1724           print_author = true;
1725           break;
1726
1727         case HIDE_OPTION:
1728           {
1729             struct ignore_pattern *hide = xmalloc (sizeof *hide);
1730             hide->pattern = optarg;
1731             hide->next = hide_patterns;
1732             hide_patterns = hide;
1733           }
1734           break;
1735
1736         case SORT_OPTION:
1737           sort_type = XARGMATCH ("--sort", optarg, sort_args, sort_types);
1738           sort_type_specified = true;
1739           break;
1740
1741         case GROUP_DIRECTORIES_FIRST_OPTION:
1742           directories_first = true;
1743           break;
1744
1745         case TIME_OPTION:
1746           time_type = XARGMATCH ("--time", optarg, time_args, time_types);
1747           break;
1748
1749         case FORMAT_OPTION:
1750           format = XARGMATCH ("--format", optarg, format_args, format_types);
1751           break;
1752
1753         case FULL_TIME_OPTION:
1754           format = long_format;
1755           time_style_option = "full-iso";
1756           break;
1757
1758         case COLOR_OPTION:
1759           {
1760             int i;
1761             if (optarg)
1762               i = XARGMATCH ("--color", optarg, color_args, color_types);
1763             else
1764               /* Using --color with no argument is equivalent to using
1765                  --color=always.  */
1766               i = color_always;
1767
1768             print_with_color = (i == color_always
1769                                 || (i == color_if_tty
1770                                     && isatty (STDOUT_FILENO)));
1771
1772             if (print_with_color)
1773               {
1774                 /* Don't use TAB characters in output.  Some terminal
1775                    emulators can't handle the combination of tabs and
1776                    color codes on the same line.  */
1777                 tabsize = 0;
1778               }
1779             break;
1780           }
1781
1782         case INDICATOR_STYLE_OPTION:
1783           indicator_style = XARGMATCH ("--indicator-style", optarg,
1784                                        indicator_style_args,
1785                                        indicator_style_types);
1786           break;
1787
1788         case QUOTING_STYLE_OPTION:
1789           set_quoting_style (NULL,
1790                              XARGMATCH ("--quoting-style", optarg,
1791                                         quoting_style_args,
1792                                         quoting_style_vals));
1793           break;
1794
1795         case TIME_STYLE_OPTION:
1796           time_style_option = optarg;
1797           break;
1798
1799         case SHOW_CONTROL_CHARS_OPTION:
1800           qmark_funny_chars = false;
1801           break;
1802
1803         case BLOCK_SIZE_OPTION:
1804           human_output_opts = human_options (optarg, true, &output_block_size);
1805           file_output_block_size = output_block_size;
1806           break;
1807
1808         case SI_OPTION:
1809           human_output_opts = human_autoscale | human_SI;
1810           file_output_block_size = output_block_size = 1;
1811           break;
1812
1813         case_GETOPT_HELP_CHAR;
1814
1815         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1816
1817         default:
1818           usage (LS_FAILURE);
1819         }
1820     }
1821
1822   max_idx = MAX (1, line_length / MIN_COLUMN_WIDTH);
1823
1824   filename_quoting_options = clone_quoting_options (NULL);
1825   if (get_quoting_style (filename_quoting_options) == escape_quoting_style)
1826     set_char_quoting (filename_quoting_options, ' ', 1);
1827   if (file_type <= indicator_style)
1828     {
1829       char const *p;
1830       for (p = "*=>@|" + indicator_style - file_type; *p; p++)
1831         set_char_quoting (filename_quoting_options, *p, 1);
1832     }
1833
1834   dirname_quoting_options = clone_quoting_options (NULL);
1835   set_char_quoting (dirname_quoting_options, ':', 1);
1836
1837   /* --dired is meaningful only with --format=long (-l).
1838      Otherwise, ignore it.  FIXME: warn about this?
1839      Alternatively, make --dired imply --format=long?  */
1840   if (dired && format != long_format)
1841     dired = false;
1842
1843   /* If -c or -u is specified and not -l (or any other option that implies -l),
1844      and no sort-type was specified, then sort by the ctime (-c) or atime (-u).
1845      The behavior of ls when using either -c or -u but with neither -l nor -t
1846      appears to be unspecified by POSIX.  So, with GNU ls, `-u' alone means
1847      sort by atime (this is the one that's not specified by the POSIX spec),
1848      -lu means show atime and sort by name, -lut means show atime and sort
1849      by atime.  */
1850
1851   if ((time_type == time_ctime || time_type == time_atime)
1852       && !sort_type_specified && format != long_format)
1853     {
1854       sort_type = sort_time;
1855     }
1856
1857   if (format == long_format)
1858     {
1859       char *style = time_style_option;
1860       static char const posix_prefix[] = "posix-";
1861
1862       if (! style)
1863         if (! (style = getenv ("TIME_STYLE")))
1864           style = "locale";
1865
1866       while (strncmp (style, posix_prefix, sizeof posix_prefix - 1) == 0)
1867         {
1868           if (! hard_locale (LC_TIME))
1869             return optind;
1870           style += sizeof posix_prefix - 1;
1871         }
1872
1873       if (*style == '+')
1874         {
1875           char *p0 = style + 1;
1876           char *p1 = strchr (p0, '\n');
1877           if (! p1)
1878             p1 = p0;
1879           else
1880             {
1881               if (strchr (p1 + 1, '\n'))
1882                 error (LS_FAILURE, 0, _("invalid time style format %s"),
1883                        quote (p0));
1884               *p1++ = '\0';
1885             }
1886           long_time_format[0] = p0;
1887           long_time_format[1] = p1;
1888         }
1889       else
1890         switch (XARGMATCH ("time style", style,
1891                            time_style_args,
1892                            time_style_types))
1893           {
1894           case full_iso_time_style:
1895             long_time_format[0] = long_time_format[1] =
1896               "%Y-%m-%d %H:%M:%S.%N %z";
1897             break;
1898
1899           case long_iso_time_style:
1900           case_long_iso_time_style:
1901             long_time_format[0] = long_time_format[1] = "%Y-%m-%d %H:%M";
1902             break;
1903
1904           case iso_time_style:
1905             long_time_format[0] = "%Y-%m-%d ";
1906             long_time_format[1] = "%m-%d %H:%M";
1907             break;
1908
1909           case locale_time_style:
1910             if (hard_locale (LC_TIME))
1911               {
1912                 /* Ensure that the locale has translations for both
1913                    formats.  If not, fall back on long-iso format.  */
1914                 int i;
1915                 for (i = 0; i < 2; i++)
1916                   {
1917                     char const *locale_format =
1918                       dcgettext (NULL, long_time_format[i], LC_TIME);
1919                     if (locale_format == long_time_format[i])
1920                       goto case_long_iso_time_style;
1921                     long_time_format[i] = locale_format;
1922                   }
1923               }
1924           }
1925     }
1926
1927   return optind;
1928 }
1929
1930 /* Parse a string as part of the LS_COLORS variable; this may involve
1931    decoding all kinds of escape characters.  If equals_end is set an
1932    unescaped equal sign ends the string, otherwise only a : or \0
1933    does.  Set *OUTPUT_COUNT to the number of bytes output.  Return
1934    true if successful.
1935
1936    The resulting string is *not* null-terminated, but may contain
1937    embedded nulls.
1938
1939    Note that both dest and src are char **; on return they point to
1940    the first free byte after the array and the character that ended
1941    the input string, respectively.  */
1942
1943 static bool
1944 get_funky_string (char **dest, const char **src, bool equals_end,
1945                   size_t *output_count)
1946 {
1947   char num;                     /* For numerical codes */
1948   size_t count;                 /* Something to count with */
1949   enum {
1950     ST_GND, ST_BACKSLASH, ST_OCTAL, ST_HEX, ST_CARET, ST_END, ST_ERROR
1951   } state;
1952   const char *p;
1953   char *q;
1954
1955   p = *src;                     /* We don't want to double-indirect */
1956   q = *dest;                    /* the whole darn time.  */
1957
1958   count = 0;                    /* No characters counted in yet.  */
1959   num = 0;
1960
1961   state = ST_GND;               /* Start in ground state.  */
1962   while (state < ST_END)
1963     {
1964       switch (state)
1965         {
1966         case ST_GND:            /* Ground state (no escapes) */
1967           switch (*p)
1968             {
1969             case ':':
1970             case '\0':
1971               state = ST_END;   /* End of string */
1972               break;
1973             case '\\':
1974               state = ST_BACKSLASH; /* Backslash scape sequence */
1975               ++p;
1976               break;
1977             case '^':
1978               state = ST_CARET; /* Caret escape */
1979               ++p;
1980               break;
1981             case '=':
1982               if (equals_end)
1983                 {
1984                   state = ST_END; /* End */
1985                   break;
1986                 }
1987               /* else fall through */
1988             default:
1989               *(q++) = *(p++);
1990               ++count;
1991               break;
1992             }
1993           break;
1994
1995         case ST_BACKSLASH:      /* Backslash escaped character */
1996           switch (*p)
1997             {
1998             case '0':
1999             case '1':
2000             case '2':
2001             case '3':
2002             case '4':
2003             case '5':
2004             case '6':
2005             case '7':
2006               state = ST_OCTAL; /* Octal sequence */
2007               num = *p - '0';
2008               break;
2009             case 'x':
2010             case 'X':
2011               state = ST_HEX;   /* Hex sequence */
2012               num = 0;
2013               break;
2014             case 'a':           /* Bell */
2015               num = '\a';
2016               break;
2017             case 'b':           /* Backspace */
2018               num = '\b';
2019               break;
2020             case 'e':           /* Escape */
2021               num = 27;
2022               break;
2023             case 'f':           /* Form feed */
2024               num = '\f';
2025               break;
2026             case 'n':           /* Newline */
2027               num = '\n';
2028               break;
2029             case 'r':           /* Carriage return */
2030               num = '\r';
2031               break;
2032             case 't':           /* Tab */
2033               num = '\t';
2034               break;
2035             case 'v':           /* Vtab */
2036               num = '\v';
2037               break;
2038             case '?':           /* Delete */
2039               num = 127;
2040               break;
2041             case '_':           /* Space */
2042               num = ' ';
2043               break;
2044             case '\0':          /* End of string */
2045               state = ST_ERROR; /* Error! */
2046               break;
2047             default:            /* Escaped character like \ ^ : = */
2048               num = *p;
2049               break;
2050             }
2051           if (state == ST_BACKSLASH)
2052             {
2053               *(q++) = num;
2054               ++count;
2055               state = ST_GND;
2056             }
2057           ++p;
2058           break;
2059
2060         case ST_OCTAL:          /* Octal sequence */
2061           if (*p < '0' || *p > '7')
2062             {
2063               *(q++) = num;
2064               ++count;
2065               state = ST_GND;
2066             }
2067           else
2068             num = (num << 3) + (*(p++) - '0');
2069           break;
2070
2071         case ST_HEX:            /* Hex sequence */
2072           switch (*p)
2073             {
2074             case '0':
2075             case '1':
2076             case '2':
2077             case '3':
2078             case '4':
2079             case '5':
2080             case '6':
2081             case '7':
2082             case '8':
2083             case '9':
2084               num = (num << 4) + (*(p++) - '0');
2085               break;
2086             case 'a':
2087             case 'b':
2088             case 'c':
2089             case 'd':
2090             case 'e':
2091             case 'f':
2092               num = (num << 4) + (*(p++) - 'a') + 10;
2093               break;
2094             case 'A':
2095             case 'B':
2096             case 'C':
2097             case 'D':
2098             case 'E':
2099             case 'F':
2100               num = (num << 4) + (*(p++) - 'A') + 10;
2101               break;
2102             default:
2103               *(q++) = num;
2104               ++count;
2105               state = ST_GND;
2106               break;
2107             }
2108           break;
2109
2110         case ST_CARET:          /* Caret escape */
2111           state = ST_GND;       /* Should be the next state... */
2112           if (*p >= '@' && *p <= '~')
2113             {
2114               *(q++) = *(p++) & 037;
2115               ++count;
2116             }
2117           else if (*p == '?')
2118             {
2119               *(q++) = 127;
2120               ++count;
2121             }
2122           else
2123             state = ST_ERROR;
2124           break;
2125
2126         default:
2127           abort ();
2128         }
2129     }
2130
2131   *dest = q;
2132   *src = p;
2133   *output_count = count;
2134
2135   return state != ST_ERROR;
2136 }
2137
2138 static void
2139 parse_ls_color (void)
2140 {
2141   const char *p;                /* Pointer to character being parsed */
2142   char *buf;                    /* color_buf buffer pointer */
2143   int state;                    /* State of parser */
2144   int ind_no;                   /* Indicator number */
2145   char label[3];                /* Indicator label */
2146   struct color_ext_type *ext;   /* Extension we are working on */
2147
2148   if ((p = getenv ("LS_COLORS")) == NULL || *p == '\0')
2149     return;
2150
2151   ext = NULL;
2152   strcpy (label, "??");
2153
2154   /* This is an overly conservative estimate, but any possible
2155      LS_COLORS string will *not* generate a color_buf longer than
2156      itself, so it is a safe way of allocating a buffer in
2157      advance.  */
2158   buf = color_buf = xstrdup (p);
2159
2160   state = 1;
2161   while (state > 0)
2162     {
2163       switch (state)
2164         {
2165         case 1:         /* First label character */
2166           switch (*p)
2167             {
2168             case ':':
2169               ++p;
2170               break;
2171
2172             case '*':
2173               /* Allocate new extension block and add to head of
2174                  linked list (this way a later definition will
2175                  override an earlier one, which can be useful for
2176                  having terminal-specific defs override global).  */
2177
2178               ext = xmalloc (sizeof *ext);
2179               ext->next = color_ext_list;
2180               color_ext_list = ext;
2181
2182               ++p;
2183               ext->ext.string = buf;
2184
2185               state = (get_funky_string (&buf, &p, true, &ext->ext.len)
2186                        ? 4 : -1);
2187               break;
2188
2189             case '\0':
2190               state = 0;        /* Done! */
2191               break;
2192
2193             default:    /* Assume it is file type label */
2194               label[0] = *(p++);
2195               state = 2;
2196               break;
2197             }
2198           break;
2199
2200         case 2:         /* Second label character */
2201           if (*p)
2202             {
2203               label[1] = *(p++);
2204               state = 3;
2205             }
2206           else
2207             state = -1; /* Error */
2208           break;
2209
2210         case 3:         /* Equal sign after indicator label */
2211           state = -1;   /* Assume failure...  */
2212           if (*(p++) == '=')/* It *should* be...  */
2213             {
2214               for (ind_no = 0; indicator_name[ind_no] != NULL; ++ind_no)
2215                 {
2216                   if (STREQ (label, indicator_name[ind_no]))
2217                     {
2218                       color_indicator[ind_no].string = buf;
2219                       state = (get_funky_string (&buf, &p, false,
2220                                                  &color_indicator[ind_no].len)
2221                                ? 1 : -1);
2222                       break;
2223                     }
2224                 }
2225               if (state == -1)
2226                 error (0, 0, _("unrecognized prefix: %s"), quotearg (label));
2227             }
2228           break;
2229
2230         case 4:         /* Equal sign after *.ext */
2231           if (*(p++) == '=')
2232             {
2233               ext->seq.string = buf;
2234               state = (get_funky_string (&buf, &p, false, &ext->seq.len)
2235                        ? 1 : -1);
2236             }
2237           else
2238             state = -1;
2239           break;
2240         }
2241     }
2242
2243   if (state < 0)
2244     {
2245       struct color_ext_type *e;
2246       struct color_ext_type *e2;
2247
2248       error (0, 0,
2249              _("unparsable value for LS_COLORS environment variable"));
2250       free (color_buf);
2251       for (e = color_ext_list; e != NULL; /* empty */)
2252         {
2253           e2 = e;
2254           e = e->next;
2255           free (e2);
2256         }
2257       print_with_color = false;
2258     }
2259
2260   if (color_indicator[C_LINK].len == 6
2261       && !strncmp (color_indicator[C_LINK].string, "target", 6))
2262     color_symlink_as_referent = true;
2263 }
2264
2265 /* Set the exit status to report a failure.  If SERIOUS, it is a
2266    serious failure; otherwise, it is merely a minor problem.  */
2267
2268 static void
2269 set_exit_status (bool serious)
2270 {
2271   if (serious)
2272     exit_status = LS_FAILURE;
2273   else if (exit_status == EXIT_SUCCESS)
2274     exit_status = LS_MINOR_PROBLEM;
2275 }
2276
2277 /* Assuming a failure is serious if SERIOUS, use the printf-style
2278    MESSAGE to report the failure to access a file named FILE.  Assume
2279    errno is set appropriately for the failure.  */
2280
2281 static void
2282 file_failure (bool serious, char const *message, char const *file)
2283 {
2284   error (0, errno, message, quotearg_colon (file));
2285   set_exit_status (serious);
2286 }
2287
2288 /* Request that the directory named NAME have its contents listed later.
2289    If REALNAME is nonzero, it will be used instead of NAME when the
2290    directory name is printed.  This allows symbolic links to directories
2291    to be treated as regular directories but still be listed under their
2292    real names.  NAME == NULL is used to insert a marker entry for the
2293    directory named in REALNAME.
2294    If NAME is non-NULL, we use its dev/ino information to save
2295    a call to stat -- when doing a recursive (-R) traversal.
2296    COMMAND_LINE_ARG means this directory was mentioned on the command line.  */
2297
2298 static void
2299 queue_directory (char const *name, char const *realname, bool command_line_arg)
2300 {
2301   struct pending *new = xmalloc (sizeof *new);
2302   new->realname = realname ? xstrdup (realname) : NULL;
2303   new->name = name ? xstrdup (name) : NULL;
2304   new->command_line_arg = command_line_arg;
2305   new->next = pending_dirs;
2306   pending_dirs = new;
2307 }
2308
2309 /* Read directory NAME, and list the files in it.
2310    If REALNAME is nonzero, print its name instead of NAME;
2311    this is used for symbolic links to directories.
2312    COMMAND_LINE_ARG means this directory was mentioned on the command line.  */
2313
2314 static void
2315 print_dir (char const *name, char const *realname, bool command_line_arg)
2316 {
2317   DIR *dirp;
2318   struct dirent *next;
2319   uintmax_t total_blocks = 0;
2320   static bool first = true;
2321
2322   errno = 0;
2323   dirp = opendir (name);
2324   if (!dirp)
2325     {
2326       file_failure (command_line_arg, _("cannot open directory %s"), name);
2327       return;
2328     }
2329
2330   if (LOOP_DETECT)
2331     {
2332       struct stat dir_stat;
2333       int fd = dirfd (dirp);
2334
2335       /* If dirfd failed, endure the overhead of using stat.  */
2336       if ((0 <= fd
2337            ? fstat (fd, &dir_stat)
2338            : stat (name, &dir_stat)) < 0)
2339         {
2340           file_failure (command_line_arg,
2341                         _("cannot determine device and inode of %s"), name);
2342           return;
2343         }
2344
2345       /* If we've already visited this dev/inode pair, warn that
2346          we've found a loop, and do not process this directory.  */
2347       if (visit_dir (dir_stat.st_dev, dir_stat.st_ino))
2348         {
2349           error (0, 0, _("%s: not listing already-listed directory"),
2350                  quotearg_colon (name));
2351           return;
2352         }
2353
2354       DEV_INO_PUSH (dir_stat.st_dev, dir_stat.st_ino);
2355     }
2356
2357   /* Read the directory entries, and insert the subfiles into the `files'
2358      table.  */
2359
2360   clear_files ();
2361
2362   while (1)
2363     {
2364       /* Set errno to zero so we can distinguish between a readdir failure
2365          and when readdir simply finds that there are no more entries.  */
2366       errno = 0;
2367       next = readdir (dirp);
2368       if (next)
2369         {
2370           if (! file_ignored (next->d_name))
2371             {
2372               enum filetype type = unknown;
2373
2374 #if HAVE_STRUCT_DIRENT_D_TYPE
2375               switch (next->d_type)
2376                 {
2377                 case DT_BLK:  type = blockdev;          break;
2378                 case DT_CHR:  type = chardev;           break;
2379                 case DT_DIR:  type = directory;         break;
2380                 case DT_FIFO: type = fifo;              break;
2381                 case DT_LNK:  type = symbolic_link;     break;
2382                 case DT_REG:  type = normal;            break;
2383                 case DT_SOCK: type = sock;              break;
2384 # ifdef DT_WHT
2385                 case DT_WHT:  type = whiteout;          break;
2386 # endif
2387                 }
2388 #endif
2389               total_blocks += gobble_file (next->d_name, type, D_INO (next),
2390                                            false, name);
2391             }
2392         }
2393       else if (errno != 0)
2394         {
2395           file_failure (command_line_arg, _("reading directory %s"), name);
2396           if (errno != EOVERFLOW)
2397             break;
2398         }
2399       else
2400         break;
2401     }
2402
2403   if (closedir (dirp) != 0)
2404     {
2405       file_failure (command_line_arg, _("closing directory %s"), name);
2406       /* Don't return; print whatever we got.  */
2407     }
2408
2409   /* Sort the directory contents.  */
2410   sort_files ();
2411
2412   /* If any member files are subdirectories, perhaps they should have their
2413      contents listed rather than being mentioned here as files.  */
2414
2415   if (recursive)
2416     extract_dirs_from_files (name, command_line_arg);
2417
2418   if (recursive | print_dir_name)
2419     {
2420       if (!first)
2421         DIRED_PUTCHAR ('\n');
2422       first = false;
2423       DIRED_INDENT ();
2424       PUSH_CURRENT_DIRED_POS (&subdired_obstack);
2425       dired_pos += quote_name (stdout, realname ? realname : name,
2426                                dirname_quoting_options, NULL);
2427       PUSH_CURRENT_DIRED_POS (&subdired_obstack);
2428       DIRED_FPUTS_LITERAL (":\n", stdout);
2429     }
2430
2431   if (format == long_format || print_block_size)
2432     {
2433       const char *p;
2434       char buf[LONGEST_HUMAN_READABLE + 1];
2435
2436       DIRED_INDENT ();
2437       p = _("total");
2438       DIRED_FPUTS (p, stdout, strlen (p));
2439       DIRED_PUTCHAR (' ');
2440       p = human_readable (total_blocks, buf, human_output_opts,
2441                           ST_NBLOCKSIZE, output_block_size);
2442       DIRED_FPUTS (p, stdout, strlen (p));
2443       DIRED_PUTCHAR ('\n');
2444     }
2445
2446   if (files_index)
2447     print_current_files ();
2448 }
2449
2450 /* Add `pattern' to the list of patterns for which files that match are
2451    not listed.  */
2452
2453 static void
2454 add_ignore_pattern (const char *pattern)
2455 {
2456   struct ignore_pattern *ignore;
2457
2458   ignore = xmalloc (sizeof *ignore);
2459   ignore->pattern = pattern;
2460   /* Add it to the head of the linked list.  */
2461   ignore->next = ignore_patterns;
2462   ignore_patterns = ignore;
2463 }
2464
2465 /* Return true if one of the PATTERNS matches FILE.  */
2466
2467 static bool
2468 patterns_match (struct ignore_pattern const *patterns, char const *file)
2469 {
2470   struct ignore_pattern const *p;
2471   for (p = patterns; p; p = p->next)
2472     if (fnmatch (p->pattern, file, FNM_PERIOD) == 0)
2473       return true;
2474   return false;
2475 }
2476
2477 /* Return true if FILE should be ignored.  */
2478
2479 static bool
2480 file_ignored (char const *name)
2481 {
2482   return ((ignore_mode != IGNORE_MINIMAL
2483            && name[0] == '.'
2484            && (ignore_mode == IGNORE_DEFAULT || ! name[1 + (name[1] == '.')]))
2485           || (ignore_mode == IGNORE_DEFAULT
2486               && patterns_match (hide_patterns, name))
2487           || patterns_match (ignore_patterns, name));
2488 }
2489
2490 /* POSIX requires that a file size be printed without a sign, even
2491    when negative.  Assume the typical case where negative sizes are
2492    actually positive values that have wrapped around.  */
2493
2494 static uintmax_t
2495 unsigned_file_size (off_t size)
2496 {
2497   return size + (size < 0) * ((uintmax_t) OFF_T_MAX - OFF_T_MIN + 1);
2498 }
2499
2500 /* Enter and remove entries in the table `files'.  */
2501
2502 /* Empty the table of files.  */
2503
2504 static void
2505 clear_files (void)
2506 {
2507   size_t i;
2508
2509   for (i = 0; i < files_index; i++)
2510     {
2511       free (files[i].name);
2512       free (files[i].linkname);
2513     }
2514
2515   files_index = 0;
2516 #if USE_ACL
2517   any_has_acl = false;
2518 #endif
2519   inode_number_width = 0;
2520   block_size_width = 0;
2521   nlink_width = 0;
2522   owner_width = 0;
2523   group_width = 0;
2524   author_width = 0;
2525   major_device_number_width = 0;
2526   minor_device_number_width = 0;
2527   file_size_width = 0;
2528 }
2529
2530 /* Add a file to the current table of files.
2531    Verify that the file exists, and print an error message if it does not.
2532    Return the number of blocks that the file occupies.  */
2533
2534 static uintmax_t
2535 gobble_file (char const *name, enum filetype type, ino_t inode,
2536              bool command_line_arg, char const *dirname)
2537 {
2538   uintmax_t blocks = 0;
2539   struct fileinfo *f;
2540
2541   /* An inode value prior to gobble_file necessarily came from readdir,
2542      which is not used for command line arguments.  */
2543   assert (! command_line_arg || inode == NOT_AN_INODE_NUMBER);
2544
2545   if (files_index == nfiles)
2546     {
2547       files = xnrealloc (files, nfiles, 2 * sizeof *files);
2548       nfiles *= 2;
2549     }
2550
2551   f = &files[files_index];
2552   memset (f, '\0', sizeof *f);
2553   f->stat.st_ino = inode;
2554   f->filetype = type;
2555
2556   if (command_line_arg
2557       || format_needs_stat
2558       || (print_inode
2559           && (inode == NOT_AN_INODE_NUMBER
2560               /* When dereferencing symlinks, the inode must come from
2561                  stat, but readdir provides the inode of lstat.  Command
2562                  line dereferences are already taken care of by the above
2563                  assertion that the inode number is not yet known.  */
2564               || (dereference == DEREF_ALWAYS
2565                   && (type == symbolic_link || type == unknown))))
2566       || (format_needs_type
2567           && (type == unknown || command_line_arg
2568               /* --indicator-style=classify (aka -F)
2569                  requires that we stat each regular file
2570                  to see if it's executable.  */
2571               || (type == normal && (indicator_style == classify
2572                                      /* This is so that --color ends up
2573                                         highlighting files with the executable
2574                                         bit set even when options like -F are
2575                                         not specified.  */
2576                                      || (print_with_color
2577                                          && is_colored (C_EXEC))
2578                                      )))))
2579
2580     {
2581       /* Absolute name of this file.  */
2582       char *absolute_name;
2583
2584       int err;
2585
2586       if (name[0] == '/' || dirname[0] == 0)
2587         absolute_name = (char *) name;
2588       else
2589         {
2590           absolute_name = alloca (strlen (name) + strlen (dirname) + 2);
2591           attach (absolute_name, dirname, name);
2592         }
2593
2594       switch (dereference)
2595         {
2596         case DEREF_ALWAYS:
2597           err = stat (absolute_name, &f->stat);
2598           break;
2599
2600         case DEREF_COMMAND_LINE_ARGUMENTS:
2601         case DEREF_COMMAND_LINE_SYMLINK_TO_DIR:
2602           if (command_line_arg)
2603             {
2604               bool need_lstat;
2605               err = stat (absolute_name, &f->stat);
2606
2607               if (dereference == DEREF_COMMAND_LINE_ARGUMENTS)
2608                 break;
2609
2610               need_lstat = (err < 0
2611                             ? errno == ENOENT
2612                             : ! S_ISDIR (f->stat.st_mode));
2613               if (!need_lstat)
2614                 break;
2615
2616               /* stat failed because of ENOENT, maybe indicating a dangling
2617                  symlink.  Or stat succeeded, ABSOLUTE_NAME does not refer to a
2618                  directory, and --dereference-command-line-symlink-to-dir is
2619                  in effect.  Fall through so that we call lstat instead.  */
2620             }
2621
2622         default: /* DEREF_NEVER */
2623           err = lstat (absolute_name, &f->stat);
2624           break;
2625         }
2626
2627       if (err != 0)
2628         {
2629           /* Failure to stat a command line argument leads to
2630              an exit status of 2.  For other files, stat failure
2631              provokes an exit status of 1.  */
2632           file_failure (command_line_arg,
2633                         _("cannot access %s"), absolute_name);
2634           if (command_line_arg)
2635             return 0;
2636
2637           f->name = xstrdup (name);
2638           files_index++;
2639
2640           return 0;
2641         }
2642
2643       f->stat_ok = true;
2644
2645 #if USE_ACL
2646       if (format == long_format)
2647         {
2648           int n = file_has_acl (absolute_name, &f->stat);
2649           f->have_acl = (0 < n);
2650           any_has_acl |= f->have_acl;
2651           if (n < 0)
2652             error (0, errno, "%s", quotearg_colon (absolute_name));
2653         }
2654 #endif
2655
2656       if (S_ISLNK (f->stat.st_mode)
2657           && (format == long_format || check_symlink_color))
2658         {
2659           char *linkname;
2660           struct stat linkstats;
2661
2662           get_link_name (absolute_name, f, command_line_arg);
2663           linkname = make_link_name (absolute_name, f->linkname);
2664
2665           /* Avoid following symbolic links when possible, ie, when
2666              they won't be traced and when no indicator is needed.  */
2667           if (linkname
2668               && (file_type <= indicator_style || check_symlink_color)
2669               && stat (linkname, &linkstats) == 0)
2670             {
2671               f->linkok = true;
2672
2673               /* Symbolic links to directories that are mentioned on the
2674                  command line are automatically traced if not being
2675                  listed as files.  */
2676               if (!command_line_arg || format == long_format
2677                   || !S_ISDIR (linkstats.st_mode))
2678                 {
2679                   /* Get the linked-to file's mode for the filetype indicator
2680                      in long listings.  */
2681                   f->linkmode = linkstats.st_mode;
2682                 }
2683             }
2684           free (linkname);
2685         }
2686
2687       if (S_ISLNK (f->stat.st_mode))
2688         f->filetype = symbolic_link;
2689       else if (S_ISDIR (f->stat.st_mode))
2690         {
2691           if (command_line_arg & !immediate_dirs)
2692             f->filetype = arg_directory;
2693           else
2694             f->filetype = directory;
2695         }
2696       else
2697         f->filetype = normal;
2698
2699       blocks = ST_NBLOCKS (f->stat);
2700       {
2701         char buf[LONGEST_HUMAN_READABLE + 1];
2702         int len = mbswidth (human_readable (blocks, buf, human_output_opts,
2703                                             ST_NBLOCKSIZE, output_block_size),
2704                             0);
2705         if (block_size_width < len)
2706           block_size_width = len;
2707       }
2708
2709       if (print_owner)
2710         {
2711           int len = format_user_width (f->stat.st_uid);
2712           if (owner_width < len)
2713             owner_width = len;
2714         }
2715
2716       if (print_group)
2717         {
2718           int len = format_group_width (f->stat.st_gid);
2719           if (group_width < len)
2720             group_width = len;
2721         }
2722
2723       if (print_author)
2724         {
2725           int len = format_user_width (f->stat.st_author);
2726           if (author_width < len)
2727             author_width = len;
2728         }
2729
2730       {
2731         char buf[INT_BUFSIZE_BOUND (uintmax_t)];
2732         int len = strlen (umaxtostr (f->stat.st_nlink, buf));
2733         if (nlink_width < len)
2734           nlink_width = len;
2735       }
2736
2737       if (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode))
2738         {
2739           char buf[INT_BUFSIZE_BOUND (uintmax_t)];
2740           int len = strlen (umaxtostr (major (f->stat.st_rdev), buf));
2741           if (major_device_number_width < len)
2742             major_device_number_width = len;
2743           len = strlen (umaxtostr (minor (f->stat.st_rdev), buf));
2744           if (minor_device_number_width < len)
2745             minor_device_number_width = len;
2746           len = major_device_number_width + 2 + minor_device_number_width;
2747           if (file_size_width < len)
2748             file_size_width = len;
2749         }
2750       else
2751         {
2752           char buf[LONGEST_HUMAN_READABLE + 1];
2753           uintmax_t size = unsigned_file_size (f->stat.st_size);
2754           int len = mbswidth (human_readable (size, buf, human_output_opts,
2755                                               1, file_output_block_size),
2756                               0);
2757           if (file_size_width < len)
2758             file_size_width = len;
2759         }
2760     }
2761
2762   if (print_inode)
2763     {
2764       char buf[INT_BUFSIZE_BOUND (uintmax_t)];
2765       int len = strlen (umaxtostr (f->stat.st_ino, buf));
2766       if (inode_number_width < len)
2767         inode_number_width = len;
2768     }
2769
2770   f->name = xstrdup (name);
2771   files_index++;
2772
2773   return blocks;
2774 }
2775
2776 /* Return true if F refers to a directory.  */
2777 static bool
2778 is_directory (const struct fileinfo *f)
2779 {
2780   return f->filetype == directory || f->filetype == arg_directory;
2781 }
2782
2783
2784 #ifdef S_ISLNK
2785
2786 /* Put the name of the file that FILENAME is a symbolic link to
2787    into the LINKNAME field of `f'.  COMMAND_LINE_ARG indicates whether
2788    FILENAME is a command-line argument.  */
2789
2790 static void
2791 get_link_name (char const *filename, struct fileinfo *f, bool command_line_arg)
2792 {
2793   f->linkname = xreadlink (filename, f->stat.st_size);
2794   if (f->linkname == NULL)
2795     file_failure (command_line_arg, _("cannot read symbolic link %s"),
2796                   filename);
2797 }
2798
2799 /* If `linkname' is a relative name and `name' contains one or more
2800    leading directories, return `linkname' with those directories
2801    prepended; otherwise, return a copy of `linkname'.
2802    If `linkname' is zero, return zero.  */
2803
2804 static char *
2805 make_link_name (char const *name, char const *linkname)
2806 {
2807   char *linkbuf;
2808   size_t bufsiz;
2809
2810   if (!linkname)
2811     return NULL;
2812
2813   if (*linkname == '/')
2814     return xstrdup (linkname);
2815
2816   /* The link is to a relative name.  Prepend any leading directory
2817      in `name' to the link name.  */
2818   linkbuf = strrchr (name, '/');
2819   if (linkbuf == 0)
2820     return xstrdup (linkname);
2821
2822   bufsiz = linkbuf - name + 1;
2823   linkbuf = xmalloc (bufsiz + strlen (linkname) + 1);
2824   strncpy (linkbuf, name, bufsiz);
2825   strcpy (linkbuf + bufsiz, linkname);
2826   return linkbuf;
2827 }
2828 #endif
2829
2830 /* Return true if the last component of NAME is `.' or `..'
2831    This is so we don't try to recurse on `././././. ...' */
2832
2833 static bool
2834 basename_is_dot_or_dotdot (const char *name)
2835 {
2836   char const *base = last_component (name);
2837   return DOT_OR_DOTDOT (base);
2838 }
2839
2840 /* Remove any entries from FILES that are for directories,
2841    and queue them to be listed as directories instead.
2842    DIRNAME is the prefix to prepend to each dirname
2843    to make it correct relative to ls's working dir;
2844    if it is null, no prefix is needed and "." and ".." should not be ignored.
2845    If COMMAND_LINE_ARG is true, this directory was mentioned at the top level,
2846    This is desirable when processing directories recursively.  */
2847
2848 static void
2849 extract_dirs_from_files (char const *dirname, bool command_line_arg)
2850 {
2851   size_t i;
2852   size_t j;
2853   bool ignore_dot_and_dot_dot = (dirname != NULL);
2854
2855   if (dirname && LOOP_DETECT)
2856     {
2857       /* Insert a marker entry first.  When we dequeue this marker entry,
2858          we'll know that DIRNAME has been processed and may be removed
2859          from the set of active directories.  */
2860       queue_directory (NULL, dirname, false);
2861     }
2862
2863   /* Queue the directories last one first, because queueing reverses the
2864      order.  */
2865   for (i = files_index; i-- != 0; )
2866     if (is_directory (&files[i])
2867         && (! ignore_dot_and_dot_dot
2868             || ! basename_is_dot_or_dotdot (files[i].name)))
2869       {
2870         if (!dirname || files[i].name[0] == '/')
2871           {
2872             queue_directory (files[i].name, files[i].linkname,
2873                              command_line_arg);
2874           }
2875         else
2876           {
2877             char *name = file_name_concat (dirname, files[i].name, NULL);
2878             queue_directory (name, files[i].linkname, command_line_arg);
2879             free (name);
2880           }
2881         if (files[i].filetype == arg_directory)
2882           free (files[i].name);
2883       }
2884
2885   /* Now delete the directories from the table, compacting all the remaining
2886      entries.  */
2887
2888   for (i = 0, j = 0; i < files_index; i++)
2889     {
2890       if (files[i].filetype != arg_directory)
2891         {
2892           if (j < i)
2893             files[j] = files[i];
2894           ++j;
2895         }
2896     }
2897   files_index = j;
2898 }
2899
2900 /* Use strcoll to compare strings in this locale.  If an error occurs,
2901    report an error and longjmp to failed_strcoll.  */
2902
2903 static jmp_buf failed_strcoll;
2904
2905 static int
2906 xstrcoll (char const *a, char const *b)
2907 {
2908   int diff;
2909   errno = 0;
2910   diff = strcoll (a, b);
2911   if (errno)
2912     {
2913       error (0, errno, _("cannot compare file names %s and %s"),
2914              quote_n (0, a), quote_n (1, b));
2915       set_exit_status (false);
2916       longjmp (failed_strcoll, 1);
2917     }
2918   return diff;
2919 }
2920
2921 /* Comparison routines for sorting the files.  */
2922
2923 typedef void const *V;
2924 typedef int (*qsortFunc)(V a, V b);
2925
2926 /* Used below in DEFINE_SORT_FUNCTIONS for _df_ sort function variants.
2927    The do { ... } while(0) makes it possible to use the macro more like
2928    a statement, without violating C89 rules: */
2929 #define DIRFIRST_CHECK(a, b)                                            \
2930   do                                                                    \
2931     {                                                                   \
2932       bool a_is_dir = is_directory ((struct fileinfo const *) a);       \
2933       bool b_is_dir = is_directory ((struct fileinfo const *) b);       \
2934       if (a_is_dir && !b_is_dir)                                        \
2935         return -1;         /* a goes before b */                        \
2936       if (!a_is_dir && b_is_dir)                                        \
2937         return 1;          /* b goes before a */                        \
2938     }                                                                   \
2939   while (0)
2940
2941 /* Define the 8 different sort function variants required for each sortkey.
2942    KEY_NAME is a token describing the sort key, e.g., ctime, atime, size.
2943    KEY_CMP_FUNC is a function to compare records based on that key, e.g.,
2944    ctime_cmp, atime_cmp, size_cmp.  Append KEY_NAME to the string,
2945    '[rev_][x]str{cmp|coll}[_df]_', to create each function name.  */
2946 #define DEFINE_SORT_FUNCTIONS(key_name, key_cmp_func)                   \
2947   /* direct, non-dirfirst versions */                                   \
2948   static int xstrcoll_##key_name (V a, V b)                             \
2949   { return key_cmp_func (a, b, xstrcoll); }                             \
2950   static int strcmp_##key_name (V a, V b)                               \
2951   { return key_cmp_func (a, b, strcmp); }                               \
2952                                                                         \
2953   /* reverse, non-dirfirst versions */                                  \
2954   static int rev_xstrcoll_##key_name (V a, V b)                         \
2955   { return key_cmp_func (b, a, xstrcoll); }                             \
2956   static int rev_strcmp_##key_name (V a, V b)                           \
2957   { return key_cmp_func (b, a, strcmp); }                               \
2958                                                                         \
2959   /* direct, dirfirst versions */                                       \
2960   static int xstrcoll_df_##key_name (V a, V b)                          \
2961   { DIRFIRST_CHECK (a, b); return key_cmp_func (a, b, xstrcoll); }      \
2962   static int strcmp_df_##key_name (V a, V b)                            \
2963   { DIRFIRST_CHECK (a, b); return key_cmp_func (a, b, strcmp); }        \
2964                                                                         \
2965   /* reverse, dirfirst versions */                                      \
2966   static int rev_xstrcoll_df_##key_name (V a, V b)                      \
2967   { DIRFIRST_CHECK (a, b); return key_cmp_func (b, a, xstrcoll); }      \
2968   static int rev_strcmp_df_##key_name (V a, V b)                        \
2969   { DIRFIRST_CHECK (a, b); return key_cmp_func (b, a, strcmp); }
2970
2971 static inline int
2972 cmp_ctime (struct fileinfo const *a, struct fileinfo const *b,
2973            int (*cmp) (char const *, char const *))
2974 {
2975   int diff = timespec_cmp (get_stat_ctime (&b->stat),
2976                            get_stat_ctime (&a->stat));
2977   return diff ? diff : cmp (a->name, b->name);
2978 }
2979
2980 static inline int
2981 cmp_mtime (struct fileinfo const *a, struct fileinfo const *b,
2982            int (*cmp) (char const *, char const *))
2983 {
2984   int diff = timespec_cmp (get_stat_mtime (&b->stat),
2985                            get_stat_mtime (&a->stat));
2986   return diff ? diff : cmp (a->name, b->name);
2987 }
2988
2989 static inline int
2990 cmp_atime (struct fileinfo const *a, struct fileinfo const *b,
2991            int (*cmp) (char const *, char const *))
2992 {
2993   int diff = timespec_cmp (get_stat_atime (&b->stat),
2994                            get_stat_atime (&a->stat));
2995   return diff ? diff : cmp (a->name, b->name);
2996 }
2997
2998 static inline int
2999 cmp_size (struct fileinfo const *a, struct fileinfo const *b,
3000           int (*cmp) (char const *, char const *))
3001 {
3002   int diff = longdiff (b->stat.st_size, a->stat.st_size);
3003   return diff ? diff : cmp (a->name, b->name);
3004 }
3005
3006 static inline int
3007 cmp_name (struct fileinfo const *a, struct fileinfo const *b,
3008           int (*cmp) (char const *, char const *))
3009 {
3010   return cmp (a->name, b->name);
3011 }
3012
3013 /* Compare file extensions.  Files with no extension are `smallest'.
3014    If extensions are the same, compare by filenames instead.  */
3015
3016 static inline int
3017 cmp_extension (struct fileinfo const *a, struct fileinfo const *b,
3018                int (*cmp) (char const *, char const *))
3019 {
3020   char const *base1 = strrchr (a->name, '.');
3021   char const *base2 = strrchr (b->name, '.');
3022   int diff = cmp (base1 ? base1 : "", base2 ? base2 : "");
3023   return diff ? diff : cmp (a->name, b->name);
3024 }
3025
3026 DEFINE_SORT_FUNCTIONS (ctime, cmp_ctime)
3027 DEFINE_SORT_FUNCTIONS (mtime, cmp_mtime)
3028 DEFINE_SORT_FUNCTIONS (atime, cmp_atime)
3029 DEFINE_SORT_FUNCTIONS (size, cmp_size)
3030 DEFINE_SORT_FUNCTIONS (name, cmp_name)
3031 DEFINE_SORT_FUNCTIONS (extension, cmp_extension)
3032
3033 /* Compare file versions.
3034    Unlike all other compare functions above, cmp_version depends only
3035    on strverscmp, which does not fail (even for locale reasons), and does not
3036    need a secondary sort key.
3037    All the other sort options, in fact, need xstrcoll and strcmp variants,
3038    because they all use a string comparison (either as the primary or secondary
3039    sort key), and xstrcoll has the ability to do a longjmp if strcoll fails for
3040    locale reasons.  Last, strverscmp is ALWAYS available in coreutils,
3041    thanks to the gnulib library. */
3042 static inline int
3043 cmp_version (struct fileinfo const *a, struct fileinfo const *b)
3044 {
3045   return strverscmp (a->name, b->name);
3046 }
3047
3048 static int xstrcoll_version (V a, V b)
3049 { return cmp_version (a, b); }
3050 static int rev_xstrcoll_version (V a, V b)
3051 { return cmp_version (b, a); }
3052 static int xstrcoll_df_version (V a, V b)
3053 { DIRFIRST_CHECK (a, b); return cmp_version (a, b); }
3054 static int rev_xstrcoll_df_version (V a, V b)
3055 { DIRFIRST_CHECK (a, b); return cmp_version (b, a); }
3056
3057
3058 /* We have 2^3 different variants for each sortkey function
3059    (for 3 independent sort modes).
3060    The function pointers stored in this array must be dereferenced as:
3061
3062     sort_variants[sort_key][use_strcmp][reverse][dirs_first]
3063
3064    Note that the order in which sortkeys are listed in the function pointer
3065    array below is defined by the order of the elements in the time_type and
3066    sort_type enums!  */
3067
3068 #define LIST_SORTFUNCTION_VARIANTS(key_name)                        \
3069   {                                                                 \
3070     {                                                               \
3071       { xstrcoll_##key_name, xstrcoll_df_##key_name },              \
3072       { rev_xstrcoll_##key_name, rev_xstrcoll_df_##key_name },      \
3073     },                                                              \
3074     {                                                               \
3075       { strcmp_##key_name, strcmp_df_##key_name },                  \
3076       { rev_strcmp_##key_name, rev_strcmp_df_##key_name },          \
3077     }                                                               \
3078   }
3079
3080 static qsortFunc sort_functions[][2][2][2] =
3081   {
3082     LIST_SORTFUNCTION_VARIANTS (name),
3083     LIST_SORTFUNCTION_VARIANTS (extension),
3084     LIST_SORTFUNCTION_VARIANTS (size),
3085
3086     {
3087       {
3088         { xstrcoll_version, xstrcoll_df_version },
3089         { rev_xstrcoll_version, rev_xstrcoll_df_version },
3090       },
3091
3092       /* We use NULL for the strcmp variants of version comparison
3093          since as explained in cmp_version definition, version comparison
3094          does not rely on xstrcoll, so it will never longjmp, and never
3095          need to try the strcmp fallback. */
3096       {
3097         { NULL, NULL },
3098         { NULL, NULL },
3099       }
3100     },
3101
3102     /* last are time sort functions */
3103     LIST_SORTFUNCTION_VARIANTS (mtime),
3104     LIST_SORTFUNCTION_VARIANTS (ctime),
3105     LIST_SORTFUNCTION_VARIANTS (atime)
3106   };
3107
3108 /* The number of sortkeys is calculated as
3109      the number of elements in the sort_type enum (i.e. sort_numtypes) +
3110      the number of elements in the time_type enum (i.e. time_numtypes) - 1
3111    This is because when sort_type==sort_time, we have up to
3112    time_numtypes possible sortkeys.
3113
3114    This line verifies at compile-time that the array of sort functions has been
3115    initialized for all possible sortkeys. */
3116 verify (ARRAY_CARDINALITY (sort_functions)
3117         == sort_numtypes + time_numtypes - 1 );
3118
3119
3120 /* Sort the files now in the table.  */
3121
3122 static void
3123 sort_files (void)
3124 {
3125   bool use_strcmp;
3126
3127   if (sort_type == sort_none)
3128     return;
3129
3130   /* Try strcoll.  If it fails, fall back on strcmp.  We can't safely
3131      ignore strcoll failures, as a failing strcoll might be a
3132      comparison function that is not a total order, and if we ignored
3133      the failure this might cause qsort to dump core.  */
3134
3135   if (! setjmp (failed_strcoll))
3136     use_strcmp = false;      /* strcoll() succeeded */
3137   else
3138     {
3139       use_strcmp = true;
3140       assert (sort_type != sort_version);
3141     }
3142
3143   /* When sort_type == sort_time, use time_type as subindex.  */
3144   int timeoffset = sort_type == sort_time ? time_type : 0;
3145
3146   qsort (files, files_index, sizeof *files,
3147          sort_functions[sort_type + timeoffset][use_strcmp][sort_reverse]
3148                        [directories_first]);
3149 }
3150
3151 /* List all the files now in the table.  */
3152
3153 static void
3154 print_current_files (void)
3155 {
3156   size_t i;
3157
3158   switch (format)
3159     {
3160     case one_per_line:
3161       for (i = 0; i < files_index; i++)
3162         {
3163           print_file_name_and_frills (files + i);
3164           putchar ('\n');
3165         }
3166       break;
3167
3168     case many_per_line:
3169       print_many_per_line ();
3170       break;
3171
3172     case horizontal:
3173       print_horizontal ();
3174       break;
3175
3176     case with_commas:
3177       print_with_commas ();
3178       break;
3179
3180     case long_format:
3181       for (i = 0; i < files_index; i++)
3182         {
3183           print_long_format (files + i);
3184           DIRED_PUTCHAR ('\n');
3185         }
3186       break;
3187     }
3188 }
3189
3190 /* Return the expected number of columns in a long-format time stamp,
3191    or zero if it cannot be calculated.  */
3192
3193 static int
3194 long_time_expected_width (void)
3195 {
3196   static int width = -1;
3197
3198   if (width < 0)
3199     {
3200       time_t epoch = 0;
3201       struct tm const *tm = localtime (&epoch);
3202       char buf[TIME_STAMP_LEN_MAXIMUM + 1];
3203
3204       /* In case you're wondering if localtime can fail with an input time_t
3205          value of 0, let's just say it's very unlikely, but not inconceivable.
3206          The TZ environment variable would have to specify a time zone that
3207          is 2**31-1900 years or more ahead of UTC.  This could happen only on
3208          a 64-bit system that blindly accepts e.g., TZ=UTC+20000000000000.
3209          However, this is not possible with Solaris 10 or glibc-2.3.5, since
3210          their implementations limit the offset to 167:59 and 24:00, resp.  */
3211       if (tm)
3212         {
3213           size_t len =
3214             nstrftime (buf, sizeof buf, long_time_format[0], tm, 0, 0);
3215           if (len != 0)
3216             width = mbsnwidth (buf, len, 0);
3217         }
3218
3219       if (width < 0)
3220         width = 0;
3221     }
3222
3223   return width;
3224 }
3225
3226 /* Get the current time.  */
3227
3228 static void
3229 get_current_time (void)
3230 {
3231 #if HAVE_CLOCK_GETTIME && defined CLOCK_REALTIME
3232   {
3233     struct timespec timespec;
3234     if (clock_gettime (CLOCK_REALTIME, &timespec) == 0)
3235       {
3236         current_time = timespec.tv_sec;
3237         current_time_ns = timespec.tv_nsec;
3238         return;
3239       }
3240   }
3241 #endif
3242
3243   /* The clock does not have nanosecond resolution, so get the maximum
3244      possible value for the current time that is consistent with the
3245      reported clock.  That way, files are not considered to be in the
3246      future merely because their time stamps have higher resolution
3247      than the clock resolution.  */
3248
3249 #if HAVE_GETTIMEOFDAY
3250   {
3251     struct timeval timeval;
3252     gettimeofday (&timeval, NULL);
3253     current_time = timeval.tv_sec;
3254     current_time_ns = timeval.tv_usec * 1000 + 999;
3255   }
3256 #else
3257   current_time = time (NULL);
3258   current_time_ns = 999999999;
3259 #endif
3260 }
3261
3262 /* Print the user or group name NAME, with numeric id ID, using a
3263    print width of WIDTH columns.  */
3264
3265 static void
3266 format_user_or_group (char const *name, unsigned long int id, int width)
3267 {
3268   size_t len;
3269
3270   if (name)
3271     {
3272       int width_gap = width - mbswidth (name, 0);
3273       int pad = MAX (0, width_gap);
3274       fputs (name, stdout);
3275       len = strlen (name) + pad;
3276
3277       do
3278         putchar (' ');
3279       while (pad--);
3280     }
3281   else
3282     {
3283       printf ("%*lu ", width, id);
3284       len = width;
3285     }
3286
3287   dired_pos += len + 1;
3288 }
3289
3290 /* Print the name or id of the user with id U, using a print width of
3291    WIDTH.  */
3292
3293 static void
3294 format_user (uid_t u, int width, bool stat_ok)
3295 {
3296   format_user_or_group (! stat_ok ? "?" :
3297                         (numeric_ids ? NULL : getuser (u)), u, width);
3298 }
3299
3300 /* Likewise, for groups.  */
3301
3302 static void
3303 format_group (gid_t g, int width, bool stat_ok)
3304 {
3305   format_user_or_group (! stat_ok ? "?" :
3306                         (numeric_ids ? NULL : getgroup (g)), g, width);
3307 }
3308
3309 /* Return the number of columns that format_user_or_group will print.  */
3310
3311 static int
3312 format_user_or_group_width (char const *name, unsigned long int id)
3313 {
3314   if (name)
3315     {
3316       int len = mbswidth (name, 0);
3317       return MAX (0, len);
3318     }
3319   else
3320     {
3321       char buf[INT_BUFSIZE_BOUND (unsigned long int)];
3322       sprintf (buf, "%lu", id);
3323       return strlen (buf);
3324     }
3325 }
3326
3327 /* Return the number of columns that format_user will print.  */
3328
3329 static int
3330 format_user_width (uid_t u)
3331 {
3332   return format_user_or_group_width (numeric_ids ? NULL : getuser (u), u);
3333 }
3334
3335 /* Likewise, for groups.  */
3336
3337 static int
3338 format_group_width (gid_t g)
3339 {
3340   return format_user_or_group_width (numeric_ids ? NULL : getgroup (g), g);
3341 }
3342
3343
3344 /* Print information about F in long format.  */
3345
3346 static void
3347 print_long_format (const struct fileinfo *f)
3348 {
3349   char modebuf[12];
3350   char buf
3351     [LONGEST_HUMAN_READABLE + 1         /* inode */
3352      + LONGEST_HUMAN_READABLE + 1       /* size in blocks */
3353      + sizeof (modebuf) - 1 + 1         /* mode string */
3354      + INT_BUFSIZE_BOUND (uintmax_t)    /* st_nlink */
3355      + LONGEST_HUMAN_READABLE + 2       /* major device number */
3356      + LONGEST_HUMAN_READABLE + 1       /* minor device number */
3357      + TIME_STAMP_LEN_MAXIMUM + 1       /* max length of time/date */
3358      ];
3359   size_t s;
3360   char *p;
3361   time_t when;
3362   int when_ns;
3363   struct timespec when_timespec;
3364   struct tm *when_local;
3365
3366   /* Compute the mode string, except remove the trailing space if no
3367      files in this directory have ACLs.  */
3368   if (f->stat_ok)
3369     filemodestring (&f->stat, modebuf);
3370   else
3371     {
3372       modebuf[0] = filetype_letter[f->filetype];
3373       memset (modebuf + 1, '?', 10);
3374       modebuf[11] = '\0';
3375     }
3376   if (! any_has_acl)
3377     modebuf[10] = '\0';
3378   else if (FILE_HAS_ACL (f))
3379     modebuf[10] = '+';
3380
3381   switch (time_type)
3382     {
3383     case time_ctime:
3384       when_timespec = get_stat_ctime (&f->stat);
3385       break;
3386     case time_mtime:
3387       when_timespec = get_stat_mtime (&f->stat);
3388       break;
3389     case time_atime:
3390       when_timespec = get_stat_atime (&f->stat);
3391       break;
3392     default:
3393       abort ();
3394     }
3395
3396   when = when_timespec.tv_sec;
3397   when_ns = when_timespec.tv_nsec;
3398
3399   p = buf;
3400
3401   if (print_inode)
3402     {
3403       char hbuf[INT_BUFSIZE_BOUND (uintmax_t)];
3404       sprintf (p, "%*s ", inode_number_width,
3405                (f->stat.st_ino == NOT_AN_INODE_NUMBER
3406                 ? "?"
3407                 : umaxtostr (f->stat.st_ino, hbuf)));
3408       /* Increment by strlen (p) here, rather than by inode_number_width + 1.
3409          The latter is wrong when inode_number_width is zero.  */
3410       p += strlen (p);
3411     }
3412
3413   if (print_block_size)
3414     {
3415       char hbuf[LONGEST_HUMAN_READABLE + 1];
3416       char const *blocks =
3417         (! f->stat_ok
3418          ? "?"
3419          : human_readable (ST_NBLOCKS (f->stat), hbuf, human_output_opts,
3420                            ST_NBLOCKSIZE, output_block_size));
3421       int pad;
3422       for (pad = block_size_width - mbswidth (blocks, 0); 0 < pad; pad--)
3423         *p++ = ' ';
3424       while ((*p++ = *blocks++))
3425         continue;
3426       p[-1] = ' ';
3427     }
3428
3429   /* The last byte of the mode string is the POSIX
3430      "optional alternate access method flag".  */
3431   {
3432     char hbuf[INT_BUFSIZE_BOUND (uintmax_t)];
3433     sprintf (p, "%s %*s ", modebuf, nlink_width,
3434              ! f->stat_ok ? "?" : umaxtostr (f->stat.st_nlink, hbuf));
3435   }
3436   /* Increment by strlen (p) here, rather than by, e.g.,
3437      sizeof modebuf - 2 + any_has_acl + 1 + nlink_width + 1.
3438      The latter is wrong when nlink_width is zero.  */
3439   p += strlen (p);
3440
3441   DIRED_INDENT ();
3442
3443   if (print_owner | print_group | print_author)
3444     {
3445       DIRED_FPUTS (buf, stdout, p - buf);
3446
3447       if (print_owner)
3448         format_user (f->stat.st_uid, owner_width, f->stat_ok);
3449
3450       if (print_group)
3451         format_group (f->stat.st_gid, group_width, f->stat_ok);
3452
3453       if (print_author)
3454         format_user (f->stat.st_author, author_width, f->stat_ok);
3455
3456       p = buf;
3457     }
3458
3459   if (f->stat_ok
3460       && (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode)))
3461     {
3462       char majorbuf[INT_BUFSIZE_BOUND (uintmax_t)];
3463       char minorbuf[INT_BUFSIZE_BOUND (uintmax_t)];
3464       int blanks_width = (file_size_width
3465                           - (major_device_number_width + 2
3466                              + minor_device_number_width));
3467       sprintf (p, "%*s, %*s ",
3468                major_device_number_width + MAX (0, blanks_width),
3469                umaxtostr (major (f->stat.st_rdev), majorbuf),
3470                minor_device_number_width,
3471                umaxtostr (minor (f->stat.st_rdev), minorbuf));
3472       p += file_size_width + 1;
3473     }
3474   else
3475     {
3476       char hbuf[LONGEST_HUMAN_READABLE + 1];
3477       char const *size =
3478         (! f->stat_ok
3479          ? "?"
3480          : human_readable (unsigned_file_size (f->stat.st_size),
3481                            hbuf, human_output_opts, 1, file_output_block_size));
3482       int pad;
3483       for (pad = file_size_width - mbswidth (size, 0); 0 < pad; pad--)
3484         *p++ = ' ';
3485       while ((*p++ = *size++))
3486         continue;
3487       p[-1] = ' ';
3488     }
3489
3490   when_local = localtime (&when_timespec.tv_sec);
3491   s = 0;
3492   *p = '\1';
3493
3494   if (f->stat_ok && when_local)
3495     {
3496       time_t six_months_ago;
3497       bool recent;
3498       char const *fmt;
3499
3500       /* If the file appears to be in the future, update the current
3501          time, in case the file happens to have been modified since
3502          the last time we checked the clock.  */
3503       if (current_time < when
3504           || (current_time == when && current_time_ns < when_ns))
3505         {
3506           /* Note that get_current_time calls gettimeofday which, on some non-
3507              compliant systems, clobbers the buffer used for localtime's result.
3508              But it's ok here, because we use a gettimeofday wrapper that
3509              saves and restores the buffer around the gettimeofday call.  */
3510           get_current_time ();
3511         }
3512
3513       /* Consider a time to be recent if it is within the past six
3514          months.  A Gregorian year has 365.2425 * 24 * 60 * 60 ==
3515          31556952 seconds on the average.  Write this value as an
3516          integer constant to avoid floating point hassles.  */
3517       six_months_ago = current_time - 31556952 / 2;
3518       recent = (six_months_ago <= when
3519                 && (when < current_time
3520                     || (when == current_time && when_ns <= current_time_ns)));
3521       fmt = long_time_format[recent];
3522
3523       s = nstrftime (p, TIME_STAMP_LEN_MAXIMUM + 1, fmt,
3524                      when_local, 0, when_ns);
3525     }
3526
3527   if (s || !*p)
3528     {
3529       p += s;
3530       *p++ = ' ';
3531
3532       /* NUL-terminate the string -- fputs (via DIRED_FPUTS) requires it.  */
3533       *p = '\0';
3534     }
3535   else
3536     {
3537       /* The time cannot be converted using the desired format, so
3538          print it as a huge integer number of seconds.  */
3539       char hbuf[INT_BUFSIZE_BOUND (intmax_t)];
3540       sprintf (p, "%*s ", long_time_expected_width (),
3541                (! f->stat_ok
3542                 ? "?"
3543                 : (TYPE_SIGNED (time_t)
3544                    ? imaxtostr (when, hbuf)
3545                    : umaxtostr (when, hbuf))));
3546       p += strlen (p);
3547     }
3548
3549   DIRED_FPUTS (buf, stdout, p - buf);
3550   print_name_with_quoting (f->name, FILE_OR_LINK_MODE (f), f->linkok,
3551                            f->stat_ok, f->filetype, &dired_obstack);
3552
3553   if (f->filetype == symbolic_link)
3554     {
3555       if (f->linkname)
3556         {
3557           DIRED_FPUTS_LITERAL (" -> ", stdout);
3558           print_name_with_quoting (f->linkname, f->linkmode, f->linkok - 1,
3559                                    f->stat_ok, f->filetype, NULL);
3560           if (indicator_style != none)
3561             print_type_indicator (true, f->linkmode, unknown);
3562         }
3563     }
3564   else if (indicator_style != none)
3565     print_type_indicator (f->stat_ok, f->stat.st_mode, f->filetype);
3566 }
3567
3568 /* Output to OUT a quoted representation of the file name NAME,
3569    using OPTIONS to control quoting.  Produce no output if OUT is NULL.
3570    Store the number of screen columns occupied by NAME's quoted
3571    representation into WIDTH, if non-NULL.  Return the number of bytes
3572    produced.  */
3573
3574 static size_t
3575 quote_name (FILE *out, const char *name, struct quoting_options const *options,
3576             size_t *width)
3577 {
3578   char smallbuf[BUFSIZ];
3579   size_t len = quotearg_buffer (smallbuf, sizeof smallbuf, name, -1, options);
3580   char *buf;
3581   size_t displayed_width IF_LINT (= 0);
3582
3583   if (len < sizeof smallbuf)
3584     buf = smallbuf;
3585   else
3586     {
3587       buf = alloca (len + 1);
3588       quotearg_buffer (buf, len + 1, name, -1, options);
3589     }
3590
3591   if (qmark_funny_chars)
3592     {
3593 #if HAVE_MBRTOWC
3594       if (MB_CUR_MAX > 1)
3595         {
3596           char const *p = buf;
3597           char const *plimit = buf + len;
3598           char *q = buf;
3599           displayed_width = 0;
3600
3601           while (p < plimit)
3602             switch (*p)
3603               {
3604                 case ' ': case '!': case '"': case '#': case '%':
3605                 case '&': case '\'': case '(': case ')': case '*':
3606                 case '+': case ',': case '-': case '.': case '/':
3607                 case '0': case '1': case '2': case '3': case '4':
3608                 case '5': case '6': case '7': case '8': case '9':
3609                 case ':': case ';': case '<': case '=': case '>':
3610                 case '?':
3611                 case 'A': case 'B': case 'C': case 'D': case 'E':
3612                 case 'F': case 'G': case 'H': case 'I': case 'J':
3613                 case 'K': case 'L': case 'M': case 'N': case 'O':
3614                 case 'P': case 'Q': case 'R': case 'S': case 'T':
3615                 case 'U': case 'V': case 'W': case 'X': case 'Y':
3616                 case 'Z':
3617                 case '[': case '\\': case ']': case '^': case '_':
3618                 case 'a': case 'b': case 'c': case 'd': case 'e':
3619                 case 'f': case 'g': case 'h': case 'i': case 'j':
3620                 case 'k': case 'l': case 'm': case 'n': case 'o':
3621                 case 'p': case 'q': case 'r': case 's': case 't':
3622                 case 'u': case 'v': case 'w': case 'x': case 'y':
3623                 case 'z': case '{': case '|': case '}': case '~':
3624                   /* These characters are printable ASCII characters.  */
3625                   *q++ = *p++;
3626                   displayed_width += 1;
3627                   break;
3628                 default:
3629                   /* If we have a multibyte sequence, copy it until we
3630                      reach its end, replacing each non-printable multibyte
3631                      character with a single question mark.  */
3632                   {
3633                     mbstate_t mbstate;
3634                     memset (&mbstate, 0, sizeof mbstate);
3635                     do
3636                       {
3637                         wchar_t wc;
3638                         size_t bytes;
3639                         int w;
3640
3641                         bytes = mbrtowc (&wc, p, plimit - p, &mbstate);
3642
3643                         if (bytes == (size_t) -1)
3644                           {
3645                             /* An invalid multibyte sequence was
3646                                encountered.  Skip one input byte, and
3647                                put a question mark.  */
3648                             p++;
3649                             *q++ = '?';
3650                             displayed_width += 1;
3651                             break;
3652                           }
3653
3654                         if (bytes == (size_t) -2)
3655                           {
3656                             /* An incomplete multibyte character
3657                                at the end.  Replace it entirely with
3658                                a question mark.  */
3659                             p = plimit;
3660                             *q++ = '?';
3661                             displayed_width += 1;
3662                             break;
3663                           }
3664
3665                         if (bytes == 0)
3666                           /* A null wide character was encountered.  */
3667                           bytes = 1;
3668
3669                         w = wcwidth (wc);
3670                         if (w >= 0)
3671                           {
3672                             /* A printable multibyte character.
3673                                Keep it.  */
3674                             for (; bytes > 0; --bytes)
3675                               *q++ = *p++;
3676                             displayed_width += w;
3677                           }
3678                         else
3679                           {
3680                             /* An unprintable multibyte character.
3681                                Replace it entirely with a question
3682                                mark.  */
3683                             p += bytes;
3684                             *q++ = '?';
3685                             displayed_width += 1;
3686                           }
3687                       }
3688                     while (! mbsinit (&mbstate));
3689                   }
3690                   break;
3691               }
3692
3693           /* The buffer may have shrunk.  */
3694           len = q - buf;
3695         }
3696       else
3697 #endif
3698         {
3699           char *p = buf;
3700           char const *plimit = buf + len;
3701
3702           while (p < plimit)
3703             {
3704               if (! isprint (to_uchar (*p)))
3705                 *p = '?';
3706               p++;
3707             }
3708           displayed_width = len;
3709         }
3710     }
3711   else if (width != NULL)
3712     {
3713 #if HAVE_MBRTOWC
3714       if (MB_CUR_MAX > 1)
3715         displayed_width = mbsnwidth (buf, len, 0);
3716       else
3717 #endif
3718         {
3719           char const *p = buf;
3720           char const *plimit = buf + len;
3721
3722           displayed_width = 0;
3723           while (p < plimit)
3724             {
3725               if (isprint (to_uchar (*p)))
3726                 displayed_width++;
3727               p++;
3728             }
3729         }
3730     }
3731
3732   if (out != NULL)
3733     fwrite (buf, 1, len, out);
3734   if (width != NULL)
3735     *width = displayed_width;
3736   return len;
3737 }
3738
3739 static void
3740 print_name_with_quoting (const char *p, mode_t mode, int linkok,
3741                          bool stat_ok, enum filetype type,
3742                          struct obstack *stack)
3743 {
3744   if (print_with_color)
3745     print_color_indicator (p, mode, linkok, stat_ok, type);
3746
3747   if (stack)
3748     PUSH_CURRENT_DIRED_POS (stack);
3749
3750   dired_pos += quote_name (stdout, p, filename_quoting_options, NULL);
3751
3752   if (stack)
3753     PUSH_CURRENT_DIRED_POS (stack);
3754
3755   if (print_with_color)
3756     {
3757       process_signals ();
3758       prep_non_filename_text ();
3759     }
3760 }
3761
3762 static void
3763 prep_non_filename_text (void)
3764 {
3765   if (color_indicator[C_END].string != NULL)
3766     put_indicator (&color_indicator[C_END]);
3767   else
3768     {
3769       put_indicator (&color_indicator[C_LEFT]);
3770       put_indicator (&color_indicator[C_NORM]);
3771       put_indicator (&color_indicator[C_RIGHT]);
3772     }
3773 }
3774
3775 /* Print the file name of `f' with appropriate quoting.
3776    Also print file size, inode number, and filetype indicator character,
3777    as requested by switches.  */
3778
3779 static void
3780 print_file_name_and_frills (const struct fileinfo *f)
3781 {
3782   char buf[MAX (LONGEST_HUMAN_READABLE + 1, INT_BUFSIZE_BOUND (uintmax_t))];
3783
3784   if (print_inode)
3785     printf ("%*s ", format == with_commas ? 0 : inode_number_width,
3786             umaxtostr (f->stat.st_ino, buf));
3787
3788   if (print_block_size)
3789     printf ("%*s ", format == with_commas ? 0 : block_size_width,
3790             human_readable (ST_NBLOCKS (f->stat), buf, human_output_opts,
3791                             ST_NBLOCKSIZE, output_block_size));
3792
3793   print_name_with_quoting (f->name, FILE_OR_LINK_MODE (f), f->linkok,
3794                            f->stat_ok, f->filetype, NULL);
3795
3796   if (indicator_style != none)
3797     print_type_indicator (f->stat_ok, f->stat.st_mode, f->filetype);
3798 }
3799
3800 static void
3801 print_type_indicator (bool stat_ok, mode_t mode, enum filetype type)
3802 {
3803   char c;
3804
3805   if (stat_ok ? S_ISREG (mode) : type == normal)
3806     {
3807       if (stat_ok && indicator_style == classify && (mode & S_IXUGO))
3808         c = '*';
3809       else
3810         c = 0;
3811     }
3812   else
3813     {
3814       if (stat_ok ? S_ISDIR (mode) : type == directory || type == arg_directory)
3815         c = '/';
3816       else if (indicator_style == slash)
3817         c = 0;
3818       else if (stat_ok ? S_ISLNK (mode) : type == symbolic_link)
3819         c = '@';
3820       else if (stat_ok ? S_ISFIFO (mode) : type == fifo)
3821         c = '|';
3822       else if (stat_ok ? S_ISSOCK (mode) : type == sock)
3823         c = '=';
3824       else if (stat_ok && S_ISDOOR (mode))
3825         c = '>';
3826       else
3827         c = 0;
3828     }
3829
3830   if (c)
3831     DIRED_PUTCHAR (c);
3832 }
3833
3834 static void
3835 print_color_indicator (const char *name, mode_t mode, int linkok,
3836                        bool stat_ok, enum filetype filetype)
3837 {
3838   int type;
3839   struct color_ext_type *ext;   /* Color extension */
3840   size_t len;                   /* Length of name */
3841
3842   /* Is this a nonexistent file?  If so, linkok == -1.  */
3843
3844   if (linkok == -1 && color_indicator[C_MISSING].string != NULL)
3845     type = C_MISSING;
3846   else if (! stat_ok)
3847     {
3848       static enum indicator_no filetype_indicator[] = FILETYPE_INDICATORS;
3849       type = filetype_indicator[filetype];
3850     }
3851   else
3852     {
3853       if (S_ISREG (mode))
3854         {
3855           type = C_FILE;
3856           if ((mode & S_ISUID) != 0)
3857             type = C_SETUID;
3858           else if ((mode & S_ISGID) != 0)
3859             type = C_SETGID;
3860           else if ((mode & S_IXUGO) != 0)
3861             type = C_EXEC;
3862         }
3863       else if (S_ISDIR (mode))
3864         {
3865           if ((mode & S_ISVTX) && (mode & S_IWOTH))
3866             type = C_STICKY_OTHER_WRITABLE;
3867           else if ((mode & S_IWOTH) != 0)
3868             type = C_OTHER_WRITABLE;
3869           else if ((mode & S_ISVTX) != 0)
3870             type = C_STICKY;
3871           else
3872             type = C_DIR;
3873         }
3874       else if (S_ISLNK (mode))
3875         type = ((!linkok && color_indicator[C_ORPHAN].string)
3876                 ? C_ORPHAN : C_LINK);
3877       else if (S_ISFIFO (mode))
3878         type = C_FIFO;
3879       else if (S_ISSOCK (mode))
3880         type = C_SOCK;
3881       else if (S_ISBLK (mode))
3882         type = C_BLK;
3883       else if (S_ISCHR (mode))
3884         type = C_CHR;
3885       else if (S_ISDOOR (mode))
3886         type = C_DOOR;
3887       else
3888         {
3889           /* Classify a file of some other type as C_ORPHAN.  */
3890           type = C_ORPHAN;
3891         }
3892     }
3893
3894   /* Check the file's suffix only if still classified as C_FILE.  */
3895   ext = NULL;
3896   if (type == C_FILE)
3897     {
3898       /* Test if NAME has a recognized suffix.  */
3899
3900       len = strlen (name);
3901       name += len;              /* Pointer to final \0.  */
3902       for (ext = color_ext_list; ext != NULL; ext = ext->next)
3903         {
3904           if (ext->ext.len <= len
3905               && strncmp (name - ext->ext.len, ext->ext.string,
3906                           ext->ext.len) == 0)
3907             break;
3908         }
3909     }
3910
3911   put_indicator (&color_indicator[C_LEFT]);
3912   put_indicator (ext ? &(ext->seq) : &color_indicator[type]);
3913   put_indicator (&color_indicator[C_RIGHT]);
3914 }
3915
3916 /* Output a color indicator (which may contain nulls).  */
3917 static void
3918 put_indicator (const struct bin_str *ind)
3919 {
3920   size_t i;
3921   const char *p;
3922
3923   p = ind->string;
3924
3925   for (i = ind->len; i != 0; --i)
3926     putchar (*(p++));
3927 }
3928
3929 static size_t
3930 length_of_file_name_and_frills (const struct fileinfo *f)
3931 {
3932   size_t len = 0;
3933   size_t name_width;
3934   char buf[MAX (LONGEST_HUMAN_READABLE + 1, INT_BUFSIZE_BOUND (uintmax_t))];
3935
3936   if (print_inode)
3937     len += 1 + (format == with_commas
3938                 ? strlen (umaxtostr (f->stat.st_ino, buf))
3939                 : inode_number_width);
3940
3941   if (print_block_size)
3942     len += 1 + (format == with_commas
3943                 ? strlen (human_readable (ST_NBLOCKS (f->stat), buf,
3944                                           human_output_opts, ST_NBLOCKSIZE,
3945                                           output_block_size))
3946                 : block_size_width);
3947
3948   quote_name (NULL, f->name, filename_quoting_options, &name_width);
3949   len += name_width;
3950
3951   if (indicator_style != none)
3952     {
3953       mode_t mode = f->stat.st_mode;
3954
3955       len += (S_ISREG (mode)
3956               ? (indicator_style == classify && (mode & S_IXUGO))
3957               : (S_ISDIR (mode)
3958                  || (indicator_style != slash
3959                      && (S_ISLNK (mode)
3960                          || S_ISFIFO (mode)
3961                          || S_ISSOCK (mode)
3962                          || S_ISDOOR (mode)))));
3963     }
3964
3965   return len;
3966 }
3967
3968 static void
3969 print_many_per_line (void)
3970 {
3971   size_t row;                   /* Current row.  */
3972   size_t cols = calculate_columns (true);
3973   struct column_info const *line_fmt = &column_info[cols - 1];
3974
3975   /* Calculate the number of rows that will be in each column except possibly
3976      for a short column on the right.  */
3977   size_t rows = files_index / cols + (files_index % cols != 0);
3978
3979   for (row = 0; row < rows; row++)
3980     {
3981       size_t col = 0;
3982       size_t filesno = row;
3983       size_t pos = 0;
3984
3985       /* Print the next row.  */
3986       while (1)
3987         {
3988           size_t name_length = length_of_file_name_and_frills (files + filesno);
3989           size_t max_name_length = line_fmt->col_arr[col++];
3990           print_file_name_and_frills (files + filesno);
3991
3992           filesno += rows;
3993           if (filesno >= files_index)
3994             break;
3995
3996           indent (pos + name_length, pos + max_name_length);
3997           pos += max_name_length;
3998         }
3999       putchar ('\n');
4000     }
4001 }
4002
4003 static void
4004 print_horizontal (void)
4005 {
4006   size_t filesno;
4007   size_t pos = 0;
4008   size_t cols = calculate_columns (false);
4009   struct column_info const *line_fmt = &column_info[cols - 1];
4010   size_t name_length = length_of_file_name_and_frills (files);
4011   size_t max_name_length = line_fmt->col_arr[0];
4012
4013   /* Print first entry.  */
4014   print_file_name_and_frills (files);
4015
4016   /* Now the rest.  */
4017   for (filesno = 1; filesno < files_index; ++filesno)
4018     {
4019       size_t col = filesno % cols;
4020
4021       if (col == 0)
4022         {
4023           putchar ('\n');
4024           pos = 0;
4025         }
4026       else
4027         {
4028           indent (pos + name_length, pos + max_name_length);
4029           pos += max_name_length;
4030         }
4031
4032       print_file_name_and_frills (files + filesno);
4033
4034       name_length = length_of_file_name_and_frills (files + filesno);
4035       max_name_length = line_fmt->col_arr[col];
4036     }
4037   putchar ('\n');
4038 }
4039
4040 static void
4041 print_with_commas (void)
4042 {
4043   size_t filesno;
4044   size_t pos = 0;
4045
4046   for (filesno = 0; filesno < files_index; filesno++)
4047     {
4048       size_t len = length_of_file_name_and_frills (files + filesno);
4049
4050       if (filesno != 0)
4051         {
4052           char separator;
4053
4054           if (pos + len + 2 < line_length)
4055             {
4056               pos += 2;
4057               separator = ' ';
4058             }
4059           else
4060             {
4061               pos = 0;
4062               separator = '\n';
4063             }
4064
4065           putchar (',');
4066           putchar (separator);
4067         }
4068
4069       print_file_name_and_frills (files + filesno);
4070       pos += len;
4071     }
4072   putchar ('\n');
4073 }
4074
4075 /* Assuming cursor is at position FROM, indent up to position TO.
4076    Use a TAB character instead of two or more spaces whenever possible.  */
4077
4078 static void
4079 indent (size_t from, size_t to)
4080 {
4081   while (from < to)
4082     {
4083       if (tabsize != 0 && to / tabsize > (from + 1) / tabsize)
4084         {
4085           putchar ('\t');
4086           from += tabsize - from % tabsize;
4087         }
4088       else
4089         {
4090           putchar (' ');
4091           from++;
4092         }
4093     }
4094 }
4095
4096 /* Put DIRNAME/NAME into DEST, handling `.' and `/' properly.  */
4097 /* FIXME: maybe remove this function someday.  See about using a
4098    non-malloc'ing version of file_name_concat.  */
4099
4100 static void
4101 attach (char *dest, const char *dirname, const char *name)
4102 {
4103   const char *dirnamep = dirname;
4104
4105   /* Copy dirname if it is not ".".  */
4106   if (dirname[0] != '.' || dirname[1] != 0)
4107     {
4108       while (*dirnamep)
4109         *dest++ = *dirnamep++;
4110       /* Add '/' if `dirname' doesn't already end with it.  */
4111       if (dirnamep > dirname && dirnamep[-1] != '/')
4112         *dest++ = '/';
4113     }
4114   while (*name)
4115     *dest++ = *name++;
4116   *dest = 0;
4117 }
4118
4119 /* Allocate enough column info suitable for the current number of
4120    files and display columns, and initialize the info to represent the
4121    narrowest possible columns.  */
4122
4123 static void
4124 init_column_info (void)
4125 {
4126   size_t i;
4127   size_t max_cols = MIN (max_idx, files_index);
4128
4129   /* Currently allocated columns in column_info.  */
4130   static size_t column_info_alloc;
4131
4132   if (column_info_alloc < max_cols)
4133     {
4134       size_t new_column_info_alloc;
4135       size_t *p;
4136
4137       if (max_cols < max_idx / 2)
4138         {
4139           /* The number of columns is far less than the display width
4140              allows.  Grow the allocation, but only so that it's
4141              double the current requirements.  If the display is
4142              extremely wide, this avoids allocating a lot of memory
4143              that is never needed.  */
4144           column_info = xnrealloc (column_info, max_cols,
4145                                    2 * sizeof *column_info);
4146           new_column_info_alloc = 2 * max_cols;
4147         }
4148       else
4149         {
4150           column_info = xnrealloc (column_info, max_idx, sizeof *column_info);
4151           new_column_info_alloc = max_idx;
4152         }
4153
4154       /* Allocate the new size_t objects by computing the triangle
4155          formula n * (n + 1) / 2, except that we don't need to
4156          allocate the part of the triangle that we've already
4157          allocated.  Check for address arithmetic overflow.  */
4158       {
4159         size_t column_info_growth = new_column_info_alloc - column_info_alloc;
4160         size_t s = column_info_alloc + 1 + new_column_info_alloc;
4161         size_t t = s * column_info_growth;
4162         if (s < new_column_info_alloc || t / column_info_growth != s)
4163           xalloc_die ();
4164         p = xnmalloc (t / 2, sizeof *p);
4165       }
4166
4167       /* Grow the triangle by parceling out the cells just allocated.  */
4168       for (i = column_info_alloc; i < new_column_info_alloc; i++)
4169         {
4170           column_info[i].col_arr = p;
4171           p += i + 1;
4172         }
4173
4174       column_info_alloc = new_column_info_alloc;
4175     }
4176
4177   for (i = 0; i < max_cols; ++i)
4178     {
4179       size_t j;
4180
4181       column_info[i].valid_len = true;
4182       column_info[i].line_len = (i + 1) * MIN_COLUMN_WIDTH;
4183       for (j = 0; j <= i; ++j)
4184         column_info[i].col_arr[j] = MIN_COLUMN_WIDTH;
4185     }
4186 }
4187
4188 /* Calculate the number of columns needed to represent the current set
4189    of files in the current display width.  */
4190
4191 static size_t
4192 calculate_columns (bool by_columns)
4193 {
4194   size_t filesno;               /* Index into files.  */
4195   size_t cols;                  /* Number of files across.  */
4196
4197   /* Normally the maximum number of columns is determined by the
4198      screen width.  But if few files are available this might limit it
4199      as well.  */
4200   size_t max_cols = MIN (max_idx, files_index);
4201
4202   init_column_info ();
4203
4204   /* Compute the maximum number of possible columns.  */
4205   for (filesno = 0; filesno < files_index; ++filesno)
4206     {
4207       size_t name_length = length_of_file_name_and_frills (files + filesno);
4208       size_t i;
4209
4210       for (i = 0; i < max_cols; ++i)
4211         {
4212           if (column_info[i].valid_len)
4213             {
4214               size_t idx = (by_columns
4215                             ? filesno / ((files_index + i) / (i + 1))
4216                             : filesno % (i + 1));
4217               size_t real_length = name_length + (idx == i ? 0 : 2);
4218
4219               if (column_info[i].col_arr[idx] < real_length)
4220                 {
4221                   column_info[i].line_len += (real_length
4222                                               - column_info[i].col_arr[idx]);
4223                   column_info[i].col_arr[idx] = real_length;
4224                   column_info[i].valid_len = (column_info[i].line_len
4225                                               < line_length);
4226                 }
4227             }
4228         }
4229     }
4230
4231   /* Find maximum allowed columns.  */
4232   for (cols = max_cols; 1 < cols; --cols)
4233     {
4234       if (column_info[cols - 1].valid_len)
4235         break;
4236     }
4237
4238   return cols;
4239 }
4240
4241 void
4242 usage (int status)
4243 {
4244   if (status != EXIT_SUCCESS)
4245     fprintf (stderr, _("Try `%s --help' for more information.\n"),
4246              program_name);
4247   else
4248     {
4249       printf (_("Usage: %s [OPTION]... [FILE]...\n"), program_name);
4250       fputs (_("\
4251 List information about the FILEs (the current directory by default).\n\
4252 Sort entries alphabetically if none of -cftuvSUX nor --sort.\n\
4253 \n\
4254 "), stdout);
4255       fputs (_("\
4256 Mandatory arguments to long options are mandatory for short options too.\n\
4257 "), stdout);
4258       fputs (_("\
4259   -a, --all                  do not ignore entries starting with .\n\
4260   -A, --almost-all           do not list implied . and ..\n\
4261       --author               with -l, print the author of each file\n\
4262   -b, --escape               print octal escapes for nongraphic characters\n\
4263 "), stdout);
4264       fputs (_("\
4265       --block-size=SIZE      use SIZE-byte blocks\n\
4266   -B, --ignore-backups       do not list implied entries ending with ~\n\
4267   -c                         with -lt: sort by, and show, ctime (time of last\n\
4268                                modification of file status information)\n\
4269                                with -l: show ctime and sort by name\n\
4270                                otherwise: sort by ctime\n\
4271 "), stdout);
4272       fputs (_("\
4273   -C                         list entries by columns\n\
4274       --color[=WHEN]         control whether color is used to distinguish file\n\
4275                                types.  WHEN may be `never', `always', or `auto'\n\
4276   -d, --directory            list directory entries instead of contents,\n\
4277                                and do not dereference symbolic links\n\
4278   -D, --dired                generate output designed for Emacs' dired mode\n\
4279 "), stdout);
4280       fputs (_("\
4281   -f                         do not sort, enable -aU, disable -ls --color\n\
4282   -F, --classify             append indicator (one of */=>@|) to entries\n\
4283       --file-type            likewise, except do not append `*'\n\
4284       --format=WORD          across -x, commas -m, horizontal -x, long -l,\n\
4285                                single-column -1, verbose -l, vertical -C\n\
4286       --full-time            like -l --time-style=full-iso\n\
4287 "), stdout);
4288       fputs (_("\
4289   -g                         like -l, but do not list owner\n\
4290 "), stdout);
4291       fputs (_("\
4292       --group-directories-first\n\
4293                              group directories before files\n\
4294 "), stdout);
4295       fputs (_("\
4296   -G, --no-group             in a long listing, don't print group names\n\
4297   -h, --human-readable       with -l, print sizes in human readable format\n\
4298                                (e.g., 1K 234M 2G)\n\
4299       --si                   likewise, but use powers of 1000 not 1024\n\
4300   -H, --dereference-command-line\n\
4301                              follow symbolic links listed on the command line\n\
4302       --dereference-command-line-symlink-to-dir\n\
4303                              follow each command line symbolic link\n\
4304                              that points to a directory\n\
4305       --hide=PATTERN         do not list implied entries matching shell PATTERN\n\
4306                                (overridden by -a or -A)\n\
4307 "), stdout);
4308       fputs (_("\
4309       --indicator-style=WORD append indicator with style WORD to entry names:\n\
4310                                none (default), slash (-p),\n\
4311                                file-type (--file-type), classify (-F)\n\
4312   -i, --inode                print the index number of each file\n\
4313   -I, --ignore=PATTERN       do not list implied entries matching shell PATTERN\n\
4314   -k                         like --block-size=1K\n\
4315 "), stdout);
4316       fputs (_("\
4317   -l                         use a long listing format\n\
4318   -L, --dereference          when showing file information for a symbolic\n\
4319                                link, show information for the file the link\n\
4320                                references rather than for the link itself\n\
4321   -m                         fill width with a comma separated list of entries\n\
4322 "), stdout);
4323       fputs (_("\
4324   -n, --numeric-uid-gid      like -l, but list numeric user and group IDs\n\
4325   -N, --literal              print raw entry names (don't treat e.g. control\n\
4326                                characters specially)\n\
4327   -o                         like -l, but do not list group information\n\
4328   -p, --indicator-style=slash\n\
4329                              append / indicator to directories\n\
4330 "), stdout);
4331       fputs (_("\
4332   -q, --hide-control-chars   print ? instead of non graphic characters\n\
4333       --show-control-chars   show non graphic characters as-is (default\n\
4334                              unless program is `ls' and output is a terminal)\n\
4335   -Q, --quote-name           enclose entry names in double quotes\n\
4336       --quoting-style=WORD   use quoting style WORD for entry names:\n\
4337                                literal, locale, shell, shell-always, c, escape\n\
4338 "), stdout);
4339       fputs (_("\
4340   -r, --reverse              reverse order while sorting\n\
4341   -R, --recursive            list subdirectories recursively\n\
4342   -s, --size                 with -l, print size of each file, in blocks\n\
4343 "), stdout);
4344       fputs (_("\
4345   -S                         sort by file size\n\
4346       --sort=WORD            sort by WORD instead of name: none -U,\n\
4347                              extension -X, size -S, time -t, version -v\n\
4348       --time=WORD            with -l, show time as WORD instead of modification\n\
4349                              time: atime -u, access -u, use -u, ctime -c,\n\
4350                              or status -c; use specified time as sort key\n\
4351                              if --sort=time\n\
4352 "), stdout);
4353       fputs (_("\
4354       --time-style=STYLE     with -l, show times using style STYLE:\n\
4355                              full-iso, long-iso, iso, locale, +FORMAT.\n\
4356                              FORMAT is interpreted like `date'; if FORMAT is\n\
4357                              FORMAT1<newline>FORMAT2, FORMAT1 applies to\n\
4358                              non-recent files and FORMAT2 to recent files;\n\
4359                              if STYLE is prefixed with `posix-', STYLE\n\
4360                              takes effect only outside the POSIX locale\n\
4361   -t                         sort by modification time\n\
4362   -T, --tabsize=COLS         assume tab stops at each COLS instead of 8\n\
4363 "), stdout);
4364       fputs (_("\
4365   -u                         with -lt: sort by, and show, access time\n\
4366                                with -l: show access time and sort by name\n\
4367                                otherwise: sort by access time\n\
4368   -U                         do not sort; list entries in directory order\n\
4369   -v                         sort by version\n\
4370 "), stdout);
4371       fputs (_("\
4372   -w, --width=COLS           assume screen width instead of current value\n\
4373   -x                         list entries by lines instead of by columns\n\
4374   -X                         sort alphabetically by entry extension\n\
4375   -1                         list one file per line\n\
4376 "), stdout);
4377       fputs (HELP_OPTION_DESCRIPTION, stdout);
4378       fputs (VERSION_OPTION_DESCRIPTION, stdout);
4379       fputs (_("\n\
4380 SIZE may be (or may be an integer optionally followed by) one of following:\n\
4381 kB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.\n\
4382 "), stdout);
4383       fputs (_("\
4384 \n\
4385 By default, color is not used to distinguish types of files.  That is\n\
4386 equivalent to using --color=none.  Using the --color option without the\n\
4387 optional WHEN argument is equivalent to using --color=always.  With\n\
4388 --color=auto, color codes are output only if standard output is connected\n\
4389 to a terminal (tty).  The environment variable LS_COLORS can influence the\n\
4390 colors, and can be set easily by the dircolors command.\n\
4391 "), stdout);
4392       fputs (_("\
4393 \n\
4394 Exit status is 0 if OK, 1 if minor problems, 2 if serious trouble.\n\
4395 "), stdout);
4396       printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
4397     }
4398   exit (status);
4399 }