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 --- |