* 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_user.h"
#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;
/*
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 */
+void
shminit()
{
register int i;
}
}
+TEXT_SET(pseudo_set, shminit);
+
/*
* Entry point for all SHM calls
*/
u_int which;
};
+int
shmsys(p, uap, retval)
struct proc *p;
struct shmsys_args *uap;
int shmflg;
};
+static int
shmget(p, uap, retval)
struct proc *p;
register struct shmget_args *uap;
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),
- 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;
};
/* ARGSUSED */
+static int
shmctl(p, uap, retval)
struct proc *p;
register struct shmctl_args *uap;
int shmflg;
};
+static int
shmat(p, uap, retval)
struct proc *p;
register struct shmat_args *uap;
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;
};
/* ARGSUSED */
+static int
shmdt(p, uap, retval)
struct proc *p;
struct shmdt_args *uap;
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;
shmsegs[shmd->shmd_id % SHMMMNI].shm_nattch++;
}
+void
shmexit(p)
struct proc *p;
{
p->p_vmspace->vm_shm = NULL;
}
+static int
shmvalid(id)
register int id;
{
/*
* Free user resources associated with a shared memory segment
*/
+static void
shmufree(p, shmd)
struct proc *p;
struct shmdesc *shmd;
/*
* Deallocate resources associated with a shared memory segment
*/
+static void
shmfree(shp)
register struct shmid_ds *shp;
{
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 */