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