summaryrefslogtreecommitdiff
path: root/ddd
diff options
context:
space:
mode:
Diffstat (limited to 'ddd')
-rw-r--r--ddd286
1 files changed, 286 insertions, 0 deletions
diff --git a/ddd b/ddd
new file mode 100644
index 00000000..74d0b69d
--- /dev/null
+++ b/ddd
@@ -0,0 +1,286 @@
+*** ../bash-20090903/redir.c 2009-08-17 17:46:34.000000000 -0400
+--- redir.c 2009-09-11 17:29:54.000000000 -0400
+***************
+*** 99,111 ****
+ int oflags;
+
+ allocname = 0;
+! if (temp->redirector < 0)
+ /* This can happen when read_token_word encounters overflow, like in
+ exec 4294967297>x */
+ filename = _("file descriptor out of range");
+ #ifdef EBADF
+ /* This error can never involve NOCLOBBER */
+! else if (error != NOCLOBBER_REDIRECT && temp->redirector >= 0 && error == EBADF)
+ {
+ /* If we're dealing with two file descriptors, we have to guess about
+ which one is invalid; in the cases of r_{duplicating,move}_input and
+--- 99,113 ----
+ int oflags;
+
+ allocname = 0;
+! if (temp->rflags & REDIR_VARASSIGN)
+! filename = savestring (temp->redirector.filename->word);
+! else if (temp->redirector.dest < 0)
+ /* This can happen when read_token_word encounters overflow, like in
+ exec 4294967297>x */
+ filename = _("file descriptor out of range");
+ #ifdef EBADF
+ /* This error can never involve NOCLOBBER */
+! else if (error != NOCLOBBER_REDIRECT && temp->redirector.dest >= 0 && error == EBADF)
+ {
+ /* If we're dealing with two file descriptors, we have to guess about
+ which one is invalid; in the cases of r_{duplicating,move}_input and
+***************
+*** 119,125 ****
+ filename = allocname = itos (temp->redirectee.dest);
+ break;
+ default:
+! filename = allocname = itos (temp->redirector);
+ break;
+ }
+ }
+--- 121,127 ----
+ filename = allocname = itos (temp->redirectee.dest);
+ break;
+ default:
+! filename = allocname = itos (temp->redirector.dest);
+ break;
+ }
+ }
+***************
+*** 162,167 ****
+--- 164,173 ----
+ internal_error (_("cannot create temp file for here-document: %s"), strerror (heredoc_errno));
+ break;
+
++ case BADVAR_REDIRECT:
++ internal_error (_("cannot assign fd to variable %s"), filename);
++ break;
++
+ default:
+ internal_error ("%s: %s", filename, strerror (error));
+ break;
+***************
+*** 649,658 ****
+ char *redirectee_word;
+ enum r_instruction ri;
+ REDIRECT *new_redirect;
+
+ redirectee = redirect->redirectee.filename;
+ redir_fd = redirect->redirectee.dest;
+! redirector = redirect->redirector;
+ ri = redirect->instruction;
+
+ if (redirect->flags & RX_INTERNAL)
+--- 655,665 ----
+ char *redirectee_word;
+ enum r_instruction ri;
+ REDIRECT *new_redirect;
++ REDIRECTEE sd;
+
+ redirectee = redirect->redirectee.filename;
+ redir_fd = redirect->redirectee.dest;
+! redirector = redirect->redirector.dest;
+ ri = redirect->instruction;
+
+ if (redirect->flags & RX_INTERNAL)
+***************
+*** 670,680 ****
+ return (AMBIGUOUS_REDIRECT);
+ else if (redirectee_word[0] == '-' && redirectee_word[1] == '\0')
+ {
+ rd.dest = 0;
+! new_redirect = make_redirection (redirector, r_close_this, rd);
+ }
+ else if (all_digits (redirectee_word))
+ {
+ if (legal_number (redirectee_word, &lfd) && (int)lfd == lfd)
+ rd.dest = lfd;
+ else
+--- 677,689 ----
+ return (AMBIGUOUS_REDIRECT);
+ else if (redirectee_word[0] == '-' && redirectee_word[1] == '\0')
+ {
++ sd.dest = redirector;
+ rd.dest = 0;
+! new_redirect = make_redirection (sd, r_close_this, rd, 0);
+ }
+ else if (all_digits (redirectee_word))
+ {
++ sd.dest = redirector;
+ if (legal_number (redirectee_word, &lfd) && (int)lfd == lfd)
+ rd.dest = lfd;
+ else
+***************
+*** 682,704 ****
+ switch (ri)
+ {
+ case r_duplicating_input_word:
+! new_redirect = make_redirection (redirector, r_duplicating_input, rd);
+ break;
+ case r_duplicating_output_word:
+! new_redirect = make_redirection (redirector, r_duplicating_output, rd);
+ break;
+ case r_move_input_word:
+! new_redirect = make_redirection (redirector, r_move_input, rd);
+ break;
+ case r_move_output_word:
+! new_redirect = make_redirection (redirector, r_move_output, rd);
+ break;
+ }
+ }
+ else if (ri == r_duplicating_output_word && redirector == 1)
+ {
+ rd.filename = make_bare_word (redirectee_word);
+! new_redirect = make_redirection (1, r_err_and_out, rd);
+ }
+ else
+ {
+--- 691,714 ----
+ switch (ri)
+ {
+ case r_duplicating_input_word:
+! new_redirect = make_redirection (sd, r_duplicating_input, rd, 0);
+ break;
+ case r_duplicating_output_word:
+! new_redirect = make_redirection (sd, r_duplicating_output, rd, 0);
+ break;
+ case r_move_input_word:
+! new_redirect = make_redirection (sd, r_move_input, rd, 0);
+ break;
+ case r_move_output_word:
+! new_redirect = make_redirection (sd, r_move_output, rd, 0);
+ break;
+ }
+ }
+ else if (ri == r_duplicating_output_word && redirector == 1)
+ {
++ sd.dest = 1;
+ rd.filename = make_bare_word (redirectee_word);
+! new_redirect = make_redirection (sd, r_err_and_out, rd, 0);
+ }
+ else
+ {
+***************
+*** 730,736 ****
+ redirectee = new_redirect->redirectee.filename;
+
+ redir_fd = new_redirect->redirectee.dest;
+! redirector = new_redirect->redirector;
+ ri = new_redirect->instruction;
+
+ /* Overwrite the flags element of the old redirect with the new value. */
+--- 740,746 ----
+ redirectee = new_redirect->redirectee.filename;
+
+ redir_fd = new_redirect->redirectee.dest;
+! redirector = new_redirect->redirector.dest;
+ ri = new_redirect->instruction;
+
+ /* Overwrite the flags element of the old redirect with the new value. */
+***************
+*** 1021,1026 ****
+--- 1031,1037 ----
+ {
+ int new_fd, clexec_flag;
+ REDIRECT *new_redirect, *closer, *dummy_redirect;
++ REDIRECTEE sd;
+
+ new_fd = fcntl (fd, F_DUPFD, (fdbase < SHELL_FD_BASE) ? SHELL_FD_BASE : fdbase+1);
+ if (new_fd < 0)
+***************
+*** 1034,1049 ****
+
+ clexec_flag = fcntl (fd, F_GETFD, 0);
+
+ rd.dest = 0;
+! closer = make_redirection (new_fd, r_close_this, rd);
+ closer->flags |= RX_INTERNAL;
+ dummy_redirect = copy_redirects (closer);
+
+ rd.dest = new_fd;
+ if (fd == 0)
+! new_redirect = make_redirection (fd, r_duplicating_input, rd);
+ else
+! new_redirect = make_redirection (fd, r_duplicating_output, rd);
+ new_redirect->flags |= RX_INTERNAL;
+ if (clexec_flag == 0 && fd >= 3 && new_fd >= SHELL_FD_BASE)
+ new_redirect->flags |= RX_SAVCLEXEC;
+--- 1045,1062 ----
+
+ clexec_flag = fcntl (fd, F_GETFD, 0);
+
++ sd.dest = new_fd;
+ rd.dest = 0;
+! closer = make_redirection (sd, r_close_this, rd, 0);
+ closer->flags |= RX_INTERNAL;
+ dummy_redirect = copy_redirects (closer);
+
++ sd.dest = fd;
+ rd.dest = new_fd;
+ if (fd == 0)
+! new_redirect = make_redirection (sd, r_duplicating_input, rd, 0);
+ else
+! new_redirect = make_redirection (sd, r_duplicating_output, rd, 0);
+ new_redirect->flags |= RX_INTERNAL;
+ if (clexec_flag == 0 && fd >= 3 && new_fd >= SHELL_FD_BASE)
+ new_redirect->flags |= RX_SAVCLEXEC;
+***************
+*** 1066,1073 ****
+ to save others. */
+ if (fd >= SHELL_FD_BASE && ri != r_close_this && clexec_flag)
+ {
+ rd.dest = new_fd;
+! new_redirect = make_redirection (fd, r_duplicating_output, rd);
+ new_redirect->flags |= RX_INTERNAL;
+
+ add_exec_redirect (new_redirect);
+--- 1079,1087 ----
+ to save others. */
+ if (fd >= SHELL_FD_BASE && ri != r_close_this && clexec_flag)
+ {
++ sd.dest = fd;
+ rd.dest = new_fd;
+! new_redirect = make_redirection (sd, r_duplicating_output, rd, 0);
+ new_redirect->flags |= RX_INTERNAL;
+
+ add_exec_redirect (new_redirect);
+***************
+*** 1096,1104 ****
+ int fd;
+ {
+ REDIRECT *closer;
+
+ rd.dest = 0;
+! closer = make_redirection (fd, r_close_this, rd);
+ closer->flags |= RX_INTERNAL;
+ closer->next = redirection_undo_list;
+ redirection_undo_list = closer;
+--- 1110,1120 ----
+ int fd;
+ {
+ REDIRECT *closer;
++ REDIRECTEE sd;
+
++ sd.dest = fd;
+ rd.dest = 0;
+! closer = make_redirection (sd, r_close_this, rd, 0);
+ closer->flags |= RX_INTERNAL;
+ closer->next = redirection_undo_list;
+ redirection_undo_list = closer;
+***************
+*** 1154,1159 ****
+ int n;
+
+ for (n = 0, rp = redirs; rp; rp = rp->next)
+! n += stdin_redirection (rp->instruction, rp->redirector);
+ return n;
+ }
+--- 1170,1175 ----
+ int n;
+
+ for (n = 0, rp = redirs; rp; rp = rp->next)
+! n += stdin_redirection (rp->instruction, rp->redirector.dest);
+ return n;
+ }