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:
parent
859a07fe0d
commit
b2f83d271c
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user