summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--posix/conf.list9
-rw-r--r--posix/confstr.c4
-rw-r--r--posix/getconf.c20
-rw-r--r--posix/posix-envs.def3
-rw-r--r--scripts/gen-conf.awk26
-rw-r--r--sysdeps/posix/sysconf.c1
6 files changed, 40 insertions, 23 deletions
diff --git a/posix/conf.list b/posix/conf.list
index 000b90893a..0a17666d8d 100644
--- a/posix/conf.list
+++ b/posix/conf.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
@@ -103,7 +104,7 @@ SYSCONF:POSIX {
RAW_SOCKETS
}
-SPEC:XBS5 {
+SPEC:XBS5:_SC_XBS5 {
ILP32_OFF32
ILP32_OFFBIG
LP64_OFF64
diff --git a/posix/confstr.c b/posix/confstr.c
index 1accfeead0..0400d7f247 100644
--- a/posix/confstr.c
+++ b/posix/confstr.c
@@ -21,7 +21,9 @@
#include <string.h>
#include <confstr.h>
#include "../version.h"
-#include "confdefs.h"
+
+#define NEED_SPEC_ARRAY 0
+#include <confdefs.h>
/* If BUF is not NULL and LEN > 0, fill in at most LEN - 1 bytes
of BUF with the value corresponding to NAME and zero-terminate BUF.
diff --git a/posix/getconf.c b/posix/getconf.c
index 14d51d87ac..3c086880a2 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 <confdefs.h>
+
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-envs.def b/posix/posix-envs.def
index 9047d0ce89..0b33e02884 100644
--- a/posix/posix-envs.def
+++ b/posix/posix-envs.def
@@ -42,7 +42,8 @@
defined. These are called with arguments V5, V6, V7 before and
after the relevant groups of environments. */
-#include "confdefs.h"
+#define NEED_SPEC_ARRAY 0
+#include <confdefs.h>
START_ENV_GROUP (V7)
diff --git a/scripts/gen-conf.awk b/scripts/gen-conf.awk
index 45a4d44333..1370646f58 100644
--- a/scripts/gen-conf.awk
+++ b/scripts/gen-conf.awk
@@ -17,12 +17,17 @@ $2 == "{" {
split ($1, arr, ":")
type = arr[1]
prefix = arr[2]
+ if (arr[3] != "")
+ sc_prefix = arr[3]
+ else
+ sc_prefix = "_SC"
next
}
$1 == "}" {
prefix = ""
type = ""
+ sc_prefix = ""
next
}
@@ -37,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
}
@@ -58,6 +64,26 @@ ENDFILE {
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 confdefs.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 c7b748b171..bff59f4d4d 100644
--- a/sysdeps/posix/sysconf.c
+++ b/sysdeps/posix/sysconf.c
@@ -31,6 +31,7 @@
#include <sys/types.h>
#include <regex.h>
+#define NEED_SPEC_ARRAY 0
#include <confdefs.h>