From 28f367c4e3da4bd7515d11390514dbf2b751eda9 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 26 Nov 2004 08:16:33 +0000 Subject: 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 --- sysdeps/posix/sysconf.c | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) (limited to 'sysdeps/posix') 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 #include #include +#include +#include #include #include #include +#include #include #include #include +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; +} -- cgit 1.4.1