From d661cb1977def8215c50ae3eed1f9beb2877b862 Mon Sep 17 00:00:00 2001
From: Denys Vlasenko
Date: Mon, 3 Apr 2023 19:54:42 +0200
Subject: ash: sleep builtin with no arguments should not exit

function                                             old     new   delta
sleep_main                                           116     143     +27
.rodata                                           105245  105268     +23
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 50/0)               Total: 50 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
---
 coreutils/sleep.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

(limited to 'coreutils/sleep.c')

diff --git a/coreutils/sleep.c b/coreutils/sleep.c
index 4428412..667db55 100644
--- a/coreutils/sleep.c
+++ b/coreutils/sleep.c
@@ -65,15 +65,28 @@ int sleep_main(int argc UNUSED_PARAM, char **argv)
 {
 	duration_t duration;
 
+	/* Note: sleep_main may be directly called from ash as a builtin.
+	 * This brings some complications:
+	 * + we can't use xfunc here
+	 * + we can't use bb_show_usage
+	 * + applet_name can be the name of the shell
+	 */
 	++argv;
-	if (!*argv)
+	if (!*argv) {
+		/* Without this, bare "sleep" in ash shows _ash_ --help */
+		if (ENABLE_ASH_SLEEP && applet_name[0] != 's') {
+			bb_simple_error_msg("sleep: missing operand");
+			return EXIT_FAILURE;
+		}
 		bb_show_usage();
+	}
 
 	/* GNU sleep accepts "inf", "INF", "infinity" and "INFINITY" */
 	if (strncasecmp(argv[0], "inf", 3) == 0)
 		for (;;)
 			sleep(INT_MAX);
 
+//FIXME: in ash, "sleep 123qwerty" as a builtin aborts the shell
 #if ENABLE_FEATURE_FANCY_SLEEP
 	duration = 0;
 	do {
-- 
cgit v1.1