summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwollman <wollman@FreeBSD.org>2002-07-15 21:51:19 +0000
committerwollman <wollman@FreeBSD.org>2002-07-15 21:51:19 +0000
commitb2f83d271c9761c87d3b169ea14f62b35a880814 (patch)
tree4bf81c05d119c46632e453f32469e476d333d754
parent859a07fe0da4dd6d1d0a17b754583e1fdb10ff48 (diff)
downloadFreeBSD-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.c41
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);
OpenPOWER on IntegriCloud