Path: csiph.com!xmission!news.snarked.org!news.linkpendium.com!news.linkpendium.com!panix!usenet.stanford.edu!not-for-mail From: worley@alum.mit.edu (Dale R. Worley) Newsgroups: gnu.bash.bug Subject: Proposed new feature for bash: unbuffered pipes, part 4: glibc.diff Date: Tue, 21 Apr 2020 20:40:11 -0400 Lines: 82 Approved: bug-bash@gnu.org Message-ID: References: <87d080wdxw.fsf@hobgoblin.ariadne.com> NNTP-Posting-Host: lists.gnu.org X-Trace: usenet.stanford.edu 1587516022 13207 209.51.188.17 (22 Apr 2020 00:40:22 GMT) X-Complaints-To: action@cs.stanford.edu To: bug-bash@gnu.org Envelope-to: bug-bash@gnu.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=comcastmailservice.net; s=20180828_2048; t=1587516013; bh=8Rjsh4zGD8ofzhtEQM2CtOvGEffbp2DAGYow/2lYbPo=; h=Received:Received:Received:Received:From:To:Subject:Date: Message-ID; b=i7zy724R3Iyabl/mGDOLVg56rD8S7Rf5BBuSYrPZ95mgTu4RmExyiBOtzg0vQ0EKz EqwNoJgA7hCX599DpfimQi82YCVVd36yO+9/prK1k5sIswfNd/G7g1rLcG++Vs4Mtv ygb4G4twgy0nwwUrtg7EJGi/mUBBSDzq0lH5TD3FkLPiJIsVwsNhRSJ3otcSDTljBd qMYSnq2JWojE0jhjqh6MuXNmorIMx+ErX4oIeyph3mKwZjQWbWlfms6A5uvxDtmfir bv6drGVtK/oPMPy4ReLStdaTR6Hxh8Od/IGOgQTzMPexYDWay7URqAiYaaxly8A0W5 AAzf+RYJAZydw== X-Xfinity-VMeta: sc=0.00;st=legit X-Authentication-Warning: hobgoblin.ariadne.com: worley set sender to worley@alum.mit.edu using -f Received-SPF: softfail client-ip=2001:558:fe21:29:69:252:207:82; envelope-from=worley@alum.mit.edu; helo=resdmta-ch2-02v.sys.comcast.net X-detected-operating-system: by eggs.gnu.org: First seen = 2020/04/21 20:40:13 X-ACL-Warn: Detected OS = ??? X-Received-From: 2001:558:fe21:29:69:252:207:82 X-BeenThere: bug-bash@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Bug reports for the GNU Bourne Again SHell List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: <87d080wdxw.fsf@hobgoblin.ariadne.com> Xref: csiph.com gnu.bash.bug:16225 diff --git a/libio/filedoalloc.c b/libio/filedoalloc.c index 412b8d5937..35044e3512 100644 --- a/libio/filedoalloc.c +++ b/libio/filedoalloc.c @@ -58,6 +58,7 @@ #include "libioP.h" #include #include +#include #include #include @@ -71,6 +72,17 @@ local_isatty (int fd) return res; } +struct _IO_stdout_unbuffered +{ + int initialized; + int present; + dev_t dev; + ino_t ino; +} _IO_stdout_unbuffered_values; + +static void +process_stdout_unbuffered (void); + /* Allocate a file buffer, or switch to unbuffered I/O. Streams for TTY devices default to line buffered. */ int @@ -80,9 +92,23 @@ _IO_file_doallocate (FILE *fp) char *p; struct stat64 st; + /* Check to see if buffering of stdout has been suppressed. */ + if (! _IO_stdout_unbuffered_values.initialized) + { + process_stdout_unbuffered(); + } + size = BUFSIZ; if (fp->_fileno >= 0 && __builtin_expect (_IO_SYSSTAT (fp, &st), 0) >= 0) { + // If this fd matched STDOUT_UNBUFFERED ... + if (_IO_stdout_unbuffered_values.present && + _IO_stdout_unbuffered_values.dev == st.st_dev && + _IO_stdout_unbuffered_values.ino == st.st_ino) + { + fp->_flags |= _IO_UNBUFFERED; + return 1; + } if (S_ISCHR (st.st_mode)) { /* Possibly a tty. */ @@ -105,3 +131,26 @@ _IO_file_doallocate (FILE *fp) return 1; } libc_hidden_def (_IO_file_doallocate) + +/* Examine the STDOUT_UNBUFFERED environment variable, if any. + If it has the format NNNN:NNNN, parse those numbers into + _IP_stdout_unbuffered_values. */ +static void +process_stdout_unbuffered (void) +{ + _IO_stdout_unbuffered_values.initialized = 1; + _IO_stdout_unbuffered_values.present = 0; + char *su_value = getenv("STDOUT_UNBUFFERED"); + if (!su_value) + return; + char *p1; + _IO_stdout_unbuffered_values.dev = strtoul(su_value, &p1, 10); + if (*p1 != ':') + return; + char *p2; + _IO_stdout_unbuffered_values.ino = strtoul(p1+1, &p2, 10); + if (*p2) + return; + // Enable the values that we have set. + _IO_stdout_unbuffered_values.present = 1; +}