]> git.saurik.com Git - apple/xnu.git/blame - bsd/kern/tty_tty.c
xnu-792.21.3.tar.gz
[apple/xnu.git] / bsd / kern / tty_tty.c
CommitLineData
1c79356b 1/*
5d5c5d0d
A
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
8f6c56a5 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
1c79356b 5 *
8f6c56a5
A
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
8ad349bb 24 * limitations under the License.
8f6c56a5
A
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
1c79356b
A
27 */
28/* Copyright (c) 1997 Apple Computer, Inc. All Rights Reserved */
29/*-
30 * Copyright (c) 1982, 1986, 1991, 1993
31 * The Regents of the University of California. All rights reserved.
32 *
33 * Redistribution and use in source and binary forms, with or without
34 * modification, are permitted provided that the following conditions
35 * are met:
36 * 1. Redistributions of source code must retain the above copyright
37 * notice, this list of conditions and the following disclaimer.
38 * 2. Redistributions in binary form must reproduce the above copyright
39 * notice, this list of conditions and the following disclaimer in the
40 * documentation and/or other materials provided with the distribution.
41 * 3. All advertising materials mentioning features or use of this software
42 * must display the following acknowledgement:
43 * This product includes software developed by the University of
44 * California, Berkeley and its contributors.
45 * 4. Neither the name of the University nor the names of its contributors
46 * may be used to endorse or promote products derived from this software
47 * without specific prior written permission.
48 *
49 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
50 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
51 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
52 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
53 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
54 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
58 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59 * SUCH DAMAGE.
60 *
61 * @(#)tty_tty.c 8.2 (Berkeley) 9/23/93
62 */
63
64/*
65 * Indirect driver for controlling tty.
66 */
67#include <sys/param.h>
68#include <sys/systm.h>
69#include <sys/conf.h>
70#include <sys/ioctl.h>
91447636 71#include <sys/proc_internal.h>
1c79356b 72#include <sys/tty.h>
91447636
A
73#include <sys/vnode_internal.h>
74#include <sys/file_internal.h>
1c79356b
A
75#ifndef NeXT
76#include <sys/kernel.h>
77#ifdef DEVFS
78#include <sys/devfsext.h>
79#endif /*DEVFS*/
80
81static d_open_t cttyopen;
82static d_read_t cttyread;
83static d_write_t cttywrite;
84static d_ioctl_t cttyioctl;
85static d_select_t cttyselect;
86
91447636
A
87#endif /* !NeXT */
88
89/* Forward declarations for cdevsw[] entry */
90/* XXX we should consider making these static */
91int cttyopen(dev_t dev, int flag, int mode, struct proc *p);
92int cttyread(dev_t dev, struct uio *uio, int flag);
93int cttywrite(dev_t dev, struct uio *uio, int flag);
94int cttyioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p);
95int cttyselect(dev_t dev, int flag, void* wql, struct proc *p);
96
97#ifndef NeXT
98
1c79356b
A
99#define CDEV_MAJOR 1
100/* Don't make static, fdesc_vnops uses this. */
101struct cdevsw ctty_cdevsw =
102 { cttyopen, nullclose, cttyread, cttywrite, /*1*/
103 cttyioctl, nullstop, nullreset, nodevtotty,/* tty */
104 cttyselect, nommap, NULL, "ctty", NULL, -1 };
105
106#endif /* !NeXT */
107
108#define cttyvp(p) ((p)->p_flag & P_CONTROLT ? (p)->p_session->s_ttyvp : NULL)
109
110/*ARGSUSED*/
111int
91447636 112cttyopen(__unused dev_t dev, int flag, __unused int mode, struct proc *p)
1c79356b
A
113{
114 struct vnode *ttyvp = cttyvp(p);
91447636 115 struct vfs_context context;
1c79356b
A
116 int error;
117
118 if (ttyvp == NULL)
119 return (ENXIO);
1c79356b 120
91447636 121 context.vc_proc = p;
21362eb3 122 context.vc_ucred = p->p_ucred;
91447636
A
123 error = VNOP_OPEN(ttyvp, flag, &context);
124
1c79356b
A
125 return (error);
126}
127
128/*ARGSUSED*/
129int
91447636 130cttyread(__unused dev_t dev, struct uio *uio, int flag)
1c79356b 131{
91447636
A
132 struct proc *p = current_proc();
133 register struct vnode *ttyvp = cttyvp(p);
134 struct vfs_context context;
1c79356b
A
135 int error;
136
137 if (ttyvp == NULL)
138 return (EIO);
91447636
A
139
140 context.vc_proc = p;
141 context.vc_ucred = NOCRED;
142
143 error = VNOP_READ(ttyvp, uio, flag, &context);
144
1c79356b
A
145 return (error);
146}
147
148/*ARGSUSED*/
149int
91447636 150cttywrite(__unused dev_t dev, struct uio *uio, int flag)
1c79356b 151{
91447636
A
152 struct proc *p = current_proc();
153 register struct vnode *ttyvp = cttyvp(p);
154 struct vfs_context context;
1c79356b
A
155 int error;
156
157 if (ttyvp == NULL)
158 return (EIO);
91447636
A
159
160 context.vc_proc = p;
161 context.vc_ucred = NOCRED;
162
163 error = VNOP_WRITE(ttyvp, uio, flag, &context);
164
1c79356b
A
165 return (error);
166}
167
168/*ARGSUSED*/
169#ifndef NeXT
170static int
171cttyioctl(dev, cmd, addr, flag, p)
172 dev_t dev;
173 int cmd;
174 caddr_t addr;
175 int flag;
176 struct proc *p;
177#else
178int
91447636
A
179cttyioctl(__unused dev_t dev, u_long cmd, caddr_t addr, int flag,
180 struct proc *p)
1c79356b
A
181#endif /* !NeXT */
182{
183 struct vnode *ttyvp = cttyvp(p);
91447636 184 struct vfs_context context;
1c79356b
A
185
186 if (ttyvp == NULL)
187 return (EIO);
188 if (cmd == TIOCSCTTY) /* don't allow controlling tty to be set */
189 return EINVAL; /* to controlling tty -- infinite recursion */
190 if (cmd == TIOCNOTTY) {
191 if (!SESS_LEADER(p)) {
192 p->p_flag &= ~P_CONTROLT;
193 return (0);
194 } else
195 return (EINVAL);
196 }
91447636
A
197 context.vc_proc = p;
198 context.vc_ucred = NOCRED;
199
200 return (VNOP_IOCTL(ttyvp, cmd, addr, flag, &context));
1c79356b
A
201}
202
203/*ARGSUSED*/
204int
91447636 205cttyselect(__unused dev_t dev, int flag, void* wql, struct proc *p)
1c79356b
A
206{
207 struct vnode *ttyvp = cttyvp(p);
91447636
A
208 struct vfs_context context;
209
210 context.vc_proc = p;
211 context.vc_ucred = NOCRED;
1c79356b
A
212
213 if (ttyvp == NULL)
214 return (1); /* try operation to get EOF/failure */
91447636 215 return (VNOP_SELECT(ttyvp, flag, FREAD|FWRITE, wql, &context));
1c79356b
A
216}
217
218#ifndef NeXT
219static ctty_devsw_installed = 0;
220#ifdef DEVFS
221static void *ctty_devfs_token;
222#endif
223
224static void
225ctty_drvinit(void *unused)
226{
227 dev_t dev;
228
229 if( ! ctty_devsw_installed ) {
230 dev = makedev(CDEV_MAJOR,0);
231 cdevsw_add(&dev,&ctty_cdevsw,NULL);
232 ctty_devsw_installed = 1;
233#ifdef DEVFS
234 ctty_devfs_token =
235 devfs_add_devswf(&ctty_cdevsw, 0, DV_CHR, 0, 0,
236 0666, "tty");
237#endif
238 }
239}
240
241SYSINIT(cttydev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,ctty_drvinit,NULL)
242
243
244#endif /* !NeXT */