Hello, getconf. This is a slight reinvention of the

wheel^H^H^H^H^HPOSIX.2 and X/Open utility, and rather
more complicated than necessary.
This commit is contained in:
Garrett Wollman 2000-04-26 02:36:54 +00:00
parent 94a0705727
commit 8c6bd995f0
8 changed files with 689 additions and 0 deletions

View File

@ -53,6 +53,7 @@ SUBDIR= apply \
genassym \
gencat \
gensetdefs \
getconf \
getopt \
global \
gprof \

13
usr.bin/getconf/Makefile Normal file
View File

@ -0,0 +1,13 @@
# $FreeBSD$
PROG= getconf
SRCS= confstr.c getconf.c pathconf.c sysconf.c
CLEANFILES+= confstr.c pathconf.c sysconf.c
.SUFFIXES: .gperf
.gperf.c:
gperf -t -L ANSI-C -C -k 1,2,7-10,21,'$$' ${.IMPSRC} >${.TARGET}
.include <bsd.prog.mk>

View File

@ -0,0 +1,35 @@
%{
/*
* Copyright is disclaimed as to the contents of this file.
*
* $FreeBSD$
*/
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include "getconf.h"
/*
* Override gperf's built-in external scope.
*/
static const struct map *in_word_set(const char *str, unsigned int len);
%}
struct map { char *name; int key; };
%%
PATH, _CS_PATH
%%
int
find_confstr(const char *name)
{
const struct map *rv;
rv = in_word_set(name, strlen(name));
if (rv != 0)
return rv->key;
else
return -1;
}

161
usr.bin/getconf/getconf.1 Normal file
View File

@ -0,0 +1,161 @@
.\"
.\" Copyright 2000 Massachusetts Institute of Technology
.\"
.\" Permission to use, copy, modify, and distribute this software and
.\" its documentation for any purpose and without fee is hereby
.\" granted, provided that both the above copyright notice and this
.\" permission notice appear in all copies, that both the above
.\" copyright notice and this permission notice appear in all
.\" supporting documentation, and that the name of M.I.T. not be used
.\" in advertising or publicity pertaining to distribution of the
.\" software without specific, written prior permission. M.I.T. makes
.\" no representations about the suitability of this software for any
.\" purpose. It is provided "as is" without express or implied
.\" warranty.
.\"
.\" THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS
.\" ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
.\" SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" $FreeBSD$
.\"
.Dd April 25, 2000
.Dt GETCONF 1
.Os
.Sh NAME
.Nm getconf
.Nd retrieve standard configuration variables
.Sh SYNOPSIS
.Nm getconf
.Op Fl v Ar environment
.Ar path_var
.Ar file
.Pp
.Nm getconf
.Op Fl v Ar environment
.Ar system_var
.Sh DESCRIPTION
The
.Nm getconf
utility outputs the value of
.Tn POSIX
or
.Tn X/Open
system or path configuration variable on the standard output.
If the specified variable is undefined, the string
.Dq Li undefined
is output.
.Pp
The first form of the command, with two mandatory
arguments, retrieves file- and filesystem-specific
configuration variables using
.Xr pathconf 2 .
The second form, with a single argument, retrieves system
configuration variables using
.Xr confstr 3
and
.Xr sysconf 3 ,
depending on the type of variable.
.Pp
All variables use the same name as the manifest constants defined in
the relevant standard C-language bindings, including any leading
underscore or prefix.
That is to say,
.Ar system_var
might be
.Dv ARG_MAX
or
.Dv _POSIX_VERSION ,
as opposed to the
.Xr sysconf 3
names
.Dv _SC_ARG_MAX
or
.Dv _SC_POSIX_VERSION .
(There is one exception: there is no corresponding manifest constant
to
.Dv _CS_PATH ,
so a
.Ar system_var
of
.Dq Li PATH
is used.)
.Pp
The
.Fl v Ar environment
option is not supported, but provided for compatibility purposes.
.Sh DIAGNOSTICS
The
.Nm getconf
utility exits 0 on success or >0 if an error occurred.
Use of a
.Ar system_var
or
.Ar path_var
which is completely unknown to the system is considered an error,
causing a diagnostic message to be written to standard error; one
which is known but merely undefined does not result in an error
indication.
.Pp
Use of the unsupported
.Fl v Ar environment
option will result in a diagnostic message indicating that it is not
supported.
.Sh EXAMPLES
The command:
.Bd -literal -offset indent
getconf PATH
.Ed
.Pp
will display the system default setting for the
.Ev PATH
environment variable.
.Pp
The command:
.Bd -literal -offset indent
getconf NAME_MAX /tmp
.Ed
.Pp
will display the maximum length of a filename in the
.Pa /tmp
directory.
.Sh SEE ALSO
.Xr confstr 3 ,
.Xr pathconf 2 ,
.Xr sysconf 3
.Sh STANDARDS
The
.Nm getconf
utility is expected to be compliant with
.St -susv2 .
.Sh HISTORY
The
.Nm getconf
command first appeared in
.Fx 5.0 .
.Sh BUGS
The original
.Tn X/Open
specification erroneously requires the return values of
.Xr pathconf 2
and
.Xr sysconf 3
to be printed using the
.Xr printf 3
format specifier
.Li \&"%d" .
We ignore that aspect of the specification and use the
correct
.Li \&"%ld"
format.
.Sh AUTHOR
.An Garrett A. Wollman Aq wollman@lcs.mit.edu

167
usr.bin/getconf/getconf.c Normal file
View File

@ -0,0 +1,167 @@
/*
* Copyright 2000 Massachusetts Institute of Technology
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby
* granted, provided that both the above copyright notice and this
* permission notice appear in all copies, that both the above
* copyright notice and this permission notice appear in all
* supporting documentation, and that the name of M.I.T. not be used
* in advertising or publicity pertaining to distribution of the
* software without specific, written prior permission. M.I.T. makes
* no representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied
* warranty.
*
* THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS
* ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
* SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#include <sys/types.h>
#include <err.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sysexits.h>
#include <unistd.h>
#include "getconf.h"
static void do_confstr(const char *name, int key);
static void do_sysconf(const char *name, int key);
static void do_pathconf(const char *name, int key, const char *path);
static void
usage(void)
{
fprintf(stderr, "usage:\n"
"\tgetconf [-v prog_model] system_var\n"
"\tgetconf [-v prog_model] path_var pathname\n");
exit(EX_USAGE);
}
int
main(int argc, char **argv)
{
int c;
const char *name, *vflag;
int key;
vflag = 0;
while ((c = getopt(argc, argv, "v:")) != -1) {
switch (c) {
case 'v':
vflag = optarg;
break;
default:
usage();
}
}
if (vflag)
warnx("-v %s ignored", vflag);
/* No arguments... */
if ((name = argv[optind]) == 0)
usage();
if (argv[optind + 1] == 0) { /* confstr or sysconf */
key = find_confstr(name);
if (key >= 0) {
do_confstr(name, key);
} else {
key = find_sysconf(name);
if (key >= 0)
do_sysconf(name, key);
else
errx(EX_USAGE,
"no such configuration parameter `%s'",
name);
}
} else {
key = find_pathconf(name);
if (key >= 0)
do_pathconf(name, key, argv[optind + 1]);
else
errx(EX_USAGE,
"no such path configuration parameter `%s'",
name);
}
return 0;
}
static void
do_confstr(const char *name, int key)
{
char *buf;
size_t len;
len = confstr(key, 0, 0);
if (len < 0)
err(EX_OSERR, "confstr: %s", name);
if (len == 0) {
printf("undefined\n");
} else {
buf = alloca(len);
confstr(key, buf, len);
printf("%s\n", buf);
}
}
static void
do_sysconf(const char *name, int key)
{
long value;
errno = 0;
value = sysconf(key);
if (value == -1 && errno != 0)
err(EX_OSERR, "sysconf: %s", name);
else if (value == -1)
printf("undefined\n");
else
/*
* SUSv2 specifies that the value, if defined, is to be
* printed using the format "%d\n". This is clearly
* erroneous, since sysconf is defined to return a long
* and not an int.
*/
printf("%ld\n", value);
}
static void
do_pathconf(const char *name, int key, const char *path)
{
long value;
errno = 0;
value = pathconf(path, key);
if (value == -1 && errno != 0)
err(EX_OSERR, "pathconf: %s", name);
else if (value == -1)
printf("undefined\n");
else
/*
* SUSv2 specifies that the value, if defined, is to be
* printed using the format "%d\n". This is clearly
* erroneous, since sysconf is defined to return a long
* and not an int.
*/
printf("%ld\n", value);
}

35
usr.bin/getconf/getconf.h Normal file
View File

@ -0,0 +1,35 @@
/*
* Copyright 2000 Massachusetts Institute of Technology
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby
* granted, provided that both the above copyright notice and this
* permission notice appear in all copies, that both the above
* copyright notice and this permission notice appear in all
* supporting documentation, and that the name of M.I.T. not be used
* in advertising or publicity pertaining to distribution of the
* software without specific, written prior permission. M.I.T. makes
* no representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied
* warranty.
*
* THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS
* ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
* SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
int find_confstr(const char *name);
int find_sysconf(const char *name);
int find_pathconf(const char *name);

View File

@ -0,0 +1,56 @@
%{
/*
* Copyright is disclaimed as to the contents of this file.
*
* $FreeBSD$
*/
#include <sys/types.h>
#include <limits.h>
#include <string.h>
#include <unistd.h>
#include "getconf.h"
/*
* Stuff that isn't defined right now -- we want this file to work
* unmodified once it is defined.
*/
#ifndef _PC_FILESIZEBITS
#define _PC_FILESIZEBITS -1
#endif
/*
* Override gperf's built-in external scope.
*/
static const struct map *in_word_set(const char *str, unsigned int len);
%}
struct map { char *name; int key; };
%%
FILESIZEBITS, _PC_FILESIZEBITS
LINK_MAX, _PC_LINK_MAX
MAX_CANON, _PC_MAX_CANON
MAX_INPUT, _PC_MAX_INPUT
NAME_MAX, _PC_NAME_MAX
PATH_MAX, _PC_PATH_MAX
PIPE_BUF, _PC_PIPE_BUF
_POSIX_CHOWN_RESTRICTED, _PC_CHOWN_RESTRICTED
_POSIX_NO_TRUNC, _PC_NO_TRUNC
_POSIX_VDISABLE, _PC_VDISABLE
_POSIX_ASYNC_IO, _PC_ASYNC_IO
_POSIX_PRIO_IO, _PC_PRIO_IO
_POSIX_SYNC_IO, _PC_SYNC_IO
%%
int
find_pathconf(const char *name)
{
const struct map *rv;
rv = in_word_set(name, strlen(name));
if (rv != 0)
return rv->key;
else
return -1;
}

View File

@ -0,0 +1,221 @@
%{
/*
* Copyright is disclaimed as to the contents of this file.
*
* $FreeBSD$
*/
#include <sys/types.h>
#include <limits.h>
#include <string.h>
#include <unistd.h>
#include "getconf.h"
/*
* Stuff that isn't defined right now -- we want this file to work
* unmodified once it is defined.
*/
#ifndef _SC_ATEXIT_MAX
#define _SC_ATEXIT_MAX -1
#endif
#ifndef _SC_TTY_NAME_MAX
#define _SC_TTY_NAME_MAX -1
#endif
#ifndef _SC_MQ_PRIO_MAX
#define _SC_MQ_PRIO_MAX -1
#endif
#ifndef _SC_IOV_MAX
#define _SC_IOV_MAX -1
#endif
#ifndef _SC_XOPEN_REALTIME
#define _SC_XOPEN_REALTIME -1
#endif
#ifndef _SC_XOPEN_LEGACY
#define _SC_XOPEN_LEGACY -1
#endif
#ifndef _SC_XCU_VERSION
#define _SC_XCU_VERSION -1
#endif
#ifndef _SC_PASS_MAX
#define _SC_PASS_MAX -1
#endif
#ifndef _SC_XOPEN_REALTIME_THREADS
#define _SC_XOPEN_REALTIME_THREADS -1
#endif
#ifndef _SC_LOGIN_NAME_MAX
#define _SC_LOGIN_NAME_MAX -1
#endif
#ifndef _SC_XBS5_LP64_OFF64
#define _SC_XBS5_LP64_OFF64 -1
#endif
#ifndef _SC_XOPEN_SHM
#define _SC_XOPEN_SHM -1
#endif
#ifndef _SC_XOPEN_CRYPT
#define _SC_XOPEN_CRYPT -1
#endif
#ifndef _SC_XOPEN_UNIX
#define _SC_XOPEN_UNIX -1
#endif
#ifndef _SC_XOPEN_VERSION
#define _SC_XOPEN_VERSION -1
#endif
#ifndef _SC_THREAD_DESTRUCTOR_ITERATIONS
#define _SC_THREAD_DESTRUCTOR_ITERATIONS -1
#endif
#ifndef _SC_THREAD_KEYS_MAX
#define _SC_THREAD_KEYS_MAX -1
#endif
#ifndef _SC_2_C_VERSION
#define _SC_2_C_VERSION -1
#endif
#ifndef _SC_XBS5_LPBIG_OFFBIG
#define _SC_XBS5_LPBIG_OFFBIG -1
#endif
#ifndef _SC_THREAD_THREADS_MAX
#define _SC_THREAD_THREADS_MAX -1
#endif
#ifndef _SC_XBS5_ILP32_OFF32
#define _SC_XBS5_ILP32_OFF32 -1
#endif
#ifndef _SC_XBS5_ILP32_OFFBIG
#define _SC_XBS5_ILP32_OFFBIG -1
#endif
#ifndef _SC_THREAD_STACK_MIN
#define _SC_THREAD_STACK_MIN -1
#endif
#ifndef _SC_XOPEN_ENH_I18N
#define _SC_XOPEN_ENH_I18N -1
#endif
#ifndef _SC_THREAD_ATTR_STACKSIZE
#define _SC_THREAD_ATTR_STACKSIZE -1
#endif
#ifndef _SC_THREAD_PRIORITY_SCHEDULING
#define _SC_THREAD_PRIORITY_SCHEDULING -1
#endif
#ifndef _SC_THREADS
#define _SC_THREADS -1
#endif
#ifndef _SC_THREAD_PROCESS_SHARED
#define _SC_THREAD_PROCESS_SHARED -1
#endif
#ifndef _SC_THREAD_SAFE_FUNCTIONS
#define _SC_THREAD_SAFE_FUNCTIONS -1
#endif
#ifndef _SC_THREAD_PRIO_PROTECT
#define _SC_THREAD_PRIO_PROTECT -1
#endif
#ifndef _SC_THREAD_ATTR_STACKADDR
#define _SC_THREAD_ATTR_STACKADDR -1
#endif
#ifndef _SC_THREAD_PRIO_INHERIT
#define _SC_THREAD_PRIO_INHERIT -1
#endif
/*
* Override gperf's built-in external scope.
*/
static const struct map *in_word_set(const char *str, unsigned int len);
%}
struct map { char *name; int key; };
%%
AIO_LISTIO_MAX, _SC_AIO_LISTIO_MAX
AIO_MAX, _SC_AIO_MAX
AIO_PRIO_DELTA_MAX, _SC_AIO_PRIO_DELTA_MAX
ARG_MAX, _SC_ARG_MAX
ATEXIT_MAX, _SC_ATEXIT_MAX
BC_BASE_MAX, _SC_BC_BASE_MAX
BC_DIM_MAX, _SC_BC_DIM_MAX
BC_SCALE_MAX, _SC_BC_SCALE_MAX
BC_STRING_MAX, _SC_BC_STRING_MAX
CHILD_MAX, _SC_CHILD_MAX
CLK_TCK, _SC_CLK_TCK
COLL_WEIGHTS_MAX, _SC_COLL_WEIGHTS_MAX
DELAYTIMER_MAX, _SC_DELAYTIMER_MAX
EXPR_NEST_MAX, _SC_EXPR_NEST_MAX
IOV_MAX, _SC_IOV_MAX
LINE_MAX, _SC_LINE_MAX
LOGIN_NAME_MAX, _SC_LOGIN_NAME_MAX
MQ_OPEN_MAX, _SC_MQ_OPEN_MAX
MQ_PRIO_MAX, _SC_MQ_PRIO_MAX
NGROUPS_MAX, _SC_NGROUPS_MAX
OPEN_MAX, _SC_OPEN_MAX
PAGESIZE, _SC_PAGESIZE
PAGE_SIZE, _SC_PAGESIZE
PASS_MAX, _SC_PASS_MAX
PTHREAD_DESTRUCTOR_ITERATIONS, _SC_THREAD_DESTRUCTOR_ITERATIONS
PTHREAD_KEYS_MAX, _SC_THREAD_KEYS_MAX
PTHREAD_STACK_MIN, _SC_THREAD_STACK_MIN
PTHREAD_THREADS_MAX, _SC_THREAD_THREADS_MAX
RE_DUP_MAX, _SC_RE_DUP_MAX
RTSIG_MAX, _SC_RTSIG_MAX
SEM_NSEMS_MAX, _SC_SEM_NSEMS_MAX
SEM_VALUE_MAX, _SC_SEM_VALUE_MAX
SIGQUEUE_MAX, _SC_SIGQUEUE_MAX
STREAM_MAX, _SC_STREAM_MAX
TIMER_MAX, _SC_TIMER_MAX
TTY_NAME_MAX, _SC_TTY_NAME_MAX
TZNAME_MAX, _SC_TZNAME_MAX
_POSIX2_CHAR_TERM, _SC_2_CHAR_TERM
_POSIX2_C_BIND, _SC_2_C_BIND
_POSIX2_C_DEV, _SC_2_C_DEV
_POSIX2_C_VERSION, _SC_2_C_VERSION
_POSIX2_FORT_DEV, _SC_2_FORT_DEV
_POSIX2_FORT_RUN, _SC_2_FORT_RUN
_POSIX2_LOCALEDEF, _SC_2_LOCALEDEF
_POSIX2_SW_DEV, _SC_2_SW_DEV
_POSIX2_UPE, _SC_2_UPE
_POSIX2_VERSION, _SC_2_VERSION
_POSIX_ASYNCHRONOUS_IO, _SC_ASYNCHRONOUS_IO
_POSIX_FSYNC, _SC_FSYNC
_POSIX_JOB_CONTROL, _SC_JOB_CONTROL
_POSIX_MAPPED_FILES, _SC_MAPPED_FILES
_POSIX_MEMLOCK, _SC_MEMLOCK
_POSIX_MEMLOCK_RANGE, _SC_MEMLOCK_RANGE
_POSIX_MEMORY_PROTECTION, _SC_MEMORY_PROTECTION
_POSIX_MESSAGE_PASSING, _SC_MESSAGE_PASSING
_POSIX_PRIORITIZED_IO, _SC_PRIORITIZED_IO
_POSIX_PRIORITY_SCHEDULING, _SC_PRIORITY_SCHEDULING
_POSIX_REALTIME_SIGNALS, _SC_REALTIME_SIGNALS
_POSIX_SAVED_IDS, _SC_SAVED_IDS
_POSIX_SEMAPHORES, _SC_SEMAPHORES
_POSIX_SHARED_MEMORY_OBJECTS, _SC_SHARED_MEMORY_OBJECTS
_POSIX_SYNCHRONIZED_IO, _SC_SYNCHRONIZED_IO
_POSIX_THREADS, _SC_THREADS
_POSIX_THREAD_ATTR_STACKADDR, _SC_THREAD_ATTR_STACKADDR
_POSIX_THREAD_ATTR_STACKSIZE, _SC_THREAD_ATTR_STACKSIZE
_POSIX_THREAD_PRIORITY_SCHEDULING, _SC_THREAD_PRIORITY_SCHEDULING
_POSIX_THREAD_PRIO_INHERIT, _SC_THREAD_PRIO_INHERIT
_POSIX_THREAD_PRIO_PROTECT, _SC_THREAD_PRIO_PROTECT
_POSIX_THREAD_PROCESS_SHARED, _SC_THREAD_PROCESS_SHARED
_POSIX_THREAD_SAFE_FUNCTIONS, _SC_THREAD_SAFE_FUNCTIONS
_POSIX_TIMERS, _SC_TIMERS
_POSIX_VERSION, _SC_VERSION
_XBS5_ILP32_OFF32, _SC_XBS5_ILP32_OFF32
_XBS5_ILP32_OFFBIG, _SC_XBS5_ILP32_OFFBIG
_XBS5_LP64_OFF64, _SC_XBS5_LP64_OFF64
_XBS5_LPBIG_OFFBIG, _SC_XBS5_LPBIG_OFFBIG
_XOPEN_CRYPT, _SC_XOPEN_CRYPT
_XOPEN_ENH_I18N, _SC_XOPEN_ENH_I18N
_XOPEN_LEGACY, _SC_XOPEN_LEGACY
_XOPEN_REALTIME, _SC_XOPEN_REALTIME
_XOPEN_REALTIME_THREADS, _SC_XOPEN_REALTIME_THREADS
_XOPEN_SHM, _SC_XOPEN_SHM
_XOPEN_UNIX, _SC_XOPEN_UNIX
_XOPEN_VERSION, _SC_XOPEN_VERSION
_XOPEN_XCU_VERSION, _SC_XCU_VERSION
%%
int
find_sysconf(const char *name)
{
const struct map *rv;
rv = in_word_set(name, strlen(name));
if (rv != 0)
return rv->key;
else
return -1;
}