about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog114
-rw-r--r--FAQ39
-rwxr-xr-xconfigure131
-rw-r--r--configure.in3
-rw-r--r--grp/fgetgrent.c48
-rw-r--r--grp/fgetgrent_r.c15
-rw-r--r--manual/errno.texi31
-rw-r--r--math/libm-test.c9
-rw-r--r--nss/getXXbyYY.c3
-rw-r--r--nss/getXXent.c7
-rw-r--r--nss/nss_files/files-XXX.c7
-rw-r--r--nss/nss_files/files-parse.c31
-rw-r--r--pwd/fgetpwent.c48
-rw-r--r--shadow/fgetspent.c53
-rw-r--r--shadow/sgetspent.c58
-rw-r--r--shadow/sgetspent_r.c5
-rw-r--r--stdlib/stdlib.h1
-rw-r--r--stdlib/strtod.c5
-rw-r--r--stdlib/strtof.c2
-rw-r--r--stdlib/strtold.c4
-rw-r--r--sunrpc/Makefile2
-rw-r--r--sysdeps/gnu/errlist.awk2
-rw-r--r--sysdeps/gnu/errlist.c8
-rw-r--r--sysdeps/i386/memset.c2
-rw-r--r--sysdeps/libm-ieee754/s_asinhl.c2
-rw-r--r--sysdeps/libm-ieee754/s_log2f.c2
-rw-r--r--sysdeps/libm-ieee754/s_nan.c30
-rw-r--r--sysdeps/libm-ieee754/s_nanf.c30
-rw-r--r--sysdeps/libm-ieee754/s_nanl.c30
-rw-r--r--sysdeps/m68k/Makefile5
-rw-r--r--sysdeps/m68k/fpu/__math.h237
-rw-r--r--sysdeps/m68k/fpu/e_atan2.c36
-rw-r--r--sysdeps/m68k/fpu/e_pow.c38
-rw-r--r--sysdeps/m68k/fpu/s_cexp.c92
-rw-r--r--sysdeps/m68k/fpu/s_cexpf.c4
-rw-r--r--sysdeps/m68k/fpu/s_cexpl.c4
-rw-r--r--sysdeps/m68k/fpu/s_modf.c29
-rw-r--r--sysdeps/m68k/fpu/s_modff.c2
-rw-r--r--sysdeps/m68k/fpu/s_modfl.c2
-rw-r--r--sysdeps/m68k/fpu/s_nearbyint.c2
-rw-r--r--sysdeps/m68k/fpu/s_nearbyintf.c2
-rw-r--r--sysdeps/m68k/fpu/s_nearbyintl.c2
-rw-r--r--sysdeps/m68k/fpu/s_trunc.c2
-rw-r--r--sysdeps/m68k/fpu/s_truncf.c2
-rw-r--r--sysdeps/m68k/fpu/s_truncl.c2
-rw-r--r--sysdeps/powerpc/strlen.s145
-rw-r--r--sysdeps/stub/fchdir.c30
-rw-r--r--sysdeps/stub/fchmod.c30
-rw-r--r--sysdeps/unix/sysv/linux/net/route.h34
-rw-r--r--wcsmbs/wcstof.c2
-rw-r--r--wcsmbs/wcstold.c4
51 files changed, 1051 insertions, 377 deletions
diff --git a/ChangeLog b/ChangeLog
index bd661db53e..704b97dc6f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,117 @@
+1997-04-02 16:28  Ulrich Drepper  <drepper@cygnus.com>
+
+	* grp/fgetgrent.c: Don't use fixed buffer length.  Allow dynamic
+	adjustment if the underlying function say it is too small.
+	* pwd/fgetpwent.c: Likewise.
+	* shadow/fgetspent.c: Likewise.
+	* shadow/sgetspent.c: Likewise.
+
+	* grp/fgetgrent_r.c (__fgetgrent_r): If `parse_result' returns -1
+	this means there was not enough room for the gr_mem array.
+
+	* nss/nss_files/files-XXX.c: Leave loop and return error if
+	`parse_result' returns -1.
+
+	* nss/nss_files/files-parse.c (parse_line): Return -1 if parsing
+	of trailing list fails because of low memory.
+	(parse_list): Rewrite.  The logic was completly incorrect since
+	the checks for overflowing the array were not executed when
+	needed.
+
+	* shadow/sgetspent_r.c: Only a return value > 0 from parse_line
+	signals success.
+
+	* nss/getXXbyYY.c: Make sure NULL is returned if we ran out of memory.
+	* nss/getXXent.c: Likewise.
+
+	* stdlib/strtod.c (SET_MANTISSA): Make sure that at least one bit
+	is set in mantissa.
+	* stdlib/strtof.c: Likewise.
+	* stdlib/strtold.c: Likewise.
+	* wcsmbs/wcstof.c: Likewise.
+	* wcsmbs/wcstold.c: Likewise.
+
+	* sysdeps/libm-ieee754/s_nan.c: Use strtod is parameter is not empty
+	string.
+	* sysdeps/libm-ieee754/s_nanf.c: Likewise.
+	* sysdeps/libm-ieee754/s_nanld.c: Likewise.
+
+1997-04-02 13:56  Ulrich Drepper  <drepper@cygnus.com>
+
+	* manual/errno.texi: Add description of strerror_r.
+
+1997-04-01 19:07  H.J. Lu (hjl@gnu.ai.mit.edu)
+
+	* manual/errno.texi: Add ENOMEDIUM and EMEDIUMTYPE.
+
+1997-04-02 13:55  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/gnu/errlist.awk: The Texinfo file is named errno.texi.
+
+1997-03-30 10:59  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/m68k/fpu/s_cexp.c: New file.
+	* sysdeps/m68k/fpu/s_cexpf.c: New file.
+	* sysdeps/m68k/fpu/s_cexpl.c: New file.
+	* sysdeps/m68k/fpu/s_nearbyint.c: New file.
+	* sysdeps/m68k/fpu/s_nearbyintf.c: New file.
+	* sysdeps/m68k/fpu/s_nearbyintl.c: New file.
+	* sysdeps/m68k/fpu/s_trunc.c: New file.
+	* sysdeps/m68k/fpu/s_truncf.c: New file.
+	* sysdeps/m68k/fpu/s_truncl.c: New file.
+
+	* sysdeps/m68k/fpu/s_modf.c: Rewritten.
+	* sysdeps/m68k/fpu/s_modff.c: Adapted.
+	* sysdeps/m68k/fpu/s_modfl.c: Likewise.
+
+	* sysdeps/m68k/fpu/e_atan2.c: Use __signbit inline.
+	* sysdeps/m68k/fpu/e_pow.c: Likewise.  Write 0.0/0.0 for NaN.  Fix
+	typo in test for `y = 0.5'.
+
+	* sysdeps/m68k/fpu/__math.h: Define __trunc, __signbit,
+	__nearbyint.  Remove __modf.
+
+	* sysdeps/m68k/Makefile (CFLAGS-s_copysignl.c) [$(subdir)=math]:
+	Define for gcc bug workaround.
+
+	* math/libm-test.c (log2_test): Add epsilon for long double to
+	"log2 (e)" and "log2 (16)".
+	(modf_test): Fix test name.
+	(sqrt_test): Add missing FUNC.
+
+1997-03-29 16:24  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sunrpc/Makefile (CFLAGS-xrquota.c): Fix typo in variable name.
+
+1997-03-28 20:56  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* stdlib/stdlib.h: Declare __clearenv.
+
+1997-03-28 18:03  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/libm-ieee754/s_asinhl.c: Fix Ulrich Dreppers mangling of
+	the last change.
+
+1997-03-28 17:55  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* configure.in: Call AC_CANONICAL_BUILD before referencing
+	$build.  Fix test for BUILD_CC.
+
+1997-04-02 01:29  Philip Blundell  <pjb27@cam.ac.uk>
+
+	* sysdeps/libm-ieee754/s_log2f.c (__log2f): Fix typo.
+
+1997-03-31 18:53  Philip Blundell  <pjb27@cam.ac.uk>
+
+	* sysdeps/unix/sysv/linux/net/route.h: Add new IPv6 definitions.
+
+1997-04-01 14:08  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/i386/memset.c: Fix typo.
+	* sysdeps/stub/fchmod.c: Fix typo.
+	* sysdeps/stub/fchdir.c: Fix typo.
+	Reported by Fila Kolodny <fila@ibi.com>.
+
 1997-04-01 00:37  Ulrich Drepper  <drepper@cygnus.com>
 
 	* math/Makefile: Prevent inlining for test-{float,double,longdouble}.
diff --git a/FAQ b/FAQ
index f8a638fd3b..9e70f8c95f 100644
--- a/FAQ
+++ b/FAQ
@@ -77,6 +77,13 @@ please let me know.
 
 [Q21]    ``On Linux I've got problems with the declarations in Linux
            kernel headers.''
+
+[Q22]	``When I try to compile code which uses IPv6 header and
+	  definitions on my Linux 2.x.y system I am in trouble.
+	  Nothing seems to work.''
+
+[Q23]	``When compiling GNU libc I get lots of errors saying functions
+	  in glibc are duplicated in libgcc.''
 
 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 [Q1]	``What systems does the GNU C Library run on?''
@@ -637,6 +644,37 @@ results because of type conflicts.
 
 
 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+[Q22]	``When I try to compile code which uses IPv6 header and
+	  definitions on my Linux 2.x.y system I am in trouble.
+	  Nothing seems to work.''
+
+[A22] {UD} The problem is that the IPv6 development still has not reached
+a point where it is stable.  There are still lots of incompatible changes
+made and the libc headers have to follow.
+
+Currently (as of 970401) according to Philip Blundell <pjb27@cam.ac.uk>
+the required kernel version is 2.1.30.
+
+
+~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+[Q23]	``When compiling GNU libc I get lots of errors saying functions
+	  in glibc are duplicated in libgcc.''
+
+[A23] {EY} This is *exactly* the same problem that I was having.  The
+problem was due to the fact that the autoconfigure didn't correctly
+detect that linker flag --no-whole-archive was supported in my linker.
+In my case it was because I had run ./configure with bogus CFLAGS, and
+the test failed.
+
+One thing that is particularly annoying about this problem is that
+once this is misdetected, running configure again won't fix it unless
+you first delete config.cache.
+
+{UD} Starting with glibc-2.0.3 there should be a better test to avoid
+some problems of this kind.  The setting of CFLAGS is checked at the
+very beginning and if it is not usable `configure' will bark.
+
+~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 
 Answers were given by:
 {UD} Ulrich Drepper, <drepper@cygnus.com>
@@ -644,6 +682,7 @@ Answers were given by:
 {RM} Roland McGrath, <roland@gnu.ai.mit.edu>
 {HJL} H.J. Lu, <hjl@gnu.ai.mit.edu>
 {AJ} Andreas Jaeger, <aj@arthur.pfalz.de>
+{EY} Eric Youngdale, <eric@andante.jic.com>
 
 Local Variables:
  mode:text
diff --git a/configure b/configure
index f7bda11980..c04f1a0c36 100755
--- a/configure
+++ b/configure
@@ -1290,11 +1290,31 @@ else
   test "${CFLAGS+set}" = set || CFLAGS="-g"
 fi
 
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:1295: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+  case $nonopt in
+  NONE) build_alias=$host_alias ;;
+  *) build_alias=$nonopt ;;
+  esac ;;
+esac
+
+build=`$ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
 if test $host != $build; then
-  # Extract the first word of "gcc cc", so it can be a program name with args.
-set dummy gcc cc; ac_word=$2
+  for ac_prog in gcc cc
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1298: checking for $ac_word" >&5
+echo "configure:1318: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_BUILD_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1305,7 +1325,7 @@ else
   for ac_dir in $PATH; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_BUILD_CC=""
+      ac_cv_prog_BUILD_CC="$ac_prog"
       break
     fi
   done
@@ -1319,9 +1339,12 @@ else
   echo "$ac_t""no" 1>&6
 fi
 
+test -n "$BUILD_CC" && break
+done
+
 fi
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1325: checking how to run the C preprocessor" >&5
+echo "configure:1348: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -1336,13 +1359,13 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 1340 "configure"
+#line 1363 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1346: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1369: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   :
@@ -1353,13 +1376,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 1357 "configure"
+#line 1380 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1363: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1386: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   :
@@ -1381,24 +1404,6 @@ else
 fi
 echo "$ac_t""$CPP" 1>&6
 
-echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:1386: checking build system type" >&5
-
-build_alias=$build
-case "$build_alias" in
-NONE)
-  case $nonopt in
-  NONE) build_alias=$host_alias ;;
-  *) build_alias=$nonopt ;;
-  esac ;;
-esac
-
-build=`$ac_config_sub $build_alias`
-build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-echo "$ac_t""$build" 1>&6
-
 if test $host != $build; then
   ac_tool_prefix=${host_alias}-
 else
@@ -1408,7 +1413,7 @@ fi
 # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ar; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1412: checking for $ac_word" >&5
+echo "configure:1417: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1439,7 +1444,7 @@ fi
 # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1443: checking for $ac_word" >&5
+echo "configure:1448: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1470,7 +1475,7 @@ if test -n "$ac_tool_prefix"; then
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1474: checking for $ac_word" >&5
+echo "configure:1479: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1505,7 +1510,7 @@ fi
 # Extract the first word of "bash", so it can be a program name with args.
 set dummy bash; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1509: checking for $ac_word" >&5
+echo "configure:1514: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_BASH'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1546,7 +1551,7 @@ if test "$BASH" = no; then
   # Extract the first word of "ksh", so it can be a program name with args.
 set dummy ksh; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1550: checking for $ac_word" >&5
+echo "configure:1555: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_KSH'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1588,7 +1593,7 @@ fi
 
 
 echo $ac_n "checking for signed size_t type""... $ac_c" 1>&6
-echo "configure:1592: checking for signed size_t type" >&5
+echo "configure:1597: checking for signed size_t type" >&5
 if eval "test \"`echo '$''{'libc_cv_signed_size_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1612,12 +1617,12 @@ EOF
 fi
 
 echo $ac_n "checking for libc-friendly stddef.h""... $ac_c" 1>&6
-echo "configure:1616: checking for libc-friendly stddef.h" >&5
+echo "configure:1621: checking for libc-friendly stddef.h" >&5
 if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1621 "configure"
+#line 1626 "configure"
 #include "confdefs.h"
 #define __need_size_t
 #define __need_wchar_t
@@ -1632,7 +1637,7 @@ size_t size; wchar_t wchar;
 if (&size == NULL || &wchar == NULL) abort ();
 ; return 0; }
 EOF
-if { (eval echo configure:1636: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1641: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   libc_cv_friendly_stddef=yes
 else
@@ -1651,7 +1656,7 @@ override stddef.h = # The installed <stddef.h> seems to be libc-friendly."
 fi
 
 echo $ac_n "checking whether we need to use -P to assemble .S files""... $ac_c" 1>&6
-echo "configure:1655: checking whether we need to use -P to assemble .S files" >&5
+echo "configure:1660: checking whether we need to use -P to assemble .S files" >&5
 if eval "test \"`echo '$''{'libc_cv_need_minus_P'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1674,7 +1679,7 @@ asm-CPPFLAGS = -P # The assembler can't grok cpp's # line directives."
 fi
 
 echo $ac_n "checking for assembler global-symbol directive""... $ac_c" 1>&6
-echo "configure:1678: checking for assembler global-symbol directive" >&5
+echo "configure:1683: checking for assembler global-symbol directive" >&5
 if eval "test \"`echo '$''{'libc_cv_asm_global_directive'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1704,7 +1709,7 @@ EOF
 fi
 
 echo $ac_n "checking for .set assembler directive""... $ac_c" 1>&6
-echo "configure:1708: checking for .set assembler directive" >&5
+echo "configure:1713: checking for .set assembler directive" >&5
 if eval "test \"`echo '$''{'libc_cv_asm_set_directive'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1738,7 +1743,7 @@ EOF
 fi
 
 echo $ac_n "checking for .symver assembler directive""... $ac_c" 1>&6
-echo "configure:1742: checking for .symver assembler directive" >&5
+echo "configure:1747: checking for .symver assembler directive" >&5
 if eval "test \"`echo '$''{'libc_cv_asm_symver_directive'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1757,7 +1762,7 @@ fi
 
 echo "$ac_t""$libc_cv_asm_symver_directive" 1>&6
 echo $ac_n "checking for ld --version-script""... $ac_c" 1>&6
-echo "configure:1761: checking for ld --version-script" >&5
+echo "configure:1766: checking for ld --version-script" >&5
 if eval "test \"`echo '$''{'libc_cv_ld_version_script_option'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1774,7 +1779,7 @@ VERS {
 EOF
   if ${CC-cc} -c $CFLAGS $CPPFLAGS conftest.s 1>&5 2>&5; then
     if { ac_try='${CC-cc} $CFLAGS --shared -o conftest.so conftest.o
-					-Wl,--version-script,conftest.map'; { (eval echo configure:1778: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; };
+					-Wl,--version-script,conftest.map'; { (eval echo configure:1783: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; };
     then
       libc_cv_ld_version_script_option=yes
     else
@@ -1804,7 +1809,7 @@ fi
 
 if test $elf = yes; then
   echo $ac_n "checking for .previous assembler directive""... $ac_c" 1>&6
-echo "configure:1808: checking for .previous assembler directive" >&5
+echo "configure:1813: checking for .previous assembler directive" >&5
 if eval "test \"`echo '$''{'libc_cv_asm_previous_directive'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1812,7 +1817,7 @@ else
 .section foo_section
 .previous
 EOF
-  if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1816: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+  if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1821: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
     libc_cv_asm_previous_directive=yes
   else
     libc_cv_asm_previous_directive=no
@@ -1828,7 +1833,7 @@ EOF
 
   else
     echo $ac_n "checking for .popsection assembler directive""... $ac_c" 1>&6
-echo "configure:1832: checking for .popsection assembler directive" >&5
+echo "configure:1837: checking for .popsection assembler directive" >&5
 if eval "test \"`echo '$''{'libc_cv_asm_popsection_directive'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1836,7 +1841,7 @@ else
 .pushsection foo_section
 .popsection
 EOF
-    if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1840: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+    if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1845: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
       libc_cv_asm_popsection_directive=yes
     else
       libc_cv_asm_popsection_directive=no
@@ -1856,12 +1861,12 @@ fi
 
 if test $elf != yes; then
   echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6
-echo "configure:1860: checking for .init and .fini sections" >&5
+echo "configure:1865: checking for .init and .fini sections" >&5
 if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1865 "configure"
+#line 1870 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -1870,7 +1875,7 @@ asm (".section .init");
 				    asm (".text");
 ; return 0; }
 EOF
-if { (eval echo configure:1874: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1879: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   libc_cv_have_initfini=yes
 else
@@ -1895,19 +1900,19 @@ if test $elf = yes; then
   libc_cv_asm_underscores=no
 else
   echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6
-echo "configure:1899: checking for _ prefix on C symbol names" >&5
+echo "configure:1904: checking for _ prefix on C symbol names" >&5
 if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1904 "configure"
+#line 1909 "configure"
 #include "confdefs.h"
 asm ("_glibc_foobar:");
 int main() {
 glibc_foobar ();
 ; return 0; }
 EOF
-if { (eval echo configure:1911: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1916: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   libc_cv_asm_underscores=yes
 else
@@ -1934,7 +1939,7 @@ if test $elf = yes; then
   libc_cv_asm_weakext_directive=no
 else
   echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6
-echo "configure:1938: checking for assembler .weak directive" >&5
+echo "configure:1943: checking for assembler .weak directive" >&5
 if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1957,7 +1962,7 @@ echo "$ac_t""$libc_cv_asm_weak_directive" 1>&6
 
 if test $libc_cv_asm_weak_directive = no; then
   echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6
-echo "configure:1961: checking for assembler .weakext directive" >&5
+echo "configure:1966: checking for assembler .weakext directive" >&5
 if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1994,7 +1999,7 @@ EOF
 fi
 
 echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6
-echo "configure:1998: checking for ld --no-whole-archive" >&5
+echo "configure:2003: checking for ld --no-whole-archive" >&5
 if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2005,7 +2010,7 @@ __throw () {}
 EOF
 if { ac_try='${CC-cc} $CFLAGS
 			    -nostdlib -nostartfiles -Wl,--no-whole-archive
-			    -o conftest conftest.c'; { (eval echo configure:2009: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+			    -o conftest conftest.c'; { (eval echo configure:2014: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
   libc_cv_ld_no_whole_archive=yes
 else
   libc_cv_ld_no_whole_archive=no
@@ -2016,7 +2021,7 @@ fi
 echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6
 
 echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6
-echo "configure:2020: checking for gcc -fno-exceptions" >&5
+echo "configure:2025: checking for gcc -fno-exceptions" >&5
 if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2027,7 +2032,7 @@ __throw () {}
 EOF
 if { ac_try='${CC-cc} $CFLAGS
 			    -nostdlib -nostartfiles -fno-exceptions
-			    -o conftest conftest.c'; { (eval echo configure:2031: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+			    -o conftest conftest.c'; { (eval echo configure:2036: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
   libc_cv_gcc_no_exceptions=yes
 else
   libc_cv_gcc_no_exceptions=no
@@ -2079,7 +2084,7 @@ if test "$uname" = generic; then
   fi
 
   echo $ac_n "checking OS release for uname""... $ac_c" 1>&6
-echo "configure:2083: checking OS release for uname" >&5
+echo "configure:2088: checking OS release for uname" >&5
 if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2101,7 +2106,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6
   uname_release="$libc_cv_uname_release"
 
   echo $ac_n "checking OS version for uname""... $ac_c" 1>&6
-echo "configure:2105: checking OS version for uname" >&5
+echo "configure:2110: checking OS version for uname" >&5
 if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2123,7 +2128,7 @@ else
 fi
 
 echo $ac_n "checking stdio selection""... $ac_c" 1>&6
-echo "configure:2127: checking stdio selection" >&5
+echo "configure:2132: checking stdio selection" >&5
 
 case $stdio in
 libio) cat >> confdefs.h <<\EOF
@@ -2329,13 +2334,13 @@ s%@INSTALL_DATA@%$INSTALL_DATA%g
 s%@LN_S@%$LN_S%g
 s%@MSGFMT@%$MSGFMT%g
 s%@CC@%$CC%g
-s%@BUILD_CC@%$BUILD_CC%g
-s%@CPP@%$CPP%g
 s%@build@%$build%g
 s%@build_alias@%$build_alias%g
 s%@build_cpu@%$build_cpu%g
 s%@build_vendor@%$build_vendor%g
 s%@build_os@%$build_os%g
+s%@BUILD_CC@%$BUILD_CC%g
+s%@CPP@%$CPP%g
 s%@AR@%$AR%g
 s%@RANLIB@%$RANLIB%g
 s%@BASH@%$BASH%g
diff --git a/configure.in b/configure.in
index 1cf1290496..3a0f1a22f3 100644
--- a/configure.in
+++ b/configure.in
@@ -360,8 +360,9 @@ AC_PROG_LN_S
 AC_CHECK_PROGS(MSGFMT, msgfmt gmsgfmt, :)
 
 AC_PROG_CC
+AC_CANONICAL_BUILD
 if test $host != $build; then
-  AC_CHECK_PROG(BUILD_CC, gcc cc)
+  AC_CHECK_PROGS(BUILD_CC, gcc cc)
 fi
 AC_PROG_CPP
 AC_CHECK_TOOL(AR, ar)
diff --git a/grp/fgetgrent.c b/grp/fgetgrent.c
index 9873ba1b61..0b461ad5fe 100644
--- a/grp/fgetgrent.c
+++ b/grp/fgetgrent.c
@@ -16,20 +16,60 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <errno.h>
 #include <grp.h>
-#include <stdio.h>
+#include <libc-lock.h>
+#include <stdlib.h>
 
 
+/* We need to protect the dynamic buffer handling.  */
+__libc_lock_define_initialized (static, lock);
+
 /* Read one entry from the given stream.  */
 struct group *
 fgetgrent (FILE *stream)
 {
-  static char buffer[BUFSIZ];
+  static char *buffer;
+  static size_t buffer_size;
   static struct group resbuf;
   struct group *result;
+  int save;
+
+  /* Get lock.  */
+  __libc_lock_lock (lock);
+
+  /* Allocate buffer if not yet available.  */
+  if (buffer == NULL)
+    {
+      buffer_size = NSS_BUFLEN_GROUP;
+      buffer = malloc (buffer_size);
+    }
+
+  while (buffer != NULL
+	 && __fgetgrent_r (stream, &resbuf, buffer, buffer_size, &result) != 0
+	 && errno == ERANGE)
+    {
+      char *new_buf;
+      buffer_size += NSS_BUFLEN_GROUP;
+      new_buf = realloc (buffer, buffer_size);
+      if (new_buf == NULL)
+	{
+	  /* We are out of memory.  Free the current buffer so that the
+	     process gets a chance for a normal termination.  */
+	  save = errno;
+	  free (buffer);
+	  __set_errno (save);
+	}
+      buffer = new_buf;
+    }
+
+  if (buffer == NULL)
+    result = NULL;
 
-  if (__fgetgrent_r (stream, &resbuf, buffer, sizeof buffer, &result) != 0)
-    return NULL;
+  /* Release lock.  Preserve error value.  */
+  save = errno;
+  __libc_lock_unlock (lock);
+  __set_errno (save);
 
   return result;
 }
diff --git a/grp/fgetgrent_r.c b/grp/fgetgrent_r.c
index dd74cfcd70..44298c5ba6 100644
--- a/grp/fgetgrent_r.c
+++ b/grp/fgetgrent_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -56,6 +56,7 @@ __fgetgrent_r (FILE *stream, struct group *resbuf, char *buffer, size_t buflen,
 	       struct group **result)
 {
   char *p;
+  int parse_result;
 
   do
     {
@@ -69,10 +70,18 @@ __fgetgrent_r (FILE *stream, struct group *resbuf, char *buffer, size_t buflen,
       /* Skip leading blanks.  */
       while (isspace (*p))
 	++p;
-    } while (*p == '\0' || *p == '#' ||	/* Ignore empty and comment lines.  */
+    } while (*p == '\0' || *p == '#'	/* Ignore empty and comment lines.  */
 	     /* Parse the line.  If it is invalid, loop to
 		get the next line of the file to parse.  */
-	     ! parse_line (p, resbuf, (void *) buffer, buflen));
+	     || ! (parse_result = parse_line (p, resbuf,
+					      (void *) buffer, buflen)));
+
+  if (parse_result == -1)
+    {
+      /* The parser ran out of space.  */
+      *result = NULL;
+      return errno;
+    }
 
   *result = resbuf;
   return 0;
diff --git a/manual/errno.texi b/manual/errno.texi
index e346dd5f1f..bba820869e 100644
--- a/manual/errno.texi
+++ b/manual/errno.texi
@@ -1186,6 +1186,18 @@ They are not yet documented.}
 @comment errno ???/121
 @end deftypevr
 
+@comment errno.h
+@comment Linux???: No medium found
+@deftypevr Macro int ENOMEDIUM
+@comment errno ???/???
+@end deftypevr
+
+@comment errno.h
+@comment Linux???: Wrong medium type
+@deftypevr Macro int EMEDIUMTYPE
+@comment errno ???/???
+@end deftypevr
+
 @node Error Messages,  , Error Codes, Error Reporting
 @section Error Messages
 
@@ -1214,6 +1226,25 @@ overwritten.  (But it's guaranteed that no library function ever calls
 The function @code{strerror} is declared in @file{string.h}.
 @end deftypefun
 
+@comment string.h
+@comment GNU
+@deftypefun {char *} strerror_r (int @var{errnum}, char *@var{buf}, size_t @var{n})
+The @code{strerror_r} function works like @code{strerror} but instead of
+returning the error message in a statically allocated buffer shared by
+all threads in the process, it writes the message string in the user
+supplied buffer starting at @var{buf} with the length of @var{n} bytes.
+
+At most @var{n} characters are written (including the NUL byte) so it is
+up to the user to select the buffer large enough.
+
+This function should always be used in multi-threaded programs since
+there is no way to guarantee the string returned by @code{strerror}
+really belongs to the last call of the current thread.
+
+This function @code{strerror_r} is a GNU extension and it is declared in
+@file{string.h}.
+@end deftypefun
+
 @comment stdio.h
 @comment ISO
 @deftypefun void perror (const char *@var{message})
diff --git a/math/libm-test.c b/math/libm-test.c
index 1271177236..a7a53cb6bc 100644
--- a/math/libm-test.c
+++ b/math/libm-test.c
@@ -901,9 +901,10 @@ log2_test (void)
 
   check_isinfp ("log2 (+inf) == +inf", FUNC(log2) (plus_infty));
 
-  check ("log2 (e) == M_LOG2E", FUNC(log2) (M_E), M_LOG2E);
+  check_eps ("log2 (e) == M_LOG2E", FUNC(log2) (M_E), M_LOG2E,
+	     CHOOSE (1e-18L, 0, 0));
   check ("log2 (2) == 1", FUNC(log2) (2.0), 1);
-  check ("log2 (16) == 4", FUNC(log2) (16.0), 4);
+  check_eps ("log2 (16) == 4", FUNC(log2) (16.0), 4, CHOOSE (1e-18L, 0, 0));
   check ("log2 (256) == 8", FUNC(log2) (256.0), 8);
 
 }
@@ -944,7 +945,7 @@ modf_test (void)
 
   result = FUNC(modf) (nan_value, &intpart);
   check_isnan ("modf (NaN, &x) returns NaN", result);
-  check_isnan ("modf (-inf, &x) sets x to NaN", intpart);
+  check_isnan ("modf (NaN, &x) sets x to NaN", intpart);
 
   result = FUNC(modf) (0, &intpart);
   check ("modf (0, &x) returns 0", result, 0);
@@ -1498,7 +1499,7 @@ sqrt_test (void)
   check_isinfp ("sqrt (+inf) == +inf", FUNC(sqrt) (plus_infty));
 
   x = random_value (0, 10000);
-  check_ext ("sqrt (x*x) == x", sqrt (x*x), x, x);
+  check_ext ("sqrt (x*x) == x", FUNC(sqrt) (x*x), x, x);
   check ("sqrt (4) == 2", FUNC(sqrt) (4), 2);
 }
 
diff --git a/nss/getXXbyYY.c b/nss/getXXbyYY.c
index 542072be25..f81df05381 100644
--- a/nss/getXXbyYY.c
+++ b/nss/getXXbyYY.c
@@ -122,6 +122,9 @@ FUNCTION_NAME (ADD_PARAMS)
       buffer = new_buf;
     }
 
+  if (buffer == NULL)
+    result = NULL;
+
 #ifdef HANDLE_DIGITS_DOTS
 done:
 #endif
diff --git a/nss/getXXent.c b/nss/getXXent.c
index f180171150..eeb03dfa37 100644
--- a/nss/getXXent.c
+++ b/nss/getXXent.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -69,7 +69,7 @@ GETFUNC_NAME (void)
   static char *buffer;
   static size_t buffer_size;
   static LOOKUP_TYPE resbuf;
-  LOOKUP_TYPE *result = NULL;
+  LOOKUP_TYPE *result;
   int save;
 
   /* Get lock.  */
@@ -103,6 +103,9 @@ GETFUNC_NAME (void)
       buffer = new_buf;
     }
 
+  if (buffer == NULL)
+    result = NULL;
+
   /* Release lock.  Preserve error value.  */
   save = errno;
   __libc_lock_unlock (lock);
diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c
index d3ff520227..7472496a10 100644
--- a/nss/nss_files/files-XXX.c
+++ b/nss/nss_files/files-XXX.c
@@ -1,5 +1,5 @@
 /* Common code for file-based databases in nss_files module.
-   Copyright (C) 1996 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -146,6 +146,7 @@ internal_getent (struct STRUCTURE *result,
   char *p;
   struct parser_data *data = (void *) buffer;
   int linebuflen = buffer + buflen - data->linebuffer;
+  int parse_result;
 
   if (buflen < (int) sizeof *data + 1)
     {
@@ -182,10 +183,10 @@ internal_getent (struct STRUCTURE *result,
   while (*p == '\0' || *p == '#' /* Ignore empty and comment lines.  */
 	 /* Parse the line.  If it is invalid, loop to get the next
 	    line of the file to parse.  */
-	 || ! parse_line (p, result, data, buflen));
+	 || ! (parse_result = parse_line (p, result, data, buflen)));
 
   /* Filled in RESULT with the next entry from the database file.  */
-  return NSS_STATUS_SUCCESS;
+  return parse_result == -1 ? NSS_STATUS_TRYAGAIN : NSS_STATUS_SUCCESS;
 }
 
 
diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c
index 2e84d762f0..acf673da90 100644
--- a/nss/nss_files/files-parse.c
+++ b/nss/nss_files/files-parse.c
@@ -1,5 +1,5 @@
 /* Common code for file-based database parsers in nss_files module.
-   Copyright (C) 1996 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -152,7 +152,7 @@ parse_line (char *line, struct STRUCTURE *result,			      \
   if (list)								      \
     result->TRAILING_LIST_MEMBER = list;				      \
   else 									      \
-    return 0;								      \
+    return -1;		/* -1 indicates we ran out of space.  */	      \
 }
 
 static inline char **
@@ -189,29 +189,26 @@ parse_list (char *line, struct parser_data *data, size_t datalen)
       if (*line == '\0')
 	break;
 
+      /* Skip leading white space.  This might not be portable but useful.  */
+      while (isspace (*line))
+	++line;
+
       elt = line;
       while (1)
 	{
-	  if (TRAILING_LIST_SEPARATOR_P (*line))
-	    {
-	      *p++ = elt;
-	      *line = '\0';
-	      do
-		++line;
-	      while (isspace (*line));
-	      elt = line;
-	    }
-	  else if (*line == '\0')
+	  if (*line == '\0' || TRAILING_LIST_SEPARATOR_P (*line))
 	    {
-	      /* End of the line.  */
+	      /* End of the next entry.  */
 	      if (line > elt)
-		/* Last element.  */
+		/* We really found some data.  */
 		*p++ = elt;
-	      *line = '\0';
+
+	      /* Terminate string if necessary.  */
+	      if (*line != '\0')
+		*line++ = '\0';
 	      break;
 	    }
-	  else
-	    ++line;
+	  ++line;
 	}
     }
   *p = NULL;
diff --git a/pwd/fgetpwent.c b/pwd/fgetpwent.c
index 2f7db94c02..63f62fcf6d 100644
--- a/pwd/fgetpwent.c
+++ b/pwd/fgetpwent.c
@@ -16,20 +16,60 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <errno.h>
+#include <libc-lock.h>
 #include <pwd.h>
-#include <stdio.h>
+#include <stdlib.h>
 
 
+/* We need to protect the dynamic buffer handling.  */
+__libc_lock_define_initialized (static, lock);
+
 /* Read one entry from the given stream.  */
 struct passwd *
 fgetpwent (FILE *stream)
 {
-  static char buffer[BUFSIZ];
+  static char *buffer;
+  static size_t buffer_size;
   static struct passwd resbuf;
   struct passwd *result;
+  int save;
+
+  /* Get lock.  */
+  __libc_lock_lock (lock);
+
+  /* Allocate buffer if not yet available.  */
+  if (buffer == NULL)
+    {
+      buffer_size = NSS_BUFLEN_PASSWD;
+      buffer = malloc (buffer_size);
+    }
+
+  while (buffer != NULL
+	 && __fgetpwent_r (stream, &resbuf, buffer, buffer_size, &result) != 0
+	 && errno == ERANGE)
+    {
+      char *new_buf;
+      buffer_size += NSS_BUFLEN_PASSWD;
+      new_buf = realloc (buffer, buffer_size);
+      if (new_buf == NULL)
+	{
+	  /* We are out of memory.  Free the current buffer so that the
+	     process gets a chance for a normal termination.  */
+	  save = errno;
+	  free (buffer);
+	  __set_errno (save);
+	}
+      buffer = new_buf;
+    }
+
+  if (buffer == NULL)
+    result = NULL;
 
-  if (__fgetpwent_r (stream, &resbuf, buffer, sizeof buffer, &result) != 0)
-    return NULL;
+  /* Release lock.  Preserve error value.  */
+  save = errno;
+  __libc_lock_unlock (lock);
+  __set_errno (save);
 
   return result;
 }
diff --git a/shadow/fgetspent.c b/shadow/fgetspent.c
index 6fe813b520..bd54c7e595 100644
--- a/shadow/fgetspent.c
+++ b/shadow/fgetspent.c
@@ -16,18 +16,63 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <errno.h>
+#include <libc-lock.h>
 #include <shadow.h>
-#include <stdio.h>
+#include <stdlib.h>
 
 
+/* A reasonable size for a buffer to start with.  */
+#define BUFLEN_SPWD 1024
+
+/* We need to protect the dynamic buffer handling.  */
+__libc_lock_define_initialized (static, lock);
+
 /* Read one shadow entry from the given stream.  */
 struct spwd *
 fgetspent (FILE *stream)
 {
-  static char buffer[BUFSIZ];
+  static char *buffer;
+  static size_t buffer_size;
   static struct spwd resbuf;
   struct spwd *result;
+  int save;
+
+  /* Get lock.  */
+  __libc_lock_lock (lock);
+
+  /* Allocate buffer if not yet available.  */
+  if (buffer == NULL)
+    {
+      buffer_size = BUFLEN_SPWD;
+      buffer = malloc (buffer_size);
+    }
+
+  while (buffer != NULL
+	 && __fgetspent_r (stream, &resbuf, buffer, buffer_size, &result) != 0
+	 && errno == ERANGE)
+    {
+      char *new_buf;
+      buffer_size += BUFLEN_SPWD;
+      new_buf = realloc (buffer, buffer_size);
+      if (new_buf == NULL)
+	{
+	  /* We are out of memory.  Free the current buffer so that the
+	     process gets a chance for a normal termination.  */
+	  save = errno;
+	  free (buffer);
+	  __set_errno (save);
+	}
+      buffer = new_buf;
+    }
+
+  if (buffer == NULL)
+    result = NULL;
+
+  /* Release lock.  Preserve error value.  */
+  save = errno;
+  __libc_lock_unlock (lock);
+  __set_errno (save);
 
-  return __fgetspent_r (stream, &resbuf, buffer, sizeof buffer, &result)
-    ? NULL : result;
+  return result;
 }
diff --git a/shadow/sgetspent.c b/shadow/sgetspent.c
index 05d997c1bf..ecfe01ed1d 100644
--- a/shadow/sgetspent.c
+++ b/shadow/sgetspent.c
@@ -16,33 +16,63 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <errno.h>
+#include <libc-lock.h>
 #include <shadow.h>
-#include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 
 
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
+/* A reasonable size for a buffer to start with.  */
+#define BUFLEN_SPWD 1024
+
+/* We need to protect the dynamic buffer handling.  */
+__libc_lock_define_initialized (static, lock);
 
 /* Read one shadow entry from the given stream.  */
 struct spwd *
 sgetspent (const char *string)
 {
+  static char *buffer;
+  static size_t buffer_size;
   static struct spwd resbuf;
-  static int max_size = 0;
-  static char *buffer = NULL;
   struct spwd *result;
-  int len;
+  int save;
+
+  /* Get lock.  */
+  __libc_lock_lock (lock);
 
-  len = strlen (string) + 1;
-  if (len > max_size)
+  /* Allocate buffer if not yet available.  */
+  if (buffer == NULL)
     {
-      max_size = MAX (128, len + 32);
-      buffer = realloc (buffer, max_size);
-      if (buffer == NULL)
-	return NULL;
+      buffer_size = BUFLEN_SPWD;
+      buffer = malloc (buffer_size);
     }
 
-  return __sgetspent_r (string, &resbuf, buffer, max_size, &result)
-    ? NULL : result;
+  while (buffer != NULL
+	 && __sgetspent_r (string, &resbuf, buffer, buffer_size, &result) != 0
+	 && errno == ERANGE)
+    {
+      char *new_buf;
+      buffer_size += BUFLEN_SPWD;
+      new_buf = realloc (buffer, buffer_size);
+      if (new_buf == NULL)
+	{
+	  /* We are out of memory.  Free the current buffer so that the
+	     process gets a chance for a normal termination.  */
+	  save = errno;
+	  free (buffer);
+	  __set_errno (save);
+	}
+      buffer = new_buf;
+    }
+
+  if (buffer == NULL)
+    result = NULL;
+
+  /* Release lock.  Preserve error value.  */
+  save = errno;
+  __libc_lock_unlock (lock);
+  __set_errno (save);
+
+  return result;
 }
diff --git a/shadow/sgetspent_r.c b/shadow/sgetspent_r.c
index fb7d0158d9..8aa5a9bdc1 100644
--- a/shadow/sgetspent_r.c
+++ b/shadow/sgetspent_r.c
@@ -90,8 +90,9 @@ int
 __sgetspent_r (const char *string, struct spwd *resbuf, char *buffer,
 	       size_t buflen, struct spwd **result)
 {
-  *result = parse_line (strncpy (buffer, string, buflen), resbuf, NULL, 0)
-    ? resbuf : NULL;
+  int parse_result = parse_line (strncpy (buffer, string, buflen),
+				 resbuf, NULL, 0);
+  *result = parse_result > 0 ? resbuf : NULL;
 
   return *result == NULL ? errno : 0;
 }
diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h
index 6fad54eaf6..cc86d38361 100644
--- a/stdlib/stdlib.h
+++ b/stdlib/stdlib.h
@@ -437,6 +437,7 @@ extern void unsetenv __P ((__const char *__name));
 /* The `clearenv' was planned to be added to POSIX.1 but probably
    never made it.  Nevertheless the POSIX.9 standard (POSIX bindings
    for Fortran 77) requires this function.  */
+extern int __clearenv __P ((void));
 extern int clearenv __P ((void));
 #endif
 
diff --git a/stdlib/strtod.c b/stdlib/strtod.c
index 760ecd26a7..e0c9b08031 100644
--- a/stdlib/strtod.c
+++ b/stdlib/strtod.c
@@ -34,6 +34,8 @@
 # define SET_MANTISSA(flt, mant) \
   do { union ieee754_double u;						      \
        u.d = (flt);							      \
+       if ((mant & 0xfffffffffffffULL) == 0)				      \
+	 mant = 0x8000000000000ULL;					      \
        u.ieee.mantissa0 = ((mant) >> 32) & 0xfffff;			      \
        u.ieee.mantissa1 = (mant) & 0xffffffff;				      \
   } while (0)
@@ -627,7 +629,8 @@ INTERNAL (STRTOF) (nptr, endptr, group)
   expp = cp;
 
   /* Read exponent.  */
-  if (TOLOWER (c) == (base == 16 ? L_('p') : L_('e')))
+  if ((base == 16 && TOLOWER (c) == L_('p'))
+      || (base != 16 && TOLOWER (c) == L_('e')))
     {
       int exp_negative = 0;
 
diff --git a/stdlib/strtof.c b/stdlib/strtof.c
index 0a0046daf9..026b5eead3 100644
--- a/stdlib/strtof.c
+++ b/stdlib/strtof.c
@@ -9,6 +9,8 @@
 #define SET_MANTISSA(flt, mant) \
   do { union ieee754_float u;						      \
        u.f = (flt);							      \
+       if ((mant & 0x7fffff) == 0)					      \
+	 mant = 0x400000;						      \
        u.ieee.mantissa = (mant) & 0x7fffff;				      \
        (flt) = u.f;							      \
   } while (0)
diff --git a/stdlib/strtold.c b/stdlib/strtold.c
index 1dc0ac37c2..9747232ef2 100644
--- a/stdlib/strtold.c
+++ b/stdlib/strtold.c
@@ -9,7 +9,9 @@
 #define SET_MANTISSA(flt, mant) \
   do { union ieee854_long_double u;					      \
        u.d = (flt);							      \
-       u.ieee.mantissa0 = ((mant) >> 32) & 0x7fffffff;			      \
+       if ((mant & 0x7fffffffffffffffULL) == 0)				      \
+	 mant = 0x4000000000000000ULL;					      \
+       u.ieee.mantissa0 = (((mant) >> 32) & 0x7fffffff) | 0x80000000;	      \
        u.ieee.mantissa1 = (mant) & 0xffffffff;				      \
        (flt) = u.d;							      \
   } while (0)
diff --git a/sunrpc/Makefile b/sunrpc/Makefile
index 9feff64c53..5effc5ecbe 100644
--- a/sunrpc/Makefile
+++ b/sunrpc/Makefile
@@ -104,7 +104,7 @@ CFLAGS-xmount.c = -Wno-unused
 CFLAGS-xrusers.c = -Wno-unused
 CFLAGS-xspray.c = -Wno-unused
 CFLAGS-xnfs_prot.c = -Wno-unused
-CFLAGS-xrquote.c = -Wno-unused
+CFLAGS-xrquota.c = -Wno-unused
 
 include ../Rules
 
diff --git a/sysdeps/gnu/errlist.awk b/sysdeps/gnu/errlist.awk
index a640fe5a11..87444db8d3 100644
--- a/sysdeps/gnu/errlist.awk
+++ b/sysdeps/gnu/errlist.awk
@@ -16,7 +16,7 @@
 # not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 # Cambridge, MA 02139, USA.
 
-# errno.texinfo contains lines like:
+# errno.texi contains lines like:
 # @comment errno.h
 # @comment POSIX.1: Function not implemented
 # @deftypevr Macro int ENOSYS
diff --git a/sysdeps/gnu/errlist.c b/sysdeps/gnu/errlist.c
index 700b69f58f..f998747848 100644
--- a/sysdeps/gnu/errlist.c
+++ b/sysdeps/gnu/errlist.c
@@ -797,6 +797,14 @@ TRANS This error code has no purpose. */
 /* */
     [EREMOTEIO] = N_("Remote I/O error"),
 #endif
+#ifdef ENOMEDIUM
+/* */
+    [ENOMEDIUM] = N_("No medium found"),
+#endif
+#ifdef EMEDIUMTYPE
+/* */
+    [EMEDIUMTYPE] = N_("Wrong medium type"),
+#endif
   };
 
 const int _sys_nerr = sizeof _sys_errlist / sizeof _sys_errlist[0];
diff --git a/sysdeps/i386/memset.c b/sysdeps/i386/memset.c
index e1e12fb742..454c7385af 100644
--- a/sysdeps/i386/memset.c
+++ b/sysdeps/i386/memset.c
@@ -23,7 +23,7 @@
 
 #ifdef	__GNUC__
 
-vod *
+void *
 memset (void *dstpp, int c, size_t len)
 {
   unsigned long int dstp = (unsigned long int) dstpp;
diff --git a/sysdeps/libm-ieee754/s_asinhl.c b/sysdeps/libm-ieee754/s_asinhl.c
index d5b307753e..6eb434c44b 100644
--- a/sysdeps/libm-ieee754/s_asinhl.c
+++ b/sysdeps/libm-ieee754/s_asinhl.c
@@ -65,6 +65,6 @@ huge=  1.000000000000000000e+4900L;
 	    t = x*x;
 	    w =__log1pl(fabsl(x)+t/(one+__ieee754_sqrtl(one+t)));
 	}
-	if(hx>0x8000) return -w; else return w;
+	if(hx&0x8000) return -w; else return w;
 }
 weak_alias (__asinhl, asinhl)
diff --git a/sysdeps/libm-ieee754/s_log2f.c b/sysdeps/libm-ieee754/s_log2f.c
index c204e2266a..6415c37f53 100644
--- a/sysdeps/libm-ieee754/s_log2f.c
+++ b/sysdeps/libm-ieee754/s_log2f.c
@@ -69,7 +69,7 @@ static float zero   =  0.0;
 	if((0x007fffff&(15+ix))<16) {	/* |f| < 2**-20 */
 	    if(f==zero) return dk;
 	    R = f*f*((float)0.5-(float)0.33333333333333333*f);
-	    return dk-(R-f);}
+	    return dk-(R-f);
 	}
  	s = f/((float)2.0+f);
 	z = s*s;
diff --git a/sysdeps/libm-ieee754/s_nan.c b/sysdeps/libm-ieee754/s_nan.c
index 0d065d5c72..35d92646c0 100644
--- a/sysdeps/libm-ieee754/s_nan.c
+++ b/sysdeps/libm-ieee754/s_nan.c
@@ -18,31 +18,25 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-/* XXX The ISO C 9X standard mentions a `n-char-sequence' which is provided
-   as the argument to this function but I have no clue what this means.
-   Perhaps it is a description of the bits set in the mantissa.  */
 #include <math.h>
-#ifdef HANDLE_TAGP
-# include <stdlib.h>
-# include <string.h>
-#else
-# include <ieee754.h>
-#endif
+#include <stdlib.h>
+#include <string.h>
+#include <ieee754.h>
 
 
 double
 __nan (const char *tagp)
 {
-#ifdef HANDLE_TAGP
-  /* If we ever should have use of the TAGP parameter we will use the
-     strtod function to analyze it.  */
-  char buf[6 + strlen (tagp)];
-  sprintf (buf, "NAN(%s)", tagp);
-  return strtod (buf, NULL);
-#else
   static const union ieee754_double nan_value =
-  { ieee: { mantissa1: 0x1, mantissa0: 0x0, exponent: 0x7ff, negative: 0 } };
+  { ieee: { mantissa1: 0, mantissa0: 0x80000, exponent: 0x7ff, negative: 0 } };
+
+  if (tagp[0] != '\0')
+    {
+      char buf[6 + strlen (tagp)];
+      sprintf (buf, "NAN(%s)", tagp);
+      return strtod (buf, NULL);
+    }
+
   return nan_value.d;
-#endif
 }
 weak_alias (__nan, nan)
diff --git a/sysdeps/libm-ieee754/s_nanf.c b/sysdeps/libm-ieee754/s_nanf.c
index 660f30daf3..8e6e3fc1fd 100644
--- a/sysdeps/libm-ieee754/s_nanf.c
+++ b/sysdeps/libm-ieee754/s_nanf.c
@@ -18,31 +18,25 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-/* XXX The ISO C 9X standard mentions a `n-char-sequence' which is provided
-   as the argument to this function but I have no clue what this means.
-   Perhaps it is a description of the bits set in the mantissa.  */
 #include <math.h>
-#ifdef HANDLE_TAGP
-# include <stdlib.h>
-# include <string.h>
-#else
-# include <ieee754.h>
-#endif
+#include <stdlib.h>
+#include <string.h>
+#include <ieee754.h>
 
 
 float
 __nanf (const char *tagp)
 {
-#ifdef HANDLE_TAGP
-  /* If we ever should have use of the TAGP parameter we will use the
-     strtod function to analyze it.  */
-  char buf[6 + strlen (tagp)];
-  sprintf (buf, "NAN(%s)", tagp);
-  return strtof (buf, NULL);
-#else
   static const union ieee754_float nan_value =
-  { ieee: { mantissa: 0x1, exponent: 0xff, negative: 0 } };
+  { ieee: { mantissa: 0x400000, exponent: 0xff, negative: 0 } };
+
+  if (tagp[0] != '\0')
+    {
+      char buf[6 + strlen (tagp)];
+      sprintf (buf, "NAN(%s)", tagp);
+      return strtof (buf, NULL);
+    }
+
   return nan_value.f;
-#endif
 }
 weak_alias (__nanf, nanf)
diff --git a/sysdeps/libm-ieee754/s_nanl.c b/sysdeps/libm-ieee754/s_nanl.c
index 4ade80424f..1cd026e00c 100644
--- a/sysdeps/libm-ieee754/s_nanl.c
+++ b/sysdeps/libm-ieee754/s_nanl.c
@@ -18,32 +18,26 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-/* XXX The ISO C 9X standard mentions a `n-char-sequence' which is provided
-   as the argument to this function but I have no clue what this means.
-   Perhaps it is a description of the bits set in the mantissa.  */
 #include <math.h>
-#ifdef HANDLE_TAGP
-# include <stdlib.h>
-# include <string.h>
-#else
-# include <ieee754.h>
-#endif
+#include <stdlib.h>
+#include <string.h>
+#include <ieee754.h>
 
 
 long double
 __nanl (const char *tagp)
 {
-#ifdef HANDLE_TAGP
-  /* If we ever should have use of the TAGP parameter we will use the
-     strtod function to analyze it.  */
-  char buf[6 + strlen (tagp)];
-  sprintf (buf, "NAN(%s)", tagp);
-  return strtold (buf, NULL);
-#else
   static const union ieee854_long_double nan_value =
-  { ieee: { mantissa1: 0x1, mantissa0: 0x80000000,
+  { ieee: { mantissa1: 0, mantissa0: 0xc0000000,
 	    exponent: 0x7fff, negative: 0 } };
+
+  if (tagp[0] != '\0')
+    {
+      char buf[6 + strlen (tagp)];
+      sprintf (buf, "NAN(%s)", tagp);
+      return strtold (buf, NULL);
+    }
+
   return nan_value.d;
-#endif
 }
 weak_alias (__nanl, nanl)
diff --git a/sysdeps/m68k/Makefile b/sysdeps/m68k/Makefile
index fc79d36804..0f811bc62e 100644
--- a/sysdeps/m68k/Makefile
+++ b/sysdeps/m68k/Makefile
@@ -34,3 +34,8 @@ long-double-fcts = yes
 ifeq ($(subdir),elf)
 CFLAGS-rtld.c += -Wno-uninitialized -Wno-unused
 endif
+
+ifeq ($(subdir),math)
+# Avoid a bug in gcc
+CFLAGS-s_copysignl.c += -mnobitfield
+endif
diff --git a/sysdeps/m68k/fpu/__math.h b/sysdeps/m68k/fpu/__math.h
index d6187015ea..9b52b32d0c 100644
--- a/sysdeps/m68k/fpu/__math.h
+++ b/sysdeps/m68k/fpu/__math.h
@@ -89,6 +89,7 @@ __inline_mathop(__significand, getman)
 
 __inline_mathop(__log2, log2)
 __inline_mathop(__exp2, twotox)
+__inline_mathop(__trunc, intrz)
 
 #if !defined __NO_MATH_INLINES && defined __OPTIMIZE__
 
@@ -111,6 +112,7 @@ __inline_mathop(significand, getman)
 #ifdef __USE_ISOC9X
 __inline_mathop(log2, log2)
 __inline_mathop(exp2, twotox)
+__inline_mathop(trunc, intrz)
 #endif
 
 #endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */
@@ -155,108 +157,123 @@ __internal_inline_functions (long double,l)
 
 /* The rest of the functions are available to the user.  */
 
-#define __inline_functions(float_type, s)				     \
-__m81_inline float_type							     \
-__m81_u(__CONCAT(__frexp,s))(float_type __value, int *__expptr)		     \
-{									     \
-  float_type __mantissa, __exponent;					     \
-  int __iexponent;							     \
-  if (__value == 0.0)							     \
-    {									     \
-      *__expptr = 0;							     \
-      return __value;							     \
-    }									     \
-  __asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value));	     \
-  __iexponent = (int) __exponent + 1;					     \
-  *__expptr = __iexponent;						     \
-  __asm("fscale%.l %2, %0" : "=f" (__mantissa)				     \
-	: "0" (__value), "dmi" (-__iexponent));				     \
-  return __mantissa;							     \
-}									     \
-									     \
-__m81_defun (float_type, __CONCAT(__floor,s), (float_type __x))		     \
-{									     \
-  float_type __result;							     \
-  unsigned long int __ctrl_reg;						     \
-  __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg));		     \
-  /* Set rounding towards negative infinity.  */			     \
-  __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs.  */		     \
-		      : "dmi" ((__ctrl_reg & ~0x10) | 0x20));		     \
-  /* Convert X to an integer, using -Inf rounding.  */			     \
-  __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x));	     \
-  /* Restore the previous rounding mode.  */				     \
-  __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs.  */		     \
-		      : "dmi" (__ctrl_reg));				     \
-  return __result;							     \
-}									     \
-									     \
-__m81_defun (float_type, __CONCAT(__ceil,s), (float_type __x))		     \
-{									     \
-  float_type __result;							     \
-  unsigned long int __ctrl_reg;						     \
-  __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg));		     \
-  /* Set rounding towards positive infinity.  */			     \
-  __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs.  */		     \
-		      : "dmi" (__ctrl_reg | 0x30));			     \
-  /* Convert X to an integer, using +Inf rounding.  */			     \
-  __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x));	     \
-  /* Restore the previous rounding mode.  */				     \
-  __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs.  */		     \
-		      : "dmi" (__ctrl_reg));				     \
-  return __result;							     \
-}									     \
-									     \
-__m81_inline float_type							     \
-__m81_u(__CONCAT(__modf,s))(float_type __value, float_type *__iptr)	     \
-{									     \
-  float_type __modf_int;						     \
-  __asm ("fintrz%.x %1, %0" : "=f" (__modf_int) : "f" (__value));	     \
-  *__iptr = __modf_int;							     \
-  return __value - __modf_int;						     \
-}									     \
-									     \
-__m81_defun (int, __CONCAT(__isinf,s), (float_type __value))		     \
-{									     \
-  /* There is no branch-condition for infinity,				     \
-     so we must extract and examine the condition codes manually.  */	     \
-  unsigned long int __fpsr;						     \
-  __asm("ftst%.x %1\n"							     \
-	"fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value));	     \
-  return (__fpsr & (2 << 24)) ? (__fpsr & (8 << 24) ? -1 : 1) : 0;	     \
-}									     \
-									     \
-__m81_defun (int, __CONCAT(__isnan,s), (float_type __value))		     \
-{									     \
-  char __result;							     \
-  __asm("ftst%.x %1\n"							     \
-	"fsun %0" : "=dm" (__result) : "f" (__value));			     \
-  return __result;							     \
-}									     \
-									     \
-__m81_defun (int, __CONCAT(__finite,s), (float_type __value))		     \
-{									     \
-  /* There is no branch-condition for infinity, so we must extract and	     \
-     examine the condition codes manually.  */				     \
-  unsigned long int __fpsr;						     \
-  __asm ("ftst%.x %1\n"							     \
-	 "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value));	     \
-  return (__fpsr & (3 << 24)) == 0;					     \
-}									     \
-									     \
-__m81_defun (int, __CONCAT(__ilogb,s), (float_type __x))		     \
-{									     \
-  float_type __result;							     \
-  if (__x == 0.0)							     \
-    return 0x80000001;							     \
-  __asm("fgetexp%.x %1, %0" : "=f" (__result) : "f" (__x));		     \
-  return (int) __result;						     \
-}									     \
-									     \
-__m81_defun (float_type, __CONCAT(__scalbn,s), (float_type __x, int __n))    \
-{									     \
-  float_type __result;							     \
-  __asm ("fscale%.l %1, %0" : "=f" (__result) : "dmi" (__n), "0" (__x));     \
-  return __result;							     \
+#define __inline_functions(float_type, s)				  \
+__m81_inline float_type							  \
+__m81_u(__CONCAT(__frexp,s))(float_type __value, int *__expptr)		  \
+{									  \
+  float_type __mantissa, __exponent;					  \
+  int __iexponent;							  \
+  if (__value == 0.0)							  \
+    {									  \
+      *__expptr = 0;							  \
+      return __value;							  \
+    }									  \
+  __asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value));	  \
+  __iexponent = (int) __exponent + 1;					  \
+  *__expptr = __iexponent;						  \
+  __asm("fscale%.l %2, %0" : "=f" (__mantissa)				  \
+	: "0" (__value), "dmi" (-__iexponent));				  \
+  return __mantissa;							  \
+}									  \
+									  \
+__m81_defun (float_type, __CONCAT(__floor,s), (float_type __x))		  \
+{									  \
+  float_type __result;							  \
+  unsigned long int __ctrl_reg;						  \
+  __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg));		  \
+  /* Set rounding towards negative infinity.  */			  \
+  __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs.  */		  \
+		      : "dmi" ((__ctrl_reg & ~0x10) | 0x20));		  \
+  /* Convert X to an integer, using -Inf rounding.  */			  \
+  __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x));	  \
+  /* Restore the previous rounding mode.  */				  \
+  __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs.  */		  \
+		      : "dmi" (__ctrl_reg));				  \
+  return __result;							  \
+}									  \
+									  \
+__m81_defun (float_type, __CONCAT(__ceil,s), (float_type __x))		  \
+{									  \
+  float_type __result;							  \
+  unsigned long int __ctrl_reg;						  \
+  __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg));		  \
+  /* Set rounding towards positive infinity.  */			  \
+  __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs.  */		  \
+		      : "dmi" (__ctrl_reg | 0x30));			  \
+  /* Convert X to an integer, using +Inf rounding.  */			  \
+  __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x));	  \
+  /* Restore the previous rounding mode.  */				  \
+  __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs.  */		  \
+		      : "dmi" (__ctrl_reg));				  \
+  return __result;							  \
+}									  \
+									  \
+__m81_defun (int, __CONCAT(__isinf,s), (float_type __value))		  \
+{									  \
+  /* There is no branch-condition for infinity,				  \
+     so we must extract and examine the condition codes manually.  */	  \
+  unsigned long int __fpsr;						  \
+  __asm("ftst%.x %1\n"							  \
+	"fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value));	  \
+  return (__fpsr & (2 << 24)) ? (__fpsr & (8 << 24) ? -1 : 1) : 0;	  \
+}									  \
+									  \
+__m81_defun (int, __CONCAT(__isnan,s), (float_type __value))		  \
+{									  \
+  char __result;							  \
+  __asm("ftst%.x %1\n"							  \
+	"fsun %0" : "=dm" (__result) : "f" (__value));			  \
+  return __result;							  \
+}									  \
+									  \
+__m81_defun (int, __CONCAT(__finite,s), (float_type __value))		  \
+{									  \
+  /* There is no branch-condition for infinity, so we must extract and	  \
+     examine the condition codes manually.  */				  \
+  unsigned long int __fpsr;						  \
+  __asm ("ftst%.x %1\n"							  \
+	 "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value));	  \
+  return (__fpsr & (3 << 24)) == 0;					  \
+}									  \
+									  \
+__m81_defun (int, __CONCAT(__signbit,s), (float_type __value))		  \
+{									  \
+  /* There is no branch-condition for the sign bit, so we must extract	  \
+     and examine the condition codes manually.  */			  \
+  unsigned long int __fpsr;						  \
+  __asm ("ftst%.x %1\n"							  \
+	 "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value));	  \
+  return (__fpsr >> 27) & 1;						  \
+}									  \
+									  \
+__m81_defun (int, __CONCAT(__ilogb,s), (float_type __x))		  \
+{									  \
+  float_type __result;							  \
+  if (__x == 0.0)							  \
+    return 0x80000001;							  \
+  __asm("fgetexp%.x %1, %0" : "=f" (__result) : "f" (__x));		  \
+  return (int) __result;						  \
+}									  \
+									  \
+__m81_defun (float_type, __CONCAT(__scalbn,s), (float_type __x, int __n)) \
+{									  \
+  float_type __result;							  \
+  __asm ("fscale%.l %1, %0" : "=f" (__result) : "dmi" (__n), "0" (__x));  \
+  return __result;							  \
+}									  \
+									  \
+__m81_defun (float_type, __CONCAT(__nearbyint,s), (float_type __x))	  \
+{									  \
+  float_type __result;							  \
+  unsigned long int __ctrl_reg;						  \
+  __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg));		  \
+  /* Temporarily disable the inexact exception.  */			  \
+  __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs.  */		  \
+		      : "dmi" (__ctrl_reg & ~0x200));			  \
+  __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x));	  \
+  __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs.  */		  \
+		      : "dmi" (__ctrl_reg));				  \
+  return __result;							  \
 }
 
 /* This defines the three variants of the inline functions.  */
@@ -286,8 +303,6 @@ __inline_forward(double,frexp, (double __value, int *__expptr),
 		 (__value, __expptr))
 __inline_forward_c(double,floor, (double __x), (__x))
 __inline_forward_c(double,ceil, (double __x), (__x))
-__inline_forward(double,modf, (double __value, double *__iptr),
-		 (__value, __iptr))
 #ifdef __USE_MISC
 __inline_forward_c(int,isinf, (double __value), (__value))
 __inline_forward_c(int,finite, (double __value), (__value))
@@ -299,6 +314,9 @@ __inline_forward_c(int,isnan, (double __value), (__value))
 #endif
 __inline_forward_c(int,ilogb, (double __value), (__value))
 #endif
+#ifdef __USE_ISOC9X
+__inline_forward_c(double,nearbyint, (double __value), (__value))
+#endif
 
 #if defined __USE_MISC || defined __USE_ISOC9X
 
@@ -306,8 +324,6 @@ __inline_forward(float,frexpf, (float __value, int *__expptr),
 		 (__value, __expptr))
 __inline_forward_c(float,floorf, (float __x), (__x))
 __inline_forward_c(float,ceilf, (float __x), (__x))
-__inline_forward(float,modff, (float __value, float *__iptr),
-		 (__value, __iptr))
 #ifdef __USE_MISC
 __inline_forward_c(int,isinff, (float __value), (__value))
 __inline_forward_c(int,finitef, (float __value), (__value))
@@ -315,14 +331,14 @@ __inline_forward_c(float,scalbnf, (float __x, int __n), (__x, __n))
 __inline_forward_c(int,isnanf, (float __value), (__value))
 __inline_forward_c(int,ilogbf, (float __value), (__value))
 #endif
+#ifdef __USE_ISOC9X
+__inline_forward_c(float,nearbyintf, (float __value), (__value))
+#endif
 
 __inline_forward(long double,frexpl, (long double __value, int *__expptr),
 		 (__value, __expptr))
 __inline_forward_c(long double,floorl, (long double __x), (__x))
 __inline_forward_c(long double,ceill, (long double __x), (__x))
-__inline_forward(long double,modfl,
-		 (long double __value, long double *__iptr),
-		 (__value, __iptr))
 #ifdef __USE_MISC
 __inline_forward_c(int,isinfl, (long double __value), (__value))
 __inline_forward_c(int,finitel, (long double __value), (__value))
@@ -331,6 +347,9 @@ __inline_forward_c(long double,scalbnl, (long double __x, int __n),
 __inline_forward_c(int,isnanl, (long double __value), (__value))
 __inline_forward_c(int,ilogbl, (long double __value), (__value))
 #endif
+#ifdef __USE_ISOC9X
+__inline_forward_c(long double,nearbyintl, (long double __value), (__value))
+#endif
 
 #endif /* Use misc or ISO C9X */
 
diff --git a/sysdeps/m68k/fpu/e_atan2.c b/sysdeps/m68k/fpu/e_atan2.c
index 58d7555f41..c012070a93 100644
--- a/sysdeps/m68k/fpu/e_atan2.c
+++ b/sysdeps/m68k/fpu/e_atan2.c
@@ -27,10 +27,12 @@
 #define float_type double
 #endif
 
-#define __CONCATX(a,b) __CONCAT(a,b)
+#define CONCATX(a,b) __CONCAT(a,b)
+#define s(name) CONCATX(name,SUFF)
+#define m81(func) __m81_u(s(func))
 
 float_type
-__CONCATX(__ieee754_atan2,SUFF) (float_type y, float_type x)
+s(__ieee754_atan2) (float_type y, float_type x)
 {
   float_type pi, pi_2, z;
 
@@ -40,41 +42,41 @@ __CONCATX(__ieee754_atan2,SUFF) (float_type y, float_type x)
     z = x + y;
   else if (y == 0)
     {
-      if (signbit (x))
-	z = signbit (y) ? -pi : pi;
+      if (m81(__signbit) (x))
+	z = m81(__signbit) (y) ? -pi : pi;
       else
 	z = y;
     }
-  else if (__m81_u(__CONCATX(__isinf,SUFF)) (x))
+  else if (m81(__isinf) (x))
     {
-      if (__m81_u(__CONCATX(__isinf,SUFF)) (y))
+      if (m81(__isinf) (y))
 	{
 	  float_type pi_4;
-	  __asm ("fscale%.w %#-1, %0" : "=f" (pi_4) : "0" (pi_2));
+	  __asm ("fscale%.w %#-2, %0" : "=f" (pi_4) : "0" (pi));
 	  z = x > 0 ? pi_4 : 3 * pi_4;
 	}
       else
 	z = x > 0 ? 0 : pi;
-      if (signbit (y))
+      if (m81(__signbit) (y))
 	z = -z;
     }
-  else if (__m81_u(__CONCATX(__isinf,SUFF)) (y))
+  else if (m81(__isinf) (y))
     z = y > 0 ? pi_2 : -pi_2;
   else if (x > 0)
     {
       if (y > 0)
 	{
 	  if (x > y)
-	    z = __m81_u(__CONCATX(__atan,SUFF)) (y / x);
+	    z = m81(__atan) (y / x);
 	  else
-	    z = pi_2 - __m81_u(__CONCATX(__atan,SUFF)) (x / y);
+	    z = pi_2 - m81(__atan) (x / y);
 	}
       else
 	{
 	  if (x > -y)
-	    z = __m81_u(__CONCATX(__atan,SUFF)) (y / x);
+	    z = m81(__atan) (y / x);
 	  else
-	    z = -pi_2 - __m81_u(__CONCATX(__atan,SUFF)) (x / y);
+	    z = -pi_2 - m81(__atan) (x / y);
 	}
     }
   else
@@ -82,16 +84,16 @@ __CONCATX(__ieee754_atan2,SUFF) (float_type y, float_type x)
       if (y < 0)
 	{
 	  if (-x > y)
-	    z = -pi + __m81_u(__CONCATX(__atan,SUFF)) (y / x);
+	    z = -pi + m81(__atan) (y / x);
 	  else
-	    z = -pi_2 - __m81_u(__CONCATX(__atan,SUFF)) (x / y);
+	    z = -pi_2 - m81(__atan) (x / y);
 	}
       else
 	{
 	  if (-x > y)
-	    z = pi + __m81_u(__CONCATX(__atan,SUFF)) (y / x);
+	    z = pi + m81(__atan) (y / x);
 	  else
-	    z = pi_2 - __m81_u(__CONCATX(__atan,SUFF)) (x / y);
+	    z = pi_2 - m81(__atan) (x / y);
 	}
     }
   return z;
diff --git a/sysdeps/m68k/fpu/e_pow.c b/sysdeps/m68k/fpu/e_pow.c
index 970e8b821b..284f1bf294 100644
--- a/sysdeps/m68k/fpu/e_pow.c
+++ b/sysdeps/m68k/fpu/e_pow.c
@@ -27,10 +27,12 @@
 #define float_type double
 #endif
 
-#define __CONCATX(a,b) __CONCAT(a,b)
+#define CONCATX(a,b) __CONCAT(a,b)
+#define s(name) CONCATX(name,SUFF)
+#define m81(func) __m81_u(s(func))
 
 float_type
-__CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y)
+s(__ieee754_pow) (float_type x, float_type y)
 {
   float_type z;
   float_type ax;
@@ -40,24 +42,24 @@ __CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y)
   if (x != x || y != y)
     return x + y;
 
-  if (__m81_u(__CONCATX(__isinf,SUFF)) (y))
+  if (m81(__isinf) (y))
     {
-      ax = __CONCATX(fabs,SUFF) (x);
+      ax = s(fabs) (x);
       if (ax == 1)
-	return y - y;
+	return 0.0/0.0;
       if (ax > 1)
 	return y > 0 ? y : 0;
       else
 	return y < 0 ? -y : 0;
     }
 
-  if (__CONCATX(fabs,SUFF) (y) == 1)
+  if (s(fabs) (y) == 1)
     return y > 0 ? x : 1 / x;
 
   if (y == 2)
     return x * x;
-  if (y == 0 && x >= 0)
-    return __m81_u(__CONCATX(__ieee754_sqrt,SUFF)) (x);
+  if (y == 0.5 && x >= 0)
+    return m81(__ieee754_sqrt) (x);
 
   if (x == 10.0)
     {
@@ -70,19 +72,19 @@ __CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y)
       return z;
     }
 
-  ax = __CONCATX(fabs,SUFF) (x);
-  if (__m81_u(__CONCATX(__isinf,SUFF)) (x) || x == 0 || ax == 1)
+  ax = s(fabs) (x);
+  if (m81(__isinf) (x) || x == 0 || ax == 1)
     {
       z = ax;
       if (y < 0)
 	z = 1 / z;
-      if (signbit (x))
+      if (m81(__signbit) (x))
 	{
-	  float_type temp = __m81_u (__CONCATX(__rint,SUFF)) (y);
+	  float_type temp = m81(__rint) (y);
 	  if (y != temp)
 	    {
 	      if (x == -1)
-		z = (z - z) / (z - z);
+		z = 0.0/0.0;
 	    }
 	  else
 	    {
@@ -105,12 +107,11 @@ __CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y)
 
   if (x < 0.0)
     {
-      float_type temp = __m81_u (__CONCATX(__rint,SUFF)) (y);
+      float_type temp = m81(__rint) (y);
       if (y == temp)
 	{
 	  long long i = (long long) y;
-	  z = (__m81_u(__CONCATX(__ieee754_exp,SUFF))
-	       (y * __m81_u(__CONCATX(__ieee754_log,SUFF)) (-x)));
+	  z = m81(__ieee754_exp) (y * m81(__ieee754_log) (-x));
 	  if (sizeof (float_type) == sizeof (float))
 	    {
 	      long i = (long) y;
@@ -126,10 +127,9 @@ __CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y)
 	    }
 	}
       else
-	z = (x - x) / (x - x);
+	z = 0.0/0.0;
     }
   else
-    z = (__m81_u(__CONCATX(__ieee754_exp,SUFF))
-	 (y * __m81_u(__CONCATX(__ieee754_log,SUFF)) (x)));
+    z = m81(__ieee754_exp) (y * m81(__ieee754_log) (x));
   return z;
 }
diff --git a/sysdeps/m68k/fpu/s_cexp.c b/sysdeps/m68k/fpu/s_cexp.c
new file mode 100644
index 0000000000..d5c76453e8
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_cexp.c
@@ -0,0 +1,92 @@
+/* Complex exponential function.  m68k fpu version
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#define __LIBC_M81_MATH_INLINES
+#include <complex.h>
+#include <math.h>
+
+#ifndef SUFF
+#define SUFF
+#endif
+#ifndef huge_val
+#define huge_val HUGE_VAL
+#endif
+#ifndef float_type
+#define float_type double
+#endif
+
+#define CONCATX(a,b) __CONCAT(a,b)
+#define s(name) CONCATX(name,SUFF)
+#define m81(func) __m81_u(s(func))
+
+__complex__ float_type
+s(__cexp) (__complex__ float_type x)
+{
+  __complex__ float_type retval;
+  float_type sin_ix, cos_ix;
+
+  if (m81(__finite) (__real__ x))
+    {
+      if (m81(__finite) (__imag__ x))
+	{
+	  float_type exp_val = s(__exp) (__real__ x);
+
+	  __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_ix), "=f" (cos_ix)
+		 : "f" (__imag__ x));
+	  __real__ retval = exp_val * cos_ix;
+	  __imag__ retval = exp_val * sin_ix;
+	}
+      else
+	/* If the imaginary part is +-inf or NaN and the real part is
+	   not +-inf the result is NaN + iNaN.  */
+	__real__ retval = __imag__ retval = 0.0/0.0;
+    }
+  else if (m81(__isinf) (__real__ x))
+    {
+      if (m81(__finite) (__imag__ x))
+	{
+	  if (m81(__signbit) (__real__ x) == 0 && __imag__ x == 0.0)
+	    retval = huge_val;
+	  else
+	    {
+	      float_type value = m81(__signbit) (__real__ x) ? 0.0 : huge_val;
+
+	      __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_ix), "=f" (cos_ix)
+		     : "f" (__imag__ x));
+	      __real__ retval = value * cos_ix;
+	      __imag__ retval = value * sin_ix;
+	    }
+	}
+      else if (m81(__signbit) (__real__ x) == 0)
+	{
+	  __real__ retval = huge_val;
+	  __imag__ retval = 0.0/0.0;
+	}
+      else
+	retval = 0.0;
+    }
+  else
+    /* If the real part is NaN the result is NaN + iNaN.  */
+    __real__ retval = __imag__ retval = 0.0/0.0;
+
+  return retval;
+}
+#define weak_aliasx(a,b) weak_alias(a,b)
+weak_aliasx (s(__cexp), s(cexp))
diff --git a/sysdeps/m68k/fpu/s_cexpf.c b/sysdeps/m68k/fpu/s_cexpf.c
new file mode 100644
index 0000000000..db9f174546
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_cexpf.c
@@ -0,0 +1,4 @@
+#define SUFF f
+#define huge_val HUGE_VALF
+#define float_type float
+#include <s_cexp.c>
diff --git a/sysdeps/m68k/fpu/s_cexpl.c b/sysdeps/m68k/fpu/s_cexpl.c
new file mode 100644
index 0000000000..7367070548
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_cexpl.c
@@ -0,0 +1,4 @@
+#define SUFF l
+#define huge_val HUGE_VALL
+#define float_type long double
+#include <s_cexp.c>
diff --git a/sysdeps/m68k/fpu/s_modf.c b/sysdeps/m68k/fpu/s_modf.c
index 6428afc3be..ad0334faaa 100644
--- a/sysdeps/m68k/fpu/s_modf.c
+++ b/sysdeps/m68k/fpu/s_modf.c
@@ -19,22 +19,35 @@
 #define __LIBC_M81_MATH_INLINES
 #include <math.h>
 
-#ifndef FUNC
-#define FUNC modf
+#ifndef SUFF
+#define SUFF
 #endif
 #ifndef float_type
 #define float_type double
 #endif
 
-#define __CONCATX(a,b) __CONCAT(a,b)
+#define CONCATX(a,b) __CONCAT(a,b)
+#define s(name) CONCATX(name,SUFF)
+#define m81(func) __m81_u(s(func))
 
 float_type
-__CONCATX(__,FUNC) (x, iptr)
-     float_type x;
-     float_type *iptr;
+s(__modf) (float_type x, float_type *iptr)
 {
-  return __m81_u(__CONCATX(__,FUNC))(x, iptr);
+  float_type x_int, result;
+  __asm ("fintrz%.x %1, %0" : "=f" (x_int) : "f" (x));
+  *iptr = x_int;
+  if (m81(__isinf) (x))
+    {
+      result = 0;
+      if (x < 0)
+	result = -result;
+    }
+  else if (x == 0)
+    result = x;
+  else
+    result = x - x_int;
+  return result;
 }
 
 #define weak_aliasx(a,b) weak_alias(a,b)
-weak_aliasx(__CONCATX(__,FUNC), FUNC)
+weak_aliasx(s(__modf), s(modf))
diff --git a/sysdeps/m68k/fpu/s_modff.c b/sysdeps/m68k/fpu/s_modff.c
index 37bff0022f..0c44d7c0ab 100644
--- a/sysdeps/m68k/fpu/s_modff.c
+++ b/sysdeps/m68k/fpu/s_modff.c
@@ -1,3 +1,3 @@
-#define FUNC modff
+#define SUFF f
 #define float_type float
 #include <s_modf.c>
diff --git a/sysdeps/m68k/fpu/s_modfl.c b/sysdeps/m68k/fpu/s_modfl.c
index 51327dd1aa..c7075b3ba9 100644
--- a/sysdeps/m68k/fpu/s_modfl.c
+++ b/sysdeps/m68k/fpu/s_modfl.c
@@ -1,3 +1,3 @@
-#define FUNC modfl
+#define SUFF l
 #define float_type long double
 #include <s_modf.c>
diff --git a/sysdeps/m68k/fpu/s_nearbyint.c b/sysdeps/m68k/fpu/s_nearbyint.c
new file mode 100644
index 0000000000..b87f5e2160
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_nearbyint.c
@@ -0,0 +1,2 @@
+#define	FUNC nearbyint
+#include <s_atan.c>
diff --git a/sysdeps/m68k/fpu/s_nearbyintf.c b/sysdeps/m68k/fpu/s_nearbyintf.c
new file mode 100644
index 0000000000..70d08ab44c
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_nearbyintf.c
@@ -0,0 +1,2 @@
+#define	FUNC nearbyintf
+#include <s_atanf.c>
diff --git a/sysdeps/m68k/fpu/s_nearbyintl.c b/sysdeps/m68k/fpu/s_nearbyintl.c
new file mode 100644
index 0000000000..230cd7784c
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_nearbyintl.c
@@ -0,0 +1,2 @@
+#define	FUNC nearbyintl
+#include <s_atanl.c>
diff --git a/sysdeps/m68k/fpu/s_trunc.c b/sysdeps/m68k/fpu/s_trunc.c
new file mode 100644
index 0000000000..96f29a776c
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_trunc.c
@@ -0,0 +1,2 @@
+#define	FUNC trunc
+#include <s_atan.c>
diff --git a/sysdeps/m68k/fpu/s_truncf.c b/sysdeps/m68k/fpu/s_truncf.c
new file mode 100644
index 0000000000..44dca748ca
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_truncf.c
@@ -0,0 +1,2 @@
+#define	FUNC truncf
+#include <s_atanf.c>
diff --git a/sysdeps/m68k/fpu/s_truncl.c b/sysdeps/m68k/fpu/s_truncl.c
new file mode 100644
index 0000000000..8d35777aed
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_truncl.c
@@ -0,0 +1,2 @@
+#define	FUNC truncl
+#include <s_atanl.c>
diff --git a/sysdeps/powerpc/strlen.s b/sysdeps/powerpc/strlen.s
new file mode 100644
index 0000000000..eb6a88e2b8
--- /dev/null
+++ b/sysdeps/powerpc/strlen.s
@@ -0,0 +1,145 @@
+ # Optimized strlen implementation for PowerPC.
+ # Copyright (C) 1997 Free Software Foundation, Inc.
+ # This file is part of the GNU C Library.
+ #
+ # The GNU C Library is free software; you can redistribute it and/or
+ # modify it under the terms of the GNU Library General Public License as
+ # published by the Free Software Foundation; either version 2 of the
+ # License, or (at your option) any later version.
+ #
+ # The GNU C Library 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
+ # Library General Public License for more details.
+ #
+ # You should have received a copy of the GNU Library General Public
+ # License along with the GNU C Library; see the file COPYING.LIB.  If not,
+ # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ # Boston, MA 02111-1307, USA.
+
+ # The algorithm here uses the following techniques:
+ #
+ # 1) Given a word 'x', we can test to see if it contains any 0 bytes
+ #    by subtracting 0x01010101, and seeing if any of the high bits of each
+ #    byte changed from 0 to 1. This works because the least significant
+ #    0 byte must have had no incoming carry (otherwise it's not the least
+ #    significant), so it is 0x00 - 0x01 == 0xff. For all other
+ #    byte values, either they have the high bit set initially, or when
+ #    1 is subtracted you get a value in the range 0x00-0x7f, none of which
+ #    have their high bit set. The expression here is
+ #    (x + 0xfefefeff) & ~(x | 0x7f7f7f7f), which gives 0x00000000 when
+ #    there were no 0x00 bytes in the word.
+ #
+ # 2) Given a word 'x', we can test to see _which_ byte was zero by
+ #    calculating ~(((x & 0x7f7f7f7f) + 0x7f7f7f7f) | x | 0x7f7f7f7f).
+ #    This produces 0x80 in each byte that was zero, and 0x00 in all
+ #    the other bytes. The '| 0x7f7f7f7f' clears the low 7 bits in each
+ #    byte, and the '| x' part ensures that bytes with the high bit set
+ #    produce 0x00. The addition will carry into the high bit of each byte
+ #    iff that byte had one of its low 7 bits set. We can then just see
+ #    which was the most significant bit set and divide by 8 to find how
+ #    many to add to the index.
+ #    This is from the book 'The PowerPC Compiler Writer's Guide',
+ #    by Steve Hoxey, Faraydon Karim, Bill Hay and Hank Warren.
+ #
+ # We deal with strings not aligned to a word boundary by taking the
+ # first word and ensuring that bytes not part of the string
+ # are treated as nonzero. To allow for memory latency, we unroll the
+ # loop a few times, being careful to ensure that we do not read ahead
+ # across cache line boundaries.
+ #
+ # Questions to answer:
+ # 1) How long are strings passed to strlen? If they're often really long,
+ # we should probably use cache management instructions and/or unroll the
+ # loop more. If they're often quite short, it might be better to use
+ # fact (2) in the inner loop than have to recalculate it.
+ # 2) How popular are bytes with the high bit set? If they are very rare,
+ # on some processors it might be useful to use the simpler expression
+ # ~((x - 0x01010101) | 0x7f7f7f7f) (that is, on processors with only one
+ # ALU), but this fails when any character has its high bit set.
+
+ # Some notes on register usage: Under the SVR4 ABI, we can use registers
+ # 0 and 3 through 12 (so long as we don't call any procedures) without
+ # saving them. We can also use registers 14 through 31 if we save them.
+ # We can't use r1 (it's the stack pointer), nor r2 or r13 because the user
+ # program may expect them to be hold their usual value if we get sent
+ # a signal. Integer parameters are passed in r3 through r10.
+ # We can use condition registers cr0, cr1, cr5, cr6, and cr7 without saving
+ # them, the others we must save.
+
+	.section ".text"
+	.align 3
+	.globl strlen
+	.type strlen,@function
+strlen:
+ # On entry, r3 points to the string, and it's left that way.
+ # We use r6 to store 0x01010101, and r7 to store 0x7f7f7f7f.
+ # r4 is used to keep the current index into the string; r5 holds
+ # the number of padding bits we prepend to the string to make it
+ # start at a word boundary. r8 holds the 'current' word.
+ # r9-12 are temporaries. r0 is used as a temporary and for discarded
+ # results.
+	clrrwi 4,3,2
+	lis 6,0xfeff
+	lis 7,0x7f7f
+	rlwinm 10,3,0,29,29
+	lwz 8,0(4)
+	addi 7,7,0x7f7f
+	rlwinm 5,3,3,27,28
+	cmpwi 1,10,0
+	li 9,-1
+ # That's the setup done, now do the first pair of words.
+ # We make an exception and use method (2) on the first two words, to reduce
+ # overhead.
+	srw 9,9,5
+	and 0,7,8
+	or 10,7,8
+	add 0,0,7
+	nor 0,10,0
+	and. 8,0,9
+	bne done0
+ # Handle second word of pair. Put addi between branches to avoid hurting
+ # branch prediction.
+	addi 6,6,0xfffffeff
+
+	bne 1,loop
+	lwzu 8,4(4)
+	and 0,7,8
+	or 10,7,8
+	add 0,0,7
+	nor. 0,10,0
+	bne done0
+
+ # The loop.
+
+loop:	lwz 8,4(4)
+	lwzu 9,8(4)
+	add 0,6,8
+	nor 10,7,8
+	and. 0,0,10
+	add 11,6,9
+	nor 12,7,9
+	bne done1
+	and. 0,11,12
+	beq loop
+
+	and 0,7,9
+	or 10,7,9
+	b done2
+
+done1:	addi 4,4,-4
+	and 0,7,9
+	or 10,7,9
+done2:	add 0,0,7
+	nor 0,10,0
+
+ # When we get to here, r4 points to the first word in the string that
+ # contains a zero byte, and the most significant set bit in r8 is in that
+ # byte.
+done0:	cntlzw 11,8
+	subf 0,3,4
+	srwi 11,11,3
+	add 3,0,11
+	blr
+0:
+	.size	 strlen,0b-strlen
diff --git a/sysdeps/stub/fchdir.c b/sysdeps/stub/fchdir.c
index 8eb7700361..b18dcc7986 100644
--- a/sysdeps/stub/fchdir.c
+++ b/sysdeps/stub/fchdir.c
@@ -1,20 +1,20 @@
-/* Copyright (C) 1991, 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library 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
-Library General Public License for more details.
+   The GNU C Library 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
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <errno.h>
 #include <stddef.h>
@@ -25,7 +25,7 @@ int
 fchdir (fd)
      int fd;
 {
-  __set_errno (ENOSYS(;
+  __set_errno (ENOSYS);
   return -1;
 }
 
diff --git a/sysdeps/stub/fchmod.c b/sysdeps/stub/fchmod.c
index f8c5c80214..eba768fce7 100644
--- a/sysdeps/stub/fchmod.c
+++ b/sysdeps/stub/fchmod.c
@@ -1,20 +1,20 @@
-/* Copyright (C) 1991, 1992, 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library 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
-Library General Public License for more details.
+   The GNU C Library 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
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <errno.h>
 #include <stddef.h>
@@ -29,7 +29,7 @@ __fchmod (fd, mode)
 {
   if (fd < 0)
     {
-      __set_errno (EINVAL(;
+      __set_errno (EINVAL);
       return -1;
     }
 
diff --git a/sysdeps/unix/sysv/linux/net/route.h b/sysdeps/unix/sysv/linux/net/route.h
index d60a3cabb5..3518dc5fc9 100644
--- a/sysdeps/unix/sysv/linux/net/route.h
+++ b/sysdeps/unix/sysv/linux/net/route.h
@@ -25,6 +25,7 @@
 
 #include <sys/socket.h>
 #include <sys/types.h>
+#include <netinet/in.h>
 
 
 /* This structure gets passed by the SIOCADDRT and SIOCDELRT calls. */
@@ -50,6 +51,21 @@ struct rtentry
 #define rt_mss	rt_mtu
 
 
+struct in6_rtmsg
+  {
+    struct in6_addr rtmsg_dst;
+    struct in6_addr rtmsg_src;
+    struct in6_addr rtmsg_gateway;
+    unsigned long int rtmsg_type;
+    unsigned short int rtmsg_dst_len;
+    unsigned short int rtmsg_src_len;
+    unsigned long int rtmsg_metric;
+    unsigned long int rtmsg_info;
+    unsigned long int rtmsg_flags;
+    int rtmsg_ifindex;
+  };
+
+
 #define	RTF_UP		0x0001		/* Route usable.  */
 #define	RTF_GATEWAY	0x0002		/* Destination is a gateway.  */
 
@@ -68,17 +84,17 @@ struct rtentry
 #define RTF_THROW	0x2000		/* Go to next class.  */
 #define RTF_NOPMTUDISC  0x4000		/* Do not send packets with DF.  */
 
-/* Bad idea. IPv6 should not use broken IPv4 interface.  */
-
-#define RTF_ADDRCONF	0x0800		/* Announced on link prefix.  */
-#define RTF_INVALID	0x1000
-#define RTF_DCACHE	0x2000
-#define RTF_DEFAULT	0x4000		/* Route is a default route.  */
-#define RTF_NEXTHOP	0x8000		/* Non gateway route with nexthop.  */
+/* for IPv6 */
+#define RTF_DEFAULT	0x00010000	/* default - learned via ND	*/
+#define RTF_ALLONLINK	0x00020000	/* fallback, no routers on link	*/
+#define RTF_ADDRCONF	0x00040000	/* addrconf route - RA		*/
 
+#define RTF_LINKRT	0x00100000	/* link specific - device match	*/
+#define RTF_NONEXTHOP	0x00200000	/* route with no nexthop	*/
 
-#define RTF_MAGIC	0x10000		/* Route added/deleted automatically,
-					   when interface changes its state. */
+#define RTF_CACHE	0x01000000	/* cache entry			*/
+#define RTF_FLOW	0x02000000	/* flow significant route	*/
+#define RTF_POLICY	0x04000000	/* policy route			*/
 
 #define RTCF_VALVE	0x00200000
 #define RTCF_MASQ	0x00400000
diff --git a/wcsmbs/wcstof.c b/wcsmbs/wcstof.c
index ef1448b096..f410e4cf32 100644
--- a/wcsmbs/wcstof.c
+++ b/wcsmbs/wcstof.c
@@ -30,6 +30,8 @@
 #define SET_MANTISSA(flt, mant) \
   do { union ieee754_float u;						      \
        u.f = (flt);							      \
+       if ((mant & 0x7fffff) == 0)					      \
+	 mant = 0x400000;						      \
        u.ieee.mantissa = (mant) & 0x7fffff;				      \
        (flt) = u.f;							      \
   } while (0)
diff --git a/wcsmbs/wcstold.c b/wcsmbs/wcstold.c
index c94d47ea4f..1a3f0d2c6e 100644
--- a/wcsmbs/wcstold.c
+++ b/wcsmbs/wcstold.c
@@ -30,7 +30,9 @@
 #define SET_MANTISSA(flt, mant) \
   do { union ieee854_long_double u;					      \
        u.d = (flt);							      \
-       u.ieee.mantissa0 = ((mant) >> 32) & 0x7fffffff;			      \
+       if ((mant & 0x7fffffffffffffffULL) == 0)				      \
+	 mant = 0x4000000000000000ULL;					      \
+       u.ieee.mantissa0 = (((mant) >> 32) & 0x7fffffff) | 0x80000000;	      \
        u.ieee.mantissa1 = (mant) & 0xffffffff;				      \
        (flt) = u.d;							      \
   } while (0)