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.
This commit is contained in:
wollman 2002-07-15 21:51:19 +00:00
parent 859a07fe0d
commit b2f83d271c

View File

@ -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);