From 2d1e6277e92bd907578cd01d017b1d6aa34485be Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 8 Aug 2006 15:51:48 +0000 Subject: [PATCH] * stdlib/strtol_l.c (__strtol_ul_max_tab, __strtol_ul_rem_tab, __strtol_ull_max_tab, __strtol_ull_rem_tab): Declare. (DEF): Don't put the var into .gnu.linkonce.r.* section. Only provide var definitions in strtol_l (or for *ull* in strtoll_l). * stdio-common/bug16.c (tests): New array. (do_tests): Allow the first hexadecimal digit to be 1, 2, 4 or 8. Do 3 additional tests. * sysdeps/s390/fpu/libm-test-ulps: Update. * sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c (fchownat): Use fchownat syscall if available. * sysdeps/unix/sysv/linux/powerpc/fchownat.c (fchownat): Likewise. * sysdeps/unix/sysv/linux/sh/fchownat.c (fchownat): Likewise. * sysdeps/unix/sysv/linux/i386/fchownat.c (fchownat): Likewise. (rec_dirsearch) [case HIGHER_NAME]: Correctly size ndomain array. --- ChangeLog | 22 +++++++++++- stdio-common/bug16.c | 35 ++++++++++++++---- stdlib/strtol_l.c | 27 ++++++++------ sysdeps/s390/fpu/libm-test-ulps | 36 +++++++++---------- sysdeps/unix/sysv/linux/i386/fchownat.c | 42 +++++++++++++++------- sysdeps/unix/sysv/linux/powerpc/fchownat.c | 48 +++++++++++++++++-------- sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c | 30 ++++++++++++---- sysdeps/unix/sysv/linux/sh/fchownat.c | 30 ++++++++++++---- 8 files changed, 196 insertions(+), 74 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8904d89..756bd1b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,23 @@ +2006-08-08 Jakub Jelinek + + * stdlib/strtol_l.c (__strtol_ul_max_tab, __strtol_ul_rem_tab, + __strtol_ull_max_tab, __strtol_ull_rem_tab): Declare. + (DEF): Don't put the var into .gnu.linkonce.r.* section. + Only provide var definitions in strtol_l (or for *ull* + in strtoll_l). + + * stdio-common/bug16.c (tests): New array. + (do_tests): Allow the first hexadecimal digit + to be 1, 2, 4 or 8. Do 3 additional tests. + + * sysdeps/s390/fpu/libm-test-ulps: Update. + + * sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c (fchownat): Use + fchownat syscall if available. + * sysdeps/unix/sysv/linux/powerpc/fchownat.c (fchownat): Likewise. + * sysdeps/unix/sysv/linux/sh/fchownat.c (fchownat): Likewise. + * sysdeps/unix/sysv/linux/i386/fchownat.c (fchownat): Likewise. + 2006-08-07 Ulrich Drepper * nis/nis_xdr.c: Avoid some function calls. @@ -11,7 +31,7 @@ 2006-08-07 Ulrich Drepper * nis/nis_call.c: Minor cleanups throughout. - (rec_dirsearch) [HIGHER_NAME]: Correctly size ndomain array. + (rec_dirsearch) [case HIGHER_NAME]: Correctly size ndomain array. (first_shoot): Add search_parent_first parameter. Only if it is set search parent server first. If directory for table found through cold start cache is not the same diff --git a/stdio-common/bug16.c b/stdio-common/bug16.c index 42e37fa..84269f3 100644 --- a/stdio-common/bug16.c +++ b/stdio-common/bug16.c @@ -1,19 +1,42 @@ #include #include +struct +{ + long double val; + const char str[4][7]; +} tests[] = +{ + { 0x0.FFFFp+0L, { "0X1P+0", "0X2P-1", "0X4P-2", "0X8P-3" } }, + { 0x0.FFFFp+1L, { "0X1P+1", "0X2P+0", "0X4P-1", "0X8P-2" } }, + { 0x0.FFFFp+2L, { "0X1P+2", "0X2P+1", "0X4P+0", "0X8P-1" } }, + { 0x0.FFFFp+3L, { "0X1P+3", "0X2P+2", "0X4P+1", "0X8P+0" } } +}; + static int do_test (void) { char buf[100]; - snprintf (buf, sizeof (buf), "%.0LA", 0x0.FFFFp+0L); + int ret = 0; + + for (size_t i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i) + { + snprintf (buf, sizeof (buf), "%.0LA", tests[i].val); + + size_t j; + for (j = 0; j < 4; ++j) + if (strcmp (buf, tests[i].str[j]) == 0) + break; - if (strcmp (buf, "0X1P+0") != 0) - { - printf ("got \"%s\", expected \"0X1P+0\"\n", buf); - return 1; + if (j == 4) + { + printf ("%zd: got \"%s\", expected \"%s\" or equivalent\n", + i, buf, tests[i].str[0]); + ret = 1; + } } - return 0; + return ret; } #define TEST_FUNCTION do_test () diff --git a/stdlib/strtol_l.c b/stdlib/strtol_l.c index 156083c..e02a274 100644 --- a/stdlib/strtol_l.c +++ b/stdlib/strtol_l.c @@ -1,5 +1,5 @@ /* Convert string representing a number to integer value, using given locale. - Copyright (C) 1997, 2002, 2004 Free Software Foundation, Inc. + Copyright (C) 1997, 2002, 2004, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -168,10 +168,15 @@ /* Define tables of maximum values and remainders in order to detect overflow. Do this at compile-time in order to avoid the runtime overhead of the division. */ +extern const unsigned long __strtol_ul_max_tab[] attribute_hidden; +extern const unsigned char __strtol_ul_rem_tab[] attribute_hidden; +#if defined(QUAD) && __WORDSIZE == 32 +extern const unsigned long long __strtol_ull_max_tab[] attribute_hidden; +extern const unsigned char __strtol_ull_rem_tab[] attribute_hidden; +#endif #define DEF(TYPE, NAME) \ - const TYPE NAME[] attribute_hidden \ - __attribute__((section(".gnu.linkonce.r." #NAME))) = \ + const TYPE NAME[] attribute_hidden = \ { \ F(2), F(3), F(4), F(5), F(6), F(7), F(8), F(9), F(10), \ F(11), F(12), F(13), F(14), F(15), F(16), F(17), F(18), F(19), F(20), \ @@ -179,20 +184,22 @@ F(31), F(32), F(33), F(34), F(35), F(36) \ } -#define F(X) ULONG_MAX / X +#if !UNSIGNED && !defined (USE_WIDE_CHAR) && !defined (QUAD) +# define F(X) ULONG_MAX / X DEF (unsigned long, __strtol_ul_max_tab); -#undef F -#if defined(QUAD) && __WORDSIZE == 32 +# undef F +# define F(X) ULONG_MAX % X + DEF (unsigned char, __strtol_ul_rem_tab); +# undef F +#endif +#if !UNSIGNED && !defined (USE_WIDE_CHAR) && defined (QUAD) \ + && __WORDSIZE == 32 # define F(X) ULONG_LONG_MAX / X DEF (unsigned long long, __strtol_ull_max_tab); # undef F # define F(X) ULONG_LONG_MAX % X DEF (unsigned char, __strtol_ull_rem_tab); # undef F -#else -# define F(X) ULONG_MAX % X - DEF (unsigned char, __strtol_ul_rem_tab); -# undef F #endif #undef DEF diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps index 7fbed3c..989722e 100644 --- a/sysdeps/s390/fpu/libm-test-ulps +++ b/sysdeps/s390/fpu/libm-test-ulps @@ -513,16 +513,16 @@ ifloat: 1 # j0 Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1": double: 1 -float: 1 +float: 2 idouble: 1 -ifloat: 1 +ifloat: 2 Test "j0 (0.75) == 0.864242275166648623555731103820923211": float: 1 ifloat: 1 Test "j0 (10.0) == -0.245935764451348335197760862485328754": -double: 2 +double: 3 float: 1 -idouble: 2 +idouble: 3 ifloat: 1 ildouble: 2 ldouble: 2 @@ -533,9 +533,9 @@ ildouble: 2 ldouble: 2 Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1": double: 1 -float: 1 +float: 2 idouble: 1 -ifloat: 1 +ifloat: 2 Test "j0 (8.0) == 0.171650807137553906090869407851972001": float: 1 ifloat: 1 @@ -569,16 +569,16 @@ ldouble: 4 # jn Test "jn (0, -4.0) == -3.9714980986384737228659076845169804197562E-1": double: 1 -float: 1 +float: 2 idouble: 1 -ifloat: 1 +ifloat: 2 Test "jn (0, 0.75) == 0.864242275166648623555731103820923211": float: 1 ifloat: 1 Test "jn (0, 10.0) == -0.245935764451348335197760862485328754": -double: 2 +double: 3 float: 1 -idouble: 2 +idouble: 3 ifloat: 1 ildouble: 2 ldouble: 2 @@ -589,9 +589,9 @@ ildouble: 2 ldouble: 2 Test "jn (0, 4.0) == -3.9714980986384737228659076845169804197562E-1": double: 1 -float: 1 +float: 2 idouble: 1 -ifloat: 1 +ifloat: 2 Test "jn (0, 8.0) == 0.171650807137553906090869407851972001": float: 1 ifloat: 1 @@ -661,9 +661,9 @@ idouble: 1 ifloat: 1 Test "jn (3, 10.0) == 0.0583793793051868123429354784103409563": double: 3 -float: 1 +float: 2 idouble: 3 -ifloat: 1 +ifloat: 2 ildouble: 2 ldouble: 2 Test "jn (3, 2.0) == 0.128943249474402051098793332969239835": @@ -925,9 +925,9 @@ ildouble: 1 ldouble: 1 Test "yn (10, 10.0) == -0.359814152183402722051986577343560609": double: 2 -float: 1 +float: 2 idouble: 2 -ifloat: 1 +ifloat: 2 ildouble: 2 ldouble: 2 Test "yn (10, 2.0) == -129184.542208039282635913145923304214": @@ -1228,9 +1228,9 @@ float: 1 ifloat: 1 Function: "j0": -double: 2 +double: 3 float: 2 -idouble: 2 +idouble: 3 ifloat: 2 ildouble: 2 ldouble: 2 diff --git a/sysdeps/unix/sysv/linux/i386/fchownat.c b/sysdeps/unix/sysv/linux/i386/fchownat.c index e5306db..db54817 100644 --- a/sysdeps/unix/sysv/linux/i386/fchownat.c +++ b/sysdeps/unix/sysv/linux/i386/fchownat.c @@ -61,6 +61,24 @@ extern int __libc_missing_32bit_uids; int fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) { + int result; + +#ifdef __NR_fchownat +# ifndef __ASSUME_ATFCTS + if (__have_atfcts >= 0) +# endif + { + result = INLINE_SYSCALL (fchownat, 5, fd, file, owner, group, flag); +# ifndef __ASSUME_ATFCTS + if (result == -1 && errno == ENOSYS) + __have_atfcts = -1; + else +# endif + return result; + } +#endif + +#ifndef __ASSUME_ATFCTS if (flag & ~AT_SYMLINK_NOFOLLOW) { __set_errno (EINVAL); @@ -87,14 +105,13 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) file = buf; } - int result; INTERNAL_SYSCALL_DECL (err); -#if defined __NR_lchown || __ASSUME_LCHOWN_SYSCALL > 0 -# if __ASSUME_LCHOWN_SYSCALL == 0 +# if defined __NR_lchown || __ASSUME_LCHOWN_SYSCALL > 0 +# if __ASSUME_LCHOWN_SYSCALL == 0 static int __libc_old_chown; -# ifdef __NR_chown32 +# ifdef __NR_chown32 if (__libc_missing_32bit_uids <= 0) { if (flag & AT_SYMLINK_NOFOLLOW) @@ -111,7 +128,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) __libc_missing_32bit_uids = 1; } -# endif /* __NR_chown32 */ +# endif /* __NR_chown32 */ if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U)) || ((group + 1) > (gid_t) ((__kernel_gid_t) -1U))) @@ -135,13 +152,13 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) result = INTERNAL_SYSCALL (lchown, err, 3, CHECK_STRING (file), owner, group); -# elif __ASSUME_32BITUIDS +# elif __ASSUME_32BITUIDS /* This implies __ASSUME_LCHOWN_SYSCALL. */ result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file), owner, group); -# else +# else /* !__ASSUME_32BITUIDS && ASSUME_LCHOWN_SYSCALL */ -# ifdef __NR_chown32 +# ifdef __NR_chown32 if (__libc_missing_32bit_uids <= 0) { result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file), owner, @@ -153,7 +170,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) __libc_missing_32bit_uids = 1; } -# endif /* __NR_chown32 */ +# endif /* __NR_chown32 */ if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U)) || ((group + 1) > (gid_t) ((__kernel_gid_t) -1U))) { @@ -162,10 +179,10 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) } result = INTERNAL_SYSCALL (chown, err, 3, CHECK_STRING (file), owner, group); -# endif -#else +# endif +# else result = INTERNAL_SYSCALL (chown, err, 3, CHECK_STRING (file), owner, group); -#endif +# endif if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0)) goto fail; @@ -175,4 +192,5 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) fail: __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf); return -1; +#endif } diff --git a/sysdeps/unix/sysv/linux/powerpc/fchownat.c b/sysdeps/unix/sysv/linux/powerpc/fchownat.c index 1fbae5c..f1b9b4d 100644 --- a/sysdeps/unix/sysv/linux/powerpc/fchownat.c +++ b/sysdeps/unix/sysv/linux/powerpc/fchownat.c @@ -37,6 +37,24 @@ int fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) { + int result; + +#ifdef __NR_fchownat +# ifndef __ASSUME_ATFCTS + if (__have_atfcts >= 0) +# endif + { + result = INLINE_SYSCALL (fchownat, 5, fd, file, owner, group, flag); +# ifndef __ASSUME_ATFCTS + if (result == -1 && errno == ENOSYS) + __have_atfcts = -1; + else +# endif + return result; + } +#endif + +#ifndef __ASSUME_ATFCTS if (flag & ~AT_SYMLINK_NOFOLLOW) { __set_errno (EINVAL); @@ -63,15 +81,14 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) file = buf; } - int result; INTERNAL_SYSCALL_DECL (err); -#if __ASSUME_LCHOWN_SYSCALL +# if __ASSUME_LCHOWN_SYSCALL if (flag & AT_SYMLINK_NOFOLLOW) result = INTERNAL_SYSCALL (lchown, err, 3, file, owner, group); else result = INTERNAL_SYSCALL (chown, err, 3, file, owner, group); -#else +# else char link[PATH_MAX + 2]; char path[2 * PATH_MAX + 4]; int loopct; @@ -89,7 +106,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) goto out; } -# ifdef __NR_lchown +# ifdef __NR_lchown if (flag & AT_SYMLINK_NOFOLLOW) { result = INTERNAL_SYSCALL (lchown, err, 3, __ptrvalue (file), owner, @@ -110,25 +127,25 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) } libc_old_chown = -1; } -# else +# else if (flag & AT_SYMLINK_NOFOLLOW) { result = INTERNAL_SYSCALL (chown, err, 3, __ptrvalue (file), owner, group); goto out; } -# endif +# endif result = __readlink (file, link, PATH_MAX + 1); if (result == -1) { -# ifdef __NR_lchown +# ifdef __NR_lchown result = INTERNAL_SYSCALL (lchown, err, 3, __ptrvalue (file), owner, group); -# else +# else result = INTERNAL_SYSCALL (chown, err, 3, __ptrvalue (file), owner, group); -# endif +# endif goto out; } @@ -178,11 +195,11 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) if (result == -1) { -# ifdef __NR_lchown +# ifdef __NR_lchown result = INTERNAL_SYSCALL (lchown, err, 3, path, owner, group); -# else +# else result = INTERNAL_SYSCALL (chown, err, 3, path, owner, group); -# endif +# endif goto out; } } @@ -190,16 +207,17 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) return -1; out: -#endif +# endif if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0)) { -#if !__ASSUME_LCHOWN_SYSCALL +# if !__ASSUME_LCHOWN_SYSCALL fail: -#endif +# endif __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf); result = -1; } return result; +#endif } diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c b/sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c index d927d7c..abc06b0 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c +++ b/sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c @@ -53,6 +53,24 @@ extern int __libc_missing_32bit_uids; int fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) { + int result; + +#ifdef __NR_fchownat +# ifndef __ASSUME_ATFCTS + if (__have_atfcts >= 0) +# endif + { + result = INLINE_SYSCALL (fchownat, 5, fd, file, owner, group, flag); +# ifndef __ASSUME_ATFCTS + if (result == -1 && errno == ENOSYS) + __have_atfcts = -1; + else +# endif + return result; + } +#endif + +#ifndef __ASSUME_ATFCTS if (flag & ~AT_SYMLINK_NOFOLLOW) { __set_errno (EINVAL); @@ -79,16 +97,15 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) file = buf; } - int result; INTERNAL_SYSCALL_DECL (err); -#if __ASSUME_32BITUIDS > 0 +# if __ASSUME_32BITUIDS > 0 result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file), owner, group); -#else +# else static int __libc_old_chown; -# ifdef __NR_chown32 +# ifdef __NR_chown32 if (__libc_missing_32bit_uids <= 0) { if (flag & AT_SYMLINK_NOFOLLOW) @@ -105,7 +122,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) __libc_missing_32bit_uids = 1; } -# endif /* __NR_chown32 */ +# endif /* __NR_chown32 */ if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U)) || ((group + 1) > (gid_t) ((__kernel_gid_t) -1U))) { @@ -128,7 +145,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) result = INTERNAL_SYSCALL (lchown, err, 3, CHECK_STRING (file), owner, group); -#endif +# endif if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0)) { @@ -138,4 +155,5 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) } return result; +#endif } diff --git a/sysdeps/unix/sysv/linux/sh/fchownat.c b/sysdeps/unix/sysv/linux/sh/fchownat.c index 6cc0932..61df787 100644 --- a/sysdeps/unix/sysv/linux/sh/fchownat.c +++ b/sysdeps/unix/sysv/linux/sh/fchownat.c @@ -40,6 +40,24 @@ extern int __libc_missing_32bit_uids; int fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) { + int result; + +#ifdef __NR_fchownat +# ifndef __ASSUME_ATFCTS + if (__have_atfcts >= 0) +# endif + { + result = INLINE_SYSCALL (fchownat, 5, fd, file, owner, group, flag); +# ifndef __ASSUME_ATFCTS + if (result == -1 && errno == ENOSYS) + __have_atfcts = -1; + else +# endif + return result; + } +#endif + +#ifndef __ASSUME_ATFCTS if (flag & ~AT_SYMLINK_NOFOLLOW) { __set_errno (EINVAL); @@ -66,18 +84,17 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) file = buf; } - int result; INTERNAL_SYSCALL_DECL (err); -#if __ASSUME_32BITUIDS > 0 +# if __ASSUME_32BITUIDS > 0 if (flag & AT_SYMLINK_NOFOLLOW) result = INTERNAL_SYSCALL (lchown32, err, 3, CHECK_STRING (file), owner, group); else result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file), owner, group); -#else -# ifdef __NR_chown32 +# else +# ifdef __NR_chown32 if (__libc_missing_32bit_uids <= 0) { if (flag & AT_SYMLINK_NOFOLLOW) @@ -94,7 +111,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) __libc_missing_32bit_uids = 1; } -# endif /* __NR_chown32 */ +# endif /* __NR_chown32 */ if (((owner + 1) > (gid_t) ((__kernel_uid_t) -1U)) || ((group + 1) > (gid_t) ((__kernel_gid_t) -1U))) @@ -109,7 +126,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) else result = INTERNAL_SYSCALL (chown, err, 3, CHECK_STRING (file), owner, group); -#endif +# endif if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0)) { @@ -119,4 +136,5 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag) } return result; +#endif } -- 2.7.4