diff options
| -rw-r--r-- | coreutils/ls.c | 220 |
1 files changed, 131 insertions, 89 deletions
diff --git a/coreutils/ls.c b/coreutils/ls.c index 2929b9622..18cffb13e 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c | |||
| @@ -808,93 +808,134 @@ static int list_single(struct dnode *dn) | |||
| 808 | 808 | ||
| 809 | /*----------------------------------------------------------------------*/ | 809 | /*----------------------------------------------------------------------*/ |
| 810 | 810 | ||
| 811 | static const char ls_opts[] = "1AaCdgilnsx" | 811 | /* "[-]Cadil1", POSIX mandated options, busybox always supports */ |
| 812 | #ifdef CONFIG_FEATURE_LS_FILETYPES | 812 | /* "[-]gnsx", POSIX non-mandated options, busybox always supports */ |
| 813 | "Fp" | 813 | /* "[-]Ak" GNU options, busybox always supports */ |
| 814 | #endif | 814 | /* "[-]FLRctur", POSIX mandated options, busybox optionally supports */ |
| 815 | #ifdef CONFIG_FEATURE_LS_RECURSIVE | 815 | /* "[-]p", POSIX non-mandated options, busybox optionally supports */ |
| 816 | "R" | 816 | /* "[-]SXvThw", GNU options, busybox optionally supports */ |
| 817 | /* "[-]K", SELinux mandated options, busybox optionally supports */ | ||
| 818 | /* "[-]e", I think we made this one up */ | ||
| 819 | |||
| 820 | #ifdef CONFIG_FEATURE_LS_TIMESTAMPS | ||
| 821 | # define LS_STR_TIMESTAMPS "cetu" | ||
| 822 | #else | ||
| 823 | # define LS_STR_TIMESTAMPS "" | ||
| 817 | #endif | 824 | #endif |
| 825 | |||
| 818 | #ifdef CONFIG_FEATURE_LS_SORTFILES | 826 | #ifdef CONFIG_FEATURE_LS_SORTFILES |
| 819 | "rSvX" | 827 | # define LS_STR_SORTFILES "SXrv" |
| 828 | #else | ||
| 829 | # define LS_STR_SORTFILES "" | ||
| 820 | #endif | 830 | #endif |
| 821 | #ifdef CONFIG_FEATURE_LS_TIMESTAMPS | 831 | |
| 822 | "ecut" | 832 | #ifdef CONFIG_FEATURE_LS_FILETYPES |
| 833 | # define LS_STR_FILETYPES "Fp" | ||
| 834 | #else | ||
| 835 | # define LS_STR_FILETYPES "" | ||
| 823 | #endif | 836 | #endif |
| 837 | |||
| 824 | #ifdef CONFIG_FEATURE_LS_FOLLOWLINKS | 838 | #ifdef CONFIG_FEATURE_LS_FOLLOWLINKS |
| 825 | "L" | 839 | # define LS_STR_FOLLOW_LINKS "L" |
| 840 | #else | ||
| 841 | # define LS_STR_FOLLOW_LINKS "" | ||
| 842 | #endif | ||
| 843 | |||
| 844 | #ifdef CONFIG_FEATURE_LS_RECURSIVE | ||
| 845 | # define LS_STR_RECURSIVE "R" | ||
| 846 | #else | ||
| 847 | # define LS_STR_RECURSIVE "" | ||
| 826 | #endif | 848 | #endif |
| 849 | |||
| 827 | #ifdef CONFIG_FEATURE_HUMAN_READABLE | 850 | #ifdef CONFIG_FEATURE_HUMAN_READABLE |
| 828 | "h" | 851 | # define LS_STR_HUMAN_READABLE "h" |
| 852 | #else | ||
| 853 | # define LS_STR_HUMAN_READABLE "" | ||
| 829 | #endif | 854 | #endif |
| 830 | "k" | 855 | |
| 831 | #ifdef CONFIG_SELINUX | 856 | #ifdef CONFIG_SELINUX |
| 832 | "K" | 857 | # define LS_STR_SELINUX "K" |
| 858 | #else | ||
| 859 | # define LS_STR_SELINUX "" | ||
| 833 | #endif | 860 | #endif |
| 861 | |||
| 834 | #ifdef CONFIG_FEATURE_AUTOWIDTH | 862 | #ifdef CONFIG_FEATURE_AUTOWIDTH |
| 835 | "T:w:" | 863 | # define LS_STR_AUTOWIDTH "T:w:" |
| 864 | #else | ||
| 865 | # define LS_STR_AUTOWIDTH "" | ||
| 836 | #endif | 866 | #endif |
| 837 | ; | ||
| 838 | 867 | ||
| 839 | #define LIST_MASK_TRIGGER LIST_SHORT | 868 | static const char ls_options[]="Cadil1gnsxAk" \ |
| 840 | #define STYLE_MASK_TRIGGER STYLE_MASK | 869 | LS_STR_TIMESTAMPS \ |
| 841 | #define SORT_MASK_TRIGGER SORT_MASK | 870 | LS_STR_SORTFILES \ |
| 842 | #define DISP_MASK_TRIGGER DISP_ROWS | 871 | LS_STR_FILETYPES \ |
| 843 | #define TIME_MASK_TRIGGER TIME_MASK | 872 | LS_STR_FOLLOW_LINKS \ |
| 873 | LS_STR_RECURSIVE \ | ||
| 874 | LS_STR_HUMAN_READABLE \ | ||
| 875 | LS_STR_SELINUX \ | ||
| 876 | LS_STR_AUTOWIDTH; | ||
| 877 | |||
| 878 | #define LIST_MASK_TRIGGER LIST_SHORT | ||
| 879 | #define STYLE_MASK_TRIGGER STYLE_MASK | ||
| 880 | #define SORT_MASK_TRIGGER SORT_MASK | ||
| 881 | #define DISP_MASK_TRIGGER DISP_ROWS | ||
| 882 | #define TIME_MASK_TRIGGER TIME_MASK | ||
| 844 | 883 | ||
| 845 | static const unsigned opt_flags[] = { | 884 | static const unsigned opt_flags[] = { |
| 846 | LIST_SHORT | STYLE_SINGLE, /* 1 */ | ||
| 847 | DISP_HIDDEN, /* A */ | ||
| 848 | DISP_HIDDEN | DISP_DOT, /* a */ | ||
| 849 | LIST_SHORT | STYLE_COLUMNS, /* C */ | 885 | LIST_SHORT | STYLE_COLUMNS, /* C */ |
| 850 | DISP_NOLIST, /* d */ | 886 | DISP_HIDDEN | DISP_DOT, /* a */ |
| 851 | 0, /* g - ingored */ | 887 | DISP_NOLIST, /* d */ |
| 852 | LIST_INO, /* i */ | 888 | LIST_INO, /* i */ |
| 853 | LIST_LONG | STYLE_LONG, /* l - remember LS_DISP_HR in mask! */ | 889 | LIST_LONG | STYLE_LONG, /* l - remember LS_DISP_HR in mask! */ |
| 854 | LIST_ID_NUMERIC, /* n */ | 890 | LIST_SHORT | STYLE_SINGLE, /* 1 */ |
| 855 | LIST_BLOCKS, /* s */ | 891 | 0, /* g - ingored */ |
| 856 | DISP_ROWS, /* x */ | 892 | LIST_ID_NUMERIC, /* n */ |
| 857 | #ifdef CONFIG_FEATURE_LS_FILETYPES | 893 | LIST_BLOCKS, /* s */ |
| 858 | LIST_FILETYPE | LIST_EXEC, /* F */ | 894 | DISP_ROWS, /* x */ |
| 859 | LIST_FILETYPE, /* p */ | 895 | DISP_HIDDEN, /* A */ |
| 860 | #endif | 896 | #ifdef CONFIG_SELINUX |
| 861 | #ifdef CONFIG_FEATURE_LS_RECURSIVE | 897 | LIST_CONTEXT, /* k */ |
| 862 | DISP_RECURSIVE, /* R */ | 898 | #else |
| 863 | #endif | 899 | 0, /* k - ingored */ |
| 864 | #ifdef CONFIG_FEATURE_LS_SORTFILES | ||
| 865 | SORT_ORDER_REVERSE, /* r */ | ||
| 866 | SORT_SIZE, /* S */ | ||
| 867 | SORT_VERSION, /* v */ | ||
| 868 | SORT_EXT, /* v */ | ||
| 869 | #endif | 900 | #endif |
| 870 | #ifdef CONFIG_FEATURE_LS_TIMESTAMPS | 901 | #ifdef CONFIG_FEATURE_LS_TIMESTAMPS |
| 871 | LIST_FULLTIME, /* e */ | 902 | # ifdef CONFIG_FEATURE_LS_SORTFILES |
| 872 | #ifdef CONFIG_FEATURE_LS_SORTFILES | ||
| 873 | TIME_CHANGE | SORT_CTIME, /* c */ | 903 | TIME_CHANGE | SORT_CTIME, /* c */ |
| 874 | #else | 904 | # else |
| 875 | TIME_CHANGE, /* c */ | 905 | TIME_CHANGE, /* c */ |
| 876 | #endif | 906 | # endif |
| 877 | #ifdef CONFIG_FEATURE_LS_SORTFILES | 907 | LIST_FULLTIME, /* e */ |
| 908 | # ifdef CONFIG_FEATURE_LS_SORTFILES | ||
| 909 | SORT_MTIME, /* t */ | ||
| 910 | # else | ||
| 911 | 0, /* t - ignored -- is this correct? */ | ||
| 912 | # endif | ||
| 913 | # ifdef CONFIG_FEATURE_LS_SORTFILES | ||
| 878 | TIME_ACCESS | SORT_ATIME, /* u */ | 914 | TIME_ACCESS | SORT_ATIME, /* u */ |
| 879 | #else | 915 | # else |
| 880 | TIME_ACCESS, /* u */ | 916 | TIME_ACCESS, /* u */ |
| 917 | # endif | ||
| 881 | #endif | 918 | #endif |
| 882 | #ifdef CONFIG_FEATURE_LS_SORTFILES | 919 | #ifdef CONFIG_FEATURE_LS_SORTFILES |
| 883 | SORT_MTIME, /* t */ | 920 | SORT_ORDER_REVERSE, /* r */ |
| 884 | #else | 921 | SORT_SIZE, /* S */ |
| 885 | 0, /* t - ignored -- is this correct? */ | 922 | SORT_VERSION, /* v */ |
| 923 | SORT_EXT, /* v */ | ||
| 886 | #endif | 924 | #endif |
| 925 | #ifdef CONFIG_FEATURE_LS_FILETYPES | ||
| 926 | LIST_FILETYPE | LIST_EXEC, /* F */ | ||
| 927 | LIST_FILETYPE, /* p */ | ||
| 887 | #endif | 928 | #endif |
| 888 | #ifdef CONFIG_FEATURE_LS_FOLLOWLINKS | 929 | #ifdef CONFIG_FEATURE_LS_FOLLOWLINKS |
| 889 | FOLLOW_LINKS, /* L */ | 930 | FOLLOW_LINKS, /* L */ |
| 931 | #endif | ||
| 932 | #ifdef CONFIG_FEATURE_LS_RECURSIVE | ||
| 933 | DISP_RECURSIVE, /* R */ | ||
| 890 | #endif | 934 | #endif |
| 891 | #ifdef CONFIG_FEATURE_HUMAN_READABLE | 935 | #ifdef CONFIG_FEATURE_HUMAN_READABLE |
| 892 | LS_DISP_HR, /* h */ | 936 | LS_DISP_HR, /* h */ |
| 893 | #endif | 937 | #endif |
| 894 | #ifndef CONFIG_SELINUX | 938 | #ifdef CONFIG_SELINUX |
| 895 | 0, /* k - ingored */ | ||
| 896 | #else | ||
| 897 | LIST_CONTEXT, /* k */ | ||
| 898 | LIST_MODEBITS|LIST_NLINKS|LIST_CONTEXT|LIST_SIZE|LIST_DATE_TIME, /* K */ | 939 | LIST_MODEBITS|LIST_NLINKS|LIST_CONTEXT|LIST_SIZE|LIST_DATE_TIME, /* K */ |
| 899 | #endif | 940 | #endif |
| 900 | }; | 941 | }; |
| @@ -904,13 +945,24 @@ LS_DISP_HR, /* h */ | |||
| 904 | 945 | ||
| 905 | extern int ls_main(int argc, char **argv) | 946 | extern int ls_main(int argc, char **argv) |
| 906 | { | 947 | { |
| 907 | struct dnode **dnf, **dnd; | 948 | struct dnode **dnd; |
| 908 | int dnfiles, dndirs; | 949 | struct dnode **dnf; |
| 909 | struct dnode *dn, *cur, **dnp; | 950 | struct dnode **dnp; |
| 910 | int i, nfiles; | 951 | struct dnode *dn; |
| 911 | int opt; | 952 | struct dnode *cur; |
| 912 | int oi, ac; | 953 | long opt; |
| 954 | int nfiles = 0; | ||
| 955 | int dnfiles; | ||
| 956 | int dndirs; | ||
| 957 | int oi; | ||
| 958 | int ac; | ||
| 959 | int i; | ||
| 913 | char **av; | 960 | char **av; |
| 961 | #ifdef CONFIG_FEATURE_AUTOWIDTH | ||
| 962 | char *tabstops_str = NULL; | ||
| 963 | char *terminal_width_str = NULL; | ||
| 964 | #endif | ||
| 965 | |||
| 914 | #ifdef CONFIG_SELINUX | 966 | #ifdef CONFIG_SELINUX |
| 915 | is_flask_enabled_flag = is_flask_enabled(); | 967 | is_flask_enabled_flag = is_flask_enabled(); |
| 916 | #endif | 968 | #endif |
| @@ -923,13 +975,13 @@ extern int ls_main(int argc, char **argv) | |||
| 923 | | SORT_NAME | SORT_ORDER_FORWARD | 975 | | SORT_NAME | SORT_ORDER_FORWARD |
| 924 | #endif | 976 | #endif |
| 925 | ; | 977 | ; |
| 978 | |||
| 926 | #ifdef CONFIG_FEATURE_AUTOWIDTH | 979 | #ifdef CONFIG_FEATURE_AUTOWIDTH |
| 927 | /* Obtain the terminal width. */ | 980 | /* Obtain the terminal width. */ |
| 928 | get_terminal_width_height(0, &terminal_width, NULL); | 981 | get_terminal_width_height(0, &terminal_width, NULL); |
| 929 | /* Go one less... */ | 982 | /* Go one less... */ |
| 930 | terminal_width--; | 983 | terminal_width--; |
| 931 | #endif | 984 | #endif |
| 932 | nfiles = 0; | ||
| 933 | 985 | ||
| 934 | #ifdef CONFIG_FEATURE_LS_COLOR | 986 | #ifdef CONFIG_FEATURE_LS_COLOR |
| 935 | if (isatty(fileno(stdout))) | 987 | if (isatty(fileno(stdout))) |
| @@ -937,27 +989,21 @@ extern int ls_main(int argc, char **argv) | |||
| 937 | #endif | 989 | #endif |
| 938 | 990 | ||
| 939 | /* process options */ | 991 | /* process options */ |
| 940 | while ((opt = getopt(argc, argv, ls_opts)) > 0) { | ||
| 941 | #ifdef CONFIG_FEATURE_AUTOWIDTH | 992 | #ifdef CONFIG_FEATURE_AUTOWIDTH |
| 942 | if (opt == 'T') { | 993 | opt = bb_getopt_ulflags(argc, argv, ls_options, &tabstops_str, &terminal_width_str); |
| 943 | tabstops = atoi(optarg); | 994 | if (tabstops_str) { |
| 944 | continue; | 995 | tabstops = atoi(tabstops_str); |
| 945 | } | 996 | } |
| 946 | if (opt == 'w') { | 997 | if (terminal_width_str) { |
| 947 | terminal_width = atoi(optarg); | 998 | terminal_width = atoi(terminal_width_str); |
| 948 | continue; | 999 | } |
| 949 | } | 1000 | #else |
| 950 | if (opt == ':') { | 1001 | opt = bb_getopt_ulflags(argc, argv, ls_options); |
| 951 | goto print_usage_message; | ||
| 952 | } | ||
| 953 | #endif | 1002 | #endif |
| 954 | { | 1003 | /* 16 = maximum options minus tabsize and screewn width */ |
| 955 | unsigned int flags; | 1004 | for (i = 0; i < 16; i++) { |
| 956 | const char *p = strchr(ls_opts, opt); | 1005 | if (opt & (1 << i)) { |
| 957 | if (!p) { /* shouldn't be necessary */ | 1006 | unsigned int flags = opt_flags[i]; |
| 958 | goto print_usage_message; | ||
| 959 | } | ||
| 960 | flags = opt_flags[(int)(p - ls_opts)]; | ||
| 961 | if (flags & LIST_MASK_TRIGGER) { | 1007 | if (flags & LIST_MASK_TRIGGER) { |
| 962 | all_fmt &= ~LIST_MASK; | 1008 | all_fmt &= ~LIST_MASK; |
| 963 | } | 1009 | } |
| @@ -989,7 +1035,6 @@ extern int ls_main(int argc, char **argv) | |||
| 989 | } | 1035 | } |
| 990 | } | 1036 | } |
| 991 | 1037 | ||
| 992 | |||
| 993 | /* sort out which command line options take precedence */ | 1038 | /* sort out which command line options take precedence */ |
| 994 | #ifdef CONFIG_FEATURE_LS_RECURSIVE | 1039 | #ifdef CONFIG_FEATURE_LS_RECURSIVE |
| 995 | if (all_fmt & DISP_NOLIST) | 1040 | if (all_fmt & DISP_NOLIST) |
| @@ -1088,7 +1133,4 @@ extern int ls_main(int argc, char **argv) | |||
| 1088 | } | 1133 | } |
| 1089 | } | 1134 | } |
| 1090 | return (status); | 1135 | return (status); |
| 1091 | |||
| 1092 | print_usage_message: | ||
| 1093 | bb_show_usage(); | ||
| 1094 | } | 1136 | } |
