summaryrefslogtreecommitdiff
path: root/builtins
diff options
context:
space:
mode:
Diffstat (limited to 'builtins')
-rw-r--r--builtins/mapfile.def21
-rw-r--r--builtins/read.def6
2 files changed, 18 insertions, 9 deletions
diff --git a/builtins/mapfile.def b/builtins/mapfile.def
index 65c3cb4f..62db816c 100644
--- a/builtins/mapfile.def
+++ b/builtins/mapfile.def
@@ -2,7 +2,7 @@ This file is mapfile.def, from which is created mapfile.c.
It implements the builtin "mapfile" in Bash.
Copyright (C) 2005-2006 Rocky Bernstein for Free Software Foundation, Inc.
-Copyright (C) 2008-2020 Free Software Foundation, Inc.
+Copyright (C) 2008-2021 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
@@ -68,6 +68,7 @@ $END
#include <config.h>
#include "builtins.h"
+#include "../bashtypes.h"
#include "posixstat.h"
#if defined (HAVE_UNISTD_H)
@@ -156,6 +157,7 @@ mapfile (fd, line_count_goal, origin, nskip, callback_quantum, callback, array_n
size_t line_length;
unsigned int array_index, line_count;
SHELL_VAR *entry;
+ struct stat sb;
int unbuffered_read;
line = NULL;
@@ -180,19 +182,22 @@ mapfile (fd, line_count_goal, origin, nskip, callback_quantum, callback, array_n
}
else if (invisible_p (entry))
VUNSETATTR (entry, att_invisible); /* no longer invisible */
-
+
if (flags & MAPF_CLEARARRAY)
array_flush (array_cell (entry));
#ifndef __CYGWIN__
- unbuffered_read = (lseek (fd, 0L, SEEK_CUR) < 0) && (errno == ESPIPE);
+ /* If the delimiter is a newline, turn on unbuffered reads for pipes
+ (terminals are ok). If the delimiter is not a newline, unbuffered reads
+ for every file descriptor that's not a regular file. */
+ if (delim == '\n')
+ unbuffered_read = (lseek (fd, 0L, SEEK_CUR) < 0) && (errno == ESPIPE);
+ else
+ unbuffered_read = (fstat (fd, &sb) != 0) || (S_ISREG (sb.st_mode) == 0);
#else
unbuffered_read = 1;
#endif
- if (delim != '\n')
- unbuffered_read = 1;
-
zreset ();
/* Skip any lines at beginning of file? */
@@ -215,11 +220,11 @@ mapfile (fd, line_count_goal, origin, nskip, callback_quantum, callback, array_n
/* Has a callback been registered and if so is it time to call it? */
if (callback && line_count && (line_count % callback_quantum) == 0)
{
- run_callback (callback, array_index, line);
-
/* Reset the buffer for bash own stream. */
if (unbuffered_read == 0)
zsyncfd (fd);
+
+ run_callback (callback, array_index, line);
}
/* XXX - bad things can happen if the callback modifies ENTRY, e.g.,
diff --git a/builtins/read.def b/builtins/read.def
index c8e2edaf..f670b7fd 100644
--- a/builtins/read.def
+++ b/builtins/read.def
@@ -593,11 +593,15 @@ read_builtin (list)
add_unwind_protect (xfree, input_string);
check_read_timeout ();
+ /* These only matter if edit == 0 */
if ((nchars > 0) && (input_is_tty == 0) && ignore_delim) /* read -N */
unbuffered_read = 2;
+#if 0
else if ((nchars > 0) || (delim != '\n') || input_is_pipe)
+#else
+ else if (((nchars > 0 || delim != '\n') && input_is_tty) || input_is_pipe)
unbuffered_read = 1;
-
+#endif
if (prompt && edit == 0)
{
fprintf (stderr, "%s", prompt);