aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2021-11-16 15:21:55 -0800
committerNicholas Noll <nbnoll@eml.cc>2021-11-16 15:21:55 -0800
commitd1caabb4cd9f283f8e21e742c42e1ceb454133dc (patch)
treea9e9a027e8092757b8e72c4825cbaecff7c40ce4
parente923adef5df8077259ed9973a4bffb0e08999fbe (diff)
Feat: added fd duplications
-rw-r--r--src/cmd/rc/code.c13
-rw-r--r--src/cmd/rc/exec.c13
-rw-r--r--src/cmd/rc/exec.h2
-rw-r--r--src/cmd/rc/lex.c35
4 files changed, 47 insertions, 16 deletions
diff --git a/src/cmd/rc/code.c b/src/cmd/rc/code.c
index 748c964..47266e4 100644
--- a/src/cmd/rc/code.c
+++ b/src/cmd/rc/code.c
@@ -349,6 +349,19 @@ walk(Tree *node)
case Tpipefd:
#endif
+ case Tdup:
+ if(node->redir.type == Rdupfd){
+ emitf(Xdup);
+ emiti(node->redir.fd[0]);
+ emiti(node->redir.fd[1]);
+ }else{
+ emitf(Xclose);
+ emiti(node->redir.fd[0]);
+ }
+ walk(node->child[1]);
+ emitf(Xpopredir);
+ break;
+
case Tredir:
emitf(Xmark);
walk(node->child[0]);
diff --git a/src/cmd/rc/exec.c b/src/cmd/rc/exec.c
index 28941a0..9ebb517 100644
--- a/src/cmd/rc/exec.c
+++ b/src/cmd/rc/exec.c
@@ -689,6 +689,19 @@ Xword(void)
}
void
+Xclose(void)
+{
+ pushredir(Rclose, runner->code.exe[runner->code.i++].i, 0);
+}
+
+void
+Xdup(void)
+{
+ pushredir(Rclose, runner->code.exe[runner->code.i].i, runner->code.exe[runner->code.i+1].i);
+ runner->code.i += 2;
+}
+
+void
Xwrite(void)
{
int fd;
diff --git a/src/cmd/rc/exec.h b/src/cmd/rc/exec.h
index d7eee73..992af35 100644
--- a/src/cmd/rc/exec.h
+++ b/src/cmd/rc/exec.h
@@ -14,6 +14,8 @@ void Xwrite(void);
void Xread(void);
void Xrdwr(void);
void Xappend(void);
+void Xclose(void);
+void Xdup(void);
void Xdelhere(void);
void Xcase(void);
void Xfunc(void);
diff --git a/src/cmd/rc/lex.c b/src/cmd/rc/lex.c
index a22dc7d..b02a403 100644
--- a/src/cmd/rc/lex.c
+++ b/src/cmd/rc/lex.c
@@ -467,7 +467,7 @@ yylex(void)
*w++='[';
c = advance();
*w++ = c;
- if(c<'0' || '9'<c){
+ if(c<'0'||'9'<c){
badredir:
*w = 0;
yyerror(node->type == Tpipe ? "pipe syntax" : "redirection syntax");
@@ -484,23 +484,26 @@ yylex(void)
*w++ = '=';
if(node->type==Tredir)
node->type = Tdup;
+
c = advance();
+
+ if(c < '0' || '9' < c){
+ if(node->type == Tpipe)
+ goto badredir;
+ node->redir.type = Rclose;
+ }else{
+ node->redir.type = Rdupfd;
+ node->redir.fd[1] = node->redir.fd[0];
+ node->redir.fd[0] = 0;
+ do{
+ node->redir.fd[0] = 10*node->redir.fd[0]+(c-'0');
+ *w++ = c;
+ c = advance();
+ }while('0'<=c && c<='9');
+ }
}
- if(c < '0' || '9' < c){
- if(node->type == Tpipe)
- goto badredir;
- node->redir.type = Rclose;
- }else{
- node->redir.type = Rdupfd;
- node->redir.fd[1] = node->redir.fd[0];
- node->redir.fd[0] = 0;
- do{
- node->redir.fd[0] = 10*node->redir.fd[0]+(c-'0');
- *w++ = c;
- c = advance();
- }while('0'<=c && c<='9');
- }
- if(c != ']' || (node->type == Tdup && (node->redir.type = Rhere || node->redir.type == Rappend)))
+ if(c != ']'
+ || (node->type == Tdup && (node->redir.type == Rhere || node->redir.type == Rappend)))
goto badredir;
*w++ = ']';
}