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