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