about summary refs log tree commit diff
path: root/sysdeps/posix/sysconf.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-11-26 08:16:33 +0000
committerUlrich Drepper <drepper@redhat.com>2004-11-26 08:16:33 +0000
commit28f367c4e3da4bd7515d11390514dbf2b751eda9 (patch)
tree9b7d054c4707f0528f80eaf7d46e26c84e9f0b67 /sysdeps/posix/sysconf.c
parent90692538658ce0c42abacb0c053c7e88bc5d649d (diff)
downloadglibc-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.c43
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;
+}