1 /* `dir', `vdir' and `ls' directory listing programs for GNU.
2 Copyright (C) 85, 88, 90, 91, 1995-2005 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
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.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software Foundation,
16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
18 /* If ls_mode is LS_MULTI_COL,
19 the multi-column format is the default regardless
20 of the type of output device.
21 This is for the `dir' program.
23 If ls_mode is LS_LONG_FORMAT,
24 the long format is the default regardless of the
25 type of output device.
26 This is for the `vdir' program.
29 the output format depends on whether the output
31 This is for the `ls' program. */
33 /* Written by Richard Stallman and David MacKenzie. */
35 /* Color support by Peter Anvin <Peter.Anvin@linux.org> and Dennis
36 Flaherty <dennisf@denix.elk.miles.com> based on original patches by
37 Greg Lee <lee@uhunix.uhcc.hawaii.edu>. */
40 #include <sys/types.h>
46 #ifdef GWINSZ_IN_SYS_IOCTL
47 # include <sys/ioctl.h>
50 #ifdef WINSIZE_IN_PTEM
51 # include <sys/stream.h>
52 # include <sys/ptem.h>
63 /* Use SA_NOCLDSTOP as a proxy for whether the sigaction machinery is
66 # define SA_NOCLDSTOP 0
67 # define sigprocmask(How, Set, Oset) /* empty */
69 # if ! HAVE_SIGINTERRUPT
70 # define siginterrupt(sig, flag) /* empty */
74 /* Get mbstate_t, mbrtowc(), mbsinit(), wcwidth(). */
83 #if !defined iswprint && !HAVE_ISWPRINT
84 # define iswprint(wc) 1
87 #ifndef HAVE_DECL_WCWIDTH
88 "this configure-time declaration test was not run"
90 #if !HAVE_DECL_WCWIDTH
94 /* If wcwidth() doesn't exist, assume all printable characters have
98 # define wcwidth(wc) ((wc) == 0 ? 0 : iswprint (wc) ? 1 : -1)
106 #include "argmatch.h"
111 #include "filenamecat.h"
112 #include "hard-locale.h"
115 #include "filemode.h"
116 #include "inttostr.h"
118 #include "mbswidth.h"
121 #include "quotearg.h"
123 #include "strftime.h"
124 #include "strverscmp.h"
126 #include "xreadlink.h"
128 #define PROGRAM_NAME (ls_mode == LS_LS ? "ls" \
129 : (ls_mode == LS_MULTI_COL \
132 #define AUTHORS "Richard Stallman", "David MacKenzie"
134 #define obstack_chunk_alloc malloc
135 #define obstack_chunk_free free
137 /* Return an int indicating the result of comparing two integers.
138 Subtracting doesn't always work, due to overflow. */
139 #define longdiff(a, b) ((a) < (b) ? -1 : (a) > (b))
141 /* Arrange to make lstat calls go through the wrapper function
142 on systems with an lstat function that does not dereference symlinks
143 that are specified with a trailing slash. */
144 #if ! LSTAT_FOLLOWS_SLASHED_SYMLINK
145 int rpl_lstat (const char *, struct stat *);
147 # define lstat(Name, Stat_buf) rpl_lstat(Name, Stat_buf)
150 #if HAVE_STRUCT_DIRENT_D_TYPE && defined DTTOIF
151 # define DT_INIT(Val) = Val
153 # define DT_INIT(Val) /* empty */
156 #if ! HAVE_STRUCT_STAT_ST_AUTHOR
157 # define st_author st_uid
160 /* Cray/Unicos DMF: use the file's migrated, not real, status */
162 # define ST_DM_MODE(Stat_buf) ((Stat_buf).st_dm_mode)
164 # define ST_DM_MODE(Stat_buf) ((Stat_buf).st_mode)
169 unknown DT_INIT (DT_UNKNOWN),
170 fifo DT_INIT (DT_FIFO),
171 chardev DT_INIT (DT_CHR),
172 directory DT_INIT (DT_DIR),
173 blockdev DT_INIT (DT_BLK),
174 normal DT_INIT (DT_REG),
175 symbolic_link DT_INIT (DT_LNK),
176 sock DT_INIT (DT_SOCK),
177 arg_directory DT_INIT (2 * (DT_UNKNOWN | DT_FIFO | DT_CHR | DT_DIR | DT_BLK
178 | DT_REG | DT_LNK | DT_SOCK))
188 /* For symbolic link, name of the file linked to, otherwise zero. */
191 /* For symbolic link and long listing, st_mode of file linked to, otherwise
195 /* For symbolic link and color printing, true if linked-to file
196 exists, otherwise false. */
199 enum filetype filetype;
202 /* For long listings, true if the file has an access control list. */
208 # define FILE_HAS_ACL(F) ((F)->have_acl)
210 # define FILE_HAS_ACL(F) 0
213 #define LEN_STR_PAIR(s) sizeof (s) - 1, s
215 /* Null is a valid character in a color indicator (think about Epson
216 printers, for example) so we have to use a length/buffer string
221 size_t len; /* Number of bytes */
222 const char *string; /* Pointer to the same */
229 # define tcgetpgrp(Fd) 0
232 static size_t quote_name (FILE *out, const char *name,
233 struct quoting_options const *options,
235 static char *make_link_name (char const *name, char const *linkname);
236 static int decode_switches (int argc, char **argv);
237 static bool file_ignored (char const *name);
238 static uintmax_t gobble_file (char const *name, enum filetype type,
239 bool command_line_arg, char const *dirname);
240 static void print_color_indicator (const char *name, mode_t mode, int linkok);
241 static void put_indicator (const struct bin_str *ind);
242 static void add_ignore_pattern (const char *pattern);
243 static void attach (char *dest, const char *dirname, const char *name);
244 static void clear_files (void);
245 static void extract_dirs_from_files (char const *dirname,
246 bool command_line_arg);
247 static void get_link_name (char const *filename, struct fileinfo *f,
248 bool command_line_arg);
249 static void indent (size_t from, size_t to);
250 static size_t calculate_columns (bool by_columns);
251 static void print_current_files (void);
252 static void print_dir (char const *name, char const *realname,
253 bool command_line_arg);
254 static void print_file_name_and_frills (const struct fileinfo *f);
255 static void print_horizontal (void);
256 static int format_user_width (uid_t u);
257 static int format_group_width (gid_t g);
258 static void print_long_format (const struct fileinfo *f);
259 static void print_many_per_line (void);
260 static void print_name_with_quoting (const char *p, mode_t mode,
262 struct obstack *stack);
263 static void prep_non_filename_text (void);
264 static void print_type_indicator (mode_t mode);
265 static void print_with_commas (void);
266 static void queue_directory (char const *name, char const *realname,
267 bool command_line_arg);
268 static void sort_files (void);
269 static void parse_ls_color (void);
270 void usage (int status);
272 /* The name this program was run with. */
275 /* Initial size of hash table.
276 Most hierarchies are likely to be shallower than this. */
277 #define INITIAL_TABLE_SIZE 30
279 /* The set of `active' directories, from the current command-line argument
280 to the level in the hierarchy at which files are being listed.
281 A directory is represented by its device and inode numbers (struct dev_ino).
282 A directory is added to this set when ls begins listing it or its
283 entries, and it is removed from the set just after ls has finished
284 processing it. This set is used solely to detect loops, e.g., with
285 mkdir loop; cd loop; ln -s ../loop sub; ls -RL */
286 static Hash_table *active_dir_set;
288 #define LOOP_DETECT (!!active_dir_set)
290 /* The table of files in the current directory:
292 `files' points to a vector of `struct fileinfo', one per file.
293 `nfiles' is the number of elements space has been allocated for.
294 `files_index' is the number actually in use. */
296 /* Address of block containing the files that are described. */
297 static struct fileinfo *files; /* FIXME: rename this to e.g. cwd_file */
299 /* Length of block that `files' points to, measured in files. */
300 static size_t nfiles; /* FIXME: rename this to e.g. cwd_n_alloc */
302 /* Index of first unused in `files'. */
303 static size_t files_index; /* FIXME: rename this to e.g. cwd_n_used */
305 /* When true, in a color listing, color each symlink name according to the
306 type of file it points to. Otherwise, color them according to the `ln'
307 directive in LS_COLORS. Dangling (orphan) symlinks are treated specially,
308 regardless. This is set when `ln=target' appears in LS_COLORS. */
310 static bool color_symlink_as_referent;
312 /* mode of appropriate file for colorization */
313 #define FILE_OR_LINK_MODE(File) \
314 ((color_symlink_as_referent & (File)->linkok) \
315 ? (File)->linkmode : (File)->stat.st_mode)
318 /* Record of one pending directory waiting to be listed. */
323 /* If the directory is actually the file pointed to by a symbolic link we
324 were told to list, `realname' will contain the name of the symbolic
325 link, otherwise zero. */
327 bool command_line_arg;
328 struct pending *next;
331 static struct pending *pending_dirs;
333 /* Current time in seconds and nanoseconds since 1970, updated as
334 needed when deciding whether a file is recent. */
336 static time_t current_time = TYPE_MINIMUM (time_t);
337 static int current_time_ns = -1;
339 /* Whether any of the files has an ACL. This affects the width of the
343 static bool any_has_acl;
345 enum { any_has_acl = false };
348 /* The number of columns to use for columns containing inode numbers,
349 block sizes, link counts, owners, groups, authors, major device
350 numbers, minor device numbers, and file sizes, respectively. */
352 static int inode_number_width;
353 static int block_size_width;
354 static int nlink_width;
355 static int owner_width;
356 static int group_width;
357 static int author_width;
358 static int major_device_number_width;
359 static int minor_device_number_width;
360 static int file_size_width;
364 /* long_format for lots of info, one per line.
365 one_per_line for just names, one per line.
366 many_per_line for just names, many per line, sorted vertically.
367 horizontal for just names, many per line, sorted horizontally.
368 with_commas for just names, many per line, separated by commas.
370 -l (and other options that imply -l), -1, -C, -x and -m control
375 long_format, /* -l and other options that imply -l */
376 one_per_line, /* -1 */
377 many_per_line, /* -C */
382 static enum format format;
384 /* `full-iso' uses full ISO-style dates and times. `long-iso' uses longer
385 ISO-style time stamps, though shorter than `full-iso'. `iso' uses shorter
386 ISO-style time stamps. `locale' uses locale-dependent time stamps. */
389 full_iso_time_style, /* --time-style=full-iso */
390 long_iso_time_style, /* --time-style=long-iso */
391 iso_time_style, /* --time-style=iso */
392 locale_time_style /* --time-style=locale */
395 static char const *const time_style_args[] =
397 "full-iso", "long-iso", "iso", "locale", NULL
400 static enum time_style const time_style_types[] =
402 full_iso_time_style, long_iso_time_style, iso_time_style,
406 /* Type of time to print or sort by. Controlled by -c and -u. */
410 time_mtime, /* default */
415 static enum time_type time_type;
417 /* The file characteristic to sort by. Controlled by -t, -S, -U, -X, -v. */
422 sort_name, /* default */
423 sort_extension, /* -X */
426 sort_version /* -v */
429 static enum sort_type sort_type;
431 /* Direction of sort.
432 false means highest first if numeric,
433 lowest first if alphabetic;
434 these are the defaults.
435 true means the opposite order in each case. -r */
437 static bool sort_reverse;
439 /* True means to display owner information. -g turns this off. */
441 static bool print_owner = true;
443 /* True means to display author information. */
445 static bool print_author;
447 /* True means to display group information. -G and -o turn this off. */
449 static bool print_group = true;
451 /* True means print the user and group id's as numbers rather
454 static bool numeric_ids;
456 /* True means mention the size in blocks of each file. -s */
458 static bool print_block_size;
460 /* Human-readable options for output. */
461 static int human_output_opts;
463 /* The units to use when printing sizes other than file sizes. */
464 static uintmax_t output_block_size;
466 /* Likewise, but for file sizes. */
467 static uintmax_t file_output_block_size = 1;
469 /* Follow the output with a special string. Using this format,
470 Emacs' dired mode starts up twice as fast, and can handle all
471 strange characters in file names. */
474 /* `none' means don't mention the type of files.
475 `slash' means mention directories only, with a '/'.
476 `file_type' means mention file types.
477 `classify' means mention file types and mark executables.
479 Controlled by -F, -p, and --indicator-style. */
483 none, /* --indicator-style=none */
484 slash, /* -p, --indicator-style=slash */
485 file_type, /* --indicator-style=file-type */
486 classify /* -F, --indicator-style=classify */
489 static enum indicator_style indicator_style;
491 /* Names of indicator styles. */
492 static char const *const indicator_style_args[] =
494 "none", "slash", "file-type", "classify", NULL
497 static enum indicator_style const indicator_style_types[] =
499 none, slash, file_type, classify
502 /* True means use colors to mark types. Also define the different
503 colors as well as the stuff for the LS_COLORS environment variable.
504 The LS_COLORS variable is now in a termcap-like format. */
506 static bool print_with_color;
510 color_never, /* 0: default or --color=never */
511 color_always, /* 1: --color=always */
512 color_if_tty /* 2: --color=tty */
515 enum Dereference_symlink
519 DEREF_COMMAND_LINE_ARGUMENTS, /* -H */
520 DEREF_COMMAND_LINE_SYMLINK_TO_DIR, /* the default, in certain cases */
521 DEREF_ALWAYS /* -L */
526 C_LEFT, C_RIGHT, C_END, C_NORM, C_FILE, C_DIR, C_LINK, C_FIFO, C_SOCK,
527 C_BLK, C_CHR, C_MISSING, C_ORPHAN, C_EXEC, C_DOOR
530 static const char *const indicator_name[]=
532 "lc", "rc", "ec", "no", "fi", "di", "ln", "pi", "so",
533 "bd", "cd", "mi", "or", "ex", "do", NULL
536 struct color_ext_type
538 struct bin_str ext; /* The extension we're looking for */
539 struct bin_str seq; /* The sequence to output when we do */
540 struct color_ext_type *next; /* Next in list */
543 static struct bin_str color_indicator[] =
545 { LEN_STR_PAIR ("\033[") }, /* lc: Left of color sequence */
546 { LEN_STR_PAIR ("m") }, /* rc: Right of color sequence */
547 { 0, NULL }, /* ec: End color (replaces lc+no+rc) */
548 { LEN_STR_PAIR ("0") }, /* no: Normal */
549 { LEN_STR_PAIR ("0") }, /* fi: File: default */
550 { LEN_STR_PAIR ("01;34") }, /* di: Directory: bright blue */
551 { LEN_STR_PAIR ("01;36") }, /* ln: Symlink: bright cyan */
552 { LEN_STR_PAIR ("33") }, /* pi: Pipe: yellow/brown */
553 { LEN_STR_PAIR ("01;35") }, /* so: Socket: bright magenta */
554 { LEN_STR_PAIR ("01;33") }, /* bd: Block device: bright yellow */
555 { LEN_STR_PAIR ("01;33") }, /* cd: Char device: bright yellow */
556 { 0, NULL }, /* mi: Missing file: undefined */
557 { 0, NULL }, /* or: Orphaned symlink: undefined */
558 { LEN_STR_PAIR ("01;32") }, /* ex: Executable: bright green */
559 { LEN_STR_PAIR ("01;35") } /* do: Door: bright magenta */
563 static struct color_ext_type *color_ext_list = NULL;
565 /* Buffer for color sequences */
566 static char *color_buf;
568 /* True means to check for orphaned symbolic link, for displaying
571 static bool check_symlink_color;
573 /* True means mention the inode number of each file. -i */
575 static bool print_inode;
577 /* What to do with symbolic links. Affected by -d, -F, -H, -l (and
578 other options that imply -l), and -L. */
580 static enum Dereference_symlink dereference;
582 /* True means when a directory is found, display info on its
585 static bool recursive;
587 /* True means when an argument is a directory name, display info
590 static bool immediate_dirs;
592 /* Which files to ignore. */
596 /* Ignore files whose names start with `.', and files specified by
597 --hide and --ignore. */
600 /* Ignore `.', `..', and files specified by --ignore. */
601 IGNORE_DOT_AND_DOTDOT,
603 /* Ignore only files specified by --ignore. */
607 /* A linked list of shell-style globbing patterns. If a non-argument
608 file name matches any of these patterns, it is ignored.
609 Controlled by -I. Multiple -I options accumulate.
610 The -B option adds `*~' and `.*~' to this list. */
612 struct ignore_pattern
615 struct ignore_pattern *next;
618 static struct ignore_pattern *ignore_patterns;
620 /* Similar to IGNORE_PATTERNS, except that -a or -A causes this
621 variable itself to be ignored. */
622 static struct ignore_pattern *hide_patterns;
624 /* True means output nongraphic chars in file names as `?'.
625 (-q, --hide-control-chars)
626 qmark_funny_chars and the quoting style (-Q, --quoting-style=WORD) are
627 independent. The algorithm is: first, obey the quoting style to get a
628 string representing the file name; then, if qmark_funny_chars is set,
629 replace all nonprintable chars in that string with `?'. It's necessary
630 to replace nonprintable chars even in quoted strings, because we don't
631 want to mess up the terminal if control chars get sent to it, and some
632 quoting methods pass through control chars as-is. */
633 static bool qmark_funny_chars;
635 /* Quoting options for file and dir name output. */
637 static struct quoting_options *filename_quoting_options;
638 static struct quoting_options *dirname_quoting_options;
640 /* The number of chars per hardware tab stop. Setting this to zero
641 inhibits the use of TAB characters for separating columns. -T */
642 static size_t tabsize;
644 /* True means print each directory name before listing it. */
646 static bool print_dir_name;
648 /* The line length to use for breaking lines in many-per-line format.
649 Can be set with -w. */
651 static size_t line_length;
653 /* If true, the file listing format requires that stat be called on
656 static bool format_needs_stat;
658 /* Similar to `format_needs_stat', but set if only the file type is
661 static bool format_needs_type;
663 /* An arbitrary limit on the number of bytes in a printed time stamp.
664 This is set to a relatively small value to avoid the need to worry
665 about denial-of-service attacks on servers that run "ls" on behalf
666 of remote clients. 1000 bytes should be enough for any practical
667 time stamp format. */
669 enum { TIME_STAMP_LEN_MAXIMUM = MAX (1000, INT_STRLEN_BOUND (time_t)) };
671 /* strftime formats for non-recent and recent files, respectively, in
674 static char const *long_time_format[2] =
676 /* strftime format for non-recent files (older than 6 months), in
677 -l output when --time-style=locale is specified. This should
678 contain the year, month and day (at least), in an order that is
679 understood by people in your locale's territory.
680 Please try to keep the number of used screen columns small,
681 because many people work in windows with only 80 columns. But
682 make this as wide as the other string below, for recent files. */
684 /* strftime format for recent files (younger than 6 months), in
685 -l output when --time-style=locale is specified. This should
686 contain the month, day and time (at least), in an order that is
687 understood by people in your locale's territory.
688 Please try to keep the number of used screen columns small,
689 because many people work in windows with only 80 columns. But
690 make this as wide as the other string above, for non-recent files. */
694 /* The set of signals that are caught. */
696 static sigset_t caught_signals;
698 /* If nonzero, the value of the pending fatal signal. */
700 static sig_atomic_t volatile interrupt_signal;
702 /* A count of the number of pending stop signals that have been received. */
704 static sig_atomic_t volatile stop_signal_count;
706 /* Desired exit status. */
708 static int exit_status;
713 /* "ls" had a minor problem (e.g., it could not stat a directory
715 LS_MINOR_PROBLEM = 1,
717 /* "ls" had more serious trouble. */
721 /* For long options that have no equivalent short option, use a
722 non-character as a pseudo short option, starting with CHAR_MAX + 1. */
725 AUTHOR_OPTION = CHAR_MAX + 1,
728 DEREFERENCE_COMMAND_LINE_SYMLINK_TO_DIR_OPTION,
732 INDICATOR_STYLE_OPTION,
733 QUOTING_STYLE_OPTION,
734 SHOW_CONTROL_CHARS_OPTION,
741 static struct option const long_options[] =
743 {"all", no_argument, NULL, 'a'},
744 {"escape", no_argument, NULL, 'b'},
745 {"directory", no_argument, NULL, 'd'},
746 {"dired", no_argument, NULL, 'D'},
747 {"full-time", no_argument, NULL, FULL_TIME_OPTION},
748 {"human-readable", no_argument, NULL, 'h'},
749 {"inode", no_argument, NULL, 'i'},
750 {"kilobytes", no_argument, NULL, 'k'}, /* long form is obsolescent */
751 {"numeric-uid-gid", no_argument, NULL, 'n'},
752 {"no-group", no_argument, NULL, 'G'},
753 {"hide-control-chars", no_argument, NULL, 'q'},
754 {"reverse", no_argument, NULL, 'r'},
755 {"size", no_argument, NULL, 's'},
756 {"width", required_argument, NULL, 'w'},
757 {"almost-all", no_argument, NULL, 'A'},
758 {"ignore-backups", no_argument, NULL, 'B'},
759 {"classify", no_argument, NULL, 'F'},
760 {"file-type", no_argument, NULL, 'p'},
761 {"si", no_argument, NULL, SI_OPTION},
762 {"dereference-command-line", no_argument, NULL, 'H'},
763 {"dereference-command-line-symlink-to-dir", no_argument, NULL,
764 DEREFERENCE_COMMAND_LINE_SYMLINK_TO_DIR_OPTION},
765 {"hide", required_argument, NULL, HIDE_OPTION},
766 {"ignore", required_argument, NULL, 'I'},
767 {"indicator-style", required_argument, NULL, INDICATOR_STYLE_OPTION},
768 {"dereference", no_argument, NULL, 'L'},
769 {"literal", no_argument, NULL, 'N'},
770 {"quote-name", no_argument, NULL, 'Q'},
771 {"quoting-style", required_argument, NULL, QUOTING_STYLE_OPTION},
772 {"recursive", no_argument, NULL, 'R'},
773 {"format", required_argument, NULL, FORMAT_OPTION},
774 {"show-control-chars", no_argument, NULL, SHOW_CONTROL_CHARS_OPTION},
775 {"sort", required_argument, NULL, SORT_OPTION},
776 {"tabsize", required_argument, NULL, 'T'},
777 {"time", required_argument, NULL, TIME_OPTION},
778 {"time-style", required_argument, NULL, TIME_STYLE_OPTION},
779 {"color", optional_argument, NULL, COLOR_OPTION},
780 {"block-size", required_argument, NULL, BLOCK_SIZE_OPTION},
781 {"author", no_argument, NULL, AUTHOR_OPTION},
782 {GETOPT_HELP_OPTION_DECL},
783 {GETOPT_VERSION_OPTION_DECL},
787 static char const *const format_args[] =
789 "verbose", "long", "commas", "horizontal", "across",
790 "vertical", "single-column", NULL
793 static enum format const format_types[] =
795 long_format, long_format, with_commas, horizontal, horizontal,
796 many_per_line, one_per_line
799 static char const *const sort_args[] =
801 "none", "time", "size", "extension", "version", NULL
804 static enum sort_type const sort_types[] =
806 sort_none, sort_time, sort_size, sort_extension, sort_version
809 static char const *const time_args[] =
811 "atime", "access", "use", "ctime", "status", NULL
814 static enum time_type const time_types[] =
816 time_atime, time_atime, time_atime, time_ctime, time_ctime
819 static char const *const color_args[] =
821 /* force and none are for compatibility with another color-ls version */
822 "always", "yes", "force",
823 "never", "no", "none",
824 "auto", "tty", "if-tty", NULL
827 static enum color_type const color_types[] =
829 color_always, color_always, color_always,
830 color_never, color_never, color_never,
831 color_if_tty, color_if_tty, color_if_tty
834 /* Information about filling a column. */
842 /* Array with information about column filledness. */
843 static struct column_info *column_info;
845 /* Maximum number of columns ever possible for this display. */
846 static size_t max_idx;
848 /* The minimum width of a column is 3: 1 character for the name and 2
849 for the separating white space. */
850 #define MIN_COLUMN_WIDTH 3
853 /* This zero-based index is used solely with the --dired option.
854 When that option is in effect, this counter is incremented for each
855 byte of output generated by this program so that the beginning
856 and ending indices (in that output) of every file name can be recorded
857 and later output themselves. */
858 static size_t dired_pos;
860 #define DIRED_PUTCHAR(c) do {putchar ((c)); ++dired_pos;} while (0)
862 /* Write S to STREAM and increment DIRED_POS by S_LEN. */
863 #define DIRED_FPUTS(s, stream, s_len) \
864 do {fputs ((s), (stream)); dired_pos += s_len;} while (0)
866 /* Like DIRED_FPUTS, but for use when S is a literal string. */
867 #define DIRED_FPUTS_LITERAL(s, stream) \
868 do {fputs ((s), (stream)); dired_pos += sizeof((s)) - 1;} while (0)
870 #define DIRED_INDENT() \
874 DIRED_FPUTS_LITERAL (" ", stdout); \
878 /* With --dired, store pairs of beginning and ending indices of filenames. */
879 static struct obstack dired_obstack;
881 /* With --dired, store pairs of beginning and ending indices of any
882 directory names that appear as headers (just before `total' line)
883 for lists of directory entries. Such directory names are seen when
884 listing hierarchies using -R and when a directory is listed with at
885 least one other command line argument. */
886 static struct obstack subdired_obstack;
888 /* Save the current index on the specified obstack, OBS. */
889 #define PUSH_CURRENT_DIRED_POS(obs) \
893 obstack_grow ((obs), &dired_pos, sizeof (dired_pos)); \
897 /* With -R, this stack is used to help detect directory cycles.
898 The device/inode pairs on this stack mirror the pairs in the
899 active_dir_set hash table. */
900 static struct obstack dev_ino_obstack;
902 /* Push a pair onto the device/inode stack. */
903 #define DEV_INO_PUSH(Dev, Ino) \
906 struct dev_ino *di; \
907 obstack_blank (&dev_ino_obstack, sizeof (struct dev_ino)); \
908 di = -1 + (struct dev_ino *) obstack_next_free (&dev_ino_obstack); \
909 di->st_dev = (Dev); \
910 di->st_ino = (Ino); \
914 /* Pop a dev/ino struct off the global dev_ino_obstack
915 and return that struct. */
916 static struct dev_ino
919 assert (sizeof (struct dev_ino) <= obstack_object_size (&dev_ino_obstack));
920 obstack_blank (&dev_ino_obstack, -(int) (sizeof (struct dev_ino)));
921 return *(struct dev_ino*) obstack_next_free (&dev_ino_obstack);
924 #define ASSERT_MATCHING_DEV_INO(Name, Di) \
929 assert (0 <= stat (Name, &sb)); \
930 assert (sb.st_dev == Di.st_dev); \
931 assert (sb.st_ino == Di.st_ino); \
936 /* Write to standard output PREFIX, followed by the quoting style and
937 a space-separated list of the integers stored in OS all on one line. */
940 dired_dump_obstack (const char *prefix, struct obstack *os)
944 n_pos = obstack_object_size (os) / sizeof (dired_pos);
950 pos = (size_t *) obstack_finish (os);
951 fputs (prefix, stdout);
952 for (i = 0; i < n_pos; i++)
953 printf (" %lu", (unsigned long int) pos[i]);
959 dev_ino_hash (void const *x, size_t table_size)
961 struct dev_ino const *p = x;
962 return (uintmax_t) p->st_ino % table_size;
966 dev_ino_compare (void const *x, void const *y)
968 struct dev_ino const *a = x;
969 struct dev_ino const *b = y;
970 return SAME_INODE (*a, *b) ? true : false;
974 dev_ino_free (void *x)
979 /* Add the device/inode pair (P->st_dev/P->st_ino) to the set of
980 active directories. Return true if there is already a matching
981 entry in the table. */
984 visit_dir (dev_t dev, ino_t ino)
987 struct dev_ino *ent_from_table;
990 ent = xmalloc (sizeof *ent);
994 /* Attempt to insert this entry into the table. */
995 ent_from_table = hash_insert (active_dir_set, ent);
997 if (ent_from_table == NULL)
999 /* Insertion failed due to lack of memory. */
1003 found_match = (ent_from_table != ent);
1007 /* ent was not inserted, so free it. */
1015 free_pending_ent (struct pending *p)
1023 is_colored (enum indicator_no type)
1025 size_t len = color_indicator[type].len;
1026 char const *s = color_indicator[type].string;
1028 || (len == 1 && strncmp (s, "0", 1) == 0)
1029 || (len == 2 && strncmp (s, "00", 2) == 0));
1033 restore_default_color (void)
1035 put_indicator (&color_indicator[C_LEFT]);
1036 put_indicator (&color_indicator[C_RIGHT]);
1039 /* An ordinary signal was received; arrange for the program to exit. */
1042 sighandler (int sig)
1045 signal (sig, SIG_IGN);
1046 if (! interrupt_signal)
1047 interrupt_signal = sig;
1050 /* A SIGTSTP was received; arrange for the program to suspend itself. */
1053 stophandler (int sig)
1056 signal (sig, stophandler);
1057 if (! interrupt_signal)
1058 stop_signal_count++;
1061 /* Process any pending signals. If signals are caught, this function
1062 should be called periodically. Ideally there should never be an
1063 unbounded amount of time when signals are not being processed.
1064 Signal handling can restore the default colors, so callers must
1065 immediately change colors after invoking this function. */
1068 process_signals (void)
1070 while (interrupt_signal | stop_signal_count)
1076 restore_default_color ();
1079 sigprocmask (SIG_BLOCK, &caught_signals, &oldset);
1081 /* Reload interrupt_signal and stop_signal_count, in case a new
1082 signal was handled before sigprocmask took effect. */
1083 sig = interrupt_signal;
1084 stops = stop_signal_count;
1086 /* SIGTSTP is special, since the application can receive that signal
1087 more than once. In this case, don't set the signal handler to the
1088 default. Instead, just raise the uncatchable SIGSTOP. */
1091 stop_signal_count = stops - 1;
1095 signal (sig, SIG_DFL);
1097 /* Exit or suspend the program. */
1099 sigprocmask (SIG_SETMASK, &oldset, NULL);
1101 /* If execution reaches here, then the program has been
1102 continued (after being suspended). */
1107 main (int argc, char **argv)
1110 struct pending *thispend;
1113 /* The signals that are trapped, and the number of such signals. */
1114 static int const sig[] = { SIGHUP, SIGINT, SIGPIPE,
1115 SIGQUIT, SIGTERM, SIGTSTP };
1116 enum { nsigs = sizeof sig / sizeof sig[0] };
1119 bool caught_sig[nsigs];
1122 initialize_main (&argc, &argv);
1123 program_name = argv[0];
1124 setlocale (LC_ALL, "");
1125 bindtextdomain (PACKAGE, LOCALEDIR);
1126 textdomain (PACKAGE);
1128 initialize_exit_failure (LS_FAILURE);
1129 atexit (close_stdout);
1131 #define N_ENTRIES(Array) (sizeof Array / sizeof *(Array))
1132 assert (N_ENTRIES (color_indicator) + 1 == N_ENTRIES (indicator_name));
1134 exit_status = EXIT_SUCCESS;
1135 print_dir_name = true;
1136 pending_dirs = NULL;
1138 i = decode_switches (argc, argv);
1140 if (print_with_color)
1143 /* Test print_with_color again, because the call to parse_ls_color
1144 may have just reset it -- e.g., if LS_COLORS is invalid. */
1145 if (print_with_color)
1147 /* Avoid following symbolic links when possible. */
1148 if (is_colored (C_ORPHAN)
1149 || is_colored (C_EXEC)
1150 || (is_colored (C_MISSING) && format == long_format))
1151 check_symlink_color = true;
1153 /* If the standard output is a controlling terminal, watch out
1154 for signals, so that the colors can be restored to the
1155 default state if "ls" is suspended or interrupted. */
1157 if (0 <= tcgetpgrp (STDOUT_FILENO))
1161 struct sigaction act;
1163 sigemptyset (&caught_signals);
1164 for (j = 0; j < nsigs; j++)
1166 sigaction (sig[j], NULL, &act);
1167 if (act.sa_handler != SIG_IGN)
1168 sigaddset (&caught_signals, sig[j]);
1171 act.sa_mask = caught_signals;
1172 act.sa_flags = SA_RESTART;
1174 for (j = 0; j < nsigs; j++)
1175 if (sigismember (&caught_signals, sig[j]))
1177 act.sa_handler = sig[j] == SIGTSTP ? stophandler : sighandler;
1178 sigaction (sig[j], &act, NULL);
1181 for (j = 0; j < nsigs; j++)
1183 caught_sig[j] = (signal (sig[j], SIG_IGN) != SIG_IGN);
1186 signal (sig[j], sig[j] == SIGTSTP ? stophandler : sighandler);
1187 siginterrupt (sig[j], 0);
1193 prep_non_filename_text ();
1196 if (dereference == DEREF_UNDEFINED)
1197 dereference = ((immediate_dirs
1198 || indicator_style == classify
1199 || format == long_format)
1201 : DEREF_COMMAND_LINE_SYMLINK_TO_DIR);
1203 /* When using -R, initialize a data structure we'll use to
1204 detect any directory cycles. */
1207 active_dir_set = hash_initialize (INITIAL_TABLE_SIZE, NULL,
1211 if (active_dir_set == NULL)
1214 obstack_init (&dev_ino_obstack);
1217 format_needs_stat = sort_type == sort_time || sort_type == sort_size
1218 || format == long_format
1219 || dereference == DEREF_ALWAYS
1220 || print_block_size || print_inode;
1221 format_needs_type = (!format_needs_stat
1222 && (recursive || print_with_color
1223 || indicator_style != none));
1227 obstack_init (&dired_obstack);
1228 obstack_init (&subdired_obstack);
1232 files = xnmalloc (nfiles, sizeof *files);
1242 gobble_file (".", directory, true, "");
1244 queue_directory (".", NULL, true);
1248 gobble_file (argv[i++], unknown, true, "");
1254 if (!immediate_dirs)
1255 extract_dirs_from_files (NULL, true);
1256 /* `files_index' might be zero now. */
1259 /* In the following if/else blocks, it is sufficient to test `pending_dirs'
1260 (and not pending_dirs->name) because there may be no markers in the queue
1261 at this point. A marker may be enqueued when extract_dirs_from_files is
1262 called with a non-empty string or via print_dir. */
1265 print_current_files ();
1267 DIRED_PUTCHAR ('\n');
1269 else if (n_files <= 1 && pending_dirs && pending_dirs->next == 0)
1270 print_dir_name = false;
1272 while (pending_dirs)
1274 thispend = pending_dirs;
1275 pending_dirs = pending_dirs->next;
1279 if (thispend->name == NULL)
1281 /* thispend->name == NULL means this is a marker entry
1282 indicating we've finished processing the directory.
1283 Use its dev/ino numbers to remove the corresponding
1284 entry from the active_dir_set hash table. */
1285 struct dev_ino di = dev_ino_pop ();
1286 struct dev_ino *found = hash_delete (active_dir_set, &di);
1287 /* ASSERT_MATCHING_DEV_INO (thispend->realname, di); */
1289 dev_ino_free (found);
1290 free_pending_ent (thispend);
1295 print_dir (thispend->name, thispend->realname,
1296 thispend->command_line_arg);
1298 free_pending_ent (thispend);
1299 print_dir_name = true;
1302 if (print_with_color)
1306 restore_default_color ();
1309 /* Restore the default signal handling. */
1311 for (j = 0; j < nsigs; j++)
1312 if (sigismember (&caught_signals, sig[j]))
1313 signal (sig[j], SIG_DFL);
1315 for (j = 0; j < nsigs; j++)
1317 signal (sig[j], SIG_DFL);
1320 /* Act on any signals that arrived before the default was restored.
1321 This can process signals out of order, but there doesn't seem to
1322 be an easy way to do them in order, and the order isn't that
1323 important anyway. */
1324 for (j = stop_signal_count; j; j--)
1326 j = interrupt_signal;
1333 /* No need to free these since we're about to exit. */
1334 dired_dump_obstack ("//DIRED//", &dired_obstack);
1335 dired_dump_obstack ("//SUBDIRED//", &subdired_obstack);
1336 printf ("//DIRED-OPTIONS// --quoting-style=%s\n",
1337 quoting_style_args[get_quoting_style (filename_quoting_options)]);
1342 assert (hash_get_n_entries (active_dir_set) == 0);
1343 hash_free (active_dir_set);
1349 /* Set all the option flags according to the switches specified.
1350 Return the index of the first non-option argument. */
1353 decode_switches (int argc, char **argv)
1356 char *time_style_option = NULL;
1358 /* Record whether there is an option specifying sort type. */
1359 bool sort_type_specified = false;
1361 qmark_funny_chars = false;
1363 /* initialize all switches to default settings */
1368 /* This is for the `dir' program. */
1369 format = many_per_line;
1370 set_quoting_style (NULL, escape_quoting_style);
1373 case LS_LONG_FORMAT:
1374 /* This is for the `vdir' program. */
1375 format = long_format;
1376 set_quoting_style (NULL, escape_quoting_style);
1380 /* This is for the `ls' program. */
1381 if (isatty (STDOUT_FILENO))
1383 format = many_per_line;
1384 /* See description of qmark_funny_chars, above. */
1385 qmark_funny_chars = true;
1389 format = one_per_line;
1390 qmark_funny_chars = false;
1398 time_type = time_mtime;
1399 sort_type = sort_name;
1400 sort_reverse = false;
1401 numeric_ids = false;
1402 print_block_size = false;
1403 indicator_style = none;
1404 print_inode = false;
1405 dereference = DEREF_UNDEFINED;
1407 immediate_dirs = false;
1408 ignore_mode = IGNORE_DEFAULT;
1409 ignore_patterns = NULL;
1410 hide_patterns = NULL;
1412 /* FIXME: put this in a function. */
1414 char const *q_style = getenv ("QUOTING_STYLE");
1417 int i = ARGMATCH (q_style, quoting_style_args, quoting_style_vals);
1419 set_quoting_style (NULL, quoting_style_vals[i]);
1422 _("ignoring invalid value of environment variable QUOTING_STYLE: %s"),
1423 quotearg (q_style));
1428 char const *ls_block_size = getenv ("LS_BLOCK_SIZE");
1429 human_output_opts = human_options (ls_block_size, false,
1430 &output_block_size);
1431 if (ls_block_size || getenv ("BLOCK_SIZE"))
1432 file_output_block_size = output_block_size;
1437 char const *p = getenv ("COLUMNS");
1440 unsigned long int tmp_ulong;
1441 if (xstrtoul (p, NULL, 0, &tmp_ulong, NULL) == LONGINT_OK
1442 && 0 < tmp_ulong && tmp_ulong <= SIZE_MAX)
1444 line_length = tmp_ulong;
1449 _("ignoring invalid width in environment variable COLUMNS: %s"),
1459 if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &ws) != -1
1460 && 0 < ws.ws_col && ws.ws_col == (size_t) ws.ws_col)
1461 line_length = ws.ws_col;
1466 char const *p = getenv ("TABSIZE");
1470 unsigned long int tmp_ulong;
1471 if (xstrtoul (p, NULL, 0, &tmp_ulong, NULL) == LONGINT_OK
1472 && tmp_ulong <= SIZE_MAX)
1474 tabsize = tmp_ulong;
1479 _("ignoring invalid tab size in environment variable TABSIZE: %s"),
1485 while ((c = getopt_long (argc, argv,
1486 "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UX1",
1487 long_options, NULL)) != -1)
1492 ignore_mode = IGNORE_MINIMAL;
1496 set_quoting_style (NULL, escape_quoting_style);
1500 time_type = time_ctime;
1504 immediate_dirs = true;
1508 /* Same as enabling -a -U and disabling -l -s. */
1509 ignore_mode = IGNORE_MINIMAL;
1510 sort_type = sort_none;
1511 sort_type_specified = true;
1513 if (format == long_format)
1514 format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
1515 print_block_size = false; /* disable -s */
1516 print_with_color = false; /* disable --color */
1520 format = long_format;
1521 print_owner = false;
1525 human_output_opts = human_autoscale | human_SI | human_base_1024;
1526 file_output_block_size = output_block_size = 1;
1534 human_output_opts = 0;
1535 file_output_block_size = output_block_size = 1024;
1539 format = long_format;
1543 format = with_commas;
1548 format = long_format;
1551 case 'o': /* Just like -l, but don't display group info. */
1552 format = long_format;
1553 print_group = false;
1557 indicator_style = slash;
1561 qmark_funny_chars = true;
1565 sort_reverse = true;
1569 print_block_size = true;
1573 sort_type = sort_time;
1574 sort_type_specified = true;
1578 time_type = time_atime;
1582 sort_type = sort_version;
1583 sort_type_specified = true;
1588 unsigned long int tmp_ulong;
1589 if (xstrtoul (optarg, NULL, 0, &tmp_ulong, NULL) != LONGINT_OK
1590 || ! (0 < tmp_ulong && tmp_ulong <= SIZE_MAX))
1591 error (LS_FAILURE, 0, _("invalid line width: %s"),
1593 line_length = tmp_ulong;
1598 format = horizontal;
1602 if (ignore_mode == IGNORE_DEFAULT)
1603 ignore_mode = IGNORE_DOT_AND_DOTDOT;
1607 add_ignore_pattern ("*~");
1608 add_ignore_pattern (".*~");
1612 format = many_per_line;
1620 indicator_style = classify;
1623 case 'G': /* inhibit display of group info */
1624 print_group = false;
1628 dereference = DEREF_COMMAND_LINE_ARGUMENTS;
1631 case DEREFERENCE_COMMAND_LINE_SYMLINK_TO_DIR_OPTION:
1632 dereference = DEREF_COMMAND_LINE_SYMLINK_TO_DIR;
1636 add_ignore_pattern (optarg);
1640 dereference = DEREF_ALWAYS;
1644 set_quoting_style (NULL, literal_quoting_style);
1648 set_quoting_style (NULL, c_quoting_style);
1656 sort_type = sort_size;
1657 sort_type_specified = true;
1662 unsigned long int tmp_ulong;
1663 if (xstrtoul (optarg, NULL, 0, &tmp_ulong, NULL) != LONGINT_OK
1664 || SIZE_MAX < tmp_ulong)
1665 error (LS_FAILURE, 0, _("invalid tab size: %s"),
1667 tabsize = tmp_ulong;
1672 sort_type = sort_none;
1673 sort_type_specified = true;
1677 sort_type = sort_extension;
1678 sort_type_specified = true;
1682 /* -1 has no effect after -l. */
1683 if (format != long_format)
1684 format = one_per_line;
1688 print_author = true;
1693 struct ignore_pattern *hide = xmalloc (sizeof *hide);
1694 hide->pattern = optarg;
1695 hide->next = hide_patterns;
1696 hide_patterns = hide;
1701 sort_type = XARGMATCH ("--sort", optarg, sort_args, sort_types);
1702 sort_type_specified = true;
1706 time_type = XARGMATCH ("--time", optarg, time_args, time_types);
1710 format = XARGMATCH ("--format", optarg, format_args, format_types);
1713 case FULL_TIME_OPTION:
1714 format = long_format;
1715 time_style_option = "full-iso";
1722 i = XARGMATCH ("--color", optarg, color_args, color_types);
1724 /* Using --color with no argument is equivalent to using
1728 print_with_color = (i == color_always
1729 || (i == color_if_tty
1730 && isatty (STDOUT_FILENO)));
1732 if (print_with_color)
1734 /* Don't use TAB characters in output. Some terminal
1735 emulators can't handle the combination of tabs and
1736 color codes on the same line. */
1742 case INDICATOR_STYLE_OPTION:
1743 indicator_style = XARGMATCH ("--indicator-style", optarg,
1744 indicator_style_args,
1745 indicator_style_types);
1748 case QUOTING_STYLE_OPTION:
1749 set_quoting_style (NULL,
1750 XARGMATCH ("--quoting-style", optarg,
1752 quoting_style_vals));
1755 case TIME_STYLE_OPTION:
1756 time_style_option = optarg;
1759 case SHOW_CONTROL_CHARS_OPTION:
1760 qmark_funny_chars = false;
1763 case BLOCK_SIZE_OPTION:
1764 human_output_opts = human_options (optarg, true, &output_block_size);
1765 file_output_block_size = output_block_size;
1769 human_output_opts = human_autoscale | human_SI;
1770 file_output_block_size = output_block_size = 1;
1773 case_GETOPT_HELP_CHAR;
1775 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1782 max_idx = MAX (1, line_length / MIN_COLUMN_WIDTH);
1784 filename_quoting_options = clone_quoting_options (NULL);
1785 if (get_quoting_style (filename_quoting_options) == escape_quoting_style)
1786 set_char_quoting (filename_quoting_options, ' ', 1);
1787 if (file_type <= indicator_style)
1790 for (p = "*=>@|" + indicator_style - file_type; *p; p++)
1791 set_char_quoting (filename_quoting_options, *p, 1);
1794 dirname_quoting_options = clone_quoting_options (NULL);
1795 set_char_quoting (dirname_quoting_options, ':', 1);
1797 /* --dired is meaningful only with --format=long (-l).
1798 Otherwise, ignore it. FIXME: warn about this?
1799 Alternatively, make --dired imply --format=long? */
1800 if (dired && format != long_format)
1803 /* If -c or -u is specified and not -l (or any other option that implies -l),
1804 and no sort-type was specified, then sort by the ctime (-c) or atime (-u).
1805 The behavior of ls when using either -c or -u but with neither -l nor -t
1806 appears to be unspecified by POSIX. So, with GNU ls, `-u' alone means
1807 sort by atime (this is the one that's not specified by the POSIX spec),
1808 -lu means show atime and sort by name, -lut means show atime and sort
1811 if ((time_type == time_ctime || time_type == time_atime)
1812 && !sort_type_specified && format != long_format)
1814 sort_type = sort_time;
1817 if (format == long_format)
1819 char *style = time_style_option;
1820 static char const posix_prefix[] = "posix-";
1823 if (! (style = getenv ("TIME_STYLE")))
1824 style = "posix-long-iso";
1826 while (strncmp (style, posix_prefix, sizeof posix_prefix - 1) == 0)
1828 if (! hard_locale (LC_TIME))
1830 style += sizeof posix_prefix - 1;
1835 char *p0 = style + 1;
1836 char *p1 = strchr (p0, '\n');
1841 if (strchr (p1 + 1, '\n'))
1842 error (LS_FAILURE, 0, _("invalid time style format %s"),
1846 long_time_format[0] = p0;
1847 long_time_format[1] = p1;
1850 switch (XARGMATCH ("time style", style,
1854 case full_iso_time_style:
1855 long_time_format[0] = long_time_format[1] =
1856 "%Y-%m-%d %H:%M:%S.%N %z";
1859 case long_iso_time_style:
1860 long_time_format[0] = long_time_format[1] = "%Y-%m-%d %H:%M";
1863 case iso_time_style:
1864 long_time_format[0] = "%Y-%m-%d ";
1865 long_time_format[1] = "%m-%d %H:%M";
1868 case locale_time_style:
1869 if (hard_locale (LC_TIME))
1872 for (i = 0; i < 2; i++)
1873 long_time_format[i] =
1874 dcgettext (NULL, long_time_format[i], LC_TIME);
1882 /* Parse a string as part of the LS_COLORS variable; this may involve
1883 decoding all kinds of escape characters. If equals_end is set an
1884 unescaped equal sign ends the string, otherwise only a : or \0
1885 does. Set *OUTPUT_COUNT to the number of bytes output. Return
1888 The resulting string is *not* null-terminated, but may contain
1891 Note that both dest and src are char **; on return they point to
1892 the first free byte after the array and the character that ended
1893 the input string, respectively. */
1896 get_funky_string (char **dest, const char **src, bool equals_end,
1897 size_t *output_count)
1899 char num; /* For numerical codes */
1900 size_t count; /* Something to count with */
1902 ST_GND, ST_BACKSLASH, ST_OCTAL, ST_HEX, ST_CARET, ST_END, ST_ERROR
1907 p = *src; /* We don't want to double-indirect */
1908 q = *dest; /* the whole darn time. */
1910 count = 0; /* No characters counted in yet. */
1913 state = ST_GND; /* Start in ground state. */
1914 while (state < ST_END)
1918 case ST_GND: /* Ground state (no escapes) */
1923 state = ST_END; /* End of string */
1926 state = ST_BACKSLASH; /* Backslash scape sequence */
1930 state = ST_CARET; /* Caret escape */
1936 state = ST_END; /* End */
1939 /* else fall through */
1947 case ST_BACKSLASH: /* Backslash escaped character */
1958 state = ST_OCTAL; /* Octal sequence */
1963 state = ST_HEX; /* Hex sequence */
1966 case 'a': /* Bell */
1969 case 'b': /* Backspace */
1972 case 'e': /* Escape */
1975 case 'f': /* Form feed */
1978 case 'n': /* Newline */
1981 case 'r': /* Carriage return */
1987 case 'v': /* Vtab */
1990 case '?': /* Delete */
1993 case '_': /* Space */
1996 case '\0': /* End of string */
1997 state = ST_ERROR; /* Error! */
1999 default: /* Escaped character like \ ^ : = */
2003 if (state == ST_BACKSLASH)
2012 case ST_OCTAL: /* Octal sequence */
2013 if (*p < '0' || *p > '7')
2020 num = (num << 3) + (*(p++) - '0');
2023 case ST_HEX: /* Hex sequence */
2036 num = (num << 4) + (*(p++) - '0');
2044 num = (num << 4) + (*(p++) - 'a') + 10;
2052 num = (num << 4) + (*(p++) - 'A') + 10;
2062 case ST_CARET: /* Caret escape */
2063 state = ST_GND; /* Should be the next state... */
2064 if (*p >= '@' && *p <= '~')
2066 *(q++) = *(p++) & 037;
2085 *output_count = count;
2087 return state != ST_ERROR;
2091 parse_ls_color (void)
2093 const char *p; /* Pointer to character being parsed */
2094 char *buf; /* color_buf buffer pointer */
2095 int state; /* State of parser */
2096 int ind_no; /* Indicator number */
2097 char label[3]; /* Indicator label */
2098 struct color_ext_type *ext; /* Extension we are working on */
2100 if ((p = getenv ("LS_COLORS")) == NULL || *p == '\0')
2104 strcpy (label, "??");
2106 /* This is an overly conservative estimate, but any possible
2107 LS_COLORS string will *not* generate a color_buf longer than
2108 itself, so it is a safe way of allocating a buffer in
2110 buf = color_buf = xstrdup (p);
2117 case 1: /* First label character */
2125 /* Allocate new extension block and add to head of
2126 linked list (this way a later definition will
2127 override an earlier one, which can be useful for
2128 having terminal-specific defs override global). */
2130 ext = xmalloc (sizeof *ext);
2131 ext->next = color_ext_list;
2132 color_ext_list = ext;
2135 ext->ext.string = buf;
2137 state = (get_funky_string (&buf, &p, true, &ext->ext.len)
2142 state = 0; /* Done! */
2145 default: /* Assume it is file type label */
2152 case 2: /* Second label character */
2159 state = -1; /* Error */
2162 case 3: /* Equal sign after indicator label */
2163 state = -1; /* Assume failure... */
2164 if (*(p++) == '=')/* It *should* be... */
2166 for (ind_no = 0; indicator_name[ind_no] != NULL; ++ind_no)
2168 if (STREQ (label, indicator_name[ind_no]))
2170 color_indicator[ind_no].string = buf;
2171 state = (get_funky_string (&buf, &p, false,
2172 &color_indicator[ind_no].len)
2178 error (0, 0, _("unrecognized prefix: %s"), quotearg (label));
2182 case 4: /* Equal sign after *.ext */
2185 ext->seq.string = buf;
2186 state = (get_funky_string (&buf, &p, false, &ext->seq.len)
2197 struct color_ext_type *e;
2198 struct color_ext_type *e2;
2201 _("unparsable value for LS_COLORS environment variable"));
2203 for (e = color_ext_list; e != NULL; /* empty */)
2209 print_with_color = false;
2212 if (color_indicator[C_LINK].len == 6
2213 && !strncmp (color_indicator[C_LINK].string, "target", 6))
2214 color_symlink_as_referent = true;
2217 /* Set the exit status to report a failure. If SERIOUS, it is a
2218 serious failure; otherwise, it is merely a minor problem. */
2221 set_exit_status (bool serious)
2224 exit_status = LS_FAILURE;
2225 else if (exit_status == EXIT_SUCCESS)
2226 exit_status = LS_MINOR_PROBLEM;
2229 /* Assuming a failure is serious if SERIOUS, use the printf-style
2230 MESSAGE to report the failure to access a file named FILE. Assume
2231 errno is set appropriately for the failure. */
2234 file_failure (bool serious, char const *message, char const *file)
2236 error (0, errno, message, quotearg_colon (file));
2237 set_exit_status (serious);
2240 /* Request that the directory named NAME have its contents listed later.
2241 If REALNAME is nonzero, it will be used instead of NAME when the
2242 directory name is printed. This allows symbolic links to directories
2243 to be treated as regular directories but still be listed under their
2244 real names. NAME == NULL is used to insert a marker entry for the
2245 directory named in REALNAME.
2246 If NAME is non-NULL, we use its dev/ino information to save
2247 a call to stat -- when doing a recursive (-R) traversal.
2248 COMMAND_LINE_ARG means this directory was mentioned on the command line. */
2251 queue_directory (char const *name, char const *realname, bool command_line_arg)
2253 struct pending *new = xmalloc (sizeof *new);
2254 new->realname = realname ? xstrdup (realname) : NULL;
2255 new->name = name ? xstrdup (name) : NULL;
2256 new->command_line_arg = command_line_arg;
2257 new->next = pending_dirs;
2261 /* Read directory NAME, and list the files in it.
2262 If REALNAME is nonzero, print its name instead of NAME;
2263 this is used for symbolic links to directories.
2264 COMMAND_LINE_ARG means this directory was mentioned on the command line. */
2267 print_dir (char const *name, char const *realname, bool command_line_arg)
2270 struct dirent *next;
2271 uintmax_t total_blocks = 0;
2272 static bool first = true;
2275 dirp = opendir (name);
2278 file_failure (command_line_arg, "%s", name);
2284 struct stat dir_stat;
2285 int fd = dirfd (dirp);
2287 /* If dirfd failed, endure the overhead of using stat. */
2289 ? fstat (fd, &dir_stat)
2290 : stat (name, &dir_stat)) < 0)
2292 file_failure (command_line_arg,
2293 _("cannot determine device and inode of %s"), name);
2297 /* If we've already visited this dev/inode pair, warn that
2298 we've found a loop, and do not process this directory. */
2299 if (visit_dir (dir_stat.st_dev, dir_stat.st_ino))
2301 error (0, 0, _("%s: not listing already-listed directory"),
2302 quotearg_colon (name));
2306 DEV_INO_PUSH (dir_stat.st_dev, dir_stat.st_ino);
2309 /* Read the directory entries, and insert the subfiles into the `files'
2316 /* Set errno to zero so we can distinguish between a readdir failure
2317 and when readdir simply finds that there are no more entries. */
2319 next = readdir (dirp);
2322 if (! file_ignored (next->d_name))
2324 enum filetype type = unknown;
2326 #if HAVE_STRUCT_DIRENT_D_TYPE
2327 if (next->d_type == DT_BLK
2328 || next->d_type == DT_CHR
2329 || next->d_type == DT_DIR
2330 || next->d_type == DT_FIFO
2331 || next->d_type == DT_LNK
2332 || next->d_type == DT_REG
2333 || next->d_type == DT_SOCK)
2334 type = next->d_type;
2336 total_blocks += gobble_file (next->d_name, type, false, name);
2339 else if (errno != 0)
2341 file_failure (command_line_arg, _("reading directory %s"), name);
2342 if (errno != EOVERFLOW)
2349 if (CLOSEDIR (dirp) != 0)
2351 file_failure (command_line_arg, _("closing directory %s"), name);
2352 /* Don't return; print whatever we got. */
2355 /* Sort the directory contents. */
2358 /* If any member files are subdirectories, perhaps they should have their
2359 contents listed rather than being mentioned here as files. */
2362 extract_dirs_from_files (name, command_line_arg);
2364 if (recursive | print_dir_name)
2367 DIRED_PUTCHAR ('\n');
2370 PUSH_CURRENT_DIRED_POS (&subdired_obstack);
2371 dired_pos += quote_name (stdout, realname ? realname : name,
2372 dirname_quoting_options, NULL);
2373 PUSH_CURRENT_DIRED_POS (&subdired_obstack);
2374 DIRED_FPUTS_LITERAL (":\n", stdout);
2377 if (format == long_format || print_block_size)
2380 char buf[LONGEST_HUMAN_READABLE + 1];
2384 DIRED_FPUTS (p, stdout, strlen (p));
2385 DIRED_PUTCHAR (' ');
2386 p = human_readable (total_blocks, buf, human_output_opts,
2387 ST_NBLOCKSIZE, output_block_size);
2388 DIRED_FPUTS (p, stdout, strlen (p));
2389 DIRED_PUTCHAR ('\n');
2393 print_current_files ();
2396 /* Add `pattern' to the list of patterns for which files that match are
2400 add_ignore_pattern (const char *pattern)
2402 struct ignore_pattern *ignore;
2404 ignore = xmalloc (sizeof *ignore);
2405 ignore->pattern = pattern;
2406 /* Add it to the head of the linked list. */
2407 ignore->next = ignore_patterns;
2408 ignore_patterns = ignore;
2411 /* Return true if one of the PATTERNS matches FILE. */
2414 patterns_match (struct ignore_pattern const *patterns, char const *file)
2416 struct ignore_pattern const *p;
2417 for (p = patterns; p; p = p->next)
2418 if (fnmatch (p->pattern, file, FNM_PERIOD) == 0)
2423 /* Return true if FILE should be ignored. */
2426 file_ignored (char const *name)
2428 return ((ignore_mode != IGNORE_MINIMAL
2430 && (ignore_mode == IGNORE_DEFAULT || ! name[1 + (name[1] == '.')]))
2431 || (ignore_mode == IGNORE_DEFAULT
2432 && patterns_match (hide_patterns, name))
2433 || patterns_match (ignore_patterns, name));
2436 /* POSIX requires that a file size be printed without a sign, even
2437 when negative. Assume the typical case where negative sizes are
2438 actually positive values that have wrapped around. */
2441 unsigned_file_size (off_t size)
2443 return size + (size < 0) * ((uintmax_t) OFF_T_MAX - OFF_T_MIN + 1);
2446 /* Enter and remove entries in the table `files'. */
2448 /* Empty the table of files. */
2455 for (i = 0; i < files_index; i++)
2457 free (files[i].name);
2458 free (files[i].linkname);
2463 any_has_acl = false;
2465 inode_number_width = 0;
2466 block_size_width = 0;
2471 major_device_number_width = 0;
2472 minor_device_number_width = 0;
2473 file_size_width = 0;
2476 /* Add a file to the current table of files.
2477 Verify that the file exists, and print an error message if it does not.
2478 Return the number of blocks that the file occupies. */
2481 gobble_file (char const *name, enum filetype type, bool command_line_arg,
2482 char const *dirname)
2487 if (files_index == nfiles)
2489 files = xnrealloc (files, nfiles, 2 * sizeof *files);
2493 f = &files[files_index];
2498 if (command_line_arg
2499 || format_needs_stat
2500 || (format_needs_type
2503 /* FIXME: remove this disjunct.
2504 I don't think we care about symlinks here, but for now
2505 this won't make a big performance difference. */
2506 || type == symbolic_link
2508 /* --indicator-style=classify (aka -F)
2509 requires that we stat each regular file
2510 to see if it's executable. */
2511 || (type == normal && (indicator_style == classify
2512 /* This is so that --color ends up
2513 highlighting files with the executable
2514 bit set even when options like -F are
2516 || (print_with_color
2517 && is_colored (C_EXEC))
2521 /* Absolute name of this file. */
2522 char *absolute_name;
2526 if (name[0] == '/' || dirname[0] == 0)
2527 absolute_name = (char *) name;
2530 absolute_name = alloca (strlen (name) + strlen (dirname) + 2);
2531 attach (absolute_name, dirname, name);
2534 switch (dereference)
2537 err = stat (absolute_name, &f->stat);
2540 case DEREF_COMMAND_LINE_ARGUMENTS:
2541 case DEREF_COMMAND_LINE_SYMLINK_TO_DIR:
2542 if (command_line_arg)
2545 err = stat (absolute_name, &f->stat);
2547 if (dereference == DEREF_COMMAND_LINE_ARGUMENTS)
2550 need_lstat = (err < 0
2552 : ! S_ISDIR (f->stat.st_mode));
2556 /* stat failed because of ENOENT, maybe indicating a dangling
2557 symlink. Or stat succeeded, ABSOLUTE_NAME does not refer to a
2558 directory, and --dereference-command-line-symlink-to-dir is
2559 in effect. Fall through so that we call lstat instead. */
2562 default: /* DEREF_NEVER */
2563 err = lstat (absolute_name, &f->stat);
2569 file_failure (command_line_arg, "%s", absolute_name);
2574 if (format == long_format)
2576 int n = file_has_acl (absolute_name, &f->stat);
2577 f->have_acl = (0 < n);
2578 any_has_acl |= f->have_acl;
2580 error (0, errno, "%s", quotearg_colon (absolute_name));
2584 if (S_ISLNK (f->stat.st_mode)
2585 && (format == long_format || check_symlink_color))
2588 struct stat linkstats;
2590 get_link_name (absolute_name, f, command_line_arg);
2591 linkname = make_link_name (absolute_name, f->linkname);
2593 /* Avoid following symbolic links when possible, ie, when
2594 they won't be traced and when no indicator is needed. */
2596 && (file_type <= indicator_style || check_symlink_color)
2597 && stat (linkname, &linkstats) == 0)
2601 /* Symbolic links to directories that are mentioned on the
2602 command line are automatically traced if not being
2604 if (!command_line_arg || format == long_format
2605 || !S_ISDIR (linkstats.st_mode))
2607 /* Get the linked-to file's mode for the filetype indicator
2608 in long listings. */
2609 f->linkmode = linkstats.st_mode;
2616 if (S_ISLNK (f->stat.st_mode))
2617 f->filetype = symbolic_link;
2618 else if (S_ISDIR (f->stat.st_mode))
2620 if (command_line_arg & !immediate_dirs)
2621 f->filetype = arg_directory;
2623 f->filetype = directory;
2626 f->filetype = normal;
2629 char buf[INT_BUFSIZE_BOUND (uintmax_t)];
2630 int len = strlen (umaxtostr (f->stat.st_ino, buf));
2631 if (inode_number_width < len)
2632 inode_number_width = len;
2635 blocks = ST_NBLOCKS (f->stat);
2637 char buf[LONGEST_HUMAN_READABLE + 1];
2638 int len = mbswidth (human_readable (blocks, buf, human_output_opts,
2639 ST_NBLOCKSIZE, output_block_size),
2641 if (block_size_width < len)
2642 block_size_width = len;
2647 int len = format_user_width (f->stat.st_uid);
2648 if (owner_width < len)
2654 int len = format_group_width (f->stat.st_gid);
2655 if (group_width < len)
2661 int len = format_user_width (f->stat.st_uid);
2662 if (author_width < len)
2667 char buf[INT_BUFSIZE_BOUND (uintmax_t)];
2668 int len = strlen (umaxtostr (f->stat.st_nlink, buf));
2669 if (nlink_width < len)
2673 if (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode))
2675 char buf[INT_BUFSIZE_BOUND (uintmax_t)];
2676 int len = strlen (umaxtostr (major (f->stat.st_rdev), buf));
2677 if (major_device_number_width < len)
2678 major_device_number_width = len;
2679 len = strlen (umaxtostr (minor (f->stat.st_rdev), buf));
2680 if (minor_device_number_width < len)
2681 minor_device_number_width = len;
2682 len = major_device_number_width + 2 + minor_device_number_width;
2683 if (file_size_width < len)
2684 file_size_width = len;
2688 char buf[LONGEST_HUMAN_READABLE + 1];
2689 uintmax_t size = unsigned_file_size (f->stat.st_size);
2690 int len = mbswidth (human_readable (size, buf, human_output_opts,
2691 1, file_output_block_size),
2693 if (file_size_width < len)
2694 file_size_width = len;
2700 #if HAVE_STRUCT_DIRENT_D_TYPE
2701 f->stat.st_mode = DTTOIF (type);
2706 f->name = xstrdup (name);
2714 /* Put the name of the file that FILENAME is a symbolic link to
2715 into the LINKNAME field of `f'. COMMAND_LINE_ARG indicates whether
2716 FILENAME is a command-line argument. */
2719 get_link_name (char const *filename, struct fileinfo *f, bool command_line_arg)
2721 f->linkname = xreadlink (filename, f->stat.st_size);
2722 if (f->linkname == NULL)
2723 file_failure (command_line_arg, _("cannot read symbolic link %s"),
2727 /* If `linkname' is a relative name and `name' contains one or more
2728 leading directories, return `linkname' with those directories
2729 prepended; otherwise, return a copy of `linkname'.
2730 If `linkname' is zero, return zero. */
2733 make_link_name (char const *name, char const *linkname)
2741 if (*linkname == '/')
2742 return xstrdup (linkname);
2744 /* The link is to a relative name. Prepend any leading directory
2745 in `name' to the link name. */
2746 linkbuf = strrchr (name, '/');
2748 return xstrdup (linkname);
2750 bufsiz = linkbuf - name + 1;
2751 linkbuf = xmalloc (bufsiz + strlen (linkname) + 1);
2752 strncpy (linkbuf, name, bufsiz);
2753 strcpy (linkbuf + bufsiz, linkname);
2758 /* Return true if base_name (NAME) ends in `.' or `..'
2759 This is so we don't try to recurse on `././././. ...' */
2762 basename_is_dot_or_dotdot (const char *name)
2764 char const *base = base_name (name);
2765 return DOT_OR_DOTDOT (base);
2768 /* Remove any entries from FILES that are for directories,
2769 and queue them to be listed as directories instead.
2770 DIRNAME is the prefix to prepend to each dirname
2771 to make it correct relative to ls's working dir;
2772 if it is null, no prefix is needed and "." and ".." should not be ignored.
2773 If COMMAND_LINE_ARG is true, this directory was mentioned at the top level,
2774 This is desirable when processing directories recursively. */
2777 extract_dirs_from_files (char const *dirname, bool command_line_arg)
2781 bool ignore_dot_and_dot_dot = (dirname != NULL);
2783 if (dirname && LOOP_DETECT)
2785 /* Insert a marker entry first. When we dequeue this marker entry,
2786 we'll know that DIRNAME has been processed and may be removed
2787 from the set of active directories. */
2788 queue_directory (NULL, dirname, false);
2791 /* Queue the directories last one first, because queueing reverses the
2793 for (i = files_index; i-- != 0; )
2794 if ((files[i].filetype == directory || files[i].filetype == arg_directory)
2795 && (!ignore_dot_and_dot_dot
2796 || !basename_is_dot_or_dotdot (files[i].name)))
2798 if (!dirname || files[i].name[0] == '/')
2800 queue_directory (files[i].name, files[i].linkname,
2805 char *name = file_name_concat (dirname, files[i].name, NULL);
2806 queue_directory (name, files[i].linkname, command_line_arg);
2809 if (files[i].filetype == arg_directory)
2810 free (files[i].name);
2813 /* Now delete the directories from the table, compacting all the remaining
2816 for (i = 0, j = 0; i < files_index; i++)
2818 if (files[i].filetype != arg_directory)
2821 files[j] = files[i];
2828 /* Use strcoll to compare strings in this locale. If an error occurs,
2829 report an error and longjmp to failed_strcoll. */
2831 static jmp_buf failed_strcoll;
2834 xstrcoll (char const *a, char const *b)
2838 diff = strcoll (a, b);
2841 error (0, errno, _("cannot compare file names %s and %s"),
2842 quote_n (0, a), quote_n (1, b));
2843 set_exit_status (false);
2844 longjmp (failed_strcoll, 1);
2849 /* Comparison routines for sorting the files. */
2851 typedef void const *V;
2854 cmp_ctime (struct fileinfo const *a, struct fileinfo const *b,
2855 int (*cmp) (char const *, char const *))
2857 int diff = CTIME_CMP (b->stat, a->stat);
2858 return diff ? diff : cmp (a->name, b->name);
2860 static int compare_ctime (V a, V b) { return cmp_ctime (a, b, xstrcoll); }
2861 static int compstr_ctime (V a, V b) { return cmp_ctime (a, b, strcmp); }
2862 static int rev_cmp_ctime (V a, V b) { return compare_ctime (b, a); }
2863 static int rev_str_ctime (V a, V b) { return compstr_ctime (b, a); }
2866 cmp_mtime (struct fileinfo const *a, struct fileinfo const *b,
2867 int (*cmp) (char const *, char const *))
2869 int diff = MTIME_CMP (b->stat, a->stat);
2870 return diff ? diff : cmp (a->name, b->name);
2872 static int compare_mtime (V a, V b) { return cmp_mtime (a, b, xstrcoll); }
2873 static int compstr_mtime (V a, V b) { return cmp_mtime (a, b, strcmp); }
2874 static int rev_cmp_mtime (V a, V b) { return compare_mtime (b, a); }
2875 static int rev_str_mtime (V a, V b) { return compstr_mtime (b, a); }
2878 cmp_atime (struct fileinfo const *a, struct fileinfo const *b,
2879 int (*cmp) (char const *, char const *))
2881 int diff = ATIME_CMP (b->stat, a->stat);
2882 return diff ? diff : cmp (a->name, b->name);
2884 static int compare_atime (V a, V b) { return cmp_atime (a, b, xstrcoll); }
2885 static int compstr_atime (V a, V b) { return cmp_atime (a, b, strcmp); }
2886 static int rev_cmp_atime (V a, V b) { return compare_atime (b, a); }
2887 static int rev_str_atime (V a, V b) { return compstr_atime (b, a); }
2890 cmp_size (struct fileinfo const *a, struct fileinfo const *b,
2891 int (*cmp) (char const *, char const *))
2893 int diff = longdiff (b->stat.st_size, a->stat.st_size);
2894 return diff ? diff : cmp (a->name, b->name);
2896 static int compare_size (V a, V b) { return cmp_size (a, b, xstrcoll); }
2897 static int compstr_size (V a, V b) { return cmp_size (a, b, strcmp); }
2898 static int rev_cmp_size (V a, V b) { return compare_size (b, a); }
2899 static int rev_str_size (V a, V b) { return compstr_size (b, a); }
2902 cmp_version (struct fileinfo const *a, struct fileinfo const *b)
2904 return strverscmp (a->name, b->name);
2906 static int compare_version (V a, V b) { return cmp_version (a, b); }
2907 static int rev_cmp_version (V a, V b) { return compare_version (b, a); }
2910 cmp_name (struct fileinfo const *a, struct fileinfo const *b,
2911 int (*cmp) (char const *, char const *))
2913 return cmp (a->name, b->name);
2915 static int compare_name (V a, V b) { return cmp_name (a, b, xstrcoll); }
2916 static int compstr_name (V a, V b) { return cmp_name (a, b, strcmp); }
2917 static int rev_cmp_name (V a, V b) { return compare_name (b, a); }
2918 static int rev_str_name (V a, V b) { return compstr_name (b, a); }
2920 /* Compare file extensions. Files with no extension are `smallest'.
2921 If extensions are the same, compare by filenames instead. */
2924 cmp_extension (struct fileinfo const *a, struct fileinfo const *b,
2925 int (*cmp) (char const *, char const *))
2927 char const *base1 = strrchr (a->name, '.');
2928 char const *base2 = strrchr (b->name, '.');
2929 int diff = cmp (base1 ? base1 : "", base2 ? base2 : "");
2930 return diff ? diff : cmp (a->name, b->name);
2932 static int compare_extension (V a, V b) { return cmp_extension (a, b, xstrcoll); }
2933 static int compstr_extension (V a, V b) { return cmp_extension (a, b, strcmp); }
2934 static int rev_cmp_extension (V a, V b) { return compare_extension (b, a); }
2935 static int rev_str_extension (V a, V b) { return compstr_extension (b, a); }
2937 /* Sort the files now in the table. */
2944 /* Try strcoll. If it fails, fall back on strcmp. We can't safely
2945 ignore strcoll failures, as a failing strcoll might be a
2946 comparison function that is not a total order, and if we ignored
2947 the failure this might cause qsort to dump core. */
2949 if (! setjmp (failed_strcoll))
2959 func = sort_reverse ? rev_cmp_ctime : compare_ctime;
2962 func = sort_reverse ? rev_cmp_mtime : compare_mtime;
2965 func = sort_reverse ? rev_cmp_atime : compare_atime;
2972 func = sort_reverse ? rev_cmp_name : compare_name;
2974 case sort_extension:
2975 func = sort_reverse ? rev_cmp_extension : compare_extension;
2978 func = sort_reverse ? rev_cmp_size : compare_size;
2981 func = sort_reverse ? rev_cmp_version : compare_version;
2995 func = sort_reverse ? rev_str_ctime : compstr_ctime;
2998 func = sort_reverse ? rev_str_mtime : compstr_mtime;
3001 func = sort_reverse ? rev_str_atime : compstr_atime;
3008 func = sort_reverse ? rev_str_name : compstr_name;
3010 case sort_extension:
3011 func = sort_reverse ? rev_str_extension : compstr_extension;
3014 func = sort_reverse ? rev_str_size : compstr_size;
3021 qsort (files, files_index, sizeof (struct fileinfo), func);
3024 /* List all the files now in the table. */
3027 print_current_files (void)
3034 for (i = 0; i < files_index; i++)
3036 print_file_name_and_frills (files + i);
3042 print_many_per_line ();
3046 print_horizontal ();
3050 print_with_commas ();
3054 for (i = 0; i < files_index; i++)
3056 print_long_format (files + i);
3057 DIRED_PUTCHAR ('\n');
3063 /* Return the expected number of columns in a long-format time stamp,
3064 or zero if it cannot be calculated. */
3067 long_time_expected_width (void)
3069 static int width = -1;
3074 struct tm const *tm = localtime (&epoch);
3075 char buf[TIME_STAMP_LEN_MAXIMUM + 1];
3080 nstrftime (buf, sizeof buf, long_time_format[0], tm, 0, 0);
3082 width = mbsnwidth (buf, len, 0);
3092 /* Get the current time. */
3095 get_current_time (void)
3097 #if HAVE_CLOCK_GETTIME && defined CLOCK_REALTIME
3099 struct timespec timespec;
3100 if (clock_gettime (CLOCK_REALTIME, ×pec) == 0)
3102 current_time = timespec.tv_sec;
3103 current_time_ns = timespec.tv_nsec;
3109 /* The clock does not have nanosecond resolution, so get the maximum
3110 possible value for the current time that is consistent with the
3111 reported clock. That way, files are not considered to be in the
3112 future merely because their time stamps have higher resolution
3113 than the clock resolution. */
3115 #if HAVE_GETTIMEOFDAY
3117 struct timeval timeval;
3118 gettimeofday (&timeval, NULL);
3119 current_time = timeval.tv_sec;
3120 current_time_ns = timeval.tv_usec * 1000 + 999;
3123 current_time = time (NULL);
3124 current_time_ns = 999999999;
3128 /* Print the user or group name NAME, with numeric id ID, using a
3129 print width of WIDTH columns. */
3132 format_user_or_group (char const *name, unsigned long int id, int width)
3138 int width_gap = width - mbswidth (name, 0);
3139 int pad = MAX (0, width_gap);
3140 fputs (name, stdout);
3141 len = strlen (name) + pad;
3149 printf ("%*lu ", width, id);
3153 dired_pos += len + 1;
3156 /* Print the name or id of the user with id U, using a print width of
3160 format_user (uid_t u, int width)
3162 format_user_or_group (numeric_ids ? NULL : getuser (u), u, width);
3165 /* Likewise, for groups. */
3168 format_group (gid_t g, int width)
3170 format_user_or_group (numeric_ids ? NULL : getgroup (g), g, width);
3173 /* Return the number of columns that format_user_or_group will print. */
3176 format_user_or_group_width (char const *name, unsigned long int id)
3180 int len = mbswidth (name, 0);
3181 return MAX (0, len);
3185 char buf[INT_BUFSIZE_BOUND (unsigned long int)];
3186 sprintf (buf, "%lu", id);
3187 return strlen (buf);
3191 /* Return the number of columns that format_user will print. */
3194 format_user_width (uid_t u)
3196 return format_user_or_group_width (numeric_ids ? NULL : getuser (u), u);
3199 /* Likewise, for groups. */
3202 format_group_width (gid_t g)
3204 return format_user_or_group_width (numeric_ids ? NULL : getgroup (g), g);
3208 /* Print information about F in long format. */
3211 print_long_format (const struct fileinfo *f)
3215 [LONGEST_HUMAN_READABLE + 1 /* inode */
3216 + LONGEST_HUMAN_READABLE + 1 /* size in blocks */
3217 + sizeof (modebuf) - 1 + 1 /* mode string */
3218 + INT_BUFSIZE_BOUND (uintmax_t) /* st_nlink */
3219 + LONGEST_HUMAN_READABLE + 2 /* major device number */
3220 + LONGEST_HUMAN_READABLE + 1 /* minor device number */
3221 + TIME_STAMP_LEN_MAXIMUM + 1 /* max length of time/date */
3226 int when_ns IF_LINT (= 0);
3227 struct tm *when_local;
3229 /* Compute mode string. On most systems, it's based on st_mode.
3230 On systems with migration (via the stat.st_dm_mode field), use
3231 the file's migrated status. */
3232 mode_string (ST_DM_MODE (f->stat), modebuf);
3234 modebuf[10] = (FILE_HAS_ACL (f) ? '+' : ' ');
3235 modebuf[10 + any_has_acl] = '\0';
3240 when = f->stat.st_ctime;
3241 when_ns = TIMESPEC_NS (f->stat.st_ctim);
3244 when = f->stat.st_mtime;
3245 when_ns = TIMESPEC_NS (f->stat.st_mtim);
3248 when = f->stat.st_atime;
3249 when_ns = TIMESPEC_NS (f->stat.st_atim);
3257 char hbuf[INT_BUFSIZE_BOUND (uintmax_t)];
3258 sprintf (p, "%*s ", inode_number_width,
3259 umaxtostr (f->stat.st_ino, hbuf));
3260 p += inode_number_width + 1;
3263 if (print_block_size)
3265 char hbuf[LONGEST_HUMAN_READABLE + 1];
3266 char const *blocks =
3267 human_readable (ST_NBLOCKS (f->stat), hbuf, human_output_opts,
3268 ST_NBLOCKSIZE, output_block_size);
3270 for (pad = block_size_width - mbswidth (blocks, 0); 0 < pad; pad--)
3272 while ((*p++ = *blocks++))
3277 /* The last byte of the mode string is the POSIX
3278 "optional alternate access method flag". */
3280 char hbuf[INT_BUFSIZE_BOUND (uintmax_t)];
3281 sprintf (p, "%s %*s ", modebuf, nlink_width,
3282 umaxtostr (f->stat.st_nlink, hbuf));
3284 p += sizeof modebuf - 2 + any_has_acl + 1 + nlink_width + 1;
3288 if (print_owner | print_group | print_author)
3290 DIRED_FPUTS (buf, stdout, p - buf);
3293 format_user (f->stat.st_uid, owner_width);
3296 format_group (f->stat.st_gid, group_width);
3299 format_user (f->stat.st_author, author_width);
3304 if (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode))
3306 char majorbuf[INT_BUFSIZE_BOUND (uintmax_t)];
3307 char minorbuf[INT_BUFSIZE_BOUND (uintmax_t)];
3308 int blanks_width = (file_size_width
3309 - (major_device_number_width + 2
3310 + minor_device_number_width));
3311 sprintf (p, "%*s, %*s ",
3312 major_device_number_width + MAX (0, blanks_width),
3313 umaxtostr (major (f->stat.st_rdev), majorbuf),
3314 minor_device_number_width,
3315 umaxtostr (minor (f->stat.st_rdev), minorbuf));
3316 p += file_size_width + 1;
3320 char hbuf[LONGEST_HUMAN_READABLE + 1];
3322 human_readable (unsigned_file_size (f->stat.st_size),
3323 hbuf, human_output_opts, 1, file_output_block_size);
3325 for (pad = file_size_width - mbswidth (size, 0); 0 < pad; pad--)
3327 while ((*p++ = *size++))
3332 when_local = localtime (&when);
3338 time_t six_months_ago;
3342 /* If the file appears to be in the future, update the current
3343 time, in case the file happens to have been modified since
3344 the last time we checked the clock. */
3345 if (current_time < when
3346 || (current_time == when && current_time_ns < when_ns))
3348 /* Note that get_current_time calls gettimeofday which, on some non-
3349 compliant systems, clobbers the buffer used for localtime's result.
3350 But it's ok here, because we use a gettimeofday wrapper that
3351 saves and restores the buffer around the gettimeofday call. */
3352 get_current_time ();
3355 /* Consider a time to be recent if it is within the past six
3356 months. A Gregorian year has 365.2425 * 24 * 60 * 60 ==
3357 31556952 seconds on the average. Write this value as an
3358 integer constant to avoid floating point hassles. */
3359 six_months_ago = current_time - 31556952 / 2;
3360 recent = (six_months_ago <= when
3361 && (when < current_time
3362 || (when == current_time && when_ns <= current_time_ns)));
3363 fmt = long_time_format[recent];
3365 s = nstrftime (p, TIME_STAMP_LEN_MAXIMUM + 1, fmt,
3366 when_local, 0, when_ns);
3374 /* NUL-terminate the string -- fputs (via DIRED_FPUTS) requires it. */
3379 /* The time cannot be converted using the desired format, so
3380 print it as a huge integer number of seconds. */
3381 char hbuf[INT_BUFSIZE_BOUND (intmax_t)];
3382 sprintf (p, "%*s ", long_time_expected_width (),
3383 (TYPE_SIGNED (time_t)
3384 ? imaxtostr (when, hbuf)
3385 : umaxtostr (when, hbuf)));
3389 DIRED_FPUTS (buf, stdout, p - buf);
3390 print_name_with_quoting (f->name, FILE_OR_LINK_MODE (f), f->linkok,
3393 if (f->filetype == symbolic_link)
3397 DIRED_FPUTS_LITERAL (" -> ", stdout);
3398 print_name_with_quoting (f->linkname, f->linkmode, f->linkok - 1,
3400 if (indicator_style != none)
3401 print_type_indicator (f->linkmode);
3404 else if (indicator_style != none)
3405 print_type_indicator (f->stat.st_mode);
3408 /* Output to OUT a quoted representation of the file name NAME,
3409 using OPTIONS to control quoting. Produce no output if OUT is NULL.
3410 Store the number of screen columns occupied by NAME's quoted
3411 representation into WIDTH, if non-NULL. Return the number of bytes
3415 quote_name (FILE *out, const char *name, struct quoting_options const *options,
3418 char smallbuf[BUFSIZ];
3419 size_t len = quotearg_buffer (smallbuf, sizeof smallbuf, name, -1, options);
3421 size_t displayed_width IF_LINT (= 0);
3423 if (len < sizeof smallbuf)
3427 buf = alloca (len + 1);
3428 quotearg_buffer (buf, len + 1, name, -1, options);
3431 if (qmark_funny_chars)
3436 char const *p = buf;
3437 char const *plimit = buf + len;
3439 displayed_width = 0;
3444 case ' ': case '!': case '"': case '#': case '%':
3445 case '&': case '\'': case '(': case ')': case '*':
3446 case '+': case ',': case '-': case '.': case '/':
3447 case '0': case '1': case '2': case '3': case '4':
3448 case '5': case '6': case '7': case '8': case '9':
3449 case ':': case ';': case '<': case '=': case '>':
3451 case 'A': case 'B': case 'C': case 'D': case 'E':
3452 case 'F': case 'G': case 'H': case 'I': case 'J':
3453 case 'K': case 'L': case 'M': case 'N': case 'O':
3454 case 'P': case 'Q': case 'R': case 'S': case 'T':
3455 case 'U': case 'V': case 'W': case 'X': case 'Y':
3457 case '[': case '\\': case ']': case '^': case '_':
3458 case 'a': case 'b': case 'c': case 'd': case 'e':
3459 case 'f': case 'g': case 'h': case 'i': case 'j':
3460 case 'k': case 'l': case 'm': case 'n': case 'o':
3461 case 'p': case 'q': case 'r': case 's': case 't':
3462 case 'u': case 'v': case 'w': case 'x': case 'y':
3463 case 'z': case '{': case '|': case '}': case '~':
3464 /* These characters are printable ASCII characters. */
3466 displayed_width += 1;
3469 /* If we have a multibyte sequence, copy it until we
3470 reach its end, replacing each non-printable multibyte
3471 character with a single question mark. */
3474 memset (&mbstate, 0, sizeof mbstate);
3481 bytes = mbrtowc (&wc, p, plimit - p, &mbstate);
3483 if (bytes == (size_t) -1)
3485 /* An invalid multibyte sequence was
3486 encountered. Skip one input byte, and
3487 put a question mark. */
3490 displayed_width += 1;
3494 if (bytes == (size_t) -2)
3496 /* An incomplete multibyte character
3497 at the end. Replace it entirely with
3501 displayed_width += 1;
3506 /* A null wide character was encountered. */
3512 /* A printable multibyte character.
3514 for (; bytes > 0; --bytes)
3516 displayed_width += w;
3520 /* An unprintable multibyte character.
3521 Replace it entirely with a question
3525 displayed_width += 1;
3528 while (! mbsinit (&mbstate));
3533 /* The buffer may have shrunk. */
3540 char const *plimit = buf + len;
3544 if (! ISPRINT (to_uchar (*p)))
3548 displayed_width = len;
3551 else if (width != NULL)
3555 displayed_width = mbsnwidth (buf, len, 0);
3559 char const *p = buf;
3560 char const *plimit = buf + len;
3562 displayed_width = 0;
3565 if (ISPRINT (to_uchar (*p)))
3573 fwrite (buf, 1, len, out);
3575 *width = displayed_width;
3580 print_name_with_quoting (const char *p, mode_t mode, int linkok,
3581 struct obstack *stack)
3583 if (print_with_color)
3584 print_color_indicator (p, mode, linkok);
3587 PUSH_CURRENT_DIRED_POS (stack);
3589 dired_pos += quote_name (stdout, p, filename_quoting_options, NULL);
3592 PUSH_CURRENT_DIRED_POS (stack);
3594 if (print_with_color)
3597 prep_non_filename_text ();
3602 prep_non_filename_text (void)
3604 if (color_indicator[C_END].string != NULL)
3605 put_indicator (&color_indicator[C_END]);
3608 put_indicator (&color_indicator[C_LEFT]);
3609 put_indicator (&color_indicator[C_NORM]);
3610 put_indicator (&color_indicator[C_RIGHT]);
3614 /* Print the file name of `f' with appropriate quoting.
3615 Also print file size, inode number, and filetype indicator character,
3616 as requested by switches. */
3619 print_file_name_and_frills (const struct fileinfo *f)
3621 char buf[MAX (LONGEST_HUMAN_READABLE + 1, INT_BUFSIZE_BOUND (uintmax_t))];
3624 printf ("%*s ", format == with_commas ? 0 : inode_number_width,
3625 umaxtostr (f->stat.st_ino, buf));
3627 if (print_block_size)
3628 printf ("%*s ", format == with_commas ? 0 : block_size_width,
3629 human_readable (ST_NBLOCKS (f->stat), buf, human_output_opts,
3630 ST_NBLOCKSIZE, output_block_size));
3632 print_name_with_quoting (f->name, FILE_OR_LINK_MODE (f), f->linkok, NULL);
3634 if (indicator_style != none)
3635 print_type_indicator (f->stat.st_mode);
3639 print_type_indicator (mode_t mode)
3645 if (indicator_style == classify && (mode & S_IXUGO))
3654 else if (indicator_style == slash)
3656 else if (S_ISLNK (mode))
3658 else if (S_ISFIFO (mode))
3660 else if (S_ISSOCK (mode))
3662 else if (S_ISDOOR (mode))
3673 print_color_indicator (const char *name, mode_t mode, int linkok)
3676 struct color_ext_type *ext; /* Color extension */
3677 size_t len; /* Length of name */
3679 /* Is this a nonexistent file? If so, linkok == -1. */
3681 if (linkok == -1 && color_indicator[C_MISSING].string != NULL)
3690 else if (S_ISLNK (mode))
3691 type = ((!linkok && color_indicator[C_ORPHAN].string)
3692 ? C_ORPHAN : C_LINK);
3693 else if (S_ISFIFO (mode))
3695 else if (S_ISSOCK (mode))
3697 else if (S_ISBLK (mode))
3699 else if (S_ISCHR (mode))
3701 else if (S_ISDOOR (mode))
3704 if (type == C_FILE && (mode & S_IXUGO) != 0)
3707 /* Check the file's suffix only if still classified as C_FILE. */
3711 /* Test if NAME has a recognized suffix. */
3713 len = strlen (name);
3714 name += len; /* Pointer to final \0. */
3715 for (ext = color_ext_list; ext != NULL; ext = ext->next)
3717 if (ext->ext.len <= len
3718 && strncmp (name - ext->ext.len, ext->ext.string,
3725 put_indicator (&color_indicator[C_LEFT]);
3726 put_indicator (ext ? &(ext->seq) : &color_indicator[type]);
3727 put_indicator (&color_indicator[C_RIGHT]);
3730 /* Output a color indicator (which may contain nulls). */
3732 put_indicator (const struct bin_str *ind)
3739 for (i = ind->len; i != 0; --i)
3744 length_of_file_name_and_frills (const struct fileinfo *f)
3748 char buf[MAX (LONGEST_HUMAN_READABLE + 1, INT_BUFSIZE_BOUND (uintmax_t))];
3751 len += 1 + (format == with_commas
3752 ? strlen (umaxtostr (f->stat.st_ino, buf))
3753 : inode_number_width);
3755 if (print_block_size)
3756 len += 1 + (format == with_commas
3757 ? strlen (human_readable (ST_NBLOCKS (f->stat), buf,
3758 human_output_opts, ST_NBLOCKSIZE,
3760 : block_size_width);
3762 quote_name (NULL, f->name, filename_quoting_options, &name_width);
3765 if (indicator_style != none)
3767 mode_t mode = f->stat.st_mode;
3769 len += (S_ISREG (mode)
3770 ? (indicator_style == classify && (mode & S_IXUGO))
3772 || (indicator_style != slash
3776 || S_ISDOOR (mode)))));
3783 print_many_per_line (void)
3785 size_t row; /* Current row. */
3786 size_t cols = calculate_columns (true);
3787 struct column_info const *line_fmt = &column_info[cols - 1];
3789 /* Calculate the number of rows that will be in each column except possibly
3790 for a short column on the right. */
3791 size_t rows = files_index / cols + (files_index % cols != 0);
3793 for (row = 0; row < rows; row++)
3796 size_t filesno = row;
3799 /* Print the next row. */
3802 size_t name_length = length_of_file_name_and_frills (files + filesno);
3803 size_t max_name_length = line_fmt->col_arr[col++];
3804 print_file_name_and_frills (files + filesno);
3807 if (filesno >= files_index)
3810 indent (pos + name_length, pos + max_name_length);
3811 pos += max_name_length;
3818 print_horizontal (void)
3822 size_t cols = calculate_columns (false);
3823 struct column_info const *line_fmt = &column_info[cols - 1];
3824 size_t name_length = length_of_file_name_and_frills (files);
3825 size_t max_name_length = line_fmt->col_arr[0];
3827 /* Print first entry. */
3828 print_file_name_and_frills (files);
3831 for (filesno = 1; filesno < files_index; ++filesno)
3833 size_t col = filesno % cols;
3842 indent (pos + name_length, pos + max_name_length);
3843 pos += max_name_length;
3846 print_file_name_and_frills (files + filesno);
3848 name_length = length_of_file_name_and_frills (files + filesno);
3849 max_name_length = line_fmt->col_arr[col];
3855 print_with_commas (void)
3860 for (filesno = 0; filesno < files_index; filesno++)
3862 size_t len = length_of_file_name_and_frills (files + filesno);
3868 if (pos + len + 2 < line_length)
3880 putchar (separator);
3883 print_file_name_and_frills (files + filesno);
3889 /* Assuming cursor is at position FROM, indent up to position TO.
3890 Use a TAB character instead of two or more spaces whenever possible. */
3893 indent (size_t from, size_t to)
3897 if (tabsize != 0 && to / tabsize > (from + 1) / tabsize)
3900 from += tabsize - from % tabsize;
3910 /* Put DIRNAME/NAME into DEST, handling `.' and `/' properly. */
3911 /* FIXME: maybe remove this function someday. See about using a
3912 non-malloc'ing version of file_name_concat. */
3915 attach (char *dest, const char *dirname, const char *name)
3917 const char *dirnamep = dirname;
3919 /* Copy dirname if it is not ".". */
3920 if (dirname[0] != '.' || dirname[1] != 0)
3923 *dest++ = *dirnamep++;
3924 /* Add '/' if `dirname' doesn't already end with it. */
3925 if (dirnamep > dirname && dirnamep[-1] != '/')
3933 /* Allocate enough column info suitable for the current number of
3934 files and display columns, and initialize the info to represent the
3935 narrowest possible columns. */
3938 init_column_info (void)
3941 size_t max_cols = MIN (max_idx, files_index);
3943 /* Currently allocated columns in column_info. */
3944 static size_t column_info_alloc;
3946 if (column_info_alloc < max_cols)
3948 size_t new_column_info_alloc;
3951 if (max_cols < max_idx / 2)
3953 /* The number of columns is far less than the display width
3954 allows. Grow the allocation, but only so that it's
3955 double the current requirements. If the display is
3956 extremely wide, this avoids allocating a lot of memory
3957 that is never needed. */
3958 column_info = xnrealloc (column_info, max_cols,
3959 2 * sizeof *column_info);
3960 new_column_info_alloc = 2 * max_cols;
3964 column_info = xnrealloc (column_info, max_idx, sizeof *column_info);
3965 new_column_info_alloc = max_idx;
3968 /* Allocate the new size_t objects by computing the triangle
3969 formula n * (n + 1) / 2, except that we don't need to
3970 allocate the part of the triangle that we've already
3971 allocated. Check for address arithmetic overflow. */
3973 size_t column_info_growth = new_column_info_alloc - column_info_alloc;
3974 size_t s = column_info_alloc + 1 + new_column_info_alloc;
3975 size_t t = s * column_info_growth;
3976 if (s < new_column_info_alloc || t / column_info_growth != s)
3978 p = xnmalloc (t / 2, sizeof *p);
3981 /* Grow the triangle by parceling out the cells just allocated. */
3982 for (i = column_info_alloc; i < new_column_info_alloc; i++)
3984 column_info[i].col_arr = p;
3988 column_info_alloc = new_column_info_alloc;
3991 for (i = 0; i < max_cols; ++i)
3995 column_info[i].valid_len = true;
3996 column_info[i].line_len = (i + 1) * MIN_COLUMN_WIDTH;
3997 for (j = 0; j <= i; ++j)
3998 column_info[i].col_arr[j] = MIN_COLUMN_WIDTH;
4002 /* Calculate the number of columns needed to represent the current set
4003 of files in the current display width. */
4006 calculate_columns (bool by_columns)
4008 size_t filesno; /* Index into files. */
4009 size_t cols; /* Number of files across. */
4011 /* Normally the maximum number of columns is determined by the
4012 screen width. But if few files are available this might limit it
4014 size_t max_cols = MIN (max_idx, files_index);
4016 init_column_info ();
4018 /* Compute the maximum number of possible columns. */
4019 for (filesno = 0; filesno < files_index; ++filesno)
4021 size_t name_length = length_of_file_name_and_frills (files + filesno);
4024 for (i = 0; i < max_cols; ++i)
4026 if (column_info[i].valid_len)
4028 size_t idx = (by_columns
4029 ? filesno / ((files_index + i) / (i + 1))
4030 : filesno % (i + 1));
4031 size_t real_length = name_length + (idx == i ? 0 : 2);
4033 if (column_info[i].col_arr[idx] < real_length)
4035 column_info[i].line_len += (real_length
4036 - column_info[i].col_arr[idx]);
4037 column_info[i].col_arr[idx] = real_length;
4038 column_info[i].valid_len = (column_info[i].line_len
4045 /* Find maximum allowed columns. */
4046 for (cols = max_cols; 1 < cols; --cols)
4048 if (column_info[cols - 1].valid_len)
4058 if (status != EXIT_SUCCESS)
4059 fprintf (stderr, _("Try `%s --help' for more information.\n"),
4063 printf (_("Usage: %s [OPTION]... [FILE]...\n"), program_name);
4065 List information about the FILEs (the current directory by default).\n\
4066 Sort entries alphabetically if none of -cftuSUX nor --sort.\n\
4070 Mandatory arguments to long options are mandatory for short options too.\n\
4073 -a, --all do not ignore entries starting with .\n\
4074 -A, --almost-all do not list implied . and ..\n\
4075 --author with -l, print the author of each file\n\
4076 -b, --escape print octal escapes for nongraphic characters\n\
4079 --block-size=SIZE use SIZE-byte blocks\n\
4080 -B, --ignore-backups do not list implied entries ending with ~\n\
4081 -c with -lt: sort by, and show, ctime (time of last\n\
4082 modification of file status information)\n\
4083 with -l: show ctime and sort by name\n\
4084 otherwise: sort by ctime\n\
4087 -C list entries by columns\n\
4088 --color[=WHEN] control whether color is used to distinguish file\n\
4089 types. WHEN may be `never', `always', or `auto'\n\
4090 -d, --directory list directory entries instead of contents,\n\
4091 and do not dereference symbolic links\n\
4092 -D, --dired generate output designed for Emacs' dired mode\n\
4095 -f do not sort, enable -aU, disable -lst\n\
4096 -F, --classify append indicator (one of */=>@|) to entries\n\
4097 --file-type likewise, except do not append `*'\n\
4098 --format=WORD across -x, commas -m, horizontal -x, long -l,\n\
4099 single-column -1, verbose -l, vertical -C\n\
4100 --full-time like -l --time-style=full-iso\n\
4103 -g like -l, but do not list owner\n\
4104 -G, --no-group like -l, but do not list group\n\
4105 -h, --human-readable with -l, print sizes in human readable format\n\
4106 (e.g., 1K 234M 2G)\n\
4107 --si likewise, but use powers of 1000 not 1024\n\
4108 -H, --dereference-command-line\n\
4109 follow symbolic links listed on the command line\n\
4110 --dereference-command-line-symlink-to-dir\n\
4111 follow each command line symbolic link\n\
4112 that points to a directory\n\
4113 --hide=PATTERN do not list implied entries matching shell PATTERN\n\
4114 (overridden by -a or -A)\n\
4117 --indicator-style=WORD append indicator with style WORD to entry names:\n\
4118 none (default), slash (-p),\n\
4119 file-type (--file-type), classify (-F)\n\
4120 -i, --inode with -l, print the index number of each file\n\
4121 -I, --ignore=PATTERN do not list implied entries matching shell PATTERN\n\
4122 -k like --block-size=1K\n\
4125 -l use a long listing format\n\
4126 -L, --dereference when showing file information for a symbolic\n\
4127 link, show information for the file the link\n\
4128 references rather than for the link itself\n\
4129 -m fill width with a comma separated list of entries\n\
4132 -n, --numeric-uid-gid like -l, but list numeric user and group IDs\n\
4133 -N, --literal print raw entry names (don't treat e.g. control\n\
4134 characters specially)\n\
4135 -o like -l, but do not list group information\n\
4136 -p, --indicator-style=slash\n\
4137 append / indicator to directories\n\
4140 -q, --hide-control-chars print ? instead of non graphic characters\n\
4141 --show-control-chars show non graphic characters as-is (default\n\
4142 unless program is `ls' and output is a terminal)\n\
4143 -Q, --quote-name enclose entry names in double quotes\n\
4144 --quoting-style=WORD use quoting style WORD for entry names:\n\
4145 literal, locale, shell, shell-always, c, escape\n\
4148 -r, --reverse reverse order while sorting\n\
4149 -R, --recursive list subdirectories recursively\n\
4150 -s, --size with -l, print size of each file, in blocks\n\
4153 -S sort by file size\n\
4154 --sort=WORD extension -X, none -U, size -S, time -t,\n\
4155 version -v, status -c, time -t, atime -u,\n\
4156 access -u, use -u\n\
4157 --time=WORD with -l, show time as WORD instead of modification\n\
4158 time: atime, access, use, ctime or status; use\n\
4159 specified time as sort key if --sort=time\n\
4162 --time-style=STYLE with -l, show times using style STYLE:\n\
4163 full-iso, long-iso, iso, locale, +FORMAT.\n\
4164 FORMAT is interpreted like `date'; if FORMAT is\n\
4165 FORMAT1<newline>FORMAT2, FORMAT1 applies to\n\
4166 non-recent files and FORMAT2 to recent files;\n\
4167 if STYLE is prefixed with `posix-', STYLE\n\
4168 takes effect only outside the POSIX locale\n\
4169 -t sort by modification time\n\
4170 -T, --tabsize=COLS assume tab stops at each COLS instead of 8\n\
4173 -u with -lt: sort by, and show, access time\n\
4174 with -l: show access time and sort by name\n\
4175 otherwise: sort by access time\n\
4176 -U do not sort; list entries in directory order\n\
4177 -v sort by version\n\
4180 -w, --width=COLS assume screen width instead of current value\n\
4181 -x list entries by lines instead of by columns\n\
4182 -X sort alphabetically by entry extension\n\
4183 -1 list one file per line\n\
4185 fputs (HELP_OPTION_DESCRIPTION, stdout);
4186 fputs (VERSION_OPTION_DESCRIPTION, stdout);
4188 SIZE may be (or may be an integer optionally followed by) one of following:\n\
4189 kB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.\n\
4193 By default, color is not used to distinguish types of files. That is\n\
4194 equivalent to using --color=none. Using the --color option without the\n\
4195 optional WHEN argument is equivalent to using --color=always. With\n\
4196 --color=auto, color codes are output only if standard output is connected\n\
4197 to a terminal (tty). The environment variable LS_COLORS can influence the\n\
4198 colors, and can be set easily by the dircolors command.\n\
4202 Exit status is 0 if OK, 1 if minor problems, 2 if serious trouble.\n\
4204 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);