diff options
author | Philip Guenther <guenther@cvs.openbsd.org> | 2013-03-02 05:33:42 +0000 |
---|---|---|
committer | Philip Guenther <guenther@cvs.openbsd.org> | 2013-03-02 05:33:42 +0000 |
commit | 09e132f0b0a248f5f4bd563a997295aaf5148cde (patch) | |
tree | 224f1046b4dfde9a4405b4369954c3a41b48b3e5 /usr.bin | |
parent | 1d12523ffeb589ebb431f5cced7dff9df89cc904 (diff) |
Bring getconf(1) substantially up to spec with POSIX 1003.1-2008,
adding 155 new names as well as support for the -v option.
Also, add support for non-standard -L and -l options for listing
the known names. (Contrast with the Solaris/Linux -a option, whose
output is inconsistent and can't be reliably parsed.)
ports build tested by espie@
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/getconf/getconf.1 | 31 | ||||
-rw-r--r-- | usr.bin/getconf/getconf.c | 479 |
2 files changed, 439 insertions, 71 deletions
diff --git a/usr.bin/getconf/getconf.1 b/usr.bin/getconf/getconf.1 index ac6185b349f..2c81d1256c5 100644 --- a/usr.bin/getconf/getconf.1 +++ b/usr.bin/getconf/getconf.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: getconf.1,v 1.11 2010/09/03 11:09:28 jmc Exp $ +.\" $OpenBSD: getconf.1,v 1.12 2013/03/02 05:33:41 guenther Exp $ .\" $NetBSD: getconf.1,v 1.2 1996/04/20 01:15:12 jtc Exp $ .\" .\" Copyright (c) 1996 The NetBSD Foundation, Inc. @@ -33,7 +33,7 @@ .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .\" -.Dd $Mdocdate: September 3 2010 $ +.Dd $Mdocdate: March 2 2013 $ .Dt GETCONF 1 .Os .Sh NAME @@ -41,6 +41,8 @@ .Nd get configuration values .Sh SYNOPSIS .Nm getconf +.Op Fl Ll +.Op Fl v Ar specification .Ar name .Op Ar pathname .Sh DESCRIPTION @@ -56,6 +58,27 @@ The .Ar pathname argument must be supplied for system variables associated with a pathname. +.Pp +The options are as follows: +.Bl -tag -width Ds +.It Fl L +List the system variables that can be used with the +.Nm +utility that require a +.Ar pathname +argument. +.It Fl l +List the system variables that can be used with the +.Nm +utility without a +.Ar pathname +argument. +.It Fl v Ar specification +Indicate a specific version and compilation environment for which +configuration variables shall be queried. +.Ox does not change behavior for different compilation environments, +so the argument to this option is only checked for validity. +.El .Sh EXIT STATUS .Ex -std getconf .Sh SEE ALSO @@ -68,3 +91,7 @@ The utility is compliant with the .St -p1003.1-2008 specification. +.Pp +The flags +.Op Fl Ll +are extensions to that specification. diff --git a/usr.bin/getconf/getconf.c b/usr.bin/getconf/getconf.c index 8df444694f3..c256fbe07c8 100644 --- a/usr.bin/getconf/getconf.c +++ b/usr.bin/getconf/getconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getconf.c,v 1.12 2009/10/27 23:59:38 deraadt Exp $ */ +/* $OpenBSD: getconf.c,v 1.13 2013/03/02 05:33:41 guenther Exp $ */ /*- * Copyright (c) 1996 The NetBSD Foundation, Inc. @@ -50,6 +50,8 @@ #include <errno.h> static void usage(void); +static void list_var(int); +static int compilation_spec_valid(const char *); struct conf_variable { @@ -58,83 +60,340 @@ struct conf_variable long value; }; + +#define constant_row(name) { #name, CONSTANT, name }, +#define sysconf_row(name) { #name, SYSCONF, _SC_##name }, +#define pathconf_row(name) { #name, PATHCONF, _PC_##name }, +#define confstr_row(name) { #name, CONFSTR, _CS_##name }, +#define posix_constant_row(name) { #name, CONSTANT, _POSIX_##name }, +#define posix_confstr_row(name) { #name, CONFSTR, _CS_POSIX_##name }, +#define compat_posix2_sysconf_row(name) { #name, SYSCONF, _SC_2_##name }, +#define compat_posix2_constant_row(name) { #name, CONSTANT, _POSIX2_##name }, + +/* Some sysconf variables don't follow the pattern of the others */ +#define posix2_sysconf_row(name) \ + { "_POSIX2_" #name, SYSCONF, _SC_2_##name }, +#define posix2_pathconf_row(name) \ + { "_POSIX2_" #name, PATHCONF, _PC_2_##name }, +#define pthread_sysconf_row(name) \ + { "_PTHREAD_" #name, SYSCONF, _SC_THREAD_##name }, +#define xopen_sysconf_row(name) \ + { "_XOPEN_" #name, SYSCONF, _SC_XOPEN_##name }, + const struct conf_variable conf_table[] = { - { "PATH", CONFSTR, _CS_PATH }, + /* Configuration strings */ + confstr_row(PATH) + confstr_row(V7_ENV) + confstr_row(V6_ENV) - /* Utility Limit Minimum Values */ - { "POSIX2_BC_BASE_MAX", CONSTANT, _POSIX2_BC_BASE_MAX }, - { "POSIX2_BC_DIM_MAX", CONSTANT, _POSIX2_BC_DIM_MAX }, - { "POSIX2_BC_SCALE_MAX", CONSTANT, _POSIX2_BC_SCALE_MAX }, - { "POSIX2_BC_STRING_MAX", CONSTANT, _POSIX2_BC_STRING_MAX }, - { "POSIX2_COLL_WEIGHTS_MAX", CONSTANT, _POSIX2_COLL_WEIGHTS_MAX }, - { "POSIX2_EXPR_NEST_MAX", CONSTANT, _POSIX2_EXPR_NEST_MAX }, - { "POSIX2_LINE_MAX", CONSTANT, _POSIX2_LINE_MAX }, - { "POSIX2_RE_DUP_MAX", CONSTANT, _POSIX2_RE_DUP_MAX }, - { "POSIX2_VERSION", CONSTANT, _POSIX2_VERSION }, + /* Symbolic Utility Limits */ + sysconf_row(BC_BASE_MAX) + sysconf_row(BC_DIM_MAX) + sysconf_row(BC_SCALE_MAX) + sysconf_row(BC_STRING_MAX) + sysconf_row(COLL_WEIGHTS_MAX) + sysconf_row(EXPR_NEST_MAX) + sysconf_row(LINE_MAX) + sysconf_row(RE_DUP_MAX) + + /* POSIX.1 Configurable System Variables */ + sysconf_row(AIO_LISTIO_MAX) + sysconf_row(AIO_MAX) + sysconf_row(AIO_PRIO_DELTA_MAX) + sysconf_row(ARG_MAX) + sysconf_row(CHILD_MAX) + sysconf_row(CLK_TCK) + sysconf_row(NGROUPS_MAX) + sysconf_row(OPEN_MAX) + sysconf_row(STREAM_MAX) + sysconf_row(TZNAME_MAX) + sysconf_row(PAGE_SIZE) + sysconf_row(PAGESIZE) + + sysconf_row(SEM_NSEMS_MAX) + sysconf_row(SEM_VALUE_MAX) + sysconf_row(HOST_NAME_MAX) + sysconf_row(LOGIN_NAME_MAX) + + sysconf_row(ATEXIT_MAX) + sysconf_row(DELAYTIMER_MAX) + sysconf_row(IOV_MAX) + sysconf_row(MQ_OPEN_MAX) + sysconf_row(MQ_PRIO_MAX) + sysconf_row(RTSIG_MAX) + sysconf_row(SIGQUEUE_MAX) + sysconf_row(SYMLOOP_MAX) + sysconf_row(TIMER_MAX) + sysconf_row(TTY_NAME_MAX) + + posix2_sysconf_row(PBS) + posix2_sysconf_row(PBS_ACCOUNTING) + posix2_sysconf_row(PBS_CHECKPOINT) + posix2_sysconf_row(PBS_LOCATE) + posix2_sysconf_row(PBS_MESSAGE) + posix2_sysconf_row(PBS_TRACK) + + pthread_sysconf_row(DESTRUCTOR_ITERATIONS) + pthread_sysconf_row(KEYS_MAX) + pthread_sysconf_row(STACK_MIN) + pthread_sysconf_row(THREADS_MAX) + + xopen_sysconf_row(SHM) + xopen_sysconf_row(CRYPT) + xopen_sysconf_row(ENH_I18N) + xopen_sysconf_row(REALTIME) + xopen_sysconf_row(REALTIME_THREADS) + xopen_sysconf_row(STREAMS) + xopen_sysconf_row(UNIX) + xopen_sysconf_row(UUCP) + xopen_sysconf_row(VERSION) + + pathconf_row(FILESIZEBITS) + pathconf_row(LINK_MAX) + pathconf_row(MAX_CANON) + pathconf_row(MAX_INPUT) + pathconf_row(NAME_MAX) + pathconf_row(PATH_MAX) + pathconf_row(PIPE_BUF) + pathconf_row(SYMLINK_MAX) + + posix2_pathconf_row(SYMLINKS) + + constant_row(_POSIX2_CHARCLASS_NAME_MAX) + constant_row(_POSIX2_RE_DUP_MAX) + constant_row(_XOPEN_IOV_MAX) + constant_row(_XOPEN_NAME_MAX) + constant_row(_XOPEN_PATH_MAX) + + { NULL } +}; + +/* + * Lots of names have a leading "_POSIX_", so put them in a table with + * that prefix trimmed + */ +const char uposix_prefix[] = "_POSIX_"; +const struct conf_variable uposix_conf_table[] = +{ + /* POSIX.1 Maximum Values */ + posix_constant_row(CLOCKRES_MIN) /* POSIX.1 Minimum Values */ - { "_POSIX_ARG_MAX", CONSTANT, _POSIX_ARG_MAX }, - { "_POSIX_CHILD_MAX", CONSTANT, _POSIX_CHILD_MAX }, - { "_POSIX_LINK_MAX", CONSTANT, _POSIX_LINK_MAX }, - { "_POSIX_MAX_CANON", CONSTANT, _POSIX_MAX_CANON }, - { "_POSIX_MAX_INPUT", CONSTANT, _POSIX_MAX_INPUT }, - { "_POSIX_NAME_MAX", CONSTANT, _POSIX_NAME_MAX }, - { "_POSIX_NGROUPS_MAX", CONSTANT, _POSIX_NGROUPS_MAX }, - { "_POSIX_OPEN_MAX", CONSTANT, _POSIX_OPEN_MAX }, - { "_POSIX_PATH_MAX", CONSTANT, _POSIX_PATH_MAX }, - { "_POSIX_PIPE_BUF", CONSTANT, _POSIX_PIPE_BUF }, - { "_POSIX_SSIZE_MAX", CONSTANT, _POSIX_SSIZE_MAX }, - { "_POSIX_STREAM_MAX", CONSTANT, _POSIX_STREAM_MAX }, - { "_POSIX_TZNAME_MAX", CONSTANT, _POSIX_TZNAME_MAX }, + /*posix_constant_row(AIO_LISTIO_MAX)*/ + /*posix_constant_row(AIO_MAX)*/ + posix_constant_row(ARG_MAX) + posix_constant_row(ARG_MAX) + posix_constant_row(CHILD_MAX) + /*posix_constant_row(DELAYTIMER_MAX)*/ + posix_constant_row(HOST_NAME_MAX) + posix_constant_row(LINK_MAX) + posix_constant_row(LOGIN_NAME_MAX) + posix_constant_row(MAX_CANON) + posix_constant_row(MAX_INPUT) + /*posix_constant_row(MQ_OPEN_MAX)*/ + /*posix_constant_row(MQ_PRIO_MAX)*/ + posix_constant_row(NAME_MAX) + posix_constant_row(NGROUPS_MAX) + posix_constant_row(OPEN_MAX) + posix_constant_row(PATH_MAX) + posix_constant_row(PIPE_BUF) + posix_constant_row(RE_DUP_MAX) + /*posix_constant_row(RTSIG_MAX)*/ + posix_constant_row(SEM_NSEMS_MAX) + posix_constant_row(SEM_VALUE_MAX) + /*posix_constant_row(SIGQUEUE_MAX)*/ + posix_constant_row(SSIZE_MAX) + /*posix_constant_row(SS_REPL_MAX)*/ + posix_constant_row(STREAM_MAX) + posix_constant_row(SYMLINK_MAX) + posix_constant_row(SYMLOOP_MAX) + posix_constant_row(THREAD_DESTRUCTOR_ITERATIONS) + posix_constant_row(THREAD_KEYS_MAX) + posix_constant_row(THREAD_THREADS_MAX) + /*posix_constant_row(TIMER_MAX)*/ + posix_constant_row(TTY_NAME_MAX) + posix_constant_row(TZNAME_MAX) - /* Symbolic Utility Limits */ - { "BC_BASE_MAX", SYSCONF, _SC_BC_BASE_MAX }, - { "BC_DIM_MAX", SYSCONF, _SC_BC_DIM_MAX }, - { "BC_SCALE_MAX", SYSCONF, _SC_BC_SCALE_MAX }, - { "BC_STRING_MAX", SYSCONF, _SC_BC_STRING_MAX }, - { "COLL_WEIGHTS_MAX", SYSCONF, _SC_COLL_WEIGHTS_MAX }, - { "EXPR_NEST_MAX", SYSCONF, _SC_EXPR_NEST_MAX }, - { "LINE_MAX", SYSCONF, _SC_LINE_MAX }, - { "RE_DUP_MAX", SYSCONF, _SC_RE_DUP_MAX }, + /* POSIX.1 Configurable System Variables */ + sysconf_row(JOB_CONTROL) + sysconf_row(SAVED_IDS) + sysconf_row(VERSION) + sysconf_row(FSYNC) + sysconf_row(MONOTONIC_CLOCK) + sysconf_row(THREAD_SAFE_FUNCTIONS) + sysconf_row(ADVISORY_INFO) + sysconf_row(BARRIERS) + sysconf_row(ASYNCHRONOUS_IO) + sysconf_row(CLOCK_SELECTION) + sysconf_row(CPUTIME) + sysconf_row(IPV6) + sysconf_row(MAPPED_FILES) + sysconf_row(MEMLOCK) + sysconf_row(MEMLOCK_RANGE) + sysconf_row(MEMORY_PROTECTION) + sysconf_row(MESSAGE_PASSING) + sysconf_row(PRIORITIZED_IO) + sysconf_row(PRIORITY_SCHEDULING) + sysconf_row(RAW_SOCKETS) + sysconf_row(READER_WRITER_LOCKS) + sysconf_row(REALTIME_SIGNALS) + sysconf_row(REGEXP) + sysconf_row(SEMAPHORES) + sysconf_row(SHARED_MEMORY_OBJECTS) + sysconf_row(SHELL) + sysconf_row(SPAWN) + sysconf_row(SPIN_LOCKS) + sysconf_row(SPORADIC_SERVER) + sysconf_row(SS_REPL_MAX) + sysconf_row(SYNCHRONIZED_IO) + sysconf_row(THREAD_ATTR_STACKADDR) + sysconf_row(THREAD_ATTR_STACKSIZE) + sysconf_row(THREAD_CPUTIME) + sysconf_row(THREAD_PRIO_INHERIT) + sysconf_row(THREAD_PRIO_PROTECT) + sysconf_row(THREAD_PRIORITY_SCHEDULING) + sysconf_row(THREAD_PROCESS_SHARED) + sysconf_row(THREAD_ROBUST_PRIO_INHERIT) + sysconf_row(THREAD_SPORADIC_SERVER) + sysconf_row(THREADS) + sysconf_row(TIMEOUTS) + sysconf_row(TIMERS) + sysconf_row(TRACE) + sysconf_row(TRACE_EVENT_FILTER) + sysconf_row(TRACE_EVENT_NAME_MAX) + sysconf_row(TRACE_INHERIT) + sysconf_row(TRACE_LOG) + sysconf_row(TRACE_NAME_MAX) + sysconf_row(TRACE_SYS_MAX) + sysconf_row(TRACE_USER_EVENT_MAX) + sysconf_row(TYPED_MEMORY_OBJECTS) + + /* + * If new compilation specification are added (V8_*?) then add them + * to the compilation_specs array below too + */ + sysconf_row(V7_ILP32_OFF32) + sysconf_row(V7_ILP32_OFFBIG) + sysconf_row(V7_LP64_OFF64) + sysconf_row(V7_LPBIG_OFFBIG) + sysconf_row(V6_ILP32_OFF32) + sysconf_row(V6_ILP32_OFFBIG) + sysconf_row(V6_LP64_OFF64) + sysconf_row(V6_LPBIG_OFFBIG) + + /* POSIX.1 Configurable Path Variables */ + pathconf_row(CHOWN_RESTRICTED) + pathconf_row(NO_TRUNC) + pathconf_row(VDISABLE) + pathconf_row(ASYNC_IO) + pathconf_row(PRIO_IO) + pathconf_row(SYNC_IO) + /*pathconf_row(TIMESTAMP_RESOLUTION)*/ + { NULL } +}; + +/* + * Then there are the "POSIX_*" values + */ +const char posix_prefix[] = "POSIX_"; +const struct conf_variable posix_conf_table[] = +{ + pathconf_row(ALLOC_SIZE_MIN) + pathconf_row(REC_INCR_XFER_SIZE) + pathconf_row(REC_MAX_XFER_SIZE) + pathconf_row(REC_MIN_XFER_SIZE) + pathconf_row(REC_XFER_ALIGN) + + posix_confstr_row(V7_ILP32_OFF32_CFLAGS) + posix_confstr_row(V7_ILP32_OFF32_LDFLAGS) + posix_confstr_row(V7_ILP32_OFF32_LIBS) + posix_confstr_row(V7_ILP32_OFFBIG_CFLAGS) + posix_confstr_row(V7_ILP32_OFFBIG_LDFLAGS) + posix_confstr_row(V7_ILP32_OFFBIG_LIBS) + posix_confstr_row(V7_LP64_OFF64_CFLAGS) + posix_confstr_row(V7_LP64_OFF64_LDFLAGS) + posix_confstr_row(V7_LP64_OFF64_LIBS) + posix_confstr_row(V7_LPBIG_OFFBIG_CFLAGS) + posix_confstr_row(V7_LPBIG_OFFBIG_LDFLAGS) + posix_confstr_row(V7_LPBIG_OFFBIG_LIBS) + posix_confstr_row(V7_THREADS_CFLAGS) + posix_confstr_row(V7_THREADS_LDFLAGS) + posix_confstr_row(V7_WIDTH_RESTRICTED_ENVS) + posix_confstr_row(V6_ILP32_OFF32_CFLAGS) + posix_confstr_row(V6_ILP32_OFF32_LDFLAGS) + posix_confstr_row(V6_ILP32_OFF32_LIBS) + posix_confstr_row(V6_ILP32_OFFBIG_CFLAGS) + posix_confstr_row(V6_ILP32_OFFBIG_LDFLAGS) + posix_confstr_row(V6_ILP32_OFFBIG_LIBS) + posix_confstr_row(V6_LP64_OFF64_CFLAGS) + posix_confstr_row(V6_LP64_OFF64_LDFLAGS) + posix_confstr_row(V6_LP64_OFF64_LIBS) + posix_confstr_row(V6_LPBIG_OFFBIG_CFLAGS) + posix_confstr_row(V6_LPBIG_OFFBIG_LDFLAGS) + posix_confstr_row(V6_LPBIG_OFFBIG_LIBS) + posix_confstr_row(V6_WIDTH_RESTRICTED_ENVS) + + { NULL } +}; + +/* + * Finally, there are variables that are accepted with a prefix + * of either "_POSIX2_" or "POSIX2_" + */ +const char compat_posix2_prefix[] = "POSIX2_"; +const struct conf_variable compat_posix2_conf_table[] = +{ /* Optional Facility Configuration Values */ -#if 0 - { "POSIX2_C_BIND", SYSCONF, ??? }, -#endif - { "POSIX2_C_DEV", SYSCONF, _SC_2_C_DEV }, - { "POSIX2_CHAR_TERM", SYSCONF, _SC_2_CHAR_TERM }, - { "POSIX2_FORT_DEV", SYSCONF, _SC_2_FORT_DEV }, - { "POSIX2_FORT_RUN", SYSCONF, _SC_2_FORT_RUN }, - { "POSIX2_LOCALEDEF", SYSCONF, _SC_2_LOCALEDEF }, - { "POSIX2_SW_DEV", SYSCONF, _SC_2_SW_DEV }, - { "POSIX2_UPE", SYSCONF, _SC_2_UPE }, + compat_posix2_sysconf_row(VERSION) + compat_posix2_sysconf_row(C_BIND) + compat_posix2_sysconf_row(C_DEV) + compat_posix2_sysconf_row(CHAR_TERM) + compat_posix2_sysconf_row(FORT_DEV) + compat_posix2_sysconf_row(FORT_RUN) + compat_posix2_sysconf_row(LOCALEDEF) + compat_posix2_sysconf_row(SW_DEV) + compat_posix2_sysconf_row(UPE) - /* POSIX.1 Configurable System Variables */ - { "ARG_MAX", SYSCONF, _SC_ARG_MAX }, - { "CHILD_MAX", SYSCONF, _SC_CHILD_MAX }, - { "CLK_TCK", SYSCONF, _SC_CLK_TCK }, - { "NGROUPS_MAX", SYSCONF, _SC_NGROUPS_MAX }, - { "OPEN_MAX", SYSCONF, _SC_OPEN_MAX }, - { "STREAM_MAX", SYSCONF, _SC_STREAM_MAX }, - { "TZNAME_MAX", SYSCONF, _SC_TZNAME_MAX }, - { "_POSIX_JOB_CONTROL", SYSCONF, _SC_JOB_CONTROL }, - { "_POSIX_SAVED_IDS", SYSCONF, _SC_SAVED_IDS }, - { "_POSIX_VERSION", SYSCONF, _SC_VERSION }, - - { "LINK_MAX", PATHCONF, _PC_LINK_MAX }, - { "MAX_CANON", PATHCONF, _PC_MAX_CANON }, - { "MAX_INPUT", PATHCONF, _PC_MAX_INPUT }, - { "NAME_MAX", PATHCONF, _PC_NAME_MAX }, - { "PATH_MAX", PATHCONF, _PC_PATH_MAX }, - { "PIPE_BUF", PATHCONF, _PC_PIPE_BUF }, - { "_POSIX_CHOWN_RESTRICTED", PATHCONF, _PC_CHOWN_RESTRICTED }, - { "_POSIX_NO_TRUNC", PATHCONF, _PC_NO_TRUNC }, - { "_POSIX_VDISABLE", PATHCONF, _PC_VDISABLE }, + /* Utility Limit Minimum Values */ + compat_posix2_constant_row(BC_BASE_MAX) + compat_posix2_constant_row(BC_DIM_MAX) + compat_posix2_constant_row(BC_SCALE_MAX) + compat_posix2_constant_row(BC_STRING_MAX) + compat_posix2_constant_row(COLL_WEIGHTS_MAX) + compat_posix2_constant_row(EXPR_NEST_MAX) + compat_posix2_constant_row(LINE_MAX) + compat_posix2_constant_row(RE_DUP_MAX) { NULL } }; +#undef constant_row +#undef sysconf_row +#undef pathconf_row +#undef confstr_row +#undef posix_constant_row +#undef posix_confstr_row +#undef compat_posix2_sysconf_row +#undef compat_posix2_constant_row + + +/* + * What values are possibly accepted by the -v option? + * These are implied to have a prefix of posix_prefix + */ +const char *compilation_specs[] = { + "V7_ILP32_OFF32", + "V7_ILP32_OFFBIG", + "V7_LP64_OFF64", + "V7_LPBIG_OFFBIG", + "V6_ILP32_OFF32", + "V6_ILP32_OFFBIG", + "V6_LP64_OFF64", + "V6_LPBIG_OFFBIG", + NULL +}; int main(int argc, char *argv[]) @@ -148,8 +407,18 @@ main(int argc, char *argv[]) setlocale(LC_ALL, ""); - while ((ch = getopt(argc, argv, "")) != -1) { + while ((ch = getopt(argc, argv, "lLv:")) != -1) { switch (ch) { + case 'l': /* nonstandard: list system variables */ + list_var(0); + return (0); + case 'L': /* nonstandard: list path variables */ + list_var(1); + return (0); + case 'v': + if (! compilation_spec_valid(optarg)) + errx(1, "%s: unknown specification", optarg); + break; case '?': default: usage(); @@ -163,10 +432,39 @@ main(int argc, char *argv[]) /* NOTREACHED */ } - for (cp = conf_table; cp->name != NULL; cp++) { - if (strcmp(*argv, cp->name) == 0) + /* pick a table based on a possible prefix */ + if (strncmp(*argv, uposix_prefix, sizeof(uposix_prefix) - 1) == 0) { + cp = uposix_conf_table; + slen = sizeof(uposix_prefix) - 1; + } else if (strncmp(*argv, posix_prefix, + sizeof(posix_prefix) - 1) == 0) { + cp = posix_conf_table; + slen = sizeof(posix_prefix) - 1; + } else { + cp = conf_table; + slen = 0; + } + + /* scan the table */ + for (; cp->name != NULL; cp++) + if (strcmp(*argv + slen, cp->name) == 0) break; + + /* + * If no match, then make a final check against + * compat_posix2_conf_table, with special magic to accept/skip + * a leading underbar + */ + slen = argv[0][0] == '_'; + if (cp->name == NULL && strncmp(*argv + slen, compat_posix2_prefix, + sizeof(compat_posix2_prefix) - 1) == 0) { + slen += sizeof(compat_posix2_prefix) - 1; + for (cp = compat_posix2_conf_table; cp->name != NULL; cp++) { + if (strcmp(*argv + slen, cp->name) == 0) + break; + } } + if (cp->name == NULL) { errx(1, "%s: unknown variable", *argv); /* NOTREACHED */ @@ -238,6 +536,49 @@ usage(void) { extern char *__progname; - (void)fprintf(stderr, "usage: %s name [pathname]\n", __progname); + (void)fprintf(stderr, "usage: %s [-lL] [-v spec] name [pathname]\n", + __progname); exit(1); } + +static void +list_var(int do_pathconf) +{ + const struct conf_variable *cp; + + for (cp = uposix_conf_table; cp->name != NULL; cp++) + if ((cp->type == PATHCONF) == do_pathconf) + printf("%s%s\n", uposix_prefix, cp->name); + for (cp = posix_conf_table; cp->name != NULL; cp++) + if ((cp->type == PATHCONF) == do_pathconf) + printf("%s%s\n", posix_prefix, cp->name); + for (cp = conf_table; cp->name != NULL; cp++) + if ((cp->type == PATHCONF) == do_pathconf) + printf("%s\n", cp->name); + for (cp = compat_posix2_conf_table; cp->name != NULL; cp++) + if ((cp->type == PATHCONF) == do_pathconf) + printf("_%s%s\n", compat_posix2_prefix, cp->name); +} + +static int +compilation_spec_valid(const char *spec) +{ + const char **sp; + const struct conf_variable *cp; + + if (strncmp(spec, posix_prefix, sizeof(posix_prefix) - 1) != 0) + return (0); + + spec += sizeof(posix_prefix) - 1; + for (sp = compilation_specs; *sp != NULL; sp++) + if (strcmp(spec, *sp) == 0) + break; + if (*sp == NULL) + return (0); + + for (cp = uposix_conf_table; cp->name != NULL; cp++) + if (strcmp(spec, cp->name) == 0 && cp->type == SYSCONF) + return (sysconf(cp->value) != -1); + + return (0); +} |