summaryrefslogtreecommitdiff
path: root/redir.c
diff options
context:
space:
mode:
authorJari Aalto <jari.aalto@cante.net>2001-04-06 19:14:31 +0000
committerJari Aalto <jari.aalto@cante.net>2009-09-12 16:46:53 +0000
commit28ef6c316f1aff914bb95ac09787a3c83c1815fd (patch)
tree2812fe7ffc9beec4f99856906ddfcafda54cf16a /redir.c
parentbb70624e964126b7ac4ff085ba163a9c35ffa18f (diff)
downloadbash-28ef6c316f1aff914bb95ac09787a3c83c1815fd.tar.gz
Imported from ../bash-2.05.tar.gz.
Diffstat (limited to 'redir.c')
-rw-r--r--redir.c62
1 files changed, 33 insertions, 29 deletions
diff --git a/redir.c b/redir.c
index e3dd3d54..faa76974 100644
--- a/redir.c
+++ b/redir.c
@@ -91,7 +91,7 @@ redirection_error (temp, error)
}
filename = redirection_expand (temp->redirectee.filename);
if (posixly_correct && interactive_shell == 0)
- temp->redirectee.filename->flags = oflags;
+ temp->redirectee.filename->flags = oflags;
if (filename == 0)
filename = savestring (temp->redirectee.filename->word);
if (filename == 0)
@@ -252,7 +252,7 @@ write_here_document (fd, redirectee)
return (errno);
}
else
- return 0;
+ return 0;
}
tlist = expand_string (redirectee->word, Q_HERE_DOCUMENT);
@@ -302,23 +302,18 @@ static int
here_document_to_fd (redirectee)
WORD_DESC *redirectee;
{
- char filename[24];
+ char *filename;
int r, fd, fd2;
static int fnum = 0;
- do
- {
- /* Make the filename for the temp file. */
- sprintf (filename, "/tmp/t%d-%d-sh", (int)getpid (), fnum++);
-
- /* Make sure we open it exclusively. */
- fd = open (filename, O_TRUNC | O_WRONLY | O_CREAT | O_EXCL, 0600);
- }
- while (fd < 0 && errno == EEXIST);
+ fd = sh_mktmpfd ("sh-thd", MT_USERANDOM, &filename);
/* If we failed for some reason other than the file existing, abort */
if (fd < 0)
- return (fd);
+ {
+ FREE (filename);
+ return (fd);
+ }
errno = r = 0; /* XXX */
/* write_here_document returns 0 on success, errno on failure. */
@@ -329,6 +324,7 @@ here_document_to_fd (redirectee)
{
close (fd);
unlink (filename);
+ free (filename);
errno = r;
return (-1);
}
@@ -342,6 +338,7 @@ here_document_to_fd (redirectee)
{
r = errno;
unlink (filename);
+ free (filename);
close (fd);
errno = r;
return -1;
@@ -351,11 +348,21 @@ here_document_to_fd (redirectee)
if (unlink (filename) < 0)
{
r = errno;
+#if defined (__CYGWIN__)
+ /* Under CygWin 1.1.0, the unlink will fail if the file is
+ open. This hack will allow the previous action of silently
+ ignoring the error, but will still leave the file there. This
+ needs some kind of magic. */
+ if (r == EACCES)
+ return (fd2);
+#endif /* __CYGWIN__ */
close (fd2);
+ free (filename);
errno = r;
return (-1);
}
+ free (filename);
return (fd2);
}
@@ -503,7 +510,7 @@ redir_open (filename, flags, mode, ri)
/* If we are in noclobber mode, you are not allowed to overwrite
existing files. Check before opening. */
- if (noclobber && OUTPUT_REDIRECT (ri))
+ if (noclobber && CLOBBERING_REDIRECT (ri))
{
fd = noclobber_open (filename, flags, mode, ri);
if (fd == NOCLOBBER_REDIRECT)
@@ -571,13 +578,8 @@ do_redirection_internal (redirect, for_real, remembering, set_clexec)
}
else if (ri == r_duplicating_output_word && redirector == 1)
{
- if (posixly_correct == 0)
- {
- rd.filename = make_bare_word (redirectee_word);
- new_redirect = make_redirection (1, r_err_and_out, rd);
- }
- else
- new_redirect = copy_redirect (redirect);
+ rd.filename = make_bare_word (redirectee_word);
+ new_redirect = make_redirection (1, r_err_and_out, rd);
}
else
{
@@ -627,10 +629,10 @@ do_redirection_internal (redirect, for_real, remembering, set_clexec)
case r_input_output:
case r_output_force:
if (posixly_correct && interactive_shell == 0)
- {
- oflags = redirectee->flags;
- redirectee->flags |= W_NOGLOB;
- }
+ {
+ oflags = redirectee->flags;
+ redirectee->flags |= W_NOGLOB;
+ }
redirectee_word = redirection_expand (redirectee);
if (posixly_correct && interactive_shell == 0)
redirectee->flags = oflags;
@@ -650,7 +652,7 @@ do_redirection_internal (redirect, for_real, remembering, set_clexec)
free (redirectee_word);
if (fd == NOCLOBBER_REDIRECT)
- return (fd);
+ return (fd);
if (fd < 0)
return (errno);
@@ -781,7 +783,6 @@ do_redirection_internal (redirect, for_real, remembering, set_clexec)
#if defined (BUFFERED_INPUT)
check_bash_input (redirector);
#endif
-
/* This is correct. 2>&1 means dup2 (1, 2); */
if (dup2 (redir_fd, redirector) < 0)
return (errno);
@@ -844,7 +845,7 @@ add_undo_redirect (fd)
if (new_fd < 0)
{
- sys_error ("redirection error");
+ sys_error ("redirection error: cannot duplicate fd");
return (-1);
}
@@ -855,7 +856,10 @@ add_undo_redirect (fd)
dummy_redirect = copy_redirects (closer);
rd.dest = (long)new_fd;
- new_redirect = make_redirection (fd, r_duplicating_output, rd);
+ if (fd == 0)
+ new_redirect = make_redirection (fd, r_duplicating_input, rd);
+ else
+ new_redirect = make_redirection (fd, r_duplicating_output, rd);
new_redirect->next = closer;
closer->next = redirection_undo_list;