1 /* `dir', `vdir' and `ls' directory listing programs for GNU.
2 Copyright (C) 85, 88, 90, 91, 1995-2006 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>
49 # include <sys/ioctl.h>
52 #ifdef WINSIZE_IN_PTEM
53 # include <sys/stream.h>
54 # include <sys/ptem.h>
65 /* Use SA_NOCLDSTOP as a proxy for whether the sigaction machinery is
68 # define SA_NOCLDSTOP 0
69 # define sigprocmask(How, Set, Oset) /* empty */
71 # if ! HAVE_SIGINTERRUPT
72 # define siginterrupt(sig, flag) /* empty */
76 /* Get mbstate_t, mbrtowc(), mbsinit(), wcwidth(). */
85 #if !defined iswprint && !HAVE_ISWPRINT
86 # define iswprint(wc) 1
89 #ifndef HAVE_DECL_WCWIDTH
90 "this configure-time declaration test was not run"
92 #if !HAVE_DECL_WCWIDTH
96 /* If wcwidth() doesn't exist, assume all printable characters have
100 # define wcwidth(wc) ((wc) == 0 ? 0 : iswprint (wc) ? 1 : -1)
108 #include "argmatch.h"
113 #include "filenamecat.h"
114 #include "hard-locale.h"
117 #include "filemode.h"
118 #include "inttostr.h"
121 #include "mbswidth.h"
124 #include "quotearg.h"
126 #include "stat-time.h"
127 #include "strftime.h"
128 #include "strverscmp.h"
130 #include "xreadlink.h"
132 #define PROGRAM_NAME (ls_mode == LS_LS ? "ls" \
133 : (ls_mode == LS_MULTI_COL \
136 #define AUTHORS "Richard Stallman", "David MacKenzie"
138 #define obstack_chunk_alloc malloc
139 #define obstack_chunk_free free
141 /* Return an int indicating the result of comparing two integers.
142 Subtracting doesn't always work, due to overflow. */
143 #define longdiff(a, b) ((a) < (b) ? -1 : (a) > (b))
145 #if HAVE_STRUCT_DIRENT_D_TYPE && defined DTTOIF
146 # define DT_INIT(Val) = Val
148 # define DT_INIT(Val) /* empty */
151 #if ! HAVE_STRUCT_STAT_ST_AUTHOR
152 # define st_author st_uid
157 unknown DT_INIT (DT_UNKNOWN),
158 fifo DT_INIT (DT_FIFO),
159 chardev DT_INIT (DT_CHR),
160 directory DT_INIT (DT_DIR),
161 blockdev DT_INIT (DT_BLK),
162 normal DT_INIT (DT_REG),
163 symbolic_link DT_INIT (DT_LNK),
164 sock DT_INIT (DT_SOCK),
165 arg_directory DT_INIT (2 * (DT_UNKNOWN | DT_FIFO | DT_CHR | DT_DIR | DT_BLK
166 | DT_REG | DT_LNK | DT_SOCK))
177 /* For symbolic link, name of the file linked to, otherwise zero. */
180 /* For symbolic link and long listing, st_mode of file linked to, otherwise
184 /* For symbolic link and color printing, true if linked-to file
185 exists, otherwise false. */
188 enum filetype filetype;
191 /* For long listings, true if the file has an access control list. */
197 # define FILE_HAS_ACL(F) ((F)->have_acl)
199 # define FILE_HAS_ACL(F) 0
202 #define LEN_STR_PAIR(s) sizeof (s) - 1, s
204 /* Null is a valid character in a color indicator (think about Epson
205 printers, for example) so we have to use a length/buffer string
210 size_t len; /* Number of bytes */
211 const char *string; /* Pointer to the same */
218 # define tcgetpgrp(Fd) 0
221 static size_t quote_name (FILE *out, const char *name,
222 struct quoting_options const *options,
224 static char *make_link_name (char const *name, char const *linkname);
225 static int decode_switches (int argc, char **argv);
226 static bool file_ignored (char const *name);
227 static uintmax_t gobble_file (char const *name, enum filetype type,
228 ino_t inode, bool command_line_arg,
229 char const *dirname);
230 static void print_color_indicator (const char *name, mode_t mode, int linkok,
232 static void put_indicator (const struct bin_str *ind);
233 static void add_ignore_pattern (const char *pattern);
234 static void attach (char *dest, const char *dirname, const char *name);
235 static void clear_files (void);
236 static void extract_dirs_from_files (char const *dirname,
237 bool command_line_arg);
238 static void get_link_name (char const *filename, struct fileinfo *f,
239 bool command_line_arg);
240 static void indent (size_t from, size_t to);
241 static size_t calculate_columns (bool by_columns);
242 static void print_current_files (void);
243 static void print_dir (char const *name, char const *realname,
244 bool command_line_arg);
245 static void print_file_name_and_frills (const struct fileinfo *f);
246 static void print_horizontal (void);
247 static int format_user_width (uid_t u);
248 static int format_group_width (gid_t g);
249 static void print_long_format (const struct fileinfo *f);
250 static void print_many_per_line (void);
251 static void print_name_with_quoting (const char *p, mode_t mode,
252 int linkok, bool stat_failed,
253 struct obstack *stack);
254 static void prep_non_filename_text (void);
255 static void print_type_indicator (mode_t mode);
256 static void print_with_commas (void);
257 static void queue_directory (char const *name, char const *realname,
258 bool command_line_arg);
259 static void sort_files (void);
260 static void parse_ls_color (void);
261 void usage (int status);
263 /* The name this program was run with. */
266 /* Initial size of hash table.
267 Most hierarchies are likely to be shallower than this. */
268 #define INITIAL_TABLE_SIZE 30
270 /* The set of `active' directories, from the current command-line argument
271 to the level in the hierarchy at which files are being listed.
272 A directory is represented by its device and inode numbers (struct dev_ino).
273 A directory is added to this set when ls begins listing it or its
274 entries, and it is removed from the set just after ls has finished
275 processing it. This set is used solely to detect loops, e.g., with
276 mkdir loop; cd loop; ln -s ../loop sub; ls -RL */
277 static Hash_table *active_dir_set;
279 #define LOOP_DETECT (!!active_dir_set)
281 /* The table of files in the current directory:
283 `files' points to a vector of `struct fileinfo', one per file.
284 `nfiles' is the number of elements space has been allocated for.
285 `files_index' is the number actually in use. */
287 /* Address of block containing the files that are described. */
288 static struct fileinfo *files; /* FIXME: rename this to e.g. cwd_file */
290 /* Length of block that `files' points to, measured in files. */
291 static size_t nfiles; /* FIXME: rename this to e.g. cwd_n_alloc */
293 /* Index of first unused in `files'. */
294 static size_t files_index; /* FIXME: rename this to e.g. cwd_n_used */
296 /* When true, in a color listing, color each symlink name according to the
297 type of file it points to. Otherwise, color them according to the `ln'
298 directive in LS_COLORS. Dangling (orphan) symlinks are treated specially,
299 regardless. This is set when `ln=target' appears in LS_COLORS. */
301 static bool color_symlink_as_referent;
303 /* mode of appropriate file for colorization */
304 #define FILE_OR_LINK_MODE(File) \
305 ((color_symlink_as_referent & (File)->linkok) \
306 ? (File)->linkmode : (File)->stat.st_mode)
309 /* Record of one pending directory waiting to be listed. */
314 /* If the directory is actually the file pointed to by a symbolic link we
315 were told to list, `realname' will contain the name of the symbolic
316 link, otherwise zero. */
318 bool command_line_arg;
319 struct pending *next;
322 static struct pending *pending_dirs;
324 /* Current time in seconds and nanoseconds since 1970, updated as
325 needed when deciding whether a file is recent. */
327 static time_t current_time = TYPE_MINIMUM (time_t);
328 static int current_time_ns = -1;
330 /* Whether any of the files has an ACL. This affects the width of the
334 static bool any_has_acl;
336 enum { any_has_acl = false };
339 /* The number of columns to use for columns containing inode numbers,
340 block sizes, link counts, owners, groups, authors, major device
341 numbers, minor device numbers, and file sizes, respectively. */
343 static int inode_number_width;
344 static int block_size_width;
345 static int nlink_width;
346 static int owner_width;
347 static int group_width;
348 static int author_width;
349 static int major_device_number_width;
350 static int minor_device_number_width;
351 static int file_size_width;
355 /* long_format for lots of info, one per line.
356 one_per_line for just names, one per line.
357 many_per_line for just names, many per line, sorted vertically.
358 horizontal for just names, many per line, sorted horizontally.
359 with_commas for just names, many per line, separated by commas.
361 -l (and other options that imply -l), -1, -C, -x and -m control
366 long_format, /* -l and other options that imply -l */
367 one_per_line, /* -1 */
368 many_per_line, /* -C */
373 static enum format format;
375 /* `full-iso' uses full ISO-style dates and times. `long-iso' uses longer
376 ISO-style time stamps, though shorter than `full-iso'. `iso' uses shorter
377 ISO-style time stamps. `locale' uses locale-dependent time stamps. */
380 full_iso_time_style, /* --time-style=full-iso */
381 long_iso_time_style, /* --time-style=long-iso */
382 iso_time_style, /* --time-style=iso */
383 locale_time_style /* --time-style=locale */
386 static char const *const time_style_args[] =
388 "full-iso", "long-iso", "iso", "locale", NULL
390 static enum time_style const time_style_types[] =
392 full_iso_time_style, long_iso_time_style, iso_time_style,
395 ARGMATCH_VERIFY (time_style_args, time_style_types);
397 /* Type of time to print or sort by. Controlled by -c and -u.
398 The values of each item of this enum are important since they are
399 used as indices in the sort functions array (see sort_files()). */
403 time_mtime, /* default */
406 time_numtypes /* the number of elements of this enum */
409 static enum time_type time_type;
411 /* The file characteristic to sort by. Controlled by -t, -S, -U, -X, -v.
412 The values of each item of this enum are important since they are
413 used as indices in the sort functions array (see sort_files()). */
417 sort_none = -1, /* -U */
418 sort_name, /* default */
419 sort_extension, /* -X */
421 sort_version, /* -v */
423 sort_numtypes /* the number of elements of this enum */
426 static enum sort_type sort_type;
428 /* Direction of sort.
429 false means highest first if numeric,
430 lowest first if alphabetic;
431 these are the defaults.
432 true means the opposite order in each case. -r */
434 static bool sort_reverse;
436 /* True means to display owner information. -g turns this off. */
438 static bool print_owner = true;
440 /* True means to display author information. */
442 static bool print_author;
444 /* True means to display group information. -G and -o turn this off. */
446 static bool print_group = true;
448 /* True means print the user and group id's as numbers rather
451 static bool numeric_ids;
453 /* True means mention the size in blocks of each file. -s */
455 static bool print_block_size;
457 /* Human-readable options for output. */
458 static int human_output_opts;
460 /* The units to use when printing sizes other than file sizes. */
461 static uintmax_t output_block_size;
463 /* Likewise, but for file sizes. */
464 static uintmax_t file_output_block_size = 1;
466 /* Follow the output with a special string. Using this format,
467 Emacs' dired mode starts up twice as fast, and can handle all
468 strange characters in file names. */
471 /* `none' means don't mention the type of files.
472 `slash' means mention directories only, with a '/'.
473 `file_type' means mention file types.
474 `classify' means mention file types and mark executables.
476 Controlled by -F, -p, and --indicator-style. */
480 none, /* --indicator-style=none */
481 slash, /* -p, --indicator-style=slash */
482 file_type, /* --indicator-style=file-type */
483 classify /* -F, --indicator-style=classify */
486 static enum indicator_style indicator_style;
488 /* Names of indicator styles. */
489 static char const *const indicator_style_args[] =
491 "none", "slash", "file-type", "classify", NULL
493 static enum indicator_style const indicator_style_types[] =
495 none, slash, file_type, classify
497 ARGMATCH_VERIFY (indicator_style_args, indicator_style_types);
499 /* True means use colors to mark types. Also define the different
500 colors as well as the stuff for the LS_COLORS environment variable.
501 The LS_COLORS variable is now in a termcap-like format. */
503 static bool print_with_color;
507 color_never, /* 0: default or --color=never */
508 color_always, /* 1: --color=always */
509 color_if_tty /* 2: --color=tty */
512 enum Dereference_symlink
516 DEREF_COMMAND_LINE_ARGUMENTS, /* -H */
517 DEREF_COMMAND_LINE_SYMLINK_TO_DIR, /* the default, in certain cases */
518 DEREF_ALWAYS /* -L */
523 C_LEFT, C_RIGHT, C_END, C_NORM, C_FILE, C_DIR, C_LINK, C_FIFO, C_SOCK,
524 C_BLK, C_CHR, C_MISSING, C_ORPHAN, C_EXEC, C_DOOR, C_SETUID, C_SETGID,
525 C_STICKY, C_OTHER_WRITABLE, C_STICKY_OTHER_WRITABLE
528 static const char *const indicator_name[]=
530 "lc", "rc", "ec", "no", "fi", "di", "ln", "pi", "so",
531 "bd", "cd", "mi", "or", "ex", "do", "su", "sg", "st",
535 struct color_ext_type
537 struct bin_str ext; /* The extension we're looking for */
538 struct bin_str seq; /* The sequence to output when we do */
539 struct color_ext_type *next; /* Next in list */
542 static struct bin_str color_indicator[] =
544 { LEN_STR_PAIR ("\033[") }, /* lc: Left of color sequence */
545 { LEN_STR_PAIR ("m") }, /* rc: Right of color sequence */
546 { 0, NULL }, /* ec: End color (replaces lc+no+rc) */
547 { LEN_STR_PAIR ("0") }, /* no: Normal */
548 { LEN_STR_PAIR ("0") }, /* fi: File: default */
549 { LEN_STR_PAIR ("01;34") }, /* di: Directory: bright blue */
550 { LEN_STR_PAIR ("01;36") }, /* ln: Symlink: bright cyan */
551 { LEN_STR_PAIR ("33") }, /* pi: Pipe: yellow/brown */
552 { LEN_STR_PAIR ("01;35") }, /* so: Socket: bright magenta */
553 { LEN_STR_PAIR ("01;33") }, /* bd: Block device: bright yellow */
554 { LEN_STR_PAIR ("01;33") }, /* cd: Char device: bright yellow */
555 { 0, NULL }, /* mi: Missing file: undefined */
556 { 0, NULL }, /* or: Orphaned symlink: undefined */
557 { LEN_STR_PAIR ("01;32") }, /* ex: Executable: bright green */
558 { LEN_STR_PAIR ("01;35") }, /* do: Door: bright magenta */
559 { LEN_STR_PAIR ("37;41") }, /* su: setuid: white on red */
560 { LEN_STR_PAIR ("30;43") }, /* sg: setgid: black on yellow */
561 { LEN_STR_PAIR ("37;44") }, /* st: sticky: black on blue */
562 { LEN_STR_PAIR ("34;42") }, /* ow: other-writable: blue on green */
563 { LEN_STR_PAIR ("30;42") }, /* tw: ow w/ sticky: black on green */
567 static struct color_ext_type *color_ext_list = NULL;
569 /* Buffer for color sequences */
570 static char *color_buf;
572 /* True means to check for orphaned symbolic link, for displaying
575 static bool check_symlink_color;
577 /* True means mention the inode number of each file. -i */
579 static bool print_inode;
581 /* What to do with symbolic links. Affected by -d, -F, -H, -l (and
582 other options that imply -l), and -L. */
584 static enum Dereference_symlink dereference;
586 /* True means when a directory is found, display info on its
589 static bool recursive;
591 /* True means when an argument is a directory name, display info
594 static bool immediate_dirs;
596 /* True means that directories are grouped before files. */
598 static bool directories_first;
600 /* Which files to ignore. */
604 /* Ignore files whose names start with `.', and files specified by
605 --hide and --ignore. */
608 /* Ignore `.', `..', and files specified by --ignore. */
609 IGNORE_DOT_AND_DOTDOT,
611 /* Ignore only files specified by --ignore. */
615 /* A linked list of shell-style globbing patterns. If a non-argument
616 file name matches any of these patterns, it is ignored.
617 Controlled by -I. Multiple -I options accumulate.
618 The -B option adds `*~' and `.*~' to this list. */
620 struct ignore_pattern
623 struct ignore_pattern *next;
626 static struct ignore_pattern *ignore_patterns;
628 /* Similar to IGNORE_PATTERNS, except that -a or -A causes this
629 variable itself to be ignored. */
630 static struct ignore_pattern *hide_patterns;
632 /* True means output nongraphic chars in file names as `?'.
633 (-q, --hide-control-chars)
634 qmark_funny_chars and the quoting style (-Q, --quoting-style=WORD) are
635 independent. The algorithm is: first, obey the quoting style to get a
636 string representing the file name; then, if qmark_funny_chars is set,
637 replace all nonprintable chars in that string with `?'. It's necessary
638 to replace nonprintable chars even in quoted strings, because we don't
639 want to mess up the terminal if control chars get sent to it, and some
640 quoting methods pass through control chars as-is. */
641 static bool qmark_funny_chars;
643 /* Quoting options for file and dir name output. */
645 static struct quoting_options *filename_quoting_options;
646 static struct quoting_options *dirname_quoting_options;
648 /* The number of chars per hardware tab stop. Setting this to zero
649 inhibits the use of TAB characters for separating columns. -T */
650 static size_t tabsize;
652 /* True means print each directory name before listing it. */
654 static bool print_dir_name;
656 /* The line length to use for breaking lines in many-per-line format.
657 Can be set with -w. */
659 static size_t line_length;
661 /* If true, the file listing format requires that stat be called on
664 static bool format_needs_stat;
666 /* Similar to `format_needs_stat', but set if only the file type is
669 static bool format_needs_type;
671 /* An arbitrary limit on the number of bytes in a printed time stamp.
672 This is set to a relatively small value to avoid the need to worry
673 about denial-of-service attacks on servers that run "ls" on behalf
674 of remote clients. 1000 bytes should be enough for any practical
675 time stamp format. */
677 enum { TIME_STAMP_LEN_MAXIMUM = MAX (1000, INT_STRLEN_BOUND (time_t)) };
679 /* strftime formats for non-recent and recent files, respectively, in
682 static char const *long_time_format[2] =
684 /* strftime format for non-recent files (older than 6 months), in
685 -l output. This should contain the year, month and day (at
686 least), in an order that is understood by people in your
687 locale's territory. Please try to keep the number of used
688 screen columns small, because many people work in windows with
689 only 80 columns. But make this as wide as the other string
690 below, for recent files. */
692 /* strftime format for recent files (younger than 6 months), in -l
693 output. This should contain the month, day and time (at
694 least), in an order that is understood by people in your
695 locale's territory. Please try to keep the number of used
696 screen columns small, because many people work in windows with
697 only 80 columns. But make this as wide as the other string
698 above, for non-recent files. */
702 /* The set of signals that are caught. */
704 static sigset_t caught_signals;
706 /* If nonzero, the value of the pending fatal signal. */
708 static sig_atomic_t volatile interrupt_signal;
710 /* A count of the number of pending stop signals that have been received. */
712 static sig_atomic_t volatile stop_signal_count;
714 /* Desired exit status. */
716 static int exit_status;
721 /* "ls" had a minor problem (e.g., it could not stat a directory
723 LS_MINOR_PROBLEM = 1,
725 /* "ls" had more serious trouble. */
729 /* For long options that have no equivalent short option, use a
730 non-character as a pseudo short option, starting with CHAR_MAX + 1. */
733 AUTHOR_OPTION = CHAR_MAX + 1,
736 DEREFERENCE_COMMAND_LINE_SYMLINK_TO_DIR_OPTION,
737 FILE_TYPE_INDICATOR_OPTION,
740 GROUP_DIRECTORIES_FIRST_OPTION,
742 INDICATOR_STYLE_OPTION,
744 /* FIXME: --kilobytes is deprecated (but not -k); remove in late 2006 */
745 KILOBYTES_LONG_OPTION,
747 QUOTING_STYLE_OPTION,
748 SHOW_CONTROL_CHARS_OPTION,
755 static struct option const long_options[] =
757 {"all", no_argument, NULL, 'a'},
758 {"escape", no_argument, NULL, 'b'},
759 {"directory", no_argument, NULL, 'd'},
760 {"dired", no_argument, NULL, 'D'},
761 {"full-time", no_argument, NULL, FULL_TIME_OPTION},
762 {"group-directories-first", no_argument, NULL,
763 GROUP_DIRECTORIES_FIRST_OPTION},
764 {"human-readable", no_argument, NULL, 'h'},
765 {"inode", no_argument, NULL, 'i'},
766 {"kilobytes", no_argument, NULL, KILOBYTES_LONG_OPTION},
767 {"numeric-uid-gid", no_argument, NULL, 'n'},
768 {"no-group", no_argument, NULL, 'G'},
769 {"hide-control-chars", no_argument, NULL, 'q'},
770 {"reverse", no_argument, NULL, 'r'},
771 {"size", no_argument, NULL, 's'},
772 {"width", required_argument, NULL, 'w'},
773 {"almost-all", no_argument, NULL, 'A'},
774 {"ignore-backups", no_argument, NULL, 'B'},
775 {"classify", no_argument, NULL, 'F'},
776 {"file-type", no_argument, NULL, FILE_TYPE_INDICATOR_OPTION},
777 {"si", no_argument, NULL, SI_OPTION},
778 {"dereference-command-line", no_argument, NULL, 'H'},
779 {"dereference-command-line-symlink-to-dir", no_argument, NULL,
780 DEREFERENCE_COMMAND_LINE_SYMLINK_TO_DIR_OPTION},
781 {"hide", required_argument, NULL, HIDE_OPTION},
782 {"ignore", required_argument, NULL, 'I'},
783 {"indicator-style", required_argument, NULL, INDICATOR_STYLE_OPTION},
784 {"dereference", no_argument, NULL, 'L'},
785 {"literal", no_argument, NULL, 'N'},
786 {"quote-name", no_argument, NULL, 'Q'},
787 {"quoting-style", required_argument, NULL, QUOTING_STYLE_OPTION},
788 {"recursive", no_argument, NULL, 'R'},
789 {"format", required_argument, NULL, FORMAT_OPTION},
790 {"show-control-chars", no_argument, NULL, SHOW_CONTROL_CHARS_OPTION},
791 {"sort", required_argument, NULL, SORT_OPTION},
792 {"tabsize", required_argument, NULL, 'T'},
793 {"time", required_argument, NULL, TIME_OPTION},
794 {"time-style", required_argument, NULL, TIME_STYLE_OPTION},
795 {"color", optional_argument, NULL, COLOR_OPTION},
796 {"block-size", required_argument, NULL, BLOCK_SIZE_OPTION},
797 {"author", no_argument, NULL, AUTHOR_OPTION},
798 {GETOPT_HELP_OPTION_DECL},
799 {GETOPT_VERSION_OPTION_DECL},
803 static char const *const format_args[] =
805 "verbose", "long", "commas", "horizontal", "across",
806 "vertical", "single-column", NULL
808 static enum format const format_types[] =
810 long_format, long_format, with_commas, horizontal, horizontal,
811 many_per_line, one_per_line
813 ARGMATCH_VERIFY (format_args, format_types);
815 static char const *const sort_args[] =
817 "none", "time", "size", "extension", "version", NULL
819 static enum sort_type const sort_types[] =
821 sort_none, sort_time, sort_size, sort_extension, sort_version
823 ARGMATCH_VERIFY (sort_args, sort_types);
825 static char const *const time_args[] =
827 "atime", "access", "use", "ctime", "status", NULL
829 static enum time_type const time_types[] =
831 time_atime, time_atime, time_atime, time_ctime, time_ctime
833 ARGMATCH_VERIFY (time_args, time_types);
835 static char const *const color_args[] =
837 /* force and none are for compatibility with another color-ls version */
838 "always", "yes", "force",
839 "never", "no", "none",
840 "auto", "tty", "if-tty", NULL
842 static enum color_type const color_types[] =
844 color_always, color_always, color_always,
845 color_never, color_never, color_never,
846 color_if_tty, color_if_tty, color_if_tty
848 ARGMATCH_VERIFY (color_args, color_types);
850 /* Information about filling a column. */
858 /* Array with information about column filledness. */
859 static struct column_info *column_info;
861 /* Maximum number of columns ever possible for this display. */
862 static size_t max_idx;
864 /* The minimum width of a column is 3: 1 character for the name and 2
865 for the separating white space. */
866 #define MIN_COLUMN_WIDTH 3
869 /* This zero-based index is used solely with the --dired option.
870 When that option is in effect, this counter is incremented for each
871 byte of output generated by this program so that the beginning
872 and ending indices (in that output) of every file name can be recorded
873 and later output themselves. */
874 static size_t dired_pos;
876 #define DIRED_PUTCHAR(c) do {putchar ((c)); ++dired_pos;} while (0)
878 /* Write S to STREAM and increment DIRED_POS by S_LEN. */
879 #define DIRED_FPUTS(s, stream, s_len) \
880 do {fputs ((s), (stream)); dired_pos += s_len;} while (0)
882 /* Like DIRED_FPUTS, but for use when S is a literal string. */
883 #define DIRED_FPUTS_LITERAL(s, stream) \
884 do {fputs ((s), (stream)); dired_pos += sizeof((s)) - 1;} while (0)
886 #define DIRED_INDENT() \
890 DIRED_FPUTS_LITERAL (" ", stdout); \
894 /* With --dired, store pairs of beginning and ending indices of filenames. */
895 static struct obstack dired_obstack;
897 /* With --dired, store pairs of beginning and ending indices of any
898 directory names that appear as headers (just before `total' line)
899 for lists of directory entries. Such directory names are seen when
900 listing hierarchies using -R and when a directory is listed with at
901 least one other command line argument. */
902 static struct obstack subdired_obstack;
904 /* Save the current index on the specified obstack, OBS. */
905 #define PUSH_CURRENT_DIRED_POS(obs) \
909 obstack_grow ((obs), &dired_pos, sizeof (dired_pos)); \
913 /* With -R, this stack is used to help detect directory cycles.
914 The device/inode pairs on this stack mirror the pairs in the
915 active_dir_set hash table. */
916 static struct obstack dev_ino_obstack;
918 /* Push a pair onto the device/inode stack. */
919 #define DEV_INO_PUSH(Dev, Ino) \
922 struct dev_ino *di; \
923 obstack_blank (&dev_ino_obstack, sizeof (struct dev_ino)); \
924 di = -1 + (struct dev_ino *) obstack_next_free (&dev_ino_obstack); \
925 di->st_dev = (Dev); \
926 di->st_ino = (Ino); \
930 /* Pop a dev/ino struct off the global dev_ino_obstack
931 and return that struct. */
932 static struct dev_ino
935 assert (sizeof (struct dev_ino) <= obstack_object_size (&dev_ino_obstack));
936 obstack_blank (&dev_ino_obstack, -(int) (sizeof (struct dev_ino)));
937 return *(struct dev_ino*) obstack_next_free (&dev_ino_obstack);
940 #define ASSERT_MATCHING_DEV_INO(Name, Di) \
945 assert (0 <= stat (Name, &sb)); \
946 assert (sb.st_dev == Di.st_dev); \
947 assert (sb.st_ino == Di.st_ino); \
952 /* Write to standard output PREFIX, followed by the quoting style and
953 a space-separated list of the integers stored in OS all on one line. */
956 dired_dump_obstack (const char *prefix, struct obstack *os)
960 n_pos = obstack_object_size (os) / sizeof (dired_pos);
966 pos = (size_t *) obstack_finish (os);
967 fputs (prefix, stdout);
968 for (i = 0; i < n_pos; i++)
969 printf (" %lu", (unsigned long int) pos[i]);
975 dev_ino_hash (void const *x, size_t table_size)
977 struct dev_ino const *p = x;
978 return (uintmax_t) p->st_ino % table_size;
982 dev_ino_compare (void const *x, void const *y)
984 struct dev_ino const *a = x;
985 struct dev_ino const *b = y;
986 return SAME_INODE (*a, *b) ? true : false;
990 dev_ino_free (void *x)
995 /* Add the device/inode pair (P->st_dev/P->st_ino) to the set of
996 active directories. Return true if there is already a matching
997 entry in the table. */
1000 visit_dir (dev_t dev, ino_t ino)
1002 struct dev_ino *ent;
1003 struct dev_ino *ent_from_table;
1006 ent = xmalloc (sizeof *ent);
1010 /* Attempt to insert this entry into the table. */
1011 ent_from_table = hash_insert (active_dir_set, ent);
1013 if (ent_from_table == NULL)
1015 /* Insertion failed due to lack of memory. */
1019 found_match = (ent_from_table != ent);
1023 /* ent was not inserted, so free it. */
1031 free_pending_ent (struct pending *p)
1039 is_colored (enum indicator_no type)
1041 size_t len = color_indicator[type].len;
1042 char const *s = color_indicator[type].string;
1044 || (len == 1 && strncmp (s, "0", 1) == 0)
1045 || (len == 2 && strncmp (s, "00", 2) == 0));
1049 restore_default_color (void)
1051 put_indicator (&color_indicator[C_LEFT]);
1052 put_indicator (&color_indicator[C_RIGHT]);
1055 /* An ordinary signal was received; arrange for the program to exit. */
1058 sighandler (int sig)
1061 signal (sig, SIG_IGN);
1062 if (! interrupt_signal)
1063 interrupt_signal = sig;
1066 /* A SIGTSTP was received; arrange for the program to suspend itself. */
1069 stophandler (int sig)
1072 signal (sig, stophandler);
1073 if (! interrupt_signal)
1074 stop_signal_count++;
1077 /* Process any pending signals. If signals are caught, this function
1078 should be called periodically. Ideally there should never be an
1079 unbounded amount of time when signals are not being processed.
1080 Signal handling can restore the default colors, so callers must
1081 immediately change colors after invoking this function. */
1084 process_signals (void)
1086 while (interrupt_signal | stop_signal_count)
1092 restore_default_color ();
1095 sigprocmask (SIG_BLOCK, &caught_signals, &oldset);
1097 /* Reload interrupt_signal and stop_signal_count, in case a new
1098 signal was handled before sigprocmask took effect. */
1099 sig = interrupt_signal;
1100 stops = stop_signal_count;
1102 /* SIGTSTP is special, since the application can receive that signal
1103 more than once. In this case, don't set the signal handler to the
1104 default. Instead, just raise the uncatchable SIGSTOP. */
1107 stop_signal_count = stops - 1;
1111 signal (sig, SIG_DFL);
1113 /* Exit or suspend the program. */
1115 sigprocmask (SIG_SETMASK, &oldset, NULL);
1117 /* If execution reaches here, then the program has been
1118 continued (after being suspended). */
1123 main (int argc, char **argv)
1126 struct pending *thispend;
1129 /* The signals that are trapped, and the number of such signals. */
1130 static int const sig[] = { SIGHUP, SIGINT, SIGPIPE,
1131 SIGQUIT, SIGTERM, SIGTSTP };
1132 enum { nsigs = sizeof sig / sizeof sig[0] };
1135 bool caught_sig[nsigs];
1138 initialize_main (&argc, &argv);
1139 program_name = argv[0];
1140 setlocale (LC_ALL, "");
1141 bindtextdomain (PACKAGE, LOCALEDIR);
1142 textdomain (PACKAGE);
1144 initialize_exit_failure (LS_FAILURE);
1145 atexit (close_stdout);
1147 #define N_ENTRIES(Array) (sizeof Array / sizeof *(Array))
1148 assert (N_ENTRIES (color_indicator) + 1 == N_ENTRIES (indicator_name));
1150 exit_status = EXIT_SUCCESS;
1151 print_dir_name = true;
1152 pending_dirs = NULL;
1154 i = decode_switches (argc, argv);
1156 if (print_with_color)
1159 /* Test print_with_color again, because the call to parse_ls_color
1160 may have just reset it -- e.g., if LS_COLORS is invalid. */
1161 if (print_with_color)
1163 /* Avoid following symbolic links when possible. */
1164 if (is_colored (C_ORPHAN)
1165 || is_colored (C_EXEC)
1166 || (is_colored (C_MISSING) && format == long_format))
1167 check_symlink_color = true;
1169 /* If the standard output is a controlling terminal, watch out
1170 for signals, so that the colors can be restored to the
1171 default state if "ls" is suspended or interrupted. */
1173 if (0 <= tcgetpgrp (STDOUT_FILENO))
1177 struct sigaction act;
1179 sigemptyset (&caught_signals);
1180 for (j = 0; j < nsigs; j++)
1182 sigaction (sig[j], NULL, &act);
1183 if (act.sa_handler != SIG_IGN)
1184 sigaddset (&caught_signals, sig[j]);
1187 act.sa_mask = caught_signals;
1188 act.sa_flags = SA_RESTART;
1190 for (j = 0; j < nsigs; j++)
1191 if (sigismember (&caught_signals, sig[j]))
1193 act.sa_handler = sig[j] == SIGTSTP ? stophandler : sighandler;
1194 sigaction (sig[j], &act, NULL);
1197 for (j = 0; j < nsigs; j++)
1199 caught_sig[j] = (signal (sig[j], SIG_IGN) != SIG_IGN);
1202 signal (sig[j], sig[j] == SIGTSTP ? stophandler : sighandler);
1203 siginterrupt (sig[j], 0);
1209 prep_non_filename_text ();
1212 if (dereference == DEREF_UNDEFINED)
1213 dereference = ((immediate_dirs
1214 || indicator_style == classify
1215 || format == long_format)
1217 : DEREF_COMMAND_LINE_SYMLINK_TO_DIR);
1219 /* When using -R, initialize a data structure we'll use to
1220 detect any directory cycles. */
1223 active_dir_set = hash_initialize (INITIAL_TABLE_SIZE, NULL,
1227 if (active_dir_set == NULL)
1230 obstack_init (&dev_ino_obstack);
1233 format_needs_stat = sort_type == sort_time || sort_type == sort_size
1234 || format == long_format
1235 || print_block_size;
1236 format_needs_type = (! format_needs_stat
1239 || indicator_style != none
1240 || directories_first));
1244 obstack_init (&dired_obstack);
1245 obstack_init (&subdired_obstack);
1249 files = xnmalloc (nfiles, sizeof *files);
1259 gobble_file (".", directory, NOT_AN_INODE_NUMBER, true, "");
1261 queue_directory (".", NULL, true);
1265 gobble_file (argv[i++], unknown, NOT_AN_INODE_NUMBER, true, "");
1271 if (!immediate_dirs)
1272 extract_dirs_from_files (NULL, true);
1273 /* `files_index' might be zero now. */
1276 /* In the following if/else blocks, it is sufficient to test `pending_dirs'
1277 (and not pending_dirs->name) because there may be no markers in the queue
1278 at this point. A marker may be enqueued when extract_dirs_from_files is
1279 called with a non-empty string or via print_dir. */
1282 print_current_files ();
1284 DIRED_PUTCHAR ('\n');
1286 else if (n_files <= 1 && pending_dirs && pending_dirs->next == 0)
1287 print_dir_name = false;
1289 while (pending_dirs)
1291 thispend = pending_dirs;
1292 pending_dirs = pending_dirs->next;
1296 if (thispend->name == NULL)
1298 /* thispend->name == NULL means this is a marker entry
1299 indicating we've finished processing the directory.
1300 Use its dev/ino numbers to remove the corresponding
1301 entry from the active_dir_set hash table. */
1302 struct dev_ino di = dev_ino_pop ();
1303 struct dev_ino *found = hash_delete (active_dir_set, &di);
1304 /* ASSERT_MATCHING_DEV_INO (thispend->realname, di); */
1306 dev_ino_free (found);
1307 free_pending_ent (thispend);
1312 print_dir (thispend->name, thispend->realname,
1313 thispend->command_line_arg);
1315 free_pending_ent (thispend);
1316 print_dir_name = true;
1319 if (print_with_color)
1323 restore_default_color ();
1326 /* Restore the default signal handling. */
1328 for (j = 0; j < nsigs; j++)
1329 if (sigismember (&caught_signals, sig[j]))
1330 signal (sig[j], SIG_DFL);
1332 for (j = 0; j < nsigs; j++)
1334 signal (sig[j], SIG_DFL);
1337 /* Act on any signals that arrived before the default was restored.
1338 This can process signals out of order, but there doesn't seem to
1339 be an easy way to do them in order, and the order isn't that
1340 important anyway. */
1341 for (j = stop_signal_count; j; j--)
1343 j = interrupt_signal;
1350 /* No need to free these since we're about to exit. */
1351 dired_dump_obstack ("//DIRED//", &dired_obstack);
1352 dired_dump_obstack ("//SUBDIRED//", &subdired_obstack);
1353 printf ("//DIRED-OPTIONS// --quoting-style=%s\n",
1354 quoting_style_args[get_quoting_style (filename_quoting_options)]);
1359 assert (hash_get_n_entries (active_dir_set) == 0);
1360 hash_free (active_dir_set);
1366 /* Set all the option flags according to the switches specified.
1367 Return the index of the first non-option argument. */
1370 decode_switches (int argc, char **argv)
1373 char *time_style_option = NULL;
1375 /* Record whether there is an option specifying sort type. */
1376 bool sort_type_specified = false;
1378 qmark_funny_chars = false;
1380 /* initialize all switches to default settings */
1385 /* This is for the `dir' program. */
1386 format = many_per_line;
1387 set_quoting_style (NULL, escape_quoting_style);
1390 case LS_LONG_FORMAT:
1391 /* This is for the `vdir' program. */
1392 format = long_format;
1393 set_quoting_style (NULL, escape_quoting_style);
1397 /* This is for the `ls' program. */
1398 if (isatty (STDOUT_FILENO))
1400 format = many_per_line;
1401 /* See description of qmark_funny_chars, above. */
1402 qmark_funny_chars = true;
1406 format = one_per_line;
1407 qmark_funny_chars = false;
1415 time_type = time_mtime;
1416 sort_type = sort_name;
1417 sort_reverse = false;
1418 numeric_ids = false;
1419 print_block_size = false;
1420 indicator_style = none;
1421 print_inode = false;
1422 dereference = DEREF_UNDEFINED;
1424 immediate_dirs = false;
1425 ignore_mode = IGNORE_DEFAULT;
1426 ignore_patterns = NULL;
1427 hide_patterns = NULL;
1429 /* FIXME: put this in a function. */
1431 char const *q_style = getenv ("QUOTING_STYLE");
1434 int i = ARGMATCH (q_style, quoting_style_args, quoting_style_vals);
1436 set_quoting_style (NULL, quoting_style_vals[i]);
1439 _("ignoring invalid value of environment variable QUOTING_STYLE: %s"),
1440 quotearg (q_style));
1445 char const *ls_block_size = getenv ("LS_BLOCK_SIZE");
1446 human_output_opts = human_options (ls_block_size, false,
1447 &output_block_size);
1448 if (ls_block_size || getenv ("BLOCK_SIZE"))
1449 file_output_block_size = output_block_size;
1454 char const *p = getenv ("COLUMNS");
1457 unsigned long int tmp_ulong;
1458 if (xstrtoul (p, NULL, 0, &tmp_ulong, NULL) == LONGINT_OK
1459 && 0 < tmp_ulong && tmp_ulong <= SIZE_MAX)
1461 line_length = tmp_ulong;
1466 _("ignoring invalid width in environment variable COLUMNS: %s"),
1476 if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &ws) != -1
1477 && 0 < ws.ws_col && ws.ws_col == (size_t) ws.ws_col)
1478 line_length = ws.ws_col;
1483 char const *p = getenv ("TABSIZE");
1487 unsigned long int tmp_ulong;
1488 if (xstrtoul (p, NULL, 0, &tmp_ulong, NULL) == LONGINT_OK
1489 && tmp_ulong <= SIZE_MAX)
1491 tabsize = tmp_ulong;
1496 _("ignoring invalid tab size in environment variable TABSIZE: %s"),
1502 while ((c = getopt_long (argc, argv,
1503 "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UX1",
1504 long_options, NULL)) != -1)
1509 ignore_mode = IGNORE_MINIMAL;
1513 set_quoting_style (NULL, escape_quoting_style);
1517 time_type = time_ctime;
1521 immediate_dirs = true;
1525 /* Same as enabling -a -U and disabling -l -s. */
1526 ignore_mode = IGNORE_MINIMAL;
1527 sort_type = sort_none;
1528 sort_type_specified = true;
1530 if (format == long_format)
1531 format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
1532 print_block_size = false; /* disable -s */
1533 print_with_color = false; /* disable --color */
1536 case FILE_TYPE_INDICATOR_OPTION: /* --file-type */
1537 indicator_style = file_type;
1541 format = long_format;
1542 print_owner = false;
1546 human_output_opts = human_autoscale | human_SI | human_base_1024;
1547 file_output_block_size = output_block_size = 1;
1554 case KILOBYTES_LONG_OPTION:
1556 _("the --kilobytes option is deprecated; use -k instead"));
1559 human_output_opts = 0;
1560 file_output_block_size = output_block_size = 1024;
1564 format = long_format;
1568 format = with_commas;
1573 format = long_format;
1576 case 'o': /* Just like -l, but don't display group info. */
1577 format = long_format;
1578 print_group = false;
1582 indicator_style = slash;
1586 qmark_funny_chars = true;
1590 sort_reverse = true;
1594 print_block_size = true;
1598 sort_type = sort_time;
1599 sort_type_specified = true;
1603 time_type = time_atime;
1607 sort_type = sort_version;
1608 sort_type_specified = true;
1613 unsigned long int tmp_ulong;
1614 if (xstrtoul (optarg, NULL, 0, &tmp_ulong, NULL) != LONGINT_OK
1615 || ! (0 < tmp_ulong && tmp_ulong <= SIZE_MAX))
1616 error (LS_FAILURE, 0, _("invalid line width: %s"),
1618 line_length = tmp_ulong;
1623 format = horizontal;
1627 if (ignore_mode == IGNORE_DEFAULT)
1628 ignore_mode = IGNORE_DOT_AND_DOTDOT;
1632 add_ignore_pattern ("*~");
1633 add_ignore_pattern (".*~");
1637 format = many_per_line;
1645 indicator_style = classify;
1648 case 'G': /* inhibit display of group info */
1649 print_group = false;
1653 dereference = DEREF_COMMAND_LINE_ARGUMENTS;
1656 case DEREFERENCE_COMMAND_LINE_SYMLINK_TO_DIR_OPTION:
1657 dereference = DEREF_COMMAND_LINE_SYMLINK_TO_DIR;
1661 add_ignore_pattern (optarg);
1665 dereference = DEREF_ALWAYS;
1669 set_quoting_style (NULL, literal_quoting_style);
1673 set_quoting_style (NULL, c_quoting_style);
1681 sort_type = sort_size;
1682 sort_type_specified = true;
1687 unsigned long int tmp_ulong;
1688 if (xstrtoul (optarg, NULL, 0, &tmp_ulong, NULL) != LONGINT_OK
1689 || SIZE_MAX < tmp_ulong)
1690 error (LS_FAILURE, 0, _("invalid tab size: %s"),
1692 tabsize = tmp_ulong;
1697 sort_type = sort_none;
1698 sort_type_specified = true;
1702 sort_type = sort_extension;
1703 sort_type_specified = true;
1707 /* -1 has no effect after -l. */
1708 if (format != long_format)
1709 format = one_per_line;
1713 print_author = true;
1718 struct ignore_pattern *hide = xmalloc (sizeof *hide);
1719 hide->pattern = optarg;
1720 hide->next = hide_patterns;
1721 hide_patterns = hide;
1726 sort_type = XARGMATCH ("--sort", optarg, sort_args, sort_types);
1727 sort_type_specified = true;
1730 case GROUP_DIRECTORIES_FIRST_OPTION:
1731 directories_first = true;
1735 time_type = XARGMATCH ("--time", optarg, time_args, time_types);
1739 format = XARGMATCH ("--format", optarg, format_args, format_types);
1742 case FULL_TIME_OPTION:
1743 format = long_format;
1744 time_style_option = "full-iso";
1751 i = XARGMATCH ("--color", optarg, color_args, color_types);
1753 /* Using --color with no argument is equivalent to using
1757 print_with_color = (i == color_always
1758 || (i == color_if_tty
1759 && isatty (STDOUT_FILENO)));
1761 if (print_with_color)
1763 /* Don't use TAB characters in output. Some terminal
1764 emulators can't handle the combination of tabs and
1765 color codes on the same line. */
1771 case INDICATOR_STYLE_OPTION:
1772 indicator_style = XARGMATCH ("--indicator-style", optarg,
1773 indicator_style_args,
1774 indicator_style_types);
1777 case QUOTING_STYLE_OPTION:
1778 set_quoting_style (NULL,
1779 XARGMATCH ("--quoting-style", optarg,
1781 quoting_style_vals));
1784 case TIME_STYLE_OPTION:
1785 time_style_option = optarg;
1788 case SHOW_CONTROL_CHARS_OPTION:
1789 qmark_funny_chars = false;
1792 case BLOCK_SIZE_OPTION:
1793 human_output_opts = human_options (optarg, true, &output_block_size);
1794 file_output_block_size = output_block_size;
1798 human_output_opts = human_autoscale | human_SI;
1799 file_output_block_size = output_block_size = 1;
1802 case_GETOPT_HELP_CHAR;
1804 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1811 max_idx = MAX (1, line_length / MIN_COLUMN_WIDTH);
1813 filename_quoting_options = clone_quoting_options (NULL);
1814 if (get_quoting_style (filename_quoting_options) == escape_quoting_style)
1815 set_char_quoting (filename_quoting_options, ' ', 1);
1816 if (file_type <= indicator_style)
1819 for (p = "*=>@|" + indicator_style - file_type; *p; p++)
1820 set_char_quoting (filename_quoting_options, *p, 1);
1823 dirname_quoting_options = clone_quoting_options (NULL);
1824 set_char_quoting (dirname_quoting_options, ':', 1);
1826 /* --dired is meaningful only with --format=long (-l).
1827 Otherwise, ignore it. FIXME: warn about this?
1828 Alternatively, make --dired imply --format=long? */
1829 if (dired && format != long_format)
1832 /* If -c or -u is specified and not -l (or any other option that implies -l),
1833 and no sort-type was specified, then sort by the ctime (-c) or atime (-u).
1834 The behavior of ls when using either -c or -u but with neither -l nor -t
1835 appears to be unspecified by POSIX. So, with GNU ls, `-u' alone means
1836 sort by atime (this is the one that's not specified by the POSIX spec),
1837 -lu means show atime and sort by name, -lut means show atime and sort
1840 if ((time_type == time_ctime || time_type == time_atime)
1841 && !sort_type_specified && format != long_format)
1843 sort_type = sort_time;
1846 if (format == long_format)
1848 char *style = time_style_option;
1849 static char const posix_prefix[] = "posix-";
1852 if (! (style = getenv ("TIME_STYLE")))
1855 while (strncmp (style, posix_prefix, sizeof posix_prefix - 1) == 0)
1857 if (! hard_locale (LC_TIME))
1859 style += sizeof posix_prefix - 1;
1864 char *p0 = style + 1;
1865 char *p1 = strchr (p0, '\n');
1870 if (strchr (p1 + 1, '\n'))
1871 error (LS_FAILURE, 0, _("invalid time style format %s"),
1875 long_time_format[0] = p0;
1876 long_time_format[1] = p1;
1879 switch (XARGMATCH ("time style", style,
1883 case full_iso_time_style:
1884 long_time_format[0] = long_time_format[1] =
1885 "%Y-%m-%d %H:%M:%S.%N %z";
1888 case long_iso_time_style:
1889 case_long_iso_time_style:
1890 long_time_format[0] = long_time_format[1] = "%Y-%m-%d %H:%M";
1893 case iso_time_style:
1894 long_time_format[0] = "%Y-%m-%d ";
1895 long_time_format[1] = "%m-%d %H:%M";
1898 case locale_time_style:
1899 if (hard_locale (LC_TIME))
1901 /* Ensure that the locale has translations for both
1902 formats. If not, fall back on long-iso format. */
1904 for (i = 0; i < 2; i++)
1906 char const *locale_format =
1907 dcgettext (NULL, long_time_format[i], LC_TIME);
1908 if (locale_format == long_time_format[i])
1909 goto case_long_iso_time_style;
1910 long_time_format[i] = locale_format;
1919 /* Parse a string as part of the LS_COLORS variable; this may involve
1920 decoding all kinds of escape characters. If equals_end is set an
1921 unescaped equal sign ends the string, otherwise only a : or \0
1922 does. Set *OUTPUT_COUNT to the number of bytes output. Return
1925 The resulting string is *not* null-terminated, but may contain
1928 Note that both dest and src are char **; on return they point to
1929 the first free byte after the array and the character that ended
1930 the input string, respectively. */
1933 get_funky_string (char **dest, const char **src, bool equals_end,
1934 size_t *output_count)
1936 char num; /* For numerical codes */
1937 size_t count; /* Something to count with */
1939 ST_GND, ST_BACKSLASH, ST_OCTAL, ST_HEX, ST_CARET, ST_END, ST_ERROR
1944 p = *src; /* We don't want to double-indirect */
1945 q = *dest; /* the whole darn time. */
1947 count = 0; /* No characters counted in yet. */
1950 state = ST_GND; /* Start in ground state. */
1951 while (state < ST_END)
1955 case ST_GND: /* Ground state (no escapes) */
1960 state = ST_END; /* End of string */
1963 state = ST_BACKSLASH; /* Backslash scape sequence */
1967 state = ST_CARET; /* Caret escape */
1973 state = ST_END; /* End */
1976 /* else fall through */
1984 case ST_BACKSLASH: /* Backslash escaped character */
1995 state = ST_OCTAL; /* Octal sequence */
2000 state = ST_HEX; /* Hex sequence */
2003 case 'a': /* Bell */
2006 case 'b': /* Backspace */
2009 case 'e': /* Escape */
2012 case 'f': /* Form feed */
2015 case 'n': /* Newline */
2018 case 'r': /* Carriage return */
2024 case 'v': /* Vtab */
2027 case '?': /* Delete */
2030 case '_': /* Space */
2033 case '\0': /* End of string */
2034 state = ST_ERROR; /* Error! */
2036 default: /* Escaped character like \ ^ : = */
2040 if (state == ST_BACKSLASH)
2049 case ST_OCTAL: /* Octal sequence */
2050 if (*p < '0' || *p > '7')
2057 num = (num << 3) + (*(p++) - '0');
2060 case ST_HEX: /* Hex sequence */
2073 num = (num << 4) + (*(p++) - '0');
2081 num = (num << 4) + (*(p++) - 'a') + 10;
2089 num = (num << 4) + (*(p++) - 'A') + 10;
2099 case ST_CARET: /* Caret escape */
2100 state = ST_GND; /* Should be the next state... */
2101 if (*p >= '@' && *p <= '~')
2103 *(q++) = *(p++) & 037;
2122 *output_count = count;
2124 return state != ST_ERROR;
2128 parse_ls_color (void)
2130 const char *p; /* Pointer to character being parsed */
2131 char *buf; /* color_buf buffer pointer */
2132 int state; /* State of parser */
2133 int ind_no; /* Indicator number */
2134 char label[3]; /* Indicator label */
2135 struct color_ext_type *ext; /* Extension we are working on */
2137 if ((p = getenv ("LS_COLORS")) == NULL || *p == '\0')
2141 strcpy (label, "??");
2143 /* This is an overly conservative estimate, but any possible
2144 LS_COLORS string will *not* generate a color_buf longer than
2145 itself, so it is a safe way of allocating a buffer in
2147 buf = color_buf = xstrdup (p);
2154 case 1: /* First label character */
2162 /* Allocate new extension block and add to head of
2163 linked list (this way a later definition will
2164 override an earlier one, which can be useful for
2165 having terminal-specific defs override global). */
2167 ext = xmalloc (sizeof *ext);
2168 ext->next = color_ext_list;
2169 color_ext_list = ext;
2172 ext->ext.string = buf;
2174 state = (get_funky_string (&buf, &p, true, &ext->ext.len)
2179 state = 0; /* Done! */
2182 default: /* Assume it is file type label */
2189 case 2: /* Second label character */
2196 state = -1; /* Error */
2199 case 3: /* Equal sign after indicator label */
2200 state = -1; /* Assume failure... */
2201 if (*(p++) == '=')/* It *should* be... */
2203 for (ind_no = 0; indicator_name[ind_no] != NULL; ++ind_no)
2205 if (STREQ (label, indicator_name[ind_no]))
2207 color_indicator[ind_no].string = buf;
2208 state = (get_funky_string (&buf, &p, false,
2209 &color_indicator[ind_no].len)
2215 error (0, 0, _("unrecognized prefix: %s"), quotearg (label));
2219 case 4: /* Equal sign after *.ext */
2222 ext->seq.string = buf;
2223 state = (get_funky_string (&buf, &p, false, &ext->seq.len)
2234 struct color_ext_type *e;
2235 struct color_ext_type *e2;
2238 _("unparsable value for LS_COLORS environment variable"));
2240 for (e = color_ext_list; e != NULL; /* empty */)
2246 print_with_color = false;
2249 if (color_indicator[C_LINK].len == 6
2250 && !strncmp (color_indicator[C_LINK].string, "target", 6))
2251 color_symlink_as_referent = true;
2254 /* Set the exit status to report a failure. If SERIOUS, it is a
2255 serious failure; otherwise, it is merely a minor problem. */
2258 set_exit_status (bool serious)
2261 exit_status = LS_FAILURE;
2262 else if (exit_status == EXIT_SUCCESS)
2263 exit_status = LS_MINOR_PROBLEM;
2266 /* Assuming a failure is serious if SERIOUS, use the printf-style
2267 MESSAGE to report the failure to access a file named FILE. Assume
2268 errno is set appropriately for the failure. */
2271 file_failure (bool serious, char const *message, char const *file)
2273 error (0, errno, message, quotearg_colon (file));
2274 set_exit_status (serious);
2277 /* Request that the directory named NAME have its contents listed later.
2278 If REALNAME is nonzero, it will be used instead of NAME when the
2279 directory name is printed. This allows symbolic links to directories
2280 to be treated as regular directories but still be listed under their
2281 real names. NAME == NULL is used to insert a marker entry for the
2282 directory named in REALNAME.
2283 If NAME is non-NULL, we use its dev/ino information to save
2284 a call to stat -- when doing a recursive (-R) traversal.
2285 COMMAND_LINE_ARG means this directory was mentioned on the command line. */
2288 queue_directory (char const *name, char const *realname, bool command_line_arg)
2290 struct pending *new = xmalloc (sizeof *new);
2291 new->realname = realname ? xstrdup (realname) : NULL;
2292 new->name = name ? xstrdup (name) : NULL;
2293 new->command_line_arg = command_line_arg;
2294 new->next = pending_dirs;
2298 /* Read directory NAME, and list the files in it.
2299 If REALNAME is nonzero, print its name instead of NAME;
2300 this is used for symbolic links to directories.
2301 COMMAND_LINE_ARG means this directory was mentioned on the command line. */
2304 print_dir (char const *name, char const *realname, bool command_line_arg)
2307 struct dirent *next;
2308 uintmax_t total_blocks = 0;
2309 static bool first = true;
2312 dirp = opendir (name);
2315 file_failure (command_line_arg, _("cannot open directory %s"), name);
2321 struct stat dir_stat;
2322 int fd = dirfd (dirp);
2324 /* If dirfd failed, endure the overhead of using stat. */
2326 ? fstat (fd, &dir_stat)
2327 : stat (name, &dir_stat)) < 0)
2329 file_failure (command_line_arg,
2330 _("cannot determine device and inode of %s"), name);
2334 /* If we've already visited this dev/inode pair, warn that
2335 we've found a loop, and do not process this directory. */
2336 if (visit_dir (dir_stat.st_dev, dir_stat.st_ino))
2338 error (0, 0, _("%s: not listing already-listed directory"),
2339 quotearg_colon (name));
2343 DEV_INO_PUSH (dir_stat.st_dev, dir_stat.st_ino);
2346 /* Read the directory entries, and insert the subfiles into the `files'
2353 /* Set errno to zero so we can distinguish between a readdir failure
2354 and when readdir simply finds that there are no more entries. */
2356 next = readdir (dirp);
2359 if (! file_ignored (next->d_name))
2361 enum filetype type = unknown;
2363 #if HAVE_STRUCT_DIRENT_D_TYPE
2364 if (next->d_type == DT_BLK
2365 || next->d_type == DT_CHR
2366 || next->d_type == DT_DIR
2367 || next->d_type == DT_FIFO
2368 || next->d_type == DT_LNK
2369 || next->d_type == DT_REG
2370 || next->d_type == DT_SOCK)
2371 type = next->d_type;
2373 total_blocks += gobble_file (next->d_name, type, D_INO (next),
2377 else if (errno != 0)
2379 file_failure (command_line_arg, _("reading directory %s"), name);
2380 if (errno != EOVERFLOW)
2387 if (closedir (dirp) != 0)
2389 file_failure (command_line_arg, _("closing directory %s"), name);
2390 /* Don't return; print whatever we got. */
2393 /* Sort the directory contents. */
2396 /* If any member files are subdirectories, perhaps they should have their
2397 contents listed rather than being mentioned here as files. */
2400 extract_dirs_from_files (name, command_line_arg);
2402 if (recursive | print_dir_name)
2405 DIRED_PUTCHAR ('\n');
2408 PUSH_CURRENT_DIRED_POS (&subdired_obstack);
2409 dired_pos += quote_name (stdout, realname ? realname : name,
2410 dirname_quoting_options, NULL);
2411 PUSH_CURRENT_DIRED_POS (&subdired_obstack);
2412 DIRED_FPUTS_LITERAL (":\n", stdout);
2415 if (format == long_format || print_block_size)
2418 char buf[LONGEST_HUMAN_READABLE + 1];
2422 DIRED_FPUTS (p, stdout, strlen (p));
2423 DIRED_PUTCHAR (' ');
2424 p = human_readable (total_blocks, buf, human_output_opts,
2425 ST_NBLOCKSIZE, output_block_size);
2426 DIRED_FPUTS (p, stdout, strlen (p));
2427 DIRED_PUTCHAR ('\n');
2431 print_current_files ();
2434 /* Add `pattern' to the list of patterns for which files that match are
2438 add_ignore_pattern (const char *pattern)
2440 struct ignore_pattern *ignore;
2442 ignore = xmalloc (sizeof *ignore);
2443 ignore->pattern = pattern;
2444 /* Add it to the head of the linked list. */
2445 ignore->next = ignore_patterns;
2446 ignore_patterns = ignore;
2449 /* Return true if one of the PATTERNS matches FILE. */
2452 patterns_match (struct ignore_pattern const *patterns, char const *file)
2454 struct ignore_pattern const *p;
2455 for (p = patterns; p; p = p->next)
2456 if (fnmatch (p->pattern, file, FNM_PERIOD) == 0)
2461 /* Return true if FILE should be ignored. */
2464 file_ignored (char const *name)
2466 return ((ignore_mode != IGNORE_MINIMAL
2468 && (ignore_mode == IGNORE_DEFAULT || ! name[1 + (name[1] == '.')]))
2469 || (ignore_mode == IGNORE_DEFAULT
2470 && patterns_match (hide_patterns, name))
2471 || patterns_match (ignore_patterns, name));
2474 /* POSIX requires that a file size be printed without a sign, even
2475 when negative. Assume the typical case where negative sizes are
2476 actually positive values that have wrapped around. */
2479 unsigned_file_size (off_t size)
2481 return size + (size < 0) * ((uintmax_t) OFF_T_MAX - OFF_T_MIN + 1);
2484 /* Enter and remove entries in the table `files'. */
2486 /* Empty the table of files. */
2493 for (i = 0; i < files_index; i++)
2495 free (files[i].name);
2496 free (files[i].linkname);
2501 any_has_acl = false;
2503 inode_number_width = 0;
2504 block_size_width = 0;
2509 major_device_number_width = 0;
2510 minor_device_number_width = 0;
2511 file_size_width = 0;
2514 /* Add a file to the current table of files.
2515 Verify that the file exists, and print an error message if it does not.
2516 Return the number of blocks that the file occupies. */
2519 gobble_file (char const *name, enum filetype type, ino_t inode,
2520 bool command_line_arg, char const *dirname)
2525 /* An inode value prior to gobble_file necessarily came from readdir,
2526 which is not used for command line arguments. */
2527 assert (! command_line_arg || inode == NOT_AN_INODE_NUMBER);
2529 if (files_index == nfiles)
2531 files = xnrealloc (files, nfiles, 2 * sizeof *files);
2535 f = &files[files_index];
2540 if (command_line_arg
2541 || format_needs_stat
2543 && (inode == NOT_AN_INODE_NUMBER
2544 /* When dereferencing symlinks, the inode must come from
2545 stat, but readdir provides the inode of lstat. Command
2546 line dereferences are already taken care of by the above
2547 assertion that the inode number is not yet known. */
2548 || (dereference == DEREF_ALWAYS
2549 && (type == symbolic_link || type == unknown))))
2550 || (format_needs_type
2551 && (type == unknown || command_line_arg
2552 /* --indicator-style=classify (aka -F)
2553 requires that we stat each regular file
2554 to see if it's executable. */
2555 || (type == normal && (indicator_style == classify
2556 /* This is so that --color ends up
2557 highlighting files with the executable
2558 bit set even when options like -F are
2560 || (print_with_color
2561 && is_colored (C_EXEC))
2565 /* Absolute name of this file. */
2566 char *absolute_name;
2570 if (name[0] == '/' || dirname[0] == 0)
2571 absolute_name = (char *) name;
2574 absolute_name = alloca (strlen (name) + strlen (dirname) + 2);
2575 attach (absolute_name, dirname, name);
2578 switch (dereference)
2581 err = stat (absolute_name, &f->stat);
2584 case DEREF_COMMAND_LINE_ARGUMENTS:
2585 case DEREF_COMMAND_LINE_SYMLINK_TO_DIR:
2586 if (command_line_arg)
2589 err = stat (absolute_name, &f->stat);
2591 if (dereference == DEREF_COMMAND_LINE_ARGUMENTS)
2594 need_lstat = (err < 0
2596 : ! S_ISDIR (f->stat.st_mode));
2600 /* stat failed because of ENOENT, maybe indicating a dangling
2601 symlink. Or stat succeeded, ABSOLUTE_NAME does not refer to a
2602 directory, and --dereference-command-line-symlink-to-dir is
2603 in effect. Fall through so that we call lstat instead. */
2606 default: /* DEREF_NEVER */
2607 err = lstat (absolute_name, &f->stat);
2611 f->stat_failed = (err < 0);
2614 /* Failure to stat a command line argument leads to
2615 an exit status of 2. For other files, stat failure
2616 provokes an exit status of 1. */
2617 file_failure (command_line_arg,
2618 _("cannot access %s"), absolute_name);
2619 if (command_line_arg)
2623 memset (&f->stat, '\0', sizeof (f->stat));
2626 f->have_acl = false;
2628 f->name = xstrdup (name);
2635 if (format == long_format)
2637 int n = file_has_acl (absolute_name, &f->stat);
2638 f->have_acl = (0 < n);
2639 any_has_acl |= f->have_acl;
2641 error (0, errno, "%s", quotearg_colon (absolute_name));
2645 if (S_ISLNK (f->stat.st_mode)
2646 && (format == long_format || check_symlink_color))
2649 struct stat linkstats;
2651 get_link_name (absolute_name, f, command_line_arg);
2652 linkname = make_link_name (absolute_name, f->linkname);
2654 /* Avoid following symbolic links when possible, ie, when
2655 they won't be traced and when no indicator is needed. */
2657 && (file_type <= indicator_style || check_symlink_color)
2658 && stat (linkname, &linkstats) == 0)
2662 /* Symbolic links to directories that are mentioned on the
2663 command line are automatically traced if not being
2665 if (!command_line_arg || format == long_format
2666 || !S_ISDIR (linkstats.st_mode))
2668 /* Get the linked-to file's mode for the filetype indicator
2669 in long listings. */
2670 f->linkmode = linkstats.st_mode;
2677 if (S_ISLNK (f->stat.st_mode))
2678 f->filetype = symbolic_link;
2679 else if (S_ISDIR (f->stat.st_mode))
2681 if (command_line_arg & !immediate_dirs)
2682 f->filetype = arg_directory;
2684 f->filetype = directory;
2687 f->filetype = normal;
2689 blocks = ST_NBLOCKS (f->stat);
2691 char buf[LONGEST_HUMAN_READABLE + 1];
2692 int len = mbswidth (human_readable (blocks, buf, human_output_opts,
2693 ST_NBLOCKSIZE, output_block_size),
2695 if (block_size_width < len)
2696 block_size_width = len;
2701 int len = format_user_width (f->stat.st_uid);
2702 if (owner_width < len)
2708 int len = format_group_width (f->stat.st_gid);
2709 if (group_width < len)
2715 int len = format_user_width (f->stat.st_author);
2716 if (author_width < len)
2721 char buf[INT_BUFSIZE_BOUND (uintmax_t)];
2722 int len = strlen (umaxtostr (f->stat.st_nlink, buf));
2723 if (nlink_width < len)
2727 if (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode))
2729 char buf[INT_BUFSIZE_BOUND (uintmax_t)];
2730 int len = strlen (umaxtostr (major (f->stat.st_rdev), buf));
2731 if (major_device_number_width < len)
2732 major_device_number_width = len;
2733 len = strlen (umaxtostr (minor (f->stat.st_rdev), buf));
2734 if (minor_device_number_width < len)
2735 minor_device_number_width = len;
2736 len = major_device_number_width + 2 + minor_device_number_width;
2737 if (file_size_width < len)
2738 file_size_width = len;
2742 char buf[LONGEST_HUMAN_READABLE + 1];
2743 uintmax_t size = unsigned_file_size (f->stat.st_size);
2744 int len = mbswidth (human_readable (size, buf, human_output_opts,
2745 1, file_output_block_size),
2747 if (file_size_width < len)
2748 file_size_width = len;
2754 f->stat.st_ino = inode;
2755 #if HAVE_STRUCT_DIRENT_D_TYPE && defined DTTOIF
2756 f->stat.st_mode = DTTOIF (type);
2763 char buf[INT_BUFSIZE_BOUND (uintmax_t)];
2764 int len = strlen (umaxtostr (f->stat.st_ino, buf));
2765 if (inode_number_width < len)
2766 inode_number_width = len;
2769 f->name = xstrdup (name);
2775 /* Return true if F refers to a directory. */
2777 is_directory (const struct fileinfo *f)
2779 return f->filetype == directory || f->filetype == arg_directory;
2785 /* Put the name of the file that FILENAME is a symbolic link to
2786 into the LINKNAME field of `f'. COMMAND_LINE_ARG indicates whether
2787 FILENAME is a command-line argument. */
2790 get_link_name (char const *filename, struct fileinfo *f, bool command_line_arg)
2792 f->linkname = xreadlink (filename, f->stat.st_size);
2793 if (f->linkname == NULL)
2794 file_failure (command_line_arg, _("cannot read symbolic link %s"),
2798 /* If `linkname' is a relative name and `name' contains one or more
2799 leading directories, return `linkname' with those directories
2800 prepended; otherwise, return a copy of `linkname'.
2801 If `linkname' is zero, return zero. */
2804 make_link_name (char const *name, char const *linkname)
2812 if (*linkname == '/')
2813 return xstrdup (linkname);
2815 /* The link is to a relative name. Prepend any leading directory
2816 in `name' to the link name. */
2817 linkbuf = strrchr (name, '/');
2819 return xstrdup (linkname);
2821 bufsiz = linkbuf - name + 1;
2822 linkbuf = xmalloc (bufsiz + strlen (linkname) + 1);
2823 strncpy (linkbuf, name, bufsiz);
2824 strcpy (linkbuf + bufsiz, linkname);
2829 /* Return true if the last component of NAME is `.' or `..'
2830 This is so we don't try to recurse on `././././. ...' */
2833 basename_is_dot_or_dotdot (const char *name)
2835 char const *base = last_component (name);
2836 return DOT_OR_DOTDOT (base);
2839 /* Remove any entries from FILES that are for directories,
2840 and queue them to be listed as directories instead.
2841 DIRNAME is the prefix to prepend to each dirname
2842 to make it correct relative to ls's working dir;
2843 if it is null, no prefix is needed and "." and ".." should not be ignored.
2844 If COMMAND_LINE_ARG is true, this directory was mentioned at the top level,
2845 This is desirable when processing directories recursively. */
2848 extract_dirs_from_files (char const *dirname, bool command_line_arg)
2852 bool ignore_dot_and_dot_dot = (dirname != NULL);
2854 if (dirname && LOOP_DETECT)
2856 /* Insert a marker entry first. When we dequeue this marker entry,
2857 we'll know that DIRNAME has been processed and may be removed
2858 from the set of active directories. */
2859 queue_directory (NULL, dirname, false);
2862 /* Queue the directories last one first, because queueing reverses the
2864 for (i = files_index; i-- != 0; )
2865 if (is_directory (&files[i])
2866 && (! ignore_dot_and_dot_dot
2867 || ! basename_is_dot_or_dotdot (files[i].name)))
2869 if (!dirname || files[i].name[0] == '/')
2871 queue_directory (files[i].name, files[i].linkname,
2876 char *name = file_name_concat (dirname, files[i].name, NULL);
2877 queue_directory (name, files[i].linkname, command_line_arg);
2880 if (files[i].filetype == arg_directory)
2881 free (files[i].name);
2884 /* Now delete the directories from the table, compacting all the remaining
2887 for (i = 0, j = 0; i < files_index; i++)
2889 if (files[i].filetype != arg_directory)
2892 files[j] = files[i];
2899 /* Use strcoll to compare strings in this locale. If an error occurs,
2900 report an error and longjmp to failed_strcoll. */
2902 static jmp_buf failed_strcoll;
2905 xstrcoll (char const *a, char const *b)
2909 diff = strcoll (a, b);
2912 error (0, errno, _("cannot compare file names %s and %s"),
2913 quote_n (0, a), quote_n (1, b));
2914 set_exit_status (false);
2915 longjmp (failed_strcoll, 1);
2920 /* Comparison routines for sorting the files. */
2922 typedef void const *V;
2923 typedef int (*qsortFunc)(V a, V b);
2925 /* Used below in DEFINE_SORT_FUNCTIONS for _df_ sort function variants.
2926 The do { ... } while(0) makes it possible to use the macro more like
2927 a statement, without violating C89 rules: */
2928 #define DIRFIRST_CHECK(a, b) \
2931 bool a_is_dir = is_directory ((struct fileinfo const *) a); \
2932 bool b_is_dir = is_directory ((struct fileinfo const *) b); \
2933 if (a_is_dir && !b_is_dir) \
2934 return -1; /* a goes before b */ \
2935 if (!a_is_dir && b_is_dir) \
2936 return 1; /* b goes before a */ \
2940 /* Define the 8 different sort function variants required for each sortkey.
2941 KEY_NAME is a token describing the sort key, e.g., ctime, atime, size.
2942 KEY_CMP_FUNC is a function to compare records based on that key, e.g.,
2943 ctime_cmp, atime_cmp, size_cmp. Append KEY_NAME to the string,
2944 '[rev_][x]str{cmp|coll}[_df]_', to create each function name. */
2945 #define DEFINE_SORT_FUNCTIONS(key_name, key_cmp_func) \
2946 /* direct, non-dirfirst versions */ \
2947 static int xstrcoll_##key_name (V a, V b) \
2948 { return key_cmp_func (a, b, xstrcoll); } \
2949 static int strcmp_##key_name (V a, V b) \
2950 { return key_cmp_func (a, b, strcmp); } \
2952 /* reverse, non-dirfirst versions */ \
2953 static int rev_xstrcoll_##key_name (V a, V b) \
2954 { return key_cmp_func (b, a, xstrcoll); } \
2955 static int rev_strcmp_##key_name (V a, V b) \
2956 { return key_cmp_func (b, a, strcmp); } \
2958 /* direct, dirfirst versions */ \
2959 static int xstrcoll_df_##key_name (V a, V b) \
2960 { DIRFIRST_CHECK (a, b); return key_cmp_func (a, b, xstrcoll); } \
2961 static int strcmp_df_##key_name (V a, V b) \
2962 { DIRFIRST_CHECK (a, b); return key_cmp_func (a, b, strcmp); } \
2964 /* reverse, dirfirst versions */ \
2965 static int rev_xstrcoll_df_##key_name (V a, V b) \
2966 { DIRFIRST_CHECK (a, b); return key_cmp_func (b, a, xstrcoll); } \
2967 static int rev_strcmp_df_##key_name (V a, V b) \
2968 { DIRFIRST_CHECK (a, b); return key_cmp_func (b, a, strcmp); }
2971 cmp_ctime (struct fileinfo const *a, struct fileinfo const *b,
2972 int (*cmp) (char const *, char const *))
2974 int diff = timespec_cmp (get_stat_ctime (&b->stat),
2975 get_stat_ctime (&a->stat));
2976 return diff ? diff : cmp (a->name, b->name);
2980 cmp_mtime (struct fileinfo const *a, struct fileinfo const *b,
2981 int (*cmp) (char const *, char const *))
2983 int diff = timespec_cmp (get_stat_mtime (&b->stat),
2984 get_stat_mtime (&a->stat));
2985 return diff ? diff : cmp (a->name, b->name);
2989 cmp_atime (struct fileinfo const *a, struct fileinfo const *b,
2990 int (*cmp) (char const *, char const *))
2992 int diff = timespec_cmp (get_stat_atime (&b->stat),
2993 get_stat_atime (&a->stat));
2994 return diff ? diff : cmp (a->name, b->name);
2998 cmp_size (struct fileinfo const *a, struct fileinfo const *b,
2999 int (*cmp) (char const *, char const *))
3001 int diff = longdiff (b->stat.st_size, a->stat.st_size);
3002 return diff ? diff : cmp (a->name, b->name);
3006 cmp_name (struct fileinfo const *a, struct fileinfo const *b,
3007 int (*cmp) (char const *, char const *))
3009 return cmp (a->name, b->name);
3012 /* Compare file extensions. Files with no extension are `smallest'.
3013 If extensions are the same, compare by filenames instead. */
3016 cmp_extension (struct fileinfo const *a, struct fileinfo const *b,
3017 int (*cmp) (char const *, char const *))
3019 char const *base1 = strrchr (a->name, '.');
3020 char const *base2 = strrchr (b->name, '.');
3021 int diff = cmp (base1 ? base1 : "", base2 ? base2 : "");
3022 return diff ? diff : cmp (a->name, b->name);
3025 DEFINE_SORT_FUNCTIONS (ctime, cmp_ctime)
3026 DEFINE_SORT_FUNCTIONS (mtime, cmp_mtime)
3027 DEFINE_SORT_FUNCTIONS (atime, cmp_atime)
3028 DEFINE_SORT_FUNCTIONS (size, cmp_size)
3029 DEFINE_SORT_FUNCTIONS (name, cmp_name)
3030 DEFINE_SORT_FUNCTIONS (extension, cmp_extension)
3032 /* Compare file versions.
3033 Unlike all other compare functions above, cmp_version depends only
3034 on strverscmp, which does not fail (even for locale reasons), and does not
3035 need a secondary sort key.
3036 All the other sort options, in fact, need xstrcoll and strcmp variants,
3037 because they all use a string comparison (either as the primary or secondary
3038 sort key), and xstrcoll has the ability to do a longjmp if strcoll fails for
3039 locale reasons. Last, strverscmp is ALWAYS available in coreutils,
3040 thanks to the gnulib library. */
3042 cmp_version (struct fileinfo const *a, struct fileinfo const *b)
3044 return strverscmp (a->name, b->name);
3047 static int xstrcoll_version (V a, V b)
3048 { return cmp_version (a, b); }
3049 static int rev_xstrcoll_version (V a, V b)
3050 { return cmp_version (b, a); }
3051 static int xstrcoll_df_version (V a, V b)
3052 { DIRFIRST_CHECK (a, b); return cmp_version (a, b); }
3053 static int rev_xstrcoll_df_version (V a, V b)
3054 { DIRFIRST_CHECK (a, b); return cmp_version (b, a); }
3057 /* We have 2^3 different variants for each sortkey function
3058 (for 3 independent sort modes).
3059 The function pointers stored in this array must be dereferenced as:
3061 sort_variants[sort_key][use_strcmp][reverse][dirs_first]
3063 Note that the order in which sortkeys are listed in the function pointer
3064 array below is defined by the order of the elements in the time_type and
3067 #define LIST_SORTFUNCTION_VARIANTS(key_name) \
3070 { xstrcoll_##key_name, xstrcoll_df_##key_name }, \
3071 { rev_xstrcoll_##key_name, rev_xstrcoll_df_##key_name }, \
3074 { strcmp_##key_name, strcmp_df_##key_name }, \
3075 { rev_strcmp_##key_name, rev_strcmp_df_##key_name }, \
3079 static qsortFunc sort_functions[][2][2][2] =
3081 LIST_SORTFUNCTION_VARIANTS (name),
3082 LIST_SORTFUNCTION_VARIANTS (extension),
3083 LIST_SORTFUNCTION_VARIANTS (size),
3087 { xstrcoll_version, xstrcoll_df_version },
3088 { rev_xstrcoll_version, rev_xstrcoll_df_version },
3091 /* We use NULL for the strcmp variants of version comparison
3092 since as explained in cmp_version definition, version comparison
3093 does not rely on xstrcoll, so it will never longjmp, and never
3094 need to try the strcmp fallback. */
3101 /* last are time sort functions */
3102 LIST_SORTFUNCTION_VARIANTS (mtime),
3103 LIST_SORTFUNCTION_VARIANTS (ctime),
3104 LIST_SORTFUNCTION_VARIANTS (atime)
3107 /* The number of sortkeys is calculated as
3108 the number of elements in the sort_type enum (i.e. sort_numtypes) +
3109 the number of elements in the time_type enum (i.e. time_numtypes) - 1
3110 This is because when sort_type==sort_time, we have up to
3111 time_numtypes possible sortkeys.
3113 This line verifies at compile-time that the array of sort functions has been
3114 initialized for all possible sortkeys. */
3115 verify (ARRAY_CARDINALITY (sort_functions)
3116 == sort_numtypes + time_numtypes - 1 );
3119 /* Sort the files now in the table. */
3126 if (sort_type == sort_none)
3129 /* Try strcoll. If it fails, fall back on strcmp. We can't safely
3130 ignore strcoll failures, as a failing strcoll might be a
3131 comparison function that is not a total order, and if we ignored
3132 the failure this might cause qsort to dump core. */
3134 if (! setjmp (failed_strcoll))
3135 use_strcmp = false; /* strcoll() succeeded */
3139 assert (sort_type != sort_version);
3142 /* When sort_type == sort_time, use time_type as subindex. */
3143 int timeoffset = sort_type == sort_time ? time_type : 0;
3145 qsort (files, files_index, sizeof *files,
3146 sort_functions[sort_type + timeoffset][use_strcmp][sort_reverse]
3147 [directories_first]);
3150 /* List all the files now in the table. */
3153 print_current_files (void)
3160 for (i = 0; i < files_index; i++)
3162 print_file_name_and_frills (files + i);
3168 print_many_per_line ();
3172 print_horizontal ();
3176 print_with_commas ();
3180 for (i = 0; i < files_index; i++)
3182 print_long_format (files + i);
3183 DIRED_PUTCHAR ('\n');
3189 /* Return the expected number of columns in a long-format time stamp,
3190 or zero if it cannot be calculated. */
3193 long_time_expected_width (void)
3195 static int width = -1;
3200 struct tm const *tm = localtime (&epoch);
3201 char buf[TIME_STAMP_LEN_MAXIMUM + 1];
3203 /* In case you're wondering if localtime can fail with an input time_t
3204 value of 0, let's just say it's very unlikely, but not inconceivable.
3205 The TZ environment variable would have to specify a time zone that
3206 is 2**31-1900 years or more ahead of UTC. This could happen only on
3207 a 64-bit system that blindly accepts e.g., TZ=UTC+20000000000000.
3208 However, this is not possible with Solaris 10 or glibc-2.3.5, since
3209 their implementations limit the offset to 167:59 and 24:00, resp. */
3213 nstrftime (buf, sizeof buf, long_time_format[0], tm, 0, 0);
3215 width = mbsnwidth (buf, len, 0);
3225 /* Get the current time. */
3228 get_current_time (void)
3230 #if HAVE_CLOCK_GETTIME && defined CLOCK_REALTIME
3232 struct timespec timespec;
3233 if (clock_gettime (CLOCK_REALTIME, ×pec) == 0)
3235 current_time = timespec.tv_sec;
3236 current_time_ns = timespec.tv_nsec;
3242 /* The clock does not have nanosecond resolution, so get the maximum
3243 possible value for the current time that is consistent with the
3244 reported clock. That way, files are not considered to be in the
3245 future merely because their time stamps have higher resolution
3246 than the clock resolution. */
3248 #if HAVE_GETTIMEOFDAY
3250 struct timeval timeval;
3251 gettimeofday (&timeval, NULL);
3252 current_time = timeval.tv_sec;
3253 current_time_ns = timeval.tv_usec * 1000 + 999;
3256 current_time = time (NULL);
3257 current_time_ns = 999999999;
3261 /* Print the user or group name NAME, with numeric id ID, using a
3262 print width of WIDTH columns. */
3265 format_user_or_group (char const *name, unsigned long int id, int width)
3271 int width_gap = width - mbswidth (name, 0);
3272 int pad = MAX (0, width_gap);
3273 fputs (name, stdout);
3274 len = strlen (name) + pad;
3282 printf ("%*lu ", width, id);
3286 dired_pos += len + 1;
3289 /* Print the name or id of the user with id U, using a print width of
3293 format_user (uid_t u, int width, bool stat_failed)
3295 format_user_or_group (stat_failed ? "?" :
3296 (numeric_ids ? NULL : getuser (u)), u, width);
3299 /* Likewise, for groups. */
3302 format_group (gid_t g, int width, bool stat_failed)
3304 format_user_or_group (stat_failed ? "?" :
3305 (numeric_ids ? NULL : getgroup (g)), g, width);
3308 /* Return the number of columns that format_user_or_group will print. */
3311 format_user_or_group_width (char const *name, unsigned long int id)
3315 int len = mbswidth (name, 0);
3316 return MAX (0, len);
3320 char buf[INT_BUFSIZE_BOUND (unsigned long int)];
3321 sprintf (buf, "%lu", id);
3322 return strlen (buf);
3326 /* Return the number of columns that format_user will print. */
3329 format_user_width (uid_t u)
3331 return format_user_or_group_width (numeric_ids ? NULL : getuser (u), u);
3334 /* Likewise, for groups. */
3337 format_group_width (gid_t g)
3339 return format_user_or_group_width (numeric_ids ? NULL : getgroup (g), g);
3343 /* Print information about F in long format. */
3346 print_long_format (const struct fileinfo *f)
3350 [LONGEST_HUMAN_READABLE + 1 /* inode */
3351 + LONGEST_HUMAN_READABLE + 1 /* size in blocks */
3352 + sizeof (modebuf) - 1 + 1 /* mode string */
3353 + INT_BUFSIZE_BOUND (uintmax_t) /* st_nlink */
3354 + LONGEST_HUMAN_READABLE + 2 /* major device number */
3355 + LONGEST_HUMAN_READABLE + 1 /* minor device number */
3356 + TIME_STAMP_LEN_MAXIMUM + 1 /* max length of time/date */
3362 struct timespec when_timespec;
3363 struct tm *when_local;
3365 /* Compute the mode string, except remove the trailing space if no
3366 files in this directory have ACLs. */
3367 filemodestring (&f->stat, modebuf);
3370 else if (FILE_HAS_ACL (f))
3376 when_timespec = get_stat_ctime (&f->stat);
3379 when_timespec = get_stat_mtime (&f->stat);
3382 when_timespec = get_stat_atime (&f->stat);
3388 when = when_timespec.tv_sec;
3389 when_ns = when_timespec.tv_nsec;
3395 char hbuf[INT_BUFSIZE_BOUND (uintmax_t)];
3396 sprintf (p, "%*s ", inode_number_width,
3397 f->stat_failed ? "?" : umaxtostr (f->stat.st_ino, hbuf));
3398 /* Increment by strlen (p) here, rather than by inode_number_width + 1.
3399 The latter is wrong when inode_number_width is zero. */
3403 if (print_block_size)
3405 char hbuf[LONGEST_HUMAN_READABLE + 1];
3406 char const *blocks =
3409 : human_readable (ST_NBLOCKS (f->stat), hbuf, human_output_opts,
3410 ST_NBLOCKSIZE, output_block_size));
3412 for (pad = block_size_width - mbswidth (blocks, 0); 0 < pad; pad--)
3414 while ((*p++ = *blocks++))
3419 /* The last byte of the mode string is the POSIX
3420 "optional alternate access method flag". */
3422 char hbuf[INT_BUFSIZE_BOUND (uintmax_t)];
3423 sprintf (p, "%s %*s ", modebuf, nlink_width,
3424 f->stat_failed ? "?" : umaxtostr (f->stat.st_nlink, hbuf));
3426 /* Increment by strlen (p) here, rather than by, e.g.,
3427 sizeof modebuf - 2 + any_has_acl + 1 + nlink_width + 1.
3428 The latter is wrong when nlink_width is zero. */
3433 if (print_owner | print_group | print_author)
3435 DIRED_FPUTS (buf, stdout, p - buf);
3438 format_user (f->stat.st_uid, owner_width, f->stat_failed);
3441 format_group (f->stat.st_gid, group_width, f->stat_failed);
3444 format_user (f->stat.st_author, author_width, f->stat_failed);
3450 && (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode)))
3452 char majorbuf[INT_BUFSIZE_BOUND (uintmax_t)];
3453 char minorbuf[INT_BUFSIZE_BOUND (uintmax_t)];
3454 int blanks_width = (file_size_width
3455 - (major_device_number_width + 2
3456 + minor_device_number_width));
3457 sprintf (p, "%*s, %*s ",
3458 major_device_number_width + MAX (0, blanks_width),
3459 umaxtostr (major (f->stat.st_rdev), majorbuf),
3460 minor_device_number_width,
3461 umaxtostr (minor (f->stat.st_rdev), minorbuf));
3462 p += file_size_width + 1;
3466 char hbuf[LONGEST_HUMAN_READABLE + 1];
3470 : human_readable (unsigned_file_size (f->stat.st_size),
3471 hbuf, human_output_opts, 1, file_output_block_size));
3473 for (pad = file_size_width - mbswidth (size, 0); 0 < pad; pad--)
3475 while ((*p++ = *size++))
3480 when_local = localtime (&when_timespec.tv_sec);
3484 if (!f->stat_failed && when_local)
3486 time_t six_months_ago;
3490 /* If the file appears to be in the future, update the current
3491 time, in case the file happens to have been modified since
3492 the last time we checked the clock. */
3493 if (current_time < when
3494 || (current_time == when && current_time_ns < when_ns))
3496 /* Note that get_current_time calls gettimeofday which, on some non-
3497 compliant systems, clobbers the buffer used for localtime's result.
3498 But it's ok here, because we use a gettimeofday wrapper that
3499 saves and restores the buffer around the gettimeofday call. */
3500 get_current_time ();
3503 /* Consider a time to be recent if it is within the past six
3504 months. A Gregorian year has 365.2425 * 24 * 60 * 60 ==
3505 31556952 seconds on the average. Write this value as an
3506 integer constant to avoid floating point hassles. */
3507 six_months_ago = current_time - 31556952 / 2;
3508 recent = (six_months_ago <= when
3509 && (when < current_time
3510 || (when == current_time && when_ns <= current_time_ns)));
3511 fmt = long_time_format[recent];
3513 s = nstrftime (p, TIME_STAMP_LEN_MAXIMUM + 1, fmt,
3514 when_local, 0, when_ns);
3522 /* NUL-terminate the string -- fputs (via DIRED_FPUTS) requires it. */
3527 /* The time cannot be converted using the desired format, so
3528 print it as a huge integer number of seconds. */
3529 char hbuf[INT_BUFSIZE_BOUND (intmax_t)];
3530 sprintf (p, "%*s ", long_time_expected_width (),
3533 : (TYPE_SIGNED (time_t)
3534 ? imaxtostr (when, hbuf)
3535 : umaxtostr (when, hbuf))));
3539 DIRED_FPUTS (buf, stdout, p - buf);
3540 print_name_with_quoting (f->name, FILE_OR_LINK_MODE (f), f->linkok,
3541 f->stat_failed, &dired_obstack);
3543 if (f->filetype == symbolic_link)
3547 DIRED_FPUTS_LITERAL (" -> ", stdout);
3548 print_name_with_quoting (f->linkname, f->linkmode, f->linkok - 1,
3549 f->stat_failed, NULL);
3550 if (indicator_style != none)
3551 print_type_indicator (f->linkmode);
3554 else if (indicator_style != none)
3555 print_type_indicator (f->stat.st_mode);
3558 /* Output to OUT a quoted representation of the file name NAME,
3559 using OPTIONS to control quoting. Produce no output if OUT is NULL.
3560 Store the number of screen columns occupied by NAME's quoted
3561 representation into WIDTH, if non-NULL. Return the number of bytes
3565 quote_name (FILE *out, const char *name, struct quoting_options const *options,
3568 char smallbuf[BUFSIZ];
3569 size_t len = quotearg_buffer (smallbuf, sizeof smallbuf, name, -1, options);
3571 size_t displayed_width IF_LINT (= 0);
3573 if (len < sizeof smallbuf)
3577 buf = alloca (len + 1);
3578 quotearg_buffer (buf, len + 1, name, -1, options);
3581 if (qmark_funny_chars)
3586 char const *p = buf;
3587 char const *plimit = buf + len;
3589 displayed_width = 0;
3594 case ' ': case '!': case '"': case '#': case '%':
3595 case '&': case '\'': case '(': case ')': case '*':
3596 case '+': case ',': case '-': case '.': case '/':
3597 case '0': case '1': case '2': case '3': case '4':
3598 case '5': case '6': case '7': case '8': case '9':
3599 case ':': case ';': case '<': case '=': case '>':
3601 case 'A': case 'B': case 'C': case 'D': case 'E':
3602 case 'F': case 'G': case 'H': case 'I': case 'J':
3603 case 'K': case 'L': case 'M': case 'N': case 'O':
3604 case 'P': case 'Q': case 'R': case 'S': case 'T':
3605 case 'U': case 'V': case 'W': case 'X': case 'Y':
3607 case '[': case '\\': case ']': case '^': case '_':
3608 case 'a': case 'b': case 'c': case 'd': case 'e':
3609 case 'f': case 'g': case 'h': case 'i': case 'j':
3610 case 'k': case 'l': case 'm': case 'n': case 'o':
3611 case 'p': case 'q': case 'r': case 's': case 't':
3612 case 'u': case 'v': case 'w': case 'x': case 'y':
3613 case 'z': case '{': case '|': case '}': case '~':
3614 /* These characters are printable ASCII characters. */
3616 displayed_width += 1;
3619 /* If we have a multibyte sequence, copy it until we
3620 reach its end, replacing each non-printable multibyte
3621 character with a single question mark. */
3624 memset (&mbstate, 0, sizeof mbstate);
3631 bytes = mbrtowc (&wc, p, plimit - p, &mbstate);
3633 if (bytes == (size_t) -1)
3635 /* An invalid multibyte sequence was
3636 encountered. Skip one input byte, and
3637 put a question mark. */
3640 displayed_width += 1;
3644 if (bytes == (size_t) -2)
3646 /* An incomplete multibyte character
3647 at the end. Replace it entirely with
3651 displayed_width += 1;
3656 /* A null wide character was encountered. */
3662 /* A printable multibyte character.
3664 for (; bytes > 0; --bytes)
3666 displayed_width += w;
3670 /* An unprintable multibyte character.
3671 Replace it entirely with a question
3675 displayed_width += 1;
3678 while (! mbsinit (&mbstate));
3683 /* The buffer may have shrunk. */
3690 char const *plimit = buf + len;
3694 if (! isprint (to_uchar (*p)))
3698 displayed_width = len;
3701 else if (width != NULL)
3705 displayed_width = mbsnwidth (buf, len, 0);
3709 char const *p = buf;
3710 char const *plimit = buf + len;
3712 displayed_width = 0;
3715 if (isprint (to_uchar (*p)))
3723 fwrite (buf, 1, len, out);
3725 *width = displayed_width;
3730 print_name_with_quoting (const char *p, mode_t mode, int linkok,
3731 bool stat_failed, struct obstack *stack)
3733 if (print_with_color)
3734 print_color_indicator (p, mode, linkok, stat_failed);
3737 PUSH_CURRENT_DIRED_POS (stack);
3739 dired_pos += quote_name (stdout, p, filename_quoting_options, NULL);
3742 PUSH_CURRENT_DIRED_POS (stack);
3744 if (print_with_color)
3747 prep_non_filename_text ();
3752 prep_non_filename_text (void)
3754 if (color_indicator[C_END].string != NULL)
3755 put_indicator (&color_indicator[C_END]);
3758 put_indicator (&color_indicator[C_LEFT]);
3759 put_indicator (&color_indicator[C_NORM]);
3760 put_indicator (&color_indicator[C_RIGHT]);
3764 /* Print the file name of `f' with appropriate quoting.
3765 Also print file size, inode number, and filetype indicator character,
3766 as requested by switches. */
3769 print_file_name_and_frills (const struct fileinfo *f)
3771 char buf[MAX (LONGEST_HUMAN_READABLE + 1, INT_BUFSIZE_BOUND (uintmax_t))];
3774 printf ("%*s ", format == with_commas ? 0 : inode_number_width,
3775 umaxtostr (f->stat.st_ino, buf));
3777 if (print_block_size)
3778 printf ("%*s ", format == with_commas ? 0 : block_size_width,
3779 human_readable (ST_NBLOCKS (f->stat), buf, human_output_opts,
3780 ST_NBLOCKSIZE, output_block_size));
3782 print_name_with_quoting (f->name, FILE_OR_LINK_MODE (f), f->linkok,
3783 f->stat_failed, NULL);
3785 if (indicator_style != none)
3786 print_type_indicator (f->stat.st_mode);
3790 print_type_indicator (mode_t mode)
3796 if (indicator_style == classify && (mode & S_IXUGO))
3805 else if (indicator_style == slash)
3807 else if (S_ISLNK (mode))
3809 else if (S_ISFIFO (mode))
3811 else if (S_ISSOCK (mode))
3813 else if (S_ISDOOR (mode))
3824 print_color_indicator (const char *name, mode_t mode, int linkok,
3828 struct color_ext_type *ext; /* Color extension */
3829 size_t len; /* Length of name */
3831 /* Is this a nonexistent file? If so, linkok == -1. */
3833 if (linkok == -1 && color_indicator[C_MISSING].string != NULL)
3842 if ((mode & S_ISVTX) && (mode & S_IWOTH))
3843 type = C_STICKY_OTHER_WRITABLE;
3844 else if ((mode & S_IWOTH) != 0)
3845 type = C_OTHER_WRITABLE;
3846 else if ((mode & S_ISVTX) != 0)
3851 else if (S_ISLNK (mode))
3852 type = ((!linkok && color_indicator[C_ORPHAN].string)
3853 ? C_ORPHAN : C_LINK);
3854 else if (S_ISFIFO (mode))
3856 else if (S_ISSOCK (mode))
3858 else if (S_ISBLK (mode))
3860 else if (S_ISCHR (mode))
3862 else if (S_ISDOOR (mode))
3864 else if (stat_failed)
3869 if ((mode & S_ISUID) != 0)
3871 else if ((mode & S_ISGID) != 0)
3873 else if ((mode & S_IXUGO) != 0)
3877 /* Check the file's suffix only if still classified as C_FILE. */
3881 /* Test if NAME has a recognized suffix. */
3883 len = strlen (name);
3884 name += len; /* Pointer to final \0. */
3885 for (ext = color_ext_list; ext != NULL; ext = ext->next)
3887 if (ext->ext.len <= len
3888 && strncmp (name - ext->ext.len, ext->ext.string,
3895 put_indicator (&color_indicator[C_LEFT]);
3896 put_indicator (ext ? &(ext->seq) : &color_indicator[type]);
3897 put_indicator (&color_indicator[C_RIGHT]);
3900 /* Output a color indicator (which may contain nulls). */
3902 put_indicator (const struct bin_str *ind)
3909 for (i = ind->len; i != 0; --i)
3914 length_of_file_name_and_frills (const struct fileinfo *f)
3918 char buf[MAX (LONGEST_HUMAN_READABLE + 1, INT_BUFSIZE_BOUND (uintmax_t))];
3921 len += 1 + (format == with_commas
3922 ? strlen (umaxtostr (f->stat.st_ino, buf))
3923 : inode_number_width);
3925 if (print_block_size)
3926 len += 1 + (format == with_commas
3927 ? strlen (human_readable (ST_NBLOCKS (f->stat), buf,
3928 human_output_opts, ST_NBLOCKSIZE,
3930 : block_size_width);
3932 quote_name (NULL, f->name, filename_quoting_options, &name_width);
3935 if (indicator_style != none)
3937 mode_t mode = f->stat.st_mode;
3939 len += (S_ISREG (mode)
3940 ? (indicator_style == classify && (mode & S_IXUGO))
3942 || (indicator_style != slash
3946 || S_ISDOOR (mode)))));
3953 print_many_per_line (void)
3955 size_t row; /* Current row. */
3956 size_t cols = calculate_columns (true);
3957 struct column_info const *line_fmt = &column_info[cols - 1];
3959 /* Calculate the number of rows that will be in each column except possibly
3960 for a short column on the right. */
3961 size_t rows = files_index / cols + (files_index % cols != 0);
3963 for (row = 0; row < rows; row++)
3966 size_t filesno = row;
3969 /* Print the next row. */
3972 size_t name_length = length_of_file_name_and_frills (files + filesno);
3973 size_t max_name_length = line_fmt->col_arr[col++];
3974 print_file_name_and_frills (files + filesno);
3977 if (filesno >= files_index)
3980 indent (pos + name_length, pos + max_name_length);
3981 pos += max_name_length;
3988 print_horizontal (void)
3992 size_t cols = calculate_columns (false);
3993 struct column_info const *line_fmt = &column_info[cols - 1];
3994 size_t name_length = length_of_file_name_and_frills (files);
3995 size_t max_name_length = line_fmt->col_arr[0];
3997 /* Print first entry. */
3998 print_file_name_and_frills (files);
4001 for (filesno = 1; filesno < files_index; ++filesno)
4003 size_t col = filesno % cols;
4012 indent (pos + name_length, pos + max_name_length);
4013 pos += max_name_length;
4016 print_file_name_and_frills (files + filesno);
4018 name_length = length_of_file_name_and_frills (files + filesno);
4019 max_name_length = line_fmt->col_arr[col];
4025 print_with_commas (void)
4030 for (filesno = 0; filesno < files_index; filesno++)
4032 size_t len = length_of_file_name_and_frills (files + filesno);
4038 if (pos + len + 2 < line_length)
4050 putchar (separator);
4053 print_file_name_and_frills (files + filesno);
4059 /* Assuming cursor is at position FROM, indent up to position TO.
4060 Use a TAB character instead of two or more spaces whenever possible. */
4063 indent (size_t from, size_t to)
4067 if (tabsize != 0 && to / tabsize > (from + 1) / tabsize)
4070 from += tabsize - from % tabsize;
4080 /* Put DIRNAME/NAME into DEST, handling `.' and `/' properly. */
4081 /* FIXME: maybe remove this function someday. See about using a
4082 non-malloc'ing version of file_name_concat. */
4085 attach (char *dest, const char *dirname, const char *name)
4087 const char *dirnamep = dirname;
4089 /* Copy dirname if it is not ".". */
4090 if (dirname[0] != '.' || dirname[1] != 0)
4093 *dest++ = *dirnamep++;
4094 /* Add '/' if `dirname' doesn't already end with it. */
4095 if (dirnamep > dirname && dirnamep[-1] != '/')
4103 /* Allocate enough column info suitable for the current number of
4104 files and display columns, and initialize the info to represent the
4105 narrowest possible columns. */
4108 init_column_info (void)
4111 size_t max_cols = MIN (max_idx, files_index);
4113 /* Currently allocated columns in column_info. */
4114 static size_t column_info_alloc;
4116 if (column_info_alloc < max_cols)
4118 size_t new_column_info_alloc;
4121 if (max_cols < max_idx / 2)
4123 /* The number of columns is far less than the display width
4124 allows. Grow the allocation, but only so that it's
4125 double the current requirements. If the display is
4126 extremely wide, this avoids allocating a lot of memory
4127 that is never needed. */
4128 column_info = xnrealloc (column_info, max_cols,
4129 2 * sizeof *column_info);
4130 new_column_info_alloc = 2 * max_cols;
4134 column_info = xnrealloc (column_info, max_idx, sizeof *column_info);
4135 new_column_info_alloc = max_idx;
4138 /* Allocate the new size_t objects by computing the triangle
4139 formula n * (n + 1) / 2, except that we don't need to
4140 allocate the part of the triangle that we've already
4141 allocated. Check for address arithmetic overflow. */
4143 size_t column_info_growth = new_column_info_alloc - column_info_alloc;
4144 size_t s = column_info_alloc + 1 + new_column_info_alloc;
4145 size_t t = s * column_info_growth;
4146 if (s < new_column_info_alloc || t / column_info_growth != s)
4148 p = xnmalloc (t / 2, sizeof *p);
4151 /* Grow the triangle by parceling out the cells just allocated. */
4152 for (i = column_info_alloc; i < new_column_info_alloc; i++)
4154 column_info[i].col_arr = p;
4158 column_info_alloc = new_column_info_alloc;
4161 for (i = 0; i < max_cols; ++i)
4165 column_info[i].valid_len = true;
4166 column_info[i].line_len = (i + 1) * MIN_COLUMN_WIDTH;
4167 for (j = 0; j <= i; ++j)
4168 column_info[i].col_arr[j] = MIN_COLUMN_WIDTH;
4172 /* Calculate the number of columns needed to represent the current set
4173 of files in the current display width. */
4176 calculate_columns (bool by_columns)
4178 size_t filesno; /* Index into files. */
4179 size_t cols; /* Number of files across. */
4181 /* Normally the maximum number of columns is determined by the
4182 screen width. But if few files are available this might limit it
4184 size_t max_cols = MIN (max_idx, files_index);
4186 init_column_info ();
4188 /* Compute the maximum number of possible columns. */
4189 for (filesno = 0; filesno < files_index; ++filesno)
4191 size_t name_length = length_of_file_name_and_frills (files + filesno);
4194 for (i = 0; i < max_cols; ++i)
4196 if (column_info[i].valid_len)
4198 size_t idx = (by_columns
4199 ? filesno / ((files_index + i) / (i + 1))
4200 : filesno % (i + 1));
4201 size_t real_length = name_length + (idx == i ? 0 : 2);
4203 if (column_info[i].col_arr[idx] < real_length)
4205 column_info[i].line_len += (real_length
4206 - column_info[i].col_arr[idx]);
4207 column_info[i].col_arr[idx] = real_length;
4208 column_info[i].valid_len = (column_info[i].line_len
4215 /* Find maximum allowed columns. */
4216 for (cols = max_cols; 1 < cols; --cols)
4218 if (column_info[cols - 1].valid_len)
4228 if (status != EXIT_SUCCESS)
4229 fprintf (stderr, _("Try `%s --help' for more information.\n"),
4233 printf (_("Usage: %s [OPTION]... [FILE]...\n"), program_name);
4235 List information about the FILEs (the current directory by default).\n\
4236 Sort entries alphabetically if none of -cftuvSUX nor --sort.\n\
4240 Mandatory arguments to long options are mandatory for short options too.\n\
4243 -a, --all do not ignore entries starting with .\n\
4244 -A, --almost-all do not list implied . and ..\n\
4245 --author with -l, print the author of each file\n\
4246 -b, --escape print octal escapes for nongraphic characters\n\
4249 --block-size=SIZE use SIZE-byte blocks\n\
4250 -B, --ignore-backups do not list implied entries ending with ~\n\
4251 -c with -lt: sort by, and show, ctime (time of last\n\
4252 modification of file status information)\n\
4253 with -l: show ctime and sort by name\n\
4254 otherwise: sort by ctime\n\
4257 -C list entries by columns\n\
4258 --color[=WHEN] control whether color is used to distinguish file\n\
4259 types. WHEN may be `never', `always', or `auto'\n\
4260 -d, --directory list directory entries instead of contents,\n\
4261 and do not dereference symbolic links\n\
4262 -D, --dired generate output designed for Emacs' dired mode\n\
4265 -f do not sort, enable -aU, disable -ls --color\n\
4266 -F, --classify append indicator (one of */=>@|) to entries\n\
4267 --file-type likewise, except do not append `*'\n\
4268 --format=WORD across -x, commas -m, horizontal -x, long -l,\n\
4269 single-column -1, verbose -l, vertical -C\n\
4270 --full-time like -l --time-style=full-iso\n\
4273 -g like -l, but do not list owner\n\
4276 --group-directories-first\n\
4277 group directories before files\n\
4280 -G, --no-group in a long listing, don't print group names\n\
4281 -h, --human-readable with -l, print sizes in human readable format\n\
4282 (e.g., 1K 234M 2G)\n\
4283 --si likewise, but use powers of 1000 not 1024\n\
4284 -H, --dereference-command-line\n\
4285 follow symbolic links listed on the command line\n\
4286 --dereference-command-line-symlink-to-dir\n\
4287 follow each command line symbolic link\n\
4288 that points to a directory\n\
4289 --hide=PATTERN do not list implied entries matching shell PATTERN\n\
4290 (overridden by -a or -A)\n\
4293 --indicator-style=WORD append indicator with style WORD to entry names:\n\
4294 none (default), slash (-p),\n\
4295 file-type (--file-type), classify (-F)\n\
4296 -i, --inode print the index number of each file\n\
4297 -I, --ignore=PATTERN do not list implied entries matching shell PATTERN\n\
4298 -k like --block-size=1K\n\
4301 -l use a long listing format\n\
4302 -L, --dereference when showing file information for a symbolic\n\
4303 link, show information for the file the link\n\
4304 references rather than for the link itself\n\
4305 -m fill width with a comma separated list of entries\n\
4308 -n, --numeric-uid-gid like -l, but list numeric user and group IDs\n\
4309 -N, --literal print raw entry names (don't treat e.g. control\n\
4310 characters specially)\n\
4311 -o like -l, but do not list group information\n\
4312 -p, --indicator-style=slash\n\
4313 append / indicator to directories\n\
4316 -q, --hide-control-chars print ? instead of non graphic characters\n\
4317 --show-control-chars show non graphic characters as-is (default\n\
4318 unless program is `ls' and output is a terminal)\n\
4319 -Q, --quote-name enclose entry names in double quotes\n\
4320 --quoting-style=WORD use quoting style WORD for entry names:\n\
4321 literal, locale, shell, shell-always, c, escape\n\
4324 -r, --reverse reverse order while sorting\n\
4325 -R, --recursive list subdirectories recursively\n\
4326 -s, --size with -l, print size of each file, in blocks\n\
4329 -S sort by file size\n\
4330 --sort=WORD sort by WORD instead of name: none -U,\n\
4331 extension -X, size -S, time -t, version -v\n\
4332 --time=WORD with -l, show time as WORD instead of modification\n\
4333 time: atime -u, access -u, use -u, ctime -c,\n\
4334 or status -c; use specified time as sort key\n\
4338 --time-style=STYLE with -l, show times using style STYLE:\n\
4339 full-iso, long-iso, iso, locale, +FORMAT.\n\
4340 FORMAT is interpreted like `date'; if FORMAT is\n\
4341 FORMAT1<newline>FORMAT2, FORMAT1 applies to\n\
4342 non-recent files and FORMAT2 to recent files;\n\
4343 if STYLE is prefixed with `posix-', STYLE\n\
4344 takes effect only outside the POSIX locale\n\
4345 -t sort by modification time\n\
4346 -T, --tabsize=COLS assume tab stops at each COLS instead of 8\n\
4349 -u with -lt: sort by, and show, access time\n\
4350 with -l: show access time and sort by name\n\
4351 otherwise: sort by access time\n\
4352 -U do not sort; list entries in directory order\n\
4353 -v sort by version\n\
4356 -w, --width=COLS assume screen width instead of current value\n\
4357 -x list entries by lines instead of by columns\n\
4358 -X sort alphabetically by entry extension\n\
4359 -1 list one file per line\n\
4361 fputs (HELP_OPTION_DESCRIPTION, stdout);
4362 fputs (VERSION_OPTION_DESCRIPTION, stdout);
4364 SIZE may be (or may be an integer optionally followed by) one of following:\n\
4365 kB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.\n\
4369 By default, color is not used to distinguish types of files. That is\n\
4370 equivalent to using --color=none. Using the --color option without the\n\
4371 optional WHEN argument is equivalent to using --color=always. With\n\
4372 --color=auto, color codes are output only if standard output is connected\n\
4373 to a terminal (tty). The environment variable LS_COLORS can influence the\n\
4374 colors, and can be set easily by the dircolors command.\n\
4378 Exit status is 0 if OK, 1 if minor problems, 2 if serious trouble.\n\
4380 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);