1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-07-26 10:39:01 +02:00

timeout: add -f and -p short options as per POSIX 2024

* src/timeout.c: Support -f and -p short options, corresponding to
--foreground and --preserve-status respectively.  This adds
compatability with POSIX 2024 and OpenBSD.
(usage): Separate translations, and reorder the option descriptions.
* doc/coreutils.texi (timeout invocation): Adjust accordingly,
and also reorder the option descriptions alphabetically.
* tests/timeout/timeout.sh: Also test short option variants.
This commit is contained in:
Pádraig Brady
2024-10-30 12:45:58 +00:00
parent 0c9d372c96
commit f4fbc1a9f9
3 changed files with 43 additions and 33 deletions
+11 -7
View File
@@ -18810,13 +18810,9 @@ The program accepts the following options. Also see @ref{Common options}.
Options must precede operands.
@table @samp
@item --preserve-status
@opindex --preserve-status
Return the exit status of the managed @var{command} on timeout, rather than
a specific exit status indicating a timeout. This is useful if the
managed @var{command} supports running for an indeterminate amount of time.
@item --foreground
@item -f
@itemx --foreground
@opindex -f
@opindex --foreground
Don't create a separate background program group, so that
the managed @var{command} can use the foreground TTY normally.
@@ -18856,6 +18852,14 @@ either because the signal was blocked or ignored, or if the @var{command} takes
too long (e.g. for cleanup work) to terminate itself within a certain amount
of time.
@item -p
@itemx --preserve-status
@opindex -p
@opindex --preserve-status
Return the exit status of the managed @var{command} on timeout, rather than
a specific exit status indicating a timeout. This is useful if the
managed @var{command} supports running for an indeterminate amount of time.
@item -s @var{signal}
@itemx --signal=@var{signal}
@opindex -s
+26 -24
View File
@@ -85,20 +85,13 @@ static bool preserve_status; /* whether to use a timeout status or not. */
static bool verbose; /* whether to diagnose timeouts or not. */
static char const *command;
/* for long options with no corresponding short option, use enum */
enum
{
FOREGROUND_OPTION = CHAR_MAX + 1,
PRESERVE_STATUS_OPTION
};
static struct option const long_options[] =
{
{"foreground", no_argument, nullptr, 'f'},
{"kill-after", required_argument, nullptr, 'k'},
{"preserve-status", no_argument, nullptr, 'p'},
{"signal", required_argument, nullptr, 's'},
{"verbose", no_argument, nullptr, 'v'},
{"foreground", no_argument, nullptr, FOREGROUND_OPTION},
{"preserve-status", no_argument, nullptr, PRESERVE_STATUS_OPTION},
{GETOPT_HELP_OPTION_DECL},
{GETOPT_VERSION_OPTION_DECL},
{nullptr, 0, nullptr, 0}
@@ -271,22 +264,30 @@ Start COMMAND, and kill it if still running after DURATION.\n\
emit_mandatory_arg_note ();
fputs (_("\
--preserve-status\n\
exit with the same status as COMMAND, even when the\n\
command times out\n\
--foreground\n\
-f, --foreground\n\
when not running timeout directly from a shell prompt,\n\
allow COMMAND to read from the TTY and get TTY signals;\n\
in this mode, children of COMMAND will not be timed out\n\
"), stdout);
fputs (_("\
-k, --kill-after=DURATION\n\
also send a KILL signal if COMMAND is still running\n\
this long after the initial signal was sent\n\
"), stdout);
fputs (_("\
-p. --preserve-status\n\
exit with the same status as COMMAND,\n\
even when the command times out\n\
"), stdout);
fputs (_("\
-s, --signal=SIGNAL\n\
specify the signal to be sent on timeout;\n\
SIGNAL may be a name like 'HUP' or a number;\n\
see 'kill -l' for a list of signals\n"), stdout);
see 'kill -l' for a list of signals\n\
"), stdout);
fputs (_("\
-v, --verbose diagnose to stderr any signal sent upon timeout\n"), stdout);
-v, --verbose diagnose to stderr any signal sent upon timeout\n\
"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
fputs (VERSION_OPTION_DESCRIPTION, stdout);
@@ -478,14 +479,23 @@ main (int argc, char **argv)
initialize_exit_failure (EXIT_CANCELED);
atexit (close_stdout);
while ((c = getopt_long (argc, argv, "+k:s:v", long_options, nullptr)) != -1)
while ((c = getopt_long (argc, argv, "+fk:ps:v", long_options, nullptr))
!= -1)
{
switch (c)
{
case 'f':
foreground = true;
break;
case 'k':
kill_after = parse_duration (optarg);
break;
case 'p':
preserve_status = true;
break;
case 's':
term_signal = operand2sig (optarg);
if (term_signal == -1)
@@ -496,14 +506,6 @@ main (int argc, char **argv)
verbose = true;
break;
case FOREGROUND_OPTION:
foreground = true;
break;
case PRESERVE_STATUS_OPTION:
preserve_status = true;
break;
case_GETOPT_HELP_CHAR;
case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
+6 -2
View File
@@ -37,7 +37,9 @@ returns_ 124 timeout .1 sleep 10 || fail=1
# exit status propagation even on timeout
# exit status should be 128+TERM
returns_ 124 timeout --preserve-status .1 sleep 10 && fail=1
for opt in '-p' '--preserve-status'; do
returns_ 124 timeout $opt .1 sleep 10 && fail=1
done
# kill delay. Note once the initial timeout triggers,
# the exit status will be 124 even if the command
@@ -45,7 +47,9 @@ returns_ 124 timeout --preserve-status .1 sleep 10 && fail=1
# exit status should be 128+KILL
returns_ 124 timeout -s0 -k1 .1 sleep 10 && fail=1
# Ensure a consistent exit status with --foreground
returns_ 124 timeout --foreground -s0 -k1 .1 sleep 10 && fail=1
for opt in '-f' '--foreground'; do
returns_ 124 timeout $opt -s0 -k1 .1 sleep 10 && fail=1
done
# Ensure 'timeout' is immune to parent's SIGCHLD handler
# Use a subshell and an exec to work around a bug in FreeBSD 5.0 /bin/sh.