From 3cef63a1f664f54871b30aace725cedbc5a4f7ef Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Sat, 17 Jul 1999 08:24:57 +0000 Subject: [PATCH] Implementation of TCXONC. Reviewed by: bde --- sys/alpha/linux/linux.h | 8 ++++++-- sys/compat/linux/linux_ioctl.c | 33 ++++++++++++++++++++++++++++++++- sys/i386/linux/linux.h | 8 ++++++-- sys/i386/linux/linux_ioctl.c | 33 ++++++++++++++++++++++++++++++++- 4 files changed, 76 insertions(+), 6 deletions(-) diff --git a/sys/alpha/linux/linux.h b/sys/alpha/linux/linux.h index 21f07d81293..235e541147a 100644 --- a/sys/alpha/linux/linux.h +++ b/sys/alpha/linux/linux.h @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: linux.h,v 1.28 1999/07/06 06:54:00 cracauer Exp $ + * $Id: linux.h,v 1.29 1999/07/08 16:15:18 marcel Exp $ */ #ifndef _I386_LINUX_LINUX_H_ @@ -243,7 +243,11 @@ struct trapframe; #define LINUX_VT_ACTIVATE 0x5606 #define LINUX_VT_WAITACTIVE 0x5607 - +/* arguments for tcflow() and LINUX_TCXONC */ +#define LINUX_TCOOFF 0 +#define LINUX_TCOON 1 +#define LINUX_TCIOFF 2 +#define LINUX_TCION 3 /* arguments for tcflush() and LINUX_TCFLSH */ #define LINUX_TCIFLUSH 0 diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c index 18b1247b627..1c79c6c0f5f 100644 --- a/sys/compat/linux/linux_ioctl.c +++ b/sys/compat/linux/linux_ioctl.c @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: linux_ioctl.c,v 1.34 1999/07/06 11:41:48 marcel Exp $ + * $Id: linux_ioctl.c,v 1.35 1999/07/08 16:15:19 marcel Exp $ */ #include @@ -986,6 +986,37 @@ linux_ioctl(struct proc *p, struct linux_ioctl_args *args) linux_tiocsserial(fp, (struct linux_serial_struct *)args->arg); return 0; + case LINUX_TCXONC: + switch (args->arg) { + case LINUX_TCOOFF: + args->cmd = TIOCSTOP; + break; + case LINUX_TCOON: + args->cmd = TIOCSTART; + break; + case LINUX_TCIOFF: + case LINUX_TCION: { + u_char c; + struct write_args wr; + error = (*func)(fp, TIOCGETA, (caddr_t)&bsd_termios, p); + if (error != 0) + return error; + c = bsd_termios.c_cc[args->arg == LINUX_TCIOFF ? VSTOP : VSTART]; + if (c != _POSIX_VDISABLE) { + wr.fd = args->fd; + wr.buf = &c; + wr.nbyte = sizeof(c); + return write(p, &wr); + } + else + return (0); + } + default: + return EINVAL; + } + args->arg = 0; + return ioctl(p, (struct ioctl_args *)args); + case LINUX_TCFLSH: args->cmd = TIOCFLUSH; switch (args->arg) { diff --git a/sys/i386/linux/linux.h b/sys/i386/linux/linux.h index 21f07d81293..235e541147a 100644 --- a/sys/i386/linux/linux.h +++ b/sys/i386/linux/linux.h @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: linux.h,v 1.28 1999/07/06 06:54:00 cracauer Exp $ + * $Id: linux.h,v 1.29 1999/07/08 16:15:18 marcel Exp $ */ #ifndef _I386_LINUX_LINUX_H_ @@ -243,7 +243,11 @@ struct trapframe; #define LINUX_VT_ACTIVATE 0x5606 #define LINUX_VT_WAITACTIVE 0x5607 - +/* arguments for tcflow() and LINUX_TCXONC */ +#define LINUX_TCOOFF 0 +#define LINUX_TCOON 1 +#define LINUX_TCIOFF 2 +#define LINUX_TCION 3 /* arguments for tcflush() and LINUX_TCFLSH */ #define LINUX_TCIFLUSH 0 diff --git a/sys/i386/linux/linux_ioctl.c b/sys/i386/linux/linux_ioctl.c index 18b1247b627..1c79c6c0f5f 100644 --- a/sys/i386/linux/linux_ioctl.c +++ b/sys/i386/linux/linux_ioctl.c @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: linux_ioctl.c,v 1.34 1999/07/06 11:41:48 marcel Exp $ + * $Id: linux_ioctl.c,v 1.35 1999/07/08 16:15:19 marcel Exp $ */ #include @@ -986,6 +986,37 @@ linux_ioctl(struct proc *p, struct linux_ioctl_args *args) linux_tiocsserial(fp, (struct linux_serial_struct *)args->arg); return 0; + case LINUX_TCXONC: + switch (args->arg) { + case LINUX_TCOOFF: + args->cmd = TIOCSTOP; + break; + case LINUX_TCOON: + args->cmd = TIOCSTART; + break; + case LINUX_TCIOFF: + case LINUX_TCION: { + u_char c; + struct write_args wr; + error = (*func)(fp, TIOCGETA, (caddr_t)&bsd_termios, p); + if (error != 0) + return error; + c = bsd_termios.c_cc[args->arg == LINUX_TCIOFF ? VSTOP : VSTART]; + if (c != _POSIX_VDISABLE) { + wr.fd = args->fd; + wr.buf = &c; + wr.nbyte = sizeof(c); + return write(p, &wr); + } + else + return (0); + } + default: + return EINVAL; + } + args->arg = 0; + return ioctl(p, (struct ioctl_args *)args); + case LINUX_TCFLSH: args->cmd = TIOCFLUSH; switch (args->arg) {