1 /* -*- mode: C; mode: fold; -*- */
2 /*
3 Copyright (C) 2009-2017,2018 John E. Davis
4 
5 This file is part of the S-Lang Library.
6 
7 The S-Lang Library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2 of the
10 License, or (at your option) any later version.
11 
12 The S-Lang Library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with this library; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20 USA.
21 */
22 
23 #include "config.h"
24 
25 #ifndef __EXTENSIONS__
26 # define __EXTENSIONS__ 1
27 #endif
28 
29 #include <stdio.h>
30 #include <unistd.h>
31 #include <string.h>
32 #include <errno.h>
33 #include <slang.h>
34 
35 SLANG_MODULE(sysconf);
36 
37 typedef struct
38 {
39    const char *name;
40    const unsigned int namelen;
41    const int iname;
42 }
43 Name_Map_Type;
44 
lookup_name(const Name_Map_Type * map,char * name)45 static const Name_Map_Type *lookup_name (const Name_Map_Type *map, char *name)
46 {
47    SLstrlen_Type len = strlen (name);
48    while (map->namelen != 0)
49      {
50 	if ((map->namelen == len)
51 	    && (0 == strcmp (name, map->name)))
52 	  return map;
53 
54 	map++;
55      }
56    return NULL;
57 }
58 
59 static const Name_Map_Type SC_Name_Map_Table[] = /*{{{*/
60 {
61 #ifdef _SC_ARG_MAX
62    {"_SC_ARG_MAX",	11,	_SC_ARG_MAX},
63 #endif
64 #ifdef _SC_CHILD_MAX
65    {"_SC_CHILD_MAX",	13,	_SC_CHILD_MAX},
66 #endif
67 #ifdef _SC_CLK_TCK
68    {"_SC_CLK_TCK",	11,	_SC_CLK_TCK},
69 #endif
70 #ifdef _SC_NGROUPS_MAX
71    {"_SC_NGROUPS_MAX",	15,	_SC_NGROUPS_MAX},
72 #endif
73 #ifdef _SC_OPEN_MAX
74    {"_SC_OPEN_MAX",	12,	_SC_OPEN_MAX},
75 #endif
76 #ifdef _SC_STREAM_MAX
77    {"_SC_STREAM_MAX",	14,	_SC_STREAM_MAX},
78 #endif
79 #ifdef _SC_TZNAME_MAX
80    {"_SC_TZNAME_MAX",	14,	_SC_TZNAME_MAX},
81 #endif
82 #ifdef _SC_JOB_CONTROL
83    {"_SC_JOB_CONTROL",	15,	_SC_JOB_CONTROL},
84 #endif
85 #ifdef _SC_SAVED_IDS
86    {"_SC_SAVED_IDS",	13,	_SC_SAVED_IDS},
87 #endif
88 #ifdef _SC_REALTIME_SIGNALS
89    {"_SC_REALTIME_SIGNALS",	20,	_SC_REALTIME_SIGNALS},
90 #endif
91 #ifdef _SC_PRIORITY_SCHEDULING
92    {"_SC_PRIORITY_SCHEDULING",	23,	_SC_PRIORITY_SCHEDULING},
93 #endif
94 #ifdef _SC_TIMERS
95    {"_SC_TIMERS",	10,	_SC_TIMERS},
96 #endif
97 #ifdef _SC_ASYNCHRONOUS_IO
98    {"_SC_ASYNCHRONOUS_IO",	19,	_SC_ASYNCHRONOUS_IO},
99 #endif
100 #ifdef _SC_PRIORITIZED_IO
101    {"_SC_PRIORITIZED_IO",	18,	_SC_PRIORITIZED_IO},
102 #endif
103 #ifdef _SC_SYNCHRONIZED_IO
104    {"_SC_SYNCHRONIZED_IO",	19,	_SC_SYNCHRONIZED_IO},
105 #endif
106 #ifdef _SC_FSYNC
107    {"_SC_FSYNC",	9,	_SC_FSYNC},
108 #endif
109 #ifdef _SC_MAPPED_FILES
110    {"_SC_MAPPED_FILES",	16,	_SC_MAPPED_FILES},
111 #endif
112 #ifdef _SC_MEMLOCK
113    {"_SC_MEMLOCK",	11,	_SC_MEMLOCK},
114 #endif
115 #ifdef _SC_MEMLOCK_RANGE
116    {"_SC_MEMLOCK_RANGE",	17,	_SC_MEMLOCK_RANGE},
117 #endif
118 #ifdef _SC_MEMORY_PROTECTION
119    {"_SC_MEMORY_PROTECTION",	21,	_SC_MEMORY_PROTECTION},
120 #endif
121 #ifdef _SC_MESSAGE_PASSING
122    {"_SC_MESSAGE_PASSING",	19,	_SC_MESSAGE_PASSING},
123 #endif
124 #ifdef _SC_SEMAPHORES
125    {"_SC_SEMAPHORES",	14,	_SC_SEMAPHORES},
126 #endif
127 #ifdef _SC_SHARED_MEMORY_OBJECTS
128    {"_SC_SHARED_MEMORY_OBJECTS",	25,	_SC_SHARED_MEMORY_OBJECTS},
129 #endif
130 #ifdef _SC_AIO_LISTIO_MAX
131    {"_SC_AIO_LISTIO_MAX",	18,	_SC_AIO_LISTIO_MAX},
132 #endif
133 #ifdef _SC_AIO_MAX
134    {"_SC_AIO_MAX",	11,	_SC_AIO_MAX},
135 #endif
136 #ifdef _SC_AIO_PRIO_DELTA_MAX
137    {"_SC_AIO_PRIO_DELTA_MAX",	22,	_SC_AIO_PRIO_DELTA_MAX},
138 #endif
139 #ifdef _SC_DELAYTIMER_MAX
140    {"_SC_DELAYTIMER_MAX",	18,	_SC_DELAYTIMER_MAX},
141 #endif
142 #ifdef _SC_MQ_OPEN_MAX
143    {"_SC_MQ_OPEN_MAX",	15,	_SC_MQ_OPEN_MAX},
144 #endif
145 #ifdef _SC_MQ_PRIO_MAX
146    {"_SC_MQ_PRIO_MAX",	15,	_SC_MQ_PRIO_MAX},
147 #endif
148 #ifdef _SC_VERSION
149    {"_SC_VERSION",	11,	_SC_VERSION},
150 #endif
151 #ifdef _SC_PAGESIZE
152    {"_SC_PAGESIZE",	12,	_SC_PAGESIZE},
153 #endif
154 #ifdef _SC_PAGE_SIZE
155    {"_SC_PAGE_SIZE",	13,	_SC_PAGE_SIZE},
156 #endif
157 #ifdef _SC_RTSIG_MAX
158    {"_SC_RTSIG_MAX",	13,	_SC_RTSIG_MAX},
159 #endif
160 #ifdef _SC_SEM_NSEMS_MAX
161    {"_SC_SEM_NSEMS_MAX",	17,	_SC_SEM_NSEMS_MAX},
162 #endif
163 #ifdef _SC_SEM_VALUE_MAX
164    {"_SC_SEM_VALUE_MAX",	17,	_SC_SEM_VALUE_MAX},
165 #endif
166 #ifdef _SC_SIGQUEUE_MAX
167    {"_SC_SIGQUEUE_MAX",	16,	_SC_SIGQUEUE_MAX},
168 #endif
169 #ifdef _SC_TIMER_MAX
170    {"_SC_TIMER_MAX",	13,	_SC_TIMER_MAX},
171 #endif
172 #ifdef _SC_BC_BASE_MAX
173    {"_SC_BC_BASE_MAX",	15,	_SC_BC_BASE_MAX},
174 #endif
175 #ifdef _SC_BC_DIM_MAX
176    {"_SC_BC_DIM_MAX",	14,	_SC_BC_DIM_MAX},
177 #endif
178 #ifdef _SC_BC_SCALE_MAX
179    {"_SC_BC_SCALE_MAX",	16,	_SC_BC_SCALE_MAX},
180 #endif
181 #ifdef _SC_BC_STRING_MAX
182    {"_SC_BC_STRING_MAX",	17,	_SC_BC_STRING_MAX},
183 #endif
184 #ifdef _SC_COLL_WEIGHTS_MAX
185    {"_SC_COLL_WEIGHTS_MAX",	20,	_SC_COLL_WEIGHTS_MAX},
186 #endif
187 #ifdef _SC_EQUIV_CLASS_MAX
188    {"_SC_EQUIV_CLASS_MAX",	19,	_SC_EQUIV_CLASS_MAX},
189 #endif
190 #ifdef _SC_EXPR_NEST_MAX
191    {"_SC_EXPR_NEST_MAX",	17,	_SC_EXPR_NEST_MAX},
192 #endif
193 #ifdef _SC_LINE_MAX
194    {"_SC_LINE_MAX",	12,	_SC_LINE_MAX},
195 #endif
196 #ifdef _SC_RE_DUP_MAX
197    {"_SC_RE_DUP_MAX",	14,	_SC_RE_DUP_MAX},
198 #endif
199 #ifdef _SC_CHARCLASS_NAME_MAX
200    {"_SC_CHARCLASS_NAME_MAX",	22,	_SC_CHARCLASS_NAME_MAX},
201 #endif
202 #ifdef _SC_2_VERSION
203    {"_SC_2_VERSION",	13,	_SC_2_VERSION},
204 #endif
205 #ifdef _SC_2_C_BIND
206    {"_SC_2_C_BIND",	12,	_SC_2_C_BIND},
207 #endif
208 #ifdef _SC_2_C_DEV
209    {"_SC_2_C_DEV",	11,	_SC_2_C_DEV},
210 #endif
211 #ifdef _SC_2_FORT_DEV
212    {"_SC_2_FORT_DEV",	14,	_SC_2_FORT_DEV},
213 #endif
214 #ifdef _SC_2_FORT_RUN
215    {"_SC_2_FORT_RUN",	14,	_SC_2_FORT_RUN},
216 #endif
217 #ifdef _SC_2_SW_DEV
218    {"_SC_2_SW_DEV",	12,	_SC_2_SW_DEV},
219 #endif
220 #ifdef _SC_2_LOCALEDEF
221    {"_SC_2_LOCALEDEF",	15,	_SC_2_LOCALEDEF},
222 #endif
223 #ifdef _SC_PII
224    {"_SC_PII",	7,	_SC_PII},
225 #endif
226 #ifdef _SC_PII_XTI
227    {"_SC_PII_XTI",	11,	_SC_PII_XTI},
228 #endif
229 #ifdef _SC_PII_SOCKET
230    {"_SC_PII_SOCKET",	14,	_SC_PII_SOCKET},
231 #endif
232 #ifdef _SC_PII_INTERNET
233    {"_SC_PII_INTERNET",	16,	_SC_PII_INTERNET},
234 #endif
235 #ifdef _SC_PII_OSI
236    {"_SC_PII_OSI",	11,	_SC_PII_OSI},
237 #endif
238 #ifdef _SC_POLL
239    {"_SC_POLL",	8,	_SC_POLL},
240 #endif
241 #ifdef _SC_SELECT
242    {"_SC_SELECT",	10,	_SC_SELECT},
243 #endif
244 #ifdef _SC_UIO_MAXIOV
245    {"_SC_UIO_MAXIOV",	14,	_SC_UIO_MAXIOV},
246 #endif
247 #ifdef _SC_IOV_MAX
248    {"_SC_IOV_MAX",	11,	_SC_IOV_MAX},
249 #endif
250 #ifdef _SC_PII_INTERNET_STREAM
251    {"_SC_PII_INTERNET_STREAM",	23,	_SC_PII_INTERNET_STREAM},
252 #endif
253 #ifdef _SC_PII_INTERNET_DGRAM
254    {"_SC_PII_INTERNET_DGRAM",	22,	_SC_PII_INTERNET_DGRAM},
255 #endif
256 #ifdef _SC_PII_OSI_COTS
257    {"_SC_PII_OSI_COTS",	16,	_SC_PII_OSI_COTS},
258 #endif
259 #ifdef _SC_PII_OSI_CLTS
260    {"_SC_PII_OSI_CLTS",	16,	_SC_PII_OSI_CLTS},
261 #endif
262 #ifdef _SC_PII_OSI_M
263    {"_SC_PII_OSI_M",	13,	_SC_PII_OSI_M},
264 #endif
265 #ifdef _SC_T_IOV_MAX
266    {"_SC_T_IOV_MAX",	13,	_SC_T_IOV_MAX},
267 #endif
268 #ifdef _SC_THREADS
269    {"_SC_THREADS",	11,	_SC_THREADS},
270 #endif
271 #ifdef _SC_THREAD_SAFE_FUNCTIONS
272    {"_SC_THREAD_SAFE_FUNCTIONS",	25,	_SC_THREAD_SAFE_FUNCTIONS},
273 #endif
274 #ifdef _SC_GETGR_R_SIZE_MAX
275    {"_SC_GETGR_R_SIZE_MAX",	20,	_SC_GETGR_R_SIZE_MAX},
276 #endif
277 #ifdef _SC_GETPW_R_SIZE_MAX
278    {"_SC_GETPW_R_SIZE_MAX",	20,	_SC_GETPW_R_SIZE_MAX},
279 #endif
280 #ifdef _SC_LOGIN_NAME_MAX
281    {"_SC_LOGIN_NAME_MAX",	18,	_SC_LOGIN_NAME_MAX},
282 #endif
283 #ifdef _SC_TTY_NAME_MAX
284    {"_SC_TTY_NAME_MAX",	16,	_SC_TTY_NAME_MAX},
285 #endif
286 #ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
287    {"_SC_THREAD_DESTRUCTOR_ITERATIONS",	32,	_SC_THREAD_DESTRUCTOR_ITERATIONS},
288 #endif
289 #ifdef _SC_THREAD_KEYS_MAX
290    {"_SC_THREAD_KEYS_MAX",	19,	_SC_THREAD_KEYS_MAX},
291 #endif
292 #ifdef _SC_THREAD_STACK_MIN
293    {"_SC_THREAD_STACK_MIN",	20,	_SC_THREAD_STACK_MIN},
294 #endif
295 #ifdef _SC_THREAD_THREADS_MAX
296    {"_SC_THREAD_THREADS_MAX",	22,	_SC_THREAD_THREADS_MAX},
297 #endif
298 #ifdef _SC_THREAD_ATTR_STACKADDR
299    {"_SC_THREAD_ATTR_STACKADDR",	25,	_SC_THREAD_ATTR_STACKADDR},
300 #endif
301 #ifdef _SC_THREAD_ATTR_STACKSIZE
302    {"_SC_THREAD_ATTR_STACKSIZE",	25,	_SC_THREAD_ATTR_STACKSIZE},
303 #endif
304 #ifdef _SC_THREAD_PRIORITY_SCHEDULING
305    {"_SC_THREAD_PRIORITY_SCHEDULING",	30,	_SC_THREAD_PRIORITY_SCHEDULING},
306 #endif
307 #ifdef _SC_THREAD_PRIO_INHERIT
308    {"_SC_THREAD_PRIO_INHERIT",	23,	_SC_THREAD_PRIO_INHERIT},
309 #endif
310 #ifdef _SC_THREAD_PRIO_PROTECT
311    {"_SC_THREAD_PRIO_PROTECT",	23,	_SC_THREAD_PRIO_PROTECT},
312 #endif
313 #ifdef _SC_THREAD_PROCESS_SHARED
314    {"_SC_THREAD_PROCESS_SHARED",	25,	_SC_THREAD_PROCESS_SHARED},
315 #endif
316 #ifdef _SC_NPROCESSORS_CONF
317    {"_SC_NPROCESSORS_CONF",	20,	_SC_NPROCESSORS_CONF},
318 #endif
319 #ifdef _SC_NPROCESSORS_ONLN
320    {"_SC_NPROCESSORS_ONLN",	20,	_SC_NPROCESSORS_ONLN},
321 #endif
322 #ifdef _SC_PHYS_PAGES
323    {"_SC_PHYS_PAGES",	14,	_SC_PHYS_PAGES},
324 #endif
325 #ifdef _SC_AVPHYS_PAGES
326    {"_SC_AVPHYS_PAGES",	16,	_SC_AVPHYS_PAGES},
327 #endif
328 #ifdef _SC_ATEXIT_MAX
329    {"_SC_ATEXIT_MAX",	14,	_SC_ATEXIT_MAX},
330 #endif
331 #ifdef _SC_PASS_MAX
332    {"_SC_PASS_MAX",	12,	_SC_PASS_MAX},
333 #endif
334 #ifdef _SC_XOPEN_VERSION
335    {"_SC_XOPEN_VERSION",	17,	_SC_XOPEN_VERSION},
336 #endif
337 #ifdef _SC_XOPEN_XCU_VERSION
338    {"_SC_XOPEN_XCU_VERSION",	21,	_SC_XOPEN_XCU_VERSION},
339 #endif
340 #ifdef _SC_XOPEN_UNIX
341    {"_SC_XOPEN_UNIX",	14,	_SC_XOPEN_UNIX},
342 #endif
343 #ifdef _SC_XOPEN_CRYPT
344    {"_SC_XOPEN_CRYPT",	15,	_SC_XOPEN_CRYPT},
345 #endif
346 #ifdef _SC_XOPEN_ENH_I18N
347    {"_SC_XOPEN_ENH_I18N",	18,	_SC_XOPEN_ENH_I18N},
348 #endif
349 #ifdef _SC_XOPEN_SHM
350    {"_SC_XOPEN_SHM",	13,	_SC_XOPEN_SHM},
351 #endif
352 #ifdef _SC_2_CHAR_TERM
353    {"_SC_2_CHAR_TERM",	15,	_SC_2_CHAR_TERM},
354 #endif
355 #ifdef _SC_2_C_VERSION
356    {"_SC_2_C_VERSION",	15,	_SC_2_C_VERSION},
357 #endif
358 #ifdef _SC_2_UPE
359    {"_SC_2_UPE",	9,	_SC_2_UPE},
360 #endif
361 #ifdef _SC_XOPEN_XPG2
362    {"_SC_XOPEN_XPG2",	14,	_SC_XOPEN_XPG2},
363 #endif
364 #ifdef _SC_XOPEN_XPG3
365    {"_SC_XOPEN_XPG3",	14,	_SC_XOPEN_XPG3},
366 #endif
367 #ifdef _SC_XOPEN_XPG4
368    {"_SC_XOPEN_XPG4",	14,	_SC_XOPEN_XPG4},
369 #endif
370 #ifdef _SC_CHAR_BIT
371    {"_SC_CHAR_BIT",	12,	_SC_CHAR_BIT},
372 #endif
373 #ifdef _SC_CHAR_MAX
374    {"_SC_CHAR_MAX",	12,	_SC_CHAR_MAX},
375 #endif
376 #ifdef _SC_CHAR_MIN
377    {"_SC_CHAR_MIN",	12,	_SC_CHAR_MIN},
378 #endif
379 #ifdef _SC_INT_MAX
380    {"_SC_INT_MAX",	11,	_SC_INT_MAX},
381 #endif
382 #ifdef _SC_INT_MIN
383    {"_SC_INT_MIN",	11,	_SC_INT_MIN},
384 #endif
385 #ifdef _SC_LONG_BIT
386    {"_SC_LONG_BIT",	12,	_SC_LONG_BIT},
387 #endif
388 #ifdef _SC_WORD_BIT
389    {"_SC_WORD_BIT",	12,	_SC_WORD_BIT},
390 #endif
391 #ifdef _SC_MB_LEN_MAX
392    {"_SC_MB_LEN_MAX",	14,	_SC_MB_LEN_MAX},
393 #endif
394 #ifdef _SC_NZERO
395    {"_SC_NZERO",	9,	_SC_NZERO},
396 #endif
397 #ifdef _SC_SSIZE_MAX
398    {"_SC_SSIZE_MAX",	13,	_SC_SSIZE_MAX},
399 #endif
400 #ifdef _SC_SCHAR_MAX
401    {"_SC_SCHAR_MAX",	13,	_SC_SCHAR_MAX},
402 #endif
403 #ifdef _SC_SCHAR_MIN
404    {"_SC_SCHAR_MIN",	13,	_SC_SCHAR_MIN},
405 #endif
406 #ifdef _SC_SHRT_MAX
407    {"_SC_SHRT_MAX",	12,	_SC_SHRT_MAX},
408 #endif
409 #ifdef _SC_SHRT_MIN
410    {"_SC_SHRT_MIN",	12,	_SC_SHRT_MIN},
411 #endif
412 #ifdef _SC_UCHAR_MAX
413    {"_SC_UCHAR_MAX",	13,	_SC_UCHAR_MAX},
414 #endif
415 #ifdef _SC_UINT_MAX
416    {"_SC_UINT_MAX",	12,	_SC_UINT_MAX},
417 #endif
418 #ifdef _SC_ULONG_MAX
419    {"_SC_ULONG_MAX",	13,	_SC_ULONG_MAX},
420 #endif
421 #ifdef _SC_USHRT_MAX
422    {"_SC_USHRT_MAX",	13,	_SC_USHRT_MAX},
423 #endif
424 #ifdef _SC_NL_ARGMAX
425    {"_SC_NL_ARGMAX",	13,	_SC_NL_ARGMAX},
426 #endif
427 #ifdef _SC_NL_LANGMAX
428    {"_SC_NL_LANGMAX",	14,	_SC_NL_LANGMAX},
429 #endif
430 #ifdef _SC_NL_MSGMAX
431    {"_SC_NL_MSGMAX",	13,	_SC_NL_MSGMAX},
432 #endif
433 #ifdef _SC_NL_NMAX
434    {"_SC_NL_NMAX",	11,	_SC_NL_NMAX},
435 #endif
436 #ifdef _SC_NL_SETMAX
437    {"_SC_NL_SETMAX",	13,	_SC_NL_SETMAX},
438 #endif
439 #ifdef _SC_NL_TEXTMAX
440    {"_SC_NL_TEXTMAX",	14,	_SC_NL_TEXTMAX},
441 #endif
442 #ifdef _SC_XBS5_ILP32_OFF32
443    {"_SC_XBS5_ILP32_OFF32",	20,	_SC_XBS5_ILP32_OFF32},
444 #endif
445 #ifdef _SC_XBS5_ILP32_OFFBIG
446    {"_SC_XBS5_ILP32_OFFBIG",	21,	_SC_XBS5_ILP32_OFFBIG},
447 #endif
448 #ifdef _SC_XBS5_LP64_OFF64
449    {"_SC_XBS5_LP64_OFF64",	19,	_SC_XBS5_LP64_OFF64},
450 #endif
451 #ifdef _SC_XBS5_LPBIG_OFFBIG
452    {"_SC_XBS5_LPBIG_OFFBIG",	21,	_SC_XBS5_LPBIG_OFFBIG},
453 #endif
454 #ifdef _SC_XOPEN_LEGACY
455    {"_SC_XOPEN_LEGACY",	16,	_SC_XOPEN_LEGACY},
456 #endif
457 #ifdef _SC_XOPEN_REALTIME
458    {"_SC_XOPEN_REALTIME",	18,	_SC_XOPEN_REALTIME},
459 #endif
460 #ifdef _SC_XOPEN_REALTIME_THREADS
461    {"_SC_XOPEN_REALTIME_THREADS",	26,	_SC_XOPEN_REALTIME_THREADS},
462 #endif
463 #ifdef _SC_ADVISORY_INFO
464    {"_SC_ADVISORY_INFO",	17,	_SC_ADVISORY_INFO},
465 #endif
466 #ifdef _SC_BARRIERS
467    {"_SC_BARRIERS",	12,	_SC_BARRIERS},
468 #endif
469 #ifdef _SC_BASE
470    {"_SC_BASE",	8,	_SC_BASE},
471 #endif
472 #ifdef _SC_C_LANG_SUPPORT
473    {"_SC_C_LANG_SUPPORT",	18,	_SC_C_LANG_SUPPORT},
474 #endif
475 #ifdef _SC_C_LANG_SUPPORT_R
476    {"_SC_C_LANG_SUPPORT_R",	20,	_SC_C_LANG_SUPPORT_R},
477 #endif
478 #ifdef _SC_CLOCK_SELECTION
479    {"_SC_CLOCK_SELECTION",	19,	_SC_CLOCK_SELECTION},
480 #endif
481 #ifdef _SC_CPUTIME
482    {"_SC_CPUTIME",	11,	_SC_CPUTIME},
483 #endif
484 #ifdef _SC_THREAD_CPUTIME
485    {"_SC_THREAD_CPUTIME",	18,	_SC_THREAD_CPUTIME},
486 #endif
487 #ifdef _SC_DEVICE_IO
488    {"_SC_DEVICE_IO",	13,	_SC_DEVICE_IO},
489 #endif
490 #ifdef _SC_DEVICE_SPECIFIC
491    {"_SC_DEVICE_SPECIFIC",	19,	_SC_DEVICE_SPECIFIC},
492 #endif
493 #ifdef _SC_DEVICE_SPECIFIC_R
494    {"_SC_DEVICE_SPECIFIC_R",	21,	_SC_DEVICE_SPECIFIC_R},
495 #endif
496 #ifdef _SC_FD_MGMT
497    {"_SC_FD_MGMT",	11,	_SC_FD_MGMT},
498 #endif
499 #ifdef _SC_FIFO
500    {"_SC_FIFO",	8,	_SC_FIFO},
501 #endif
502 #ifdef _SC_PIPE
503    {"_SC_PIPE",	8,	_SC_PIPE},
504 #endif
505 #ifdef _SC_FILE_ATTRIBUTES
506    {"_SC_FILE_ATTRIBUTES",	19,	_SC_FILE_ATTRIBUTES},
507 #endif
508 #ifdef _SC_FILE_LOCKING
509    {"_SC_FILE_LOCKING",	16,	_SC_FILE_LOCKING},
510 #endif
511 #ifdef _SC_FILE_SYSTEM
512    {"_SC_FILE_SYSTEM",	15,	_SC_FILE_SYSTEM},
513 #endif
514 #ifdef _SC_MONOTONIC_CLOCK
515    {"_SC_MONOTONIC_CLOCK",	19,	_SC_MONOTONIC_CLOCK},
516 #endif
517 #ifdef _SC_MULTI_PROCESS
518    {"_SC_MULTI_PROCESS",	17,	_SC_MULTI_PROCESS},
519 #endif
520 #ifdef _SC_SINGLE_PROCESS
521    {"_SC_SINGLE_PROCESS",	18,	_SC_SINGLE_PROCESS},
522 #endif
523 #ifdef _SC_NETWORKING
524    {"_SC_NETWORKING",	14,	_SC_NETWORKING},
525 #endif
526 #ifdef _SC_READER_WRITER_LOCKS
527    {"_SC_READER_WRITER_LOCKS",	23,	_SC_READER_WRITER_LOCKS},
528 #endif
529 #ifdef _SC_SPIN_LOCKS
530    {"_SC_SPIN_LOCKS",	14,	_SC_SPIN_LOCKS},
531 #endif
532 #ifdef _SC_REGEXP
533    {"_SC_REGEXP",	10,	_SC_REGEXP},
534 #endif
535 #ifdef _SC_REGEX_VERSION
536    {"_SC_REGEX_VERSION",	17,	_SC_REGEX_VERSION},
537 #endif
538 #ifdef _SC_SHELL
539    {"_SC_SHELL",	9,	_SC_SHELL},
540 #endif
541 #ifdef _SC_SIGNALS
542    {"_SC_SIGNALS",	11,	_SC_SIGNALS},
543 #endif
544 #ifdef _SC_SPAWN
545    {"_SC_SPAWN",	9,	_SC_SPAWN},
546 #endif
547 #ifdef _SC_SPORADIC_SERVER
548    {"_SC_SPORADIC_SERVER",	19,	_SC_SPORADIC_SERVER},
549 #endif
550 #ifdef _SC_THREAD_SPORADIC_SERVER
551    {"_SC_THREAD_SPORADIC_SERVER",	26,	_SC_THREAD_SPORADIC_SERVER},
552 #endif
553 #ifdef _SC_SYSTEM_DATABASE
554    {"_SC_SYSTEM_DATABASE",	19,	_SC_SYSTEM_DATABASE},
555 #endif
556 #ifdef _SC_SYSTEM_DATABASE_R
557    {"_SC_SYSTEM_DATABASE_R",	21,	_SC_SYSTEM_DATABASE_R},
558 #endif
559 #ifdef _SC_TIMEOUTS
560    {"_SC_TIMEOUTS",	12,	_SC_TIMEOUTS},
561 #endif
562 #ifdef _SC_TYPED_MEMORY_OBJECTS
563    {"_SC_TYPED_MEMORY_OBJECTS",	24,	_SC_TYPED_MEMORY_OBJECTS},
564 #endif
565 #ifdef _SC_USER_GROUPS
566    {"_SC_USER_GROUPS",	15,	_SC_USER_GROUPS},
567 #endif
568 #ifdef _SC_USER_GROUPS_R
569    {"_SC_USER_GROUPS_R",	17,	_SC_USER_GROUPS_R},
570 #endif
571 #ifdef _SC_2_PBS
572    {"_SC_2_PBS",	9,	_SC_2_PBS},
573 #endif
574 #ifdef _SC_2_PBS_ACCOUNTING
575    {"_SC_2_PBS_ACCOUNTING",	20,	_SC_2_PBS_ACCOUNTING},
576 #endif
577 #ifdef _SC_2_PBS_LOCATE
578    {"_SC_2_PBS_LOCATE",	16,	_SC_2_PBS_LOCATE},
579 #endif
580 #ifdef _SC_2_PBS_MESSAGE
581    {"_SC_2_PBS_MESSAGE",	17,	_SC_2_PBS_MESSAGE},
582 #endif
583 #ifdef _SC_2_PBS_TRACK
584    {"_SC_2_PBS_TRACK",	15,	_SC_2_PBS_TRACK},
585 #endif
586 #ifdef _SC_SYMLOOP_MAX
587    {"_SC_SYMLOOP_MAX",	15,	_SC_SYMLOOP_MAX},
588 #endif
589 #ifdef _SC_STREAMS
590    {"_SC_STREAMS",	11,	_SC_STREAMS},
591 #endif
592 #ifdef _SC_2_PBS_CHECKPOINT
593    {"_SC_2_PBS_CHECKPOINT",	20,	_SC_2_PBS_CHECKPOINT},
594 #endif
595 #ifdef _SC_V6_ILP32_OFF32
596    {"_SC_V6_ILP32_OFF32",	18,	_SC_V6_ILP32_OFF32},
597 #endif
598 #ifdef _SC_V6_ILP32_OFFBIG
599    {"_SC_V6_ILP32_OFFBIG",	19,	_SC_V6_ILP32_OFFBIG},
600 #endif
601 #ifdef _SC_V6_LP64_OFF64
602    {"_SC_V6_LP64_OFF64",	17,	_SC_V6_LP64_OFF64},
603 #endif
604 #ifdef _SC_V6_LPBIG_OFFBIG
605    {"_SC_V6_LPBIG_OFFBIG",	19,	_SC_V6_LPBIG_OFFBIG},
606 #endif
607 #ifdef _SC_HOST_NAME_MAX
608    {"_SC_HOST_NAME_MAX",	17,	_SC_HOST_NAME_MAX},
609 #endif
610 #ifdef _SC_TRACE
611    {"_SC_TRACE",	9,	_SC_TRACE},
612 #endif
613 #ifdef _SC_TRACE_EVENT_FILTER
614    {"_SC_TRACE_EVENT_FILTER",	22,	_SC_TRACE_EVENT_FILTER},
615 #endif
616 #ifdef _SC_TRACE_INHERIT
617    {"_SC_TRACE_INHERIT",	17,	_SC_TRACE_INHERIT},
618 #endif
619 #ifdef _SC_TRACE_LOG
620    {"_SC_TRACE_LOG",	13,	_SC_TRACE_LOG},
621 #endif
622 #ifdef _SC_LEVEL1_ICACHE_SIZE
623    {"_SC_LEVEL1_ICACHE_SIZE",	22,	_SC_LEVEL1_ICACHE_SIZE},
624 #endif
625 #ifdef _SC_LEVEL1_ICACHE_ASSOC
626    {"_SC_LEVEL1_ICACHE_ASSOC",	23,	_SC_LEVEL1_ICACHE_ASSOC},
627 #endif
628 #ifdef _SC_LEVEL1_ICACHE_LINESIZE
629    {"_SC_LEVEL1_ICACHE_LINESIZE",	26,	_SC_LEVEL1_ICACHE_LINESIZE},
630 #endif
631 #ifdef _SC_LEVEL1_DCACHE_SIZE
632    {"_SC_LEVEL1_DCACHE_SIZE",	22,	_SC_LEVEL1_DCACHE_SIZE},
633 #endif
634 #ifdef _SC_LEVEL1_DCACHE_ASSOC
635    {"_SC_LEVEL1_DCACHE_ASSOC",	23,	_SC_LEVEL1_DCACHE_ASSOC},
636 #endif
637 #ifdef _SC_LEVEL1_DCACHE_LINESIZE
638    {"_SC_LEVEL1_DCACHE_LINESIZE",	26,	_SC_LEVEL1_DCACHE_LINESIZE},
639 #endif
640 #ifdef _SC_LEVEL2_CACHE_SIZE
641    {"_SC_LEVEL2_CACHE_SIZE",	21,	_SC_LEVEL2_CACHE_SIZE},
642 #endif
643 #ifdef _SC_LEVEL2_CACHE_ASSOC
644    {"_SC_LEVEL2_CACHE_ASSOC",	22,	_SC_LEVEL2_CACHE_ASSOC},
645 #endif
646 #ifdef _SC_LEVEL2_CACHE_LINESIZE
647    {"_SC_LEVEL2_CACHE_LINESIZE",	25,	_SC_LEVEL2_CACHE_LINESIZE},
648 #endif
649 #ifdef _SC_LEVEL3_CACHE_SIZE
650    {"_SC_LEVEL3_CACHE_SIZE",	21,	_SC_LEVEL3_CACHE_SIZE},
651 #endif
652 #ifdef _SC_LEVEL3_CACHE_ASSOC
653    {"_SC_LEVEL3_CACHE_ASSOC",	22,	_SC_LEVEL3_CACHE_ASSOC},
654 #endif
655 #ifdef _SC_LEVEL3_CACHE_LINESIZE
656    {"_SC_LEVEL3_CACHE_LINESIZE",	25,	_SC_LEVEL3_CACHE_LINESIZE},
657 #endif
658 #ifdef _SC_LEVEL4_CACHE_SIZE
659    {"_SC_LEVEL4_CACHE_SIZE",	21,	_SC_LEVEL4_CACHE_SIZE},
660 #endif
661 #ifdef _SC_LEVEL4_CACHE_ASSOC
662    {"_SC_LEVEL4_CACHE_ASSOC",	22,	_SC_LEVEL4_CACHE_ASSOC},
663 #endif
664 #ifdef _SC_LEVEL4_CACHE_LINESIZE
665    {"_SC_LEVEL4_CACHE_LINESIZE",	25,	_SC_LEVEL4_CACHE_LINESIZE},
666 #endif
667 #ifdef _SC_IPV6
668    {"_SC_IPV6",	8,	_SC_IPV6},
669 #endif
670 #ifdef _SC_RAW_SOCKETS
671    {"_SC_RAW_SOCKETS",	15,	_SC_RAW_SOCKETS},
672 #endif
673    {NULL, 0, -1}
674 };
675 
676 /*}}}*/
677 
678 #ifdef HAVE_CONFSTR
679 static const Name_Map_Type CS_Name_Map_Table[] = /*{{{*/
680 {
681 #ifdef _CS_PATH
682    {"_CS_PATH",	8,	_CS_PATH},
683 #endif
684 #ifdef _CS_V6_WIDTH_RESTRICTED_ENVS
685    {"_CS_V6_WIDTH_RESTRICTED_ENVS",	28,	_CS_V6_WIDTH_RESTRICTED_ENVS},
686 #endif
687 #ifdef _CS_GNU_LIBC_VERSION
688    {"_CS_GNU_LIBC_VERSION",	20,	_CS_GNU_LIBC_VERSION},
689 #endif
690 #ifdef _CS_GNU_LIBPTHREAD_VERSION
691    {"_CS_GNU_LIBPTHREAD_VERSION",	26,	_CS_GNU_LIBPTHREAD_VERSION},
692 #endif
693 #ifdef _CS_LFS_CFLAGS
694    {"_CS_LFS_CFLAGS",	14,	_CS_LFS_CFLAGS},
695 #endif
696 #ifdef _CS_LFS_LDFLAGS
697    {"_CS_LFS_LDFLAGS",	15,	_CS_LFS_LDFLAGS},
698 #endif
699 #ifdef _CS_LFS_LIBS
700    {"_CS_LFS_LIBS",	12,	_CS_LFS_LIBS},
701 #endif
702 #ifdef _CS_LFS_LINTFLAGS
703    {"_CS_LFS_LINTFLAGS",	17,	_CS_LFS_LINTFLAGS},
704 #endif
705 #ifdef _CS_LFS64_CFLAGS
706    {"_CS_LFS64_CFLAGS",	16,	_CS_LFS64_CFLAGS},
707 #endif
708 #ifdef _CS_LFS64_LDFLAGS
709    {"_CS_LFS64_LDFLAGS",	17,	_CS_LFS64_LDFLAGS},
710 #endif
711 #ifdef _CS_LFS64_LIBS
712    {"_CS_LFS64_LIBS",	14,	_CS_LFS64_LIBS},
713 #endif
714 #ifdef _CS_LFS64_LINTFLAGS
715    {"_CS_LFS64_LINTFLAGS",	19,	_CS_LFS64_LINTFLAGS},
716 #endif
717 #ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
718    {"_CS_XBS5_ILP32_OFF32_CFLAGS",	27,	_CS_XBS5_ILP32_OFF32_CFLAGS},
719 #endif
720 #ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
721    {"_CS_XBS5_ILP32_OFF32_LDFLAGS",	28,	_CS_XBS5_ILP32_OFF32_LDFLAGS},
722 #endif
723 #ifdef _CS_XBS5_ILP32_OFF32_LIBS
724    {"_CS_XBS5_ILP32_OFF32_LIBS",	25,	_CS_XBS5_ILP32_OFF32_LIBS},
725 #endif
726 #ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
727    {"_CS_XBS5_ILP32_OFF32_LINTFLAGS",	30,	_CS_XBS5_ILP32_OFF32_LINTFLAGS},
728 #endif
729 #ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
730    {"_CS_XBS5_ILP32_OFFBIG_CFLAGS",	28,	_CS_XBS5_ILP32_OFFBIG_CFLAGS},
731 #endif
732 #ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
733    {"_CS_XBS5_ILP32_OFFBIG_LDFLAGS",	29,	_CS_XBS5_ILP32_OFFBIG_LDFLAGS},
734 #endif
735 #ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
736    {"_CS_XBS5_ILP32_OFFBIG_LIBS",	26,	_CS_XBS5_ILP32_OFFBIG_LIBS},
737 #endif
738 #ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
739    {"_CS_XBS5_ILP32_OFFBIG_LINTFLAGS",	31,	_CS_XBS5_ILP32_OFFBIG_LINTFLAGS},
740 #endif
741 #ifdef _CS_XBS5_LP64_OFF64_CFLAGS
742    {"_CS_XBS5_LP64_OFF64_CFLAGS",	26,	_CS_XBS5_LP64_OFF64_CFLAGS},
743 #endif
744 #ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
745    {"_CS_XBS5_LP64_OFF64_LDFLAGS",	27,	_CS_XBS5_LP64_OFF64_LDFLAGS},
746 #endif
747 #ifdef _CS_XBS5_LP64_OFF64_LIBS
748    {"_CS_XBS5_LP64_OFF64_LIBS",	24,	_CS_XBS5_LP64_OFF64_LIBS},
749 #endif
750 #ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
751    {"_CS_XBS5_LP64_OFF64_LINTFLAGS",	29,	_CS_XBS5_LP64_OFF64_LINTFLAGS},
752 #endif
753 #ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
754    {"_CS_XBS5_LPBIG_OFFBIG_CFLAGS",	28,	_CS_XBS5_LPBIG_OFFBIG_CFLAGS},
755 #endif
756 #ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
757    {"_CS_XBS5_LPBIG_OFFBIG_LDFLAGS",	29,	_CS_XBS5_LPBIG_OFFBIG_LDFLAGS},
758 #endif
759 #ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
760    {"_CS_XBS5_LPBIG_OFFBIG_LIBS",	26,	_CS_XBS5_LPBIG_OFFBIG_LIBS},
761 #endif
762 #ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
763    {"_CS_XBS5_LPBIG_OFFBIG_LINTFLAGS",	31,	_CS_XBS5_LPBIG_OFFBIG_LINTFLAGS},
764 #endif
765 #ifdef _CS_POSIX_V6_ILP32_OFF32_CFLAGS
766    {"_CS_POSIX_V6_ILP32_OFF32_CFLAGS",	31,	_CS_POSIX_V6_ILP32_OFF32_CFLAGS},
767 #endif
768 #ifdef _CS_POSIX_V6_ILP32_OFF32_LDFLAGS
769    {"_CS_POSIX_V6_ILP32_OFF32_LDFLAGS",	32,	_CS_POSIX_V6_ILP32_OFF32_LDFLAGS},
770 #endif
771 #ifdef _CS_POSIX_V6_ILP32_OFF32_LIBS
772    {"_CS_POSIX_V6_ILP32_OFF32_LIBS",	29,	_CS_POSIX_V6_ILP32_OFF32_LIBS},
773 #endif
774 #ifdef _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS
775    {"_CS_POSIX_V6_ILP32_OFF32_LINTFLAGS",	34,	_CS_POSIX_V6_ILP32_OFF32_LINTFLAGS},
776 #endif
777 #ifdef _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS
778    {"_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS",	32,	_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS},
779 #endif
780 #ifdef _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS
781    {"_CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS",	33,	_CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS},
782 #endif
783 #ifdef _CS_POSIX_V6_ILP32_OFFBIG_LIBS
784    {"_CS_POSIX_V6_ILP32_OFFBIG_LIBS",	30,	_CS_POSIX_V6_ILP32_OFFBIG_LIBS},
785 #endif
786 #ifdef _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS
787    {"_CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS",	35,	_CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS},
788 #endif
789 #ifdef _CS_POSIX_V6_LP64_OFF64_CFLAGS
790    {"_CS_POSIX_V6_LP64_OFF64_CFLAGS",	30,	_CS_POSIX_V6_LP64_OFF64_CFLAGS},
791 #endif
792 #ifdef _CS_POSIX_V6_LP64_OFF64_LDFLAGS
793    {"_CS_POSIX_V6_LP64_OFF64_LDFLAGS",	31,	_CS_POSIX_V6_LP64_OFF64_LDFLAGS},
794 #endif
795 #ifdef _CS_POSIX_V6_LP64_OFF64_LIBS
796    {"_CS_POSIX_V6_LP64_OFF64_LIBS",	28,	_CS_POSIX_V6_LP64_OFF64_LIBS},
797 #endif
798 #ifdef _CS_POSIX_V6_LP64_OFF64_LINTFLAGS
799    {"_CS_POSIX_V6_LP64_OFF64_LINTFLAGS",	33,	_CS_POSIX_V6_LP64_OFF64_LINTFLAGS},
800 #endif
801 #ifdef _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS
802    {"_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS",	32,	_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS},
803 #endif
804 #ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS
805    {"_CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS",	33,	_CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS},
806 #endif
807 #ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LIBS
808    {"_CS_POSIX_V6_LPBIG_OFFBIG_LIBS",	30,	_CS_POSIX_V6_LPBIG_OFFBIG_LIBS},
809 #endif
810 #ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS
811    {"_CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS",	35,	_CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS},
812 #endif
813    {NULL, 0, -1}
814 };
815 
816 /*}}}*/
817 #endif
818 
819 #ifdef HAVE_PATHCONF
820 static const Name_Map_Type PC_Name_Map_Table[] = /*{{{*/
821 {
822 #ifdef _PC_LINK_MAX
823    {"_PC_LINK_MAX",	12,	_PC_LINK_MAX},
824 #endif
825 #ifdef _PC_MAX_CANON
826    {"_PC_MAX_CANON",	13,	_PC_MAX_CANON},
827 #endif
828 #ifdef _PC_MAX_INPUT
829    {"_PC_MAX_INPUT",	13,	_PC_MAX_INPUT},
830 #endif
831 #ifdef _PC_NAME_MAX
832    {"_PC_NAME_MAX",	12,	_PC_NAME_MAX},
833 #endif
834 #ifdef _PC_PATH_MAX
835    {"_PC_PATH_MAX",	12,	_PC_PATH_MAX},
836 #endif
837 #ifdef _PC_PIPE_BUF
838    {"_PC_PIPE_BUF",	12,	_PC_PIPE_BUF},
839 #endif
840 #ifdef _PC_CHOWN_RESTRICTED
841    {"_PC_CHOWN_RESTRICTED",	20,	_PC_CHOWN_RESTRICTED},
842 #endif
843 #ifdef _PC_NO_TRUNC
844    {"_PC_NO_TRUNC",	12,	_PC_NO_TRUNC},
845 #endif
846 #ifdef _PC_VDISABLE
847    {"_PC_VDISABLE",	12,	_PC_VDISABLE},
848 #endif
849 #ifdef _PC_SYNC_IO
850    {"_PC_SYNC_IO",	11,	_PC_SYNC_IO},
851 #endif
852 #ifdef _PC_ASYNC_IO
853    {"_PC_ASYNC_IO",	12,	_PC_ASYNC_IO},
854 #endif
855 #ifdef _PC_PRIO_IO
856    {"_PC_PRIO_IO",	11,	_PC_PRIO_IO},
857 #endif
858 #ifdef _PC_SOCK_MAXBUF
859    {"_PC_SOCK_MAXBUF",	15,	_PC_SOCK_MAXBUF},
860 #endif
861 #ifdef _PC_FILESIZEBITS
862    {"_PC_FILESIZEBITS",	16,	_PC_FILESIZEBITS},
863 #endif
864 #ifdef _PC_REC_INCR_XFER_SIZE
865    {"_PC_REC_INCR_XFER_SIZE",	22,	_PC_REC_INCR_XFER_SIZE},
866 #endif
867 #ifdef _PC_REC_MAX_XFER_SIZE
868    {"_PC_REC_MAX_XFER_SIZE",	21,	_PC_REC_MAX_XFER_SIZE},
869 #endif
870 #ifdef _PC_REC_MIN_XFER_SIZE
871    {"_PC_REC_MIN_XFER_SIZE",	21,	_PC_REC_MIN_XFER_SIZE},
872 #endif
873 #ifdef _PC_REC_XFER_ALIGN
874    {"_PC_REC_XFER_ALIGN",	18,	_PC_REC_XFER_ALIGN},
875 #endif
876 #ifdef _PC_ALLOC_SIZE_MIN
877    {"_PC_ALLOC_SIZE_MIN",	18,	_PC_ALLOC_SIZE_MIN},
878 #endif
879 #ifdef _PC_SYMLINK_MAX
880    {"_PC_SYMLINK_MAX",	15,	_PC_SYMLINK_MAX},
881 #endif
882 #ifdef _PC_2_SYMLINKS
883    {"_PC_2_SYMLINKS",	14,	_PC_2_SYMLINKS},
884 #endif
885    {NULL, 0, -1},
886 };
887 
888 /*}}}*/
889 #endif
890 
891 /* return -1 upon error, 0 if name not found, 1 if found or specified. */
pop_iname(const Name_Map_Type * map,int * inamep)892 static int pop_iname (const Name_Map_Type *map, int *inamep)
893 {
894    if (SLang_peek_at_stack () == SLANG_STRING_TYPE)
895      {
896 	char *name;
897 	if (-1 == SLang_pop_slstring (&name))
898 	  return -1;
899 	map = lookup_name (map, name);
900 	SLang_free_slstring (name);
901 	if (map == NULL)
902 	  return 0;
903 
904 	*inamep = map->iname;
905      }
906    else if (-1 == SLang_pop_int (inamep))
907      return -1;
908 
909    return 1;
910 }
911 
912 /* Usage: val = sysconf (name|iname [,defval]) */
sysconf_intrinsic(void)913 static void sysconf_intrinsic (void)
914 {
915    int has_def_val = 0;
916    long defval = -1;
917    long val;
918    int iname;
919    int status;
920 
921    if (SLang_Num_Function_Args == 2)
922      {
923 	if (-1 == SLang_pop_long (&defval))
924 	  return;
925 	has_def_val = 1;
926      }
927 
928    status = pop_iname (SC_Name_Map_Table, &iname);
929    if (status == -1)
930      return;
931 
932    if (status == 0)
933      goto return_default;
934 
935    errno = 0;
936    val = sysconf (iname);
937    if (val == -1)
938      {
939 	if (errno)
940 	  goto return_default;
941 
942 	if (has_def_val)
943 	  val = defval;
944      }
945 
946    (void) SLang_push_long (val);
947    return;
948 
949 return_default:
950    if (has_def_val)
951      (void) SLang_push_long (defval);
952    else
953      (void) SLang_push_null ();
954 }
955 
956 #ifdef HAVE_PATHCONF
pathconf_intrinsic(void)957 static void pathconf_intrinsic (void)
958 {
959    int has_def_val = 0;
960    long defval = -1;
961    long val;
962    int iname;
963    int status;
964    char *path = NULL;
965    int fd = -1, e;
966 
967    if (SLang_Num_Function_Args == 3)
968      {
969 	if (-1 == SLang_pop_long (&defval))
970 	  return;
971 	has_def_val = 1;
972      }
973 
974    status = pop_iname (PC_Name_Map_Table, &iname);
975    if (status == -1)
976      return;
977 
978    switch (SLang_peek_at_stack ())
979      {
980       case SLANG_STRING_TYPE:
981 	if (-1 == SLang_pop_slstring (&path))
982 	  return;
983 	break;
984 
985       case SLANG_FILE_PTR_TYPE:
986 	  {
987 	     FILE *fp;
988 	     SLang_MMT_Type *mmt;
989 
990 	     if (-1 == SLang_pop_fileptr (&mmt, &fp))
991 	       return;
992 	     fd = fileno (fp);
993 	     SLang_free_mmt (mmt);
994 	  }
995 	break;
996 
997       default:
998 	  {
999 	     SLFile_FD_Type *f;
1000 	     if (-1 == SLfile_pop_fd (&f))
1001 	       return;
1002 	     if (-1 == SLfile_get_fd (f, &fd))
1003 	       {
1004 		  SLfile_free_fd (f);
1005 		  return;
1006 	       }
1007 	     SLfile_free_fd (f);
1008 	  }
1009      }
1010 
1011    if (status == 0)
1012      {
1013 	e = EINVAL;
1014 	if (path != NULL)
1015 	  SLang_free_slstring (path);
1016 	goto return_default;
1017      }
1018 
1019    errno = 0;
1020    if (path != NULL)
1021      {
1022 	val = pathconf (path, iname);
1023 	e = errno;
1024 	SLang_free_slstring (path);
1025      }
1026    else
1027      {
1028 	val = fpathconf (fd, iname);
1029 	e = errno;
1030      }
1031 
1032    if (val == -1)
1033      {
1034 	if (e)
1035 	  goto return_default;
1036 
1037 	if (has_def_val)
1038 	  val = defval;
1039      }
1040 
1041    (void) SLang_push_long (val);
1042    return;
1043 
1044 return_default:
1045    if (has_def_val && (e == EINVAL))
1046      (void) SLang_push_long (defval);
1047    else
1048      {
1049 	SLerrno_set_errno (e);
1050 	(void) SLang_push_null ();
1051      }
1052 }
1053 #endif
1054 
1055 #ifdef HAVE_CONFSTR
1056 /* Usage: val = sysconf (name|iname [,defval]) */
confstr_intrinsic(void)1057 static void confstr_intrinsic (void)
1058 {
1059    char *defstr = NULL;
1060    int use_def_val = 0;
1061    int iname;
1062    int status;
1063    char buf[10];
1064    char *bufstr;
1065    size_t len;
1066 
1067    if (SLang_Num_Function_Args == 2)
1068      {
1069 	if (-1 == SLang_pop_slstring (&defstr))
1070 	  return;
1071 	use_def_val = 1;
1072      }
1073 
1074    status = pop_iname (CS_Name_Map_Table, &iname);
1075    if (status == -1)
1076      {
1077 	SLang_free_slstring (defstr);  /* NULL ok */
1078 	return;
1079      }
1080 
1081    errno = 0;
1082    if ((status == 0)
1083        || (0 == (len = confstr (iname, buf, sizeof(buf)))))
1084      {
1085 	if ((errno != EINVAL) && (errno != 0))
1086 	  {
1087 	     SLerrno_set_errno (errno);
1088 	     use_def_val = 0;
1089 	  }
1090 
1091 	if (use_def_val)
1092 	  (void) SLang_push_string(defstr);
1093 	else
1094 	  (void) SLang_push_null ();
1095 
1096 	SLang_free_slstring (defstr);
1097 	return;
1098      }
1099 
1100    SLang_free_slstring (defstr);
1101    defstr = NULL;
1102 
1103    if (len <= sizeof(buf))
1104      {
1105 	SLang_push_string (buf);
1106 	return;
1107      }
1108 
1109    if (NULL == (bufstr = (char *)SLmalloc (len)))
1110      return;
1111 
1112    errno = 0;
1113    len = confstr (iname, bufstr, len);
1114    if (len == 0)
1115      {
1116 	SLerrno_set_errno (errno);
1117 	SLfree (bufstr);
1118 	(void) SLang_push_null ();
1119 	return;
1120      }
1121    (void) SLang_push_malloced_string (bufstr);   /* frees bufstr */
1122 }
1123 #endif
1124 
push_map(const Name_Map_Type * map)1125 static int push_map (const Name_Map_Type *map)
1126 {
1127    SLindex_Type num = 0;
1128    const Name_Map_Type *m;
1129    SLang_Array_Type *at;
1130    char **names;
1131 
1132    m = map;
1133    while (m->name != NULL)
1134      {
1135 	num++;
1136 	m++;
1137      }
1138 
1139    if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 1, NULL, &num, 1)))
1140      return -1;
1141 
1142    names = (char **) at->data;
1143    m = map;
1144    while (m->name != NULL)
1145      {
1146 	if (NULL == (*names = SLang_create_slstring ((char *) m->name)))
1147 	  {
1148 	     SLang_free_array (at);
1149 	     return -1;
1150 	  }
1151 	names++;
1152 	m++;
1153      }
1154 
1155    return SLang_push_array (at, 1);
1156 }
1157 
sysconf_names_intrinsic(void)1158 static void sysconf_names_intrinsic (void)
1159 {
1160    (void) push_map (SC_Name_Map_Table);
1161 }
1162 
1163 #ifdef HAVE_PATHCONF
pathconf_names_intrinsic(void)1164 static void pathconf_names_intrinsic (void)
1165 {
1166    (void) push_map (PC_Name_Map_Table);
1167 }
1168 #endif
1169 
1170 #ifdef HAVE_CONFSTR
confstr_names_intrinsic(void)1171 static void confstr_names_intrinsic (void)
1172 {
1173    (void) push_map (CS_Name_Map_Table);
1174 }
1175 #endif
1176 
1177 static SLang_Intrin_Fun_Type Module_Intrinsics [] =
1178 {
1179    MAKE_INTRINSIC_0("sysconf", sysconf_intrinsic, SLANG_VOID_TYPE),
1180    MAKE_INTRINSIC_0("sysconf_names", sysconf_names_intrinsic, SLANG_VOID_TYPE),
1181 #ifdef HAVE_PATHCONF
1182    MAKE_INTRINSIC_0("pathconf", pathconf_intrinsic, SLANG_VOID_TYPE),
1183    MAKE_INTRINSIC_0("pathconf_names", pathconf_names_intrinsic, SLANG_VOID_TYPE),
1184 #endif
1185 #ifdef HAVE_CONFSTR
1186    MAKE_INTRINSIC_0("confstr", confstr_intrinsic, SLANG_VOID_TYPE),
1187    MAKE_INTRINSIC_0("confstr_names", confstr_names_intrinsic, SLANG_VOID_TYPE),
1188 #endif
1189    SLANG_END_INTRIN_FUN_TABLE
1190 };
1191 
init_sysconf_module_ns(char * ns_name)1192 int init_sysconf_module_ns (char *ns_name)
1193 {
1194    SLang_NameSpace_Type *ns = SLns_create_namespace (ns_name);
1195    if (ns == NULL)
1196      return -1;
1197 
1198    if (-1 == SLns_add_intrin_fun_table (ns, Module_Intrinsics, NULL))
1199      return -1;
1200 
1201    return 0;
1202 }
1203 
1204 /* This function is optional */
deinit_sysconf_module(void)1205 void deinit_sysconf_module (void)
1206 {
1207 }
1208