aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tsh.cc48
1 files changed, 28 insertions, 20 deletions
diff --git a/tsh.cc b/tsh.cc
index 985c083..6800e4d 100644
--- a/tsh.cc
+++ b/tsh.cc
@@ -332,30 +332,38 @@ int builtin_cmd(char *c_str)
*/
void do_bgfg(char **argv)
{
- if (strcmp(argv[0], "fg") == 0)
+ if ((strcmp(argv[0], "fg") == 0) || (strcmp(argv[0], "bg") == 0))
{
- LOG << "fg" << endl;
- int jid = atoi(argv[1]);
- sigset_t prev;
- block_all(&prev);
- job_t *j = getjobjid(jobs, jid);
- j->state = FG;
- kill(-(j->pid), SIGCONT);
- sigprocmask(SIG_SETMASK, &prev, NULL);
- waitfg(j->pid);
- } else if (strcmp(argv[0], "bg") == 0)
- {
- LOG << "bg" << endl;
- int jid = atoi(argv[1]);
+ int x;
+ job_t *j = nullptr;
sigset_t prev;
+ if (argv[1][0] == '%') // jid provided
+ {
+ x = atoi(argv[1]); // eat %
+ j = getjobjid(jobs, x);
+ } else { // pid
+ x = atoi(argv[0]);
+ j = getjobpid(jobs, x);
+ }
+
block_all(&prev);
- job_t *j = getjobjid(jobs, jid);
- j->state = BG;
- kill(-(j->pid), SIGCONT);
- sigprocmask(SIG_SETMASK, &prev, NULL);
- } else
+ if (strcmp(argv[0], "fg") == 0) // fg
+ {
+ LOG << "fg" << endl;
+ j->state = FG;
+ kill(-(j->pid), SIGCONT);
+ sigprocmask(SIG_SETMASK, &prev, NULL);
+ waitfg(j->pid);
+ } else // bg
+ {
+ LOG << "bg" << endl;
+ j->state = BG;
+ kill(-(j->pid), SIGCONT);
+ sigprocmask(SIG_SETMASK, &prev, NULL);
+ }
+ }
+ else
cerr << "not fg/bg" << endl;
- return;
}
/*