| 632 | }; |
| 633 | #endif |
| 634 | int |
| 635 | sys___semctl(struct thread *td, struct __semctl_args *uap) |
| 636 | { |
| 637 | struct semid_ds dsbuf; |
| 638 | union semun arg, semun; |
| 639 | register_t rval; |
| 640 | int error; |
| 641 | |
| 642 | switch (uap->cmd) { |
| 643 | case SEM_STAT: |
| 644 | case IPC_SET: |
| 645 | case IPC_STAT: |
| 646 | case GETALL: |
| 647 | case SETVAL: |
| 648 | case SETALL: |
| 649 | error = copyin(uap->arg, &arg, sizeof(arg)); |
| 650 | if (error) |
| 651 | return (error); |
| 652 | break; |
| 653 | } |
| 654 | |
| 655 | switch (uap->cmd) { |
| 656 | case SEM_STAT: |
| 657 | case IPC_STAT: |
| 658 | semun.buf = &dsbuf; |
| 659 | break; |
| 660 | case IPC_SET: |
| 661 | error = copyin(arg.buf, &dsbuf, sizeof(dsbuf)); |
| 662 | if (error) |
| 663 | return (error); |
| 664 | semun.buf = &dsbuf; |
| 665 | break; |
| 666 | case GETALL: |
| 667 | case SETALL: |
| 668 | semun.array = arg.array; |
| 669 | break; |
| 670 | case SETVAL: |
| 671 | semun.val = arg.val; |
| 672 | break; |
| 673 | } |
| 674 | |
| 675 | error = kern_semctl(td, uap->semid, uap->semnum, uap->cmd, &semun, |
| 676 | &rval); |
| 677 | if (error) |
| 678 | return (error); |
| 679 | |
| 680 | switch (uap->cmd) { |
| 681 | case SEM_STAT: |
| 682 | case IPC_STAT: |
| 683 | error = copyout(&dsbuf, arg.buf, sizeof(dsbuf)); |
| 684 | break; |
| 685 | } |
| 686 | |
| 687 | if (error == 0) |
| 688 | td->td_retval[0] = rval; |
| 689 | return (error); |
| 690 | } |
| 691 |
nothing calls this directly
no test coverage detected