xref: /csrg-svn/sys/kern/tty_tty.c (revision 48018)
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*48018Smckusick  *	@(#)tty_tty.c	7.12 (Berkeley) 04/15/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,
36*48018Smckusick 	  (flag&FREAD ? VREAD : 0) | (flag&FWRITE ? VWRITE : 0), p->p_ucred, p);
3741191Smckusick 	VOP_UNLOCK(ttyvp);
3841191Smckusick 	if (error)
3939554Smarc 		return (error);
40*48018Smckusick 	return (VOP_OPEN(ttyvp, flag, NOCRED, p));
4135Sbill }
4235Sbill 
4335Sbill /*ARGSUSED*/
4447648Skarels cttyread(dev, uio, flag, p)
457824Sroot 	dev_t dev;
467824Sroot 	struct uio *uio;
4747648Skarels 	struct proc *p;
4835Sbill {
4947648Skarels 	register struct vnode *ttyvp = cttyvp(p);
5039589Smckusick 	int error;
5135Sbill 
5239554Smarc 	if (ttyvp == NULL)
5347648Skarels 		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*/
6147648Skarels cttywrite(dev, uio, flag, p)
627824Sroot 	dev_t dev;
637824Sroot 	struct uio *uio;
6447648Skarels 	struct proc *p;
6535Sbill {
6647648Skarels 	register struct vnode *ttyvp = cttyvp(p);
6739589Smckusick 	int error;
6835Sbill 
6939554Smarc 	if (ttyvp == NULL)
7047648Skarels 		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*/
7847648Skarels cttyioctl(dev, cmd, addr, flag, p)
795618Sroot 	dev_t dev;
805618Sroot 	int cmd;
815618Sroot 	caddr_t addr;
825618Sroot 	int flag;
8347648Skarels 	struct proc *p;
8435Sbill {
8547648Skarels 	struct vnode *ttyvp = cttyvp(p);
8635Sbill 
8739554Smarc 	if (ttyvp == NULL)
8847648Skarels 		return (EIO);
895390Swnj 	if (cmd == TIOCNOTTY) {
9047648Skarels 		if (!SESS_LEADER(p)) {
9147648Skarels 			p->p_flag &= ~SCTTY;
9239554Smarc 			return (0);
9339554Smarc 		} else
9439554Smarc 			return (EINVAL);
955390Swnj 	}
96*48018Smckusick 	return (VOP_IOCTL(ttyvp, cmd, addr, flag, NOCRED, p));
9735Sbill }
984487Swnj 
998591Sroot /*ARGSUSED*/
10047648Skarels cttyselect(dev, flag, p)
1018591Sroot 	dev_t dev;
1028591Sroot 	int flag;
10347648Skarels 	struct proc *p;
1044487Swnj {
10547648Skarels 	struct vnode *ttyvp = cttyvp(p);
1064487Swnj 
10739554Smarc 	if (ttyvp == NULL)
10843382Skarels 		return (1);	/* try operation to get EOF/failure */
109*48018Smckusick 	return (VOP_SELECT(ttyvp, flag, FREAD|FWRITE, NOCRED, p));
1104487Swnj }
111