xref: /csrg-svn/sys/kern/tty_tty.c (revision 49177)
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*49177Skarels  *	@(#)tty_tty.c	7.13 (Berkeley) 05/05/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*/
2447648Skarels cttyopen(dev, flag, mode, p)
258558Sroot 	dev_t dev;
2647648Skarels 	int flag, mode;
2747648Skarels 	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,
3648018Smckusick 	  (flag&FREAD ? VREAD : 0) | (flag&FWRITE ? VWRITE : 0), p->p_ucred, p);
3741191Smckusick 	VOP_UNLOCK(ttyvp);
3841191Smckusick 	if (error)
3939554Smarc 		return (error);
4048018Smckusick 	return (VOP_OPEN(ttyvp, flag, NOCRED, p));
4135Sbill }
4235Sbill 
4335Sbill /*ARGSUSED*/
44*49177Skarels cttyread(dev, uio, flag)
457824Sroot 	dev_t dev;
467824Sroot 	struct uio *uio;
4735Sbill {
48*49177Skarels 	register struct vnode *ttyvp = cttyvp(uio->uio_procp);
4939589Smckusick 	int error;
5035Sbill 
5139554Smarc 	if (ttyvp == NULL)
5247648Skarels 		return (EIO);
5339589Smckusick 	VOP_LOCK(ttyvp);
5439589Smckusick 	error = VOP_READ(ttyvp, uio, flag, NOCRED);
5539589Smckusick 	VOP_UNLOCK(ttyvp);
5639589Smckusick 	return (error);
5735Sbill }
5835Sbill 
5935Sbill /*ARGSUSED*/
60*49177Skarels cttywrite(dev, uio, flag)
617824Sroot 	dev_t dev;
627824Sroot 	struct uio *uio;
6335Sbill {
64*49177Skarels 	register struct vnode *ttyvp = cttyvp(uio->uio_procp);
6539589Smckusick 	int error;
6635Sbill 
6739554Smarc 	if (ttyvp == NULL)
6847648Skarels 		return (EIO);
6939589Smckusick 	VOP_LOCK(ttyvp);
7039589Smckusick 	error = VOP_WRITE(ttyvp, uio, flag, NOCRED);
7139589Smckusick 	VOP_UNLOCK(ttyvp);
7239589Smckusick 	return (error);
7335Sbill }
7435Sbill 
7535Sbill /*ARGSUSED*/
7647648Skarels cttyioctl(dev, cmd, addr, flag, p)
775618Sroot 	dev_t dev;
785618Sroot 	int cmd;
795618Sroot 	caddr_t addr;
805618Sroot 	int flag;
8147648Skarels 	struct proc *p;
8235Sbill {
8347648Skarels 	struct vnode *ttyvp = cttyvp(p);
8435Sbill 
8539554Smarc 	if (ttyvp == NULL)
8647648Skarels 		return (EIO);
875390Swnj 	if (cmd == TIOCNOTTY) {
8847648Skarels 		if (!SESS_LEADER(p)) {
8947648Skarels 			p->p_flag &= ~SCTTY;
9039554Smarc 			return (0);
9139554Smarc 		} else
9239554Smarc 			return (EINVAL);
935390Swnj 	}
9448018Smckusick 	return (VOP_IOCTL(ttyvp, cmd, addr, flag, NOCRED, p));
9535Sbill }
964487Swnj 
978591Sroot /*ARGSUSED*/
9847648Skarels cttyselect(dev, flag, p)
998591Sroot 	dev_t dev;
1008591Sroot 	int flag;
10147648Skarels 	struct proc *p;
1024487Swnj {
10347648Skarels 	struct vnode *ttyvp = cttyvp(p);
1044487Swnj 
10539554Smarc 	if (ttyvp == NULL)
10643382Skarels 		return (1);	/* try operation to get EOF/failure */
10748018Smckusick 	return (VOP_SELECT(ttyvp, flag, FREAD|FWRITE, NOCRED, p));
1084487Swnj }
109