add USL's copyright notice
[unix-history] / usr / src / sys / kern / sysv_shm.c
index 354851a..e0ff2e9 100644 (file)
@@ -1,17 +1,22 @@
 /*
  * Copyright (c) 1988 University of Utah.
 /*
  * Copyright (c) 1988 University of Utah.
- * 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.
+ * (c) UNIX System Laboratories, Inc.
+ * All or some portions of this file are derived from material licensed
+ * to the University of California by American Telephone and Telegraph
+ * Co. or Unix System Laboratories, Inc. and are reproduced herein with
+ * the permission of UNIX System Laboratories, Inc.
  *
  * This code is derived from software contributed to Berkeley by
  * the Systems Programming Group of the University of Utah Computer
  *
  * This code is derived from software contributed to Berkeley by
  * the Systems Programming Group of the University of Utah Computer
- * Science Department. Originally from University of Wisconsin.
+ * Science Department.  Originally from the University of Wisconsin.
  *
  *
- * %sccs.include.redist.c%
+ * %sccs.include.proprietary.c%
  *
  * from: Utah $Hdr: uipc_shm.c 1.11 92/04/23$
  *
  *
  * from: Utah $Hdr: uipc_shm.c 1.11 92/04/23$
  *
- *     @(#)sysv_shm.c  7.18 (Berkeley) %G%
+ *     @(#)sysv_shm.c  8.6 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
 
 #ifdef SYSVSHM
 
 
 #ifdef SYSVSHM
 
-#include "param.h"
-#include "systm.h"
-#include "kernel.h"
-#include "proc.h"
-#include "shm.h"
-#include "malloc.h"
-#include "mman.h"
-#include "vm/vm.h"
-#include "vm/vm_kern.h"
-#include "vm/vm_inherit.h"
-#include "vm/vm_pager.h"
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/proc.h>
+#include <sys/shm.h>
+#include <sys/malloc.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+
+#include <vm/vm.h>
+#include <vm/vm_kern.h>
+#include <vm/vm_inherit.h>
+#include <vm/vm_pager.h>
 
 int    shmat(), shmctl(), shmdt(), shmget();
 int    (*shmcalls[])() = { shmat, shmctl, shmdt, shmget };
 
 int    shmat(), shmctl(), shmdt(), shmget();
 int    (*shmcalls[])() = { shmat, shmctl, shmdt, shmget };
@@ -63,7 +70,7 @@ shminit()
        vm_offset_t whocares1, whocares2;
 
        shm_map = kmem_suballoc(kernel_map, &whocares1, &whocares2,
        vm_offset_t whocares1, whocares2;
 
        shm_map = kmem_suballoc(kernel_map, &whocares1, &whocares2,
-                               shminfo.shmall * NBPG, FALSE);
+                               shminfo.shmall * NBPG, TRUE);
        if (shminfo.shmmni > SHMMMNI)
                shminfo.shmmni = SHMMMNI;
        for (i = 0; i < shminfo.shmmni; i++) {
        if (shminfo.shmmni > SHMMMNI)
                shminfo.shmmni = SHMMMNI;
        for (i = 0; i < shminfo.shmmni; i++) {
@@ -75,11 +82,12 @@ shminit()
 /*
  * Entry point for all SHM calls
  */
 /*
  * Entry point for all SHM calls
  */
+struct shmsys_args {
+       u_int which;
+};
 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;
 {
 
@@ -91,13 +99,14 @@ shmsys(p, uap, retval)
 /*
  * Get a shared memory segment
  */
 /*
  * Get a shared memory segment
  */
+struct shmget_args {
+       key_t key;
+       int size;
+       int shmflg;
+};
 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;
@@ -149,7 +158,8 @@ shmget(p, uap, retval)
                shmh->shmh_kva = 0;
                shmh->shmh_id = (caddr_t)(0xc0000000|rval);     /* XXX */
                error = vm_mmap(shm_map, &shmh->shmh_kva, ctob(size),
                shmh->shmh_kva = 0;
                shmh->shmh_id = (caddr_t)(0xc0000000|rval);     /* XXX */
                error = vm_mmap(shm_map, &shmh->shmh_kva, ctob(size),
-                               VM_PROT_ALL, MAP_ANON, shmh->shmh_id, 0);
+                               VM_PROT_ALL, VM_PROT_ALL,
+                               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;
@@ -159,7 +169,7 @@ shmget(p, uap, retval)
                shmtot += size;
                shp->shm_perm.cuid = shp->shm_perm.uid = cred->cr_uid;
                shp->shm_perm.cgid = shp->shm_perm.gid = cred->cr_gid;
                shmtot += size;
                shp->shm_perm.cuid = shp->shm_perm.uid = cred->cr_uid;
                shp->shm_perm.cgid = shp->shm_perm.gid = cred->cr_gid;
-               shp->shm_perm.mode = SHM_ALLOC | (uap->shmflg&0777);
+               shp->shm_perm.mode = SHM_ALLOC | (uap->shmflg & ACCESSPERMS);
                shp->shm_segsz = uap->size;
                shp->shm_cpid = p->p_pid;
                shp->shm_lpid = shp->shm_nattch = 0;
                shp->shm_segsz = uap->size;
                shp->shm_cpid = p->p_pid;
                shp->shm_lpid = shp->shm_nattch = 0;
@@ -170,7 +180,8 @@ shmget(p, uap, retval)
                /* XXX: probably not the right thing to do */
                if (shp->shm_perm.mode & SHM_DEST)
                        return (EBUSY);
                /* XXX: probably not the right thing to do */
                if (shp->shm_perm.mode & SHM_DEST)
                        return (EBUSY);
-               if (error = ipcaccess(&shp->shm_perm, uap->shmflg&0777, cred))
+               if (error = ipcaccess(&shp->shm_perm, uap->shmflg & ACCESSPERMS,
+                           cred))
                        return (error);
                if (uap->size && uap->size > shp->shm_segsz)
                        return (EINVAL);
                        return (error);
                if (uap->size && uap->size > shp->shm_segsz)
                        return (EINVAL);
@@ -184,14 +195,15 @@ shmget(p, uap, retval)
 /*
  * Shared memory control
  */
 /*
  * Shared memory control
  */
+struct shmctl_args {
+       int shmid;
+       int cmd;
+       caddr_t buf;
+};
 /* ARGSUSED */
 shmctl(p, uap, retval)
        struct proc *p;
 /* ARGSUSED */
 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;
@@ -216,8 +228,8 @@ shmctl(p, uap, retval)
                        return (error);
                shp->shm_perm.uid = sbuf.shm_perm.uid;
                shp->shm_perm.gid = sbuf.shm_perm.gid;
                        return (error);
                shp->shm_perm.uid = sbuf.shm_perm.uid;
                shp->shm_perm.gid = sbuf.shm_perm.gid;
-               shp->shm_perm.mode = (shp->shm_perm.mode & ~0777)
-                       | (sbuf.shm_perm.mode & 0777);
+               shp->shm_perm.mode = (shp->shm_perm.mode & ~ACCESSPERMS)
+                       | (sbuf.shm_perm.mode & ACCESSPERMS);
                shp->shm_ctime = time.tv_sec;
                break;
 
                shp->shm_ctime = time.tv_sec;
                break;
 
@@ -241,13 +253,14 @@ shmctl(p, uap, retval)
 /*
  * Attach to shared memory segment.
  */
 /*
  * Attach to shared memory segment.
  */
+struct shmat_args {
+       int     shmid;
+       caddr_t shmaddr;
+       int     shmflg;
+};
 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;
@@ -304,8 +317,8 @@ shmat(p, uap, retval)
        else
                uva = (caddr_t)0x1000000;       /* XXX */
        error = vm_mmap(&p->p_vmspace->vm_map, (vm_offset_t *)&uva,
        else
                uva = (caddr_t)0x1000000;       /* XXX */
        error = vm_mmap(&p->p_vmspace->vm_map, (vm_offset_t *)&uva,
-           (vm_size_t)size, prot, flags,
-           ((struct shmhandle *)shp->shm_handle)->shmh_id, 0);
+                       (vm_size_t)size, prot, VM_PROT_ALL, 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;
@@ -323,12 +336,13 @@ shmat(p, uap, retval)
 /*
  * Detach from shared memory segment.
  */
 /*
  * Detach from shared memory segment.
  */
+struct shmdt_args {
+       caddr_t shmaddr;
+};
 /* ARGSUSED */
 shmdt(p, uap, retval)
        struct proc *p;
 /* ARGSUSED */
 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;
@@ -340,9 +354,10 @@ shmdt(p, uap, retval)
                    shmd->shmd_uva == (vm_offset_t)uap->shmaddr)
                        break;
        if (i == shminfo.shmseg)
                    shmd->shmd_uva == (vm_offset_t)uap->shmaddr)
                        break;
        if (i == shminfo.shmseg)
-               return(EINVAL);
+               return (EINVAL);
        shmufree(p, shmd);
        shmsegs[shmd->shmd_id % SHMMMNI].shm_lpid = p->p_pid;
        shmufree(p, shmd);
        shmsegs[shmd->shmd_id % SHMMMNI].shm_lpid = p->p_pid;
+       return (0);
 }
 
 shmfork(p1, p2, isvfork)
 }
 
 shmfork(p1, p2, isvfork)