random tiny size savings

This commit is contained in:
Denis Vlasenko 2006-12-24 15:23:28 +00:00
parent 7cea262273
commit 0ee3999d13
5 changed files with 53 additions and 60 deletions

View File

@ -44,7 +44,7 @@ static const char usage_messages[] =
static struct BB_applet *applet_using; static struct BB_applet *applet_using;
/* The -1 arises because of the {0,NULL,0,-1} entry above. */ /* The -1 arises because of the {0,NULL,0,-1} entry above. */
const size_t NUM_APPLETS = (sizeof (applets) / sizeof (struct BB_applet) - 1); const unsigned short NUM_APPLETS = (sizeof (applets) / sizeof (struct BB_applet) - 1);
#ifdef CONFIG_FEATURE_SUID_CONFIG #ifdef CONFIG_FEATURE_SUID_CONFIG
@ -459,8 +459,6 @@ static int applet_name_compare(const void *name, const void *vapplet)
return strcmp(name, applet->name); return strcmp(name, applet->name);
} }
extern const size_t NUM_APPLETS;
struct BB_applet *find_applet_by_name(const char *name) struct BB_applet *find_applet_by_name(const char *name)
{ {
return bsearch(name, applets, NUM_APPLETS, sizeof(struct BB_applet), return bsearch(name, applets, NUM_APPLETS, sizeof(struct BB_applet),
@ -469,15 +467,19 @@ struct BB_applet *find_applet_by_name(const char *name)
void run_applet_by_name(const char *name, int argc, char **argv) void run_applet_by_name(const char *name, int argc, char **argv)
{ {
if (ENABLE_FEATURE_SUID_CONFIG) parse_config_file(); if (ENABLE_FEATURE_SUID_CONFIG)
parse_config_file();
if (!strncmp(name, "busybox", 7)) busybox_main(argc, argv); if (!strncmp(name, "busybox", 7))
exit(busybox_main(argc, argv));
/* Do a binary search to find the applet entry given the name. */ /* Do a binary search to find the applet entry given the name. */
applet_using = find_applet_by_name(name); applet_using = find_applet_by_name(name);
if (applet_using) { if (applet_using) {
applet_name = applet_using->name; applet_name = applet_using->name;
if(argc==2 && !strcmp(argv[1], "--help")) bb_show_usage(); if (argc == 2 && !strcmp(argv[1], "--help"))
if(ENABLE_FEATURE_SUID) check_suid(applet_using); bb_show_usage();
exit((*(applet_using->main))(argc, argv)); if (ENABLE_FEATURE_SUID)
check_suid(applet_using);
exit(applet_using->main(argc, argv));
} }
} }

View File

@ -14,8 +14,8 @@ const char *applet_name ATTRIBUTE_EXTERNALLY_VISIBLE;
* this should be consistent w/ the enum, busybox.h::Location, * this should be consistent w/ the enum, busybox.h::Location,
* or else... * or else...
*/ */
static const char usr_bin [] ="/usr/bin"; static const char usr_bin [] = "/usr/bin";
static const char usr_sbin[] ="/usr/sbin"; static const char usr_sbin[] = "/usr/sbin";
static const char* const install_dir[] = { static const char* const install_dir[] = {
&usr_bin [8], /* "", equivalent to "/" for concat_path_file() */ &usr_bin [8], /* "", equivalent to "/" for concat_path_file() */
@ -26,25 +26,25 @@ static const char* const install_dir[] = {
}; };
/* abstract link() */ /* abstract link() */
typedef int (*__link_f)(const char *, const char *); typedef int (*link_func)(const char *, const char *);
/* create (sym)links for each applet */ /* create (sym)links for each applet */
static void install_links(const char *busybox, int use_symbolic_links) static void install_links(const char *busybox, int use_symbolic_links)
{ {
__link_f Link = link; link_func lf = link;
char *fpc; char *fpc;
int i; int i;
int rc; int rc;
if (use_symbolic_links) if (use_symbolic_links)
Link = symlink; lf = symlink;
for (i = 0; applets[i].name != NULL; i++) { for (i = 0; applets[i].name != NULL; i++) {
fpc = concat_path_file( fpc = concat_path_file(
install_dir[applets[i].location], applets[i].name); install_dir[applets[i].location],
rc = Link(busybox, fpc); applets[i].name);
if (rc!=0 && errno!=EEXIST) { rc = lf(busybox, fpc);
if (rc != 0 && errno != EEXIST) {
bb_perror_msg("%s", fpc); bb_perror_msg("%s", fpc);
} }
free(fpc); free(fpc);
@ -59,10 +59,11 @@ int main(int argc, char **argv)
{ {
const char *s; const char *s;
applet_name=argv[0]; applet_name = argv[0];
if (*applet_name == '-') applet_name++; if (*applet_name == '-')
for (s = applet_name; *s ;) applet_name++;
if (*(s++) == '/') applet_name = s; while ((s = strchr(applet_name, '/')))
applet_name = s + 1;
/* Set locale for everybody except 'init' */ /* Set locale for everybody except 'init' */
if (ENABLE_LOCALE_SUPPORT && getpid() != 1) if (ENABLE_LOCALE_SUPPORT && getpid() != 1)
@ -81,44 +82,41 @@ int busybox_main(int argc, char **argv)
*/ */
if (ENABLE_FEATURE_INSTALLER && argc > 1 && !strcmp(argv[1], "--install")) { if (ENABLE_FEATURE_INSTALLER && argc > 1 && !strcmp(argv[1], "--install")) {
int use_symbolic_links = 0; int use_symbolic_links = 0;
int rc = 0;
char *busybox; char *busybox;
/* to use symlinks, or not to use symlinks... */ /* to use symlinks, or not to use symlinks... */
if (argc > 2) { if (argc > 2)
if ((strcmp(argv[2], "-s") == 0)) { if (strcmp(argv[2], "-s") == 0)
use_symbolic_links = 1; use_symbolic_links = 1;
}
}
/* link */ /* link */
// XXX: FIXME: this is broken. Why not just use argv[0] ? // XXX: FIXME: this is broken. Why not just use argv[0] ?
busybox = xreadlink("/proc/self/exe"); busybox = xreadlink("/proc/self/exe");
if (busybox) { if (!busybox)
install_links(busybox, use_symbolic_links); return 1;
install_links(busybox, use_symbolic_links);
if (ENABLE_FEATURE_CLEAN_UP)
free(busybox); free(busybox);
} else { return 0;
rc = 1;
}
return rc;
} }
/* Deal with --help. (Also print help when called with no arguments) */ /* Deal with --help. (Also print help when called with no arguments) */
if (argc==1 || !strcmp(argv[1],"--help") ) { if (argc == 1 || !strcmp(argv[1], "--help") ) {
if (argc>2) { if (argc > 2) {
applet_name = argv[2]; applet_name = argv[2];
run_applet_by_name(applet_name, 2, argv); run_applet_by_name(applet_name, 2, argv);
} else { } else {
const struct BB_applet *a; const struct BB_applet *a;
int col, output_width; int col, output_width;
output_width = 80 - sizeof("start-stop-daemon, ") - 8;
if (ENABLE_FEATURE_AUTOWIDTH) { if (ENABLE_FEATURE_AUTOWIDTH) {
/* Obtain the terminal width. */ /* Obtain the terminal width. */
get_terminal_width_height(0, &output_width, NULL); get_terminal_width_height(0, &output_width, NULL);
/* leading tab and room to wrap */ /* leading tab and room to wrap */
output_width -= sizeof("start-stop-daemon, ") + 8; output_width -= sizeof("start-stop-daemon, ") + 8;
} else output_width = 80 - sizeof("start-stop-daemon, ") - 8; }
printf("%s\n" printf("%s\n"
"Copyright (C) 1998-2006  Erik Andersen, Rob Landley, and others.\n" "Copyright (C) 1998-2006  Erik Andersen, Rob Landley, and others.\n"
@ -130,19 +128,19 @@ int busybox_main(int argc, char **argv)
"\tlink to busybox for each function they wish to use and BusyBox\n" "\tlink to busybox for each function they wish to use and BusyBox\n"
"\twill act like whatever it was invoked as!\n" "\twill act like whatever it was invoked as!\n"
"\nCurrently defined functions:\n", bb_msg_full_version); "\nCurrently defined functions:\n", bb_msg_full_version);
col = 0;
col=0;
for(a = applets; a->name;) { for(a = applets; a->name;) {
col += printf("%s%s", (col ? ", " : "\t"), (a++)->name); col += printf("%s%s", (col ? ", " : "\t"), a->name);
a++;
if (col > output_width && a->name) { if (col > output_width && a->name) {
printf(",\n"); puts(",");
col = 0; col = 0;
} }
} }
printf("\n\n"); puts("\n");
exit(0); return 0;
} }
} else run_applet_by_name(argv[1], argc-1, argv+1); } else run_applet_by_name(argv[1], argc - 1, argv + 1);
bb_error_msg_and_die("applet not found"); bb_error_msg_and_die("applet not found");
} }

View File

@ -9,7 +9,7 @@
#include "libbb.h" #include "libbb.h"
/* order matters: used as index into "install_dir[]" in busybox.c */ /* order matters: used as index into "install_dir[]" in busybox.c */
enum Location { enum Location {
_BB_DIR_ROOT = 0, _BB_DIR_ROOT = 0,
_BB_DIR_BIN, _BB_DIR_BIN,
@ -31,8 +31,9 @@ struct BB_applet {
__extension__ enum SUIDRoot need_suid:4; __extension__ enum SUIDRoot need_suid:4;
}; };
/* From busybox.c */ /* From busybox.c and applet.c */
extern const struct BB_applet applets[]; extern const struct BB_applet applets[];
extern const unsigned short NUM_APPLETS;
/* Automagically pull in all the applet function prototypes and /* Automagically pull in all the applet function prototypes and
* applet usage strings. These are all of the form: * applet usage strings. These are all of the form:

View File

@ -11893,17 +11893,11 @@ static int helpcmd(int argc, char **argv)
} }
} }
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL #ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
{ for (i = 0; i < NUM_APPLETS; i++) {
extern const struct BB_applet applets[]; col += out1fmt("%c%s", ((col == 0) ? '\t' : ' '), applets[i].name);
extern const size_t NUM_APPLETS; if (col > 60) {
out1fmt("\n");
for (i = 0; i < NUM_APPLETS; i++) { col = 0;
col += out1fmt("%c%s", ((col == 0) ? '\t' : ' '), applets[i].name);
if (col > 60) {
out1fmt("\n");
col = 0;
}
} }
} }
#endif #endif

View File

@ -3243,8 +3243,8 @@ static int dohelp(struct op *t)
int col; int col;
const struct builtincmd *x; const struct builtincmd *x;
printf("\nBuilt-in commands:\n"); puts("\nBuilt-in commands:\n"
printf("-------------------\n"); "-------------------");
for (col = 0, x = builtincmds; x->builtinfunc != NULL; x++) { for (col = 0, x = builtincmds; x->builtinfunc != NULL; x++) {
if (!x->name) if (!x->name)
@ -3259,8 +3259,6 @@ static int dohelp(struct op *t)
{ {
int i; int i;
const struct BB_applet *applet; const struct BB_applet *applet;
extern const struct BB_applet applets[];
extern const size_t NUM_APPLETS;
for (i = 0, applet = applets; i < NUM_APPLETS; applet++, i++) { for (i = 0, applet = applets; i < NUM_APPLETS; applet++, i++) {
if (!applet->name) if (!applet->name)
@ -3274,7 +3272,7 @@ static int dohelp(struct op *t)
} }
} }
#endif #endif
printf("\n\n"); puts("\n");
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }