diff --git a/lib/libc/gen/confstr.c b/lib/libc/gen/confstr.c index 753287dbc8b4..ad2e5a0959c3 100644 --- a/lib/libc/gen/confstr.c +++ b/lib/libc/gen/confstr.c @@ -38,48 +38,27 @@ static char sccsid[] = "@(#)confstr.c 8.1 (Berkeley) 6/4/93"; __FBSDID("$FreeBSD$"); #include -#include #include #include -#include #include #include size_t -confstr(name, buf, len) - int name; - char *buf; - size_t len; +confstr(int name, char *buf, size_t len) { - size_t tlen; - int mib[2], sverrno; - char *p; + const char *p; switch (name) { case _CS_PATH: - mib[0] = CTL_USER; - mib[1] = USER_CS_PATH; - if (sysctl(mib, 2, NULL, &tlen, NULL, 0) == -1) - return (-1); - if (len != 0 && buf != NULL) { - if ((p = malloc(tlen)) == NULL) - return (-1); - if (sysctl(mib, 2, p, &tlen, NULL, 0) == -1) { - sverrno = errno; - free(p); - errno = sverrno; - return (-1); - } - /* - * POSIX 1003.2 requires partial return of - * the string -- that should be *real* useful. - */ - (void)strncpy(buf, p, len - 1); - buf[len - 1] = '\0'; - free(p); - } - return (tlen + 1); + p = _PATH_STDPATH; + goto docopy; + +docopy: + if (len != 0 && buf != NULL) + strlcpy(buf, p, len); + return (strlen(p) + 1); + default: errno = EINVAL; return (0);