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