diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-11-26 08:16:33 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-11-26 08:16:33 +0000 |
commit | 28f367c4e3da4bd7515d11390514dbf2b751eda9 (patch) | |
tree | 9b7d054c4707f0528f80eaf7d46e26c84e9f0b67 /sysdeps/posix/sysconf.c | |
parent | 90692538658ce0c42abacb0c053c7e88bc5d649d (diff) | |
download | glibc-28f367c4e3da4bd7515d11390514dbf2b751eda9.tar.gz glibc-28f367c4e3da4bd7515d11390514dbf2b751eda9.tar.xz glibc-28f367c4e3da4bd7515d11390514dbf2b751eda9.zip |
Update.
* posix/Makefile (install-others): Add $(inst_libexecdir)/getconf. (CFLAGS-sysconf.c): Add -D_GETCONF_DIR. (CFLAGS-getconf.c): New. ($(inst_libexecdir)/getconf): New. * posix/confstr.c (confstr): Use __sysconf to query specifications that don't have _POSIX_V6_* macros defined. Use __*_{C,LD}FLAGS macros defined in bits/environments.h. * sysdeps/posix/sysconf.c: Include stdlib.h, string.h and sys/stat.h. (__sysconf_check_spec): New routine. (__sysconf): Use it. * posix/getconf.c (specs): Change into structure array. (main): If -v is not given, try to get default from $(libexecdir)/getconf/default. If specification is not supported by this getconf, try to execute $(libexecdir)/getconf/$(specification). * sysdeps/unix/bsd/bsd4.4/freebsd/bits/environments.h: New file. * sysdeps/unix/sysv/linux/s390/bits/environments.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/environments.h: New file. * sysdeps/unix/sysv/linux/sparc/bits/environments.h: New file. * sysdeps/unix/sysv/linux/i386/bits/environments.h: New file. * sysdeps/unix/sysv/linux/x86_64/bits/environments.h: New file. * sysdeps/generic/bits/environments.h (__ILP32_OFFBIG_CFLAGS): Define. 2004-11-26 Jakub Jelinek <jakub@redhat.com>
Diffstat (limited to 'sysdeps/posix/sysconf.c')
-rw-r--r-- | sysdeps/posix/sysconf.c | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/sysdeps/posix/sysconf.c b/sysdeps/posix/sysconf.c index d1286a06fe..de81c2120b 100644 --- a/sysdeps/posix/sysconf.c +++ b/sysdeps/posix/sysconf.c @@ -23,14 +23,20 @@ #include <pwd.h> #include <stddef.h> #include <stdio.h> +#include <stdlib.h> +#include <string.h> #include <time.h> #include <unistd.h> #include <sys/param.h> +#include <sys/stat.h> #include <sys/sysinfo.h> #include <sys/types.h> #include <regex.h> +static long int __sysconf_check_spec (const char *spec); + + /* Get the value of the system variable NAME. */ long int __sysconf (name) @@ -781,50 +787,50 @@ __sysconf (name) #ifdef _XBS5_ILP32_OFF32 return _XBS5_ILP32_OFF32; #else - return -1; + return __sysconf_check_spec ("ILP32_OFF32"); #endif case _SC_XBS5_ILP32_OFFBIG: #ifdef _XBS5_ILP32_OFFBIG return _XBS5_ILP32_OFFBIG; #else - return -1; + return __sysconf_check_spec ("ILP32_OFFBIG"); #endif case _SC_XBS5_LP64_OFF64: #ifdef _XBS5_LP64_OFF64 return _XBS5_LP64_OFF64; #else - return -1; + return __sysconf_check_spec ("LP64_OFF64"); #endif case _SC_XBS5_LPBIG_OFFBIG: #ifdef _XBS5_LPBIG_OFFBIG return _XBS5_LPBIG_OFFBIG; #else - return -1; + return __sysconf_check_spec ("LPBIG_OFFBIG"); #endif case _SC_V6_ILP32_OFF32: #ifdef _POSIX_V6_ILP32_OFF32 return _POSIX_V6_ILP32_OFF32; #else - return -1; + return __sysconf_check_spec ("ILP32_OFF32"); #endif case _SC_V6_ILP32_OFFBIG: #ifdef _POSIX_V6_ILP32_OFFBIG return _POSIX_V6_ILP32_OFFBIG; #else - return -1; + return __sysconf_check_spec ("ILP32_OFFBIG"); #endif case _SC_V6_LP64_OFF64: #ifdef _POSIX_V6_LP64_OFF64 return _POSIX_V6_LP64_OFF64; #else - return -1; + return __sysconf_check_spec ("LP64_OFF64"); #endif case _SC_V6_LPBIG_OFFBIG: #ifdef _POSIX_V6_LPBIG_OFFBIG return _POSIX_V6_LPBIG_OFFBIG; #else - return -1; + return __sysconf_check_spec ("LPBIG_OFFBIG"); #endif case _SC_XOPEN_LEGACY: @@ -1189,3 +1195,24 @@ __sysconf (name) #undef __sysconf weak_alias (__sysconf, sysconf) libc_hidden_def (__sysconf) + +static long int +__sysconf_check_spec (const char *spec) +{ + int save_errno = errno; + + const char *getconf_dir = __secure_getenv ("GETCONF_DIR") ?: GETCONF_DIR; + size_t getconf_dirlen = strlen (getconf_dir); + size_t speclen = strlen (spec); + + char name[getconf_dirlen + sizeof ("/_POSIX_V6_") + speclen]; + memcpy (mempcpy (mempcpy (name, getconf_dir, getconf_dirlen), + "/_POSIX_V6_", sizeof ("/_POSIX_V6_") - 1), + spec, speclen + 1); + + struct stat64 st; + long int ret = __xstat64 (_STAT_VER, name, &st) >= 0 ? 1 : -1; + + __set_errno (save_errno); + return ret; +} |