added my responsibility for the `cpm' port
[unix-history] / sys / kern / tty_tty.c
CommitLineData
15637ed4
RG
1/*-
2 * Copyright (c) 1982, 1986, 1991 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
600f7f07 33 * from: @(#)tty_tty.c 7.15 (Berkeley) 5/28/91
4c45483e 34 * $Id: tty_tty.c,v 1.2 1993/10/16 15:25:05 rgrimes Exp $
15637ed4
RG
35 */
36
37/*
38 * Indirect driver for controlling tty.
39 */
40#include "param.h"
41#include "systm.h"
42#include "conf.h"
43#include "ioctl.h"
44#include "tty.h"
45#include "proc.h"
46#include "vnode.h"
47#include "file.h"
48
49#define cttyvp(p) ((p)->p_flag&SCTTY ? (p)->p_session->s_ttyvp : NULL)
50
51/*ARGSUSED*/
4c45483e 52int
15637ed4
RG
53cttyopen(dev, flag, mode, p)
54 dev_t dev;
55 int flag, mode;
56 struct proc *p;
57{
58 struct vnode *ttyvp = cttyvp(p);
59 int error;
60
61 if (ttyvp == NULL)
62 return (ENXIO);
63 VOP_LOCK(ttyvp);
64 error = VOP_ACCESS(ttyvp,
65 (flag&FREAD ? VREAD : 0) | (flag&FWRITE ? VWRITE : 0), p->p_ucred, p);
66 if (!error)
67 error = VOP_OPEN(ttyvp, flag, NOCRED, p);
68 VOP_UNLOCK(ttyvp);
69 return (error);
70}
71
72/*ARGSUSED*/
4c45483e 73int
15637ed4
RG
74cttyread(dev, uio, flag)
75 dev_t dev;
76 struct uio *uio;
4c45483e 77 int flag;
15637ed4
RG
78{
79 register struct vnode *ttyvp = cttyvp(uio->uio_procp);
80 int error;
81
82 if (ttyvp == NULL)
83 return (EIO);
84 VOP_LOCK(ttyvp);
85 error = VOP_READ(ttyvp, uio, flag, NOCRED);
86 VOP_UNLOCK(ttyvp);
87 return (error);
88}
89
90/*ARGSUSED*/
4c45483e 91int
15637ed4
RG
92cttywrite(dev, uio, flag)
93 dev_t dev;
94 struct uio *uio;
4c45483e 95 int flag;
15637ed4
RG
96{
97 register struct vnode *ttyvp = cttyvp(uio->uio_procp);
98 int error;
99
100 if (ttyvp == NULL)
101 return (EIO);
102 VOP_LOCK(ttyvp);
103 error = VOP_WRITE(ttyvp, uio, flag, NOCRED);
104 VOP_UNLOCK(ttyvp);
105 return (error);
106}
107
108/*ARGSUSED*/
4c45483e 109int
15637ed4
RG
110cttyioctl(dev, cmd, addr, flag, p)
111 dev_t dev;
112 int cmd;
113 caddr_t addr;
114 int flag;
115 struct proc *p;
116{
117 struct vnode *ttyvp = cttyvp(p);
118
119 if (ttyvp == NULL)
120 return (EIO);
4c45483e
GW
121 if (cmd == TIOCSCTTY) /* don't allow controlling tty to be set */
122 return EINVAL; /* to controlling tty - infinite recursion */
123 else if (cmd == TIOCNOTTY) {
15637ed4
RG
124 if (!SESS_LEADER(p)) {
125 p->p_flag &= ~SCTTY;
126 return (0);
127 } else
128 return (EINVAL);
129 }
130 return (VOP_IOCTL(ttyvp, cmd, addr, flag, NOCRED, p));
131}
132
133/*ARGSUSED*/
4c45483e 134int
15637ed4
RG
135cttyselect(dev, flag, p)
136 dev_t dev;
137 int flag;
138 struct proc *p;
139{
140 struct vnode *ttyvp = cttyvp(p);
141
142 if (ttyvp == NULL)
143 return (1); /* try operation to get EOF/failure */
144 return (VOP_SELECT(ttyvp, flag, FREAD|FWRITE, NOCRED, p));
145}