| 2295 | #endif |
| 2296 | |
| 2297 | int |
| 2298 | kern___sysctlbyname(struct thread *td, const char *oname, size_t namelen, |
| 2299 | void *old, size_t *oldlenp, void *new, size_t newlen, size_t *retval, |
| 2300 | int flags, bool inkernel) |
| 2301 | { |
| 2302 | int oid[CTL_MAXNAME]; |
| 2303 | char namebuf[16]; |
| 2304 | char *name; |
| 2305 | size_t oidlen; |
| 2306 | int error; |
| 2307 | |
| 2308 | if (namelen > MAXPATHLEN || namelen == 0) |
| 2309 | return (EINVAL); |
| 2310 | name = namebuf; |
| 2311 | if (namelen > sizeof(namebuf)) |
| 2312 | name = malloc(namelen, M_SYSCTL, M_WAITOK); |
| 2313 | error = copyin(oname, name, namelen); |
| 2314 | if (error != 0) |
| 2315 | goto out; |
| 2316 | |
| 2317 | oid[0] = CTL_SYSCTL; |
| 2318 | oid[1] = CTL_SYSCTL_NAME2OID; |
| 2319 | oidlen = sizeof(oid); |
| 2320 | error = kernel_sysctl(td, oid, 2, oid, &oidlen, (void *)name, namelen, |
| 2321 | retval, flags); |
| 2322 | if (error != 0) |
| 2323 | goto out; |
| 2324 | error = userland_sysctl(td, oid, *retval / sizeof(int), old, oldlenp, |
| 2325 | inkernel, new, newlen, retval, flags); |
| 2326 | |
| 2327 | out: |
| 2328 | if (namelen > sizeof(namebuf)) |
| 2329 | free(name, M_SYSCTL); |
| 2330 | return (error); |
| 2331 | } |
| 2332 | |
| 2333 | #ifndef _SYS_SYSPROTO_H_ |
| 2334 | struct __sysctlbyname_args { |
no test coverage detected