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