diff -rup /usr/src.orig/lib/libc/stdio/makebuf.c /usr/src/lib/libc/stdio/makebuf.c --- /usr/src.orig/lib/libc/stdio/makebuf.c 2009-08-03 10:13:06.000000000 +0200 +++ /usr/src/lib/libc/stdio/makebuf.c 2011-02-19 19:09:56.000000000 +0100 @@ -59,6 +59,7 @@ __smakebuf(fp) FILE *fp; { void *p; + char *bmode; int flags; size_t size; int couldbetty; @@ -79,7 +80,8 @@ __smakebuf(fp) flags |= __SMBF; fp->_bf._base = fp->_p = p; fp->_bf._size = size; - if (couldbetty && isatty(fp->_file)) + if (((bmode = getenv("STDIO_IOLBF")) && bmode[0] != '\0') || + (couldbetty && isatty(fp->_file))) flags |= __SLBF; fp->_flags |= flags; } diff -rup /usr/src.orig/lib/libc/stdio/setbuf.3 /usr/src/lib/libc/stdio/setbuf.3 --- /usr/src.orig/lib/libc/stdio/setbuf.3 2009-08-03 10:13:06.000000000 +0200 +++ /usr/src/lib/libc/stdio/setbuf.3 2011-02-19 19:09:13.000000000 +0100 @@ -79,7 +79,9 @@ and an optimally-sized buffer is obtaine If a stream refers to a terminal (as .Dv stdout -normally does) it is line buffered. +normally does), or the environment variable +.Ev STDIO_IOLBF +is set, it is line buffered. The standard error stream .Dv stderr is always unbuffered. @@ -176,6 +178,12 @@ The function returns what the equivalent .Fn setvbuf would have returned. +.Sh ENVIRONMENT +.Bl -tag -width ".Ev STDIO_IOLBF" +If the environment variable +.Ev STDIO_IOLBF +is set, output streams will be line-buffered by default +even when not referring to a terminal. .Sh SEE ALSO .Xr fclose 3 , .Xr fopen 3 , diff -rup /usr/src.orig/lib/libc/stdio/stdio.3 /usr/src/lib/libc/stdio/stdio.3 --- /usr/src.orig/lib/libc/stdio/stdio.3 2009-08-03 10:13:06.000000000 +0200 +++ /usr/src/lib/libc/stdio/stdio.3 2011-02-19 12:56:00.000000000 +0100 @@ -137,7 +137,8 @@ an interactive or .Dq terminal device, as determined by the .Xr isatty 3 -function. +function (this can be overriden with an environment variable, see +.Xr setvbuf 3 ) . In fact, .Em all freshly-opened streams that refer to terminal devices