From b275190ff41ce261d9ec8bf6d984191252a1320f Mon Sep 17 00:00:00 2001 From: Sven Wischnowsky Date: Wed, 27 Jun 2001 11:22:04 +0000 Subject: add autocontinue option to automatically make stopped jos running when they are being disowned; make that the default for `%job &!' and `%job &|' (15115) --- Src/exec.c | 10 +++++++++- Src/jobs.c | 14 ++++++++++++-- Src/options.c | 1 + Src/zsh.h | 1 + 4 files changed, 23 insertions(+), 3 deletions(-) (limited to 'Src') diff --git a/Src/exec.c b/Src/exec.c index 625c376b7..91ce74e57 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -1645,7 +1645,7 @@ execcmd(Estate state, int input, int output, int how, int last1) int nullexec = 0, assign = 0, forked = 0; int is_shfunc = 0, is_builtin = 0, is_exec = 0; /* Various flags to the command. */ - int cflags = 0, checked = 0; + int cflags = 0, checked = 0, oautocont = opts[AUTOCONTINUE]; LinkList redir; wordcode code; Wordcode beg = state->pc, varspc; @@ -1680,6 +1680,8 @@ execcmd(Estate state, int input, int output, int how, int last1) * reference to a job in the job table. */ if (type == WC_SIMPLE && args && nonempty(args) && *(char *)peekfirst(args) == '%') { + if (how & Z_DISOWN) + opts[AUTOCONTINUE] = 1; pushnode(args, dupstring((how & Z_DISOWN) ? "disown" : (how & Z_ASYNC) ? "bg" : "fg")); how = Z_SYNC; @@ -1833,6 +1835,7 @@ execcmd(Estate state, int input, int output, int how, int last1) if (cflags & BINF_BUILTIN) { zwarn("no such builtin: %s", cmdarg, 0); lastval = 1; + opts[AUTOCONTINUE] = oautocont; return; } break; @@ -1856,6 +1859,7 @@ execcmd(Estate state, int input, int output, int how, int last1) if (errflag) { lastval = 1; + opts[AUTOCONTINUE] = oautocont; return; } @@ -1899,6 +1903,7 @@ execcmd(Estate state, int input, int output, int how, int last1) if (errflag) { lastval = 1; + opts[AUTOCONTINUE] = oautocont; return; } @@ -1981,6 +1986,7 @@ execcmd(Estate state, int input, int output, int how, int last1) if ((pid = zfork()) == -1) { close(synch[0]); close(synch[1]); + opts[AUTOCONTINUE] = oautocont; return; } if (pid) { close(synch[1]); @@ -2006,6 +2012,7 @@ execcmd(Estate state, int input, int output, int how, int last1) } } addproc(pid, text); + opts[AUTOCONTINUE] = oautocont; return; } /* pid == 0 */ @@ -2373,6 +2380,7 @@ execcmd(Estate state, int input, int output, int how, int last1) zsfree(STTYval); STTYval = 0; + opts[AUTOCONTINUE] = oautocont; } /* Arrange to have variables restored. */ diff --git a/Src/jobs.c b/Src/jobs.c index 50002d28f..f462a0ae8 100644 --- a/Src/jobs.c +++ b/Src/jobs.c @@ -1215,7 +1215,7 @@ init_hackzero(char **argv, char **envp) int bin_fg(char *name, char **argv, char *ops, int func) { - int job, lng, firstjob = -1, retval = 0; + int job, lng, firstjob = -1, retval = 0, ofunc = func; if (ops['Z']) { int len; @@ -1299,6 +1299,8 @@ bin_fg(char *name, char **argv, char *ops, int func) for (; (firstjob != -1) || *argv; (void)(*argv && argv++)) { int stopped, ocj = thisjob; + func = ofunc; + if (func == BIN_WAIT && isanum(*argv)) { /* wait can take a pid; the others can't. */ pid_t pid = (long)atoi(*argv); @@ -1326,6 +1328,13 @@ bin_fg(char *name, char **argv, char *ops, int func) unqueue_signals(); return 1; } + /* If AUTO_CONTINUE is set (automatically make stopped jobs running + * on disown), we actually do a bg and then delete the job table entry. */ + + if (isset(AUTOCONTINUE) && func == BIN_DISOWN && + jobtab[job].stat & STAT_STOPPED) + func = BIN_BG; + /* We have a job number. Now decide what to do with it. */ switch (func) { case BIN_FG: @@ -1386,7 +1395,8 @@ bin_fg(char *name, char **argv, char *ops, int func) if (func != BIN_BG) { waitjobs(); retval = lastval2; - } + } else if (ofunc == BIN_DISOWN) + deletejob(jobtab + job); break; case BIN_JOBS: printjob(job + jobtab, lng, 2); diff --git a/Src/options.c b/Src/options.c index 2c63f194a..cd45b31e9 100644 --- a/Src/options.c +++ b/Src/options.c @@ -75,6 +75,7 @@ static struct optname optns[] = { {NULL, "alwaystoend", 0, ALWAYSTOEND}, {NULL, "appendhistory", OPT_ALL, APPENDHISTORY}, {NULL, "autocd", OPT_EMULATE, AUTOCD}, +{NULL, "autocontinue", 0, AUTOCONTINUE}, {NULL, "autolist", OPT_ALL, AUTOLIST}, {NULL, "automenu", OPT_ALL, AUTOMENU}, {NULL, "autonamedirs", 0, AUTONAMEDIRS}, diff --git a/Src/zsh.h b/Src/zsh.h index 5ab5661d1..5014099ce 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -1314,6 +1314,7 @@ enum { ALWAYSTOEND, APPENDHISTORY, AUTOCD, + AUTOCONTINUE, AUTOLIST, AUTOMENU, AUTONAMEDIRS, -- cgit 1.4.1