summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/exec.c10
-rw-r--r--Src/jobs.c14
-rw-r--r--Src/options.c1
-rw-r--r--Src/zsh.h1
4 files changed, 23 insertions, 3 deletions
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,