ensure bmap run list is initialised
[unix-history] / usr / src / sys / miscfs / fifofs / fifo_vnops.c
index 297a85d..ea8f885 100644 (file)
@@ -1,10 +1,10 @@
 /*
 /*
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)fifo_vnops.c        7.17 (Berkeley) %G%
+ *     @(#)fifo_vnops.c        8.5 (Berkeley) %G%
  */
 
 #include <sys/param.h>
  */
 
 #include <sys/param.h>
@@ -46,6 +46,7 @@ struct vnodeopv_entry_desc fifo_vnodeop_entries[] = {
        { &vop_setattr_desc, fifo_setattr },            /* setattr */
        { &vop_read_desc, fifo_read },                  /* read */
        { &vop_write_desc, fifo_write },                /* write */
        { &vop_setattr_desc, fifo_setattr },            /* setattr */
        { &vop_read_desc, fifo_read },                  /* read */
        { &vop_write_desc, fifo_write },                /* write */
+       { &vop_lease_desc, fifo_lease_check },          /* lease */
        { &vop_ioctl_desc, fifo_ioctl },                /* ioctl */
        { &vop_select_desc, fifo_select },              /* select */
        { &vop_mmap_desc, fifo_mmap },                  /* mmap */
        { &vop_ioctl_desc, fifo_ioctl },                /* ioctl */
        { &vop_select_desc, fifo_select },              /* select */
        { &vop_mmap_desc, fifo_mmap },                  /* mmap */
@@ -68,6 +69,7 @@ struct vnodeopv_entry_desc fifo_vnodeop_entries[] = {
        { &vop_strategy_desc, fifo_strategy },          /* strategy */
        { &vop_print_desc, fifo_print },                /* print */
        { &vop_islocked_desc, fifo_islocked },          /* islocked */
        { &vop_strategy_desc, fifo_strategy },          /* strategy */
        { &vop_print_desc, fifo_print },                /* print */
        { &vop_islocked_desc, fifo_islocked },          /* islocked */
+       { &vop_pathconf_desc, fifo_pathconf },          /* pathconf */
        { &vop_advlock_desc, fifo_advlock },            /* advlock */
        { &vop_blkatoff_desc, fifo_blkatoff },          /* blkatoff */
        { &vop_valloc_desc, fifo_valloc },              /* valloc */
        { &vop_advlock_desc, fifo_advlock },            /* advlock */
        { &vop_blkatoff_desc, fifo_blkatoff },          /* blkatoff */
        { &vop_valloc_desc, fifo_valloc },              /* valloc */
@@ -120,13 +122,13 @@ fifo_open(ap)
        if ((fip = vp->v_fifoinfo) == NULL) {
                MALLOC(fip, struct fifoinfo *, sizeof(*fip), M_VNODE, M_WAITOK);
                vp->v_fifoinfo = fip;
        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_LOCAL, &rso, SOCK_STREAM, 0)) {
                        free(fip, M_VNODE);
                        vp->v_fifoinfo = NULL;
                        return (error);
                }
                fip->fi_readsock = rso;
                        free(fip, M_VNODE);
                        vp->v_fifoinfo = NULL;
                        return (error);
                }
                fip->fi_readsock = rso;
-               if (error = socreate(AF_UNIX, &wso, SOCK_STREAM, 0)) {
+               if (error = socreate(AF_LOCAL, &wso, SOCK_STREAM, 0)) {
                        (void)soclose(rso);
                        free(fip, M_VNODE);
                        vp->v_fifoinfo = NULL;
                        (void)soclose(rso);
                        free(fip, M_VNODE);
                        vp->v_fifoinfo = NULL;
@@ -156,8 +158,8 @@ fifo_open(ap)
                        return (0);
                while (fip->fi_writers == 0) {
                        VOP_UNLOCK(vp);
                        return (0);
                while (fip->fi_writers == 0) {
                        VOP_UNLOCK(vp);
-                       error = tsleep((caddr_t)&fip->fi_readers, PSOCK,
-                               openstr, 0);
+                       error = tsleep((caddr_t)&fip->fi_readers,
+                           PCATCH | PSOCK, openstr, 0);
                        VOP_LOCK(vp);
                        if (error)
                                break;
                        VOP_LOCK(vp);
                        if (error)
                                break;
@@ -175,7 +177,7 @@ fifo_open(ap)
                        while (fip->fi_readers == 0) {
                                VOP_UNLOCK(vp);
                                error = tsleep((caddr_t)&fip->fi_writers,
                        while (fip->fi_readers == 0) {
                                VOP_UNLOCK(vp);
                                error = tsleep((caddr_t)&fip->fi_writers,
-                                       PSOCK, openstr, 0);
+                                   PCATCH | PSOCK, openstr, 0);
                                VOP_LOCK(vp);
                                if (error)
                                        break;
                                VOP_LOCK(vp);
                                if (error)
                                        break;
@@ -213,8 +215,8 @@ fifo_read(ap)
                rso->so_state |= SS_NBIO;
        startresid = uio->uio_resid;
        VOP_UNLOCK(ap->a_vp);
                rso->so_state |= SS_NBIO;
        startresid = uio->uio_resid;
        VOP_UNLOCK(ap->a_vp);
-       error = soreceive(rso, (struct mbuf **)0, uio, (int *)0,
-               (struct mbuf **)0, (struct mbuf **)0);
+       error = soreceive(rso, (struct mbuf **)0, uio, (struct mbuf **)0,
+           (struct mbuf **)0, (int *)0);
        VOP_LOCK(ap->a_vp);
        /*
         * Clear EOF indication after first such return.
        VOP_LOCK(ap->a_vp);
        /*
         * Clear EOF indication after first such return.
@@ -270,7 +272,6 @@ fifo_ioctl(ap)
        } */ *ap;
 {
        struct file filetmp;
        } */ *ap;
 {
        struct file filetmp;
-       int error;
 
        if (ap->a_command == FIONBIO)
                return (0);
 
        if (ap->a_command == FIONBIO)
                return (0);
@@ -292,7 +293,6 @@ fifo_select(ap)
        } */ *ap;
 {
        struct file filetmp;
        } */ *ap;
 {
        struct file filetmp;
-       int error;
 
        if (ap->a_fflags & FREAD)
                filetmp.f_data = (caddr_t)ap->a_vp->v_fifoinfo->fi_readsock;
 
        if (ap->a_fflags & FREAD)
                filetmp.f_data = (caddr_t)ap->a_vp->v_fifoinfo->fi_readsock;
@@ -317,6 +317,8 @@ fifo_bmap(ap)
                *ap->a_vpp = ap->a_vp;
        if (ap->a_bnp != NULL)
                *ap->a_bnp = ap->a_bn;
                *ap->a_vpp = ap->a_vp;
        if (ap->a_bnp != NULL)
                *ap->a_bnp = ap->a_bn;
+       if (ap->a_runp != NULL)
+               *ap->a_runp = 0;
        return (0);
 }
 
        return (0);
 }
 
@@ -405,6 +407,33 @@ fifo_printinfo(vp)
                fip->fi_readers, fip->fi_writers);
 }
 
                fip->fi_readers, fip->fi_writers);
 }
 
+/*
+ * Return POSIX pathconf information applicable to fifo's.
+ */
+fifo_pathconf(ap)
+       struct vop_pathconf_args /* {
+               struct vnode *a_vp;
+               int a_name;
+               int *a_retval;
+       } */ *ap;
+{
+
+       switch (ap->a_name) {
+       case _PC_LINK_MAX:
+               *ap->a_retval = LINK_MAX;
+               return (0);
+       case _PC_PIPE_BUF:
+               *ap->a_retval = PIPE_BUF;
+               return (0);
+       case _PC_CHOWN_RESTRICTED:
+               *ap->a_retval = 1;
+               return (0);
+       default:
+               return (EINVAL);
+       }
+       /* NOTREACHED */
+}
+
 /*
  * Fifo failed operation
  */
 /*
  * Fifo failed operation
  */