| 267 | #endif |
| 268 | |
| 269 | static int |
| 270 | seminit(void) |
| 271 | { |
| 272 | struct prison *pr; |
| 273 | void **rsv; |
| 274 | int i, error; |
| 275 | osd_method_t methods[PR_MAXMETHOD] = { |
| 276 | [PR_METHOD_CHECK] = sem_prison_check, |
| 277 | [PR_METHOD_SET] = sem_prison_set, |
| 278 | [PR_METHOD_GET] = sem_prison_get, |
| 279 | [PR_METHOD_REMOVE] = sem_prison_remove, |
| 280 | }; |
| 281 | |
| 282 | sem = malloc(sizeof(struct sem) * seminfo.semmns, M_SEM, M_WAITOK); |
| 283 | sema = malloc(sizeof(struct semid_kernel) * seminfo.semmni, M_SEM, |
| 284 | M_WAITOK | M_ZERO); |
| 285 | sema_mtx = malloc(sizeof(struct mtx) * seminfo.semmni, M_SEM, |
| 286 | M_WAITOK | M_ZERO); |
| 287 | seminfo.semusz = SEMUSZ(seminfo.semume); |
| 288 | semu = malloc(seminfo.semmnu * seminfo.semusz, M_SEM, M_WAITOK); |
| 289 | |
| 290 | for (i = 0; i < seminfo.semmni; i++) { |
| 291 | sema[i].u.__sem_base = 0; |
| 292 | sema[i].u.sem_perm.mode = 0; |
| 293 | sema[i].u.sem_perm.seq = 0; |
| 294 | #ifdef MAC |
| 295 | mac_sysvsem_init(&sema[i]); |
| 296 | #endif |
| 297 | } |
| 298 | for (i = 0; i < seminfo.semmni; i++) |
| 299 | mtx_init(&sema_mtx[i], "semid", NULL, MTX_DEF); |
| 300 | LIST_INIT(&semu_free_list); |
| 301 | for (i = 0; i < seminfo.semmnu; i++) { |
| 302 | struct sem_undo *suptr = SEMU(i); |
| 303 | suptr->un_proc = NULL; |
| 304 | LIST_INSERT_HEAD(&semu_free_list, suptr, un_next); |
| 305 | } |
| 306 | LIST_INIT(&semu_list); |
| 307 | mtx_init(&sem_mtx, "sem", NULL, MTX_DEF); |
| 308 | mtx_init(&sem_undo_mtx, "semu", NULL, MTX_DEF); |
| 309 | semexit_tag = EVENTHANDLER_REGISTER(process_exit, semexit_myhook, NULL, |
| 310 | EVENTHANDLER_PRI_ANY); |
| 311 | |
| 312 | /* Set current prisons according to their allow.sysvipc. */ |
| 313 | sem_prison_slot = osd_jail_register(NULL, methods); |
| 314 | rsv = osd_reserve(sem_prison_slot); |
| 315 | prison_lock(&prison0); |
| 316 | (void)osd_jail_set_reserved(&prison0, sem_prison_slot, rsv, &prison0); |
| 317 | prison_unlock(&prison0); |
| 318 | rsv = NULL; |
| 319 | sx_slock(&allprison_lock); |
| 320 | TAILQ_FOREACH(pr, &allprison, pr_list) { |
| 321 | if (rsv == NULL) |
| 322 | rsv = osd_reserve(sem_prison_slot); |
| 323 | prison_lock(pr); |
| 324 | if (prison_isvalid(pr) && (pr->pr_allow & PR_ALLOW_SYSVIPC)) { |
| 325 | (void)osd_jail_set_reserved(pr, sem_prison_slot, rsv, |
| 326 | &prison0); |
no test coverage detected