xref: /csrg-svn/sys/kern/tty_tty.c (revision 47648)
123393Smckusick /*
229112Smckusick  * Copyright (c) 1982, 1986 Regents of the University of California.
323393Smckusick  * All rights reserved.  The Berkeley software License Agreement
423393Smckusick  * specifies the terms and conditions for redistribution.
523393Smckusick  *
6*47648Skarels  *	@(#)tty_tty.c	7.11 (Berkeley) 03/24/91
723393Smckusick  */
835Sbill 
935Sbill /*
103117Swnj  * Indirect driver for controlling tty.
1135Sbill  */
1217097Sbloom #include "param.h"
1317097Sbloom #include "systm.h"
1417097Sbloom #include "conf.h"
1517097Sbloom #include "ioctl.h"
1617097Sbloom #include "tty.h"
1717097Sbloom #include "proc.h"
1839554Smarc #include "vnode.h"
1939554Smarc #include "file.h"
2035Sbill 
2139554Smarc #define cttyvp(p) ((p)->p_flag&SCTTY ? (p)->p_session->s_ttyvp : NULL)
2239554Smarc 
2335Sbill /*ARGSUSED*/
24*47648Skarels cttyopen(dev, flag, mode, p)
258558Sroot 	dev_t dev;
26*47648Skarels 	int flag, mode;
27*47648Skarels 	struct proc *p;
2835Sbill {
2947545Skarels 	struct vnode *ttyvp = cttyvp(p);
3039554Smarc 	int error;
3135Sbill 
3239554Smarc 	if (ttyvp == NULL)
338558Sroot 		return (ENXIO);
3441191Smckusick 	VOP_LOCK(ttyvp);
3541191Smckusick 	error = VOP_ACCESS(ttyvp,
3647545Skarels 	   (flag&FREAD ? VREAD : 0) | (flag&FWRITE ? VWRITE : 0), p->p_ucred);
3741191Smckusick 	VOP_UNLOCK(ttyvp);
3841191Smckusick 	if (error)
3939554Smarc 		return (error);
4039554Smarc 	return (VOP_OPEN(ttyvp, flag, NOCRED));
4135Sbill }
4235Sbill 
4335Sbill /*ARGSUSED*/
44*47648Skarels cttyread(dev, uio, flag, p)
457824Sroot 	dev_t dev;
467824Sroot 	struct uio *uio;
47*47648Skarels 	struct proc *p;
4835Sbill {
49*47648Skarels 	register struct vnode *ttyvp = cttyvp(p);
5039589Smckusick 	int error;
5135Sbill 
5239554Smarc 	if (ttyvp == NULL)
53*47648Skarels 		return (EIO);
5439589Smckusick 	VOP_LOCK(ttyvp);
5539589Smckusick 	error = VOP_READ(ttyvp, uio, flag, NOCRED);
5639589Smckusick 	VOP_UNLOCK(ttyvp);
5739589Smckusick 	return (error);
5835Sbill }
5935Sbill 
6035Sbill /*ARGSUSED*/
61*47648Skarels cttywrite(dev, uio, flag, p)
627824Sroot 	dev_t dev;
637824Sroot 	struct uio *uio;
64*47648Skarels 	struct proc *p;
6535Sbill {
66*47648Skarels 	register struct vnode *ttyvp = cttyvp(p);
6739589Smckusick 	int error;
6835Sbill 
6939554Smarc 	if (ttyvp == NULL)
70*47648Skarels 		return (EIO);
7139589Smckusick 	VOP_LOCK(ttyvp);
7239589Smckusick 	error = VOP_WRITE(ttyvp, uio, flag, NOCRED);
7339589Smckusick 	VOP_UNLOCK(ttyvp);
7439589Smckusick 	return (error);
7535Sbill }
7635Sbill 
7735Sbill /*ARGSUSED*/
78*47648Skarels cttyioctl(dev, cmd, addr, flag, p)
795618Sroot 	dev_t dev;
805618Sroot 	int cmd;
815618Sroot 	caddr_t addr;
825618Sroot 	int flag;
83*47648Skarels 	struct proc *p;
8435Sbill {
85*47648Skarels 	struct vnode *ttyvp = cttyvp(p);
8635Sbill 
8739554Smarc 	if (ttyvp == NULL)
88*47648Skarels 		return (EIO);
895390Swnj 	if (cmd == TIOCNOTTY) {
90*47648Skarels 		if (!SESS_LEADER(p)) {
91*47648Skarels 			p->p_flag &= ~SCTTY;
9239554Smarc 			return (0);
9339554Smarc 		} else
9439554Smarc 			return (EINVAL);
955390Swnj 	}
9639554Smarc 	return (VOP_IOCTL(ttyvp, cmd, addr, flag, NOCRED));
9735Sbill }
984487Swnj 
998591Sroot /*ARGSUSED*/
100*47648Skarels cttyselect(dev, flag, p)
1018591Sroot 	dev_t dev;
1028591Sroot 	int flag;
103*47648Skarels 	struct proc *p;
1044487Swnj {
105*47648Skarels 	struct vnode *ttyvp = cttyvp(p);
1064487Swnj 
10739554Smarc 	if (ttyvp == NULL)
10843382Skarels 		return (1);	/* try operation to get EOF/failure */
10940187Smckusick 	return (VOP_SELECT(ttyvp, flag, FREAD|FWRITE, NOCRED));
1104487Swnj }
111