Annotation of XNU/bsd/kern/tty_tty.c, revision 1.1.1.1

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 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.