more-or-less working with new proc & user structs
[unix-history] / usr / src / sys / miscfs / fifofs / fifo_vnops.c
index 706c25f..e53ae89 100644 (file)
@@ -2,19 +2,9 @@
  * Copyright (c) 1990 The Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1990 The Regents of the University of California.
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * %sccs.include.redist.c%
  *
  *
- *     @(#)fifo_vnops.c        7.1 (Berkeley) %G%
+ *     @(#)fifo_vnops.c        7.6 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -24,6 +14,7 @@
 #include "socket.h"
 #include "socketvar.h"
 #include "stat.h"
 #include "socket.h"
 #include "socketvar.h"
 #include "stat.h"
+#include "systm.h"
 #include "ioctl.h"
 #include "file.h"
 #include "errno.h"
 #include "ioctl.h"
 #include "file.h"
 #include "errno.h"
@@ -52,9 +43,10 @@ int  fifo_lookup(),
        fifo_unlock(),
        fifo_close(),
        fifo_print(),
        fifo_unlock(),
        fifo_close(),
        fifo_print(),
+       fifo_advlock(),
        fifo_ebadf(),
        fifo_badop(),
        fifo_ebadf(),
        fifo_badop(),
-       fifo_nullop();
+       nullop();
 
 struct vnodeops fifo_vnodeops = {
        fifo_lookup,            /* lookup */
 
 struct vnodeops fifo_vnodeops = {
        fifo_lookup,            /* lookup */
@@ -70,7 +62,7 @@ struct vnodeops fifo_vnodeops = {
        fifo_ioctl,             /* ioctl */
        fifo_select,            /* select */
        fifo_badop,             /* mmap */
        fifo_ioctl,             /* ioctl */
        fifo_select,            /* select */
        fifo_badop,             /* mmap */
-       fifo_nullop,            /* fsync */
+       nullop,                 /* fsync */
        fifo_badop,             /* seek */
        fifo_badop,             /* remove */
        fifo_badop,             /* link */
        fifo_badop,             /* seek */
        fifo_badop,             /* remove */
        fifo_badop,             /* link */
@@ -81,14 +73,15 @@ struct vnodeops fifo_vnodeops = {
        fifo_badop,             /* readdir */
        fifo_badop,             /* readlink */
        fifo_badop,             /* abortop */
        fifo_badop,             /* readdir */
        fifo_badop,             /* readlink */
        fifo_badop,             /* abortop */
-       fifo_nullop,            /* inactive */
-       fifo_nullop,            /* reclaim */
+       nullop,                 /* inactive */
+       nullop,                 /* reclaim */
        fifo_lock,              /* lock */
        fifo_unlock,            /* unlock */
        fifo_bmap,              /* bmap */
        fifo_badop,             /* strategy */
        fifo_print,             /* print */
        fifo_lock,              /* lock */
        fifo_unlock,            /* unlock */
        fifo_bmap,              /* bmap */
        fifo_badop,             /* strategy */
        fifo_print,             /* print */
-       fifo_nullop,            /* islocked */
+       nullop,                 /* islocked */
+       fifo_advlock,           /* advlock */
 };
 
 /*
 };
 
 /*
@@ -117,23 +110,31 @@ fifo_open(vp, mode, cred)
        register struct fifoinfo *fip;
        struct socket *rso, *wso;
        int error;
        register struct fifoinfo *fip;
        struct socket *rso, *wso;
        int error;
+       static char openstr[] = "fifo";
 
        if ((mode & (FREAD|FWRITE)) == (FREAD|FWRITE))
                return (EINVAL);
        if ((fip = vp->v_fifoinfo) == NULL) {
                MALLOC(fip, struct fifoinfo *, sizeof(*fip), M_VNODE, M_WAITOK);
                vp->v_fifoinfo = fip;
 
        if ((mode & (FREAD|FWRITE)) == (FREAD|FWRITE))
                return (EINVAL);
        if ((fip = vp->v_fifoinfo) == NULL) {
                MALLOC(fip, struct fifoinfo *, sizeof(*fip), M_VNODE, M_WAITOK);
                vp->v_fifoinfo = fip;
-               if (error = socreate(AF_UNIX, &rso, SOCK_STREAM, 0))
+               if (error = socreate(AF_UNIX, &rso, SOCK_STREAM, 0)) {
+                       free(fip, M_VNODE);
+                       vp->v_fifoinfo = NULL;
                        return (error);
                        return (error);
+               }
                fip->fi_readsock = rso;
                if (error = socreate(AF_UNIX, &wso, SOCK_STREAM, 0)) {
                        (void)soclose(rso);
                fip->fi_readsock = rso;
                if (error = socreate(AF_UNIX, &wso, SOCK_STREAM, 0)) {
                        (void)soclose(rso);
+                       free(fip, M_VNODE);
+                       vp->v_fifoinfo = NULL;
                        return (error);
                }
                fip->fi_writesock = wso;
                if (error = unp_connect2(wso, rso)) {
                        (void)soclose(wso);
                        (void)soclose(rso);
                        return (error);
                }
                fip->fi_writesock = wso;
                if (error = unp_connect2(wso, rso)) {
                        (void)soclose(wso);
                        (void)soclose(rso);
+                       free(fip, M_VNODE);
+                       vp->v_fifoinfo = NULL;
                        return (error);
                }
                wso->so_state |= SS_CANTRCVMORE;
                        return (error);
                }
                wso->so_state |= SS_CANTRCVMORE;
@@ -150,8 +151,8 @@ fifo_open(vp, mode, cred)
                if (mode & O_NONBLOCK)
                        return (0);
                while (fip->fi_writers == 0)
                if (mode & O_NONBLOCK)
                        return (0);
                while (fip->fi_writers == 0)
-                       if (error = isleep((caddr_t)&fip->fi_readers, PZERO + 1,
-                           SLP_FIFO_OPEN, 0))
+                       if (error = tsleep((caddr_t)&fip->fi_readers, PSOCK,
+                           openstr, 0))
                                break;
        } else {
                fip->fi_writers++;
                                break;
        } else {
                fip->fi_writers++;
@@ -164,8 +165,8 @@ fifo_open(vp, mode, cred)
                                        wakeup((caddr_t)&fip->fi_readers);
                        }
                        while (fip->fi_readers == 0)
                                        wakeup((caddr_t)&fip->fi_readers);
                        }
                        while (fip->fi_readers == 0)
-                               if (error = isleep((caddr_t)&fip->fi_writers,
-                                   PZERO + 1, SLP_FIFO_OPEN, 0))
+                               if (error = tsleep((caddr_t)&fip->fi_writers,
+                                   PSOCK, openstr, 0))
                                        break;
                }
        }
                                        break;
                }
        }
@@ -374,20 +375,25 @@ fifo_ebadf()
 }
 
 /*
 }
 
 /*
- * Fifo bad operation
+ * Fifo advisory byte-level locks.
  */
  */
-fifo_badop()
+fifo_advlock(vp, id, op, fl, flags)
+       struct vnode *vp;
+       caddr_t id;
+       int op;
+       struct flock *fl;
+       int flags;
 {
 
 {
 
-       panic("fifo_badop called");
-       /* NOTREACHED */
+       return (EOPNOTSUPP);
 }
 
 /*
 }
 
 /*
- * Fifo null operation
+ * Fifo bad operation
  */
  */
-fifo_nullop()
+fifo_badop()
 {
 
 {
 
-       return (0);
+       panic("fifo_badop called");
+       /* NOTREACHED */
 }
 }