~vcs-imports/busybox/trunk

« back to all changes in this revision

Viewing changes to shell/ash.c

  • Committer: Denys Vlasenko
  • Author(s): Ron Yorston
  • Date: 2018-11-17 20:16:33 UTC
  • Revision ID: git-v1:3778898f97a64e7b42b53194af7f3b93cc9c07a3
Treat custom and applet scripts as applets

BusyBox has support for embedded shell scripts.  Two types can be
distinguished:  custom scripts and scripts implementing applets.

Custom scripts should be placed in the 'embed' directory at build
time.  They are given a default applet configuration and appear
as applets to the user but no further configuration is possible.

Applet scripts are integrated with the BusyBox build system and
are intended to be used to ship standard applets that just happen
to be implemented as scripts.  They can be configured at build time
and appear just like native applets.

Such scripts should be placed in the 'applets_sh' directory.  A stub
C program should be written to provide the usual applet configuration
details and placed in a suitable subsystem directory.  It may be
helpful to have a configuration option to enable any dependencies the
script requires:  see the 'nologin' applet for an example.

function                                             old     new   delta
scripted_main                                          -      41     +41
applet_names                                        2773    2781      +8
applet_main                                         1600    1604      +4
i2cdetect_main                                       672     674      +2
applet_suid                                          100     101      +1
applet_install_loc                                   200     201      +1
applet_flags                                         100     101      +1
packed_usage                                       33180   33179      -1
tryexec                                              159     152      -7
evalcommand                                         1661    1653      -8
script_names                                           9       -      -9
packed_scripts                                       123     114      -9
complete_cmd_dir_file                                826     811     -15
shellexec                                            271     254     -17
find_command                                        1007     990     -17
busybox_main                                         642     624     -18
run_applet_and_exit                                  100      78     -22
find_script_by_name                                   51       -     -51
------------------------------------------------------------------------------
(add/remove: 1/2 grow/shrink: 6/9 up/down: 58/-174)          Total: -116 bytes
   text    data     bss     dec     hex filename
 950034     477    7296  957807   e9d6f busybox_old
 949918     477    7296  957691   e9cfb busybox_unstripped

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>

Show diffs side-by-side

added added

removed removed

Lines of Context:
158
158
//config:       at build time. Like applets, scripts can be run as
159
159
//config:       'busybox SCRIPT ...' or by linking their name to the binary.
160
160
//config:
 
161
//config:       This also allows applets to be implemented as scripts: place
 
162
//config:       the script in 'applets_sh' and a stub C file containing
 
163
//config:       configuration in the appropriate subsystem directory.
 
164
//config:
161
165
//config:endif # ash options
162
166
 
163
167
//applet:IF_ASH(APPLET(ash, BB_DIR_BIN, BB_SUID_DROP))
8016
8020
{
8017
8021
#if ENABLE_FEATURE_SH_STANDALONE
8018
8022
        if (applet_no >= 0) {
8019
 
# if NUM_SCRIPTS > 0
8020
 
                if (applet_no < NUM_APPLETS)
8021
 
# endif
8022
8023
                if (APPLET_IS_NOEXEC(applet_no)) {
8023
8024
                        clearenv();
8024
8025
                        while (*envp)
8088
8089
        if (strchr(prog, '/') != NULL
8089
8090
#if ENABLE_FEATURE_SH_STANDALONE
8090
8091
         || (applet_no = find_applet_by_name(prog)) >= 0
8091
 
# if NUM_SCRIPTS > 0
8092
 
         || (applet_no = NUM_APPLETS + find_script_by_name(prog)) >= 0
8093
 
# endif
8094
8092
#endif
8095
8093
        ) {
8096
8094
                tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp);
10192
10190
 */
10193
10191
                /* find_command() encodes applet_no as (-2 - applet_no) */
10194
10192
                int applet_no = (- cmdentry.u.index - 2);
10195
 
# if NUM_SCRIPTS > 0
10196
 
                /* Applets are ok, but not embedded scripts */
10197
 
                if (applet_no < NUM_APPLETS)
10198
 
# endif
10199
10193
                if (applet_no >= 0 && APPLET_IS_NOFORK(applet_no)) {
10200
10194
                        char **sv_environ;
10201
10195
 
13378
13372
#if ENABLE_FEATURE_SH_STANDALONE
13379
13373
        {
13380
13374
                int applet_no = find_applet_by_name(name);
13381
 
# if NUM_SCRIPTS > 0
13382
 
                if (applet_no < 0)
13383
 
                        /* embedded script indices are offset by NUM_APPLETS */
13384
 
                        applet_no = NUM_APPLETS + find_script_by_name(name);
13385
 
# endif
13386
13375
                if (applet_no >= 0) {
13387
13376
                        entry->cmdtype = CMDNORMAL;
13388
13377
                        entry->u.index = -2 - applet_no;