xref: /original-bsd/sys/kern/tty_tty.c (revision 1e29b3fc)
1 /*-
2  * Copyright (c) 1982, 1986, 1991 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  *
7  *	@(#)tty_tty.c	7.19 (Berkeley) 07/03/92
8  */
9 
10 /*
11  * Indirect driver for controlling tty.
12  */
13 #include "param.h"
14 #include "systm.h"
15 #include "conf.h"
16 #include "ioctl.h"
17 #include "proc.h"
18 #include "tty.h"
19 #include "vnode.h"
20 #include "file.h"
21 
22 #define cttyvp(p) ((p)->p_flag&SCTTY ? (p)->p_session->s_ttyvp : NULL)
23 
24 /*ARGSUSED*/
25 cttyopen(dev, flag, mode, p)
26 	dev_t dev;
27 	int flag, mode;
28 	struct proc *p;
29 {
30 	struct vnode *ttyvp = cttyvp(p);
31 	int error;
32 
33 	if (ttyvp == NULL)
34 		return (ENXIO);
35 	VOP_LOCK(ttyvp);
36 	error = VOP_ACCESS(ttyvp,
37 	  (flag&FREAD ? VREAD : 0) | (flag&FWRITE ? VWRITE : 0), p->p_ucred, p);
38 	if (!error)
39 		error = VOP_OPEN(ttyvp, flag, NOCRED, p);
40 	VOP_UNLOCK(ttyvp);
41 	return (error);
42 }
43 
44 /*ARGSUSED*/
45 cttyread(dev, uio, flag)
46 	dev_t dev;
47 	struct uio *uio;
48 	int flag;
49 {
50 	register struct vnode *ttyvp = cttyvp(uio->uio_procp);
51 	int error;
52 
53 	if (ttyvp == NULL)
54 		return (EIO);
55 	VOP_LOCK(ttyvp);
56 	error = VOP_READ(ttyvp, uio, flag, NOCRED);
57 	VOP_UNLOCK(ttyvp);
58 	return (error);
59 }
60 
61 /*ARGSUSED*/
62 cttywrite(dev, uio, flag)
63 	dev_t dev;
64 	struct uio *uio;
65 	int flag;
66 {
67 	register struct vnode *ttyvp = cttyvp(uio->uio_procp);
68 	int error;
69 
70 	if (ttyvp == NULL)
71 		return (EIO);
72 	VOP_LOCK(ttyvp);
73 	error = VOP_WRITE(ttyvp, uio, flag, NOCRED);
74 	VOP_UNLOCK(ttyvp);
75 	return (error);
76 }
77 
78 /*ARGSUSED*/
79 cttyioctl(dev, cmd, addr, flag, p)
80 	dev_t dev;
81 	int cmd;
82 	caddr_t addr;
83 	int flag;
84 	struct proc *p;
85 {
86 	struct vnode *ttyvp = cttyvp(p);
87 
88 	if (ttyvp == NULL)
89 		return (EIO);
90 	if (cmd == TIOCNOTTY) {
91 		if (!SESS_LEADER(p)) {
92 			p->p_flag &= ~SCTTY;
93 			return (0);
94 		} else
95 			return (EINVAL);
96 	}
97 	return (VOP_IOCTL(ttyvp, cmd, addr, flag, NOCRED, p));
98 }
99 
100 /*ARGSUSED*/
101 cttyselect(dev, flag, p)
102 	dev_t dev;
103 	int flag;
104 	struct proc *p;
105 {
106 	struct vnode *ttyvp = cttyvp(p);
107 
108 	if (ttyvp == NULL)
109 		return (1);	/* try operation to get EOF/failure */
110 	return (VOP_SELECT(ttyvp, flag, FREAD|FWRITE, NOCRED, p));
111 }
112