diff options
Diffstat (limited to 'release/src/router/busybox/applets')
-rw-r--r-- | release/src/router/busybox/applets/Kbuild | 34 | ||||
-rw-r--r-- | release/src/router/busybox/applets/Makefile | 30 | ||||
-rwxr-xr-x | release/src/router/busybox/applets/Makefile.in | 36 | ||||
-rw-r--r-- | release/src/router/busybox/applets/applet_tables.c | 126 | ||||
-rw-r--r-- | release/src/router/busybox/applets/applets.c | 450 | ||||
-rw-r--r-- | release/src/router/busybox/applets/busybox.c | 184 | ||||
-rwxr-xr-x | release/src/router/busybox/applets/busybox.mkll | 4 | ||||
-rw-r--r-- | release/src/router/busybox/applets/individual.c | 24 | ||||
-rwxr-xr-x | release/src/router/busybox/applets/install.sh | 122 | ||||
-rw-r--r-- | release/src/router/busybox/applets/usage.c | 32 | ||||
-rwxr-xr-x | release/src/router/busybox/applets/usage_compressed | 34 |
11 files changed, 345 insertions, 731 deletions
diff --git a/release/src/router/busybox/applets/Kbuild b/release/src/router/busybox/applets/Kbuild new file mode 100644 index 00000000..2969e792 --- /dev/null +++ b/release/src/router/busybox/applets/Kbuild @@ -0,0 +1,34 @@ +# Makefile for busybox +# +# Copyright (C) 1999-2005 by Erik Andersen <andersen@codepoet.org> +# +# Licensed under the GPL v2, see the file LICENSE in this tarball. + +obj-y := +obj-y += applets.o + +hostprogs-y:= +hostprogs-y += usage applet_tables + +always:= $(hostprogs-y) + +# Generated files need additional love + +HOSTCFLAGS_usage.o = -I$(srctree)/include + +applets/applets.o: include/usage_compressed.h include/applet_tables.h + +applets/usage: .config $(srctree)/applets/usage_compressed +applets/applet_tables: .config + +quiet_cmd_gen_usage_compressed = GEN include/usage_compressed.h + cmd_gen_usage_compressed = $(srctree)/applets/usage_compressed include/usage_compressed.h applets + +include/usage_compressed.h: applets/usage $(srctree)/applets/usage_compressed + $(call cmd,gen_usage_compressed) + +quiet_cmd_gen_applet_tables = GEN include/applet_tables.h + cmd_gen_applet_tables = applets/applet_tables include/applet_tables.h + +include/applet_tables.h: applets/applet_tables + $(call cmd,gen_applet_tables) diff --git a/release/src/router/busybox/applets/Makefile b/release/src/router/busybox/applets/Makefile deleted file mode 100644 index f4ebb149..00000000 --- a/release/src/router/busybox/applets/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -# Makefile for busybox -# -# Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR:= ../ -APPLETS_DIR:=./ -include $(TOPDIR).config -include $(TOPDIR)Rules.mak -include Makefile.in -all: $(libraries-y) --include $(TOPDIR).depend - -clean: - rm -f *.o *.a $(AR_TARGET) - diff --git a/release/src/router/busybox/applets/Makefile.in b/release/src/router/busybox/applets/Makefile.in deleted file mode 100755 index cb6c647d..00000000 --- a/release/src/router/busybox/applets/Makefile.in +++ /dev/null @@ -1,36 +0,0 @@ -# Makefile for busybox -# -# Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -APPLETS_AR:=applets.a -ifndef $(APPLETS_DIR) -APPLETS_DIR:=$(TOPDIR)applets/ -endif - -APPLET_SRC:=applets.c busybox.c usage.c -APPLET_OBJ:= $(patsubst %.c,$(APPLETS_DIR)%.o, $(APPLET_SRC)) - - - -libraries-y+=$(APPLETS_DIR)$(APPLETS_AR) - -$(APPLET_OBJ): $(TOPDIR).config - -$(APPLETS_DIR)$(APPLETS_AR): $(APPLET_OBJ) - $(AR) -ro $@ $(APPLET_OBJ) - diff --git a/release/src/router/busybox/applets/applet_tables.c b/release/src/router/busybox/applets/applet_tables.c new file mode 100644 index 00000000..17135ddc --- /dev/null +++ b/release/src/router/busybox/applets/applet_tables.c @@ -0,0 +1,126 @@ +/* vi: set sw=4 ts=4: */ +/* + * Applet table generator. + * Runs on host and produces include/applet_tables.h + * + * Copyright (C) 2007 Denys Vlasenko <vda.linux@googlemail.com> + * + * Licensed under GPLv2, see file License in this tarball for details. + */ + +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#include "../include/autoconf.h" +#include "../include/busybox.h" + +struct bb_applet { + const char *name; + const char *main; + enum bb_install_loc_t install_loc; + enum bb_suid_t need_suid; + /* true if instead of fork(); exec("applet"); waitpid(); + * one can do fork(); exit(applet_main(argc,argv)); waitpid(); */ + unsigned char noexec; + /* Even nicer */ + /* true if instead of fork(); exec("applet"); waitpid(); + * one can simply call applet_main(argc,argv); */ + unsigned char nofork; +}; + +/* Define struct bb_applet applets[] */ +#include "../include/applets.h" + +enum { NUM_APPLETS = ARRAY_SIZE(applets) }; + +static int offset[NUM_APPLETS]; + +static int cmp_name(const void *a, const void *b) +{ + const struct bb_applet *aa = a; + const struct bb_applet *bb = b; + return strcmp(aa->name, bb->name); +} + +int main(int argc, char **argv) +{ + int i; + int ofs; + unsigned MAX_APPLET_NAME_LEN = 1; + + qsort(applets, NUM_APPLETS, sizeof(applets[0]), cmp_name); + + ofs = 0; + for (i = 0; i < NUM_APPLETS; i++) { + offset[i] = ofs; + ofs += strlen(applets[i].name) + 1; + } + /* We reuse 4 high-order bits of offset array for other purposes, + * so if they are indeed needed, refuse to proceed */ + if (ofs > 0xfff) + return 1; + if (!argv[1]) + return 1; + + i = open(argv[1], O_WRONLY | O_TRUNC | O_CREAT, 0666); + if (i < 0) + return 1; + dup2(i, 1); + + /* Keep in sync with include/busybox.h! */ + + puts("/* This is a generated file, don't edit */\n"); + + printf("#define NUM_APPLETS %u\n", NUM_APPLETS); + if (NUM_APPLETS == 1) { + printf("#define SINGLE_APPLET_STR \"%s\"\n", applets[0].name); + printf("#define SINGLE_APPLET_MAIN %s_main\n", applets[0].name); + } + + puts("\nconst char applet_names[] ALIGN1 = \"\""); + for (i = 0; i < NUM_APPLETS; i++) { + printf("\"%s\" \"\\0\"\n", applets[i].name); + if (MAX_APPLET_NAME_LEN < strlen(applets[i].name)) + MAX_APPLET_NAME_LEN = strlen(applets[i].name); + } + puts(";"); + + puts("\nint (*const applet_main[])(int argc, char **argv) = {"); + for (i = 0; i < NUM_APPLETS; i++) { + printf("%s_main,\n", applets[i].main); + } + puts("};"); + + puts("const uint16_t applet_nameofs[] ALIGN2 = {"); + for (i = 0; i < NUM_APPLETS; i++) { + printf("0x%04x,\n", + offset[i] +#if ENABLE_FEATURE_PREFER_APPLETS + + (applets[i].nofork << 12) + + (applets[i].noexec << 13) +#endif +#if ENABLE_FEATURE_SUID + + (applets[i].need_suid << 14) /* 2 bits */ +#endif + ); + } + puts("};"); + +#if ENABLE_FEATURE_INSTALLER + puts("const uint8_t applet_install_loc[] ALIGN1 = {"); + i = 0; + while (i < NUM_APPLETS) { + int v = applets[i].install_loc; /* 3 bits */ + if (++i < NUM_APPLETS) + v |= applets[i].install_loc << 4; /* 3 bits */ + printf("0x%02x,\n", v); + i++; + } + puts("};\n"); +#endif + + printf("#define MAX_APPLET_NAME_LEN %u\n", MAX_APPLET_NAME_LEN); + + return 0; +} diff --git a/release/src/router/busybox/applets/applets.c b/release/src/router/busybox/applets/applets.c index 4af569de..133a2157 100644 --- a/release/src/router/busybox/applets/applets.c +++ b/release/src/router/busybox/applets/applets.c @@ -1,454 +1,18 @@ /* vi: set sw=4 ts=4: */ /* - * Utility routines. + * Stub for linking busybox binary against libbusybox. * - * Copyright (C) tons of folks. Tracking down who wrote what - * isn't something I'm going to worry about... If you wrote something - * here, please feel free to acknowledge your work. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Based in part on code from sash, Copyright (c) 1999 by David I. Bell - * Permission has been granted to redistribute this code under the GPL. + * Copyright (C) 2007 Denys Vlasenko <vda.linux@googlemail.com> * + * Licensed under GPLv2, see file License in this tarball for details. */ -#include <unistd.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> +#include <assert.h> #include "busybox.h" -#undef APPLET -#undef APPLET_NOUSAGE -#undef PROTOTYPES -#include "applets.h" - -struct BB_applet *applet_using; - -/* The -1 arises because of the {0,NULL,0,-1} entry above. */ -const size_t NUM_APPLETS = (sizeof (applets) / sizeof (struct BB_applet) - 1); - - -#ifdef CONFIG_FEATURE_SUID - -static void check_suid (struct BB_applet *app); - -#ifdef CONFIG_FEATURE_SUID_CONFIG - -#include <sys/stat.h> -#include <ctype.h> -#include "pwd_.h" -#include "grp_.h" - -static int parse_config_file (void); - -static int config_ok; - -#define CONFIG_FILE "/etc/busybox.conf" - -/* applets [] is const, so we have to define this "override" structure */ -struct BB_suid_config -{ - struct BB_applet *m_applet; - - uid_t m_uid; - gid_t m_gid; - mode_t m_mode; - - struct BB_suid_config *m_next; -}; - -static struct BB_suid_config *suid_config; - -#endif /* CONFIG_FEATURE_SUID_CONFIG */ - -#endif /* CONFIG_FEATURE_SUID */ - - - -extern void -bb_show_usage (void) -{ - const char *format_string; - const char *usage_string = usage_messages; - int i; - - for (i = applet_using - applets; i > 0;) { - if (!*usage_string++) { - --i; - } - } - - format_string = "%s\n\nUsage: %s %s\n\n"; - if (*usage_string == '\b') - format_string = "%s\n\nNo help available.\n\n"; - fprintf (stderr, format_string, bb_msg_full_version, applet_using->name, - usage_string); - - exit (EXIT_FAILURE); -} - -static int -applet_name_compare (const void *x, const void *y) -{ - const char *name = x; - const struct BB_applet *applet = y; - - return strcmp (name, applet->name); -} - -extern const size_t NUM_APPLETS; - -struct BB_applet * -find_applet_by_name (const char *name) -{ - return bsearch (name, applets, NUM_APPLETS, sizeof (struct BB_applet), - applet_name_compare); -} - -void -run_applet_by_name (const char *name, int argc, char **argv) -{ - static int recurse_level = 0; - extern int been_there_done_that; /* From busybox.c */ - -#ifdef CONFIG_FEATURE_SUID_CONFIG - if (recurse_level == 0) - config_ok = parse_config_file (); -#endif - - recurse_level++; - /* Do a binary search to find the applet entry given the name. */ - if ((applet_using = find_applet_by_name (name)) != NULL) { - bb_applet_name = applet_using->name; - if (argv[1] && strcmp (argv[1], "--help") == 0) { - if (strcmp (applet_using->name, "busybox") == 0) { - if (argv[2]) - applet_using = find_applet_by_name (argv[2]); - else - applet_using = NULL; - } - if (applet_using) - bb_show_usage (); - been_there_done_that = 1; - busybox_main (0, NULL); - } -#ifdef CONFIG_FEATURE_SUID - check_suid (applet_using); -#endif - - exit ((*(applet_using->main)) (argc, argv)); - } - /* Just in case they have renamed busybox - Check argv[1] */ - if (recurse_level == 1) { - run_applet_by_name ("busybox", argc, argv); - } - recurse_level--; -} - - -#ifdef CONFIG_FEATURE_SUID - -#ifdef CONFIG_FEATURE_SUID_CONFIG - -/* check if u is member of group g */ -static int -ingroup (uid_t u, gid_t g) -{ - struct group *grp = getgrgid (g); - - if (grp) { - char **mem; - - for (mem = grp->gr_mem; *mem; mem++) { - struct passwd *pwd = getpwnam (*mem); - - if (pwd && (pwd->pw_uid == u)) - return 1; - } - } - return 0; -} - -#endif - - -void -check_suid (struct BB_applet *applet) -{ - uid_t ruid = getuid (); /* real [ug]id */ - uid_t rgid = getgid (); - -#ifdef CONFIG_FEATURE_SUID_CONFIG - if (config_ok) { - struct BB_suid_config *sct; - - for (sct = suid_config; sct; sct = sct->m_next) { - if (sct->m_applet == applet) - break; - } - if (sct) { - mode_t m = sct->m_mode; - - if (sct->m_uid == ruid) /* same uid */ - m >>= 6; - else if ((sct->m_gid == rgid) || ingroup (ruid, sct->m_gid)) /* same group / in group */ - m >>= 3; - - if (!(m & S_IXOTH)) /* is x bit not set ? */ - bb_error_msg_and_die ("You have no permission to run this applet!"); - - if ((sct->m_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) { /* *both* have to be set for sgid */ - if (setegid (sct->m_gid)) - bb_error_msg_and_die - ("BusyBox binary has insufficient rights to set proper GID for applet!"); - } else - setgid (rgid); /* no sgid -> drop */ - - if (sct->m_mode & S_ISUID) { - if (seteuid (sct->m_uid)) - bb_error_msg_and_die - ("BusyBox binary has insufficient rights to set proper UID for applet!"); - } else - setuid (ruid); /* no suid -> drop */ - } else { - /* default: drop all priviledges */ - setgid (rgid); - setuid (ruid); - } - return; - } else { -#ifndef CONFIG_FEATURE_SUID_CONFIG_QUIET - static int onetime = 0; - - if (!onetime) { - onetime = 1; - fprintf (stderr, "Using fallback suid method\n"); - } -#endif - } -#endif - - if (applet->need_suid == _BB_SUID_ALWAYS) { - if (geteuid () != 0) - bb_error_msg_and_die ("This applet requires root priviledges!"); - } else if (applet->need_suid == _BB_SUID_NEVER) { - setgid (rgid); /* drop all priviledges */ - setuid (ruid); - } -} - -#ifdef CONFIG_FEATURE_SUID_CONFIG - - -#define parse_error(x) { err=x; goto pe_label; } - - -int -parse_config_file (void) +#if ENABLE_BUILD_LIBBUSYBOX +int main(int argc UNUSED_PARAM, char **argv) { - struct stat st; - char *err = 0; - FILE *f = 0; - int lc = 0; - - suid_config = 0; - - /* is there a config file ? */ - if (stat (CONFIG_FILE, &st) == 0) { - /* is it owned by root with no write perm. for group and others ? */ - if (S_ISREG (st.st_mode) && (st.st_uid == 0) - && (!(st.st_mode & (S_IWGRP | S_IWOTH)))) { - /* that's ok .. then try to open it */ - f = fopen (CONFIG_FILE, "r"); - - if (f) { - char buffer[256]; - int section = 0; - - while (fgets (buffer, sizeof (buffer) - 1, f)) { - char c = buffer[0]; - char *p; - - lc++; - - p = strchr (buffer, '#'); - if (p) - *p = 0; - p = buffer + bb_strlen (buffer); - while ((p > buffer) && isspace (*--p)) - *p = 0; - - if (p == buffer) - continue; - - if (c == '[') { - p = strchr (buffer, ']'); - - if (!p || (p == (buffer + 1))) /* no matching ] or empty [] */ - parse_error ("malformed section header"); - - *p = 0; - - if (strcasecmp (buffer + 1, "SUID") == 0) - section = 1; - else - section = -1; /* unknown section - just skip */ - } else if (section) { - switch (section) { - case 1:{ /* SUID */ - int l; - struct BB_applet *applet; - - p = strchr (buffer, '='); /* <key>[::space::]*=[::space::]*<value> */ - - if (!p || (p == (buffer + 1))) /* no = or key is empty */ - parse_error ("malformed keyword"); - - l = p - buffer; - while (isspace (buffer[--l])) { - /* skip whitespace */ - } - - buffer[l + 1] = 0; - - if ((applet = find_applet_by_name (buffer))) { - struct BB_suid_config *sct = - xmalloc (sizeof (struct BB_suid_config)); - - sct->m_applet = applet; - sct->m_next = suid_config; - suid_config = sct; - - while (isspace (*++p)) { - /* skip whitespace */ - } - - sct->m_mode = 0; - - switch (*p++) { - case 'S': - sct->m_mode |= S_ISUID; - break; - case 's': - sct->m_mode |= S_ISUID; - /* no break */ - case 'x': - sct->m_mode |= S_IXUSR; - break; - case '-': - break; - default: - parse_error ("invalid user mode"); - } - - switch (*p++) { - case 's': - sct->m_mode |= S_ISGID; - /* no break */ - case 'x': - sct->m_mode |= S_IXGRP; - break; - case 'S': - break; - case '-': - break; - default: - parse_error ("invalid group mode"); - } - - switch (*p) { - case 't': - case 'x': - sct->m_mode |= S_IXOTH; - break; - case 'T': - case '-': - break; - default: - parse_error ("invalid other mode"); - } - - while (isspace (*++p)) { - /* skip whitespace */ - } - - if (isdigit (*p)) { - sct->m_uid = strtol (p, &p, 10); - if (*p++ != '.') - parse_error ("parsing <uid>.<gid>"); - } else { - struct passwd *pwd; - char *p2 = strchr (p, '.'); - - if (!p2) - parse_error ("parsing <uid>.<gid>"); - - *p2 = 0; - pwd = getpwnam (p); - - if (!pwd) - parse_error ("invalid user name"); - - sct->m_uid = pwd->pw_uid; - p = p2 + 1; - } - if (isdigit (*p)) - sct->m_gid = strtol (p, &p, 10); - else { - struct group *grp = getgrnam (p); - - if (!grp) - parse_error ("invalid group name"); - - sct->m_gid = grp->gr_gid; - } - } - break; - } - default: /* unknown - skip */ - break; - } - } else - parse_error ("keyword not within section"); - } - fclose (f); - return 1; - } - } - } - return 0; /* no config file or not readable (not an error) */ - -pe_label: - fprintf (stderr, "Parse error in %s, line %d: %s\n", CONFIG_FILE, lc, err); - - if (f) - fclose (f); - return 0; + return lbb_main(argv); } - #endif - -#endif - -/* END CODE */ -/* -Local Variables: -c-file-style: "linux" -c-basic-offset: 4 -tab-width: 4 -End: -*/ diff --git a/release/src/router/busybox/applets/busybox.c b/release/src/router/busybox/applets/busybox.c deleted file mode 100644 index 457a85a6..00000000 --- a/release/src/router/busybox/applets/busybox.c +++ /dev/null @@ -1,184 +0,0 @@ -/* vi: set sw=4 ts=4: */ -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <stdlib.h> -#include "busybox.h" -#ifdef CONFIG_LOCALE_SUPPORT -#include <locale.h> -#endif - -int been_there_done_that = 0; /* Also used in applets.c */ -const char *bb_applet_name; - -#ifdef CONFIG_FEATURE_INSTALLER -/* - * directory table - * this should be consistent w/ the enum, busybox.h::Location, - * or else... - */ -static const char usr_bin [] ="/usr/bin"; -static const char usr_sbin[] ="/usr/sbin"; - -static const char* const install_dir[] = { - &usr_bin [8], /* "", equivalent to "/" for concat_path_file() */ - &usr_bin [4], /* "/bin" */ - &usr_sbin[4], /* "/sbin" */ - usr_bin, - usr_sbin -}; - -/* abstract link() */ -typedef int (*__link_f)(const char *, const char *); - -/* - * Where in the filesystem is this busybox? - * [return] - * malloc'd string w/ full pathname of busybox's location - * NULL on failure - */ -static inline char *busybox_fullpath(void) -{ - return xreadlink("/proc/self/exe"); -} - -/* create (sym)links for each applet */ -static void install_links(const char *busybox, int use_symbolic_links) -{ - __link_f Link = link; - - char *fpc; - int i; - int rc; - - if (use_symbolic_links) - Link = symlink; - - for (i = 0; applets[i].name != NULL; i++) { - fpc = concat_path_file( - install_dir[applets[i].location], applets[i].name); - rc = Link(busybox, fpc); - if (rc!=0 && errno!=EEXIST) { - bb_perror_msg("%s", fpc); - } - free(fpc); - } -} - -#endif /* CONFIG_FEATURE_INSTALLER */ - -int main(int argc, char **argv) -{ - const char *s; - - bb_applet_name = argv[0]; - - if (bb_applet_name[0] == '-') - bb_applet_name++; - - for (s = bb_applet_name; *s != '\0';) { - if (*s++ == '/') - bb_applet_name = s; - } - -#ifdef CONFIG_LOCALE_SUPPORT -#ifdef CONFIG_INIT - if(getpid()!=1) /* Do not set locale for `init' */ -#endif - { - setlocale(LC_ALL, ""); - } -#endif - - run_applet_by_name(bb_applet_name, argc, argv); - bb_error_msg_and_die("applet not found"); -} - - -int busybox_main(int argc, char **argv) -{ - int col = 0, len, i; - -#ifdef CONFIG_FEATURE_INSTALLER - /* - * This style of argument parsing doesn't scale well - * in the event that busybox starts wanting more --options. - * If someone has a cleaner approach, by all means implement it. - */ - if (argc > 1 && (strcmp(argv[1], "--install") == 0)) { - int use_symbolic_links = 0; - int rc = 0; - char *busybox; - - /* to use symlinks, or not to use symlinks... */ - if (argc > 2) { - if ((strcmp(argv[2], "-s") == 0)) { - use_symbolic_links = 1; - } - } - - /* link */ - busybox = busybox_fullpath(); - if (busybox) { - install_links(busybox, use_symbolic_links); - free(busybox); - } else { - rc = 1; - } - return rc; - } -#endif /* CONFIG_FEATURE_INSTALLER */ - - argc--; - - /* If we've already been here once, exit now */ - if (been_there_done_that == 1 || argc < 1) { - const struct BB_applet *a = applets; - - fprintf(stderr, "%s\n\n" - "Usage: busybox [function] [arguments]...\n" - " or: [function] [arguments]...\n\n" - "\tBusyBox is a multi-call binary that combines many common Unix\n" - "\tutilities into a single executable. Most people will create a\n" - "\tlink to busybox for each function they wish to use, and BusyBox\n" - "\twill act like whatever it was invoked as.\n" - "\nCurrently defined functions:\n", bb_msg_full_version); - - while (a->name != 0) { - col += - fprintf(stderr, "%s%s", ((col == 0) ? "\t" : ", "), - (a++)->name); - if (col > 60 && a->name != 0) { - fprintf(stderr, ",\n"); - col = 0; - } - } - fprintf(stderr, "\n\n"); - exit(0); - } - - /* Flag that we've been here already */ - been_there_done_that = 1; - - /* Move the command line down a notch */ - len = argv[argc] + strlen(argv[argc]) - argv[1]; - memmove(argv[0], argv[1], len); - memset(argv[0] + len, 0, argv[1] - argv[0]); - - /* Fix up the argv pointers */ - len = argv[1] - argv[0]; - memmove(argv, argv + 1, sizeof(char *) * (argc + 1)); - for (i = 0; i < argc; i++) - argv[i] -= len; - - return (main(argc, argv)); -} - -/* -Local Variables: -c-file-style: "linux" -c-basic-offset: 4 -tab-width: 4 -End: -*/ diff --git a/release/src/router/busybox/applets/busybox.mkll b/release/src/router/busybox/applets/busybox.mkll index 5b6677d0..6d61f7e8 100755 --- a/release/src/router/busybox/applets/busybox.mkll +++ b/release/src/router/busybox/applets/busybox.mkll @@ -10,9 +10,9 @@ export LC_ALL=POSIX export LC_CTYPE=POSIX -CONFIG_H=${1:-include/config.h} +CONFIG_H=${1:-include/autoconf.h} APPLETS_H=${2:-include/applets.h} -gcc -E -DMAKE_LINKS -include $CONFIG_H $APPLETS_H | +$HOSTCC -E -DMAKE_LINKS -include $CONFIG_H $APPLETS_H | awk '/^[ \t]*LINK/{ dir=substr($2,8) gsub("_","/",dir) diff --git a/release/src/router/busybox/applets/individual.c b/release/src/router/busybox/applets/individual.c new file mode 100644 index 00000000..341f4d1c --- /dev/null +++ b/release/src/router/busybox/applets/individual.c @@ -0,0 +1,24 @@ +/* Minimal wrapper to build an individual busybox applet. + * + * Copyright 2005 Rob Landley <rob@landley.net + * + * Licensed under GPL version 2, see file LICENSE in this tarball for details + */ + +const char *applet_name; + +#include <stdio.h> +#include <stdlib.h> +#include "usage.h" + +int main(int argc, char **argv) +{ + applet_name = argv[0]; + return APPLET_main(argc,argv); +} + +void bb_show_usage(void) +{ + fputs(APPLET_full_usage "\n", stdout); + exit(EXIT_FAILURE); +} diff --git a/release/src/router/busybox/applets/install.sh b/release/src/router/busybox/applets/install.sh index d163a2ef..32049b15 100755 --- a/release/src/router/busybox/applets/install.sh +++ b/release/src/router/busybox/applets/install.sh @@ -3,50 +3,108 @@ export LC_ALL=POSIX export LC_CTYPE=POSIX -prefix=$1 -if [ "$prefix" = "" ]; then - echo "No installation directory, aborting." - exit 1; -fi -if [ "$2" = "--hardlinks" ]; then - linkopts="-f" -else - linkopts="-fs" +prefix=${1} +if [ -z "$prefix" ]; then + echo "usage: applets/install.sh DESTINATION [--symlinks/--hardlinks/--scriptwrapper]" + exit 1; fi h=`sort busybox.links | uniq` +scriptwrapper="n" +cleanup="0" +noclobber="0" +case "$2" in + --hardlinks) linkopts="-f";; + --symlinks) linkopts="-fs";; + --scriptwrapper) scriptwrapper="y";swrapall="y";; + --sw-sh-hard) scriptwrapper="y";linkopts="-f";; + --sw-sh-sym) scriptwrapper="y";linkopts="-fs";; + --cleanup) cleanup="1";; + --noclobber) noclobber="1";; + "") h="";; + *) echo "Unknown install option: $2"; exit 1;; +esac + +if [ -n "$DO_INSTALL_LIBS" ] && [ "$DO_INSTALL_LIBS" != "n" ]; then + # get the target dir for the libs + # assume it starts with lib + libdir=$($CC -print-file-name=libc.so | \ + sed -n 's%^.*\(/lib[^\/]*\)/libc.so%\1%p') + if test -z "$libdir"; then + libdir=/lib + fi + mkdir -p $prefix/$libdir || exit 1 + for i in $DO_INSTALL_LIBS; do + rm -f $prefix/$libdir/$i || exit 1 + if [ -f $i ]; then + cp -pPR $i $prefix/$libdir/ || exit 1 + chmod 0644 $prefix/$libdir/$i || exit 1 + fi + done +fi + +if [ "$cleanup" = "1" ] && [ -e "$prefix/bin/busybox" ]; then + inode=`ls -i "$prefix/bin/busybox" | awk '{print $1}'` + sub_shell_it=` + cd "$prefix" + for d in usr/sbin usr/bin sbin bin; do + pd=$PWD + if [ -d "$d" ]; then + cd $d + ls -iL . | grep "^ *$inode" | awk '{print $2}' | env -i xargs rm -f + fi + cd "$pd" + done + ` + exit 0 +fi rm -f $prefix/bin/busybox || exit 1 mkdir -p $prefix/bin || exit 1 install -m 755 busybox $prefix/bin/busybox || exit 1 -for i in $h ; do +for i in $h; do appdir=`dirname $i` mkdir -p $prefix/$appdir || exit 1 - if [ "$2" = "--hardlinks" ]; then - bb_path="$prefix/bin/busybox" + if [ "$scriptwrapper" = "y" ]; then + if [ "$swrapall" != "y" ] && [ "$i" = "/bin/sh" ]; then + ln $linkopts busybox $prefix$i || exit 1 + else + rm -f $prefix$i + echo "#!/bin/busybox" > $prefix$i + chmod +x $prefix/$i + fi + echo " $prefix$i" else - case "$appdir" in - /) - bb_path="bin/busybox" - ;; - /bin) - bb_path="busybox" - ;; - /sbin) - bb_path="../bin/busybox" - ;; - /usr/bin|/usr/sbin) - bb_path="../../bin/busybox" - ;; - *) - echo "Unknown installation directory: $appdir" - exit 1 - ;; - esac + if [ "$2" = "--hardlinks" ]; then + bb_path="$prefix/bin/busybox" + else + case "$appdir" in + /) + bb_path="bin/busybox" + ;; + /bin) + bb_path="busybox" + ;; + /sbin) + bb_path="../bin/busybox" + ;; + /usr/bin|/usr/sbin) + bb_path="../../bin/busybox" + ;; + *) + echo "Unknown installation directory: $appdir" + exit 1 + ;; + esac + fi + if [ "$noclobber" = "0" ] || [ ! -e "$prefix$i" ]; then + echo " $prefix$i -> $bb_path" + ln $linkopts $bb_path $prefix$i || exit 1 + else + echo " $prefix$i already exists" + fi fi - echo " $prefix$i -> $bb_path" - ln $linkopts $bb_path $prefix$i || exit 1 done exit 0 diff --git a/release/src/router/busybox/applets/usage.c b/release/src/router/busybox/applets/usage.c index dfea1f96..1e038b36 100644 --- a/release/src/router/busybox/applets/usage.c +++ b/release/src/router/busybox/applets/usage.c @@ -1,10 +1,34 @@ -#include "busybox.h" +/* vi: set sw=4 ts=4: */ +/* + * Copyright (C) 2008 Denys Vlasenko. + * + * Licensed under GPLv2, see file LICENSE in this tarball for details. + */ +#include <unistd.h> -const char usage_messages[] = +/* Just #include "autoconf.h" doesn't work for builds in separate + * object directory */ +#include "../include/autoconf.h" +/* Since we can't use platform.h, have to do this again by hand: */ +#if ENABLE_NOMMU +#define BB_MMU 0 +#define USE_FOR_NOMMU(...) __VA_ARGS__ +#define USE_FOR_MMU(...) +#else +#define BB_MMU 1 +#define USE_FOR_NOMMU(...) +#define USE_FOR_MMU(...) __VA_ARGS__ +#endif + +static const char usage_messages[] = "" #define MAKE_USAGE #include "usage.h" - #include "applets.h" - ; + +int main(void) +{ + write(STDOUT_FILENO, usage_messages, sizeof(usage_messages)); + return 0; +} diff --git a/release/src/router/busybox/applets/usage_compressed b/release/src/router/busybox/applets/usage_compressed new file mode 100755 index 00000000..c30bcfa2 --- /dev/null +++ b/release/src/router/busybox/applets/usage_compressed @@ -0,0 +1,34 @@ +#!/bin/sh + +target="$1" +loc="$2" + +test "$target" || exit 1 +test "$loc" || loc=. +test -x "$loc/usage" || exit 1 +test "$SED" || SED=sed + +sz=`"$loc/usage" | wc -c` || exit 1 + +exec >"$target" + +echo 'static const char packed_usage[] ALIGN1 = {' + +## Breaks on big-endian systems! +## # Extra effort to avoid using "od -t x1": -t is not available +## # in non-CONFIG_DESKTOPed busybox od +## +## "$loc/usage" | bzip2 -1 | od -v -x \ +## | $SED -e 's/^[^ ]*//' \ +## | $SED -e 's/ //g' \ +## | grep -v '^$' \ +## | $SED -e 's/\(..\)\(..\)/0x\2,0x\1,/g' + +"$loc/usage" | bzip2 -1 | od -v -t x1 \ +| $SED -e 's/^[^ ]*//' \ +| $SED -e 's/ //g' \ +| grep -v '^$' \ +| $SED -e 's/\(..\)/0x\1,/g' + +echo '};' +echo '#define SIZEOF_usage_messages' `expr 0 + $sz` |