| 1768 | }; |
| 1769 | #endif |
| 1770 | int |
| 1771 | freebsd7___semctl(struct thread *td, struct freebsd7___semctl_args *uap) |
| 1772 | { |
| 1773 | struct semid_ds_old dsold; |
| 1774 | struct semid_ds dsbuf; |
| 1775 | union semun_old arg; |
| 1776 | union semun semun; |
| 1777 | register_t rval; |
| 1778 | int error; |
| 1779 | |
| 1780 | switch (uap->cmd) { |
| 1781 | case SEM_STAT: |
| 1782 | case IPC_SET: |
| 1783 | case IPC_STAT: |
| 1784 | case GETALL: |
| 1785 | case SETVAL: |
| 1786 | case SETALL: |
| 1787 | error = copyin(uap->arg, &arg, sizeof(arg)); |
| 1788 | if (error) |
| 1789 | return (error); |
| 1790 | break; |
| 1791 | } |
| 1792 | |
| 1793 | switch (uap->cmd) { |
| 1794 | case SEM_STAT: |
| 1795 | case IPC_STAT: |
| 1796 | semun.buf = &dsbuf; |
| 1797 | break; |
| 1798 | case IPC_SET: |
| 1799 | error = copyin(arg.buf, &dsold, sizeof(dsold)); |
| 1800 | if (error) |
| 1801 | return (error); |
| 1802 | ipcperm_old2new(&dsold.sem_perm, &dsbuf.sem_perm); |
| 1803 | CP(dsold, dsbuf, __sem_base); |
| 1804 | CP(dsold, dsbuf, sem_nsems); |
| 1805 | CP(dsold, dsbuf, sem_otime); |
| 1806 | CP(dsold, dsbuf, sem_ctime); |
| 1807 | semun.buf = &dsbuf; |
| 1808 | break; |
| 1809 | case GETALL: |
| 1810 | case SETALL: |
| 1811 | semun.array = arg.array; |
| 1812 | break; |
| 1813 | case SETVAL: |
| 1814 | semun.val = arg.val; |
| 1815 | break; |
| 1816 | } |
| 1817 | |
| 1818 | error = kern_semctl(td, uap->semid, uap->semnum, uap->cmd, &semun, |
| 1819 | &rval); |
| 1820 | if (error) |
| 1821 | return (error); |
| 1822 | |
| 1823 | switch (uap->cmd) { |
| 1824 | case SEM_STAT: |
| 1825 | case IPC_STAT: |
| 1826 | bzero(&dsold, sizeof(dsold)); |
| 1827 | ipcperm_new2old(&dsbuf.sem_perm, &dsold.sem_perm); |
nothing calls this directly
no test coverage detected