Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > gnu.bash.bug > #16225
| 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 | <mailman.921.1587516022.3066.bug-bash@gnu.org> (permalink) |
| 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 <bug-bash.gnu.org> |
| List-Unsubscribe | <https://lists.gnu.org/mailman/options/bug-bash>, <mailto:bug-bash-request@gnu.org?subject=unsubscribe> |
| List-Archive | <https://lists.gnu.org/archive/html/bug-bash> |
| List-Post | <mailto:bug-bash@gnu.org> |
| List-Help | <mailto:bug-bash-request@gnu.org?subject=help> |
| List-Subscribe | <https://lists.gnu.org/mailman/listinfo/bug-bash>, <mailto:bug-bash-request@gnu.org?subject=subscribe> |
| X-Mailman-Original-Message-ID | <87d080wdxw.fsf@hobgoblin.ariadne.com> |
| Xref | csiph.com gnu.bash.bug:16225 |
Show key headers only | View raw
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 <device-nrs.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
@@ -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;
+}
Back to gnu.bash.bug | Previous | Next | Find similar
Proposed new feature for bash: unbuffered pipes, part 4: glibc.diff worley@alum.mit.edu (Dale R. Worley) - 2020-04-21 20:40 -0400
csiph-web