From 9e3a65a91ed9140afc457605150ab252af4f9ab0 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sun, 27 Dec 2015 13:06:49 +0000 Subject: [PATCH] kernel: first pieces of job control logic --- Kernel/include/kernel.h | 5 +++++ Kernel/level2.c | 20 ++++++++++++++++++++ Kernel/tty.c | 4 +++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Kernel/include/kernel.h b/Kernel/include/kernel.h index 54138ce3..11b352e2 100644 --- a/Kernel/include/kernel.h +++ b/Kernel/include/kernel.h @@ -38,6 +38,11 @@ From UZI by Doug Braun and UZI280 by Stefan Nitschke. #ifdef CONFIG_LEVEL_2 #include "level2.h" +#else + +#define jobcontrol_in(x) +#define jobcontrol_out(x) + #endif #define CPM_EMULATOR_FILENAME "/usr/cpm/emulator" diff --git a/Kernel/level2.c b/Kernel/level2.c index 53bf780f..b25a5fb6 100644 --- a/Kernel/level2.c +++ b/Kernel/level2.c @@ -11,3 +11,23 @@ int in_group(uint16_t gid) return 1; return 0; } + +void jobcontrol_in(struct tty *t) +{ + if (udata.u_proc->p_pgrp == t->pgrp) + return; + ssig(udata.u_proc, SIGTTIN); + /* So we halt */ + pause(0); +} + +void jobcontrol_out(struct tty *t) +{ + if (udata.u_proc->p_pgrp == t->pgrp) + return; + if (!(t->termios.t_lflag & TOSTOP)) + return; + ssig(udata.u_proc, SIGTTOU); + /* So we halt */ + pause(0); +} diff --git a/Kernel/tty.c b/Kernel/tty.c index 87bc0439..264c0c37 100644 --- a/Kernel/tty.c +++ b/Kernel/tty.c @@ -50,6 +50,7 @@ int tty_read(uint8_t minor, uint8_t rawflag, uint8_t flag) udata.u_error = ENXIO; return -1; } + jobcontrol_in(t); if (remq(q, &c)) { if (udata.u_sysio) *udata.u_base = c; @@ -114,8 +115,8 @@ int tty_write(uint8_t minor, uint8_t rawflag, uint8_t flag) break; if (psleep_flags_io(&t->flag, flag, &written)) return written; + jobcontrol_out(t); } - if (!(t->flag & TTYF_DISCARD)) { if (udata.u_sysio) c = *udata.u_base; @@ -229,6 +230,7 @@ int tty_ioctl(uint8_t minor, uarg_t request, char *data) udata.u_error = ENXIO; return -1; } + jobcontrol_in(t); switch (request) { case TCGETS: return uput(&t->termios, data, sizeof(struct termios)); -- 2.34.1