about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog346
-rw-r--r--Makeconfig7
-rw-r--r--Makerules14
-rw-r--r--Rules2
-rw-r--r--argp/argp-parse.c126
-rw-r--r--argp/argp.h11
-rw-r--r--elf/Makefile2
-rw-r--r--elf/dl-minimal.c1
-rw-r--r--elf/do-rel.h2
-rw-r--r--elf/ldd.bash.in2
-rw-r--r--extra-lib.mk2
-rw-r--r--features.h3
-rw-r--r--inet/rcmd.c44
-rw-r--r--libc.map20
-rw-r--r--login/Makefile2
-rw-r--r--login/programs/request.c20
-rw-r--r--login/programs/utmpd.c10
-rw-r--r--login/programs/utmpd.h7
-rw-r--r--login/utmp_daemon.c52
-rw-r--r--login/utmp_file.c89
-rw-r--r--manual/Makefile7
-rw-r--r--manual/argp.texi43
-rw-r--r--manual/dir16
-rw-r--r--manual/string.texi9
-rw-r--r--manual/texinfo.tex53
-rw-r--r--math/Makefile8
-rw-r--r--math/libm-test.c287
-rw-r--r--math/math.h8
-rw-r--r--math/mathcalls.h19
-rw-r--r--md5-crypt/Makefile2
-rw-r--r--nis/Makefile2
-rw-r--r--stdio-common/temptest.c14
-rw-r--r--stdio-common/tstscanf.c6
-rw-r--r--stdio-common/vfscanf.c13
-rw-r--r--string/Makefile4
-rw-r--r--string/argz-replace.c135
-rw-r--r--string/argz.h10
-rw-r--r--sunrpc/Makefile6
-rw-r--r--sysdeps/generic/mathbits.h5
-rw-r--r--sysdeps/i386/fpu/mathbits.h5
-rw-r--r--sysdeps/libm-i387/e_scalb.S78
-rw-r--r--sysdeps/libm-i387/e_scalbf.S79
-rw-r--r--sysdeps/libm-i387/e_scalbl.S78
-rw-r--r--sysdeps/libm-i387/s_asinh.S11
-rw-r--r--sysdeps/libm-i387/s_asinhf.S11
-rw-r--r--sysdeps/libm-i387/s_asinhl.S11
-rw-r--r--sysdeps/libm-i387/s_ilogb.S12
-rw-r--r--sysdeps/libm-i387/s_ilogbf.S12
-rw-r--r--sysdeps/libm-i387/s_ilogbl.S13
-rw-r--r--sysdeps/libm-i387/s_llrint.S (renamed from sysdeps/libm-i387/s_rinttoll.S)6
-rw-r--r--sysdeps/libm-i387/s_lrint.S (renamed from sysdeps/libm-i387/s_rinttol.S)6
-rw-r--r--sysdeps/libm-i387/s_remquo.S7
-rw-r--r--sysdeps/libm-i387/s_remquof.S7
-rw-r--r--sysdeps/libm-i387/s_remquol.S7
-rw-r--r--sysdeps/libm-ieee754/e_gamma_r.c47
-rw-r--r--sysdeps/libm-ieee754/e_gammaf_r.c46
-rw-r--r--sysdeps/libm-ieee754/e_gammal_r.c46
-rw-r--r--sysdeps/libm-ieee754/e_lgamma_r.c40
-rw-r--r--sysdeps/libm-ieee754/e_lgammaf_r.c22
-rw-r--r--sysdeps/libm-ieee754/s_llrint.c (renamed from sysdeps/libm-ieee754/s_rinttoll.c)6
-rw-r--r--sysdeps/libm-ieee754/s_llround.c (renamed from sysdeps/libm-ieee754/s_roundtoll.c)6
-rw-r--r--sysdeps/libm-ieee754/s_lrint.c (renamed from sysdeps/libm-ieee754/s_rinttol.c)6
-rw-r--r--sysdeps/libm-ieee754/s_lround.c (renamed from sysdeps/libm-ieee754/s_roundtol.c)6
-rw-r--r--sysdeps/libm-ieee754/s_remquo.c2
-rw-r--r--sysdeps/libm-ieee754/s_remquof.c2
-rw-r--r--sysdeps/libm-ieee754/s_remquol.c2
-rw-r--r--sysdeps/libm-ieee754/s_scalbn.c13
-rw-r--r--sysdeps/libm-ieee754/s_scalbnf.c20
-rw-r--r--sysdeps/libm-ieee754/s_scalbnl.c34
-rw-r--r--sysdeps/libm-ieee754/w_gamma.c22
-rw-r--r--sysdeps/libm-ieee754/w_gamma_r.c51
-rw-r--r--sysdeps/libm-ieee754/w_gammaf.c21
-rw-r--r--sysdeps/libm-ieee754/w_gammaf_r.c52
-rw-r--r--sysdeps/libm-ieee754/w_gammal.c21
-rw-r--r--sysdeps/libm-ieee754/w_gammal_r.c52
-rw-r--r--sysdeps/m68k/fpu/__math.h4
-rw-r--r--sysdeps/m68k/fpu/s_llrint.c (renamed from sysdeps/m68k/fpu/s_rinttoll.c)4
-rw-r--r--sysdeps/m68k/fpu/s_lrint.c (renamed from sysdeps/m68k/fpu/s_rinttol.c)6
-rw-r--r--sysdeps/m68k/fpu/s_remquo.c9
-rw-r--r--sysdeps/posix/Makefile5
-rw-r--r--sysdeps/powerpc/Dist1
-rw-r--r--sysdeps/stub/e_acoshl.c2
-rw-r--r--sysdeps/stub/e_acosl.c2
-rw-r--r--sysdeps/stub/e_asinl.c2
-rw-r--r--sysdeps/stub/e_atan2l.c2
-rw-r--r--sysdeps/stub/e_expl.c2
-rw-r--r--sysdeps/stub/e_fmodl.c2
-rw-r--r--sysdeps/stub/e_j0l.c3
-rw-r--r--sysdeps/stub/e_j1l.c3
-rw-r--r--sysdeps/stub/e_jnl.c3
-rw-r--r--sysdeps/stub/e_lgammal_r.c2
-rw-r--r--sysdeps/stub/e_log10l.c2
-rw-r--r--sysdeps/stub/e_logl.c2
-rw-r--r--sysdeps/stub/e_powl.c2
-rw-r--r--sysdeps/stub/e_rem_pio2l.c2
-rw-r--r--sysdeps/stub/e_sqrtl.c2
-rw-r--r--sysdeps/stub/k_cosl.c2
-rw-r--r--sysdeps/stub/k_rem_pio2l.c2
-rw-r--r--sysdeps/stub/k_sinl.c2
-rw-r--r--sysdeps/stub/k_tanl.c2
-rw-r--r--sysdeps/stub/s_atanl.c2
-rw-r--r--sysdeps/stub/s_erfl.c3
-rw-r--r--sysdeps/stub/s_exp2.c2
-rw-r--r--sysdeps/stub/s_exp2f.c2
-rw-r--r--sysdeps/stub/s_exp2l.c2
-rw-r--r--sysdeps/stub/s_expm1l.c2
-rw-r--r--sysdeps/stub/s_log1pl.c2
-rw-r--r--sysdeps/stub/s_log2l.c2
-rw-r--r--sysdeps/unix/sysv/linux/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/Makefile34
-rw-r--r--sysdeps/unix/sysv/linux/arm/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/configure24
-rw-r--r--sysdeps/unix/sysv/linux/configure.in24
-rw-r--r--sysdeps/unix/sysv/linux/i386/sysdep.S9
-rw-r--r--sysdeps/unix/sysv/linux/mk-stdiolim.c4
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/Dist2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/Dist1
-rw-r--r--time/tzfile.c4
118 files changed, 1758 insertions, 702 deletions
diff --git a/ChangeLog b/ChangeLog
index 9c70ad3486..cb09bdf38b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,320 @@
+1997-06-19 19:38  Ulrich Drepper  <drepper@cygnus.com>
+
+	* features.h: Define __STDC_IEC_559__ and _STDC_IEC_559_COMPLEX__.
+
+	* elf/dl-minimal.c (__dcgettext): Remove assertion.
+
+	* inet/rcmd.c: Correct a few typos.  Reported by Eric Troan.
+
+	* manual/Makefile (distribute): Add dir.
+	* manual/dir: New file.
+
+	* math/Makefile (libm-support): Rename s_rinttol, s_rinttoll,
+	s_roundtol, and s_roundtoll to s_lrint, s_llrint, s_lround,
+	and s_llround respectively.
+	(libm-calls): Add e_gamma_r.
+	* math/libm-test.c (check_int_exc): New function.
+	(signbit_test): Remove test for sign of NaN.
+	(gamma_test): Clear exception after test of existence.
+	Correct tests and and epsilons.
+	(lgamma_test): Likewise.
+	(ilogb_test): Correct all tests.
+	(scalb_test): Rewrite.
+	(rinttol_test): Rename to lrint_test and correct tests.
+	(rinttoll_test): Likewise.
+	(roundtol_test): Likewise.
+	(roundtoll_test): Likewise.
+	(main): Call lrint/lround functions instead of rinttol/roundtol.
+	* math/math.h: Change prototypes for rinttol/roundtol.
+	* math/mathcalls.h: Rearrange prototypes according to ISO C9X draft.
+	* sysdeps/generic/mathbits.h: Define FP_ILOGB0 and FP_ILOGBNAN.
+	* sysdeps/i386/mathbits.h: Likewise.
+	* sysdeps/libm-i387/e_scalb.S: Handle special cases correctly.
+	* sysdeps/libm-i387/e_scalbf.S: Likewise.
+	* sysdeps/libm-i387/e_scalbl.S: Likewise.
+	* sysdeps/libm-i387/s_asinh.S: Handle -inf correctly.
+	* sysdeps/libm-i387/s_asinhf.S: Likewise.
+	* sysdeps/libm-i387/s_asinhl.S: Likewise.
+	* sysdeps/libm-i387/s_ilogb.S: Optimize.
+	* sysdeps/libm-i387/s_ilogbf.S: Likewise.
+	* sysdeps/libm-i387/s_ilogbl.S: Likewise.
+	* sysdeps/libm-i387/s_rinttol.S: Rename to...
+	* sysdeps/libm-i387/s_lrint.S: ...this.
+	* sysdeps/libm-i387/s_rinttoll.S: Rename to...
+	* sysdeps/libm-i387/s_llrint.S: ...this.
+	* sysdeps/libm-i387/s_remquo.S: Correctly set sign of remainder.
+	* sysdeps/libm-i387/s_remquof.S: Likewise.
+	* sysdeps/libm-i387/s_remquol.S: Likewise.
+	* sysdeps/libm-i387/e_gamma_r.c: New file.  Implementation of gamma
+	function according to ISO C.
+	* sysdeps/libm-i387/e_gammaf_r.c: New file.
+	* sysdeps/libm-i387/e_gammal_r.c: New file.
+	* sysdeps/libm-i387/e_lgamma_r.c: Don't let optimize compile the
+	generation of exceptions away.
+	* sysdeps/libm-i387/e_lgammaf_r.c: Likewise.
+	* sysdeps/libm-i387/k_standard.c: Correct return value for infinity
+	points of gamma function when not SVID mode.
+	* sysdeps/libm-i387/s_rinttoll.c: Renamed to...
+	* sysdeps/libm-i387/s_llrint.c: ...this.
+	* sysdeps/libm-i387/s_rinttol.c: Renamed to...
+	* sysdeps/libm-i387/s_lrint.c: ...this.
+	* sysdeps/libm-i387/s_roundtoll.c: Renamed to...
+	* sysdeps/libm-i387/s_llround.c: ...this.
+	* sysdeps/libm-i387/s_roundtol.c: Renamed to...
+	* sysdeps/libm-i387/s_lround.c: ..this.
+	* sysdeps/libm-i387/s_scalbn.c: Change second parameter according to
+	ISO C.
+	* sysdeps/libm-i387/s_scalbnf.c: Likewise.
+	* sysdeps/libm-i387/s_scalbnl.c: Likewise.
+	* sysdeps/libm-i387/w_gamma.c: Call __ieee754_gamma_r if library
+	mode is not _SVID_.
+	* sysdeps/libm-i387/w_gammaf.c: Likewise.
+	* sysdeps/libm-i387/w_gammal.c: Likewise.
+	* sysdeps/m68k/fpu/__math.h: Rename __rinttol to __lrint and
+	rinttol to lrint.
+	* sysdeps/m68k/fpu/s_rinttol.c: Renamed to...
+	* sysdeps/m68k/fpu/s_lrint.c: ...this.
+	* sysdeps/m68k/fpu/s_rinttoll.c: Renamed to...
+	* sysdeps/m68k/fpu/s_llrint.c: ...this.
+
+	* md5-crypt/Makefile: Link md5test program with md5.o.
+
+	* stdio-common/temptest.c: Don't use __stdio_gen_tempname which
+	is not exported by the libc.so.
+
+	* stdio-common/vfscanf.c: Correct scanning of strings after last
+	change.
+
+	* sysdeps/unix/sysv/linux/i386/sysdep.S: Use .comm to define errno.
+
+1997-06-19 07:37  H.J. Lu  <hjl@gnu.ai.mit.edu>
+
+	* time/tzfile.c (__tzfile_read): Store getc () return in int.
+
+1997-06-13  Miles Bader  <miles@gnu.ai.mit.edu>
+
+	* argp/argp-parse.c (argp_version_parser): Include `(PROGRAM ERROR)' in
+	the no-version error text to indicate that something's fucked.
+	[!_] (N_): New macro.
+	(argp_default_options, argp_version_options): Wrap doc strings in N_().
+
+1997-06-12  Miles Bader  <miles@gnu.ai.mit.edu>
+
+	* argp/argp-parse.c (parser_parse_opt): Detect and report unhandled
+	options here.
+	(parser_parse_arg): Handle ARGP_KEY_ARGS here.
+	Adjust NEXT pointer back if we fail to parse anything.
+	(parser_parse_next): Simplify arg code.  Leave state NEXT frobbing
+	to parser_parse_arg.
+
+1997-06-11  Miles Bader  <miles@gnu.ai.mit.edu>
+
+	* argp/argp.h (ARGP_KEY_ARGS, ARGP_KEY_FINI): New macros.
+	* argp/argp-parse.c (parser_finalize): Do another pass over the
+	parsers with ARGP_KEY_FINI.
+
+1997-06-18  Miles Bader  <miles@gnu.ai.mit.edu>
+
+	* string/Makefile (routines): Add argz-replace.
+
+1997-06-16 00:16  Miles Bader  <miles@gnu.ai.mit.edu>
+
+	* manual/string.texi (Argz Functions): Document argz_replace.
+
+1997-06-12  Miles Bader  <miles@gnu.ai.mit.edu>
+
+	* string/argz.h (__argz_replace, argz_replace): New declarations.
+	* string/argz-replace.c: New file.
+
+1997-06-11  Miles Bader  <miles@gnu.ai.mit.edu>
+
+	* manual/argp.texi (Argp Special Keys): Document ARGP_KEY_ARGS.
+
+1997-06-16 23:08  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* Makeconfig (libc-map): Remove definition.
+	* Makerules (libc-map): Define it here, using the full name.
+	(load-map-file): Remove case for empty $(..).
+	($(common-objpfx)libc.so): Revert last change.
+
+1997-06-17 22:18  Mark Kettenis  <kettenis@phys.uva.nl>
+
+	* login/programs/utmpd.c (main): Improve signal handling.
+
+	* login/programs/request.c (do_setutent, do_updwtmp):
+	Allow arbitrary length filenames.
+	* login/programs/utmpd.h (setutent_request, updwtmp_request):
+	Get rid of fixed length file field.
+	* login/utmp_daemon.c (do_setutent, do_updwtmp):
+	Allow arbitrary	length filenames.
+
+	* login/programs/request.c (do_pututline):
+	Don't fail if connection->position is -1 on entry.
+
+1997-06-15 16:32  Mark Kettenis  <kettenis@phys.uva.nl>
+
+	* login/utmp_file.c (updwtmp_file): Use the same method for
+	appending an entry as in pututline_file.
+
+1997-06-11 18:59  Mark Kettenis  <kettenis@phys.uva.nl>
+
+	* login/utmp_file.c (getutent_r_file):
+	Use read lock instead of write lock.
+	(getutline_r_file, internal_getut_r): Lock utmp file.
+	(updwtmp_file): Use fcntl to lock file instead of flock.
+
+1997-06-18 00:11  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* stdio-common/vfscanf.c (inchar, ungetc): Don't count EOF as
+	character read in/put back.
+	* stdio-common/tstscanf.c: Add test case for this.
+
+1997-06-17 22:17  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* libc.map: Add more symbols.
+
+1997-06-18 12:01  Ulrich Drepper  <drepper@cygnus.com>
+
+	* manual/Makefile (install): Make sure `dir' file exists if we use
+	install-info.
+
+1997-06-17 19:32  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* manual/Makefile (info): Depend on dir-add.info.
+
+1997-06-17 17:19  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* elf/ldd.bash.in: Fix spacing in message.
+
+1997-06-17 14:28  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* elf/do-rel.h (elf_dynamic_do_rel): Always use version
+	information if available.
+
+1997-06-17 11:34  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sunrpc/Makefile ($(rpcsvc:%.x=$(objpfx)rpcsvc/%.h)): Make
+	command non-empty to force make to recheck modification time.
+	($(rpcsvc:%.x=$(objpfx)x%.c)): Likewise.
+
+1997-06-17 00:26  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/stub/e_acoshl.c: Set errno to ENOSYS.
+	* sysdeps/stub/e_acosl.c: Likewise.
+	* sysdeps/stub/e_asinl.c: Likewise.
+	* sysdeps/stub/e_atan2l.c: Likewise.
+	* sysdeps/stub/e_expl.c: Likewise.
+	* sysdeps/stub/e_fmodl.c: Likewise.
+	* sysdeps/stub/e_j0l.c: Likewise.
+	* sysdeps/stub/e_j1l.c: Likewise.
+	* sysdeps/stub/e_jnl.c: Likewise.
+	* sysdeps/stub/e_lgammal_r.c: Likewise.
+	* sysdeps/stub/e_log10l.c: Likewise.
+	* sysdeps/stub/e_logl.c: Likewise.
+	* sysdeps/stub/e_powl.c: Likewise.
+	* sysdeps/stub/e_rem_pio2l.c: Likewise.
+	* sysdeps/stub/e_sqrtl.c: Likewise.
+	* sysdeps/stub/k_cosl.c: Likewise.
+	* sysdeps/stub/k_rem_pio2l.c: Likewise.
+	* sysdeps/stub/k_sinl.c: Likewise.
+	* sysdeps/stub/k_tanl.c: Likewise.
+	* sysdeps/stub/s_atanl.c: Likewise.
+	* sysdeps/stub/s_erfl.c: Likewise.
+	* sysdeps/stub/s_exp2.c: Likewise.
+	* sysdeps/stub/s_exp2f.c: Likewise.
+	* sysdeps/stub/s_exp2l.c: Likewise.
+	* sysdeps/stub/s_expm1l.c: Likewise.
+	* sysdeps/stub/s_log1pl.c: Likewise.
+	* sysdeps/stub/s_log2l.c: Likewise.
+
+1997-06-18 11:46  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/libm-ieee754/w_gamma.c: If _LIB_VERSION is _SVID_ compute
+	result as before last change.
+	* sysdeps/libm-ieee754/w_gammaf.c: Likewise.
+	* sysdeps/libm-ieee754/w_gammal.c: Likewise.
+
+1997-06-16 23:37  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/libm-ieee754/s_remquo.c: Fix off-by-one when computing
+	quotient.
+	* sysdeps/libm-ieee754/s_remquof.c: Likewise.
+	* sysdeps/libm-ieee754/s_remquol.c: Likewise.
+
+	* sysdeps/m68k/fpu/s_remquo.c: Remove FIXME and special case for
+	quotient.
+
+	* sysdeps/libm-ieee754/w_gamma.c: Add missing call to exp
+	function.  Don't use global signgam.
+	* sysdeps/libm-ieee754/w_gammaf.c: Likewise.
+	* sysdeps/libm-ieee754/w_gammal.c: Likewise.
+
+	* math/Makefile (libm-calls): Remove w_gamma_r.
+	* sysdeps/libm-ieee754/w_gamma_r.c: Remove file.
+	* sysdeps/libm-ieee754/w_gammaf_r.c: Remove file.
+	* sysdeps/libm-ieee754/w_gammal_r.c: Remove file.
+
+	* math/libm-test.c (atanh_test): Declare x only if needed.
+	(signbit_test): Fix typo.
+	(gamma_test): Check whether function is implemented.  Add
+	epsilons.
+	(lgamma_test): Likewise.
+	(fmod_test): Add epsilons.
+	(exp2_test): Use right function for existence test.
+
+1997-06-07 09:20  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/powerpc/Dist: Add fenv_const.c.
+	* sysdeps/unix/sysv/linux/Dist: Add net/if_slip.h.
+	* sysdeps/unix/sysv/linux/powerpc/Dist: Add init-first.h and
+	syscall.h.
+	* sysdeps/unix/sysv/linux/sparc/Dist: Add init-first.h.
+	* string/Makefile (distribute): Add tst-svc.expect.
+	* nis/Makefile (distribute): Add nis_intern.h and Banner.
+	* elf/Makefile (distribute): Add dl-hash.h.
+	* Rules (subdir_echo-distinfo): Add headers from $(distribute).
+
+	* login/Makefile (others): Add utmpdump.
+	* sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add
+	net/if_slip.h.
+
+	* manual/Makefile (dir-add.texi): Also look in indirectly included
+	files.
+
+1997-06-16 23:15  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/unix/sysv/linux/configure.in: Remove commands to
+	generate stdio_lim.h.
+	* sysdeps/unix/sysv/linux/mk-stdiolim.c: Remove.
+	* sysdeps/unix/sysv/linux/Makefile: Add rules to generate
+	stdio_lim.h here.
+	(common-generated): Add generated files.
+	(inhibit-stdio_lim): Define.
+	* sysdeps/posix/Makefile [$(inhibit-stdio_lim)=yes]: Disable rules
+	to generate stdio_lim.h.
+
+	* sysdeps/unix/sysv/linux/Makefile: Suppress inclusion of
+	dependecy files if no_deps is set.
+	($(objpfx)syscall-%.d): Add header file as target to dependency
+	generation.
+
+1997-06-14 19:19  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/unix/sysv/linux/arm/Dist: New file.
+
+1997-06-14 17:59  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* extra-lib.mk (others): Depend on versioned shared library, not
+	the unversioned one.
+	* Makerules (build-shlib): Don't make the version link here.
+	($(common-objpfx)libc.so$(libc.so-version)): New rule for libc
+	version link.
+
+1997-06-16 03:07  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/libm-ieee754/k_standard.c: Undo change of Tue Aug 6
+	01:13:56 1996.
+
 1997-06-16 00:54  Ulrich Drepper  <drepper@cygnus.com>
 
 	* libc.map: Add more symbols.
@@ -834,7 +1151,8 @@
 
 1997-05-27 14:16  Miles Bader  <miles@gnu.ai.mit.edu>
 
-	* argp-help.c (argp_args_usage): Supply correct argp to filter_doc.
+	* argp/argp-help.c (argp_args_usage): Supply correct argp to
+	filter_doc.
 
 1997-05-27 17:51  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
 
@@ -1199,7 +1517,7 @@
 
 1997-05-21 17:53  Miles Bader  <miles@gnu.ai.mit.edu>
 
-	* argp-help.c (hol_add_cluster): Initialize CL->depth.
+	* argp/argp-help.c (hol_add_cluster): Initialize CL->depth.
 
 1997-05-24 03:51  Ulrich Drepper  <drepper@cygnus.com>
 
@@ -1401,10 +1719,10 @@
 
 1997-05-20 14:01  Miles Bader  <miles@gnu.ai.mit.edu>
 
-	* argp-help.c (_help): Supply STATE to argp_args_usage.
+	* argp/argp-help.c (_help): Supply STATE to argp_args_usage.
 	(argp_args_usage): Add filtering of the args doc string.
 	(comma): Print cluster headers for the first entry too.
-	* argp.h (ARGP_KEY_HELP_ARGS_DOC): New macro.
+	* argp/argp.h (ARGP_KEY_HELP_ARGS_DOC): New macro.
 
 1997-05-21 02:49  Ulrich Drepper  <drepper@cygnus.com>
 
@@ -2602,7 +2920,7 @@
 
 	* rellns-sh: Rewrite to work also in presence of symlinks.
 
-	* arpg/argp-fmtstream.c: Add casts to prevent warnings.
+	* argp/argp-fmtstream.c: Add casts to prevent warnings.
 	* argp/argp-fmtstream.h: Likewise.
 	* argp/argp-help.c: Likewise.
 
@@ -5205,8 +5523,8 @@
 
 1997-02-21 10:41  Miles Bader  <miles@gnu.ai.mit.edu>
 
-	* argp.h (OPTION_NO_USAGE): New macro.
-	* argp-help.c (usage_long_opt, usage_argful_short_opt,
+	* argp/argp.h (OPTION_NO_USAGE): New macro.
+	* argp/argp-help.c (usage_long_opt, usage_argful_short_opt,
 	add_argless_short_opt): Implement OPTION_NO_USAGE.
 
 1997-02-20 16:41  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
@@ -5215,10 +5533,10 @@
 
 1997-02-20 15:56  Miles Bader  <miles@gnu.ai.mit.edu>
 
-	* argp-fmtstream.c (__argp_fmtstream_update): Account for case
+	* argp/argp-fmtstream.c (__argp_fmtstream_update): Account for case
 	where NEXTLINE points one past the end of the active buffer.
 
-	* argp-help.c <stddef.h>: New include.
+	* argp/argp-help.c <stddef.h>: New include.
 	(__argp_failure): Only exit if STATE says it's ok.
 	(print_header, hol_entry_help): Use UPARAMS fields rather than
 	constants.
@@ -5241,12 +5559,12 @@
 	(fill_in_uparams): New function.
 	(__argp_failure, __argp_error, __argp_state_help): Make STATE
 	parameter const.
-	* argp.h (argp_state_help, __argp_state_help, argp_usage,
+	* argp/argp.h (argp_state_help, __argp_state_help, argp_usage,
 	__argp_usage, argp_error, __argp_error, argp_failure,
 	__argp_failure): Make STATE parameter const.
 	(ARGP_KEY_HELP_DUP_ARGS_NOTE): New macro.
 
-	* argp.h (argp_program_bug_address): Make const.
+	* argp/argp.h (argp_program_bug_address): Make const.
 
 1997-02-20 19:20  Ulrich Drepper  <drepper@cygnus.com>
 
@@ -5283,12 +5601,12 @@
 
 1997-02-19 18:48  Miles Bader  <miles@gnu.ai.mit.edu>
 
-	* argp-parse.c (argp_default_parser): Set STATE->name for OPT_PROGNAME.
+	* argp/argp-parse.c (argp_default_parser): Set STATE->name for OPT_PROGNAME.
 	(parser_init): Use the basename for PARSER->state.name.
-	* argp-help.c (__argp_error, __argp_failure, __argp_state_help):
+	* argp/argp-help.c (__argp_error, __argp_failure, __argp_state_help):
 	Use PROGRAM_INVOCATION_SHORT_NAME instead of PROGRAM_INVOCATION_NAME.
 
-	* argp-parse.c (parser_init): Set PARSER->state.flags.
+	* argp/argp-parse.c (parser_init): Set PARSER->state.flags.
 	Make check whether PARSER has the prog name in argv[0] at the
 	proper place.
 
diff --git a/Makeconfig b/Makeconfig
index 73cae78aed..fbff6b3d3e 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -381,13 +381,6 @@ link-libc = $(common-objpfx)libc.a $(gnulib) $(common-objpfx)libc.a
 endif
 endif
 
-# We have a versioning file for libc.so.  We must define this here since
-# otherwise in the subdirs this definition is not available and a rebuild
-# of libc.so happens without versioning.
-ifndef libc-map
-libc-map = libc.map
-endif
-
 ifndef link-extra-libs
 ifeq (yes,$(build-shared))
 ifneq ($(common-objpfx),$(objpfx))
diff --git a/Makerules b/Makerules
index 4acf64cfdf..64301673d5 100644
--- a/Makerules
+++ b/Makerules
@@ -345,11 +345,7 @@ no-whole-archive =
 endif
 
 ifeq ($(versioning),yes)
-ifneq ($(..),)
-load-map-file = $(wildcard $($(@F:%.so=%)-map) $($(@F:%.so=%)-map):%=$(..)%)
-else
 load-map-file = $($(@F:%.so=%)-map)
-endif
 else
 load-map-file =
 endif
@@ -371,8 +367,6 @@ $(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS)  \
 	  -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
 	  -Wl,--whole-archive $(filter-out $(load-map-file),$^) \
 	  $(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so)
-	  test -z "$($(@F)-version)" || \
-	    (rm -f $@$($(@F)-version); $(LN_S) $(@F) $@$($(@F)-version))
 endef
 
 # Don't try to use -lc when making libc.so itself.
@@ -383,12 +377,18 @@ LDFLAGS-c.so = -nostdlib -nostartfiles
 LDLIBS-c.so = -lgcc
 # Give libc.so an entry point and make it directly runnable itself.
 LDFLAGS-c.so += -e __libc_main
+# We have a versioning file for libc.so.
+libc-map = $(..)libc.map
 # Use our own special initializer and finalizer files for libc.so.
 $(common-objpfx)libc.so: $(elfobjdir)/soinit.so \
 			 $(common-objpfx)libc_pic.a \
 			 $(elfobjdir)/sofini.so $(elfobjdir)/ld.so \
-			 $(libc-map:%=$(..)%)
+			 $(libc-map)
 	$(build-shlib)
+ifdef libc.so-version
+$(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so
+	$(make-link)
+endif
 endif
 
 # Some files must not be compiled with the exception handler mechanism
diff --git a/Rules b/Rules
index 45417e0142..89050bedf1 100644
--- a/Rules
+++ b/Rules
@@ -122,7 +122,7 @@ subdir_echo-headers: echo-headers
 
 .PHONY: subdir_echo-distinfo
 subdir_echo-distinfo:
-	@echo $(addprefix +header+,$(headers)) \
+	@echo $(addprefix +header+,$(headers) $(filter %.h,$(distribute))) \
 	      $(addprefix +nodist+,$(generated) $(common-generated) $(dont_distribute))
 
 # We want to install everything except the library itself, but update all
diff --git a/argp/argp-parse.c b/argp/argp-parse.c
index edc5516851..018a97807e 100644
--- a/argp/argp-parse.c
+++ b/argp/argp-parse.c
@@ -38,6 +38,7 @@
 # define _(msgid)       (msgid)
 # define gettext(msgid) (msgid)
 #endif
+#define N_(msgid) (msgid)
 #endif
 
 #if _LIBC - 0
@@ -84,11 +85,11 @@ volatile int _argp_hang = 0;
 
 static const struct argp_option argp_default_options[] =
 {
-  {"help",	  '?',    	0, 0,  "Give this help list", -1},
-  {"usage",	  OPT_USAGE,	0, 0,  "Give a short usage message"},
-  {"program-name",OPT_PROGNAME,"NAME", OPTION_HIDDEN, "Set the program name"},
+  {"help",	  '?',    	0, 0,  N_("Give this help list"), -1},
+  {"usage",	  OPT_USAGE,	0, 0,  N_("Give a short usage message")},
+  {"program-name",OPT_PROGNAME,"NAME", OPTION_HIDDEN, N_("Set the program name")},
   {"HANG",	  OPT_HANG,    "SECS", OPTION_ARG_OPTIONAL | OPTION_HIDDEN,
-     "Hang for SECS seconds (default 3600)"},
+     N_("Hang for SECS seconds (default 3600)")},
   {0, 0}
 };
 
@@ -145,7 +146,7 @@ static const struct argp argp_default_argp =
 
 static const struct argp_option argp_version_options[] =
 {
-  {"version",	  'V',    	0, 0,  "Print program version", -1},
+  {"version",	  'V',    	0, 0,  N_("Print program version"), -1},
   {0, 0}
 };
 
@@ -160,7 +161,7 @@ argp_version_parser (int key, char *arg, struct argp_state *state)
       else if (argp_program_version)
 	fprintf (state->out_stream, "%s\n", argp_program_version);
       else
-	__argp_error (state, _("No version known!?"));
+	__argp_error (state, _("(PROGRAM ERROR) No version known!?"));
       if (! (state->flags & ARGP_NO_EXIT))
 	exit (0);
       break;
@@ -637,8 +638,8 @@ parser_finalize (struct parser *parser,
 	err = EBADKEY;
       }
 
-  /* Okay, we're all done, with either an error or success.  We only call the
-     parsers once more, to indicate which one.  */
+  /* Okay, we're all done, with either an error or success; call the parsers
+     to indicate which one.  */
 
   if (err)
     {
@@ -654,7 +655,7 @@ parser_finalize (struct parser *parser,
 	group_parse (group, &parser->state, ARGP_KEY_ERROR, 0);
     }
   else
-    /* Do final cleanup, including propagating back values from parsers.  */
+    /* Notify parsers of success, and propagate back values from parsers.  */
     {
       /* We pass over the groups in reverse order so that child groups are
 	 given a chance to do there processing before passing back a value to
@@ -667,6 +668,10 @@ parser_finalize (struct parser *parser,
 	err = 0;		/* Some parser didn't understand.  */
     }
 
+  /* Call parsers once more, to do any final cleanup.  Errors are ignored.  */
+  for (group = parser->egroup - 1; group >= parser->groups; group--)
+    group_parse (group, &parser->state, ARGP_KEY_FINI, 0);
+
   if (err == EBADKEY)
     err = EINVAL;
 
@@ -676,28 +681,55 @@ parser_finalize (struct parser *parser,
 }
 
 /* Call the user parsers to parse the non-option argument VAL, at the current
-   position, returning any error.  */
+   position, returning any error.  The state NEXT pointer is assumed to have
+   been adjusted (by getopt) to point after this argument; this function will
+   adjust it correctly to reflect however many args actually end up being
+   consumed.  */
 static error_t
 parser_parse_arg (struct parser *parser, char *val)
 {
-  int index = parser->state.next;
+  /* Save the starting value of NEXT, first adjusting it so that the arg
+     we're parsing is again the front of the arg vector.  */
+  int index = --parser->state.next;
   error_t err = EBADKEY;
   struct group *group;
+  int key = 0;			/* Which of ARGP_KEY_ARG[S] we used.  */
 
+  /* Try to parse the argument in each parser.  */
   for (group = parser->groups
        ; group < parser->egroup && err == EBADKEY
        ; group++)
-    err = group_parse (group, &parser->state, ARGP_KEY_ARG, val);
-
-  if (!err)
-    if (parser->state.next >= index)
-      /* Remember that we successfully processed a non-option
-	 argument -- but only if the user hasn't gotten tricky and set
-	 the clock back.  */
-      (--group)->args_processed++;
-    else
-      /* The user wants to reparse some args, give getopt another try.  */
-      parser->try_getopt = 1;
+    {
+      parser->state.next++;	/* For ARGP_KEY_ARG, consume the arg.  */
+      key = ARGP_KEY_ARG;
+      err = group_parse (group, &parser->state, key, val);
+
+      if (err == EBADKEY)
+	/* This parser doesn't like ARGP_KEY_ARG; try ARGP_KEY_ARGS instead. */
+	{
+	  parser->state.next--;	/* For ARGP_KEY_ARGS, put back the arg.  */
+	  key = ARGP_KEY_ARGS;
+	  err = group_parse (group, &parser->state, key, 0);
+	}
+    }
+
+  if (! err)
+    {
+      if (key == ARGP_KEY_ARGS)
+	/* The default for ARGP_KEY_ARGS is to assume that if NEXT isn't
+	   changed by the user, *all* arguments should be considered
+	   consumed.  */
+	parser->state.next = parser->state.argc;
+
+      if (parser->state.next > index)
+	/* Remember that we successfully processed a non-option
+	   argument -- but only if the user hasn't gotten tricky and set
+	   the clock back.  */
+	(--group)->args_processed += (parser->state.next - index);
+      else
+	/* The user wants to reparse some args, give getopt another try.  */
+	parser->try_getopt = 1;
+    }
 
   return err;
 }
@@ -710,6 +742,7 @@ parser_parse_opt (struct parser *parser, int opt, char *val)
   /* The group key encoded in the high bits; 0 for short opts or
      group_number + 1 for long opts.  */
   int group_key = opt >> USER_BITS;
+  error_t err = EBADKEY;
 
   if (group_key == 0)
     /* A short option.  By comparing OPT's position in SHORT_OPTS to the
@@ -722,16 +755,39 @@ parser_parse_opt (struct parser *parser, int opt, char *val)
       if (short_index)
 	for (group = parser->groups; group < parser->egroup; group++)
 	  if (group->short_end > short_index)
-	    return group_parse (group, &parser->state, opt, optarg);
-
-      return EBADKEY;		/* until otherwise asserted */
+	    {
+	      err = group_parse (group, &parser->state, opt, optarg);
+	      break;
+	    }
     }
   else
     /* A long option.  We use shifts instead of masking for extracting
        the user value in order to preserve the sign.  */
-    return
+    err =
       group_parse (&parser->groups[group_key - 1], &parser->state,
 		   (opt << GROUP_BITS) >> GROUP_BITS, optarg);
+
+  if (err == EBADKEY)
+    /* At least currently, an option not recognized is an error in the
+       parser, because we pre-compute which parser is supposed to deal
+       with each option.  */
+    {
+      static const char bad_key_err[] =
+	N_("(PROGRAM ERROR) Option should have been recognized!?");
+      if (group_key == 0)
+	__argp_error (&parser->state, "-%c: %s", opt, _(bad_key_err));
+      else
+	{
+	  struct option *long_opt = parser->long_opts;
+	  while (long_opt->val != opt && long_opt->name)
+	    long_opt++;
+	  __argp_error (&parser->state, "--%s: %s",
+			long_opt->name ? long_opt->name : "???",
+			_(bad_key_err));
+	}
+    }	
+
+  return err;
 }
 
 /* Parse the next argument in PARSER (as indicated by PARSER->state.next).
@@ -800,20 +856,20 @@ parser_parse_next (struct parser *parser, int *arg_ebadkey)
 	return EBADKEY;
       }
     else
-      /* A non-option arg.  */
-      err =
-	parser_parse_arg (parser, parser->state.argv[parser->state.next++]);
-  else if (opt == KEY_ARG)
+      /* A non-option arg; simulate what getopt might have done.  */
+      {
+	opt = KEY_ARG;
+	optarg = parser->state.argv[parser->state.next++];
+      }
+
+  if (opt == KEY_ARG)
     /* A non-option argument; try each parser in turn.  */
     err = parser_parse_arg (parser, optarg);
   else
     err = parser_parse_opt (parser, opt, optarg);
-
+		      
   if (err == EBADKEY)
-    {
-      *arg_ebadkey = (opt == KEY_END || opt == KEY_ARG);
-      parser->state.next--;	/* Put back the unused argument.  */
-    }
+    *arg_ebadkey = (opt == KEY_END || opt == KEY_ARG);
 
   return err;
 }
diff --git a/argp/argp.h b/argp/argp.h
index 61ed8351e6..2305590a5d 100644
--- a/argp/argp.h
+++ b/argp/argp.h
@@ -160,6 +160,12 @@ typedef error_t (*argp_parser_t)(int key, char *arg, struct argp_state *state);
    actually modify the argument (perhaps into an option), and have it
    processed again.  */
 #define ARGP_KEY_ARG		0
+/* There are remaining arguments not parsed by any parser, which may be found
+   starting at (STATE->argv + STATE->next).  If success is returned, but
+   STATE->next left untouched, it's assumed that all arguments were consume,
+   otherwise, the parser should adjust STATE->next to reflect any arguments
+   consumed.  */
+#define ARGP_KEY_ARGS		0x1000006
 /* There are no more command line arguments at all.  */
 #define ARGP_KEY_END		0x1000001
 /* Because it's common to want to do some special processing if there aren't
@@ -172,11 +178,12 @@ typedef error_t (*argp_parser_t)(int key, char *arg, struct argp_state *state);
    element of the CHILD_INPUT field, if any, in the state structure is
    copied to each child's state to be the initial value of the INPUT field.  */
 #define ARGP_KEY_INIT		0x1000003
+/* Use after all other keys, including SUCCESS & END.  */
+#define ARGP_KEY_FINI		0x1000007
 /* Passed in when parsing has successfully been completed (even if there are
    still arguments remaining).  */
 #define ARGP_KEY_SUCCESS	0x1000004
-/* Passed in if an error occurs (in which case a call with ARGP_KEY_SUCCESS is
-   never made, so any cleanup must be done here).  */
+/* Passed in if an error occurs.  */
 #define ARGP_KEY_ERROR		0x1000005
 
 /* An argp structure contains a set of options declarations, a function to
diff --git a/elf/Makefile b/elf/Makefile
index 33d57ed70f..489a565945 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -35,7 +35,7 @@ elide-routines.so = $(dl-routines) dl-support enbl-secure
 # interpreter and operating independent of libc.
 rtld-routines	:= rtld $(dl-routines) dl-sysdep dl-minimal
 distribute	= $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \
-		  soinit.c sofini.c ldd.sh.in ldd.bash.in eval.c
+		  dl-hash.h soinit.c sofini.c ldd.sh.in ldd.bash.in eval.c
 
 extra-libs	 = libdl
 extra-libs-others = $(extra-libs)
diff --git a/elf/dl-minimal.c b/elf/dl-minimal.c
index 12d38c9a3a..f5b256808a 100644
--- a/elf/dl-minimal.c
+++ b/elf/dl-minimal.c
@@ -126,7 +126,6 @@ longjmp (jmp_buf env, int val) { __longjmp (env[0].__jmpbuf, val); }
 char * weak_function
 __dcgettext (const char *domainname, const char *msgid, int category)
 {
-  assert (domainname == _libc_intl_domainname);
   return (char *) msgid;
 }
 weak_alias (__dcgettext, dcgettext)
diff --git a/elf/do-rel.h b/elf/do-rel.h
index 66f135916c..766e62c219 100644
--- a/elf/do-rel.h
+++ b/elf/do-rel.h
@@ -53,7 +53,7 @@ elf_dynamic_do_rel (struct link_map *map,
       const ElfW(Sym) *const symtab =
 	(const ElfW(Sym) *) (map->l_addr + map->l_info[DT_SYMTAB]->d_un.d_ptr);
 
-      if (map->l_info[VERSYMIDX (DT_VERNEEDNUM)])
+      if (map->l_info[VERSYMIDX (DT_VERSYM)])
 	{
 	  const ElfW(Half) *const version =
 	    (const ElfW(Half) *) (map->l_addr
diff --git a/elf/ldd.bash.in b/elf/ldd.bash.in
index 809c2717da..32a9405422 100644
--- a/elf/ldd.bash.in
+++ b/elf/ldd.bash.in
@@ -65,7 +65,7 @@ Report bugs using the \`glibcbug' script to <bugs@gnu.ai.mit.edu>."
     verbose=yes
     shift ;;
   --v | --ve | --ver)
-    echo >&2 $"ldd: option \`" $1 $"' is ambiguous"
+    echo >&2 $"ldd: option \`$1' is ambiguous"
     exit 1 ;;
   --)		# Stop option processing.
     shift; break ;;
diff --git a/extra-lib.mk b/extra-lib.mk
index e6088943e2..f2efb4bf7e 100644
--- a/extra-lib.mk
+++ b/extra-lib.mk
@@ -37,7 +37,7 @@ endif
 # The linked shared library is never a dependent of lib-noranlib,
 # because linking it will depend on libc.so already being built.
 ifneq (,$(filter .so,$(object-suffixes-$(lib))))
-others: $(objpfx)$(lib).so
+others: $(objpfx)$(lib).so$($(lib).so-version)
 endif
 
 
diff --git a/features.h b/features.h
index a14179b6a3..c38480e637 100644
--- a/features.h
+++ b/features.h
@@ -188,6 +188,9 @@
 #define __USE_REENTRANT	1
 #endif
 
+/* We do support the IEC 559 math functionality, real and complex.  */
+#define __STDC_IEC_559__		1
+#define __STDC_IEC_559_COMPLEX__	1
 
 /* This macro indicates that the installed library is the GNU C Library.
    For historic reasons the value now is 6 and this will stay from now
diff --git a/inet/rcmd.c b/inet/rcmd.c
index d390a8d809..6a680c18b7 100644
--- a/inet/rcmd.c
+++ b/inet/rcmd.c
@@ -105,7 +105,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
 			else
 				(void)fprintf(stderr, "rcmd: socket: %m\n");
 			sigsetmask(oldmask);
-			return (-1);
+			return -1;
 		}
 		fcntl(s, F_SETOWN, pid);
 		sin.sin_family = hp->h_addrtype;
@@ -140,7 +140,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
 		}
 		(void)fprintf(stderr, "%s: %m\n", hp->h_name);
 		sigsetmask(oldmask);
-		return (-1);
+		return -1;
 	}
 	lport--;
 	if (fd2p == 0) {
@@ -149,7 +149,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
 	} else {
 		char num[8];
 		int s2 = rresvport(&lport), s3;
-		int len = sizeof(from);
+		size_t len = sizeof(from);
 
 		if (s2 < 0)
 			goto bad;
@@ -211,14 +211,14 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
 		goto bad2;
 	}
 	sigsetmask(oldmask);
-	return (s);
+	return s;
 bad2:
 	if (lport)
 		(void)close(*fd2p);
 bad:
 	(void)close(s);
 	sigsetmask(oldmask);
-	return (-1);
+	return -1;
 }
 
 int
@@ -232,20 +232,20 @@ rresvport(alport)
 	sin.sin_addr.s_addr = INADDR_ANY;
 	s = socket(AF_INET, SOCK_STREAM, 0);
 	if (s < 0)
-		return (-1);
+		return -1;
 	for (;;) {
 		sin.sin_port = htons((u_short)*alport);
 		if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) >= 0)
-			return (s);
+			return s;
 		if (errno != EADDRINUSE) {
 			(void)close(s);
-			return (-1);
+			return -1;
 		}
 		(*alport)--;
 		if (*alport == IPPORT_RESERVED/2) {
 			(void)close(s);
 			__set_errno (EAGAIN);		/* close */
-			return (-1);
+			return -1;
 		}
 	}
 }
@@ -282,9 +282,9 @@ ruserok(rhost, superuser, ruser, luser)
 	for (ap = hp->h_addr_list; *ap; ++ap) {
 		bcopy(*ap, &addr, sizeof(addr));
 		if (iruserok(addr, superuser, ruser, luser) == 0)
-			return (0);
+			return 0;
 	}
-	return (-1);
+	return -1;
 }
 
 /*
@@ -314,7 +314,7 @@ again:
 	if (hostf) {
 		if (__ivaliduser(hostf, raddr, luser, ruser) == 0) {
 			(void)fclose(hostf);
-			return (0);
+			return 0;
 		}
 		(void)fclose(hostf);
 	}
@@ -349,7 +349,7 @@ again:
 		  }
 
 		if (hostf == NULL)
-			return (-1);
+			return -1;
 		/*
 		 * If not a regular file, or is owned by someone other than
 		 * user or root or if writeable by anyone but the owner, quit.
@@ -369,11 +369,11 @@ again:
 		if (cp) {
 			__rcmd_errstr = cp;
 			(void)fclose(hostf);
-			return (-1);
+			return -1;
 		}
 		goto again;
 	}
-	return (-1);
+	return -1;
 }
 
 /*
@@ -415,11 +415,11 @@ __ivaliduser(hostf, raddr, luser, ruser)
 		if (__icheckhost(raddr, buf) &&
 		    strcmp(ruser, *user ? user : luser) == 0) {
 			free (buf);
-			return (0);
+			return 0;
 		}
 	}
 	free (buf);
-	return (-1);
+	return -1;
 }
 
 /*
@@ -430,7 +430,7 @@ __icheckhost(raddr, lhost)
 	u_int32_t raddr;
 	register char *lhost;
 {
-	register struct hostent hostbuf, *hp;
+	struct hostent hostbuf, *hp;
 	size_t buflen;
 	char *buffer;
 	register u_int32_t laddr;
@@ -439,7 +439,7 @@ __icheckhost(raddr, lhost)
 
 	/* Try for raw ip address first. */
 	if (isdigit(*lhost) && (int32_t)(laddr = inet_addr(lhost)) != -1)
-		return (raddr == laddr);
+		return raddr == laddr;
 
 	/* Better be a hostname. */
 	buflen = 1024;
@@ -452,14 +452,14 @@ __icheckhost(raddr, lhost)
 	    {
 	      /* Enlarge the buffer.  */
 	      buflen *= 2;
-	      buflen = __alloca (buflen);
+	      buffer = __alloca (buflen);
 	    }
 
 	/* Spin through ip addresses. */
 	for (pp = hp->h_addr_list; *pp; ++pp)
 		if (!bcmp(&raddr, *pp, sizeof(u_int32_t)))
-			return (1);
+			return 1;
 
 	/* No match. */
-	return (0);
+	return 0;
 }
diff --git a/libc.map b/libc.map
index 29f67f6eac..c5100b829a 100644
--- a/libc.map
+++ b/libc.map
@@ -6,14 +6,14 @@ GLIBC_2.0 {
     _IO_stderr_; _IO_stdin_; _IO_stdout_;
     _nl_msg_cat_cntr; __environ; _environ; _res;
     ___brk_addr; __curbrk; _nl_current_LC_CTYPE; _libc_intl_domainname;
-    _sys_errlist; _sys_siglist;
+    _sys_errlist; _sys_siglist; __progname;
 
     # helper functions
     __errno_location; __libc_init_first; __h_errno_location;
 
     # functions with special/multiple interfaces
     __sigsetjmp; _setjmp; __sigaddset; __sigdelset; __sigismember;
-    __sysv_signal; __bsd_getpgrp;
+    __sysv_signal; __bsd_getpgrp; _longjmp;
 
     # functions which have an additional interface since they are
     # are cancelable.
@@ -52,6 +52,22 @@ GLIBC_2.0 {
     __sched_getparam; __sched_getscheduler; __sched_setscheduler;
     __sched_yield; __on_exit; __gettimeofday; __fork; __clone;
     __nss_configure_lookup; _dl_open; _IO_file_setbuf;
+    _IO_file_init; _IO_file_attach; _IO_do_write; _IO_seekoff;
+    _IO_link_in; _IO_file_open; _IO_file_doallocate; _IO_file_fopen;
+    _IO_file_overflow; _IO_file_underflow; _IO_file_sync; _IO_file_seekoff;
+    _IO_file_close_it; _IO_file_read; _IO_file_seek; _IO_file_write;
+    _IO_file_stat; _IO_file_close; _IO_file_xsputn; _IO_sgetn;
+    _IO_seekpos; _IO_padn; _IO_getline; _IO_vfprintf;
+    _IO_proc_open; _IO_proc_close; _IO_vfscanf; _IO_free_backup_area;
+    _IO_un_link; _IO_switch_to_get_mode; _IO_default_uflow;
+    _IO_default_xsputn; _IO_default_xsgetn; _IO_default_pbackfail;
+    _IO_setb; _IO_default_doallocate; _IO_doallocbuf; _IO_init;
+    _IO_default_finish; _IO_sputbackc; _IO_sungetc; _IO_adjust_column;
+    _IO_flush_all; _IO_flush_all_linebuffered; _IO_init_marker;
+    _IO_remove_marker; _IO_marker_difference; _IO_marker_delta;
+    _IO_seekmark; _IO_unsave_markers; _IO_str_overflow;
+    _IO_str_underflow; _IO_str_init_static; _IO_str_init_readonly;
+    _IO_str_seekoff; _IO_str_pbackfail; _IO_list_all;
 
     # all functions and variables in the normal name space
     a*; b*; c*; d*; e*; f*; g*; h*; i*; j*; k*; l*; m*;
diff --git a/login/Makefile b/login/Makefile
index 916dd6c512..e4f9a9e9be 100644
--- a/login/Makefile
+++ b/login/Makefile
@@ -27,7 +27,7 @@ headers	:= utmp.h utmpbits.h lastlog.h pty.h
 routines := getutent getutent_r getutid getutline getutid_r getutline_r \
 	    utmp_file utmp_daemon utmpname updwtmp
 
-others = utmpd
+others = utmpd utmpdump
 install-sbin = utmpd
 utmpd-routines := connection database error request xtmp
 extra-objs := $(utmpd-routines:=.o)
diff --git a/login/programs/request.c b/login/programs/request.c
index d2c12e68cf..5e6bfa19cf 100644
--- a/login/programs/request.c
+++ b/login/programs/request.c
@@ -182,12 +182,8 @@ do_setutent (client_connection *connection)
   setutent_request *request;
   setutent_reply reply;
 
+  /* The request size varies, so don't check it.  */
   request = (setutent_request *)connection->read_base;
-  if (request->header.size != sizeof (setutent_request))
-    {
-      warning (EINVAL, "invalid request size");
-      return -1;
-    }
 
   /* Initialize reply.  */
   reply.header.version = UTMPD_VERSION;
@@ -195,7 +191,8 @@ do_setutent (client_connection *connection)
   reply.header.type = UTMPD_REQ_SETUTENT;
 
   /* Select database.  */
-  if (!strncmp (request->file, _PATH_UTMP, sizeof request->file))
+  if (!strncmp (request->file, _PATH_UTMP,
+		request->header.size - sizeof (setutent_request)))
     connection->database = utmp_db;
   else
     {
@@ -450,7 +447,7 @@ do_pututline (client_connection *connection)
       goto return_error;
     }
 
-  if (connection->database == NULL || connection->position == -1)
+  if (connection->database == NULL)
     {
       errno = ESRCH;
       goto return_error;
@@ -520,12 +517,8 @@ do_updwtmp (client_connection *connection)
   updwtmp_reply reply;
   utmp_database *database;
 
+  /* The request size varies, so don't check it.  */
   request = (updwtmp_request *)connection->read_base;
-  if (request->header.size != sizeof (updwtmp_request))
-    {
-      warning (EINVAL, "invalid request size");
-      return -1;
-    }
 
   /* Initialize reply.  */
   reply.header.version = UTMPD_VERSION;
@@ -539,7 +532,8 @@ do_updwtmp (client_connection *connection)
     }
 
   /* Select database.  */
-  if (!strncmp (request->file, _PATH_UTMP, sizeof request->file))
+  if (!strncmp (request->file, _PATH_UTMP,
+		request->header.size - sizeof (updwtmp_request)))
     database = utmp_db;
   else
     {
diff --git a/login/programs/utmpd.c b/login/programs/utmpd.c
index ca310a21de..3c8d626a84 100644
--- a/login/programs/utmpd.c
+++ b/login/programs/utmpd.c
@@ -134,8 +134,9 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
     usage (EXIT_SUCCESS);
 
   signal (SIGINT, termination_handler);
+  signal (SIGQUIT, termination_handler);
   signal (SIGTERM, termination_handler);
-
+  
   /* Check if we are already running.  */
   if (check_pid (_PATH_UTMPDPID))
     error (EXIT_FAILURE, 0, "already running");
@@ -168,8 +169,13 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
 
       if (write_pid (_PATH_UTMPDPID) < 0)
 	warning (errno, "%s", _PATH_UTMPDPID);
-    }
 
+      /* Ignore job control signals.  */
+      signal (SIGTTOU, SIG_IGN);
+      signal (SIGTTIN, SIG_IGN);
+      signal (SIGTSTP, SIG_IGN);
+    }
+  
   /* Drop priviliges.  */
   drop_priviliges ();
   
diff --git a/login/programs/utmpd.h b/login/programs/utmpd.h
index 8fbc33c923..ef92a1490b 100644
--- a/login/programs/utmpd.h
+++ b/login/programs/utmpd.h
@@ -22,7 +22,6 @@
 
 /* This is an *internal* header.  */
 
-#include <limits.h>
 #include <stddef.h>
 #include <utmp.h>
 
@@ -68,7 +67,7 @@ typedef struct
 {
   request_header header;
   /* File to use.  */
-  char file[_POSIX_PATH_MAX + 1];
+  char file[0];
 } setutent_request;
 
 typedef struct
@@ -100,10 +99,10 @@ typedef struct
 typedef struct
 {
   request_header header;
-  /* File to use.  */
-  char file[_POSIX_PATH_MAX + 1];
   /* Entry to write.  */
   struct utmp utmp;
+  /* File to use.  */
+  char file[0];
 } updwtmp_request;
 
 
diff --git a/login/utmp_daemon.c b/login/utmp_daemon.c
index 705c8b3de9..e0a20e9a9f 100644
--- a/login/utmp_daemon.c
+++ b/login/utmp_daemon.c
@@ -227,24 +227,35 @@ updwtmp_daemon (const char *file, const struct utmp *utmp)
 static int
 do_setutent (int sock)
 {
-  setutent_request request;
+  setutent_request *request;
   setutent_reply reply;
+  size_t size;
 
-  request.header.version = UTMPD_VERSION;
-  request.header.size = sizeof (setutent_request);
-  request.header.type = UTMPD_REQ_SETUTENT;
-  strncpy (request.file, __libc_utmp_file_name, sizeof request.file);
+  size = sizeof (setutent_request) + strlen (__libc_utmp_file_name) + 1;
+  
+  request = malloc (size);
+  if (request == NULL)
+    return -1;
+  
+  request->header.version = UTMPD_VERSION;
+  request->header.size = size;
+  request->header.type = UTMPD_REQ_SETUTENT;
+  strcpy (request->file, __libc_utmp_file_name);
 
   reply.header.version = UTMPD_VERSION;
   reply.header.size = sizeof (setutent_reply);
   reply.header.type = UTMPD_REQ_SETUTENT;
 
-  if (send_request (sock, &request.header, &reply.header) < 0)
-    return -1;
+  if (send_request (sock, &request->header, &reply.header) < 0)
+    {
+      free (request);
+      return -1;
+    }
 
   if (reply.result < 0)
     __set_errno (reply.errnum);
 
+  free (request);
   return reply.result;
 }
 
@@ -375,25 +386,36 @@ do_pututline (int sock, const struct utmp *utmp)
 static int
 do_updwtmp (int sock, const char *file, const struct utmp *utmp)
 {
-  updwtmp_request request;
+  updwtmp_request *request;
   updwtmp_reply reply;
+  size_t size;
 
-  request.header.version = UTMPD_VERSION;
-  request.header.size = sizeof (updwtmp_request);
-  request.header.type = UTMPD_REQ_UPDWTMP;
-  strncpy (request.file, file, sizeof request.file);
-  memcpy (&request.utmp, utmp, sizeof (struct utmp));
+  size = sizeof (updwtmp_request) + strlen (file) + 1;
+  
+  request = malloc (size);
+  if (request == NULL)
+    return -1;
+  
+  request->header.version = UTMPD_VERSION;
+  request->header.size = size;
+  request->header.type = UTMPD_REQ_UPDWTMP;
+  memcpy (&request->utmp, utmp, sizeof (struct utmp));
+  strcpy (request->file, file);
 
   reply.header.version = UTMPD_VERSION;
   reply.header.size = sizeof (updwtmp_reply);
   reply.header.type = UTMPD_REQ_UPDWTMP;
 
-  if (send_request (sock, &request.header, &reply.header) < 0)
-    return -1;
+  if (send_request (sock, &request->header, &reply.header) < 0)
+    {
+      free (request);
+      return -1;
+    }
 
   if (reply.result < 0)
     __set_errno (reply.errnum);
 
+  free (request);
   return reply.result;
 }
 
diff --git a/login/utmp_file.c b/login/utmp_file.c
index 2026070f14..51b33226e0 100644
--- a/login/utmp_file.c
+++ b/login/utmp_file.c
@@ -24,10 +24,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
 #include <unistd.h>
 #include <utmp.h>
-#include <sys/file.h>
-#include <sys/stat.h>
 
 #include "utmp-private.h"
 
@@ -116,7 +115,7 @@ endutent_file (void)
 static int
 getutent_r_file (struct utmp *buffer, struct utmp **result)
 {
-  int nbytes;
+  ssize_t nbytes;
   struct flock fl;			/* Information struct for locking.  */
 
   /* Open utmp file if not already done.  */
@@ -136,7 +135,7 @@ getutent_r_file (struct utmp *buffer, struct utmp **result)
 
   /* Try to get the lock.  */
   memset (&fl, '\0', sizeof (struct flock));
-  fl.l_type = F_WRLCK;
+  fl.l_type = F_RDLCK;
   fl.l_whence = SEEK_SET;
   fcntl (file_fd, F_SETLKW, &fl);
 
@@ -170,12 +169,20 @@ static int
 getutline_r_file (const struct utmp *line, struct utmp *buffer,
 		  struct utmp **result)
 {
+  struct flock fl;
+  
   if (file_fd < 0 || file_offset == -1l)
     {
       *result = NULL;
       return -1;
     }
 
+  /* Try to get the lock.  */
+  memset (&fl, '\0', sizeof (struct flock));
+  fl.l_type = F_RDLCK;
+  fl.l_whence = SEEK_SET;
+  fcntl (file_fd, F_SETLKW, &fl);
+
   while (1)
     {
       /* Read the next entry.  */
@@ -185,7 +192,7 @@ getutline_r_file (const struct utmp *line, struct utmp *buffer,
 	  __set_errno (ESRCH);
 	  file_offset = -1l;
 	  *result = NULL;
-	  return -1;
+	  goto unlock_return;
 	}
       file_offset += sizeof (struct utmp);
 
@@ -203,7 +210,12 @@ getutline_r_file (const struct utmp *line, struct utmp *buffer,
   memcpy (buffer, &last_entry, sizeof (struct utmp));
   *result = buffer;
 
-  return 0;
+unlock_return:
+  /* And unlock the file.  */
+  fl.l_type = F_UNLCK;
+  fcntl (file_fd, F_SETLKW, &fl);
+
+  return ((result == NULL) ? -1 : 0);
 }
 
 
@@ -237,6 +249,15 @@ proc_utmp_eq (const struct utmp *entry, const struct utmp *match)
 static int
 internal_getut_r (const struct utmp *id, struct utmp *buffer)
 {
+  int result = -1;
+  struct flock fl;
+  
+  /* Try to get the lock.  */
+  memset (&fl, '\0', sizeof (struct flock));
+  fl.l_type = F_RDLCK;
+  fl.l_whence = SEEK_SET;
+  fcntl (file_fd, F_SETLKW, &fl);
+
 #if _HAVE_UT_TYPE - 0
   if (id->ut_type == RUN_LVL || id->ut_type == BOOT_TIME
       || id->ut_type == OLD_TIME || id->ut_type == NEW_TIME)
@@ -252,7 +273,7 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer)
 	    {
 	      __set_errno (ESRCH);
 	      file_offset = -1l;
-	      return -1;
+	      goto unlock_return;
 	    }
 	  file_offset += sizeof (struct utmp);
 
@@ -274,7 +295,7 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer)
 	    {
 	      __set_errno (ESRCH);
 	      file_offset = -1l;
-	      return -1;
+	      goto unlock_return;
 	    }
 	  file_offset += sizeof (struct utmp);
 
@@ -283,7 +304,14 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer)
 	}
     }
 
-  return 0;
+  result = 0;
+
+unlock_return:
+  /* And unlock the file.  */
+  fl.l_type = F_UNLCK;
+  fcntl (file_fd, F_SETLKW, &fl);
+
+  return result;
 }
 
 
@@ -401,47 +429,50 @@ static int
 updwtmp_file (const char *file, const struct utmp *utmp)
 {
   int result = -1;
-  struct stat st;
-  ssize_t nbytes;
+  struct flock fl;
+  off_t offset;
   int fd;
   
   /* Open WTMP file.  */
-  fd = __open (file, O_WRONLY | O_APPEND);
+  fd = open (file, O_WRONLY);
   if (fd < 0)
     return -1;
 
-  /* Try to lock the file.  */
-  if (__flock (fd, LOCK_EX | LOCK_NB) < 0 && errno != ENOSYS)
+  /* Try to get the lock.  */
+  memset (&fl, '\0', sizeof (struct flock));
+  fl.l_type = F_WRLCK;
+  fl.l_whence = SEEK_SET;
+  fcntl (fd, F_SETLKW, &fl);
+  
+  /* Remember original size of log file.  */
+  offset = lseek (fd, 0, SEEK_END);
+  if (offset % sizeof (struct utmp) != 0)
     {
-      /* Oh, oh.  The file is already locked.  Wait a bit and try again.  */
-      sleep (1);
+      offset -= offset % sizeof (struct utmp);
+      ftruncate (fd, offset);
 
-      /*  This time we ignore the error.  */
-      __flock (fd, LOCK_EX | LOCK_NB);
+      if (lseek (fd, 0, SEEK_END) < 0)
+	goto unlock_return;
     }
 
-  /* Remember original size of log file.  */
-  if (__fstat (fd, &st) < 0)
-    goto fail;
-
   /* Write the entry.  If we can't write all the bytes, reset the file
      size back to the original size.  That way, no partial entries
      will remain.  */
-  nbytes = __write (fd, utmp, sizeof (struct utmp));
-  if (nbytes != sizeof (struct utmp))
+  if (write (fd, utmp, sizeof (struct utmp)) != sizeof (struct utmp))
     {
-      ftruncate (fd, st.st_size);
-      goto fail;
+      ftruncate (fd, offset);
+      goto unlock_return;
     }
 
   result = 0;
   
-fail:
+unlock_return:
   /* And unlock the file.  */
-  __flock (fd, LOCK_UN);
+  fl.l_type = F_UNLCK;
+  fcntl (fd, F_SETLKW, &fl);
 
   /* Close WTMP file.  */
-  __close (fd);
+  close (fd);
 
   return result;
 }
diff --git a/manual/Makefile b/manual/Makefile
index 80ab3dc30a..836229356e 100644
--- a/manual/Makefile
+++ b/manual/Makefile
@@ -27,7 +27,7 @@ GAWK = gawk
 .PHONY: all dvi info
 all: dvi info
 dvi: libc.dvi
-info: libc.info
+info: libc.info dir-add.info
 
 # Get glibc's configuration info.
 ifneq (,$(wildcard ../Makeconfig))
@@ -75,7 +75,7 @@ stamp-summary: summary.awk $(chapters) $(chapters-incl)
 # Generate a file which can be added to the `dir' content to provide direct
 # access to the documentation of the function, variables, and other
 # definitions.
-dir-add.texi: xtract-typefun.awk $(chapters)
+dir-add.texi: xtract-typefun.awk $(chapters) $(chapters-incl)
 	(echo "@dircategory GNU C library functions";			\
 	 echo "@direntry";						\
 	 $(GAWK) -f $^ | sort;						\
@@ -101,7 +101,7 @@ distribute = $(minimal-dist)	       					\
 			$(minimal-dist)))				\
 	     libc.info* libc.?? libc.??s texinfo.tex summary.texi	\
 	     stamp-summary chapters chapters-incl1 chapters-incl2	\
-	     xtract-typefun.awk dir-add.texi dir-add.info
+	     xtract-typefun.awk dir-add.texi dir-add.info dir
 export distribute := $(distribute)
 
 tar-it = tar chovf $@ $^
@@ -143,6 +143,7 @@ realclean: distclean
 install-data subdir_install: install
 install: $(inst_infodir)/libc.info dir-add.info
 	@if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
+	  test -f $(inst_infodir)/dir || cp dir $(inst_infodir);\
 	  install-info --info-dir=$(inst_infodir) $(inst_infodir)/libc.info;\
 	  install-info --info-dir=$(inst_infodir) dir-add.info;\
 	else : ; fi
diff --git a/manual/argp.texi b/manual/argp.texi
index 53a405e93f..f28a87afc6 100644
--- a/manual/argp.texi
+++ b/manual/argp.texi
@@ -271,13 +271,13 @@ group); in this usage, it's conventional to end the string with a
 The group this option is in.
 
 In a long help message, options are sorted alphabetically within each
-group, and the groups presented in the order 0, 1, 2, @dots{}, @var{n},
--@var{m}, @dots{}, -2, -1.  Every entry in an options array with this
+group, and the groups presented in the order @math{0, 1, 2, @dots{}, @var{n},
+-@var{m}, @dots{}, -2, -1}.  Every entry in an options array with this
 field 0 will inherit the group number of the previous entry, or zero if
 it's the first one, unless its a group header (@code{name} and
-@code{key} fields both zero), in which case, the previous entry + 1 is
+@code{key} fields both zero), in which case, the previous entry @math{+ 1} is
 the default.  Automagic options such as @samp{--help} are put into group
--1.
+--1.
 
 Note that because of C structure initialization rules, this field
 often need not be specified, because 0 is the right value.
@@ -460,6 +460,35 @@ the argument (perhaps into an option), and have it processed again.
 
 @comment argp.h
 @comment GNU
+@item ARGP_KEY_ARGS
+If a parser function returns @code{ARGP_ERR_UNKNOWN} for
+@code{ARGP_KEY_ARG}, it is immediately called again with the key
+@code{ARGP_KEY_ARGS}, which has a similar meaning, but is slightly more
+convenient for consuming all remaining arguments.  @var{arg} is 0, and
+the tail of the argument vector may be found at @code{@var{state}->argv
++ @var{state}->next}.  If success is returned for this key, and
+@code{@var{state}->next} is unchanged, then all remaining arguments are
+considered to have been consumed, otherwise, the amount by which
+@code{@var{state}->next} has been adjust indicates how many were used.
+For instance, here's an example that uses both, for different args:
+
+@smallexample
+...
+case ARGP_KEY_ARG:
+  if (@var{state}->arg_num == 0)
+    /* First argument */
+    first_arg = @var{arg};
+  else
+    return ARGP_KEY_UNKNOWN;    /* Let the next case parse it.  */
+  break;
+case ARGP_KEY_ARGS:
+  remaining_args = @var{state}->argv + @var{state}->next;
+  num_remaining_args = @var{state}->argc - @var{state}->next;
+  break;
+@end smallexample
+
+@comment argp.h
+@comment GNU
 @item ARGP_KEY_END
 There are no more command line arguments at all.
 
@@ -797,7 +826,11 @@ Don't exit on errors (they may still result in error messages).
 @comment argp.h
 @comment GNU
 @item ARGP_LONG_ONLY
-Use the gnu getopt `long-only' rules for parsing arguments.
+Use the gnu getopt `long-only' rules for parsing arguments.  This
+allows long-options to be recognized with only a single @samp{-} (for
+instances, @samp{-help}), but results in a generally somewhat less
+useful interface, that conflicts with the way most GNU programs work.
+For this reason, its use is discouraged.
 
 @comment argp.h
 @comment GNU
diff --git a/manual/dir b/manual/dir
new file mode 100644
index 0000000000..f5920b12be
--- /dev/null
+++ b/manual/dir
@@ -0,0 +1,16 @@
+$Id$
+This is the file .../info/dir, which contains the topmost node of the
+Info hierarchy.  The first time you invoke Info you start off
+looking at that node, which is (dir)Top.
+
+File: dir	Node: Top	This is the top of the INFO tree
+
+  This (the Directory node) gives a menu of major topics. 
+  Typing "q" exits, "?" lists all Info commands, "d" returns here,
+  "h" gives a primer for first-timers,
+  "mEmacs<Return>" visits the Emacs topic, etc.
+
+  In Emacs, you can click mouse button 2 on a menu item or cross reference
+  to select it.
+
+* Menu: 
diff --git a/manual/string.texi b/manual/string.texi
index cb9f5412f8..46101ded99 100644
--- a/manual/string.texi
+++ b/manual/string.texi
@@ -1443,6 +1443,15 @@ it is empty (rather than a pointer to an empty block of memory); this
 invariant is maintained for argz vectors created by the functions here.
 @end deftypefun
 
+@comment argz.h
+@comment GNU
+@deftypefun error_t argz_replace (@w{char **@var{argz}, size_t *@var{argz_len}}, @w{const char *@var{str}, const char *@var{with}}, @w{unsigned *@var{replace_count}})
+Replace any occurances of the string @var{str} in @var{argz} with
+@var{with}, reallocating @var{argz} as necessary.  If
+@var{replace_count} is non-zero, @code{*@var{replace_count}} will be
+incremented by number of replacements performed.
+@end deftypefun
+
 @node Envz Functions, , Argz Functions, Argz and Envz Vectors
 @subsection Envz Functions
 
diff --git a/manual/texinfo.tex b/manual/texinfo.tex
index 8e42adc34f..cce85615de 100644
--- a/manual/texinfo.tex
+++ b/manual/texinfo.tex
@@ -1,5 +1,5 @@
 %% TeX macros to handle Texinfo files.
-%% $Id: texinfo.tex,v 2.203 1997/06/13 22:43:07 drepper Exp $
+%% \$Id: texinfo.tex,v 2.204 1997/06/19 18:21:08 drepper Exp $
 
 %  Copyright (C) 1985, 86, 88, 90, 91, 92, 93,
 %                94, 95, 96, 97 Free Software Foundation, Inc.
@@ -36,7 +36,7 @@
 
 % This automatically updates the version number based on RCS.
 \def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
-\deftexinfoversion$Revision: 2.203 $
+\deftexinfoversion\$Revision: 2.204 $
 \message{Loading texinfo package [Version \texinfoversion]:}
 
 % If in a .fmt file, print the version number
@@ -185,7 +185,13 @@
       %
       \unvbox\headlinebox
       \pagebody{#1}%
-      \unvbox\footlinebox
+      \ifdim\ht\footlinebox > 0pt
+        % Only leave this space if the footline is nonempty.
+        % (We lessened \vsize for it in \oddfootingxxx.)
+        % The \baselineskip=24pt in plain's \makefootline has no effect.
+        \vskip 2\baselineskip
+        \unvbox\footlinebox
+      \fi
       %
       \ifcropmarks
           \egroup % end of \vbox\bgroup
@@ -1006,6 +1012,15 @@ where each line of input produces a line of output.}
    \openindices
    \fixbackslash  % Turn off hack to swallow `\input texinfo'.
    \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+   %
+   % If texinfo.cnf is present on the system, read it.
+   % Useful for site-wide @afourpaper, etc.
+   % Just to be on the safe side, close the input stream before the \input.
+   \openin 1 texinfo.cnf
+   \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
+   \closein1
+   \temp
+   %
    \comment % Ignore the actual filename.
 }
 
@@ -1504,10 +1519,7 @@ where each line of input produces a line of output.}
 \gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
 \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
 
-\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish}
-\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
-\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
 
 \gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
 \gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
@@ -1515,12 +1527,15 @@ where each line of input produces a line of output.}
 
 \gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
 \gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
-\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+  %
+  % Leave some space for the footline.  Hopefully ok to assume
+  % @evenfooting will not be used by itself.
+  \global\advance\pageheight by -3\baselineskip
+  \global\advance\vsize by -3\baselineskip
+}
 
-\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish}
-\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
-\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
 %
 }% unbind the catcode of @.
 
@@ -2244,7 +2259,13 @@ width0pt\relax} \fi
 %\def\char{\realbackslash char}%
 \def\TeX{\realbackslash TeX}%
 \def\dots{\realbackslash dots }%
-\def\copyright{\realbackslash copyright }%
+\def\result{\realbackslash result}%
+\def\equiv{\realbackslash equiv}%
+\def\expansion{\realbackslash expansion}%
+\def\print{\realbackslash print}%
+\def\error{\realbackslash error}%
+\def\point{\realbackslash point}%
+\def\copyright{\realbackslash copyright}%
 \def\tclose##1{\realbackslash tclose {##1}}%
 \def\code##1{\realbackslash code {##1}}%
 \def\dotless##1{\realbackslash dotless {##1}}%
@@ -2696,6 +2717,12 @@ width0pt\relax} \fi
   \def\print{\realbackslash print}%
   \def\TeX{\realbackslash TeX}%
   \def\dots{\realbackslash dots}%
+  \def\result{\realbackslash result}%
+  \def\equiv{\realbackslash equiv}%
+  \def\expansion{\realbackslash expansion}%
+  \def\print{\realbackslash print}%
+  \def\error{\realbackslash error}%
+  \def\point{\realbackslash point}%
   \def\copyright{\realbackslash copyright}%
   \def\tt{\realbackslash tt}%
   \def\bf{\realbackslash bf}%
diff --git a/math/Makefile b/math/Makefile
index fbbcad6ea9..bd4506b99e 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -39,20 +39,20 @@ extra-libs-others = $(extra-libs)
 libm-map	:= libm.map
 
 libm-support = k_standard s_lib_version s_matherr s_signgam		\
-	       s_rinttol s_rinttoll s_roundtol s_roundtoll		\
+	       s_lrint s_llrint s_lround s_llround			\
 	       fclrexcpt fgetexcptflg fraiseexcpt fsetexcptflg		\
 	       ftestexcept fegetround fesetround fegetenv feholdexcpt	\
 	       fesetenv feupdateenv
 libm-calls = e_acos e_acosh e_asin e_atan2 e_atanh e_cosh e_exp e_fmod	\
 	     e_hypot e_j0 e_j1 e_jn e_lgamma_r e_log e_log10 e_pow	\
-	     e_rem_pio2 e_remainder e_scalb e_sinh e_sqrt k_cos		\
-	     k_rem_pio2 k_sin k_tan s_asinh s_atan s_cbrt		\
+	     e_rem_pio2 e_remainder e_scalb e_sinh e_sqrt e_gamma_r	\
+	     k_cos k_rem_pio2 k_sin k_tan s_asinh s_atan s_cbrt		\
 	     s_ceil s_copysign s_cos s_erf s_expm1 s_fabs s_finite	\
 	     s_floor s_frexp s_ilogb s_ldexp s_log1p s_logb 		\
 	     s_modf s_nextafter s_rint s_scalbn s_significand		\
 	     s_sin s_tan s_tanh w_acos w_acosh w_asin			\
 	     w_atan2 w_atanh w_cosh w_drem w_exp w_fmod w_gamma		\
-	     w_gamma_r w_hypot w_j0 w_j1 w_jn w_lgamma w_lgamma_r	\
+	     w_hypot w_j0 w_j1 w_jn w_lgamma w_lgamma_r			\
 	     w_log w_log10 w_pow w_remainder w_scalb w_sinh w_sqrt	\
 	     s_signbit s_fpclassify s_fmax s_fmin s_fdim s_nan s_trunc	\
 	     s_remquo s_log2 s_exp2 s_round s_nearbyint s_sincos	\
diff --git a/math/libm-test.c b/math/libm-test.c
index be7538350b..5bf968f844 100644
--- a/math/libm-test.c
+++ b/math/libm-test.c
@@ -47,8 +47,8 @@
    ilogb, isfinite, isinf, isnan, isnormal,
    ldexp, lgamma, log, log10, log1p, log2, logb,
    modf, nearbyint, nextafter,
-   pow, remainder, remquo, rint, rinttol, rinttoll,
-   round, roundtol, roundtoll,
+   pow, remainder, remquo, rint, lrint, llrint,
+   round, lround, llround,
    scalb, scalbn, signbit, sin, sincos, sinh, sqrt, tan, tanh, trunc
 
    and for the following complex math functions:
@@ -593,6 +593,35 @@ check_int (const char *test_name, int computed, int expected)
   fpstack_test (test_name);
 }
 
+static void
+check_int_exc (const char *test_name, int computed, int expected,
+	       short exception)
+{
+  int diff = computed - expected;
+  int result = diff == 0;
+
+  output_new_test (test_name);
+  test_exceptions (test_name, exception);
+
+  if (result)
+    {
+      output_pass_value ();
+    }
+  else
+    {
+      output_fail_value (test_name);
+      if (verbose > 1)
+	{
+	  printf ("Result:\n");
+	  printf (" is:         %d\n", computed);
+	  printf (" should be:  %d\n", expected);
+	}
+      noErrors++;
+    }
+
+  fpstack_test (test_name);
+}
+
 
 /*
   check that computed and expected values are equal (long int values)
@@ -953,7 +982,9 @@ atan2_test (void)
 static void
 atanh_test (void)
 {
+#ifndef TEST_INLINE
   MATHTYPE x;
+#endif
 
   check ("atanh(+0) == +0", FUNC(atanh) (0), 0);
 #ifndef TEST_INLINE
@@ -1089,7 +1120,7 @@ static void
 exp2_test (void)
 {
   errno = 0;
-  exp2(0);
+  FUNC(exp2) (0);
   if (errno == ENOSYS)
     /* Function not implemented.  */
     return;
@@ -1257,7 +1288,6 @@ signbit_test (void)
   check_bool ("signbit (-0) != 0", signbit (minus_zero));
   check_bool ("signbit (+inf) == 0", signbit (plus_infty) == 0);
   check_bool ("signbit (-inf) != 0", signbit (minus_infty));
-  check_bool ("signbit (NaN) == 0", signbit (nan_value));
 
   x = random_less (0);
   check_bool ("signbit (x) != 0 for x < 0", signbit (x));
@@ -1272,21 +1302,26 @@ signbit_test (void)
 static void
 gamma_test (void)
 {
-  MATHTYPE x;
+  errno = 0;
+  FUNC(gamma) (0);
+  if (errno == ENOSYS)
+    /* Function not implemented.  */
+    return;
+  feclearexcept (FE_ALL_EXCEPT);
 
   check_isinfp ("gamma (+inf) == +inf", FUNC(gamma) (plus_infty));
   check_isnan_exc ("gamma (0) == NaN plus invalid exception",
                     FUNC(gamma) (0), INVALID_EXCEPTION);
 
-  x = random_less (0.0);
-  check_isnan_exc_ext ("gamma (x) == NaN plus invalid exception for x <= 0",
-                        FUNC(gamma) (x), INVALID_EXCEPTION, x);
+  check_isnan_exc_ext ("gamma (x) == NaN plus invalid exception for integer x <= 0",
+                        FUNC(gamma) (-2), INVALID_EXCEPTION, -2);
   check_isnan_exc ("gamma (-inf) == NaN plus invalid exception",
                    FUNC(gamma) (minus_infty), INVALID_EXCEPTION);
 
-  check ("gamma (0.5) == sqrt(pi)", FUNC(gamma) (0.5), FUNC(sqrt) (M_PI));
-  check ("gamma (-0.5) == -2*sqrt(pi)", FUNC(gamma) (-0.5),
-         -2*FUNC(sqrt) (M_PI));
+  check_eps ("gamma (0.5) == sqrt(pi)", FUNC(gamma) (0.5), FUNC(sqrt) (M_PI),
+	     CHOOSE (0, 5e-16, 2e-7));
+  check_eps ("gamma (-0.5) == -2*sqrt(pi)", FUNC(gamma) (-0.5),
+	     -2*FUNC(sqrt) (M_PI), CHOOSE (0, 5e-16, 3e-7));
 
   check ("gamma (1) == 1", FUNC(gamma) (1), 1);
   check ("gamma (4) == 6", FUNC(gamma) (4), 6);
@@ -1297,15 +1332,19 @@ gamma_test (void)
 static void
 lgamma_test (void)
 {
-  MATHTYPE x;
+  errno = 0;
+  FUNC(lgamma) (0);
+  if (errno == ENOSYS)
+    /* Function not implemented.  */
+    return;
+  feclearexcept (FE_ALL_EXCEPT);
 
   check_isinfp ("lgamma (+inf) == +inf", FUNC(lgamma) (plus_infty));
-  check_isnan_exc ("lgamma (0) == +inf plus divide by zero exception",
-                   FUNC(lgamma) (0), DIVIDE_BY_ZERO_EXCEPTION);
+  check_isinfp_exc ("lgamma (0) == +inf plus divide by zero exception",
+		    FUNC(lgamma) (0), DIVIDE_BY_ZERO_EXCEPTION);
 
-  x = random_less (0.0);
-  check_isnan_exc_ext ("lgamma (x) == +inf plus divide by zero exception for x <= 0",
-                       FUNC(lgamma) (x), DIVIDE_BY_ZERO_EXCEPTION, x);
+  check_isinfp_exc ("lgamma (x) == +inf plus divide by zero exception for integer x <= 0",
+		    FUNC(lgamma) (-3), DIVIDE_BY_ZERO_EXCEPTION);
   check_isnan_exc ("lgamma (-inf) == NaN plus invalid exception",
                    FUNC(lgamma) (minus_infty), INVALID_EXCEPTION);
 
@@ -1331,23 +1370,15 @@ static void
 ilogb_test (void)
 {
 
-  /* XXX Are these tests correct? I couldn't find any specification */
-#if 0
-  /* the source suggests that the following calls should fail -
-     but shall we test these special cases or just ignore them? */
-  check_isinfp ("ilogb (+inf) == +inf", FUNC(ilogb) (plus_infty));
-  check_isinfp ("ilogb (-inf) == +inf", FUNC(ilogb) (minus_infty));
-
-  check_isinfn_exc ("ilogb (+0) == -inf plus divide-by-zero exception",
-		    FUNC(ilogb) (0), DIVIDE_BY_ZERO_EXCEPTION);
+  check_int ("ilogb (1) == 0", FUNC(ilogb) (1), 0);
+  check_int ("ilogb (e) == 1", FUNC(ilogb) (M_E), 1);
+  check_int ("ilogb (1024) == 10", FUNC(ilogb) (1024), 10);
+  check_int ("ilogb (-2000) == 10", FUNC(ilogb) (-2000), 10);
 
-  check_isinfn_exc ("ilogb (-0) == -inf plus divide-by-zero exception",
-		    FUNC(ilogb) (minus_zero), DIVIDE_BY_ZERO_EXCEPTION);
-#endif
-  check ("ilogb (1) == 0", FUNC(ilogb) (1), 0);
-  check ("ilogb (e) == 1", FUNC(ilogb) (M_E), 1);
-  check ("ilogb (1024) == 10", FUNC(ilogb) (1024), 10);
-  check ("ilogb (-2000) == 10", FUNC(ilogb) (-2000), 10);
+  check_int_exc ("ilogb (0) == FP_ILOGB0", FUNC(ilogb) (0.0), FP_ILOGB0,
+		 DIVIDE_BY_ZERO_EXCEPTION|INVALID_EXCEPTION);
+  check_int_exc ("ilogb (NaN) == FP_ILOGBNAN", FUNC(ilogb) (nan_value),
+		 FP_ILOGBNAN, INVALID_EXCEPTION);
 
 }
 
@@ -1526,17 +1557,72 @@ scalb_test (void)
 {
   MATHTYPE x;
 
-  check ("scalb (0, 0) == 0", FUNC(scalb) (0, 0), 0);
+  check_isnan ("scalb (2, 0.5) == NaN", FUNC(scalb) (2, 0.5));
+  check_isnan ("scalb (3, -2.5) == NaN", FUNC(scalb) (3, -2.5));
+
+  check_isnan ("scalb (0, NaN) == NaN", FUNC(scalb) (0, nan_value));
+  check_isnan ("scalb (1, NaN) == NaN", FUNC(scalb) (1, nan_value));
+
+  x = random_greater (0.0);
+  check ("scalb (x, 0) == 0", FUNC(scalb) (x, 0), x);
+  x = random_greater (0.0);
+  check ("scalb (-x, 0) == 0", FUNC(scalb) (-x, 0), -x);
+
+  check_isnan_exc ("scalb (+0, +inf) == NaN plus invalid exception",
+		   FUNC(scalb) (0, plus_infty), INVALID_EXCEPTION);
+  check_isnan_exc ("scalb (-0, +inf) == NaN plus invalid exception",
+		   FUNC(scalb) (minus_zero, plus_infty), INVALID_EXCEPTION);
+
+  check ("scalb (+0, 2) == +0", FUNC(scalb) (0, 2), 0);
+  check ("scalb (-0, 4) == -0", FUNC(scalb) (minus_zero, -4), minus_zero);
+  check ("scalb (+0, 0) == +0", FUNC(scalb) (0, 0), 0);
+  check ("scalb (-0, 0) == -0", FUNC(scalb) (minus_zero, 0), minus_zero);
+  check ("scalb (+0, -1) == +0", FUNC(scalb) (0, -1), 0);
+  check ("scalb (-0, -10) == -0", FUNC(scalb) (minus_zero, -10), minus_zero);
+  check ("scalb (+0, -inf) == +0", FUNC(scalb) (0, minus_infty), 0);
+  check ("scalb (-0, -inf) == -0", FUNC(scalb) (minus_zero, minus_infty),
+	 minus_zero);
+
+  check_isinfp ("scalb (+inf, -1) == +inf", FUNC(scalb) (plus_infty, -1));
+  check_isinfn ("scalb (-inf, -10) == -inf", FUNC(scalb) (minus_infty, -10));
+  check_isinfp ("scalb (+inf, 0) == +inf", FUNC(scalb) (plus_infty, 0));
+  check_isinfn ("scalb (-inf, 0) == -inf", FUNC(scalb) (minus_infty, 0));
+  check_isinfp ("scalb (+inf, 2) == +inf", FUNC(scalb) (plus_infty, 2));
+  check_isinfn ("scalb (-inf, 100) == -inf", FUNC(scalb) (minus_infty, 100));
+
+  check ("scalb (0, -inf) == 0", FUNC(scalb) (0.0, minus_infty), 0.0);
+  check ("scalb (-0, -inf) == -0", FUNC(scalb) (minus_zero, minus_infty),
+	 minus_zero);
+  x = random_greater (0.0);
+  check ("scalb (x, -inf) == 0", FUNC(scalb) (x, minus_infty), 0.0);
+  check ("scalb (-x, -inf) == -0", FUNC(scalb) (-x, minus_infty), minus_zero);
+
+  x = random_greater (0.0);
+  check_isinfp ("scalb (x, +inf) == +inf", FUNC(scalb) (x, plus_infty));
+  x = random_greater (0.0);
+  check_isinfn ("scalb (-x, +inf) == -inf", FUNC(scalb) (-x, plus_infty));
+  check_isinfp ("scalb (+inf, +inf) == +inf",
+		FUNC(scalb) (plus_infty, plus_infty));
+  check_isinfn ("scalb (-inf, +inf) == -inf",
+		FUNC(scalb) (minus_infty, plus_infty));
+
+  check_isnan ("scalb (+inf, -inf) == NaN",
+	       FUNC(scalb) (plus_infty, minus_infty));
+  check_isnan ("scalb (-inf, -inf) == NaN",
+	       FUNC(scalb) (minus_infty, minus_infty));
 
-  check_isinfp ("scalb (+inf, 1) == +inf", FUNC(scalb) (plus_infty, 1));
-  check_isinfn ("scalb (-inf, 1) == -inf", FUNC(scalb) (minus_infty, 1));
   check_isnan ("scalb (NaN, 1) == NaN", FUNC(scalb) (nan_value, 1));
+  check_isnan ("scalb (1, NaN) == NaN", FUNC(scalb) (1, nan_value));
+  check_isnan ("scalb (NaN, 0) == NaN", FUNC(scalb) (nan_value, 0));
+  check_isnan ("scalb (0, NaN) == NaN", FUNC(scalb) (0, nan_value));
+  check_isnan ("scalb (NaN, +inf) == NaN",
+	       FUNC(scalb) (nan_value, plus_infty));
+  check_isnan ("scalb (+inf, NaN) == NaN",
+	       FUNC(scalb) (plus_infty, nan_value));
+  check_isnan ("scalb (NaN, NaN) == NaN", FUNC(scalb) (nan_value, nan_value));
 
   check ("scalb (0.8, 4) == 12.8", FUNC(scalb) (0.8L, 4), 12.8L);
   check ("scalb (-0.854375, 5) == -27.34", FUNC(scalb) (-0.854375L, 5), -27.34L);
-
-  x = random_greater (0.0);
-  check_ext ("scalb (x, 0) == x", FUNC(scalb) (x, 0L), x, x);
 }
 
 
@@ -1630,14 +1716,15 @@ sincos_test (void)
   check ("sincos (pi/2, &sin, &cos) puts 1 in sin", sin_res, 1);
   fesetenv (&fenv);
   check_eps ("sincos (pi/2, &sin, &cos) puts 0 in cos", cos_res, 0,
-             CHOOSE(0, 1e-16, 1e-7));
+	     CHOOSE (1e-18L, 1e-16, 1e-7));
 
   FUNC(sincos) (M_PI / 6.0, &sin_res, &cos_res);
-  check ("sincos (pi/6, &sin, &cos) puts 0.5 in sin", sin_res, 0.5);
+  check_eps ("sincos (pi/6, &sin, &cos) puts 0.5 in sin", sin_res, 0.5,
+	     CHOOSE (5e-18L, 0, 0));
 
   FUNC(sincos) (M_PI / 3.0, &sin_res, &cos_res);
   check_eps ("sincos (pi/3, &sin, &cos) puts 0.5 in cos", cos_res, 0.5,
-             CHOOSE(0, 1e-15, 1e-7));
+	     CHOOSE (5e-18L, 1e-15, 1e-7));
 
 
 }
@@ -2045,13 +2132,13 @@ fmod_test (void)
              FUNC(fmod) (x, minus_infty), x, x);
 
   check_eps ("fmod (6.5, 2.3) == 1.9", FUNC(fmod) (6.5, 2.3), 1.9,
-             CHOOSE(0, 1e-15, 0));
+             CHOOSE(5e-16, 1e-15, 2e-7));
   check_eps ("fmod (-6.5, 2.3) == -1.9", FUNC(fmod) (-6.5, 2.3), -1.9,
-             CHOOSE(0, 1e-15, 0));
+             CHOOSE(5e-16, 1e-15, 2e-7));
   check_eps ("fmod (6.5, -2.3) == 1.9", FUNC(fmod) (6.5, -2.3), 1.9,
-             CHOOSE(0, 1e-15, 0));
+             CHOOSE(5e-16, 1e-15, 2e-7));
   check_eps ("fmod (-6.5, -2.3) == -1.9", FUNC(fmod) (-6.5, -2.3), -1.9,
-             CHOOSE(0, 1e-15, 0));
+             CHOOSE(5e-16, 1e-15, 2e-7));
 
 
 }
@@ -4355,44 +4442,44 @@ rint_test (void)
 
 
 static void
-rinttol_test (void)
+lrint_test (void)
 {
   /* XXX this test is incomplete.  We need to have a way to specifiy
      the rounding method and test the critical cases.  So far, only
      unproblematic numbers are tested.  */
 
-  check_long ("rinttol(0) = 0", rinttol (0.0), 0);
-  check_long ("rinttol(-0) = 0", rinttol (minus_zero), 0);
-  check_long ("rinttol(0.2) = 0", rinttol (0.2), 0);
-  check_long ("rinttol(-0.2) = 0", rinttol (-0.2), 0);
+  check_long ("lrint(0) = 0", lrint (0.0), 0);
+  check_long ("lrint(-0) = 0", lrint (minus_zero), 0);
+  check_long ("lrint(0.2) = 0", lrint (0.2), 0);
+  check_long ("lrint(-0.2) = 0", lrint (-0.2), 0);
 
-  check_long ("rinttol(1.4) = 1", rinttol (1.4), 1);
-  check_long ("rinttol(-1.4) = -1", rinttol (-1.4), -1);
+  check_long ("lrint(1.4) = 1", lrint (1.4), 1);
+  check_long ("lrint(-1.4) = -1", lrint (-1.4), -1);
 
-  check_long ("rinttol(8388600.3) = 8388600", rinttol (8388600.3), 8388600);
-  check_long ("rinttol(-8388600.3) = -8388600", rinttol (-8388600.3),
+  check_long ("lrint(8388600.3) = 8388600", lrint (8388600.3), 8388600);
+  check_long ("lrint(-8388600.3) = -8388600", lrint (-8388600.3),
 	      -8388600);
 }
 
 
 static void
-rinttoll_test (void)
+llrint_test (void)
 {
   /* XXX this test is incomplete.  We need to have a way to specifiy
      the rounding method and test the critical cases.  So far, only
      unproblematic numbers are tested.  */
 
-  check_longlong ("rinttoll(0) = 0", rinttoll (0.0), 0);
-  check_longlong ("rinttoll(-0) = 0", rinttoll (minus_zero), 0);
-  check_longlong ("rinttoll(0.2) = 0", rinttoll (0.2), 0);
-  check_longlong ("rinttoll(-0.2) = 0", rinttoll (-0.2), 0);
+  check_longlong ("llrint(0) = 0", llrint (0.0), 0);
+  check_longlong ("llrint(-0) = 0", llrint (minus_zero), 0);
+  check_longlong ("llrint(0.2) = 0", llrint (0.2), 0);
+  check_longlong ("llrint(-0.2) = 0", llrint (-0.2), 0);
 
-  check_longlong ("rinttoll(1.4) = 1", rinttoll (1.4), 1);
-  check_longlong ("rinttoll(-1.4) = -1", rinttoll (-1.4), -1);
+  check_longlong ("llrint(1.4) = 1", llrint (1.4), 1);
+  check_longlong ("llrint(-1.4) = -1", llrint (-1.4), -1);
 
-  check_longlong ("rinttoll(8388600.3) = 8388600", rinttoll (8388600.3),
+  check_longlong ("llrint(8388600.3) = 8388600", llrint (8388600.3),
 		  8388600);
-  check_longlong ("rinttoll(-8388600.3) = -8388600", rinttoll (-8388600.3),
+  check_longlong ("llrint(-8388600.3) = -8388600", llrint (-8388600.3),
 		  -8388600);
 }
 
@@ -4416,45 +4503,45 @@ round_test (void)
 
 
 static void
-roundtol_test (void)
+lround_test (void)
 {
-  check_long ("roundtol(0) = 0", roundtol (0), 0);
-  check_long ("roundtol(-0) = 0", roundtol (minus_zero), 0);
-  check_long ("roundtol(0.2) = 0", roundtol (0.2), 0.0);
-  check_long ("roundtol(-0.2) = 0", roundtol (-0.2), 0);
-  check_long ("roundtol(0.5) = 1", roundtol (0.5), 1);
-  check_long ("roundtol(-0.5) = -1", roundtol (-0.5), -1);
-  check_long ("roundtol(0.8) = 1", roundtol (0.8), 1);
-  check_long ("roundtol(-0.8) = -1", roundtol (-0.8), -1);
-  check_long ("roundtol(1.5) = 2", roundtol (1.5), 2);
-  check_long ("roundtol(-1.5) = -2", roundtol (-1.5), -2);
-  check_long ("roundtol(2097152.5) = 2097153", roundtol (2097152.5), 2097153);
-  check_long ("roundtol(-2097152.5) = -2097153", roundtol (-2097152.5),
+  check_long ("lround(0) = 0", lround (0), 0);
+  check_long ("lround(-0) = 0", lround (minus_zero), 0);
+  check_long ("lround(0.2) = 0", lround (0.2), 0.0);
+  check_long ("lround(-0.2) = 0", lround (-0.2), 0);
+  check_long ("lround(0.5) = 1", lround (0.5), 1);
+  check_long ("lround(-0.5) = -1", lround (-0.5), -1);
+  check_long ("lround(0.8) = 1", lround (0.8), 1);
+  check_long ("lround(-0.8) = -1", lround (-0.8), -1);
+  check_long ("lround(1.5) = 2", lround (1.5), 2);
+  check_long ("lround(-1.5) = -2", lround (-1.5), -2);
+  check_long ("lround(2097152.5) = 2097153", lround (2097152.5), 2097153);
+  check_long ("lround(-2097152.5) = -2097153", lround (-2097152.5),
 	      -2097153);
 }
 
 
 static void
-roundtoll_test (void)
+llround_test (void)
 {
-  check_longlong ("roundtoll(0) = 0", roundtoll (0), 0);
-  check_longlong ("roundtoll(-0) = 0", roundtoll (minus_zero), 0);
-  check_longlong ("roundtoll(0.2) = 0", roundtoll (0.2), 0.0);
-  check_longlong ("roundtoll(-0.2) = 0", roundtoll (-0.2), 0);
-  check_longlong ("roundtoll(0.5) = 1", roundtoll (0.5), 1);
-  check_longlong ("roundtoll(-0.5) = -1", roundtoll (-0.5), -1);
-  check_longlong ("roundtoll(0.8) = 1", roundtoll (0.8), 1);
-  check_longlong ("roundtoll(-0.8) = -1", roundtoll (-0.8), -1);
-  check_longlong ("roundtoll(1.5) = 2", roundtoll (1.5), 2);
-  check_longlong ("roundtoll(-1.5) = -2", roundtoll (-1.5), -2);
-  check_longlong ("roundtoll(2097152.5) = 2097153",
-		  roundtoll (2097152.5), 2097153);
-  check_longlong ("roundtoll(-2097152.5) = -2097153",
-		  roundtoll (-2097152.5), -2097153);
-  check_longlong ("roundtoll(34359738368.5) = 34359738369",
-		  roundtoll (34359738368.5), 34359738369ll);
-  check_longlong ("roundtoll(-34359738368.5) = -34359738369",
-		  roundtoll (-34359738368.5), -34359738369ll);
+  check_longlong ("llround(0) = 0", llround (0), 0);
+  check_longlong ("llround(-0) = 0", llround (minus_zero), 0);
+  check_longlong ("llround(0.2) = 0", llround (0.2), 0.0);
+  check_longlong ("llround(-0.2) = 0", llround (-0.2), 0);
+  check_longlong ("llround(0.5) = 1", llround (0.5), 1);
+  check_longlong ("llround(-0.5) = -1", llround (-0.5), -1);
+  check_longlong ("llround(0.8) = 1", llround (0.8), 1);
+  check_longlong ("llround(-0.8) = -1", llround (-0.8), -1);
+  check_longlong ("llround(1.5) = 2", llround (1.5), 2);
+  check_longlong ("llround(-1.5) = -2", llround (-1.5), -2);
+  check_longlong ("llround(2097152.5) = 2097153",
+		  llround (2097152.5), 2097153);
+  check_longlong ("llround(-2097152.5) = -2097153",
+		  llround (-2097152.5), -2097153);
+  check_longlong ("llround(34359738368.5) = 34359738369",
+		  llround (34359738368.5), 34359738369ll);
+  check_longlong ("llround(-34359738368.5) = -34359738369",
+		  llround (-34359738368.5), -34359738369ll);
 }
 
 
@@ -4811,11 +4898,11 @@ main (int argc, char *argv[])
   floor_test ();
   nearbyint_test ();
   rint_test ();
-  rinttol_test ();
-  rinttoll_test ();
+  lrint_test ();
+  llrint_test ();
   round_test ();
-  roundtol_test ();
-  roundtoll_test ();
+  lround_test ();
+  llround_test ();
   trunc_test ();
 
   /* remainder functions */
diff --git a/math/math.h b/math/math.h
index 5229a020e0..aa37f71f3c 100644
--- a/math/math.h
+++ b/math/math.h
@@ -186,13 +186,13 @@ enum
 
 /* Round X to nearest integral value according to current rounding
    direction.  */
-extern long int rinttol __P ((long double __x));
-extern long long int rinttoll __P ((long double __x));
+extern long int lrint __P ((long double __x));
+extern long long int llrint __P ((long double __x));
 
 /* Round X to nearest integral value, rounding halfway cases away from
    zero.  */
-extern long int roundtol __P ((long double __x));
-extern long long int roundtoll __P ((long double __x));
+extern long int lround __P ((long double __x));
+extern long long int llround __P ((long double __x));
 
 
 /* Comparison macros.  */
diff --git a/math/mathcalls.h b/math/mathcalls.h
index 0aac420bd0..735b5953a7 100644
--- a/math/mathcalls.h
+++ b/math/mathcalls.h
@@ -138,9 +138,7 @@ __MATHCALL (sqrt,, (_Mdouble_ __x));
 #if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC9X
 /* Return `sqrt(X*X + Y*Y)'.  */
 __MATHCALL (hypot,, (_Mdouble_ __x, _Mdouble_ __y));
-#endif
 
-#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
 /* Return the cube root of X.  */
 __MATHCALL (cbrt,, (_Mdouble_ __x));
 #endif
@@ -177,9 +175,6 @@ __MATHDECLX (int,finite,, (_Mdouble_ __value), (__const__));
    and may return an infinity or NaN, or may do something else.  */
 __MATHCALLX (infnan,, (int __error), (__const__));
 
-/* Return X times (2 to the Nth power).  */
-__MATHCALL (scalbn,, (_Mdouble_ __x, int __n));
-
 /* Return the remainder of X/Y.  */
 __MATHCALL (drem,, (_Mdouble_ __x, _Mdouble_ __y));
 
@@ -203,9 +198,6 @@ __MATHCALLX (nan,, (__const char *__tagb), (__const__));
 /* Return nonzero if VALUE is not a number.  */
 __MATHDECLX (int,isnan,, (_Mdouble_ __value), (__const__));
 
-/* Return the binary exponent of X, which must be nonzero.  */
-__MATHDECL (int,ilogb,, (_Mdouble_ __x));
-
 /* Bessel functions.  */
 __MATHCALL (j0,, (_Mdouble_));
 __MATHCALL (j1,, (_Mdouble_));
@@ -222,6 +214,7 @@ __MATHCALL (erf,, (_Mdouble_));
 __MATHCALL (erfc,, (_Mdouble_));
 __MATHCALL (gamma,, (_Mdouble_));
 __MATHCALL (lgamma,, (_Mdouble_));
+#endif
 
 #ifdef __USE_MISC
 /* Reentrant versions of gamma and lgamma.  Those functions use the global
@@ -231,8 +224,6 @@ __MATHCALL (gamma,_r, (_Mdouble_, int *));
 __MATHCALL (lgamma,_r, (_Mdouble_, int *));
 #endif
 
-#endif /* Use misc or X/Open.  */
-
 
 #if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC9X
 /* Return the integer nearest X in the direction of the
@@ -244,11 +235,15 @@ __MATHCALLX (nextafter,, (_Mdouble_ __x, _Mdouble_ __y), (__const__));
 
 /* Return the remainder of integer divison X / Y with infinite precision.  */
 __MATHCALL (remainder,, (_Mdouble_ __x, _Mdouble_ __y));
-#endif
 
-#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
 /* Return X times (2 to the Nth power).  */
 __MATHCALL (scalb,, (_Mdouble_ __x, _Mdouble_ __n));
+
+/* Return X times (2 to the Nth power).  */
+__MATHCALL (scalbn,, (_Mdouble_ __x, long int __n));
+
+/* Return the binary exponent of X, which must be nonzero.  */
+__MATHDECL (int,ilogb,, (_Mdouble_ __x));
 #endif
 
 #ifdef __USE_ISOC9X
diff --git a/md5-crypt/Makefile b/md5-crypt/Makefile
index aae6e8c216..6e88eb6053 100644
--- a/md5-crypt/Makefile
+++ b/md5-crypt/Makefile
@@ -45,6 +45,8 @@ ifeq ($(crypt-in-libc),yes)
 routines += $(libcrypt-routines)
 endif
 
+$(objpfx)md5test: $(objpfx)md5.o
+
 include ../Rules
 
 ifeq ($(build-shared),yes)
diff --git a/nis/Makefile b/nis/Makefile
index 770f3b8283..23a71446bb 100644
--- a/nis/Makefile
+++ b/nis/Makefile
@@ -22,7 +22,7 @@
 subdir	:= nis
 
 headers			:= $(wildcard rpcsvc/*.[hx])
-distribute		:= nss-nis.h nss-nisplus.h
+distribute		:= nss-nis.h nss-nisplus.h nis_intern.h Banner
 
 # These are the databases available for the nis (and perhaps later nisplus)
 # service.  This must be a superset of the services in nss.
diff --git a/stdio-common/temptest.c b/stdio-common/temptest.c
index 71868174db..35ea4dc808 100644
--- a/stdio-common/temptest.c
+++ b/stdio-common/temptest.c
@@ -6,21 +6,17 @@ char *files[500];
 int
 main (int argc, char *argv[])
 {
-  char buf[FILENAME_MAX];
-  char *fn;
   FILE *fp;
   int i;
 
   for (i = 0; i < 500; i++) {
-    fn = __stdio_gen_tempname(buf, sizeof (buf), (const char *) NULL,
-	"file", 0, (size_t *) NULL, (FILE **) NULL);
-    if (fn == NULL) {
-      printf ("__stdio_gen_tempname failed\n");
+    files[i] = tempnam (NULL, "file");
+    if (files[i] == NULL) {
+      printf ("tempnam failed\n");
       exit (1);
     }
-    files[i] = strdup (fn);
-    printf ("file: %s\n", fn);
-    fp = fopen (fn, "w");
+    printf ("file: %s\n", files[i]);
+    fp = fopen (files[i], "w");
     fclose (fp);
   }
 
diff --git a/stdio-common/tstscanf.c b/stdio-common/tstscanf.c
index eb2f30d0f9..d0ff6c8b41 100644
--- a/stdio-common/tstscanf.c
+++ b/stdio-common/tstscanf.c
@@ -166,6 +166,12 @@ main (int argc, char **argv)
 
     if (res != 1 || a != 0)
       exit (EXIT_FAILURE);
+
+    res = sscanf ("1e3", "%lg%n", &a, &n);
+    printf ("res = %d, a = %g, n = %d\n", res, a, n);
+
+    if (res != 1 || a != 1000 || n != 3)
+      exit (EXIT_FAILURE);
   }
 
   exit(EXIT_SUCCESS);
diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c
index 3738e44f0a..0b24b8bb52 100644
--- a/stdio-common/vfscanf.c
+++ b/stdio-common/vfscanf.c
@@ -54,8 +54,10 @@
 
 # undef va_list
 # define va_list	_IO_va_list
-# define ungetc(c, s)	(--read_in, _IO_ungetc (c, s))
-# define inchar()	((c = _IO_getc_unlocked (s)), (void) ++read_in, c)
+# define ungetc(c, s)	((void) ((int) c != EOF && --read_in),		      \
+			 _IO_ungetc (c, s))
+# define inchar()	((c = _IO_getc_unlocked (s)), \
+			 (void) (c != EOF && ++read_in), c)
 # define encode_error()	do {						      \
 			  if (errp != NULL) *errp |= 4;			      \
 			  _IO_funlockfile (s);				      \
@@ -98,8 +100,8 @@
   _IO_flockfile (S)
 # define UNLOCK_STREAM __libc_cleanup_region_end (1)
 #else
-# define ungetc(c, s)	(--read_in, ungetc (c, s))
-# define inchar()	((c = getc (s)), (void) ++read_in, c)
+# define ungetc(c, s)	((void) (c != EOF && --read_in), ungetc (c, s))
+# define inchar()	((c = getc (s)), (void) (c != EOF && ++read_in), c)
 # define encode_error()	do {						      \
 			  funlockfile (s);				      \
 			  __set_errno (EILSEQ);				      \
@@ -719,9 +721,6 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
 	      STRING_ADD_CHAR (str, c, char);
 	    } while ((width <= 0 || --width > 0) && inchar () != EOF);
 
-	  if (c == EOF)
-	    --read_in;
-
 	  if (!(flags & SUPPRESS))
 	    {
 	      *str = '\0';
diff --git a/string/Makefile b/string/Makefile
index b924dfc87d..d2629e60dc 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -36,13 +36,13 @@ routines	:= strcat strchr strcmp strcoll strcpy strcspn		\
 		   swab strfry memfrob memmem				\
 		   $(addprefix argz-,append count create ctsep next	\
 			             delete extract insert stringify	\
-				     addsep)				\
+				     addsep replace)			\
 		   envz basename					\
 		   strcoll_l strxfrm_l
 
 tests		:= tester testcopy test-ffs tst-strlen stratcliff \
 	           tst-svc
-distribute	:= memcopy.h pagecopy.h
+distribute	:= memcopy.h pagecopy.h tst-svc.expect
 
 
 include ../Rules
diff --git a/string/argz-replace.c b/string/argz-replace.c
new file mode 100644
index 0000000000..4d658f4713
--- /dev/null
+++ b/string/argz-replace.c
@@ -0,0 +1,135 @@
+/* String replacement in an argz vector
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   Written by Miles Bader <miles@gnu.ai.mit.edu>
+
+   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.  */
+
+#include <stdlib.h>
+#include <argz.h>
+
+/* Append BUF, of length BUF_LEN to *TO, of length *TO_LEN, reallocating and
+   updating *TO & *TO_LEN appropriately.  If an allocation error occurs,
+   *TO's old value is freed, and *TO is set to 0.  */
+static void
+str_append (char **to, size_t *to_len, const char *buf, const size_t buf_len)
+{
+  size_t new_len = *to_len + buf_len;
+  char *new_to = realloc (*to, new_len + 1);
+
+  if (new_to)
+    {
+      memcpy (new_to + *to_len, buf, buf_len);
+      new_to[new_len] = '\0';
+      *to = new_to;
+      *to_len = new_len;
+    }
+  else
+    {
+      free (*to);
+      *to = 0;
+    }
+}
+
+/* Replace any occurances of the string STR in ARGZ with WITH, reallocating
+   ARGZ as necessary.  If REPLACE_COUNT is non-zero, *REPLACE_COUNT will be
+   incremented by number of replacements performed.  */
+error_t
+__argz_replace (char **argz, size_t *argz_len, const char *str, const char *with,
+		unsigned *replace_count)
+{
+  error_t err = 0;
+
+  if (str && *str)
+    {
+      char *arg = 0;
+      char *src = *argz;
+      size_t src_len = *argz_len;
+      char *dst = 0;
+      size_t dst_len = 0;
+      int delayed_copy = 1;	/* True while we've avoided copying anything.  */
+      size_t str_len = strlen (str), with_len = strlen (with);
+
+      while (!err && (arg = argz_next (src, src_len, arg)))
+	{
+	  char *match = strstr (arg, str);
+	  if (match)
+	    {
+	      char *from = match + str_len;
+	      size_t to_len = match - arg;
+	      char *to = strndup (arg, to_len);
+
+	      while (to && from)
+		{
+		  str_append (&to, &to_len, with, with_len);
+		  if (to)
+		    {
+		      match = strstr (from, str);
+		      if (match)
+			{
+			  str_append (&to, &to_len, from, match - from);
+			  from = match + str_len;
+			}
+		      else
+			{
+			  str_append (&to, &to_len, from, strlen (from));
+			  from = 0;
+			}
+		    }
+		}
+
+	      if (to)
+		{
+		  if (delayed_copy)
+		    /* We avoided copying SRC to DST until we found a match;
+                       now that we've done so, copy everything from the start
+                       of SRC.  */
+		    {
+		      if (arg > src)
+			err = argz_append (&dst, &dst_len, src, (arg - src));
+		      delayed_copy = 0;
+		    }
+		  if (! err)
+		    err = argz_add (&dst, &dst_len, to);
+		  free (to);
+		}
+	      else
+		err = ENOMEM;
+
+	      if (replace_count)
+		(*replace_count)++;
+	    }
+	  else if (! delayed_copy)
+	    err = argz_add (&dst, &dst_len, arg);
+	}
+
+      if (! err)
+	{
+	  if (! delayed_copy)
+	    /* We never found any instances of str.  */
+	    {
+	      if (src)
+		free (src);
+	      *argz = dst;
+	      *argz_len = dst_len;
+	    }
+	}
+      else if (dst_len > 0)
+	free (dst);
+    }
+
+  return err;
+}
+weak_alias (__argz_replace, argz_replace)
diff --git a/string/argz.h b/string/argz.h
index e17b742cf7..0126235b8f 100644
--- a/string/argz.h
+++ b/string/argz.h
@@ -103,6 +103,16 @@ extern error_t __argz_insert __P ((char **__argz, size_t *__argz_len,
 				   char *__before, __const char *__entry));
 extern error_t argz_insert __P ((char **__argz, size_t *__argz_len,
 				 char *__before, __const char *__entry));
+
+/* Replace any occurances of the string STR in ARGZ with WITH, reallocating
+   ARGZ as necessary.  If REPLACE_COUNT is non-zero, *REPLACE_COUNT will be
+   incremented by number of replacements performed.  */
+extern error_t __argz_replace (char **__argz, size_t *__argz_len,
+			       __const char *__str, __const char *__with,
+			       unsigned *__replace_count);
+extern error_t argz_replace (char **__argz, size_t *__argz_len,
+			     __const char *__str, __const char *__with,
+			     unsigned *__replace_count);
 
 /* Returns the next entry in ARGZ & ARGZ_LEN after ENTRY, or NULL if there
    are no more.  If entry is NULL, then the first entry is returned.  This
diff --git a/sunrpc/Makefile b/sunrpc/Makefile
index ee66e532f1..ad21cb251e 100644
--- a/sunrpc/Makefile
+++ b/sunrpc/Makefile
@@ -127,7 +127,8 @@ $(inst_sysconfdir)/rpc: etc.rpc
 # Generate the rpcsvc headers with rpcgen.
 # We use a stamp file to avoid unnessary recompilation each time rpcgen is
 # relinked.
-$(rpcsvc:%.x=$(objpfx)rpcsvc/%.h): $(objpfx)rpcsvc/%.h: $(objpfx)rpcsvc/%.stmp;
+$(rpcsvc:%.x=$(objpfx)rpcsvc/%.h): $(objpfx)rpcsvc/%.h: $(objpfx)rpcsvc/%.stmp
+	@:
 $(objpfx)rpcsvc/%.stmp: rpcsvc/%.x $(objpfx)rpcgen
 	$(make-target-directory)
 	-@rm -f ${@:stmp=T} $@
@@ -138,7 +139,8 @@ $(objpfx)rpcsvc/%.stmp: rpcsvc/%.x $(objpfx)rpcgen
 	touch $@
 
 # Generate the rpcsvc XDR functions with rpcgen.
-$(rpcsvc:%.x=$(objpfx)x%.c): $(objpfx)x%.c: $(objpfx)x%.stmp;
+$(rpcsvc:%.x=$(objpfx)x%.c): $(objpfx)x%.c: $(objpfx)x%.stmp
+	@:
 $(objpfx)x%.stmp: rpcsvc/%.x $(objpfx)rpcgen
 	-@rm -f ${@:stmp=T} $@
 	$(rpcgen-cmd) -c $< -o ${@:stmp=T}
diff --git a/sysdeps/generic/mathbits.h b/sysdeps/generic/mathbits.h
index e4db3dcf19..b14b52d901 100644
--- a/sysdeps/generic/mathbits.h
+++ b/sysdeps/generic/mathbits.h
@@ -32,4 +32,9 @@ typedef double double_t;	/* `double' expressions are evaluated as
 /* Define `INFINITY' as value of type `float_t'.  */
 #define INFINITY	HUGE_VAL
 
+
+/* The values returned by `ilogb' for 0 and NaN respectively.  */
+#define FP_ILOGB0	0x80000001
+#define FP_ILOGBNAN	0x7fffffff
+
 #endif /* mathbits.h */
diff --git a/sysdeps/i386/fpu/mathbits.h b/sysdeps/i386/fpu/mathbits.h
index 7885afeec0..f4a22c0757 100644
--- a/sysdeps/i386/fpu/mathbits.h
+++ b/sysdeps/i386/fpu/mathbits.h
@@ -33,4 +33,9 @@ typedef long double double_t;	/* `double' expressions are evaluated as
 /* Define `INFINITY' as value of type `float_t'.  */
 #define INFINITY	HUGE_VALL
 
+
+/* The values returned by `ilogb' for 0 and NaN respectively.  */
+#define FP_ILOGB0	0x80000000
+#define FP_ILOGBNAN	0x80000000
+
 #endif /* mathbits.h */
diff --git a/sysdeps/libm-i387/e_scalb.S b/sysdeps/libm-i387/e_scalb.S
index 427a3b905e..790f1c1d56 100644
--- a/sysdeps/libm-i387/e_scalb.S
+++ b/sysdeps/libm-i387/e_scalb.S
@@ -1,16 +1,94 @@
 /*
  * Written by J.T. Conklin <jtc@netbsd.org>.
  * Public domain.
+ *
+ * Correct handling of y==-inf <drepper@gnu>
  */
 
 #include <machine/asm.h>
 
 RCSID("$NetBSD: e_scalb.S,v 1.4 1995/05/08 23:49:52 jtc Exp $")
 
+#ifdef __ELF__
+	.section .rodata
+#else
+	.text
+#endif
+
+	.align ALIGNARG(4)
+	ASM_TYPE_DIRECTIVE(zero_nan,@object)
+zero_nan:
+	.double 0.0
+nan:	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+minus_zero:
+	.byte 0, 0, 0, 0, 0, 0, 0, 0x80
+	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+	ASM_SIZE_DIRECTIVE(zero_nan)
+
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+
 ENTRY(__ieee754_scalb)
 	fldl	12(%esp)
+	fxam
+	fnstsw
 	fldl	4(%esp)
+	andl	$0x4700, %eax
+	cmpl	$0x0700, %eax
+	je	1f
+	andl	$0x4500, %eax
+	cmpl	$0x0100, %eax
+	je	2f
+	fxam
+	fnstsw
+	andl	$0x4500, %eax
+	cmpl	$0x0100, %eax
+	je	2f
+	fld	%st(1)
+	frndint
+	fcomp	%st(2)
+	fnstsw
+	sahf
+	jne	2f
 	fscale
 	fstp	%st(1)
 	ret
+
+	/* y is -inf */
+1:	fxam
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	fnstsw
+	movl	8(%esp), %edx
+	shrl	$5, %eax
+	fstp	%st(1)
+	andl	$0x80000000, %edx
+	andl	$8, %eax
+	fstp	%st(1)
+	shrl	$27, %edx
+	addl	%edx, %eax
+	fldl	MOX(zero_nan, %eax, 1)
+	ret
+
+	/* The result is NaN, but we must not raise an exception.
+	   So use a variable.  */
+2:	fstp	%st
+	fstp	%st
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	fldl	MO(nan)
+	ret
 END(__ieee754_scalb)
diff --git a/sysdeps/libm-i387/e_scalbf.S b/sysdeps/libm-i387/e_scalbf.S
index 4c62134a0c..c869da9b38 100644
--- a/sysdeps/libm-i387/e_scalbf.S
+++ b/sysdeps/libm-i387/e_scalbf.S
@@ -2,16 +2,95 @@
  * Written by J.T. Conklin <jtc@netbsd.org>.
  * Public domain.
  * Adapted for float type by Ulrich Drepper <drepper@cygnus.com>.
+ *
+ * Correct handling of y==-inf <drepper@gnu>
  */
 
 #include <machine/asm.h>
 
 RCSID("$NetBSD: $")
 
+#ifdef __ELF__
+	.section .rodata
+#else
+	.text
+#endif
+
+	.align ALIGNARG(4)
+	ASM_TYPE_DIRECTIVE(zero_nan,@object)
+zero_nan:
+	.double 0.0
+nan:	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+minus_zero:
+	.byte 0, 0, 0, 0, 0, 0, 0, 0x80
+	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+	ASM_SIZE_DIRECTIVE(zero_nan)
+
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+
+	.text
 ENTRY(__ieee754_scalbf)
 	flds	8(%esp)
+	fxam
+	fnstsw
 	flds	4(%esp)
+	andl	$0x4700, %eax
+	cmpl	$0x0700, %eax
+	je	1f
+	andl	$0x4500, %eax
+	cmpl	$0x0100, %eax
+	je	2f
+	fxam
+	fnstsw
+	andl	$0x4500, %eax
+	cmpl	$0x0100, %eax
+	je	2f
+	fld	%st(1)
+	frndint
+	fcomp	%st(2)
+	fnstsw
+	sahf
+	jne	2f
 	fscale
 	fstp	%st(1)
 	ret
+
+	/* y is -inf */
+1:	fxam
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	fnstsw
+	movl	4(%esp), %edx
+	shrl	$5, %eax
+	fstp	%st(1)
+	andl	$0x80000000, %edx
+	andl	$8, %eax
+	fstp	%st(1)
+	shrl	$27, %edx
+	addl	%edx, %eax
+	fldl	MOX(zero_nan, %eax, 1)
+	ret
+
+	/* The result is NaN, but we must not raise an exception.
+	   So use a variable.  */
+2:	fstp	%st
+	fstp	%st
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	fldl	MO(nan)
+	ret
 END(__ieee754_scalbf)
diff --git a/sysdeps/libm-i387/e_scalbl.S b/sysdeps/libm-i387/e_scalbl.S
index 3b746ad363..e272614acf 100644
--- a/sysdeps/libm-i387/e_scalbl.S
+++ b/sysdeps/libm-i387/e_scalbl.S
@@ -3,16 +3,94 @@
  * Public domain.
  *
  * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ *
+ * Correct handling of y==-inf <drepper@gnu>
  */
 
 #include <machine/asm.h>
 
 RCSID("$NetBSD: $")
 
+#ifdef __ELF__
+	.section .rodata
+#else
+	.text
+#endif
+
+	.align ALIGNARG(4)
+	ASM_TYPE_DIRECTIVE(zero_nan,@object)
+zero_nan:
+	.double 0.0
+nan:	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+minus_zero:
+	.byte 0, 0, 0, 0, 0, 0, 0, 0x80
+	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+	ASM_SIZE_DIRECTIVE(zero_nan)
+
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+
 ENTRY(__ieee754_scalbl)
 	fldt	16(%esp)
+	fxam
+	fnstsw
 	fldt	4(%esp)
+	andl	$0x4700, %eax
+	cmpl	$0x0700, %eax
+	je	1f
+	andl	$0x4500, %eax
+	cmpl	$0x0100, %eax
+	je	2f
+	fxam
+	fnstsw
+	andl	$0x4500, %eax
+	cmpl	$0x0100, %eax
+	je	2f
+	fld	%st(1)
+	frndint
+	fcomp	%st(2)
+	fnstsw
+	sahf
+	jne	2f
 	fscale
 	fstp	%st(1)
 	ret
+
+	/* y is -inf */
+1:	fxam
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	fnstsw
+	movl	12(%esp), %edx
+	shrl	$5, %eax
+	fstp	%st(1)
+	andl	$0x8000, %edx
+	andl	$8, %eax
+	fstp	%st(1)
+	shrl	$11, %edx
+	addl	%edx, %eax
+	fldl	MOX(zero_nan, %eax, 1)
+	ret
+
+	/* The result is NaN, but we must not raise an exception.
+	   So use a variable.  */
+2:	fstp	%st
+	fstp	%st
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	fldl	MO(nan)
+	ret
 END(__ieee754_scalbl)
diff --git a/sysdeps/libm-i387/s_asinh.S b/sysdeps/libm-i387/s_asinh.S
index 45153fe2d3..a4c52cb67c 100644
--- a/sysdeps/libm-i387/s_asinh.S
+++ b/sysdeps/libm-i387/s_asinh.S
@@ -49,14 +49,14 @@ ENTRY(__asinh)
 	movl	$0x7fffffff, %eax
 	andl	%ecx, %eax
 	andl	$0x80000000, %ecx
+	movl	%eax, %edx
+	orl	$0x800fffff, %edx
+	incl	%edx
+	jz	7f			// x in ±Inf or NaN
 	xorl	%ecx, 8(%esp)
 	fldl	4(%esp)			// |x|
-	movl	%eax, %edx
 	cmpl	$0x3e300000, %eax
 	jb	2f			// |x| < 2^-28
-	orl	$0x800fffff, %edx
-	incl	%edx
-	jz	4f			// x in ±Inf or NaN
 	fldln2				// log(2) : |x|
 	cmpl	$0x41b00000, %eax
 	fxch				// |x| : log(2)
@@ -87,6 +87,9 @@ ENTRY(__asinh)
 	fchs
 4:	ret
 
+7:	fldl	4(%esp)
+	ret
+
 6:	faddl	MO(one)
 	fyl2x
 	jecxz	4f
diff --git a/sysdeps/libm-i387/s_asinhf.S b/sysdeps/libm-i387/s_asinhf.S
index 7e5176c4a6..6369e19ac6 100644
--- a/sysdeps/libm-i387/s_asinhf.S
+++ b/sysdeps/libm-i387/s_asinhf.S
@@ -49,14 +49,14 @@ ENTRY(__asinhf)
 	movl	$0x7fffffff, %eax
 	andl	%ecx, %eax
 	andl	$0x80000000, %ecx
+	movl	%eax, %edx
+	orl	$0x807fffff, %edx
+	incl	%edx
+	jz	7f			// x in ±Inf or NaN
 	xorl	%ecx, 8(%esp)
 	flds	4(%esp)			// |x|
-	movl	%eax, %edx
 	cmpl	$0x38000000, %eax
 	jb	2f			// |x| < 2^-14
-	orl	$0x807fffff, %edx
-	incl	%edx
-	jz	4f			// x in ±Inf or NaN
 	fldln2				// log(2) : |x|
 	cmpl	$0x47000000, %eax
 	fxch				// |x| : log(2)
@@ -87,6 +87,9 @@ ENTRY(__asinhf)
 	fchs
 4:	ret
 
+7:	flds	4(%esp)
+	ret
+
 6:	faddl	MO(one)
 	fyl2x
 	jecxz	4f
diff --git a/sysdeps/libm-i387/s_asinhl.S b/sysdeps/libm-i387/s_asinhl.S
index f764381aab..62e29bc58e 100644
--- a/sysdeps/libm-i387/s_asinhl.S
+++ b/sysdeps/libm-i387/s_asinhl.S
@@ -56,14 +56,14 @@ ENTRY(__asinhl)
 	movl	$0x7fff, %eax
 	andl	%ecx, %eax
 	andl	$0x8000, %ecx
+	movl	%eax, %edx
+	orl	$0xffff8000, %edx
+	incl	%edx
+	jz	7f			// x in ±Inf or NaN
 	xorl	%ecx, 12(%esp)
 	fldt	4(%esp)			// |x|
-	movl	%eax, %edx
 	cmpl	$0x3fde, %eax
 	jb	2f			// |x| < 2^-34
-	orl	$0xffff8000, %edx
-	incl	%edx
-	jz	4f			// x in ±Inf or NaN
 	fldln2				// log(2) : |x|
 	cmpl	$0x4020, %eax
 	fxch				// |x| : log(2)
@@ -94,6 +94,9 @@ ENTRY(__asinhl)
 	fchs
 4:	ret
 
+7:	fldt	4(%esp)
+	ret
+
 6:	faddl	MO(one)
 	fyl2x
 	jecxz	4f
diff --git a/sysdeps/libm-i387/s_ilogb.S b/sysdeps/libm-i387/s_ilogb.S
index 01b8afac10..6c125586c7 100644
--- a/sysdeps/libm-i387/s_ilogb.S
+++ b/sysdeps/libm-i387/s_ilogb.S
@@ -8,18 +8,14 @@
 RCSID("$NetBSD: s_ilogb.S,v 1.5 1995/10/12 15:53:09 jtc Exp $")
 
 ENTRY(__ilogb)
-	pushl	%ebp
-	movl	%esp,%ebp
-	subl	$4,%esp
-
-	fldl	8(%ebp)
+	fldl	4(%esp)
 	fxtract
+	pushl	%eax
 	fstpl	%st
 
-	fistpl	-4(%ebp)
-	movl	-4(%ebp),%eax
+	fistpl	(%esp)
+	popl	%eax
 
-	leave
 	ret
 END (__ilogb)
 weak_alias (__ilogb, ilogb)
diff --git a/sysdeps/libm-i387/s_ilogbf.S b/sysdeps/libm-i387/s_ilogbf.S
index 6a943265b2..b08a32f4ef 100644
--- a/sysdeps/libm-i387/s_ilogbf.S
+++ b/sysdeps/libm-i387/s_ilogbf.S
@@ -8,18 +8,14 @@
 RCSID("$NetBSD: s_ilogbf.S,v 1.4 1995/10/22 20:32:43 pk Exp $")
 
 ENTRY(__ilogbf)
-	pushl	%ebp
-	movl	%esp,%ebp
-	subl	$4,%esp
-
-	flds	8(%ebp)
+	flds	4(%esp)
 	fxtract
+	pushl	%eax
 	fstpl	%st
 
-	fistpl	-4(%ebp)
-	movl	-4(%ebp),%eax
+	fistpl	(%esp)
+	popl	%eax
 
-	leave
 	ret
 END (__ilogbf)
 weak_alias (__ilogbf, ilogbf)
diff --git a/sysdeps/libm-i387/s_ilogbl.S b/sysdeps/libm-i387/s_ilogbl.S
index 2422a41355..adc88aabab 100644
--- a/sysdeps/libm-i387/s_ilogbl.S
+++ b/sysdeps/libm-i387/s_ilogbl.S
@@ -9,17 +9,14 @@
 RCSID("$NetBSD: $")
 
 ENTRY(__ilogbl)
-	pushl	%ebp
-	movl	%esp,%ebp
-	subl	$4,%esp
-
-	fldt	8(%ebp)
+	fldt	4(%esp)
 	fxtract
+	pushl	%eax
+	fstp	%st
 
-	fistpl	-4(%ebp)
-	movl	-4(%ebp),%eax
+	fistpl	(%esp)
+	popl	%eax
 
-	leave
 	ret
 END (__ilogbl)
 weak_alias (__ilogbl, ilogbl)
diff --git a/sysdeps/libm-i387/s_rinttoll.S b/sysdeps/libm-i387/s_llrint.S
index 99395052de..cfb8e86f7d 100644
--- a/sysdeps/libm-i387/s_rinttoll.S
+++ b/sysdeps/libm-i387/s_llrint.S
@@ -22,12 +22,12 @@
 #include <sysdep.h>
 
 	.text
-ENTRY(__rinttoll)
+ENTRY(__llrint)
 	fldt	4(%esp)
 	subl	$8, %esp
 	fistpll	(%esp)
 	popl	%eax
 	popl	%edx
 	ret
-END(__rinttoll)
-weak_alias (__rinttoll, rinttoll)
+END(__llrint)
+weak_alias (__llrint, llrint)
diff --git a/sysdeps/libm-i387/s_rinttol.S b/sysdeps/libm-i387/s_lrint.S
index 22a3e46bd6..19241456a8 100644
--- a/sysdeps/libm-i387/s_rinttol.S
+++ b/sysdeps/libm-i387/s_lrint.S
@@ -22,11 +22,11 @@
 #include <sysdep.h>
 
 	.text
-ENTRY(__rinttol)
+ENTRY(__lrint)
 	fldt	4(%esp)
 	subl	$4, %esp
 	fistpl	(%esp)
 	popl	%eax
 	ret
-END(__rinttol)
-weak_alias (__rinttol, rinttol)
+END(__lrint)
+weak_alias (__lrint, lrint)
diff --git a/sysdeps/libm-i387/s_remquo.S b/sysdeps/libm-i387/s_remquo.S
index a4c5a35468..252bf2678a 100644
--- a/sysdeps/libm-i387/s_remquo.S
+++ b/sysdeps/libm-i387/s_remquo.S
@@ -25,7 +25,12 @@ ENTRY(__remquo)
 	shrl	%cl, %eax
 	andl	$3, %eax
 	movl	20(%esp), %ecx
-	movl	%eax, (%ecx)
+	movl	8(%esp), %edx
+	xorl	16(%esp), %edx
+	testl	$0x80000000, %edx
+	jz	1f
+	negl	%eax
+1:	movl	%eax, (%ecx)
 	ret
 END (__remquo)
 weak_alias (__remquo, remquo)
diff --git a/sysdeps/libm-i387/s_remquof.S b/sysdeps/libm-i387/s_remquof.S
index 56954323a6..144eb3034c 100644
--- a/sysdeps/libm-i387/s_remquof.S
+++ b/sysdeps/libm-i387/s_remquof.S
@@ -25,7 +25,12 @@ ENTRY(__remquof)
 	shrl	%cl, %eax
 	andl	$3, %eax
 	movl	12(%esp), %ecx
-	movl	%eax, (%ecx)
+	movl	4(%esp), %edx
+	xorl	8(%esp), %edx
+	testl	$0x80000000, %edx
+	jz	1f
+	negl	%eax
+1:	movl	%eax, (%ecx)
 	ret
 END (__remquof)
 weak_alias (__remquof, remquof)
diff --git a/sysdeps/libm-i387/s_remquol.S b/sysdeps/libm-i387/s_remquol.S
index 9c91d90c45..2cbcdf18af 100644
--- a/sysdeps/libm-i387/s_remquol.S
+++ b/sysdeps/libm-i387/s_remquol.S
@@ -25,7 +25,12 @@ ENTRY(__remquol)
 	shrl	%cl, %eax
 	andl	$3, %eax
 	movl	28(%esp), %ecx
-	movl	%eax, (%ecx)
+	movl	12(%esp), %edx
+	xorl	24(%esp), %edx
+	testl	$0x8000, %edx
+	jz	1f
+	negl	%eax
+1:	movl	%eax, (%ecx)
 	ret
 END (__remquol)
 weak_alias (__remquol, remquol)
diff --git a/sysdeps/libm-ieee754/e_gamma_r.c b/sysdeps/libm-ieee754/e_gamma_r.c
new file mode 100644
index 0000000000..eb80809843
--- /dev/null
+++ b/sysdeps/libm-ieee754/e_gamma_r.c
@@ -0,0 +1,47 @@
+/* Implementation of gamma function according to ISO C.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#include <math.h>
+#include <math_private.h>
+
+
+double
+__ieee754_gamma_r (double x, int *signgamp)
+{
+  /* We don't have a real gamma implementation now.  We'll use lgamma
+     and the exp function.  But due to the required boundary
+     conditions we must check some values separately.  */
+  int32_t hx;
+  u_int32_t lx;
+
+  EXTRACT_WORDS (hx, lx, x);
+
+  if ((hx & 0x7fffffff | lx) == 0)
+    /* Return value for x == 0 is NaN with invalid exception.  */
+    return x / x;
+  if (hx < 0 && (u_int32_t) hx < 0xfff00000 && __rint (x) == x)
+    {
+      /* Return value for integer x < 0 is NaN with invalid exception.  */
+      return (x - x) / (x - x);
+    }
+
+  /* XXX FIXME.  */
+  return __ieee754_exp (__ieee754_lgamma_r (x, signgamp));
+}
diff --git a/sysdeps/libm-ieee754/e_gammaf_r.c b/sysdeps/libm-ieee754/e_gammaf_r.c
new file mode 100644
index 0000000000..bf79ffeb57
--- /dev/null
+++ b/sysdeps/libm-ieee754/e_gammaf_r.c
@@ -0,0 +1,46 @@
+/* Implementation of gamma function according to ISO C.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#include <math.h>
+#include <math_private.h>
+
+
+float
+__ieee754_gammaf_r (float x, int *signgamp)
+{
+  /* We don't have a real gamma implementation now.  We'll use lgamma
+     and the exp function.  But due to the required boundary
+     conditions we must check some values separately.  */
+  int32_t hx;
+
+  GET_FLOAT_WORD (hx, x);
+
+  if ((hx & 0x7fffffff) == 0)
+    /* Return value for x == 0 is NaN with invalid exception.  */
+    return x / x;
+  if (hx < 0 && (u_int32_t) hx < 0xff800000 && __rintf (x) == x)
+    {
+      /* Return value for integer x < 0 is NaN with invalid exception.  */
+      return (x - x) / (x - x);
+    }
+
+  /* XXX FIXME.  */
+  return __ieee754_expf (__ieee754_lgammaf_r (x, signgamp));
+}
diff --git a/sysdeps/libm-ieee754/e_gammal_r.c b/sysdeps/libm-ieee754/e_gammal_r.c
new file mode 100644
index 0000000000..4fd49886d1
--- /dev/null
+++ b/sysdeps/libm-ieee754/e_gammal_r.c
@@ -0,0 +1,46 @@
+/* Implementation of gamma function according to ISO C.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#include <math.h>
+#include <math_private.h>
+
+
+long double
+__ieee754_gammal_r (long double x, int *signgamp)
+{
+  /* We don't have a real gamma implementation now.  We'll use lgamma
+     and the exp function.  But due to the required boundary
+     conditions we must check some values separately.  */
+  u_int32_t es, hx, lx;
+
+  GET_LDOUBLE_WORDS (es, hx, lx, x);
+
+  if (((es & 0x7fff) | hx | lx) == 0)
+    /* Return value for x == 0 is NaN with invalid exception.  */
+    return x / x;
+  if ((hx & 0x8000) != 0 && (hx & 0x7fff) != 0x7fff && __rintl (x) == x)
+    {
+      /* Return value for integer x < 0 is NaN with invalid exception.  */
+      return (x - x) / (x - x);
+    }
+
+  /* XXX FIXME.  */
+  return __ieee754_expl (__ieee754_lgammal_r (x, signgamp));
+}
diff --git a/sysdeps/libm-ieee754/e_lgamma_r.c b/sysdeps/libm-ieee754/e_lgamma_r.c
index 1be4ddad8f..92e9556568 100644
--- a/sysdeps/libm-ieee754/e_lgamma_r.c
+++ b/sysdeps/libm-ieee754/e_lgamma_r.c
@@ -5,7 +5,7 @@
  *
  * Developed at SunPro, a Sun Microsystems, Inc. business.
  * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice 
+ * software is freely granted, provided that this notice
  * is preserved.
  * ====================================================
  */
@@ -15,12 +15,12 @@ static char rcsid[] = "$NetBSD: e_lgamma_r.c,v 1.7 1995/05/10 20:45:42 jtc Exp $
 #endif
 
 /* __ieee754_lgamma_r(x, signgamp)
- * Reentrant version of the logarithm of the Gamma function 
- * with user provide pointer for the sign of Gamma(x). 
+ * Reentrant version of the logarithm of the Gamma function
+ * with user provide pointer for the sign of Gamma(x).
  *
  * Method:
  *   1. Argument Reduction for 0 < x <= 8
- * 	Since gamma(1+s)=s*gamma(s), for x in [0,8], we may 
+ * 	Since gamma(1+s)=s*gamma(s), for x in [0,8], we may
  * 	reduce x to a number in [1.5,2.5] by
  * 		lgamma(1+s) = log(s) + lgamma(s)
  *	for example,
@@ -58,36 +58,36 @@ static char rcsid[] = "$NetBSD: e_lgamma_r.c,v 1.7 1995/05/10 20:45:42 jtc Exp $
  *	by
  *	  			    3       5             11
  *		w = w0 + w1*z + w2*z  + w3*z  + ... + w6*z
- *	where 
+ *	where
  *		|w - f(z)| < 2**-58.74
- *		
+ *
  *   4. For negative x, since (G is gamma function)
  *		-x*G(-x)*G(x) = pi/sin(pi*x),
  * 	we have
  * 		G(x) = pi/(sin(pi*x)*(-x)*G(-x))
  *	since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0
- *	Hence, for x<0, signgam = sign(sin(pi*x)) and 
+ *	Hence, for x<0, signgam = sign(sin(pi*x)) and
  *		lgamma(x) = log(|Gamma(x)|)
  *			  = log(pi/(|x*sin(pi*x)|)) - lgamma(-x);
- *	Note: one should avoid compute pi*(-x) directly in the 
+ *	Note: one should avoid compute pi*(-x) directly in the
  *	      computation of sin(pi*(-x)).
- *		
+ *
  *   5. Special Cases
  *		lgamma(2+s) ~ s*(1-Euler) for tiny s
  *		lgamma(1)=lgamma(2)=0
  *		lgamma(x) ~ -log(x) for tiny x
  *		lgamma(0) = lgamma(inf) = inf
  *	 	lgamma(-integer) = +-inf
- *	
+ *
  */
 
 #include "math.h"
 #include "math_private.h"
 
 #ifdef __STDC__
-static const double 
+static const double
 #else
-static double 
+static double
 #endif
 two52=  4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
 half=  5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
@@ -200,9 +200,9 @@ static double zero=  0.00000000000000000000e+00;
         }
 	switch (n) {
 	    case 0:   y =  __kernel_sin(pi*y,zero,0); break;
-	    case 1:   
+	    case 1:
 	    case 2:   y =  __kernel_cos(pi*(0.5-y),zero); break;
-	    case 3:  
+	    case 3:
 	    case 4:   y =  __kernel_sin(pi*(one-y),zero,0); break;
 	    case 5:
 	    case 6:   y = -__kernel_cos(pi*(y-1.5),zero); break;
@@ -226,9 +226,11 @@ static double zero=  0.00000000000000000000e+00;
 
     /* purge off +-inf, NaN, +-0, and negative arguments */
 	*signgamp = 1;
+	if ((unsigned int) hx==0xfff00000&&lx==0)
+	  return x-x;
 	ix = hx&0x7fffffff;
 	if(ix>=0x7ff00000) return x*x;
-	if((ix|lx)==0) return one/zero;
+	if((ix|lx)==0) return one/fabs(x);
 	if(ix<0x3b900000) {	/* |x|<2**-70, return -log(|x|) */
 	    if(hx<0) {
 	        *signgamp = -1;
@@ -237,9 +239,9 @@ static double zero=  0.00000000000000000000e+00;
 	}
 	if(hx<0) {
 	    if(ix>=0x43300000) 	/* |x|>=2**52, must be -integer */
-		return one/zero;
+		return x/zero;
 	    t = sin_pi(x);
-	    if(t==zero) return one/zero; /* -integer */
+	    if(t==zero) return one/fabsf(t); /* -integer */
 	    nadj = __ieee754_log(pi/fabs(t*x));
 	    if(t<zero) *signgamp = -1;
 	    x = -x;
@@ -275,7 +277,7 @@ static double zero=  0.00000000000000000000e+00;
 		p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
 		p  = z*p1-(tt-w*(p2+y*p3));
 		r += (tf + p); break;
-	      case 2:	
+	      case 2:
 		p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
 		p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
 		r += (-0.5*y + p1/p2);
@@ -304,7 +306,7 @@ static double zero=  0.00000000000000000000e+00;
 	    y = z*z;
 	    w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
 	    r = (x-half)*(t-one)+w;
-	} else 
+	} else
     /* 2**58 <= x <= inf */
 	    r =  x*(__ieee754_log(x)-one);
 	if(hx<0) r = nadj - r;
diff --git a/sysdeps/libm-ieee754/e_lgammaf_r.c b/sysdeps/libm-ieee754/e_lgammaf_r.c
index 1d0122dbb2..f744d5320e 100644
--- a/sysdeps/libm-ieee754/e_lgammaf_r.c
+++ b/sysdeps/libm-ieee754/e_lgammaf_r.c
@@ -8,7 +8,7 @@
  *
  * Developed at SunPro, a Sun Microsystems, Inc. business.
  * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice 
+ * software is freely granted, provided that this notice
  * is preserved.
  * ====================================================
  */
@@ -21,9 +21,9 @@ static char rcsid[] = "$NetBSD: e_lgammaf_r.c,v 1.3 1995/05/10 20:45:47 jtc Exp
 #include "math_private.h"
 
 #ifdef __STDC__
-static const float 
+static const float
 #else
-static float 
+static float
 #endif
 two23=  8.3886080000e+06, /* 0x4b000000 */
 half=  5.0000000000e-01, /* 0x3f000000 */
@@ -136,9 +136,9 @@ static float zero=  0.0000000000e+00;
         }
 	switch (n) {
 	    case 0:   y =  __kernel_sinf(pi*y,zero,0); break;
-	    case 1:   
+	    case 1:
 	    case 2:   y =  __kernel_cosf(pi*((float)0.5-y),zero); break;
-	    case 3:  
+	    case 3:
 	    case 4:   y =  __kernel_sinf(pi*(one-y),zero,0); break;
 	    case 5:
 	    case 6:   y = -__kernel_cosf(pi*(y-(float)1.5),zero); break;
@@ -162,9 +162,11 @@ static float zero=  0.0000000000e+00;
 
     /* purge off +-inf, NaN, +-0, and negative arguments */
 	*signgamp = 1;
+	if ((unsigned int)hx==0xff800000)
+	  return x-x;
 	ix = hx&0x7fffffff;
 	if(ix>=0x7f800000) return x*x;
-	if(ix==0) return one/zero;
+	if(ix==0) return one/fabsf(x);
 	if(ix<0x1c800000) {	/* |x|<2**-70, return -log(|x|) */
 	    if(hx<0) {
 	        *signgamp = -1;
@@ -173,9 +175,9 @@ static float zero=  0.0000000000e+00;
 	}
 	if(hx<0) {
 	    if(ix>=0x4b000000) 	/* |x|>=2**23, must be -integer */
-		return one/zero;
+		return x/zero;
 	    t = sin_pif(x);
-	    if(t==zero) return one/zero; /* -integer */
+	    if(t==zero) return one/fabsf(t); /* -integer */
 	    nadj = __ieee754_logf(pi/fabsf(t*x));
 	    if(t<zero) *signgamp = -1;
 	    x = -x;
@@ -211,7 +213,7 @@ static float zero=  0.0000000000e+00;
 		p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
 		p  = z*p1-(tt-w*(p2+y*p3));
 		r += (tf + p); break;
-	      case 2:	
+	      case 2:
 		p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
 		p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
 		r += (-(float)0.5*y + p1/p2);
@@ -240,7 +242,7 @@ static float zero=  0.0000000000e+00;
 	    y = z*z;
 	    w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
 	    r = (x-half)*(t-one)+w;
-	} else 
+	} else
     /* 2**58 <= x <= inf */
 	    r =  x*(__ieee754_logf(x)-one);
 	if(hx<0) r = nadj - r;
diff --git a/sysdeps/libm-ieee754/s_rinttoll.c b/sysdeps/libm-ieee754/s_llrint.c
index b2fccd17b7..faae106ece 100644
--- a/sysdeps/libm-ieee754/s_rinttoll.c
+++ b/sysdeps/libm-ieee754/s_llrint.c
@@ -33,7 +33,7 @@ static long double two52[2] =
 
 
 long long int
-__rinttoll (long double x)
+__llrint (long double x)
 {
   int32_t j0,sx;
   u_int32_t i0, i1, i;
@@ -141,7 +141,7 @@ static long double two63[2] =
 
 
 long long int
-__rinttoll (long double x)
+__llrint (long double x)
 {
   int32_t se,j0,sx;
   u_int32_t i0, i1, i;
@@ -239,4 +239,4 @@ __rinttoll (long double x)
 }
 #endif
 
-weak_alias (__rinttoll, rinttoll)
+weak_alias (__llrint, llrint)
diff --git a/sysdeps/libm-ieee754/s_roundtoll.c b/sysdeps/libm-ieee754/s_llround.c
index 49167236a6..aee0e31fc0 100644
--- a/sysdeps/libm-ieee754/s_roundtoll.c
+++ b/sysdeps/libm-ieee754/s_llround.c
@@ -27,7 +27,7 @@
 /* The `long double' is in fact the IEEE `double' type.  */
 
 long long int
-__roundtoll (long double x)
+__llround (long double x)
 {
   int32_t j0;
   u_int32_t i1, i0;
@@ -103,7 +103,7 @@ __roundtoll (long double x)
 }
 #else
 long long int
-__roundtoll (long double x)
+__llround (long double x)
 {
   int32_t j0;
   u_int32_t se, i1, i0;
@@ -176,4 +176,4 @@ __roundtoll (long double x)
   return se & 0x8000 ? -result : result;
 }
 #endif
-weak_alias (__roundtoll, roundtoll)
+weak_alias (__llround, llround)
diff --git a/sysdeps/libm-ieee754/s_rinttol.c b/sysdeps/libm-ieee754/s_lrint.c
index 257bdc744c..6779f974bd 100644
--- a/sysdeps/libm-ieee754/s_rinttol.c
+++ b/sysdeps/libm-ieee754/s_lrint.c
@@ -33,7 +33,7 @@ static long double two52[2] =
 
 
 long int
-__rinttol (long double x)
+__lrint (long double x)
 {
   int32_t j0,sx;
   u_int32_t i0,i1,i;
@@ -141,7 +141,7 @@ static long double two63[2] =
 
 
 long int
-__rinttol (long double x)
+__lrint (long double x)
 {
   int32_t se,j0,sx;
   u_int32_t i0,i1,i;
@@ -239,4 +239,4 @@ __rinttol (long double x)
 }
 #endif
 
-weak_alias (__rinttol, rinttol)
+weak_alias (__lrint, lrint)
diff --git a/sysdeps/libm-ieee754/s_roundtol.c b/sysdeps/libm-ieee754/s_lround.c
index bc0ceae0f8..0f91280a79 100644
--- a/sysdeps/libm-ieee754/s_roundtol.c
+++ b/sysdeps/libm-ieee754/s_lround.c
@@ -27,7 +27,7 @@
 /* The `long double' is in fact the IEEE `double' type.  */
 
 long int
-__roundtol (long double x)
+__lround (long double x)
 {
   int32_t j0;
   u_int32_t i1, i0;
@@ -101,7 +101,7 @@ __roundtol (long double x)
 }
 #else
 long int
-__roundtol (long double x)
+__lround (long double x)
 {
   int32_t j0;
   u_int32_t se, i1, i0;
@@ -174,4 +174,4 @@ __roundtol (long double x)
   return se & 0x8000 ? -result : result;
 }
 #endif
-weak_alias (__roundtol, roundtol)
+weak_alias (__lround, lround)
diff --git a/sysdeps/libm-ieee754/s_remquo.c b/sysdeps/libm-ieee754/s_remquo.c
index f0a32130a2..39f6ceab2e 100644
--- a/sysdeps/libm-ieee754/s_remquo.c
+++ b/sysdeps/libm-ieee754/s_remquo.c
@@ -82,6 +82,7 @@ __remquo (double x, double y, int *quo)
       if (x + x > y)
 	{
 	  x -= y;
+	  ++cquo;
 	  if (x + x >= y)
 	    {
 	      x -= y;
@@ -95,6 +96,7 @@ __remquo (double x, double y, int *quo)
       if (x > y_half)
 	{
 	  x -= y;
+	  ++cquo;
 	  if (x >= y_half)
 	    {
 	      x -= y;
diff --git a/sysdeps/libm-ieee754/s_remquof.c b/sysdeps/libm-ieee754/s_remquof.c
index 6fa02e47b3..b3870f4b02 100644
--- a/sysdeps/libm-ieee754/s_remquof.c
+++ b/sysdeps/libm-ieee754/s_remquof.c
@@ -81,6 +81,7 @@ __remquof (float x, float y, int *quo)
       if (x + x > y)
 	{
 	  x -= y;
+	  ++cquo;
 	  if (x + x >= y)
 	    {
 	      x -= y;
@@ -94,6 +95,7 @@ __remquof (float x, float y, int *quo)
       if (x > y_half)
 	{
 	  x -= y;
+	  ++cquo;
 	  if (x >= y_half)
 	    {
 	      x -= y;
diff --git a/sysdeps/libm-ieee754/s_remquol.c b/sysdeps/libm-ieee754/s_remquol.c
index 9ef424901b..b7835e6dc7 100644
--- a/sysdeps/libm-ieee754/s_remquol.c
+++ b/sysdeps/libm-ieee754/s_remquol.c
@@ -82,6 +82,7 @@ __remquol (long double x, long double p, int *quo)
       if (x + x > p)
 	{
 	  x -= p;
+	  ++cquo;
 	  if (x + x >= p)
 	    {
 	      x -= p;
@@ -95,6 +96,7 @@ __remquol (long double x, long double p, int *quo)
       if (x > p_half)
 	{
 	  x -= p;
+	  ++cquo;
 	  if (x >= p_half)
 	    {
 	      x -= p;
diff --git a/sysdeps/libm-ieee754/s_scalbn.c b/sysdeps/libm-ieee754/s_scalbn.c
index 439b966e69..0ce0ffdf2f 100644
--- a/sysdeps/libm-ieee754/s_scalbn.c
+++ b/sysdeps/libm-ieee754/s_scalbn.c
@@ -35,10 +35,10 @@ huge   = 1.0e+300,
 tiny   = 1.0e-300;
 
 #ifdef __STDC__
-	double __scalbn (double x, int n)
+	double __scalbn (double x, long int n)
 #else
 	double __scalbn (x,n)
-	double x; int n;
+	double x; long int n;
 #endif
 {
 	int32_t k,hx,lx;
@@ -49,17 +49,16 @@ tiny   = 1.0e-300;
 	    x *= two54;
 	    GET_HIGH_WORD(hx,x);
 	    k = ((hx&0x7ff00000)>>20) - 54;
-            if (n< -50000) return tiny*x; 	/*underflow*/
 	    }
         if (k==0x7ff) return x+x;		/* NaN or Inf */
         k = k+n;
-        if (k >  0x7fe) return huge*__copysign(huge,x); /* overflow  */
+        if (n> 50000 || k >  0x7fe)
+	  return huge*__copysign(huge,x); /* overflow  */
+	if (n< -50000) return tiny*__copysign(tiny,x); /*underflow*/
         if (k > 0) 				/* normal result */
 	    {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
         if (k <= -54)
-            if (n > 50000) 	/* in case integer overflow in n+k */
-		return huge*__copysign(huge,x);	/*overflow*/
-	    else return tiny*__copysign(tiny,x); 	/*underflow*/
+	  return tiny*__copysign(tiny,x); 	/*underflow*/
         k += 54;				/* subnormal result */
 	SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
         return x*twom54;
diff --git a/sysdeps/libm-ieee754/s_scalbnf.c b/sysdeps/libm-ieee754/s_scalbnf.c
index 3a83e54c56..4799c825c9 100644
--- a/sysdeps/libm-ieee754/s_scalbnf.c
+++ b/sysdeps/libm-ieee754/s_scalbnf.c
@@ -8,7 +8,7 @@
  *
  * Developed at SunPro, a Sun Microsystems, Inc. business.
  * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice 
+ * software is freely granted, provided that this notice
  * is preserved.
  * ====================================================
  */
@@ -31,10 +31,10 @@ huge   = 1.0e+30,
 tiny   = 1.0e-30;
 
 #ifdef __STDC__
-	float __scalbnf (float x, int n)
+	float __scalbnf (float x, long int n)
 #else
 	float __scalbnf (x,n)
-	float x; int n;
+	float x; long int n;
 #endif
 {
 	int32_t k,ix;
@@ -44,18 +44,18 @@ tiny   = 1.0e-30;
             if ((ix&0x7fffffff)==0) return x; /* +-0 */
 	    x *= two25;
 	    GET_FLOAT_WORD(ix,x);
-	    k = ((ix&0x7f800000)>>23) - 25; 
-            if (n< -50000) return tiny*x; 	/*underflow*/
+	    k = ((ix&0x7f800000)>>23) - 25;
 	    }
         if (k==0xff) return x+x;		/* NaN or Inf */
-        k = k+n; 
-        if (k >  0xfe) return huge*copysignf(huge,x); /* overflow  */
+        k = k+n;
+        if (n> 50000 || k >  0xfe)
+	  return huge*copysignf(huge,x); /* overflow  */
+	if (n< -50000)
+	  return tiny*copysignf(tiny,x);	/*underflow*/
         if (k > 0) 				/* normal result */
 	    {SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23)); return x;}
         if (k <= -25)
-            if (n > 50000) 	/* in case integer overflow in n+k */
-		return huge*copysignf(huge,x);	/*overflow*/
-	    else return tiny*copysignf(tiny,x);	/*underflow*/
+	    return tiny*copysignf(tiny,x);	/*underflow*/
         k += 25;				/* subnormal result */
 	SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23));
         return x*twom25;
diff --git a/sysdeps/libm-ieee754/s_scalbnl.c b/sysdeps/libm-ieee754/s_scalbnl.c
index 6825e9c7b3..3e80d85136 100644
--- a/sysdeps/libm-ieee754/s_scalbnl.c
+++ b/sysdeps/libm-ieee754/s_scalbnl.c
@@ -33,16 +33,16 @@ static const long double
 #else
 static long double
 #endif
-two54   =  1.80143985094819840000e+16, /* 0x4035, 0x00000000, 0x00000000 */
-twom54  =  5.55111512312578270212e-17, /* 0x3FC9, 0x00000000, 0x00000000 */
+two63   =  4.50359962737049600000e+15,
+twom63  =  1.08420217248550443400e-19;
 huge   = 1.0e+4900L,
 tiny   = 1.0e-4900L;
 
 #ifdef __STDC__
-	long double __scalbnl (long double x, int n)
+	long double __scalbnl (long double x, long int n)
 #else
 	long double __scalbnl (x,n)
-	long double x; int n;
+	long double x; long int n;
 #endif
 {
 	int32_t k,es,hx,lx;
@@ -50,22 +50,22 @@ tiny   = 1.0e-4900L;
         k = es&0x7fff;				/* extract exponent */
         if (k==0) {				/* 0 or subnormal x */
             if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
-	    x *= two54;
-	    GET_HIGH_WORD(hx,x);
-	    k = ((hx&0x7ff00000)>>20) - 54;
-            if (n< -50000) return tiny*x; 	/*underflow*/
+	    x *= two63;
+	    GET_LDOUBLE_EXP(es,x);
+	    k = (hx&0x7fff) - 63;
 	    }
-        if (k==0x7ff) return x+x;		/* NaN or Inf */
+        if (k==0x7fff) return x+x;		/* NaN or Inf */
         k = k+n;
-        if (k >  0x7fe) return huge*__copysign(huge,x); /* overflow  */
+        if (n> 50000 || k > 0x7ffe)
+	  return huge*__copysignl(huge,x); /* overflow  */
+	if (n< -50000)
+	  return tiny*__copysignl(tiny,x);
         if (k > 0) 				/* normal result */
-	    {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
-        if (k <= -54)
-            if (n > 50000) 	/* in case integer overflow in n+k */
-		return huge*__copysign(huge,x);	/*overflow*/
-	    else return tiny*__copysign(tiny,x); 	/*underflow*/
+	    {SET_LDOUBLE_EXP(x,(es&0x8000)|k); return x;}
+        if (k <= -63)
+	    return tiny*__copysignl(tiny,x); 	/*underflow*/
         k += 54;				/* subnormal result */
-	SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
-        return x*twom54;
+	SET_LDOUBLE_EXP(x,(es&0x8000)|k);
+        return x*twom63;
 }
 weak_alias (__scalbnl, scalbnl)
diff --git a/sysdeps/libm-ieee754/w_gamma.c b/sysdeps/libm-ieee754/w_gamma.c
index 49e4bcf3c3..87a3408c3f 100644
--- a/sysdeps/libm-ieee754/w_gamma.c
+++ b/sysdeps/libm-ieee754/w_gamma.c
@@ -15,16 +15,13 @@ static char rcsid[] = "$NetBSD: w_gamma.c,v 1.7 1995/11/20 22:06:43 jtc Exp $";
 #endif
 
 /* double gamma(double x)
- * Return the logarithm of the Gamma function of x.
- *
- * Method: call gamma_r
+ * Return  the logarithm of the Gamma function of x or the Gamma function of x,
+ * depending on the library mode.
  */
 
 #include "math.h"
 #include "math_private.h"
 
-extern int signgam;
-
 #ifdef __STDC__
 	double __gamma(double x)
 #else
@@ -32,12 +29,19 @@ extern int signgam;
 	double x;
 #endif
 {
+	int signgam;
+        double y;
+	if (_LIB_VERSION == _SVID_)
+	  y = __ieee754_lgamma_r(x,&signgam);
+	else
+	  {
+	    y = __ieee754_gamma_r(x,&signgam);
+	    if (signgam < 0) y = -y;
 #ifdef _IEEE_LIBM
-	return __ieee754_lgamma_r(x,&signgam);
+	    return y;
 #else
-        double y;
-        y = __ieee754_lgamma_r(x,&signgam);
-        if(_LIB_VERSION == _IEEE_) return y;
+	    if(_LIB_VERSION == _IEEE_) return y;
+	  }
         if(!__finite(y)&&__finite(x)) {
             if(__floor(x)==x&&x<=0.0)
                 return __kernel_standard(x,x,41); /* gamma pole */
diff --git a/sysdeps/libm-ieee754/w_gamma_r.c b/sysdeps/libm-ieee754/w_gamma_r.c
deleted file mode 100644
index f9efc8cf2e..0000000000
--- a/sysdeps/libm-ieee754/w_gamma_r.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* @(#)wr_gamma.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: w_gamma_r.c,v 1.7 1995/11/20 22:06:45 jtc Exp $";
-#endif
-
-/*
- * wrapper double gamma_r(double x, int *signgamp)
- */
-
-#include "math.h"
-#include "math_private.h"
-
-
-#ifdef __STDC__
-	double __gamma_r(double x, int *signgamp) /* wrapper lgamma_r */
-#else
-	double __gamma_r(x,signgamp)              /* wrapper lgamma_r */
-        double x; int *signgamp;
-#endif
-{
-#ifdef _IEEE_LIBM
-	return __ieee754_lgamma_r(x,signgamp);
-#else
-        double y;
-        y = __ieee754_lgamma_r(x,signgamp);
-        if(_LIB_VERSION == _IEEE_) return y;
-        if(!__finite(y)&&__finite(x)) {
-            if(__floor(x)==x&&x<=0.0)
-                return __kernel_standard(x,x,41); /* gamma pole */
-            else
-                return __kernel_standard(x,x,40); /* gamma overflow */
-        } else
-            return y;
-#endif
-}
-weak_alias (__gamma_r, gamma_r)
-#ifdef NO_LONG_DOUBLE
-strong_alias (__gamma_r, __gammal_r)
-weak_alias (__gamma_r, gammal_r)
-#endif
diff --git a/sysdeps/libm-ieee754/w_gammaf.c b/sysdeps/libm-ieee754/w_gammaf.c
index c2d21daf47..ecde183824 100644
--- a/sysdeps/libm-ieee754/w_gammaf.c
+++ b/sysdeps/libm-ieee754/w_gammaf.c
@@ -8,7 +8,7 @@
  *
  * Developed at SunPro, a Sun Microsystems, Inc. business.
  * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice 
+ * software is freely granted, provided that this notice
  * is preserved.
  * ====================================================
  */
@@ -20,8 +20,6 @@ static char rcsid[] = "$NetBSD: w_gammaf.c,v 1.4 1995/11/20 22:06:48 jtc Exp $";
 #include "math.h"
 #include "math_private.h"
 
-extern int signgam;
-
 #ifdef __STDC__
 	float __gammaf(float x)
 #else
@@ -29,12 +27,19 @@ extern int signgam;
 	float x;
 #endif
 {
+	int signgam;
+        float y;
+	if (_LIB_VERSION == _SVID_)
+	  y = __ieee754_lgammaf_r(x,&signgam);
+	else
+	  {
+	    y = __ieee754_gammaf_r(x,&signgam);
+	    if (signgam < 0) y = -y;
 #ifdef _IEEE_LIBM
-	return __ieee754_lgammaf_r(x,&signgam);
+	    return y;
 #else
-        float y;
-        y = __ieee754_lgammaf_r(x,&signgam);
-        if(_LIB_VERSION == _IEEE_) return y;
+	    if(_LIB_VERSION == _IEEE_) return y;
+	  }
         if(!__finitef(y)&&__finitef(x)) {
             if(__floorf(x)==x&&x<=(float)0.0)
 	        /* gammaf pole */
@@ -45,5 +50,5 @@ extern int signgam;
         } else
             return y;
 #endif
-}             
+}
 weak_alias (__gammaf, gammaf)
diff --git a/sysdeps/libm-ieee754/w_gammaf_r.c b/sysdeps/libm-ieee754/w_gammaf_r.c
deleted file mode 100644
index b15d5e84bb..0000000000
--- a/sysdeps/libm-ieee754/w_gammaf_r.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/* w_gammaf_r.c -- float version of w_gamma_r.c.
- * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice 
- * is preserved.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: w_gammaf_r.c,v 1.4 1995/11/20 22:06:50 jtc Exp $";
-#endif
-
-/* 
- * wrapper float gammaf_r(float x, int *signgamp)
- */
-
-#include "math.h"
-#include "math_private.h"
-
-
-#ifdef __STDC__
-	float __gammaf_r(float x, int *signgamp) /* wrapper lgammaf_r */
-#else
-	float __gammaf_r(x,signgamp)              /* wrapper lgammaf_r */
-        float x; int *signgamp;
-#endif
-{
-#ifdef _IEEE_LIBM
-	return __ieee754_lgammaf_r(x,signgamp);
-#else
-        float y;
-        y = __ieee754_lgammaf_r(x,signgamp);
-        if(_LIB_VERSION == _IEEE_) return y;
-        if(!__finitef(y)&&__finitef(x)) {
-            if(__floorf(x)==x&&x<=(float)0.0)
-	        /* gammaf pole */
-                return (float)__kernel_standard((double)x,(double)x,141);
-            else
-	        /* gamma overflow */
-                return (float)__kernel_standard((double)x,(double)x,140);
-        } else
-            return y;
-#endif
-}             
-weak_alias (__gammaf_r, gammaf_r)
diff --git a/sysdeps/libm-ieee754/w_gammal.c b/sysdeps/libm-ieee754/w_gammal.c
index f72e2e7e44..605a4167c4 100644
--- a/sysdeps/libm-ieee754/w_gammal.c
+++ b/sysdeps/libm-ieee754/w_gammal.c
@@ -19,16 +19,12 @@ static char rcsid[] = "$NetBSD: $";
 #endif
 
 /* long double gammal(double x)
- * Return the logarithm of the Gamma function of x.
- *
- * Method: call gammal_r
+ * Return the Gamma function of x.
  */
 
 #include "math.h"
 #include "math_private.h"
 
-extern int signgam;
-
 #ifdef __STDC__
 	long double __gammal(long double x)
 #else
@@ -36,12 +32,19 @@ extern int signgam;
 	long double x;
 #endif
 {
+        long double y;
+	int signgam;
+	if (_LIB_VERSION == _SVID_)
+	  y = __ieee754_lgammal_r(x,&signgam);
+	else
+	  {
+	    y = __ieee754_gammal_r(x,&signgam);
+	    if (signgam < 0) y = -y;
 #ifdef _IEEE_LIBM
-	return __ieee754_lgammal_r(x,&signgam);
+	    return y;
 #else
-        long double y;
-        y = __ieee754_lgammal_r(x,&signgam);
-        if(_LIB_VERSION == _IEEE_) return y;
+	    if(_LIB_VERSION == _IEEE_) return y;
+	  }
         if(!__finitel(y)&&__finitel(x)) {
             if(__floorl(x)==x&&x<=0.0)
                 return __kernel_standard(x,x,241); /* gamma pole */
diff --git a/sysdeps/libm-ieee754/w_gammal_r.c b/sysdeps/libm-ieee754/w_gammal_r.c
deleted file mode 100644
index ad6a43ae9b..0000000000
--- a/sysdeps/libm-ieee754/w_gammal_r.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/* w_gammal_r.c -- long double version of w_gamma_r.c.
- * Conversion to long double by Ulrich Drepper,
- * Cygnus Support, drepper@cygnus.com.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: $";
-#endif
-
-/*
- * wrapper long double gammal_r(long double x, int *signgamp)
- */
-
-#include "math.h"
-#include "math_private.h"
-
-
-#ifdef __STDC__
-	long double __gammal_r(long double x, int *signgamp)
-						/* wrapper lgammal_r */
-#else
-	long double __gammal_r(x,signgamp)	/* wrapper lgamma_r */
-        long double x; int *signgamp;
-#endif
-{
-#ifdef _IEEE_LIBM
-	return __ieee754_lgammal_r(x,signgamp);
-#else
-        long double y;
-        y = __ieee754_lgammal_r(x,signgamp);
-        if(_LIB_VERSION == _IEEE_) return y;
-        if(!__finitel(y)&&__finitel(x)) {
-            if(__floorl(x)==x&&x<=0.0)
-                return __kernel_standard(x,x,241); /* gamma pole */
-            else
-                return __kernel_standard(x,x,240); /* gamma overflow */
-        } else
-            return y;
-#endif
-}
-weak_alias (__gammal_r, gammal_r)
diff --git a/sysdeps/m68k/fpu/__math.h b/sysdeps/m68k/fpu/__math.h
index fd90a2de1b..bdeaa9efb0 100644
--- a/sysdeps/m68k/fpu/__math.h
+++ b/sysdeps/m68k/fpu/__math.h
@@ -309,7 +309,7 @@ __inline_functions (float,f)
 __inline_functions (long double,l)
 #undef __inline_functions
 
-__m81_defun (long int, __rinttol, (long double __x))
+__m81_defun (long int, __lrint, (long double __x))
 {
   long int __result;
   __asm ("fmove%.l %1, %0" : "=dm" (__result) : "f" (__x));
@@ -391,7 +391,7 @@ __inline_forward_c(int,ilogbl, (long double __value), (__value))
 #endif
 #ifdef __USE_ISOC9X
 __inline_forward_c(long double,nearbyintl, (long double __value), (__value))
-__inline_forward_c(long int,rinttol, (long double __value), (__value))
+__inline_forward_c(long int,lrint, (long double __value), (__value))
 #endif
 #ifdef __USE_GNU
 __inline_forward(void,sincosl,
diff --git a/sysdeps/m68k/fpu/s_rinttoll.c b/sysdeps/m68k/fpu/s_llrint.c
index bad8082bd1..f5d0d51122 100644
--- a/sysdeps/m68k/fpu/s_rinttoll.c
+++ b/sysdeps/m68k/fpu/s_llrint.c
@@ -24,7 +24,7 @@
 #include "math_private.h"
 
 long long int
-__rinttoll (long double x)
+__llrint (long double x)
 {
   int32_t se, sx;
   u_int32_t h, l;
@@ -59,4 +59,4 @@ __rinttoll (long double x)
   return result;
 }
 
-weak_alias (__rinttoll, rinttoll)
+weak_alias (__llrint, llrint)
diff --git a/sysdeps/m68k/fpu/s_rinttol.c b/sysdeps/m68k/fpu/s_lrint.c
index 7476d785a6..a7044113af 100644
--- a/sysdeps/m68k/fpu/s_rinttol.c
+++ b/sysdeps/m68k/fpu/s_lrint.c
@@ -23,9 +23,9 @@
 #include <math.h>
 
 long int
-__rinttol (long double x)
+__lrint (long double x)
 {
-  return __m81_u(__rinttol) (x);
+  return __m81_u(__lrint) (x);
 }
 
-weak_alias (__rinttol, rinttol)
+weak_alias (__lrint, lrint)
diff --git a/sysdeps/m68k/fpu/s_remquo.c b/sysdeps/m68k/fpu/s_remquo.c
index 3682ba7896..0332eccfd0 100644
--- a/sysdeps/m68k/fpu/s_remquo.c
+++ b/sysdeps/m68k/fpu/s_remquo.c
@@ -37,18 +37,9 @@ s(__remquo) (float_type x, float_type y, int *quo)
   float_type result;
   int cquo, fpsr;
 
-  /* FIXME: Which of frem and fmod is correct?  */
-#if 1
   __asm ("frem%.x %2,%0\n\tfmove%.l %/fpsr,%1"
 	 : "=f" (result), "=dm" (fpsr) : "f" (y), "0" (x));
   cquo = (fpsr >> 16) & 0x7f;
-  if ((result > 0) != (x > 0))
-    cquo--;
-#else
-  __asm ("fmod%.x %2,%0\n\tfmove%.l %/fpsr,%1"
-	 : "=f" (result), "=dm" (fpsr) : "f" (y), "0" (x));
-  cquo = (fpsr >> 16) & 0x7f;
-#endif
   if (fpsr & (1 << 23))
     cquo = -cquo;
   *quo = cquo;
diff --git a/sysdeps/posix/Makefile b/sysdeps/posix/Makefile
index 7c1013ad2b..a47f77af32 100644
--- a/sysdeps/posix/Makefile
+++ b/sysdeps/posix/Makefile
@@ -16,6 +16,9 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 # Boston, MA 02111-1307, USA.
 
+ifneq (yes,$(inhibit-stdio_lim))
+# Disable these rules if we generate stdio_lim.h by other means.
+
 ifeq (yes,$(cross-compiling))
 $(common-objpfx)stdio_lim.h:
 	@echo
@@ -38,3 +41,5 @@ $(common-objpfx)mk-stdiolim: $(sysdep_dir)/posix/mk-stdiolim.c \
 
 common-generated := $(common-generated) stdio_lim.h mk-stdiolim
 before-compile := $(before-compile) $(common-objpfx)stdio_lim.h
+
+endif # inhibit-stdio_lim
diff --git a/sysdeps/powerpc/Dist b/sysdeps/powerpc/Dist
index ba908dc0cb..ae16c0f8fb 100644
--- a/sysdeps/powerpc/Dist
+++ b/sysdeps/powerpc/Dist
@@ -1 +1,2 @@
+fenv_const.c
 fenv_libc.h
diff --git a/sysdeps/stub/e_acoshl.c b/sysdeps/stub/e_acoshl.c
index 6ec9a15d38..3383c14872 100644
--- a/sysdeps/stub/e_acoshl.c
+++ b/sysdeps/stub/e_acoshl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_acoshl (long double x)
 {
   fputs ("__ieee754_acoshl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_acosl.c b/sysdeps/stub/e_acosl.c
index 5c10b526cc..af1e6261c3 100644
--- a/sysdeps/stub/e_acosl.c
+++ b/sysdeps/stub/e_acosl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_acosl (long double x)
 {
   fputs ("__ieee754_acosl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_asinl.c b/sysdeps/stub/e_asinl.c
index f9260913e8..ce8c8cdaea 100644
--- a/sysdeps/stub/e_asinl.c
+++ b/sysdeps/stub/e_asinl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_asinl (long double x)
 {
   fputs ("__ieee754_asinl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_atan2l.c b/sysdeps/stub/e_atan2l.c
index 3edfacd68a..6c500d4c8a 100644
--- a/sysdeps/stub/e_atan2l.c
+++ b/sysdeps/stub/e_atan2l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_atan2l (long double x, long double y)
 {
   fputs ("__ieee754_atan2l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_expl.c b/sysdeps/stub/e_expl.c
index 246b5ae83f..4ea8c79597 100644
--- a/sysdeps/stub/e_expl.c
+++ b/sysdeps/stub/e_expl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_expl (long double x)
 {
   fputs ("__ieee754_expl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_fmodl.c b/sysdeps/stub/e_fmodl.c
index b47912581b..25cc114808 100644
--- a/sysdeps/stub/e_fmodl.c
+++ b/sysdeps/stub/e_fmodl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_fmodl (long double x, long double y)
 {
   fputs ("__ieee754_fmodl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_j0l.c b/sysdeps/stub/e_j0l.c
index c16e8a8a9d..ecb8a8ed16 100644
--- a/sysdeps/stub/e_j0l.c
+++ b/sysdeps/stub/e_j0l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_j0l (long double x)
 {
   fputs ("__ieee754_j0l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
@@ -14,6 +16,7 @@ long double
 __ieee754_y0l (long double x)
 {
   fputs ("__ieee754_y0l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_j1l.c b/sysdeps/stub/e_j1l.c
index 0a781e5cc1..24655700e3 100644
--- a/sysdeps/stub/e_j1l.c
+++ b/sysdeps/stub/e_j1l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_j1l (long double x)
 {
   fputs ("__ieee754_j1l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
@@ -14,6 +16,7 @@ long double
 __ieee754_y1l (long double x)
 {
   fputs ("__ieee754_y1l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_jnl.c b/sysdeps/stub/e_jnl.c
index 86ff03b031..8ced34d461 100644
--- a/sysdeps/stub/e_jnl.c
+++ b/sysdeps/stub/e_jnl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_jnl (int n, long double x)
 {
   fputs ("__ieee754_jnl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
@@ -14,6 +16,7 @@ long double
 __ieee754_ynl (int n, long double x)
 {
   fputs ("__ieee754_ynl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_lgammal_r.c b/sysdeps/stub/e_lgammal_r.c
index 015511818c..d7fbbca4df 100644
--- a/sysdeps/stub/e_lgammal_r.c
+++ b/sysdeps/stub/e_lgammal_r.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_lgammal_r (long double x, int *signgamp)
 {
   fputs ("__ieee754_lgammal_r not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_log10l.c b/sysdeps/stub/e_log10l.c
index 0e8cdcaaa9..a414d04d74 100644
--- a/sysdeps/stub/e_log10l.c
+++ b/sysdeps/stub/e_log10l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_log10l (long double x)
 {
   fputs ("__ieee754_log10l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_logl.c b/sysdeps/stub/e_logl.c
index b8357543b0..45248a375a 100644
--- a/sysdeps/stub/e_logl.c
+++ b/sysdeps/stub/e_logl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_logl (long double x)
 {
   fputs ("__ieee754_logl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_powl.c b/sysdeps/stub/e_powl.c
index 2fa7862ea5..611dfb583c 100644
--- a/sysdeps/stub/e_powl.c
+++ b/sysdeps/stub/e_powl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_powl (long double x, long double y)
 {
   fputs ("__ieee754_powl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_rem_pio2l.c b/sysdeps/stub/e_rem_pio2l.c
index 0a9ac79917..eec7d793bb 100644
--- a/sysdeps/stub/e_rem_pio2l.c
+++ b/sysdeps/stub/e_rem_pio2l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_rem_pio2l (long double x, long double *y)
 {
   fputs ("__ieee754_rem_pio2l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_sqrtl.c b/sysdeps/stub/e_sqrtl.c
index 88a7668330..c583a27673 100644
--- a/sysdeps/stub/e_sqrtl.c
+++ b/sysdeps/stub/e_sqrtl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_sqrtl (long double x)
 {
   fputs ("__ieee754_sqrtl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/k_cosl.c b/sysdeps/stub/k_cosl.c
index 3e6c9688f0..10016ab72e 100644
--- a/sysdeps/stub/k_cosl.c
+++ b/sysdeps/stub/k_cosl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __kernel_cosl (long double x, long double y)
 {
   fputs ("__kernel_cosl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/k_rem_pio2l.c b/sysdeps/stub/k_rem_pio2l.c
index a51c44546b..01bf158249 100644
--- a/sysdeps/stub/k_rem_pio2l.c
+++ b/sysdeps/stub/k_rem_pio2l.c
@@ -1,12 +1,14 @@
 #include <math.h>
 #include <math_private.h>
 #include <stdio.h>
+#include <errno.h>
 
 int
 __kernel_rem_pio2l (long double *x, long double *y, int e0, int nx, int prec,
 		    const int *ipio2)
 {
   fputs ("__kernel_rem_pio2l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/k_sinl.c b/sysdeps/stub/k_sinl.c
index 2057bf8bff..40cf22a596 100644
--- a/sysdeps/stub/k_sinl.c
+++ b/sysdeps/stub/k_sinl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __kernel_sinl (long double x, long double y)
 {
   fputs ("__kernel_sinl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/k_tanl.c b/sysdeps/stub/k_tanl.c
index 713c8cdfe6..95ffc23bd9 100644
--- a/sysdeps/stub/k_tanl.c
+++ b/sysdeps/stub/k_tanl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __kernel_tanl (long double x, long double y, int iy)
 {
   fputs ("__kernel_tanl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/s_atanl.c b/sysdeps/stub/s_atanl.c
index 38dd6f5991..2957d702d5 100644
--- a/sysdeps/stub/s_atanl.c
+++ b/sysdeps/stub/s_atanl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __atanl (long double x)
 {
   fputs ("__atanl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__atanl, atanl)
diff --git a/sysdeps/stub/s_erfl.c b/sysdeps/stub/s_erfl.c
index efcf490fa7..7ae25d6252 100644
--- a/sysdeps/stub/s_erfl.c
+++ b/sysdeps/stub/s_erfl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __erfl (long double x)
 {
   fputs ("__erfl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__erfl, erfl)
@@ -15,6 +17,7 @@ long double
 __erfcl (long double x)
 {
   fputs ("__erfcl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__erfcl, erfcl)
diff --git a/sysdeps/stub/s_exp2.c b/sysdeps/stub/s_exp2.c
index a3d0906a33..5adda4107a 100644
--- a/sysdeps/stub/s_exp2.c
+++ b/sysdeps/stub/s_exp2.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 double
 __exp2 (double x)
 {
   fputs ("__exp2 not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__exp2, exp2)
diff --git a/sysdeps/stub/s_exp2f.c b/sysdeps/stub/s_exp2f.c
index 5d6540e074..51b268c9e0 100644
--- a/sysdeps/stub/s_exp2f.c
+++ b/sysdeps/stub/s_exp2f.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 float
 __exp2f (float x)
 {
   fputs ("__exp2f not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__exp2f, exp2f)
diff --git a/sysdeps/stub/s_exp2l.c b/sysdeps/stub/s_exp2l.c
index 4c52fc904d..cab2cb2a69 100644
--- a/sysdeps/stub/s_exp2l.c
+++ b/sysdeps/stub/s_exp2l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __exp2l (long double x)
 {
   fputs ("__exp2l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__exp2l, exp2l)
diff --git a/sysdeps/stub/s_expm1l.c b/sysdeps/stub/s_expm1l.c
index fb8bda5eca..38798812ff 100644
--- a/sysdeps/stub/s_expm1l.c
+++ b/sysdeps/stub/s_expm1l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __expm1l (long double x)
 {
   fputs ("__expm1l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__expm1l, expm1l)
diff --git a/sysdeps/stub/s_log1pl.c b/sysdeps/stub/s_log1pl.c
index 07282482f3..9e51ce2d43 100644
--- a/sysdeps/stub/s_log1pl.c
+++ b/sysdeps/stub/s_log1pl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __log1pl (long double x)
 {
   fputs ("__log1pl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__log1pl, log1pl)
diff --git a/sysdeps/stub/s_log2l.c b/sysdeps/stub/s_log2l.c
index d8d86af995..cc09569422 100644
--- a/sysdeps/stub/s_log2l.c
+++ b/sysdeps/stub/s_log2l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __log2l (long double x)
 {
   fputs ("__log2l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__log2l, log2l)
diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist
index fc403871f3..ae79600717 100644
--- a/sysdeps/unix/sysv/linux/Dist
+++ b/sysdeps/unix/sysv/linux/Dist
@@ -10,6 +10,7 @@ net/ethernet.h
 net/if.h
 net/if_arp.h
 net/if_ppp.h
+net/if_slip.h
 net/ppp-comp.h
 net/ppp_defs.h
 net/route.h
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index c61904a3b8..7255a69ece 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -19,13 +19,15 @@ $(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/sys/syscal
 	echo > $(@:.d=.h).new \
 	     '/* Generated at libc build time from kernel syscall list.  */'
 	SUNPRO_DEPENDENCIES='$(@:.h=.d) $(patsubst $(objpfx)%,$$(objpfx)%,\
-			     $(@:.h=.d))' \
+						   $(@:.d=.h) $(@:.h=.d))' \
 	$(CC) -E -x c $< -D_LIBC -dM | \
 	sed -n >> $(@:.d=.h).new \
 	      's@^#define __NR_\([^ ]*\) .*$$@#define SYS_\1 __NR_\1@p'
 	mv -f $(@:.d=.h).new $(@:.d=.h)
+ifndef no_deps
 # Get the generated list of dependencies (probably /usr/include/asm/unistd.h).
 -include $(objpfx)syscall-list.d
+endif
 generated += syscall-list.h syscall-list.d
 endif
 
@@ -35,7 +37,8 @@ endif
 
 ifeq ($(subdir),socket)
 sysdep_headers += sys/socketcall.h net/if.h net/if_ppp.h net/ppp-comp.h \
-		  net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h
+		  net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \
+		  net/if_slip.h
 sysdep_routines += cmsg_nxthdr
 endif
 
@@ -61,3 +64,30 @@ endif
 
 # Don't compile the ctype glue code, since there is no old non-GNU C library.
 inhibit-glue = yes
+
+# Tell sysdeps/posix/Makefile that we create stdio_lim.h differently.
+inhibit-stdio_lim = yes
+
+$(common-objpfx)stdio_%.h $(common-objpfx)stdio_%.d: \
+ $(..)sysdeps/unix/sysv/linux/stdio_%.h.in
+	rm -f $(@:.h=.d) $(@:.d=.h)-t
+	echo '#include <linux/limits.h>' | \
+	SUNPRO_DEPENDENCIES='$(@:.h=.d) \
+			     $(patsubst $(common-objpfx)%,$$(common-objpfx)%,\
+					$(@:.d=.h) $(@:.h=.d))' \
+	$(CC) -E -dM - > $(@:.d=.h)-t
+	fopen_max=`sed -n 's/^#define OPEN_MAX //p' $(@:.d=.h)-t`; \
+	filename_max=`sed -n 's/^#define PATH_MAX //p' $(@:.d=.h)-t`; \
+	if test -n "$$fopen_max" && test -n "$$filename_max"; then \
+		sed -e "s/DEFAULT_FOPEN_MAX/$$fopen_max/" \
+		    -e "s/DEFAULT_FILENAME_MAX/$$filename_max/" $< \
+		    > $(@:.d=.h).new && \
+		mv -f $(@:.d=.h).new $(@:.d=.h); \
+	else exit 1; fi
+# Remove this last so that it can be examined if something went wrong.
+	rm -f $(@:.d=.h)-t
+ifndef no_deps
+# Get the list of dependencies (probably /usr/include/linux/limits.h).
+-include $(common-objpfx)stdio_lim.d
+endif
+common-generated += stdio_lim.h stdio_lim.d
diff --git a/sysdeps/unix/sysv/linux/arm/Dist b/sysdeps/unix/sysv/linux/arm/Dist
new file mode 100644
index 0000000000..738b9cc542
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/Dist
@@ -0,0 +1 @@
+clone.S
diff --git a/sysdeps/unix/sysv/linux/configure b/sysdeps/unix/sysv/linux/configure
index a8780df917..79dbf16912 100644
--- a/sysdeps/unix/sysv/linux/configure
+++ b/sysdeps/unix/sysv/linux/configure
@@ -98,27 +98,3 @@ fi
 if test -f $srcdir/elf/ldconfig.c; then
   has_ldconfig=yes
 fi
-
-# Generate stdio_lim.h
-default_fopen_max="`${CC-gcc} -E $srcdir/sysdeps/unix/sysv/linux/mk-stdiolim.c | grep DEFAULT_FOPEN_MAX | cut -f2 -d':'`"
-default_filename_max="`${CC-gcc} -E $srcdir/sysdeps/unix/sysv/linux/mk-stdiolim.c | grep DEFAULT_FILENAME_MAX | cut -f2 -d':'`"
-# We double check if "default_fopen_max" and "default_filename_max" are
-# ok or not.
-if test "x$default_fopen_max" != "xOPEN_MAX" \
-	-a "x$default_filename_max" != "xPATH_MAX"
-then
-  sed -e "s/DEFAULT_FOPEN_MAX/$default_fopen_max/" \
-	-e "s/DEFAULT_FILENAME_MAX/$default_filename_max/" \
-	$srcdir/sysdeps/unix/sysv/linux/stdio_lim.h.in > stdio_lim.h.new
-  if test -r stdio_lim.h.new && cmp -s stdio_lim.h.new stdio_lim.h
-  then
-    echo stdio_lim.h unchanged
-    rm -f stdio_lim.h.new
-  else
-    mv -f stdio_lim.h.new stdio_lim.h
-  fi
-else
-  # We remove the old one if we cannot generate the new one during
-  # configure.
-  rm -f stdio_lim.h
-fi
diff --git a/sysdeps/unix/sysv/linux/configure.in b/sysdeps/unix/sysv/linux/configure.in
index f24af67f1e..18bb6dc469 100644
--- a/sysdeps/unix/sysv/linux/configure.in
+++ b/sysdeps/unix/sysv/linux/configure.in
@@ -83,27 +83,3 @@ fi
 if test -f $srcdir/elf/ldconfig.c; then
   has_ldconfig=yes
 fi
-
-# Generate stdio_lim.h
-default_fopen_max="`${CC-gcc} -E $srcdir/sysdeps/unix/sysv/linux/mk-stdiolim.c | grep DEFAULT_FOPEN_MAX | cut -f2 -d':'`"
-default_filename_max="`${CC-gcc} -E $srcdir/sysdeps/unix/sysv/linux/mk-stdiolim.c | grep DEFAULT_FILENAME_MAX | cut -f2 -d':'`"
-# We double check if "default_fopen_max" and "default_filename_max" are
-# ok or not.
-if test "x$default_fopen_max" != "xOPEN_MAX" \
-	-a "x$default_filename_max" != "xPATH_MAX"
-then
-  sed -e "s/DEFAULT_FOPEN_MAX/$default_fopen_max/" \
-	-e "s/DEFAULT_FILENAME_MAX/$default_filename_max/" \
-	$srcdir/sysdeps/unix/sysv/linux/stdio_lim.h.in > stdio_lim.h.new
-  if test -r stdio_lim.h.new && cmp -s stdio_lim.h.new stdio_lim.h
-  then
-    echo stdio_lim.h unchanged
-    rm -f stdio_lim.h.new
-  else
-    mv -f stdio_lim.h.new stdio_lim.h
-  fi
-else
-  # We remove the old one if we cannot generate the new one during
-  # configure.
-  rm -f stdio_lim.h
-fi
diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.S b/sysdeps/unix/sysv/linux/i386/sysdep.S
index a686495818..5a615efecb 100644
--- a/sysdeps/unix/sysv/linux/i386/sysdep.S
+++ b/sysdeps/unix/sysv/linux/i386/sysdep.S
@@ -25,15 +25,8 @@
    it somewhere else.
 
    ...and this place is here.  */
-	.bss
-	.globl errno
-	.type errno,@object
-	.size errno,4
-errno:	.zero 4
-	.globl _errno
-	.type _errno,@object
+	.comm errno,4,4
 _errno = errno	/* This name is expected by hj's libc.so.5 startup code.  */
-	.text
 
 /* The following code is only used in the shared library when we
    compile the reentrant version.  Otherwise each system call defines
diff --git a/sysdeps/unix/sysv/linux/mk-stdiolim.c b/sysdeps/unix/sysv/linux/mk-stdiolim.c
deleted file mode 100644
index 23295f007d..0000000000
--- a/sysdeps/unix/sysv/linux/mk-stdiolim.c
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <linux/limits.h>
-
-DEFAULT_FOPEN_MAX:OPEN_MAX
-DEFAULT_FILENAME_MAX:PATH_MAX
diff --git a/sysdeps/unix/sysv/linux/powerpc/Dist b/sysdeps/unix/sysv/linux/powerpc/Dist
index 27a951f169..4410266d71 100644
--- a/sysdeps/unix/sysv/linux/powerpc/Dist
+++ b/sysdeps/unix/sysv/linux/powerpc/Dist
@@ -4,3 +4,5 @@ termbits.h
 kernel_stat.h
 kernel_termios.h
 sys/kernel_termios.h
+init-first.h
+syscall.h
diff --git a/sysdeps/unix/sysv/linux/sparc/Dist b/sysdeps/unix/sysv/linux/sparc/Dist
index c31f140137..d93c648651 100644
--- a/sysdeps/unix/sysv/linux/sparc/Dist
+++ b/sysdeps/unix/sysv/linux/sparc/Dist
@@ -4,3 +4,4 @@ pipe.S
 fork.S
 kernel_stat.h
 kernel_sigaction.h
+init-first.h
diff --git a/time/tzfile.c b/time/tzfile.c
index 44b33cb02c..2d0752c147 100644
--- a/time/tzfile.c
+++ b/time/tzfile.c
@@ -244,7 +244,7 @@ __tzfile_read (const char *file)
 
   for (i = 0; i < num_isstd; ++i)
     {
-      char c = getc (f);
+      int c = getc (f);
       if (c == EOF)
 	goto lose;
       types[i].isstd = c != 0;
@@ -254,7 +254,7 @@ __tzfile_read (const char *file)
 
   for (i = 0; i < num_isgmt; ++i)
     {
-      char c = getc (f);
+      int c = getc (f);
       if (c == EOF)
 	goto lose;
       types[i].isgmt = c != 0;