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