diff options
author | wollman <wollman@FreeBSD.org> | 2002-07-15 21:51:19 +0000 |
---|---|---|
committer | wollman <wollman@FreeBSD.org> | 2002-07-15 21:51:19 +0000 |
commit | b2f83d271c9761c87d3b169ea14f62b35a880814 (patch) | |
tree | 4bf81c05d119c46632e453f32469e476d333d754 | |
parent | 859a07fe0da4dd6d1d0a17b754583e1fdb10ff48 (diff) | |
download | FreeBSD-src-b2f83d271c9761c87d3b169ea14f62b35a880814.zip FreeBSD-src-b2f83d271c9761c87d3b169ea14f62b35a880814.tar.gz |
All of the things that confstr() returns are compile-time constants.
It's silly to call sysctl() to get the value of _PATH_STDPATH from
<paths.h> when we can just use it directly. This greatly simplifies
the implementation. (This is also part of my grand scheme to get
rid of sysctl's `user' category, which should never have been created.)
Use strlcpy() instead of strncpy() as it has the exact semantics we want.
-rw-r--r-- | lib/libc/gen/confstr.c | 41 |
1 files changed, 10 insertions, 31 deletions
diff --git a/lib/libc/gen/confstr.c b/lib/libc/gen/confstr.c index 753287d..ad2e5a0 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 <sys/param.h> -#include <sys/sysctl.h> #include <errno.h> #include <paths.h> -#include <stdlib.h> #include <unistd.h> #include <string.h> 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); |