1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-13 11:21:13 +02:00

25145: make sure XTRACE output is redirected with stderr

This commit is contained in:
Peter Stephenson 2008-06-11 09:27:55 +00:00
parent 4814830da2
commit c17b4c8d77
3 changed files with 19 additions and 15 deletions

View file

@ -1,5 +1,8 @@
2008-06-11 Peter Stephenson <pws@csr.com> 2008-06-11 Peter Stephenson <pws@csr.com>
* 25145: Src/exec.c, Test/E02xtrace.ztst: make sure XTRACE output
follows stderr redirections.
* 25143: Mikael: Doc/Zsh/mod_zprof.yo: missing descendants. * 25143: Mikael: Doc/Zsh/mod_zprof.yo: missing descendants.
2008-06-10 Peter Stephenson <p.w.stephenson@ntlworld.com> 2008-06-10 Peter Stephenson <p.w.stephenson@ntlworld.com>

View file

@ -2165,7 +2165,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
LinkList redir; LinkList redir;
wordcode code; wordcode code;
Wordcode beg = state->pc, varspc; Wordcode beg = state->pc, varspc;
FILE *oxtrerr = xtrerr; FILE *oxtrerr = xtrerr, *newxtrerr = NULL;
doneps4 = 0; doneps4 = 0;
redir = (wc_code(*state->pc) == WC_REDIR ? ecgetredirs(state) : NULL); redir = (wc_code(*state->pc) == WC_REDIR ? ecgetredirs(state) : NULL);
@ -2675,10 +2675,10 @@ execcmd(Estate state, int input, int output, int how, int last1)
fflush(xtrerr); fflush(xtrerr);
if (isset(XTRACE) && xtrerr == stderr && if (isset(XTRACE) && xtrerr == stderr &&
(type < WC_SUBSH || type == WC_TIMED)) { (type < WC_SUBSH || type == WC_TIMED)) {
if (!(xtrerr = fdopen(movefd(dup(fileno(stderr))), "w"))) if ((newxtrerr = fdopen(movefd(dup(fileno(stderr))), "w"))) {
xtrerr = stderr; xtrerr = newxtrerr;
else
fdtable[fileno(xtrerr)] = FDT_XTRACE; fdtable[fileno(xtrerr)] = FDT_XTRACE;
}
} }
/* Add pipeline input/output to mnodes */ /* Add pipeline input/output to mnodes */
@ -2885,6 +2885,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
if (mfds[i] && mfds[i]->ct >= 2) if (mfds[i] && mfds[i]->ct >= 2)
closemn(mfds, i); closemn(mfds, i);
xtrerr = stderr;
if (nullexec) { if (nullexec) {
if (nullexec == 1) { if (nullexec == 1) {
/* /*
@ -3099,9 +3100,9 @@ execcmd(Estate state, int input, int output, int how, int last1)
fixfds(save); fixfds(save);
done: done:
if (xtrerr != oxtrerr) { if (newxtrerr) {
fil = fileno(xtrerr); fil = fileno(newxtrerr);
fclose(xtrerr); fclose(newxtrerr);
xtrerr = oxtrerr; xtrerr = oxtrerr;
zclose(fil); zclose(fil);
} }

View file

@ -55,16 +55,21 @@
>Tracing: function 2>file >Tracing: function 2>file
>Tracing: source >Tracing: source
>Tracing: source 2>file >Tracing: source 2>file
>+(eval):3> print 'Tracing: builtin 2>file'
>+(eval):5> cat
>+(eval):7> print 'Tracing: ( builtin ) 2>file' >+(eval):7> print 'Tracing: ( builtin ) 2>file'
>+(eval):9> cat >+(eval):9> cat
>+(eval):11> print 'Tracing: { builtin } 2>file' >+(eval):11> print 'Tracing: { builtin } 2>file'
>+(eval):13> cat >+(eval):13> cat
>+(eval):15> print 'Tracing: do builtin done 2>file' >+(eval):15> print 'Tracing: do builtin done 2>file'
>+(eval):17> cat >+(eval):17> cat
>+(eval):19> xtf 'Tracing: function 2>file'
>+xtf:1> local regression_test_dummy_variable
>+xtf:2> print 'Tracing: function 2>file'
>+(eval):21> . ./xt.in 'Tracing: source 2>file'
>+./xt.in:1> print 'Tracing: source 2>file'
?+(eval):2> print 'Tracing: builtin' ?+(eval):2> print 'Tracing: builtin'
?+(eval):3> print 'Tracing: builtin 2>file'
?+(eval):4> cat ?+(eval):4> cat
?+(eval):5> cat
?+(eval):6> print 'Tracing: ( builtin )' ?+(eval):6> print 'Tracing: ( builtin )'
?+(eval):8> cat ?+(eval):8> cat
?+(eval):10> print 'Tracing: { builtin }' ?+(eval):10> print 'Tracing: { builtin }'
@ -74,18 +79,13 @@
?+(eval):18> xtf 'Tracing: function' ?+(eval):18> xtf 'Tracing: function'
?+xtf:1> local regression_test_dummy_variable ?+xtf:1> local regression_test_dummy_variable
?+xtf:2> print 'Tracing: function' ?+xtf:2> print 'Tracing: function'
?+(eval):19> xtf 'Tracing: function 2>file'
?+xtf:1> local regression_test_dummy_variable
?+xtf:2> print 'Tracing: function 2>file'
?+(eval):20> . ./xt.in 'Tracing: source' ?+(eval):20> . ./xt.in 'Tracing: source'
?+./xt.in:1> print 'Tracing: source' ?+./xt.in:1> print 'Tracing: source'
?+(eval):21> . ./xt.in 'Tracing: source 2>file'
?+./xt.in:1> print 'Tracing: source 2>file'
?+(eval):22> set +x ?+(eval):22> set +x
typeset -ft xtf typeset -ft xtf
xtf 'Tracing: function' xtf 'Tracing: function'
0: 0:tracing function
>Tracing: function >Tracing: function
?+xtf:1> local regression_test_dummy_variable ?+xtf:1> local regression_test_dummy_variable
?+xtf:2> print 'Tracing: function' ?+xtf:2> print 'Tracing: function'