| 915 | }; |
| 916 | #endif |
| 917 | int |
| 918 | sys_ksem_destroy(struct thread *td, struct ksem_destroy_args *uap) |
| 919 | { |
| 920 | struct file *fp; |
| 921 | struct ksem *ks; |
| 922 | int error; |
| 923 | |
| 924 | /* No capability rights required to close a semaphore. */ |
| 925 | AUDIT_ARG_FD(uap->id); |
| 926 | error = ksem_get(td, uap->id, &cap_no_rights, &fp); |
| 927 | if (error) |
| 928 | return (error); |
| 929 | ks = fp->f_data; |
| 930 | if (!(ks->ks_flags & KS_ANONYMOUS)) { |
| 931 | fdrop(fp, td); |
| 932 | return (EINVAL); |
| 933 | } |
| 934 | mtx_lock(&sem_lock); |
| 935 | if (ks->ks_waiters != 0) { |
| 936 | mtx_unlock(&sem_lock); |
| 937 | error = EBUSY; |
| 938 | goto err; |
| 939 | } |
| 940 | ks->ks_flags |= KS_DEAD; |
| 941 | mtx_unlock(&sem_lock); |
| 942 | |
| 943 | error = kern_close(td, uap->id); |
| 944 | err: |
| 945 | fdrop(fp, td); |
| 946 | return (error); |
| 947 | } |
| 948 | |
| 949 | static struct syscall_helper_data ksem_syscalls[] = { |
| 950 | SYSCALL_INIT_HELPER(ksem_init), |
nothing calls this directly
no test coverage detected