From 6d50d5b97d49a74a8faf587ec2bbf234626adf0c Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Tue, 19 Oct 2021 14:16:54 -0700 Subject: Feat(rc): added subshell commands and cd builtin Slowly chipping away at a decent feature list. Subshell commands are executed by @{ ... }. --- sys/cmd/rc/wait.c | 107 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 55 insertions(+), 52 deletions(-) (limited to 'sys/cmd/rc/wait.c') diff --git a/sys/cmd/rc/wait.c b/sys/cmd/rc/wait.c index e3dcea1..6a8d859 100644 --- a/sys/cmd/rc/wait.c +++ b/sys/cmd/rc/wait.c @@ -84,6 +84,39 @@ shouldwait(Thread *job) return 0; } +static inline +void +notify(Thread *job, struct WaitMsg msg) +{ + int i; + for(i=0; i < job->wait.len; i++){ + if(job->wait.on[i].pid == msg.pid){ + job->status = msg.status; + switch(msg.type){ + case Pstop: + print(shell.err, "%d: suspended\n", msg.pid); + job->wait.status = Pstop; + job->wait.on[i].status = Pstop; + break; + + case Psig: + print(shell.err, "%d: terminated by signal %d\n", msg.pid, msg.status); + /* fallthrough */ + case Pdone: + job->wait.on[i].status = Pdone; + delwait(job, msg.pid); + if(!job->wait.len) + job->wait.status = Pdone; + break; + + default: + fatal("%d: unrecognized message type %d\n", msg.pid, msg.type); + } + break; + } + } +} + // ----------------------------------------------------------------------- // exported @@ -140,34 +173,31 @@ waitall(Thread *job) return 0; } - for(i=0; i < job->wait.len; i++){ - if(job->wait.on[i].pid == msg.pid){ - job->status = msg.status; - switch(msg.type){ - case Pstop: - print(shell.err, "%d: suspended\n", msg.pid); - job->wait.status = Pstop; - job->wait.on[i].status = Pstop; - break; - - case Psig: - print(shell.err, "%d: terminated by signal %d\n", msg.pid, msg.status); - /* fallthrough */ - case Pdone: - job->wait.on[i].status = Pdone; - delwait(job, msg.pid); - if(!job->wait.len) - job->wait.status = Pdone; - break; - - default: - fatal("%d: unrecognized message type %d\n", msg.pid, msg.type); - } - break; - } + notify(job, msg); + } + return 1; +} + +int +waitfor(Thread *job, int pid) +{ + int i; + Thread *t; + struct WaitMsg msg; + + while(shouldwait(job) && await(-job->pgid, WUNTRACED, &msg)){ + if(msg.pid == 0){ + perror("wait for"); + return 0; } + + notify(job, msg); + /* allow for an early exit */ + if(msg.pid == pid) + return 1; } return 1; + } void @@ -197,30 +227,3 @@ killzombies(void) } } } - -#if 0 -int -waitfor(int pid) -{ - Thread *t; - struct WaitMsg w; - - if(pid >= 0 && !havewait(pid)) - return 0; - - while(await(-proc->pgid, WUNTRACED, &w)){ - delwait(w.pid); - if(w.pid == pid){ - if(w.signal) - print(errio, "pid[%d]: signal: %d\n", w.pid, w.status); - return 1; - } - for(t=proc->link; t; t=t->link){ - if(t->pid == w.pid) - t->pid = -1; - } - } - - return 0; -} -#endif -- cgit v1.2.1