]>
git.saurik.com Git - apple/xnu.git/blob - bsd/kern/tty_tty.c
   2  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. 
   4  * @APPLE_LICENSE_HEADER_START@ 
   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. 
  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 
  20  * @APPLE_LICENSE_HEADER_END@ 
  22 /* Copyright (c) 1997 Apple Computer, Inc. All Rights Reserved */ 
  24  * Copyright (c) 1982, 1986, 1991, 1993 
  25  *      The Regents of the University of California.  All rights reserved. 
  27  * Redistribution and use in source and binary forms, with or without 
  28  * modification, are permitted provided that the following conditions 
  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. 
  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 
  55  *      @(#)tty_tty.c   8.2 (Berkeley) 9/23/93 
  59  * Indirect driver for controlling tty. 
  61 #include <sys/param.h> 
  62 #include <sys/systm.h> 
  64 #include <sys/ioctl.h> 
  67 #include <sys/vnode.h> 
  70 #include <sys/kernel.h> 
  72 #include <sys/devfsext.h> 
  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
; 
  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 }; 
  90 #define cttyvp(p) ((p)->p_flag & P_CONTROLT ? (p)->p_session->s_ttyvp : NULL) 
  94 cttyopen(dev
, flag
, mode
, p
) 
  99         struct vnode 
*ttyvp 
= cttyvp(p
); 
 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. 
 112         vn_lock(ttyvp
, LK_EXCLUSIVE 
| LK_RETRY
, p
); 
 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) 
 124         error 
= VOP_ACCESS(ttyvp
, 
 125           (flag
&FREAD 
? VREAD 
: 0) | (flag
&FWRITE 
? VWRITE 
: 0), p
->p_ucred
, p
); 
 127 #endif /* PARANOID */ 
 128                 error 
= VOP_OPEN(ttyvp
, flag
, NOCRED
, p
); 
 129         VOP_UNLOCK(ttyvp
, 0, p
); 
 135 cttyread(dev
, uio
, flag
) 
 140         struct proc 
*p 
= uio
->uio_procp
; 
 141         register struct vnode 
*ttyvp 
= cttyvp(uio
->uio_procp
); 
 146         vn_lock(ttyvp
, LK_EXCLUSIVE 
| LK_RETRY
, p
); 
 147         error 
= VOP_READ(ttyvp
, uio
, flag
, NOCRED
); 
 148         VOP_UNLOCK(ttyvp
, 0, p
); 
 154 cttywrite(dev
, uio
, flag
) 
 159         struct proc 
*p 
= uio
->uio_procp
; 
 160         register struct vnode 
*ttyvp 
= cttyvp(uio
->uio_procp
); 
 165         vn_lock(ttyvp
, LK_EXCLUSIVE 
| LK_RETRY
, p
); 
 166         error 
= VOP_WRITE(ttyvp
, uio
, flag
, NOCRED
); 
 167         VOP_UNLOCK(ttyvp
, 0, p
); 
 174 cttyioctl(dev
, cmd
, addr
, flag
, p
) 
 182 cttyioctl(dev
, cmd
, addr
, flag
, p
) 
 190         struct vnode 
*ttyvp 
= cttyvp(p
); 
 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
; 
 203         return (VOP_IOCTL(ttyvp
, cmd
, addr
, flag
, NOCRED
, p
)); 
 208 cttyselect(dev
, flag
, p
) 
 213         struct vnode 
*ttyvp 
= cttyvp(p
); 
 216                 return (1);     /* try operation to get EOF/failure */ 
 217         return (VOP_SELECT(ttyvp
, flag
, FREAD
|FWRITE
, NOCRED
, p
)); 
 221 static ctty_devsw_installed 
= 0; 
 223 static  void    *ctty_devfs_token
; 
 227 ctty_drvinit(void *unused
) 
 231         if( ! ctty_devsw_installed 
) { 
 232                 dev 
= makedev(CDEV_MAJOR
,0); 
 233                 cdevsw_add(&dev
,&ctty_cdevsw
,NULL
); 
 234                 ctty_devsw_installed 
= 1; 
 237                         devfs_add_devswf(&ctty_cdevsw
, 0, DV_CHR
, 0, 0,  
 243 SYSINIT(cttydev
,SI_SUB_DRIVERS
,SI_ORDER_MIDDLE
+CDEV_MAJOR
,ctty_drvinit
,NULL
)