Fix a typo in ChangeLog
[glibc.git] / posix / confstr.c
blobcad65615ad0bec9262f5832c9b1ac13ff88f2bbb
1 /* Copyright (C) 1991-2012 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <http://www.gnu.org/licenses/>. */
18 #include <stddef.h>
19 #include <errno.h>
20 #include <unistd.h>
21 #include <string.h>
22 #include <confstr.h>
23 #include "../version.h"
25 /* If BUF is not NULL and LEN > 0, fill in at most LEN - 1 bytes
26 of BUF with the value corresponding to NAME and zero-terminate BUF.
27 Return the number of bytes required to hold NAME's entire value. */
28 size_t
29 confstr (name, buf, len)
30 int name;
31 char *buf;
32 size_t len;
34 const char *string = "";
35 size_t string_len = 1;
37 /* Note that this buffer must be large enough for the longest strings
38 used below. */
39 char restenvs[4 * sizeof "POSIX_V7_LPBIG_OFFBIG"];
41 switch (name)
43 case _CS_PATH:
45 static const char cs_path[] = CS_PATH;
46 string = cs_path;
47 string_len = sizeof (cs_path);
49 break;
51 case _CS_V7_WIDTH_RESTRICTED_ENVS:
52 /* We have to return a newline-separated list of named of
53 programming environements in which the widths of blksize_t,
54 cc_t, mode_t, nfds_t, pid_t, ptrdiff_t, size_t, speed_t,
55 ssize_t, suseconds_t, tcflag_t, useconds_t, wchar_t, and
56 wint_t types are no greater than the width of type long.
58 Currently this means all environment which the system allows. */
59 string_len = 0;
60 #ifndef _POSIX_V7_ILP32_OFF32
61 if (__sysconf (_SC_V7_ILP32_OFF32) > 0)
62 #endif
63 #if !defined _POSIX_V7_ILP32_OFF32 || _POSIX_V7_ILP32_OFF32 > 0
65 memcpy (restenvs + string_len, "POSIX_V7_ILP32_OFF32",
66 sizeof "POSIX_V7_ILP32_OFF32" - 1);
67 string_len += sizeof "POSIX_V7_ILP32_OFF32" - 1;
69 #endif
70 #ifndef _POSIX_V7_ILP32_OFFBIG
71 if (__sysconf (_SC_V7_ILP32_OFFBIG) > 0)
72 #endif
73 #if !defined _POSIX_V7_ILP32_OFFBIG || _POSIX_V7_ILP32_OFFBIG > 0
75 if (string_len)
76 restenvs[string_len++] = '\n';
77 memcpy (restenvs + string_len, "POSIX_V7_ILP32_OFFBIG",
78 sizeof "POSIX_V7_ILP32_OFFBIG" - 1);
79 string_len += sizeof "POSIX_V7_ILP32_OFFBIG" - 1;
81 #endif
82 #ifndef _POSIX_V7_LP64_OFF64
83 if (__sysconf (_SC_V7_LP64_OFF64) > 0)
84 #endif
85 #if !defined _POSIX_V7_LP64_OFF64 || _POSIX_V7_LP64_OFF64 > 0
87 if (string_len)
88 restenvs[string_len++] = '\n';
89 memcpy (restenvs + string_len, "POSIX_V7_LP64_OFF64",
90 sizeof "POSIX_V7_LP64_OFF64" - 1);
91 string_len += sizeof "POSIX_V7_LP64_OFF64" - 1;
93 #endif
94 #ifndef _POSIX_V7_LPBIG_OFFBIG
95 if (__sysconf (_SC_V7_LPBIG_OFFBIG) > 0)
96 #endif
97 #if !defined _POSIX_V7_LPBIG_OFFBIG || _POSIX_V7_LPBIG_OFFBIG > 0
99 if (string_len)
100 restenvs[string_len++] = '\n';
101 memcpy (restenvs + string_len, "POSIX_V7_LPBIG_OFFBIG",
102 sizeof "POSIX_V7_LPBIG_OFFBIG" - 1);
103 string_len += sizeof "POSIX_V7_LPBIG_OFFBIG" - 1;
105 #endif
106 restenvs[string_len++] = '\0';
107 string = restenvs;
108 break;
110 case _CS_V6_WIDTH_RESTRICTED_ENVS:
111 /* We have to return a newline-separated list of named of
112 programming environements in which the widths of blksize_t,
113 cc_t, mode_t, nfds_t, pid_t, ptrdiff_t, size_t, speed_t,
114 ssize_t, suseconds_t, tcflag_t, useconds_t, wchar_t, and
115 wint_t types are no greater than the width of type long.
117 Currently this means all environment which the system allows. */
118 string_len = 0;
119 #ifndef _POSIX_V6_ILP32_OFF32
120 if (__sysconf (_SC_V6_ILP32_OFF32) > 0)
121 #endif
122 #if !defined _POSIX_V6_ILP32_OFF32 || _POSIX_V6_ILP32_OFF32 > 0
124 memcpy (restenvs + string_len, "POSIX_V6_ILP32_OFF32",
125 sizeof "POSIX_V6_ILP32_OFF32" - 1);
126 string_len += sizeof "POSIX_V6_ILP32_OFF32" - 1;
128 #endif
129 #ifndef _POSIX_V6_ILP32_OFFBIG
130 if (__sysconf (_SC_V6_ILP32_OFFBIG) > 0)
131 #endif
132 #if !defined _POSIX_V6_ILP32_OFFBIG || _POSIX_V6_ILP32_OFFBIG > 0
134 if (string_len)
135 restenvs[string_len++] = '\n';
136 memcpy (restenvs + string_len, "POSIX_V6_ILP32_OFFBIG",
137 sizeof "POSIX_V6_ILP32_OFFBIG" - 1);
138 string_len += sizeof "POSIX_V6_ILP32_OFFBIG" - 1;
140 #endif
141 #ifndef _POSIX_V6_LP64_OFF64
142 if (__sysconf (_SC_V6_LP64_OFF64) > 0)
143 #endif
144 #if !defined _POSIX_V6_LP64_OFF64 || _POSIX_V6_LP64_OFF64 > 0
146 if (string_len)
147 restenvs[string_len++] = '\n';
148 memcpy (restenvs + string_len, "POSIX_V6_LP64_OFF64",
149 sizeof "POSIX_V6_LP64_OFF64" - 1);
150 string_len += sizeof "POSIX_V6_LP64_OFF64" - 1;
152 #endif
153 #ifndef _POSIX_V6_LPBIG_OFFBIG
154 if (__sysconf (_SC_V6_LPBIG_OFFBIG) > 0)
155 #endif
156 #if !defined _POSIX_V6_LPBIG_OFFBIG || _POSIX_V6_LPBIG_OFFBIG > 0
158 if (string_len)
159 restenvs[string_len++] = '\n';
160 memcpy (restenvs + string_len, "POSIX_V6_LPBIG_OFFBIG",
161 sizeof "POSIX_V6_LPBIG_OFFBIG" - 1);
162 string_len += sizeof "POSIX_V6_LPBIG_OFFBIG" - 1;
164 #endif
165 restenvs[string_len++] = '\0';
166 string = restenvs;
167 break;
169 case _CS_V5_WIDTH_RESTRICTED_ENVS:
170 /* We have to return a newline-separated list of named of
171 programming environements in which the widths of blksize_t,
172 cc_t, mode_t, nfds_t, pid_t, ptrdiff_t, size_t, speed_t,
173 ssize_t, suseconds_t, tcflag_t, useconds_t, wchar_t, and
174 wint_t types are no greater than the width of type long.
176 Currently this means all environment which the system allows. */
177 string_len = 0;
178 #ifndef _XBS5_ILP32_OFF32
179 if (__sysconf (_SC_XBS5_ILP32_OFF32) > 0)
180 #endif
181 #if !defined _XBS5_ILP32_OFF32 || _XBS5_ILP32_OFF32 > 0
183 memcpy (restenvs + string_len, "XBS5_ILP32_OFF32",
184 sizeof "XBS5_ILP32_OFF32" - 1);
185 string_len += sizeof "XBS5_ILP32_OFF32" - 1;
187 #endif
188 #ifndef _XBS5_ILP32_OFFBIG
189 if (__sysconf (_SC_XBS5_ILP32_OFFBIG) > 0)
190 #endif
191 #if !defined _XBS5_ILP32_OFFBIG || _XBS5_ILP32_OFFBIG > 0
193 if (string_len)
194 restenvs[string_len++] = '\n';
195 memcpy (restenvs + string_len, "XBS5_ILP32_OFFBIG",
196 sizeof "XBS5_ILP32_OFFBIG" - 1);
197 string_len += sizeof "XBS5_ILP32_OFFBIG" - 1;
199 #endif
200 #ifndef _XBS5_LP64_OFF64
201 if (__sysconf (_SC_XBS5_LP64_OFF64) > 0)
202 #endif
203 #if !defined _XBS5_LP64_OFF64 || _XBS5_LP64_OFF64 > 0
205 if (string_len)
206 restenvs[string_len++] = '\n';
207 memcpy (restenvs + string_len, "XBS5_LP64_OFF64",
208 sizeof "XBS5_LP64_OFF64" - 1);
209 string_len += sizeof "XBS5_LP64_OFF64" - 1;
211 #endif
212 #ifndef _XBS5_LPBIG_OFFBIG
213 if (__sysconf (_SC_XBS5_LPBIG_OFFBIG) > 0)
214 #endif
215 #if !defined _XBS5_LPBIG_OFFBIG || _XBS5_LPBIG_OFFBIG > 0
217 if (string_len)
218 restenvs[string_len++] = '\n';
219 memcpy (restenvs + string_len, "XBS5_LPBIG_OFFBIG",
220 sizeof "XBS5_LPBIG_OFFBIG" - 1);
221 string_len += sizeof "XBS5_LPBIG_OFFBIG" - 1;
223 #endif
224 restenvs[string_len++] = '\0';
225 string = restenvs;
226 break;
228 case _CS_XBS5_ILP32_OFF32_CFLAGS:
229 case _CS_POSIX_V6_ILP32_OFF32_CFLAGS:
230 case _CS_POSIX_V7_ILP32_OFF32_CFLAGS:
231 #ifdef __ILP32_OFF32_CFLAGS
232 # if _POSIX_V7_ILP32_OFF32 == -1
233 # error "__ILP32_OFF32_CFLAGS should not be defined"
234 # elif !defined _POSIX_V7_ILP32_OFF32
235 if (__sysconf (_SC_V7_ILP32_OFF32) < 0)
236 break;
237 # endif
238 string = __ILP32_OFF32_CFLAGS;
239 string_len = sizeof (__ILP32_OFF32_CFLAGS);
240 #endif
241 break;
243 case _CS_XBS5_ILP32_OFFBIG_CFLAGS:
244 case _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS:
245 case _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS:
246 #ifdef __ILP32_OFFBIG_CFLAGS
247 # if _POSIX_V7_ILP32_OFFBIG == -1
248 # error "__ILP32_OFFBIG_CFLAGS should not be defined"
249 # elif !defined _POSIX_V7_ILP32_OFFBIG
250 if (__sysconf (_SC_V7_ILP32_OFFBIG) < 0)
251 break;
252 # endif
253 string = __ILP32_OFFBIG_CFLAGS;
254 string_len = sizeof (__ILP32_OFFBIG_CFLAGS);
255 #endif
256 break;
258 case _CS_XBS5_LP64_OFF64_CFLAGS:
259 case _CS_POSIX_V6_LP64_OFF64_CFLAGS:
260 case _CS_POSIX_V7_LP64_OFF64_CFLAGS:
261 #ifdef __LP64_OFF64_CFLAGS
262 # if _POSIX_V7_LP64_OFF64 == -1
263 # error "__LP64_OFF64_CFLAGS should not be defined"
264 # elif !defined _POSIX_V7_LP64_OFF64
265 if (__sysconf (_SC_V7_LP64_OFF64) < 0)
266 break;
267 # endif
268 string = __LP64_OFF64_CFLAGS;
269 string_len = sizeof (__LP64_OFF64_CFLAGS);
270 #endif
271 break;
273 case _CS_XBS5_ILP32_OFF32_LDFLAGS:
274 case _CS_POSIX_V6_ILP32_OFF32_LDFLAGS:
275 case _CS_POSIX_V7_ILP32_OFF32_LDFLAGS:
276 #ifdef __ILP32_OFF32_LDFLAGS
277 # if _POSIX_V7_ILP32_OFF32 == -1
278 # error "__ILP32_OFF32_LDFLAGS should not be defined"
279 # elif !defined _POSIX_V7_ILP32_OFF32
280 if (__sysconf (_SC_V7_ILP32_OFF32) < 0)
281 break;
282 # endif
283 string = __ILP32_OFF32_LDFLAGS;
284 string_len = sizeof (__ILP32_OFF32_LDFLAGS);
285 #endif
286 break;
288 case _CS_XBS5_ILP32_OFFBIG_LDFLAGS:
289 case _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS:
290 case _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS:
291 #ifdef __ILP32_OFFBIG_LDFLAGS
292 # if _POSIX_V7_ILP32_OFFBIG == -1
293 # error "__ILP32_OFFBIG_LDFLAGS should not be defined"
294 # elif !defined _POSIX_V7_ILP32_OFFBIG
295 if (__sysconf (_SC_V7_ILP32_OFFBIG) < 0)
296 break;
297 # endif
298 string = __ILP32_OFFBIG_LDFLAGS;
299 string_len = sizeof (__ILP32_OFFBIG_LDFLAGS);
300 #endif
301 break;
303 case _CS_XBS5_LP64_OFF64_LDFLAGS:
304 case _CS_POSIX_V6_LP64_OFF64_LDFLAGS:
305 case _CS_POSIX_V7_LP64_OFF64_LDFLAGS:
306 #ifdef __LP64_OFF64_LDFLAGS
307 # if _POSIX_V7_LP64_OFF64 == -1
308 # error "__LP64_OFF64_LDFLAGS should not be defined"
309 # elif !defined _POSIX_V7_LP64_OFF64
310 if (__sysconf (_SC_V7_LP64_OFF64) < 0)
311 break;
312 # endif
313 string = __LP64_OFF64_LDFLAGS;
314 string_len = sizeof (__LP64_OFF64_LDFLAGS);
315 #endif
316 break;
318 case _CS_LFS_CFLAGS:
319 case _CS_LFS_LINTFLAGS:
320 #if _POSIX_V6_ILP32_OFF32 == 1 && _POSIX_V6_ILP32_OFFBIG == 1
321 # define __LFS_CFLAGS "-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
322 /* Signal that we want the new ABI. */
323 string = __LFS_CFLAGS;
324 string_len = sizeof (__LFS_CFLAGS);
325 #endif
326 break;
328 case _CS_LFS_LDFLAGS:
329 case _CS_LFS_LIBS:
330 /* No special libraries or linker flags needed. */
331 break;
333 case _CS_LFS64_CFLAGS:
334 case _CS_LFS64_LINTFLAGS:
335 #define __LFS64_CFLAGS "-D_LARGEFILE64_SOURCE"
336 string = __LFS64_CFLAGS;
337 string_len = sizeof (__LFS64_CFLAGS);
338 break;
340 case _CS_LFS64_LDFLAGS:
341 case _CS_LFS64_LIBS:
342 /* No special libraries or linker flags needed. */
343 break;
345 case _CS_XBS5_ILP32_OFF32_LIBS:
346 case _CS_XBS5_ILP32_OFF32_LINTFLAGS:
347 case _CS_XBS5_ILP32_OFFBIG_LIBS:
348 case _CS_XBS5_ILP32_OFFBIG_LINTFLAGS:
349 case _CS_XBS5_LP64_OFF64_LIBS:
350 case _CS_XBS5_LP64_OFF64_LINTFLAGS:
351 case _CS_XBS5_LPBIG_OFFBIG_CFLAGS:
352 case _CS_XBS5_LPBIG_OFFBIG_LDFLAGS:
353 case _CS_XBS5_LPBIG_OFFBIG_LIBS:
354 case _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS:
356 case _CS_POSIX_V6_ILP32_OFF32_LIBS:
357 case _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS:
358 case _CS_POSIX_V6_ILP32_OFFBIG_LIBS:
359 case _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS:
360 case _CS_POSIX_V6_LP64_OFF64_LIBS:
361 case _CS_POSIX_V6_LP64_OFF64_LINTFLAGS:
362 case _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS:
363 case _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS:
364 case _CS_POSIX_V6_LPBIG_OFFBIG_LIBS:
365 case _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS:
367 case _CS_POSIX_V7_ILP32_OFF32_LIBS:
368 case _CS_POSIX_V7_ILP32_OFF32_LINTFLAGS:
369 case _CS_POSIX_V7_ILP32_OFFBIG_LIBS:
370 case _CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS:
371 case _CS_POSIX_V7_LP64_OFF64_LIBS:
372 case _CS_POSIX_V7_LP64_OFF64_LINTFLAGS:
373 case _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS:
374 case _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS:
375 case _CS_POSIX_V7_LPBIG_OFFBIG_LIBS:
376 case _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS:
377 /* GNU libc does not require special actions to use LFS functions. */
378 break;
380 case _CS_GNU_LIBC_VERSION:
381 string = "glibc " VERSION;
382 string_len = sizeof ("glibc " VERSION);
383 break;
385 case _CS_GNU_LIBPTHREAD_VERSION:
386 #ifdef LIBPTHREAD_VERSION
387 string = LIBPTHREAD_VERSION;
388 string_len = sizeof LIBPTHREAD_VERSION;
389 break;
390 #else
391 /* No thread library. */
392 __set_errno (EINVAL);
393 return 0;
394 #endif
396 case _CS_V6_ENV:
397 case _CS_V7_ENV:
398 /* Maybe something else is needed in future. */
399 string = "POSIXLY_CORRECT=1";
400 string_len = sizeof ("POSIXLY_CORRECT=1");
401 break;
403 default:
404 __set_errno (EINVAL);
405 return 0;
408 if (len > 0 && buf != NULL)
410 if (string_len <= len)
411 memcpy (buf, string, string_len);
412 else
414 memcpy (buf, string, len - 1);
415 buf[len - 1] = '\0';
418 return string_len;
420 libc_hidden_def (confstr)