diff --git a/lib/libc/gen/sysctlbyname.c b/lib/libc/gen/sysctlbyname.c --- a/lib/libc/gen/sysctlbyname.c +++ b/lib/libc/gen/sysctlbyname.c @@ -36,12 +36,28 @@ extern int __sysctlbyname(const char *name, size_t namelen, void *oldp, size_t *oldlenp, const void *newp, size_t newlen); +static int +sysctlbyname_user(const char *name, void *oldp, size_t *oldlenp, + const void *newp, size_t newlen) +{ + int real_oid[CTL_MAXNAME+2]; + size_t oidlen; + + oidlen = sizeof(real_oid) / sizeof(int); + if (sysctlnametomib(name, real_oid, &oidlen) < 0) + return (-1); + return (sysctl(real_oid, oidlen, oldp, oldlenp, newp, newlen)); +} + int sysctlbyname(const char *name, void *oldp, size_t *oldlenp, const void *newp, size_t newlen) { size_t len; + if (strncmp(name, "user.", 5) == 0) + return (sysctlbyname_user(name, oldp, oldlenp, newp, newlen)); + len = strlen(name); return (__sysctlbyname(name, len, oldp, oldlenp, newp, newlen));