|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /* Copyright (c) 1997 Apple Computer, Inc. All Rights Reserved */
23: /*-
24: * Copyright (c) 1982, 1986, 1991, 1993
25: * The Regents of the University of California. All rights reserved.
26: *
27: * Redistribution and use in source and binary forms, with or without
28: * modification, are permitted provided that the following conditions
29: * are met:
30: * 1. Redistributions of source code must retain the above copyright
31: * notice, this list of conditions and the following disclaimer.
32: * 2. Redistributions in binary form must reproduce the above copyright
33: * notice, this list of conditions and the following disclaimer in the
34: * documentation and/or other materials provided with the distribution.
35: * 3. All advertising materials mentioning features or use of this software
36: * must display the following acknowledgement:
37: * This product includes software developed by the University of
38: * California, Berkeley and its contributors.
39: * 4. Neither the name of the University nor the names of its contributors
40: * may be used to endorse or promote products derived from this software
41: * without specific prior written permission.
42: *
43: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
44: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
47: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53: * SUCH DAMAGE.
54: *
55: * @(#)tty_tty.c 8.2 (Berkeley) 9/23/93
56: */
57:
58: /*
59: * Indirect driver for controlling tty.
60: */
61: #include <sys/param.h>
62: #include <sys/systm.h>
63: #include <sys/conf.h>
64: #include <sys/ioctl.h>
65: #include <sys/proc.h>
66: #include <sys/tty.h>
67: #include <sys/vnode.h>
68: #include <sys/file.h>
69: #ifndef NeXT
70: #include <sys/kernel.h>
71: #ifdef DEVFS
72: #include <sys/devfsext.h>
73: #endif /*DEVFS*/
74:
75: static d_open_t cttyopen;
76: static d_read_t cttyread;
77: static d_write_t cttywrite;
78: static d_ioctl_t cttyioctl;
79: static d_select_t cttyselect;
80:
81: #define CDEV_MAJOR 1
82: /* Don't make static, fdesc_vnops uses this. */
83: struct cdevsw ctty_cdevsw =
84: { cttyopen, nullclose, cttyread, cttywrite, /*1*/
85: cttyioctl, nullstop, nullreset, nodevtotty,/* tty */
86: cttyselect, nommap, NULL, "ctty", NULL, -1 };
87:
88: #endif /* !NeXT */
89:
90: #define cttyvp(p) ((p)->p_flag & P_CONTROLT ? (p)->p_session->s_ttyvp : NULL)
91:
92: /*ARGSUSED*/
93: int
94: cttyopen(dev, flag, mode, p)
95: dev_t dev;
96: int flag, mode;
97: struct proc *p;
98: {
99: struct vnode *ttyvp = cttyvp(p);
100: int error;
101:
102: if (ttyvp == NULL)
103: return (ENXIO);
104: #ifndef NeXT
105: VOP_LOCK(ttyvp);
106: #else
107: /*
108: * This is the only place that NeXT Guarding has been used for
109: * VOP_.*LOCK style calls. Note all of the other diffs should
110: * use the three paramater lock/unlock.
111: */
112: vn_lock(ttyvp, LK_EXCLUSIVE | LK_RETRY, p);
113: #endif
114:
115: #ifdef PARANOID
116: /*
117: * Since group is tty and mode is 620 on most terminal lines
118: * and since sessions protect terminals from processes outside
119: * your session, this check is probably no longer necessary.
120: * Since it inhibits setuid root programs that later switch
121: * to another user from accessing /dev/tty, we have decided
122: * to delete this test. (mckusick 5/93)
123: */
124: error = VOP_ACCESS(ttyvp,
125: (flag&FREAD ? VREAD : 0) | (flag&FWRITE ? VWRITE : 0), p->p_ucred, p);
126: if (!error)
127: #endif /* PARANOID */
128: error = VOP_OPEN(ttyvp, flag, NOCRED, p);
129: VOP_UNLOCK(ttyvp, 0, p);
130: return (error);
131: }
132:
133: /*ARGSUSED*/
134: int
135: cttyread(dev, uio, flag)
136: dev_t dev;
137: struct uio *uio;
138: int flag;
139: {
140: struct proc *p = uio->uio_procp;
141: register struct vnode *ttyvp = cttyvp(uio->uio_procp);
142: int error;
143:
144: if (ttyvp == NULL)
145: return (EIO);
146: vn_lock(ttyvp, LK_EXCLUSIVE | LK_RETRY, p);
147: error = VOP_READ(ttyvp, uio, flag, NOCRED);
148: VOP_UNLOCK(ttyvp, 0, p);
149: return (error);
150: }
151:
152: /*ARGSUSED*/
153: int
154: cttywrite(dev, uio, flag)
155: dev_t dev;
156: struct uio *uio;
157: int flag;
158: {
159: struct proc *p = uio->uio_procp;
160: register struct vnode *ttyvp = cttyvp(uio->uio_procp);
161: int error;
162:
163: if (ttyvp == NULL)
164: return (EIO);
165: vn_lock(ttyvp, LK_EXCLUSIVE | LK_RETRY, p);
166: error = VOP_WRITE(ttyvp, uio, flag, NOCRED);
167: VOP_UNLOCK(ttyvp, 0, p);
168: return (error);
169: }
170:
171: /*ARGSUSED*/
172: #ifndef NeXT
173: static int
174: cttyioctl(dev, cmd, addr, flag, p)
175: dev_t dev;
176: int cmd;
177: caddr_t addr;
178: int flag;
179: struct proc *p;
180: #else
181: int
182: cttyioctl(dev, cmd, addr, flag, p)
183: dev_t dev;
184: u_long cmd;
185: caddr_t addr;
186: int flag;
187: struct proc *p;
188: #endif /* !NeXT */
189: {
190: struct vnode *ttyvp = cttyvp(p);
191:
192: if (ttyvp == NULL)
193: return (EIO);
194: if (cmd == TIOCSCTTY) /* don't allow controlling tty to be set */
195: return EINVAL; /* to controlling tty -- infinite recursion */
196: if (cmd == TIOCNOTTY) {
197: if (!SESS_LEADER(p)) {
198: p->p_flag &= ~P_CONTROLT;
199: return (0);
200: } else
201: return (EINVAL);
202: }
203: return (VOP_IOCTL(ttyvp, cmd, addr, flag, NOCRED, p));
204: }
205:
206: /*ARGSUSED*/
207: int
208: cttyselect(dev, flag, p)
209: dev_t dev;
210: int flag;
211: struct proc *p;
212: {
213: struct vnode *ttyvp = cttyvp(p);
214:
215: if (ttyvp == NULL)
216: return (1); /* try operation to get EOF/failure */
217: return (VOP_SELECT(ttyvp, flag, FREAD|FWRITE, NOCRED, p));
218: }
219:
220: #ifndef NeXT
221: static ctty_devsw_installed = 0;
222: #ifdef DEVFS
223: static void *ctty_devfs_token;
224: #endif
225:
226: static void
227: ctty_drvinit(void *unused)
228: {
229: dev_t dev;
230:
231: if( ! ctty_devsw_installed ) {
232: dev = makedev(CDEV_MAJOR,0);
233: cdevsw_add(&dev,&ctty_cdevsw,NULL);
234: ctty_devsw_installed = 1;
235: #ifdef DEVFS
236: ctty_devfs_token =
237: devfs_add_devswf(&ctty_cdevsw, 0, DV_CHR, 0, 0,
238: 0666, "tty");
239: #endif
240: }
241: }
242:
243: SYSINIT(cttydev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,ctty_drvinit,NULL)
244:
245:
246: #endif /* !NeXT */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.