|
|
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.