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