From c75712b15a5e0655c15707e1e1340da9d5e2646a Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 5 Apr 2010 01:31:27 +0200 Subject: getutid is not used internally, removing hidden_proto Signed-off-by: Denys Vlasenko --- include/utmp.h | 1 - libc/misc/utmp/utent.c | 7 +++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/include/utmp.h b/include/utmp.h index 182f45e1c..27454a66a 100644 --- a/include/utmp.h +++ b/include/utmp.h @@ -74,7 +74,6 @@ extern void endutent (void) __THROW; /* Search forward from the current point in the utmp file until the next entry with a ut_type matching ID->ut_type. */ extern struct utmp *getutid (__const struct utmp *__id) __THROW; -libc_hidden_proto(getutid) /* Search forward from the current point in the utmp file until the next entry with a ut_line matching LINE->ut_line. */ diff --git a/libc/misc/utmp/utent.c b/libc/misc/utmp/utent.c index 336c0239b..254040fed 100644 --- a/libc/misc/utmp/utent.c +++ b/libc/misc/utmp/utent.c @@ -88,7 +88,7 @@ void endutent(void) struct utmp *getutent(void) { - struct utmp *ret = NULL; + struct utmp *ret; __UCLIBC_MUTEX_LOCK(utmplock); ret = __getutent(); @@ -125,18 +125,17 @@ static struct utmp *__getutid(const struct utmp *utmp_entry) struct utmp *getutid(const struct utmp *utmp_entry) { - struct utmp *ret = NULL; + struct utmp *ret; __UCLIBC_MUTEX_LOCK(utmplock); ret = __getutid(utmp_entry); __UCLIBC_MUTEX_UNLOCK(utmplock); return ret; } -libc_hidden_def(getutid) struct utmp *getutline(const struct utmp *utmp_entry) { - struct utmp *lutmp = NULL; + struct utmp *lutmp; __UCLIBC_MUTEX_LOCK(utmplock); while ((lutmp = __getutent()) != NULL) { -- cgit v1.2.3 From 10f19b4565a82a9fb2ebb7bf938154afb4e09ad6 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 5 Apr 2010 01:32:19 +0200 Subject: regex_old: convert static flag variable to smallint Signed-off-by: Denys Vlasenko --- libc/misc/fnmatch/fnmatch.c | 8 +------- libc/misc/regex/regex_old.c | 6 +++--- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/libc/misc/fnmatch/fnmatch.c b/libc/misc/fnmatch/fnmatch.c index d25619b34..0fa043bad 100644 --- a/libc/misc/fnmatch/fnmatch.c +++ b/libc/misc/fnmatch/fnmatch.c @@ -21,13 +21,7 @@ # include #endif -/* include unistd.h before we undefine _LIBC - * because smallint is defined in unistd.h based - * on _LIBC. For architectures that dont define - * smallint of there own and rely upon the definition - * from unistd.h will not build this file otherwise - */ - +/* unistd.h must be included with _LIBC defined: we need smallint */ #include #include #ifdef __UCLIBC__ diff --git a/libc/misc/regex/regex_old.c b/libc/misc/regex/regex_old.c index bc2ad6cb8..a3c30b51a 100644 --- a/libc/misc/regex/regex_old.c +++ b/libc/misc/regex/regex_old.c @@ -23,7 +23,8 @@ /* To exclude some unwanted junk.... */ #undef emacs #include - +/* unistd.h must be included with _LIBC defined: we need smallint */ +#include #ifdef __UCLIBC__ # undef _LIBC # define _REGEX_RE_COMP @@ -33,7 +34,6 @@ #include #include #include -#include #include /* AIX requires this to be the first thing in the file. */ @@ -263,7 +263,7 @@ static void init_syntax_once (void) { register int c; - static int done = 0; + static smallint done = 0; if (done) return; -- cgit v1.2.3 From 56f80b6cb62323fbaf0fc8620d10fc242e136ee6 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 5 Apr 2010 19:25:54 +0200 Subject: utent: do not create extra static functions if !THREADS text data bss dec hex filename 547 8 384 939 3ab libc/misc/utmp/utent.o 519 8 384 911 38f libc/misc/utmp/utent.o Signed-off-by: Denys Vlasenko --- libc/misc/utmp/utent.c | 86 ++++++++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 37 deletions(-) diff --git a/libc/misc/utmp/utent.c b/libc/misc/utmp/utent.c index 254040fed..c83f45e73 100644 --- a/libc/misc/utmp/utent.c +++ b/libc/misc/utmp/utent.c @@ -24,14 +24,26 @@ __UCLIBC_MUTEX_STATIC(utmplock, PTHREAD_MUTEX_INITIALIZER); +/* Do not create extra unlocked functions if no locking is needed */ +#if defined __UCLIBC_HAS_THREADS__ +# define static_if_threaded static +#else +# define static_if_threaded /* nothing */ +# define __setutent setutent +# define __getutent getutent +# define __getutid getutid +#endif + + /* Some global crap */ static int static_fd = -1; static struct utmp static_utmp; static const char default_file_name[] = _PATH_UTMP; static const char *static_ut_name = default_file_name; + /* This function must be called with the LOCK held */ -static void __setutent(void) +static_if_threaded void __setutent(void) { if (static_fd < 0) { static_fd = open(static_ut_name, O_RDWR | O_CLOEXEC); @@ -49,20 +61,19 @@ static void __setutent(void) } lseek(static_fd, 0, SEEK_SET); } - +#if defined __UCLIBC_HAS_THREADS__ void setutent(void) { __UCLIBC_MUTEX_LOCK(utmplock); __setutent(); __UCLIBC_MUTEX_UNLOCK(utmplock); } +#endif libc_hidden_def(setutent) /* This function must be called with the LOCK held */ -static struct utmp *__getutent(void) +static_if_threaded struct utmp *__getutent(void) { - struct utmp *ret = NULL; - if (static_fd < 0) { __setutent(); if (static_fd < 0) { @@ -71,11 +82,22 @@ static struct utmp *__getutent(void) } if (read(static_fd, &static_utmp, sizeof(static_utmp)) == sizeof(static_utmp)) { - ret = &static_utmp; + return &static_utmp; } + return NULL; +} +#if defined __UCLIBC_HAS_THREADS__ +struct utmp *getutent(void) +{ + struct utmp *ret; + + __UCLIBC_MUTEX_LOCK(utmplock); + ret = __getutent(); + __UCLIBC_MUTEX_UNLOCK(utmplock); return ret; } +#endif void endutent(void) { @@ -86,43 +108,31 @@ void endutent(void) __UCLIBC_MUTEX_UNLOCK(utmplock); } -struct utmp *getutent(void) -{ - struct utmp *ret; - - __UCLIBC_MUTEX_LOCK(utmplock); - ret = __getutent(); - __UCLIBC_MUTEX_UNLOCK(utmplock); - return ret; -} - /* This function must be called with the LOCK held */ -static struct utmp *__getutid(const struct utmp *utmp_entry) +static_if_threaded struct utmp *__getutid(const struct utmp *utmp_entry) { struct utmp *lutmp; + unsigned type; + + /* We use the fact that constants we are interested in are: */ + /* RUN_LVL=1, ... OLD_TIME=4; INIT_PROCESS=5, ... USER_PROCESS=8 */ + type = utmp_entry->ut_type - 1; + type /= 4; while ((lutmp = __getutent()) != NULL) { - if ( (utmp_entry->ut_type == RUN_LVL || - utmp_entry->ut_type == BOOT_TIME || - utmp_entry->ut_type == NEW_TIME || - utmp_entry->ut_type == OLD_TIME) && - lutmp->ut_type == utmp_entry->ut_type) - { - return lutmp; - } - if ( (utmp_entry->ut_type == INIT_PROCESS || - utmp_entry->ut_type == DEAD_PROCESS || - utmp_entry->ut_type == LOGIN_PROCESS || - utmp_entry->ut_type == USER_PROCESS) && - !strncmp(lutmp->ut_id, utmp_entry->ut_id, sizeof(lutmp->ut_id))) - { - return lutmp; - } + if (type == 0 && lutmp->ut_type == utmp_entry->ut_type) { + /* one of RUN_LVL, BOOT_TIME, NEW_TIME, OLD_TIME */ + return lutmp; + } + if (type == 1 && strncmp(lutmp->ut_id, utmp_entry->ut_id, sizeof(lutmp->ut_id)) == 0) { + /* INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS, DEAD_PROCESS */ + return lutmp; + } } return NULL; } - +#if defined __UCLIBC_HAS_THREADS__ struct utmp *getutid(const struct utmp *utmp_entry) { struct utmp *ret; @@ -132,6 +142,7 @@ struct utmp *getutid(const struct utmp *utmp_entry) __UCLIBC_MUTEX_UNLOCK(utmplock); return ret; } +#endif struct utmp *getutline(const struct utmp *utmp_entry) { @@ -139,9 +150,10 @@ struct utmp *getutline(const struct utmp *utmp_entry) __UCLIBC_MUTEX_LOCK(utmplock); while ((lutmp = __getutent()) != NULL) { - if ((lutmp->ut_type == USER_PROCESS || lutmp->ut_type == LOGIN_PROCESS) && - !strcmp(lutmp->ut_line, utmp_entry->ut_line)) { - break; + if (lutmp->ut_type == USER_PROCESS || lutmp->ut_type == LOGIN_PROCESS) { + if (strncmp(lutmp->ut_line, utmp_entry->ut_line, sizeof(lutmp->ut_line)) == 0) { + break; + } } } __UCLIBC_MUTEX_UNLOCK(utmplock); -- cgit v1.2.3 From b2f0faf04264c13d7877646330da7f5954380342 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 5 Apr 2010 19:27:41 +0200 Subject: libutil/login: was totally broken. fixed Also made login() and logout() usable with utmpname(non_std_utmp_file) text data bss dec hex filename 111 0 0 111 6f libutil/login.o 217 0 0 217 d9 libutil/login.o text data bss dec hex filename 164 0 0 164 a4 libutil/logout.o 134 0 0 134 86 libutil/logout.o Signed-off-by: Denys Vlasenko --- libutil/login.c | 57 +++++++++++++++++++++++++++++++++++++++++++++----------- libutil/logout.c | 20 ++++++++++---------- 2 files changed, 56 insertions(+), 21 deletions(-) diff --git a/libutil/login.c b/libutil/login.c index bd1dd29ee..4007e4c7e 100644 --- a/libutil/login.c +++ b/libutil/login.c @@ -5,21 +5,56 @@ #include #include -/* Write the given entry into utmp and wtmp. */ -void login (const struct utmp *entry) +/* Write the given entry into utmp and wtmp. + * Note: the match in utmp is done against ut_id field, + * which is NOT set by this function - caller must set it. + */ +void login(const struct utmp *entry) { - struct utmp copy = *entry; + struct utmp copy; + char tty_name[sizeof(copy.ut_line) + 6]; + int fd; - utmpname(_PATH_UTMP); - setutent(); +// Manpage: +// login() takes the argument ut struct, fills the field ut->ut_type +// (if there is such a field) with the value USER_PROCESS, +// and fills the field ut->ut_pid (if there is such a field) +// with the process ID of the calling process. + copy = *entry; #if _HAVE_UT_TYPE - 0 - copy.ut_type = USER_PROCESS; + copy.ut_type = USER_PROCESS; #endif #if _HAVE_UT_PID - 0 - copy.ut_pid = getpid(); + copy.ut_pid = getpid(); #endif - strncpy (copy.ut_line, entry->ut_line, UT_LINESIZE); - pututline(entry); - endutent(); -} +// Then it tries to fill the field ut->ut_line. It takes the first of stdin, +// stdout, stderr that is a tty, and stores the corresponding pathname minus +// a possible leading /dev/ into this field, and then writes the struct +// to the utmp file. On the other hand, if no tty name was found, +// this field is filled with "???" and the struct is not written +// to the utmp file. + fd = 0; + while (fd != 3 && ttyname_r(fd, tty_name, sizeof(tty_name)) != 0) + fd++; + if (fd != 3) { + if (strncmp(tty_name, "/dev/", 5) == 0) + strncpy(copy.ut_line, tty_name + 5, sizeof(copy.ut_line)-1); + else + strncpy(copy.ut_line, tty_name, sizeof(copy.ut_line)-1); + copy.ut_line[sizeof(copy.ut_line)-1] = '\0'; + + /* utmpname(_PATH_UTMP); - why? + * this makes it impossible for caller to use other file! + * Does any standard or historical precedent says this must be done? */ + setutent(); + /* Replaces record with matching ut_id, or appends new one: */ + pututline(©); + endutent(); + } else { + strncpy(copy.ut_line, "???", sizeof(copy.ut_line)); + } + +// After this, the struct is written to the wtmp file. + updwtmp(_PATH_WTMP, ©); +} diff --git a/libutil/logout.c b/libutil/logout.c index e6d9565ab..5f58b8f42 100644 --- a/libutil/logout.c +++ b/libutil/logout.c @@ -29,9 +29,9 @@ logout (const char *line) struct utmp *ut; int result = 0; - /* Tell that we want to use the UTMP file. */ - if (utmpname (_PATH_UTMP) == -1) - return 0; + /* if (utmpname (_PATH_UTMP) == -1) return 0; - why? + * this makes it impossible for caller to use other file! + * Does any standard or historical precedent says this must be done? */ /* Open UTMP file. */ setutent (); @@ -43,7 +43,7 @@ logout (const char *line) strncpy (tmp.ut_line, line, sizeof tmp.ut_line); /* Read the record. */ - if( (ut = getutline(&tmp)) ) + if ((ut = getutline(&tmp)) != NULL) { /* Clear information about who & from where. */ memset (ut->ut_name, 0, sizeof ut->ut_name); @@ -54,12 +54,12 @@ logout (const char *line) # if !defined __WORDSIZE_COMPAT32 || __WORDSIZE_COMPAT32 == 0 gettimeofday (&ut->ut_tv, NULL); # else - { - struct timeval tv; - gettimeofday (&tv, NULL); - ut->ut_tv.tv_sec = tv.tv_sec; - ut->ut_tv.tv_usec = tv.tv_usec; - } + { + struct timeval tv; + gettimeofday (&tv, NULL); + ut->ut_tv.tv_sec = tv.tv_sec; + ut->ut_tv.tv_usec = tv.tv_usec; + } # endif #else time (&ut->ut_time); -- cgit v1.2.3 From eefaf06888e3dcbc410b4cc2d231035f4400c7ac Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 6 Apr 2010 05:28:29 +0200 Subject: i386/bits/syscalls.h: explain how it works. no code changes Signed-off-by: Denys Vlasenko --- libc/sysdeps/linux/i386/bits/syscalls.h | 216 +++++++++++++++++--------------- 1 file changed, 116 insertions(+), 100 deletions(-) diff --git a/libc/sysdeps/linux/i386/bits/syscalls.h b/libc/sysdeps/linux/i386/bits/syscalls.h index 23d872a29..46c2d9962 100644 --- a/libc/sysdeps/linux/i386/bits/syscalls.h +++ b/libc/sysdeps/linux/i386/bits/syscalls.h @@ -1,128 +1,144 @@ #ifndef _BITS_SYSCALLS_H #define _BITS_SYSCALLS_H + #ifndef _SYSCALL_H # error "Never use directly; include instead." #endif /* - Some of the sneaky macros in the code were taken from - glibc-2.2.5/sysdeps/unix/sysv/linux/i386/sysdep.h -*/ + * Some of the sneaky macros in the code were taken from + * glibc-2.2.5/sysdeps/unix/sysv/linux/i386/sysdep.h + */ #ifndef __ASSEMBLER__ #include -/* We need some help from the assembler to generate optimal code. We - define some macros here which later will be used. */ +/* We need some help from the assembler to generate optimal code. + * We define some macros here which later will be used. */ -#if defined __SUPPORT_LD_DEBUG__ && defined __DOMULTI__ +#if defined __SUPPORT_LD_DEBUG__ && defined __DOMULTI__ #error LD debugging and DOMULTI are incompatible #endif #ifdef __DOMULTI__ -__asm__ (".L__X'%ebx = 1\n\t" - ".L__X'%ecx = 2\n\t" - ".L__X'%edx = 2\n\t" - ".L__X'%eax = 3\n\t" - ".L__X'%esi = 3\n\t" - ".L__X'%edi = 3\n\t" - ".L__X'%ebp = 3\n\t" - ".L__X'%esp = 3\n\t" - ".ifndef _BITS_SYSCALLS_ASM\n\t" - ".set _BITS_SYSCALLS_ASM,1\n\t" - ".macro bpushl name reg\n\t" - ".if 1 - \\name\n\t" - ".if 2 - \\name\n\t" - "pushl %ebx\n\t" - ".else\n\t" - "xchgl \\reg, %ebx\n\t" - ".endif\n\t" - ".endif\n\t" - ".endm\n\t" - ".macro bpopl name reg\n\t" - ".if 1 - \\name\n\t" - ".if 2 - \\name\n\t" - "popl %ebx\n\t" - ".else\n\t" - "xchgl \\reg, %ebx\n\t" - ".endif\n\t" - ".endif\n\t" - ".endm\n\t" - ".macro bmovl name reg\n\t" - ".if 1 - \\name\n\t" - ".if 2 - \\name\n\t" - "movl \\reg, %ebx\n\t" - ".endif\n\t" - ".endif\n\t" - ".endm\n\t" - ".endif\n\t"); +__asm__ ( + ".L__X'%ebx = 1\n\t" + ".L__X'%ecx = 2\n\t" + ".L__X'%edx = 2\n\t" + ".L__X'%eax = 3\n\t" + ".L__X'%esi = 3\n\t" + ".L__X'%edi = 3\n\t" + ".L__X'%ebp = 3\n\t" + ".L__X'%esp = 3\n\t" + + ".ifndef _BITS_SYSCALLS_ASM\n\t" + ".set _BITS_SYSCALLS_ASM,1\n\t" + + /* Loading param #1 (ebx) is done by loading it into + * another register, and then performing bpushl+bmovl, + * since we must preserve ebx */ + + ".macro bpushl name reg\n\t" + ".if 1 - \\name\n\t" /* if reg!=ebx... */ + ".if 2 - \\name\n\t" /* if reg can't be clobbered... */ + "pushl %ebx\n\t" /* save ebx on stack */ + ".else\n\t" + "xchgl \\reg, %ebx\n\t" /* else save ebx in reg, and load reg to ebx */ + ".endif\n\t" + ".endif\n\t" + ".endm\n\t" + + ".macro bmovl name reg\n\t" + ".if 1 - \\name\n\t" + ".if 2 - \\name\n\t" /* if reg can't be clobbered... */ + "movl \\reg, %ebx\n\t" /* load reg to ebx */ + ".endif\n\t" + ".endif\n\t" + ".endm\n\t" + + ".endif\n\t" /* _BITS_SYSCALLS_ASM */ + + ".macro bpopl name reg\n\t" + ".if 1 - \\name\n\t" + ".if 2 - \\name\n\t" /* if reg can't be clobbered... */ + "popl %ebx\n\t" /* restore ebx from stack */ + ".else\n\t" + "xchgl \\reg, %ebx\n\t" /* else restore ebx from reg */ + ".endif\n\t" + ".endif\n\t" + ".endm\n\t" +); #else -__asm__ (".L__X'%ebx = 1\n\t" - ".L__X'%ecx = 2\n\t" - ".L__X'%edx = 2\n\t" - ".L__X'%eax = 3\n\t" - ".L__X'%esi = 3\n\t" - ".L__X'%edi = 3\n\t" - ".L__X'%ebp = 3\n\t" - ".L__X'%esp = 3\n\t" - ".macro bpushl name reg\n\t" - ".if 1 - \\name\n\t" - ".if 2 - \\name\n\t" - "pushl %ebx\n\t" - ".else\n\t" - "xchgl \\reg, %ebx\n\t" - ".endif\n\t" - ".endif\n\t" - ".endm\n\t" - ".macro bpopl name reg\n\t" - ".if 1 - \\name\n\t" - ".if 2 - \\name\n\t" - "popl %ebx\n\t" - ".else\n\t" - "xchgl \\reg, %ebx\n\t" - ".endif\n\t" - ".endif\n\t" - ".endm\n\t" - ".macro bmovl name reg\n\t" - ".if 1 - \\name\n\t" - ".if 2 - \\name\n\t" - "movl \\reg, %ebx\n\t" - ".endif\n\t" - ".endif\n\t" - ".endm\n\t"); +__asm__ ( + ".L__X'%ebx = 1\n\t" + ".L__X'%ecx = 2\n\t" + ".L__X'%edx = 2\n\t" + ".L__X'%eax = 3\n\t" + ".L__X'%esi = 3\n\t" + ".L__X'%edi = 3\n\t" + ".L__X'%ebp = 3\n\t" + ".L__X'%esp = 3\n\t" + + ".macro bpushl name reg\n\t" + ".if 1 - \\name\n\t" + ".if 2 - \\name\n\t" + "pushl %ebx\n\t" + ".else\n\t" + "xchgl \\reg, %ebx\n\t" + ".endif\n\t" + ".endif\n\t" + ".endm\n\t" + + ".macro bmovl name reg\n\t" + ".if 1 - \\name\n\t" + ".if 2 - \\name\n\t" + "movl \\reg, %ebx\n\t" + ".endif\n\t" + ".endif\n\t" + ".endm\n\t" + + ".macro bpopl name reg\n\t" + ".if 1 - \\name\n\t" + ".if 2 - \\name\n\t" + "popl %ebx\n\t" + ".else\n\t" + "xchgl \\reg, %ebx\n\t" + ".endif\n\t" + ".endif\n\t" + ".endm\n\t" +); #endif #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ - ({ \ - register unsigned int resultvar; \ - __asm__ __volatile__ ( \ - LOADARGS_##nr \ - "movl %1, %%eax\n\t" \ - "int $0x80\n\t" \ - RESTOREARGS_##nr \ - : "=a" (resultvar) \ - : "i" (name) ASMFMT_##nr(args) : "memory", "cc"); \ - (int) resultvar; }) +({ \ + register unsigned int resultvar; \ + __asm__ __volatile__ ( \ + LOADARGS_##nr \ + "movl %1, %%eax\n\t" \ + "int $0x80\n\t" \ + RESTOREARGS_##nr \ + : "=a" (resultvar) \ + : "i" (name) ASMFMT_##nr(args) : "memory", "cc" \ + ); \ + (int) resultvar; \ +}) #define LOADARGS_0 -#define LOADARGS_1 \ - "bpushl .L__X'%k2, %k2\n\t" \ - "bmovl .L__X'%k2, %k2\n\t" -#define LOADARGS_2 LOADARGS_1 -#define LOADARGS_3 LOADARGS_1 -#define LOADARGS_4 LOADARGS_1 -#define LOADARGS_5 LOADARGS_1 -#define LOADARGS_6 LOADARGS_1 "push %%ebp ; movl %7, %%ebp\n\t" +#define LOADARGS_1 "bpushl .L__X'%k2, %k2\n\t" "bmovl .L__X'%k2, %k2\n\t" +#define LOADARGS_2 LOADARGS_1 +#define LOADARGS_3 LOADARGS_1 +#define LOADARGS_4 LOADARGS_1 +#define LOADARGS_5 LOADARGS_1 +#define LOADARGS_6 LOADARGS_1 "push %%ebp\n\t" "movl %7, %%ebp\n\t" #define RESTOREARGS_0 -#define RESTOREARGS_1 \ - "bpopl .L__X'%k2, %k2\n\t" -#define RESTOREARGS_2 RESTOREARGS_1 -#define RESTOREARGS_3 RESTOREARGS_1 -#define RESTOREARGS_4 RESTOREARGS_1 -#define RESTOREARGS_5 RESTOREARGS_1 -#define RESTOREARGS_6 "pop %%ebp\n\t" RESTOREARGS_1 +#define RESTOREARGS_1 "bpopl .L__X'%k2, %k2\n\t" +#define RESTOREARGS_2 RESTOREARGS_1 +#define RESTOREARGS_3 RESTOREARGS_1 +#define RESTOREARGS_4 RESTOREARGS_1 +#define RESTOREARGS_5 RESTOREARGS_1 +#define RESTOREARGS_6 "pop %%ebp\n\t" RESTOREARGS_1 #define ASMFMT_0() #define ASMFMT_1(arg1) \ -- cgit v1.2.3 From d82f29cd593e371acb3a6f11656543cf2e6e2421 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 6 Apr 2010 05:29:26 +0200 Subject: i386/bits/syscalls.h: generate better code using more restrictive asm constraints Example: time() doesn't push/pop two registers now, and is smaller: <__GI_time>: -57 push %edi -8b 7c 24 08 mov 0x8(%esp),%edi -53 push %ebx -89 fb mov %edi,%ebx +8b 4c 24 04 mov 0x4(%esp),%ecx +87 cb xchg %ecx,%ebx b8 0d 00 00 00 mov $0xd,%eax cd 80 int $0x80 -5b pop %ebx -5f pop %edi +87 cb xchg %ecx,%ebx c3 ret Signed-off-by: Denys Vlasenko --- libc/sysdeps/linux/i386/bits/syscalls.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/libc/sysdeps/linux/i386/bits/syscalls.h b/libc/sysdeps/linux/i386/bits/syscalls.h index 46c2d9962..a6e26d7ec 100644 --- a/libc/sysdeps/linux/i386/bits/syscalls.h +++ b/libc/sysdeps/linux/i386/bits/syscalls.h @@ -141,14 +141,21 @@ __asm__ ( #define RESTOREARGS_6 "pop %%ebp\n\t" RESTOREARGS_1 #define ASMFMT_0() +/* "acdSD" constraint would work too, but "SD" would use esi/edi and cause + * them to be pushed/popped by compiler, "a" would use eax and cause ebx + * to be saved/restored on stack, not in register. Narrowing choice down + * to "ecx or edx" results in smaller and faster code: */ #define ASMFMT_1(arg1) \ - , "acdSD" (arg1) + , "cd" (arg1) +/* Can use "adSD" constraint here: */ #define ASMFMT_2(arg1, arg2) \ - , "adSD" (arg1), "c" (arg2) + , "d" (arg1), "c" (arg2) +/* Can use "aSD" constraint here: */ #define ASMFMT_3(arg1, arg2, arg3) \ - , "aSD" (arg1), "c" (arg2), "d" (arg3) + , "a" (arg1), "c" (arg2), "d" (arg3) +/* Can use "aD" constraint here: */ #define ASMFMT_4(arg1, arg2, arg3, arg4) \ - , "aD" (arg1), "c" (arg2), "d" (arg3), "S" (arg4) + , "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4) #define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \ , "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5) #define ASMFMT_6(arg1, arg2, arg3, arg4, arg5, arg6) \ -- cgit v1.2.3 From dbdd8b059520baa371de611a21d7d1a2b250b250 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 6 Apr 2010 05:32:09 +0200 Subject: i386/bits/syscalls.h: explain _BITS_SYSCALLS_ASM Signed-off-by: Denys Vlasenko --- libc/sysdeps/linux/i386/bits/syscalls.h | 54 ++++++--------------------------- 1 file changed, 9 insertions(+), 45 deletions(-) diff --git a/libc/sysdeps/linux/i386/bits/syscalls.h b/libc/sysdeps/linux/i386/bits/syscalls.h index a6e26d7ec..09d48a2ff 100644 --- a/libc/sysdeps/linux/i386/bits/syscalls.h +++ b/libc/sysdeps/linux/i386/bits/syscalls.h @@ -21,8 +21,13 @@ #error LD debugging and DOMULTI are incompatible #endif -#ifdef __DOMULTI__ __asm__ ( +#ifdef __DOMULTI__ + /* Protect against asm macro redefinition (happens in __DOMULTI__ mode). + * Unfortunately, it ends up visible in .o files. */ + ".ifndef _BITS_SYSCALLS_ASM\n\t" + ".set _BITS_SYSCALLS_ASM,1\n\t" +#endif ".L__X'%ebx = 1\n\t" ".L__X'%ecx = 2\n\t" ".L__X'%edx = 2\n\t" @@ -32,9 +37,6 @@ __asm__ ( ".L__X'%ebp = 3\n\t" ".L__X'%esp = 3\n\t" - ".ifndef _BITS_SYSCALLS_ASM\n\t" - ".set _BITS_SYSCALLS_ASM,1\n\t" - /* Loading param #1 (ebx) is done by loading it into * another register, and then performing bpushl+bmovl, * since we must preserve ebx */ @@ -57,8 +59,6 @@ __asm__ ( ".endif\n\t" ".endm\n\t" - ".endif\n\t" /* _BITS_SYSCALLS_ASM */ - ".macro bpopl name reg\n\t" ".if 1 - \\name\n\t" ".if 2 - \\name\n\t" /* if reg can't be clobbered... */ @@ -68,47 +68,11 @@ __asm__ ( ".endif\n\t" ".endif\n\t" ".endm\n\t" -); -#else -__asm__ ( - ".L__X'%ebx = 1\n\t" - ".L__X'%ecx = 2\n\t" - ".L__X'%edx = 2\n\t" - ".L__X'%eax = 3\n\t" - ".L__X'%esi = 3\n\t" - ".L__X'%edi = 3\n\t" - ".L__X'%ebp = 3\n\t" - ".L__X'%esp = 3\n\t" - ".macro bpushl name reg\n\t" - ".if 1 - \\name\n\t" - ".if 2 - \\name\n\t" - "pushl %ebx\n\t" - ".else\n\t" - "xchgl \\reg, %ebx\n\t" - ".endif\n\t" - ".endif\n\t" - ".endm\n\t" - - ".macro bmovl name reg\n\t" - ".if 1 - \\name\n\t" - ".if 2 - \\name\n\t" - "movl \\reg, %ebx\n\t" - ".endif\n\t" - ".endif\n\t" - ".endm\n\t" - - ".macro bpopl name reg\n\t" - ".if 1 - \\name\n\t" - ".if 2 - \\name\n\t" - "popl %ebx\n\t" - ".else\n\t" - "xchgl \\reg, %ebx\n\t" - ".endif\n\t" - ".endif\n\t" - ".endm\n\t" -); +#ifdef __DOMULTI__ + ".endif\n\t" /* _BITS_SYSCALLS_ASM */ #endif +); #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ ({ \ -- cgit v1.2.3 From cd50d9a1c93bf1e02f4d4e2df4ece6c881f24719 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 6 Apr 2010 05:33:01 +0200 Subject: i386/bits/syscalls.h: more compact, but stack-hungry syscall code. disabled so far Signed-off-by: Denys Vlasenko --- libc/sysdeps/linux/i386/bits/syscalls.h | 96 ++++++++++++++++++++++++++------- 1 file changed, 78 insertions(+), 18 deletions(-) diff --git a/libc/sysdeps/linux/i386/bits/syscalls.h b/libc/sysdeps/linux/i386/bits/syscalls.h index 09d48a2ff..0427d91cd 100644 --- a/libc/sysdeps/linux/i386/bits/syscalls.h +++ b/libc/sysdeps/linux/i386/bits/syscalls.h @@ -14,13 +14,36 @@ #include +#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ +({ \ + register unsigned int resultvar; \ + __asm__ __volatile__ ( \ + LOADARGS_##nr \ + "movl %1, %%eax\n\t" \ + "int $0x80\n\t" \ + RESTOREARGS_##nr \ + : "=a" (resultvar) \ + : "i" (name) ASMFMT_##nr(args) : "memory", "cc" \ + ); \ + (int) resultvar; \ +}) + + +#if 1 /* defined __PIC__ || defined __pic__ */ + +/* This code avoids pushing/popping ebx as much as possible. + * I think the main reason was that older GCCs had problems + * with proper saving/restoring of ebx if "b" constraint was used, + * which was breaking -fPIC code really badly. + * At least gcc 4.2.x seems to not need these tricks anymore, + * but this code is still useful because it often avoids + * using stack for saving ebx. + * Keeping it unconditionally enabled for now. + */ + /* We need some help from the assembler to generate optimal code. * We define some macros here which later will be used. */ -#if defined __SUPPORT_LD_DEBUG__ && defined __DOMULTI__ -#error LD debugging and DOMULTI are incompatible -#endif - __asm__ ( #ifdef __DOMULTI__ /* Protect against asm macro redefinition (happens in __DOMULTI__ mode). @@ -74,20 +97,6 @@ __asm__ ( #endif ); -#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ -({ \ - register unsigned int resultvar; \ - __asm__ __volatile__ ( \ - LOADARGS_##nr \ - "movl %1, %%eax\n\t" \ - "int $0x80\n\t" \ - RESTOREARGS_##nr \ - : "=a" (resultvar) \ - : "i" (name) ASMFMT_##nr(args) : "memory", "cc" \ - ); \ - (int) resultvar; \ -}) - #define LOADARGS_0 #define LOADARGS_1 "bpushl .L__X'%k2, %k2\n\t" "bmovl .L__X'%k2, %k2\n\t" #define LOADARGS_2 LOADARGS_1 @@ -125,5 +134,56 @@ __asm__ ( #define ASMFMT_6(arg1, arg2, arg3, arg4, arg5, arg6) \ , "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5), "m" (arg6) +#else /* !PIC */ + +/* Simpler code which just uses "b" constraint to load ebx. + * Seems to work with gc 4.2.x, and generates slightly smaller, + * but slightly slower code. Example (time syscall): + * + * - 8b 4c 24 04 mov 0x4(%esp),%ecx + * - 87 cb xchg %ecx,%ebx + * + 53 push %ebx + * + 8b 5c 24 08 mov 0x8(%esp),%ebx + * b8 0d 00 00 00 mov $0xd,%eax + * cd 80 int $0x80 + * - 87 cb xchg %ecx,%ebx + * + 5b pop %ebx + * c3 ret + * + * 2 bytes smaller, but uses stack via "push/pop ebx" + */ + +#define LOADARGS_0 +#define LOADARGS_1 +#define LOADARGS_2 +#define LOADARGS_3 +#define LOADARGS_4 +#define LOADARGS_5 +#define LOADARGS_6 "push %%ebp\n\t" "movl %7, %%ebp\n\t" + +#define RESTOREARGS_0 +#define RESTOREARGS_1 +#define RESTOREARGS_2 +#define RESTOREARGS_3 +#define RESTOREARGS_4 +#define RESTOREARGS_5 +#define RESTOREARGS_6 "pop %%ebp\n\t" + +#define ASMFMT_0() +#define ASMFMT_1(arg1) \ + , "b" (arg1) +#define ASMFMT_2(arg1, arg2) \ + , "b" (arg1), "c" (arg2) +#define ASMFMT_3(arg1, arg2, arg3) \ + , "b" (arg1), "c" (arg2), "d" (arg3) +#define ASMFMT_4(arg1, arg2, arg3, arg4) \ + , "b" (arg1), "c" (arg2), "d" (arg3), "S" (arg4) +#define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \ + , "b" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5) +#define ASMFMT_6(arg1, arg2, arg3, arg4, arg5, arg6) \ + , "b" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5), "m" (arg6) + +#endif /* !PIC */ + #endif /* __ASSEMBLER__ */ #endif /* _BITS_SYSCALLS_H */ -- cgit v1.2.3 From fd8991cc59305a071e9f1765b3e1e09de9339bc3 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Tue, 6 Apr 2010 09:55:19 +0200 Subject: Fix use-after-free bug in __dns_lookup If the type of the first answer does not match with the requested type, then the dotted name was freed. If there are no further answers in the DNS reply, this pointer was used later on in the same function. Additionally it is passed to the caller, and caused strange behaviour. Signed-off-by: Gabor Juhos Signed-off-by: Bernhard Reutner-Fischer --- libc/inet/resolv.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c index 056539f6e..9459199da 100644 --- a/libc/inet/resolv.c +++ b/libc/inet/resolv.c @@ -1517,10 +1517,8 @@ int attribute_hidden __dns_lookup(const char *name, memcpy(a, &ma, sizeof(ma)); if (a->atype != T_SIG && (NULL == a->buf || (type != T_A && type != T_AAAA))) break; - if (a->atype != type) { - free(a->dotted); + if (a->atype != type) continue; - } a->add_count = h.ancount - j - 1; if ((a->rdlength + sizeof(struct in_addr*)) * a->add_count > a->buflen) break; -- cgit v1.2.3 From e1b4229b5a245fd1d7f1e97f71fec0e7897729c3 Mon Sep 17 00:00:00 2001 From: Bernhard Reutner-Fischer Date: Tue, 6 Apr 2010 16:19:46 +0200 Subject: getconf: move to utils/ Signed-off-by: Bernhard Reutner-Fischer --- test/Rules.mak | 1 + test/unistd/Makefile.in | 7 +- test/unistd/getconf.c | 1313 ----------------------------------------------- utils/Makefile.in | 7 +- utils/getconf.c | 1313 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1325 insertions(+), 1316 deletions(-) delete mode 100644 test/unistd/getconf.c create mode 100644 utils/getconf.c diff --git a/test/Rules.mak b/test/Rules.mak index a386390b0..a84a7db2b 100644 --- a/test/Rules.mak +++ b/test/Rules.mak @@ -44,6 +44,7 @@ endif export TARGET_ARCH RM_R = $(Q)$(RM) -r +LN_S = $(Q)$(LN) -fs ifneq ($(KERNEL_HEADERS),) ifeq ($(patsubst /%,/,$(KERNEL_HEADERS)),/) diff --git a/test/unistd/Makefile.in b/test/unistd/Makefile.in index ae0eeb499..8ddfc52da 100644 --- a/test/unistd/Makefile.in +++ b/test/unistd/Makefile.in @@ -10,6 +10,11 @@ else OPTS_tstgetopt := -a -b -cfoobar --required foobar --optional=bazbug --none --colou --color --colour random endif -TESTS_DISABLED+=getconf +# getconf.c lives in utils/ +# Testsuite cannot currently be built with O= anyway, so hardcode path here +getconf.c: + $(LN_S) ../../utils/$(@F) . +EXTRA_CLEAN += getconf.c +TESTS_DISABLED += getconf CFLAGS_getconf = -DGETCONF_DIR='"$(CURDIR)"' shell_tst-getconf: getconf getconf_glibc diff --git a/test/unistd/getconf.c b/test/unistd/getconf.c deleted file mode 100644 index 81566df7b..000000000 --- a/test/unistd/getconf.c +++ /dev/null @@ -1,1313 +0,0 @@ -/* Copyright (C) 1991, 92, 1995-2008, 2009 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include -#include -#include -#include -#include - -#define PACKAGE "getconf regression test" -#define VERSION "" -#ifndef _ -# define _ -#endif -#define error(status, errnum,...) \ - {fprintf(stderr, __VA_ARGS__); exit(status);} - - -struct conf - { - const char *name; - const int call_name; - const enum { SYSCONF, CONFSTR, PATHCONF } call; - }; - -static const struct conf vars[] = - { -#ifdef _PC_LINK_MAX - { "LINK_MAX", _PC_LINK_MAX, PATHCONF }, -#endif -#ifdef _PC_LINK_MAX - { "_POSIX_LINK_MAX", _PC_LINK_MAX, PATHCONF }, -#endif -#ifdef _PC_MAX_CANON - { "MAX_CANON", _PC_MAX_CANON, PATHCONF }, -#endif -#ifdef _PC_MAX_CANON - { "_POSIX_MAX_CANON", _PC_MAX_CANON, PATHCONF }, -#endif -#ifdef _PC_MAX_INPUT - { "MAX_INPUT", _PC_MAX_INPUT, PATHCONF }, -#endif -#ifdef _PC_MAX_INPUT - { "_POSIX_MAX_INPUT", _PC_MAX_INPUT, PATHCONF }, -#endif -#ifdef _PC_NAME_MAX - { "NAME_MAX", _PC_NAME_MAX, PATHCONF }, -#endif -#ifdef _PC_NAME_MAX - { "_POSIX_NAME_MAX", _PC_NAME_MAX, PATHCONF }, -#endif -#ifdef _PC_PATH_MAX - { "PATH_MAX", _PC_PATH_MAX, PATHCONF }, -#endif -#ifdef _PC_PATH_MAX - { "_POSIX_PATH_MAX", _PC_PATH_MAX, PATHCONF }, -#endif -#ifdef _PC_PIPE_BUF - { "PIPE_BUF", _PC_PIPE_BUF, PATHCONF }, -#endif -#ifdef _PC_PIPE_BUF - { "_POSIX_PIPE_BUF", _PC_PIPE_BUF, PATHCONF }, -#endif -#ifdef _PC_SOCK_MAXBUF - { "SOCK_MAXBUF", _PC_SOCK_MAXBUF, PATHCONF }, -#endif -#ifdef _PC_ASYNC_IO - { "_POSIX_ASYNC_IO", _PC_ASYNC_IO, PATHCONF }, -#endif -#ifdef _PC_CHOWN_RESTRICTED - { "_POSIX_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED, PATHCONF }, -#endif -#ifdef _PC_NO_TRUNC - { "_POSIX_NO_TRUNC", _PC_NO_TRUNC, PATHCONF }, -#endif -#ifdef _PC_PRIO_IO - { "_POSIX_PRIO_IO", _PC_PRIO_IO, PATHCONF }, -#endif -#ifdef _PC_SYNC_IO - { "_POSIX_SYNC_IO", _PC_SYNC_IO, PATHCONF }, -#endif -#ifdef _PC_VDISABLE - { "_POSIX_VDISABLE", _PC_VDISABLE, PATHCONF }, -#endif - -#ifdef _SC_ARG_MAX - { "ARG_MAX", _SC_ARG_MAX, SYSCONF }, -#endif -#ifdef _SC_ATEXIT_MAX - { "ATEXIT_MAX", _SC_ATEXIT_MAX, SYSCONF }, -#endif -#ifdef _SC_CHAR_BIT - { "CHAR_BIT", _SC_CHAR_BIT, SYSCONF }, -#endif -#ifdef _SC_CHAR_MAX - { "CHAR_MAX", _SC_CHAR_MAX, SYSCONF }, -#endif -#ifdef _SC_CHAR_MIN - { "CHAR_MIN", _SC_CHAR_MIN, SYSCONF }, -#endif -#ifdef _SC_CHILD_MAX - { "CHILD_MAX", _SC_CHILD_MAX, SYSCONF }, -#endif -#ifdef _SC_CLK_TCK - { "CLK_TCK", _SC_CLK_TCK, SYSCONF }, -#endif -#ifdef _SC_INT_MAX - { "INT_MAX", _SC_INT_MAX, SYSCONF }, -#endif -#ifdef _SC_INT_MIN - { "INT_MIN", _SC_INT_MIN, SYSCONF }, -#endif -#ifdef _SC_UIO_MAXIOV - { "IOV_MAX", _SC_UIO_MAXIOV, SYSCONF }, -#endif -#ifdef _SC_LOGIN_NAME_MAX - { "LOGNAME_MAX", _SC_LOGIN_NAME_MAX, SYSCONF }, -#endif -#ifdef _SC_LONG_BIT - { "LONG_BIT", _SC_LONG_BIT, SYSCONF }, -#endif -#ifdef _SC_MB_LEN_MAX - { "MB_LEN_MAX", _SC_MB_LEN_MAX, SYSCONF }, -#endif -#ifdef _SC_NGROUPS_MAX - { "NGROUPS_MAX", _SC_NGROUPS_MAX, SYSCONF }, -#endif -#ifdef _SC_NL_ARGMAX - { "NL_ARGMAX", _SC_NL_ARGMAX, SYSCONF }, -#endif -#ifdef _SC_NL_LANGMAX - { "NL_LANGMAX", _SC_NL_LANGMAX, SYSCONF }, -#endif -#ifdef _SC_NL_MSGMAX - { "NL_MSGMAX", _SC_NL_MSGMAX, SYSCONF }, -#endif -#ifdef _SC_NL_NMAX - { "NL_NMAX", _SC_NL_NMAX, SYSCONF }, -#endif -#ifdef _SC_NL_SETMAX - { "NL_SETMAX", _SC_NL_SETMAX, SYSCONF }, -#endif -#ifdef _SC_NL_TEXTMAX - { "NL_TEXTMAX", _SC_NL_TEXTMAX, SYSCONF }, -#endif -#ifdef _SC_GETGR_R_SIZE_MAX - { "NSS_BUFLEN_GROUP", _SC_GETGR_R_SIZE_MAX, SYSCONF }, -#endif -#ifdef _SC_GETPW_R_SIZE_MAX - { "NSS_BUFLEN_PASSWD", _SC_GETPW_R_SIZE_MAX, SYSCONF }, -#endif -#ifdef _SC_NZERO - { "NZERO", _SC_NZERO, SYSCONF }, -#endif -#ifdef _SC_OPEN_MAX - { "OPEN_MAX", _SC_OPEN_MAX, SYSCONF }, -#endif -#ifdef _SC_PAGESIZE - { "PAGESIZE", _SC_PAGESIZE, SYSCONF }, -#endif -#ifdef _SC_PAGESIZE - { "PAGE_SIZE", _SC_PAGESIZE, SYSCONF }, -#endif -#ifdef _SC_PASS_MAX - { "PASS_MAX", _SC_PASS_MAX, SYSCONF }, -#endif -#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS - { "PTHREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS, SYSCONF }, -#endif -#ifdef _SC_THREAD_KEYS_MAX - { "PTHREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX, SYSCONF }, -#endif -#ifdef _SC_THREAD_STACK_MIN - { "PTHREAD_STACK_MIN", _SC_THREAD_STACK_MIN, SYSCONF }, -#endif -#ifdef _SC_THREAD_THREADS_MAX - { "PTHREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX, SYSCONF }, -#endif -#ifdef _SC_SCHAR_MAX - { "SCHAR_MAX", _SC_SCHAR_MAX, SYSCONF }, -#endif -#ifdef _SC_SCHAR_MIN - { "SCHAR_MIN", _SC_SCHAR_MIN, SYSCONF }, -#endif -#ifdef _SC_SHRT_MAX - { "SHRT_MAX", _SC_SHRT_MAX, SYSCONF }, -#endif -#ifdef _SC_SHRT_MIN - { "SHRT_MIN", _SC_SHRT_MIN, SYSCONF }, -#endif -#ifdef _SC_SSIZE_MAX - { "SSIZE_MAX", _SC_SSIZE_MAX, SYSCONF }, -#endif -#ifdef _SC_TTY_NAME_MAX - { "TTY_NAME_MAX", _SC_TTY_NAME_MAX, SYSCONF }, -#endif -#ifdef _SC_TZNAME_MAX - { "TZNAME_MAX", _SC_TZNAME_MAX, SYSCONF }, -#endif -#ifdef _SC_UCHAR_MAX - { "UCHAR_MAX", _SC_UCHAR_MAX, SYSCONF }, -#endif -#ifdef _SC_UINT_MAX - { "UINT_MAX", _SC_UINT_MAX, SYSCONF }, -#endif -#ifdef _SC_UIO_MAXIOV - { "UIO_MAXIOV", _SC_UIO_MAXIOV, SYSCONF }, -#endif -#ifdef _SC_ULONG_MAX - { "ULONG_MAX", _SC_ULONG_MAX, SYSCONF }, -#endif -#ifdef _SC_USHRT_MAX - { "USHRT_MAX", _SC_USHRT_MAX, SYSCONF }, -#endif -#ifdef _SC_WORD_BIT - { "WORD_BIT", _SC_WORD_BIT, SYSCONF }, -#endif -#ifdef _SC_AVPHYS_PAGES - { "_AVPHYS_PAGES", _SC_AVPHYS_PAGES, SYSCONF }, -#endif -#ifdef _SC_NPROCESSORS_CONF - { "_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF, SYSCONF }, -#endif -#ifdef _SC_NPROCESSORS_ONLN - { "_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN, SYSCONF }, -#endif -#ifdef _SC_PHYS_PAGES - { "_PHYS_PAGES", _SC_PHYS_PAGES, SYSCONF }, -#endif -#ifdef _SC_ARG_MAX - { "_POSIX_ARG_MAX", _SC_ARG_MAX, SYSCONF }, -#endif -#ifdef _SC_ASYNCHRONOUS_IO - { "_POSIX_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO, SYSCONF }, -#endif -#ifdef _SC_CHILD_MAX - { "_POSIX_CHILD_MAX", _SC_CHILD_MAX, SYSCONF }, -#endif -#ifdef _SC_FSYNC - { "_POSIX_FSYNC", _SC_FSYNC, SYSCONF }, -#endif -#ifdef _SC_JOB_CONTROL - { "_POSIX_JOB_CONTROL", _SC_JOB_CONTROL, SYSCONF }, -#endif -#ifdef _SC_MAPPED_FILES - { "_POSIX_MAPPED_FILES", _SC_MAPPED_FILES, SYSCONF }, -#endif -#ifdef _SC_MEMLOCK - { "_POSIX_MEMLOCK", _SC_MEMLOCK, SYSCONF }, -#endif -#ifdef _SC_MEMLOCK_RANGE - { "_POSIX_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE, SYSCONF }, -#endif -#ifdef _SC_MEMORY_PROTECTION - { "_POSIX_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION, SYSCONF }, -#endif -#ifdef _SC_MESSAGE_PASSING - { "_POSIX_MESSAGE_PASSING", _SC_MESSAGE_PASSING, SYSCONF }, -#endif -#ifdef _SC_NGROUPS_MAX - { "_POSIX_NGROUPS_MAX", _SC_NGROUPS_MAX, SYSCONF }, -#endif -#ifdef _SC_OPEN_MAX - { "_POSIX_OPEN_MAX", _SC_OPEN_MAX, SYSCONF }, -#endif -#ifdef _SC_PII - { "_POSIX_PII", _SC_PII, SYSCONF }, -#endif -#ifdef _SC_PII_INTERNET - { "_POSIX_PII_INTERNET", _SC_PII_INTERNET, SYSCONF }, -#endif -#ifdef _SC_PII_INTERNET_DGRAM - { "_POSIX_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM, SYSCONF }, -#endif -#ifdef _SC_PII_INTERNET_STREAM - { "_POSIX_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM, SYSCONF }, -#endif -#ifdef _SC_PII_OSI - { "_POSIX_PII_OSI", _SC_PII_OSI, SYSCONF }, -#endif -#ifdef _SC_PII_OSI_CLTS - { "_POSIX_PII_OSI_CLTS", _SC_PII_OSI_CLTS, SYSCONF }, -#endif -#ifdef _SC_PII_OSI_COTS - { "_POSIX_PII_OSI_COTS", _SC_PII_OSI_COTS, SYSCONF }, -#endif -#ifdef _SC_PII_OSI_M - { "_POSIX_PII_OSI_M", _SC_PII_OSI_M, SYSCONF }, -#endif -#ifdef _SC_PII_SOCKET - { "_POSIX_PII_SOCKET", _SC_PII_SOCKET, SYSCONF }, -#endif -#ifdef _SC_PII_XTI - { "_POSIX_PII_XTI", _SC_PII_XTI, SYSCONF }, -#endif -#ifdef _SC_POLL - { "_POSIX_POLL", _SC_POLL, SYSCONF }, -#endif -#ifdef _SC_PRIORITIZED_IO - { "_POSIX_PRIORITIZED_IO", _SC_PRIORITIZED_IO, SYSCONF }, -#endif -#ifdef _SC_PRIORITY_SCHEDULING - { "_POSIX_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING, SYSCONF }, -#endif -#ifdef _SC_REALTIME_SIGNALS - { "_POSIX_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS, SYSCONF }, -#endif -#ifdef _SC_SAVED_IDS - { "_POSIX_SAVED_IDS", _SC_SAVED_IDS, SYSCONF }, -#endif -#ifdef _SC_SELECT - { "_POSIX_SELECT", _SC_SELECT, SYSCONF }, -#endif -#ifdef _SC_SEMAPHORES - { "_POSIX_SEMAPHORES", _SC_SEMAPHORES, SYSCONF }, -#endif -#ifdef _SC_SHARED_MEMORY_OBJECTS - { "_POSIX_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS, SYSCONF }, -#endif -#ifdef _SC_SSIZE_MAX - { "_POSIX_SSIZE_MAX", _SC_SSIZE_MAX, SYSCONF }, -#endif -#ifdef _SC_STREAM_MAX - { "_POSIX_STREAM_MAX", _SC_STREAM_MAX, SYSCONF }, -#endif -#ifdef _SC_SYNCHRONIZED_IO - { "_POSIX_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO, SYSCONF }, -#endif -#ifdef _SC_THREADS - { "_POSIX_THREADS", _SC_THREADS, SYSCONF }, -#endif -#ifdef _SC_THREAD_ATTR_STACKADDR - { "_POSIX_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR, SYSCONF }, -#endif -#ifdef _SC_THREAD_ATTR_STACKSIZE - { "_POSIX_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE, SYSCONF }, -#endif -#ifdef _SC_THREAD_PRIORITY_SCHEDULING - { "_POSIX_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING, SYSCONF }, -#endif -#ifdef _SC_THREAD_PRIO_INHERIT - { "_POSIX_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT, SYSCONF }, -#endif -#ifdef _SC_THREAD_PRIO_PROTECT - { "_POSIX_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT, SYSCONF }, -#endif -#ifdef _SC_THREAD_ROBUST_PRIO_INHERIT - { "_POSIX_THREAD_ROBUST_PRIO_INHERIT", _SC_THREAD_ROBUST_PRIO_INHERIT, - SYSCONF }, -#endif -#ifdef _SC_THREAD_ROBUST_PRIO_PROTECT - { "_POSIX_THREAD_ROBUST_PRIO_PROTECT", _SC_THREAD_ROBUST_PRIO_PROTECT, - SYSCONF }, -#endif -#ifdef _SC_THREAD_PROCESS_SHARED - { "_POSIX_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED, SYSCONF }, -#endif -#ifdef _SC_THREAD_SAFE_FUNCTIONS - { "_POSIX_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS, SYSCONF }, -#endif -#ifdef _SC_TIMERS - { "_POSIX_TIMERS", _SC_TIMERS, SYSCONF }, -#endif -#ifdef _SC_TIMER_MAX - { "TIMER_MAX", _SC_TIMER_MAX, SYSCONF }, -#endif -#ifdef _SC_TZNAME_MAX - { "_POSIX_TZNAME_MAX", _SC_TZNAME_MAX, SYSCONF }, -#endif -#ifdef _SC_VERSION - { "_POSIX_VERSION", _SC_VERSION, SYSCONF }, -#endif -#ifdef _SC_T_IOV_MAX - { "_T_IOV_MAX", _SC_T_IOV_MAX, SYSCONF }, -#endif -#ifdef _SC_XOPEN_CRYPT - { "_XOPEN_CRYPT", _SC_XOPEN_CRYPT, SYSCONF }, -#endif -#ifdef _SC_XOPEN_ENH_I18N - { "_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N, SYSCONF }, -#endif -#ifdef _SC_XOPEN_LEGACY - { "_XOPEN_LEGACY", _SC_XOPEN_LEGACY, SYSCONF }, -#endif -#ifdef _SC_XOPEN_REALTIME - { "_XOPEN_REALTIME", _SC_XOPEN_REALTIME, SYSCONF }, -#endif -#ifdef _SC_XOPEN_REALTIME_THREADS - { "_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS, SYSCONF }, -#endif -#ifdef _SC_XOPEN_SHM - { "_XOPEN_SHM", _SC_XOPEN_SHM, SYSCONF }, -#endif -#ifdef _SC_XOPEN_UNIX - { "_XOPEN_UNIX", _SC_XOPEN_UNIX, SYSCONF }, -#endif -#ifdef _SC_XOPEN_VERSION - { "_XOPEN_VERSION", _SC_XOPEN_VERSION, SYSCONF }, -#endif -#ifdef _SC_XOPEN_XCU_VERSION - { "_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION, SYSCONF }, -#endif -#ifdef _SC_XOPEN_XPG2 - { "_XOPEN_XPG2", _SC_XOPEN_XPG2, SYSCONF }, -#endif -#ifdef _SC_XOPEN_XPG3 - { "_XOPEN_XPG3", _SC_XOPEN_XPG3, SYSCONF }, -#endif -#ifdef _SC_XOPEN_XPG4 - { "_XOPEN_XPG4", _SC_XOPEN_XPG4, SYSCONF }, -#endif - /* POSIX.2 */ -#ifdef _SC_BC_BASE_MAX - { "BC_BASE_MAX", _SC_BC_BASE_MAX, SYSCONF }, -#endif -#ifdef _SC_BC_DIM_MAX - { "BC_DIM_MAX", _SC_BC_DIM_MAX, SYSCONF }, -#endif -#ifdef _SC_BC_SCALE_MAX - { "BC_SCALE_MAX", _SC_BC_SCALE_MAX, SYSCONF }, -#endif -#ifdef _SC_BC_STRING_MAX - { "BC_STRING_MAX", _SC_BC_STRING_MAX, SYSCONF }, -#endif - { "CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX, SYSCONF }, -#ifdef _SC_COLL_WEIGHTS_MAX - { "COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX, SYSCONF }, -#endif -#ifdef _SC_EQUIV_CLASS_MAX - { "EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX, SYSCONF }, -#endif -#ifdef _SC_EXPR_NEST_MAX - { "EXPR_NEST_MAX", _SC_EXPR_NEST_MAX, SYSCONF }, -#endif -#ifdef _SC_LINE_MAX - { "LINE_MAX", _SC_LINE_MAX, SYSCONF }, -#endif -#ifdef _SC_BC_BASE_MAX - { "POSIX2_BC_BASE_MAX", _SC_BC_BASE_MAX, SYSCONF }, -#endif -#ifdef _SC_BC_DIM_MAX - { "POSIX2_BC_DIM_MAX", _SC_BC_DIM_MAX, SYSCONF }, -#endif -#ifdef _SC_BC_SCALE_MAX - { "POSIX2_BC_SCALE_MAX", _SC_BC_SCALE_MAX, SYSCONF }, -#endif -#ifdef _SC_BC_STRING_MAX - { "POSIX2_BC_STRING_MAX", _SC_BC_STRING_MAX, SYSCONF }, -#endif -#ifdef _SC_2_CHAR_TERM - { "POSIX2_CHAR_TERM", _SC_2_CHAR_TERM, SYSCONF }, -#endif -#ifdef _SC_COLL_WEIGHTS_MAX - { "POSIX2_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX, SYSCONF }, -#endif -#ifdef _SC_2_C_BIND - { "POSIX2_C_BIND", _SC_2_C_BIND, SYSCONF }, -#endif -#ifdef _SC_2_C_DEV - { "POSIX2_C_DEV", _SC_2_C_DEV, SYSCONF }, -#endif -#ifdef _SC_2_C_VERSION - { "POSIX2_C_VERSION", _SC_2_C_VERSION, SYSCONF }, -#endif -#ifdef _SC_EXPR_NEST_MAX - { "POSIX2_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX, SYSCONF }, -#endif -#ifdef _SC_2_FORT_DEV - { "POSIX2_FORT_DEV", _SC_2_FORT_DEV, SYSCONF }, -#endif -#ifdef _SC_2_FORT_RUN - { "POSIX2_FORT_RUN", _SC_2_FORT_RUN, SYSCONF }, -#endif -#ifdef _SC_LINE_MAX - { "_POSIX2_LINE_MAX", _SC_LINE_MAX, SYSCONF }, - { "POSIX2_LINE_MAX", _SC_LINE_MAX, SYSCONF }, -#endif -#ifdef _SC_2_LOCALEDEF - { "POSIX2_LOCALEDEF", _SC_2_LOCALEDEF, SYSCONF }, -#endif -#ifdef _SC_RE_DUP_MAX - { "POSIX2_RE_DUP_MAX", _SC_RE_DUP_MAX, SYSCONF }, -#endif -#ifdef _SC_2_SW_DEV - { "POSIX2_SW_DEV", _SC_2_SW_DEV, SYSCONF }, -#endif -#ifdef _SC_2_UPE - { "POSIX2_UPE", _SC_2_UPE, SYSCONF }, -#endif -#ifdef _SC_2_VERSION - { "POSIX2_VERSION", _SC_2_VERSION, SYSCONF }, -#endif -#ifdef _SC_RE_DUP_MAX - { "RE_DUP_MAX", _SC_RE_DUP_MAX, SYSCONF }, -#endif - -#ifdef _CS_PATH - { "PATH", _CS_PATH, CONFSTR }, - { "CS_PATH", _CS_PATH, CONFSTR }, -#endif - - /* LFS */ -#ifdef _CS_LFS_CFLAGS - { "LFS_CFLAGS", _CS_LFS_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_LFS_LDFLAGS - { "LFS_LDFLAGS", _CS_LFS_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_LFS_LIBS - { "LFS_LIBS", _CS_LFS_LIBS, CONFSTR }, -#endif -#ifdef _CS_LFS_LINTFLAGS - { "LFS_LINTFLAGS", _CS_LFS_LINTFLAGS, CONFSTR }, -#endif -#ifdef _CS_LFS64_CFLAGS - { "LFS64_CFLAGS", _CS_LFS64_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_LFS64_LDFLAGS - { "LFS64_LDFLAGS", _CS_LFS64_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_LFS64_LIBS - { "LFS64_LIBS", _CS_LFS64_LIBS, CONFSTR }, -#endif -#ifdef _CS_LFS64_LINTFLAGS - { "LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS, CONFSTR }, -#endif - - /* Programming environments. */ -#ifdef _CS_V5_WIDTH_RESTRICTED_ENVS - { "_XBS5_WIDTH_RESTRICTED_ENVS", _CS_V5_WIDTH_RESTRICTED_ENVS, CONFSTR }, - { "XBS5_WIDTH_RESTRICTED_ENVS", _CS_V5_WIDTH_RESTRICTED_ENVS, CONFSTR }, -#endif - -#ifdef _SC_XBS5_ILP32_OFF32 - { "_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32, SYSCONF }, -#endif -#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS - { "XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS - { "XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_XBS5_ILP32_OFF32_LIBS - { "XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS, CONFSTR }, -#endif -#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS - { "XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS, CONFSTR }, -#endif - -#ifdef _SC_XBS5_ILP32_OFFBIG - { "_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG, SYSCONF }, -#endif -#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS - { "XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS - { "XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS - { "XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS, CONFSTR }, -#endif -#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS - { "XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS, CONFSTR }, -#endif - -#ifdef _SC_XBS5_LP64_OFF64 - { "_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64, SYSCONF }, -#endif -#ifdef _CS_XBS5_LP64_OFF64_CFLAGS - { "XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS - { "XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_XBS5_LP64_OFF64_LIBS - { "XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS, CONFSTR }, -#endif -#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS - { "XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS, CONFSTR }, -#endif - -#ifdef _SC_XBS5_LPBIG_OFFBIG - { "_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG, SYSCONF }, -#endif -#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS - { "XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS - { "XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS - { "XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS, CONFSTR }, -#endif -#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS - { "XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS, CONFSTR }, -#endif - -#ifdef _SC_V6_ILP32_OFF32 - { "_POSIX_V6_ILP32_OFF32", _SC_V6_ILP32_OFF32, SYSCONF }, -#endif -#ifdef _CS_POSIX_V6_ILP32_OFF32_CFLAGS - { "POSIX_V6_ILP32_OFF32_CFLAGS", _CS_POSIX_V6_ILP32_OFF32_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V6_ILP32_OFF32_LDFLAGS - { "POSIX_V6_ILP32_OFF32_LDFLAGS", _CS_POSIX_V6_ILP32_OFF32_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V6_ILP32_OFF32_LIBS - { "POSIX_V6_ILP32_OFF32_LIBS", _CS_POSIX_V6_ILP32_OFF32_LIBS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS - { "POSIX_V6_ILP32_OFF32_LINTFLAGS", _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS, CONFSTR }, -#endif - -#ifdef _CS_V6_WIDTH_RESTRICTED_ENVS - { "_POSIX_V6_WIDTH_RESTRICTED_ENVS", _CS_V6_WIDTH_RESTRICTED_ENVS, CONFSTR }, - { "POSIX_V6_WIDTH_RESTRICTED_ENVS", _CS_V6_WIDTH_RESTRICTED_ENVS, CONFSTR }, -#endif - -#ifdef _SC_V6_ILP32_OFFBIG - { "_POSIX_V6_ILP32_OFFBIG", _SC_V6_ILP32_OFFBIG, SYSCONF }, -#endif -#ifdef _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS - { "POSIX_V6_ILP32_OFFBIG_CFLAGS", _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS - { "POSIX_V6_ILP32_OFFBIG_LDFLAGS", _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V6_ILP32_OFFBIG_LIBS - { "POSIX_V6_ILP32_OFFBIG_LIBS", _CS_POSIX_V6_ILP32_OFFBIG_LIBS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS - { "POSIX_V6_ILP32_OFFBIG_LINTFLAGS", _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS, CONFSTR }, -#endif - -#ifdef _SC_V6_LP64_OFF64 - { "_POSIX_V6_LP64_OFF64", _SC_V6_LP64_OFF64, SYSCONF }, -#endif -#ifdef _CS_POSIX_V6_LP64_OFF64_CFLAGS - { "POSIX_V6_LP64_OFF64_CFLAGS", _CS_POSIX_V6_LP64_OFF64_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V6_LP64_OFF64_LDFLAGS - { "POSIX_V6_LP64_OFF64_LDFLAGS", _CS_POSIX_V6_LP64_OFF64_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V6_LP64_OFF64_LIBS - { "POSIX_V6_LP64_OFF64_LIBS", _CS_POSIX_V6_LP64_OFF64_LIBS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V6_LP64_OFF64_LINTFLAGS - { "POSIX_V6_LP64_OFF64_LINTFLAGS", _CS_POSIX_V6_LP64_OFF64_LINTFLAGS, CONFSTR }, -#endif - -#ifdef _SC_V6_LPBIG_OFFBIG - { "_POSIX_V6_LPBIG_OFFBIG", _SC_V6_LPBIG_OFFBIG, SYSCONF }, -#endif -#ifdef _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS - { "POSIX_V6_LPBIG_OFFBIG_CFLAGS", _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS - { "POSIX_V6_LPBIG_OFFBIG_LDFLAGS", _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LIBS - { "POSIX_V6_LPBIG_OFFBIG_LIBS", _CS_POSIX_V6_LPBIG_OFFBIG_LIBS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS - { "POSIX_V6_LPBIG_OFFBIG_LINTFLAGS", _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS, CONFSTR }, -#endif - -#ifdef _SC_V7_ILP32_OFF32 - { "_POSIX_V7_ILP32_OFF32", _SC_V7_ILP32_OFF32, SYSCONF }, -#endif -#ifdef _CS_POSIX_V7_ILP32_OFF32_CFLAGS - { "POSIX_V7_ILP32_OFF32_CFLAGS", _CS_POSIX_V7_ILP32_OFF32_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V7_ILP32_OFF32_LDFLAGS - { "POSIX_V7_ILP32_OFF32_LDFLAGS", _CS_POSIX_V7_ILP32_OFF32_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V7_ILP32_OFF32_LIBS - { "POSIX_V7_ILP32_OFF32_LIBS", _CS_POSIX_V7_ILP32_OFF32_LIBS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V7_ILP32_OFF32_LINTFLAGS - { "POSIX_V7_ILP32_OFF32_LINTFLAGS", _CS_POSIX_V7_ILP32_OFF32_LINTFLAGS, CONFSTR }, -#endif - -#ifdef _CS_V7_WIDTH_RESTRICTED_ENVS - { "_POSIX_V7_WIDTH_RESTRICTED_ENVS", _CS_V7_WIDTH_RESTRICTED_ENVS, CONFSTR }, - { "POSIX_V7_WIDTH_RESTRICTED_ENVS", _CS_V7_WIDTH_RESTRICTED_ENVS, CONFSTR }, -#endif - -#ifdef _SC_V7_ILP32_OFFBIG - { "_POSIX_V7_ILP32_OFFBIG", _SC_V7_ILP32_OFFBIG, SYSCONF }, -#endif -#ifdef _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS - { "POSIX_V7_ILP32_OFFBIG_CFLAGS", _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS - { "POSIX_V7_ILP32_OFFBIG_LDFLAGS", _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V7_ILP32_OFFBIG_LIBS - { "POSIX_V7_ILP32_OFFBIG_LIBS", _CS_POSIX_V7_ILP32_OFFBIG_LIBS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS - { "POSIX_V7_ILP32_OFFBIG_LINTFLAGS", _CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS, CONFSTR }, -#endif - -#ifdef _SC_V7_LP64_OFF64 - { "_POSIX_V7_LP64_OFF64", _SC_V7_LP64_OFF64, SYSCONF }, -#endif -#ifdef _CS_POSIX_V7_LP64_OFF64_CFLAGS - { "POSIX_V7_LP64_OFF64_CFLAGS", _CS_POSIX_V7_LP64_OFF64_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V7_LP64_OFF64_LDFLAGS - { "POSIX_V7_LP64_OFF64_LDFLAGS", _CS_POSIX_V7_LP64_OFF64_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V7_LP64_OFF64_LIBS - { "POSIX_V7_LP64_OFF64_LIBS", _CS_POSIX_V7_LP64_OFF64_LIBS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V7_LP64_OFF64_LINTFLAGS - { "POSIX_V7_LP64_OFF64_LINTFLAGS", _CS_POSIX_V7_LP64_OFF64_LINTFLAGS, CONFSTR }, -#endif - -#ifdef _SC_V7_LPBIG_OFFBIG - { "_POSIX_V7_LPBIG_OFFBIG", _SC_V7_LPBIG_OFFBIG, SYSCONF }, -#endif -#ifdef _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS - { "POSIX_V7_LPBIG_OFFBIG_CFLAGS", _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS - { "POSIX_V7_LPBIG_OFFBIG_LDFLAGS", _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V7_LPBIG_OFFBIG_LIBS - { "POSIX_V7_LPBIG_OFFBIG_LIBS", _CS_POSIX_V7_LPBIG_OFFBIG_LIBS, CONFSTR }, -#endif -#ifdef _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS - { "POSIX_V7_LPBIG_OFFBIG_LINTFLAGS", _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS, CONFSTR }, -#endif - -#ifdef _SC_ADVISORY_INFO - { "_POSIX_ADVISORY_INFO", _SC_ADVISORY_INFO, SYSCONF }, -#endif -#ifdef _SC_BARRIERS - { "_POSIX_BARRIERS", _SC_BARRIERS, SYSCONF }, -#endif -#ifdef _SC_BASE - { "_POSIX_BASE", _SC_BASE, SYSCONF }, -#endif -#ifdef _SC_C_LANG_SUPPORT - { "_POSIX_C_LANG_SUPPORT", _SC_C_LANG_SUPPORT, SYSCONF }, -#endif -#ifdef _SC_C_LANG_SUPPORT_R - { "_POSIX_C_LANG_SUPPORT_R", _SC_C_LANG_SUPPORT_R, SYSCONF }, -#endif -#ifdef _SC_CLOCK_SELECTION - { "_POSIX_CLOCK_SELECTION", _SC_CLOCK_SELECTION, SYSCONF }, -#endif -#ifdef _SC_CPUTIME - { "_POSIX_CPUTIME", _SC_CPUTIME, SYSCONF }, -#endif -#ifdef _SC_THREAD_CPUTIME - { "_POSIX_THREAD_CPUTIME", _SC_THREAD_CPUTIME, SYSCONF }, -#endif -#ifdef _SC_DEVICE_SPECIFIC - { "_POSIX_DEVICE_SPECIFIC", _SC_DEVICE_SPECIFIC, SYSCONF }, -#endif -#ifdef _SC_DEVICE_SPECIFIC_R - { "_POSIX_DEVICE_SPECIFIC_R", _SC_DEVICE_SPECIFIC_R, SYSCONF }, -#endif -#ifdef _SC_FD_MGMT - { "_POSIX_FD_MGMT", _SC_FD_MGMT, SYSCONF }, -#endif -#ifdef _SC_FIFO - { "_POSIX_FIFO", _SC_FIFO, SYSCONF }, -#endif -#ifdef _SC_PIPE - { "_POSIX_PIPE", _SC_PIPE, SYSCONF }, -#endif -#ifdef _SC_FILE_ATTRIBUTES - { "_POSIX_FILE_ATTRIBUTES", _SC_FILE_ATTRIBUTES, SYSCONF }, -#endif -#ifdef _SC_FILE_LOCKING - { "_POSIX_FILE_LOCKING", _SC_FILE_LOCKING, SYSCONF }, -#endif -#ifdef _SC_FILE_SYSTEM - { "_POSIX_FILE_SYSTEM", _SC_FILE_SYSTEM, SYSCONF }, -#endif -#ifdef _SC_MONOTONIC_CLOCK - { "_POSIX_MONOTONIC_CLOCK", _SC_MONOTONIC_CLOCK, SYSCONF }, -#endif -#ifdef _SC_MULTI_PROCESS - { "_POSIX_MULTI_PROCESS", _SC_MULTI_PROCESS, SYSCONF }, -#endif -#ifdef _SC_SINGLE_PROCESS - { "_POSIX_SINGLE_PROCESS", _SC_SINGLE_PROCESS, SYSCONF }, -#endif -#ifdef _SC_NETWORKING - { "_POSIX_NETWORKING", _SC_NETWORKING, SYSCONF }, -#endif -#ifdef _SC_READER_WRITER_LOCKS - { "_POSIX_READER_WRITER_LOCKS", _SC_READER_WRITER_LOCKS, SYSCONF }, -#endif -#ifdef _SC_SPIN_LOCKS - { "_POSIX_SPIN_LOCKS", _SC_SPIN_LOCKS, SYSCONF }, -#endif -#ifdef _SC_REGEXP - { "_POSIX_REGEXP", _SC_REGEXP, SYSCONF }, -#endif -#ifdef _SC_REGEX_VERSION - { "_REGEX_VERSION", _SC_REGEX_VERSION, SYSCONF }, -#endif -#ifdef _SC_SHELL - { "_POSIX_SHELL", _SC_SHELL, SYSCONF }, -#endif -#ifdef _SC_SIGNALS - { "_POSIX_SIGNALS", _SC_SIGNALS, SYSCONF }, -#endif -#ifdef _SC_SPAWN - { "_POSIX_SPAWN", _SC_SPAWN, SYSCONF }, -#endif -#ifdef _SC_SPORADIC_SERVER - { "_POSIX_SPORADIC_SERVER", _SC_SPORADIC_SERVER, SYSCONF }, -#endif -#ifdef _SC_THREAD_SPORADIC_SERVER - { "_POSIX_THREAD_SPORADIC_SERVER", _SC_THREAD_SPORADIC_SERVER, SYSCONF }, -#endif -#ifdef _SC_SYSTEM_DATABASE - { "_POSIX_SYSTEM_DATABASE", _SC_SYSTEM_DATABASE, SYSCONF }, -#endif -#ifdef _SC_SYSTEM_DATABASE_R - { "_POSIX_SYSTEM_DATABASE_R", _SC_SYSTEM_DATABASE_R, SYSCONF }, -#endif -#ifdef _SC_TIMEOUTS - { "_POSIX_TIMEOUTS", _SC_TIMEOUTS, SYSCONF }, -#endif -#ifdef _SC_TYPED_MEMORY_OBJECTS - { "_POSIX_TYPED_MEMORY_OBJECTS", _SC_TYPED_MEMORY_OBJECTS, SYSCONF }, -#endif -#ifdef _SC_USER_GROUPS - { "_POSIX_USER_GROUPS", _SC_USER_GROUPS, SYSCONF }, -#endif -#ifdef _SC_USER_GROUPS_R - { "_POSIX_USER_GROUPS_R", _SC_USER_GROUPS_R, SYSCONF }, -#endif -#ifdef _SC_2_PBS - { "POSIX2_PBS", _SC_2_PBS, SYSCONF }, -#endif -#ifdef _SC_2_PBS_ACCOUNTING - { "POSIX2_PBS_ACCOUNTING", _SC_2_PBS_ACCOUNTING, SYSCONF }, -#endif -#ifdef _SC_2_PBS_LOCATE - { "POSIX2_PBS_LOCATE", _SC_2_PBS_LOCATE, SYSCONF }, -#endif -#ifdef _SC_2_PBS_TRACK - { "POSIX2_PBS_TRACK", _SC_2_PBS_TRACK, SYSCONF }, -#endif -#ifdef _SC_2_PBS_MESSAGE - { "POSIX2_PBS_MESSAGE", _SC_2_PBS_MESSAGE, SYSCONF }, -#endif -#ifdef _SC_SYMLOOP_MAX - { "SYMLOOP_MAX", _SC_SYMLOOP_MAX, SYSCONF }, -#endif -#ifdef _SC_STREAM_MAX - { "STREAM_MAX", _SC_STREAM_MAX, SYSCONF }, -#endif -#ifdef _SC_AIO_LISTIO_MAX - { "AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX, SYSCONF }, -#endif -#ifdef _SC_AIO_MAX - { "AIO_MAX", _SC_AIO_MAX, SYSCONF }, -#endif -#ifdef _SC_AIO_PRIO_DELTA_MAX - { "AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX, SYSCONF }, -#endif -#ifdef _SC_DELAYTIMER_MAX - { "DELAYTIMER_MAX", _SC_DELAYTIMER_MAX, SYSCONF }, -#endif -#ifdef _SC_HOST_NAME_MAX - { "HOST_NAME_MAX", _SC_HOST_NAME_MAX, SYSCONF }, -#endif -#ifdef _SC_LOGIN_NAME_MAX - { "LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX, SYSCONF }, -#endif -#ifdef _SC_MQ_OPEN_MAX - { "MQ_OPEN_MAX", _SC_MQ_OPEN_MAX, SYSCONF }, -#endif -#ifdef _SC_MQ_PRIO_MAX - { "MQ_PRIO_MAX", _SC_MQ_PRIO_MAX, SYSCONF }, -#endif -#ifdef _SC_DEVICE_IO - { "_POSIX_DEVICE_IO", _SC_DEVICE_IO, SYSCONF }, -#endif -#ifdef _SC_TRACE - { "_POSIX_TRACE", _SC_TRACE, SYSCONF }, -#endif -#ifdef _SC_TRACE_EVENT_FILTER - { "_POSIX_TRACE_EVENT_FILTER", _SC_TRACE_EVENT_FILTER, SYSCONF }, -#endif -#ifdef _SC_TRACE_INHERIT - { "_POSIX_TRACE_INHERIT", _SC_TRACE_INHERIT, SYSCONF }, -#endif -#ifdef _SC_TRACE_LOG - { "_POSIX_TRACE_LOG", _SC_TRACE_LOG, SYSCONF }, -#endif -#ifdef _SC_RTSIG_MAX - { "RTSIG_MAX", _SC_RTSIG_MAX, SYSCONF }, -#endif -#ifdef _SC_SEM_NSEMS_MAX - { "SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX, SYSCONF }, -#endif -#ifdef _SC_SEM_VALUE_MAX - { "SEM_VALUE_MAX", _SC_SEM_VALUE_MAX, SYSCONF }, -#endif -#ifdef _SC_SIGQUEUE_MAX - { "SIGQUEUE_MAX", _SC_SIGQUEUE_MAX, SYSCONF }, -#endif -#ifdef _PC_FILESIZEBITS - { "FILESIZEBITS", _PC_FILESIZEBITS, PATHCONF }, -#endif -#ifdef _PC_ALLOC_SIZE_MIN - { "POSIX_ALLOC_SIZE_MIN", _PC_ALLOC_SIZE_MIN, PATHCONF }, -#endif -#ifdef _PC_REC_INCR_XFER_SIZE - { "POSIX_REC_INCR_XFER_SIZE", _PC_REC_INCR_XFER_SIZE, PATHCONF }, -#endif -#ifdef _PC_REC_MAX_XFER_SIZE - { "POSIX_REC_MAX_XFER_SIZE", _PC_REC_MAX_XFER_SIZE, PATHCONF }, -#endif -#ifdef _PC_REC_MIN_XFER_SIZE - { "POSIX_REC_MIN_XFER_SIZE", _PC_REC_MIN_XFER_SIZE, PATHCONF }, -#endif -#ifdef _PC_REC_XFER_ALIGN - { "POSIX_REC_XFER_ALIGN", _PC_REC_XFER_ALIGN, PATHCONF }, -#endif -#ifdef _PC_SYMLINK_MAX - { "SYMLINK_MAX", _PC_SYMLINK_MAX, PATHCONF }, -#endif -#ifdef _CS_GNU_LIBC_VERSION - { "GNU_LIBC_VERSION", _CS_GNU_LIBC_VERSION, CONFSTR }, -#endif -#ifdef _CS_GNU_LIBPTHREAD_VERSION - { "GNU_LIBPTHREAD_VERSION", _CS_GNU_LIBPTHREAD_VERSION, CONFSTR }, -#endif -#ifdef _PC_2_SYMLINKS - { "POSIX2_SYMLINKS", _PC_2_SYMLINKS, PATHCONF }, -#endif - -#ifdef _SC_LEVEL1_ICACHE_SIZE - { "LEVEL1_ICACHE_SIZE", _SC_LEVEL1_ICACHE_SIZE, SYSCONF }, -#endif -#ifdef _SC_LEVEL1_ICACHE_ASSOC - { "LEVEL1_ICACHE_ASSOC", _SC_LEVEL1_ICACHE_ASSOC, SYSCONF }, -#endif -#ifdef _SC_LEVEL1_ICACHE_LINESIZE - { "LEVEL1_ICACHE_LINESIZE", _SC_LEVEL1_ICACHE_LINESIZE, SYSCONF }, -#endif -#ifdef _SC_LEVEL1_DCACHE_SIZE - { "LEVEL1_DCACHE_SIZE", _SC_LEVEL1_DCACHE_SIZE, SYSCONF }, -#endif -#ifdef _SC_LEVEL1_DCACHE_ASSOC - { "LEVEL1_DCACHE_ASSOC", _SC_LEVEL1_DCACHE_ASSOC, SYSCONF }, -#endif -#ifdef _SC_LEVEL1_DCACHE_LINESIZE - { "LEVEL1_DCACHE_LINESIZE", _SC_LEVEL1_DCACHE_LINESIZE, SYSCONF }, -#endif -#ifdef _SC_LEVEL2_CACHE_SIZE - { "LEVEL2_CACHE_SIZE", _SC_LEVEL2_CACHE_SIZE, SYSCONF }, -#endif -#ifdef _SC_LEVEL2_CACHE_ASSOC - { "LEVEL2_CACHE_ASSOC", _SC_LEVEL2_CACHE_ASSOC, SYSCONF }, -#endif -#ifdef _SC_LEVEL2_CACHE_LINESIZE - { "LEVEL2_CACHE_LINESIZE", _SC_LEVEL2_CACHE_LINESIZE, SYSCONF }, -#endif -#ifdef _SC_LEVEL3_CACHE_SIZE - { "LEVEL3_CACHE_SIZE", _SC_LEVEL3_CACHE_SIZE, SYSCONF }, -#endif -#ifdef _SC_LEVEL3_CACHE_ASSOC - { "LEVEL3_CACHE_ASSOC", _SC_LEVEL3_CACHE_ASSOC, SYSCONF }, -#endif -#ifdef _SC_LEVEL3_CACHE_LINESIZE - { "LEVEL3_CACHE_LINESIZE", _SC_LEVEL3_CACHE_LINESIZE, SYSCONF }, -#endif -#ifdef _SC_LEVEL4_CACHE_SIZE - { "LEVEL4_CACHE_SIZE", _SC_LEVEL4_CACHE_SIZE, SYSCONF }, -#endif -#ifdef _SC_LEVEL4_CACHE_ASSOC - { "LEVEL4_CACHE_ASSOC", _SC_LEVEL4_CACHE_ASSOC, SYSCONF }, -#endif -#ifdef _SC_LEVEL4_CACHE_LINESIZE - { "LEVEL4_CACHE_LINESIZE", _SC_LEVEL4_CACHE_LINESIZE, SYSCONF }, -#endif - -#ifdef _SC_IPV6 - { "IPV6", _SC_IPV6, SYSCONF }, -#endif -#ifdef _SC_RAW_SOCKETS - { "RAW_SOCKETS", _SC_RAW_SOCKETS, SYSCONF }, -#endif - - { NULL, 0, SYSCONF } - }; - - -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]); - -#ifdef __UCLIBC_HAS___PROGNAME__ -extern const char *__progname; -#else -#define __progname "foo" -#endif - -static void -usage (void) -{ - fprintf (stderr, - _("Usage: %s [-v specification] variable_name [pathname]\n"), - __progname); - fprintf (stderr, - _(" %s -a [pathname]\n"), __progname); - exit (2); -} - - -static void -print_all (const char *path) -{ - register const struct conf *c; - size_t clen; - long int value; - char *cvalue; - for (c = vars; c->name != NULL; ++c) { - printf("%-35s", c->name); - switch (c->call) { - case PATHCONF: - value = pathconf (path, c->call_name); - if (value != -1) { - printf("%ld", value); - } - printf("\n"); - break; - case SYSCONF: - value = sysconf (c->call_name); - if (value == -1l) { - if (c->call_name == _SC_UINT_MAX - || c->call_name == _SC_ULONG_MAX) - printf ("%lu", value); - } - else { - printf ("%ld", value); - } - printf ("\n"); - break; - case CONFSTR: - clen = confstr (c->call_name, (char *) NULL, 0); - cvalue = (char *) malloc (clen); - if (cvalue == NULL) - error (3, 0, _("memory exhausted")); - if (confstr (c->call_name, cvalue, clen) != clen) - error (3, errno, "confstr"); - printf ("%.*s\n", (int) clen, cvalue); - free (cvalue); - break; - } - } - exit (0); -} - -int -main (int argc, char *argv[]) -{ - register const struct conf *c; - - /* Set locale. Do not set LC_ALL because the other categories must - not be affected (according to POSIX.2). */ - - /* Initialize the message catalog. */ - - if (argc > 1 && strcmp (argv[1], "--version") == 0) - { - printf ("getconf (GNU %s) %s\n", PACKAGE, VERSION); - printf ("\ -Copyright (C) %s Free Software Foundation, Inc.\n\ -This is free software; see the source for copying conditions. There is NO\n\ -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ -", "2009"); - printf ("Written by %s.\n", "Roland McGrath"); - return 0; - } - - if (argc > 1 && strcmp (argv[1], "--help") == 0) - { - printf ("\ -Usage: getconf [-v SPEC] VAR\n\ - or: getconf [-v SPEC] PATH_VAR PATH\n\ -\n\ -Get the configuration value for variable VAR, or for variable PATH_VAR\n\ -for path PATH. If SPEC is given, give values for compilation\n\ -environment SPEC.\n\n"); - fputs ("For bug reporting instructions, please see:\n\ -.\n", stdout); - return 0; - } - - const char *getconf_dir = getenv ("GETCONF_DIR") ?: GETCONF_DIR; - size_t getconf_dirlen = strlen (getconf_dir); - - const char *spec = NULL; - char buf[sizeof "POSIX_V6_LPBIG_OFFBIG"]; - char *argv0 = argv[0]; - if (argc > 1 && strncmp (argv[1], "-v", 2) == 0) - { - if (argv[1][2] == '\0') - { - if (argc < 3) - usage (); - - spec = argv[2]; - argv += 2; - argc -= 2; - } - else - { - spec = &argv[1][2]; - argv += 1; - argc += 1; - } - } - else - { - char default_name[getconf_dirlen + sizeof "/default"]; - memcpy (mempcpy (default_name, getconf_dir, getconf_dirlen), - "/default", sizeof "/default"); - int len = readlink (default_name, buf, sizeof buf - 1); - if (len > 0) - { - buf[len] = '\0'; - spec = buf; - } - } - - /* Check for the specifications we know. */ - if (spec != NULL) - { - int i; - for (i = 0; i < nspecs; ++i) - if (strcmp (spec, specs[i].name) == 0) - break; - - if (i == nspecs) - error (2, 0, _("unknown specification \"%s\""), spec); - - switch (specs[i].num) - { -#ifndef _XBS5_ILP32_OFF32 - case _SC_XBS5_ILP32_OFF32: -#endif -#ifndef _XBS5_ILP32_OFFBIG - case _SC_XBS5_ILP32_OFFBIG: -#endif -#ifndef _XBS5_LP64_OFF64 - case _SC_XBS5_LP64_OFF64: -#endif -#ifndef _XBS5_LPBIG_OFFBIG - case _SC_XBS5_LPBIG_OFFBIG: -#endif -#ifndef _POSIX_V6_ILP32_OFF32 - case _SC_V6_ILP32_OFF32: -#endif -#ifndef _POSIX_V6_ILP32_OFFBIG - case _SC_V6_ILP32_OFFBIG: -#endif -#ifndef _POSIX_V6_LP64_OFF64 - case _SC_V6_LP64_OFF64: -#endif -#ifndef _POSIX_V6_LPBIG_OFFBIG - case _SC_V6_LPBIG_OFFBIG: -#endif -#ifndef _POSIX_V7_ILP32_OFF32 - case _SC_V7_ILP32_OFF32: -#endif -#ifndef _POSIX_V7_ILP32_OFFBIG - case _SC_V7_ILP32_OFFBIG: -#endif -#ifndef _POSIX_V7_LP64_OFF64 - case _SC_V7_LP64_OFF64: -#endif -#ifndef _POSIX_V7_LPBIG_OFFBIG - case _SC_V7_LPBIG_OFFBIG: -#endif - { - const char *args[argc + 3]; - size_t spec_len = strlen (spec); - char getconf_name[getconf_dirlen + 1 + spec_len + 1]; - memcpy (mempcpy (mempcpy (getconf_name, getconf_dir, - getconf_dirlen), - "/", 1), spec, spec_len + 1); - args[0] = argv0; - args[1] = "-v"; - args[2] = spec; - memcpy (&args[3], &argv[1], argc * sizeof (argv[1])); - execv (getconf_name, (char * const *) args); - error (4, errno, _("Couldn't execute %s"), getconf_name); - } - default: - break; - } - } - - if (argc > 1 && strcmp (argv[1], "-a") == 0) - { - if (argc == 2) - print_all ("/"); - else if (argc == 3) - print_all (argv[2]); - else - usage (); - } - - int ai = 1; - if (argc > ai && strcmp (argv[ai], "--") == 0) - ++ai; - - if (argc - ai < 1 || argc - ai > 2) - usage (); - - for (c = vars; c->name != NULL; ++c) - if (strcmp (c->name, argv[ai]) == 0 - || (strncmp (c->name, "_POSIX_", 7) == 0 - && strcmp (c->name + 7, argv[ai]) == 0)) - { - long int value; - size_t clen; - char *cvalue; - switch (c->call) - { - case PATHCONF: - if (argc - ai < 2) - usage (); - errno = 0; - value = pathconf (argv[ai + 1], c->call_name); - if (value == -1) - { - if (errno) { - error (3, errno, "pathconf: %s", argv[ai + 1]); - } else - puts (_("undefined")); - } - else - printf ("%ld\n", value); - exit (0); - - case SYSCONF: - if (argc - ai > 1) - usage (); - value = sysconf (c->call_name); - if (value == -1l) - { - if (c->call_name == _SC_UINT_MAX - || c->call_name == _SC_ULONG_MAX) - printf ("%lu\n", value); - else - puts (_("undefined")); - } - else - printf ("%ld\n", value); - exit (0); - - case CONFSTR: - if (argc - ai > 1) - usage (); - clen = confstr (c->call_name, (char *) NULL, 0); - cvalue = (char *) malloc (clen); - if (cvalue == NULL) - error (3, 0, _("memory exhausted")); - - if (confstr (c->call_name, cvalue, clen) != clen) - error (3, errno, "confstr"); - - printf ("%.*s\n", (int) clen, cvalue); - exit (0); - } - } - - error (2, 0, _("Unrecognized variable `%s'"), argv[ai]); - /* NOTREACHED */ - return 2; -} diff --git a/utils/Makefile.in b/utils/Makefile.in index 2aae1df71..89cb800e9 100644 --- a/utils/Makefile.in +++ b/utils/Makefile.in @@ -40,7 +40,8 @@ CFLAGS-iconv := $(CFLAGS-utils) \ -DL_iconv_main \ CFLAGS-locale := $(CFLAGS-utils) - +CFLAGS-getconf :=$(CFLAGS-utils) \ + -DGETCONF_DIR='"$(CURDIR)"' # "make hostutils" flags @@ -76,6 +77,7 @@ utils_OUT := $(top_builddir)utils DEPS-ldconfig := $(utils_DIR)/chroot_realpath.c DEPS-ldconfig.host := $(DEPS-ldconfig) +utils_OBJ := getconf ifeq ($(HAVE_SHARED),y) utils_OBJ += ldconfig ldd endif @@ -115,6 +117,7 @@ install-y += utils_install # This installs both utils and hostutils, so doesn't depend on either. utils_install: $(addsuffix $(DOTHOST), $(utils_OBJ) $(utils_LOCALE_OBJ)) + $(Q)$(INSTALL) -D -m 755 $(utils_OUT)/getconf$(DOTHOST) $(PREFIX)$(DEVEL_PREFIX)usr/bin/getconf ifeq ($(HAVE_SHARED),y) $(Q)$(INSTALL) -D -m 755 $(utils_OUT)/ldd$(DOTHOST) $(PREFIX)$(DEVEL_PREFIX)bin/ldd $(Q)$(INSTALL) -D -m 755 $(utils_OUT)/ldconfig$(DOTHOST) $(PREFIX)$(RUNTIME_PREFIX)sbin/ldconfig @@ -128,6 +131,6 @@ endif objclean-y += CLEAN_utils CLEAN_utils: - $(do_rm) $(addprefix $(utils_OUT)/, ldconfig ldd iconv locale *.host) + $(do_rm) $(addprefix $(utils_OUT)/, getconf iconv ldconfig ldd locale *.host) $(Q)# This is a hack.. $(Q)$(RM) $(utils_OUT)/.*.dep diff --git a/utils/getconf.c b/utils/getconf.c new file mode 100644 index 000000000..81566df7b --- /dev/null +++ b/utils/getconf.c @@ -0,0 +1,1313 @@ +/* Copyright (C) 1991, 92, 1995-2008, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published + by the Free Software Foundation; version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include +#include + +#define PACKAGE "getconf regression test" +#define VERSION "" +#ifndef _ +# define _ +#endif +#define error(status, errnum,...) \ + {fprintf(stderr, __VA_ARGS__); exit(status);} + + +struct conf + { + const char *name; + const int call_name; + const enum { SYSCONF, CONFSTR, PATHCONF } call; + }; + +static const struct conf vars[] = + { +#ifdef _PC_LINK_MAX + { "LINK_MAX", _PC_LINK_MAX, PATHCONF }, +#endif +#ifdef _PC_LINK_MAX + { "_POSIX_LINK_MAX", _PC_LINK_MAX, PATHCONF }, +#endif +#ifdef _PC_MAX_CANON + { "MAX_CANON", _PC_MAX_CANON, PATHCONF }, +#endif +#ifdef _PC_MAX_CANON + { "_POSIX_MAX_CANON", _PC_MAX_CANON, PATHCONF }, +#endif +#ifdef _PC_MAX_INPUT + { "MAX_INPUT", _PC_MAX_INPUT, PATHCONF }, +#endif +#ifdef _PC_MAX_INPUT + { "_POSIX_MAX_INPUT", _PC_MAX_INPUT, PATHCONF }, +#endif +#ifdef _PC_NAME_MAX + { "NAME_MAX", _PC_NAME_MAX, PATHCONF }, +#endif +#ifdef _PC_NAME_MAX + { "_POSIX_NAME_MAX", _PC_NAME_MAX, PATHCONF }, +#endif +#ifdef _PC_PATH_MAX + { "PATH_MAX", _PC_PATH_MAX, PATHCONF }, +#endif +#ifdef _PC_PATH_MAX + { "_POSIX_PATH_MAX", _PC_PATH_MAX, PATHCONF }, +#endif +#ifdef _PC_PIPE_BUF + { "PIPE_BUF", _PC_PIPE_BUF, PATHCONF }, +#endif +#ifdef _PC_PIPE_BUF + { "_POSIX_PIPE_BUF", _PC_PIPE_BUF, PATHCONF }, +#endif +#ifdef _PC_SOCK_MAXBUF + { "SOCK_MAXBUF", _PC_SOCK_MAXBUF, PATHCONF }, +#endif +#ifdef _PC_ASYNC_IO + { "_POSIX_ASYNC_IO", _PC_ASYNC_IO, PATHCONF }, +#endif +#ifdef _PC_CHOWN_RESTRICTED + { "_POSIX_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED, PATHCONF }, +#endif +#ifdef _PC_NO_TRUNC + { "_POSIX_NO_TRUNC", _PC_NO_TRUNC, PATHCONF }, +#endif +#ifdef _PC_PRIO_IO + { "_POSIX_PRIO_IO", _PC_PRIO_IO, PATHCONF }, +#endif +#ifdef _PC_SYNC_IO + { "_POSIX_SYNC_IO", _PC_SYNC_IO, PATHCONF }, +#endif +#ifdef _PC_VDISABLE + { "_POSIX_VDISABLE", _PC_VDISABLE, PATHCONF }, +#endif + +#ifdef _SC_ARG_MAX + { "ARG_MAX", _SC_ARG_MAX, SYSCONF }, +#endif +#ifdef _SC_ATEXIT_MAX + { "ATEXIT_MAX", _SC_ATEXIT_MAX, SYSCONF }, +#endif +#ifdef _SC_CHAR_BIT + { "CHAR_BIT", _SC_CHAR_BIT, SYSCONF }, +#endif +#ifdef _SC_CHAR_MAX + { "CHAR_MAX", _SC_CHAR_MAX, SYSCONF }, +#endif +#ifdef _SC_CHAR_MIN + { "CHAR_MIN", _SC_CHAR_MIN, SYSCONF }, +#endif +#ifdef _SC_CHILD_MAX + { "CHILD_MAX", _SC_CHILD_MAX, SYSCONF }, +#endif +#ifdef _SC_CLK_TCK + { "CLK_TCK", _SC_CLK_TCK, SYSCONF }, +#endif +#ifdef _SC_INT_MAX + { "INT_MAX", _SC_INT_MAX, SYSCONF }, +#endif +#ifdef _SC_INT_MIN + { "INT_MIN", _SC_INT_MIN, SYSCONF }, +#endif +#ifdef _SC_UIO_MAXIOV + { "IOV_MAX", _SC_UIO_MAXIOV, SYSCONF }, +#endif +#ifdef _SC_LOGIN_NAME_MAX + { "LOGNAME_MAX", _SC_LOGIN_NAME_MAX, SYSCONF }, +#endif +#ifdef _SC_LONG_BIT + { "LONG_BIT", _SC_LONG_BIT, SYSCONF }, +#endif +#ifdef _SC_MB_LEN_MAX + { "MB_LEN_MAX", _SC_MB_LEN_MAX, SYSCONF }, +#endif +#ifdef _SC_NGROUPS_MAX + { "NGROUPS_MAX", _SC_NGROUPS_MAX, SYSCONF }, +#endif +#ifdef _SC_NL_ARGMAX + { "NL_ARGMAX", _SC_NL_ARGMAX, SYSCONF }, +#endif +#ifdef _SC_NL_LANGMAX + { "NL_LANGMAX", _SC_NL_LANGMAX, SYSCONF }, +#endif +#ifdef _SC_NL_MSGMAX + { "NL_MSGMAX", _SC_NL_MSGMAX, SYSCONF }, +#endif +#ifdef _SC_NL_NMAX + { "NL_NMAX", _SC_NL_NMAX, SYSCONF }, +#endif +#ifdef _SC_NL_SETMAX + { "NL_SETMAX", _SC_NL_SETMAX, SYSCONF }, +#endif +#ifdef _SC_NL_TEXTMAX + { "NL_TEXTMAX", _SC_NL_TEXTMAX, SYSCONF }, +#endif +#ifdef _SC_GETGR_R_SIZE_MAX + { "NSS_BUFLEN_GROUP", _SC_GETGR_R_SIZE_MAX, SYSCONF }, +#endif +#ifdef _SC_GETPW_R_SIZE_MAX + { "NSS_BUFLEN_PASSWD", _SC_GETPW_R_SIZE_MAX, SYSCONF }, +#endif +#ifdef _SC_NZERO + { "NZERO", _SC_NZERO, SYSCONF }, +#endif +#ifdef _SC_OPEN_MAX + { "OPEN_MAX", _SC_OPEN_MAX, SYSCONF }, +#endif +#ifdef _SC_PAGESIZE + { "PAGESIZE", _SC_PAGESIZE, SYSCONF }, +#endif +#ifdef _SC_PAGESIZE + { "PAGE_SIZE", _SC_PAGESIZE, SYSCONF }, +#endif +#ifdef _SC_PASS_MAX + { "PASS_MAX", _SC_PASS_MAX, SYSCONF }, +#endif +#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS + { "PTHREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS, SYSCONF }, +#endif +#ifdef _SC_THREAD_KEYS_MAX + { "PTHREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX, SYSCONF }, +#endif +#ifdef _SC_THREAD_STACK_MIN + { "PTHREAD_STACK_MIN", _SC_THREAD_STACK_MIN, SYSCONF }, +#endif +#ifdef _SC_THREAD_THREADS_MAX + { "PTHREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX, SYSCONF }, +#endif +#ifdef _SC_SCHAR_MAX + { "SCHAR_MAX", _SC_SCHAR_MAX, SYSCONF }, +#endif +#ifdef _SC_SCHAR_MIN + { "SCHAR_MIN", _SC_SCHAR_MIN, SYSCONF }, +#endif +#ifdef _SC_SHRT_MAX + { "SHRT_MAX", _SC_SHRT_MAX, SYSCONF }, +#endif +#ifdef _SC_SHRT_MIN + { "SHRT_MIN", _SC_SHRT_MIN, SYSCONF }, +#endif +#ifdef _SC_SSIZE_MAX + { "SSIZE_MAX", _SC_SSIZE_MAX, SYSCONF }, +#endif +#ifdef _SC_TTY_NAME_MAX + { "TTY_NAME_MAX", _SC_TTY_NAME_MAX, SYSCONF }, +#endif +#ifdef _SC_TZNAME_MAX + { "TZNAME_MAX", _SC_TZNAME_MAX, SYSCONF }, +#endif +#ifdef _SC_UCHAR_MAX + { "UCHAR_MAX", _SC_UCHAR_MAX, SYSCONF }, +#endif +#ifdef _SC_UINT_MAX + { "UINT_MAX", _SC_UINT_MAX, SYSCONF }, +#endif +#ifdef _SC_UIO_MAXIOV + { "UIO_MAXIOV", _SC_UIO_MAXIOV, SYSCONF }, +#endif +#ifdef _SC_ULONG_MAX + { "ULONG_MAX", _SC_ULONG_MAX, SYSCONF }, +#endif +#ifdef _SC_USHRT_MAX + { "USHRT_MAX", _SC_USHRT_MAX, SYSCONF }, +#endif +#ifdef _SC_WORD_BIT + { "WORD_BIT", _SC_WORD_BIT, SYSCONF }, +#endif +#ifdef _SC_AVPHYS_PAGES + { "_AVPHYS_PAGES", _SC_AVPHYS_PAGES, SYSCONF }, +#endif +#ifdef _SC_NPROCESSORS_CONF + { "_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF, SYSCONF }, +#endif +#ifdef _SC_NPROCESSORS_ONLN + { "_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN, SYSCONF }, +#endif +#ifdef _SC_PHYS_PAGES + { "_PHYS_PAGES", _SC_PHYS_PAGES, SYSCONF }, +#endif +#ifdef _SC_ARG_MAX + { "_POSIX_ARG_MAX", _SC_ARG_MAX, SYSCONF }, +#endif +#ifdef _SC_ASYNCHRONOUS_IO + { "_POSIX_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO, SYSCONF }, +#endif +#ifdef _SC_CHILD_MAX + { "_POSIX_CHILD_MAX", _SC_CHILD_MAX, SYSCONF }, +#endif +#ifdef _SC_FSYNC + { "_POSIX_FSYNC", _SC_FSYNC, SYSCONF }, +#endif +#ifdef _SC_JOB_CONTROL + { "_POSIX_JOB_CONTROL", _SC_JOB_CONTROL, SYSCONF }, +#endif +#ifdef _SC_MAPPED_FILES + { "_POSIX_MAPPED_FILES", _SC_MAPPED_FILES, SYSCONF }, +#endif +#ifdef _SC_MEMLOCK + { "_POSIX_MEMLOCK", _SC_MEMLOCK, SYSCONF }, +#endif +#ifdef _SC_MEMLOCK_RANGE + { "_POSIX_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE, SYSCONF }, +#endif +#ifdef _SC_MEMORY_PROTECTION + { "_POSIX_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION, SYSCONF }, +#endif +#ifdef _SC_MESSAGE_PASSING + { "_POSIX_MESSAGE_PASSING", _SC_MESSAGE_PASSING, SYSCONF }, +#endif +#ifdef _SC_NGROUPS_MAX + { "_POSIX_NGROUPS_MAX", _SC_NGROUPS_MAX, SYSCONF }, +#endif +#ifdef _SC_OPEN_MAX + { "_POSIX_OPEN_MAX", _SC_OPEN_MAX, SYSCONF }, +#endif +#ifdef _SC_PII + { "_POSIX_PII", _SC_PII, SYSCONF }, +#endif +#ifdef _SC_PII_INTERNET + { "_POSIX_PII_INTERNET", _SC_PII_INTERNET, SYSCONF }, +#endif +#ifdef _SC_PII_INTERNET_DGRAM + { "_POSIX_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM, SYSCONF }, +#endif +#ifdef _SC_PII_INTERNET_STREAM + { "_POSIX_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM, SYSCONF }, +#endif +#ifdef _SC_PII_OSI + { "_POSIX_PII_OSI", _SC_PII_OSI, SYSCONF }, +#endif +#ifdef _SC_PII_OSI_CLTS + { "_POSIX_PII_OSI_CLTS", _SC_PII_OSI_CLTS, SYSCONF }, +#endif +#ifdef _SC_PII_OSI_COTS + { "_POSIX_PII_OSI_COTS", _SC_PII_OSI_COTS, SYSCONF }, +#endif +#ifdef _SC_PII_OSI_M + { "_POSIX_PII_OSI_M", _SC_PII_OSI_M, SYSCONF }, +#endif +#ifdef _SC_PII_SOCKET + { "_POSIX_PII_SOCKET", _SC_PII_SOCKET, SYSCONF }, +#endif +#ifdef _SC_PII_XTI + { "_POSIX_PII_XTI", _SC_PII_XTI, SYSCONF }, +#endif +#ifdef _SC_POLL + { "_POSIX_POLL", _SC_POLL, SYSCONF }, +#endif +#ifdef _SC_PRIORITIZED_IO + { "_POSIX_PRIORITIZED_IO", _SC_PRIORITIZED_IO, SYSCONF }, +#endif +#ifdef _SC_PRIORITY_SCHEDULING + { "_POSIX_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING, SYSCONF }, +#endif +#ifdef _SC_REALTIME_SIGNALS + { "_POSIX_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS, SYSCONF }, +#endif +#ifdef _SC_SAVED_IDS + { "_POSIX_SAVED_IDS", _SC_SAVED_IDS, SYSCONF }, +#endif +#ifdef _SC_SELECT + { "_POSIX_SELECT", _SC_SELECT, SYSCONF }, +#endif +#ifdef _SC_SEMAPHORES + { "_POSIX_SEMAPHORES", _SC_SEMAPHORES, SYSCONF }, +#endif +#ifdef _SC_SHARED_MEMORY_OBJECTS + { "_POSIX_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS, SYSCONF }, +#endif +#ifdef _SC_SSIZE_MAX + { "_POSIX_SSIZE_MAX", _SC_SSIZE_MAX, SYSCONF }, +#endif +#ifdef _SC_STREAM_MAX + { "_POSIX_STREAM_MAX", _SC_STREAM_MAX, SYSCONF }, +#endif +#ifdef _SC_SYNCHRONIZED_IO + { "_POSIX_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO, SYSCONF }, +#endif +#ifdef _SC_THREADS + { "_POSIX_THREADS", _SC_THREADS, SYSCONF }, +#endif +#ifdef _SC_THREAD_ATTR_STACKADDR + { "_POSIX_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR, SYSCONF }, +#endif +#ifdef _SC_THREAD_ATTR_STACKSIZE + { "_POSIX_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE, SYSCONF }, +#endif +#ifdef _SC_THREAD_PRIORITY_SCHEDULING + { "_POSIX_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING, SYSCONF }, +#endif +#ifdef _SC_THREAD_PRIO_INHERIT + { "_POSIX_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT, SYSCONF }, +#endif +#ifdef _SC_THREAD_PRIO_PROTECT + { "_POSIX_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT, SYSCONF }, +#endif +#ifdef _SC_THREAD_ROBUST_PRIO_INHERIT + { "_POSIX_THREAD_ROBUST_PRIO_INHERIT", _SC_THREAD_ROBUST_PRIO_INHERIT, + SYSCONF }, +#endif +#ifdef _SC_THREAD_ROBUST_PRIO_PROTECT + { "_POSIX_THREAD_ROBUST_PRIO_PROTECT", _SC_THREAD_ROBUST_PRIO_PROTECT, + SYSCONF }, +#endif +#ifdef _SC_THREAD_PROCESS_SHARED + { "_POSIX_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED, SYSCONF }, +#endif +#ifdef _SC_THREAD_SAFE_FUNCTIONS + { "_POSIX_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS, SYSCONF }, +#endif +#ifdef _SC_TIMERS + { "_POSIX_TIMERS", _SC_TIMERS, SYSCONF }, +#endif +#ifdef _SC_TIMER_MAX + { "TIMER_MAX", _SC_TIMER_MAX, SYSCONF }, +#endif +#ifdef _SC_TZNAME_MAX + { "_POSIX_TZNAME_MAX", _SC_TZNAME_MAX, SYSCONF }, +#endif +#ifdef _SC_VERSION + { "_POSIX_VERSION", _SC_VERSION, SYSCONF }, +#endif +#ifdef _SC_T_IOV_MAX + { "_T_IOV_MAX", _SC_T_IOV_MAX, SYSCONF }, +#endif +#ifdef _SC_XOPEN_CRYPT + { "_XOPEN_CRYPT", _SC_XOPEN_CRYPT, SYSCONF }, +#endif +#ifdef _SC_XOPEN_ENH_I18N + { "_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N, SYSCONF }, +#endif +#ifdef _SC_XOPEN_LEGACY + { "_XOPEN_LEGACY", _SC_XOPEN_LEGACY, SYSCONF }, +#endif +#ifdef _SC_XOPEN_REALTIME + { "_XOPEN_REALTIME", _SC_XOPEN_REALTIME, SYSCONF }, +#endif +#ifdef _SC_XOPEN_REALTIME_THREADS + { "_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS, SYSCONF }, +#endif +#ifdef _SC_XOPEN_SHM + { "_XOPEN_SHM", _SC_XOPEN_SHM, SYSCONF }, +#endif +#ifdef _SC_XOPEN_UNIX + { "_XOPEN_UNIX", _SC_XOPEN_UNIX, SYSCONF }, +#endif +#ifdef _SC_XOPEN_VERSION + { "_XOPEN_VERSION", _SC_XOPEN_VERSION, SYSCONF }, +#endif +#ifdef _SC_XOPEN_XCU_VERSION + { "_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION, SYSCONF }, +#endif +#ifdef _SC_XOPEN_XPG2 + { "_XOPEN_XPG2", _SC_XOPEN_XPG2, SYSCONF }, +#endif +#ifdef _SC_XOPEN_XPG3 + { "_XOPEN_XPG3", _SC_XOPEN_XPG3, SYSCONF }, +#endif +#ifdef _SC_XOPEN_XPG4 + { "_XOPEN_XPG4", _SC_XOPEN_XPG4, SYSCONF }, +#endif + /* POSIX.2 */ +#ifdef _SC_BC_BASE_MAX + { "BC_BASE_MAX", _SC_BC_BASE_MAX, SYSCONF }, +#endif +#ifdef _SC_BC_DIM_MAX + { "BC_DIM_MAX", _SC_BC_DIM_MAX, SYSCONF }, +#endif +#ifdef _SC_BC_SCALE_MAX + { "BC_SCALE_MAX", _SC_BC_SCALE_MAX, SYSCONF }, +#endif +#ifdef _SC_BC_STRING_MAX + { "BC_STRING_MAX", _SC_BC_STRING_MAX, SYSCONF }, +#endif + { "CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX, SYSCONF }, +#ifdef _SC_COLL_WEIGHTS_MAX + { "COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX, SYSCONF }, +#endif +#ifdef _SC_EQUIV_CLASS_MAX + { "EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX, SYSCONF }, +#endif +#ifdef _SC_EXPR_NEST_MAX + { "EXPR_NEST_MAX", _SC_EXPR_NEST_MAX, SYSCONF }, +#endif +#ifdef _SC_LINE_MAX + { "LINE_MAX", _SC_LINE_MAX, SYSCONF }, +#endif +#ifdef _SC_BC_BASE_MAX + { "POSIX2_BC_BASE_MAX", _SC_BC_BASE_MAX, SYSCONF }, +#endif +#ifdef _SC_BC_DIM_MAX + { "POSIX2_BC_DIM_MAX", _SC_BC_DIM_MAX, SYSCONF }, +#endif +#ifdef _SC_BC_SCALE_MAX + { "POSIX2_BC_SCALE_MAX", _SC_BC_SCALE_MAX, SYSCONF }, +#endif +#ifdef _SC_BC_STRING_MAX + { "POSIX2_BC_STRING_MAX", _SC_BC_STRING_MAX, SYSCONF }, +#endif +#ifdef _SC_2_CHAR_TERM + { "POSIX2_CHAR_TERM", _SC_2_CHAR_TERM, SYSCONF }, +#endif +#ifdef _SC_COLL_WEIGHTS_MAX + { "POSIX2_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX, SYSCONF }, +#endif +#ifdef _SC_2_C_BIND + { "POSIX2_C_BIND", _SC_2_C_BIND, SYSCONF }, +#endif +#ifdef _SC_2_C_DEV + { "POSIX2_C_DEV", _SC_2_C_DEV, SYSCONF }, +#endif +#ifdef _SC_2_C_VERSION + { "POSIX2_C_VERSION", _SC_2_C_VERSION, SYSCONF }, +#endif +#ifdef _SC_EXPR_NEST_MAX + { "POSIX2_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX, SYSCONF }, +#endif +#ifdef _SC_2_FORT_DEV + { "POSIX2_FORT_DEV", _SC_2_FORT_DEV, SYSCONF }, +#endif +#ifdef _SC_2_FORT_RUN + { "POSIX2_FORT_RUN", _SC_2_FORT_RUN, SYSCONF }, +#endif +#ifdef _SC_LINE_MAX + { "_POSIX2_LINE_MAX", _SC_LINE_MAX, SYSCONF }, + { "POSIX2_LINE_MAX", _SC_LINE_MAX, SYSCONF }, +#endif +#ifdef _SC_2_LOCALEDEF + { "POSIX2_LOCALEDEF", _SC_2_LOCALEDEF, SYSCONF }, +#endif +#ifdef _SC_RE_DUP_MAX + { "POSIX2_RE_DUP_MAX", _SC_RE_DUP_MAX, SYSCONF }, +#endif +#ifdef _SC_2_SW_DEV + { "POSIX2_SW_DEV", _SC_2_SW_DEV, SYSCONF }, +#endif +#ifdef _SC_2_UPE + { "POSIX2_UPE", _SC_2_UPE, SYSCONF }, +#endif +#ifdef _SC_2_VERSION + { "POSIX2_VERSION", _SC_2_VERSION, SYSCONF }, +#endif +#ifdef _SC_RE_DUP_MAX + { "RE_DUP_MAX", _SC_RE_DUP_MAX, SYSCONF }, +#endif + +#ifdef _CS_PATH + { "PATH", _CS_PATH, CONFSTR }, + { "CS_PATH", _CS_PATH, CONFSTR }, +#endif + + /* LFS */ +#ifdef _CS_LFS_CFLAGS + { "LFS_CFLAGS", _CS_LFS_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_LFS_LDFLAGS + { "LFS_LDFLAGS", _CS_LFS_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_LFS_LIBS + { "LFS_LIBS", _CS_LFS_LIBS, CONFSTR }, +#endif +#ifdef _CS_LFS_LINTFLAGS + { "LFS_LINTFLAGS", _CS_LFS_LINTFLAGS, CONFSTR }, +#endif +#ifdef _CS_LFS64_CFLAGS + { "LFS64_CFLAGS", _CS_LFS64_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_LFS64_LDFLAGS + { "LFS64_LDFLAGS", _CS_LFS64_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_LFS64_LIBS + { "LFS64_LIBS", _CS_LFS64_LIBS, CONFSTR }, +#endif +#ifdef _CS_LFS64_LINTFLAGS + { "LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS, CONFSTR }, +#endif + + /* Programming environments. */ +#ifdef _CS_V5_WIDTH_RESTRICTED_ENVS + { "_XBS5_WIDTH_RESTRICTED_ENVS", _CS_V5_WIDTH_RESTRICTED_ENVS, CONFSTR }, + { "XBS5_WIDTH_RESTRICTED_ENVS", _CS_V5_WIDTH_RESTRICTED_ENVS, CONFSTR }, +#endif + +#ifdef _SC_XBS5_ILP32_OFF32 + { "_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32, SYSCONF }, +#endif +#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS + { "XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS + { "XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_XBS5_ILP32_OFF32_LIBS + { "XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS, CONFSTR }, +#endif +#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS + { "XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS, CONFSTR }, +#endif + +#ifdef _SC_XBS5_ILP32_OFFBIG + { "_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG, SYSCONF }, +#endif +#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS + { "XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS + { "XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS + { "XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS, CONFSTR }, +#endif +#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS + { "XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS, CONFSTR }, +#endif + +#ifdef _SC_XBS5_LP64_OFF64 + { "_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64, SYSCONF }, +#endif +#ifdef _CS_XBS5_LP64_OFF64_CFLAGS + { "XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS + { "XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_XBS5_LP64_OFF64_LIBS + { "XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS, CONFSTR }, +#endif +#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS + { "XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS, CONFSTR }, +#endif + +#ifdef _SC_XBS5_LPBIG_OFFBIG + { "_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG, SYSCONF }, +#endif +#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS + { "XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS + { "XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS + { "XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS, CONFSTR }, +#endif +#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS + { "XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS, CONFSTR }, +#endif + +#ifdef _SC_V6_ILP32_OFF32 + { "_POSIX_V6_ILP32_OFF32", _SC_V6_ILP32_OFF32, SYSCONF }, +#endif +#ifdef _CS_POSIX_V6_ILP32_OFF32_CFLAGS + { "POSIX_V6_ILP32_OFF32_CFLAGS", _CS_POSIX_V6_ILP32_OFF32_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V6_ILP32_OFF32_LDFLAGS + { "POSIX_V6_ILP32_OFF32_LDFLAGS", _CS_POSIX_V6_ILP32_OFF32_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V6_ILP32_OFF32_LIBS + { "POSIX_V6_ILP32_OFF32_LIBS", _CS_POSIX_V6_ILP32_OFF32_LIBS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS + { "POSIX_V6_ILP32_OFF32_LINTFLAGS", _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS, CONFSTR }, +#endif + +#ifdef _CS_V6_WIDTH_RESTRICTED_ENVS + { "_POSIX_V6_WIDTH_RESTRICTED_ENVS", _CS_V6_WIDTH_RESTRICTED_ENVS, CONFSTR }, + { "POSIX_V6_WIDTH_RESTRICTED_ENVS", _CS_V6_WIDTH_RESTRICTED_ENVS, CONFSTR }, +#endif + +#ifdef _SC_V6_ILP32_OFFBIG + { "_POSIX_V6_ILP32_OFFBIG", _SC_V6_ILP32_OFFBIG, SYSCONF }, +#endif +#ifdef _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS + { "POSIX_V6_ILP32_OFFBIG_CFLAGS", _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS + { "POSIX_V6_ILP32_OFFBIG_LDFLAGS", _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V6_ILP32_OFFBIG_LIBS + { "POSIX_V6_ILP32_OFFBIG_LIBS", _CS_POSIX_V6_ILP32_OFFBIG_LIBS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS + { "POSIX_V6_ILP32_OFFBIG_LINTFLAGS", _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS, CONFSTR }, +#endif + +#ifdef _SC_V6_LP64_OFF64 + { "_POSIX_V6_LP64_OFF64", _SC_V6_LP64_OFF64, SYSCONF }, +#endif +#ifdef _CS_POSIX_V6_LP64_OFF64_CFLAGS + { "POSIX_V6_LP64_OFF64_CFLAGS", _CS_POSIX_V6_LP64_OFF64_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V6_LP64_OFF64_LDFLAGS + { "POSIX_V6_LP64_OFF64_LDFLAGS", _CS_POSIX_V6_LP64_OFF64_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V6_LP64_OFF64_LIBS + { "POSIX_V6_LP64_OFF64_LIBS", _CS_POSIX_V6_LP64_OFF64_LIBS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V6_LP64_OFF64_LINTFLAGS + { "POSIX_V6_LP64_OFF64_LINTFLAGS", _CS_POSIX_V6_LP64_OFF64_LINTFLAGS, CONFSTR }, +#endif + +#ifdef _SC_V6_LPBIG_OFFBIG + { "_POSIX_V6_LPBIG_OFFBIG", _SC_V6_LPBIG_OFFBIG, SYSCONF }, +#endif +#ifdef _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS + { "POSIX_V6_LPBIG_OFFBIG_CFLAGS", _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS + { "POSIX_V6_LPBIG_OFFBIG_LDFLAGS", _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LIBS + { "POSIX_V6_LPBIG_OFFBIG_LIBS", _CS_POSIX_V6_LPBIG_OFFBIG_LIBS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS + { "POSIX_V6_LPBIG_OFFBIG_LINTFLAGS", _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS, CONFSTR }, +#endif + +#ifdef _SC_V7_ILP32_OFF32 + { "_POSIX_V7_ILP32_OFF32", _SC_V7_ILP32_OFF32, SYSCONF }, +#endif +#ifdef _CS_POSIX_V7_ILP32_OFF32_CFLAGS + { "POSIX_V7_ILP32_OFF32_CFLAGS", _CS_POSIX_V7_ILP32_OFF32_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V7_ILP32_OFF32_LDFLAGS + { "POSIX_V7_ILP32_OFF32_LDFLAGS", _CS_POSIX_V7_ILP32_OFF32_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V7_ILP32_OFF32_LIBS + { "POSIX_V7_ILP32_OFF32_LIBS", _CS_POSIX_V7_ILP32_OFF32_LIBS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V7_ILP32_OFF32_LINTFLAGS + { "POSIX_V7_ILP32_OFF32_LINTFLAGS", _CS_POSIX_V7_ILP32_OFF32_LINTFLAGS, CONFSTR }, +#endif + +#ifdef _CS_V7_WIDTH_RESTRICTED_ENVS + { "_POSIX_V7_WIDTH_RESTRICTED_ENVS", _CS_V7_WIDTH_RESTRICTED_ENVS, CONFSTR }, + { "POSIX_V7_WIDTH_RESTRICTED_ENVS", _CS_V7_WIDTH_RESTRICTED_ENVS, CONFSTR }, +#endif + +#ifdef _SC_V7_ILP32_OFFBIG + { "_POSIX_V7_ILP32_OFFBIG", _SC_V7_ILP32_OFFBIG, SYSCONF }, +#endif +#ifdef _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS + { "POSIX_V7_ILP32_OFFBIG_CFLAGS", _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS + { "POSIX_V7_ILP32_OFFBIG_LDFLAGS", _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V7_ILP32_OFFBIG_LIBS + { "POSIX_V7_ILP32_OFFBIG_LIBS", _CS_POSIX_V7_ILP32_OFFBIG_LIBS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS + { "POSIX_V7_ILP32_OFFBIG_LINTFLAGS", _CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS, CONFSTR }, +#endif + +#ifdef _SC_V7_LP64_OFF64 + { "_POSIX_V7_LP64_OFF64", _SC_V7_LP64_OFF64, SYSCONF }, +#endif +#ifdef _CS_POSIX_V7_LP64_OFF64_CFLAGS + { "POSIX_V7_LP64_OFF64_CFLAGS", _CS_POSIX_V7_LP64_OFF64_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V7_LP64_OFF64_LDFLAGS + { "POSIX_V7_LP64_OFF64_LDFLAGS", _CS_POSIX_V7_LP64_OFF64_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V7_LP64_OFF64_LIBS + { "POSIX_V7_LP64_OFF64_LIBS", _CS_POSIX_V7_LP64_OFF64_LIBS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V7_LP64_OFF64_LINTFLAGS + { "POSIX_V7_LP64_OFF64_LINTFLAGS", _CS_POSIX_V7_LP64_OFF64_LINTFLAGS, CONFSTR }, +#endif + +#ifdef _SC_V7_LPBIG_OFFBIG + { "_POSIX_V7_LPBIG_OFFBIG", _SC_V7_LPBIG_OFFBIG, SYSCONF }, +#endif +#ifdef _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS + { "POSIX_V7_LPBIG_OFFBIG_CFLAGS", _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS + { "POSIX_V7_LPBIG_OFFBIG_LDFLAGS", _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V7_LPBIG_OFFBIG_LIBS + { "POSIX_V7_LPBIG_OFFBIG_LIBS", _CS_POSIX_V7_LPBIG_OFFBIG_LIBS, CONFSTR }, +#endif +#ifdef _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS + { "POSIX_V7_LPBIG_OFFBIG_LINTFLAGS", _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS, CONFSTR }, +#endif + +#ifdef _SC_ADVISORY_INFO + { "_POSIX_ADVISORY_INFO", _SC_ADVISORY_INFO, SYSCONF }, +#endif +#ifdef _SC_BARRIERS + { "_POSIX_BARRIERS", _SC_BARRIERS, SYSCONF }, +#endif +#ifdef _SC_BASE + { "_POSIX_BASE", _SC_BASE, SYSCONF }, +#endif +#ifdef _SC_C_LANG_SUPPORT + { "_POSIX_C_LANG_SUPPORT", _SC_C_LANG_SUPPORT, SYSCONF }, +#endif +#ifdef _SC_C_LANG_SUPPORT_R + { "_POSIX_C_LANG_SUPPORT_R", _SC_C_LANG_SUPPORT_R, SYSCONF }, +#endif +#ifdef _SC_CLOCK_SELECTION + { "_POSIX_CLOCK_SELECTION", _SC_CLOCK_SELECTION, SYSCONF }, +#endif +#ifdef _SC_CPUTIME + { "_POSIX_CPUTIME", _SC_CPUTIME, SYSCONF }, +#endif +#ifdef _SC_THREAD_CPUTIME + { "_POSIX_THREAD_CPUTIME", _SC_THREAD_CPUTIME, SYSCONF }, +#endif +#ifdef _SC_DEVICE_SPECIFIC + { "_POSIX_DEVICE_SPECIFIC", _SC_DEVICE_SPECIFIC, SYSCONF }, +#endif +#ifdef _SC_DEVICE_SPECIFIC_R + { "_POSIX_DEVICE_SPECIFIC_R", _SC_DEVICE_SPECIFIC_R, SYSCONF }, +#endif +#ifdef _SC_FD_MGMT + { "_POSIX_FD_MGMT", _SC_FD_MGMT, SYSCONF }, +#endif +#ifdef _SC_FIFO + { "_POSIX_FIFO", _SC_FIFO, SYSCONF }, +#endif +#ifdef _SC_PIPE + { "_POSIX_PIPE", _SC_PIPE, SYSCONF }, +#endif +#ifdef _SC_FILE_ATTRIBUTES + { "_POSIX_FILE_ATTRIBUTES", _SC_FILE_ATTRIBUTES, SYSCONF }, +#endif +#ifdef _SC_FILE_LOCKING + { "_POSIX_FILE_LOCKING", _SC_FILE_LOCKING, SYSCONF }, +#endif +#ifdef _SC_FILE_SYSTEM + { "_POSIX_FILE_SYSTEM", _SC_FILE_SYSTEM, SYSCONF }, +#endif +#ifdef _SC_MONOTONIC_CLOCK + { "_POSIX_MONOTONIC_CLOCK", _SC_MONOTONIC_CLOCK, SYSCONF }, +#endif +#ifdef _SC_MULTI_PROCESS + { "_POSIX_MULTI_PROCESS", _SC_MULTI_PROCESS, SYSCONF }, +#endif +#ifdef _SC_SINGLE_PROCESS + { "_POSIX_SINGLE_PROCESS", _SC_SINGLE_PROCESS, SYSCONF }, +#endif +#ifdef _SC_NETWORKING + { "_POSIX_NETWORKING", _SC_NETWORKING, SYSCONF }, +#endif +#ifdef _SC_READER_WRITER_LOCKS + { "_POSIX_READER_WRITER_LOCKS", _SC_READER_WRITER_LOCKS, SYSCONF }, +#endif +#ifdef _SC_SPIN_LOCKS + { "_POSIX_SPIN_LOCKS", _SC_SPIN_LOCKS, SYSCONF }, +#endif +#ifdef _SC_REGEXP + { "_POSIX_REGEXP", _SC_REGEXP, SYSCONF }, +#endif +#ifdef _SC_REGEX_VERSION + { "_REGEX_VERSION", _SC_REGEX_VERSION, SYSCONF }, +#endif +#ifdef _SC_SHELL + { "_POSIX_SHELL", _SC_SHELL, SYSCONF }, +#endif +#ifdef _SC_SIGNALS + { "_POSIX_SIGNALS", _SC_SIGNALS, SYSCONF }, +#endif +#ifdef _SC_SPAWN + { "_POSIX_SPAWN", _SC_SPAWN, SYSCONF }, +#endif +#ifdef _SC_SPORADIC_SERVER + { "_POSIX_SPORADIC_SERVER", _SC_SPORADIC_SERVER, SYSCONF }, +#endif +#ifdef _SC_THREAD_SPORADIC_SERVER + { "_POSIX_THREAD_SPORADIC_SERVER", _SC_THREAD_SPORADIC_SERVER, SYSCONF }, +#endif +#ifdef _SC_SYSTEM_DATABASE + { "_POSIX_SYSTEM_DATABASE", _SC_SYSTEM_DATABASE, SYSCONF }, +#endif +#ifdef _SC_SYSTEM_DATABASE_R + { "_POSIX_SYSTEM_DATABASE_R", _SC_SYSTEM_DATABASE_R, SYSCONF }, +#endif +#ifdef _SC_TIMEOUTS + { "_POSIX_TIMEOUTS", _SC_TIMEOUTS, SYSCONF }, +#endif +#ifdef _SC_TYPED_MEMORY_OBJECTS + { "_POSIX_TYPED_MEMORY_OBJECTS", _SC_TYPED_MEMORY_OBJECTS, SYSCONF }, +#endif +#ifdef _SC_USER_GROUPS + { "_POSIX_USER_GROUPS", _SC_USER_GROUPS, SYSCONF }, +#endif +#ifdef _SC_USER_GROUPS_R + { "_POSIX_USER_GROUPS_R", _SC_USER_GROUPS_R, SYSCONF }, +#endif +#ifdef _SC_2_PBS + { "POSIX2_PBS", _SC_2_PBS, SYSCONF }, +#endif +#ifdef _SC_2_PBS_ACCOUNTING + { "POSIX2_PBS_ACCOUNTING", _SC_2_PBS_ACCOUNTING, SYSCONF }, +#endif +#ifdef _SC_2_PBS_LOCATE + { "POSIX2_PBS_LOCATE", _SC_2_PBS_LOCATE, SYSCONF }, +#endif +#ifdef _SC_2_PBS_TRACK + { "POSIX2_PBS_TRACK", _SC_2_PBS_TRACK, SYSCONF }, +#endif +#ifdef _SC_2_PBS_MESSAGE + { "POSIX2_PBS_MESSAGE", _SC_2_PBS_MESSAGE, SYSCONF }, +#endif +#ifdef _SC_SYMLOOP_MAX + { "SYMLOOP_MAX", _SC_SYMLOOP_MAX, SYSCONF }, +#endif +#ifdef _SC_STREAM_MAX + { "STREAM_MAX", _SC_STREAM_MAX, SYSCONF }, +#endif +#ifdef _SC_AIO_LISTIO_MAX + { "AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX, SYSCONF }, +#endif +#ifdef _SC_AIO_MAX + { "AIO_MAX", _SC_AIO_MAX, SYSCONF }, +#endif +#ifdef _SC_AIO_PRIO_DELTA_MAX + { "AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX, SYSCONF }, +#endif +#ifdef _SC_DELAYTIMER_MAX + { "DELAYTIMER_MAX", _SC_DELAYTIMER_MAX, SYSCONF }, +#endif +#ifdef _SC_HOST_NAME_MAX + { "HOST_NAME_MAX", _SC_HOST_NAME_MAX, SYSCONF }, +#endif +#ifdef _SC_LOGIN_NAME_MAX + { "LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX, SYSCONF }, +#endif +#ifdef _SC_MQ_OPEN_MAX + { "MQ_OPEN_MAX", _SC_MQ_OPEN_MAX, SYSCONF }, +#endif +#ifdef _SC_MQ_PRIO_MAX + { "MQ_PRIO_MAX", _SC_MQ_PRIO_MAX, SYSCONF }, +#endif +#ifdef _SC_DEVICE_IO + { "_POSIX_DEVICE_IO", _SC_DEVICE_IO, SYSCONF }, +#endif +#ifdef _SC_TRACE + { "_POSIX_TRACE", _SC_TRACE, SYSCONF }, +#endif +#ifdef _SC_TRACE_EVENT_FILTER + { "_POSIX_TRACE_EVENT_FILTER", _SC_TRACE_EVENT_FILTER, SYSCONF }, +#endif +#ifdef _SC_TRACE_INHERIT + { "_POSIX_TRACE_INHERIT", _SC_TRACE_INHERIT, SYSCONF }, +#endif +#ifdef _SC_TRACE_LOG + { "_POSIX_TRACE_LOG", _SC_TRACE_LOG, SYSCONF }, +#endif +#ifdef _SC_RTSIG_MAX + { "RTSIG_MAX", _SC_RTSIG_MAX, SYSCONF }, +#endif +#ifdef _SC_SEM_NSEMS_MAX + { "SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX, SYSCONF }, +#endif +#ifdef _SC_SEM_VALUE_MAX + { "SEM_VALUE_MAX", _SC_SEM_VALUE_MAX, SYSCONF }, +#endif +#ifdef _SC_SIGQUEUE_MAX + { "SIGQUEUE_MAX", _SC_SIGQUEUE_MAX, SYSCONF }, +#endif +#ifdef _PC_FILESIZEBITS + { "FILESIZEBITS", _PC_FILESIZEBITS, PATHCONF }, +#endif +#ifdef _PC_ALLOC_SIZE_MIN + { "POSIX_ALLOC_SIZE_MIN", _PC_ALLOC_SIZE_MIN, PATHCONF }, +#endif +#ifdef _PC_REC_INCR_XFER_SIZE + { "POSIX_REC_INCR_XFER_SIZE", _PC_REC_INCR_XFER_SIZE, PATHCONF }, +#endif +#ifdef _PC_REC_MAX_XFER_SIZE + { "POSIX_REC_MAX_XFER_SIZE", _PC_REC_MAX_XFER_SIZE, PATHCONF }, +#endif +#ifdef _PC_REC_MIN_XFER_SIZE + { "POSIX_REC_MIN_XFER_SIZE", _PC_REC_MIN_XFER_SIZE, PATHCONF }, +#endif +#ifdef _PC_REC_XFER_ALIGN + { "POSIX_REC_XFER_ALIGN", _PC_REC_XFER_ALIGN, PATHCONF }, +#endif +#ifdef _PC_SYMLINK_MAX + { "SYMLINK_MAX", _PC_SYMLINK_MAX, PATHCONF }, +#endif +#ifdef _CS_GNU_LIBC_VERSION + { "GNU_LIBC_VERSION", _CS_GNU_LIBC_VERSION, CONFSTR }, +#endif +#ifdef _CS_GNU_LIBPTHREAD_VERSION + { "GNU_LIBPTHREAD_VERSION", _CS_GNU_LIBPTHREAD_VERSION, CONFSTR }, +#endif +#ifdef _PC_2_SYMLINKS + { "POSIX2_SYMLINKS", _PC_2_SYMLINKS, PATHCONF }, +#endif + +#ifdef _SC_LEVEL1_ICACHE_SIZE + { "LEVEL1_ICACHE_SIZE", _SC_LEVEL1_ICACHE_SIZE, SYSCONF }, +#endif +#ifdef _SC_LEVEL1_ICACHE_ASSOC + { "LEVEL1_ICACHE_ASSOC", _SC_LEVEL1_ICACHE_ASSOC, SYSCONF }, +#endif +#ifdef _SC_LEVEL1_ICACHE_LINESIZE + { "LEVEL1_ICACHE_LINESIZE", _SC_LEVEL1_ICACHE_LINESIZE, SYSCONF }, +#endif +#ifdef _SC_LEVEL1_DCACHE_SIZE + { "LEVEL1_DCACHE_SIZE", _SC_LEVEL1_DCACHE_SIZE, SYSCONF }, +#endif +#ifdef _SC_LEVEL1_DCACHE_ASSOC + { "LEVEL1_DCACHE_ASSOC", _SC_LEVEL1_DCACHE_ASSOC, SYSCONF }, +#endif +#ifdef _SC_LEVEL1_DCACHE_LINESIZE + { "LEVEL1_DCACHE_LINESIZE", _SC_LEVEL1_DCACHE_LINESIZE, SYSCONF }, +#endif +#ifdef _SC_LEVEL2_CACHE_SIZE + { "LEVEL2_CACHE_SIZE", _SC_LEVEL2_CACHE_SIZE, SYSCONF }, +#endif +#ifdef _SC_LEVEL2_CACHE_ASSOC + { "LEVEL2_CACHE_ASSOC", _SC_LEVEL2_CACHE_ASSOC, SYSCONF }, +#endif +#ifdef _SC_LEVEL2_CACHE_LINESIZE + { "LEVEL2_CACHE_LINESIZE", _SC_LEVEL2_CACHE_LINESIZE, SYSCONF }, +#endif +#ifdef _SC_LEVEL3_CACHE_SIZE + { "LEVEL3_CACHE_SIZE", _SC_LEVEL3_CACHE_SIZE, SYSCONF }, +#endif +#ifdef _SC_LEVEL3_CACHE_ASSOC + { "LEVEL3_CACHE_ASSOC", _SC_LEVEL3_CACHE_ASSOC, SYSCONF }, +#endif +#ifdef _SC_LEVEL3_CACHE_LINESIZE + { "LEVEL3_CACHE_LINESIZE", _SC_LEVEL3_CACHE_LINESIZE, SYSCONF }, +#endif +#ifdef _SC_LEVEL4_CACHE_SIZE + { "LEVEL4_CACHE_SIZE", _SC_LEVEL4_CACHE_SIZE, SYSCONF }, +#endif +#ifdef _SC_LEVEL4_CACHE_ASSOC + { "LEVEL4_CACHE_ASSOC", _SC_LEVEL4_CACHE_ASSOC, SYSCONF }, +#endif +#ifdef _SC_LEVEL4_CACHE_LINESIZE + { "LEVEL4_CACHE_LINESIZE", _SC_LEVEL4_CACHE_LINESIZE, SYSCONF }, +#endif + +#ifdef _SC_IPV6 + { "IPV6", _SC_IPV6, SYSCONF }, +#endif +#ifdef _SC_RAW_SOCKETS + { "RAW_SOCKETS", _SC_RAW_SOCKETS, SYSCONF }, +#endif + + { NULL, 0, SYSCONF } + }; + + +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]); + +#ifdef __UCLIBC_HAS___PROGNAME__ +extern const char *__progname; +#else +#define __progname "foo" +#endif + +static void +usage (void) +{ + fprintf (stderr, + _("Usage: %s [-v specification] variable_name [pathname]\n"), + __progname); + fprintf (stderr, + _(" %s -a [pathname]\n"), __progname); + exit (2); +} + + +static void +print_all (const char *path) +{ + register const struct conf *c; + size_t clen; + long int value; + char *cvalue; + for (c = vars; c->name != NULL; ++c) { + printf("%-35s", c->name); + switch (c->call) { + case PATHCONF: + value = pathconf (path, c->call_name); + if (value != -1) { + printf("%ld", value); + } + printf("\n"); + break; + case SYSCONF: + value = sysconf (c->call_name); + if (value == -1l) { + if (c->call_name == _SC_UINT_MAX + || c->call_name == _SC_ULONG_MAX) + printf ("%lu", value); + } + else { + printf ("%ld", value); + } + printf ("\n"); + break; + case CONFSTR: + clen = confstr (c->call_name, (char *) NULL, 0); + cvalue = (char *) malloc (clen); + if (cvalue == NULL) + error (3, 0, _("memory exhausted")); + if (confstr (c->call_name, cvalue, clen) != clen) + error (3, errno, "confstr"); + printf ("%.*s\n", (int) clen, cvalue); + free (cvalue); + break; + } + } + exit (0); +} + +int +main (int argc, char *argv[]) +{ + register const struct conf *c; + + /* Set locale. Do not set LC_ALL because the other categories must + not be affected (according to POSIX.2). */ + + /* Initialize the message catalog. */ + + if (argc > 1 && strcmp (argv[1], "--version") == 0) + { + printf ("getconf (GNU %s) %s\n", PACKAGE, VERSION); + printf ("\ +Copyright (C) %s Free Software Foundation, Inc.\n\ +This is free software; see the source for copying conditions. There is NO\n\ +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ +", "2009"); + printf ("Written by %s.\n", "Roland McGrath"); + return 0; + } + + if (argc > 1 && strcmp (argv[1], "--help") == 0) + { + printf ("\ +Usage: getconf [-v SPEC] VAR\n\ + or: getconf [-v SPEC] PATH_VAR PATH\n\ +\n\ +Get the configuration value for variable VAR, or for variable PATH_VAR\n\ +for path PATH. If SPEC is given, give values for compilation\n\ +environment SPEC.\n\n"); + fputs ("For bug reporting instructions, please see:\n\ +.\n", stdout); + return 0; + } + + const char *getconf_dir = getenv ("GETCONF_DIR") ?: GETCONF_DIR; + size_t getconf_dirlen = strlen (getconf_dir); + + const char *spec = NULL; + char buf[sizeof "POSIX_V6_LPBIG_OFFBIG"]; + char *argv0 = argv[0]; + if (argc > 1 && strncmp (argv[1], "-v", 2) == 0) + { + if (argv[1][2] == '\0') + { + if (argc < 3) + usage (); + + spec = argv[2]; + argv += 2; + argc -= 2; + } + else + { + spec = &argv[1][2]; + argv += 1; + argc += 1; + } + } + else + { + char default_name[getconf_dirlen + sizeof "/default"]; + memcpy (mempcpy (default_name, getconf_dir, getconf_dirlen), + "/default", sizeof "/default"); + int len = readlink (default_name, buf, sizeof buf - 1); + if (len > 0) + { + buf[len] = '\0'; + spec = buf; + } + } + + /* Check for the specifications we know. */ + if (spec != NULL) + { + int i; + for (i = 0; i < nspecs; ++i) + if (strcmp (spec, specs[i].name) == 0) + break; + + if (i == nspecs) + error (2, 0, _("unknown specification \"%s\""), spec); + + switch (specs[i].num) + { +#ifndef _XBS5_ILP32_OFF32 + case _SC_XBS5_ILP32_OFF32: +#endif +#ifndef _XBS5_ILP32_OFFBIG + case _SC_XBS5_ILP32_OFFBIG: +#endif +#ifndef _XBS5_LP64_OFF64 + case _SC_XBS5_LP64_OFF64: +#endif +#ifndef _XBS5_LPBIG_OFFBIG + case _SC_XBS5_LPBIG_OFFBIG: +#endif +#ifndef _POSIX_V6_ILP32_OFF32 + case _SC_V6_ILP32_OFF32: +#endif +#ifndef _POSIX_V6_ILP32_OFFBIG + case _SC_V6_ILP32_OFFBIG: +#endif +#ifndef _POSIX_V6_LP64_OFF64 + case _SC_V6_LP64_OFF64: +#endif +#ifndef _POSIX_V6_LPBIG_OFFBIG + case _SC_V6_LPBIG_OFFBIG: +#endif +#ifndef _POSIX_V7_ILP32_OFF32 + case _SC_V7_ILP32_OFF32: +#endif +#ifndef _POSIX_V7_ILP32_OFFBIG + case _SC_V7_ILP32_OFFBIG: +#endif +#ifndef _POSIX_V7_LP64_OFF64 + case _SC_V7_LP64_OFF64: +#endif +#ifndef _POSIX_V7_LPBIG_OFFBIG + case _SC_V7_LPBIG_OFFBIG: +#endif + { + const char *args[argc + 3]; + size_t spec_len = strlen (spec); + char getconf_name[getconf_dirlen + 1 + spec_len + 1]; + memcpy (mempcpy (mempcpy (getconf_name, getconf_dir, + getconf_dirlen), + "/", 1), spec, spec_len + 1); + args[0] = argv0; + args[1] = "-v"; + args[2] = spec; + memcpy (&args[3], &argv[1], argc * sizeof (argv[1])); + execv (getconf_name, (char * const *) args); + error (4, errno, _("Couldn't execute %s"), getconf_name); + } + default: + break; + } + } + + if (argc > 1 && strcmp (argv[1], "-a") == 0) + { + if (argc == 2) + print_all ("/"); + else if (argc == 3) + print_all (argv[2]); + else + usage (); + } + + int ai = 1; + if (argc > ai && strcmp (argv[ai], "--") == 0) + ++ai; + + if (argc - ai < 1 || argc - ai > 2) + usage (); + + for (c = vars; c->name != NULL; ++c) + if (strcmp (c->name, argv[ai]) == 0 + || (strncmp (c->name, "_POSIX_", 7) == 0 + && strcmp (c->name + 7, argv[ai]) == 0)) + { + long int value; + size_t clen; + char *cvalue; + switch (c->call) + { + case PATHCONF: + if (argc - ai < 2) + usage (); + errno = 0; + value = pathconf (argv[ai + 1], c->call_name); + if (value == -1) + { + if (errno) { + error (3, errno, "pathconf: %s", argv[ai + 1]); + } else + puts (_("undefined")); + } + else + printf ("%ld\n", value); + exit (0); + + case SYSCONF: + if (argc - ai > 1) + usage (); + value = sysconf (c->call_name); + if (value == -1l) + { + if (c->call_name == _SC_UINT_MAX + || c->call_name == _SC_ULONG_MAX) + printf ("%lu\n", value); + else + puts (_("undefined")); + } + else + printf ("%ld\n", value); + exit (0); + + case CONFSTR: + if (argc - ai > 1) + usage (); + clen = confstr (c->call_name, (char *) NULL, 0); + cvalue = (char *) malloc (clen); + if (cvalue == NULL) + error (3, 0, _("memory exhausted")); + + if (confstr (c->call_name, cvalue, clen) != clen) + error (3, errno, "confstr"); + + printf ("%.*s\n", (int) clen, cvalue); + exit (0); + } + } + + error (2, 0, _("Unrecognized variable `%s'"), argv[ai]); + /* NOTREACHED */ + return 2; +} -- cgit v1.2.3 From 384a55ef9f3387ed33eadab3eefe5057b4daeadb Mon Sep 17 00:00:00 2001 From: Bernhard Reutner-Fischer Date: Tue, 6 Apr 2010 17:17:30 +0200 Subject: getconf: print arbitrary GNU_LIBPTHREAD_VERSION string the NPTL should probably print the version-string of the glibc it's compatible with and not the uClibc version (check what mysql expects). Signed-off-by: Bernhard Reutner-Fischer --- libc/unistd/confstr.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/libc/unistd/confstr.c b/libc/unistd/confstr.c index 16b57bee9..957ee4d27 100644 --- a/libc/unistd/confstr.c +++ b/libc/unistd/confstr.c @@ -42,6 +42,24 @@ size_t confstr (int name, char *buf, size_t len) string_len = sizeof (cs_path); } break; +#ifdef __UCLIBC_HAS_THREADS__ + case _CS_GNU_LIBPTHREAD_VERSION: +# if defined __LINUXTHREADS_OLD__ + string = "linuxthreads-0.01"; + string_len = sizeof("linuxthreads-x.xx"); +# elif defined __LINUXTHREADS_NEW__ + string = "linuxthreads-0.10"; + string_len = sizeof("linuxthreads-x.xx"); +# elif defined __UCLIBC_HAS_THREADS_NATIVE__ +# define __NPTL_VERSION ("NPTL " \ + #__UCLIBC_MAJOR__ "." \ + #__UCLIBC_MINOR__ "." \ + #__UCLIBC_SUBLEVEL__) + string = __NPTL_VERSION; + string_len = sizeof(__NPTL_VERSION); +# endif + break; +#endif default: __set_errno (EINVAL); return 0; -- cgit v1.2.3