| 1937 | #endif |
| 1938 | |
| 1939 | int |
| 1940 | freebsd32_semctl(struct thread *td, struct freebsd32_semctl_args *uap) |
| 1941 | { |
| 1942 | struct semid_ds32 dsbuf32; |
| 1943 | struct semid_ds dsbuf; |
| 1944 | union semun semun; |
| 1945 | union semun32 arg; |
| 1946 | register_t rval; |
| 1947 | int error; |
| 1948 | |
| 1949 | switch (uap->cmd) { |
| 1950 | case SEM_STAT: |
| 1951 | case IPC_SET: |
| 1952 | case IPC_STAT: |
| 1953 | case GETALL: |
| 1954 | case SETVAL: |
| 1955 | case SETALL: |
| 1956 | error = copyin(uap->arg, &arg, sizeof(arg)); |
| 1957 | if (error) |
| 1958 | return (error); |
| 1959 | break; |
| 1960 | } |
| 1961 | |
| 1962 | switch (uap->cmd) { |
| 1963 | case SEM_STAT: |
| 1964 | case IPC_STAT: |
| 1965 | semun.buf = &dsbuf; |
| 1966 | break; |
| 1967 | case IPC_SET: |
| 1968 | error = copyin(PTRIN(arg.buf), &dsbuf32, sizeof(dsbuf32)); |
| 1969 | if (error) |
| 1970 | return (error); |
| 1971 | freebsd32_ipcperm_in(&dsbuf32.sem_perm, &dsbuf.sem_perm); |
| 1972 | PTRIN_CP(dsbuf32, dsbuf, __sem_base); |
| 1973 | CP(dsbuf32, dsbuf, sem_nsems); |
| 1974 | CP(dsbuf32, dsbuf, sem_otime); |
| 1975 | CP(dsbuf32, dsbuf, sem_ctime); |
| 1976 | semun.buf = &dsbuf; |
| 1977 | break; |
| 1978 | case GETALL: |
| 1979 | case SETALL: |
| 1980 | semun.array = PTRIN(arg.array); |
| 1981 | break; |
| 1982 | case SETVAL: |
| 1983 | semun.val = arg.val; |
| 1984 | break; |
| 1985 | } |
| 1986 | |
| 1987 | error = kern_semctl(td, uap->semid, uap->semnum, uap->cmd, &semun, |
| 1988 | &rval); |
| 1989 | if (error) |
| 1990 | return (error); |
| 1991 | |
| 1992 | switch (uap->cmd) { |
| 1993 | case SEM_STAT: |
| 1994 | case IPC_STAT: |
| 1995 | bzero(&dsbuf32, sizeof(dsbuf32)); |
| 1996 | freebsd32_ipcperm_out(&dsbuf.sem_perm, &dsbuf32.sem_perm); |
nothing calls this directly
no test coverage detected