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*48018Smckusick * @(#)tty_tty.c 7.12 (Berkeley) 04/15/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, 36*48018Smckusick (flag&FREAD ? VREAD : 0) | (flag&FWRITE ? VWRITE : 0), p->p_ucred, p); 3741191Smckusick VOP_UNLOCK(ttyvp); 3841191Smckusick if (error) 3939554Smarc return (error); 40*48018Smckusick return (VOP_OPEN(ttyvp, flag, NOCRED, p)); 4135Sbill } 4235Sbill 4335Sbill /*ARGSUSED*/ 4447648Skarels cttyread(dev, uio, flag, p) 457824Sroot dev_t dev; 467824Sroot struct uio *uio; 4747648Skarels struct proc *p; 4835Sbill { 4947648Skarels register struct vnode *ttyvp = cttyvp(p); 5039589Smckusick int error; 5135Sbill 5239554Smarc if (ttyvp == NULL) 5347648Skarels return (EIO); 5439589Smckusick VOP_LOCK(ttyvp); 5539589Smckusick error = VOP_READ(ttyvp, uio, flag, NOCRED); 5639589Smckusick VOP_UNLOCK(ttyvp); 5739589Smckusick return (error); 5835Sbill } 5935Sbill 6035Sbill /*ARGSUSED*/ 6147648Skarels cttywrite(dev, uio, flag, p) 627824Sroot dev_t dev; 637824Sroot struct uio *uio; 6447648Skarels struct proc *p; 6535Sbill { 6647648Skarels register struct vnode *ttyvp = cttyvp(p); 6739589Smckusick int error; 6835Sbill 6939554Smarc if (ttyvp == NULL) 7047648Skarels return (EIO); 7139589Smckusick VOP_LOCK(ttyvp); 7239589Smckusick error = VOP_WRITE(ttyvp, uio, flag, NOCRED); 7339589Smckusick VOP_UNLOCK(ttyvp); 7439589Smckusick return (error); 7535Sbill } 7635Sbill 7735Sbill /*ARGSUSED*/ 7847648Skarels cttyioctl(dev, cmd, addr, flag, p) 795618Sroot dev_t dev; 805618Sroot int cmd; 815618Sroot caddr_t addr; 825618Sroot int flag; 8347648Skarels struct proc *p; 8435Sbill { 8547648Skarels struct vnode *ttyvp = cttyvp(p); 8635Sbill 8739554Smarc if (ttyvp == NULL) 8847648Skarels return (EIO); 895390Swnj if (cmd == TIOCNOTTY) { 9047648Skarels if (!SESS_LEADER(p)) { 9147648Skarels p->p_flag &= ~SCTTY; 9239554Smarc return (0); 9339554Smarc } else 9439554Smarc return (EINVAL); 955390Swnj } 96*48018Smckusick return (VOP_IOCTL(ttyvp, cmd, addr, flag, NOCRED, p)); 9735Sbill } 984487Swnj 998591Sroot /*ARGSUSED*/ 10047648Skarels cttyselect(dev, flag, p) 1018591Sroot dev_t dev; 1028591Sroot int flag; 10347648Skarels struct proc *p; 1044487Swnj { 10547648Skarels struct vnode *ttyvp = cttyvp(p); 1064487Swnj 10739554Smarc if (ttyvp == NULL) 10843382Skarels return (1); /* try operation to get EOF/failure */ 109*48018Smckusick return (VOP_SELECT(ttyvp, flag, FREAD|FWRITE, NOCRED, p)); 1104487Swnj } 111