From: Pádraig Brady
Date: Mon, 4 Jan 2016 12:13:40 +0000 (+0000) Subject: stty: support -I, --immediate to not wait for pending transmission X-Git-Tag: v8.25~39 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5171befcb122b12677f60715603be091625a9e08;p=thirdparty%2Fcoreutils.git stty: support -I, --immediate to not wait for pending transmission In some cases an initial drain may block indefinitely as discussed at: http://lists.gnu.org/archive/html/coreutils/2016-01/msg00007.html * src/stty.c (main): Use TCSANOW rather than TCSADRAIN if -I specified. (usage): Document the new option. * doc/coreutils.texi (stty invocation): Likewise. * tests/misc/stty.sh: Ensure -I is supported. * NEWS: Mention the new feature. --- diff --git a/NEWS b/NEWS index 72d69b8b5f..756042b3e6 100644 --- a/NEWS +++ b/NEWS @@ -47,6 +47,9 @@ GNU coreutils NEWS -*- outline -*- is reusable by most shells, with non-printable characters escaped with the POSIX proposed $'...' syntax. + stty now supports the -I, --immediate option, to apply settings + without waiting for transmission of any pending output. + ** Changes in behavior base64 no longer supports hex or oct --wrap parameters, diff --git a/doc/coreutils.texi b/doc/coreutils.texi index 62955a508c..85477a05a4 100644 --- a/doc/coreutils.texi +++ b/doc/coreutils.texi @@ -13808,6 +13808,18 @@ Print all current settings in a form that can be used as an argument to another @command{stty} command to restore the current settings. This option may not be used in combination with any line settings. +@item -I +@itemx --immediate +@opindex -I +@opindex --immediate +@cindex nonblocking @command{stty} setting +Apply settings without first waiting for pending output to be transmitted. +In some cases the system may be in a state where serial transmission +is not possible. +For example, if the system has received the @samp{DC3} character +with @code{ixon} (software flow control) enabled, then @command{stty} would +block without this option. + @end table Many settings can be turned off by preceding them with a @samp{-}. diff --git a/src/stty.c b/src/stty.c index 37fbb25be2..93f36de352 100644 --- a/src/stty.c +++ b/src/stty.c @@ -469,6 +469,7 @@ static struct option const longopts[] = {"all", no_argument, NULL, 'a'}, {"save", no_argument, NULL, 'g'}, {"file", required_argument, NULL, 'F'}, + {"immediate", no_argument, NULL, 'I'}, {GETOPT_HELP_OPTION_DECL}, {GETOPT_VERSION_OPTION_DECL}, {NULL, 0, NULL, 0} @@ -522,7 +523,7 @@ usage (int status) else { printf (_("\ -Usage: %s [-F DEVICE | --file=DEVICE] [SETTING]...\n\ +Usage: %s [-F DEVICE | --file=DEVICE] [-I] [SETTING]...\n\ or: %s [-F DEVICE | --file=DEVICE] [-a|--all]\n\ or: %s [-F DEVICE | --file=DEVICE] [-g|--save]\n\ "), @@ -537,6 +538,9 @@ Print or change terminal characteristics.\n\ -a, --all print all current settings in human-readable form\n\ -g, --save print all current settings in a stty-readable form\n\ -F, --file=DEVICE open and use the specified DEVICE instead of stdin\n\ +"), stdout); + fputs (_("\ + -I, --immediate apply setting without waiting for pending transmission\n\ "), stdout); fputs (HELP_OPTION_DESCRIPTION, stdout); fputs (VERSION_OPTION_DESCRIPTION, stdout); @@ -1080,6 +1084,7 @@ main (int argc, char **argv) bool noargs = true; char *file_name = NULL; const char *device_name; + int tcsetattr_options = TCSADRAIN; initialize_main (&argc, &argv); set_program_name (argv[0]); @@ -1103,7 +1108,7 @@ main (int argc, char **argv) stty parses options, be sure it still works with combinations of short and long options, --, POSIXLY_CORRECT, etc. */ - while ((optc = getopt_long (argc - argi, argv + argi, "-agF:", + while ((optc = getopt_long (argc - argi, argv + argi, "-agF:I", longopts, NULL)) != -1) { @@ -1125,6 +1130,10 @@ main (int argc, char **argv) file_name = optarg; break; + case 'I': + tcsetattr_options = TCSANOW; + break; + case_GETOPT_HELP_CHAR; case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS); @@ -1361,7 +1370,7 @@ main (int argc, char **argv) spurious difference in an uninitialized portion of the structure. */ static struct termios new_mode; - if (tcsetattr (STDIN_FILENO, TCSADRAIN, &mode)) + if (tcsetattr (STDIN_FILENO, tcsetattr_options, &mode)) error (EXIT_FAILURE, errno, "%s", quotef (device_name)); /* POSIX (according to Zlotnick's book) tcsetattr returns zero if diff --git a/tests/misc/stty.sh b/tests/misc/stty.sh index 666ac0b26a..88d5796cf4 100755 --- a/tests/misc/stty.sh +++ b/tests/misc/stty.sh @@ -35,6 +35,9 @@ stty $(cat $saved_state) || fail=1 # This would segfault prior to sh-utils-2.0j. stty erase - || fail=1 +# Ensure --immediate mode is supported +stty -I erase - || fail=1 + # These would improperly ignore invalid options through coreutils 5.2.1. returns_ 1 stty -F 2>/dev/null || fail=1 returns_ 1 stty -raw -F no/such/file 2>/dev/null || fail=1