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