xref: /csrg-svn/sys/sparc/sunos/sun_ioctl.c (revision 63325)
155099Storek /*
2*63325Sbostic  * Copyright (c) 1992, 1993
3*63325Sbostic  *	The Regents of the University of California.  All rights reserved.
455099Storek  *
555099Storek  * This software was developed by the Computer Systems Engineering group
655099Storek  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
755099Storek  * contributed to Berkeley.
855099Storek  *
955505Sbostic  * All advertising materials mentioning features or use of this software
1055505Sbostic  * must display the following acknowledgement:
1155505Sbostic  *	This product includes software developed by the University of
1258994Storek  *	California, Lawrence Berkeley Laboratory.
1355505Sbostic  *
1455099Storek  * %sccs.include.redist.c%
1555099Storek  *
16*63325Sbostic  *	@(#)sun_ioctl.c	8.1 (Berkeley) 06/11/93
1755099Storek  *
1860520Storek  * from: $Header: sun_ioctl.c,v 1.7 93/05/28 04:40:43 torek Exp $
1955099Storek  */
2055099Storek 
2156543Sbostic #include <sys/param.h>
2256543Sbostic #include <sys/proc.h>
2356543Sbostic #include <sys/file.h>
2456543Sbostic #include <sys/filedesc.h>
2556543Sbostic #include <sys/ioctl.h>
2656543Sbostic #include <sys/termios.h>
2756543Sbostic #include <sys/tty.h>
2855099Storek 
2955099Storek /*
3055099Storek  * SunOS ioctl calls.
3155099Storek  * This file is something of a hodge-podge.
3255099Storek  * Support gets added as things turn up....
3355099Storek  */
3455099Storek 
3555099Storek struct sun_ttysize {
3655099Storek 	int	ts_row;
3755099Storek 	int	ts_col;
3855099Storek };
3955099Storek 
4055099Storek struct sun_termio {
4155099Storek 	u_short	c_iflag;
4255099Storek 	u_short	c_oflag;
4355099Storek 	u_short	c_cflag;
4455099Storek 	u_short	c_lflag;
4555099Storek 	char	c_line;
4655099Storek 	unsigned char c_cc[8];
4755099Storek };
4855099Storek 
4955099Storek struct sun_ioctl_args {
5055099Storek 	int	fd;
5155099Storek 	int	cmd;
5255099Storek 	caddr_t	data;
5355099Storek };
sun_ioctl(p,uap,retval)5455099Storek sun_ioctl(p, uap, retval)
5555099Storek 	register struct proc *p;
5655099Storek 	register struct sun_ioctl_args *uap;
5755099Storek 	int *retval;
5855099Storek {
5955099Storek 	register struct filedesc *fdp = p->p_fd;
6055099Storek 	register struct file *fp;
6155099Storek 	register int (*ctl)();
6255099Storek 	int error;
6355099Storek 
6455099Storek 	if ((unsigned)uap->fd >= fdp->fd_nfiles ||
6555099Storek 	    (fp = fdp->fd_ofiles[uap->fd]) == NULL)
6655099Storek 		return (EBADF);
6755099Storek 	if ((fp->f_flag & (FREAD|FWRITE)) == 0)
6855099Storek 		return (EBADF);
6955099Storek 	ctl = fp->f_ops->fo_ioctl;
7055099Storek 
7155099Storek 	switch (uap->cmd) {
7255099Storek 
7355099Storek 	case _IOR('t', 0, int):
7455099Storek 		uap->cmd = TIOCGETD;
7555099Storek 		break;
7655099Storek 
7755099Storek 	case _IOW('t', 1, int):
7855099Storek 		uap->cmd = TIOCSETD;
7955099Storek 		break;
8055099Storek 
8155099Storek 	case _IO('t', 36): {		/* sun TIOCCONS, no parameters */
8255099Storek 		int on = 1;
8355099Storek 		return ((*ctl)(fp, TIOCCONS, (caddr_t)&on, p));
8455099Storek 	    }
8555099Storek 
8655099Storek 	case _IOW('t', 37, struct sun_ttysize): {
8755099Storek 		struct winsize ws;
8855099Storek 		if ((error = (*ctl)(fp, TIOCGWINSZ, (caddr_t)&ws, p)) != 0)
8955099Storek 			return (error);
9055099Storek 		ws.ws_row = ((struct sun_ttysize *)uap->data)->ts_row;
9155099Storek 		ws.ws_col = ((struct sun_ttysize *)uap->data)->ts_col;
9255099Storek 		return ((*ctl)(fp, TIOCSWINSZ, (caddr_t)&ws, p));
9355099Storek 	    }
9455099Storek 
9555099Storek 	case _IOW('t', 38, struct sun_ttysize): {
9655099Storek 		struct winsize ws;
9755099Storek 		if ((error = (*ctl)(fp, TIOCGWINSZ, (caddr_t)&ws, p)) != 0)
9855099Storek 			return (error);
9955099Storek 		((struct sun_ttysize *)uap->data)->ts_row = ws.ws_row;
10055099Storek 		((struct sun_ttysize *)uap->data)->ts_col = ws.ws_col;
10155099Storek 		return (0);
10255099Storek 	    }
10355099Storek 
10455099Storek 	case _IOR('t', 130, int):
10555099Storek 		uap->cmd = TIOCSPGRP;
10655099Storek 		break;
10755099Storek 
10855099Storek 	case _IOR('t', 131, int):
10955099Storek 		uap->cmd = TIOCGPGRP;
11055099Storek 		break;
11155099Storek 
11255099Storek 	case _IO('t', 132):
11355099Storek 		uap->cmd = TIOCSCTTY;
11455099Storek 		break;
11555099Storek 
11655099Storek 	case _IOR('T', 1, struct sun_termio): {
11755099Storek 		struct termios bt;
11855099Storek 		struct sun_termio st;
11955099Storek 		int speed;
12055099Storek 		static struct speedtab sptab[] = {
12160520Storek 			{ 0, 0 }, { 50, 1 }, { 75, 2 }, { 110, 3 },
12260520Storek 			{ 134, 4 }, { 135, 4 }, { 150, 5 }, { 200, 6 },
12360520Storek 			{ 300, 7 }, { 600, 8 }, { 1200, 9 }, { 1800, 10 },
12460520Storek 			{ 2400, 11 }, { 4800, 12 }, { 9600, 13 },
12560520Storek 			{ 19200, 14 }, { 38400, 15 }, { -1, -1 }
12655099Storek 		};
12755099Storek 
12855099Storek 		if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bt, p)) != 0)
12955099Storek 			return (error);
13055099Storek 		/* most bits match */
13155099Storek 		st.c_iflag = bt.c_iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK|
13255099Storek 		    ISTRIP|INLCR|IGNCR|ICRNL|IXANY|IMAXBEL);
13355099Storek 		if (bt.c_iflag & IXON)
13455099Storek 			st.c_iflag |= 0x0400;
13555099Storek 		if (bt.c_iflag & IXOFF)
13655099Storek 			st.c_iflag |= 0x1000;
13755099Storek 		st.c_oflag = bt.c_oflag & OPOST;
13855099Storek 		if (bt.c_oflag & ONLCR)
13955099Storek 			st.c_oflag |= 0x0004;
14055099Storek 		if (bt.c_oflag & OXTABS)
14155099Storek 			st.c_oflag |= 0x1800;
14255099Storek 		speed = ttspeedtab(bt.c_ospeed, sptab);
14355099Storek 		st.c_cflag = speed >= 0 ? speed : 0;
14455099Storek 		st.c_cflag |= (bt.c_cflag & CSIZE) >> 4;
14555099Storek 		if (bt.c_cflag & CSTOPB)
14655099Storek 			st.c_cflag |= 0x40;
14755099Storek 		if (bt.c_cflag & PARENB)
14855099Storek 			st.c_cflag |= 0x100;
14955099Storek 		if (bt.c_cflag & PARODD)
15055099Storek 			st.c_cflag |= 0x200;
15155099Storek 		if (bt.c_cflag & HUPCL)
15255099Storek 			st.c_cflag |= 0x400;
15355099Storek 		if (bt.c_cflag & CLOCAL)
15455099Storek 			st.c_cflag |= 0x800;
15555099Storek 		st.c_lflag = 0;
15655099Storek 		if (bt.c_lflag & (ECHOKE|ECHOE|ECHOK))
15755099Storek 			st.c_lflag |= 0x0800;
15855099Storek 		if (bt.c_lflag & ECHO)
15955099Storek 			st.c_lflag |= 0x0008;
16055099Storek 		if (bt.c_lflag & ECHONL)
16155099Storek 			st.c_lflag |= 0x0040;
16255099Storek 		if (bt.c_lflag & ECHOPRT)
16355099Storek 			st.c_lflag |= 0x0400;
16455099Storek 		if (bt.c_lflag & ECHOCTL)
16555099Storek 			st.c_lflag |= 0x0200;
16655099Storek 		if (bt.c_lflag & ISIG)
16755099Storek 			st.c_lflag |= 0x0001;
16855099Storek 		if (bt.c_lflag & ICANON)
16955099Storek 			st.c_lflag |= 0x0002;
17055099Storek 		if (bt.c_lflag & IEXTEN)
17155099Storek 			st.c_lflag |= 0x8000;
17255099Storek 		if (bt.c_lflag & NOFLSH)
17355099Storek 			st.c_lflag |= 0x0080;
17455099Storek #define mapcc(x) ((x) == _POSIX_VDISABLE ? 0 : (x))
17555099Storek 		st.c_cc[0] = mapcc(bt.c_cc[VINTR]);
17655099Storek 		st.c_cc[1] = mapcc(bt.c_cc[VQUIT]);
17755099Storek 		st.c_cc[2] = mapcc(bt.c_cc[VERASE]);
17855099Storek 		st.c_cc[3] = mapcc(bt.c_cc[VKILL]);
17955099Storek 		st.c_cc[4] = mapcc(bt.c_cc[VEOF]);
18055099Storek 		st.c_cc[5] = mapcc(bt.c_cc[VEOL]);
18155099Storek 		st.c_cc[6] = mapcc(bt.c_cc[VEOL2]);
18255099Storek 		st.c_cc[7] = 0;
18355099Storek 		return (copyout((caddr_t)&st, uap->data, sizeof(st)));
18455099Storek 	    }
18555099Storek 	}
18655099Storek 	return (ioctl(p, uap, retval));
18755099Storek }
188