aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-08-25 18:25:24 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-08-25 18:25:24 +0000
commit737d131e5e7a795ef771f987d7b02cbf4fa670d6 (patch)
tree0a7acc833d9ee4fa873ec4c15ff60b692bef420e
parent52226771760063acdc89ef4f8e531b595ae4232b (diff)
downloadbusybox-w32-737d131e5e7a795ef771f987d7b02cbf4fa670d6.tar.gz
busybox-w32-737d131e5e7a795ef771f987d7b02cbf4fa670d6.tar.bz2
busybox-w32-737d131e5e7a795ef771f987d7b02cbf4fa670d6.zip
support "#!/bin/busybox"-style wrappers. Needed for SELinux.
Patch by Yuichi Nakamura <ynakam@hitachisoft.jp>
-rw-r--r--Config.in29
-rw-r--r--Makefile.custom11
-rw-r--r--applets/applets.c7
-rwxr-xr-xapplets/install.sh82
-rw-r--r--libbb/getopt32.c2
5 files changed, 94 insertions, 37 deletions
diff --git a/Config.in b/Config.in
index 24e461eb7..450c4a6d4 100644
--- a/Config.in
+++ b/Config.in
@@ -465,6 +465,11 @@ config INSTALL_APPLET_HARDLINKS
465 Install applets as hard-links to the busybox binary. This might count 465 Install applets as hard-links to the busybox binary. This might count
466 on a filesystem with few inodes. 466 on a filesystem with few inodes.
467 467
468config INSTALL_APPLET_SCRIPT_WRAPPERS
469 bool "as script wrappers"
470 help
471 Install applets as script wrappers that call the busybox binary.
472
468config INSTALL_APPLET_DONT 473config INSTALL_APPLET_DONT
469 bool "not installed" 474 bool "not installed"
470 depends on FEATURE_INSTALLER || FEATURE_SH_STANDALONE || FEATURE_PREFER_APPLETS 475 depends on FEATURE_INSTALLER || FEATURE_SH_STANDALONE || FEATURE_PREFER_APPLETS
@@ -474,6 +479,30 @@ config INSTALL_APPLET_DONT
474 479
475endchoice 480endchoice
476 481
482choice
483 prompt "/bin/sh applet link"
484 default INSTALL_SH_APPLET_SYMLINK
485 depends on INSTALL_APPLET_SCRIPT_WRAPPERS
486 help
487 Choose how you install /bin/sh applet link.
488
489config INSTALL_SH_APPLET_SYMLINK
490 bool "as soft-link"
491 help
492 Install /bin/sh applet as soft-link to the busybox binary.
493
494config INSTALL_SH_APPLET_HARDLINK
495 bool "as hard-link"
496 help
497 Install /bin/sh applet as hard-link to the busybox binary.
498
499config INSTALL_SH_APPLET_SCRIPT_WRAPPER
500 bool "as script wrapper"
501 help
502 Install /bin/sh applet as script wrapper that call the busybox binary.
503
504endchoice
505
477config PREFIX 506config PREFIX
478 string "BusyBox installation prefix" 507 string "BusyBox installation prefix"
479 default "./_install" 508 default "./_install"
diff --git a/Makefile.custom b/Makefile.custom
index a011d53fd..5562ba396 100644
--- a/Makefile.custom
+++ b/Makefile.custom
@@ -12,6 +12,17 @@ endif
12ifeq ($(CONFIG_INSTALL_APPLET_HARDLINKS),y) 12ifeq ($(CONFIG_INSTALL_APPLET_HARDLINKS),y)
13INSTALL_OPTS:= --hardlinks 13INSTALL_OPTS:= --hardlinks
14endif 14endif
15ifeq ($(CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS),y)
16ifeq ($(CONFIG_INSTALL_SH_APPLET_SYMLINK),y)
17INSTALL_OPTS:= --sw-sh-sym
18endif
19ifeq ($(CONFIG_INSTALL_SH_APPLET_HARDLINK),y)
20INSTALL_OPTS:= --sw-sh-hard
21endif
22ifeq ($(CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER),y)
23INSTALL_OPTS:= --scriptwrapper
24endif
25endif
15install: $(srctree)/applets/install.sh busybox busybox.links 26install: $(srctree)/applets/install.sh busybox busybox.links
16 $(Q)DO_INSTALL_LIBS="$(strip $(LIBBUSYBOX_SONAME) $(DO_INSTALL_LIBS))" \ 27 $(Q)DO_INSTALL_LIBS="$(strip $(LIBBUSYBOX_SONAME) $(DO_INSTALL_LIBS))" \
17 $(SHELL) $< $(CONFIG_PREFIX) $(INSTALL_OPTS) 28 $(SHELL) $< $(CONFIG_PREFIX) $(INSTALL_OPTS)
diff --git a/applets/applets.c b/applets/applets.c
index 6de6db3cd..c2040b9a3 100644
--- a/applets/applets.c
+++ b/applets/applets.c
@@ -600,9 +600,10 @@ static int busybox_main(char **argv)
600 /* "busybox <applet> arg1 arg2 ..." */ 600 /* "busybox <applet> arg1 arg2 ..." */
601 argv++; 601 argv++;
602 } 602 }
603 /* we want "<argv[0]>: applet not found", not "busybox: ..." */ 603 /* We support "busybox /a/path/to/applet args..." too. Allows for
604 applet_name = argv[0]; 604 * "#!/bin/busybox"-style wrappers */
605 run_applet_and_exit(argv[0], argv); 605 applet_name = bb_get_last_path_component(argv[0]);
606 run_applet_and_exit(applet_name, argv);
606 bb_error_msg_and_die("applet not found"); 607 bb_error_msg_and_die("applet not found");
607} 608}
608 609
diff --git a/applets/install.sh b/applets/install.sh
index b02350262..e94b2b98e 100755
--- a/applets/install.sh
+++ b/applets/install.sh
@@ -5,19 +5,23 @@ export LC_CTYPE=POSIX
5 5
6prefix=${1} 6prefix=${1}
7if [ -z "$prefix" ]; then 7if [ -z "$prefix" ]; then
8 echo "usage: applets/install.sh DESTINATION [--symlinks/--hardlinks]" 8 echo "usage: applets/install.sh DESTINATION [--symlinks/--hardlinks/--scriptwrapper]"
9 exit 1; 9 exit 1;
10fi 10fi
11h=`sort busybox.links | uniq` 11h=`sort busybox.links | uniq`
12scriptwrapper="n"
12cleanup="0" 13cleanup="0"
13noclobber="0" 14noclobber="0"
14case "$2" in 15case "$2" in
15 --hardlinks) linkopts="-f";; 16 --hardlinks) linkopts="-f";;
16 --symlinks) linkopts="-fs";; 17 --symlinks) linkopts="-fs";;
17 --cleanup) cleanup="1";; 18 --scriptwrapper) scriptwrapper="y";swrapall="y";;
18 --noclobber) noclobber="1";; 19 --sw-sh-hard) scriptwrapper="y";linkopts="-f";;
19 "") h="";; 20 --sw-sh-sym) scriptwrapper="y";linkopts="-fs";;
20 *) echo "Unknown install option: $2"; exit 1;; 21 --cleanup) cleanup="1";;
22 --noclobber) noclobber="1";;
23 "") h="";;
24 *) echo "Unknown install option: $2"; exit 1;;
21esac 25esac
22 26
23if [ -n "$DO_INSTALL_LIBS" ] && [ "$DO_INSTALL_LIBS" != "n" ]; then 27if [ -n "$DO_INSTALL_LIBS" ] && [ "$DO_INSTALL_LIBS" != "n" ]; then
@@ -52,6 +56,7 @@ if [ "$cleanup" = "1" ] && [ -e "$prefix/bin/busybox" ]; then
52 cd "$pd" 56 cd "$pd"
53 done 57 done
54 ` 58 `
59 exit 0
55fi 60fi
56 61
57rm -f $prefix/bin/busybox || exit 1 62rm -f $prefix/bin/busybox || exit 1
@@ -61,33 +66,44 @@ install -m 755 busybox $prefix/bin/busybox || exit 1
61for i in $h; do 66for i in $h; do
62 appdir=`dirname $i` 67 appdir=`dirname $i`
63 mkdir -p $prefix/$appdir || exit 1 68 mkdir -p $prefix/$appdir || exit 1
64 if [ "$2" = "--hardlinks" ]; then 69 if [ "$scriptwrapper" = "y" ]; then
65 bb_path="$prefix/bin/busybox" 70 if [ "$swrapall" != "y" ] && [ "$i" = "/bin/sh" ]; then
66 else 71 ln $linkopts busybox $prefix$i || exit 1
67 case "$appdir" in 72 else
68 /) 73 rm -f $prefix$i
69 bb_path="bin/busybox" 74 echo "#!/bin/busybox" > $prefix$i
70 ;; 75 chmod +x $prefix/$i
71 /bin) 76 fi
72 bb_path="busybox" 77 echo " $prefix$i"
73 ;;
74 /sbin)
75 bb_path="../bin/busybox"
76 ;;
77 /usr/bin|/usr/sbin)
78 bb_path="../../bin/busybox"
79 ;;
80 *)
81 echo "Unknown installation directory: $appdir"
82 exit 1
83 ;;
84 esac
85 fi
86 if [ "$noclobber" = "0" ] || [ ! -e "$prefix$i" ]; then
87 echo " $prefix$i -> $bb_path"
88 ln $linkopts $bb_path $prefix$i || exit 1
89 else 78 else
90 echo " $prefix$i already exists" 79 if [ "$2" = "--hardlinks" ]; then
80 bb_path="$prefix/bin/busybox"
81 else
82 case "$appdir" in
83 /)
84 bb_path="bin/busybox"
85 ;;
86 /bin)
87 bb_path="busybox"
88 ;;
89 /sbin)
90 bb_path="../bin/busybox"
91 ;;
92 /usr/bin|/usr/sbin)
93 bb_path="../../bin/busybox"
94 ;;
95 *)
96 echo "Unknown installation directory: $appdir"
97 exit 1
98 ;;
99 esac
100 fi
101 if [ "$noclobber" = "0" ] || [ ! -e "$prefix$i" ]; then
102 echo " $prefix$i -> $bb_path"
103 ln $linkopts $bb_path $prefix$i || exit 1
104 else
105 echo " $prefix$i already exists"
106 fi
91 fi 107 fi
92done 108done
93 109
diff --git a/libbb/getopt32.c b/libbb/getopt32.c
index bcb7ea6a0..318f08059 100644
--- a/libbb/getopt32.c
+++ b/libbb/getopt32.c
@@ -268,7 +268,7 @@ Special characters:
268 max 3 args; count uses of '-2'; min 2 args; if there is 268 max 3 args; count uses of '-2'; min 2 args; if there is
269 a '-2' option then unset '-3', '-X' and '-a'; if there is 269 a '-2' option then unset '-3', '-X' and '-a'; if there is
270 a '-2' and after it a '-x' then error out. 270 a '-2' and after it a '-x' then error out.
271 But it's far too obfuscated. Use ':' to separate groups. 271 But it's far too obfuscated. Use ':' to separate groups.
272*/ 272*/
273 273
274/* Code here assumes that 'unsigned' is at least 32 bits wide */ 274/* Code here assumes that 'unsigned' is at least 32 bits wide */