xref: /original-bsd/sys/kern/tty_tty.c (revision 0997b878)
1 /*-
2  * Copyright (c) 1982, 1986, 1991, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  *
7  *	@(#)tty_tty.c	8.3 (Berkeley) 01/09/95
8  */
9 
10 /*
11  * Indirect driver for controlling tty.
12  */
13 #include <sys/param.h>
14 #include <sys/systm.h>
15 #include <sys/conf.h>
16 #include <sys/ioctl.h>
17 #include <sys/proc.h>
18 #include <sys/tty.h>
19 #include <sys/vnode.h>
20 #include <sys/file.h>
21 
22 #define cttyvp(p) ((p)->p_flag & P_CONTROLT ? (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 #ifdef PARANOID
37 	/*
38 	 * Since group is tty and mode is 620 on most terminal lines
39 	 * and since sessions protect terminals from processes outside
40 	 * your session, this check is probably no longer necessary.
41 	 * Since it inhibits setuid root programs that later switch
42 	 * to another user from accessing /dev/tty, we have decided
43 	 * to delete this test. (mckusick 5/93)
44 	 */
45 	error = VOP_ACCESS(ttyvp,
46 	  (flag&FREAD ? VREAD : 0) | (flag&FWRITE ? VWRITE : 0), p->p_ucred, p);
47 	if (!error)
48 #endif /* PARANOID */
49 		error = VOP_OPEN(ttyvp, flag, NOCRED, p);
50 	VOP_UNLOCK(ttyvp);
51 	return (error);
52 }
53 
54 /*ARGSUSED*/
55 cttyread(dev, uio, flag)
56 	dev_t dev;
57 	struct uio *uio;
58 	int flag;
59 {
60 	register struct vnode *ttyvp = cttyvp(uio->uio_procp);
61 	int error;
62 
63 	if (ttyvp == NULL)
64 		return (EIO);
65 	VOP_LOCK(ttyvp);
66 	error = VOP_READ(ttyvp, uio, flag, NOCRED);
67 	VOP_UNLOCK(ttyvp);
68 	return (error);
69 }
70 
71 /*ARGSUSED*/
72 cttywrite(dev, uio, flag)
73 	dev_t dev;
74 	struct uio *uio;
75 	int flag;
76 {
77 	register struct vnode *ttyvp = cttyvp(uio->uio_procp);
78 	int error;
79 
80 	if (ttyvp == NULL)
81 		return (EIO);
82 	VOP_LOCK(ttyvp);
83 	error = VOP_WRITE(ttyvp, uio, flag, NOCRED);
84 	VOP_UNLOCK(ttyvp);
85 	return (error);
86 }
87 
88 /*ARGSUSED*/
89 cttyioctl(dev, cmd, addr, flag, p)
90 	dev_t dev;
91 	u_long cmd;
92 	caddr_t addr;
93 	int flag;
94 	struct proc *p;
95 {
96 	struct vnode *ttyvp = cttyvp(p);
97 
98 	if (ttyvp == NULL)
99 		return (EIO);
100 	if (cmd == TIOCNOTTY) {
101 		if (!SESS_LEADER(p)) {
102 			p->p_flag &= ~P_CONTROLT;
103 			return (0);
104 		} else
105 			return (EINVAL);
106 	}
107 	return (VOP_IOCTL(ttyvp, cmd, addr, flag, NOCRED, p));
108 }
109 
110 /*ARGSUSED*/
111 cttyselect(dev, flag, p)
112 	dev_t dev;
113 	int flag;
114 	struct proc *p;
115 {
116 	struct vnode *ttyvp = cttyvp(p);
117 
118 	if (ttyvp == NULL)
119 		return (1);	/* try operation to get EOF/failure */
120 	return (VOP_SELECT(ttyvp, flag, FREAD|FWRITE, NOCRED, p));
121 }
122