1 /*-
2 * Copyright (c) 1993
3 * The Regents of the University of California. 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 8.2 (Berkeley) 03/20/94";
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
sysconf(name)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_cur);
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_cur);
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