1 /* 2 * Copyright (c) 1982, 1986 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 * 6 * @(#)tty_tty.c 7.8 (Berkeley) 05/01/90 7 */ 8 9 /* 10 * Indirect driver for controlling tty. 11 */ 12 #include "param.h" 13 #include "systm.h" 14 #include "conf.h" 15 #include "user.h" 16 #include "ioctl.h" 17 #include "tty.h" 18 #include "proc.h" 19 #include "vnode.h" 20 #include "file.h" 21 #include "uio.h" 22 23 #define cttyvp(p) ((p)->p_flag&SCTTY ? (p)->p_session->s_ttyvp : NULL) 24 25 /*ARGSUSED*/ 26 syopen(dev, flag) 27 dev_t dev; 28 int flag; 29 { 30 struct vnode *ttyvp = cttyvp(u.u_procp); 31 int error; 32 33 if (ttyvp == NULL) 34 return (ENXIO); 35 VOP_LOCK(ttyvp); 36 error = VOP_ACCESS(ttyvp, 37 (flag&FREAD ? VREAD : 0) | (flag&FWRITE ? VWRITE : 0), u.u_cred); 38 VOP_UNLOCK(ttyvp); 39 if (error) 40 return (error); 41 return (VOP_OPEN(ttyvp, flag, NOCRED)); 42 } 43 44 /*ARGSUSED*/ 45 syread(dev, uio, flag) 46 dev_t dev; 47 struct uio *uio; 48 { 49 register struct vnode *ttyvp = cttyvp(u.u_procp); 50 int error; 51 52 if (ttyvp == NULL) 53 return (ENXIO); 54 VOP_LOCK(ttyvp); 55 error = VOP_READ(ttyvp, uio, flag, NOCRED); 56 VOP_UNLOCK(ttyvp); 57 return (error); 58 } 59 60 /*ARGSUSED*/ 61 sywrite(dev, uio, flag) 62 dev_t dev; 63 struct uio *uio; 64 { 65 register struct vnode *ttyvp = cttyvp(u.u_procp); 66 int error; 67 68 if (ttyvp == NULL) 69 return (ENXIO); 70 VOP_LOCK(ttyvp); 71 error = VOP_WRITE(ttyvp, uio, flag, NOCRED); 72 VOP_UNLOCK(ttyvp); 73 return (error); 74 } 75 76 /*ARGSUSED*/ 77 syioctl(dev, cmd, addr, flag) 78 dev_t dev; 79 int cmd; 80 caddr_t addr; 81 int flag; 82 { 83 struct vnode *ttyvp = cttyvp(u.u_procp); 84 85 if (ttyvp == NULL) 86 return (ENXIO); 87 if (cmd == TIOCNOTTY) { 88 if (!SESS_LEADER(u.u_procp)) { 89 u.u_procp->p_flag &= ~SCTTY; 90 return (0); 91 } else 92 return (EINVAL); 93 } 94 return (VOP_IOCTL(ttyvp, cmd, addr, flag, NOCRED)); 95 } 96 97 /*ARGSUSED*/ 98 syselect(dev, flag) 99 dev_t dev; 100 int flag; 101 { 102 struct vnode *ttyvp = cttyvp(u.u_procp); 103 104 if (ttyvp == NULL) 105 return (ENXIO); 106 return (VOP_SELECT(ttyvp, flag, FREAD|FWRITE, NOCRED)); 107 } 108