1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #pragma ident "%Z%%M% %I% %E% SMI" 27 28 /* Copyright (c) 1988 AT&T */ 29 /* All Rights Reserved */ 30 31 32 /* sysconf(3C) - returns system configuration information */ 33 34 #pragma weak sysconf = _sysconf 35 36 #include "synonyms.h" 37 #include <mtlib.h> 38 #include <sys/types.h> 39 #include <unistd.h> 40 #include <sys/sysconfig.h> 41 #include <sys/errno.h> 42 #include <limits.h> 43 #include <time.h> 44 #include <errno.h> 45 #include <nss_dbdefs.h> 46 #include <thread.h> 47 #include <xti.h> 48 #include "libc.h" 49 #include "xpg6.h" 50 51 long 52 sysconf(int name) 53 { 54 static int _pagesize = 0; 55 static int _hz = 0; 56 static pid_t _maxpid = 0; 57 static int _stackprot = 0; 58 extern int __xpg4; 59 60 switch (name) { 61 default: 62 errno = EINVAL; 63 return (-1L); 64 65 case _SC_ARG_MAX: 66 return ((long)ARG_MAX); 67 68 case _SC_CLK_TCK: 69 if (_hz <= 0) 70 _hz = _sysconfig(_CONFIG_CLK_TCK); 71 return (_hz); 72 73 case _SC_JOB_CONTROL: 74 return ((long)_POSIX_JOB_CONTROL); 75 76 case _SC_SAVED_IDS: 77 return ((long)_POSIX_SAVED_IDS); 78 79 case _SC_CHILD_MAX: 80 return (_sysconfig(_CONFIG_CHILD_MAX)); 81 82 case _SC_NGROUPS_MAX: 83 return (_sysconfig(_CONFIG_NGROUPS)); 84 85 case _SC_OPEN_MAX: 86 return (_sysconfig(_CONFIG_OPEN_FILES)); 87 88 case _SC_VERSION: 89 if (__xpg6 & _C99SUSv3_XPG6_sysconf_version) 90 return (200112L); 91 else 92 return (199506L); 93 94 case _SC_PAGESIZE: 95 if (_pagesize <= 0) 96 _pagesize = _sysconfig(_CONFIG_PAGESIZE); 97 return (_pagesize); 98 99 case _SC_XOPEN_VERSION: 100 if (__xpg6 & _C99SUSv3_XPG6_sysconf_version) 101 return (600L); 102 else if (__xpg4 == 0) 103 return (_sysconfig(_CONFIG_XOPEN_VER)); 104 else 105 return (4L); 106 107 case _SC_XOPEN_XCU_VERSION: 108 if (__xpg6 & _C99SUSv3_XPG6_sysconf_version) 109 return (600L); 110 else 111 return (4L); 112 113 /* 114 * old value for pre XPG5 conformant systems to match 115 * getpass() length. 116 * XPG5 special cased with __sysconf_xpg5() 117 * new value for default and modern XPG systems. 118 */ 119 case _SC_PASS_MAX: 120 if ((__xpg4 == 1) && 121 (!(__xpg6 & _C99SUSv3_XPG6_sysconf_version))) 122 return ((long)_PASS_MAX_XPG); 123 else 124 return ((long)_PASS_MAX); 125 126 case _SC_LOGNAME_MAX: 127 return ((long)LOGNAME_MAX); 128 129 case _SC_STREAM_MAX: 130 return (_sysconfig(_CONFIG_OPEN_FILES)); 131 132 case _SC_TZNAME_MAX: 133 return (-1L); 134 135 case _SC_NPROCESSORS_CONF: 136 return (_sysconfig(_CONFIG_NPROC_CONF)); 137 138 case _SC_NPROCESSORS_ONLN: 139 return (_sysconfig(_CONFIG_NPROC_ONLN)); 140 141 case _SC_NPROCESSORS_MAX: 142 return (_sysconfig(_CONFIG_NPROC_MAX)); 143 144 case _SC_STACK_PROT: 145 if (_stackprot == 0) 146 _stackprot = _sysconfig(_CONFIG_STACK_PROT); 147 return (_stackprot); 148 149 /* POSIX.4 names */ 150 151 /* 152 * Each of the following also have _POSIX_* symbols 153 * defined in <unistd.h>. Values here should align 154 * with values in the header. Up until the SUSv3 standard 155 * we defined these simply as 1. With the introduction 156 * of the new revision, these were changed to 200112L. 157 * The standard allows us to change the value, however, 158 * we have kept both values in case application programs 159 * are relying on the previous value even though an 160 * application doing so is technically wrong. 161 */ 162 case _SC_ASYNCHRONOUS_IO: 163 case _SC_FSYNC: 164 case _SC_MAPPED_FILES: 165 case _SC_MEMLOCK: 166 case _SC_MEMLOCK_RANGE: 167 case _SC_MEMORY_PROTECTION: 168 case _SC_MESSAGE_PASSING: 169 case _SC_PRIORITY_SCHEDULING: 170 case _SC_REALTIME_SIGNALS: 171 case _SC_SEMAPHORES: 172 case _SC_SHARED_MEMORY_OBJECTS: 173 case _SC_SYNCHRONIZED_IO: 174 case _SC_TIMERS: 175 if (__xpg6 & _C99SUSv3_mode_ON) 176 return (200112L); 177 else 178 return (1L); 179 180 case _SC_PRIORITIZED_IO: 181 #ifdef _POSIX_PRIORITIZED_IO 182 return (1L); 183 #else 184 return (-1L); 185 #endif 186 187 case _SC_AIO_LISTIO_MAX: 188 return (_sysconfig(_CONFIG_AIO_LISTIO_MAX)); 189 190 case _SC_AIO_MAX: 191 return (_sysconfig(_CONFIG_AIO_MAX)); 192 193 case _SC_AIO_PRIO_DELTA_MAX: 194 return (_sysconfig(_CONFIG_AIO_PRIO_DELTA_MAX)); 195 196 case _SC_DELAYTIMER_MAX: 197 return (_sysconfig(_CONFIG_DELAYTIMER_MAX)); 198 199 case _SC_MQ_OPEN_MAX: 200 return (_sysconfig(_CONFIG_MQ_OPEN_MAX)); 201 202 case _SC_MQ_PRIO_MAX: 203 return (_sysconfig(_CONFIG_MQ_PRIO_MAX)); 204 205 case _SC_RTSIG_MAX: 206 return (_sysconfig(_CONFIG_RTSIG_MAX)); 207 208 case _SC_SEM_NSEMS_MAX: 209 return (_sysconfig(_CONFIG_SEM_NSEMS_MAX)); 210 211 case _SC_SEM_VALUE_MAX: 212 return (_sysconfig(_CONFIG_SEM_VALUE_MAX)); 213 214 case _SC_SIGQUEUE_MAX: 215 return (_sysconfig(_CONFIG_SIGQUEUE_MAX)); 216 217 case _SC_SIGRT_MAX: 218 return (_sysconfig(_CONFIG_SIGRT_MAX)); 219 220 case _SC_SIGRT_MIN: 221 return (_sysconfig(_CONFIG_SIGRT_MIN)); 222 223 case _SC_TIMER_MAX: 224 return (_sysconfig(_CONFIG_TIMER_MAX)); 225 226 case _SC_PHYS_PAGES: 227 return (_sysconfig(_CONFIG_PHYS_PAGES)); 228 229 case _SC_AVPHYS_PAGES: 230 return (_sysconfig(_CONFIG_AVPHYS_PAGES)); 231 232 /* XPG4/POSIX.1-1990/POSIX.2-1992 names */ 233 case _SC_2_C_BIND: 234 return ((long)_POSIX2_C_BIND); 235 236 case _SC_2_CHAR_TERM: 237 return ((long)_POSIX2_CHAR_TERM); 238 239 case _SC_2_C_DEV: 240 return ((long)_POSIX2_C_DEV); 241 242 case _SC_2_C_VERSION: 243 if (__xpg6 & _C99SUSv3_XPG6_sysconf_version) 244 return (200112L); 245 else 246 return (199209L); 247 248 case _SC_2_FORT_DEV: 249 return (-1L); 250 251 case _SC_2_FORT_RUN: 252 return ((long)_POSIX2_FORT_RUN); 253 254 case _SC_2_LOCALEDEF: 255 return ((long)_POSIX2_LOCALEDEF); 256 257 case _SC_2_SW_DEV: 258 return ((long)_POSIX2_SW_DEV); 259 260 case _SC_2_UPE: 261 return ((long)_POSIX2_UPE); 262 263 case _SC_2_VERSION: 264 if (__xpg6 & _C99SUSv3_XPG6_sysconf_version) 265 return (200112L); 266 else 267 return (199209L); 268 269 case _SC_BC_BASE_MAX: 270 return ((long)BC_BASE_MAX); 271 272 case _SC_BC_DIM_MAX: 273 return ((long)BC_DIM_MAX); 274 275 case _SC_BC_SCALE_MAX: 276 return ((long)BC_SCALE_MAX); 277 278 case _SC_BC_STRING_MAX: 279 return ((long)BC_STRING_MAX); 280 281 case _SC_COLL_WEIGHTS_MAX: 282 return ((long)COLL_WEIGHTS_MAX); 283 284 case _SC_EXPR_NEST_MAX: 285 return ((long)EXPR_NEST_MAX); 286 287 case _SC_LINE_MAX: 288 return ((long)LINE_MAX); 289 290 case _SC_RE_DUP_MAX: 291 return ((long)RE_DUP_MAX); 292 293 case _SC_XOPEN_CRYPT: 294 return (1L); 295 296 case _SC_XOPEN_ENH_I18N: 297 return ((long)_XOPEN_ENH_I18N); 298 299 case _SC_XOPEN_SHM: 300 return ((long)_XOPEN_SHM); 301 302 /* XPG4v2 (SUS) names */ 303 case _SC_XOPEN_UNIX: 304 return (1L); 305 306 case _SC_XOPEN_LEGACY: 307 return (1L); 308 309 case _SC_ATEXIT_MAX: 310 return (-1L); 311 312 case _SC_IOV_MAX: 313 return ((long)IOV_MAX); 314 315 case _SC_T_IOV_MAX: 316 return ((long)T_IOV_MAX); 317 318 /* XPG5 (SUSv2) names */ 319 case _SC_XOPEN_REALTIME: 320 return (1L); 321 322 case _SC_XOPEN_REALTIME_THREADS: 323 #if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && \ 324 defined(_POSIX_THREAD_PRIO_INHERIT) && \ 325 defined(_POSIX_THREAD_PRIO_PROTECT) 326 return (1L); 327 #else 328 return (-1L); 329 #endif 330 331 case _SC_XBS5_ILP32_OFF32: 332 return (1L); 333 334 case _SC_XBS5_ILP32_OFFBIG: 335 return (1L); 336 337 case _SC_XBS5_LP64_OFF64: 338 return (1L); 339 340 case _SC_XBS5_LPBIG_OFFBIG: 341 return (1L); 342 343 /* POSIX.1c names */ 344 case _SC_THREAD_DESTRUCTOR_ITERATIONS: 345 return (-1L); 346 347 case _SC_GETGR_R_SIZE_MAX: 348 return ((long)NSS_BUFLEN_GROUP); 349 350 case _SC_GETPW_R_SIZE_MAX: 351 return ((long)NSS_BUFLEN_PASSWD); 352 353 case _SC_LOGIN_NAME_MAX: 354 return ((long)(LOGNAME_MAX + 1)); 355 356 case _SC_THREAD_KEYS_MAX: 357 return (-1L); 358 359 case _SC_THREAD_STACK_MIN: 360 return ((long)_thr_min_stack()); 361 362 case _SC_THREAD_THREADS_MAX: 363 return (-1L); 364 365 case _SC_TTY_NAME_MAX: 366 return ((long)TTYNAME_MAX); 367 368 case _SC_BARRIERS: 369 return ((long)_POSIX_BARRIERS); 370 371 case _SC_CLOCK_SELECTION: 372 return ((long)_POSIX_CLOCK_SELECTION); 373 374 case _SC_MONOTONIC_CLOCK: 375 return ((long)_POSIX_MONOTONIC_CLOCK); 376 377 case _SC_SPAWN: 378 return ((long)_POSIX_SPAWN); 379 380 case _SC_SPIN_LOCKS: 381 return ((long)_POSIX_SPIN_LOCKS); 382 383 case _SC_THREADS: 384 case _SC_THREAD_ATTR_STACKADDR: 385 case _SC_THREAD_ATTR_STACKSIZE: 386 case _SC_THREAD_PRIORITY_SCHEDULING: 387 case _SC_THREAD_PRIO_INHERIT: 388 case _SC_THREAD_PRIO_PROTECT: 389 case _SC_THREAD_PROCESS_SHARED: 390 case _SC_THREAD_SAFE_FUNCTIONS: 391 if (__xpg6 & _C99SUSv3_mode_ON) 392 return (200112L); 393 else 394 return (1L); 395 396 case _SC_TIMEOUTS: 397 return ((long)_POSIX_TIMEOUTS); 398 399 /* 1216676 - cache info */ 400 case _SC_COHER_BLKSZ: 401 return (_sysconfig(_CONFIG_COHERENCY)); 402 403 case _SC_SPLIT_CACHE: 404 return (_sysconfig(_CONFIG_SPLIT_CACHE)); 405 406 case _SC_ICACHE_SZ: 407 return (_sysconfig(_CONFIG_ICACHESZ)); 408 409 case _SC_DCACHE_SZ: 410 return (_sysconfig(_CONFIG_DCACHESZ)); 411 412 case _SC_ICACHE_LINESZ: 413 return (_sysconfig(_CONFIG_ICACHELINESZ)); 414 415 case _SC_DCACHE_LINESZ: 416 return (_sysconfig(_CONFIG_DCACHELINESZ)); 417 418 case _SC_ICACHE_BLKSZ: 419 return (_sysconfig(_CONFIG_ICACHEBLKSZ)); 420 421 case _SC_DCACHE_BLKSZ: 422 return (_sysconfig(_CONFIG_DCACHEBLKSZ)); 423 424 case _SC_DCACHE_TBLKSZ: 425 return (_sysconfig(_CONFIG_DCACHETBLKSZ)); 426 427 case _SC_ICACHE_ASSOC: 428 return (_sysconfig(_CONFIG_ICACHE_ASSOC)); 429 430 case _SC_DCACHE_ASSOC: 431 return (_sysconfig(_CONFIG_DCACHE_ASSOC)); 432 433 case _SC_MAXPID: 434 if (_maxpid <= 0) 435 _maxpid = _sysconfig(_CONFIG_MAXPID); 436 return (_maxpid); 437 438 case _SC_CPUID_MAX: 439 return (_sysconfig(_CONFIG_CPUID_MAX)); 440 441 case _SC_EPHID_MAX: 442 return (_sysconfig(_CONFIG_EPHID_MAX)); 443 444 /* UNIX 03 names - XPG6/SUSv3/POSIX.1-2001 */ 445 446 case _SC_REGEXP: 447 return ((long)_POSIX_REGEXP); 448 449 case _SC_SHELL: 450 return ((long)_POSIX_SHELL); 451 452 case _SC_HOST_NAME_MAX: 453 return ((long)_POSIX_HOST_NAME_MAX); 454 455 case _SC_READER_WRITER_LOCKS: 456 return ((long)_POSIX_READER_WRITER_LOCKS); 457 458 case _SC_IPV6: 459 return ((long)_POSIX_IPV6); 460 461 case _SC_RAW_SOCKETS: 462 return ((long)_POSIX_RAW_SOCKETS); 463 464 case _SC_XOPEN_STREAMS: 465 return ((long)_XOPEN_STREAMS); 466 467 case _SC_SYMLOOP_MAX: 468 return (_sysconfig(_CONFIG_SYMLOOP_MAX)); 469 470 case _SC_V6_ILP32_OFF32: 471 return (1L); 472 473 case _SC_V6_ILP32_OFFBIG: 474 return (1L); 475 476 case _SC_V6_LP64_OFF64: 477 return (1L); 478 479 case _SC_V6_LPBIG_OFFBIG: 480 return (1L); 481 482 /* Unsupported UNIX 03 options */ 483 case _SC_2_PBS: 484 case _SC_2_PBS_ACCOUNTING: 485 case _SC_2_PBS_CHECKPOINT: 486 case _SC_2_PBS_LOCATE: 487 case _SC_2_PBS_MESSAGE: 488 case _SC_2_PBS_TRACK: 489 case _SC_ADVISORY_INFO: 490 case _SC_CPUTIME: 491 case _SC_SPORADIC_SERVER: 492 case _SC_SS_REPL_MAX: 493 case _SC_THREAD_CPUTIME: 494 case _SC_THREAD_SPORADIC_SERVER: 495 case _SC_TRACE: 496 case _SC_TRACE_EVENT_FILTER: 497 case _SC_TRACE_EVENT_NAME_MAX: 498 case _SC_TRACE_INHERIT: 499 case _SC_TRACE_LOG: 500 case _SC_TRACE_NAME_MAX: 501 case _SC_TRACE_SYS_MAX: 502 case _SC_TRACE_USER_EVENT_MAX: 503 case _SC_TYPED_MEMORY_OBJECTS: 504 return (-1L); 505 } 506 } 507 508 /* 509 * UNIX 98 version of sysconf needed in order to set _XOPEN_VERSION to 500. 510 */ 511 512 long 513 __sysconf_xpg5(int name) 514 { 515 switch (name) { 516 default: 517 return (sysconf(name)); 518 case _SC_XOPEN_VERSION: 519 return (500L); 520 case _SC_PASS_MAX: 521 return ((long)_PASS_MAX_XPG); 522 } 523 } 524