summaryrefslogtreecommitdiffstats
path: root/bin/sh/jobs.c
diff options
context:
space:
mode:
authortjr <tjr@FreeBSD.org>2002-06-01 01:51:42 +0000
committertjr <tjr@FreeBSD.org>2002-06-01 01:51:42 +0000
commitfff7a365669b964928b679402547a2c0dd3428d3 (patch)
tree27f40a0f20ad572fb62afaceac5f847f5ab44aa7 /bin/sh/jobs.c
parent2e73795c55e0123f8df12dc5c840657116d08056 (diff)
downloadFreeBSD-src-fff7a365669b964928b679402547a2c0dd3428d3.zip
FreeBSD-src-fff7a365669b964928b679402547a2c0dd3428d3.tar.gz
Support the remaining job ID formats required by SUSv3:
%+ (current job, same as %%), %- (previous job), %?str (job with "str" in its command name).
Diffstat (limited to 'bin/sh/jobs.c')
-rw-r--r--bin/sh/jobs.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c
index 822500b..5cf35c9 100644
--- a/bin/sh/jobs.c
+++ b/bin/sh/jobs.c
@@ -518,7 +518,7 @@ STATIC struct job *
getjob(char *name)
{
int jobno;
- struct job *jp;
+ struct job *found, *jp;
int pid;
int i;
@@ -539,9 +539,28 @@ currentjob: if ((jp = getcurjob(NULL)) == NULL)
#if JOBS
} else if (name[1] == '%' && name[2] == '\0') {
goto currentjob;
+ } else if (name[1] == '+' && name[2] == '\0') {
+ goto currentjob;
+ } else if (name[1] == '-' && name[2] == '\0') {
+ if ((jp = getcurjob(NULL)) == NULL ||
+ (jp = getcurjob(jp)) == NULL)
+ error("No previous job");
+ return (jp);
#endif
+ } else if (name[1] == '?') {
+ found = NULL;
+ for (jp = jobtab, i = njobs ; --i >= 0 ; jp++) {
+ if (jp->used && jp->nprocs > 0
+ && strstr(jp->ps[0].cmd, name + 2) != NULL) {
+ if (found)
+ error("%s: ambiguous", name);
+ found = jp;
+ }
+ }
+ if (found != NULL)
+ return (found);
} else {
- struct job *found = NULL;
+ found = NULL;
for (jp = jobtab, i = njobs ; --i >= 0 ; jp++) {
if (jp->used && jp->nprocs > 0
&& prefix(name + 1, jp->ps[0].cmd)) {
OpenPOWER on IntegriCloud