~vcs-imports/busybox/trunk

« back to all changes in this revision

Viewing changes to findutils/xargs.c

  • Committer: Denys Vlasenko
  • Author(s): Roger Knecht
  • Date: 2022-06-30 15:18:12 UTC
  • Revision ID: git-v1:20a4f70ecaad79bb932af09b7317a058872cd867
tree: new applet

Adds the tree program to list directories and files in a tree structure.

function                                             old     new   delta
tree_print                                             -     343    +343
scandir64                                              -     330    +330
scandir                                                -     330    +330
tree_main                                              -      86     +86
.rodata                                           105150  105228     +78
packed_usage                                       34511   34557     +46
alphasort64                                            -      31     +31
alphasort                                              -      31     +31
strcoll                                                -       5      +5
applet_names                                        2801    2806      +5
applet_main                                         1616    1620      +4
applet_suid                                          101     102      +1
applet_install_loc                                   202     203      +1
------------------------------------------------------------------------------
(add/remove: 11/0 grow/shrink: 6/0 up/down: 1291/0)          Total: 1291 bytes

Signed-off-by: Roger Knecht <rknecht@pm.me>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
 * http://www.opengroup.org/onlinepubs/007904975/utilities/xargs.html
16
16
 */
17
17
//config:config XARGS
18
 
//config:       bool "xargs (7.6 kb)"
 
18
//config:       bool "xargs (7.2 kb)"
19
19
//config:       default y
20
20
//config:       help
21
21
//config:       xargs is used to execute a specified command for
111
111
#endif
112
112
        const char *eof_str;
113
113
        int idx;
114
 
        int fd_tty;
115
 
        int fd_stdin;
116
114
#if ENABLE_FEATURE_XARGS_SUPPORT_PARALLEL
117
115
        int running_procs;
118
116
        int max_procs;
142
140
        IF_FEATURE_XARGS_SUPPORT_QUOTES(G.process_stdin__q = '\0';) \
143
141
} while (0)
144
142
 
145
 
/* Correct regardless of combination of CONFIG_xxx */
146
 
enum {
147
 
        OPTBIT_VERBOSE = 0,
148
 
        OPTBIT_NO_EMPTY,
149
 
        OPTBIT_UPTO_NUMBER,
150
 
        OPTBIT_UPTO_SIZE,
151
 
        OPTBIT_EOF_STRING,
152
 
        OPTBIT_EOF_STRING1,
153
 
        OPTBIT_STDIN_TTY,
154
 
        IF_FEATURE_XARGS_SUPPORT_CONFIRMATION(OPTBIT_INTERACTIVE,)
155
 
        IF_FEATURE_XARGS_SUPPORT_TERMOPT(     OPTBIT_TERMINATE  ,)
156
 
        IF_FEATURE_XARGS_SUPPORT_ZERO_TERM(   OPTBIT_ZEROTERM   ,)
157
 
        IF_FEATURE_XARGS_SUPPORT_REPL_STR(    OPTBIT_REPLSTR    ,)
158
 
        IF_FEATURE_XARGS_SUPPORT_REPL_STR(    OPTBIT_REPLSTR1   ,)
159
 
 
160
 
        OPT_VERBOSE     = 1 << OPTBIT_VERBOSE    ,
161
 
        OPT_NO_EMPTY    = 1 << OPTBIT_NO_EMPTY   ,
162
 
        OPT_UPTO_NUMBER = 1 << OPTBIT_UPTO_NUMBER,
163
 
        OPT_UPTO_SIZE   = 1 << OPTBIT_UPTO_SIZE  ,
164
 
        OPT_EOF_STRING  = 1 << OPTBIT_EOF_STRING , /* GNU: -e[<param>] */
165
 
        OPT_EOF_STRING1 = 1 << OPTBIT_EOF_STRING1, /* SUS: -E<param> */
166
 
        OPT_STDIN_TTY   = 1 << OPTBIT_STDIN_TTY,
167
 
        OPT_INTERACTIVE = IF_FEATURE_XARGS_SUPPORT_CONFIRMATION((1 << OPTBIT_INTERACTIVE)) + 0,
168
 
        OPT_TERMINATE   = IF_FEATURE_XARGS_SUPPORT_TERMOPT(     (1 << OPTBIT_TERMINATE  )) + 0,
169
 
        OPT_ZEROTERM    = IF_FEATURE_XARGS_SUPPORT_ZERO_TERM(   (1 << OPTBIT_ZEROTERM   )) + 0,
170
 
        OPT_REPLSTR     = IF_FEATURE_XARGS_SUPPORT_REPL_STR(    (1 << OPTBIT_REPLSTR    )) + 0,
171
 
        OPT_REPLSTR1    = IF_FEATURE_XARGS_SUPPORT_REPL_STR(    (1 << OPTBIT_REPLSTR1   )) + 0,
172
 
};
173
 
#define OPTION_STR "+trn:s:e::E:o" \
174
 
        IF_FEATURE_XARGS_SUPPORT_CONFIRMATION("p") \
175
 
        IF_FEATURE_XARGS_SUPPORT_TERMOPT(     "x") \
176
 
        IF_FEATURE_XARGS_SUPPORT_ZERO_TERM(   "0") \
177
 
        IF_FEATURE_XARGS_SUPPORT_REPL_STR(    "I:i::") \
178
 
        IF_FEATURE_XARGS_SUPPORT_PARALLEL(    "P:+") \
179
 
        IF_FEATURE_XARGS_SUPPORT_ARGS_FILE(   "a:")
180
 
 
181
143
 
182
144
/*
183
145
 * Returns 0 if xargs should continue (but may set G.xargs_exitcode to 123).
189
151
{
190
152
        int status;
191
153
 
192
 
        if (option_mask32 & OPT_STDIN_TTY)
193
 
                xdup2(G.fd_tty, STDIN_FILENO);
194
 
 
195
154
#if !ENABLE_FEATURE_XARGS_SUPPORT_PARALLEL
196
155
        status = spawn_and_wait(G.args);
197
156
#else
278
237
 ret:
279
238
        if (status != 0)
280
239
                G.xargs_exitcode = status;
281
 
        if (option_mask32 & OPT_STDIN_TTY)
282
 
                xdup2(G.fd_stdin, STDIN_FILENO);
283
240
        return status;
284
241
}
285
242
 
585
542
//usage:        IF_FEATURE_XARGS_SUPPORT_ARGS_FILE(
586
543
//usage:     "\n        -a FILE Read from FILE instead of stdin"
587
544
//usage:        )
588
 
//usage:     "\n        -o      Reopen stdin as /dev/tty"
589
545
//usage:     "\n        -r      Don't run command if input is empty"
590
546
//usage:     "\n        -t      Print the command on stderr before execution"
591
547
//usage:        IF_FEATURE_XARGS_SUPPORT_CONFIRMATION(
607
563
//usage:       "$ ls | xargs gzip\n"
608
564
//usage:       "$ find . -name '*.c' -print | xargs rm\n"
609
565
 
 
566
/* Correct regardless of combination of CONFIG_xxx */
 
567
enum {
 
568
        OPTBIT_VERBOSE = 0,
 
569
        OPTBIT_NO_EMPTY,
 
570
        OPTBIT_UPTO_NUMBER,
 
571
        OPTBIT_UPTO_SIZE,
 
572
        OPTBIT_EOF_STRING,
 
573
        OPTBIT_EOF_STRING1,
 
574
        IF_FEATURE_XARGS_SUPPORT_CONFIRMATION(OPTBIT_INTERACTIVE,)
 
575
        IF_FEATURE_XARGS_SUPPORT_TERMOPT(     OPTBIT_TERMINATE  ,)
 
576
        IF_FEATURE_XARGS_SUPPORT_ZERO_TERM(   OPTBIT_ZEROTERM   ,)
 
577
        IF_FEATURE_XARGS_SUPPORT_REPL_STR(    OPTBIT_REPLSTR    ,)
 
578
        IF_FEATURE_XARGS_SUPPORT_REPL_STR(    OPTBIT_REPLSTR1   ,)
 
579
 
 
580
        OPT_VERBOSE     = 1 << OPTBIT_VERBOSE    ,
 
581
        OPT_NO_EMPTY    = 1 << OPTBIT_NO_EMPTY   ,
 
582
        OPT_UPTO_NUMBER = 1 << OPTBIT_UPTO_NUMBER,
 
583
        OPT_UPTO_SIZE   = 1 << OPTBIT_UPTO_SIZE  ,
 
584
        OPT_EOF_STRING  = 1 << OPTBIT_EOF_STRING , /* GNU: -e[<param>] */
 
585
        OPT_EOF_STRING1 = 1 << OPTBIT_EOF_STRING1, /* SUS: -E<param> */
 
586
        OPT_INTERACTIVE = IF_FEATURE_XARGS_SUPPORT_CONFIRMATION((1 << OPTBIT_INTERACTIVE)) + 0,
 
587
        OPT_TERMINATE   = IF_FEATURE_XARGS_SUPPORT_TERMOPT(     (1 << OPTBIT_TERMINATE  )) + 0,
 
588
        OPT_ZEROTERM    = IF_FEATURE_XARGS_SUPPORT_ZERO_TERM(   (1 << OPTBIT_ZEROTERM   )) + 0,
 
589
        OPT_REPLSTR     = IF_FEATURE_XARGS_SUPPORT_REPL_STR(    (1 << OPTBIT_REPLSTR    )) + 0,
 
590
        OPT_REPLSTR1    = IF_FEATURE_XARGS_SUPPORT_REPL_STR(    (1 << OPTBIT_REPLSTR1   )) + 0,
 
591
};
 
592
#define OPTION_STR "+trn:s:e::E:" \
 
593
        IF_FEATURE_XARGS_SUPPORT_CONFIRMATION("p") \
 
594
        IF_FEATURE_XARGS_SUPPORT_TERMOPT(     "x") \
 
595
        IF_FEATURE_XARGS_SUPPORT_ZERO_TERM(   "0") \
 
596
        IF_FEATURE_XARGS_SUPPORT_REPL_STR(    "I:i::") \
 
597
        IF_FEATURE_XARGS_SUPPORT_PARALLEL(    "P:+") \
 
598
        IF_FEATURE_XARGS_SUPPORT_ARGS_FILE(   "a:")
 
599
 
610
600
int xargs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
611
601
int xargs_main(int argc UNUSED_PARAM, char **argv)
612
602
{
736
726
                        store_param(argv[i]);
737
727
        }
738
728
 
739
 
        if (opt & OPT_STDIN_TTY) {
740
 
                G.fd_tty = xopen(CURRENT_TTY, O_RDONLY);
741
 
                close_on_exec_on(G.fd_tty);
742
 
                G.fd_stdin = dup(STDIN_FILENO);
743
 
                close_on_exec_on(G.fd_stdin);
744
 
        }
745
 
 
746
729
        initial_idx = G.idx;
747
730
        while (1) {
748
731
                char *rem;
800
783
{
801
784
        fprintf(stderr, "Usage: %s [-p] [-r] [-t] -[x] [-n max_arg] [-s max_chars]\n",
802
785
                applet_name);
803
 
        exit_FAILURE();
 
786
        exit(EXIT_FAILURE);
804
787
}
805
788
 
806
789
int main(int argc, char **argv)