1 /*- 2 * Copyright (c) 1993 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Sean Eric Fagan of Cygnus Support. 7 * 8 * %sccs.include.redist.c% 9 */ 10 11 #if defined(LIBC_SCCS) && !defined(lint) 12 static char sccsid[] = "@(#)sysconf.c 5.3 (Berkeley) 05/24/93"; 13 #endif /* LIBC_SCCS and not lint */ 14 15 #include <sys/param.h> 16 #include <sys/sysctl.h> 17 #include <sys/time.h> 18 #include <sys/resource.h> 19 20 #include <errno.h> 21 #include <unistd.h> 22 23 /* 24 * sysconf -- 25 * get configurable system variables. 26 * 27 * XXX 28 * POSIX 1003.1 (ISO/IEC 9945-1, 4.8.1.3) states that the variable values 29 * not change during the lifetime of the calling process. This would seem 30 * to require that any change to system limits kill all running processes. 31 * A workaround might be to cache the values when they are first retrieved 32 * and then simply return the cached value on subsequent calls. This is 33 * less useful than returning up-to-date values, however. 34 */ 35 long 36 sysconf(name) 37 int name; 38 { 39 struct clockinfo clk; 40 struct rlimit rl; 41 size_t len; 42 int mib[2], value; 43 44 len = sizeof(value); 45 46 switch (name) { 47 /* 1003.1 */ 48 case _SC_ARG_MAX: 49 mib[0] = CTL_KERN; 50 mib[1] = KERN_ARGMAX; 51 break; 52 case _SC_CHILD_MAX: 53 return (getrlimit(RLIMIT_NPROC, &rl) ? -1 : rl.rlim_max); 54 case _SC_CLK_TCK: 55 return (CLK_TCK); 56 case _SC_JOB_CONTROL: 57 mib[0] = CTL_KERN; 58 mib[1] = KERN_JOB_CONTROL; 59 goto yesno; 60 case _SC_NGROUPS_MAX: 61 mib[0] = CTL_KERN; 62 mib[1] = KERN_NGROUPS; 63 break; 64 case _SC_OPEN_MAX: 65 return (getrlimit(RLIMIT_NOFILE, &rl) ? -1 : rl.rlim_max); 66 case _SC_STREAM_MAX: 67 mib[0] = CTL_USER; 68 mib[1] = USER_STREAM_MAX; 69 break; 70 case _SC_TZNAME_MAX: 71 mib[0] = CTL_USER; 72 mib[1] = USER_TZNAME_MAX; 73 break; 74 case _SC_SAVED_IDS: 75 mib[0] = CTL_KERN; 76 mib[1] = KERN_SAVED_IDS; 77 goto yesno; 78 case _SC_VERSION: 79 mib[0] = CTL_KERN; 80 mib[1] = KERN_POSIX1; 81 break; 82 83 /* 1003.2 */ 84 case _SC_BC_BASE_MAX: 85 mib[0] = CTL_USER; 86 mib[1] = USER_BC_BASE_MAX; 87 break; 88 case _SC_BC_DIM_MAX: 89 mib[0] = CTL_USER; 90 mib[1] = USER_BC_DIM_MAX; 91 break; 92 case _SC_BC_SCALE_MAX: 93 mib[0] = CTL_USER; 94 mib[1] = USER_BC_SCALE_MAX; 95 break; 96 case _SC_BC_STRING_MAX: 97 mib[0] = CTL_USER; 98 mib[1] = USER_BC_STRING_MAX; 99 break; 100 case _SC_COLL_WEIGHTS_MAX: 101 mib[0] = CTL_USER; 102 mib[1] = USER_COLL_WEIGHTS_MAX; 103 break; 104 case _SC_EXPR_NEST_MAX: 105 mib[0] = CTL_USER; 106 mib[1] = USER_EXPR_NEST_MAX; 107 break; 108 case _SC_LINE_MAX: 109 mib[0] = CTL_USER; 110 mib[1] = USER_LINE_MAX; 111 break; 112 case _SC_RE_DUP_MAX: 113 mib[0] = CTL_USER; 114 mib[1] = USER_RE_DUP_MAX; 115 break; 116 case _SC_2_VERSION: 117 mib[0] = CTL_USER; 118 mib[1] = USER_POSIX2_VERSION; 119 break; 120 case _SC_2_C_BIND: 121 mib[0] = CTL_USER; 122 mib[1] = USER_POSIX2_C_BIND; 123 goto yesno; 124 case _SC_2_C_DEV: 125 mib[0] = CTL_USER; 126 mib[1] = USER_POSIX2_C_DEV; 127 goto yesno; 128 case _SC_2_CHAR_TERM: 129 mib[0] = CTL_USER; 130 mib[1] = USER_POSIX2_CHAR_TERM; 131 goto yesno; 132 case _SC_2_FORT_DEV: 133 mib[0] = CTL_USER; 134 mib[1] = USER_POSIX2_FORT_DEV; 135 goto yesno; 136 case _SC_2_FORT_RUN: 137 mib[0] = CTL_USER; 138 mib[1] = USER_POSIX2_FORT_RUN; 139 goto yesno; 140 case _SC_2_LOCALEDEF: 141 mib[0] = CTL_USER; 142 mib[1] = USER_POSIX2_LOCALEDEF; 143 goto yesno; 144 case _SC_2_SW_DEV: 145 mib[0] = CTL_USER; 146 mib[1] = USER_POSIX2_SW_DEV; 147 goto yesno; 148 case _SC_2_UPE: 149 mib[0] = CTL_USER; 150 mib[1] = USER_POSIX2_UPE; 151 yesno: if (sysctl(mib, 2, &value, &len, NULL, 0) == -1) 152 return (-1); 153 if (value == 0) 154 return (-1); 155 return (value); 156 break; 157 default: 158 errno = EINVAL; 159 return (-1); 160 } 161 return (sysctl(mib, 2, &value, &len, NULL, 0) == -1 ? -1 : value); 162 } 163