Patch from Dennis Vlasenko to add the option to compress help text.
This commit is contained in:
parent
d5b9428bb6
commit
7e21d5f6b1
@ -56,6 +56,14 @@ config CONFIG_FEATURE_VERBOSE_USAGE
|
|||||||
busybox binary. In the default configuration, this will add about
|
busybox binary. In the default configuration, this will add about
|
||||||
13k, but it can add much more depending on your configuration.
|
13k, but it can add much more depending on your configuration.
|
||||||
|
|
||||||
|
config CONFIG_FEATURE_COMPRESS_USAGE
|
||||||
|
bool "Store applet usage messages in compressed form"
|
||||||
|
default y
|
||||||
|
depends on CONFIG_SHOW_USAGE
|
||||||
|
help
|
||||||
|
Store usage messages in compressed form, uncompress them on-the-fly
|
||||||
|
when <applet> --help is called.
|
||||||
|
|
||||||
config CONFIG_FEATURE_INSTALLER
|
config CONFIG_FEATURE_INSTALLER
|
||||||
bool "Support --install [-s] to install applet links at runtime"
|
bool "Support --install [-s] to install applet links at runtime"
|
||||||
default n
|
default n
|
||||||
|
7
Makefile
7
Makefile
@ -405,6 +405,13 @@ include/bbconfigopts.h: .config
|
|||||||
$(Q)$(top_srcdir)/scripts/config/mkconfigs > $@
|
$(Q)$(top_srcdir)/scripts/config/mkconfigs > $@
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
scripts/usage: $(top_srcdir)/scripts/usage.c .config
|
||||||
|
$(HOSTCC) $(HOSTCFLAGS) -I$(top_srcdir)/include -o $@ $<
|
||||||
|
|
||||||
|
DEP_INCLUDES += include/usage_compressed.h
|
||||||
|
include/usage_compressed.h: .config scripts/usage
|
||||||
|
$(Q)sh $(top_srcdir)/scripts/usage_compressed "$(top_srcdir)/scripts" > $@
|
||||||
|
|
||||||
depend dep: .depend
|
depend dep: .depend
|
||||||
.depend: scripts/bb_mkdep $(DEP_INCLUDES)
|
.depend: scripts/bb_mkdep $(DEP_INCLUDES)
|
||||||
$(disp_gen)
|
$(disp_gen)
|
||||||
|
@ -32,24 +32,20 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "busybox.h"
|
#include "busybox.h"
|
||||||
|
|
||||||
#if ENABLE_SHOW_USAGE
|
#if ENABLE_SHOW_USAGE && !ENABLE_FEATURE_COMPRESS_USAGE
|
||||||
const char usage_messages[] =
|
static const char usage_messages[] =
|
||||||
|
|
||||||
#define MAKE_USAGE
|
#define MAKE_USAGE
|
||||||
#include "usage.h"
|
#include "usage.h"
|
||||||
|
|
||||||
#include "applets.h"
|
#include "applets.h"
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
#undef MAKE_USAGE
|
#undef MAKE_USAGE
|
||||||
#endif /* ENABLE_SHOW_USAGE */
|
#endif /* ENABLE_SHOW_USAGE */
|
||||||
|
|
||||||
#undef APPLET
|
#undef APPLET
|
||||||
#undef APPLET_NOUSAGE
|
#undef APPLET_NOUSAGE
|
||||||
#undef PROTOTYPES
|
#undef PROTOTYPES
|
||||||
#include "applets.h"
|
#include "applets.h"
|
||||||
|
|
||||||
|
|
||||||
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. */
|
||||||
@ -405,27 +401,69 @@ static void check_suid (struct BB_applet *applet)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if ENABLE_FEATURE_COMPRESS_USAGE
|
||||||
|
|
||||||
|
#include "usage_compressed.h"
|
||||||
|
#include "unarchive.h"
|
||||||
|
|
||||||
|
static const char *unpack_usage_messages(void)
|
||||||
|
{
|
||||||
|
int input[2], output[2], pid;
|
||||||
|
char *buf;
|
||||||
|
|
||||||
|
if(pipe(input) < 0 || pipe(output) < 0)
|
||||||
|
exit(1);
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
switch (pid) {
|
||||||
|
case -1: /* error */
|
||||||
|
exit(1);
|
||||||
|
case 0: /* child */
|
||||||
|
close(input[1]);
|
||||||
|
close(output[0]);
|
||||||
|
uncompressStream(input[0], output[1]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
/* parent */
|
||||||
|
|
||||||
|
close(input[0]);
|
||||||
|
close(output[1]);
|
||||||
|
pid = fork();
|
||||||
|
switch (pid) {
|
||||||
|
case -1: /* error */
|
||||||
|
exit(1);
|
||||||
|
case 0: /* child */
|
||||||
|
bb_full_write(input[1], packed_usage, sizeof(packed_usage));
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
/* parent */
|
||||||
|
close(input[1]);
|
||||||
|
|
||||||
|
buf = xmalloc(SIZEOF_usage_messages);
|
||||||
|
bb_full_read(output[0], buf, SIZEOF_usage_messages);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define unpack_usage_messages() usage_messages;
|
||||||
|
#endif /* ENABLE_FEATURE_COMPRESS_USAGE */
|
||||||
|
|
||||||
void bb_show_usage (void)
|
void bb_show_usage (void)
|
||||||
{
|
{
|
||||||
#if ENABLE_SHOW_USAGE
|
if (ENABLE_SHOW_USAGE) {
|
||||||
const char *format_string;
|
const char *format_string;
|
||||||
const char *usage_string = usage_messages;
|
const char *usage_string = unpack_usage_messages();
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = applet_using - applets; i > 0;) {
|
for (i = applet_using - applets; i > 0;)
|
||||||
if (!*usage_string++) {
|
if (!*usage_string++) --i;
|
||||||
--i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
format_string = "%s\n\nUsage: %s %s\n\n";
|
format_string = "%s\n\nUsage: %s %s\n\n";
|
||||||
if (*usage_string == '\b')
|
if (*usage_string == '\b')
|
||||||
format_string = "%s\n\nNo help available.\n\n";
|
format_string = "%s\n\nNo help available.\n\n";
|
||||||
fprintf (stderr, format_string, bb_msg_full_version, applet_using->name,
|
fprintf (stderr, format_string, bb_msg_full_version,
|
||||||
usage_string);
|
applet_using->name, usage_string);
|
||||||
#endif /* ENABLE_SHOW_USAGE */
|
}
|
||||||
|
|
||||||
exit (bb_default_error_retval);
|
exit (bb_default_error_retval);
|
||||||
}
|
}
|
||||||
|
@ -67,6 +67,7 @@ LIBUNARCHIVE-$(CONFIG_FEATURE_TAR_GZIP) += $(GUNZIP_FILES) get_header_tar_gz.o
|
|||||||
LIBUNARCHIVE-$(CONFIG_FEATURE_TAR_COMPRESS) += decompress_uncompress.o
|
LIBUNARCHIVE-$(CONFIG_FEATURE_TAR_COMPRESS) += decompress_uncompress.o
|
||||||
LIBUNARCHIVE-$(CONFIG_UNCOMPRESS) += decompress_uncompress.o
|
LIBUNARCHIVE-$(CONFIG_UNCOMPRESS) += decompress_uncompress.o
|
||||||
LIBUNARCHIVE-$(CONFIG_UNZIP) += $(GUNZIP_FILES)
|
LIBUNARCHIVE-$(CONFIG_UNZIP) += $(GUNZIP_FILES)
|
||||||
|
LIBUNARCHIVE-$(CONFIG_FEATURE_COMPRESS_USAGE) += decompress_bunzip2.o
|
||||||
|
|
||||||
|
|
||||||
LIBUNARCHIVE-y:=$(sort $(LIBUNARCHIVE-y))
|
LIBUNARCHIVE-y:=$(sort $(LIBUNARCHIVE-y))
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
# define APPLET(a,b,c,d) extern int b(int argc, char **argv);
|
# define APPLET(a,b,c,d) extern int b(int argc, char **argv);
|
||||||
# define APPLET_NOUSAGE(a,b,c,d) extern int b(int argc, char **argv);
|
# define APPLET_NOUSAGE(a,b,c,d) extern int b(int argc, char **argv);
|
||||||
# define APPLET_ODDNAME(a,b,c,d,e) extern int b(int argc, char **argv);
|
# define APPLET_ODDNAME(a,b,c,d,e) extern int b(int argc, char **argv);
|
||||||
extern const char usage_messages[];
|
|
||||||
#elif defined(MAKE_USAGE)
|
#elif defined(MAKE_USAGE)
|
||||||
# ifdef CONFIG_FEATURE_VERBOSE_USAGE
|
# ifdef CONFIG_FEATURE_VERBOSE_USAGE
|
||||||
# define APPLET(a,b,c,d) a##_trivial_usage "\n\n" a##_full_usage "\0"
|
# define APPLET(a,b,c,d) a##_trivial_usage "\n\n" a##_full_usage "\0"
|
||||||
|
14
scripts/usage.c
Normal file
14
scripts/usage.c
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#include <unistd.h>
|
||||||
|
#include "busybox.h"
|
||||||
|
|
||||||
|
static const char usage_messages[] =
|
||||||
|
#define MAKE_USAGE
|
||||||
|
#include "usage.h"
|
||||||
|
#include "applets.h"
|
||||||
|
;
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
write(1, usage_messages, sizeof(usage_messages));
|
||||||
|
return 0;
|
||||||
|
}
|
11
scripts/usage_compressed
Normal file
11
scripts/usage_compressed
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
loc="$1"
|
||||||
|
|
||||||
|
test "$loc" || loc=.
|
||||||
|
|
||||||
|
echo 'static const char packed_usage[] = '
|
||||||
|
"$loc"/usage | bzip2 -9 | od -v -t x1 \
|
||||||
|
| sed -e 's/^[^ ]*//' -e 's/ \(..\)/\\x\1/g' -e 's/^\(.*\)$/"\1"/'
|
||||||
|
echo ';'
|
||||||
|
echo '#define SIZEOF_usage_messages' $((0 + `"$loc"/usage | wc -c `))
|
Loading…
Reference in New Issue
Block a user