p_devtmp => p_dupfd; eliminate u.u_error from RETURN macro
[unix-history] / usr / src / sys / kern / tty_tty.c
index ba94376..7fb68d7 100644 (file)
@@ -3,7 +3,7 @@
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
- *     @(#)tty_tty.c   7.5 (Berkeley) %G%
+ *     @(#)tty_tty.c   7.9 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -22,8 +22,6 @@
 
 #define cttyvp(p) ((p)->p_flag&SCTTY ? (p)->p_session->s_ttyvp : NULL)
 
 
 #define cttyvp(p) ((p)->p_flag&SCTTY ? (p)->p_session->s_ttyvp : NULL)
 
-static off_t dummyoff;
-
 /*ARGSUSED*/
 syopen(dev, flag)
        dev_t dev;
 /*ARGSUSED*/
 syopen(dev, flag)
        dev_t dev;
@@ -34,8 +32,11 @@ syopen(dev, flag)
 
        if (ttyvp == NULL)
                return (ENXIO);
 
        if (ttyvp == NULL)
                return (ENXIO);
-       if (error = VOP_ACCESS(ttyvp,
-          (flag&FREAD ? VREAD : 0) | (flag&FWRITE ? VWRITE : 0), u.u_cred))
+       VOP_LOCK(ttyvp);
+       error = VOP_ACCESS(ttyvp,
+          (flag&FREAD ? VREAD : 0) | (flag&FWRITE ? VWRITE : 0), u.u_cred);
+       VOP_UNLOCK(ttyvp);
+       if (error)
                return (error);
        return (VOP_OPEN(ttyvp, flag, NOCRED));
 }
                return (error);
        return (VOP_OPEN(ttyvp, flag, NOCRED));
 }
@@ -45,11 +46,15 @@ syread(dev, uio, flag)
        dev_t dev;
        struct uio *uio;
 {
        dev_t dev;
        struct uio *uio;
 {
-       struct vnode *ttyvp = cttyvp(u.u_procp);
+       register struct vnode *ttyvp = cttyvp(u.u_procp);
+       int error;
 
        if (ttyvp == NULL)
                return (ENXIO);
 
        if (ttyvp == NULL)
                return (ENXIO);
-       return (VOP_READ(ttyvp, uio, &dummyoff, flag, NOCRED));
+       VOP_LOCK(ttyvp);
+       error = VOP_READ(ttyvp, uio, flag, NOCRED);
+       VOP_UNLOCK(ttyvp);
+       return (error);
 }
 
 /*ARGSUSED*/
 }
 
 /*ARGSUSED*/
@@ -57,11 +62,15 @@ sywrite(dev, uio, flag)
        dev_t dev;
        struct uio *uio;
 {
        dev_t dev;
        struct uio *uio;
 {
-       struct vnode *ttyvp = cttyvp(u.u_procp);
+       register struct vnode *ttyvp = cttyvp(u.u_procp);
+       int error;
 
        if (ttyvp == NULL)
                return (ENXIO);
 
        if (ttyvp == NULL)
                return (ENXIO);
-       return (VOP_WRITE(ttyvp, uio, &dummyoff, flag, NOCRED));
+       VOP_LOCK(ttyvp);
+       error = VOP_WRITE(ttyvp, uio, flag, NOCRED);
+       VOP_UNLOCK(ttyvp);
+       return (error);
 }
 
 /*ARGSUSED*/
 }
 
 /*ARGSUSED*/
@@ -93,6 +102,6 @@ syselect(dev, flag)
        struct vnode *ttyvp = cttyvp(u.u_procp);
 
        if (ttyvp == NULL)
        struct vnode *ttyvp = cttyvp(u.u_procp);
 
        if (ttyvp == NULL)
-               return (ENXIO);
-       return (VOP_SELECT(ttyvp, flag, NOCRED));
+               return (1);     /* try operation to get EOF/failure */
+       return (VOP_SELECT(ttyvp, flag, FREAD|FWRITE, NOCRED));
 }
 }