From 791b222dd55d3aa0e8b09be1be571e4829465dd6 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 2 Oct 2023 13:56:32 +0200 Subject: sleep: fix "sleep -- ARGS" function old new delta sleep_main 116 119 +3 printf_main 860 837 -23 single_argv 50 25 -25 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/2 up/down: 3/-48) Total: -45 bytes Signed-off-by: Denys Vlasenko --- coreutils/printf.c | 10 +++++----- coreutils/sleep.c | 4 ++-- include/libbb.h | 1 + libbb/single_argv.c | 15 +++++++++++---- shell/hush.c | 8 -------- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/coreutils/printf.c b/coreutils/printf.c index 7763d7c46..4edcfa9b5 100644 --- a/coreutils/printf.c +++ b/coreutils/printf.c @@ -425,9 +425,9 @@ int printf_main(int argc UNUSED_PARAM, char **argv) /* bash builtin errors out on "printf '-%s-\n' foo", * coreutils-6.9 works. Both work with "printf -- '-%s-\n' foo". * We will mimic coreutils. */ - if (argv[1] && argv[1][0] == '-' && argv[1][1] == '-' && !argv[1][2]) - argv++; - if (!argv[1]) { + argv = skip_dash_dash(argv); + + if (!argv[0]) { if ((ENABLE_ASH_PRINTF || ENABLE_HUSH_PRINTF) && applet_name[0] != 'p' ) { @@ -437,8 +437,8 @@ int printf_main(int argc UNUSED_PARAM, char **argv) bb_show_usage(); } - format = argv[1]; - argv2 = argv + 2; + format = argv[0]; + argv2 = argv + 1; conv_err = 0; do { diff --git a/coreutils/sleep.c b/coreutils/sleep.c index 6edff59cc..fa74f1fd4 100644 --- a/coreutils/sleep.c +++ b/coreutils/sleep.c @@ -71,8 +71,8 @@ int sleep_main(int argc UNUSED_PARAM, char **argv) * + we can't use bb_show_usage * + applet_name can be the name of the shell */ - ++argv; - if (!*argv) { + argv = skip_dash_dash(argv); + if (!argv[0]) { /* Without this, bare "sleep" in ash shows _ash_ --help */ /* (ash can be the "sh" applet as well, so check 2nd char) */ if (ENABLE_ASH_SLEEP && applet_name[1] != 'l') { diff --git a/include/libbb.h b/include/libbb.h index eb97a9880..0883fb565 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -1344,6 +1344,7 @@ int sanitize_env_if_suid(void) FAST_FUNC; /* For top, ps. Some argv[i] are replaced by malloced "-opt" strings */ void make_all_argv_opts(char **argv) FAST_FUNC; char* single_argv(char **argv) FAST_FUNC; +char **skip_dash_dash(char **argv) FAST_FUNC; extern const char *const bb_argv_dash[]; /* { "-", NULL } */ extern uint32_t option_mask32; uint32_t getopt32(char **argv, const char *applet_opts, ...) FAST_FUNC; diff --git a/libbb/single_argv.c b/libbb/single_argv.c index 64844ddf8..594cb0d8d 100644 --- a/libbb/single_argv.c +++ b/libbb/single_argv.c @@ -8,11 +8,18 @@ */ #include "libbb.h" -char* FAST_FUNC single_argv(char **argv) +char** FAST_FUNC skip_dash_dash(char **argv) { - if (argv[1] && strcmp(argv[1], "--") == 0) + argv++; + if (argv[0] && argv[0][0] == '-' && argv[0][1] == '-' && argv[0][2] == '\0') argv++; - if (!argv[1] || argv[2]) + return argv; +} + +char* FAST_FUNC single_argv(char **argv) +{ + argv = skip_dash_dash(argv); + if (!argv[0] || argv[1]) bb_show_usage(); - return argv[1]; + return argv[0]; } diff --git a/shell/hush.c b/shell/hush.c index 8e632e0af..ca01e2b5b 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -10883,14 +10883,6 @@ static int FAST_FUNC builtin_history(char **argv UNUSED_PARAM) } #endif -static char **skip_dash_dash(char **argv) -{ - argv++; - if (argv[0] && argv[0][0] == '-' && argv[0][1] == '-' && argv[0][2] == '\0') - argv++; - return argv; -} - static int FAST_FUNC builtin_cd(char **argv) { const char *newdir; -- cgit v1.2.3-55-g6feb From 6d22c9abc29d43e919e819ff004fcd84a90de60b Mon Sep 17 00:00:00 2001 From: Nero Date: Sat, 23 Sep 2023 11:50:04 +0000 Subject: install: Fix chown resetting suid/sgid bits from chmod Since Linux 2.2.13, chown(2) resets the suid/gid bits for all users. This patch changes the ordering so that chmod gets called after chown. This behavior follows GNU coreutils. Signed-off-by: Nero Signed-off-by: Denys Vlasenko --- coreutils/install.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/coreutils/install.c b/coreutils/install.c index c0f1c538a..00f8be87e 100644 --- a/coreutils/install.c +++ b/coreutils/install.c @@ -244,6 +244,15 @@ int install_main(int argc, char **argv) } } + /* Set the user and group id */ + /* (must be before chmod, or else chown may clear suid/gid bits) */ + if ((opts & (OPT_OWNER|OPT_GROUP)) + && lchown(dest, uid, gid) == -1 + ) { + bb_perror_msg("can't change %s of %s", "ownership", dest); + ret = EXIT_FAILURE; + } + /* Set the file mode (always, not only with -m). * GNU coreutils 6.10 is not affected by umask. */ if (chmod(dest, mode) == -1) { @@ -254,13 +263,6 @@ int install_main(int argc, char **argv) if (use_default_selinux_context) setdefaultfilecon(dest); #endif - /* Set the user and group id */ - if ((opts & (OPT_OWNER|OPT_GROUP)) - && lchown(dest, uid, gid) == -1 - ) { - bb_perror_msg("can't change %s of %s", "ownership", dest); - ret = EXIT_FAILURE; - } next: if (ENABLE_FEATURE_CLEAN_UP && isdir) free(dest); -- cgit v1.2.3-55-g6feb From 92ab29fcf04bc3ff3d3ad897f1c2463d8b8d1410 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 2 Oct 2023 15:24:06 +0200 Subject: awk: implement -E; do not reorder -f and -e function old new delta awk_main 843 891 +48 next_input_file 243 261 +18 packed_usage 34631 34638 +7 .rodata 105391 105390 -1 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 3/1 up/down: 73/-1) Total: 72 bytes Signed-off-by: Denys Vlasenko --- editors/awk.c | 113 +++++++++++++++++++++++++++++++++------------------------- 1 file changed, 65 insertions(+), 48 deletions(-) diff --git a/editors/awk.c b/editors/awk.c index efdff2778..bc95c4155 100644 --- a/editors/awk.c +++ b/editors/awk.c @@ -40,7 +40,7 @@ //usage:#define awk_full_usage "\n\n" //usage: " -v VAR=VAL Set variable" //usage: "\n -F SEP Use SEP as field separator" -//usage: "\n -f FILE Read program from FILE" +//usage: "\n -f/-E FILE Read program from FILE" //usage: IF_FEATURE_AWK_GNU_EXTENSIONS( //usage: "\n -e AWK_PROGRAM" //usage: ) @@ -76,8 +76,8 @@ * 1: -argz */ #define OPTSTR_AWK "+" \ - "F:v:*f:*" \ - IF_FEATURE_AWK_GNU_EXTENSIONS("e:*") \ + "F:v:f:" \ + IF_FEATURE_AWK_GNU_EXTENSIONS("e:E:") \ "W:" enum { OPTBIT_F, /* define field separator */ @@ -560,6 +560,7 @@ struct globals { var *Fields; char *g_pos; char g_saved_ch; + smallint got_program; smallint icase; smallint exiting; smallint nextrec; @@ -635,6 +636,7 @@ struct globals2 { #define Fields (G1.Fields ) #define g_pos (G1.g_pos ) #define g_saved_ch (G1.g_saved_ch ) +#define got_program (G1.got_program ) #define icase (G1.icase ) #define exiting (G1.exiting ) #define nextrec (G1.nextrec ) @@ -2899,11 +2901,13 @@ static int next_input_file(void) } fname = getvar_s(findvar(iamarray(intvar[ARGV]), utoa(argind))); if (fname && *fname) { - /* "If a filename on the command line has the form - * var=val it is treated as a variable assignment" - */ - if (try_to_assign(fname)) - continue; + if (got_program != 2) { /* there was no -E option */ + /* "If a filename on the command line has the form + * var=val it is treated as a variable assignment" + */ + if (try_to_assign(fname)) + continue; + } iF.F = xfopen_stdin(fname); setvar_i(intvar[ARGIND], argind); break; @@ -3659,13 +3663,7 @@ static int awk_exit(void) int awk_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int awk_main(int argc UNUSED_PARAM, char **argv) { - unsigned opt; - char *opt_F; - llist_t *list_v = NULL; - llist_t *list_f = NULL; -#if ENABLE_FEATURE_AWK_GNU_EXTENSIONS - llist_t *list_e = NULL; -#endif + int ch; int i; INIT_G(); @@ -3714,49 +3712,68 @@ int awk_main(int argc UNUSED_PARAM, char **argv) } } } - opt = getopt32(argv, OPTSTR_AWK, &opt_F, &list_v, &list_f, IF_FEATURE_AWK_GNU_EXTENSIONS(&list_e,) NULL); - argv += optind; - //argc -= optind; - if (opt & OPT_W) - bb_simple_error_msg("warning: option -W is ignored"); - if (opt & OPT_F) { - unescape_string_in_place(opt_F); - setvar_s(intvar[FS], opt_F); - } - while (list_v) { - if (!try_to_assign(llist_pop(&list_v))) - bb_show_usage(); - } - /* Parse all supplied programs */ fnhash = hash_init(); ahash = hash_init(); - while (list_f) { - int fd; - char *s; - g_progname = llist_pop(&list_f); - fd = xopen_stdin(g_progname); - s = xmalloc_read(fd, NULL); /* it's NUL-terminated */ - if (!s) - bb_perror_msg_and_die("read error from '%s'", g_progname); - close(fd); - parse_program(s); - free(s); - } - g_progname = "cmd. line"; + /* Cannot use getopt32: need to preserve order of -e / -f / -E / -i */ + while ((ch = getopt(argc, argv, OPTSTR_AWK)) >= 0) { + switch (ch) { + case 'F': + unescape_string_in_place(optarg); + setvar_s(intvar[FS], optarg); + break; + case 'v': + if (!try_to_assign(optarg)) + bb_show_usage(); + break; +//TODO: implement -i LIBRARY, it is easy-ish + case 'E': + case 'f': { + int fd; + char *s; + g_progname = optarg; + fd = xopen_stdin(g_progname); + s = xmalloc_read(fd, NULL); /* it's NUL-terminated */ + if (!s) + bb_perror_msg_and_die("read error from '%s'", g_progname); + close(fd); + parse_program(s); + free(s); + got_program = 1; + if (ch == 'E') { + got_program = 2; + goto stop_option_parsing; + } + break; + } #if ENABLE_FEATURE_AWK_GNU_EXTENSIONS - while (list_e) { - parse_program(llist_pop(&list_e)); - } + case 'e': + g_progname = "cmd. line"; + parse_program(optarg); + got_program = 1; + break; #endif -//FIXME: preserve order of -e and -f -//TODO: implement -i LIBRARY and -E FILE too, they are easy-ish - if (!(opt & (OPT_f | OPT_e))) { + case 'W': + bb_simple_error_msg("warning: option -W is ignored"); + break; + default: +//bb_error_msg("ch:%d", ch); + bb_show_usage(); + } + } + stop_option_parsing: + + argv += optind; + //argc -= optind; + + if (!got_program) { if (!*argv) bb_show_usage(); + g_progname = "cmd. line"; parse_program(*argv++); } + /* Free unused parse structures */ //hash_free(fnhash); // ~250 bytes when empty, used only for function names //^^^^^^^^^^^^^^^^^ does not work, hash_clear() inside SEGVs -- cgit v1.2.3-55-g6feb From 5fa39d48d53c7a3360d4f4da2c00232eb674678e Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 3 Oct 2023 17:18:41 +0200 Subject: syslogd: fix breakage caused by "daemonize _after_ init" change function old new delta syslogd_init 1007 1140 +133 create_socket 143 - -143 ------------------------------------------------------------------------------ (add/remove: 0/1 grow/shrink: 1/0 up/down: 133/-143) Total: -10 bytes Signed-off-by: Denys Vlasenko --- sysklogd/syslogd.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c index 83b5c0cf6..7558051f0 100644 --- a/sysklogd/syslogd.c +++ b/sysklogd/syslogd.c @@ -956,9 +956,7 @@ static void do_mark(int sig) } #endif -/* Don't inline: prevent struct sockaddr_un to take up space on stack - * permanently */ -static NOINLINE int create_socket(void) +static int create_socket(void) { struct sockaddr_un sunx; int sock_fd; @@ -1008,6 +1006,7 @@ static int try_to_resolve_remote(remoteHost_t *rh) static int NOINLINE syslogd_init(char **argv) { int opts; + int fd; char OPTION_DECL; #if ENABLE_FEATURE_REMOTE_LOG llist_t *remoteAddrList = NULL; @@ -1055,7 +1054,7 @@ static int NOINLINE syslogd_init(char **argv) G.hostname = safe_gethostname(); *strchrnul(G.hostname, '.') = '\0'; - xmove_fd(create_socket(), STDIN_FILENO); + fd = create_socket(); if (opts & OPT_circularlog) ipcsyslog_init(); @@ -1067,6 +1066,8 @@ static int NOINLINE syslogd_init(char **argv) bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv); } + xmove_fd(fd, STDIN_FILENO); + /* Set up signal handlers (so that they interrupt read()) */ signal_no_SA_RESTART_empty_mask(SIGTERM, record_signo); signal_no_SA_RESTART_empty_mask(SIGINT, record_signo); -- cgit v1.2.3-55-g6feb From e265c8d4c039729f2a68f3b1fb589c13c38d86f8 Mon Sep 17 00:00:00 2001 From: Russ Dill Date: Mon, 2 Oct 2023 12:34:50 -0700 Subject: udhcp: Avoid leaking uninitialized/stale data I noticed a commit in connman: "gdhcp: Avoid leaking stack data via unitiialized variable" [1] Since gdhcp is just BusyBox udhcp with the serial numbers filed off, I checked if BusyBox udhcp has a related issue. The issue is that the get_option logic assumes any data within the memory area of the buffer is "valid". This reduces the complexity of the function at the cost of reading past the end of the actually received data in the case of specially crafted packets. This is not a problem for the udhcp_recv_kernel_packet data path as the entire memory area is zeroed. However, d4/d6_recv_raw_packet does not zero the memory. Note that a related commit [2] is not required as we are zeroing any data that can be read by the get_option function. [1] https://git.kernel.org/pub/scm/network/connman/connman.git/commit/?id=a74524b3e3fad81b0fd1084ffdf9f2ea469cd9b1 [2] https://git.kernel.org/pub/scm/network/connman/connman.git/commit/?id=58d397ba74873384aee449690a9070bacd5676fa function old new delta d4_recv_raw_packet 484 497 +13 d6_recv_raw_packet 216 228 +12 .rodata 105390 105381 -9 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/1 up/down: 25/-9) Total: 16 bytes Signed-off-by: Russ Dill Cc: Colin Wee Cc: Denys Vlasenko Signed-off-by: Denys Vlasenko --- networking/udhcp/d6_dhcpc.c | 1 + networking/udhcp/dhcpc.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c index cdd06188e..a72fd31bd 100644 --- a/networking/udhcp/d6_dhcpc.c +++ b/networking/udhcp/d6_dhcpc.c @@ -961,6 +961,7 @@ static NOINLINE int d6_recv_raw_packet(struct in6_addr *peer_ipv6, struct d6_pac d6_dump_packet(&packet.data); bytes -= sizeof(packet.ip6) + sizeof(packet.udp); + memset(d6_pkt, 0, sizeof(*d6_pkt)); memcpy(d6_pkt, &packet.data, bytes); return bytes; } diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index 200a2fb8a..07e2eadfe 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c @@ -966,7 +966,7 @@ static NOINLINE int d4_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd) check = packet.udp.check; packet.udp.check = 0; if (check && check != inet_cksum(&packet, bytes)) { - log1s("packet with bad UDP checksum received, ignoring"); + log1s("packet with bad UDP checksum, ignoring"); return -2; } skip_udp_sum_check: @@ -981,6 +981,7 @@ static NOINLINE int d4_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd) udhcp_dump_packet(&packet.data); bytes -= sizeof(packet.ip) + sizeof(packet.udp); + memset(dhcp_pkt, 0, sizeof(*dhcp_pkt)); memcpy(dhcp_pkt, &packet.data, bytes); return bytes; } -- cgit v1.2.3-55-g6feb From 0c71497e654fb5e9a9272f81ddb5d994d2839df4 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 7 Nov 2023 06:55:35 +0100 Subject: start-stop-daemon: fix --help: -K or -S is required function old new delta .rodata 105381 105382 +1 packed_usage 34638 34602 -36 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/1 up/down: 1/-36) Total: -35 bytes Signed-off-by: Denys Vlasenko --- debianutils/start_stop_daemon.c | 46 ++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index 3e5dd9faa..16df67b3e 100644 --- a/debianutils/start_stop_daemon.c +++ b/debianutils/start_stop_daemon.c @@ -11,11 +11,12 @@ /* This is how it is supposed to work: -start-stop-daemon [OPTIONS] [--start|--stop] [[--] arguments...] +start-stop-daemon [OPTIONS] [--start|--stop] [[--] ARGS...] One (only) of these must be given: -S,--start Start -K,--stop Stop + -T,--status Check for the existence of a process, return exitcode (since version 1.16.1) Search for matching processes. If --stop is given, stop all matching processes (by sending a signal). @@ -36,20 +37,41 @@ with /proc/$PID/exe or argv[0] (comm can't be matched, it never contains path)] Unlike -n, we match against the full path: "ntpd" != "./ntpd" != "/path/to/ntpd" -p,--pidfile PID_FILE Look for processes with PID from this file + --ppid PPID Look for processes with parent pid (since version 1.17.7) Options which are valid for --start only: - -x,--exec EXECUTABLE Program to run (1st arg of execvp). Mandatory. + -x,--exec EXECUTABLE Program to run (1st arg of execvp). + If no -x, EXECUTABLE is taken from ARGS[0] -a,--startas NAME argv[0] (defaults to EXECUTABLE) -b,--background Put process into background + -O,--output FILE Redirect stdout and stderr to FILE when forcing the + daemon into the background (since version 1.20.6). Only + relevant when using --background. + Probably O_CREAT|O_TRUNC? What if execv fails - where does error msg go? "Old" stderr? FILE? Nowhere? -N,--nicelevel N Add N to process' nice level -c,--chuid USER[:[GRP]] Change to specified user [and group] -m,--make-pidfile Write PID to the pidfile (both -m and -p must be given!) + -P,--procsched policy:priority + This alters the process scheduler policy and priority of the + process before starting it (since version 1.15.0). The + priority can be optionally specified by appending a : + followed by the value. The default priority is 0. The + currently supported policy values are other, fifo and rr. + -r,--chroot root Change directory and chroot to root before starting the + process. Please note that the pidfile is also written after + the chroot. + -d,--chdir path Change directory to path before starting the process. This is + done after the chroot if the -r|--chroot option is set. When + not specified, start-stop-daemon will change directory to the + root directory before starting the process. Options which are valid for --stop only: -s,--signal SIG Signal to send (default:TERM) -t,--test Exit with status 0 if process is found (we don't actually start or stop daemons) + --remove-pidfile Used when stopping a program that does not remove its own pid + file (since version 1.17.19). Requires -p PIDFILE? Misc options: -o,--oknodo Exit with status 0 if nothing is done @@ -84,11 +106,11 @@ Misc options: //kbuild:lib-$(CONFIG_START_STOP_DAEMON) += start_stop_daemon.o //usage:#define start_stop_daemon_trivial_usage -//usage: "[OPTIONS] [-S|-K] ... [-- ARGS...]" +//usage: "-S|-K [OPTIONS] [-- ARGS...]" //usage:#define start_stop_daemon_full_usage "\n\n" //usage: "Search for matching processes, and then\n" -//usage: "-K: stop all matching processes\n" //usage: "-S: start a process unless a matching process is found\n" +//usage: "-K: stop all matching processes\n" //usage: "\nProcess matching:" //usage: "\n -u USERNAME|UID Match only this user's processes" //usage: "\n -n NAME Match processes with NAME" @@ -422,15 +444,19 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) opt = GETOPT32(argv, "^" "KSbqtma:n:s:u:c:x:p:" IF_FEATURE_START_STOP_DAEMON_FANCY("ovN:R:") + "\0" + "K:S:K--S:S--K" /* -K or -S is required; they are mutually exclusive */ - /* -p is required if -m is given */ - /* -xpun (at least one) is required if -K is given */ + ":m?p" /* -p is required if -m is given */ + ":K?xpun" /* -xpun (at least one) is required if -K is given */ + /* (the above does not seem to be enforced by Debian, it does nothing + * if no matching is specified with -K, and it ignores ARGS + * - does not take ARGS[0] as program name to kill) + */ // /* -xa (at least one) is required if -S is given */ //WRONG: "start-stop-daemon -S -- sleep 5" is a valid invocation - /* -q turns off -v */ - "\0" - "K:S:K--S:S--K:m?p:K?xpun" - IF_FEATURE_START_STOP_DAEMON_FANCY("q-v"), + IF_FEATURE_START_STOP_DAEMON_FANCY(":q-v") /* -q turns off -v */ + , LONGOPTS &startas, &cmdname, &signame, &userspec, &chuid, &execname, &pidfile IF_FEATURE_START_STOP_DAEMON_FANCY(,&opt_N) -- cgit v1.2.3-55-g6feb From 73f28134fc0987474384fde345559d4b34bf5385 Mon Sep 17 00:00:00 2001 From: ejaaskel Date: Tue, 7 Nov 2023 07:12:40 +0100 Subject: start-stop-daemon: add -d DIR chdir option Add option to change the running directory before starting the process. This can be done using -d or --chdir options. Add also test cases to start-stop-daemon to test out the directory change option. function old new delta packed_usage 34602 34648 +46 start_stop_daemon_main 1107 1130 +23 start_stop_daemon_longopts 156 164 +8 .rodata 105382 105384 +2 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 4/0 up/down: 79/0) Total: 79 bytes Signed-off-by: ejaaskel Signed-off-by: Denys Vlasenko --- TODO | 2 -- debianutils/start_stop_daemon.c | 34 +++++++++++++++++++++------------- testsuite/start-stop-daemon.tests | 20 ++++++++++++++++++++ 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/TODO b/TODO index 72ae0f88d..6c7415a81 100644 --- a/TODO +++ b/TODO @@ -222,8 +222,6 @@ Minor stuff: --- unify progress_meter. wget, flash_eraseall, pipe_progress, fbsplash, setfiles. --- - support start-stop-daemon -d ---- (TODO list after discussion 11.05.2009) diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index 16df67b3e..750167349 100644 --- a/debianutils/start_stop_daemon.c +++ b/debianutils/start_stop_daemon.c @@ -11,7 +11,7 @@ /* This is how it is supposed to work: -start-stop-daemon [OPTIONS] [--start|--stop] [[--] ARGS...] +start-stop-daemon [OPTIONS] [--start|--stop] [[--] ARGS] One (only) of these must be given: -S,--start Start @@ -58,13 +58,14 @@ Options which are valid for --start only: priority can be optionally specified by appending a : followed by the value. The default priority is 0. The currently supported policy values are other, fifo and rr. - -r,--chroot root Change directory and chroot to root before starting the + -r,--chroot DIR Change directory and chroot to DIR before starting the process. Please note that the pidfile is also written after the chroot. - -d,--chdir path Change directory to path before starting the process. This is - done after the chroot if the -r|--chroot option is set. When - not specified, start-stop-daemon will change directory to the + -d,--chdir DIR Change directory to DIR before starting the process. This is + done after the chroot if the -r|--chroot option is set. + When not specified, start-stop-daemon will change directory to the root directory before starting the process. + ^^^^ Seems to be false, no default "/" chdir is done. Options which are valid for --stop only: -s,--signal SIG Signal to send (default:TERM) @@ -106,7 +107,7 @@ Misc options: //kbuild:lib-$(CONFIG_START_STOP_DAEMON) += start_stop_daemon.o //usage:#define start_stop_daemon_trivial_usage -//usage: "-S|-K [OPTIONS] [-- ARGS...]" +//usage: "-S|-K [OPTIONS] [-- ARGS]" //usage:#define start_stop_daemon_full_usage "\n\n" //usage: "Search for matching processes, and then\n" //usage: "-S: start a process unless a matching process is found\n" @@ -127,6 +128,7 @@ Misc options: //usage: "\n -N N Change nice level" //usage: ) //usage: "\n -c USER[:[GRP]] Change user/group" +//usage: "\n -d DIR Change to DIR" //usage: "\n -m Write PID to pidfile specified by -p" //usage: "\n-K only:" //usage: "\n -s SIG Signal to send" @@ -160,11 +162,12 @@ enum { OPT_s = (1 << 8), // -s OPT_u = (1 << 9), // -u OPT_c = (1 << 10), // -c - OPT_x = (1 << 11), // -x - OPT_p = (1 << 12), // -p - OPT_OKNODO = (1 << 13) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -o - OPT_VERBOSE = (1 << 14) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -v - OPT_NICELEVEL = (1 << 15) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -N + OPT_d = (1 << 11), // -d + OPT_x = (1 << 12), // -x + OPT_p = (1 << 13), // -p + OPT_OKNODO = (1 << 14) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -o + OPT_VERBOSE = (1 << 15) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -v + OPT_NICELEVEL = (1 << 16) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -N }; #define QUIET (option_mask32 & OPT_QUIET) #define TEST (option_mask32 & OPT_TEST) @@ -413,6 +416,7 @@ static const char start_stop_daemon_longopts[] ALIGN1 = "signal\0" Required_argument "s" "user\0" Required_argument "u" "chuid\0" Required_argument "c" + "chdir\0" Required_argument "d" "exec\0" Required_argument "x" "pidfile\0" Required_argument "p" # if ENABLE_FEATURE_START_STOP_DAEMON_FANCY @@ -433,6 +437,7 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) char *signame; char *startas = NULL; char *chuid; + char *chdir; #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY // char *retry_arg = NULL; // int retries = -1; @@ -442,7 +447,7 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) INIT_G(); opt = GETOPT32(argv, "^" - "KSbqtma:n:s:u:c:x:p:" + "KSbqtma:n:s:u:c:d:x:p:" IF_FEATURE_START_STOP_DAEMON_FANCY("ovN:R:") "\0" "K:S:K--S:S--K" @@ -458,7 +463,7 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) IF_FEATURE_START_STOP_DAEMON_FANCY(":q-v") /* -q turns off -v */ , LONGOPTS - &startas, &cmdname, &signame, &userspec, &chuid, &execname, &pidfile + &startas, &cmdname, &signame, &userspec, &chuid, &chdir, &execname, &pidfile IF_FEATURE_START_STOP_DAEMON_FANCY(,&opt_N) /* We accept and ignore -R / --retry */ IF_FEATURE_START_STOP_DAEMON_FANCY(,NULL) @@ -586,6 +591,9 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) setgroups(1, &ugid.gid); } } + if (opt & OPT_d) { + xchdir(chdir); + } /* Try: * strace -oLOG start-stop-daemon -S -x /bin/usleep -a qwerty 500000 * should exec "/bin/usleep", but argv[0] should be "qwerty": diff --git a/testsuite/start-stop-daemon.tests b/testsuite/start-stop-daemon.tests index 0757b1288..e1e49ab5f 100755 --- a/testsuite/start-stop-daemon.tests +++ b/testsuite/start-stop-daemon.tests @@ -11,6 +11,21 @@ testing "start-stop-daemon -x without -a" \ "0\n" \ "" "" +testing "start-stop-daemon -x with -d on existing directory" \ + 'start-stop-daemon -S -d /tmp -x true 2>&1; echo $?' \ + "0\n" \ + "" "" + +testing "start-stop-daemon -x with -d on existing and check dir" \ + 'output=$(start-stop-daemon -S -d /tmp -x pwd); echo $output' \ + "/tmp\n" \ + "" "" + +testing "start-stop-daemon -x with --chdir on existing and check dir" \ + 'output=$(start-stop-daemon -S --chdir /tmp -x pwd); echo $output' \ + "/tmp\n" \ + "" "" + testing "start-stop-daemon -a without -x" \ 'start-stop-daemon -S -a false 2>&1; echo $?' \ "1\n" \ @@ -21,6 +36,11 @@ testing "start-stop-daemon without -x and -a" \ "1\n" \ "" "" +testing "start-stop-daemon -x with -d on non-existing directory" \ + 'start-stop-daemon -S -d /non-existent -x true > /dev/null 2>&1; echo $?' \ + "1\n" \ + "" "" + # This runs /bin/false with argv[0..2] of { "qwerty", "false", NULL }. # # Unfortunately, this does not actually check argv[0] correctness, -- cgit v1.2.3-55-g6feb From da8d1d84fd46e61eec0772ff339fde0952777a5f Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 7 Nov 2023 15:59:11 +0100 Subject: start-stop-daemon: update comment, no code changes Signed-off-by: Denys Vlasenko --- debianutils/start_stop_daemon.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index 750167349..8573c6990 100644 --- a/debianutils/start_stop_daemon.c +++ b/debianutils/start_stop_daemon.c @@ -17,6 +17,10 @@ One (only) of these must be given: -S,--start Start -K,--stop Stop -T,--status Check for the existence of a process, return exitcode (since version 1.16.1) + 0 - program is running + 1 - program is not running and the pid file exists. + 3 - program is not running. + 4 - can't determine program status. Search for matching processes. If --stop is given, stop all matching processes (by sending a signal). @@ -45,9 +49,10 @@ Options which are valid for --start only: -a,--startas NAME argv[0] (defaults to EXECUTABLE) -b,--background Put process into background -O,--output FILE Redirect stdout and stderr to FILE when forcing the - daemon into the background (since version 1.20.6). Only - relevant when using --background. - Probably O_CREAT|O_TRUNC? What if execv fails - where does error msg go? "Old" stderr? FILE? Nowhere? + daemon into the background (since version 1.20.6). + Requires --background and absolute pathname (tested with 1.21.22). + Uses O_CREAT|O_APPEND! + If execv fails, error message goes to FILE. -N,--nicelevel N Add N to process' nice level -c,--chuid USER[:[GRP]] Change to specified user [and group] -m,--make-pidfile Write PID to the pidfile @@ -66,6 +71,11 @@ Options which are valid for --start only: When not specified, start-stop-daemon will change directory to the root directory before starting the process. ^^^^ Seems to be false, no default "/" chdir is done. + Tested -S with 1.21.22: + "start-stop-daemon -S -n pwd -a /bin/pwd" is the minimum needed to run pwd. + "start-stop-daemon -S -n pwd -x /bin/pwd" works too. + "start-stop-daemon -S -a /bin/pwd -x /bin/pwd" works too. + Earlier versions were less picky (which?) Options which are valid for --stop only: -s,--signal SIG Signal to send (default:TERM) -- cgit v1.2.3-55-g6feb From d17c0a348fc10897d86e0e96aa98be5ac88d6fdd Mon Sep 17 00:00:00 2001 From: Petr Vorel Date: Fri, 3 Nov 2023 21:14:00 +0100 Subject: sleep: Update doc 4c20d9f2b removed FEATURE_FLOAT_SLEEP option, thus since then there are only two variants. Fixes: 4c20d9f2b ("extend fractional duration support to "top -d N.N" and "timeout"") Signed-off-by: Petr Vorel Signed-off-by: Denys Vlasenko --- coreutils/sleep.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/coreutils/sleep.c b/coreutils/sleep.c index fa74f1fd4..6fd00f9f1 100644 --- a/coreutils/sleep.c +++ b/coreutils/sleep.c @@ -17,14 +17,15 @@ //config: default y //config: help //config: sleep is used to pause for a specified number of seconds. -//config: It comes in 3 versions: +//config: It comes in 2 versions: //config: - small: takes one integer parameter -//config: - fancy: takes multiple integer arguments with suffixes: -//config: sleep 1d 2h 3m 15s -//config: - fancy with fractional numbers: -//config: sleep 2.3s 4.5h sleeps for 16202.3 seconds -//config: Last one is "the most compatible" with coreutils sleep, -//config: but it adds around 1k of code. +//config: - fancy: +//config: * takes multiple integer arguments with suffixes: +//config: sleep 1d 2h 3m 15s +//config: * allows fractional numbers: +//config: sleep 2.3s 4.5h sleeps for 16202.3 seconds +//config: fancy is more compatible with coreutils sleep, but it adds around +//config: 1k of code. //config: //config:config FEATURE_FANCY_SLEEP //config: bool "Enable multiple arguments and s/m/h/d suffixes" -- cgit v1.2.3-55-g6feb From 389c0458da7d6e941886ea3b846c98cfd63dfdd3 Mon Sep 17 00:00:00 2001 From: Louai Al-Khanji Date: Tue, 7 Nov 2023 21:41:32 +0100 Subject: start-stop-daemon: implement option -O|--output If specified redirect command stdout and stderr to given pathname. function old new delta start_stop_daemon_main 1130 1186 +56 start_stop_daemon_longopts 164 173 +9 packed_usage 34653 34656 +3 .rodata 105384 105386 +2 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 4/0 up/down: 70/0) Total: 70 bytes Signed-off-by: Louai Al-Khanji Signed-off-by: Denys Vlasenko --- debianutils/start_stop_daemon.c | 46 ++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index 8573c6990..56a933fcb 100644 --- a/debianutils/start_stop_daemon.c +++ b/debianutils/start_stop_daemon.c @@ -18,9 +18,9 @@ One (only) of these must be given: -K,--stop Stop -T,--status Check for the existence of a process, return exitcode (since version 1.16.1) 0 - program is running - 1 - program is not running and the pid file exists. - 3 - program is not running. - 4 - can't determine program status. + 1 - program is not running and the pid file exists + 3 - program is not running + 4 - can't determine program status Search for matching processes. If --stop is given, stop all matching processes (by sending a signal). @@ -41,6 +41,7 @@ with /proc/$PID/exe or argv[0] (comm can't be matched, it never contains path)] Unlike -n, we match against the full path: "ntpd" != "./ntpd" != "/path/to/ntpd" -p,--pidfile PID_FILE Look for processes with PID from this file + --pid PID Look for process with this pid (since version 1.17.6) --ppid PPID Look for processes with parent pid (since version 1.17.7) Options which are valid for --start only: @@ -72,10 +73,10 @@ Options which are valid for --start only: root directory before starting the process. ^^^^ Seems to be false, no default "/" chdir is done. Tested -S with 1.21.22: - "start-stop-daemon -S -n pwd -a /bin/pwd" is the minimum needed to run pwd. - "start-stop-daemon -S -n pwd -x /bin/pwd" works too. - "start-stop-daemon -S -a /bin/pwd -x /bin/pwd" works too. - Earlier versions were less picky (which?) + "start-stop-daemon -S -x /bin/pwd" is the minimum needed to run pwd. + "start-stop-daemon -S -a /bin/pwd -n pwd" works too. + "start-stop-daemon -S -a /bin/pwd" does NOT work. + Earlier versions were less picky (which? Or is it only Gentoo's clone?) Options which are valid for --stop only: -s,--signal SIG Signal to send (default:TERM) @@ -110,6 +111,7 @@ Misc options: //config: -o|--oknodo ignored since we exit with 0 anyway //config: -v|--verbose //config: -N|--nicelevel N +//config: -O|--output FILE //applet:IF_START_STOP_DAEMON(APPLET_ODDNAME(start-stop-daemon, start_stop_daemon, BB_DIR_SBIN, BB_SUID_DROP, start_stop_daemon)) /* not NOEXEC: uses bb_common_bufsiz1 */ @@ -147,8 +149,9 @@ Misc options: //usage: IF_FEATURE_START_STOP_DAEMON_FANCY( //usage: "\n -o Exit with status 0 if nothing is done" //usage: "\n -v Verbose" -//usage: ) //usage: "\n -q Quiet" +//usage: "\n -O PILE Append stdout and stderr to FILE" +//usage: ) /* Override ENABLE_FEATURE_PIDFILE */ #define WANT_PIDFILE 1 @@ -178,6 +181,7 @@ enum { OPT_OKNODO = (1 << 14) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -o OPT_VERBOSE = (1 << 15) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -v OPT_NICELEVEL = (1 << 16) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -N + OPT_OUTPUT = (1 << 17) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -O }; #define QUIET (option_mask32 & OPT_QUIET) #define TEST (option_mask32 & OPT_TEST) @@ -420,6 +424,7 @@ static const char start_stop_daemon_longopts[] ALIGN1 = "oknodo\0" No_argument "o" "verbose\0" No_argument "v" "nicelevel\0" Required_argument "N" + "output\0" Required_argument "O" # endif "startas\0" Required_argument "a" "name\0" Required_argument "n" @@ -452,33 +457,42 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) // char *retry_arg = NULL; // int retries = -1; char *opt_N; + char *output; #endif INIT_G(); opt = GETOPT32(argv, "^" "KSbqtma:n:s:u:c:d:x:p:" - IF_FEATURE_START_STOP_DAEMON_FANCY("ovN:R:") + IF_FEATURE_START_STOP_DAEMON_FANCY("ovN:O:R:") "\0" "K:S:K--S:S--K" /* -K or -S is required; they are mutually exclusive */ ":m?p" /* -p is required if -m is given */ ":K?xpun" /* -xpun (at least one) is required if -K is given */ - /* (the above does not seem to be enforced by Debian, it does nothing + /* (the above does not seem to be enforced by Gentoo, it does nothing * if no matching is specified with -K, and it ignores ARGS * - does not take ARGS[0] as program name to kill) */ -// /* -xa (at least one) is required if -S is given */ -//WRONG: "start-stop-daemon -S -- sleep 5" is a valid invocation +// ":S?xa" /* -xa (at least one) is required if -S is given */ +//Gentoo clone: "start-stop-daemon -S -- sleep 5" is a valid invocation IF_FEATURE_START_STOP_DAEMON_FANCY(":q-v") /* -q turns off -v */ , LONGOPTS &startas, &cmdname, &signame, &userspec, &chuid, &chdir, &execname, &pidfile IF_FEATURE_START_STOP_DAEMON_FANCY(,&opt_N) + IF_FEATURE_START_STOP_DAEMON_FANCY(,&output) /* We accept and ignore -R / --retry */ IF_FEATURE_START_STOP_DAEMON_FANCY(,NULL) ); +//-O requires --background and absolute pathname (tested with 1.21.22). +//We don't bother requiring that (smaller code): +//#if ENABLE_FEATURE_START_STOP_DAEMON_FANCY +// if ((opt & OPT_OUTPUT) && !(opt & OPT_BACKGROUND)) +// bb_show_usage(); +//#endif + if (opt & OPT_s) { signal_nr = get_signum(signame); if (signal_nr < 0) bb_show_usage(); @@ -604,6 +618,14 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) if (opt & OPT_d) { xchdir(chdir); } +#if ENABLE_FEATURE_START_STOP_DAEMON_FANCY + if (opt & OPT_OUTPUT) { + int outfd = xopen(output, O_WRONLY | O_CREAT | O_APPEND); + xmove_fd(outfd, STDOUT_FILENO); + xdup2(STDOUT_FILENO, STDERR_FILENO); + /* on execv error, the message goes to -O file. This is intended */ + } +#endif /* Try: * strace -oLOG start-stop-daemon -S -x /bin/usleep -a qwerty 500000 * should exec "/bin/usleep", but argv[0] should be "qwerty": -- cgit v1.2.3-55-g6feb From 2de67a62e812f2e4d13280f2b78712b6d344cfb7 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 8 Nov 2023 12:36:11 +0100 Subject: start-stop-daemon: typo fix Signed-off-by: Denys Vlasenko --- debianutils/start_stop_daemon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index 56a933fcb..04ba8baa7 100644 --- a/debianutils/start_stop_daemon.c +++ b/debianutils/start_stop_daemon.c @@ -150,7 +150,7 @@ Misc options: //usage: "\n -o Exit with status 0 if nothing is done" //usage: "\n -v Verbose" //usage: "\n -q Quiet" -//usage: "\n -O PILE Append stdout and stderr to FILE" +//usage: "\n -O FILE Append stdout and stderr to FILE" //usage: ) /* Override ENABLE_FEATURE_PIDFILE */ -- cgit v1.2.3-55-g6feb From 58ca629fd27cd9d7f91a8ea90435cdb3f15381aa Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 8 Nov 2023 14:07:20 +0100 Subject: start-stop-daemon: do not lose error messages with -b function old new delta start_stop_daemon_main 1186 1206 +20 bb_daemonize_or_rexec 196 212 +16 bb_banner 47 46 -1 packed_usage 34656 34645 -11 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/2 up/down: 36/-12) Total: 24 bytes Signed-off-by: Denys Vlasenko --- debianutils/start_stop_daemon.c | 57 ++++++++++++++++++++--------------------- include/libbb.h | 11 +++++--- libbb/vfork_daemon_rexec.c | 9 ++++--- 3 files changed, 41 insertions(+), 36 deletions(-) diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index 04ba8baa7..00fa0a82c 100644 --- a/debianutils/start_stop_daemon.c +++ b/debianutils/start_stop_daemon.c @@ -71,7 +71,7 @@ Options which are valid for --start only: done after the chroot if the -r|--chroot option is set. When not specified, start-stop-daemon will change directory to the root directory before starting the process. - ^^^^ Seems to be false, no default "/" chdir is done. + ^^^^ Gentoo does not have the default chdir("/"). Debian does. Tested -S with 1.21.22: "start-stop-daemon -S -x /bin/pwd" is the minimum needed to run pwd. "start-stop-daemon -S -a /bin/pwd -n pwd" works too. @@ -111,7 +111,6 @@ Misc options: //config: -o|--oknodo ignored since we exit with 0 anyway //config: -v|--verbose //config: -N|--nicelevel N -//config: -O|--output FILE //applet:IF_START_STOP_DAEMON(APPLET_ODDNAME(start-stop-daemon, start_stop_daemon, BB_DIR_SBIN, BB_SUID_DROP, start_stop_daemon)) /* not NOEXEC: uses bb_common_bufsiz1 */ @@ -136,6 +135,7 @@ Misc options: //usage: "\n -x EXECUTABLE Program to run" //usage: "\n -a NAME Zeroth argument" //usage: "\n -b Background" +//usage: "\n -O FILE Append stdout and stderr to FILE" //usage: IF_FEATURE_START_STOP_DAEMON_FANCY( //usage: "\n -N N Change nice level" //usage: ) @@ -150,7 +150,6 @@ Misc options: //usage: "\n -o Exit with status 0 if nothing is done" //usage: "\n -v Verbose" //usage: "\n -q Quiet" -//usage: "\n -O FILE Append stdout and stderr to FILE" //usage: ) /* Override ENABLE_FEATURE_PIDFILE */ @@ -178,20 +177,20 @@ enum { OPT_d = (1 << 11), // -d OPT_x = (1 << 12), // -x OPT_p = (1 << 13), // -p - OPT_OKNODO = (1 << 14) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -o - OPT_VERBOSE = (1 << 15) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -v - OPT_NICELEVEL = (1 << 16) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -N - OPT_OUTPUT = (1 << 17) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -O + OPT_OUTPUT = (1 << 14), // -O + OPT_OKNODO = (1 << 15) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -o + OPT_VERBOSE = (1 << 16) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -v + OPT_NICELEVEL = (1 << 17) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -N }; #define QUIET (option_mask32 & OPT_QUIET) #define TEST (option_mask32 & OPT_TEST) struct globals { struct pid_list *found_procs; - char *userspec; - char *cmdname; - char *execname; - char *pidfile; + const char *userspec; + const char *cmdname; + const char *execname; + const char *pidfile; char *execname_cmpbuf; unsigned execname_sizeof; int user_id; @@ -361,7 +360,7 @@ static void do_procinit(void) static int do_stop(void) { - char *what; + const char *what; struct pid_list *p; int killed = 0; @@ -408,7 +407,7 @@ static int do_stop(void) } ret: if (ENABLE_FEATURE_CLEAN_UP) - free(what); + free((char *)what); return killed; } @@ -449,22 +448,22 @@ int start_stop_daemon_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) { unsigned opt; - char *signame; - char *startas = NULL; + const char *signame; + const char *startas = NULL; char *chuid; - char *chdir; + const char *chdir; + const char *output = NULL; #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY -// char *retry_arg = NULL; +// const char *retry_arg = NULL; // int retries = -1; - char *opt_N; - char *output; + const char *opt_N; #endif INIT_G(); opt = GETOPT32(argv, "^" - "KSbqtma:n:s:u:c:d:x:p:" - IF_FEATURE_START_STOP_DAEMON_FANCY("ovN:O:R:") + "KSbqtma:n:s:u:c:d:x:p:O:" + IF_FEATURE_START_STOP_DAEMON_FANCY("ovN:R:") "\0" "K:S:K--S:S--K" /* -K or -S is required; they are mutually exclusive */ @@ -479,9 +478,8 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) IF_FEATURE_START_STOP_DAEMON_FANCY(":q-v") /* -q turns off -v */ , LONGOPTS - &startas, &cmdname, &signame, &userspec, &chuid, &chdir, &execname, &pidfile + &startas, &cmdname, &signame, &userspec, &chuid, &chdir, &execname, &pidfile, &output IF_FEATURE_START_STOP_DAEMON_FANCY(,&opt_N) - IF_FEATURE_START_STOP_DAEMON_FANCY(,&output) /* We accept and ignore -R / --retry */ IF_FEATURE_START_STOP_DAEMON_FANCY(,NULL) ); @@ -519,7 +517,7 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) } if (!startas) /* -a is not given: use -x EXECUTABLE or argv[0] */ startas = execname; - *--argv = startas; + *--argv = (char *)startas; } if (execname) { G.execname_sizeof = strlen(execname) + 1; @@ -578,8 +576,11 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) } /* Child */ setsid(); /* detach from controlling tty */ - /* Redirect stdio to /dev/null, close extra FDs */ - bb_daemon_helper(DAEMON_DEVNULL_STDIO + DAEMON_CLOSE_EXTRA_FDS); + /* Redirect stdin to /dev/null, close extra FDs */ + /* Testcase: "start-stop-daemon -Sb -d /does/not/exist usleep 1" should not eat error message */ + bb_daemon_helper(DAEMON_DEVNULL_STDIN + DAEMON_CLOSE_EXTRA_FDS); + if (!output) + output = bb_dev_null; /* redirect output just before execv */ /* On Linux, session leader can acquire ctty * unknowingly, by opening a tty. * Prevent this: stop being a session leader. @@ -618,14 +619,12 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) if (opt & OPT_d) { xchdir(chdir); } -#if ENABLE_FEATURE_START_STOP_DAEMON_FANCY - if (opt & OPT_OUTPUT) { + if (output) { int outfd = xopen(output, O_WRONLY | O_CREAT | O_APPEND); xmove_fd(outfd, STDOUT_FILENO); xdup2(STDOUT_FILENO, STDERR_FILENO); /* on execv error, the message goes to -O file. This is intended */ } -#endif /* Try: * strace -oLOG start-stop-daemon -S -x /bin/usleep -a qwerty 500000 * should exec "/bin/usleep", but argv[0] should be "qwerty": diff --git a/include/libbb.h b/include/libbb.h index 0883fb565..ef5d04713 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -1309,10 +1309,12 @@ void _exit_FAILURE(void) NORETURN FAST_FUNC; */ enum { DAEMON_CHDIR_ROOT = 1 << 0, - DAEMON_DEVNULL_STDIO = 1 << 1, - DAEMON_CLOSE_EXTRA_FDS = 1 << 2, - DAEMON_ONLY_SANITIZE = 1 << 3, /* internal use */ - //DAEMON_DOUBLE_FORK = 1 << 4, /* double fork to avoid controlling tty */ + DAEMON_DEVNULL_STDIN = 1 << 1, + DAEMON_DEVNULL_OUTERR = 2 << 1, + DAEMON_DEVNULL_STDIO = 3 << 1, + DAEMON_CLOSE_EXTRA_FDS = 1 << 3, + DAEMON_ONLY_SANITIZE = 1 << 4, /* internal use */ + //DAEMON_DOUBLE_FORK = 1 << 5, /* double fork to avoid controlling tty */ }; #if BB_MMU enum { re_execed = 0 }; @@ -1335,6 +1337,7 @@ enum { # define bb_daemonize(a) BUG_bb_daemonize_is_unavailable_on_nommu() #endif void bb_daemonize_or_rexec(int flags, char **argv) FAST_FUNC; +/* Unlike bb_daemonize_or_rexec, these two helpers do not setsid: */ void bb_sanitize_stdio(void) FAST_FUNC; #define bb_daemon_helper(arg) bb_daemonize_or_rexec((arg) | DAEMON_ONLY_SANITIZE, NULL) /* Clear dangerous stuff, set PATH. Return 1 if was run by different user. */ diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c index a570ddbf2..2055c4b71 100644 --- a/libbb/vfork_daemon_rexec.c +++ b/libbb/vfork_daemon_rexec.c @@ -296,9 +296,12 @@ void FAST_FUNC bb_daemonize_or_rexec(int flags, char **argv) } if (flags & DAEMON_DEVNULL_STDIO) { - xdup2(fd, 0); - xdup2(fd, 1); - xdup2(fd, 2); + if (flags & DAEMON_DEVNULL_STDIN) + xdup2(fd, 0); + if (flags & DAEMON_DEVNULL_OUTERR) { + xdup2(fd, 1); + xdup2(fd, 2); + } } else { /* have 0,1,2 open at least to /dev/null */ while ((unsigned)fd < 2) -- cgit v1.2.3-55-g6feb From 59cf2c23aebaeed29fd5a8a0f112e01c1f1dd45f Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 8 Nov 2023 14:42:00 +0100 Subject: start-stop-daemon: make --output not depend on FANCY Signed-off-by: Denys Vlasenko --- debianutils/start_stop_daemon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index 00fa0a82c..271bc4edf 100644 --- a/debianutils/start_stop_daemon.c +++ b/debianutils/start_stop_daemon.c @@ -419,11 +419,11 @@ static const char start_stop_daemon_longopts[] ALIGN1 = "quiet\0" No_argument "q" "test\0" No_argument "t" "make-pidfile\0" No_argument "m" + "output\0" Required_argument "O" # if ENABLE_FEATURE_START_STOP_DAEMON_FANCY "oknodo\0" No_argument "o" "verbose\0" No_argument "v" "nicelevel\0" Required_argument "N" - "output\0" Required_argument "O" # endif "startas\0" Required_argument "a" "name\0" Required_argument "n" -- cgit v1.2.3-55-g6feb From a63b60bdd6fa26b867c80d44074118babbae7ffd Mon Sep 17 00:00:00 2001 From: Christian Franke Date: Mon, 9 Oct 2023 11:12:35 +0200 Subject: Cygwin: regenerate defconfig Signed-off-by: Christian Franke Signed-off-by: Denys Vlasenko --- configs/cygwin_defconfig | 792 ++++++++++++++++++++++++++++++----------------- 1 file changed, 515 insertions(+), 277 deletions(-) diff --git a/configs/cygwin_defconfig b/configs/cygwin_defconfig index c09bc9281..61e2c2463 100644 --- a/configs/cygwin_defconfig +++ b/configs/cygwin_defconfig @@ -1,52 +1,41 @@ # # Automatically generated make config: don't edit -# Busybox version: 1.19.0.git -# Sun Jul 10 12:48:50 2011 +# Busybox version: 1.37.0.git +# Mon Oct 9 11:08:46 2023 # CONFIG_HAVE_DOT_CONFIG=y # -# Busybox Settings -# - -# -# General Configuration +# Settings # CONFIG_DESKTOP=y # CONFIG_EXTRA_COMPAT is not set +# CONFIG_FEDORA_COMPAT is not set CONFIG_INCLUDE_SUSv2=y -# CONFIG_USE_PORTABLE_CODE is not set -CONFIG_FEATURE_BUFFERS_USE_MALLOC=y -# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set -# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set +CONFIG_LONG_OPTS=y CONFIG_SHOW_USAGE=y CONFIG_FEATURE_VERBOSE_USAGE=y CONFIG_FEATURE_COMPRESS_USAGE=y -CONFIG_FEATURE_INSTALLER=y -# CONFIG_INSTALL_NO_USR is not set -# CONFIG_LOCALE_SUPPORT is not set -CONFIG_UNICODE_SUPPORT=y -# CONFIG_UNICODE_USING_LOCALE is not set -# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set -CONFIG_SUBST_WCHAR=65533 -CONFIG_LAST_SUPPORTED_WCHAR=0 -# CONFIG_UNICODE_COMBINING_WCHARS is not set -# CONFIG_UNICODE_WIDE_WCHARS is not set -# CONFIG_UNICODE_BIDI_SUPPORT is not set -# CONFIG_UNICODE_NEUTRAL_TABLE is not set -# CONFIG_UNICODE_PRESERVE_BROKEN is not set -CONFIG_LONG_OPTS=y +CONFIG_LFS=y +CONFIG_TIME64=y +# CONFIG_PAM is not set CONFIG_FEATURE_DEVPTS=y -# CONFIG_FEATURE_CLEAN_UP is not set # CONFIG_FEATURE_UTMP is not set # CONFIG_FEATURE_WTMP is not set CONFIG_FEATURE_PIDFILE=y +CONFIG_PID_FILE_PATH="/var/run" +CONFIG_BUSYBOX=y +CONFIG_FEATURE_SHOW_SCRIPT=y +CONFIG_FEATURE_INSTALLER=y +# CONFIG_INSTALL_NO_USR is not set CONFIG_FEATURE_SUID=y # CONFIG_FEATURE_SUID_CONFIG is not set # CONFIG_FEATURE_SUID_CONFIG_QUIET is not set -# CONFIG_SELINUX is not set # CONFIG_FEATURE_PREFER_APPLETS is not set CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" +# CONFIG_SELINUX is not set +# CONFIG_FEATURE_CLEAN_UP is not set +CONFIG_FEATURE_SYSLOG_INFO=y CONFIG_FEATURE_SYSLOG=y # @@ -56,21 +45,17 @@ CONFIG_FEATURE_SYSLOG=y # CONFIG_PIE is not set # CONFIG_NOMMU is not set # CONFIG_BUILD_LIBBUSYBOX is not set +# CONFIG_FEATURE_LIBBUSYBOX_STATIC is not set # CONFIG_FEATURE_INDIVIDUAL is not set # CONFIG_FEATURE_SHARED_BUSYBOX is not set -CONFIG_LFS=y CONFIG_CROSS_COMPILER_PREFIX="" +CONFIG_SYSROOT="" CONFIG_EXTRA_CFLAGS="" - -# -# Debugging Options -# -# CONFIG_DEBUG is not set -# CONFIG_DEBUG_PESSIMIZE is not set -# CONFIG_WERROR is not set -CONFIG_NO_DEBUG_LIB=y -# CONFIG_DMALLOC is not set -# CONFIG_EFENCE is not set +CONFIG_EXTRA_LDFLAGS="" +CONFIG_EXTRA_LDLIBS="" +# CONFIG_USE_PORTABLE_CODE is not set +CONFIG_STACK_OPTIMIZATION_386=y +CONFIG_STATIC_LIBGCC=y # # Installation Options ("make install" behavior) @@ -85,29 +70,66 @@ CONFIG_INSTALL_APPLET_SYMLINKS=y CONFIG_PREFIX="./_install" # -# Busybox Library Tuning +# Debugging Options +# +# CONFIG_DEBUG is not set +# CONFIG_DEBUG_PESSIMIZE is not set +# CONFIG_DEBUG_SANITIZE is not set +# CONFIG_UNIT_TEST is not set +# CONFIG_WERROR is not set +# CONFIG_WARN_SIMPLE_MSG is not set +CONFIG_NO_DEBUG_LIB=y +# CONFIG_DMALLOC is not set +# CONFIG_EFENCE is not set + +# +# Library Tuning # +# CONFIG_FEATURE_USE_BSS_TAIL is not set +CONFIG_FLOAT_DURATION=y CONFIG_FEATURE_RTMINMAX=y +CONFIG_FEATURE_RTMINMAX_USE_LIBC_DEFINITIONS=y +CONFIG_FEATURE_BUFFERS_USE_MALLOC=y +# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set +# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set CONFIG_PASSWORD_MINLEN=6 CONFIG_MD5_SMALL=1 -CONFIG_FEATURE_FAST_TOP=y -# CONFIG_FEATURE_ETC_NETWORKS is not set +CONFIG_SHA1_SMALL=3 +CONFIG_SHA1_HWACCEL=y +CONFIG_SHA256_HWACCEL=y +CONFIG_SHA3_SMALL=1 +CONFIG_FEATURE_NON_POSIX_CP=y +# CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set +CONFIG_FEATURE_USE_SENDFILE=y +CONFIG_FEATURE_COPYBUF_KB=4 +# CONFIG_MONOTONIC_SYSCALL is not set +CONFIG_IOCTL_HEX2STR_ERROR=y CONFIG_FEATURE_EDITING=y CONFIG_FEATURE_EDITING_MAX_LEN=1024 # CONFIG_FEATURE_EDITING_VI is not set CONFIG_FEATURE_EDITING_HISTORY=255 CONFIG_FEATURE_EDITING_SAVEHISTORY=y +# CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set +CONFIG_FEATURE_REVERSE_SEARCH=y CONFIG_FEATURE_TAB_COMPLETION=y # CONFIG_FEATURE_USERNAME_COMPLETION is not set CONFIG_FEATURE_EDITING_FANCY_PROMPT=y +CONFIG_FEATURE_EDITING_WINCH=y # CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set -CONFIG_FEATURE_NON_POSIX_CP=y -# CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set -CONFIG_FEATURE_COPYBUF_KB=4 -CONFIG_FEATURE_SKIP_ROOTFS=y -# CONFIG_MONOTONIC_SYSCALL is not set -CONFIG_IOCTL_HEX2STR_ERROR=y -CONFIG_FEATURE_HWIB=y +# CONFIG_LOCALE_SUPPORT is not set +CONFIG_UNICODE_SUPPORT=y +# CONFIG_UNICODE_USING_LOCALE is not set +# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set +CONFIG_SUBST_WCHAR=65533 +CONFIG_LAST_SUPPORTED_WCHAR=0 +# CONFIG_UNICODE_COMBINING_WCHARS is not set +# CONFIG_UNICODE_WIDE_WCHARS is not set +# CONFIG_UNICODE_BIDI_SUPPORT is not set +# CONFIG_UNICODE_NEUTRAL_TABLE is not set +# CONFIG_UNICODE_PRESERVE_BROKEN is not set +# CONFIG_LOOP_CONFIGURE is not set +# CONFIG_NO_LOOP_CONFIGURE is not set +CONFIG_TRY_LOOP_CONFIGURE=y # # Applets @@ -124,76 +146,106 @@ CONFIG_FEATURE_SEAMLESS_GZ=y # CONFIG_AR is not set # CONFIG_FEATURE_AR_LONG_FILENAMES is not set # CONFIG_FEATURE_AR_CREATE is not set +# CONFIG_UNCOMPRESS is not set +CONFIG_GUNZIP=y +CONFIG_ZCAT=y +CONFIG_FEATURE_GUNZIP_LONG_OPTIONS=y CONFIG_BUNZIP2=y +CONFIG_BZCAT=y +CONFIG_UNLZMA=y +CONFIG_LZCAT=y +CONFIG_LZMA=y +CONFIG_UNXZ=y +CONFIG_XZCAT=y +CONFIG_XZ=y CONFIG_BZIP2=y +CONFIG_BZIP2_SMALL=8 +CONFIG_FEATURE_BZIP2_DECOMPRESS=y CONFIG_CPIO=y CONFIG_FEATURE_CPIO_O=y CONFIG_FEATURE_CPIO_P=y +CONFIG_FEATURE_CPIO_IGNORE_DEVNO=y +CONFIG_FEATURE_CPIO_RENUMBER_INODES=y # CONFIG_DPKG is not set # CONFIG_DPKG_DEB is not set -CONFIG_GUNZIP=y CONFIG_GZIP=y CONFIG_FEATURE_GZIP_LONG_OPTIONS=y +CONFIG_GZIP_FAST=0 +# CONFIG_FEATURE_GZIP_LEVELS is not set +CONFIG_FEATURE_GZIP_DECOMPRESS=y CONFIG_LZOP=y +# CONFIG_UNLZOP is not set +# CONFIG_LZOPCAT is not set # CONFIG_LZOP_COMPR_HIGH is not set -CONFIG_RPM2CPIO=y CONFIG_RPM=y +CONFIG_RPM2CPIO=y CONFIG_TAR=y +CONFIG_FEATURE_TAR_LONG_OPTIONS=y CONFIG_FEATURE_TAR_CREATE=y CONFIG_FEATURE_TAR_AUTODETECT=y CONFIG_FEATURE_TAR_FROM=y CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY=y CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY=y CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y -CONFIG_FEATURE_TAR_LONG_OPTIONS=y CONFIG_FEATURE_TAR_TO_COMMAND=y CONFIG_FEATURE_TAR_UNAME_GNAME=y CONFIG_FEATURE_TAR_NOPRESERVE_TIME=y # CONFIG_FEATURE_TAR_SELINUX is not set -# CONFIG_UNCOMPRESS is not set -CONFIG_UNLZMA=y -CONFIG_FEATURE_LZMA_FAST=y -CONFIG_LZMA=y -CONFIG_UNXZ=y -CONFIG_XZ=y CONFIG_UNZIP=y +CONFIG_FEATURE_UNZIP_CDF=y +CONFIG_FEATURE_UNZIP_BZIP2=y +CONFIG_FEATURE_UNZIP_LZMA=y +CONFIG_FEATURE_UNZIP_XZ=y +CONFIG_FEATURE_LZMA_FAST=y # # Coreutils # +CONFIG_FEATURE_VERBOSE=y + +# +# Common options for date and touch +# +CONFIG_FEATURE_TIMEZONE=y + +# +# Common options for cp and mv +# +CONFIG_FEATURE_PRESERVE_HARDLINKS=y + +# +# Common options for df, du, ls +# +CONFIG_FEATURE_HUMAN_READABLE=y CONFIG_BASENAME=y CONFIG_CAT=y -CONFIG_DATE=y -CONFIG_FEATURE_DATE_ISOFMT=y -# CONFIG_FEATURE_DATE_NANO is not set -CONFIG_FEATURE_DATE_COMPAT=y -CONFIG_ID=y -CONFIG_GROUPS=y -CONFIG_TEST=y -CONFIG_FEATURE_TEST_64=y -CONFIG_TOUCH=y -CONFIG_TR=y -CONFIG_FEATURE_TR_CLASSES=y -CONFIG_FEATURE_TR_EQUIV=y -CONFIG_BASE64=y -CONFIG_CAL=y -CONFIG_CATV=y +CONFIG_FEATURE_CATN=y +CONFIG_FEATURE_CATV=y CONFIG_CHGRP=y CONFIG_CHMOD=y CONFIG_CHOWN=y CONFIG_FEATURE_CHOWN_LONG_OPTIONS=y CONFIG_CHROOT=y CONFIG_CKSUM=y +CONFIG_CRC32=y CONFIG_COMM=y CONFIG_CP=y CONFIG_FEATURE_CP_LONG_OPTIONS=y +CONFIG_FEATURE_CP_REFLINK=y CONFIG_CUT=y +CONFIG_FEATURE_CUT_REGEX=y +CONFIG_DATE=y +CONFIG_FEATURE_DATE_ISOFMT=y +# CONFIG_FEATURE_DATE_NANO is not set +CONFIG_FEATURE_DATE_COMPAT=y CONFIG_DD=y CONFIG_FEATURE_DD_SIGNAL_HANDLING=y CONFIG_FEATURE_DD_THIRD_STATUS_LINE=y CONFIG_FEATURE_DD_IBS_OBS=y +CONFIG_FEATURE_DD_STATUS=y CONFIG_DF=y CONFIG_FEATURE_DF_FANCY=y +CONFIG_FEATURE_SKIP_ROOTFS=y CONFIG_DIRNAME=y CONFIG_DOS2UNIX=y CONFIG_UNIX2DOS=y @@ -202,40 +254,54 @@ CONFIG_DU=y CONFIG_ECHO=y CONFIG_FEATURE_FANCY_ECHO=y CONFIG_ENV=y -CONFIG_FEATURE_ENV_LONG_OPTIONS=y CONFIG_EXPAND=y -CONFIG_FEATURE_EXPAND_LONG_OPTIONS=y +CONFIG_UNEXPAND=y CONFIG_EXPR=y CONFIG_EXPR_MATH_SUPPORT_64=y +CONFIG_FACTOR=y CONFIG_FALSE=y CONFIG_FOLD=y -CONFIG_FSYNC=y CONFIG_HEAD=y CONFIG_FEATURE_FANCY_HEAD=y CONFIG_HOSTID=y +CONFIG_ID=y +CONFIG_GROUPS=y CONFIG_INSTALL=y CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y +CONFIG_LINK=y CONFIG_LN=y CONFIG_LOGNAME=y CONFIG_LS=y CONFIG_FEATURE_LS_FILETYPES=y CONFIG_FEATURE_LS_FOLLOWLINKS=y CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_FEATURE_LS_WIDTH=y CONFIG_FEATURE_LS_SORTFILES=y CONFIG_FEATURE_LS_TIMESTAMPS=y CONFIG_FEATURE_LS_USERNAME=y CONFIG_FEATURE_LS_COLOR=y CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y CONFIG_MD5SUM=y +CONFIG_SHA1SUM=y +CONFIG_SHA256SUM=y +CONFIG_SHA512SUM=y +CONFIG_SHA3SUM=y + +# +# Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum +# +CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y CONFIG_MKDIR=y -CONFIG_FEATURE_MKDIR_LONG_OPTIONS=y CONFIG_MKFIFO=y CONFIG_MKNOD=y +CONFIG_MKTEMP=y CONFIG_MV=y -CONFIG_FEATURE_MV_LONG_OPTIONS=y CONFIG_NICE=y +CONFIG_NL=y CONFIG_NOHUP=y +CONFIG_NPROC=y CONFIG_OD=y +CONFIG_PASTE=y CONFIG_PRINTENV=y CONFIG_PRINTF=y CONFIG_PWD=y @@ -244,68 +310,76 @@ CONFIG_FEATURE_READLINK_FOLLOW=y CONFIG_REALPATH=y CONFIG_RM=y CONFIG_RMDIR=y -CONFIG_FEATURE_RMDIR_LONG_OPTIONS=y CONFIG_SEQ=y -CONFIG_SHA1SUM=y -CONFIG_SHA256SUM=y -CONFIG_SHA512SUM=y +CONFIG_SHRED=y +CONFIG_SHUF=y CONFIG_SLEEP=y CONFIG_FEATURE_FANCY_SLEEP=y -CONFIG_FEATURE_FLOAT_SLEEP=y CONFIG_SORT=y CONFIG_FEATURE_SORT_BIG=y +# CONFIG_FEATURE_SORT_OPTIMIZE_MEMORY is not set CONFIG_SPLIT=y CONFIG_FEATURE_SPLIT_FANCY=y # CONFIG_STAT is not set # CONFIG_FEATURE_STAT_FORMAT is not set +# CONFIG_FEATURE_STAT_FILESYSTEM is not set CONFIG_STTY=y CONFIG_SUM=y CONFIG_SYNC=y +CONFIG_FEATURE_SYNC_FANCY=y +CONFIG_FSYNC=y CONFIG_TAC=y CONFIG_TAIL=y CONFIG_FEATURE_FANCY_TAIL=y CONFIG_TEE=y CONFIG_FEATURE_TEE_USE_BLOCK_IO=y +CONFIG_TEST=y +CONFIG_TEST1=y +CONFIG_TEST2=y +CONFIG_FEATURE_TEST_64=y +CONFIG_TIMEOUT=y +CONFIG_TOUCH=y +CONFIG_FEATURE_TOUCH_SUSV3=y +CONFIG_TR=y +CONFIG_FEATURE_TR_CLASSES=y +CONFIG_FEATURE_TR_EQUIV=y CONFIG_TRUE=y +CONFIG_TRUNCATE=y +CONFIG_TSORT=y CONFIG_TTY=y CONFIG_UNAME=y -CONFIG_UNEXPAND=y -CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS=y +CONFIG_UNAME_OSNAME="GNU/Linux" +CONFIG_BB_ARCH=y CONFIG_UNIQ=y +CONFIG_UNLINK=y CONFIG_USLEEP=y CONFIG_UUDECODE=y +CONFIG_BASE32=y +CONFIG_BASE64=y CONFIG_UUENCODE=y CONFIG_WC=y CONFIG_FEATURE_WC_LARGE=y # CONFIG_WHO is not set +# CONFIG_W is not set +# CONFIG_USERS is not set CONFIG_WHOAMI=y CONFIG_YES=y -# -# Common options for cp and mv -# -CONFIG_FEATURE_PRESERVE_HARDLINKS=y - -# -# Common options for df, du, ls -# -CONFIG_FEATURE_HUMAN_READABLE=y - -# -# Common options for md5sum, sha1sum, sha256sum, sha512sum -# -CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y - # # Console Utilities # # CONFIG_CHVT is not set -# CONFIG_FGCONSOLE is not set CONFIG_CLEAR=y # CONFIG_DEALLOCVT is not set # CONFIG_DUMPKMAP is not set +# CONFIG_FGCONSOLE is not set # CONFIG_KBD_MODE is not set # CONFIG_LOADFONT is not set +# CONFIG_SETFONT is not set +# CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set +CONFIG_DEFAULT_SETFONT_DIR="" +# CONFIG_FEATURE_LOADFONT_PSF2 is not set +# CONFIG_FEATURE_LOADFONT_RAW is not set # CONFIG_LOADKMAP is not set # CONFIG_OPENVT is not set CONFIG_RESET=y @@ -313,36 +387,48 @@ CONFIG_RESIZE=y CONFIG_FEATURE_RESIZE_PRINT=y # CONFIG_SETCONSOLE is not set # CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set -# CONFIG_SETFONT is not set -# CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set -CONFIG_DEFAULT_SETFONT_DIR="" # CONFIG_SETKEYCODES is not set # CONFIG_SETLOGCONS is not set # CONFIG_SHOWKEY is not set -# CONFIG_FEATURE_LOADFONT_PSF2 is not set -# CONFIG_FEATURE_LOADFONT_RAW is not set # # Debian Utilities # -CONFIG_MKTEMP=y CONFIG_PIPE_PROGRESS=y CONFIG_RUN_PARTS=y CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS=y CONFIG_FEATURE_RUN_PARTS_FANCY=y CONFIG_START_STOP_DAEMON=y -CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y +CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y CONFIG_WHICH=y +# +# klibc-utils +# +# CONFIG_MINIPS is not set +# CONFIG_NUKE is not set +CONFIG_RESUME=y +CONFIG_RUN_INIT=y + # # Editors # +CONFIG_AWK=y +CONFIG_FEATURE_AWK_LIBM=y +CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y +CONFIG_CMP=y +CONFIG_DIFF=y +CONFIG_FEATURE_DIFF_LONG_OPTIONS=y +CONFIG_FEATURE_DIFF_DIR=y +CONFIG_ED=y CONFIG_PATCH=y +CONFIG_SED=y CONFIG_VI=y CONFIG_FEATURE_VI_MAX_LEN=4096 # CONFIG_FEATURE_VI_8BIT is not set CONFIG_FEATURE_VI_COLON=y +CONFIG_FEATURE_VI_COLON_EXPAND=y CONFIG_FEATURE_VI_YANKMARK=y CONFIG_FEATURE_VI_SEARCH=y # CONFIG_FEATURE_VI_REGEX_SEARCH is not set @@ -353,14 +439,10 @@ CONFIG_FEATURE_VI_SETOPTS=y CONFIG_FEATURE_VI_SET=y CONFIG_FEATURE_VI_WIN_RESIZE=y CONFIG_FEATURE_VI_ASK_TERMINAL=y -CONFIG_AWK=y -CONFIG_FEATURE_AWK_LIBM=y -CONFIG_CMP=y -CONFIG_DIFF=y -CONFIG_FEATURE_DIFF_LONG_OPTIONS=y -CONFIG_FEATURE_DIFF_DIR=y -CONFIG_ED=y -CONFIG_SED=y +CONFIG_FEATURE_VI_UNDO=y +CONFIG_FEATURE_VI_UNDO_QUEUE=y +CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=256 +CONFIG_FEATURE_VI_VERBOSE_STATUS=y CONFIG_FEATURE_ALLOW_EXEC=y # @@ -369,14 +451,22 @@ CONFIG_FEATURE_ALLOW_EXEC=y CONFIG_FIND=y CONFIG_FEATURE_FIND_PRINT0=y CONFIG_FEATURE_FIND_MTIME=y +CONFIG_FEATURE_FIND_ATIME=y +CONFIG_FEATURE_FIND_CTIME=y CONFIG_FEATURE_FIND_MMIN=y +CONFIG_FEATURE_FIND_AMIN=y +CONFIG_FEATURE_FIND_CMIN=y CONFIG_FEATURE_FIND_PERM=y CONFIG_FEATURE_FIND_TYPE=y +CONFIG_FEATURE_FIND_EXECUTABLE=y CONFIG_FEATURE_FIND_XDEV=y CONFIG_FEATURE_FIND_MAXDEPTH=y CONFIG_FEATURE_FIND_NEWER=y CONFIG_FEATURE_FIND_INUM=y +CONFIG_FEATURE_FIND_SAMEFILE=y CONFIG_FEATURE_FIND_EXEC=y +CONFIG_FEATURE_FIND_EXEC_PLUS=y +CONFIG_FEATURE_FIND_EXEC_OK=y CONFIG_FEATURE_FIND_USER=y CONFIG_FEATURE_FIND_GROUP=y CONFIG_FEATURE_FIND_NOT=y @@ -384,20 +474,25 @@ CONFIG_FEATURE_FIND_DEPTH=y CONFIG_FEATURE_FIND_PAREN=y CONFIG_FEATURE_FIND_SIZE=y CONFIG_FEATURE_FIND_PRUNE=y +CONFIG_FEATURE_FIND_QUIT=y CONFIG_FEATURE_FIND_DELETE=y +CONFIG_FEATURE_FIND_EMPTY=y CONFIG_FEATURE_FIND_PATH=y CONFIG_FEATURE_FIND_REGEX=y # CONFIG_FEATURE_FIND_CONTEXT is not set CONFIG_FEATURE_FIND_LINKS=y CONFIG_GREP=y -CONFIG_FEATURE_GREP_EGREP_ALIAS=y -CONFIG_FEATURE_GREP_FGREP_ALIAS=y +CONFIG_EGREP=y +CONFIG_FGREP=y CONFIG_FEATURE_GREP_CONTEXT=y CONFIG_XARGS=y CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y +CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR=y +CONFIG_FEATURE_XARGS_SUPPORT_PARALLEL=y +CONFIG_FEATURE_XARGS_SUPPORT_ARGS_FILE=y # # Init Utilities @@ -406,9 +501,13 @@ CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y # CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set # CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE is not set # CONFIG_HALT is not set +CONFIG_POWEROFF=y +CONFIG_REBOOT=y +CONFIG_FEATURE_WAIT_FOR_INIT=y # CONFIG_FEATURE_CALL_TELINIT is not set CONFIG_TELINIT_PATH="" # CONFIG_INIT is not set +# CONFIG_LINUXRC is not set # CONFIG_FEATURE_USE_INITTAB is not set # CONFIG_FEATURE_KILL_REMOVED is not set CONFIG_FEATURE_KILL_DELAY=0 @@ -416,45 +515,45 @@ CONFIG_FEATURE_KILL_DELAY=0 # CONFIG_FEATURE_INIT_SYSLOG is not set # CONFIG_FEATURE_INIT_QUIET is not set # CONFIG_FEATURE_INIT_COREDUMPS is not set -# CONFIG_LINUXRC is not set CONFIG_INIT_TERMINAL_TYPE="" -CONFIG_MESG=y -CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y +# CONFIG_FEATURE_INIT_MODIFY_CMDLINE is not set # # Login/Password Management Utilities # -CONFIG_ADD_SHELL=y -CONFIG_REMOVE_SHELL=y CONFIG_FEATURE_SHADOWPASSWDS=y CONFIG_USE_BB_PWD_GRP=y CONFIG_USE_BB_SHADOW=y CONFIG_USE_BB_CRYPT=y CONFIG_USE_BB_CRYPT_SHA=y +CONFIG_ADD_SHELL=y +CONFIG_REMOVE_SHELL=y +CONFIG_ADDGROUP=y +CONFIG_FEATURE_ADDUSER_TO_GROUP=y CONFIG_ADDUSER=y -CONFIG_FEATURE_ADDUSER_LONG_OPTIONS=y # CONFIG_FEATURE_CHECK_NAMES is not set +CONFIG_LAST_ID=60000 CONFIG_FIRST_SYSTEM_ID=100 CONFIG_LAST_SYSTEM_ID=999 -CONFIG_ADDGROUP=y -CONFIG_FEATURE_ADDGROUP_LONG_OPTIONS=y -CONFIG_FEATURE_ADDUSER_TO_GROUP=y +CONFIG_CHPASSWD=y +CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="des" +CONFIG_CRYPTPW=y +CONFIG_MKPASSWD=y CONFIG_DELUSER=y CONFIG_DELGROUP=y CONFIG_FEATURE_DEL_USER_FROM_GROUP=y # CONFIG_GETTY is not set CONFIG_LOGIN=y -# CONFIG_PAM is not set +# CONFIG_LOGIN_SESSION_AS_CHILD is not set CONFIG_LOGIN_SCRIPTS=y CONFIG_FEATURE_NOLOGIN=y CONFIG_FEATURE_SECURETTY=y CONFIG_PASSWD=y CONFIG_FEATURE_PASSWD_WEAK_CHECK=y -CONFIG_CRYPTPW=y -CONFIG_CHPASSWD=y CONFIG_SU=y CONFIG_FEATURE_SU_SYSLOG=y CONFIG_FEATURE_SU_CHECKS_SHELLS=y +# CONFIG_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set CONFIG_SULOGIN=y CONFIG_VLOCK=y @@ -469,29 +568,29 @@ CONFIG_CHATTR=y # # Linux Module Utilities # -# CONFIG_MODINFO is not set # CONFIG_MODPROBE_SMALL is not set -# CONFIG_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE is not set -# CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set +# CONFIG_DEPMOD is not set # CONFIG_INSMOD is not set -# CONFIG_RMMOD is not set # CONFIG_LSMOD is not set # CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set +# CONFIG_MODINFO is not set # CONFIG_MODPROBE is not set # CONFIG_FEATURE_MODPROBE_BLACKLIST is not set -# CONFIG_DEPMOD is not set +# CONFIG_RMMOD is not set # # Options common to multiple modutils # +# CONFIG_FEATURE_CMDLINE_MODULE_OPTIONS is not set +# CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set # CONFIG_FEATURE_2_4_MODULES is not set -# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set # CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set # CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set # CONFIG_FEATURE_INSMOD_LOADINKMEM is not set # CONFIG_FEATURE_INSMOD_LOAD_MAP is not set # CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set # CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set +# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set # CONFIG_FEATURE_MODUTILS_ALIAS is not set # CONFIG_FEATURE_MODUTILS_SYMBOLS is not set CONFIG_DEFAULT_MODULES_DIR="" @@ -500,18 +599,23 @@ CONFIG_DEFAULT_DEPMOD_FILE="" # # Linux System Utilities # -# CONFIG_BLOCKDEV is not set -CONFIG_REV=y # CONFIG_ACPID is not set # CONFIG_FEATURE_ACPID_COMPAT is not set +CONFIG_BLKDISCARD=y # CONFIG_BLKID is not set # CONFIG_FEATURE_BLKID_TYPE is not set +# CONFIG_BLOCKDEV is not set +CONFIG_CAL=y +CONFIG_CHRT=y # CONFIG_DMESG is not set # CONFIG_FEATURE_DMESG_PRETTY is not set +# CONFIG_EJECT is not set +# CONFIG_FEATURE_EJECT_SCSI is not set +CONFIG_FALLOCATE=y +CONFIG_FATATTR=y # CONFIG_FBSET is not set # CONFIG_FEATURE_FBSET_FANCY is not set # CONFIG_FEATURE_FBSET_READMODE is not set -# CONFIG_FDFLUSH is not set # CONFIG_FDFORMAT is not set # CONFIG_FDISK is not set # CONFIG_FDISK_SUPPORT_LARGE_DISKS is not set @@ -524,23 +628,23 @@ CONFIG_REV=y # CONFIG_FEATURE_FDISK_ADVANCED is not set # CONFIG_FINDFS is not set CONFIG_FLOCK=y +# CONFIG_FDFLUSH is not set # CONFIG_FREERAMDISK is not set CONFIG_FSCK_MINIX=y -# CONFIG_MKFS_EXT2 is not set -# CONFIG_MKFS_MINIX is not set -CONFIG_FEATURE_MINIX2=y -# CONFIG_MKFS_REISER is not set -# CONFIG_MKFS_VFAT is not set +CONFIG_FSFREEZE=y +CONFIG_FSTRIM=y CONFIG_GETOPT=y CONFIG_FEATURE_GETOPT_LONG=y CONFIG_HEXDUMP=y -CONFIG_FEATURE_HEXDUMP_REVERSE=y CONFIG_HD=y +CONFIG_XXD=y # CONFIG_HWCLOCK is not set -# CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS is not set # CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS is not set +# CONFIG_IONICE is not set CONFIG_IPCRM=y # CONFIG_IPCS is not set +# CONFIG_LAST is not set +# CONFIG_FEATURE_LAST_FANCY is not set # CONFIG_LOSETUP is not set # CONFIG_LSPCI is not set # CONFIG_LSUSB is not set @@ -550,6 +654,16 @@ CONFIG_IPCRM=y # CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set # CONFIG_FEATURE_MDEV_EXEC is not set # CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set +# CONFIG_FEATURE_MDEV_DAEMON is not set +CONFIG_MESG=y +CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y +CONFIG_MKE2FS=y +# CONFIG_MKFS_EXT2 is not set +# CONFIG_MKFS_MINIX is not set +CONFIG_FEATURE_MINIX2=y +# CONFIG_MKFS_REISER is not set +CONFIG_MKDOSFS=y +# CONFIG_MKFS_VFAT is not set CONFIG_MKSWAP=y CONFIG_FEATURE_MKSWAP_UUID=y CONFIG_MORE=y @@ -562,57 +676,90 @@ CONFIG_MORE=y # CONFIG_FEATURE_MOUNT_CIFS is not set # CONFIG_FEATURE_MOUNT_FLAGS is not set # CONFIG_FEATURE_MOUNT_FSTAB is not set +# CONFIG_FEATURE_MOUNT_OTHERTAB is not set +# CONFIG_MOUNTPOINT is not set +CONFIG_NOLOGIN=y +# CONFIG_NOLOGIN_DEPENDENCIES is not set +CONFIG_NSENTER=y # CONFIG_PIVOT_ROOT is not set # CONFIG_RDATE is not set CONFIG_RDEV=y CONFIG_READPROFILE=y +CONFIG_RENICE=y +CONFIG_REV=y # CONFIG_RTCWAKE is not set CONFIG_SCRIPT=y CONFIG_SCRIPTREPLAY=y # CONFIG_SETARCH is not set -# CONFIG_SWAPONOFF is not set +CONFIG_LINUX32=y +CONFIG_LINUX64=y +CONFIG_SETPRIV=y +CONFIG_FEATURE_SETPRIV_DUMP=y +CONFIG_FEATURE_SETPRIV_CAPABILITIES=y +CONFIG_FEATURE_SETPRIV_CAPABILITY_NAMES=y +CONFIG_SETSID=y +CONFIG_SWAPON=y +CONFIG_FEATURE_SWAPON_DISCARD=y # CONFIG_FEATURE_SWAPON_PRI is not set +CONFIG_SWAPOFF=y +CONFIG_FEATURE_SWAPONOFF_LABEL=y # CONFIG_SWITCH_ROOT is not set +# CONFIG_TASKSET is not set +# CONFIG_FEATURE_TASKSET_FANCY is not set +# CONFIG_FEATURE_TASKSET_CPULIST is not set +CONFIG_UEVENT=y # CONFIG_UMOUNT is not set # CONFIG_FEATURE_UMOUNT_ALL is not set +CONFIG_UNSHARE=y +# CONFIG_WALL is not set # CONFIG_FEATURE_MOUNT_LOOP is not set # CONFIG_FEATURE_MOUNT_LOOP_CREATE is not set # CONFIG_FEATURE_MTAB_SUPPORT is not set -# CONFIG_VOLUMEID is not set -# CONFIG_FEATURE_VOLUMEID_EXT is not set +CONFIG_VOLUMEID=y + +# +# Filesystem/Volume identification +# +CONFIG_FEATURE_VOLUMEID_BCACHE=y # CONFIG_FEATURE_VOLUMEID_BTRFS is not set -# CONFIG_FEATURE_VOLUMEID_REISERFS is not set +# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set +CONFIG_FEATURE_VOLUMEID_EROFS=y +CONFIG_FEATURE_VOLUMEID_EXFAT=y +# CONFIG_FEATURE_VOLUMEID_EXT is not set +CONFIG_FEATURE_VOLUMEID_F2FS=y # CONFIG_FEATURE_VOLUMEID_FAT is not set # CONFIG_FEATURE_VOLUMEID_HFS is not set -# CONFIG_FEATURE_VOLUMEID_JFS is not set -# CONFIG_FEATURE_VOLUMEID_XFS is not set -# CONFIG_FEATURE_VOLUMEID_NTFS is not set # CONFIG_FEATURE_VOLUMEID_ISO9660 is not set -# CONFIG_FEATURE_VOLUMEID_UDF is not set -# CONFIG_FEATURE_VOLUMEID_LUKS is not set +# CONFIG_FEATURE_VOLUMEID_JFS is not set +# CONFIG_FEATURE_VOLUMEID_LFS is not set +# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set # CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set -# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set +# CONFIG_FEATURE_VOLUMEID_LUKS is not set +CONFIG_FEATURE_VOLUMEID_MINIX=y +CONFIG_FEATURE_VOLUMEID_NILFS=y +# CONFIG_FEATURE_VOLUMEID_NTFS is not set +# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set +# CONFIG_FEATURE_VOLUMEID_REISERFS is not set # CONFIG_FEATURE_VOLUMEID_ROMFS is not set +# CONFIG_FEATURE_VOLUMEID_SQUASHFS is not set # CONFIG_FEATURE_VOLUMEID_SYSV is not set -# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set -# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set +CONFIG_FEATURE_VOLUMEID_UBIFS=y +# CONFIG_FEATURE_VOLUMEID_UDF is not set +# CONFIG_FEATURE_VOLUMEID_XFS is not set # # Miscellaneous Utilities # -# CONFIG_CONSPY is not set -# CONFIG_NANDWRITE is not set -# CONFIG_NANDDUMP is not set -# CONFIG_SETSERIAL is not set -# CONFIG_UBIATTACH is not set -# CONFIG_UBIDETACH is not set -# CONFIG_UBIMKVOL is not set -# CONFIG_UBIRMVOL is not set -# CONFIG_UBIRSVOL is not set -# CONFIG_UBIUPDATEVOL is not set # CONFIG_ADJTIMEX is not set +CONFIG_ASCII=y # CONFIG_BBCONFIG is not set # CONFIG_FEATURE_COMPRESS_BBCONFIG is not set +CONFIG_BC=y +CONFIG_DC=y +CONFIG_FEATURE_DC_BIG=y +# CONFIG_FEATURE_DC_LIBM is not set +CONFIG_FEATURE_BC_INTERACTIVE=y +CONFIG_FEATURE_BC_LONG_OPTIONS=y # CONFIG_BEEP is not set CONFIG_FEATURE_BEEP_FREQ=0 CONFIG_FEATURE_BEEP_LENGTH_MS=0 @@ -624,89 +771,98 @@ CONFIG_FEATURE_CHAT_SWALLOW_OPTS=y CONFIG_FEATURE_CHAT_SEND_ESCAPES=y CONFIG_FEATURE_CHAT_VAR_ABORT_LEN=y CONFIG_FEATURE_CHAT_CLR_ABORT=y -CONFIG_CHRT=y +# CONFIG_CONSPY is not set CONFIG_CROND=y CONFIG_FEATURE_CROND_D=y CONFIG_FEATURE_CROND_CALL_SENDMAIL=y +CONFIG_FEATURE_CROND_SPECIAL_TIMES=y CONFIG_FEATURE_CROND_DIR="/var/spool/cron" CONFIG_CRONTAB=y -CONFIG_DC=y -CONFIG_FEATURE_DC_LIBM=y # CONFIG_DEVFSD is not set # CONFIG_DEVFSD_MODLOAD is not set # CONFIG_DEVFSD_FG_NP is not set # CONFIG_DEVFSD_VERBOSE is not set # CONFIG_FEATURE_DEVFS is not set CONFIG_DEVMEM=y -# CONFIG_EJECT is not set -# CONFIG_FEATURE_EJECT_SCSI is not set # CONFIG_FBSPLASH is not set -# CONFIG_FLASHCP is not set +# CONFIG_FLASH_ERASEALL is not set # CONFIG_FLASH_LOCK is not set # CONFIG_FLASH_UNLOCK is not set -# CONFIG_FLASH_ERASEALL is not set -# CONFIG_IONICE is not set +# CONFIG_FLASHCP is not set +CONFIG_GETFATTR=y +# CONFIG_HDPARM is not set +# CONFIG_FEATURE_HDPARM_GET_IDENTITY is not set +# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set +# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set +CONFIG_HEXEDIT=y +CONFIG_I2CGET=y +CONFIG_I2CSET=y +CONFIG_I2CDUMP=y +CONFIG_I2CDETECT=y +CONFIG_I2CTRANSFER=y # CONFIG_INOTIFYD is not set -# CONFIG_LAST is not set -# CONFIG_FEATURE_LAST_SMALL is not set -# CONFIG_FEATURE_LAST_FANCY is not set CONFIG_LESS=y CONFIG_FEATURE_LESS_MAXLINES=9999999 CONFIG_FEATURE_LESS_BRACKETS=y CONFIG_FEATURE_LESS_FLAGS=y +CONFIG_FEATURE_LESS_TRUNCATE=y CONFIG_FEATURE_LESS_MARKS=y CONFIG_FEATURE_LESS_REGEXP=y CONFIG_FEATURE_LESS_WINCH=y +CONFIG_FEATURE_LESS_ASK_TERMINAL=y CONFIG_FEATURE_LESS_DASHCMD=y CONFIG_FEATURE_LESS_LINENUMS=y -# CONFIG_HDPARM is not set -# CONFIG_FEATURE_HDPARM_GET_IDENTITY is not set -# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set -# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set -# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set -# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set -# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set +CONFIG_FEATURE_LESS_RAW=y +CONFIG_FEATURE_LESS_ENV=y +CONFIG_LSSCSI=y # CONFIG_MAKEDEVS is not set # CONFIG_FEATURE_MAKEDEVS_LEAF is not set # CONFIG_FEATURE_MAKEDEVS_TABLE is not set CONFIG_MAN=y # CONFIG_MICROCOM is not set -# CONFIG_MOUNTPOINT is not set +CONFIG_MIM=y CONFIG_MT=y +# CONFIG_NANDWRITE is not set +# CONFIG_NANDDUMP is not set +CONFIG_PARTPROBE=y # CONFIG_RAIDAUTORUN is not set # CONFIG_READAHEAD is not set # CONFIG_RFKILL is not set # CONFIG_RUNLEVEL is not set # CONFIG_RX is not set -CONFIG_SETSID=y +CONFIG_SEEDRNG=y +CONFIG_SETFATTR=y +# CONFIG_SETSERIAL is not set CONFIG_STRINGS=y -# CONFIG_TASKSET is not set -# CONFIG_FEATURE_TASKSET_FANCY is not set CONFIG_TIME=y -CONFIG_TIMEOUT=y +CONFIG_TREE=y +CONFIG_TS=y CONFIG_TTYSIZE=y +# CONFIG_UBIATTACH is not set +# CONFIG_UBIDETACH is not set +# CONFIG_UBIMKVOL is not set +# CONFIG_UBIRMVOL is not set +# CONFIG_UBIRSVOL is not set +# CONFIG_UBIUPDATEVOL is not set +CONFIG_UBIRENAME=y CONFIG_VOLNAME=y -# CONFIG_WALL is not set # CONFIG_WATCHDOG is not set +# CONFIG_FEATURE_WATCHDOG_OPEN_TWICE is not set # # Networking Utilities # -# CONFIG_NAMEIF is not set -# CONFIG_FEATURE_NAMEIF_EXTENDED is not set -# CONFIG_NBDCLIENT is not set -CONFIG_NC=y -CONFIG_NC_SERVER=y -CONFIG_NC_EXTRA=y -# CONFIG_NC_110_COMPAT is not set -# CONFIG_PING is not set -# CONFIG_PING6 is not set -# CONFIG_FEATURE_FANCY_PING is not set -CONFIG_WHOIS=y CONFIG_FEATURE_IPV6=y # CONFIG_FEATURE_UNIX_LOCAL is not set CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y # CONFIG_VERBOSE_RESOLUTION_ERRORS is not set +# CONFIG_FEATURE_ETC_NETWORKS is not set +# CONFIG_FEATURE_ETC_SERVICES is not set +CONFIG_FEATURE_HWIB=y +# CONFIG_FEATURE_TLS_SHA1 is not set # CONFIG_ARP is not set # CONFIG_ARPING is not set # CONFIG_BRCTL is not set @@ -714,17 +870,18 @@ CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y # CONFIG_FEATURE_BRCTL_SHOW is not set CONFIG_DNSD=y # CONFIG_ETHER_WAKE is not set -CONFIG_FAKEIDENTD=y CONFIG_FTPD=y -CONFIG_FEATURE_FTP_WRITE=y +CONFIG_FEATURE_FTPD_WRITE=y CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST=y +CONFIG_FEATURE_FTPD_AUTHENTICATION=y CONFIG_FTPGET=y CONFIG_FTPPUT=y CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS=y CONFIG_HOSTNAME=y +CONFIG_DNSDOMAINNAME=y CONFIG_HTTPD=y +CONFIG_FEATURE_HTTPD_PORT_DEFAULT=80 CONFIG_FEATURE_HTTPD_RANGES=y -# CONFIG_FEATURE_HTTPD_USE_SENDFILE is not set CONFIG_FEATURE_HTTPD_SETUID=y CONFIG_FEATURE_HTTPD_BASIC_AUTH=y CONFIG_FEATURE_HTTPD_AUTH_MD5=y @@ -735,6 +892,10 @@ CONFIG_FEATURE_HTTPD_ENCODE_URL_STR=y CONFIG_FEATURE_HTTPD_ERROR_PAGES=y CONFIG_FEATURE_HTTPD_PROXY=y CONFIG_FEATURE_HTTPD_GZIP=y +CONFIG_FEATURE_HTTPD_ETAG=y +CONFIG_FEATURE_HTTPD_LAST_MODIFIED=y +CONFIG_FEATURE_HTTPD_DATE=y +CONFIG_FEATURE_HTTPD_ACL_IP=y # CONFIG_IFCONFIG is not set # CONFIG_FEATURE_IFCONFIG_STATUS is not set # CONFIG_FEATURE_IFCONFIG_SLIP is not set @@ -743,11 +904,10 @@ CONFIG_FEATURE_HTTPD_GZIP=y # CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set # CONFIG_IFENSLAVE is not set # CONFIG_IFPLUGD is not set -# CONFIG_IFUPDOWN is not set +CONFIG_IFUP=y +CONFIG_IFDOWN=y CONFIG_IFUPDOWN_IFSTATE_PATH="" # CONFIG_FEATURE_IFUPDOWN_IP is not set -# CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN is not set -# CONFIG_FEATURE_IFUPDOWN_IFCONFIG_BUILTIN is not set # CONFIG_FEATURE_IFUPDOWN_IPV4 is not set # CONFIG_FEATURE_IFUPDOWN_IPV6 is not set # CONFIG_FEATURE_IFUPDOWN_MAPPING is not set @@ -760,77 +920,115 @@ CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME=y CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN=y # CONFIG_FEATURE_INETD_RPC is not set # CONFIG_IP is not set +# CONFIG_IPADDR is not set +# CONFIG_IPLINK is not set +# CONFIG_IPROUTE is not set +# CONFIG_IPTUNNEL is not set +# CONFIG_IPRULE is not set +CONFIG_IPNEIGH=y # CONFIG_FEATURE_IP_ADDRESS is not set # CONFIG_FEATURE_IP_LINK is not set # CONFIG_FEATURE_IP_ROUTE is not set +CONFIG_FEATURE_IP_ROUTE_DIR="" # CONFIG_FEATURE_IP_TUNNEL is not set # CONFIG_FEATURE_IP_RULE is not set -# CONFIG_FEATURE_IP_SHORT_FORMS is not set +CONFIG_FEATURE_IP_NEIGH=y # CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set -# CONFIG_IPADDR is not set -# CONFIG_IPLINK is not set -# CONFIG_IPROUTE is not set -# CONFIG_IPTUNNEL is not set -# CONFIG_IPRULE is not set CONFIG_IPCALC=y -CONFIG_FEATURE_IPCALC_FANCY=y CONFIG_FEATURE_IPCALC_LONG_OPTIONS=y +CONFIG_FEATURE_IPCALC_FANCY=y +CONFIG_FAKEIDENTD=y +# CONFIG_NAMEIF is not set +# CONFIG_FEATURE_NAMEIF_EXTENDED is not set +# CONFIG_NBDCLIENT is not set +CONFIG_NC=y +# CONFIG_NETCAT is not set +CONFIG_NC_SERVER=y +CONFIG_NC_EXTRA=y +# CONFIG_NC_110_COMPAT is not set # CONFIG_NETSTAT is not set # CONFIG_FEATURE_NETSTAT_WIDE is not set # CONFIG_FEATURE_NETSTAT_PRG is not set # CONFIG_NSLOOKUP is not set +# CONFIG_FEATURE_NSLOOKUP_BIG is not set +# CONFIG_FEATURE_NSLOOKUP_LONG_OPTIONS is not set # CONFIG_NTPD is not set # CONFIG_FEATURE_NTPD_SERVER is not set +# CONFIG_FEATURE_NTPD_CONF is not set +# CONFIG_FEATURE_NTP_AUTH is not set +# CONFIG_PING is not set +# CONFIG_PING6 is not set +# CONFIG_FEATURE_FANCY_PING is not set CONFIG_PSCAN=y # CONFIG_ROUTE is not set # CONFIG_SLATTACH is not set +CONFIG_SSL_CLIENT=y +CONFIG_TC=y +CONFIG_FEATURE_TC_INGRESS=y CONFIG_TCPSVD=y +CONFIG_UDPSVD=y CONFIG_TELNET=y CONFIG_FEATURE_TELNET_TTYPE=y CONFIG_FEATURE_TELNET_AUTOLOGIN=y +CONFIG_FEATURE_TELNET_WIDTH=y CONFIG_TELNETD=y CONFIG_FEATURE_TELNETD_STANDALONE=y +CONFIG_FEATURE_TELNETD_PORT_DEFAULT=23 CONFIG_FEATURE_TELNETD_INETD_WAIT=y CONFIG_TFTP=y +CONFIG_FEATURE_TFTP_PROGRESS_BAR=y +CONFIG_FEATURE_TFTP_HPA_COMPAT=y CONFIG_TFTPD=y - -# -# Common options for tftp/tftpd -# CONFIG_FEATURE_TFTP_GET=y CONFIG_FEATURE_TFTP_PUT=y CONFIG_FEATURE_TFTP_BLOCKSIZE=y -CONFIG_FEATURE_TFTP_PROGRESS_BAR=y # CONFIG_TFTP_DEBUG is not set +CONFIG_TLS=y # CONFIG_TRACEROUTE is not set # CONFIG_TRACEROUTE6 is not set # CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set # CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set # CONFIG_TUNCTL is not set # CONFIG_FEATURE_TUNCTL_UG is not set +# CONFIG_VCONFIG is not set +CONFIG_WGET=y +CONFIG_FEATURE_WGET_LONG_OPTIONS=y +CONFIG_FEATURE_WGET_STATUSBAR=y +CONFIG_FEATURE_WGET_FTP=y +CONFIG_FEATURE_WGET_AUTHENTICATION=y +CONFIG_FEATURE_WGET_TIMEOUT=y +CONFIG_FEATURE_WGET_HTTPS=y +CONFIG_FEATURE_WGET_OPENSSL=y +CONFIG_WHOIS=y +# CONFIG_ZCIP is not set # CONFIG_UDHCPD is not set -# CONFIG_DHCPRELAY is not set -# CONFIG_DUMPLEASES is not set -# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set +# CONFIG_FEATURE_UDHCPD_BOOTP is not set # CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set +# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set CONFIG_DHCPD_LEASES_FILE="" +# CONFIG_DUMPLEASES is not set +# CONFIG_DHCPRELAY is not set # CONFIG_UDHCPC is not set # CONFIG_FEATURE_UDHCPC_ARPING is not set +# CONFIG_FEATURE_UDHCPC_SANITIZEOPT is not set +CONFIG_UDHCPC_DEFAULT_SCRIPT="" +CONFIG_UDHCPC6_DEFAULT_SCRIPT="/usr/share/udhcpc/default6.script" +CONFIG_UDHCPC6=y +CONFIG_FEATURE_UDHCPC6_RFC3646=y +CONFIG_FEATURE_UDHCPC6_RFC4704=y +CONFIG_FEATURE_UDHCPC6_RFC4833=y +CONFIG_FEATURE_UDHCPC6_RFC5970=y + +# +# Common options for DHCP applets +# +CONFIG_UDHCPC_DEFAULT_INTERFACE="eth0" # CONFIG_FEATURE_UDHCP_PORT is not set CONFIG_UDHCP_DEBUG=0 +CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=0 # CONFIG_FEATURE_UDHCP_RFC3397 is not set # CONFIG_FEATURE_UDHCP_8021Q is not set -CONFIG_UDHCPC_DEFAULT_SCRIPT="" -CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=0 CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="" -CONFIG_UDPSVD=y -# CONFIG_VCONFIG is not set -CONFIG_WGET=y -CONFIG_FEATURE_WGET_STATUSBAR=y -CONFIG_FEATURE_WGET_AUTHENTICATION=y -CONFIG_FEATURE_WGET_LONG_OPTIONS=y -CONFIG_FEATURE_WGET_TIMEOUT=y -# CONFIG_ZCIP is not set # # Print Utilities @@ -842,8 +1040,8 @@ CONFIG_LPQ=y # # Mail Utilities # -CONFIG_MAKEMIME=y CONFIG_FEATURE_MIME_CHARSET="us-ascii" +CONFIG_MAKEMIME=y CONFIG_POPMAILDIR=y CONFIG_FEATURE_POPMAILDIR_DELIVERY=y CONFIG_REFORMIME=y @@ -853,94 +1051,112 @@ CONFIG_SENDMAIL=y # # Process Utilities # -CONFIG_IOSTAT=y -CONFIG_MPSTAT=y -CONFIG_NMETER=y -# CONFIG_PMAP is not set -# CONFIG_POWERTOP is not set -CONFIG_PSTREE=y -CONFIG_PWDX=y -CONFIG_SMEMCAP=y +CONFIG_FEATURE_FAST_TOP=y +# CONFIG_FEATURE_SHOW_THREADS is not set # CONFIG_FREE is not set CONFIG_FUSER=y +CONFIG_IOSTAT=y CONFIG_KILL=y CONFIG_KILLALL=y CONFIG_KILLALL5=y +CONFIG_LSOF=y +CONFIG_MPSTAT=y +CONFIG_NMETER=y CONFIG_PGREP=y +CONFIG_PKILL=y CONFIG_PIDOF=y CONFIG_FEATURE_PIDOF_SINGLE=y CONFIG_FEATURE_PIDOF_OMIT=y -CONFIG_PKILL=y +# CONFIG_PMAP is not set +# CONFIG_POWERTOP is not set +# CONFIG_FEATURE_POWERTOP_INTERACTIVE is not set CONFIG_PS=y -CONFIG_FEATURE_PS_WIDE=y +# CONFIG_FEATURE_PS_WIDE is not set +# CONFIG_FEATURE_PS_LONG is not set # CONFIG_FEATURE_PS_TIME is not set -CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS=y # CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set -CONFIG_RENICE=y +CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS=y +CONFIG_PSTREE=y +CONFIG_PWDX=y +CONFIG_SMEMCAP=y CONFIG_BB_SYSCTL=y CONFIG_TOP=y +CONFIG_FEATURE_TOP_INTERACTIVE=y CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y CONFIG_FEATURE_TOP_SMP_CPU=y CONFIG_FEATURE_TOP_DECIMALS=y CONFIG_FEATURE_TOP_SMP_PROCESS=y CONFIG_FEATURE_TOPMEM=y -# CONFIG_FEATURE_SHOW_THREADS is not set # CONFIG_UPTIME is not set +# CONFIG_FEATURE_UPTIME_UTMP_SUPPORT is not set CONFIG_WATCH=y # # Runit Utilities # +CONFIG_CHPST=y +CONFIG_SETUIDGID=y +CONFIG_ENVUIDGID=y +CONFIG_ENVDIR=y +CONFIG_SOFTLIMIT=y CONFIG_RUNSV=y CONFIG_RUNSVDIR=y # CONFIG_FEATURE_RUNSVDIR_LOG is not set CONFIG_SV=y CONFIG_SV_DEFAULT_SERVICE_DIR="/var/service" +CONFIG_SVC=y +CONFIG_SVOK=y CONFIG_SVLOGD=y -CONFIG_CHPST=y -CONFIG_SETUIDGID=y -CONFIG_ENVUIDGID=y -CONFIG_ENVDIR=y -CONFIG_SOFTLIMIT=y # CONFIG_CHCON is not set -# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set # CONFIG_GETENFORCE is not set # CONFIG_GETSEBOOL is not set # CONFIG_LOAD_POLICY is not set # CONFIG_MATCHPATHCON is not set -# CONFIG_RESTORECON is not set # CONFIG_RUNCON is not set -# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set # CONFIG_SELINUXENABLED is not set +# CONFIG_SESTATUS is not set # CONFIG_SETENFORCE is not set # CONFIG_SETFILES is not set # CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set +# CONFIG_RESTORECON is not set # CONFIG_SETSEBOOL is not set -# CONFIG_SESTATUS is not set # # Shells # +CONFIG_SH_IS_ASH=y +# CONFIG_SH_IS_HUSH is not set +# CONFIG_SH_IS_NONE is not set +# CONFIG_BASH_IS_ASH is not set +# CONFIG_BASH_IS_HUSH is not set +CONFIG_BASH_IS_NONE=y +CONFIG_SHELL_ASH=y CONFIG_ASH=y +CONFIG_ASH_OPTIMIZE_FOR_SIZE=y +CONFIG_ASH_INTERNAL_GLOB=y CONFIG_ASH_BASH_COMPAT=y -# CONFIG_ASH_IDLE_TIMEOUT is not set +# CONFIG_ASH_BASH_SOURCE_CURDIR is not set +CONFIG_ASH_BASH_NOT_FOUND_HOOK=y CONFIG_ASH_JOB_CONTROL=y CONFIG_ASH_ALIAS=y -CONFIG_ASH_GETOPTS=y +CONFIG_ASH_RANDOM_SUPPORT=y +CONFIG_ASH_EXPAND_PRMT=y +# CONFIG_ASH_IDLE_TIMEOUT is not set +# CONFIG_ASH_MAIL is not set CONFIG_ASH_ECHO=y CONFIG_ASH_PRINTF=y CONFIG_ASH_TEST=y +CONFIG_ASH_HELP=y +CONFIG_ASH_GETOPTS=y CONFIG_ASH_CMDCMD=y -# CONFIG_ASH_MAIL is not set -CONFIG_ASH_OPTIMIZE_FOR_SIZE=y -CONFIG_ASH_RANDOM_SUPPORT=y -CONFIG_ASH_EXPAND_PRMT=y # CONFIG_CTTYHACK is not set CONFIG_HUSH=y +CONFIG_SHELL_HUSH=y CONFIG_HUSH_BASH_COMPAT=y CONFIG_HUSH_BRACE_EXPANSION=y -CONFIG_HUSH_HELP=y +# CONFIG_HUSH_BASH_SOURCE_CURDIR is not set +CONFIG_HUSH_LINENO_VAR=y CONFIG_HUSH_INTERACTIVE=y CONFIG_HUSH_SAVEHISTORY=y CONFIG_HUSH_JOB=y @@ -951,34 +1167,56 @@ CONFIG_HUSH_CASE=y CONFIG_HUSH_FUNCTIONS=y CONFIG_HUSH_LOCAL=y CONFIG_HUSH_RANDOM_SUPPORT=y -CONFIG_HUSH_EXPORT_N=y CONFIG_HUSH_MODE_X=y -CONFIG_FEATURE_SH_IS_ASH=y -# CONFIG_FEATURE_SH_IS_HUSH is not set -# CONFIG_FEATURE_SH_IS_NONE is not set -# CONFIG_FEATURE_BASH_IS_ASH is not set -# CONFIG_FEATURE_BASH_IS_HUSH is not set -CONFIG_FEATURE_BASH_IS_NONE=y -CONFIG_SH_MATH_SUPPORT=y -CONFIG_SH_MATH_SUPPORT_64=y +CONFIG_HUSH_ECHO=y +CONFIG_HUSH_PRINTF=y +CONFIG_HUSH_TEST=y +CONFIG_HUSH_HELP=y +CONFIG_HUSH_EXPORT=y +CONFIG_HUSH_EXPORT_N=y +CONFIG_HUSH_READONLY=y +CONFIG_HUSH_KILL=y +CONFIG_HUSH_WAIT=y +CONFIG_HUSH_COMMAND=y +CONFIG_HUSH_TRAP=y +CONFIG_HUSH_TYPE=y +CONFIG_HUSH_TIMES=y +CONFIG_HUSH_READ=y +CONFIG_HUSH_SET=y +CONFIG_HUSH_UNSET=y +CONFIG_HUSH_ULIMIT=y +CONFIG_HUSH_UMASK=y +CONFIG_HUSH_GETOPTS=y +# CONFIG_HUSH_MEMLEAK is not set + +# +# Options common to all shells +# +CONFIG_FEATURE_SH_MATH=y +CONFIG_FEATURE_SH_MATH_64=y +CONFIG_FEATURE_SH_MATH_BASE=y CONFIG_FEATURE_SH_EXTRA_QUIET=y # CONFIG_FEATURE_SH_STANDALONE is not set # CONFIG_FEATURE_SH_NOFORK is not set +CONFIG_FEATURE_SH_READ_FRAC=y CONFIG_FEATURE_SH_HISTFILESIZE=y +CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS=y # # System Logging Utilities # +# CONFIG_KLOGD is not set +# CONFIG_FEATURE_KLOGD_KLOGCTL is not set +CONFIG_LOGGER=y +CONFIG_LOGREAD=y +CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y CONFIG_SYSLOGD=y CONFIG_FEATURE_ROTATE_LOGFILE=y CONFIG_FEATURE_REMOTE_LOG=y CONFIG_FEATURE_SYSLOGD_DUP=y CONFIG_FEATURE_SYSLOGD_CFG=y +# CONFIG_FEATURE_SYSLOGD_PRECISE_TIMESTAMPS is not set CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256 CONFIG_FEATURE_IPC_SYSLOG=y CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16 -CONFIG_LOGREAD=y -CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y -# CONFIG_KLOGD is not set -# CONFIG_FEATURE_KLOGD_KLOGCTL is not set -CONFIG_LOGGER=y +CONFIG_FEATURE_KMSG_SYSLOG=y -- cgit v1.2.3-55-g6feb From 28f41260935852eda6bd8ab1f26347c012ae0a53 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 23 Nov 2023 01:18:02 +0100 Subject: top: improve large PID display in memory ('s') mode Display VSZ[RW] fields in more compact form if PID is wider. function old new delta display_topmem_process_list 564 614 +50 ulltoa5_and_space - 14 +14 ulltoa6_and_space 14 - -14 ------------------------------------------------------------------------------ (add/remove: 1/1 grow/shrink: 1/0 up/down: 64/-14) Total: 50 bytes Signed-off-by: Denys Vlasenko --- procps/top.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/procps/top.c b/procps/top.c index 6d25d9633..09d31c673 100644 --- a/procps/top.c +++ b/procps/top.c @@ -713,7 +713,10 @@ typedef struct { unsigned quot, rem; } bb_div_t; ppu = ppubuf; if (n != 6+6+8) { /* Format PID PPID USER part into 6+6+8 chars: - * shrink PID/PPID if possible, then truncate USER + * shrink PID/PPID if possible, then truncate USER. + * Tested on Linux 5.18.0: + * sysctl kernel.pid_max=4194304 is the maximum allowed, + * so PID and PPID are 7 chars wide at most. */ char *p, *pp; if (*ppu == ' ') { @@ -857,11 +860,15 @@ static void display_topmem_header(int scr_width, int *lines_rem_p) (*lines_rem_p) -= 3; } -static void ulltoa6_and_space(unsigned long long ul, char buf[6]) +/* see http://en.wikipedia.org/wiki/Tera */ +static void ulltoa5_and_space(unsigned long long ul, char buf[6]) { - /* see http://en.wikipedia.org/wiki/Tera */ smart_ulltoa5(ul, buf, " mgtpezy")[0] = ' '; } +static void ulltoa4_and_space(unsigned long long ul, char buf[5]) +{ + smart_ulltoa4(ul, buf, " mgtpezy")[0] = ' '; +} static NOINLINE void display_topmem_process_list(int lines_rem, int scr_width) { @@ -887,16 +894,24 @@ static NOINLINE void display_topmem_process_list(int lines_rem, int scr_width) while (--lines_rem >= 0) { /* PID VSZ VSZRW RSS (SHR) DIRTY (SHR) COMMAND */ int n = sprintf(line_buf, "%5u ", s->pid); - ulltoa6_and_space(s->vsz , &line_buf[1*6]); - if (n > 7 || (n == 7 && line_buf[6] != ' ')) - /* PID and VSZ are clumped together, truncate PID */ - line_buf[5] = '.'; - ulltoa6_and_space(s->vszrw , &line_buf[2*6]); - ulltoa6_and_space(s->rss , &line_buf[3*6]); - ulltoa6_and_space(s->rss_sh , &line_buf[4*6]); - ulltoa6_and_space(s->dirty , &line_buf[5*6]); - ulltoa6_and_space(s->dirty_sh, &line_buf[6*6]); - ulltoa6_and_space(s->stack , &line_buf[7*6]); + if (n > 7) { + /* PID is 7 chars long (up to 4194304) */ + ulltoa4_and_space(s->vsz , &line_buf[8]); + ulltoa4_and_space(s->vszrw, &line_buf[8+5]); + /* the next field (RSS) starts at 8+10 = 3*6 */ + } else { + if (n == 7) /* PID is 6 chars long */ + ulltoa4_and_space(s->vsz, &line_buf[7]); + /* the next field (VSZRW) starts at 7+5 = 2*6 */ + else /* PID is 5 chars or less */ + ulltoa5_and_space(s->vsz, &line_buf[6]); + ulltoa5_and_space(s->vszrw, &line_buf[2*6]); + } + ulltoa5_and_space(s->rss , &line_buf[3*6]); + ulltoa5_and_space(s->rss_sh , &line_buf[4*6]); + ulltoa5_and_space(s->dirty , &line_buf[5*6]); + ulltoa5_and_space(s->dirty_sh, &line_buf[6*6]); + ulltoa5_and_space(s->stack , &line_buf[7*6]); line_buf[8*6] = '\0'; if (scr_width > (int)MIN_WIDTH) { read_cmdline(&line_buf[8*6], scr_width - MIN_WIDTH, s->pid, s->comm); -- cgit v1.2.3-55-g6feb