summaryrefslogtreecommitdiff
path: root/sys/src/cmd/rc/code.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2021-12-31 23:26:59 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2021-12-31 23:26:59 +0000
commit2025214dfcc46ac16cb93abc05b344330987b339 (patch)
treed121ec515b81006a5272bc1c7fadf93fb4cf4392 /sys/src/cmd/rc/code.c
parentd0c9127b10251d85b56eba00bc586b57dd998aaf (diff)
rc: fix here document handling with quoted end-marker (thanks sigrid)
when end marker is quoted, we should not substitute. also, pcmd() needs to print the end marker without quotes.
Diffstat (limited to 'sys/src/cmd/rc/code.c')
-rw-r--r--sys/src/cmd/rc/code.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/sys/src/cmd/rc/code.c b/sys/src/cmd/rc/code.c
index 67c2eb925..f39b3a573 100644
--- a/sys/src/cmd/rc/code.c
+++ b/sys/src/cmd/rc/code.c
@@ -353,14 +353,10 @@ outcode(tree *t, int eflag)
stuffdot(p);
break;
case REDIR:
- emitf(Xmark);
- if(t->rtype==HERE){
- /* replace end marker with mktmep() pattern */
- free(c0->str);
- c0->str=estrdup("/tmp/here.XXXXXXXXXXX");
- c0->glob=0;
+ if(t->rtype!=HERE){
+ emitf(Xmark);
+ outcode(c0, eflag);
}
- outcode(c0, eflag);
switch(t->rtype){
case APPEND:
emitf(Xappend);
@@ -375,7 +371,7 @@ outcode(tree *t, int eflag)
emitf(Xrdwr);
break;
case HERE:
- emitf(Xhere);
+ emitf(c0->quoted?Xhereq:Xhere);
emits(t->str);
t->str=0; /* passed ownership */
break;
@@ -539,7 +535,7 @@ codefree(code *cp)
|| p->f==Xsubshell || p->f==Xtrue) p++;
else if(p->f==Xdup || p->f==Xpipefd) p+=2;
else if(p->f==Xpipe) p+=4;
- else if(p->f==Xhere) free(p[1].s), p+=2;
+ else if(p->f==Xhere || p->f==Xhereq) free(p[1].s), p+=2;
else if(p->f==Xword) free((++p)->s);
else if(p->f==Xfn){
free(p[2].s);