Imported from ../bash-2.05b.tar.gz.
[platform/upstream/bash.git] / examples / loadables / getconf.c
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
75 extern int errno;
76 #endif
77
78 struct conf_variable
79 {
80   const char *name;
81   enum { SYSCONF, CONFSTR, PATHCONF, CONSTANT, G_UNDEF } type;
82   long value;
83 };
84
85 #ifndef HAVE_CONFSTR
86 static size_t confstr __P((int, char *, size_t));
87 #endif
88
89 #ifndef HAVE_SYSCONF
90 static long sysconf __P((int));
91 #endif
92
93 #ifndef HAVE_PATHCONF
94 static long pathconf __P((const char *, int));
95 #endif
96
97 static const struct conf_variable conf_table[] =
98 {
99   /* POSIX.2 Configurable Variable Values */
100   { "PATH",                     CONFSTR,        _CS_PATH                },
101   { "CS_PATH",                  CONFSTR,        _CS_PATH                },
102
103   /* POSIX.1 Configurable Variable Values (only Solaris?) */
104 #if defined (_CS_LFS_CFLAGS)
105   { "LFS_CFLAGS",               CONFSTR,        _CS_LFS_CFLAGS          },
106   { "LFS_LDFLAGS",              CONFSTR,        _CS_LFS_LDFLAGS         },
107   { "LFS_LIBS",                 CONFSTR,        _CS_LFS_LIBS            },
108   { "LFS_LINTFLAGS",            CONFSTR,        _CS_LFS_LINTFLAGS       },
109 #endif
110 #if defined (_CS_LFS64_CFLAGS)
111   { "LFS64_CFLAGS",             CONFSTR,        _CS_LFS64_CFLAGS        },
112   { "LFS64_LDFLAGS",            CONFSTR,        _CS_LFS64_LDFLAGS       },
113   { "LFS64_LIBS",               CONFSTR,        _CS_LFS64_LIBS          },
114   { "LFS64_LINTFLAGS",          CONFSTR,        _CS_LFS64_LINTFLAGS     },
115 #endif
116
117   /* Single UNIX Specification version 2 Configurable Variable Values.  The
118      SYSCONF variables say whether or not the appropriate CONFSTR variables
119      are available. */
120 #if defined (_SC_XBS5_ILP32_OFF32)
121   { "XBS5_ILP32_OFF32",                 SYSCONF,        _SC_XBS5_ILP32_OFF32    },
122   { "_XBS5_ILP32_OFF32",                SYSCONF,        _SC_XBS5_ILP32_OFF32    },
123 #endif
124 #if defined (_CS_XBS5_ILP32_OFF32_CFLAGS)
125   { "XBS5_ILP32_OFF32_CFLAGS",          CONFSTR,        _CS_XBS5_ILP32_OFF32_CFLAGS },
126   { "XBS5_ILP32_OFF32_LDFLAGS",         CONFSTR,        _CS_XBS5_ILP32_OFF32_LDFLAGS },
127   { "XBS5_ILP32_OFF32_LIBS",            CONFSTR,        _CS_XBS5_ILP32_OFF32_LIBS },
128   { "XBS5_ILP32_OFF32_LINTFLAGS",       CONFSTR,        _CS_XBS5_ILP32_OFF32_LINTFLAGS },
129 #endif
130 #if defined (_SC_XBS5_ILP32_OFFBIG)
131   { "XBS5_ILP32_OFFBIG",                SYSCONF,        _SC_XBS5_ILP32_OFFBIG   },
132   { "_XBS5_ILP32_OFFBIG",               SYSCONF,        _SC_XBS5_ILP32_OFFBIG   },
133 #endif
134 #if defined (_CS_XBS5_ILP32_OFFBIG_CFLAGS)
135   { "XBS5_ILP32_OFFBIG_CFLAGS",         CONFSTR,        _CS_XBS5_ILP32_OFFBIG_CFLAGS },
136   { "XBS5_ILP32_OFFBIG_LDFLAGS",        CONFSTR,        _CS_XBS5_ILP32_OFFBIG_LDFLAGS },
137   { "XBS5_ILP32_OFFBIG_LIBS",           CONFSTR,        _CS_XBS5_ILP32_OFFBIG_LIBS },
138   { "XBS5_ILP32_OFFBIG_LINTFLAGS",      CONFSTR,        _CS_XBS5_ILP32_OFFBIG_LINTFLAGS },
139 #endif
140 #if defined (_SC_XBS5_LP64_OFF64)
141   { "XBS5_LP64_OFF64",                  SYSCONF,        _SC_XBS5_LP64_OFF64     },
142   { "_XBS5_LP64_OFF64",                 SYSCONF,        _SC_XBS5_LP64_OFF64     },
143 #endif
144 #if defined (_CS_XBS5_LP64_OFF64_CFLAGS)
145   { "XBS5_LP64_OFF64_CFLAGS",           CONFSTR,        _CS_XBS5_LP64_OFF64_CFLAGS },
146   { "XBS5_LP64_OFF64_LDFLAGS",          CONFSTR,        _CS_XBS5_LP64_OFF64_LDFLAGS },
147   { "XBS5_LP64_OFF64_LIBS",             CONFSTR,        _CS_XBS5_LP64_OFF64_LIBS },
148   { "XBS5_LP64_OFF64_LINTFLAGS",        CONFSTR,        _CS_XBS5_LP64_OFF64_LINTFLAGS },
149 #endif
150 #if defined (_SC_XBS5_LPBIG_OFFBIG)
151   { "XBS5_LPBIG_OFFBIG",                SYSCONF,        _SC_XBS5_LPBIG_OFFBIG   },
152   { "_XBS5_LPBIG_OFFBIG",               SYSCONF,        _SC_XBS5_LPBIG_OFFBIG   },
153 #endif
154 #if defined (_CS_XBS5_LPBIG_OFFBIG_CFLAGS)
155   { "XBS5_LPBIG_OFFBIG_CFLAGS",         CONFSTR,        _CS_XBS5_LPBIG_OFFBIG_CFLAGS },
156   { "XBS5_LPBIG_OFFBIG_LDFLAGS",        CONFSTR,        _CS_XBS5_LPBIG_OFFBIG_LDFLAGS },
157   { "XBS5_LPBIG_OFFBIG_LIBS",           CONFSTR,        _CS_XBS5_LPBIG_OFFBIG_LIBS },
158   { "XBS5_LPBIG_OFFBIG_LINTFLAGS",      CONFSTR,        _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS },
159 #endif
160
161   /* Single UNIX Specification version 3 (POSIX.1-200x) Configurable Variable
162      Values.  The SYSCONF variables say whether or not the appropriate CONFSTR
163      variables are available. */
164
165 #if defined (_SC_POSIX_V6_ILP32_OFF32)
166   { "_POSIX_V6_ILP32_OFF32",            SYSCONF,        _SC_POSIX_V6_ILP32_OFF32  },
167 #endif
168 #if defined (_CS_POSIX_V6_ILP32_OFF32_CFLAGS)
169   { "POSIX_V6_ILP32_OFF32_CFLAGS",      CONFSTR,        _CS_POSIX_V6_ILP32_OFF32_CFLAGS },
170   { "POSIX_V6_ILP32_OFF32_LDFLAGS",     CONFSTR,        _CS_POSIX_V6_ILP32_OFF32_LDFLAGS },
171   { "POSIX_V6_ILP32_OFF32_LIBS",        CONFSTR,        _CS_POSIX_V6_ILP32_OFF32_LIBS },
172   { "POSIX_V6_ILP32_OFF32_LINTFLAGS",   CONFSTR,        _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS },
173 #endif
174 #if defined (_SC_POSIX_V6_ILP32_OFFBIG)
175   { "_POSIX_V6_ILP32_OFFBIG",           SYSCONF,        _SC_POSIX_V6_ILP32_OFFBIG },
176 #endif
177 #if defined (_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS)
178   { "POSIX_V6_ILP32_OFFBIG_CFLAGS",     CONFSTR,        _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS },
179   { "POSIX_V6_ILP32_OFFBIG_LDFLAGS",    CONFSTR,        _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS },
180   { "POSIX_V6_ILP32_OFFBIG_LIBS",       CONFSTR,        _CS_POSIX_V6_ILP32_OFFBIG_LIBS },
181   { "POSIX_V6_ILP32_OFFBIG_LINTFLAGS",  CONFSTR,        _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS },
182 #endif
183 #if defined (_SC_POSIX_V6_LP64_OFF64)
184   { "_POSIX_V6_LP64_OFF64",             SYSCONF,        _SC_POSIX_V6_LP64_OFF64   },
185 #endif
186 #if defined (_CS_POSIX_V6_LP64_OFF64_CFLAGS)
187   { "POSIX_V6_LP64_OFF64_CFLAGS",       CONFSTR,        _CS_POSIX_V6_LP64_OFF64_CFLAGS },
188   { "POSIX_V6_LP64_OFF64_LDFLAGS",      CONFSTR,        _CS_POSIX_V6_LP64_OFF64_LDFLAGS },
189   { "POSIX_V6_LP64_OFF64_LIBS",         CONFSTR,        _CS_POSIX_V6_LP64_OFF64_LIBS },
190   { "POSIX_V6_LP64_OFF64_LINTFLAGS",    CONFSTR,        _CS_POSIX_V6_LP64_OFF64_LINTFLAGS },
191 #endif
192 #if defined (_SC_POSIX_V6_LPBIG_OFFBIG)
193   { "_POSIX_V6_LPBIG_OFFBIG",   SYSCONF,        _SC_POSIX_V6_LPBIG_OFFBIG },
194 #endif
195 #if defined (_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS)
196   { "POSIX_V6_LPBIG_OFFBIG_CFLAGS",     CONFSTR,        _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS },
197   { "POSIX_V6_LPBIG_OFFBIG_LDFLAGS",    CONFSTR,        _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS },
198   { "POSIX_V6_LPBIG_OFFBIG_LIBS",       CONFSTR,        _CS_POSIX_V6_LPBIG_OFFBIG_LIBS },
199   { "POSIX_V6_LPBIG_OFFBIG_LINTFLAGS",  CONFSTR,        _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS },
200 #endif
201
202   /* POSIX.2 Utility Limit Minimum Values */
203 #ifdef _POSIX2_BC_BASE_MAX
204   { "POSIX2_BC_BASE_MAX",       CONSTANT,       _POSIX2_BC_BASE_MAX     },
205 #else
206   { "POSIX2_BC_BASE_MAX",       G_UNDEF,        -1                      },
207 #endif
208 #ifdef _POSIX2_BC_DIM_MAX
209   { "POSIX2_BC_DIM_MAX",        CONSTANT,       _POSIX2_BC_DIM_MAX      },
210 #else
211   { "POSIX2_BC_DIM_MAX",        G_UNDEF,        -1                      },
212 #endif
213 #ifdef _POSIX2_BC_SCALE_MAX
214   { "POSIX2_BC_SCALE_MAX",      CONSTANT,       _POSIX2_BC_SCALE_MAX    },
215 #else
216   { "POSIX2_BC_SCALE_MAX",      G_UNDEF,        -1                      },
217 #endif
218 #ifdef _POSIX2_BC_STRING_MAX
219   { "POSIX2_BC_STRING_MAX",     CONSTANT,       _POSIX2_BC_STRING_MAX   },
220 #else
221   { "POSIX2_BC_STRING_MAX",     G_UNDEF,        -1                      },
222 #endif
223 #ifdef _POSIX2_COLL_WEIGHTS_MAX
224   { "POSIX2_COLL_WEIGHTS_MAX",  CONSTANT,       _POSIX2_COLL_WEIGHTS_MAX },
225 #else
226   { "POSIX2_COLL_WEIGHTS_MAX",  G_UNDEF,        -1                       },
227 #endif
228 #if defined (_POSIX2_EQUIV_CLASS_MAX)
229   { "POSIX2_EQUIV_CLASS_MAX",   CONSTANT,       _POSIX2_EQUIV_CLASS_MAX },
230 #endif
231 #ifdef _POSIX2_EXPR_NEST_MAX
232   { "POSIX2_EXPR_NEST_MAX",     CONSTANT,       _POSIX2_EXPR_NEST_MAX   },
233 #else
234   { "POSIX2_EXPR_NEST_MAX",     G_UNDEF,        -1                      },
235 #endif
236 #ifdef _POSIX2_LINE_MAX
237   { "POSIX2_LINE_MAX",          CONSTANT,       _POSIX2_LINE_MAX        },
238 #else
239   { "POSIX2_LINE_MAX",          G_UNDEF,        -1                      },
240 #endif
241 #ifdef _POSIX2_RE_DUP_MAX
242   { "POSIX2_RE_DUP_MAX",        CONSTANT,       _POSIX2_RE_DUP_MAX      },
243 #else
244   { "POSIX2_RE_DUP_MAX",        G_UNDEF,        -1                      },
245 #endif
246 #if defined (_POSIX2_VERSION)
247   { "POSIX2_VERSION",           CONSTANT,       _POSIX2_VERSION         },
248 #else
249 #  if !defined (_SC_2_VERSION)
250   { "POSIX2_VERSION",           G_UNDEF,        -1                      },
251 #  endif
252 #endif
253
254   /* POSIX.1 Minimum Values */
255 #ifdef _POSIX_ARG_MAX
256   { "_POSIX_ARG_MAX",           CONSTANT,       _POSIX_ARG_MAX          },
257 #else
258   { "_POSIX_ARG_MAX",           G_UNDEF,        -1                      },
259 #endif
260 #ifdef _POSIX_CHILD_MAX
261   { "_POSIX_CHILD_MAX",         CONSTANT,       _POSIX_CHILD_MAX        },
262 #else
263   { "_POSIX_CHILD_MAX",         G_UNDEF,        -1              },
264 #endif  
265 #ifdef _POSIX_LINK_MAX
266   { "_POSIX_LINK_MAX",          CONSTANT,       _POSIX_LINK_MAX         },
267 #else
268   { "_POSIX_LINK_MAX",          G_UNDEF,        -1                      },
269 #endif  
270 #ifdef _POSIX_MAX_CANON
271   { "_POSIX_MAX_CANON",         CONSTANT,       _POSIX_MAX_CANON        },
272 #else
273   { "_POSIX_MAX_CANON",         G_UNDEF,        -1                      },
274 #endif  
275 #ifdef _POSIX_MAX_INPUT
276   { "_POSIX_MAX_INPUT",         CONSTANT,       _POSIX_MAX_INPUT        },
277 #else
278   { "_POSIX_MAX_INPUT",         G_UNDEF,        -1                      },
279 #endif  
280 #ifdef _POSIX_NAME_MAX
281   { "_POSIX_NAME_MAX",          CONSTANT,       _POSIX_NAME_MAX         },
282 #else
283   { "_POSIX_NAME_MAX",          G_UNDEF,        -1                      },
284 #endif  
285 #ifdef _POSIX_NGROUPS_MAX
286   { "_POSIX_NGROUPS_MAX",       CONSTANT,       _POSIX_NGROUPS_MAX      },
287 #else
288   { "_POSIX_NGROUPS_MAX",       G_UNDEF,        -1                      },
289 #endif  
290 #ifdef _POSIX_OPEN_MAX
291   { "_POSIX_OPEN_MAX",          CONSTANT,       _POSIX_OPEN_MAX         },
292 #else
293   { "_POSIX_OPEN_MAX",          G_UNDEF,        -1                      },
294 #endif  
295 #ifdef _POSIX_PATH_MAX
296   { "_POSIX_PATH_MAX",          CONSTANT,       _POSIX_PATH_MAX         },
297 #else
298   { "_POSIX_PATH_MAX",          G_UNDEF,        -1                      },
299 #endif  
300 #ifdef _POSIX_PIPE_BUF
301   { "_POSIX_PIPE_BUF",          CONSTANT,       _POSIX_PIPE_BUF         },
302 #else
303   { "_POSIX_PIPE_BUF",          G_UNDEF,        -1                      },
304 #endif  
305 #ifdef _POSIX_SSIZE_MAX
306   { "_POSIX_SSIZE_MAX",         CONSTANT,       _POSIX_SSIZE_MAX        },
307 #else
308   { "_POSIX_SSIZE_MAX",         G_UNDEF,        -1                      },
309 #endif  
310 #ifdef _POSIX_STREAM_MAX
311   { "_POSIX_STREAM_MAX",        CONSTANT,       _POSIX_STREAM_MAX       },
312 #else
313   { "_POSIX_STREAM_MAX",        G_UNDEF,        -1                      },
314 #endif  
315 #ifdef _POSIX_TZNAME_MAX
316   { "_POSIX_TZNAME_MAX",        CONSTANT,       _POSIX_TZNAME_MAX       },
317 #else
318   { "_POSIX_TZNAME_MAX",        G_UNDEF,        -1      },
319 #endif  
320
321   /* POSIX.2/XPG 4.2 (and later) Symbolic Utility Limits */
322 #ifdef _SC_BC_BASE_MAX
323   { "BC_BASE_MAX",              SYSCONF,        _SC_BC_BASE_MAX         },
324 #endif
325 #ifdef _SC_BC_DIM_MAX
326   { "BC_DIM_MAX",               SYSCONF,        _SC_BC_DIM_MAX          },
327 #endif
328 #ifdef _SC_BC_SCALE_MAX
329   { "BC_SCALE_MAX",             SYSCONF,        _SC_BC_SCALE_MAX        },
330 #endif
331 #ifdef _SC_BC_STRING_MAX
332   { "BC_STRING_MAX",            SYSCONF,        _SC_BC_STRING_MAX       },
333 #endif
334 #ifdef CHARCLASS_NAME_MAX
335   { "CHARCLASS_NAME_MAX",       CONSTANT,       CHARCLASS_NAME_MAX      },
336 #endif
337 #ifdef _SC_COLL_WEIGHTS_MAX
338   { "COLL_WEIGHTS_MAX",         SYSCONF,        _SC_COLL_WEIGHTS_MAX    },
339 #endif
340 #ifdef _SC_EXPR_NEST_MAX
341   { "EXPR_NEST_MAX",            SYSCONF,        _SC_EXPR_NEST_MAX       },
342 #endif
343 #ifdef _SC_LINE_MAX
344   { "LINE_MAX",                 SYSCONF,        _SC_LINE_MAX            },
345 #endif
346 #  ifdef NL_ARGMAX
347   { "NL_ARGMAX",                CONSTANT,       NL_ARGMAX               },
348 #endif
349 #ifdef NL_LANGMAX
350   { "NL_LANGMAX",               CONSTANT,       NL_LANGMAX              },
351 #endif
352 #ifdef NL_MSGMAX
353   { "NL_MSGMAX",                CONSTANT,       NL_MSGMAX               },
354 #endif
355 #ifdef NL_NMAX
356   { "NL_NMAX",                  CONSTANT,       NL_NMAX                 },
357 #endif
358 #ifdef NL_SETMAX
359   { "NL_SETMAX",                CONSTANT,       NL_SETMAX               },
360 #endif
361 #ifdef NL_TEXTMAX
362   { "NL_TEXTMAX",               CONSTANT,       NL_TEXTMAX              },
363 #endif
364 #ifdef _SC_RE_DUP_MAX
365   { "RE_DUP_MAX",               SYSCONF,        _SC_RE_DUP_MAX          },
366 #endif
367
368   /* POSIX.2 Optional Facility Configuration Values */
369 #ifdef _SC_2_C_BIND
370   { "_POSIX2_C_BIND",           SYSCONF,        _SC_2_C_BIND            },
371 #else
372   { "_POSIX2_C_BIND",           G_UNDEF,        -1                      },
373 #endif
374 #ifdef _SC_2_C_DEV
375   { "_POSIX2_C_DEV",            SYSCONF,        _SC_2_C_DEV             },
376 #else
377   { "_POSIX2_C_DEV",            G_UNDEF,        -1                      },
378 #endif
379 #if defined (_SC_2_C_VERSION)
380   { "_POSIX2_C_VERSION",                SYSCONF,        _SC_2_C_VERSION         },
381 #else
382   { "_POSIX2_C_VERSION",                G_UNDEF,        -1                      },
383 #endif
384 #if defined (_SC_2_CHAR_TERM)
385   { "_POSIX2_CHAR_TERM",                SYSCONF,        _SC_2_CHAR_TERM         },
386 #else
387   { "_POSIX2_CHAR_TERM",                G_UNDEF,        -1                      },
388 #endif
389 #ifdef _SC_2_FORT_DEV
390   { "_POSIX2_FORT_DEV",         SYSCONF,        _SC_2_FORT_DEV          },
391 #else
392   { "_POSIX2_FORT_DEV",         G_UNDEF,        -1                      },
393 #endif
394 #ifdef _SC_2_FORT_RUN
395   { "_POSIX2_FORT_RUN",         SYSCONF,        _SC_2_FORT_RUN          },
396 #else
397   { "_POSIX2_FORT_RUN",         G_UNDEF,        -1                      },
398 #endif
399 #ifdef _SC_2_LOCALEDEF
400   { "_POSIX2_LOCALEDEF",        SYSCONF,        _SC_2_LOCALEDEF         },
401 #else
402   { "_POSIX2_LOCALEDEF",        G_UNDEF,        -1                      },
403 #endif
404 #ifdef _SC_2_SW_DEV
405   { "_POSIX2_SW_DEV",           SYSCONF,        _SC_2_SW_DEV            },
406 #else
407   { "_POSIX2_SW_DEV",           G_UNDEF,        -1                      },
408 #endif
409 #if defined (_SC2_UPE)
410   { "_POSIX2_UPE",              SYSCONF,        _SC_2_UPE               },
411 #else
412   { "_POSIX2_UPE",              G_UNDEF,        -1                      },
413 #endif
414 #if !defined (_POSIX2_VERSION) && defined (_SC_2_VERSION)
415   { "_POSIX2_VERSION",          SYSCONF,        _SC_2_VERSION           },
416 #else
417   { "_POSIX2_VERSION",          G_UNDEF,        -1                      },
418 #endif
419 #if defined (_SC_REGEX_VERSION)
420   { "REGEX_VERSION",            SYSCONF,        _SC_REGEX_VERSION       },
421 #else
422   { "REGEX_VERSION",            G_UNDEF,        -1                      },
423 #endif
424
425 #if defined (_SC_2_PBS)
426   { "_POSIX2_PBS",              SYSCONF,        _SC_2_PBS               },
427   { "_POSIX2_PBS_ACCOUNTING",   SYSCONF,        _SC_2_PBS_ACCOUNTING    },
428   { "_POSIX2_PBS_LOCATE",       SYSCONF,        _SC_2_PBS_LOCATE        },
429   { "_POSIX2_PBS_MESSAGE",      SYSCONF,        _SC_2_PBS_MESSAGE       },
430   { "_POSIX2_PBS_TRACK",        SYSCONF,        _SC_2_PBS_TRACK         },
431 #endif
432
433   /* POSIX.1 Configurable System Variables */
434 #ifdef _SC_ARG_MAX
435   { "ARG_MAX",                  SYSCONF,        _SC_ARG_MAX             },
436 #endif
437 #ifdef _SC_CHILD_MAX
438   { "CHILD_MAX",                SYSCONF,        _SC_CHILD_MAX           },
439 #endif
440 #ifdef _SC_CLK_TCK
441   { "CLK_TCK",                  SYSCONF,        _SC_CLK_TCK             },
442 #endif
443 #ifdef _SC_DELAYTIMER_MAX
444   { "DELAYTIMER_MAX",           SYSCONF,        _SC_DELAYTIMER_MAX      },
445 #endif
446 #ifdef _SC_NGROUPS_MAX
447   { "NGROUPS_MAX",              SYSCONF,        _SC_NGROUPS_MAX         },
448 #endif
449 #ifdef NZERO
450   { "NZERO",                    CONSTANT,       NZERO                   },
451 #endif
452 #ifdef _SC_OPEN_MAX
453   { "OPEN_MAX",                 SYSCONF,        _SC_OPEN_MAX            },
454 #endif
455 #ifdef PASS_MAX
456   { "PASS_MAX",                 CONSTANT,       PASS_MAX                },
457 #endif
458 #ifdef _SC_STREAM_MAX
459   { "STREAM_MAX",               SYSCONF,        _SC_STREAM_MAX          },
460 #endif
461 #ifdef TMP_MAX
462   { "TMP_MAX",                  CONSTANT,       TMP_MAX                 },
463 #endif
464 #ifdef _SC_TZNAME_MAX
465   { "TZNAME_MAX",               SYSCONF,        _SC_TZNAME_MAX          },
466 #endif
467
468   /* POSIX.1 Optional Facility Configuration Values */
469 #if defined (_SC_ADVISORY_INFO)
470   { "_POSIX_ADVISORY_INFO",     SYSCONF,        _SC_ADVISORY_INFO       },
471 #endif
472 #if defined (_SC_ASYNCHRONOUS_IO)
473   { "_POSIX_ASYNCHRONOUS_IO",   SYSCONF,        _SC_ASYNCHRONOUS_IO     },
474 #endif
475 #if defined (_SC_BARRIERS)
476   { "_POSIX_BARRIERS",          SYSCONF,        _SC_BARRIERS            },
477 #endif
478 #if defined (_SC_BASE)
479   { "_POSIX_BASE",              SYSCONF,        _SC_BASE                },
480 #endif
481 #if defined (_SC_C_LANG_SUPPORT)
482   { "_POSIX_C_LANG_SUPPORT",    SYSCONF,        _SC_C_LANG_SUPPORT      },
483 #endif
484 #if defined (_SC_C_LANG_SUPPORT_R)
485   { "_POSIX_C_LANG_SUPPORT_R",  SYSCONF,        _SC_C_LANG_SUPPORT_R    },
486 #endif
487 #if defined (_SC_CLOCK_SELECTION)
488   { "_POSIX_CLOCK_SELECTION",   SYSCONF,        _SC_CLOCK_SELECTION     },
489 #endif
490 #if defined (_SC_CPUTIME)
491   { "_POSIX_CPUTIME",           SYSCONF,        _SC_CPUTIME             },
492 #endif
493 #if defined (_SC_DEVICE_IO)
494   { "_POSIX_DEVICE_IO",         SYSCONF,        _SC_DEVICE_IO           },
495 #endif
496 #if defined (_SC_DEVICE_SPECIFIC)
497   { "_POSIX_DEVICE_SPECIFIC",   SYSCONF,        _SC_DEVICE_SPECIFIC     },
498 #endif
499 #if defined (_SC_DEVICE_SPECIFIC_R)
500   { "_POSIX_DEVICE_SPECIFIC_R", SYSCONF,        _SC_DEVICE_SPECIFIC_R   },
501 #endif
502 #if defined (_SC_FD_MGMT)
503   { "_POSIX_FD_MGMT",           SYSCONF,        _SC_FD_MGMT             },
504 #endif
505 #if defined (_SC_FIFO)
506   { "_POSIX_FIFO",              SYSCONF,        _SC_FIFO                },
507 #endif
508 #if defined (_SC_FILE_ATTRIBUTES)
509   { "_POSIX_FILE_ATTRIBUTES",   SYSCONF,        _SC_FILE_ATTRIBUTES     },
510 #endif
511 #if defined (_SC_FILE_LOCKING)
512   { "_POSIX_FILE_LOCKING",      SYSCONF,        _SC_FILE_LOCKING        },
513 #endif
514 #if defined (_SC_FILE_SYSTEM)
515   { "_POSIX_FILE_SYSTEM",       SYSCONF,        _SC_FILE_SYSTEM         },
516 #endif
517 #if defined (_SC_FSYNC)
518   { "_POSIX_FSYNC",             SYSCONF,        _SC_FSYNC               },
519 #endif
520 #if defined (_SC_JOB_CONTROL)
521   { "_POSIX_JOB_CONTROL",       SYSCONF,        _SC_JOB_CONTROL         },
522 #endif
523 #if defined (_SC_MAPPED_FILES)
524   { "_POSIX_MAPPED_FILES",      SYSCONF,        _SC_MAPPED_FILES        },
525 #endif
526 #if defined (_SC_MEMLOCK)
527   { "_POSIX_MEMLOCK",           SYSCONF,        _SC_MEMLOCK             },
528 #endif
529 #if defined (_SC_MEMLOCK_RANGE)
530   { "_POSIX_MEMLOCK_RANGE",     SYSCONF,        _SC_MEMLOCK_RANGE       },
531 #endif
532 #if defined (_SC_MEMORY_PROTECTION)
533   { "_POSIX_MEMORY_PROTECTION", SYSCONF,        _SC_MEMORY_PROTECTION   },
534 #endif
535 #if defined (_SC_MESSAGE_PASSING)
536   { "_POSIX_MESSAGE_PASSING",   SYSCONF,        _SC_MESSAGE_PASSING     },
537 #endif
538 #if defined (_SC_MONOTONIC_CLOCK)
539   { "_POSIX_MONOTONIC_CLOCK",   SYSCONF,        _SC_MONOTONIC_CLOCK     },
540 #endif
541 #if defined (_SC_MULTI_PROCESS)
542   { "_POSIX_MULTI_PROCESS",     SYSCONF,        _SC_MULTI_PROCESS       },
543 #endif
544 #if defined (_SC_NETWORKING)
545   { "_POSIX_NETWORKING",        SYSCONF,        _SC_NETWORKING          },
546 #endif
547 #if defined (_SC_PIPE)
548   { "_POSIX_PIPE",              SYSCONF,        _SC_PIPE                },
549 #endif
550 #if defined (SC_PRIORITIZED_IO)
551   { "_POSIX_PRIORITIZED_IO",    SYSCONF,        _SC_PRIORITIZED_IO      },
552 #endif
553 #if defined (_SC_PRIORITY_SCHEDULING)
554   { "_POSIX_PRIORITY_SCHEDULING", SYSCONF,      _SC_PRIORITY_SCHEDULING },
555 #endif
556 #if defined (_SC_READER_WRITER_LOCKS)
557   { "_POSIX_READER_WRITER_LOCKS", SYSCONF,      _SC_READER_WRITER_LOCKS },
558 #endif
559 #if defined (_SC_REALTIME_SIGNALS)
560   { "_POSIX_REALTIME_SIGNALS",  SYSCONF,        _SC_REALTIME_SIGNALS    },
561 #endif
562 #if defined (_SC_REGEXP)
563   { "_POSIX_REGEXP",            SYSCONF,        _SC_REGEXP              },
564 #endif
565 #if defined (_SC_SAVED_IDS)
566   { "_POSIX_SAVED_IDS",         SYSCONF,        _SC_SAVED_IDS           },
567 #endif
568 #if defined (_SC_SEMAPHORES)
569   { "_POSIX_SEMAPHORES",        SYSCONF,        _SC_SEMAPHORES          },
570 #endif
571 #if defined (_SC_SHARED_MEMORY_OBJECTS)
572   { "_POSIX_SHARED_MEMORY_OBJECTS", SYSCONF,    _SC_SHARED_MEMORY_OBJECTS },
573 #endif
574   { "_POSIX_SHELL",             CONSTANT,       1                       },
575 #if defined (_SC_SIGNALS)
576   { "_POSIX_SIGNALS",           SYSCONF,        _SC_SIGNALS             },
577 #endif
578 #if defined (_SC_SINGLE_PROCESS)
579   { "_POSIX_SINGLE_PROCESS",    SYSCONF,        _SC_SINGLE_PROCESS      },
580 #endif
581 #if defined (_SC_SPAWN)
582   { "_POSIX_SPAWN",             SYSCONF,        _SC_SPAWN               },
583 #endif
584 #if defined (_SC_SPIN_LOCKS)
585   { "_POSIX_SPIN_LOCKS",        SYSCONF,        _SC_SPIN_LOCKS          },
586 #endif
587 #if defined (_SC_SPORADIC_SERVER)
588   { "_POSIX_SPORADIC_SERVER",   SYSCONF,        _SC_SPORADIC_SERVER     },
589 #endif
590 #if defined (_SC_SYNCHRONIZED_IO)
591   { "_POSIX_SYNCHRONIZED_IO",   SYSCONF,        _SC_SYNCHRONIZED_IO     },
592 #endif
593 #if defined (_SC_SYSTEM_DATABASE)
594   { "_POSIX_SYSTEM_DATABASE",   SYSCONF,        _SC_SYSTEM_DATABASE     },
595 #endif
596 #if defined (_SC_SYSTEM_DATABASE_R)
597   { "_POSIX_SYSTEM_DATABASE_R", SYSCONF,        _SC_SYSTEM_DATABASE_R   },
598 #endif
599 #if defined (_SC_THREAD_ATTR_STACKADDR)
600   { "_POSIX_THREAD_ATTR_STACKADDR", SYSCONF,    _SC_THREAD_ATTR_STACKADDR },
601 #endif
602 #if defined (_SC_THREAD_ATTR_STACKSIZE)
603   { "_POSIX_THREAD_ATTR_STACKSIZE", SYSCONF,    _SC_THREAD_ATTR_STACKSIZE },
604 #endif
605 #if defined (_SC_THREAD_CPUTIME)
606   { "_POSIX_THREAD_CPUTIME",    SYSCONF,        _SC_THREAD_CPUTIME },
607 #endif
608 #if defined (_SC_THREAD_PRIO_INHERIT)
609   { "_POSIX_THREAD_PRIO_INHERIT", SYSCONF,      _SC_THREAD_PRIO_INHERIT },
610 #endif
611 #if defined (_SC_THREAD_PRIO_PROTECT)
612   { "_POSIX_THREAD_PRIO_PROTECT", SYSCONF,      _SC_THREAD_PRIO_PROTECT },
613 #endif
614 #if defined (_SC_THREAD_PRIORITY_SCHEDULING)
615   { "_POSIX_THREAD_PRIORITY_SCHEDULING", SYSCONF, _SC_THREAD_PRIORITY_SCHEDULING },
616 #endif
617 #if defined (_SC_THREAD_PROCESS_SHARED)
618   { "_POSIX_THREAD_PROCESS_SHARED", SYSCONF,    _SC_THREAD_PROCESS_SHARED },
619 #endif
620 #if defined (_SC_THREAD_SAFE_FUNCTIONS)
621   { "_POSIX_THREAD_SAFE_FUNCTIONS", SYSCONF,    _SC_THREAD_SAFE_FUNCTIONS },
622 #endif
623 #if defined (_SC_THREAD_SPORADIC_SERVER)
624   { "_POSIX_THREAD_SPORADIC_SERVER", SYSCONF,   _SC_THREAD_SPORADIC_SERVER },
625 #endif
626 #if defined (_SC_THREADS)
627   { "_POSIX_THREADS",           SYSCONF,        _SC_THREADS             },
628 #endif
629 #if defined (_SC_TIMEOUTS)
630   { "_POSIX_TIMEOUTS",          SYSCONF,        _SC_TIMEOUTS            },
631 #endif
632 #if defined (_SC_TIMERS)
633   { "_POSIX_TIMERS",            SYSCONF,        _SC_TIMERS              },
634 #endif
635 #if defined (_SC_TRACE)
636   { "_POSIX_TRACE",             SYSCONF,        _SC_TRACE               },
637 #endif
638 #if defined (_SC_TRACE)
639   { "_POSIX_TRACE_EVENT_FILTER",SYSCONF,        _SC_TRACE_EVENT_FILTER  },
640 #endif
641 #if defined (_SC_TRACE)
642   { "_POSIX_TRACE_INHERIT",     SYSCONF,        _SC_TRACE_INHERIT       },
643 #endif
644 #if defined (_SC_TRACE)
645   { "_POSIX_TRACE_LOG",         SYSCONF,        _SC_TRACE_LOG           },
646 #endif
647 #if defined (_SC_TYPED_MEMORY_OBJECTS)
648   { "_POSIX_TYPED_MEMORY_OBJECTS", SYSCONF,     _SC_TYPED_MEMORY_OBJECTS },
649 #endif
650 #if defined (_SC_VERSION)
651   { "_POSIX_VERSION",           SYSCONF,        _SC_VERSION             },
652 #endif
653
654   /* XPG 4.2 Configurable System Variables. */
655 #if defined (_SC_ATEXIT_MAX)
656   { "ATEXIT_MAX",               SYSCONF,        _SC_ATEXIT_MAX          },
657 #endif
658 #if defined (_SC_GETGR_R_SIZE_MAX)
659   { "GETGR_R_SIZE_MAX",         SYSCONF,        _SC_GETGR_R_SIZE_MAX    },
660 #endif
661 #if defined (_SC_GETPW_R_SIZE_MAX)
662   { "GETPW_R_SIZE_MAX",         SYSCONF,        _SC_GETPW_R_SIZE_MAX    },
663 #endif
664 #if defined (_SC_HOST_NAME_MAX)
665   { "HOST_NAME_MAX",            SYSCONF,        _SC_HOST_NAME_MAX       },
666 #endif
667 #if defined (_SC_IOV_MAX)
668   { "IOV_MAX",                  SYSCONF,        _SC_IOV_MAX             },
669 #endif
670 #if defined (_SC_LOGIN_NAME_MAX)
671   { "LOGIN_NAME_MAX",           SYSCONF,        _SC_LOGIN_NAME_MAX      },
672 #endif
673 #if defined (_SC_LOGNAME_MAX)
674   { "LOGNAME_MAX",              SYSCONF,        _SC_LOGNAME_MAX         },
675 #endif
676 #if defined (_SC_PAGESIZE)
677   { "PAGESIZE",                 SYSCONF,        _SC_PAGESIZE            },
678 #endif
679 #if defined (_SC_PAGE_SIZE)
680   { "PAGE_SIZE",                SYSCONF,        _SC_PAGE_SIZE           },
681 #endif
682 #if defined (_SC_SYMLOOP_MAX)
683   { "SYMLOOP_MAX",              SYSCONF,        _SC_SYMLOOP_MAX         },
684 #endif
685 #if defined (_SC_TTY_NAME_MAX)
686   { "TTY_NAME_MAX",             SYSCONF,        _SC_TTY_NAME_MAX        },
687 #endif
688 #if defined (_SC_USER_GROUPS)
689   { "_POSIX_USER_GROUPS",       SYSCONF,        _SC_USER_GROUPS         },
690 #endif
691 #if defined (_SC_USER_GROUPS_R)
692   { "_POSIX_USER_GROUPS_R",     SYSCONF,        _SC_USER_GROUPS_R       },
693 #endif
694
695 #if defined (_SC_AIO_LISTIO_MAX)
696   { "AIO_LISTIO_MAX",           SYSCONF,        _SC_AIO_LISTIO_MAX      },
697 #endif
698 #if defined (_SC_AIO_MAX)
699   { "AIO_MAX",                  SYSCONF,        _SC_AIO_MAX             },
700 #endif
701 #if defined (_SC_AIO_PRIO_DELTA_MAX)
702   { "AIO_PRIO_DELTA_MAX",       SYSCONF,        _SC_AIO_PRIO_DELTA_MAX  },
703 #endif
704 #if defined (_SC_DELAYTIMER_MAX)
705   { "DELAYTIMER_MAX",           SYSCONF,        _SC_DELAYTIMER_MAX      },
706 #endif
707 #if defined (_SC_MQ_OPEN_MAX)
708   { "MQ_OPEN_MAX",              SYSCONF,        _SC_MQ_OPEN_MAX         },
709 #endif
710 #if defined (_SC_MQ_PRIO_MAX)
711   { "MQ_PRIO_MAX",              SYSCONF,        _SC_MQ_PRIO_MAX         },
712 #endif
713 #if defined (_SC_RTSIG_MAX)
714   { "RTSIG_MAX",                SYSCONF,        _SC_RTSIG_MAX           },
715 #endif
716 #if defined (_SC_SEM_NSEMS_MAX)
717   { "SEM_NSEMS_MAX",            SYSCONF,        _SC_SEM_NSEMS_MAX       },
718 #endif
719 #if defined (_SC_SEM_VALUE_MAX)
720   { "SEM_VALUE_MAX",            SYSCONF,        _SC_SEM_VALUE_MAX       },
721 #endif
722 #if defined (_SC_SIGQUEUE_MAX)
723   { "SIGQUEUE_MAX",             SYSCONF,        _SC_SIGQUEUE_MAX        },
724 #endif
725 #if defined (_SC_TIMER_MAX)
726   { "TIMER_MAX",                SYSCONF,        _SC_TIMER_MAX           },
727 #endif
728
729 #if defined (_SC_THREAD_DESTRUCTOR_ITERATIONS)
730   { "PTHREAD_DESTRUCTOR_ITERATIONS", SYSCONF,   _SC_THREAD_DESTRUCTOR_ITERATIONS },
731 #endif
732 #if defined (_SC_THREAD_KEYS_MAX)
733   { "PTHREAD_KEYS_MAX",         SYSCONF,        _SC_THREAD_KEYS_MAX },
734 #endif
735 #if defined (_SC_THREAD_STACK_MIN)
736   { "PTHREAD_STACK_MIN",        SYSCONF,        _SC_THREAD_STACK_MIN },
737 #endif
738 #if defined (_SC_THREAD_THREADS_MAX)
739   { "PTHREAD_THREADS_MAX",      SYSCONF,        _SC_THREAD_THREADS_MAX },
740 #endif
741
742   /* XPG 4.2 (and later) Optional Facility Configuration Values */
743 #if defined (_SC_XOPEN_CRYPT)
744   { "_XOPEN_CRYPT",             SYSCONF,        _SC_XOPEN_CRYPT         },
745 #endif
746 #if defined (_SC_XOPEN_ENH_I18N)
747   { "_XOPEN_ENH_I18N",          SYSCONF,        _SC_XOPEN_ENH_I18N      },
748 #endif
749 #if defined (_SC_XOPEN_LEGACY)
750   { "_XOPEN_LEGACY",            SYSCONF,        _SC_XOPEN_LEGACY        },
751 #endif /* _SC_XOPEN_LEGACY */
752 #if defined (_SC_XOPEN_REALTIME)
753   { "_XOPEN_REALTIME",          SYSCONF,        _SC_XOPEN_REALTIME      },
754 #endif
755 #if defined (_SC_XOPEN_REALTIME_THREADS)
756   { "_XOPEN_REALTIME_THREADS",  SYSCONF,        _SC_XOPEN_REALTIME_THREADS },
757 #endif
758 #if defined (_SC_XOPEN_SHM)
759   { "_XOPEN_SHM",               SYSCONF,        _SC_XOPEN_SHM           },
760 #endif
761 #if defined (_SC_XOPEN_UNIX)
762   { "_XOPEN_UNIX",              SYSCONF,        _SC_XOPEN_UNIX          },
763 #endif
764 #if defined (_SC_XOPEN_VERSION)
765   { "_XOPEN_VERSION",           SYSCONF,        _SC_XOPEN_VERSION       },
766 #endif
767 #if defined (_SC_XOPEN_XCU_VERSION)
768   { "_XOPEN_XCU_VERSION",       SYSCONF,        _SC_XOPEN_XCU_VERSION   },
769 #endif
770 #if defined (_SC_XOPEN_XPG2)
771   { "_XOPEN_XPG2",              SYSCONF,        _SC_XOPEN_XPG2          },
772 #endif
773 #if defined (_SC_XOPEN_XPG3)
774   { "_XOPEN_XPG3",              SYSCONF,        _SC_XOPEN_XPG3          },
775 #endif
776 #if defined (_SC_XOPEN_XPG4)
777   { "_XOPEN_XPG4",              SYSCONF,        _SC_XOPEN_XPG4          },
778 #endif
779 #if defined (_SC_XOPEN_XPG5)
780   { "_XOPEN_XPG5",              SYSCONF,        _SC_XOPEN_XPG5          },
781 #endif
782
783   /* POSIX.1 Configurable Pathname Values */
784 #ifdef _PC_LINK_MAX
785   { "LINK_MAX",                 PATHCONF,       _PC_LINK_MAX            },
786 #endif
787 #ifdef _PC_MAX_CANON
788   { "MAX_CANON",                PATHCONF,       _PC_MAX_CANON           },
789 #endif
790 #ifdef _PC_MAX_INPUT
791   { "MAX_INPUT",                PATHCONF,       _PC_MAX_INPUT           },
792 #endif
793 #ifdef _PC_NAMW_MAX
794   { "NAME_MAX",                 PATHCONF,       _PC_NAME_MAX            },
795 #endif
796 #ifdef _PC_PATH_MAX
797   { "PATH_MAX",                 PATHCONF,       _PC_PATH_MAX            },
798 #endif
799 #ifdef _PC_PIPE_BUF
800   { "PIPE_BUF",                 PATHCONF,       _PC_PIPE_BUF            },
801 #endif
802 #ifdef _PC_SYMLINK_MAX
803   { "SYMLINK_MAX",              PATHCONF,       _PC_SYMLINK_MAX         },
804 #endif
805 #ifdef _PC_CHOWN_RESTRICTED
806   { "_POSIX_CHOWN_RESTRICTED",  PATHCONF,       _PC_CHOWN_RESTRICTED    },
807 #endif
808 #ifdef _PC_NO_TRUNC
809   { "_POSIX_NO_TRUNC",          PATHCONF,       _PC_NO_TRUNC            },
810 #endif
811 #ifdef _PC_VDISABLE
812   { "_POSIX_VDISABLE",          PATHCONF,       _PC_VDISABLE            },
813 #endif
814
815   /* XPG 4.2 Configurable Pathname Values */
816 #if defined (_PC_FILESIZEBITS)
817   { "FILESIZEBITS",             PATHCONF,       _PC_FILESIZEBITS },
818 #endif
819 #if defined (_PC_ASYNC_IO)
820   { "_POSIX_ASYNC_IO",          PATHCONF,       _PC_ASYNC_IO },
821 #endif
822 #if defined (_PC_PRIO_IO)
823   { "_POSIX_PRIO_IO",           PATHCONF,       _PC_PRIO_IO },
824 #endif
825 #if defined (_PC_SYNC_IO)
826   { "_POSIX_SYNC_IO",           PATHCONF,       _PC_SYNC_IO },
827 #endif
828
829   /* POSIX.1-200x configurable pathname values */
830 #if defined (_PC_ALLOC_SIZE_MIN)
831   { "POSIX_ALLOC_SIZE_MIN",     PATHCONF,       _PC_ALLOC_SIZE_MIN },
832   { "POSIX_REC_INCR_XFER_SIZE", PATHCONF,       _PC_REC_INCR_XFER_SIZE },
833   { "POSIX_REC_MAX_XFER_SIZE",  PATHCONF,       _PC_REC_MAX_XFER_SIZE },
834   { "POSIX_REC_MIN_XFER_SIZE",  PATHCONF,       _PC_REC_MIN_XFER_SIZE },
835   { "POSIX_REC_XFER_ALIGN",     PATHCONF,       _PC_REC_XFER_ALIGN },
836 #endif
837
838   /* ANSI/ISO C, POSIX.1-200x, XPG 4.2 (and later) C language type limits. */
839   { "CHAR_BIT",                 CONSTANT,       CHAR_BIT        },
840   { "CHAR_MAX",                 CONSTANT,       CHAR_MAX        },
841   { "CHAR_MIN",                 CONSTANT,       CHAR_MIN        },
842   { "INT_BIT",                  CONSTANT,       INT_BIT         },
843   { "INT_MAX",                  CONSTANT,       INT_MAX         },
844   { "INT_MIN",                  CONSTANT,       INT_MIN         },
845   { "LONG_BIT",                 CONSTANT,       LONG_BIT        },
846   { "LONG_MAX",                 CONSTANT,       LONG_MAX        },
847   { "LONG_MIN",                 CONSTANT,       LONG_MIN        },
848 #ifdef MB_LEN_MAX
849   { "MB_LEN_MAX",               CONSTANT,       MB_LEN_MAX      },
850 #endif
851   { "SCHAR_MAX",                CONSTANT,       SCHAR_MAX       },
852   { "SCHAR_MIN",                CONSTANT,       SCHAR_MIN       },
853   { "SHRT_MAX",                 CONSTANT,       SHRT_MAX        },
854   { "SHRT_MIN",                 CONSTANT,       SHRT_MIN        },
855   { "SIZE_MAX",                 CONSTANT,       SIZE_MAX        },
856   { "SSIZE_MAX",                CONSTANT,       SSIZE_MAX       },
857   { "UCHAR_MAX",                CONSTANT,       UCHAR_MAX       },
858   { "UINT_MAX",                 CONSTANT,       UINT_MAX        },
859   { "ULONG_MAX",                CONSTANT,       ULONG_MAX       },
860   { "USHRT_MAX",                CONSTANT,       USHRT_MAX       },
861   { "WORD_BIT",                 CONSTANT,       WORD_BIT        },
862
863   { NULL }
864 };
865
866 static int num_getconf_variables = sizeof(conf_table) / sizeof(struct conf_variable) - 1;
867
868 extern char *this_command_name;
869 extern char **make_builtin_argv ();
870
871 static void getconf_help ();
872 static int getconf_print ();
873 static int getconf_one ();
874 static int getconf_all ();
875
876 int
877 getconf_builtin (list)
878      WORD_LIST *list;
879 {
880   int c, r, opt, aflag;
881   char **v;
882
883   aflag = 0;
884   reset_internal_getopt();
885   while ((opt = internal_getopt (list, "ahv:")) != -1) {
886         switch (opt) {
887         case 'a':
888                 aflag = 1;
889                 break;
890         case 'h':
891                 getconf_help();
892                 return(EXECUTION_SUCCESS);
893         case 'v':
894                 break;          /* ignored */
895         default:
896                 builtin_usage();
897                 return(EX_USAGE);
898         }
899   }
900  
901   list = loptend;
902   if ((aflag == 0 && list == 0) || (aflag && list) || list_length(list) > 2) {
903         builtin_usage();
904         return(EX_USAGE);
905   }
906
907   r = aflag ? getconf_all() : getconf_one(list);
908
909   return r;
910 }
911
912 static void
913 getconf_help()
914 {
915         const struct conf_variable *cp;
916         register int i, column;
917
918         builtin_usage();
919         printf("Acceptable variable names are:\n");
920         for (cp = conf_table; cp->name != NULL; cp++) {
921                 if (cp->type == PATHCONF)
922                         printf("%s pathname\n", cp->name);
923                 else
924                         printf("%s\n", cp->name);
925         }
926 }
927
928 static int
929 getconf_print(cp, vpath, all)
930 struct conf_variable *cp;
931 char *vpath;
932 int all;
933 {
934         long val;
935         char *sval;
936         size_t slen;
937
938         switch (cp->type) {
939         case G_UNDEF:
940                 printf("undefined\n");
941                 break;
942
943         case CONSTANT:
944                 switch (cp->value) {
945                         case UCHAR_MAX:
946                         case USHRT_MAX:
947                         case UINT_MAX:
948 #if (ULONG_MAX != UINT_MAX)                     
949                         case ULONG_MAX:
950 #endif
951 #if (SIZE_MAX != UINT_MAX) && (SIZE_MAX != ULONG_MAX)
952                         case SIZE_MAX:
953 #endif
954
955                                 printf("%lu\n", cp->value);
956                                 break;
957                         default:
958                                 printf("%ld\n", cp->value);
959                                 break;
960                 }
961                 break;
962
963         case CONFSTR:
964                 errno = 0;
965                 slen = confstr (cp->value, (char *) 0, (size_t) 0);
966                 if (slen == 0) {
967                         if (errno != 0) {
968                                 if (all)
969                                         printf ("getconf: %s\n", strerror(errno));
970                                 else
971                                         builtin_error ("%s", strerror(errno));
972                         } else
973                                 printf ("undefined\n");
974                         return (EXECUTION_FAILURE);
975                 }
976                 sval = xmalloc(slen);
977
978                 confstr(cp->value, sval, slen);
979                 printf("%s\n", sval);
980                 free(sval);
981                 break;
982
983         case SYSCONF:
984                 errno = 0;
985                 if ((val = sysconf(cp->value)) == -1) {
986                         if (errno != 0) {
987                                 if (all)
988                                         printf("getconf: %s\n", strerror (errno));
989                                 else
990                                         builtin_error ("%s", strerror (errno));
991                                 return (EXECUTION_FAILURE);
992                         }
993
994                         printf ("undefined\n");
995                 } else {
996                         printf("%ld\n", val);
997                 }
998                 break;
999
1000         case PATHCONF:
1001                 errno = 0;
1002                 if ((val = pathconf(vpath, cp->value)) == -1) {
1003                         if (errno != 0) {
1004                                 if (all)
1005                                         printf("getconf: %s: %s\n", vpath, strerror (errno));
1006                                 else
1007                                         builtin_error ("%s: %s", vpath, strerror (errno));
1008                                 return (EXECUTION_FAILURE);
1009                         }
1010
1011                         printf ("undefined\n");
1012                 } else {
1013                         printf ("%ld\n", val);
1014                 }
1015                 break;
1016         }
1017
1018         return (ferror(stdout) ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
1019 }
1020
1021 static int
1022 getconf_all()
1023 {
1024         const struct conf_variable *cp;
1025         int ret;
1026
1027         ret = EXECUTION_SUCCESS;
1028         for (cp = conf_table; cp->name != NULL; cp++) {
1029                 printf("%-35s", cp->name);
1030                 if (getconf_print(cp, "/", 1) == EXECUTION_FAILURE)
1031                         ret = EXECUTION_FAILURE;
1032         }
1033         return ret;
1034 }
1035
1036 static int
1037 getconf_one(list)
1038         WORD_LIST *list;
1039 {
1040         const struct conf_variable *cp;
1041         char *vname, *vpath;
1042
1043         vname = list->word->word;
1044         vpath = (list->next && list->next->word) ? list->next->word->word
1045                                                  : (char *)NULL;
1046
1047         for (cp = conf_table; cp->name != NULL; cp++) {
1048                 if (strcmp(vname, cp->name) == 0)
1049                         break;
1050         }
1051         if (cp->name == NULL) {
1052                 builtin_error ("%s: unknown variable", vname);
1053                 return (EXECUTION_FAILURE);
1054         }
1055
1056         if (cp->type == PATHCONF) {
1057                 if (list->next == 0) {
1058                         builtin_usage();
1059                         return(EX_USAGE);
1060                 }
1061         } else {
1062                 if (list->next) {
1063                         builtin_usage();
1064                         return(EX_USAGE);
1065                 }
1066         }
1067
1068         return (getconf_print(cp, vpath, 0));
1069 }
1070
1071 static char *getconf_doc[] = {
1072         "getconf writes the current value of a configurable system limit or",
1073         "option variable to the standard output.",
1074         (char *)NULL
1075 };
1076
1077 struct builtin getconf_struct = {
1078         "getconf",
1079         getconf_builtin,
1080         BUILTIN_ENABLED,
1081         getconf_doc,
1082         "getconf -[ah] or getconf [-v spec] sysvar or getconf [-v spec] pathvar pathname",
1083         0
1084 };
1085
1086 #ifndef HAVE_CONFSTR
1087 static size_t
1088 confstr (name, buf, len)
1089      int name;
1090      char *buf;
1091      size_t len;
1092 {
1093   switch (name)
1094     {
1095     case _CS_PATH:
1096       if (len > 0 && buf)
1097         {
1098           strncpy (buf, STANDARD_UTILS_PATH, len - 1);
1099           buf[len - 1] = '\0';
1100         }
1101       return (sizeof (STANDARD_UTILS_PATH) + 1);
1102     default:
1103       errno = EINVAL;
1104       return 0;
1105     }
1106 }
1107 #endif
1108
1109 #ifndef HAVE_SYSCONF
1110 extern long get_clk_tck __P((void));
1111
1112 static long
1113 sysconf (name)
1114      int name;
1115 {
1116 #  if defined (_POSIX_VERSION)
1117   switch (name)
1118     {
1119     case _SC_ARG_MAX:
1120       return _POSIX_ARG_MAX;
1121     case _SC_CHILD_MAX:
1122       return _POSIX_CHILD_MAX;
1123     case _SC_CLK_TCK:
1124       return get_clk_tck();
1125     case _SC_NGROUPS_MAX:
1126       return _POSIX_NGROUPS_MAX;
1127     case _SC_OPEN_MAX:
1128       return _POSIX_OPEN_MAX;
1129     case _SC_JOB_CONTROL:
1130       return _POSIX_JOB_CONTROL;
1131     case _SC_SAVED_IDS:
1132       return _POSIX_SAVED_IDS;
1133     case _SC_VERSION:
1134       return _POSIX_VERSION;
1135     case _SC_BC_BASE_MAX:
1136       return _POSIX2_BC_BASE_MAX;
1137     case _SC_BC_DIM_MAX:
1138       return _POSIX2_BC_DIM_MAX;
1139     case _SC_BC_SCALE_MAX:
1140       return  _POSIX2_BC_SCALE_MAX;
1141     case _SC_BC_STRING_MAX:
1142       return _POSIX2_BC_STRING_MAX;
1143     case _SC_COLL_WEIGHTS_MAX:
1144       return  -1;
1145     case _SC_EXPR_NEST_MAX:
1146       return _POSIX2_EXPR_NEST_MAX;
1147     case _SC_LINE_MAX:
1148       return _POSIX2_LINE_MAX;
1149     case _SC_RE_DUP_MAX:
1150       return _POSIX2_RE_DUP_MAX;
1151     case _SC_STREAM_MAX:
1152       return _POSIX_STREAM_MAX;
1153     case _SC_TZNAME_MAX:
1154       return _POSIX_TZNAME_MAX;
1155     default:
1156       errno = EINVAL;
1157       return -1;
1158     }
1159 #else
1160   errno = EINVAL;
1161   return -1;
1162 #endif
1163 }
1164 #endif
1165
1166 #ifndef HAVE_PATHCONF
1167 static long
1168 pathconf (path, name)
1169      const char *path;
1170      int name;
1171 {
1172 #if defined (_POSIX_VERSION)
1173   switch (name)
1174     {
1175     case _PC_LINK_MAX:
1176       return _POSIX_LINK_MAX;
1177     case _PC_MAX_CANON:
1178       return _POSIX_MAX_CANON;
1179     case _PC_MAX_INPUT:
1180       return _POSIX_MAX_INPUT;
1181     case _PC_NAME_MAX:
1182       return _POSIX_NAME_MAX;
1183     case _PC_PATH_MAX:
1184       return _POSIX_PATH_MAX;
1185     case _PC_PIPE_BUF:
1186       return _POSIX_PIPE_BUF;
1187     case _PC_CHOWN_RESTRICTED:
1188 #ifdef _POSIX_CHOWN_RESTRICTED
1189       return _POSIX_CHOWN_RESTRICTED;
1190 #else
1191       return -1;
1192 #endif
1193     case _PC_NO_TRUNC:
1194 #ifdef _POSIX_NO_TRUNC
1195       return _POSIX_NO_TRUNC;
1196 #else
1197       return -1;
1198 #endif
1199     case _PC_VDISABLE:
1200 #ifdef _POSIX_VDISABLE
1201       return _POSIX_VDISABLE;
1202 #else
1203       return -1;
1204 #endif
1205     default:
1206       errno = EINVAL;
1207       return -1;
1208     }
1209 #else
1210   errno = EINVAL;
1211   return -1;
1212 #endif
1213 }
1214 #endif