diff --git a/ChangeLog b/ChangeLog index 94000ad7be..ff4b532bfa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2014-12-29 Siddhesh Poyarekar + * posix/posix-conf-vars.list (SPEC:XBS5): Add sysconf prefix. + * posix/confstr.c: Define NEED_SPEC_ARRAY to 0. + * posix/posix-envs.def: Likewise. + * sysdeps/posix/sysconf.c: Likewise. + * posix/getconf.c: Define NEED_SPEC_ARRAY to 1. + (specs): Remove array. + * scripts/gen-posix-conf-vars.awk: Support generation of specs + array. + * posix/posix-conf-vars.list: Add _POSIX sysconf namespace. * sysdeps/posix/sysconf.c: Include posix-conf-vars.h. (__sysconf): Use CONF_IS_* macros. diff --git a/posix/confstr.c b/posix/confstr.c index e4e0f4bdec..244a25c93f 100644 --- a/posix/confstr.c +++ b/posix/confstr.c @@ -21,6 +21,8 @@ #include #include #include "../version.h" + +#define NEED_SPEC_ARRAY 0 #include /* If BUF is not NULL and LEN > 0, fill in at most LEN - 1 bytes diff --git a/posix/getconf.c b/posix/getconf.c index 14d51d87ac..bcde4c58a1 100644 --- a/posix/getconf.c +++ b/posix/getconf.c @@ -26,6 +26,9 @@ #include "../version.h" #define PACKAGE _libc_intl_domainname +#define NEED_SPEC_ARRAY 1 +#include + struct conf { const char *name; @@ -387,23 +390,6 @@ static const struct conf vars[] = }; -static const struct { const char *name; int num; } specs[] = - { - { "XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32 }, - { "XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG }, - { "XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64 }, - { "XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG }, - { "POSIX_V6_ILP32_OFF32", _SC_V6_ILP32_OFF32 }, - { "POSIX_V6_ILP32_OFFBIG", _SC_V6_ILP32_OFFBIG }, - { "POSIX_V6_LP64_OFF64", _SC_V6_LP64_OFF64 }, - { "POSIX_V6_LPBIG_OFFBIG", _SC_V6_LPBIG_OFFBIG }, - { "POSIX_V7_ILP32_OFF32", _SC_V7_ILP32_OFF32 }, - { "POSIX_V7_ILP32_OFFBIG", _SC_V7_ILP32_OFFBIG }, - { "POSIX_V7_LP64_OFF64", _SC_V7_LP64_OFF64 }, - { "POSIX_V7_LPBIG_OFFBIG", _SC_V7_LPBIG_OFFBIG }, - }; -static const int nspecs = sizeof (specs) / sizeof (specs[0]); - extern const char *__progname; diff --git a/posix/posix-conf-vars.list b/posix/posix-conf-vars.list index 3e7e7cdaa9..601bc2fd33 100644 --- a/posix/posix-conf-vars.list +++ b/posix/posix-conf-vars.list @@ -1,7 +1,8 @@ # Configuration variables identified by getconf. The heading of each section -# is of the format TYPE PREFIX with the opening curly brace on the same line. -# TYPE can either be SYSCONF, PATHCONF, CONFSTR or SPEC. Variable names are -# put one on each line with a curly brace on its own line ending the section. +# is of the format TYPE PREFIX SC_PREFIX with the opening curly brace on the +# same line. TYPE can either be SYSCONF, PATHCONF, CONFSTR or SPEC. In the +# absence of SC_PREFIX, _SC is used as the SC_PREFIX. Variable names are put +# one on each line with a curly brace on its own line ending the section. SPEC POSIX { V6_ILP32_OFF32 @@ -104,7 +105,7 @@ SYSCONF POSIX { RAW_SOCKETS } -SPEC XBS5 { +SPEC XBS5 _SC_XBS5 { ILP32_OFF32 ILP32_OFFBIG LP64_OFF64 diff --git a/posix/posix-envs.def b/posix/posix-envs.def index 870d85a7db..fa271bbfc4 100644 --- a/posix/posix-envs.def +++ b/posix/posix-envs.def @@ -42,6 +42,7 @@ defined. These are called with arguments V5, V6, V7 before and after the relevant groups of environments. */ +#define NEED_SPEC_ARRAY 0 #include START_ENV_GROUP (V7) diff --git a/scripts/gen-posix-conf-vars.awk b/scripts/gen-posix-conf-vars.awk index 16e20fc100..0eca55d536 100644 --- a/scripts/gen-posix-conf-vars.awk +++ b/scripts/gen-posix-conf-vars.awk @@ -15,12 +15,19 @@ $1 ~ /^#/ || $0 ~ /^\s*$/ { $NF == "{" { type = $1 prefix = $2 + + if (NF == 4) + sc_prefix = $3 + else + sc_prefix = "_SC" + next } $1 == "}" { prefix = "" type = "" + sc_prefix = "" next } @@ -35,6 +42,7 @@ $1 == "}" { # CONFSTR: A configuration string # SYSCONF: A numeric value # SPEC: A specification + sc_prefixes[prefix][$1] = sc_prefix conf[prefix][$1] = type } @@ -56,6 +64,26 @@ END { printf "# endif\n" } printf "#endif\n\n" + + # Build a name -> sysconf number associative array to print a C array at + # the end. + if (conf[p][c] == "SPEC") { + name = sprintf ("%s_%s", p, c) + num = sprintf ("%s_%s", sc_prefixes[p][c], c) + spec[name] = num + } } } + + # Print the specification array. Define the macro NEED_SPEC_ARRAY before + # including posix-conf-vars.h to make it available in the compilation unit. + print "#if NEED_SPEC_ARRAY" + print "static const struct { const char *name; int num; } specs[] =" + print " {" + for (s in spec) { + printf " { \"%s\", %s },\n", s, spec[s] + } + print " };" + print "static const int nspecs = sizeof (specs) / sizeof (specs[0]);" + print "#endif" } diff --git a/sysdeps/posix/sysconf.c b/sysdeps/posix/sysconf.c index 968c5cb367..0ea5382ba0 100644 --- a/sysdeps/posix/sysconf.c +++ b/sysdeps/posix/sysconf.c @@ -31,9 +31,9 @@ #include #include +#define NEED_SPEC_ARRAY 0 #include - #define NEED_CHECK_SPEC \ (!defined _XBS5_ILP32_OFF32 || !defined _XBS5_ILP32_OFFBIG \ || !defined _XBS5_LP64_OFF64 || !defined _XBS5_LPBIG_OFFBIG \