int ibcs2_sys_semsys(struct lwp *l, const struct ibcs2_sys_semsys_args *uap, register_t *retval) { #ifdef SYSVSEM /* { syscallarg(int) which; syscallarg(int) a2; syscallarg(int) a3; syscallarg(int) a4; syscallarg(int) a5; } */ struct semid_ds sembuf; struct ibcs2_semid_ds isembuf; void *pass_arg; int a5 = SCARG(uap, a5); int error; switch (SCARG(uap, which)) { case 0: /* semctl */ #define semctl_semid SCARG(uap, a2) #define semctl_semnum SCARG(uap, a3) #define semctl_cmd SCARG(uap, a4) #define semctl_arg ((union __semun *)&a5) pass_arg = get_semctl_arg(semctl_cmd, &sembuf, semctl_arg); if (semctl_cmd == IPC_SET) { error = copyin(semctl_arg->buf, &isembuf, sizeof isembuf); if (error != 0) return error; cvt_isemid2semid(&isembuf, &sembuf); } error = semctl1(l, semctl_semid, semctl_semnum, semctl_cmd, pass_arg, retval); if (error == 0 && semctl_cmd == IPC_STAT) { cvt_semid2isemid(&sembuf, &isembuf); error = copyout(&isembuf, semctl_arg->buf, sizeof(isembuf)); } return error; #undef semctl_semid #undef semctl_semnum #undef semctl_cmd #undef semctl_arg case 1: /* semget */ return compat_10_sys_semsys(l, (const void *)uap, retval); case 2: /* semop */ return compat_10_sys_semsys(l, (const void *)uap, retval); } #endif return EINVAL; }
int compat_14_sys___semctl(struct lwp *l, const struct compat_14_sys___semctl_args *uap, register_t *retval) { /* { syscallarg(int) semid; syscallarg(int) semnum; syscallarg(int) cmd; syscallarg(union __semun *) arg; } */ union __semun arg; struct semid_ds sembuf; struct semid_ds14 osembuf; int cmd, error; void *pass_arg; cmd = SCARG(uap, cmd); pass_arg = get_semctl_arg(cmd, &sembuf, &arg); if (pass_arg != NULL) { error = copyin(SCARG(uap, arg), &arg, sizeof(arg)); if (error) return (error); if (cmd == IPC_SET) { error = copyin(arg.buf, &osembuf, sizeof(osembuf)); if (error) return (error); __semid_ds14_to_native(&osembuf, &sembuf); } } error = semctl1(l, SCARG(uap, semid), SCARG(uap, semnum), cmd, pass_arg, retval); if (error == 0 && cmd == IPC_STAT) { __native_to_semid_ds14(&sembuf, &osembuf); error = copyout(&osembuf, arg.buf, sizeof(osembuf)); } return (error); }
int sys_____semctl50(struct lwp *l, const struct sys_____semctl50_args *uap, register_t *retval) { /* { syscallarg(int) semid; syscallarg(int) semnum; syscallarg(int) cmd; syscallarg(union __semun *) arg; } */ struct semid_ds sembuf; int cmd, error; void *pass_arg; union __semun karg; cmd = SCARG(uap, cmd); pass_arg = get_semctl_arg(cmd, &sembuf, &karg); if (pass_arg) { error = copyin(SCARG(uap, arg), &karg, sizeof(karg)); if (error) return error; if (cmd == IPC_SET) { error = copyin(karg.buf, &sembuf, sizeof(sembuf)); if (error) return (error); } } error = semctl1(l, SCARG(uap, semid), SCARG(uap, semnum), cmd, pass_arg, retval); if (error == 0 && cmd == IPC_STAT) error = copyout(&sembuf, karg.buf, sizeof(sembuf)); return (error); }