123393Smckusick /* 229112Smckusick * Copyright (c) 1982, 1986 Regents of the University of California. 323393Smckusick * All rights reserved. The Berkeley software License Agreement 423393Smckusick * specifies the terms and conditions for redistribution. 523393Smckusick * 6*49177Skarels * @(#)tty_tty.c 7.13 (Berkeley) 05/05/91 723393Smckusick */ 835Sbill 935Sbill /* 103117Swnj * Indirect driver for controlling tty. 1135Sbill */ 1217097Sbloom #include "param.h" 1317097Sbloom #include "systm.h" 1417097Sbloom #include "conf.h" 1517097Sbloom #include "ioctl.h" 1617097Sbloom #include "tty.h" 1717097Sbloom #include "proc.h" 1839554Smarc #include "vnode.h" 1939554Smarc #include "file.h" 2035Sbill 2139554Smarc #define cttyvp(p) ((p)->p_flag&SCTTY ? (p)->p_session->s_ttyvp : NULL) 2239554Smarc 2335Sbill /*ARGSUSED*/ 2447648Skarels cttyopen(dev, flag, mode, p) 258558Sroot dev_t dev; 2647648Skarels int flag, mode; 2747648Skarels struct proc *p; 2835Sbill { 2947545Skarels struct vnode *ttyvp = cttyvp(p); 3039554Smarc int error; 3135Sbill 3239554Smarc if (ttyvp == NULL) 338558Sroot return (ENXIO); 3441191Smckusick VOP_LOCK(ttyvp); 3541191Smckusick error = VOP_ACCESS(ttyvp, 3648018Smckusick (flag&FREAD ? VREAD : 0) | (flag&FWRITE ? VWRITE : 0), p->p_ucred, p); 3741191Smckusick VOP_UNLOCK(ttyvp); 3841191Smckusick if (error) 3939554Smarc return (error); 4048018Smckusick return (VOP_OPEN(ttyvp, flag, NOCRED, p)); 4135Sbill } 4235Sbill 4335Sbill /*ARGSUSED*/ 44*49177Skarels cttyread(dev, uio, flag) 457824Sroot dev_t dev; 467824Sroot struct uio *uio; 4735Sbill { 48*49177Skarels register struct vnode *ttyvp = cttyvp(uio->uio_procp); 4939589Smckusick int error; 5035Sbill 5139554Smarc if (ttyvp == NULL) 5247648Skarels return (EIO); 5339589Smckusick VOP_LOCK(ttyvp); 5439589Smckusick error = VOP_READ(ttyvp, uio, flag, NOCRED); 5539589Smckusick VOP_UNLOCK(ttyvp); 5639589Smckusick return (error); 5735Sbill } 5835Sbill 5935Sbill /*ARGSUSED*/ 60*49177Skarels cttywrite(dev, uio, flag) 617824Sroot dev_t dev; 627824Sroot struct uio *uio; 6335Sbill { 64*49177Skarels register struct vnode *ttyvp = cttyvp(uio->uio_procp); 6539589Smckusick int error; 6635Sbill 6739554Smarc if (ttyvp == NULL) 6847648Skarels return (EIO); 6939589Smckusick VOP_LOCK(ttyvp); 7039589Smckusick error = VOP_WRITE(ttyvp, uio, flag, NOCRED); 7139589Smckusick VOP_UNLOCK(ttyvp); 7239589Smckusick return (error); 7335Sbill } 7435Sbill 7535Sbill /*ARGSUSED*/ 7647648Skarels cttyioctl(dev, cmd, addr, flag, p) 775618Sroot dev_t dev; 785618Sroot int cmd; 795618Sroot caddr_t addr; 805618Sroot int flag; 8147648Skarels struct proc *p; 8235Sbill { 8347648Skarels struct vnode *ttyvp = cttyvp(p); 8435Sbill 8539554Smarc if (ttyvp == NULL) 8647648Skarels return (EIO); 875390Swnj if (cmd == TIOCNOTTY) { 8847648Skarels if (!SESS_LEADER(p)) { 8947648Skarels p->p_flag &= ~SCTTY; 9039554Smarc return (0); 9139554Smarc } else 9239554Smarc return (EINVAL); 935390Swnj } 9448018Smckusick return (VOP_IOCTL(ttyvp, cmd, addr, flag, NOCRED, p)); 9535Sbill } 964487Swnj 978591Sroot /*ARGSUSED*/ 9847648Skarels cttyselect(dev, flag, p) 998591Sroot dev_t dev; 1008591Sroot int flag; 10147648Skarels struct proc *p; 1024487Swnj { 10347648Skarels struct vnode *ttyvp = cttyvp(p); 1044487Swnj 10539554Smarc if (ttyvp == NULL) 10643382Skarels return (1); /* try operation to get EOF/failure */ 10748018Smckusick return (VOP_SELECT(ttyvp, flag, FREAD|FWRITE, NOCRED, p)); 1084487Swnj } 109