From bc70095df2ea1bc4338ea7331d44b916e0c82258 Mon Sep 17 00:00:00 2001 From: Pádraig Brady Date: Sat, 22 Jun 2013 03:37:51 +0100 Subject: stdbuf: make it mandatory to specify a buffering option This is consistent with the documented interface and avoids any ambiguity in a user thinking that stdbuf without options might reset to a "standard" buffering setup. * src/stdbuf.c (set_libstdbuf_options): Indicate with the return value whether any env variables were actually set. (main): Fail unless some env variables were set. * tests/misc/stdbuf.sh: Ensure this constraint is enforced. * NEWS: Mention the small change in behavior. --- NEWS | 5 +++++ src/stdbuf.c | 20 ++++++++++++++------ tests/misc/stdbuf.sh | 2 ++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index aff6a4250..b728ec007 100644 --- a/NEWS +++ b/NEWS @@ -41,6 +41,11 @@ GNU coreutils NEWS -*- outline -*- csplit accepts a new option: --suppressed-matched, to elide the lines used to identify the split points. +** Changes in behavior + + stdbuf now requires at least one buffering mode option to be specified, + as per the documented interface. + ** Improvements stat and tail work better with EFIVARFS, EXOFS, F2FS, SNFS and UBIFS. diff --git a/src/stdbuf.c b/src/stdbuf.c index 38e9bee7c..2500c3001 100644 --- a/src/stdbuf.c +++ b/src/stdbuf.c @@ -248,12 +248,14 @@ set_LD_PRELOAD (void) } } -/* Populate environ with _STDBUF_I=$MODE _STDBUF_O=$MODE _STDBUF_E=$MODE */ +/* Populate environ with _STDBUF_I=$MODE _STDBUF_O=$MODE _STDBUF_E=$MODE. + Return TRUE if any environment variables set. */ -static void +static bool set_libstdbuf_options (void) { - unsigned int i; + bool env_set = false; + size_t i; for (i = 0; i < ARRAY_CARDINALITY (stdbuf); i++) { @@ -278,8 +280,12 @@ set_libstdbuf_options (void) _("failed to update the environment with %s"), quote (var)); } + + env_set = true; } } + + return env_set; } int @@ -346,9 +352,11 @@ main (int argc, char **argv) usage (EXIT_CANCELED); } - /* FIXME: Should we mandate at least one option? */ - - set_libstdbuf_options (); + if (! set_libstdbuf_options ()) + { + error (0, 0, _("you must specify a buffering mode option")); + usage (EXIT_CANCELED); + } /* Try to preload libstdbuf first from the same path as stdbuf is running from. */ diff --git a/tests/misc/stdbuf.sh b/tests/misc/stdbuf.sh index 12347ecc7..650e8e737 100755 --- a/tests/misc/stdbuf.sh +++ b/tests/misc/stdbuf.sh @@ -50,6 +50,8 @@ stdbuf -o$SIZE_OFLOW true # size too large test $? = 125 || fail=1 stdbuf -iL true # line buffering stdin disallowed test $? = 125 || fail=1 +stdbuf true # a buffering mode must be specified +test $? = 125 || fail=1 stdbuf -i0 -o0 -e0 true || fail=1 #check all files stdbuf -o1 . # invalid command test $? = 126 || fail=1 -- cgit v1.2.3-54-g00ecf