#include <sys/param.h>
#include <sys/sysctl.h>
#include <errno.h>
#include <limits.h>
#include <paths.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
extern int __sysctl(const int *name, u_int namelen, void *oldp,
size_t *oldlenp, const void *newp, size_t newlen);
static int
set_user_str(void *dstp, size_t *dstlenp, const char *src, size_t len,
size_t maxlen)
{
int retval;
retval = 0;
if (dstp != NULL) {
if (len > maxlen) {
len = maxlen;
errno = ENOMEM;
retval = -1;
}
memcpy(dstp, src, len);
}
*dstlenp = len;
return (retval);
}
int
sysctl(const int *name, u_int namelen, void *oldp, size_t *oldlenp,
const void *newp, size_t newlen)
{
int retval;
size_t orig_oldlen;
orig_oldlen = oldlenp != NULL ? *oldlenp : 0;
retval = __sysctl(name, namelen, oldp, oldlenp, newp, newlen);
if (retval != 0 || name[0] != CTL_USER)
return (retval);
if (namelen != 2) {
errno = EINVAL;
return (-1);
}
switch (name[1]) {
case USER_LOCALBASE:
if (oldlenp == NULL || *oldlenp > sizeof(""))
return (0);
return (set_user_str(oldp, oldlenp, _PATH_LOCALBASE,
sizeof(_PATH_LOCALBASE), orig_oldlen));
}
if (newp != NULL) {
errno = EPERM;
return (-1);
}
switch (name[1]) {
case USER_CS_PATH:
return (set_user_str(oldp, oldlenp, _PATH_STDPATH,
sizeof(_PATH_STDPATH), orig_oldlen));
}
if (oldp != NULL && *oldlenp < sizeof(int)) {
errno = ENOMEM;
return (-1);
}
*oldlenp = sizeof(int);
if (oldp == NULL)
return (0);
switch (name[1]) {
case USER_BC_BASE_MAX:
*(int *)oldp = BC_BASE_MAX;
return (0);
case USER_BC_DIM_MAX:
*(int *)oldp = BC_DIM_MAX;
return (0);
case USER_BC_SCALE_MAX:
*(int *)oldp = BC_SCALE_MAX;
return (0);
case USER_BC_STRING_MAX:
*(int *)oldp = BC_STRING_MAX;
return (0);
case USER_COLL_WEIGHTS_MAX:
*(int *)oldp = COLL_WEIGHTS_MAX;
return (0);
case USER_EXPR_NEST_MAX:
*(int *)oldp = EXPR_NEST_MAX;
return (0);
case USER_LINE_MAX:
*(int *)oldp = LINE_MAX;
return (0);
case USER_RE_DUP_MAX:
*(int *)oldp = RE_DUP_MAX;
return (0);
case USER_POSIX2_VERSION:
*(int *)oldp = _POSIX2_VERSION;
return (0);
case USER_POSIX2_C_BIND:
#ifdef POSIX2_C_BIND
*(int *)oldp = 1;
#else
*(int *)oldp = 0;
#endif
return (0);
case USER_POSIX2_C_DEV:
#ifdef POSIX2_C_DEV
*(int *)oldp = 1;
#else
*(int *)oldp = 0;
#endif
return (0);
case USER_POSIX2_CHAR_TERM:
#ifdef POSIX2_CHAR_TERM
*(int *)oldp = 1;
#else
*(int *)oldp = 0;
#endif
return (0);
case USER_POSIX2_FORT_DEV:
#ifdef POSIX2_FORT_DEV
*(int *)oldp = 1;
#else
*(int *)oldp = 0;
#endif
return (0);
case USER_POSIX2_FORT_RUN:
#ifdef POSIX2_FORT_RUN
*(int *)oldp = 1;
#else
*(int *)oldp = 0;
#endif
return (0);
case USER_POSIX2_LOCALEDEF:
#ifdef POSIX2_LOCALEDEF
*(int *)oldp = 1;
#else
*(int *)oldp = 0;
#endif
return (0);
case USER_POSIX2_SW_DEV:
#ifdef POSIX2_SW_DEV
*(int *)oldp = 1;
#else
*(int *)oldp = 0;
#endif
return (0);
case USER_POSIX2_UPE:
#ifdef POSIX2_UPE
*(int *)oldp = 1;
#else
*(int *)oldp = 0;
#endif
return (0);
case USER_STREAM_MAX:
*(int *)oldp = FOPEN_MAX;
return (0);
case USER_TZNAME_MAX:
*(int *)oldp = NAME_MAX;
return (0);
default:
errno = EINVAL;
return (-1);
}
}