1/*
2 * ORIGINAL COPYRIGHT STATEMENT:
3 *
4 * Copyright (c) 1994 Winning Strategies, Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 *    must display the following acknowledgement:
17 *      This product includes software developed by Winning Strategies, Inc.
18 * 4. The name of the author may not be used to endorse or promote products
19 *    derived from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33/*
34 * POSIX.2 getconf utility
35 *
36 * Originally Written by:
37 *	J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc.
38 *
39 * Heavily modified for inclusion in bash by
40 *	Chet Ramey <chet@po.cwru.edu>
41 */
42
43#ifdef HAVE_CONFIG_H
44#  include <config.h>
45#endif
46
47#ifdef HAVE_SYS_PARAM_H
48#  include <sys/param.h>
49#endif
50
51#include <stdio.h>
52#ifdef HAVE_LIMITS_H
53#include <limits.h>
54#endif
55#ifdef HAVE_LOCALE_H
56#include <locale.h>
57#endif
58#ifdef HAVE_UNISTD_H
59#include <unistd.h>
60#endif
61#include <errno.h>
62
63#include "typemax.h"
64
65#include "bashansi.h"
66#include "shell.h"
67#include "builtins.h"
68#include "stdc.h"
69#include "common.h"
70#include "bashgetopt.h"
71
72#include "getconf.h"
73
74#ifndef errno
75extern int errno;
76#endif
77
78struct conf_variable
79{
80  const char *name;
81  enum { SYSCONF, CONFSTR, PATHCONF, CONSTANT, LLCONST, G_UNDEF } type;
82  long value;
83};
84
85#ifndef HAVE_CONFSTR
86static size_t confstr __P((int, char *, size_t));
87#endif
88
89#ifndef HAVE_SYSCONF
90static long sysconf __P((int));
91#endif
92
93#ifndef HAVE_PATHCONF
94static long pathconf __P((const char *, int));
95#endif
96
97/* Hack to `encode' values wider than long into a conf_variable */
98#define VAL_LLONG_MIN		-1000
99#define VAL_LLONG_MAX		-1001
100#define VAL_ULLONG_MAX		-1002
101
102static const struct conf_variable conf_table[] =
103{
104  /* POSIX.2 Configurable Variable Values */
105  { "PATH",			CONFSTR,	_CS_PATH		},
106  { "CS_PATH",			CONFSTR,	_CS_PATH		},
107
108  /* POSIX.1 Configurable Variable Values (only Solaris?) */
109#if defined (_CS_LFS_CFLAGS)
110  { "LFS_CFLAGS",		CONFSTR,	_CS_LFS_CFLAGS		},
111  { "LFS_LDFLAGS",		CONFSTR,	_CS_LFS_LDFLAGS		},
112  { "LFS_LIBS",			CONFSTR,	_CS_LFS_LIBS		},
113  { "LFS_LINTFLAGS",		CONFSTR,	_CS_LFS_LINTFLAGS	},
114#endif
115#if defined (_CS_LFS64_CFLAGS)
116  { "LFS64_CFLAGS",		CONFSTR,	_CS_LFS64_CFLAGS	},
117  { "LFS64_LDFLAGS",		CONFSTR,	_CS_LFS64_LDFLAGS	},
118  { "LFS64_LIBS",		CONFSTR,	_CS_LFS64_LIBS		},
119  { "LFS64_LINTFLAGS",		CONFSTR,	_CS_LFS64_LINTFLAGS	},
120#endif
121
122  /* Single UNIX Specification version 2 Configurable Variable Values.  The
123     SYSCONF variables say whether or not the appropriate CONFSTR variables
124     are available. */
125#if defined (_SC_XBS5_ILP32_OFF32)
126  { "XBS5_ILP32_OFF32",			SYSCONF,	_SC_XBS5_ILP32_OFF32	},
127  { "_XBS5_ILP32_OFF32",		SYSCONF,	_SC_XBS5_ILP32_OFF32	},
128#endif
129#if defined (_CS_XBS5_ILP32_OFF32_CFLAGS)
130  { "XBS5_ILP32_OFF32_CFLAGS",  	CONFSTR,	_CS_XBS5_ILP32_OFF32_CFLAGS },
131  { "XBS5_ILP32_OFF32_LDFLAGS",		CONFSTR,	_CS_XBS5_ILP32_OFF32_LDFLAGS },
132  { "XBS5_ILP32_OFF32_LIBS",    	CONFSTR,	_CS_XBS5_ILP32_OFF32_LIBS },
133  { "XBS5_ILP32_OFF32_LINTFLAGS",       CONFSTR,	_CS_XBS5_ILP32_OFF32_LINTFLAGS },
134#endif
135#if defined (_SC_XBS5_ILP32_OFFBIG)
136  { "XBS5_ILP32_OFFBIG",		SYSCONF,	_SC_XBS5_ILP32_OFFBIG	},
137  { "_XBS5_ILP32_OFFBIG",		SYSCONF,	_SC_XBS5_ILP32_OFFBIG	},
138#endif
139#if defined (_CS_XBS5_ILP32_OFFBIG_CFLAGS)
140  { "XBS5_ILP32_OFFBIG_CFLAGS", 	CONFSTR,	_CS_XBS5_ILP32_OFFBIG_CFLAGS },
141  { "XBS5_ILP32_OFFBIG_LDFLAGS",	CONFSTR,	_CS_XBS5_ILP32_OFFBIG_LDFLAGS },
142  { "XBS5_ILP32_OFFBIG_LIBS",   	CONFSTR,	_CS_XBS5_ILP32_OFFBIG_LIBS },
143  { "XBS5_ILP32_OFFBIG_LINTFLAGS",      CONFSTR,	_CS_XBS5_ILP32_OFFBIG_LINTFLAGS },
144#endif
145#if defined (_SC_XBS5_LP64_OFF64)
146  { "XBS5_LP64_OFF64",			SYSCONF,	_SC_XBS5_LP64_OFF64	},
147  { "_XBS5_LP64_OFF64",			SYSCONF,	_SC_XBS5_LP64_OFF64	},
148#endif
149#if defined (_CS_XBS5_LP64_OFF64_CFLAGS)
150  { "XBS5_LP64_OFF64_CFLAGS",   	CONFSTR,	_CS_XBS5_LP64_OFF64_CFLAGS },
151  { "XBS5_LP64_OFF64_LDFLAGS",  	CONFSTR,	_CS_XBS5_LP64_OFF64_LDFLAGS },
152  { "XBS5_LP64_OFF64_LIBS",     	CONFSTR,	_CS_XBS5_LP64_OFF64_LIBS },
153  { "XBS5_LP64_OFF64_LINTFLAGS",	CONFSTR,	_CS_XBS5_LP64_OFF64_LINTFLAGS },
154#endif
155#if defined (_SC_XBS5_LPBIG_OFFBIG)
156  { "XBS5_LPBIG_OFFBIG",		SYSCONF,	_SC_XBS5_LPBIG_OFFBIG	},
157  { "_XBS5_LPBIG_OFFBIG",		SYSCONF,	_SC_XBS5_LPBIG_OFFBIG	},
158#endif
159#if defined (_CS_XBS5_LPBIG_OFFBIG_CFLAGS)
160  { "XBS5_LPBIG_OFFBIG_CFLAGS", 	CONFSTR,	_CS_XBS5_LPBIG_OFFBIG_CFLAGS },
161  { "XBS5_LPBIG_OFFBIG_LDFLAGS",	CONFSTR,	_CS_XBS5_LPBIG_OFFBIG_LDFLAGS },
162  { "XBS5_LPBIG_OFFBIG_LIBS",   	CONFSTR,	_CS_XBS5_LPBIG_OFFBIG_LIBS },
163  { "XBS5_LPBIG_OFFBIG_LINTFLAGS",      CONFSTR,	_CS_XBS5_LPBIG_OFFBIG_LINTFLAGS },
164#endif
165
166  /* Single UNIX Specification version 3 (POSIX.1-200x) Configurable Variable
167     Values.  The SYSCONF variables say whether or not the appropriate CONFSTR
168     variables are available. */
169
170#if defined (_SC_POSIX_V6_ILP32_OFF32)
171  { "_POSIX_V6_ILP32_OFF32",		SYSCONF,	_SC_POSIX_V6_ILP32_OFF32  },
172#endif
173#if defined (_CS_POSIX_V6_ILP32_OFF32_CFLAGS)
174  { "POSIX_V6_ILP32_OFF32_CFLAGS",	CONFSTR,	_CS_POSIX_V6_ILP32_OFF32_CFLAGS },
175  { "POSIX_V6_ILP32_OFF32_LDFLAGS",	CONFSTR,	_CS_POSIX_V6_ILP32_OFF32_LDFLAGS },
176  { "POSIX_V6_ILP32_OFF32_LIBS",	CONFSTR,	_CS_POSIX_V6_ILP32_OFF32_LIBS },
177#endif
178#if defined (_CS_POSIX_V6_ILP32_OFF32_LINTFLAGS)
179  { "POSIX_V6_ILP32_OFF32_LINTFLAGS",	CONFSTR,	_CS_POSIX_V6_ILP32_OFF32_LINTFLAGS },
180#endif
181#if defined (_SC_POSIX_V6_ILP32_OFFBIG)
182  { "_POSIX_V6_ILP32_OFFBIG",		SYSCONF,	_SC_POSIX_V6_ILP32_OFFBIG },
183#endif
184#if defined (_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS)
185  { "POSIX_V6_ILP32_OFFBIG_CFLAGS",	CONFSTR,	_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS },
186  { "POSIX_V6_ILP32_OFFBIG_LDFLAGS",	CONFSTR,	_CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS },
187  { "POSIX_V6_ILP32_OFFBIG_LIBS",	CONFSTR,	_CS_POSIX_V6_ILP32_OFFBIG_LIBS },
188#endif
189#if defined (_CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS)
190  { "POSIX_V6_ILP32_OFFBIG_LINTFLAGS",	CONFSTR,	_CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS },
191#endif
192#if defined (_SC_POSIX_V6_LP64_OFF64)
193  { "_POSIX_V6_LP64_OFF64",		SYSCONF,	_SC_POSIX_V6_LP64_OFF64	  },
194#endif
195#if defined (_CS_POSIX_V6_LP64_OFF64_CFLAGS)
196  { "POSIX_V6_LP64_OFF64_CFLAGS",	CONFSTR,	_CS_POSIX_V6_LP64_OFF64_CFLAGS },
197  { "POSIX_V6_LP64_OFF64_LDFLAGS",	CONFSTR,	_CS_POSIX_V6_LP64_OFF64_LDFLAGS },
198  { "POSIX_V6_LP64_OFF64_LIBS",		CONFSTR,	_CS_POSIX_V6_LP64_OFF64_LIBS },
199#endif
200#if defined (CS_POSIX_V6_LP64_OFF64_LINTFLAGS)
201  { "POSIX_V6_LP64_OFF64_LINTFLAGS",	CONFSTR,	_CS_POSIX_V6_LP64_OFF64_LINTFLAGS },
202#endif
203#if defined (_SC_POSIX_V6_LPBIG_OFFBIG)
204  { "_POSIX_V6_LPBIG_OFFBIG",	SYSCONF,	_SC_POSIX_V6_LPBIG_OFFBIG },
205#endif
206#if defined (_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS)
207  { "POSIX_V6_LPBIG_OFFBIG_CFLAGS",	CONFSTR,	_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS },
208  { "POSIX_V6_LPBIG_OFFBIG_LDFLAGS",	CONFSTR,	_CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS },
209  { "POSIX_V6_LPBIG_OFFBIG_LIBS",	CONFSTR,	_CS_POSIX_V6_LPBIG_OFFBIG_LIBS },
210#endif
211#if defined (_CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS)
212  { "POSIX_V6_LPBIG_OFFBIG_LINTFLAGS",	CONFSTR,	_CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS },
213#endif
214
215#if defined (_CS_POSIX_V6_WIDTH_RESTRICTED_ENVS)
216  { "POSIX_6_WIDTH_RESTRICTED_ENVS",	CONFSTR,	_CS_POSIX_V6_WIDTH_RESTRICTED_ENVS },
217#endif
218
219  /* POSIX.2 Utility Limit Minimum Values */
220#ifdef _POSIX2_BC_BASE_MAX
221  { "POSIX2_BC_BASE_MAX",	CONSTANT,	_POSIX2_BC_BASE_MAX	},
222#else
223  { "POSIX2_BC_BASE_MAX",	G_UNDEF,	-1			},
224#endif
225#ifdef _POSIX2_BC_DIM_MAX
226  { "POSIX2_BC_DIM_MAX",	CONSTANT,	_POSIX2_BC_DIM_MAX	},
227#else
228  { "POSIX2_BC_DIM_MAX",	G_UNDEF,	-1			},
229#endif
230#ifdef _POSIX2_BC_SCALE_MAX
231  { "POSIX2_BC_SCALE_MAX",	CONSTANT,	_POSIX2_BC_SCALE_MAX	},
232#else
233  { "POSIX2_BC_SCALE_MAX",	G_UNDEF,	-1			},
234#endif
235#ifdef _POSIX2_BC_STRING_MAX
236  { "POSIX2_BC_STRING_MAX",	CONSTANT,	_POSIX2_BC_STRING_MAX	},
237#else
238  { "POSIX2_BC_STRING_MAX",	G_UNDEF,	-1			},
239#endif
240#ifdef _POSIX2_CHARCLASS_NAME_MAX
241  { "POSIX2_CHARCLASS_NAME_MAX",	CONSTANT,	_POSIX2_CHARCLASS_NAME_MAX },
242#else
243  { "POSIX2_CHARCLASS_NAME_MAX",	G_UNDEF,	-1			 },
244#endif
245#ifdef _POSIX2_COLL_WEIGHTS_MAX
246  { "POSIX2_COLL_WEIGHTS_MAX",	CONSTANT,	_POSIX2_COLL_WEIGHTS_MAX },
247#else
248  { "POSIX2_COLL_WEIGHTS_MAX",	G_UNDEF,	-1			 },
249#endif
250#if defined (_POSIX2_EQUIV_CLASS_MAX)
251  { "POSIX2_EQUIV_CLASS_MAX",	CONSTANT,	_POSIX2_EQUIV_CLASS_MAX	},
252#endif
253#ifdef _POSIX2_EXPR_NEST_MAX
254  { "POSIX2_EXPR_NEST_MAX",	CONSTANT,	_POSIX2_EXPR_NEST_MAX	},
255#else
256  { "POSIX2_EXPR_NEST_MAX",	G_UNDEF,	-1			},
257#endif
258#ifdef _POSIX2_LINE_MAX
259  { "POSIX2_LINE_MAX",		CONSTANT,	_POSIX2_LINE_MAX	},
260#else
261  { "POSIX2_LINE_MAX",		G_UNDEF,	-1			},
262#endif
263#ifdef _POSIX2_RE_DUP_MAX
264  { "POSIX2_RE_DUP_MAX",	CONSTANT,	_POSIX2_RE_DUP_MAX	},
265#else
266  { "POSIX2_RE_DUP_MAX",	G_UNDEF,	-1			},
267#endif
268#if defined (_POSIX2_VERSION)
269  { "POSIX2_VERSION",		CONSTANT,	_POSIX2_VERSION		},
270#else
271#  if !defined (_SC_2_VERSION)
272  { "POSIX2_VERSION",		G_UNDEF,	-1			},
273#  endif
274#endif
275
276#ifdef _POSIX2_BC_BASE_MAX
277  { "_POSIX2_BC_BASE_MAX",	CONSTANT,	_POSIX2_BC_BASE_MAX	},
278#else
279  { "_POSIX2_BC_BASE_MAX",	G_UNDEF,	-1			},
280#endif
281#ifdef _POSIX2_BC_DIM_MAX
282  { "_POSIX2_BC_DIM_MAX",	CONSTANT,	_POSIX2_BC_DIM_MAX	},
283#else
284  { "_POSIX2_BC_DIM_MAX",	G_UNDEF,	-1			},
285#endif
286#ifdef _POSIX2_BC_SCALE_MAX
287  { "_POSIX2_BC_SCALE_MAX",	CONSTANT,	_POSIX2_BC_SCALE_MAX	},
288#else
289  { "_POSIX2_BC_SCALE_MAX",	G_UNDEF,	-1			},
290#endif
291#ifdef _POSIX2_BC_STRING_MAX
292  { "_POSIX2_BC_STRING_MAX",	CONSTANT,	_POSIX2_BC_STRING_MAX	},
293#else
294  { "_POSIX2_BC_STRING_MAX",	G_UNDEF,	-1			},
295#endif
296#ifdef _POSIX2_CHARCLASS_NAME_MAX
297  { "_POSIX2_CHARCLASS_NAME_MAX",	CONSTANT,	_POSIX2_CHARCLASS_NAME_MAX },
298#else
299  { "_POSIX2_CHARCLASS_NAME_MAX",	G_UNDEF,	-1			 },
300#endif
301#ifdef _POSIX2_COLL_WEIGHTS_MAX
302  { "_POSIX2_COLL_WEIGHTS_MAX",	CONSTANT,	_POSIX2_COLL_WEIGHTS_MAX },
303#else
304  { "_POSIX2_COLL_WEIGHTS_MAX",	G_UNDEF,	-1			 },
305#endif
306#if defined (_POSIX2_EQUIV_CLASS_MAX)
307  { "POSIX2_EQUIV_CLASS_MAX",	CONSTANT,	_POSIX2_EQUIV_CLASS_MAX	},
308#endif
309#ifdef _POSIX2_EXPR_NEST_MAX
310  { "_POSIX2_EXPR_NEST_MAX",	CONSTANT,	_POSIX2_EXPR_NEST_MAX	},
311#else
312  { "_POSIX2_EXPR_NEST_MAX",	G_UNDEF,	-1			},
313#endif
314#ifdef _POSIX2_LINE_MAX
315  { "_POSIX2_LINE_MAX",		CONSTANT,	_POSIX2_LINE_MAX	},
316#else
317  { "_POSIX2_LINE_MAX",		G_UNDEF,	-1			},
318#endif
319#ifdef _POSIX2_RE_DUP_MAX
320  { "_POSIX2_RE_DUP_MAX",	CONSTANT,	_POSIX2_RE_DUP_MAX	},
321#else
322  { "_POSIX2_RE_DUP_MAX",	G_UNDEF,	-1			},
323#endif
324
325  /* X/OPEN Maxmimum Values */
326#ifdef _XOPEN_IOV_MAX
327  { "_XOPEN_IOV_MAX",		CONSTANT,	_XOPEN_IOV_MAX		},
328#else
329  { "_XOPEN_IOV_MAX",		G_UNDEF,	-1			},
330#endif
331#ifdef _XOPEN_NAME_MAX
332  { "_XOPEN_NAME_MAX",		CONSTANT,	_XOPEN_NAME_MAX		},
333#else
334  { "_XOPEN_NAME_MAX",		G_UNDEF,	-1			},
335#endif
336#ifdef _XOPEN_PATH_MAX
337  { "_XOPEN_PATH_MAX",		CONSTANT,	_XOPEN_PATH_MAX		},
338#else
339  { "_XOPEN_PATH_MAX",		G_UNDEF,	-1			},
340#endif
341
342  /* POSIX.1 Minimum Values */
343#ifdef _POSIX_AIO_LISTIO_MAX
344  { "_POSIX_AIO_LISTIO_MAX",	CONSTANT,	_POSIX_AIO_LISTIO_MAX	},
345#else
346  { "_POSIX_AIO_LISTIO_MAX",	G_UNDEF,	-1			},
347#endif
348#ifdef _POSIX_AIO_MAX
349  { "_POSIX_AIO_MAX",		CONSTANT,	_POSIX_AIO_MAX		},
350#else
351  { "_POSIX_AIO_MAX",		G_UNDEF,	-1			},
352#endif
353#ifdef _POSIX_ARG_MAX
354  { "_POSIX_ARG_MAX",		CONSTANT,	_POSIX_ARG_MAX		},
355#else
356  { "_POSIX_ARG_MAX",		G_UNDEF,	-1			},
357#endif
358#ifdef _POSIX_CHILD_MAX
359  { "_POSIX_CHILD_MAX",		CONSTANT,	_POSIX_CHILD_MAX	},
360#else
361  { "_POSIX_CHILD_MAX",		G_UNDEF,	-1			},
362#endif
363#ifdef _POSIX_DELAYTIMER_MAX
364  { "_POSIX_DELAYTIMER_MAX",	CONSTANT,	_POSIX_DELAYTIMER_MAX	},
365#else
366  { "_POSIX_DELAYTIMER_MAX",	G_UNDEF,	-1			},
367#endif
368#ifdef _POSIX_HOST_NAME_MAX
369  { "_POSIX_HOST_NAME_MAX",	CONSTANT,	_POSIX_HOST_NAME_MAX	},
370#else
371  { "_POSIX_HOST_NAME_MAX",	G_UNDEF,	-1			},
372#endif
373#ifdef _POSIX_LINK_MAX
374  { "_POSIX_LINK_MAX",		CONSTANT,	_POSIX_LINK_MAX		},
375#else
376  { "_POSIX_LINK_MAX",		G_UNDEF,	-1			},
377#endif
378#ifdef _POSIX_LOGIN_NAME_MAX
379  { "_POSIX_LOGIN_NAME_MAX",	CONSTANT,	_POSIX_LOGIN_NAME_MAX	},
380#else
381  { "_POSIX_LOGIN_NAME_MAX",	G_UNDEF,	-1			},
382#endif
383#ifdef _POSIX_MAX_CANON
384  { "_POSIX_MAX_CANON",		CONSTANT,	_POSIX_MAX_CANON	},
385#else
386  { "_POSIX_MAX_CANON",		G_UNDEF,	-1			},
387#endif
388#ifdef _POSIX_MAX_INPUT
389  { "_POSIX_MAX_INPUT",		CONSTANT,	_POSIX_MAX_INPUT	},
390#else
391  { "_POSIX_MAX_INPUT",		G_UNDEF,	-1			},
392#endif
393#ifdef _POSIX_MQ_OPEN_MAX
394  { "_POSIX_MQ_OPEN_MAX",	CONSTANT,	_POSIX_MQ_OPEN_MAX	},
395#else
396  { "_POSIX_MQ_OPEN_MAX",	G_UNDEF,	-1			},
397#endif
398#ifdef _POSIX_MQ_PRIO_MAX
399  { "_POSIX_MQ_PRIO_MAX",	CONSTANT,	_POSIX_MQ_PRIO_MAX	},
400#else
401  { "_POSIX_MQ_PRIO_MAX",	G_UNDEF,	-1			},
402#endif
403#ifdef _POSIX_NAME_MAX
404  { "_POSIX_NAME_MAX",		CONSTANT,	_POSIX_NAME_MAX		},
405#else
406  { "_POSIX_NAME_MAX",		G_UNDEF,	-1			},
407#endif
408#ifdef _POSIX_NGROUPS_MAX
409  { "_POSIX_NGROUPS_MAX",	CONSTANT,	_POSIX_NGROUPS_MAX	},
410#else
411  { "_POSIX_NGROUPS_MAX",	G_UNDEF,	-1			},
412#endif
413#ifdef _POSIX_OPEN_MAX
414  { "_POSIX_OPEN_MAX",		CONSTANT,	_POSIX_OPEN_MAX		},
415#else
416  { "_POSIX_OPEN_MAX",		G_UNDEF,	-1			},
417#endif
418#ifdef _POSIX_PATH_MAX
419  { "_POSIX_PATH_MAX",		CONSTANT,	_POSIX_PATH_MAX		},
420#else
421  { "_POSIX_PATH_MAX",		G_UNDEF,	-1			},
422#endif
423#ifdef _POSIX_PIPE_BUF
424  { "_POSIX_PIPE_BUF",		CONSTANT,	_POSIX_PIPE_BUF		},
425#else
426  { "_POSIX_PIPE_BUF",		G_UNDEF,	-1			},
427#endif
428#ifdef _POSIX_RE_DUP_MAX
429  { "_POSIX_RE_DUP_MAX",	CONSTANT,	_POSIX_RE_DUP_MAX	},
430#else
431  { "_POSIX_RE_DUP_MAX",	G_UNDEF,	-1			},
432#endif
433#ifdef _POSIX_RTSIG_MAX
434  { "_POSIX_RTSIG_MAX",		CONSTANT,	_POSIX_RTSIG_MAX	},
435#else
436  { "_POSIX_RTSIG_MAX",		G_UNDEF,	-1			},
437#endif
438#ifdef _POSIX_SEM_NSEMS_MAX
439  { "_POSIX_SEM_NSEMS_MAX",	CONSTANT,	_POSIX_SEM_NSEMS_MAX	},
440#else
441  { "_POSIX_SEM_NSEMS_MAX",	G_UNDEF,	-1			},
442#endif
443#ifdef _POSIX_SEM_VALUE_MAX
444  { "_POSIX_SEM_VALUE_MAX",	CONSTANT,	_POSIX_SEM_VALUE_MAX	},
445#else
446  { "_POSIX_SEM_VALUE_MAX",	G_UNDEF,	-1			},
447#endif
448#ifdef _POSIX_SIGQUEUE_MAX
449  { "_POSIX_SIGQUEUE_MAX",	CONSTANT,	_POSIX_SIGQUEUE_MAX	},
450#else
451  { "_POSIX_SIGQUEUE_MAX",	G_UNDEF,	-1			},
452#endif
453#ifdef _POSIX_SSIZE_MAX
454  { "_POSIX_SSIZE_MAX",		CONSTANT,	_POSIX_SSIZE_MAX	},
455#else
456  { "_POSIX_SSIZE_MAX",		G_UNDEF,	-1			},
457#endif
458#ifdef _POSIX_SS_REPL_MAX
459  { "_POSIX_SS_REPL_MAX",	CONSTANT,	_POSIX_SS_REPL_MAX	},
460#else
461  { "_POSIX_SS_REPL_MAX",	G_UNDEF,	-1			},
462#endif
463#ifdef _POSIX_STREAM_MAX
464  { "_POSIX_STREAM_MAX",	CONSTANT,	_POSIX_STREAM_MAX	},
465#else
466  { "_POSIX_STREAM_MAX",	G_UNDEF,	-1			},
467#endif
468#ifdef _POSIX_SYMLINK_MAX
469  { "_POSIX_SYMLINK_MAX",	CONSTANT,	_POSIX_SYMLINK_MAX	},
470#else
471  { "_POSIX_SYMLINK_MAX",	G_UNDEF,	-1			},
472#endif
473#ifdef _POSIX_SYMLOOP_MAX
474  { "_POSIX_SYMLOOP_MAX",	CONSTANT,	_POSIX_SYMLOOP_MAX	},
475#else
476  { "_POSIX_SYMLOOP_MAX",	G_UNDEF,	-1			},
477#endif
478#ifdef _POSIX_THREAD_DESTRUCTOR_ITERATIONS
479  { "_POSIX_THREAD_DESTRUCTOR_ITERATIONS",	CONSTANT,	_POSIX_THREAD_DESTRUCTOR_ITERATIONS	},
480#else
481  { "_POSIX_THREAD_DESTRUCTOR_ITERATIONS",	G_UNDEF,	-1	},
482#endif
483#ifdef _POSIX_THREAD_KEYS_MAX
484  { "_POSIX_THREAD_KEYS_MAX",	CONSTANT,	_POSIX_THREAD_KEYS_MAX	},
485#else
486  { "_POSIX_THREAD_KEYS_MAX",	G_UNDEF,	-1			},
487#endif
488#ifdef _POSIX_THREAD_THREADS_MAX
489  { "_POSIX_THREAD_THREADS_MAX",CONSTANT,	_POSIX_THREAD_THREADS_MAX },
490#else
491  { "_POSIX_THREAD_THREADS_MAX",G_UNDEF,	-1			},
492#endif
493#ifdef _POSIX_TIMER_MAX
494  { "_POSIX_TIMER_MAX",		CONSTANT,	_POSIX_TIMER_MAX	},
495#else
496  { "_POSIX_TIMER_MAX",		G_UNDEF,	-1			},
497#endif
498#ifdef _POSIX_TRACE_EVENT_NAME_MAX
499  { "_POSIX_TRACE_EVENT_NAME_MAX",	CONSTANT,	_POSIX_TRACE_EVENT_NAME_MAX	},
500#else
501  { "_POSIX_TRACE_EVENT_NAME_MAX",	G_UNDEF,	-1		},
502#endif
503#ifdef _POSIX_TRACE_NAME_MAX
504  { "_POSIX_TRACE_NAME_MAX",	CONSTANT,	_POSIX_TRACE_NAME_MAX	},
505#else
506  { "_POSIX_TRACE_NAME_MAX",	G_UNDEF,	-1			},
507#endif
508#ifdef _POSIX_TRACE_SYS_MAX
509  { "_POSIX_TRACE_SYS_MAX",	CONSTANT,	_POSIX_TRACE_SYS_MAX	},
510#else
511  { "_POSIX_TRACE_SYS_MAX",	G_UNDEF,	-1			},
512#endif
513#ifdef _POSIX_TRACE_USER_EVENT_MAX
514  { "_POSIX_TRACE_USER_EVENT_MAX",	CONSTANT,	_POSIX_TRACE_USER_EVENT_MAX	},
515#else
516  { "_POSIX_TRACE_USER_EVENT_MAX",	G_UNDEF,	-1		},
517#endif
518#ifdef _POSIX_TTY_NAME_MAX
519  { "_POSIX_TTY_NAME_MAX",	CONSTANT,	_POSIX_TTY_NAME_MAX	},
520#else
521  { "_POSIX_TTY_NAME_MAX",	G_UNDEF,	-1			},
522#endif
523#ifdef _POSIX_TZNAME_MAX
524  { "_POSIX_TZNAME_MAX",	CONSTANT,	_POSIX_TZNAME_MAX	},
525#else
526  { "_POSIX_TZNAME_MAX",	G_UNDEF,	-1			},
527#endif
528
529  /* POSIX.1 Maximum Values */
530#ifdef _POSIX_CLOCKRES_MIN
531  { "_POSIX_CLOCKRES_MIN",	CONSTANT,	_POSIX_CLOCKRES_MIN	},
532#else
533  { "_POSIX_CLOCKRES_MIN",	G_UNDEF,	-1			},
534#endif
535
536  /* POSIX.1-2001/XPG6 (and later) Runtime Invariants from <limits.h> */
537#ifdef _SC_SS_REPL_MAX
538  { "SS_REPL_MAX",		SYSCONF,	_SC_SS_REPL_MAX	},
539#endif
540#ifdef _SC_TRACE_EVENT_NAME_MAX
541  { "TRACE_EVENT_NAME_MAX",	SYSCONF,	_SC_TRACE_EVENT_NAME_MAX	},
542#endif
543#ifdef _SC_TRACE_NAME_MAX
544  { "TRACE_NAME_MAX",		SYSCONF,	_SC_TRACE_NAME_MAX	},
545#endif
546#ifdef _SC_TRACE_SYS_MAX
547  { "TRACE_SYS_MAX",		SYSCONF,	_SC_TRACE_SYS_MAX	},
548#endif
549#ifdef _SC_TRACE_USER_EVENT_MAX
550  { "TRACE_USER_EVENT_MAX",	SYSCONF,	_SC_TRACE_USER_EVENT_MAX	},
551#endif
552
553  /* POSIX.2/XPG 4.2 (and later) Symbolic Utility Limits */
554#ifdef _SC_BC_BASE_MAX
555  { "BC_BASE_MAX",		SYSCONF,	_SC_BC_BASE_MAX		},
556#endif
557#ifdef _SC_BC_DIM_MAX
558  { "BC_DIM_MAX",		SYSCONF,	_SC_BC_DIM_MAX		},
559#endif
560#ifdef _SC_BC_SCALE_MAX
561  { "BC_SCALE_MAX",		SYSCONF,	_SC_BC_SCALE_MAX	},
562#endif
563#ifdef _SC_BC_STRING_MAX
564  { "BC_STRING_MAX",		SYSCONF,	_SC_BC_STRING_MAX	},
565#endif
566#ifdef CHARCLASS_NAME_MAX
567  { "CHARCLASS_NAME_MAX",	CONSTANT,	CHARCLASS_NAME_MAX	},
568#endif
569#ifdef _SC_COLL_WEIGHTS_MAX
570  { "COLL_WEIGHTS_MAX",		SYSCONF,	_SC_COLL_WEIGHTS_MAX	},
571#endif
572#ifdef _SC_EXPR_NEST_MAX
573  { "EXPR_NEST_MAX",		SYSCONF,	_SC_EXPR_NEST_MAX	},
574#endif
575#ifdef _SC_LINE_MAX
576  { "LINE_MAX",			SYSCONF,	_SC_LINE_MAX		},
577#endif
578#  ifdef NL_ARGMAX
579  { "NL_ARGMAX",		CONSTANT,	NL_ARGMAX		},
580#endif
581#ifdef NL_LANGMAX
582  { "NL_LANGMAX",		CONSTANT,	NL_LANGMAX		},
583#endif
584#ifdef NL_MSGMAX
585  { "NL_MSGMAX",		CONSTANT,	NL_MSGMAX		},
586#endif
587#ifdef NL_NMAX
588  { "NL_NMAX",			CONSTANT,	NL_NMAX			},
589#endif
590#ifdef NL_SETMAX
591  { "NL_SETMAX",		CONSTANT,	NL_SETMAX		},
592#endif
593#ifdef NL_TEXTMAX
594  { "NL_TEXTMAX",		CONSTANT,	NL_TEXTMAX		},
595#endif
596#ifdef _SC_RAW_SOCKET
597  { "RAW_SOCKET",		SYSCONF,	_SC_RAW_SOCKET		},
598#endif
599#ifdef _SC_RE_DUP_MAX
600  { "RE_DUP_MAX",		SYSCONF,	_SC_RE_DUP_MAX		},
601#endif
602
603  /* POSIX.2 Optional Facility Configuration Values */
604#ifdef _SC_2_C_BIND
605  { "POSIX2_C_BIND",		SYSCONF,	_SC_2_C_BIND		},
606#else
607  { "POSIX2_C_BIND",		G_UNDEF,	-1			},
608#endif
609#ifdef _SC_2_C_DEV
610  { "POSIX2_C_DEV",		SYSCONF,	_SC_2_C_DEV		},
611#else
612  { "POSIX2_C_DEV",		G_UNDEF,	-1			},
613#endif
614#if defined (_SC_2_C_VERSION)
615  { "POSIX2_C_VERSION",		SYSCONF,	_SC_2_C_VERSION		},
616#else
617  { "POSIX2_C_VERSION",		G_UNDEF,	-1			},
618#endif
619#if defined (_SC_2_CHAR_TERM)
620  { "POSIX2_CHAR_TERM",		SYSCONF,	_SC_2_CHAR_TERM		},
621#else
622  { "POSIX2_CHAR_TERM",		G_UNDEF,	-1			},
623#endif
624#ifdef _SC_2_FORT_DEV
625  { "POSIX2_FORT_DEV",		SYSCONF,	_SC_2_FORT_DEV		},
626#else
627  { "POSIX2_FORT_DEV",		G_UNDEF,	-1			},
628#endif
629#ifdef _SC_2_FORT_RUN
630  { "POSIX2_FORT_RUN",		SYSCONF,	_SC_2_FORT_RUN		},
631#else
632  { "POSIX2_FORT_RUN",		G_UNDEF,	-1			},
633#endif
634#ifdef _SC_2_LOCALEDEF
635  { "POSIX2_LOCALEDEF",	SYSCONF,	_SC_2_LOCALEDEF		},
636#else
637  { "POSIX2_LOCALEDEF",	G_UNDEF,	-1			},
638#endif
639#ifdef _SC_2_SW_DEV
640  { "POSIX2_SW_DEV",		SYSCONF,	_SC_2_SW_DEV		},
641#else
642  { "POSIX2_SW_DEV",		G_UNDEF,	-1			},
643#endif
644#if defined (_SC2_UPE)
645  { "POSIX2_UPE",		SYSCONF,	_SC_2_UPE		},
646#else
647  { "POSIX2_UPE",		G_UNDEF,	-1			},
648#endif
649#if !defined (_POSIX2_VERSION) && defined (_SC_2_VERSION)
650  { "_POSIX2_VERSION",		SYSCONF,	_SC_2_VERSION		},
651#else
652  { "_POSIX2_VERSION",		G_UNDEF,	-1			},
653#endif
654#if defined (_SC_REGEX_VERSION)
655  { "REGEX_VERSION",		SYSCONF,	_SC_REGEX_VERSION	},
656  { "_REGEX_VERSION",		SYSCONF,	_SC_REGEX_VERSION	},
657#else
658  { "REGEX_VERSION",		G_UNDEF,	-1			},
659  { "_REGEX_VERSION",		G_UNDEF,	-1			},
660#endif
661
662#if defined (_SC_2_PBS)
663  { "_POSIX2_PBS",		SYSCONF,	_SC_2_PBS		},
664  { "_POSIX2_PBS_ACCOUNTING",	SYSCONF,	_SC_2_PBS_ACCOUNTING	},
665#  if defined (_SC_2_PBS_CHECKPOINT)
666  { "_POSIX2_PBS_CHECKPOINT",	SYSCONF,	_SC_2_PBS_CHECKPOINT	},
667#  endif
668  { "_POSIX2_PBS_LOCATE",	SYSCONF,	_SC_2_PBS_LOCATE	},
669  { "_POSIX2_PBS_MESSAGE",	SYSCONF,	_SC_2_PBS_MESSAGE	},
670  { "_POSIX2_PBS_TRACK",	SYSCONF,	_SC_2_PBS_TRACK		},
671#endif
672
673  /* POSIX.1 Configurable System Variables */
674#ifdef _SC_ARG_MAX
675  { "ARG_MAX",			SYSCONF,	_SC_ARG_MAX 		},
676#endif
677#ifdef _SC_CHILD_MAX
678  { "CHILD_MAX",		SYSCONF,	_SC_CHILD_MAX		},
679#endif
680#ifdef _SC_CLK_TCK
681  { "CLK_TCK",			SYSCONF,	_SC_CLK_TCK		},
682#endif
683#ifdef _SC_DELAYTIMER_MAX
684  { "DELAYTIMER_MAX",		SYSCONF,	_SC_DELAYTIMER_MAX	},
685#endif
686#ifdef _SC_NGROUPS_MAX
687  { "NGROUPS_MAX",		SYSCONF,	_SC_NGROUPS_MAX		},
688#endif
689#ifdef NZERO
690  { "NZERO",			CONSTANT,	NZERO			},
691#endif
692#ifdef _SC_OPEN_MAX
693  { "OPEN_MAX",			SYSCONF,	_SC_OPEN_MAX		},
694#endif
695#ifdef PASS_MAX
696  { "PASS_MAX",			CONSTANT,	PASS_MAX		},
697#endif
698#ifdef _SC_STREAM_MAX
699  { "STREAM_MAX",		SYSCONF,	_SC_STREAM_MAX		},
700#endif
701#ifdef TMP_MAX
702  { "TMP_MAX",			CONSTANT,	TMP_MAX			},
703#endif
704#ifdef _SC_TZNAME_MAX
705  { "TZNAME_MAX",		SYSCONF,	_SC_TZNAME_MAX		},
706#endif
707
708  /* POSIX.1 Optional Facility Configuration Values */
709#if defined (_SC_ADVISORY_INFO)
710  { "_POSIX_ADVISORY_INFO",	SYSCONF,	_SC_ADVISORY_INFO	},
711#endif
712#if defined (_SC_ASYNCHRONOUS_IO)
713  { "_POSIX_ASYNCHRONOUS_IO",	SYSCONF,	_SC_ASYNCHRONOUS_IO	},
714#endif
715#if defined (_SC_BARRIERS)
716  { "_POSIX_BARRIERS",		SYSCONF,	_SC_BARRIERS		},
717#endif
718#if defined (_SC_BASE)
719  { "_POSIX_BASE",		SYSCONF,	_SC_BASE		},
720#endif
721#if defined (_SC_C_LANG_SUPPORT)
722  { "_POSIX_C_LANG_SUPPORT",	SYSCONF,	_SC_C_LANG_SUPPORT	},
723#endif
724#if defined (_SC_C_LANG_SUPPORT_R)
725  { "_POSIX_C_LANG_SUPPORT_R",	SYSCONF,	_SC_C_LANG_SUPPORT_R	},
726#endif
727#if defined (_SC_CLOCK_SELECTION)
728  { "_POSIX_CLOCK_SELECTION",	SYSCONF,	_SC_CLOCK_SELECTION	},
729#endif
730#if defined (_SC_CPUTIME)
731  { "_POSIX_CPUTIME",		SYSCONF,	_SC_CPUTIME		},
732#endif
733#if defined (_SC_DEVICE_IO)
734  { "_POSIX_DEVICE_IO",		SYSCONF,	_SC_DEVICE_IO		},
735#endif
736#if defined (_SC_DEVICE_SPECIFIC)
737  { "_POSIX_DEVICE_SPECIFIC",	SYSCONF,	_SC_DEVICE_SPECIFIC	},
738#endif
739#if defined (_SC_DEVICE_SPECIFIC_R)
740  { "_POSIX_DEVICE_SPECIFIC_R",	SYSCONF,	_SC_DEVICE_SPECIFIC_R	},
741#endif
742#if defined (_SC_FD_MGMT)
743  { "_POSIX_FD_MGMT",		SYSCONF,	_SC_FD_MGMT		},
744#endif
745#if defined (_SC_FIFO)
746  { "_POSIX_FIFO",		SYSCONF,	_SC_FIFO		},
747#endif
748#if defined (_SC_FILE_ATTRIBUTES)
749  { "_POSIX_FILE_ATTRIBUTES",	SYSCONF,	_SC_FILE_ATTRIBUTES	},
750#endif
751#if defined (_SC_FILE_LOCKING)
752  { "_POSIX_FILE_LOCKING",	SYSCONF,	_SC_FILE_LOCKING	},
753#endif
754#if defined (_SC_FILE_SYSTEM)
755  { "_POSIX_FILE_SYSTEM",	SYSCONF,	_SC_FILE_SYSTEM		},
756#endif
757#if defined (_SC_FSYNC)
758  { "_POSIX_FSYNC",		SYSCONF,	_SC_FSYNC		},
759#endif
760#if defined (_SC_IPV6)
761  { "_POSIX_IPV6",		SYSCONF,	_SC_IPV6 		},
762#endif
763#if defined (_SC_JOB_CONTROL)
764  { "_POSIX_JOB_CONTROL",	SYSCONF,	_SC_JOB_CONTROL 	},
765#endif
766#if defined (_SC_MAPPED_FILES)
767  { "_POSIX_MAPPED_FILES",	SYSCONF,	_SC_MAPPED_FILES	},
768#endif
769#if defined (_SC_MEMLOCK)
770  { "_POSIX_MEMLOCK",		SYSCONF,	_SC_MEMLOCK		},
771#endif
772#if defined (_SC_MEMLOCK_RANGE)
773  { "_POSIX_MEMLOCK_RANGE",	SYSCONF,	_SC_MEMLOCK_RANGE	},
774#endif
775#if defined (_SC_MEMORY_PROTECTION)
776  { "_POSIX_MEMORY_PROTECTION",	SYSCONF,	_SC_MEMORY_PROTECTION	},
777#endif
778#if defined (_SC_MESSAGE_PASSING)
779  { "_POSIX_MESSAGE_PASSING",	SYSCONF,	_SC_MESSAGE_PASSING	},
780#endif
781#if defined (_SC_MONOTONIC_CLOCK)
782  { "_POSIX_MONOTONIC_CLOCK",	SYSCONF,	_SC_MONOTONIC_CLOCK	},
783#endif
784#if defined (_SC_MULTI_PROCESS)
785  { "_POSIX_MULTI_PROCESS",	SYSCONF,	_SC_MULTI_PROCESS	},
786#endif
787#if defined (_SC_NETWORKING)
788  { "_POSIX_NETWORKING",	SYSCONF,	_SC_NETWORKING		},
789#endif
790#if defined (_SC_PIPE)
791  { "_POSIX_PIPE",		SYSCONF,	_SC_PIPE		},
792#endif
793#if defined (SC_PRIORITIZED_IO)
794  { "_POSIX_PRIORITIZED_IO",	SYSCONF,	_SC_PRIORITIZED_IO	},
795#endif
796#if defined (_SC_PRIORITY_SCHEDULING)
797  { "_POSIX_PRIORITY_SCHEDULING", SYSCONF,	_SC_PRIORITY_SCHEDULING	},
798#endif
799#if defined (_SC_READER_WRITER_LOCKS)
800  { "_POSIX_READER_WRITER_LOCKS", SYSCONF,	_SC_READER_WRITER_LOCKS	},
801#endif
802#if defined (_SC_RAW_SOCKETS)
803  { "_POSIX_RAW_SOCKETS",	SYSCONF,	_SC_RAW_SOCKETS	},
804#endif
805#if defined (_SC_REALTIME_SIGNALS)
806  { "_POSIX_REALTIME_SIGNALS",	SYSCONF,	_SC_REALTIME_SIGNALS	},
807#endif
808#if defined (_SC_REGEXP)
809  { "_POSIX_REGEXP",		SYSCONF,	_SC_REGEXP		},
810#endif
811#if defined (_SC_SAVED_IDS)
812  { "_POSIX_SAVED_IDS",		SYSCONF,	_SC_SAVED_IDS		},
813#endif
814#if defined (_SC_SEMAPHORES)
815  { "_POSIX_SEMAPHORES",	SYSCONF,	_SC_SEMAPHORES		},
816#endif
817#if defined (_SC_SHARED_MEMORY_OBJECTS)
818  { "_POSIX_SHARED_MEMORY_OBJECTS", SYSCONF,	_SC_SHARED_MEMORY_OBJECTS },
819#endif
820  { "_POSIX_SHELL",		CONSTANT,	1			},
821#if defined (_SC_SIGNALS)
822  { "_POSIX_SIGNALS",		SYSCONF,	_SC_SIGNALS		},
823#endif
824#if defined (_SC_SINGLE_PROCESS)
825  { "_POSIX_SINGLE_PROCESS",	SYSCONF,	_SC_SINGLE_PROCESS	},
826#endif
827#if defined (_SC_SPAWN)
828  { "_POSIX_SPAWN",		SYSCONF,	_SC_SPAWN		},
829#endif
830#if defined (_SC_SPIN_LOCKS)
831  { "_POSIX_SPIN_LOCKS",	SYSCONF,	_SC_SPIN_LOCKS		},
832#endif
833#if defined (_SC_SPORADIC_SERVER)
834  { "_POSIX_SPORADIC_SERVER",	SYSCONF,	_SC_SPORADIC_SERVER	},
835#endif
836#if defined (_SC_SYMLOOP_MAX)
837  { "_POSIX_SYMLOOP_MAX",	SYSCONF,	_SC_SYMLOOP_MAX		},
838#endif
839#if defined (_SC_SYNCHRONIZED_IO)
840  { "_POSIX_SYNCHRONIZED_IO",	SYSCONF,	_SC_SYNCHRONIZED_IO	},
841#endif
842#if defined (_SC_SYSTEM_DATABASE)
843  { "_POSIX_SYSTEM_DATABASE",	SYSCONF,	_SC_SYSTEM_DATABASE	},
844#endif
845#if defined (_SC_SYSTEM_DATABASE_R)
846  { "_POSIX_SYSTEM_DATABASE_R",	SYSCONF,	_SC_SYSTEM_DATABASE_R	},
847#endif
848#if defined (_SC_THREAD_ATTR_STACKADDR)
849  { "_POSIX_THREAD_ATTR_STACKADDR", SYSCONF,	_SC_THREAD_ATTR_STACKADDR },
850#endif
851#if defined (_SC_THREAD_ATTR_STACKSIZE)
852  { "_POSIX_THREAD_ATTR_STACKSIZE", SYSCONF,	_SC_THREAD_ATTR_STACKSIZE },
853#endif
854#if defined (_SC_THREAD_CPUTIME)
855  { "_POSIX_THREAD_CPUTIME",	SYSCONF,	_SC_THREAD_CPUTIME },
856#endif
857#if defined (_SC_THREAD_PRIO_INHERIT)
858  { "_POSIX_THREAD_PRIO_INHERIT", SYSCONF,	_SC_THREAD_PRIO_INHERIT	},
859#endif
860#if defined (_SC_THREAD_PRIO_PROTECT)
861  { "_POSIX_THREAD_PRIO_PROTECT", SYSCONF,	_SC_THREAD_PRIO_PROTECT	},
862#endif
863#if defined (_SC_THREAD_PRIORITY_SCHEDULING)
864  { "_POSIX_THREAD_PRIORITY_SCHEDULING", SYSCONF, _SC_THREAD_PRIORITY_SCHEDULING },
865#endif
866#if defined (_SC_THREAD_PROCESS_SHARED)
867  { "_POSIX_THREAD_PROCESS_SHARED", SYSCONF,	_SC_THREAD_PROCESS_SHARED },
868#endif
869#if defined (_SC_THREAD_SAFE_FUNCTIONS)
870  { "_POSIX_THREAD_SAFE_FUNCTIONS", SYSCONF,	_SC_THREAD_SAFE_FUNCTIONS },
871#endif
872#if defined (_SC_THREAD_SPORADIC_SERVER)
873  { "_POSIX_THREAD_SPORADIC_SERVER", SYSCONF,	_SC_THREAD_SPORADIC_SERVER },
874#endif
875#if defined (_SC_THREADS)
876  { "_POSIX_THREADS",		SYSCONF,	_SC_THREADS		},
877#endif
878#if defined (_SC_TIMEOUTS)
879  { "_POSIX_TIMEOUTS",		SYSCONF,	_SC_TIMEOUTS		},
880#endif
881#if defined (_SC_TIMERS)
882  { "_POSIX_TIMERS",		SYSCONF,	_SC_TIMERS		},
883#endif
884#if defined (_SC_TRACE)
885  { "_POSIX_TRACE",		SYSCONF,	_SC_TRACE		},
886#endif
887#if defined (_SC_TRACE)
888  { "_POSIX_TRACE_EVENT_FILTER",SYSCONF,	_SC_TRACE_EVENT_FILTER	},
889#endif
890#if defined (_SC_TRACE)
891  { "_POSIX_TRACE_INHERIT",	SYSCONF,	_SC_TRACE_INHERIT	},
892#endif
893#if defined (_SC_TRACE)
894  { "_POSIX_TRACE_LOG",		SYSCONF,	_SC_TRACE_LOG		},
895#endif
896#if defined (_SC_TYPED_MEMORY_OBJECTS)
897  { "_POSIX_TYPED_MEMORY_OBJECTS", SYSCONF,	_SC_TYPED_MEMORY_OBJECTS },
898#endif
899#if defined (_SC_VERSION)
900  { "_POSIX_VERSION",		SYSCONF,	_SC_VERSION		},
901#endif
902
903  /* XPG 4.2 Configurable System Variables. */
904#if defined (_SC_ATEXIT_MAX)
905  { "ATEXIT_MAX",		SYSCONF,	_SC_ATEXIT_MAX		},
906#endif
907#if defined (_SC_GETGR_R_SIZE_MAX)
908  { "GETGR_R_SIZE_MAX",		SYSCONF,	_SC_GETGR_R_SIZE_MAX	},
909#endif
910#if defined (_SC_GETPW_R_SIZE_MAX)
911  { "GETPW_R_SIZE_MAX",		SYSCONF,	_SC_GETPW_R_SIZE_MAX	},
912#endif
913#if defined (_SC_HOST_NAME_MAX)
914  { "HOST_NAME_MAX",		SYSCONF,	_SC_HOST_NAME_MAX	},
915#endif
916#if defined (_SC_IOV_MAX)
917  { "IOV_MAX",			SYSCONF,	_SC_IOV_MAX		},
918#endif
919#if defined (_SC_LOGIN_NAME_MAX)
920  { "LOGIN_NAME_MAX",		SYSCONF,	_SC_LOGIN_NAME_MAX	},
921#endif
922#if defined (_SC_LOGNAME_MAX)
923  { "LOGNAME_MAX",		SYSCONF,	_SC_LOGNAME_MAX		},
924#endif
925#if defined (_SC_PAGESIZE)
926  { "PAGESIZE",			SYSCONF,	_SC_PAGESIZE		},
927#endif
928#if defined (_SC_PAGE_SIZE)
929  { "PAGE_SIZE",		SYSCONF,	_SC_PAGE_SIZE		},
930#endif
931#if defined (_SC_SYMLOOP_MAX)
932  { "SYMLOOP_MAX",		SYSCONF,	_SC_SYMLOOP_MAX		},
933#endif
934#if defined (_SC_TTY_NAME_MAX)
935  { "TTY_NAME_MAX",		SYSCONF,	_SC_TTY_NAME_MAX	},
936#endif
937#if defined (_SC_USER_GROUPS)
938  { "_POSIX_USER_GROUPS",	SYSCONF,	_SC_USER_GROUPS		},
939#endif
940#if defined (_SC_USER_GROUPS_R)
941  { "_POSIX_USER_GROUPS_R",	SYSCONF,	_SC_USER_GROUPS_R	},
942#endif
943
944#if defined (_SC_AIO_LISTIO_MAX)
945  { "AIO_LISTIO_MAX",		SYSCONF,	_SC_AIO_LISTIO_MAX	},
946#endif
947#if defined (_SC_AIO_MAX)
948  { "AIO_MAX",			SYSCONF,	_SC_AIO_MAX		},
949#endif
950#if defined (_SC_AIO_PRIO_DELTA_MAX)
951  { "AIO_PRIO_DELTA_MAX",	SYSCONF,	_SC_AIO_PRIO_DELTA_MAX	},
952#endif
953#if defined (_SC_MQ_OPEN_MAX)
954  { "MQ_OPEN_MAX",		SYSCONF,	_SC_MQ_OPEN_MAX		},
955#endif
956#if defined (_SC_MQ_PRIO_MAX)
957  { "MQ_PRIO_MAX",		SYSCONF,	_SC_MQ_PRIO_MAX		},
958#endif
959#if defined (_SC_RTSIG_MAX)
960  { "RTSIG_MAX",		SYSCONF,	_SC_RTSIG_MAX		},
961#endif
962#if defined (_SC_SEM_NSEMS_MAX)
963  { "SEM_NSEMS_MAX",		SYSCONF,	_SC_SEM_NSEMS_MAX	},
964#endif
965#if defined (_SC_SEM_VALUE_MAX)
966  { "SEM_VALUE_MAX",		SYSCONF,	_SC_SEM_VALUE_MAX	},
967#endif
968#if defined (_SC_SIGQUEUE_MAX)
969  { "SIGQUEUE_MAX",		SYSCONF,	_SC_SIGQUEUE_MAX	},
970#endif
971#if defined (_SC_TIMER_MAX)
972  { "TIMER_MAX",		SYSCONF,	_SC_TIMER_MAX		},
973#endif
974
975#if defined (_SC_THREAD_DESTRUCTOR_ITERATIONS)
976  { "PTHREAD_DESTRUCTOR_ITERATIONS", SYSCONF,	_SC_THREAD_DESTRUCTOR_ITERATIONS },
977#endif
978#if defined (_SC_THREAD_KEYS_MAX)
979  { "PTHREAD_KEYS_MAX",		SYSCONF,	_SC_THREAD_KEYS_MAX },
980#endif
981#if defined (_SC_THREAD_STACK_MIN)
982  { "PTHREAD_STACK_MIN",	SYSCONF,	_SC_THREAD_STACK_MIN },
983#endif
984#if defined (_SC_THREAD_THREADS_MAX)
985  { "PTHREAD_THREADS_MAX",	SYSCONF,	_SC_THREAD_THREADS_MAX },
986#endif
987
988  /* XPG 4.2 (and later) Optional Facility Configuration Values */
989#if defined (_SC_XOPEN_CRYPT)
990  { "_XOPEN_CRYPT",		SYSCONF,	_SC_XOPEN_CRYPT		},
991#endif
992#if defined (_SC_XOPEN_ENH_I18N)
993  { "_XOPEN_ENH_I18N",		SYSCONF,	_SC_XOPEN_ENH_I18N	},
994#endif
995#if defined (_SC_XOPEN_LEGACY)
996  { "_XOPEN_LEGACY",		SYSCONF,	_SC_XOPEN_LEGACY	},
997#endif /* _SC_XOPEN_LEGACY */
998#if defined (_SC_XOPEN_REALTIME)
999  { "_XOPEN_REALTIME",		SYSCONF,	_SC_XOPEN_REALTIME	},
1000#endif
1001#if defined (_SC_XOPEN_REALTIME_THREADS)
1002  { "_XOPEN_REALTIME_THREADS",	SYSCONF,	_SC_XOPEN_REALTIME_THREADS },
1003#endif
1004#if defined (_SC_XOPEN_SHM)
1005  { "_XOPEN_SHM",		SYSCONF,	_SC_XOPEN_SHM		},
1006#endif
1007#if defined (_SC_XOPEN_STREAMS)
1008  { "_XOPEN_STREAMS",		SYSCONF,	_SC_XOPEN_STREAMS	},
1009#endif
1010#if defined (_SC_XOPEN_UNIX)
1011  { "_XOPEN_UNIX",		SYSCONF,	_SC_XOPEN_UNIX		},
1012#endif
1013#if defined (_SC_XOPEN_VERSION)
1014  { "_XOPEN_VERSION",		SYSCONF,	_SC_XOPEN_VERSION	},
1015#endif
1016#if defined (_SC_XOPEN_XCU_VERSION)
1017  { "_XOPEN_XCU_VERSION",	SYSCONF,	_SC_XOPEN_XCU_VERSION	},
1018#endif
1019#if defined (_SC_XOPEN_XPG2)
1020  { "_XOPEN_XPG2",		SYSCONF,	_SC_XOPEN_XPG2		},
1021#endif
1022#if defined (_SC_XOPEN_XPG3)
1023  { "_XOPEN_XPG3",		SYSCONF,	_SC_XOPEN_XPG3		},
1024#endif
1025#if defined (_SC_XOPEN_XPG4)
1026  { "_XOPEN_XPG4",		SYSCONF,	_SC_XOPEN_XPG4		},
1027#endif
1028#if defined (_SC_XOPEN_XPG5)
1029  { "_XOPEN_XPG5",		SYSCONF,	_SC_XOPEN_XPG5		},
1030#endif
1031
1032  /* POSIX.1 Configurable Pathname Values */
1033#ifdef _PC_LINK_MAX
1034  { "LINK_MAX",			PATHCONF,	_PC_LINK_MAX		},
1035#endif
1036#ifdef _PC_MAX_CANON
1037  { "MAX_CANON",		PATHCONF,	_PC_MAX_CANON		},
1038#endif
1039#ifdef _PC_MAX_INPUT
1040  { "MAX_INPUT",		PATHCONF,	_PC_MAX_INPUT		},
1041#endif
1042#ifdef _PC_NAME_MAX
1043  { "NAME_MAX",			PATHCONF,	_PC_NAME_MAX		},
1044#endif
1045#ifdef _PC_PATH_MAX
1046  { "PATH_MAX",			PATHCONF,	_PC_PATH_MAX		},
1047#endif
1048#ifdef _PC_PIPE_BUF
1049  { "PIPE_BUF",			PATHCONF,	_PC_PIPE_BUF		},
1050#endif
1051#ifdef _PC_SYMLINK_MAX
1052  { "SYMLINK_MAX",		PATHCONF,	_PC_SYMLINK_MAX		},
1053#endif
1054#ifdef _PC_CHOWN_RESTRICTED
1055  { "_POSIX_CHOWN_RESTRICTED",	PATHCONF,	_PC_CHOWN_RESTRICTED	},
1056#endif
1057#ifdef _PC_NO_TRUNC
1058  { "_POSIX_NO_TRUNC",		PATHCONF,	_PC_NO_TRUNC		},
1059#endif
1060#ifdef _PC_VDISABLE
1061  { "_POSIX_VDISABLE",		PATHCONF,	_PC_VDISABLE		},
1062#endif
1063
1064  /* XPG 4.2 Configurable Pathname Values */
1065#if defined (_PC_FILESIZEBITS)
1066  { "FILESIZEBITS",		PATHCONF,	_PC_FILESIZEBITS },
1067#endif
1068#if defined (_PC_ASYNC_IO)
1069  { "_POSIX_ASYNC_IO",		PATHCONF,	_PC_ASYNC_IO },
1070#endif
1071#if defined (_PC_PRIO_IO)
1072  { "_POSIX_PRIO_IO",		PATHCONF,	_PC_PRIO_IO },
1073#endif
1074#if defined (_PC_SYNC_IO)
1075  { "_POSIX_SYNC_IO",		PATHCONF,	_PC_SYNC_IO },
1076#endif
1077
1078  /* POSIX.1-200x configurable pathname values */
1079#if defined (_PC_ALLOC_SIZE_MIN)
1080  { "POSIX_ALLOC_SIZE_MIN",	PATHCONF,	_PC_ALLOC_SIZE_MIN },
1081  { "POSIX_REC_INCR_XFER_SIZE",	PATHCONF,	_PC_REC_INCR_XFER_SIZE },
1082  { "POSIX_REC_MAX_XFER_SIZE",	PATHCONF,	_PC_REC_MAX_XFER_SIZE },
1083  { "POSIX_REC_MIN_XFER_SIZE",	PATHCONF,	_PC_REC_MIN_XFER_SIZE },
1084  { "POSIX_REC_XFER_ALIGN",	PATHCONF,	_PC_REC_XFER_ALIGN },
1085#endif
1086
1087  /* ANSI/ISO C, POSIX.1-200x, XPG 4.2 (and later) C language type limits. */
1088  { "CHAR_BIT",			CONSTANT,	CHAR_BIT	},
1089  { "CHAR_MAX",			CONSTANT,	CHAR_MAX	},
1090  { "CHAR_MIN",			CONSTANT,	CHAR_MIN	},
1091  { "INT_BIT",			CONSTANT,	INT_BIT		},
1092  { "INT_MAX",			CONSTANT,	INT_MAX		},
1093  { "INT_MIN",			CONSTANT,	INT_MIN		},
1094#ifdef LLONG_MAX
1095  { "LLONG_MAX",		LLCONST,	VAL_LLONG_MAX	},
1096  { "LLONG_MIN",		LLCONST,	VAL_LLONG_MIN	},
1097#endif
1098  { "LONG_BIT",			CONSTANT,	LONG_BIT	},
1099  { "LONG_MAX",			CONSTANT,	LONG_MAX	},
1100  { "LONG_MIN",			CONSTANT,	LONG_MIN	},
1101#ifdef MB_LEN_MAX
1102  { "MB_LEN_MAX",		CONSTANT,	MB_LEN_MAX	},
1103#endif
1104  { "SCHAR_MAX",		CONSTANT,	SCHAR_MAX	},
1105  { "SCHAR_MIN",		CONSTANT,	SCHAR_MIN	},
1106  { "SHRT_MAX",			CONSTANT,	SHRT_MAX	},
1107  { "SHRT_MIN",			CONSTANT,	SHRT_MIN	},
1108  { "SIZE_MAX",			CONSTANT,	SIZE_MAX	},
1109  { "SSIZE_MAX",		CONSTANT,	SSIZE_MAX	},
1110  { "UCHAR_MAX",		CONSTANT,	UCHAR_MAX	},
1111  { "UINT_MAX",			CONSTANT,	UINT_MAX	},
1112#ifdef ULLONG_MAX
1113  { "ULLONG_MAX",		LLCONST,	VAL_ULLONG_MAX	},
1114#endif
1115  { "ULONG_MAX",		CONSTANT,	ULONG_MAX	},
1116  { "USHRT_MAX",		CONSTANT,	USHRT_MAX	},
1117  { "WORD_BIT",			CONSTANT,	WORD_BIT	},
1118
1119  { NULL }
1120};
1121
1122static int num_getconf_variables = sizeof(conf_table) / sizeof(struct conf_variable) - 1;
1123
1124extern char *this_command_name;
1125extern char **make_builtin_argv ();
1126
1127static void getconf_help ();
1128static int getconf_print ();
1129static int getconf_one ();
1130static int getconf_all ();
1131
1132int
1133getconf_builtin (list)
1134     WORD_LIST *list;
1135{
1136  int c, r, opt, aflag;
1137  char **v;
1138
1139  aflag = 0;
1140  reset_internal_getopt();
1141  while ((opt = internal_getopt (list, "ahv:")) != -1) {
1142  	switch (opt) {
1143  	case 'a':
1144  		aflag = 1;
1145  		break;
1146  	case 'h':
1147  		getconf_help();
1148  		return(EXECUTION_SUCCESS);
1149  	case 'v':
1150  		break;		/* ignored */
1151  	default:
1152  		builtin_usage();
1153  		return(EX_USAGE);
1154  	}
1155  }
1156
1157  list = loptend;
1158  if ((aflag == 0 && list == 0) || (aflag && list) || list_length(list) > 2) {
1159  	builtin_usage();
1160  	return(EX_USAGE);
1161  }
1162
1163  r = aflag ? getconf_all() : getconf_one(list);
1164
1165  return r;
1166}
1167
1168static void
1169getconf_help()
1170{
1171	const struct conf_variable *cp;
1172	register int i, column;
1173
1174	builtin_usage();
1175	printf("Acceptable variable names are:\n");
1176	for (cp = conf_table; cp->name != NULL; cp++) {
1177		if (cp->type == PATHCONF)
1178			printf("%s pathname\n", cp->name);
1179		else
1180			printf("%s\n", cp->name);
1181	}
1182}
1183
1184static int
1185getconf_print(cp, vpath, all)
1186struct conf_variable *cp;
1187char *vpath;
1188int all;
1189{
1190	long val;
1191	char *sval;
1192	size_t slen;
1193
1194	switch (cp->type) {
1195	case G_UNDEF:
1196		printf("undefined\n");
1197		break;
1198
1199#ifdef LLONG_MAX
1200	case LLCONST:
1201		switch (cp->value) {
1202			default:
1203			case VAL_LLONG_MIN:
1204				printf ("%lld\n", LLONG_MIN);
1205				break;
1206			case VAL_LLONG_MAX:
1207				printf ("%lld\n", LLONG_MAX);
1208				break;
1209#  if (ULLONG_MAX != LLONG_MAX)
1210			case VAL_ULLONG_MAX:
1211				printf ("%llu\n", ULLONG_MAX);
1212				break;
1213#  endif
1214		}
1215		break;
1216#endif
1217	case CONSTANT:
1218		switch (cp->value) {
1219			case UCHAR_MAX:
1220			case USHRT_MAX:
1221			case UINT_MAX:
1222#if (ULONG_MAX != UINT_MAX)
1223			case ULONG_MAX:
1224#endif
1225#if (SIZE_MAX != UINT_MAX) && (SIZE_MAX != ULONG_MAX)
1226			case SIZE_MAX:
1227#endif
1228
1229				printf("%lu\n", cp->value);
1230				break;
1231			default:
1232				printf("%ld\n", cp->value);
1233				break;
1234		}
1235		break;
1236
1237	case CONFSTR:
1238		errno = 0;
1239		slen = confstr (cp->value, (char *) 0, (size_t) 0);
1240		if (slen == 0) {
1241			if (errno != 0) {
1242				if (all)
1243					printf ("getconf: %s\n", strerror(errno));
1244				else
1245					builtin_error ("%s", strerror(errno));
1246			} else
1247				printf ("undefined\n");
1248			return (EXECUTION_FAILURE);
1249		}
1250		sval = xmalloc(slen);
1251
1252		confstr(cp->value, sval, slen);
1253		printf("%s\n", sval);
1254		free(sval);
1255		break;
1256
1257	case SYSCONF:
1258		errno = 0;
1259		if ((val = sysconf(cp->value)) == -1) {
1260			if (errno != 0) {
1261				if (all)
1262					printf("getconf: %s\n", strerror (errno));
1263				else
1264					builtin_error ("%s", strerror (errno));
1265				return (EXECUTION_FAILURE);
1266			}
1267
1268			printf ("undefined\n");
1269		} else {
1270			printf("%ld\n", val);
1271		}
1272		break;
1273
1274	case PATHCONF:
1275		errno = 0;
1276		if ((val = pathconf(vpath, cp->value)) == -1) {
1277			if (errno != 0) {
1278				if (all)
1279					printf("getconf: %s: %s\n", vpath, strerror (errno));
1280				else
1281					builtin_error ("%s: %s", vpath, strerror (errno));
1282				return (EXECUTION_FAILURE);
1283			}
1284
1285			printf ("undefined\n");
1286		} else {
1287			printf ("%ld\n", val);
1288		}
1289		break;
1290	}
1291
1292	return (ferror(stdout) ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
1293}
1294
1295static int
1296getconf_all()
1297{
1298	const struct conf_variable *cp;
1299	int ret;
1300
1301	ret = EXECUTION_SUCCESS;
1302	for (cp = conf_table; cp->name != NULL; cp++) {
1303		printf("%-35s", cp->name);
1304		if (getconf_print(cp, "/", 1) == EXECUTION_FAILURE)
1305			ret = EXECUTION_FAILURE;
1306	}
1307	return ret;
1308}
1309
1310static int
1311getconf_one(list)
1312	WORD_LIST *list;
1313{
1314	const struct conf_variable *cp;
1315	char *vname, *vpath;
1316
1317	vname = list->word->word;
1318	vpath = (list->next && list->next->word) ? list->next->word->word
1319						 : (char *)NULL;
1320
1321	for (cp = conf_table; cp->name != NULL; cp++) {
1322		if (strcmp(vname, cp->name) == 0)
1323			break;
1324	}
1325	if (cp->name == NULL) {
1326		builtin_error ("%s: unknown variable", vname);
1327		return (EXECUTION_FAILURE);
1328	}
1329
1330	if (cp->type == PATHCONF) {
1331		if (list->next == 0) {
1332			builtin_usage();
1333			return(EX_USAGE);
1334		}
1335	} else {
1336		if (list->next) {
1337			builtin_usage();
1338			return(EX_USAGE);
1339		}
1340	}
1341
1342	return (getconf_print(cp, vpath, 0));
1343}
1344
1345static char *getconf_doc[] = {
1346	"getconf writes the current value of a configurable system limit or",
1347	"option variable to the standard output.",
1348	(char *)NULL
1349};
1350
1351struct builtin getconf_struct = {
1352	"getconf",
1353	getconf_builtin,
1354	BUILTIN_ENABLED,
1355	getconf_doc,
1356	"getconf -[ah] or getconf [-v spec] sysvar or getconf [-v spec] pathvar pathname",
1357	0
1358};
1359
1360#ifndef HAVE_CONFSTR
1361static size_t
1362confstr (name, buf, len)
1363     int name;
1364     char *buf;
1365     size_t len;
1366{
1367  switch (name)
1368    {
1369    case _CS_PATH:
1370      if (len > 0 && buf)
1371	{
1372          strncpy (buf, STANDARD_UTILS_PATH, len - 1);
1373          buf[len - 1] = '\0';
1374	}
1375      return (sizeof (STANDARD_UTILS_PATH) + 1);
1376    default:
1377      errno = EINVAL;
1378      return 0;
1379    }
1380}
1381#endif
1382
1383#ifndef HAVE_SYSCONF
1384extern long get_clk_tck __P((void));
1385
1386static long
1387sysconf (name)
1388     int name;
1389{
1390#  if defined (_POSIX_VERSION)
1391  switch (name)
1392    {
1393    case _SC_ARG_MAX:
1394      return _POSIX_ARG_MAX;
1395    case _SC_CHILD_MAX:
1396      return _POSIX_CHILD_MAX;
1397    case _SC_CLK_TCK:
1398      return get_clk_tck();
1399    case _SC_NGROUPS_MAX:
1400      return _POSIX_NGROUPS_MAX;
1401    case _SC_OPEN_MAX:
1402      return _POSIX_OPEN_MAX;
1403    case _SC_JOB_CONTROL:
1404      return _POSIX_JOB_CONTROL;
1405    case _SC_SAVED_IDS:
1406      return _POSIX_SAVED_IDS;
1407    case _SC_VERSION:
1408      return _POSIX_VERSION;
1409    case _SC_BC_BASE_MAX:
1410      return _POSIX2_BC_BASE_MAX;
1411    case _SC_BC_DIM_MAX:
1412      return _POSIX2_BC_DIM_MAX;
1413    case _SC_BC_SCALE_MAX:
1414      return  _POSIX2_BC_SCALE_MAX;
1415    case _SC_BC_STRING_MAX:
1416      return _POSIX2_BC_STRING_MAX;
1417    case _SC_COLL_WEIGHTS_MAX:
1418      return  -1;
1419    case _SC_EXPR_NEST_MAX:
1420      return _POSIX2_EXPR_NEST_MAX;
1421    case _SC_LINE_MAX:
1422      return _POSIX2_LINE_MAX;
1423    case _SC_RE_DUP_MAX:
1424      return _POSIX2_RE_DUP_MAX;
1425    case _SC_STREAM_MAX:
1426      return _POSIX_STREAM_MAX;
1427    case _SC_TZNAME_MAX:
1428      return _POSIX_TZNAME_MAX;
1429    default:
1430      errno = EINVAL;
1431      return -1;
1432    }
1433#else
1434  errno = EINVAL;
1435  return -1;
1436#endif
1437}
1438#endif
1439
1440#ifndef HAVE_PATHCONF
1441static long
1442pathconf (path, name)
1443     const char *path;
1444     int name;
1445{
1446#if defined (_POSIX_VERSION)
1447  switch (name)
1448    {
1449    case _PC_LINK_MAX:
1450      return _POSIX_LINK_MAX;
1451    case _PC_MAX_CANON:
1452      return _POSIX_MAX_CANON;
1453    case _PC_MAX_INPUT:
1454      return _POSIX_MAX_INPUT;
1455    case _PC_NAME_MAX:
1456      return _POSIX_NAME_MAX;
1457    case _PC_PATH_MAX:
1458      return _POSIX_PATH_MAX;
1459    case _PC_PIPE_BUF:
1460      return _POSIX_PIPE_BUF;
1461    case _PC_CHOWN_RESTRICTED:
1462#ifdef _POSIX_CHOWN_RESTRICTED
1463      return _POSIX_CHOWN_RESTRICTED;
1464#else
1465      return -1;
1466#endif
1467    case _PC_NO_TRUNC:
1468#ifdef _POSIX_NO_TRUNC
1469      return _POSIX_NO_TRUNC;
1470#else
1471      return -1;
1472#endif
1473    case _PC_VDISABLE:
1474#ifdef _POSIX_VDISABLE
1475      return _POSIX_VDISABLE;
1476#else
1477      return -1;
1478#endif
1479    default:
1480      errno = EINVAL;
1481      return -1;
1482    }
1483#else
1484  errno = EINVAL;
1485  return -1;
1486#endif
1487}
1488#endif
1489