aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2018-11-17 17:48:14 +0000
committerDenys Vlasenko <vda.linux@googlemail.com>2018-11-17 21:16:33 +0100
commit3778898f97a64e7b42b53194af7f3b93cc9c07a3 (patch)
tree9452b954be8861feff32a40072615ee95caaa4c6 /libbb
parente6a63bf683f47027d36dc21b62b2f5cc3eb30a30 (diff)
downloadbusybox-w32-3778898f97a64e7b42b53194af7f3b93cc9c07a3.tar.gz
busybox-w32-3778898f97a64e7b42b53194af7f3b93cc9c07a3.tar.bz2
busybox-w32-3778898f97a64e7b42b53194af7f3b93cc9c07a3.zip
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>
Diffstat (limited to 'libbb')
-rw-r--r--libbb/appletlib.c72
-rw-r--r--libbb/lineedit.c20
2 files changed, 36 insertions, 56 deletions
diff --git a/libbb/appletlib.c b/libbb/appletlib.c
index 6dfaf1f41..a0ebaca29 100644
--- a/libbb/appletlib.c
+++ b/libbb/appletlib.c
@@ -51,7 +51,7 @@
51#include "usage_compressed.h" 51#include "usage_compressed.h"
52 52
53#if ENABLE_ASH_EMBEDDED_SCRIPTS 53#if ENABLE_ASH_EMBEDDED_SCRIPTS
54# define DEFINE_script_names 1 54# define DEFINE_SCRIPT_DATA 1
55# include "embedded_scripts.h" 55# include "embedded_scripts.h"
56#else 56#else
57# define NUM_SCRIPTS 0 57# define NUM_SCRIPTS 0
@@ -818,27 +818,21 @@ int busybox_main(int argc UNUSED_PARAM, char **argv)
818 /* prevent last comma to be in the very last pos */ 818 /* prevent last comma to be in the very last pos */
819 output_width--; 819 output_width--;
820 a = applet_names; 820 a = applet_names;
821 { 821 while (*a) {
822# if NUM_SCRIPTS > 0 822 int len2 = strlen(a) + 2;
823 int i; 823 if (col >= (int)output_width - len2) {
824 for (i = 0; i < 2; i++, a = script_names) 824 full_write2_str(",\n");
825# endif 825 col = 0;
826 while (*a) { 826 }
827 int len2 = strlen(a) + 2; 827 if (col == 0) {
828 if (col >= (int)output_width - len2) { 828 col = 6;
829 full_write2_str(",\n"); 829 full_write2_str("\t");
830 col = 0; 830 } else {
831 } 831 full_write2_str(", ");
832 if (col == 0) {
833 col = 6;
834 full_write2_str("\t");
835 } else {
836 full_write2_str(", ");
837 }
838 full_write2_str(a);
839 col += len2;
840 a += len2 - 1;
841 } 832 }
833 full_write2_str(a);
834 col += len2;
835 a += len2 - 1;
842 } 836 }
843 full_write2_str("\n"); 837 full_write2_str("\n");
844 return 0; 838 return 0;
@@ -946,20 +940,25 @@ void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **ar
946# endif /* NUM_APPLETS > 0 */ 940# endif /* NUM_APPLETS > 0 */
947 941
948# if NUM_SCRIPTS > 0 942# if NUM_SCRIPTS > 0
949int FAST_FUNC 943static int find_script_by_name(const char *name)
950find_script_by_name(const char *name)
951{ 944{
952 const char *s = script_names; 945 int i;
953 int i = 0; 946 int applet = find_applet_by_name(name);
954 947
955 while (*s) { 948 if (applet >= 0) {
956 if (strcmp(name, s) == 0) 949 for (i = 0; i < NUM_SCRIPTS; ++i)
957 return i; 950 if (applet_numbers[i] == applet)
958 i++; 951 return i;
959 while (*s++ != '\0')
960 continue;
961 } 952 }
962 return -0x10000; /* make it so that NUM_APPLETS + <error> is still < 0 */ 953 return -1;
954}
955
956int scripted_main(int argc UNUSED_PARAM, char **argv)
957{
958 int script = find_script_by_name(applet_name);
959 if (script >= 0)
960 exit(ash_main(-script - 1, argv));
961 return 0;
963} 962}
964 963
965char* FAST_FUNC 964char* FAST_FUNC
@@ -978,7 +977,7 @@ get_script_content(unsigned n)
978} 977}
979# endif /* NUM_SCRIPTS > 0 */ 978# endif /* NUM_SCRIPTS > 0 */
980 979
981# if ENABLE_BUSYBOX || NUM_APPLETS > 0 || NUM_SCRIPTS > 0 980# if ENABLE_BUSYBOX || NUM_APPLETS > 0
982static NORETURN void run_applet_and_exit(const char *name, char **argv) 981static NORETURN void run_applet_and_exit(const char *name, char **argv)
983{ 982{
984# if ENABLE_BUSYBOX 983# if ENABLE_BUSYBOX
@@ -993,13 +992,6 @@ static NORETURN void run_applet_and_exit(const char *name, char **argv)
993 run_applet_no_and_exit(applet, name, argv); 992 run_applet_no_and_exit(applet, name, argv);
994 } 993 }
995# endif 994# endif
996# if NUM_SCRIPTS > 0
997 {
998 int script = find_script_by_name(name);
999 if (script >= 0)
1000 exit(ash_main(-script - 1, argv));
1001 }
1002# endif
1003 995
1004 /*bb_error_msg_and_die("applet not found"); - links in printf */ 996 /*bb_error_msg_and_die("applet not found"); - links in printf */
1005 full_write2_str(applet_name); 997 full_write2_str(applet_name);
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index 618e7c221..b1e971f88 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -41,12 +41,6 @@
41#include "busybox.h" 41#include "busybox.h"
42#include "NUM_APPLETS.h" 42#include "NUM_APPLETS.h"
43#include "unicode.h" 43#include "unicode.h"
44#if ENABLE_ASH_EMBEDDED_SCRIPTS
45# include "embedded_scripts.h"
46#else
47# define NUM_SCRIPTS 0
48#endif
49
50#ifndef _POSIX_VDISABLE 44#ifndef _POSIX_VDISABLE
51# define _POSIX_VDISABLE '\0' 45# define _POSIX_VDISABLE '\0'
52#endif 46#endif
@@ -812,20 +806,14 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type)
812 } 806 }
813 pf_len = strlen(pfind); 807 pf_len = strlen(pfind);
814 808
815# if ENABLE_FEATURE_SH_STANDALONE && (NUM_APPLETS != 1 || NUM_SCRIPTS > 0) 809# if ENABLE_FEATURE_SH_STANDALONE && NUM_APPLETS != 1
816 if (type == FIND_EXE_ONLY && !dirbuf) { 810 if (type == FIND_EXE_ONLY && !dirbuf) {
817 const char *p; 811 const char *p = applet_names;
818# if NUM_APPLETS != 1 && NUM_SCRIPTS > 0 812
819 for (i = 0, p = applet_names; i < 2; i++, p = script_names)
820# elif NUM_APPLETS != 1 /* and NUM_SCRIPTS == 0 */
821 p = applet_names;
822# else /* NUM_APPLETS == 1 && NUM_SCRIPTS > 0 */
823 p = script_names;
824# endif
825 while (*p) { 813 while (*p) {
826 if (strncmp(pfind, p, pf_len) == 0) 814 if (strncmp(pfind, p, pf_len) == 0)
827 add_match(xstrdup(p)); 815 add_match(xstrdup(p));
828 while (*p++) 816 while (*p++ != '\0')
829 continue; 817 continue;
830 } 818 }
831 } 819 }