This commit was generated by cvs2svn to track changes on a CVS vendor
[unix-history] / sys / kern / sysv_shm.c
index 7c5a7b8..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,6 +114,8 @@ shminit()
        }
 }
 
        }
 }
 
+TEXT_SET(pseudo_set, shminit);
+
 /*
  * Entry point for all SHM calls
  */
 /*
  * Entry point for all SHM calls
  */
@@ -110,6 +124,7 @@ struct shmsys_args {
        u_int which;
 };
 
        u_int which;
 };
 
+int
 shmsys(p, uap, retval)
        struct proc *p;
        struct shmsys_args *uap;
 shmsys(p, uap, retval)
        struct proc *p;
        struct shmsys_args *uap;
@@ -131,6 +146,7 @@ struct shmget_args {
        int shmflg;
 };
 
        int shmflg;
 };
 
+static int
 shmget(p, uap, retval)
        struct proc *p;
        register struct shmget_args *uap;
 shmget(p, uap, retval)
        struct proc *p;
        register struct shmget_args *uap;
@@ -183,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;
@@ -228,6 +244,7 @@ struct shmctl_args {
 };
 
 /* ARGSUSED */
 };
 
 /* ARGSUSED */
+static int
 shmctl(p, uap, retval)
        struct proc *p;
        register struct shmctl_args *uap;
 shmctl(p, uap, retval)
        struct proc *p;
        register struct shmctl_args *uap;
@@ -299,6 +316,7 @@ struct shmat_args {
        int     shmflg;
 };
 
        int     shmflg;
 };
 
+static int
 shmat(p, uap, retval)
        struct proc *p;
        register struct shmat_args *uap;
 shmat(p, uap, retval)
        struct proc *p;
        register struct shmat_args *uap;
@@ -356,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;
@@ -382,6 +402,7 @@ struct shmdt_args {
 };
 
 /* ARGSUSED */
 };
 
 /* ARGSUSED */
+static int
 shmdt(p, uap, retval)
        struct proc *p;
        struct shmdt_args *uap;
 shmdt(p, uap, retval)
        struct proc *p;
        struct shmdt_args *uap;
@@ -399,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;
@@ -423,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;
 {
@@ -437,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;
 {
@@ -454,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;
@@ -473,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;
 {
@@ -500,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 */