X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/e39f9ea6e16f879d578c6ae6cadc7cf2aa17674a..063b2136e14f9cd49afb94850daf96846958ccde:/usr/src/sys/kern/tty_tty.c diff --git a/usr/src/sys/kern/tty_tty.c b/usr/src/sys/kern/tty_tty.c index 882b7f5217..9b26f689cc 100644 --- a/usr/src/sys/kern/tty_tty.c +++ b/usr/src/sys/kern/tty_tty.c @@ -1,93 +1,111 @@ -/* - * Copyright (c) 1982, 1986 Regents of the University of California. - * All rights reserved. The Berkeley software License Agreement - * specifies the terms and conditions for redistribution. +/*- + * Copyright (c) 1982, 1986, 1991 The Regents of the University of California. + * All rights reserved. + * + * %sccs.include.redist.c% * - * @(#)tty_tty.c 7.2 (Berkeley) %G% + * @(#)tty_tty.c 7.17 (Berkeley) %G% */ /* * Indirect driver for controlling tty. - * - * THIS IS GARBAGE: MUST SOON BE DONE WITH struct inode * IN PROC TABLE. */ #include "param.h" #include "systm.h" #include "conf.h" -#include "dir.h" -#include "user.h" #include "ioctl.h" -#include "tty.h" #include "proc.h" -#include "uio.h" +#include "tty.h" +#include "vnode.h" +#include "file.h" + +#define cttyvp(p) ((p)->p_flag&SCTTY ? (p)->p_session->s_ttyvp : NULL) /*ARGSUSED*/ -syopen(dev, flag) +cttyopen(dev, flag, mode, p) dev_t dev; - int flag; + int flag, mode; + struct proc *p; { + struct vnode *ttyvp = cttyvp(p); + int error; - if (u.u_ttyp == NULL) + if (ttyvp == NULL) return (ENXIO); - return ((*cdevsw[major(u.u_ttyd)].d_open)(u.u_ttyd, flag)); + VOP_LOCK(ttyvp); + error = VOP_ACCESS(ttyvp, + (flag&FREAD ? VREAD : 0) | (flag&FWRITE ? VWRITE : 0), p->p_ucred, p); + if (!error) + error = VOP_OPEN(ttyvp, flag, NOCRED, p); + VOP_UNLOCK(ttyvp); + return (error); } /*ARGSUSED*/ -syread(dev, uio) +cttyread(dev, uio, flag) dev_t dev; struct uio *uio; + int flag; { + register struct vnode *ttyvp = cttyvp(uio->uio_procp); + int error; - if (u.u_ttyp == NULL) - return (ENXIO); - return ((*cdevsw[major(u.u_ttyd)].d_read)(u.u_ttyd, uio)); + if (ttyvp == NULL) + return (EIO); + VOP_LOCK(ttyvp); + error = VOP_READ(ttyvp, uio, flag, NOCRED); + VOP_UNLOCK(ttyvp); + return (error); } /*ARGSUSED*/ -sywrite(dev, uio) +cttywrite(dev, uio, flag) dev_t dev; struct uio *uio; + int flag; { + register struct vnode *ttyvp = cttyvp(uio->uio_procp); + int error; - if (u.u_ttyp == NULL) - return (ENXIO); - return ((*cdevsw[major(u.u_ttyd)].d_write)(u.u_ttyd, uio)); + if (ttyvp == NULL) + return (EIO); + VOP_LOCK(ttyvp); + error = VOP_WRITE(ttyvp, uio, flag, NOCRED); + VOP_UNLOCK(ttyvp); + return (error); } /*ARGSUSED*/ -syioctl(dev, cmd, addr, flag) +cttyioctl(dev, cmd, addr, flag, p) dev_t dev; int cmd; caddr_t addr; int flag; + struct proc *p; { + struct vnode *ttyvp = cttyvp(p); + if (ttyvp == NULL) + return (EIO); if (cmd == TIOCNOTTY) { - u.u_ttyp = 0; - u.u_ttyd = 0; - if (SESS_LEADER(u.u_procp)) { - /* - * XXX - check posix draft - */ - u.u_ttyp->t_session = 0; - u.u_ttyp->t_pgid = 0; - } - return (0); + if (!SESS_LEADER(p)) { + p->p_flag &= ~SCTTY; + return (0); + } else + return (EINVAL); } - if (u.u_ttyp == NULL) - return (ENXIO); - return ((*cdevsw[major(u.u_ttyd)].d_ioctl)(u.u_ttyd, cmd, addr, flag)); + return (VOP_IOCTL(ttyvp, cmd, addr, flag, NOCRED, p)); } /*ARGSUSED*/ -syselect(dev, flag) +cttyselect(dev, flag, p) dev_t dev; int flag; + struct proc *p; { + struct vnode *ttyvp = cttyvp(p); - if (u.u_ttyp == NULL) { - u.u_error = ENXIO; - return (0); - } - return ((*cdevsw[major(u.u_ttyd)].d_select)(u.u_ttyd, flag)); + if (ttyvp == NULL) + return (1); /* try operation to get EOF/failure */ + return (VOP_SELECT(ttyvp, flag, FREAD|FWRITE, NOCRED, p)); }