This commit was generated by cvs2svn to track changes on a CVS vendor
[unix-history] / sys / kern / sysv_shm.c
index fca74d3..31a4756 100644 (file)
@@ -35,9 +35,9 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * from: Utah $Hdr: uipc_shm.c 1.9 89/08/14$
- *
- *     @(#)sysv_shm.c  7.15 (Berkeley) 5/13/91
+ *     from: Utah $Hdr: uipc_shm.c 1.9 89/08/14$
+ *     from: @(#)sysv_shm.c    7.15 (Berkeley) 5/13/91
+ *     $Id: sysv_shm.c,v 1.11 1994/03/08 13:01:44 ats Exp $
  */
 
 /*
  */
 
 /*
 #include "vm/vm_kern.h"
 #include "vm/vm_inherit.h"
 #include "vm/vm_pager.h"
 #include "vm/vm_kern.h"
 #include "vm/vm_inherit.h"
 #include "vm/vm_pager.h"
+#include "vm/vm_user.h"
 
 #ifdef HPUXCOMPAT
 #include "hp300/hpux/hpux.h"
 #endif
 
 
 #ifdef HPUXCOMPAT
 #include "hp300/hpux/hpux.h"
 #endif
 
-int    shmat(), shmctl(), shmdt(), shmget();
-int    (*shmcalls[])() = { shmat, shmctl, shmdt, shmget };
+/* From shm.h */
+struct shmid_ds        *shmsegs;
+struct shminfo         shminfo;
+
+static int     shmat(), shmctl(), shmdt(), shmget(); /* XXX */
+int    (*shmcalls[])() = { shmat, shmctl, shmdt, shmget }; /* XXX */
 int    shmtot = 0;
 
 /*
 int    shmtot = 0;
 
 /*
@@ -85,8 +90,15 @@ struct       shmhandle {
        caddr_t         shmh_id;
 };
 
        caddr_t         shmh_id;
 };
 
+extern int ipcaccess(struct ipc_perm *, int, struct ucred *);
+static void shmufree(struct proc *, struct shmdesc *);
+static void shmfree(struct shmid_ds *);
+static int shmvalid(int);
+
+
 vm_map_t shm_map;      /* address space for shared memory segments */
 
 vm_map_t shm_map;      /* address space for shared memory segments */
 
+void
 shminit()
 {
        register int i;
 shminit()
 {
        register int i;
@@ -102,14 +114,20 @@ shminit()
        }
 }
 
        }
 }
 
+TEXT_SET(pseudo_set, shminit);
+
 /*
  * Entry point for all SHM calls
  */
 /*
  * Entry point for all SHM calls
  */
+
+struct shmsys_args {
+       u_int which;
+};
+
+int
 shmsys(p, uap, retval)
        struct proc *p;
 shmsys(p, uap, retval)
        struct proc *p;
-       struct args {
-               u_int which;
-       } *uap;
+       struct shmsys_args *uap;
        int *retval;
 {
 
        int *retval;
 {
 
@@ -121,13 +139,17 @@ shmsys(p, uap, retval)
 /*
  * Get a shared memory segment
  */
 /*
  * Get a shared memory segment
  */
+
+struct shmget_args {
+       key_t key;
+       int size;
+       int shmflg;
+};
+
+static int
 shmget(p, uap, retval)
        struct proc *p;
 shmget(p, uap, retval)
        struct proc *p;
-       register struct args {
-               key_t key;
-               int size;
-               int shmflg;
-       } *uap;
+       register struct shmget_args *uap;
        int *retval;
 {
        register struct shmid_ds *shp;
        int *retval;
 {
        register struct shmid_ds *shp;
@@ -177,9 +199,9 @@ shmget(p, uap, retval)
                shmh = (struct shmhandle *)
                        malloc(sizeof(struct shmhandle), M_SHM, M_WAITOK);
                shmh->shmh_kva = 0;
                shmh = (struct shmhandle *)
                        malloc(sizeof(struct shmhandle), M_SHM, M_WAITOK);
                shmh->shmh_kva = 0;
-               shmh->shmh_id = (caddr_t)(0xc0000000|rval);     /* XXX */
+               shmh->shmh_id = (caddr_t)(0xc0000000UL|rval);   /* XXX */
                error = vm_mmap(shm_map, &shmh->shmh_kva, ctob(size),
                error = vm_mmap(shm_map, &shmh->shmh_kva, ctob(size),
-                               VM_PROT_ALL, MAP_ANON, shmh->shmh_id, 0);
+                               VM_PROT_ALL, VM_PROT_DEFAULT, MAP_ANON, shmh->shmh_id, 0);
                if (error) {
                        free((caddr_t)shmh, M_SHM);
                        shp->shm_perm.mode = 0;
                if (error) {
                        free((caddr_t)shmh, M_SHM);
                        shp->shm_perm.mode = 0;
@@ -214,14 +236,18 @@ shmget(p, uap, retval)
 /*
  * Shared memory control
  */
 /*
  * Shared memory control
  */
+
+struct shmctl_args {
+       int shmid;
+       int cmd;
+       caddr_t buf;
+};
+
 /* ARGSUSED */
 /* ARGSUSED */
+static int
 shmctl(p, uap, retval)
        struct proc *p;
 shmctl(p, uap, retval)
        struct proc *p;
-       register struct args {
-               int shmid;
-               int cmd;
-               caddr_t buf;
-       } *uap;
+       register struct shmctl_args *uap;
        int *retval;
 {
        register struct shmid_ds *shp;
        int *retval;
 {
        register struct shmid_ds *shp;
@@ -283,13 +309,17 @@ shmctl(p, uap, retval)
 /*
  * Attach to shared memory segment.
  */
 /*
  * Attach to shared memory segment.
  */
+
+struct shmat_args {
+       int     shmid;
+       caddr_t shmaddr;
+       int     shmflg;
+};
+
+static int
 shmat(p, uap, retval)
        struct proc *p;
 shmat(p, uap, retval)
        struct proc *p;
-       register struct args {
-               int     shmid;
-               caddr_t shmaddr;
-               int     shmflg;
-       } *uap;
+       register struct shmat_args *uap;
        int *retval;
 {
        register struct shmid_ds *shp;
        int *retval;
 {
        register struct shmid_ds *shp;
@@ -344,9 +374,11 @@ shmat(p, uap, retval)
        if (uva)
                flags |= MAP_FIXED;
        else
        if (uva)
                flags |= MAP_FIXED;
        else
-               uva = (caddr_t)0x1000000;       /* XXX */
-       error = vm_mmap(&p->p_vmspace->vm_map, &uva, (vm_size_t)size, prot,
-           flags, ((struct shmhandle *)shp->shm_handle)->shmh_id, 0);
+               uva = (caddr_t)0x1000000UL;     /* XXX */
+       error = vm_mmap(&p->p_vmspace->vm_map, (vm_offset_t *)&uva,
+                       (vm_size_t)size, prot, VM_PROT_DEFAULT,
+                       flags, ((struct shmhandle *)shp->shm_handle)->shmh_id,
+                       0);
        if (error)
                return(error);
        shmd->shmd_uva = (vm_offset_t)uva;
        if (error)
                return(error);
        shmd->shmd_uva = (vm_offset_t)uva;
@@ -364,12 +396,16 @@ shmat(p, uap, retval)
 /*
  * Detach from shared memory segment.
  */
 /*
  * Detach from shared memory segment.
  */
+
+struct shmdt_args {
+       caddr_t shmaddr;
+};
+
 /* ARGSUSED */
 /* ARGSUSED */
+static int
 shmdt(p, uap, retval)
        struct proc *p;
 shmdt(p, uap, retval)
        struct proc *p;
-       struct args {
-               caddr_t shmaddr;
-       } *uap;
+       struct shmdt_args *uap;
        int *retval;
 {
        register struct shmdesc *shmd;
        int *retval;
 {
        register struct shmdesc *shmd;
@@ -384,8 +420,10 @@ shmdt(p, uap, retval)
                return(EINVAL);
        shmufree(p, shmd);
        shmsegs[shmd->shmd_id % SHMMMNI].shm_lpid = p->p_pid;
                return(EINVAL);
        shmufree(p, shmd);
        shmsegs[shmd->shmd_id % SHMMMNI].shm_lpid = p->p_pid;
+       return 0;
 }
 
 }
 
+void
 shmfork(p1, p2, isvfork)
        struct proc *p1, *p2;
        int isvfork;
 shmfork(p1, p2, isvfork)
        struct proc *p1, *p2;
        int isvfork;
@@ -408,6 +446,7 @@ shmfork(p1, p2, isvfork)
                        shmsegs[shmd->shmd_id % SHMMMNI].shm_nattch++;
 }
 
                        shmsegs[shmd->shmd_id % SHMMMNI].shm_nattch++;
 }
 
+void
 shmexit(p)
        struct proc *p;
 {
 shmexit(p)
        struct proc *p;
 {
@@ -422,6 +461,7 @@ shmexit(p)
        p->p_vmspace->vm_shm = NULL;
 }
 
        p->p_vmspace->vm_shm = NULL;
 }
 
+static int
 shmvalid(id)
        register int id;
 {
 shmvalid(id)
        register int id;
 {
@@ -439,6 +479,7 @@ shmvalid(id)
 /*
  * Free user resources associated with a shared memory segment
  */
 /*
  * Free user resources associated with a shared memory segment
  */
+static void
 shmufree(p, shmd)
        struct proc *p;
        struct shmdesc *shmd;
 shmufree(p, shmd)
        struct proc *p;
        struct shmdesc *shmd;
@@ -458,6 +499,7 @@ shmufree(p, shmd)
 /*
  * Deallocate resources associated with a shared memory segment
  */
 /*
  * Deallocate resources associated with a shared memory segment
  */
+static void
 shmfree(shp)
        register struct shmid_ds *shp;
 {
 shmfree(shp)
        register struct shmid_ds *shp;
 {
@@ -485,35 +527,4 @@ shmfree(shp)
        if ((int)(shp->shm_perm.seq * SHMMMNI) < 0)
                shp->shm_perm.seq = 0;
 }
        if ((int)(shp->shm_perm.seq * SHMMMNI) < 0)
                shp->shm_perm.seq = 0;
 }
-
-/*
- * XXX This routine would be common to all sysV style IPC
- *     (if the others were implemented).
- */
-ipcaccess(ipc, mode, cred)
-       register struct ipc_perm *ipc;
-       int mode;
-       register struct ucred *cred;
-{
-       register int m;
-
-       if (cred->cr_uid == 0)
-               return(0);
-       /*
-        * Access check is based on only one of owner, group, public.
-        * If not owner, then check group.
-        * If not a member of the group, then check public access.
-        */
-       mode &= 0700;
-       m = ipc->mode;
-       if (cred->cr_uid != ipc->uid && cred->cr_uid != ipc->cuid) {
-               m <<= 3;
-               if (!groupmember(ipc->gid, cred) &&
-                   !groupmember(ipc->cgid, cred))
-                       m <<= 3;
-       }
-       if ((mode&m) == mode)
-               return (0);
-       return (EACCES);
-}
 #endif /* SYSVSHM */
 #endif /* SYSVSHM */