Deleted Added
full compact
sysv_shm.c (2828) sysv_shm.c (3308)
1/* $Id: sysv_shm.c,v 1.1 1994/09/13 14:47:03 dfr Exp $ */
1/* $Id: sysv_shm.c,v 1.2 1994/09/16 17:43:22 dfr Exp $ */
2/* $NetBSD: sysv_shm.c,v 1.23 1994/07/04 23:25:12 glass Exp $ */
3
4/*
5 * Copyright (c) 1994 Adam Glass and Charles Hannum. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:

--- 197 unchanged lines hidden (view full) ---

207 shmmap_s = malloc(size, M_SHM, M_WAITOK);
208 for (i = 0; i < shminfo.shmseg; i++)
209 shmmap_s[i].shmid = -1;
210 p->p_vmspace->vm_shm = (caddr_t)shmmap_s;
211 }
212 shmseg = shm_find_segment_by_shmid(uap->shmid);
213 if (shmseg == NULL)
214 return EINVAL;
2/* $NetBSD: sysv_shm.c,v 1.23 1994/07/04 23:25:12 glass Exp $ */
3
4/*
5 * Copyright (c) 1994 Adam Glass and Charles Hannum. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:

--- 197 unchanged lines hidden (view full) ---

207 shmmap_s = malloc(size, M_SHM, M_WAITOK);
208 for (i = 0; i < shminfo.shmseg; i++)
209 shmmap_s[i].shmid = -1;
210 p->p_vmspace->vm_shm = (caddr_t)shmmap_s;
211 }
212 shmseg = shm_find_segment_by_shmid(uap->shmid);
213 if (shmseg == NULL)
214 return EINVAL;
215 if (error = ipcperm(cred, &shmseg->shm_perm,
216 (uap->shmflg & SHM_RDONLY) ? IPC_R : IPC_R|IPC_W))
215 error = ipcperm(cred, &shmseg->shm_perm,
216 (uap->shmflg & SHM_RDONLY) ? IPC_R : IPC_R|IPC_W);
217 if (error)
217 return error;
218 for (i = 0; i < shminfo.shmseg; i++) {
219 if (shmmap_s->shmid == -1)
220 break;
221 shmmap_s++;
222 }
223 if (i >= shminfo.shmseg)
224 return EMFILE;

--- 47 unchanged lines hidden (view full) ---

272
273int
274oshmctl(p, uap, retval)
275 struct proc *p;
276 struct oshmctl_args *uap;
277 int *retval;
278{
279#ifdef COMPAT_43
218 return error;
219 for (i = 0; i < shminfo.shmseg; i++) {
220 if (shmmap_s->shmid == -1)
221 break;
222 shmmap_s++;
223 }
224 if (i >= shminfo.shmseg)
225 return EMFILE;

--- 47 unchanged lines hidden (view full) ---

273
274int
275oshmctl(p, uap, retval)
276 struct proc *p;
277 struct oshmctl_args *uap;
278 int *retval;
279{
280#ifdef COMPAT_43
280 int error, segnum;
281 int error;
281 struct ucred *cred = p->p_ucred;
282 struct shmid_ds *shmseg;
283 struct oshmid_ds outbuf;
284
285 shmseg = shm_find_segment_by_shmid(uap->shmid);
286 if (shmseg == NULL)
287 return EINVAL;
288 switch (uap->cmd) {
289 case IPC_STAT:
282 struct ucred *cred = p->p_ucred;
283 struct shmid_ds *shmseg;
284 struct oshmid_ds outbuf;
285
286 shmseg = shm_find_segment_by_shmid(uap->shmid);
287 if (shmseg == NULL)
288 return EINVAL;
289 switch (uap->cmd) {
290 case IPC_STAT:
290 if (error = ipcperm(cred, &shmseg->shm_perm, IPC_R))
291 error = ipcperm(cred, &shmseg->shm_perm, IPC_R);
292 if (error)
291 return error;
292 outbuf.shm_perm = shmseg->shm_perm;
293 outbuf.shm_segsz = shmseg->shm_segsz;
294 outbuf.shm_cpid = shmseg->shm_cpid;
295 outbuf.shm_lpid = shmseg->shm_lpid;
296 outbuf.shm_nattch = shmseg->shm_nattch;
297 outbuf.shm_atime = shmseg->shm_atime;
298 outbuf.shm_dtime = shmseg->shm_dtime;
299 outbuf.shm_ctime = shmseg->shm_ctime;
300 outbuf.shm_handle = shmseg->shm_internal;
293 return error;
294 outbuf.shm_perm = shmseg->shm_perm;
295 outbuf.shm_segsz = shmseg->shm_segsz;
296 outbuf.shm_cpid = shmseg->shm_cpid;
297 outbuf.shm_lpid = shmseg->shm_lpid;
298 outbuf.shm_nattch = shmseg->shm_nattch;
299 outbuf.shm_atime = shmseg->shm_atime;
300 outbuf.shm_dtime = shmseg->shm_dtime;
301 outbuf.shm_ctime = shmseg->shm_ctime;
302 outbuf.shm_handle = shmseg->shm_internal;
301 if (error = copyout((caddr_t)&outbuf, uap->ubuf, sizeof(outbuf)))
303 error = copyout((caddr_t)&outbuf, uap->ubuf, sizeof(outbuf));
304 if (error)
302 return error;
303 break;
304 default:
305 return shmctl(p, uap, retval);
306 }
307 return 0;
308#else
309 return EINVAL;

--- 6 unchanged lines hidden (view full) ---

316 struct shmid_ds *ubuf;
317};
318int
319shmctl(p, uap, retval)
320 struct proc *p;
321 struct shmctl_args *uap;
322 int *retval;
323{
305 return error;
306 break;
307 default:
308 return shmctl(p, uap, retval);
309 }
310 return 0;
311#else
312 return EINVAL;

--- 6 unchanged lines hidden (view full) ---

319 struct shmid_ds *ubuf;
320};
321int
322shmctl(p, uap, retval)
323 struct proc *p;
324 struct shmctl_args *uap;
325 int *retval;
326{
324 int error, segnum;
327 int error;
325 struct ucred *cred = p->p_ucred;
326 struct shmid_ds inbuf;
327 struct shmid_ds *shmseg;
328
329 shmseg = shm_find_segment_by_shmid(uap->shmid);
330 if (shmseg == NULL)
331 return EINVAL;
332 switch (uap->cmd) {
333 case IPC_STAT:
328 struct ucred *cred = p->p_ucred;
329 struct shmid_ds inbuf;
330 struct shmid_ds *shmseg;
331
332 shmseg = shm_find_segment_by_shmid(uap->shmid);
333 if (shmseg == NULL)
334 return EINVAL;
335 switch (uap->cmd) {
336 case IPC_STAT:
334 if (error = ipcperm(cred, &shmseg->shm_perm, IPC_R))
337 error = ipcperm(cred, &shmseg->shm_perm, IPC_R);
338 if (error)
335 return error;
339 return error;
336 if (error = copyout((caddr_t)shmseg, uap->ubuf, sizeof(inbuf)))
340 error = copyout((caddr_t)shmseg, uap->ubuf, sizeof(inbuf));
341 if (error)
337 return error;
338 break;
339 case IPC_SET:
342 return error;
343 break;
344 case IPC_SET:
340 if (error = ipcperm(cred, &shmseg->shm_perm, IPC_M))
345 error = ipcperm(cred, &shmseg->shm_perm, IPC_M);
346 if (error)
341 return error;
347 return error;
342 if (error = copyin(uap->ubuf, (caddr_t)&inbuf, sizeof(inbuf)))
348 error = copyin(uap->ubuf, (caddr_t)&inbuf, sizeof(inbuf));
349 if (error)
343 return error;
344 shmseg->shm_perm.uid = inbuf.shm_perm.uid;
345 shmseg->shm_perm.gid = inbuf.shm_perm.gid;
346 shmseg->shm_perm.mode =
347 (shmseg->shm_perm.mode & ~ACCESSPERMS) |
348 (inbuf.shm_perm.mode & ACCESSPERMS);
349 shmseg->shm_ctime = time.tv_sec;
350 break;
351 case IPC_RMID:
350 return error;
351 shmseg->shm_perm.uid = inbuf.shm_perm.uid;
352 shmseg->shm_perm.gid = inbuf.shm_perm.gid;
353 shmseg->shm_perm.mode =
354 (shmseg->shm_perm.mode & ~ACCESSPERMS) |
355 (inbuf.shm_perm.mode & ACCESSPERMS);
356 shmseg->shm_ctime = time.tv_sec;
357 break;
358 case IPC_RMID:
352 if (error = ipcperm(cred, &shmseg->shm_perm, IPC_M))
359 error = ipcperm(cred, &shmseg->shm_perm, IPC_M);
360 if (error)
353 return error;
354 shmseg->shm_perm.key = IPC_PRIVATE;
355 shmseg->shm_perm.mode |= SHMSEG_REMOVED;
356 if (shmseg->shm_nattch <= 0) {
357 shm_deallocate_segment(shmseg);
358 shm_last_free = IPCID_TO_IX(uap->shmid);
359 }
360 break;

--- 27 unchanged lines hidden (view full) ---

388 shmseg = &shmsegs[segnum];
389 if (shmseg->shm_perm.mode & SHMSEG_REMOVED) {
390 /*
391 * This segment is in the process of being allocated. Wait
392 * until it's done, and look the key up again (in case the
393 * allocation failed or it was freed).
394 */
395 shmseg->shm_perm.mode |= SHMSEG_WANTED;
361 return error;
362 shmseg->shm_perm.key = IPC_PRIVATE;
363 shmseg->shm_perm.mode |= SHMSEG_REMOVED;
364 if (shmseg->shm_nattch <= 0) {
365 shm_deallocate_segment(shmseg);
366 shm_last_free = IPCID_TO_IX(uap->shmid);
367 }
368 break;

--- 27 unchanged lines hidden (view full) ---

396 shmseg = &shmsegs[segnum];
397 if (shmseg->shm_perm.mode & SHMSEG_REMOVED) {
398 /*
399 * This segment is in the process of being allocated. Wait
400 * until it's done, and look the key up again (in case the
401 * allocation failed or it was freed).
402 */
403 shmseg->shm_perm.mode |= SHMSEG_WANTED;
396 if (error =
397 tsleep((caddr_t)shmseg, PLOCK | PCATCH, "shmget", 0))
404 error = tsleep((caddr_t)shmseg, PLOCK | PCATCH, "shmget", 0);
405 if (error)
398 return error;
399 return EAGAIN;
400 }
406 return error;
407 return EAGAIN;
408 }
401 if (error = ipcperm(cred, &shmseg->shm_perm, mode))
409 error = ipcperm(cred, &shmseg->shm_perm, mode);
410 if (error)
402 return error;
403 if (uap->size && uap->size > shmseg->shm_segsz)
404 return EINVAL;
405 if (uap->shmflg & (IPC_CREAT | IPC_EXCL) == (IPC_CREAT | IPC_EXCL))
406 return EEXIST;
407 *retval = IXSEQ_TO_IPCID(segnum, shmseg->shm_perm);
408 return 0;
409}

--- 75 unchanged lines hidden (view full) ---

485
486int
487shmget(p, uap, retval)
488 struct proc *p;
489 struct shmget_args *uap;
490 int *retval;
491{
492 int segnum, mode, error;
411 return error;
412 if (uap->size && uap->size > shmseg->shm_segsz)
413 return EINVAL;
414 if (uap->shmflg & (IPC_CREAT | IPC_EXCL) == (IPC_CREAT | IPC_EXCL))
415 return EEXIST;
416 *retval = IXSEQ_TO_IPCID(segnum, shmseg->shm_perm);
417 return 0;
418}

--- 75 unchanged lines hidden (view full) ---

494
495int
496shmget(p, uap, retval)
497 struct proc *p;
498 struct shmget_args *uap;
499 int *retval;
500{
501 int segnum, mode, error;
493 struct shmid_ds *shmseg;
494
495 mode = uap->shmflg & ACCESSPERMS;
496 if (uap->key != IPC_PRIVATE) {
497 again:
498 segnum = shm_find_segment_by_key(uap->key);
499 if (segnum >= 0) {
500 error = shmget_existing(p, uap, mode, segnum, retval);
501 if (error == EAGAIN)

--- 39 unchanged lines hidden (view full) ---

541 shmsegs[IPCID_TO_IX(shmmap_s->shmid)].shm_nattch++;
542}
543
544void
545shmexit(p)
546 struct proc *p;
547{
548 struct shmmap_state *shmmap_s;
502
503 mode = uap->shmflg & ACCESSPERMS;
504 if (uap->key != IPC_PRIVATE) {
505 again:
506 segnum = shm_find_segment_by_key(uap->key);
507 if (segnum >= 0) {
508 error = shmget_existing(p, uap, mode, segnum, retval);
509 if (error == EAGAIN)

--- 39 unchanged lines hidden (view full) ---

549 shmsegs[IPCID_TO_IX(shmmap_s->shmid)].shm_nattch++;
550}
551
552void
553shmexit(p)
554 struct proc *p;
555{
556 struct shmmap_state *shmmap_s;
549 struct shmid_ds *shmseg;
550 int i;
551
552 shmmap_s = (struct shmmap_state *)p->p_vmspace->vm_shm;
553 for (i = 0; i < shminfo.shmseg; i++, shmmap_s++)
554 if (shmmap_s->shmid != -1)
555 shm_delete_mapping(p, shmmap_s);
556 free((caddr_t)p->p_vmspace->vm_shm, M_SHM);
557 p->p_vmspace->vm_shm = NULL;

--- 19 unchanged lines hidden ---
557 int i;
558
559 shmmap_s = (struct shmmap_state *)p->p_vmspace->vm_shm;
560 for (i = 0; i < shminfo.shmseg; i++, shmmap_s++)
561 if (shmmap_s->shmid != -1)
562 shm_delete_mapping(p, shmmap_s);
563 free((caddr_t)p->p_vmspace->vm_shm, M_SHM);
564 p->p_vmspace->vm_shm = NULL;

--- 19 unchanged lines hidden ---