summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.cvsignore2
-rw-r--r--BUGS5
-rw-r--r--ChangeLog222
-rw-r--r--FAQ13
-rw-r--r--dirent/Makefile2
-rw-r--r--dirent/dirent.h4
-rw-r--r--dirent/versionsort.c27
-rw-r--r--elf/dl-lookup.c12
-rw-r--r--elf/ldd.bash.in2
-rw-r--r--gnu-versions.h2
-rw-r--r--hurd/hurdauth.c123
-rw-r--r--hurd/hurdsig.c2
-rw-r--r--inet/Makefile2
-rw-r--r--locale/programs/charmap.c6
-rw-r--r--locale/programs/locale.c6
-rw-r--r--malloc/obstack.c8
-rw-r--r--manual/filesys.texi11
-rw-r--r--manual/string.texi50
-rw-r--r--manual/texinfo.tex18
-rw-r--r--math/Makefile3
-rw-r--r--math/fenv.h2
-rw-r--r--misc/efgcvt_r.c94
-rw-r--r--nis/nss_nisplus/nisplus-spwd.c14
-rw-r--r--po/sv.po789
-rw-r--r--posix/regex.c2
-rw-r--r--resolv/nss_dns/dns-host.c4
-rw-r--r--stdio-common/printf_fp.c2
-rw-r--r--stdio-common/printf_fphex.c2
-rw-r--r--string/Makefile8
-rw-r--r--string/basename.c7
-rw-r--r--string/string.h3
-rw-r--r--string/strverscmp.c111
-rw-r--r--string/tester.c76
-rw-r--r--string/tst-strlen.c2
-rw-r--r--string/tst-svc.c45
-rw-r--r--string/tst-svc.expect26
-rw-r--r--string/tst-svc.input26
-rw-r--r--sunrpc/authuxprot.c1
-rw-r--r--sunrpc/pmap_rmt.c2
-rw-r--r--sunrpc/proto.h8
-rw-r--r--sunrpc/rpc/auth_unix.h4
-rw-r--r--sunrpc/rpc/clnt.h21
-rw-r--r--sunrpc/rpc/pmap_clnt.h12
-rw-r--r--sunrpc/rpc/pmap_rmt.h4
-rw-r--r--sunrpc/rpc/rpc_msg.h1
-rw-r--r--sunrpc/rpc/xdr.h20
-rw-r--r--sunrpc/rpc_cout.c75
-rw-r--r--sunrpc/rpc_parse.h6
-rw-r--r--sunrpc/rpc_svcout.c14
-rw-r--r--sunrpc/xdr.c15
-rw-r--r--sunrpc/xdr_float.c8
-rw-r--r--sunrpc/xdr_mem.c53
-rw-r--r--sunrpc/xdr_rec.c8
-rw-r--r--sunrpc/xdr_stdio.c10
-rw-r--r--sysdeps/generic/rpc/auth.h6
-rw-r--r--sysdeps/i386/fpu/__math.h2
-rw-r--r--sysdeps/mach/hurd/setitimer.c8
-rw-r--r--sysdeps/powerpc/Dist1
-rw-r--r--sysdeps/powerpc/Makefile3
-rw-r--r--sysdeps/powerpc/__longjmp.S82
-rw-r--r--sysdeps/powerpc/__math.h19
-rw-r--r--sysdeps/powerpc/bsd-_setjmp.S2
-rw-r--r--sysdeps/powerpc/bsd-setjmp.S2
-rw-r--r--sysdeps/powerpc/dl-machine.h638
-rw-r--r--sysdeps/powerpc/fclrexcpt.c35
-rw-r--r--sysdeps/powerpc/fegetenv.c26
-rw-r--r--sysdeps/powerpc/fegetround.c31
-rw-r--r--sysdeps/powerpc/feholdexcpt.c38
-rw-r--r--sysdeps/powerpc/fenv_const.c29
-rw-r--r--sysdeps/powerpc/fenv_libc.h57
-rw-r--r--sysdeps/powerpc/fenvbits.h130
-rw-r--r--sysdeps/powerpc/fesetenv.c26
-rw-r--r--sysdeps/powerpc/fesetround.c41
-rw-r--r--sysdeps/powerpc/feupdateenv.c37
-rw-r--r--sysdeps/powerpc/ffs.c10
-rw-r--r--sysdeps/powerpc/fgetexcptflg.c33
-rw-r--r--sysdeps/powerpc/fpu_control.h12
-rw-r--r--sysdeps/powerpc/fraiseexcpt.c44
-rw-r--r--sysdeps/powerpc/fsetexcptflg.c37
-rw-r--r--sysdeps/powerpc/ftestexcept.c38
-rw-r--r--sysdeps/powerpc/mathbits.h72
-rw-r--r--sysdeps/powerpc/setjmp.S80
-rw-r--r--sysdeps/powerpc/strlen.s104
-rw-r--r--sysdeps/rs6000/ffs.c2
-rw-r--r--sysdeps/sparc/setjmp.S1
-rw-r--r--sysdeps/standalone/arm/errnos.h49
-rw-r--r--sysdeps/standalone/dirstream.h4
-rw-r--r--sysdeps/stub/direntry.h2
-rw-r--r--sysdeps/stub/dirfd.c2
-rw-r--r--sysdeps/stub/if_index.c36
-rw-r--r--sysdeps/stub/seekdir.c2
-rw-r--r--sysdeps/stub/setitimer.c30
-rw-r--r--sysdeps/stub/sigaction.c2
-rw-r--r--sysdeps/stub/sys/param.h2
-rw-r--r--sysdeps/stub/sysconf.c4
-rw-r--r--sysdeps/stub/tempname.c2
-rw-r--r--sysdeps/stub/vdprintf.c34
-rw-r--r--sysdeps/unix/arm/fork.S33
-rw-r--r--sysdeps/unix/arm/sysdep.h5
-rw-r--r--sysdeps/unix/sysv/linux/arm/clone.S33
-rw-r--r--sysdeps/unix/sysv/linux/arm/socket.S49
-rw-r--r--sysdeps/unix/sysv/linux/arm/syscall.S47
-rw-r--r--sysdeps/unix/sysv/linux/arm/sysdep.h73
-rw-r--r--sysdeps/unix/sysv/linux/if_index.c140
-rw-r--r--sysdeps/unix/sysv/linux/m68k/syscalls.list2
-rw-r--r--sysdeps/unix/sysv/linux/net/if.h19
-rw-r--r--sysdeps/unix/sysv/linux/netinet/in.h12
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/clone.S42
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/socket.S24
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/syscall.S12
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/sysdep.h2
-rw-r--r--sysdeps/unix/sysv/linux/shmdt.c2
-rw-r--r--sysdeps/unix/sysv/linux/statfsbuf.h2
-rw-r--r--time/europe15
-rw-r--r--time/sys/time.h4
-rw-r--r--time/zic.c21
116 files changed, 3211 insertions, 1136 deletions
diff --git a/.cvsignore b/.cvsignore
index 519db6b9c3..1378938989 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -21,3 +21,5 @@ crypt
 linuxthreads
 localedata
 secure_rpc
+
+aio
diff --git a/BUGS b/BUGS
index 174d7ccc7e..ac2066293b 100644
--- a/BUGS
+++ b/BUGS
@@ -1,7 +1,7 @@
 	    List of known bugs (certainly very incomplete)
 	    ----------------------------------------------
 
-Time-stamp: <1997-03-22T04:31:41+0100 drepper>
+Time-stamp: <1997-05-12T02:39:19+0200 drepper>
 
 This following list contains those bugs which I'm aware of.  Please
 make sure that bugs you report are not listed here.  If you can fix one
@@ -29,8 +29,7 @@ Severity: [  *] to [***]
 
 [ **]  There are problems with signal handling when using LinuxThreads.
 
-[ **]  The `cbrtl' function is inaccurate.  The algorithm used for `double'
-       and `float' is not usable for `long double'.
+[ **]  The `cbrtl' function for ix86 does not work in the moment.
 
 [ **]  Not really a bug, but it could lead to such:
        The RPC code is ugly ugly ugly.  It's more or less verbatim taken
diff --git a/ChangeLog b/ChangeLog
index 794d891b44..5ef2a6099d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,225 @@
+1997-05-21 02:49  Ulrich Drepper  <drepper@cygnus.com>
+
+	* gnu-versions.h (_GNU_OBSTACK_INTERFACE_VERSION): Set to 2 since
+	interface was changed with addition of _obstack_memory_used.
+	Suggested by Ian Taylor <ian@cygnus.com>.
+
+	* malloc/obstack.c: Include <config.h>.  Include <stdlib.h> only
+	if __GNU_LIBRARY__ or HAVE_STDLIB_H is defined.
+	Reported by Ian Taylor <ian@cygnus.com>.
+
+	* dirent/Makefile (routines): Add versionsort.
+	* dirent/dirent.h: Add prototype for versionsort.
+	* dirent/versionsort.c: New file.
+	* manual/filesys.texi: Add documentation for versionsort.
+	* manual/string.texi: Add documentation for strverscmp.
+	* string/Makefile (routines): Add strverscmp.
+	(tests): Add tst-svc.
+	* string/string.h: Add prototype for strverscmp.
+	* string/strverscmp.c: New file.
+	* string/tst-svc.c: New file.  Test for strverscmp.
+	* string/tst-svc.input: New file.  Input data for tst-svc.
+	* string/tst-svc.expect: New file.  Expected out from tst-svc.
+
+	* math/Makefile (calls): Add s_signbit.
+
+	* po/sv.po: Update.
+
+	* resolv/nss_dns/dns-host.c: Add casts to prevent warnings.
+	* sunrpc/pmap_rmt.c: Likewise.
+
+	* string/basename.c: Don't use ISO C definition style.
+	Include <config.h> is HAVE_CONFIG_H is defined.
+
+	* sunrpc/proto.h: Add `const' wherever possible.
+	* sunrpc/rpc_cout.c: Likewise.
+	* sunrpc/rpc_svcout.c: Likewise.
+	* sunrpc/xdr_mem.c: Likewise.
+	* sunrpc/xdr_rec.c: Likewise.
+	* sunrpc/xdr_stdio.c: Likewise.
+	* sunrpc/rpc_parse.c: Delete comma from end of enum definition.
+	* sunrpc/xdr.c: Little code cleanups.
+	* sunrpc/xdr_flaot.c: Likewise.
+	Patches by Matthew Wilcox <matthew.wilcox@chbs.mhs.ciba.com>.
+
+	* sysdeps/i386/fpu/__math.h (__finite): Fix typo.
+
+	* sysdeps/unix/sysv/linux/shmdt.c: Add cast to prevent warning.
+
+	* time/europe: Update from tzdata1997f.
+	* time/zic.c: Update from tzcode1997e.
+
+1997-05-20 19:20  Miguel de Icaza <miguel@athena.nuclecu.unam.mx>
+
+	* sysdeps/sparc/setjmp.S: Flush windows.
+	Bug found by Richard Henderson.
+
+1997-05-19 12:54  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* misc/efgcvt_r.c (fcvt_r, ecvt_r): Rewritten as to fit the specs.
+
+1997-05-19 18:41  Thorsten Kukuk  <kukuk@uni-paderborn.de>
+
+	* nis/nss_nisplus/nisplus-spwd.c (_nss_nisplus_parse_spent): Use
+	atol instead of atoi.
+
+1997-05-18 00:22  Philip Blundell <pjb27@cam.ac.uk>
+
+	* inet/Makefile (routines): Add if_index.
+	* sysdeps/unix/sysv/linux/if_index.c: New file.
+	* sysdeps/stub/if_index.c: New file.
+	* sysdeps/unix/sysv/linux/net/if.h: Add prototypes for routines in
+	if_index.c (required by IPv6 basic API).
+	* sysdeps/unix/sysv/linux/netinet/in.h: Add struct ipv6_pktinfo.
+
+1997-05-17 23:29  Philip Blundell  <pjb27@cam.ac.uk>
+
+	* sysdeps/unix/sysv/linux/netinet/in.h: Update IPv6 definitions
+	for new advanced API draft.
+
+1997-05-13 21:33  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* stdio-common/printf_fp.c: Only use the field width for deciding
+	on padding when printing special values.
+	* stdio-common/printf_fphex.c: Likewise.
+
+1997-05-15 13:14  Miles Bader  <miles@gnu.ai.mit.edu>
+
+	Changes by Thomas Bushnell <thomas@gnu.ai.mit.edu>:
+	* hurd/hurdauth.c (_S_msg_add_auth): Implement correctly.
+
+1997-05-12 14:50  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>
+
+	* hurd/hurdsig.c (_hurdsig_init): Double size of sigthread stack;
+	msg_add_auth was overflowing it.
+
+1997-05-12 21:20  Richard Henderson  <rth@tamu.edu>
+
+	* elf/dl-lookup.c (_dl_lookup_symbol_skip): Call _dl_signal_error
+	when we can't find the symbol.
+
+1997-05-12 16:54  Ulrich Drepper  <drepper@cygnus.com>
+
+	* posix/regex.c: Fix handling of 32-bit Windog environments.
+	Patch by Arnold Robbins <arnold@skeeve.atl.ga.us>.
+
+1997-05-10 23:26  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/unix/sysv/linux/m68k/syscalls.list: Add cacheflush.
+
+1997-05-10 11:40  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* elf/ldd.bash.in: Remove spurious quote character from version
+	message.
+
+1997-05-10 08:49  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* locale/programs/locale.c (write_charmaps): Don't get stuck in a
+	loop if the file ends in a long line without newline.
+	* locale/programs/charmap.c (charmap_read): Likewise.
+
+1997-05-12 03:47  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sunrpc/rpc/xdr.h: Include more headers to be self-contained.
+	* sunrpc/rpc/svc_auth.h: Likewise.
+	* sunrpc/rpc/svc.h: Likewise.
+	* sunrpc/rpc/rpc_msg.h: Likewise.
+	* sunrpc/rpc/pmap_rmt.h: Likewise.
+	* sunrpc/rpc/pmap_clnt.h: Likewise.
+	* sunrpc/rpc/clnt.h: Likewise.
+	* sunrpc/rpc/auth_unix.h: Likewise.
+	* sysdeps/generic/rpc/auth.h: Likewise.
+	Patches by Michael Deutschmann <ldeutsch@mail.netshop.net>.
+
+1997-05-11 15:29  Philip Blundell  <pjb27@cam.ac.uk>
+
+	* sysdeps/stub/sigaction.c (__sigaction): Correct typo.
+	* sysdeps/standalone/arm/errnos.h: New file.
+	* sysdeps/stub/sys/param.h: Add dummy definition of MAXSYMLINKS.
+	* sysdeps/unix/arm/fork.S: New file.
+	* sysdeps/unix/sysv/linux/arm/sysdep.h: New file.
+	* sysdeps/stub/tempname.c (__stdio_gen_tempname): Add missing
+	`streamptr' argument.
+	* sysdeps/stub/vdprintf.c: Remove second copy of file (!), include
+	<stdarg.h> to get va_list defined, return 0 not NULL.
+	* sysdeps/unix/sysv/linux/statfsbuf.h: Include <gnu/types.h>.
+	* sysdeps/unix/sysv/linux/arm/syscall.S: New file.
+	* sysdeps/stub/direntry.h (struct dirent): Add missing ';'.
+	* sysdeps/stub/seekdir.c (seekdir): Likewise.
+	* sysdeps/stub/dirfd.c (dirfd): Argument dirp is DIR*, not FILE*.
+	* sysdeps/standalone/dirstream.h: Define struct __dirstream
+	not DIR; <dirent.h> provides typedef.
+	* sysdeps/unix/sysv/linux/arm/clone.S: New file.
+	* sysdeps/unix/sysv/linux/arm/socket.S: New file.
+	* sysdeps/stub/sysconf.c (__sysconf): Fix typos.
+
+1997-05-01 06:35  Geoff Keating  <geoffk@ozemail.com.au>
+
+	* sysdeps/powerpc/Dist: New file.
+	* sysdeps/powerpc/Makefile: New file.
+	* sysdeps/powerpc/fclrexcpt.c: New file.
+	* sysdeps/powerpc/fegetenv.c: New file.
+	* sysdeps/powerpc/fegetround.c: New file.
+	* sysdeps/powerpc/feholdexcpt.c: New file.
+	* sysdeps/powerpc/fenvbits.h: New file.
+	* sysdeps/powerpc/fenv_const.c: New file.
+	* sysdeps/powerpc/fenv_libc.h: New file.
+	* sysdeps/powerpc/fesetenv.c: New file.
+	* sysdeps/powerpc/fesetround.c: New file.
+	* sysdeps/powerpc/feupdateenv.c: New file.
+	* sysdeps/powerpc/fgetexcptflg.c: New file.
+	* sysdeps/powerpc/fraiseexcpt.c: New file.
+	* sysdeps/powerpc/fsetexcptflg.c: New file.
+	* sysdeps/powerpc/ftestexcept.c: New file.
+	* sysdeps/powerpc/mathbits.h: New file.
+
+	* sysdeps/powerpc/dl-machine.h: Wrap in #ifndef dl_machine_h;
+	define elf_machine_lookup_noexec_p, elf_machine_lookup_noplt_p,
+	ELF_MACHINE_RELOC_NOPLT; consequent changes to elf_machine_rela.
+
+	* sysdeps/powerpc/__math.h: Remove definition for hypot and __sgn.
+
+	* sysdep/powerpc/fpu_control.h: Correct IEEE default mode.
+
+	* sysdeps/unix/sysv/linux/powerpc/sysdep.h: Don't use .text, but
+	instead .section ".text".
+
+1997-04-25 05:06  Geoff Keating  <geoffk@ozemail.com.au>
+
+	* sysdeps/powerpc/__longjmp.S: Use symbolic register numbering.
+	* sysdeps/powerpc/bsd-_setjmp.S: Likewise.
+	* sysdeps/powerpc/bsd-setjmp.S: Likewise.
+	* sysdeps/powerpc/setjmp.S: Likewise.
+
+	* sysdeps/unix/sysv/linux/clone.S: Likewise.
+	* sysdeps/unix/sysv/linux/socket.S: Likewise.
+	* sysdeps/unix/sysv/linux/syscall.S: Likewise.
+
+1997-04-20 04:37  Geoff Keating  <geoffk@ozemail.com.au>
+
+	* sysdeps/powerpc/strchr.s: New file.
+	* sysdeps/powerpc/strcmp.s: New (ugly) file.
+	* sysdeps/powerpc/memset.s: New file.
+	* string/tester.c: Include prototype and _GNU_SOURCE to make
+	standalone compilation possible. Give strcmp a better
+	test. Give memset a better test.
+
+1997-04-05 06:34  Geoff Keating  <geoffk@ozemail.com.au>
+
+	* sysdeps/powerpc/strlen.s: Fixed bugs (how did it ever pass its
+	tests before?). Changed to symbolic register numbering as an
+	experiment.
+	* sysdeps/powerpc/ffs.c: Don't include bstring.h, it doesn't
+	exist.
+	* sysdeps/rs6000/ffs.c: Likewise.
+
+1997-05-12 02:28  Ulrich Drepper  <drepper@cygnus.com>
+
+	* time/sys/time.h: Make second argument of setitimer const.
+	Patch by Michael Deutschmann <ldeutsch@mail.netshop.net>.
+	* sysdeps/stub/setitimer.c: Likewise.
+	* sysdeps/mach/hurd/setitimer.c: Likewise.
+
 1997-05-10 11:46  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>
 
 	* nis/rpcsvc/nis_callback.x: New, from tirpcsrc-2.3.
diff --git a/FAQ b/FAQ
index 16f6157f33..77bcaa658c 100644
--- a/FAQ
+++ b/FAQ
@@ -183,7 +183,12 @@ Library.
   slow.
 
 * plenty of time (approx 1h for i?86-linux on i586@133 or 2.5h on
-  i486@66 or 4.5h on i486@33).  For Hurd systems times are much higher.
+  i486@66 or 4.5h on i486@33), both for shared and static only).
+  For Hurd systems times are much higher.
+
+  For Atari Falcon (Motorola 68030 @ 16 Mhz, 14 Mb memory) James Troup
+  <J.J.Troup@comp.brad.ac.uk> reports for a full build (shared, static,
+  and profiled) a compile time of 45h34m.
 
   If you have some more measurements let me know.
 
@@ -578,6 +583,10 @@ something like this:
 
 GROUP ( libc.so.6 ld.so.1 libc.a )
 
+or in ix86/Linux and alpha/Linux:
+
+GROUP ( libc.so.6 ld-linux.so.2 libc.a )
+
 
 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 [Q18]	``The prototypes for `connect', `accept', `getsockopt',
@@ -699,7 +708,7 @@ Answers were given by:
 {DMT} David Mosberger-Tang, <davidm@AZStarNet.com>
 {RM} Roland McGrath, <roland@gnu.ai.mit.edu>
 {HJL} H.J. Lu, <hjl@gnu.ai.mit.edu>
-{AJ} Andreas Jaeger, <aj@arthur.pfalz.de>
+{AJ} Andreas Jaeger, <aj@arthur.rhein-neckar.de>
 {EY} Eric Youngdale, <eric@andante.jic.com>
 
 Local Variables:
diff --git a/dirent/Makefile b/dirent/Makefile
index 8741faf769..4b64498d28 100644
--- a/dirent/Makefile
+++ b/dirent/Makefile
@@ -23,7 +23,7 @@ subdir		:= dirent
 
 headers		:= dirent.h direntry.h
 routines	:= opendir closedir readdir readdir_r rewinddir \
-		   seekdir telldir scandir alphasort \
+		   seekdir telldir scandir alphasort versionsort \
 		   getdents dirfd
 distribute := dirstream.h
 
diff --git a/dirent/dirent.h b/dirent/dirent.h
index 3d187e1096..9caf272aa1 100644
--- a/dirent/dirent.h
+++ b/dirent/dirent.h
@@ -175,6 +175,10 @@ extern int scandir __P ((__const char *__dir,
 /* Function to compare two `struct dirent's alphabetically.  */
 extern int alphasort __P ((__const __ptr_t, __const __ptr_t));
 
+# ifdef __USE_GNU
+/* Function to compare two `struct dirent's by name & version.  */
+extern int versionsort __P ((__const __ptr_t, __const __ptr_t));
+#endif
 
 /* Read directory entries from FD into BUF, reading at most NBYTES.
    Reading starts at offset *BASEP, and *BASEP is updated with the new
diff --git a/dirent/versionsort.c b/dirent/versionsort.c
new file mode 100644
index 0000000000..182680bc45
--- /dev/null
+++ b/dirent/versionsort.c
@@ -0,0 +1,27 @@
+/* Copyright (C) 1992, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <dirent.h>
+#include <string.h>
+
+int
+versionsort (const void *a, const void *b)
+{
+  return strverscmp ((*(const struct dirent **) a)->d_name,
+		 (*(const struct dirent **) b)->d_name);
+}
diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
index f85aa373c2..63a525edaa 100644
--- a/elf/dl-lookup.c
+++ b/elf/dl-lookup.c
@@ -332,6 +332,18 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name,
 		     reference_name, version, skip_map, 0))
 	break;
 
+  if (current_value.s == NULL &&
+      (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK))
+    {
+      /* We could find no value for a strong reference.  */
+      static const char msg[] = "undefined symbol: ";
+      const size_t len = strlen (undef_name);
+      char buf[sizeof msg + len];
+      memcpy (buf, msg, sizeof msg - 1);
+      memcpy (&buf[sizeof msg - 1], undef_name, len + 1);
+      _dl_signal_error (0, reference_name, buf);
+    }
+
   *ref = current_value.s;
   return current_value.a;
 }
diff --git a/elf/ldd.bash.in b/elf/ldd.bash.in
index 492d3ba452..c433a72679 100644
--- a/elf/ldd.bash.in
+++ b/elf/ldd.bash.in
@@ -35,7 +35,7 @@ bind_now=
 while test $# -gt 0; do
   case "$1" in
   --v | --ve | --ver | --vers | --versi | --versio | --version)
-    echo '"ldd (GNU libc) @VERSION@'
+    echo 'ldd (GNU libc) @VERSION@'
     echo $"Copyright (C) 1996, 1997 Free Software Foundation, Inc.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
diff --git a/gnu-versions.h b/gnu-versions.h
index f27e34fc29..7085895a0a 100644
--- a/gnu-versions.h
+++ b/gnu-versions.h
@@ -44,7 +44,7 @@
    remember, if any of these versions change, the libc.so major version
    number must change too (so avoid it)!  */
 
-#define _GNU_OBSTACK_INTERFACE_VERSION	1 /* vs malloc/obstack.c */
+#define _GNU_OBSTACK_INTERFACE_VERSION	2 /* vs malloc/obstack.c */
 #define _GNU_REGEX_INTERFACE_VERSION	1 /* vs posix/regex.c */
 #define _GNU_GLOB_INTERFACE_VERSION	1 /* vs posix/glob.c */
 #define _GNU_GETOPT_INTERFACE_VERSION	2 /* vs posix/getopt.c and
diff --git a/hurd/hurdauth.c b/hurd/hurdauth.c
index c60b8d8326..64c9db4582 100644
--- a/hurd/hurdauth.c
+++ b/hurd/hurdauth.c
@@ -37,17 +37,124 @@ _S_msg_add_auth (mach_port_t me,
 {
   error_t err;
   auth_t newauth;
+  uid_t *genuids, *gengids, *auxuids, *auxgids;
+  mach_msg_type_number_t ngenuids, ngengids, nauxuids, nauxgids;
+  uid_t *newgenuids, *newgengids, *newauxuids, *newauxgids;
+  mach_msg_type_number_t nnewgenuids, nnewgengids, nnewauxuids, nnewauxgids;
+
+  /* Create a list of ids and store it in NEWLISTP, length NEWLISTLEN.
+     Keep all the ids in EXIST (len NEXIST), adding in those from NEW
+     (len NNEW) which are not already there.  */
+  error_t make_list (uid_t **newlistp, mach_msg_type_number_t *newlistlen,
+		     uid_t *exist, mach_msg_type_number_t nexist,
+		     uid_t *new, mach_msg_type_number_t nnew)
+    {
+      error_t urp;
+      int i, j, k;
+      vm_size_t offset;
+
+      urp = vm_allocate (mach_task_self (), (vm_address_t *) newlistp,
+			 nexist + nnew * sizeof (uid_t), 1);
+      if (urp)
+	return urp;
+
+      j = 0;
+      for (i = 0; i < nexist; i++)
+	(*newlistp)[j++] = exist[i];
+
+      for (i = 0; i < nnew; i++)
+	{
+	  for (k = 0; k < nexist; k++)
+	    if (exist[k] == new[i])
+	      break;
+	  if (k < nexist)
+	    continue;
+
+	  (*newlistp)[j++] = new[i];
+	}
+
+      offset = (round_page (nexist + nnew * sizeof (uid_t))
+		- round_page (j * sizeof (uid_t)));
+      if (offset)
+	vm_deallocate (mach_task_self (),
+		       (vm_address_t) (*newlistp
+				       + (nexist + nnew * sizeof (uid_t))),
+		       offset);
+      *newlistlen = j;
+      return 0;
+    }
+
+  /* Find out what ids ADDAUTH refers to */
 
-  if (err = __USEPORT (AUTH,
-		       __auth_makeauth (port,
-					&addauth, MACH_MSG_TYPE_MOVE_SEND, 1,
-					NULL, 0,
-					NULL, 0,
-					NULL, 0,
-					NULL, 0,
-					&newauth)))
+  genuids = gengids = auxuids = auxgids = 0;
+  ngenuids = ngengids = nauxuids = nauxgids = 0;
+  err = __auth_getids (addauth,
+		       &genuids, &ngenuids,
+		       &auxuids, &nauxuids,
+		       &gengids, &ngengids,
+		       &auxgids, &nauxgids);
+  if (err)
     return err;
 
+  /* OR in these ids to what we already have, creating a new list. */
+
+  HURD_CRITICAL_BEGIN;
+  __mutex_lock (&_hurd_id.lock);
+  _hurd_check_ids ();
+
+#define MAKE(genaux,uidgid) 						    \
+  make_list (&new ## genaux ## uidgid ## s, 				    \
+	     &nnew ## genaux ## uidgid ## s,				    \
+	     _hurd_id.genaux.uidgid ## s,				    \
+	     _hurd_id.genaux.n ## uidgid ## s,				    \
+	     genaux ## uidgid ## s,					    \
+	     n ## genaux ## uidgid ## s)
+
+  err = MAKE (gen, uid);
+  if (!err)
+    MAKE (aux, uid);
+  if (!err)
+    MAKE (gen, gid);
+  if (!err)
+    MAKE (aux, gid);
+#undef MAKE
+
+  __mutex_unlock (&_hurd_id.lock);
+  HURD_CRITICAL_END;
+
+
+  /* Create the new auth port */
+
+  if (!err)
+    err = __USEPORT (AUTH,
+		     __auth_makeauth (port,
+				      &addauth, MACH_MSG_TYPE_MOVE_SEND, 1,
+				      newgenuids, nnewgenuids,
+				      newauxuids, nnewauxuids,
+				      newgengids, nnewgengids,
+				      newauxgids, nnewauxgids,
+				      &newauth));
+
+#define freeup(array, len) \
+  if (array) \
+    vm_deallocate (mach_task_self (), (vm_address_t) array, \
+		   len * sizeof (uid_t));
+
+  freeup (genuids, ngenuids);
+  freeup (auxuids, nauxuids);
+  freeup (gengids, ngengids);
+  freeup (auxgids, nauxgids);
+  freeup (newgenuids, nnewgenuids);
+  freeup (newauxuids, nnewauxuids);
+  freeup (newgengids, nnewgengids);
+  freeup (newauxgids, nnewauxgids);
+#undef freeup
+
+  if (err)
+    return err;
+
+  /* And install it. */
+
   err = __setauth (newauth);
   __mach_port_deallocate (__mach_task_self (), newauth);
   if (err)
diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c
index 592dc12e66..f50daa2f8f 100644
--- a/hurd/hurdsig.c
+++ b/hurd/hurdsig.c
@@ -1194,7 +1194,7 @@ _hurdsig_init (void)
   err = __thread_create (__mach_task_self (), &_hurd_msgport_thread);
   assert_perror (err);
 
-  stacksize = __vm_page_size * 4; /* Small stack for signal thread.  */
+  stacksize = __vm_page_size * 8; /* Small stack for signal thread.  */
   err = __mach_setup_thread (__mach_task_self (), _hurd_msgport_thread,
 			     _hurd_msgport_receive,
 			     (vm_address_t *) &__hurd_sigthread_stack_base,
diff --git a/inet/Makefile b/inet/Makefile
index 02e10335f4..fbd658a7bf 100644
--- a/inet/Makefile
+++ b/inet/Makefile
@@ -44,7 +44,7 @@ routines := ntohl ntohs htonl htons		\
 	    rcmd rexec ruserpass \
 	    getnetgrent_r getnetgrent \
 	    getaliasent_r getaliasent getaliasname getaliasname_r \
-	    in6_addr getnameinfo
+	    in6_addr getnameinfo if_index
 
 # No warnings about losing BSD code.
 CFLAGS-rcmd.c = -w
diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c
index 359b913c1f..416615a1b9 100644
--- a/locale/programs/charmap.c
+++ b/locale/programs/charmap.c
@@ -114,9 +114,9 @@ charmap_read (const char *filename)
 			if (fscanf (fp, " <code_set_name> %as", &name) == 1)
 			  break;
 
-			do
-			  fgets (junk, sizeof junk, fp);
-			while (strchr (junk, '\n') == NULL);
+			while (fgets (junk, sizeof junk, fp) != NULL
+			       && strchr (junk, '\n') == NULL)
+			  continue;
 		      }
 
 		    fclose (fp);
diff --git a/locale/programs/locale.c b/locale/programs/locale.c
index 28ad94403f..52ae56a819 100644
--- a/locale/programs/locale.c
+++ b/locale/programs/locale.c
@@ -504,9 +504,9 @@ write_charmaps (void)
 		    if (fscanf (fp, " <code_set_name> %as", &name) == 1)
 		      break;
 
-		    do
-		      fgets (junk, sizeof junk, fp);
-		    while (strchr (junk, '\n') == NULL);
+		    while (fgets (junk, sizeof junk, fp) != NULL
+			   && strchr (junk, '\n') == NULL)
+		      continue;
 		  }
 
 		fclose (fp);
diff --git a/malloc/obstack.c b/malloc/obstack.c
index 1e36c4a0a5..731762f5a9 100644
--- a/malloc/obstack.c
+++ b/malloc/obstack.c
@@ -1,5 +1,5 @@
 /* obstack.c - subroutines used implicitly by object stack macros
-   Copyright (C) 1988,89,90,91,92,93,94,96 Free Software Foundation, Inc.
+   Copyright (C) 1988,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
 
    This file is part of the GNU C Library.  Its master source is NOT part of
    the C library, however.  The master source lives in /gd/gnu/lib.
@@ -19,6 +19,10 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include "obstack.h"
 
 /* NOTE BEFORE MODIFYING THIS FILE: This version number must be
@@ -85,7 +89,7 @@ void (*obstack_alloc_failed_handler) () = print_and_abort;
 #endif
 
 /* Exit value used when `print_and_abort' is used.  */
-#if defined (__STDC__) && __STDC__
+#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H
 #include <stdlib.h>
 #endif
 #ifndef EXIT_FAILURE
diff --git a/manual/filesys.texi b/manual/filesys.texi
index afe072c594..5ddd8a20a7 100644
--- a/manual/filesys.texi
+++ b/manual/filesys.texi
@@ -455,8 +455,8 @@ value are selected.
 Finally the entries in the @var{namelist} are sorted using the user
 supplied function @var{cmp}.  The arguments of the @var{cmp} function
 are of type @code{struct dirent **}.  I.e., one cannot directly use the
-@code{strcmp} or @code{strcoll} function; see the function
-@code{alphasort} below.
+@code{strcmp} or @code{strcoll} function; see the functions
+@code{alphasort} and @code{versionsort} below.
 
 The return value of the function gives the number of entries placed in
 @var{namelist}.  If it is @code{-1} an error occurred and the global
@@ -465,7 +465,7 @@ variable @code{errno} contains more information on the error.
 
 As said above the fourth argument to the @code{scandir} function must be
 a pointer to a sorting function.  For the convenience of the programmer
-the GNU C library contains an implementation of a function which is very
+the GNU C library contains implementations of functions which are very
 helpful for this purpose.
 
 @deftypefun int alphasort (const void *@var{a}, const void *@var{b})
@@ -478,6 +478,11 @@ Return value of is less than, equal to, or greater than zero depending
 on the order of the two entries @var{a} and @var{b}.
 @end deftypefun
 
+@deftypefun int versionsort (const void *@var{a}, const void *@var{b})
+The @code{versionsort} function is like @code{alphasort}, excepted that it
+uses the @code{strverscmp} function internally.
+@end deftypefun
+
 @node Simple Directory Lister Mark II
 @subsection Simple Program to List a Directory, Mark II
 
diff --git a/manual/string.texi b/manual/string.texi
index 8f09ac9728..e358b2015f 100644
--- a/manual/string.texi
+++ b/manual/string.texi
@@ -609,6 +609,56 @@ strncmp ("hello, world", "hello, stupid world!!!", 5)
 @end smallexample
 
 @comment string.h
+@comment GNU
+@deftypefun int strverscmp (const char *@var{s1}, const char *@var{s2})
+The @code{strverscmp} function compares the string @var{s1} against
+@var{s2}, considering them as holding indices/version numbers.  Return
+value follows the same conventions as found in the @code{strverscmp}
+function.  In fact, if @var{s1} and @var{s2} contain no digits,
+@code{strverscmp} behaves like @code{strcmp}.
+
+Basically, we compare strings normaly (character by character), until
+we find a digit in each string - then we enter a special comparison
+mode, where each sequence of digit is taken as a whole.  If we reach the
+end of these two parts without noticing a difference, we return to the
+standard comparison mode.  There are two types of numeric parts:
+"integral" and "fractionnal" (these laters begins with a '0'). The types
+of the numeric parts affect the way we sort them:
+
+@itemize @bullet
+@item
+integral/integral: we compare values as you would expect.
+
+@item
+fractionnal/integral: the fractionnal part is less than the integral one.
+Again, no surprise.
+
+@item
+fractionnal/fractionnal: the things become a bit more complex.
+if the common prefix contains only leading zeroes, the longest part is less
+than the other one; else the comparison behaves normaly.
+@end itemize
+
+@smallexample
+strverscmp ("no digit", "no digit")
+    @result{} 0    /* @r{same behaviour as strverscmp.} */
+strverscmp ("item#99", "item#100")
+    @result{} <0   /* @r{same prefix, but 99 < 100.} */
+strverscmp ("alpha1", "alpha001")
+    @result{} >0   /* @r{fractionnal part inferior to integral one.} */
+strverscmp ("part1_f012", "part1_f01")
+    @result{} >0   /* @r{two fractionnal parts.} */
+strverscmp ("foo.009", "foo.0")
+    @result{} <0   /* @r{idem, but with leading zeroes only.} */
+@end smallexample
+
+This function is especially usefull when dealing with filename sorting,
+because filenames frequently hold indices/version numbers.
+
+@code{strverscmp} is a GNU extension.
+@end deftypefun
+
+@comment string.h
 @comment BSD
 @deftypefun int bcmp (const void *@var{a1}, const void *@var{a2}, size_t @var{size})
 This is an obsolete alias for @code{memcmp}, derived from BSD.
diff --git a/manual/texinfo.tex b/manual/texinfo.tex
index 72050b8e22..6bae66900a 100644
--- a/manual/texinfo.tex
+++ b/manual/texinfo.tex
@@ -1,5 +1,5 @@
 %% TeX macros to handle Texinfo files.
-%% $Id: texinfo.tex,v 2.198 1997/05/07 15:16:03 drepper Exp $
+%% $Id: texinfo.tex,v 2.199 1997/05/20 11:11:48 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.198 $
+\deftexinfoversion$Revision: 2.199 $
 \message{Loading texinfo package [Version \texinfoversion]:}
 
 % If in a .fmt file, print the version number
@@ -1271,8 +1271,6 @@ where each line of input produces a line of output.}
 \def\ctrl #1{{\tt \rawbackslash \hat}#1}
 
 \let\file=\samp
-\let\url=\samp % perhaps include a hypertex \special eventually
-\def\email#1{$\langle${\tt #1}$\rangle$}
 
 % @code is a modification of @t,
 % which makes spaces the same size as normal in the surrounding text.
@@ -1325,7 +1323,7 @@ where each line of input produces a line of output.}
 
 \def\realdash{-}
 \def\codedash{-\discretionary{}{}{}}
-\def\codeunder{\normalunderscore\discretionary{}{}{}}
+\def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}}
 \def\codex #1{\tclose{#1}\endgroup}
 
 %\let\exp=\tclose  %Was temporary
@@ -1339,6 +1337,12 @@ where each line of input produces a line of output.}
 \else{\tclose{\ttsl\look}}\fi
 \else{\tclose{\ttsl\look}}\fi}
 
+% @url, @email.  Quotes do not seem necessary.
+\let\url=\code % perhaps include a hypertex \special eventually
+% rms does not like the angle brackets --karl, 17may97.
+%\def\email#1{$\langle${\tt #1}$\rangle$}
+\let\email=\code
+
 % Check if we are currently using a typewriter font.  Since all the
 % Computer Modern typewriter fonts have zero interword stretch (and
 % shrink), and it is reasonable to expect all typewriter fonts to have
@@ -3417,8 +3421,8 @@ width0pt\relax} \fi
 \let\.=\ptexdot
 \let\*=\ptexstar
 \let\dots=\ptexdots
-\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}
-\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}
+\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
 \def\@{@}%
 \let\bullet=\ptexbullet
 \let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext
diff --git a/math/Makefile b/math/Makefile
index 839e441354..87b47ab1b6 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -67,7 +67,8 @@ distribute += $(long-m-yes:=.c)
 # These functions are in libc instead of libm because __printf_fp
 # calls them, so any program using printf will need them linked in,
 # and we don't want to have to link every program with -lm.
-calls = s_isinf s_isnan s_finite s_copysign s_modf s_scalbn s_frexp s_ldexp
+calls = s_isinf s_isnan s_finite s_copysign s_modf s_scalbn s_frexp s_ldexp \
+	s_signbit
 routines = $(calls) $(calls:=f) $(long-c-$(long-double-fcts))
 long-c-yes = $(calls:=l)
 distribute += $(long-c-yes:=.c)
diff --git a/math/fenv.h b/math/fenv.h
index c065d662e0..e4dff29a2e 100644
--- a/math/fenv.h
+++ b/math/fenv.h
@@ -71,7 +71,7 @@ extern void fegetexceptflag __P ((fexcept_t *__flagp, int __excepts));
 /* Raise the supported exceptions represented by EXCEPTS.  */
 extern void feraiseexcept __P ((int __excepts));
 
-/* Set complete status for exceptions inidicated by EXCEPTS according to
+/* Set complete status for exceptions indicated by EXCEPTS according to
    the representation in the object pointed to by FLAGP.  */
 extern void fesetexceptflag __P ((__const fexcept_t *__flagp, int __excepts));
 
diff --git a/misc/efgcvt_r.c b/misc/efgcvt_r.c
index e6030c8543..69caef01d7 100644
--- a/misc/efgcvt_r.c
+++ b/misc/efgcvt_r.c
@@ -37,6 +37,7 @@
 #define FLOOR APPEND(floor, FLOAT_NAME_EXT)
 #define FABS APPEND(fabs, FLOAT_NAME_EXT)
 #define LOG10 APPEND(log10, FLOAT_NAME_EXT)
+#define EXP APPEND(exp, FLOAT_NAME_EXT)
 
 
 int
@@ -54,9 +55,12 @@ APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len)
       return -1;
     }
 
-  *sign = value < 0.0;
-  if (*sign)
-    value = - value;
+  if (isfinite (value))
+    {
+      *sign = signbit (value) != 0;
+      if (*sign)
+	value = -value;
+    }
 
   n = snprintf (buf, len, "%.*" FLOAT_FMT_FLAG "f", ndigit, value);
   if (n < 0)
@@ -66,16 +70,29 @@ APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len)
   while (i < n && isdigit (buf[i]))
     ++i;
   *decpt = i;
-  do
-    ++i;
-  while (! isdigit (buf[i]));
-  memmove (&buf[i - *decpt], buf, n - (i - *decpt));
+
+  if (i == 0)
+    {
+      /* Value is Inf or NaN.  */
+      *sign = 0;
+      return 0;
+    }
+
+  if (i < n)
+    {
+      do
+	++i;
+      while (i < n && !isdigit (buf[i]));
+      memmove (&buf[*decpt], &buf[i], n - i);
+      buf[n - (i - *decpt)] = 0;
+    }
 
   return 0;
 }
 
 #define weak_extern2(name) weak_extern (name)
 weak_extern2 (FLOOR) weak_extern2 (LOG10) weak_extern2 (FABS)
+weak_extern2 (EXP)
 
 int
 APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, buf, len)
@@ -84,24 +101,55 @@ APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, buf, len)
      char *buf;
      size_t len;
 {
-  FLOAT_TYPE (*log10_function) (FLOAT_TYPE) = &LOG10;
+  int exponent = 0;
 
-  if (log10_function)
-    {
-      /* Use the reasonable code if -lm is included.  */
-      ndigit -= (int) FLOOR (LOG10 (FABS (value)));
-      if (ndigit < 0)
-	ndigit = 0;
-    }
-  else
+  if (isfinite (value) && value != 0.0)
     {
-      /* Slow code that doesn't require -lm functions.  */
-      FLOAT_TYPE d;
-      for (d = value < 0.0 ? - value : value;
-	   ndigit > 0 && d >= 10.0;
-	   d *= 0.1)
-	--ndigit;
+      FLOAT_TYPE (*log10_function) (FLOAT_TYPE) = &LOG10;
+
+      if (log10_function)
+	{
+	  /* Use the reasonable code if -lm is included.  */
+	  FLOAT_TYPE dexponent;
+	  dexponent = FLOOR (LOG10 (FABS (value)));
+	  value *= EXP (dexponent * -M_LN10);
+	  exponent = (int) dexponent;
+	}
+      else
+	{
+	  /* Slow code that doesn't require -lm functions.  */
+	  FLOAT_TYPE d;
+	  if (value < 0.0)
+	    d = -value;
+	  else
+	    d = value;
+	  if (d < 1.0)
+	    {
+	      do
+		{
+		  d *= 10.0;
+		  exponent--;
+		}
+	      while (d < 1.0);
+	    }
+	  else if (d >= 10.0)
+	    {
+	      do
+		{
+		  d *= 0.1;
+		  exponent++;
+		}
+	      while (d >= 10.0);
+	    }
+	  if (value < 0.0)
+	    value = -d;
+	  else
+	    value = d;
+	}
     }
 
-  return APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len);
+  if (APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit - 1, decpt, sign, buf, len))
+    return -1;
+  *decpt += exponent;
+  return 0;
 }
diff --git a/nis/nss_nisplus/nisplus-spwd.c b/nis/nss_nisplus/nisplus-spwd.c
index 3400e28da7..d426d28684 100644
--- a/nis/nss_nisplus/nisplus-spwd.c
+++ b/nis/nss_nisplus/nisplus-spwd.c
@@ -90,47 +90,47 @@ _nss_nisplus_parse_spent (nis_result *result, struct spwd *sp,
   if (cp == NULL)
     return 0;
   *cp++ = '\0';
-  sp->sp_lstchg = atoi (line);
+  sp->sp_lstchg = atol (line);
 
   line = cp;
   cp = strchr (line, ':');
   if (cp == NULL)
     return 0;
   *cp++ = '\0';
-  sp->sp_min = atoi(line);
+  sp->sp_min = atol(line);
 
   line = cp;
   cp = strchr (line, ':');
   if (cp == NULL)
     return 0;
   *cp++ = '\0';
-  sp->sp_max = atoi(line);
+  sp->sp_max = atol(line);
 
   line = cp;
   cp = strchr (line, ':');
   if (cp == NULL)
     return 0;
   *cp++ = '\0';
-  sp->sp_warn = atoi(line);
+  sp->sp_warn = atol(line);
 
   line = cp;
   cp = strchr (line, ':');
   if (cp == NULL)
     return 0;
   *cp++ = '\0';
-  sp->sp_inact = atoi(line);
+  sp->sp_inact = atol(line);
 
   line = cp;
   cp = strchr (line, ':');
   if (cp == NULL)
     return 0;
   *cp++ = '\0';
-  sp->sp_expire = atoi(line);
+  sp->sp_expire = atol(line);
 
   line = cp;
   if (line == NULL)
     return 0;
-  sp->sp_flag = atoi(line);
+  sp->sp_flag = atol(line);
 
   return 1;
 }
diff --git a/po/sv.po b/po/sv.po
index bd573d2d4a..8b296021f5 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -1,12 +1,12 @@
 # GNU libc message catalog for swedish
-# Copyright (C) 1996 Free Software Foundation, Inc.
+# Copyright © 1996 Free Software Foundation, Inc.
 # Jan Djärv <Jan.Djarv@mbox200.swipnet.se>, 1996.
 # $Revision$
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: libc 1.99\n"
-"POT-Creation-Date: 1996-12-03 13:50+0100\n"
+"Project-Id-Version: libc 2.0.3\n"
+"POT-Creation-Date: 1997-03-30 19:08+0200\n"
 "PO-Revision-Date: $Date$\n"
 "Last-Translator: Jan Djärv <Jan.Djarv@mbox200.swipnet.se>\n"
 "Language-Team: Swedish <sv@li.org>\n"
@@ -34,31 +34,31 @@ msgstr "       rpcinfo [ -n portnr ] -t värd prognr [ versnr ]\n"
 msgid "   program vers proto   port\n"
 msgstr "   program vers proto   port\n"
 
-#: time/zic.c:424
+#: time/zic.c:419
 #, c-format
 msgid " (rule from \"%s\", line %d)"
 msgstr " (regel från \"%s\", rad %d)"
 
-#: locale/programs/ld-collate.c:360 locale/programs/ld-ctype.c:1234
+#: locale/programs/ld-collate.c:363 locale/programs/ld-ctype.c:1242
 msgid " done\n"
 msgstr " klar\n"
 
-#: time/zic.c:421
+#: time/zic.c:416
 #, c-format
 msgid "\"%s\", line %d: %s"
 msgstr "\"%s\", rad %d: %s"
 
-#: time/zic.c:945
+#: time/zic.c:943
 #, c-format
 msgid "\"Zone %s\" line and -l option are mutually exclusive"
 msgstr "\"Zone %s\"-rad och flaggan -l är ömsesidigt uteslutande"
 
-#: time/zic.c:953
+#: time/zic.c:951
 #, c-format
 msgid "\"Zone %s\" line and -p option are mutually exclusive"
 msgstr "\"Zone %s\"-rad och flaggan -p är ömsesidigt uteslutande"
 
-#: time/zic.c:758
+#: time/zic.c:754
 #, c-format
 msgid "%s in ruleless zone"
 msgstr "%s i zon utan regel"
@@ -78,7 +78,7 @@ msgstr "%s%s%s:%u: %s%sOväntat fel: %s.\n"
 msgid "%s%sUnknown signal %d\n"
 msgstr "%s%sOkänd signal %d\n"
 
-#: time/zic.c:2139
+#: time/zic.c:2172
 #, c-format
 msgid "%s: %d did not sign extend correctly\n"
 msgstr "%s: %d teckenexpanderades inte korrekt\n"
@@ -88,137 +88,142 @@ msgstr "%s: %d teckenexpanderades inte korrekt\n"
 msgid "%s: <mb_cur_max> must be greater than <mb_cur_min>\n"
 msgstr "%s: <mb_cur_max> måste vara större än <mb_cur_min>\n"
 
-#: time/zic.c:1430
+#: time/zic.c:1443
 #, c-format
 msgid "%s: Can't create %s: %s\n"
 msgstr "%s: Kan inte skapa %s: %s\n"
 
-#: time/zic.c:2118
+#: time/zic.c:2150
 #, c-format
 msgid "%s: Can't create directory %s: %s\n"
 msgstr "%s: Kan inte skapa katalog %s: %s\n"
 
-#: time/zic.c:612
+#: time/zic.c:608
 #, c-format
 msgid "%s: Can't link from %s to %s: %s\n"
 msgstr "%s: Kan inte länka från %s till %s: %s\n"
 
-#: time/zic.c:783
+#: time/zic.c:780
 #, c-format
 msgid "%s: Can't open %s: %s\n"
 msgstr "%s: Kan inte öppna %s: %s\n"
 
-#: time/zic.c:851
+#: time/zic.c:1433
+#, c-format
+msgid "%s: Can't remove %s: %s\n"
+msgstr "%s: Kan inte ta bort %s: %s\n"
+
+#: time/zic.c:849
 #, c-format
 msgid "%s: Error closing %s: %s\n"
 msgstr "%s: Fel vid stängning av %s: %s\n"
 
-#: time/zic.c:845
+#: time/zic.c:842
 #, c-format
 msgid "%s: Error reading %s\n"
 msgstr "%s: Fel vid läsning från %s\n"
 
-#: time/zic.c:1494
+#: time/zic.c:1507
 #, c-format
 msgid "%s: Error writing %s\n"
 msgstr "%s: Fel vid skrivning till %s\n"
 
-#: time/zdump.c:258
+#: time/zdump.c:266
 #, c-format
 msgid "%s: Error writing standard output "
 msgstr "%s: Fel vid skrivning till standard ut "
 
-#: time/zic.c:830
+#: time/zic.c:827
 #, c-format
 msgid "%s: Leap line in non leap seconds file %s\n"
 msgstr "%s: \"Leap\"-rad i fil %s som inte är skottsekundsfil\n"
 
-#: time/zic.c:362
+#: time/zic.c:357
 #, c-format
 msgid "%s: Memory exhausted: %s\n"
 msgstr "%s: Minnet slut: %s\n"
 
-#: time/zic.c:527
+#: time/zic.c:522
 #, c-format
 msgid "%s: More than one -L option specified\n"
 msgstr "%s: Flaggan -L given mer än en gång\n"
 
-#: time/zic.c:487
+#: time/zic.c:482
 #, c-format
 msgid "%s: More than one -d option specified\n"
-msgstr "%s: Flagga -d given mer än en gång\n"
+msgstr "%s: Flaggan -d given mer än en gång\n"
 
-#: time/zic.c:497
+#: time/zic.c:492
 #, c-format
 msgid "%s: More than one -l option specified\n"
 msgstr "%s: Flaggan -l given mer än en gång\n"
 
-#: time/zic.c:507
+#: time/zic.c:502
 #, c-format
 msgid "%s: More than one -p option specified\n"
 msgstr "%s: Flaggan -p given mer än en gång\n"
 
-#: time/zic.c:517
+#: time/zic.c:512
 #, c-format
 msgid "%s: More than one -y option specified\n"
 msgstr "%s: Flaggan -y given mer än en gång\n"
 
-#: time/zic.c:1845
+#: time/zic.c:1872
 #, c-format
 msgid "%s: command was '%s', result was %d\n"
 msgstr "%s: kommandot var \"%s\", resultatet blev %d\n"
 
-#: locale/programs/charmap.c:593 locale/programs/locfile.c:878
+#: locale/programs/charmap.c:593 locale/programs/locfile.c:900
 #, c-format
 msgid "%s: error in state machine"
 msgstr "%s: fel i tillståndsmaskin"
 
-#: posix/getopt.c:687
+#: posix/getopt.c:783
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: otillåten flagga -- %c\n"
 
-#: posix/getopt.c:690
+#: posix/getopt.c:786
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: ogiltig flagga -- %c\n"
 
-#: posix/getopt.c:611
+#: posix/getopt.c:707
 #, c-format
 msgid "%s: option `%c%s' doesn't allow an argument\n"
 msgstr "%s: flaggan \"%c%s\" tar inget argument\n"
 
-#: posix/getopt.c:582
+#: posix/getopt.c:678
 #, c-format
 msgid "%s: option `%s' is ambiguous\n"
 msgstr "%s: flaggan \"%s\" är tvetydig\n"
 
-#: posix/getopt.c:628 posix/getopt.c:801
+#: posix/getopt.c:724 posix/getopt.c:897
 #, c-format
 msgid "%s: option `%s' requires an argument\n"
 msgstr "%s: flaggan \"%s\" behöver ett argument\n"
 
-#: posix/getopt.c:606
+#: posix/getopt.c:702
 #, c-format
 msgid "%s: option `--%s' doesn't allow an argument\n"
 msgstr "%s: flaggan \"--%s\" tar inget argument\n"
 
-#: posix/getopt.c:786
+#: posix/getopt.c:881
 #, c-format
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr "%s: flaggan \"-W %s\" tar inget argument\n"
 
-#: posix/getopt.c:767
+#: posix/getopt.c:863
 #, c-format
 msgid "%s: option `-W %s' is ambiguous\n"
 msgstr "%s: flaggan \"-W %s\" är tvetydig\n"
 
-#: posix/getopt.c:721 posix/getopt.c:850
+#: posix/getopt.c:816 posix/getopt.c:946
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: flaggan behöver ett argument -- %c\n"
 
-#: time/zic.c:837 time/zic.c:1248 time/zic.c:1268
+#: time/zic.c:834 time/zic.c:1246 time/zic.c:1266
 #, c-format
 msgid "%s: panic: Invalid l_value %d\n"
 msgstr "%s: panik: ogiltigt l_value %d\n"
@@ -228,17 +233,17 @@ msgstr "%s: panik: ogiltigt l_value %d\n"
 msgid "%s: premature end of file"
 msgstr "%s: för tidigt filslut"
 
-#: posix/getopt.c:661
+#: posix/getopt.c:757
 #, c-format
 msgid "%s: unrecognized option `%c%s'\n"
 msgstr "%s: okänd flagga \"%c%s\"\n"
 
-#: posix/getopt.c:657
+#: posix/getopt.c:753
 #, c-format
 msgid "%s: unrecognized option `--%s'\n"
 msgstr "%s: okänd flagga \"--%s\"\n"
 
-#: time/zic.c:446
+#: time/zic.c:441
 #, c-format
 msgid ""
 "%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d "
@@ -249,7 +254,7 @@ msgstr ""
 "katalog ]\n"
 "\t[ -L skottsekunder ] [ -y årkontrollprogram ] [ filnamn ... ]\n"
 
-#: time/zdump.c:165
+#: time/zdump.c:174
 #, c-format
 msgid "%s: usage is %s [ -v ] [ -c cutoff ] zonename ...\n"
 msgstr "%s: användning är %s [ -v ] [ -c gräns ] zonnamn ...\n"
@@ -263,7 +268,7 @@ msgstr "(okänt fel vid äkthetskontroll - %d)"
 msgid "(unknown)"
 msgstr "(okänt)"
 
-#: catgets/gencat.c:253
+#: catgets/gencat.c:254
 msgid "*standard input*"
 msgstr "*standard in*"
 
@@ -271,21 +276,21 @@ msgstr "*standard in*"
 msgid ".lib section in a.out corrupted"
 msgstr ".lib-sektion i a.out korrupt"
 
-#: inet/rcmd.c:358
+#: inet/rcmd.c:363
 msgid ".rhosts fstat failed"
 msgstr "misslyckades ta status (fstat) på .rhosts"
 
-#: inet/rcmd.c:354
+#: inet/rcmd.c:359
 msgid ".rhosts lstat failed"
 msgstr "misslyckades ta status (lstat) på .rhosts"
 
-#: inet/rcmd.c:356
+#: inet/rcmd.c:361
 msgid ".rhosts not regular file"
 msgstr ".rhosts är inte en normal fil"
 
-#: inet/rcmd.c:362
+#: inet/rcmd.c:367
 msgid ".rhosts writeable by other than owner"
-msgstr ".rhosts kan skrivas av andra än ägaren"
+msgstr ".rhosts är skrivbar för andra än ägaren"
 
 #: sunrpc/clnt_perr.c:112 sunrpc/clnt_perr.c:133
 #, c-format
@@ -296,12 +301,12 @@ msgstr "; undre version = %lu, övre version = %lu"
 msgid "; why = "
 msgstr "; varför = "
 
-#: locale/programs/ld-ctype.c:326
+#: locale/programs/ld-ctype.c:331
 #, c-format
 msgid "<SP> character must not be in class `%s'"
 msgstr "<SP>-tecknet får inte vara i klass \"%s\""
 
-#: locale/programs/ld-ctype.c:317
+#: locale/programs/ld-ctype.c:321
 #, c-format
 msgid "<SP> character not in class `%s'"
 msgstr "<SP>-tecknet är inte i klass \"%s\""
@@ -313,6 +318,10 @@ msgstr "<SP>-tecknet är inte i klass \"%s\""
 msgid "?"
 msgstr "?"
 
+#: sysdeps/unix/sysv/linux/siglist.h:27
+msgid "Aborted"
+msgstr "Avbruten (SIGABRT)"
+
 #: stdio-common/../sysdeps/gnu/errlist.c:762
 msgid "Accessing a corrupted shared library"
 msgstr "Öppnar ett korrupt delat bibliotek"
@@ -320,7 +329,7 @@ msgstr "Öppnar ett korrupt delat bibliotek"
 #. TRANS The requested socket address is already in use.  @xref{Socket Addresses}.
 #: stdio-common/../sysdeps/gnu/errlist.c:354
 msgid "Address already in use"
-msgstr "Adressen används redan"
+msgstr "Adressen upptagen"
 
 #. TRANS The address family specified for a socket is not supported; it is
 #. TRANS inconsistent with the protocol being used on the socket.  @xref{Sockets}.
@@ -332,6 +341,8 @@ msgstr "Adressfamiljen stöds inte av protokollet"
 msgid "Advertise error"
 msgstr "Annonseringsfel"
 
+#: stdio-common/../sysdeps/unix/siglist.c:43
+#: sysdeps/unix/sysv/linux/siglist.h:33
 msgid "Alarm clock"
 msgstr "Alarmklocka"
 
@@ -377,6 +388,11 @@ msgstr "Felaktigt format på typsnittsfil"
 msgid "Bad message"
 msgstr "Felaktigt meddelande"
 
+#: stdio-common/../sysdeps/unix/siglist.c:41
+#: sysdeps/unix/sysv/linux/siglist.h:56
+msgid "Bad system call"
+msgstr "Felaktigt systemanrop"
+
 #. TRANS A file that isn't a block special file was given in a situation that
 #. TRANS requires one.  For example, trying to mount an ordinary file as a file
 #. TRANS system in Unix gives this error.
@@ -384,7 +400,7 @@ msgstr "Felaktigt meddelande"
 msgid "Block device required"
 msgstr "Blockspecialfil krävs"
 
-#: sunrpc/pmap_rmt.c:337
+#: sunrpc/pmap_rmt.c:338
 msgid "Broadcast select problem"
 msgstr "Problem med \"select\" i utsändning"
 
@@ -394,32 +410,37 @@ msgstr "Problem med \"select\" i utsändning"
 #. TRANS or blocked.  Thus, your program will never actually see @code{EPIPE}
 #. TRANS unless it has handled or blocked @code{SIGPIPE}.
 #: stdio-common/../sysdeps/gnu/errlist.c:222
+#: stdio-common/../sysdeps/unix/siglist.c:42
+#: sysdeps/unix/sysv/linux/siglist.h:32
 msgid "Broken pipe"
 msgstr "Brutet rör"
 
+#: stdio-common/../sysdeps/unix/siglist.c:39
+#: sysdeps/unix/sysv/linux/siglist.h:30
 msgid "Bus error"
 msgstr "Bussfel"
 
+#: sysdeps/unix/sysv/linux/siglist.h:43
 msgid "CPU time limit exceeded"
-msgstr "begränsning av CPU-tid överskriden"
+msgstr "Begränsning av CPU-tid överskriden"
 
 #: stdio-common/../sysdeps/gnu/errlist.c:758
 msgid "Can not access a needed shared library"
 msgstr "Kan inte komma åt ett nödvändigt delat bibliotek"
 
-#: nis/ypclnt.c:637
+#: nis/ypclnt.c:695
 msgid "Can't bind to server which serves this domain"
 msgstr "Kan inte ansluta till betjänt som betjänar denna domän"
 
-#: nis/ypclnt.c:649
+#: nis/ypclnt.c:707
 msgid "Can't communicate with portmapper"
 msgstr "Kan inte kommunicera med portmapper"
 
-#: nis/ypclnt.c:651
+#: nis/ypclnt.c:709
 msgid "Can't communicate with ypbind"
 msgstr "Kan inte kommunicera med ypbind"
 
-#: nis/ypclnt.c:653
+#: nis/ypclnt.c:711
 msgid "Can't communicate with ypserv"
 msgstr "Kan inte kommunicera med ypserv"
 
@@ -444,7 +465,7 @@ msgstr "Kan inte skapa uttag (socket) för utsändnings-rpc"
 msgid "Cannot exec a shared library directly"
 msgstr "Kan inte köra ett delat bibliotek direkt"
 
-#: sunrpc/pmap_rmt.c:349
+#: sunrpc/pmap_rmt.c:350
 msgid "Cannot receive reply to broadcast"
 msgstr "Kan inte ta emot svar på utsändning"
 
@@ -463,14 +484,16 @@ msgstr "Kan inte skicka utsändningspaket"
 
 #: sunrpc/pmap_rmt.c:261
 msgid "Cannot set socket option SO_BROADCAST"
-msgstr "Kan inte sätta uttagsflaggan (socket) SO_BROADCAST"
+msgstr "Kan inte sätta uttagsflaggan (socket option) SO_BROADCAST"
 
 #: stdio-common/../sysdeps/gnu/errlist.c:658
 msgid "Channel number out of range"
 msgstr "Kanalnummer utanför giltigt intervall"
 
+#: stdio-common/../sysdeps/unix/siglist.c:49
+#: sysdeps/unix/sysv/linux/siglist.h:39
 msgid "Child exited"
-msgstr "Barnet avslutade"
+msgstr "Barnstatus ändrad"
 
 #: sunrpc/clnt_perr.c:286
 msgid "Client credential too weak"
@@ -485,11 +508,11 @@ msgstr "Kommunikationsfel vid sändning"
 msgid "Computer bought the farm"
 msgstr "Datorn packade ihop"
 
-#: locale/programs/ld-ctype.c:1197
+#: locale/programs/ld-ctype.c:1204
 msgid "Computing table size for character classes might take a while..."
 msgstr "Att beräkna tabellstorlek för teckenklasser kan ta ett tag..."
 
-#: locale/programs/ld-collate.c:327
+#: locale/programs/ld-collate.c:329
 msgid "Computing table size for collation information might take a while..."
 msgstr ""
 "Att beräkna tabellstorlek för kollationeringsinformation kan ta ett tag..."
@@ -513,23 +536,29 @@ msgstr "Förbindelse borttagen av kommunikationspartnern"
 msgid "Connection timed out"
 msgstr "Förbindelsens tid tog slut"
 
+#: stdio-common/../sysdeps/unix/siglist.c:48
+#: sysdeps/unix/sysv/linux/siglist.h:38
 msgid "Continued"
-msgstr "Fortsätter"
+msgstr "Återupptagen"
 
 #: catgets/gencat.c:169 db/makedb.c:120 locale/programs/locale.c:187
-#: locale/programs/localedef.c:177
+#: locale/programs/localedef.c:180
 #, c-format
 msgid ""
 "Copyright (C) %s Free Software Foundation, Inc.\n"
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
 msgstr ""
-"Copyright (C) %s Free Software Foundation, Inc.\n"
+"Copyright © %s Free Software Foundation, Inc.\n"
 "Detta är fri programvara; se källkoden för kopieringsvillkor.  Det finns\n"
 "INGEN garanti; inte ens för SÄLJBARHET eller LÄMPLIGHET FÖR NÅGOT SPECIELLT\n"
 "ÄNDAMÅL.\n"
 
-#: nis/ypclnt.c:663
+#: stdio-common/../sysdeps/unix/siglist.c:53
+msgid "Cputime limit exceeded"
+msgstr "Begränsning av CPU-tid överskriden"
+
+#: nis/ypclnt.c:721
 msgid "Database is busy"
 msgstr "Databasen är upptagen"
 
@@ -571,10 +600,15 @@ msgstr "Katalog inte tom"
 msgid "Disc quota exceeded"
 msgstr "Diskkvot överskriden"
 
-#: nis/ypclnt.c:709
+#: nis/ypclnt.c:767
 msgid "Domain not bound"
 msgstr "Domän inte bunden"
 
+#: stdio-common/../sysdeps/unix/siglist.c:36
+#: sysdeps/unix/sysv/linux/siglist.h:53
+msgid "EMT trap"
+msgstr "Emulatorfälla"
+
 #: sunrpc/clnt_perr.c:254
 #, c-format
 msgid "Error %d"
@@ -598,7 +632,7 @@ msgstr "Växeln full"
 msgid "Exec format error"
 msgstr "Formatfel på körbar fil"
 
-#: locale/programs/localedef.c:213
+#: locale/programs/localedef.c:216
 msgid "FATAL: system does not define `_POSIX2_LOCALEDEF'"
 msgstr "FATALT: systemet definierar inte \"_POSIX2_LOCALEDEF\""
 
@@ -627,6 +661,7 @@ msgstr "Fillåsning gav dödläge"
 msgid "File name too long"
 msgstr "Filnamn för långt"
 
+#: sysdeps/unix/sysv/linux/siglist.h:44
 msgid "File size limit exceeded"
 msgstr "Begränsning av filstorlek överskriden"
 
@@ -635,8 +670,14 @@ msgstr "Begränsning av filstorlek överskriden"
 msgid "File too large"
 msgstr "Fil för stor"
 
+#: stdio-common/../sysdeps/unix/siglist.c:54
+msgid "Filesize limit exceeded"
+msgstr "Begränsning av filstorlek överskriden"
+
+#: stdio-common/../sysdeps/unix/siglist.c:37
+#: sysdeps/unix/sysv/linux/siglist.h:28
 msgid "Floating point exception"
-msgstr "Flyttalsberäkningsfel"
+msgstr "Aritmetiskt fel"
 
 #. TRANS Function not implemented.  Some functions have commands or options defined
 #. TRANS that might not be supported in all implementations, and this is the kind
@@ -650,8 +691,10 @@ msgstr "Funktion inte implementerad"
 msgid "Gratuitous error"
 msgstr "Omotiverat fel"
 
+#: stdio-common/../sysdeps/unix/siglist.c:30
+#: sysdeps/unix/sysv/linux/siglist.h:22
 msgid "Hangup"
-msgstr "Lägg på"
+msgstr "Avringd"
 
 #. TRANS The remote host for a requested network connection is down.
 #: stdio-common/../sysdeps/gnu/errlist.c:457
@@ -662,19 +705,27 @@ msgstr "Värddator är nere"
 msgid "Host name lookup failure"
 msgstr "Uppslagning av värdnamn misslyckades"
 
+#: stdio-common/../sysdeps/unix/siglist.c:52
+#: sysdeps/unix/sysv/linux/siglist.h:42
 msgid "I/O possible"
 msgstr "I/O möjligt"
 
+#: stdio-common/../sysdeps/unix/siglist.c:35
 msgid "IOT trap"
-msgstr "IOT fälla"
+msgstr "IOT-fälla"
 
 #: stdio-common/../sysdeps/gnu/errlist.c:614
 msgid "Identifier removed"
 msgstr "Identifierare borttagen"
 
+#: sysdeps/unix/sysv/linux/siglist.h:25
 msgid "Illegal Instruction"
 msgstr "Otillåten instruktion"
 
+#: stdio-common/../sysdeps/unix/siglist.c:33
+msgid "Illegal instruction"
+msgstr "Otillåten instruktion"
+
 #. TRANS Invalid seek operation (such as on a pipe).
 #: stdio-common/../sysdeps/gnu/errlist.c:201
 msgid "Illegal seek"
@@ -705,23 +756,29 @@ msgstr "Olämplig \"ioctl\" för enhet"
 msgid "Inappropriate operation for background process"
 msgstr "Operation för bakgrundsprocess olämplig"
 
+#: sysdeps/unix/sysv/linux/siglist.h:62
+msgid "Information request"
+msgstr "Informationsbegäran"
+
 #. TRANS Input/output error; usually used for physical read or write errors.
 #: stdio-common/../sysdeps/gnu/errlist.c:40
 msgid "Input/output error"
 msgstr "In/ut-fel"
 
-#: nis/ypclnt.c:643
+#: nis/ypclnt.c:701
 msgid "Internal NIS error"
 msgstr "Internt NIS-fel"
 
-#: nis/ypclnt.c:707
+#: nis/ypclnt.c:765
 msgid "Internal ypbind error"
 msgstr "Internt ypbind-fel"
 
+#: stdio-common/../sysdeps/unix/siglist.c:31
+#: sysdeps/unix/sysv/linux/siglist.h:23
 msgid "Interrupt"
-msgstr "Avbrutet"
+msgstr "Avbruten (SIGINT)"
 
-#. TRANS Interrupted function call; an asynchronous signal occured and prevented
+#. TRANS Interrupted function call; an asynchronous signal occurred and prevented
 #. TRANS completion of the call.  When this happens, you should try the call
 #. TRANS again.
 #. TRANS
@@ -742,11 +799,11 @@ msgstr "Avbrutet systemanrop borde omstartas"
 msgid "Invalid argument"
 msgstr "Ogiltigt argument"
 
-#: posix/regex.c:946
+#: posix/regex.c:960
 msgid "Invalid back reference"
 msgstr "Ogiltig bakåtreferens"
 
-#: posix/regex.c:944
+#: posix/regex.c:958
 msgid "Invalid character class name"
 msgstr "Ogiltigt teckenklassnamn"
 
@@ -758,13 +815,13 @@ msgstr "Ogiltiga klientreferenser"
 msgid "Invalid client verifier"
 msgstr "Ogiltig klientverifierare"
 
-#: posix/regex.c:943
+#: posix/regex.c:957
 msgid "Invalid collation character"
 msgstr "Ogiltigt kollationeringstecken"
 
-#: posix/regex.c:950
+#: posix/regex.c:964
 msgid "Invalid content of \\{\\}"
-msgstr "Ogiltig användning av \\{\\}"
+msgstr "Ogiltigt innehåll i \\{\\}"
 
 #. TRANS An attempt to make an improper link across file systems was detected.
 #. TRANS This happens not only when you use @code{link} (@pxref{Hard Links}) but
@@ -781,17 +838,17 @@ msgstr "Ogiltig växel"
 #. TRANS or an incomplete sequence of bytes or the given wide character is invalid.
 #: stdio-common/../sysdeps/gnu/errlist.c:567
 msgid "Invalid or incomplete multibyte or wide character"
-msgstr "Ogiltig eller inte komplett flerbyte eller brett tecken"
+msgstr "Ogiltig eller inte komplett flerbyte- eller brett tecken"
 
-#: posix/regex.c:953
+#: posix/regex.c:967
 msgid "Invalid preceding regular expression"
 msgstr "Ogiltigt föregående reguljärt uttryck"
 
-#: posix/regex.c:951
+#: posix/regex.c:965
 msgid "Invalid range end"
 msgstr "Ogiltigt intervallslut"
 
-#: posix/regex.c:942
+#: posix/regex.c:956
 msgid "Invalid regular expression"
 msgstr "Ogiltigt reguljärt uttryck"
 
@@ -821,6 +878,8 @@ msgstr "Är en katalog"
 msgid "Is a named type file"
 msgstr "Är en namngiven filtyp"
 
+#: stdio-common/../sysdeps/unix/siglist.c:38
+#: sysdeps/unix/sysv/linux/siglist.h:29
 msgid "Killed"
 msgstr "Dödad"
 
@@ -846,13 +905,13 @@ msgstr "Länken har brutits"
 
 #: stdio-common/../sysdeps/gnu/errlist.c:674
 msgid "Link number out of range"
-msgstr "Länktal utanför giltigt område"
+msgstr "Länkantal utanför giltigt område"
 
-#: nis/ypclnt.c:655
+#: nis/ypclnt.c:713
 msgid "Local domain name not set"
 msgstr "Lokalt domännamn inte satt"
 
-#: nis/ypclnt.c:645
+#: nis/ypclnt.c:703
 msgid "Local resource allocation failure"
 msgstr "Allokeringsfel för lokal resurs"
 
@@ -860,7 +919,7 @@ msgstr "Allokeringsfel för lokal resurs"
 msgid "Machine is not on the network"
 msgstr "Maskinen finns inte på nätverket"
 
-#: posix/regex.c:952
+#: posix/regex.c:966
 msgid "Memory exhausted"
 msgstr "Minnet slut"
 
@@ -874,11 +933,11 @@ msgstr "Meddelandet för långt"
 msgid "Multihop attempted"
 msgstr "Flerhopp försöktes"
 
-#: nis/ypclnt.c:659
+#: nis/ypclnt.c:717
 msgid "NIS client/server version mismatch - can't supply service"
-msgstr "NIS klient/betjänt versionsskillnad - kan inte betjäna"
+msgstr "NIS versionsskillnad klient/betjänt - kan inte betjäna"
 
-#: nis/ypclnt.c:657
+#: nis/ypclnt.c:715
 msgid "NIS map data base is bad"
 msgstr "NIS tabelldatabas är felaktig"
 
@@ -939,7 +998,7 @@ msgstr "Inga barnprocesser"
 
 #: stdio-common/../sysdeps/gnu/errlist.c:622
 msgid "No data available"
-msgstr "Data otillgängligt"
+msgstr "Inga data tillgängliga"
 
 #. TRANS No locks available.  This is used by the file locking facilities; see
 #. TRANS @ref{File Locks}.  This error is never generated by the GNU system, but
@@ -949,7 +1008,7 @@ msgstr "Data otillgängligt"
 msgid "No locks available"
 msgstr "Inga lås tillgängliga"
 
-#: posix/regex.c:941
+#: posix/regex.c:955
 msgid "No match"
 msgstr "Ingen träff"
 
@@ -957,11 +1016,11 @@ msgstr "Ingen träff"
 msgid "No message of desired type"
 msgstr "Inget meddelande av önskad typ"
 
-#: nis/ypclnt.c:647
+#: nis/ypclnt.c:705
 msgid "No more records in map database"
 msgstr "Inga fler poster i tabelldatabasen"
 
-#: posix/regex.c:5204
+#: posix/regex.c:5324
 msgid "No previous regular expression"
 msgstr "Inget föregående reguljärt uttryck"
 
@@ -987,11 +1046,11 @@ msgstr "Enheten är full"
 msgid "No such file or directory"
 msgstr "Filen eller katalogen finns inte"
 
-#: nis/ypclnt.c:641
+#: nis/ypclnt.c:699
 msgid "No such key in map"
 msgstr "Ingen sådan nyckel i tabellen"
 
-#: nis/ypclnt.c:639
+#: nis/ypclnt.c:697
 msgid "No such map in server's domain"
 msgstr "Ingen sådan tabell i betjäntens domän"
 
@@ -1029,7 +1088,7 @@ msgstr "Numeriskt resultat är utanför giltigt område"
 msgid "Object is remote"
 msgstr "Är ett fjärrobjekt"
 
-#: time/zic.c:1939
+#: time/zic.c:1966
 msgid "Odd number of quotation marks"
 msgstr "Ojämnt antal citationstecken"
 
@@ -1091,19 +1150,22 @@ msgid "Package not installed"
 msgstr "Paketet är inte installerat"
 
 #. TRANS Permission denied; the file permissions do not allow the attempted operation.
-#: nis/ypclnt.c:661 stdio-common/../sysdeps/gnu/errlist.c:96
+#: nis/ypclnt.c:719 stdio-common/../sysdeps/gnu/errlist.c:96
 msgid "Permission denied"
 msgstr "Åtkomst nekas"
 
+#: sysdeps/unix/sysv/linux/siglist.h:64
 msgid "Power failure"
-msgstr "Spänningsfall"
+msgstr "Strömavbrott"
 
-#: posix/regex.c:954
+#: posix/regex.c:968
 msgid "Premature end of regular expression"
 msgstr "För tidigt slut på reguljärt uttryck"
 
+#: stdio-common/../sysdeps/unix/siglist.c:56
+#: sysdeps/unix/sysv/linux/siglist.h:46
 msgid "Profiling timer expired"
-msgstr "Profileringstiden tog slut"
+msgstr "Profileringsklocka"
 
 #: stdio-common/../sysdeps/gnu/errlist.c:678
 msgid "Protocol driver not attached"
@@ -1136,8 +1198,10 @@ msgstr "Protokollet stöds ej"
 msgid "Protocol wrong type for socket"
 msgstr "Fel protokolltyp för uttag (socket)"
 
+#: stdio-common/../sysdeps/unix/siglist.c:32
+#: sysdeps/unix/sysv/linux/siglist.h:24
 msgid "Quit"
-msgstr "Sluta"
+msgstr "Lämnad"
 
 #: stdio-common/../sysdeps/gnu/errlist.c:742
 msgid "RFS specific error"
@@ -1148,7 +1212,7 @@ msgstr "RFS-specifikt fel"
 msgid "RPC bad procedure for program"
 msgstr "RPC dålig procedur för program"
 
-#: nis/ypclnt.c:635
+#: nis/ypclnt.c:693
 msgid "RPC failure on NIS operation"
 msgstr "RPC-fel vid NIS-operation"
 
@@ -1214,7 +1278,7 @@ msgstr "RPC: Programmet otillgängligt"
 
 #: sunrpc/clnt_perr.c:183
 msgid "RPC: Program/version mismatch"
-msgstr "RPC: Program/version-inkompabilitet"
+msgstr "RPC: Program/version-inkompatibilitet"
 
 #: sunrpc/clnt_perr.c:189
 msgid "RPC: Remote system error"
@@ -1257,7 +1321,7 @@ msgstr "RTLD_NEXT används i kod som inte är dynamiskt laddad"
 msgid "Read-only file system"
 msgstr "Filsystemet endast läsbart"
 
-#: posix/regex.c:955
+#: posix/regex.c:969
 msgid "Regular expression too big"
 msgstr "Reguljärt uttryck för stort"
 
@@ -1274,11 +1338,13 @@ msgid "Remove password or make file unreadable by others."
 msgstr "Ta bort lösenord eller gör filen oläsbar för andra"
 
 #: catgets/gencat.c:224 db/makedb.c:227 locale/programs/locale.c:257
-#: locale/programs/localedef.c:408
-msgid "Report bugs to <bug-glibc@prep.ai.mit.edu>.\n"
-msgstr "Rapportera fel till <bug-glibc@prep.ai.mit.edu>.\n"
+#: locale/programs/localedef.c:412
+msgid "Report bugs using the `glibcbug' script to <bugs@gnu.ai.mit.edu>.\n"
+msgstr ""
+"Rapportera fel med programmet \"glibcbug\" till <bug-glibc@prep.ai.mit.edu>.\n"
+"Rapportera fel på översättningen till <sv@li.org>.\n"
 
-#: nis/ypclnt.c:633
+#: nis/ypclnt.c:691
 msgid "Request arguments bad"
 msgstr "Argument för förfrågan felaktiga"
 
@@ -1288,7 +1354,7 @@ msgstr "Resolver-fel 0 (inget fel)"
 
 #: resolv/herror.c:117
 msgid "Resolver internal error"
-msgstr "Internt fel i namnlösare"
+msgstr "Internt fel i namnlösare (resolver)"
 
 #. TRANS Deadlock avoided; allocating a system resource would have resulted in a
 #. TRANS deadlock situation.  The system does not guarantee that it will notice
@@ -1298,6 +1364,10 @@ msgstr "Internt fel i namnlösare"
 msgid "Resource deadlock avoided"
 msgstr "Resursdödläge undveks"
 
+#: stdio-common/../sysdeps/unix/siglist.c:58
+msgid "Resource lost"
+msgstr "Förlorad resurs"
+
 #. TRANS Resource temporarily unavailable; the call might work if you try again
 #. TRANS later.  The macro @code{EWOULDBLOCK} is another name for @code{EAGAIN};
 #. TRANS they are always the same in the GNU C library.
@@ -1331,8 +1401,10 @@ msgstr "Resursdödläge undveks"
 msgid "Resource temporarily unavailable"
 msgstr "Resursen tillfälligt otillgänglig"
 
+#: stdio-common/../sysdeps/unix/siglist.c:40
+#: sysdeps/unix/sysv/linux/siglist.h:31
 msgid "Segmentation fault"
-msgstr "Minnessegmentsfel"
+msgstr "Segmenteringsfel"
 
 #: sunrpc/clnt_perr.c:280
 msgid "Server rejected credential"
@@ -1342,6 +1414,10 @@ msgstr "Betjänt förkastade kreditiv"
 msgid "Server rejected verifier"
 msgstr "Betjänt förkastade verifierare"
 
+#: stdio-common/../sysdeps/unix/siglist.c:29
+msgid "Signal 0"
+msgstr "Signal 0"
+
 #. TRANS A file that isn't a socket was specified when a socket is required.
 #: stdio-common/../sysdeps/gnu/errlist.c:299
 msgid "Socket operation on non-socket"
@@ -1361,6 +1437,10 @@ msgstr "Mjukvara orsakade förbindelsebrott"
 msgid "Srmount error"
 msgstr "Srmount-fel"
 
+#: sysdeps/unix/sysv/linux/siglist.h:59
+msgid "Stack fault"
+msgstr "Stackfel"
+
 #. TRANS Stale NFS file handle.  This indicates an internal confusion in the NFS
 #. TRANS system which is due to file system rearrangements on the server host.
 #. TRANS Repairing this condition usually requires unmounting and remounting
@@ -1369,17 +1449,25 @@ msgstr "Srmount-fel"
 msgid "Stale NFS file handle"
 msgstr "Förlegad NFS-filhandtag"
 
+#: stdio-common/../sysdeps/unix/siglist.c:47
+#: sysdeps/unix/sysv/linux/siglist.h:37
 msgid "Stopped"
 msgstr "Stoppad"
 
+#: stdio-common/../sysdeps/unix/siglist.c:46
+#: sysdeps/unix/sysv/linux/siglist.h:36
 msgid "Stopped (signal)"
 msgstr "Stoppad (signal)"
 
+#: stdio-common/../sysdeps/unix/siglist.c:50
+#: sysdeps/unix/sysv/linux/siglist.h:40
 msgid "Stopped (tty input)"
-msgstr "Stoppad (tty-läsning)"
+msgstr "Stoppad (terminalläsning)"
 
+#: stdio-common/../sysdeps/unix/siglist.c:51
+#: sysdeps/unix/sysv/linux/siglist.h:41
 msgid "Stopped (tty output)"
-msgstr "Stoppad (tty-skrivning)"
+msgstr "Stoppad (terminalskrivning)"
 
 #: stdio-common/../sysdeps/gnu/errlist.c:778
 msgid "Streams pipe error"
@@ -1389,17 +1477,19 @@ msgstr "Streams-rörfel"
 msgid "Structure needs cleaning"
 msgstr "Strukturen behöver städas"
 
-#: nis/ypclnt.c:631 nis/ypclnt.c:705 posix/regex.c:940
+#: nis/ypclnt.c:689 nis/ypclnt.c:763 posix/regex.c:954
 #: stdio-common/../sysdeps/gnu/errlist.c:7
 msgid "Success"
 msgstr "Lyckat"
 
-#: nis/ypclnt.c:711
+#: nis/ypclnt.c:769
 msgid "System resource allocation failure"
 msgstr "Allokeringsfel för systemresurs"
 
+#: stdio-common/../sysdeps/unix/siglist.c:44
+#: sysdeps/unix/sysv/linux/siglist.h:34
 msgid "Terminated"
-msgstr "Terminerad"
+msgstr "Avslutad"
 
 #. TRANS An attempt to execute a file that is currently open for writing, or
 #. TRANS write to a file that is currently being executed.  Often using a
@@ -1412,7 +1502,7 @@ msgstr "Kodfil upptagen"
 
 #: stdio-common/../sysdeps/gnu/errlist.c:650
 msgid "Timer expired"
-msgstr "Tidtagning avslutad"
+msgstr "Klockan ringde"
 
 #. TRANS Too many levels of symbolic links were encountered in looking up a file name.
 #. TRANS This often indicates a cycle of symbolic links.
@@ -1463,12 +1553,17 @@ msgstr "För många referenser: kan inte skarva"
 msgid "Too many users"
 msgstr "För många användare"
 
+#: stdio-common/../sysdeps/unix/siglist.c:34
+msgid "Trace/BPT trap"
+msgstr "Spårning/BPT-fälla"
+
+#: sysdeps/unix/sysv/linux/siglist.h:26
 msgid "Trace/breakpoint trap"
-msgstr "Spårning/brytpunktsfälla"
+msgstr "Spårningsfälla"
 
-#: posix/regex.c:945
+#: posix/regex.c:959
 msgid "Trailing backslash"
-msgstr "Felplacerat omvänt snedstreck"
+msgstr "Avslutande omvänt snedstreck"
 
 #. TRANS In the GNU system, opening a file returns this error when the file is
 #. TRANS translated by a program and the translator program dies while starting
@@ -1492,12 +1587,12 @@ msgid "Transport endpoint is not connected"
 msgstr "Transportslutpunkten är inte förbunden"
 
 #: catgets/gencat.c:208 db/makedb.c:209 locale/programs/locale.c:241
-#: locale/programs/localedef.c:389
+#: locale/programs/localedef.c:393
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Försök med \"%s --help\" för mer information\n"
 
-#: inet/rcmd.c:136
+#: inet/rcmd.c:137
 #, c-format
 msgid "Trying %s...\n"
 msgstr "Provar %s...\n"
@@ -1507,7 +1602,7 @@ msgstr "Provar %s...\n"
 msgid "Unknown .netrc keyword %s"
 msgstr "Okänt .netrc-nyckelord %s"
 
-#: nis/ypclnt.c:665
+#: nis/ypclnt.c:723
 msgid "Unknown NIS error code"
 msgstr "Okänd NIS-felkod"
 
@@ -1522,38 +1617,38 @@ msgstr "Okänd värd"
 
 #: resolv/herror.c:120
 msgid "Unknown resolver error"
-msgstr "Okänt fel hos namnlösare"
+msgstr "Okänt fel hos namnlösare (resolver)"
 
 #: resolv/herror.c:76
 msgid "Unknown server error"
-msgstr "Okänt fel hos tjänsteställe"
+msgstr "Okänt fel hos betjänt"
 
 #: string/strsignal.c:41
 #, c-format
 msgid "Unknown signal %d"
 msgstr "Okänd signal %d"
 
-#: misc/error.c:95
+#: misc/error.c:100
 msgid "Unknown system error"
 msgstr "Okänt systemfel"
 
-#: nis/ypclnt.c:713
+#: nis/ypclnt.c:771
 msgid "Unknown ypbind error"
 msgstr "Okänt ypbind-fel"
 
-#: posix/regex.c:948
+#: posix/regex.c:962
 msgid "Unmatched ( or \\("
 msgstr "Obalanserade ( eller \\("
 
-#: posix/regex.c:956
+#: posix/regex.c:970
 msgid "Unmatched ) or \\)"
 msgstr "Obalanserade ) eller \\)"
 
-#: posix/regex.c:947
+#: posix/regex.c:961
 msgid "Unmatched [ or [^"
 msgstr "Obalanserade [ eller [^"
 
-#: posix/regex.c:949
+#: posix/regex.c:963
 msgid "Unmatched \\{"
 msgstr "Obalanserad \\{"
 
@@ -1562,6 +1657,8 @@ msgstr "Obalanserad \\{"
 msgid "Unrecognized variable `%s'"
 msgstr "Okänd variabel \"%s\""
 
+#: stdio-common/../sysdeps/unix/siglist.c:45
+#: sysdeps/unix/sysv/linux/siglist.h:35
 msgid "Urgent I/O condition"
 msgstr "Viktigt I/O-tillstånd"
 
@@ -1619,7 +1716,7 @@ msgstr ""
 "  -V, --version       visa versionsinformation och avsluta\n"
 "Om INFIL är -, läs indata från standard in\n"
 
-#: locale/programs/localedef.c:393
+#: locale/programs/localedef.c:397
 #, c-format
 msgid ""
 "Usage: %s [OPTION]... name\n"
@@ -1638,8 +1735,7 @@ msgid ""
 "                       locale files  : %s\n"
 msgstr ""
 "Användning: %s [FLAGGA]... namn\n"
-"Obligatoriska argument till långa flaggor är obligatoriska även för de "
-"korta.\n"
+"Obligatoriska argument till långa flaggor är obligatoriska även för de korta.\n"
 "  -c, --force               skapa resultatfil även om varningar gavs\n"
 "  -h, --help                visa denna hjälptext och avsluta\n"
 "  -f, --charmap=FIL         symboliska teckennamn definieras i FIL\n"
@@ -1651,7 +1747,7 @@ msgstr ""
 "      --posix               följ POSIX strikt\n"
 "\n"
 "Systemets katalog för teckenuppsättningar: %s\n"
-"                      meddelandekataloger: %s\n"
+"                               lokalfiler: %s\n"
 
 #: locale/programs/locale.c:245
 #, c-format
@@ -1688,9 +1784,13 @@ msgstr "Användning: %s variabelnamn [sökväg]\n"
 msgid "Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]\n"
 msgstr "Användning: rpcinfo [ -n portnr ] -u värd prognr [ versnr ]\n"
 
+#: stdio-common/../sysdeps/unix/siglist.c:59
+#: sysdeps/unix/sysv/linux/siglist.h:48
 msgid "User defined signal 1"
 msgstr "Användarsignal 1"
 
+#: stdio-common/../sysdeps/unix/siglist.c:60
+#: sysdeps/unix/sysv/linux/siglist.h:49
 msgid "User defined signal 2"
 msgstr "Användarsignal 2"
 
@@ -1698,36 +1798,40 @@ msgstr "Användarsignal 2"
 msgid "Value too large for defined data type"
 msgstr "Värdet för stort för definierad datatyp"
 
+#: stdio-common/../sysdeps/unix/siglist.c:55
+#: sysdeps/unix/sysv/linux/siglist.h:45
 msgid "Virtual timer expired"
-msgstr "Virtuell tidtagare löpte ut"
+msgstr "Alarmklocka - virtuell tid"
 
-#: time/zic.c:1844
+#: time/zic.c:1871
 msgid "Wild result from command execution"
 msgstr "Vilt resultat från kommandokörning"
 
+#: stdio-common/../sysdeps/unix/siglist.c:57
+#: sysdeps/unix/sysv/linux/siglist.h:47
 msgid "Window changed"
-msgstr "Fönstret ändrades"
+msgstr "Ändrat fönster"
 
 #: catgets/gencat.c:174 db/makedb.c:125 locale/programs/locale.c:192
-#: locale/programs/localedef.c:182
+#: locale/programs/localedef.c:185
 #, c-format
 msgid "Written by %s.\n"
 msgstr "Skriven av %s.\n"
 
-#: nis/ypclnt.c:146
+#: nis/ypclnt.c:142
 msgid "YPBINDPROC_DOMAIN: Internal error\n"
 msgstr "YPBINDPROC_DOMAIN: Internt fel\n"
 
-#: nis/ypclnt.c:150
+#: nis/ypclnt.c:146
 #, c-format
 msgid "YPBINDPROC_DOMAIN: No server for domain %s\n"
 msgstr "YPBINDPROC_DOMAIN: Ingen betjänt för domän %s\n"
 
-#: nis/ypclnt.c:154
+#: nis/ypclnt.c:150
 msgid "YPBINDPROC_DOMAIN: Resource allocation failure\n"
-msgstr "YPBINDPROC_DOMAIN: Allokeringsfel för resurs\n"
+msgstr "YPBINDPROC_DOMAIN: Resursallokeringsfel\n"
 
-#: nis/ypclnt.c:158
+#: nis/ypclnt.c:154
 msgid "YPBINDPROC_DOMAIN: Unknown error\n"
 msgstr "YPBINDPROC_DOMAIN: Okänt fel\n"
 
@@ -1736,31 +1840,31 @@ msgstr "YPBINDPROC_DOMAIN: Okänt fel\n"
 msgid "You really blew it this time"
 msgstr "Du strulade till det den här gången"
 
-#: time/zic.c:1050
+#: time/zic.c:1048
 msgid "Zone continuation line end time is not after end time of previous line"
 msgstr ""
 "Zon-fortsättningsradens sluttid är inte efter sluttiden på föregående rad"
 
-#: locale/programs/charmap.c:397 locale/programs/locfile.c:341
+#: locale/programs/charmap.c:397 locale/programs/locfile.c:363
 #, c-format
 msgid "`%1$s' definition does not end with `END %1$s'"
 msgstr "\"%1$s\" definition slutar ej med \"END %1$s\""
 
-#: locale/programs/ld-monetary.c:358 locale/programs/ld-numeric.c:190
+#: locale/programs/ld-monetary.c:359 locale/programs/ld-numeric.c:190
 #, c-format
 msgid "`-1' must be last entry in `%s' field in `%s' category"
 msgstr "\"-1\" måste vara sista post i fält \"%s\" i kategori \"%s\""
 
-#: locale/programs/ld-collate.c:1652
+#: locale/programs/ld-collate.c:1655
 msgid "`...' must only be used in `...' and `UNDEFINED' entries"
 msgstr "\"...\" får endast användas för post \"...\" och post \"UNDEFINED\""
 
-#: locale/programs/locfile.c:538
+#: locale/programs/locfile.c:560
 msgid "`from' expected after first argument to `collating-element'"
 msgstr ""
 "\"from\" förväntades efter första argumentet till \"collating-element\""
 
-#: locale/programs/ld-collate.c:1109
+#: locale/programs/ld-collate.c:1112
 msgid ""
 "`from' string in collation element declaration contains unknown character"
 msgstr ""
@@ -1772,36 +1876,36 @@ msgstr ""
 msgid "argument to <%s> must be a single character"
 msgstr "argumentet till <%s> måste vara ett enskilt tecken"
 
-#: locale/programs/locfile.c:215
+#: locale/programs/locfile.c:237
 #, c-format
 msgid "argument to `%s' must be a single character"
 msgstr "argumentet till \"%s\" måste vara ett enskilt tecken"
 
-#: sunrpc/auth_unix.c:322
+#: sunrpc/auth_unix.c:323
 msgid "auth_none.c - Fatal marshalling problem"
 msgstr "auth_none.c - Fatalt kodningsproblem"
 
-#: inet/rcmd.c:360
+#: inet/rcmd.c:365
 msgid "bad .rhosts owner"
-msgstr "dålig .rhosts-ägare"
+msgstr "olämplig ägare av .rhosts"
 
-#: locale/programs/charmap.c:212 locale/programs/locfile.c:209
+#: locale/programs/charmap.c:212 locale/programs/locfile.c:231
 msgid "bad argument"
 msgstr "dåligt argument"
 
-#: time/zic.c:1172
+#: time/zic.c:1170
 msgid "blank FROM field on Link line"
 msgstr "tomt \"FROM\"-fält på \"Link\"-rad"
 
-#: time/zic.c:1176
+#: time/zic.c:1174
 msgid "blank TO field on Link line"
 msgstr "tomt \"TO\"-fält på \"Link\"-rad"
 
-#: malloc/mcheck.c:189
+#: malloc/mcheck.c:191
 msgid "block freed twice"
 msgstr "block avallokerat två gånger"
 
-#: malloc/mcheck.c:192
+#: malloc/mcheck.c:194
 msgid "bogus mcheck_status, library is buggy"
 msgstr "felaktig mcheck_status, biblioteket är felaktigt"
 
@@ -1817,31 +1921,31 @@ msgstr "utsändning: ioctl (hämta gränssnittsflaggor)"
 msgid "cache_set: victim not found"
 msgstr "cache_set: offer hittades ej"
 
-#: time/zic.c:1685
-msgid "can't determine time zone abbrevation to use just after until time"
+#: time/zic.c:1698
+msgid "can't determine time zone abbreviation to use just after until time"
 msgstr ""
 "kan inte avgöra tidszonsförkortning att använda just efter \"until\"-tid"
 
 #: sunrpc/svc_simple.c:64
 #, c-format
 msgid "can't reassign procedure number %d\n"
-msgstr "kan inte återtilldela procedurnummer %d\n"
+msgstr "kan inte ändra procedurnummer %d\n"
 
-#: locale/programs/localedef.c:287
+#: locale/programs/localedef.c:291
 #, c-format
 msgid "cannot `stat' locale file `%s'"
 msgstr "kan inte ta status på lokalfil \"%s\""
 
-#: locale/programs/ld-collate.c:1314
+#: locale/programs/ld-collate.c:1317
 #, c-format
 msgid "cannot insert collation element `%.*s'"
 msgstr "kan inte sätta in kollationselement \"%.*s\""
 
-#: locale/programs/ld-collate.c:1493 locale/programs/ld-collate.c:1498
+#: locale/programs/ld-collate.c:1496 locale/programs/ld-collate.c:1501
 msgid "cannot insert into result table"
 msgstr "kan inte sätta in i resultattabell"
 
-#: locale/programs/ld-collate.c:1166 locale/programs/ld-collate.c:1208
+#: locale/programs/ld-collate.c:1169 locale/programs/ld-collate.c:1211
 #, c-format
 msgid "cannot insert new collating symbol definition: %s"
 msgstr "kan inte sätta in ny kollationssymbolsdefinition: %s"
@@ -1851,84 +1955,84 @@ msgstr "kan inte sätta in ny kollationssymbolsdefinition: %s"
 msgid "cannot open database file `%s': %s"
 msgstr "kan inte öppna databasfil \"%s\": %s"
 
-#: catgets/gencat.c:259 db/makedb.c:180
+#: catgets/gencat.c:260 db/makedb.c:180
 #, c-format
 msgid "cannot open input file `%s'"
 msgstr "kan inte öppna infil \"%s\""
 
-#: locale/programs/localedef.c:221
+#: locale/programs/localedef.c:224
 #, c-format
 msgid "cannot open locale definition file `%s'"
 msgstr "kan inte öppna lokaldefinitionsfil \"%s\""
 
-#: catgets/gencat.c:764 catgets/gencat.c:805 db/makedb.c:189
+#: catgets/gencat.c:765 catgets/gencat.c:806 db/makedb.c:189
 #, c-format
 msgid "cannot open output file `%s'"
 msgstr "kan inte öppna utfil \"%s\""
 
-#: locale/programs/locfile.c:986
+#: locale/programs/locfile.c:1008
 #, c-format
 msgid "cannot open output file `%s' for category `%s'"
 msgstr "kan inte öppna utfil \"%s\" för kategori \"%s\""
 
-#: locale/programs/ld-collate.c:1360
+#: locale/programs/ld-collate.c:1363
 msgid "cannot process order specification"
 msgstr "kan inte bearbeta sorteringsspecifikation"
 
-#: locale/programs/locale.c:303
+#: locale/programs/locale.c:304
 #, c-format
 msgid "cannot read character map directory `%s'"
 msgstr "kan inte läsa teckenuppsättningskatalog \"%s\""
 
-#: locale/programs/locale.c:278
+#: locale/programs/locale.c:279
 #, c-format
 msgid "cannot read locale directory `%s'"
 msgstr "kan inte läsa lokalkatalog \"%s\""
 
-#: locale/programs/localedef.c:309
+#: locale/programs/localedef.c:313
 #, c-format
 msgid "cannot read locale file `%s'"
 msgstr "kan inte läsa lokalfil \"%s\""
 
-#: locale/programs/localedef.c:334
+#: locale/programs/localedef.c:338
 #, c-format
 msgid "cannot write output files to `%s'"
 msgstr "kan inte skriva utfiler till \"%s\""
 
-#: locale/programs/localedef.c:377
+#: locale/programs/localedef.c:381
 msgid "category data requested more than once: should not happen"
 msgstr "kategoridata begärd mer än en gång: borde inte inträffa"
 
-#: locale/programs/ld-ctype.c:265
+#: locale/programs/ld-ctype.c:266
 #, c-format
 msgid "character %s'%s' in class `%s' must be in class `%s'"
 msgstr "tecknet %s\"%s\" i klass \"%s\" måste vara i klass \"%s\""
 
-#: locale/programs/ld-ctype.c:289
+#: locale/programs/ld-ctype.c:291
 #, c-format
 msgid "character %s'%s' in class `%s' must not be in class `%s'"
 msgstr "tecknet %s\"%s\" i klass \"%s\" kan inte vara i klass \"%s\""
 
-#: locale/programs/ld-ctype.c:310
+#: locale/programs/ld-ctype.c:313
 msgid "character <SP> not defined in character map"
 msgstr "tecknet <SP> inte definierat i teckenuppsättning"
 
-#: locale/programs/ld-ctype.c:939 locale/programs/ld-ctype.c:1002
-#: locale/programs/ld-ctype.c:1010 locale/programs/ld-ctype.c:1018
-#: locale/programs/ld-ctype.c:1026 locale/programs/ld-ctype.c:1034
-#: locale/programs/ld-ctype.c:1042 locale/programs/ld-ctype.c:1068
-#: locale/programs/ld-ctype.c:1076 locale/programs/ld-ctype.c:1114
-#: locale/programs/ld-ctype.c:1141 locale/programs/ld-ctype.c:1152
+#: locale/programs/ld-ctype.c:944 locale/programs/ld-ctype.c:1007
+#: locale/programs/ld-ctype.c:1015 locale/programs/ld-ctype.c:1023
+#: locale/programs/ld-ctype.c:1031 locale/programs/ld-ctype.c:1039
+#: locale/programs/ld-ctype.c:1047 locale/programs/ld-ctype.c:1073
+#: locale/programs/ld-ctype.c:1081 locale/programs/ld-ctype.c:1119
+#: locale/programs/ld-ctype.c:1146 locale/programs/ld-ctype.c:1157
 #, c-format
 msgid "character `%s' not defined while needed as default value"
 msgstr "tecknet \"%s\" inte definierat men behövs som standardvärde"
 
-#: locale/programs/ld-ctype.c:801
+#: locale/programs/ld-ctype.c:806
 #, c-format
 msgid "character class `%s' already defined"
 msgstr "teckenklass \"%s\" redan definierad"
 
-#: locale/programs/ld-ctype.c:833
+#: locale/programs/ld-ctype.c:838
 #, c-format
 msgid "character map `%s' already defined"
 msgstr "teckenuppsättning \"%s\" redan definierad"
@@ -1936,28 +2040,28 @@ msgstr "teckenuppsättning \"%s\" redan definierad"
 #: locale/programs/charmap.c:76
 #, c-format
 msgid "character map file `%s' not found"
-msgstr "teckenuppsättningsfil \"%s\" inte funnen"
+msgstr "teckenuppsättningsfil \"%s\" finns inte"
 
 #: sunrpc/clnt_raw.c:106
 msgid "clnt_raw.c - Fatal header serialization error."
-msgstr "clnt_raw.c - Fatalt fel vid serialisation."
+msgstr "clnt_raw.c - Fatalt fel vid serialisering"
 
-#: locale/programs/ld-collate.c:1329
+#: locale/programs/ld-collate.c:1332
 #, c-format
 msgid "collation element `%.*s' appears more than once: ignore line"
 msgstr "kollationselement \"%.*s\" finns mer än en gång: rad ignorerad"
 
-#: locale/programs/ld-collate.c:1347
+#: locale/programs/ld-collate.c:1350
 #, c-format
 msgid "collation symbol `%.*s' appears more than once: ignore line"
 msgstr "kollationssymbol \"%.*s\" finns mer än en gång: rad ignorerad"
 
-#: locale/programs/locfile.c:522
+#: locale/programs/locfile.c:544
 #, c-format
 msgid "collation symbol expected after `%s'"
 msgstr "kollationssymbol förväntades efter \"%s\""
 
-#: inet/rcmd.c:129
+#: inet/rcmd.c:130
 #, c-format
 msgid "connect to address %s: "
 msgstr "koppla till adress %s: "
@@ -1981,9 +2085,7 @@ msgstr "standardteckenuppsättningsfil \"%s\" inte hittad"
 msgid ""
 "direction flag in string %d in `era' field in category `%s' is not '+' nor "
 "'-'"
-msgstr ""
-"riktningsflagga i sträng %d i \"era\"-fält i kategori \"%s\" är inte \"+\" "
-"eller \"-\""
+msgstr "riktningsflagga i sträng %d i \"era\"-fält i kategori \"%s\" är varken \"+\" eller \"-\""
 
 #: locale/programs/ld-time.c:164
 #, c-format
@@ -1999,37 +2101,37 @@ msgstr ""
 msgid "duplicate character name `%s'"
 msgstr "duplicerat teckennamn \"%s\""
 
-#: locale/programs/ld-collate.c:1141
+#: locale/programs/ld-collate.c:1144
 msgid "duplicate collating element definition"
 msgstr "dubbla definitioner av kollationselement"
 
-#: locale/programs/ld-collate.c:1287
+#: locale/programs/ld-collate.c:1290
 #, c-format
 msgid "duplicate definition for character `%.*s'"
 msgstr "dubbla definitioner för tecken \"%.*s\""
 
-#: db/makedb.c:310
+#: db/makedb.c:311
 msgid "duplicate key"
 msgstr "duplicerad nyckel"
 
-#: catgets/gencat.c:378
+#: catgets/gencat.c:379
 msgid "duplicate set definition"
-msgstr "duplicerad definition av uppsättning"
+msgstr "duplicerad definition av mängd"
 
-#: time/zic.c:965
+#: time/zic.c:963
 #, c-format
 msgid "duplicate zone name %s (file \"%s\", line %d)"
 msgstr "duplicerat zonnamn %s (fil \"%s\", rad %d)"
 
-#: catgets/gencat.c:541
+#: catgets/gencat.c:542
 msgid "duplicated message identifier"
 msgstr "duplicerad meddelandeidentifierare"
 
-#: catgets/gencat.c:514
+#: catgets/gencat.c:515
 msgid "duplicated message number"
 msgstr "duplicerat meddelandenummer"
 
-#: locale/programs/ld-collate.c:1696
+#: locale/programs/ld-collate.c:1699
 msgid "empty weight name: line ignored"
 msgstr "tomt viktnamn: rad ignorerad"
 
@@ -2049,42 +2151,46 @@ msgstr "enablecache: kunde inte allokera cache-data"
 msgid "enablecache: could not allocate cache fifo"
 msgstr "enablecache: kunde inte allokera cache-fifo"
 
-#: locale/programs/ld-collate.c:1419
+#: locale/programs/ld-collate.c:1422
 msgid "end point of ellipsis range is bigger then start"
 msgstr "slutpunkt för ... är större än startvärdet"
 
-#: locale/programs/ld-collate.c:1149
+#: locale/programs/ld-collate.c:1152
 msgid "error while inserting collation element into hash table"
 msgstr "fel vid insättning av kollationselement i hashtabellen"
 
-#: locale/programs/ld-collate.c:1161
+#: locale/programs/ld-collate.c:1164
 msgid "error while inserting to hash table"
-msgstr "fel vis insättning till hashtabellen"
+msgstr "fel vid insättning i hashtabellen"
 
-#: locale/programs/locfile.c:465
+#: locale/programs/locfile.c:487
 msgid "expect string argument for `copy'"
 msgstr "förväntar strängargument för \"copy\""
 
-#: time/zic.c:856
+#: time/zic.c:854
 msgid "expected continuation line not found"
 msgstr "förväntad fortsättningsrad ej funnen"
 
-#: locale/programs/locfile.c:1010
+#: locale/programs/locfile.c:1032
 #, c-format
 msgid "failure while writing data for category `%s'"
 msgstr "misslyckades skriva data för kategori \"%s\""
 
-#: locale/programs/ld-monetary.c:154 locale/programs/ld-numeric.c:95
+#: nis/ypclnt.c:187
+msgid "fcntl: F_SETFD"
+msgstr "fcntl_ F_SETFD"
+
+#: locale/programs/ld-monetary.c:155 locale/programs/ld-numeric.c:95
 #, c-format
 msgid "field `%s' in category `%s' not defined"
-msgstr "fält \"%s\" i kategori \"%s\" inte definierad"
+msgstr "fält \"%s\" i kategori \"%s\" inte definierat"
 
 #: locale/programs/ld-messages.c:81 locale/programs/ld-messages.c:102
 #, c-format
 msgid "field `%s' in category `%s' undefined"
-msgstr "fält \"%s\" i kategori \"%s\" odefinierad"
+msgstr "fält \"%s\" i kategori \"%s\" odefinierat"
 
-#: locale/programs/locfile.c:547
+#: locale/programs/locfile.c:569
 msgid "from-value of `collating-element' must be a string"
 msgstr "frånvärde för \"collating-element\" måste vara en sträng"
 
@@ -2093,7 +2199,7 @@ msgid "garbage at end of character code specification"
 msgstr "skräp i slutet av teckenkodsspecifikation"
 
 #: locale/programs/linereader.c:214
-msgid "garbage at end of digit"
+msgid "garbage at end of number"
 msgstr "skräp i slutet av nummer"
 
 #: locale/programs/ld-time.c:183
@@ -2110,7 +2216,7 @@ msgid ""
 msgstr ""
 "skräp i slutet av startdatum i sträng %d i \"era\"-fält i kategori \"%s\""
 
-#: locale/programs/ld-time.c:310
+#: locale/programs/ld-time.c:311
 #, c-format
 msgid ""
 "garbage at end of stopping date in string %d in `era' field in category `%s'"
@@ -2121,19 +2227,19 @@ msgstr ""
 msgid "get_myaddress: ioctl (get interface configuration)"
 msgstr "get_myaddress: ioctl (hämta gränssnittskonfiguration)"
 
-#: time/zic.c:1149
+#: time/zic.c:1147
 msgid "illegal CORRECTION field on Leap line"
 msgstr "otillåtet \"CORRECTION\"-fält på \"Leap\"-rad"
 
-#: time/zic.c:1153
+#: time/zic.c:1151
 msgid "illegal Rolling/Stationary field on Leap line"
 msgstr "otillåtet \"Rolling/Stationary\"-fält på \"Leap\"-rad"
 
-#: locale/programs/ld-collate.c:1767
+#: locale/programs/ld-collate.c:1770
 msgid "illegal character constant in string"
 msgstr "otillåten teckenkonstant i sträng"
 
-#: locale/programs/ld-collate.c:1116
+#: locale/programs/ld-collate.c:1119
 msgid "illegal collation element"
 msgstr "otillåtet kollationselement"
 
@@ -2151,7 +2257,7 @@ msgstr "otillåten teckensekvens vid strängslut"
 
 #: locale/programs/charset.c:101
 msgid "illegal names for character range"
-msgstr "otillåtna namn för teckenomfång"
+msgstr "otillåtna namn för teckenintervall"
 
 #: locale/programs/ld-time.c:176
 #, c-format
@@ -2159,26 +2265,26 @@ msgid "illegal number for offset in string %d in `era' field in category `%s'"
 msgstr ""
 "otillåtet tal för tilläggsvärde i sträng %d i \"era\"-fält i kategori \"%s\""
 
-#: catgets/gencat.c:351 catgets/gencat.c:428
+#: catgets/gencat.c:352 catgets/gencat.c:429
 msgid "illegal set number"
-msgstr "otillåtet tal för uppsättning"
+msgstr "otillåtet tal för mängd"
 
 #: locale/programs/ld-time.c:230
 #, c-format
 msgid "illegal starting date in string %d in `era' field in category `%s'"
 msgstr "otillåtet startdatum i sträng %d i \"era\"-fält i kategori \"%s\""
 
-#: locale/programs/ld-time.c:302
+#: locale/programs/ld-time.c:303
 #, c-format
 msgid "illegal stopping date in string %d in `era' field in category `%s'"
 msgstr "otillåtet slutdatum i sträng %d i \"era\"-fält i kategori \"%s\""
 
-#: locale/programs/ld-ctype.c:807
+#: locale/programs/ld-ctype.c:812
 #, c-format
 msgid "implementation limit: no more than %d character classes allowed"
-msgstr "implementationsbegränsning: inte fler än %d teckenklasser tillåtet"
+msgstr "implementationsbegränsning: inte fler än %d teckenklasser tillåtna"
 
-#: locale/programs/ld-ctype.c:839
+#: locale/programs/ld-ctype.c:844
 #, c-format
 msgid "implementation limit: no more than %d character maps allowed"
 msgstr ""
@@ -2188,60 +2294,60 @@ msgstr ""
 msgid "incorrectly formatted file"
 msgstr "felaktigt formaterad rad"
 
-#: time/zic.c:814
+#: time/zic.c:811
 msgid "input line of unknown type"
 msgstr "inrad av okänd typ"
 
-#: time/zic.c:1733
+#: time/zic.c:1760
 msgid "internal error - addtype called with bad isdst"
 msgstr "internt fel - addtype anropad med felaktig isdst"
 
-#: time/zic.c:1741
+#: time/zic.c:1768
 msgid "internal error - addtype called with bad ttisgmt"
 msgstr "internt fel - addtype anropad med felaktig ttisgmt"
 
-#: time/zic.c:1737
+#: time/zic.c:1764
 msgid "internal error - addtype called with bad ttisstd"
 msgstr "internt fel - addtype anropad med felaktig ttisstd"
 
-#: locale/programs/ld-ctype.c:301
+#: locale/programs/ld-ctype.c:304
 #, c-format
 msgid "internal error in %s, line %u"
 msgstr "internt fel i %s, rad %u"
 
-#: time/zic.c:1021
+#: time/zic.c:1019
 msgid "invalid GMT offset"
-msgstr "ogiltigt tilläggsvärde till GMT"
+msgstr "ogiltigt GMT-tillägg"
 
-#: time/zic.c:1024
+#: time/zic.c:1022
 msgid "invalid abbreviation format"
 msgstr "ogiltigt förkortningsformat"
 
-#: time/zic.c:1114 time/zic.c:1313 time/zic.c:1327
+#: time/zic.c:1112 time/zic.c:1313 time/zic.c:1327
 msgid "invalid day of month"
 msgstr "ogiltig dag i månaden"
 
-#: time/zic.c:1272
+#: time/zic.c:1270
 msgid "invalid ending year"
 msgstr "ogiltigt slutår"
 
-#: time/zic.c:1086
+#: time/zic.c:1084
 msgid "invalid leaping year"
 msgstr "ogiltigt skottår"
 
-#: time/zic.c:1101 time/zic.c:1204
+#: time/zic.c:1099 time/zic.c:1202
 msgid "invalid month name"
 msgstr "ogiltigt månadsnamn"
 
-#: time/zic.c:920
+#: time/zic.c:918
 msgid "invalid saved time"
 msgstr "ogiltigt sparad tid"
 
-#: time/zic.c:1252
+#: time/zic.c:1250
 msgid "invalid starting year"
 msgstr "ogiltigt startår"
 
-#: time/zic.c:1130 time/zic.c:1232
+#: time/zic.c:1128 time/zic.c:1230
 msgid "invalid time of day"
 msgstr "ogiltig tid på dagen"
 
@@ -2249,61 +2355,61 @@ msgstr "ogiltig tid på dagen"
 msgid "invalid weekday name"
 msgstr "ogiltigt veckodagsnamn"
 
-#: locale/programs/ld-collate.c:1412
+#: locale/programs/ld-collate.c:1415
 msgid "line after ellipsis must contain character definition"
 msgstr "rad efter ... måste innehålla teckendefinition"
 
-#: locale/programs/ld-collate.c:1391
+#: locale/programs/ld-collate.c:1394
 msgid "line before ellipsis does not contain definition for character constant"
 msgstr "rad före ... innehåller inte definition för teckenkonstant"
 
-#: time/zic.c:794
+#: time/zic.c:791
 msgid "line too long"
-msgstr "rad för lång"
+msgstr "för lång rad"
 
-#: locale/programs/localedef.c:281
+#: locale/programs/localedef.c:285
 #, c-format
 msgid "locale file `%s', used in `copy' statement, not found"
 msgstr "lokalfil \"%s\", använd i \"copy\", inte funnen"
 
-#: catgets/gencat.c:609
+#: catgets/gencat.c:610
 msgid "malformed line ignored"
 msgstr "felaktig rad ignorerad"
 
-#: malloc/mcheck.c:183
+#: malloc/mcheck.c:185
 msgid "memory clobbered before allocated block"
 msgstr "minnet förstört före allokerat block"
 
-#: malloc/mcheck.c:186
+#: malloc/mcheck.c:188
 msgid "memory clobbered past end of allocated block"
 msgstr "minnet förstört efter slutet på allokerat block"
 
 #: locale/programs/ld-collate.c:167 locale/programs/ld-collate.c:173
-#: locale/programs/ld-collate.c:177 locale/programs/ld-collate.c:1439
-#: locale/programs/ld-collate.c:1468 locale/programs/locfile.c:940
+#: locale/programs/ld-collate.c:177 locale/programs/ld-collate.c:1442
+#: locale/programs/ld-collate.c:1471 locale/programs/locfile.c:962
 #: locale/programs/xmalloc.c:68 posix/getconf.c:250
 msgid "memory exhausted"
 msgstr "minne slut"
 
-#: malloc/obstack.c:425
+#: malloc/obstack.c:462
 msgid "memory exhausted\n"
 msgstr "minnet slut\n"
 
-#: malloc/mcheck.c:180
+#: malloc/mcheck.c:182
 msgid "memory is consistent, library is buggy"
 msgstr "minnet är konsistent, biblioteket är felaktigt"
 
-#: locale/programs/ld-time.c:348
+#: locale/programs/ld-time.c:350
 #, c-format
 msgid "missing era format in string %d in `era' field in category `%s'"
 msgstr "eraformat i sträng %d i \"era\"-fält i kategori \"%s\" saknas"
 
-#: locale/programs/ld-time.c:337
+#: locale/programs/ld-time.c:339
 #, c-format
-msgid "missing era name in string %d in `era' fieldin category `%s'"
+msgid "missing era name in string %d in `era' field in category `%s'"
 msgstr "eranamn i sträng %d i \"era\"-fält i kategori \"%s\" saknas"
 
-#: time/zic.c:915
+#: time/zic.c:913
 msgid "nameless rule"
 msgstr "namnlös regel"
 
@@ -2317,19 +2423,19 @@ msgstr "aldrig registrerat prog %d\n"
 msgid "no correct regular expression for field `%s' in category `%s': %s"
 msgstr "felaktigt reguljärt uttryck för fält \"%s\" i kategori \"%s\": %s"
 
-#: time/zic.c:2059
+#: time/zic.c:2086
 msgid "no day in month matches rule"
 msgstr "ingen dag i månaden matchar regeln"
 
-#: locale/programs/ld-collate.c:259
+#: locale/programs/ld-collate.c:260
 msgid "no definition of `UNDEFINED'"
 msgstr "ingen definition av \"UNDEFINED\""
 
-#: locale/programs/locfile.c:479
+#: locale/programs/locfile.c:501
 msgid "no other keyword shall be specified when `copy' is used"
 msgstr "inget annat nyckelord ska anges när \"copy\" används"
 
-#: locale/programs/localedef.c:340
+#: locale/programs/localedef.c:344
 msgid "no output file produced because warning were issued"
 msgstr "ingen utfil skapad på grund av varningar"
 
@@ -2352,7 +2458,7 @@ msgstr "ingen vikt definierad för symbol \"%s\""
 msgid "only WIDTH definitions are allowed to follow the CHARMAP definition"
 msgstr "endast definition av \"WIDTH\" får följa definitionen av \"CHARMAP\""
 
-#: db/makedb.c:326
+#: db/makedb.c:327
 #, c-format
 msgid "problems while reading `%s'"
 msgstr "problem läsa \"%s\""
@@ -2371,27 +2477,27 @@ msgstr "program %lu version %lu är inte tillgängligt\n"
 #: sunrpc/rpcinfo.c:466
 #, c-format
 msgid "program %lu version %lu ready and waiting\n"
-msgstr "program %lu version %lu klar och väntar\n"
+msgstr "program %lu version %lu berett och väntar\n"
 
-#: inet/rcmd.c:171
+#: inet/rcmd.c:172
 #, c-format
 msgid "rcmd: select (setting up stderr): %m\n"
-msgstr "rcmd: select (sätter upp standard error): %m\n"
+msgstr "rcmd: select (sätter upp standard fel): %m\n"
 
-#: inet/rcmd.c:103
+#: inet/rcmd.c:104
 msgid "rcmd: socket: All ports in use\n"
 msgstr "rcmd: uttag (socket): Alla portar används\n"
 
-#: inet/rcmd.c:159
+#: inet/rcmd.c:160
 #, c-format
 msgid "rcmd: write (setting up stderr): %m\n"
-msgstr "rcmd: write: (sätter upp standard error): %m\n"
+msgstr "rcmd: write: (sätter upp standard fel): %m\n"
 
 #: sunrpc/svc_simple.c:83
 msgid "registerrpc: out of memory\n"
 msgstr "registerrpc: minnet slut\n"
 
-#: time/zic.c:1794
+#: time/zic.c:1821
 msgid "repeated leap second moment"
 msgstr "upprepat skottsekundstillfälle"
 
@@ -2423,47 +2529,47 @@ msgstr "rpcinfo: kan inte kontakta portmapper"
 msgid "rpcinfo: can't contact portmapper: "
 msgstr "rpcinfo: kan inte kontakta portmapper: "
 
-#: time/zic.c:708 time/zic.c:710
+#: time/zic.c:704 time/zic.c:706
 msgid "same rule name in multiple files"
 msgstr "samma regel i flera filer"
 
-#: inet/rcmd.c:174
+#: inet/rcmd.c:175
 msgid "select: protocol failure in circuit setup\n"
 msgstr "select: protokollfel i förbindelseuppsättning\n"
 
-#: inet/rcmd.c:192
+#: inet/rcmd.c:193
 msgid "socket: protocol failure in circuit setup\n"
 msgstr "uttag (socket): protokollfel i förbindelseuppsättning\n"
 
-#: locale/programs/locfile.c:600
+#: locale/programs/locfile.c:622
 msgid "sorting order `forward' and `backward' are mutually exclusive"
 msgstr ""
 "sorteringsordning \"forward\" och \"backward\" är ömsesidigt uteslutande"
 
-#: locale/programs/ld-collate.c:1568 locale/programs/ld-collate.c:1614
+#: locale/programs/ld-collate.c:1571 locale/programs/ld-collate.c:1617
 msgid ""
 "specification of sorting weight for collation symbol does not make sense"
 msgstr ""
 "specifikation av sorteringsvikter för kollationssymbol verkar inte vettig"
 
-#: time/zic.c:779
+#: time/zic.c:775
 msgid "standard input"
 msgstr "standard in"
 
-#: time/zdump.c:260
+#: time/zdump.c:268
 msgid "standard output"
 msgstr "standard ut"
 
-#: locale/programs/ld-time.c:256
+#: locale/programs/ld-time.c:257
 #, c-format
 msgid "starting date is illegal in string %d in `era' field in category `%s'"
 msgstr "startdatum är otillåtet i sträng %d i \"era\"-fält i kategori \"%s\""
 
-#: time/zic.c:1276
+#: time/zic.c:1274
 msgid "starting year greater than ending year"
 msgstr "startår är större än slutår"
 
-#: locale/programs/ld-time.c:328
+#: locale/programs/ld-time.c:330
 #, c-format
 msgid "stopping date is illegal in string %d in `era' field in category `%s'"
 msgstr "slutdatum är otillåtet i sträng %d i \"era\"-fält i kategori \"%s\""
@@ -2492,7 +2598,7 @@ msgstr "svcudp_create - kan inte anropa getsockname"
 msgid "svcudp_create: socket creation problem"
 msgstr "svcudp_create: problem att skapa uttag (socket)"
 
-#: locale/programs/ld-collate.c:1191
+#: locale/programs/ld-collate.c:1194
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates element "
@@ -2500,7 +2606,7 @@ msgid ""
 msgstr ""
 "symbol för flerteckenskollationselement \"%.*s\" duplicerar elementdefinition"
 
-#: locale/programs/ld-collate.c:1064
+#: locale/programs/ld-collate.c:1067
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates other element "
@@ -2509,7 +2615,7 @@ msgstr ""
 "symbol för flerteckenskollationselement \"%.*s\" duplicerar annan\n"
 "elementdefinition"
 
-#: locale/programs/ld-collate.c:1200
+#: locale/programs/ld-collate.c:1203
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates other symbol "
@@ -2518,7 +2624,7 @@ msgstr ""
 "symbol för flerteckenskollationselement \"%.*s\" duplicerar annan\n"
 "symboldefinition"
 
-#: locale/programs/ld-collate.c:1073
+#: locale/programs/ld-collate.c:1076
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates symbol "
@@ -2526,7 +2632,7 @@ msgid ""
 msgstr ""
 "symbol för flerteckenskollationselement \"%.*s\" duplicerar symboldefinition"
 
-#: locale/programs/ld-collate.c:1055 locale/programs/ld-collate.c:1182
+#: locale/programs/ld-collate.c:1058 locale/programs/ld-collate.c:1185
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates symbolic name "
@@ -2543,51 +2649,51 @@ msgstr ""
 msgid "syntax error in %s definition: %s"
 msgstr "syntaxfel i definition av %s: %s"
 
-#: locale/programs/locfile.c:620
+#: locale/programs/locfile.c:642
 msgid "syntax error in `order_start' directive"
 msgstr "syntaxfel i direktivet \"order_start\""
 
-#: locale/programs/locfile.c:362
+#: locale/programs/locfile.c:384
 msgid "syntax error in character class definition"
 msgstr "syntaxfel i teckenklassdefinition"
 
-#: locale/programs/locfile.c:420
+#: locale/programs/locfile.c:442
 msgid "syntax error in character conversion definition"
 msgstr "syntaxfel i teckenkonverteringsdefinition"
 
-#: locale/programs/locfile.c:662
+#: locale/programs/locfile.c:684
 msgid "syntax error in collating order definition"
 msgstr "syntaxfel i kollationssorteringsdefinition"
 
-#: locale/programs/locfile.c:512
+#: locale/programs/locfile.c:534
 msgid "syntax error in collation definition"
 msgstr "syntaxfel i kollationsdefinition"
 
-#: locale/programs/locfile.c:335
+#: locale/programs/locfile.c:357
 msgid "syntax error in definition of LC_CTYPE category"
 msgstr "syntaxfel i definition av kategorin LC_CTYPE"
 
-#: locale/programs/locfile.c:278
+#: locale/programs/locfile.c:300
 msgid "syntax error in definition of new character class"
 msgstr "syntaxfel i definition av ny teckenklass"
 
-#: locale/programs/locfile.c:288
+#: locale/programs/locfile.c:310
 msgid "syntax error in definition of new character map"
 msgstr "syntaxfel i definition av ny teckenuppsättning"
 
-#: locale/programs/locfile.c:873
+#: locale/programs/locfile.c:895
 msgid "syntax error in message locale definition"
 msgstr "syntaxfel i definition av meddelandelokal"
 
-#: locale/programs/locfile.c:784
+#: locale/programs/locfile.c:806
 msgid "syntax error in monetary locale definition"
 msgstr "syntaxfel i definition av monetärlokal"
 
-#: locale/programs/locfile.c:811
+#: locale/programs/locfile.c:833
 msgid "syntax error in numeric locale definition"
 msgstr "syntaxfel i definition av numerisk lokal"
 
-#: locale/programs/locfile.c:722
+#: locale/programs/locfile.c:744
 msgid "syntax error in order specification"
 msgstr "syntaxfel i sorteringsspecifikation"
 
@@ -2596,23 +2702,23 @@ msgstr "syntaxfel i sorteringsspecifikation"
 msgid "syntax error in prolog: %s"
 msgstr "syntaxfel i prolog: %s"
 
-#: locale/programs/locfile.c:849
+#: locale/programs/locfile.c:871
 msgid "syntax error in time locale definition"
 msgstr "syntaxfel i definition av tidslokal"
 
-#: locale/programs/locfile.c:255
+#: locale/programs/locfile.c:277
 msgid "syntax error: not inside a locale definition section"
 msgstr "syntaxfel: inte inne i en lokaldefinition"
 
-#: catgets/gencat.c:380 catgets/gencat.c:516 catgets/gencat.c:543
+#: catgets/gencat.c:381 catgets/gencat.c:517 catgets/gencat.c:544
 msgid "this is the first definition"
 msgstr "detta är den första definitionen"
 
-#: time/zic.c:1119
+#: time/zic.c:1117
 msgid "time before zero"
 msgstr "tid före noll"
 
-#: time/zic.c:1127 time/zic.c:1959 time/zic.c:1978
+#: time/zic.c:1125 time/zic.c:1986 time/zic.c:2005
 msgid "time overflow"
 msgstr "för stort tidsvärde"
 
@@ -2628,23 +2734,23 @@ msgstr "för många tecken i teckenkodning"
 msgid "too many character classes defined"
 msgstr "för många teckenklasser definierade"
 
-#: time/zic.c:1788
+#: time/zic.c:1815
 msgid "too many leap seconds"
 msgstr "för många skottsekunder"
 
-#: time/zic.c:1760
+#: time/zic.c:1787
 msgid "too many local time types"
 msgstr "för många lokala tidstyper"
 
-#: time/zic.c:1714
+#: time/zic.c:1741
 msgid "too many transitions?!"
 msgstr "för många övergångar?!"
 
-#: locale/programs/ld-collate.c:1623
+#: locale/programs/ld-collate.c:1626
 msgid "too many weights"
 msgstr "för många vikter"
 
-#: time/zic.c:2082
+#: time/zic.c:2109
 msgid "too many, or too long, time zone abbreviations"
 msgstr "för många eller för långa tidszonförkortningar"
 
@@ -2657,11 +2763,11 @@ msgstr "avslutande skräp vid radslutet"
 msgid "trouble replying to prog %d\n"
 msgstr "problem att svara till prog %d\n"
 
-#: locale/programs/ld-collate.c:1383
+#: locale/programs/ld-collate.c:1386
 msgid "two lines in a row containing `...' are not allowed"
 msgstr "två rader efter varann som har \"...\" är inte tillåtet"
 
-#: time/zic.c:1283
+#: time/zic.c:1281
 msgid "typed single year"
 msgstr "satte typ på endast ett år"
 
@@ -2676,39 +2782,36 @@ msgstr "okänt tecken \"%s\""
 
 #: locale/programs/ld-messages.c:193 locale/programs/ld-messages.c:204
 #: locale/programs/ld-messages.c:215 locale/programs/ld-messages.c:226
-#: locale/programs/ld-time.c:696
+#: locale/programs/ld-time.c:698
 #, c-format
 msgid "unknown character in field `%s' of category `%s'"
 msgstr "okänt tecken i fält \"%s\" i kategori \"%s\""
 
-#: locale/programs/locfile.c:585
+#: locale/programs/locfile.c:607
 msgid "unknown collation directive"
 msgstr "okänt kollationsdirektiv"
 
-#: catgets/gencat.c:477
+#: catgets/gencat.c:478
 #, c-format
 msgid "unknown directive `%s': line ignored"
 msgstr "okänt direktiv \"%s\": rad ignorerad"
 
-#: catgets/gencat.c:456
+#: catgets/gencat.c:457
 #, c-format
 msgid "unknown set `%s'"
-msgstr "okänd uppsättning \"%s\""
-
-msgid "unknown signal"
-msgstr "okänd signal"
+msgstr "okänd mängd \"%s\""
 
-#: locale/programs/ld-collate.c:1367 locale/programs/ld-collate.c:1558
-#: locale/programs/ld-collate.c:1732
+#: locale/programs/ld-collate.c:1370 locale/programs/ld-collate.c:1561
+#: locale/programs/ld-collate.c:1735
 #, c-format
 msgid "unknown symbol `%.*s': line ignored"
 msgstr "okänd symbol \"%.*s\": rad ignorerad"
 
-#: time/zic.c:751
+#: time/zic.c:747
 msgid "unruly zone"
 msgstr "besvärlig zon"
 
-#: catgets/gencat.c:961
+#: catgets/gencat.c:962
 msgid "unterminated message"
 msgstr "oavslutat meddelande"
 
@@ -2720,15 +2823,15 @@ msgstr "oavslutad sträng"
 msgid "unterminated symbolic name"
 msgstr "oavslutat symboliskt namn"
 
-#: locale/programs/ld-collate.c:1685
+#: locale/programs/ld-collate.c:1688
 msgid "unterminated weight name"
 msgstr "oavslutat viktnamn"
 
 #: locale/programs/charset.c:119
 msgid "upper limit in range is not smaller then lower limit"
-msgstr "övre gräns i område är inte mindre än undre gräns"
+msgstr "övre gräns i intervall är inte mindre än undre gräns"
 
-#: time/zic.c:2025
+#: time/zic.c:2052
 msgid "use of 2/29 in non leap-year"
 msgstr "använder 29/2 i icke-skottår"
 
@@ -2742,7 +2845,7 @@ msgstr "värdet på %s måste vara heltal"
 msgid "value for <%s> must lie between 1 and 4"
 msgstr "värde på <%s> måste vara mellan 1 och 4"
 
-#: locale/programs/ld-monetary.c:148 locale/programs/ld-numeric.c:89
+#: locale/programs/ld-monetary.c:149 locale/programs/ld-numeric.c:89
 #, c-format
 msgid "value for field `%s' in category `%s' must not be the empty string"
 msgstr "värde på fält \"%s\" i kategori \"%s\" får inte vara tom sträng"
@@ -2751,7 +2854,7 @@ msgstr "värde på fält \"%s\" i kategori \"%s\" får inte vara tom sträng"
 msgid "value of <mb_cur_max> must be greater than the value of <mb_cur_min>"
 msgstr "värdet på <mb_cur_max> måste vara större än värdet på <mb_cur_min>"
 
-#: locale/programs/ld-monetary.c:138
+#: locale/programs/ld-monetary.c:139
 msgid ""
 "value of field `int_curr_symbol' in category `LC_MONETARY' does not "
 "correspond to a valid name in ISO 4217"
@@ -2765,12 +2868,12 @@ msgid ""
 msgstr ""
 "värdet på fältet \"int_curr_symbol\" i kategorin LC_MONETARY har fel längd"
 
-#: locale/programs/ld-monetary.c:370 locale/programs/ld-numeric.c:199
+#: locale/programs/ld-monetary.c:371 locale/programs/ld-numeric.c:199
 #, c-format
 msgid "values for field `%s' in category `%s' must be smaller than 127"
 msgstr "värden på fält \"%s\" i kategorin \"%s\" måste vara mindre än 127"
 
-#: locale/programs/ld-monetary.c:366
+#: locale/programs/ld-monetary.c:367
 #, c-format
 msgid "values for field `%s' in category `%s' must not be zero"
 msgstr "värden på fält \"%s\" i kategorin \"%s\" får inte vara noll"
@@ -2779,15 +2882,15 @@ msgstr "värden på fält \"%s\" i kategorin \"%s\" får inte vara noll"
 msgid "while opening UTMP file"
 msgstr "när UTMP-filen öppnades"
 
-#: catgets/gencat.c:988
+#: catgets/gencat.c:989
 msgid "while opening old catalog file"
 msgstr "när gammal katalogfil öppnades"
 
-#: db/makedb.c:353
+#: db/makedb.c:354
 msgid "while reading database"
 msgstr "när databasen lästes"
 
-#: db/makedb.c:315
+#: db/makedb.c:316
 msgid "while writing data base file"
 msgstr "när databasen skrevs"
 
@@ -2795,34 +2898,30 @@ msgstr "när databasen skrevs"
 msgid "wrong number of arguments"
 msgstr "fel antal argument"
 
-#: time/zic.c:1077
+#: time/zic.c:1075
 msgid "wrong number of fields on Leap line"
 msgstr "fel antal fält på \"Leap\"-rad"
 
-#: time/zic.c:1168
+#: time/zic.c:1166
 msgid "wrong number of fields on Link line"
 msgstr "fel antal fält på \"Link\"-rad"
 
-#: time/zic.c:911
+#: time/zic.c:909
 msgid "wrong number of fields on Rule line"
 msgstr "fel antal fält på \"Rule\"-rad"
 
-#: time/zic.c:981
+#: time/zic.c:979
 msgid "wrong number of fields on Zone continuation line"
 msgstr "fel antal fält på \"Zone\"-fortsättningsrad"
 
-#: time/zic.c:939
+#: time/zic.c:937
 msgid "wrong number of fields on Zone line"
 msgstr "fel antal fält på \"Zone\"-rad"
 
-#: nis/ypclnt.c:570
-msgid "yp_all: clnttcp_create failed"
-msgstr "yp_all: clnttcp_create misslyckades"
-
-#: nis/ypclnt.c:772
+#: nis/ypclnt.c:811
 msgid "yp_update: cannot convert host to netname\n"
 msgstr "yp_update: kan inte omvandla värd till nätnamn\n"
 
-#: nis/ypclnt.c:784
+#: nis/ypclnt.c:823
 msgid "yp_update: cannot get server address\n"
 msgstr "yp_update: kan inte hämta betjäntadress\n"
diff --git a/posix/regex.c b/posix/regex.c
index fc4db38a55..a8655cdd70 100644
--- a/posix/regex.c
+++ b/posix/regex.c
@@ -1568,7 +1568,7 @@ static reg_errcode_t compile_range _RE_ARGS ((const char **p_ptr,
    MSC and drop MAX_BUF_SIZE a bit.  Otherwise you may end up
    reallocating to 0 bytes.  Such thing is not going to work too well.
    You have been warned!!  */
-#ifdef _MSC_VER
+#if defined(_MSC_VER)  && !defined(WIN32)
 /* Microsoft C 16-bit versions limit malloc to approx 65512 bytes.
    The REALLOC define eliminates a flurry of conversion warnings,
    but is not required. */
diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c
index 754f99548f..65a668e664 100644
--- a/resolv/nss_dns/dns-host.c
+++ b/resolv/nss_dns/dns-host.c
@@ -400,7 +400,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
 	  linebuflen -= n;
 	  /* Get canonical name.  */
 	  n = strlen (tbuf) + 1;	/* For the \0.  */
-	  if (n > buflen)
+	  if ((size_t) n > buflen)
 	    {
 	      ++had_error;
 	      continue;
@@ -423,7 +423,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
 	  cp += n;
 	  /* Get canonical name. */
 	  n = strlen (tbuf) + 1;   /* For the \0.  */
-	  if (n > buflen)
+	  if ((size_t) n > buflen)
 	    {
 	      ++had_error;
 	      continue;
diff --git a/stdio-common/printf_fp.c b/stdio-common/printf_fp.c
index 8cff7a4d66..34fe918237 100644
--- a/stdio-common/printf_fp.c
+++ b/stdio-common/printf_fp.c
@@ -336,7 +336,7 @@ __printf_fp (FILE *fp,
 
   if (special)
     {
-      int width = info->prec > info->width ? info->prec : info->width;
+      int width = info->width;
 
       if (is_neg || info->showsign || info->space)
 	--width;
diff --git a/stdio-common/printf_fphex.c b/stdio-common/printf_fphex.c
index e2e64695d5..6cdda9e1d4 100644
--- a/stdio-common/printf_fphex.c
+++ b/stdio-common/printf_fphex.c
@@ -189,7 +189,7 @@ __printf_fphex (FILE *fp,
 
   if (special)
     {
-      int width = info->prec > info->width ? info->prec : info->width;
+      int width = info->width;
 
       if (negative || info->showsign || info->space)
 	--width;
diff --git a/string/Makefile b/string/Makefile
index 8f35f207f6..6704dbf4e0 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -24,7 +24,7 @@ subdir	:= string
 headers	:= string.h strings.h memory.h endian.h bytesex.h \
 	   argz.h envz.h
 
-routines	:= strcat strchr strcmp strcoll strcpy strcspn		\
+routines	:= strcat strchr strcmp strcoll strcpy strcspn strverscmp	\
 		   strdup strndup	\
 		   strerror _strerror strerror_r strlen strnlen		\
 		   strncat strncmp strncpy				\
@@ -40,7 +40,8 @@ routines	:= strcat strchr strcmp strcoll strcpy strcspn		\
 		   envz basename					\
 		   strcoll_l strxfrm_l
 
-tests		:= tester testcopy test-ffs tst-strlen stratcliff
+tests		:= tester testcopy test-ffs tst-strlen stratcliff \
+	           tst-svc
 distribute	:= memcopy.h pagecopy.h
 
 
@@ -50,3 +51,6 @@ tester-ENV = LANGUAGE=C
 CFLAGS-tester.c = -fno-builtin
 CFLAGS-tst-strlen.c = -fno-builtin
 CFLAGS-stratcliff.c = -fno-builtin
+
+tests: $(objpfx)tst-svc.out
+	cmp tst-svc.expect $(objpfx)tst-svc.out
diff --git a/string/basename.c b/string/basename.c
index 4f06843aeb..f24e0ac1b4 100644
--- a/string/basename.c
+++ b/string/basename.c
@@ -17,10 +17,15 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 #include <string.h>
 
 char *
-basename (const char *filename)
+basename (filename)
+     const char *filename;
 {
   char *p = strrchr (filename, '/');
   return p ? p + 1 : (char *) filename;
diff --git a/string/string.h b/string/string.h
index 7a6ad1235f..4a79dcecc2 100644
--- a/string/string.h
+++ b/string/string.h
@@ -241,6 +241,9 @@ extern char *strsep __P ((char **__stringp, __const char *__delim));
 #endif
 
 #ifdef	__USE_GNU
+/* Compare S1 and S2 as strings holding name & indices/version numbers.  */
+extern int strverscmp __P ((__const char *__s1, __const char *__s2));
+
 /* Return a string describing the meaning of the signal number in SIG.  */
 extern char *strsignal __P ((int __sig));
 
diff --git a/string/strverscmp.c b/string/strverscmp.c
new file mode 100644
index 0000000000..388df75dfd
--- /dev/null
+++ b/string/strverscmp.c
@@ -0,0 +1,111 @@
+/* Compare strings while treating digits characters numerically.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jean-François Bignolles <bignolle@ecoledoc.ibp.fr>, 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 <string.h>
+#include <ctype.h>
+
+/* states: S_N: normal, S_I: comparing integral part, S_F: comparing
+           Fractionnal parts, S_Z: idem but with leading Zeroes only */
+#define  S_N    0x0
+#define  S_I    0x4
+#define  S_F    0x8
+#define  S_Z    0xC
+
+/* result_type: CMP: return diff; LEN: compare using len_diff/diff */
+#define  CMP    2
+#define  LEN    3
+
+
+/* Compare S1 and S2 as strings holding indices/version numbers,
+   returning less than, equal to or greater than zero if S1 is less than,
+   equal to or greater than S2 (for more info, see the texinfo doc).
+*/
+
+int
+strverscmp (s1, s2)
+     const char *s1;
+     const char *s2;
+{
+  const unsigned char *p1 = (const unsigned char *) s1;
+  const unsigned char *p2 = (const unsigned char *) s2;
+  unsigned char c1, c2;
+  int state;
+  int diff;
+
+  /* Symbol(s)    0       [1-9]   others  (padding)
+     Transition   (10) 0  (01) d  (00) x  (11) -   */
+  static const unsigned int next_state[] =
+  {
+      /* state    x    d    0    - */
+      /* S_N */  S_N, S_I, S_Z, S_N,
+      /* S_I */  S_N, S_I, S_I, S_I,
+      /* S_F */  S_N, S_F, S_F, S_F,
+      /* S_Z */  S_N, S_F, S_Z, S_Z
+  };
+
+  static const int result_type[] =
+  {
+      /* state   x/x  x/d  x/0  x/-  d/x  d/d  d/0  d/-
+                 0/x  0/d  0/0  0/-  -/x  -/d  -/0  -/- */
+
+      /* S_N */  CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
+                 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
+      /* S_I */  CMP, -1,  -1,  CMP, +1,  LEN, LEN, CMP,
+                 +1,  LEN, LEN, CMP, CMP, CMP, CMP, CMP,
+      /* S_F */  CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
+                 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
+      /* S_Z */  CMP, +1,  +1,  CMP, -1,  CMP, CMP, CMP,
+                 -1,  CMP, CMP, CMP
+  };
+
+  if (p1 == p2)
+    return 0;
+
+  c1 = *p1++;
+  c2 = *p2++;
+  /* Hint: '0' is a digit too.  */
+  state = S_N | (c1 == '0') + (isdigit (c1) != 0);
+
+  while ((diff = c1 - c2) == 0 && c1 != '\0')
+    {
+      state = next_state[state];
+      c1 = *p1++;
+      c2 = *p2++;
+      state |= (c1 == '0') + (isdigit (c1) != 0);
+    }
+
+  state = result_type[state << 2 | ((c2 == '0') + (isdigit (c2) != 0))];
+
+  switch (state)
+  {
+    case CMP:
+      return diff;
+
+    case LEN:
+      while (isdigit (*p1++))
+	if (!isdigit (*p2++))
+	  return 1;
+
+      return isdigit (*p2) ? -1 : diff;
+
+    default:
+      return state;
+  }
+}
diff --git a/string/tester.c b/string/tester.c
index b815539737..dcd7342ba3 100644
--- a/string/tester.c
+++ b/string/tester.c
@@ -1,3 +1,6 @@
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
 #include <ansidecl.h>
 #include <errno.h>
 #include <stdio.h>
@@ -28,6 +31,7 @@ DEFUN(check, (thing, number), int thing AND int number)
 }
 
 /* Complain if first two args don't strcmp as equal.  */
+void equal(CONST char *a, CONST char *b, int number);
 void
 DEFUN(equal, (a, b, number), CONST char *a AND CONST char *b AND int number)
 {
@@ -54,6 +58,41 @@ DEFUN(main, (argc, argv), int argc AND char **argv)
   check(strcmp("a\203", "a") > 0, 8);		/* Tricky if char signed. */
   check(strcmp("a\203", "a\003") > 0, 9);
 
+  {
+    char buf1[0x40], buf2[0x40];
+    int i, j;
+    for (i=0; i < 0x10; i++)
+      for (j = 0; j < 0x10; j++)
+      {
+	int k;
+	for (k = 0; k < 0x3f; k++)
+	  {
+	    buf1[j] = '0' ^ (k & 4);
+	    buf2[j] = '4' ^ (k & 4);
+	  }
+	buf1[i] = buf1[0x3f] = 0;
+	buf2[j] = buf2[0x3f] = 0;
+	for (k = 0; k < 0xf; k++)
+	  {
+	    int cnum = 0x10+0x10*k+0x100*j+0x1000*i;
+	    check(strcmp(buf1+i,buf2+j) == 0, cnum);
+	    buf1[i+k] = 'A' + i + k;
+	    buf1[i+k+1] = 0;
+	    check(strcmp(buf1+i,buf2+j) > 0, cnum+1);
+	    check(strcmp(buf2+j,buf1+i) < 0, cnum+2);
+	    buf2[j+k] = 'B' + i + k;
+	    buf2[j+k+1] = 0;
+	    check(strcmp(buf1+i,buf2+j) < 0, cnum+3);
+	    check(strcmp(buf2+j,buf1+i) > 0, cnum+4);
+	    buf2[j+k] = 'A' + i + k;
+	    buf1[i] = 'A' + i + 0x80;
+	    check(strcmp(buf1+i,buf2+j) > 0, cnum+5);
+	    check(strcmp(buf2+j,buf1+i) < 0, cnum+6);
+	    buf1[i] = 'A' + i;
+	  }
+      }
+   }
+
   /* Test strcpy next because we need it to set up other tests.  */
   it = "strcpy";
   check(strcpy(one, "abcd") == one, 1);	/* Returned value. */
@@ -672,6 +711,43 @@ DEFUN(main, (argc, argv), int argc AND char **argv)
   (void) memset(one+2, 010045, 1);
   equal(one, "ax\045xe", 6);		/* Unsigned char convert. */
 
+  /* Test for more complex versions of memset, for all alignments and
+     lengths up to 256. This test takes a little while, perhaps it should
+     be made weaker? */
+  {
+    char data[512];
+    int i;
+    int j;
+    int k;
+    int c;
+    
+    for (i = 0; i < 512; i++)
+      data[i] = 'x';
+    for (c = 0; c <= 'y'; c += 'y')  /* check for memset(,0,) and
+					memset(,'y',) */
+      for (j = 0; j < 256; j++)
+	for (i = 0; i < 256; i++)
+	  {
+	    memset(data+i,c,j);
+	    for (k = 0; k < i; k++)
+	      if (data[k] != 'x')
+		goto fail;
+	    for (k = i; k < i+j; k++)
+	      {
+		if (data[k] != c)
+		  goto fail;
+		data[k] = 'x';
+	      }
+	    for (k = i+j; k < 512; k++)
+	      if (data[k] != 'x')
+		goto fail;
+	    continue;
+
+	  fail:
+	    check(0,7+i+j*256+(c != 0)*256*256); 
+	  }
+  }
+
   /* bcopy - much like memcpy.
      Berklix manual is silent about overlap, so don't test it.  */
   it = "bcopy";
diff --git a/string/tst-strlen.c b/string/tst-strlen.c
index b9efe1da29..4acd4045f5 100644
--- a/string/tst-strlen.c
+++ b/string/tst-strlen.c
@@ -34,7 +34,7 @@ main(int argc, char *argv[])
 		  return 1;
 		}
 	    }
-        }
+	}
     }
   return 0;
 }
diff --git a/string/tst-svc.c b/string/tst-svc.c
new file mode 100644
index 0000000000..c6add5b4b1
--- /dev/null
+++ b/string/tst-svc.c
@@ -0,0 +1,45 @@
+/* Test for strverscmp() */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define  MAX_STRINGS      256
+#define  MAX_LINE_SIZE    32
+
+int
+compare (const void *p1, const void *p2)
+{
+  return strverscmp (*((char **) p1), *((char **) p2));
+}
+
+int
+main (int argc, char *argv[])
+{
+  char line[MAX_LINE_SIZE + 1];
+  char *str[MAX_STRINGS];
+  int  count = 0;
+  int  i, n;
+
+  while (count < MAX_STRINGS && fgets (line, MAX_LINE_SIZE, stdin) != NULL)
+    {
+      n = strlen (line) - 1;
+
+      if (line[n] == '\n')
+        line[n] = '\0';
+
+      str[count] = strdup (line);
+
+      if (str[count] == NULL)
+        exit (EXIT_FAILURE);
+
+      ++count;
+    }
+
+  qsort (str, count, sizeof (char *), compare);
+
+  for (i = 0; i < count; ++i)
+    puts (str[i]);
+
+  exit (EXIT_SUCCESS);
+}
diff --git a/string/tst-svc.expect b/string/tst-svc.expect
new file mode 100644
index 0000000000..f906c4fc0b
--- /dev/null
+++ b/string/tst-svc.expect
@@ -0,0 +1,26 @@
+000
+001
+00
+00a
+01
+01a
+0
+0a
+20
+21
+22
+212
+foo
+foo-0.4
+foo-0.4a
+foo-0.4b
+foo-0.5
+foo-0.10.5
+foo-3.01
+foo-3.0
+foo-3.0.0
+foo-3.0.1
+foo-3.2
+foo-3.10
+foo00
+foo0
diff --git a/string/tst-svc.input b/string/tst-svc.input
new file mode 100644
index 0000000000..b80ee82b07
--- /dev/null
+++ b/string/tst-svc.input
@@ -0,0 +1,26 @@
+0a
+00
+0
+01
+001
+01a
+00a
+000
+20
+212
+21
+22
+foo0
+foo00
+foo-0.4
+foo-3.0
+foo
+foo-3.0.0
+foo-3.0.1
+foo-0.5
+foo-0.4b
+foo-3.10
+foo-3.2
+foo-3.01
+foo-0.4a
+foo-0.10.5
diff --git a/sunrpc/authuxprot.c b/sunrpc/authuxprot.c
index d172ebc655..9f0242fcb0 100644
--- a/sunrpc/authuxprot.c
+++ b/sunrpc/authuxprot.c
@@ -46,6 +46,7 @@ static char sccsid[] = "@(#)authunix_prot.c 1.15 87/08/11 Copyr 1984 Sun Micro";
 
 /*
  * XDR for unix authentication parameters.
+ * Unfortunately, none of these can be declared const.
  */
 bool_t
 xdr_authunix_parms (XDR * xdrs, struct authunix_parms *p)
diff --git a/sunrpc/pmap_rmt.c b/sunrpc/pmap_rmt.c
index c3667d4738..8ae93b8f6d 100644
--- a/sunrpc/pmap_rmt.c
+++ b/sunrpc/pmap_rmt.c
@@ -370,7 +370,7 @@ clnt_broadcast (prog, vers, proc, xargs, argsp, xresults, resultsp, eachresult)
 	  stat = RPC_CANTRECV;
 	  goto done_broad;
 	}
-      if (inlen < sizeof (u_long))
+      if ((size_t) inlen < sizeof (u_long))
 	goto recv_again;
       /*
        * see if reply transaction id matches sent id.
diff --git a/sunrpc/proto.h b/sunrpc/proto.h
index ed010f8fab..6d2747f728 100644
--- a/sunrpc/proto.h
+++ b/sunrpc/proto.h
@@ -1,7 +1,7 @@
 /****** rpc_clntout.c ******/
 
 void write_stubs(void);
-void printarglist(proc_list *proc, 
+void printarglist(proc_list *proc,
 		  const char *addargname, const char *addargtype);
 
 /****** rpc_cout.c ******/
@@ -15,9 +15,9 @@ void emit_single_in_line(declaration *decl, int flag, relation rel);
 void print_datadef(definition *def);
 void print_funcdef(definition *def);
 void pxdrfuncdecl(const char *name, int pointerp);
-void pprocdef(proc_list *proc, version_list *vp, 
+void pprocdef(proc_list *proc, version_list *vp,
 	      const char *addargtype, int server_p, int mode);
-void pdeclaration(const char *name, declaration *dec, int tab, 
+void pdeclaration(const char *name, declaration *dec, int tab,
 		  const char *separator);
 
 /****** rpc_main.c ******/
@@ -36,7 +36,7 @@ void write_sample_clnt_main(void);
    /* see rpc_scan.h */
 
 /****** rpc_svcout.c ******/
-int nullproc(proc_list *proc);
+int nullproc(const proc_list *proc);
 void write_svc_aux(int nomain);
 void write_msg_out(void);
 
diff --git a/sunrpc/rpc/auth_unix.h b/sunrpc/rpc/auth_unix.h
index 32d8d0aa35..d006f51f72 100644
--- a/sunrpc/rpc/auth_unix.h
+++ b/sunrpc/rpc/auth_unix.h
@@ -46,6 +46,10 @@
 
 #define _RPC_AUTH_UNIX_H	1
 #include <features.h>
+#include <sys/types.h>
+#include <rpc/types.h>
+#include <rpc/auth.h>
+#include <rpc/xdr.h>
 
 __BEGIN_DECLS
 
diff --git a/sunrpc/rpc/clnt.h b/sunrpc/rpc/clnt.h
index 2cabc00d64..43a599ad25 100644
--- a/sunrpc/rpc/clnt.h
+++ b/sunrpc/rpc/clnt.h
@@ -38,6 +38,9 @@
 
 #define _RPC_CLNT_H	1
 #include <features.h>
+#include <sys/types.h>
+#include <rpc/types.h>
+#include <rpc/auth.h>
 
 __BEGIN_DECLS
 
@@ -130,13 +133,13 @@ struct CLIENT {
   AUTH	*cl_auth;		 /* authenticator */
   struct clnt_ops {
     enum clnt_stat (*cl_call) __P ((CLIENT *, u_long, xdrproc_t,
-				    caddr_t, xdrproc_t, 
-				    caddr_t, struct timeval));	
+				    caddr_t, xdrproc_t,
+				    caddr_t, struct timeval));
 			       	/* call remote procedure */
     void (*cl_abort) __P ((void));  /* abort a call */
-    void (*cl_geterr) __P ((CLIENT *, struct rpc_err *));	
+    void (*cl_geterr) __P ((CLIENT *, struct rpc_err *));
 				/* get specific error code */
-    bool_t (*cl_freeres) __P ((CLIENT *, xdrproc_t, caddr_t)); 
+    bool_t (*cl_freeres) __P ((CLIENT *, xdrproc_t, caddr_t));
 				/* frees results */
     void (*cl_destroy) __P ((CLIENT *)); /* destroy this structure */
     bool_t (*cl_control) __P ((CLIENT *, int, char *));
@@ -270,7 +273,7 @@ struct CLIENT {
  *	u_long prog;
  *	u_long vers;
  */
-extern CLIENT *clntraw_create __P ((__const u_long __prog, 
+extern CLIENT *clntraw_create __P ((__const u_long __prog,
 				    __const u_long __vers));
 
 
@@ -283,7 +286,7 @@ extern CLIENT *clntraw_create __P ((__const u_long __prog,
  *	u_ong vers;	-- version number
  *	char *prot;	-- protocol
  */
-extern CLIENT *clnt_create __P ((__const char *__host, __const u_long __prog, 
+extern CLIENT *clnt_create __P ((__const char *__host, __const u_long __prog,
 				 __const u_long __vers, __const char *__prot));
 
 
@@ -334,7 +337,7 @@ extern CLIENT *clntudp_bufcreate __P ((struct sockaddr_in *__raddr,
 				       int *__sockp, u_int __sendsz,
 				       u_int __recvsz));
 
-extern int callrpc __P ((__const char *__host, __const u_long __prognum, 
+extern int callrpc __P ((__const char *__host, __const u_long __prognum,
 			 __const u_long __versnum, __const u_long __procnum,
 			 __const xdrproc_t __inproc, __const char *__in,
 			 __const xdrproc_t __outproc, char *__out));
@@ -354,9 +357,9 @@ extern void clnt_perrno __P ((enum clnt_stat __num));	/* stderr */
 /*
  * Print an English error message, given the client error code
  */
-extern void clnt_perror __P ((CLIENT *__clnt, __const char *__msg)); 
+extern void clnt_perror __P ((CLIENT *__clnt, __const char *__msg));
 							/* stderr */
-extern char *clnt_sperror __P ((CLIENT *__clnt, __const char *__msg)); 
+extern char *clnt_sperror __P ((CLIENT *__clnt, __const char *__msg));
 							/* string */
 
 /*
diff --git a/sunrpc/rpc/pmap_clnt.h b/sunrpc/rpc/pmap_clnt.h
index 0b8d50f10f..45639e7dc4 100644
--- a/sunrpc/rpc/pmap_clnt.h
+++ b/sunrpc/rpc/pmap_clnt.h
@@ -38,6 +38,8 @@
 #ifndef _RPC_PMAP_CLNT_H
 #define _RPC_PMAP_CLNT_H	1
 #include <features.h>
+#include <rpc/types.h>
+#include <rpc/xdr.h>
 
 __BEGIN_DECLS
 
@@ -70,23 +72,23 @@ extern bool_t pmap_set __P ((__const u_long __program, __const u_long __vers,
 extern bool_t pmap_unset __P ((__const u_long __program, __const u_long __vers));
 extern struct pmaplist *pmap_getmaps __P ((struct sockaddr_in *__address));
 extern enum clnt_stat pmap_rmtcall __P ((struct sockaddr_in *__addr,
-					 __const u_long __prog, 
+					 __const u_long __prog,
 					 __const u_long __vers,
-					 __const u_long __proc, 
+					 __const u_long __proc,
 					 xdrproc_t __xdrargs,
 					 caddr_t __argsp, xdrproc_t __xdrres,
 					 caddr_t __resp, struct timeval __tout,
 					 u_long *__port_ptr));
-extern enum clnt_stat clnt_broadcast __P ((__const u_long __prog, 
+extern enum clnt_stat clnt_broadcast __P ((__const u_long __prog,
 					   __const u_long __vers,
-					   __const u_long __proc, 
+					   __const u_long __proc,
 					   xdrproc_t __xargs,
 					   caddr_t __argsp,
 					   xdrproc_t __xresults,
 					   caddr_t __resultsp,
 					   resultproc_t __eachresult));
 extern u_short pmap_getport __P ((struct sockaddr_in *__address,
-				  __const u_long __program, 
+				  __const u_long __program,
 				  __const u_long __version,
 				  u_int __protocol));
 
diff --git a/sunrpc/rpc/pmap_rmt.h b/sunrpc/rpc/pmap_rmt.h
index 2e1af7e3d0..6d32045c8e 100644
--- a/sunrpc/rpc/pmap_rmt.h
+++ b/sunrpc/rpc/pmap_rmt.h
@@ -39,7 +39,9 @@
 
 #define _RPC_PMAP_RMT_H	1
 #include <features.h>
-
+#include <sys/types.h>
+#include <rpc/types.h>
+#include <rpc/xdr.h>
 
 __BEGIN_DECLS
 
diff --git a/sunrpc/rpc/rpc_msg.h b/sunrpc/rpc/rpc_msg.h
index 8f6b6a9da4..73996169d6 100644
--- a/sunrpc/rpc/rpc_msg.h
+++ b/sunrpc/rpc/rpc_msg.h
@@ -33,6 +33,7 @@
 #define _RPC_MSG_H 1
 #include <sys/cdefs.h>
 
+#include <rpc/xdr.h>
 #include <rpc/clnt.h>
 
 /*
diff --git a/sunrpc/rpc/xdr.h b/sunrpc/rpc/xdr.h
index eecb1e14be..aa1c702757 100644
--- a/sunrpc/rpc/xdr.h
+++ b/sunrpc/rpc/xdr.h
@@ -39,6 +39,8 @@
 
 #define __XDR_HEADER__
 #include <features.h>
+#include <sys/types.h>
+#include <rpc/types.h>
 
 /* We need FILE.  */
 #include <stdio.h>
@@ -91,8 +93,17 @@ enum xdr_op
  * This is the number of bytes per unit of external data.
  */
 #define BYTES_PER_XDR_UNIT	(4)
+/*
+ * This only works if the above is a power of 2.  But it's defined to be
+ * 4 by the appropriate RFCs.  So it will work.  And it's normally quicker
+ * than the old routine.
+ */
+#if 1
+#define RNDUP(x)  (((x) + BYTES_PER_XDR_UNIT - 1) & ~(BYTES_PER_XDR_UNIT - 1))
+#else /* this is the old routine */
 #define RNDUP(x)  ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \
 		    * BYTES_PER_XDR_UNIT)
+#endif
 
 /*
  * The XDR handle.
@@ -108,7 +119,7 @@ struct XDR
       {
 	bool_t (*x_getlong) __P ((XDR * __xdrs, long *__lp));
 	/* get a long from underlying stream */
-	bool_t (*x_putlong) __P ((XDR * __xdrs, long *__lp));
+	bool_t (*x_putlong) __P ((XDR * __xdrs, __const long *__lp));
 	/* put a long to " */
 	bool_t (*x_getbytes) __P ((XDR * __xdrs, caddr_t __addr, u_int __len));
 	/* get some bytes from " */
@@ -243,6 +254,9 @@ struct xdr_discrim
 
 /*
  * These are the "generic" xdr routines.
+ * None of these can have const applied because it's not possible to
+ * know whether the call is a read or a write to the passed parameter
+ * also, the XDR structure is always updated by some of these calls.
  */
 extern bool_t xdr_void __P ((void));
 extern bool_t xdr_int __P ((XDR * __xdrs, int *__ip));
@@ -294,8 +308,8 @@ extern bool_t xdr_netobj __P ((XDR * __xdrs, struct netobj * __np));
  */
 
 /* XDR using memory buffers */
-extern void xdrmem_create __P ((XDR * __xdrs, caddr_t __addr, u_int __size,
-				enum xdr_op __op));
+extern void xdrmem_create __P ((XDR * __xdrs, __const caddr_t __addr,
+				u_int __size, enum xdr_op __op));
 
 /* XDR using stdio library */
 extern void xdrstdio_create __P ((XDR * __xdrs, FILE * __file,
diff --git a/sunrpc/rpc_cout.c b/sunrpc/rpc_cout.c
index 77319d9b15..ab3b24da74 100644
--- a/sunrpc/rpc_cout.c
+++ b/sunrpc/rpc_cout.c
@@ -45,10 +45,10 @@ char cout_rcsid[] =
 #include "proto.h"
 
 static void emit_enum(definition *def);
-static void emit_program(definition *def);
-static void emit_union(definition *def);
+static void emit_program(const definition *def);
+static void emit_union(const definition *def);
 static void emit_struct(definition *def);
-static void emit_typedef(definition *def);
+static void emit_typedef(const definition *def);
 static int findtype(const definition *def, const char *type);
 static int undefined(const char *type);
 static void print_generic_header(const char *procname, int pointerp);
@@ -59,8 +59,8 @@ static void print_ifclose(int indent);
 static void print_ifstat(int indent, const char *prefix, const char *type,
 			 relation rel, const char *amax,
 			 const char *objname, const char *name);
-static void print_stat(int indent, declaration *dec);
-static void print_header(definition *def);
+static void print_stat(int indent, const declaration *dec);
+static void print_header(const definition *def);
 static void print_trailer(void);
 static char *upcase(const char *str);
 
@@ -77,15 +77,16 @@ emit(definition *def)
 		emit_program(def);
 		return;
 	}
-	if(def->def_kind == DEF_TYPEDEF)
+	if (def->def_kind == DEF_TYPEDEF)
 	  {
 	  /* now we need to handle declarations like
-   struct typedef foo foo;
-   since we don't want this to be expanded into 2 calls to xdr_foo */
+		struct typedef foo foo;
+	     since we don't want this to be expanded
+	     into 2 calls to xdr_foo */
 
- 	if(strcmp(def->def.ty.old_type,def->def_name)==0)
-	  return;
-      };
+	    if (strcmp(def->def.ty.old_type,def->def_name)==0)
+	      return;
+	  };
 
 	print_header(def);
 	switch (def->def_kind) {
@@ -102,7 +103,8 @@ emit(definition *def)
 		emit_typedef(def);
 		break;
 	default:
-	  /* can't happen */
+		/* can't happen */
+		break;
 	}
 	print_trailer();
 }
@@ -110,7 +112,6 @@ emit(definition *def)
 static int
 findtype(const definition *def, const char *type)
 {
-
 	if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {
 		return (0);
 	} else {
@@ -122,10 +123,7 @@ static int
 undefined(const char *type)
 {
 	definition *def;
-
 	def = (definition *) FINDVAL(defined, type, findtype);
-
-
 	return (def == NULL);
 }
 
@@ -153,33 +151,25 @@ print_generic_header(const char *procname, int pointerp)
 }
 
 static void
-print_header(definition *def)
+print_header(const definition *def)
 {
+	print_generic_header(def->def_name,
+			     def->def_kind != DEF_TYPEDEF ||
+			     !isvectordef(def->def.ty.old_type,
+					  def->def.ty.rel));
 
-/*
-  decl_list *dl;
-  bas_type *ptr;
-  int i;
- */
-
-  print_generic_header( def->def_name,
-		       def->def_kind != DEF_TYPEDEF ||
-		       !isvectordef(def->def.ty.old_type, def->def.ty.rel));
-
-  /* Now add Inline support */
-
-
-  if(inlineflag == 0 )
-    return;
-  /*May cause lint to complain. but  ... */
-f_print(fout, "\t register long *buf;\n\n");
+	/* Now add Inline support */
 
+	if(inlineflag == 0 )
+		return;
+	/*May cause lint to complain. but  ... */
+	f_print(fout, "\t register long *buf;\n\n");
 }
 
 static void
-print_prog_header(proc_list *plist)
+print_prog_header(const proc_list *plist)
 {
-  print_generic_header( plist->args.argname, 1 );
+	print_generic_header(plist->args.argname, 1 );
 }
 
 static void
@@ -308,7 +298,7 @@ emit_enum(definition *def)
 }
 
 static void
-emit_program(definition *def)
+emit_program(const definition *def)
 {
 	decl_list *dl;
 	version_list *vlist;
@@ -327,7 +317,7 @@ emit_program(definition *def)
 }
 
 static void
-emit_union(definition *def)
+emit_union(const definition *def)
 {
   declaration *dflt;
   case_list *cl;
@@ -393,6 +383,8 @@ emit_union(definition *def)
   f_print(fout, "\t}\n");
 }
 
+/* this may be const.  i haven't traced this one through yet. */
+
 static void
 emit_struct(definition *def)
 {
@@ -446,9 +438,6 @@ emit_struct(definition *def)
 			return;
 		};
 
-
-
-
 		flag=PUT;
 		for(j=0; j<2; j++){
 
@@ -605,7 +594,7 @@ emit_struct(definition *def)
 
 
 static void
-emit_typedef(definition *def)
+emit_typedef(const definition *def)
 {
 	const char *prefix = def->def.ty.old_prefix;
 	const char *type = def->def.ty.old_type;
@@ -617,7 +606,7 @@ emit_typedef(definition *def)
 }
 
 static void
-print_stat(int indent, declaration *dec)
+print_stat(int indent, const declaration *dec)
 {
 	const char *prefix = dec->prefix;
 	const char *type = dec->type;
diff --git a/sunrpc/rpc_parse.h b/sunrpc/rpc_parse.h
index 07c1f67833..8d48c85a07 100644
--- a/sunrpc/rpc_parse.h
+++ b/sunrpc/rpc_parse.h
@@ -31,7 +31,7 @@
 /*      @(#)rpc_parse.h  1.3  90/08/29  (C) 1987 SMI   */
 
 /*
- * rpc_parse.h, Definitions for the RPCL parser 
+ * rpc_parse.h, Definitions for the RPCL parser
  */
 
 enum defkind {
@@ -50,7 +50,7 @@ enum relation {
 	REL_VECTOR,	/* fixed length array */
 	REL_ARRAY,	/* variable length array */
 	REL_POINTER,	/* pointer */
-	REL_ALIAS,	/* simple */
+	REL_ALIAS	/* simple */
 };
 typedef enum relation relation;
 
@@ -113,7 +113,7 @@ struct arg_list {
 	const char *argname; /* name of struct for arg*/
 	decl_list *decls;
 };
-	
+
 typedef struct arg_list arg_list;
 
 struct proc_list {
diff --git a/sunrpc/rpc_svcout.c b/sunrpc/rpc_svcout.c
index d19b9b45eb..75eb695e87 100644
--- a/sunrpc/rpc_svcout.c
+++ b/sunrpc/rpc_svcout.c
@@ -51,10 +51,10 @@ static const char ROUTINE[] = "local";
 
 char _errbuf[256];		/* For all messages */
 
-static void internal_proctype (proc_list * plist);
+static void internal_proctype (const proc_list * plist);
 static void p_xdrfunc (const char *rname, const char *typename);
-static void write_real_program (definition * def);
-static void write_program (definition * def, const char *storage);
+static void write_real_program (const definition * def);
+static void write_program (const definition * def, const char *storage);
 static void printerr (const char *err, const char *transp);
 static void printif (const char *proc, const char *transp,
 		     const char *prefix, const char *arg);
@@ -78,7 +78,7 @@ p_xdrfunc (const char *rname, const char *typename)
 }
 
 void
-internal_proctype (proc_list * plist)
+internal_proctype (const proc_list * plist)
 {
   f_print (fout, "static ");
   ptype (plist->res_prefix, plist->res_type, 1);
@@ -321,7 +321,7 @@ write_programs (const char *storage)
    Unpacks single user argument of printmsg_1 to call-by-value format
    expected by printmsg_1. */
 static void
-write_real_program (definition * def)
+write_real_program (const definition * def)
 {
   version_list *vp;
   proc_list *proc;
@@ -388,7 +388,7 @@ write_real_program (definition * def)
 }
 
 static void
-write_program (definition * def, const char *storage)
+write_program (const definition * def, const char *storage)
 {
   version_list *vp;
   proc_list *proc;
@@ -566,7 +566,7 @@ printif (const char *proc, const char *transp, const char *prefix,
 }
 
 int
-nullproc (proc_list * proc)
+nullproc (const proc_list * proc)
 {
   for (; proc != NULL; proc = proc->next)
     {
diff --git a/sunrpc/xdr.c b/sunrpc/xdr.c
index d666119376..becc59bed3 100644
--- a/sunrpc/xdr.c
+++ b/sunrpc/xdr.c
@@ -93,10 +93,6 @@ xdr_int (xdrs, ip)
      int *ip;
 {
 
-#ifdef lint
-  (void) (xdr_short (xdrs, (short *) ip));
-  return (xdr_long (xdrs, (long *) ip));
-#else
 #if INT_MAX < LONG_MAX
   long l;
 
@@ -123,7 +119,6 @@ xdr_int (xdrs, ip)
 #else
 #error unexpected integer sizes in_xdr_int()
 #endif
-#endif
 }
 
 /*
@@ -134,10 +129,6 @@ xdr_u_int (xdrs, up)
      XDR *xdrs;
      u_int *up;
 {
-#ifdef lint
-  (void) (xdr_short (xdrs, (short *) up));
-  return (xdr_u_long (xdrs, (u_long *) up));
-#else
 #if UINT_MAX < ULONG_MAX
   u_long l;
 
@@ -164,7 +155,6 @@ xdr_u_int (xdrs, up)
 #else
 #error unexpected integer sizes in_xdr_u_int()
 #endif
-#endif
 }
 
 /*
@@ -349,7 +339,6 @@ xdr_enum (xdrs, ep)
      XDR *xdrs;
      enum_t *ep;
 {
-#ifndef lint
   enum sizecheck
     {
       SIZEVAL
@@ -392,10 +381,6 @@ xdr_enum (xdrs, ep)
     {
       return FALSE;
     }
-#else /* lint */
-  (void) (xdr_short (xdrs, (short *) ep));
-  return xdr_long (xdrs, (long *) ep);
-#endif /* lint */
 }
 
 /*
diff --git a/sunrpc/xdr_float.c b/sunrpc/xdr_float.c
index be5a07d028..2e1e37f0a2 100644
--- a/sunrpc/xdr_float.c
+++ b/sunrpc/xdr_float.c
@@ -87,8 +87,8 @@ static struct sgl_limits {
 
 bool_t
 xdr_float(xdrs, fp)
-	register XDR *xdrs;
-	register float *fp;
+     XDR *xdrs;
+     float *fp;
 {
 #ifdef vax
 	struct ieee_single is;
@@ -207,8 +207,8 @@ static struct dbl_limits {
 
 bool_t
 xdr_double(xdrs, dp)
-	register XDR *xdrs;
-	double *dp;
+     XDR *xdrs;
+     double *dp;
 {
 #ifdef vax
 	struct	ieee_double id;
diff --git a/sunrpc/xdr_mem.c b/sunrpc/xdr_mem.c
index 481a8664b5..8e88e41ea2 100644
--- a/sunrpc/xdr_mem.c
+++ b/sunrpc/xdr_mem.c
@@ -47,13 +47,13 @@ static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";
 #include <rpc/rpc.h>
 
 static bool_t xdrmem_getlong (XDR *, long *);
-static bool_t xdrmem_putlong (XDR *, long *);
+static bool_t xdrmem_putlong (XDR *, const long *);
 static bool_t xdrmem_getbytes (XDR *, caddr_t, u_int);
-static bool_t xdrmem_putbytes (XDR *, caddr_t, u_int);
-static u_int xdrmem_getpos (XDR *);
+static bool_t xdrmem_putbytes (XDR *, const caddr_t, u_int);
+static u_int xdrmem_getpos (const XDR *);
 static bool_t xdrmem_setpos (XDR *, u_int);
 static long *xdrmem_inline (XDR *, int);
-static void xdrmem_destroy (XDR *);
+static void xdrmem_destroy (const XDR *);
 
 static const struct xdr_ops xdrmem_ops =
 {
@@ -74,7 +74,7 @@ static const struct xdr_ops xdrmem_ops =
 void
 xdrmem_create (xdrs, addr, size, op)
      XDR *xdrs;
-     caddr_t addr;
+     const caddr_t addr;
      u_int size;
      enum xdr_op op;
 {
@@ -85,11 +85,21 @@ xdrmem_create (xdrs, addr, size, op)
   xdrs->x_handy = size;
 }
 
+/*
+ * Nothing needs to be done for the memory case.  The argument is clearly
+ * const.
+ */
+
 static void
-xdrmem_destroy (XDR *xdrs)
+xdrmem_destroy (const XDR *xdrs)
 {
 }
 
+/*
+ * Gets the next word from the memory referenced by xdrs and places it
+ * in the long pointed to by lp.  It then increments the private word to
+ * point at the next element.  Neither object pointed to is const
+ */
 static bool_t
 xdrmem_getlong (xdrs, lp)
      XDR *xdrs;
@@ -103,10 +113,15 @@ xdrmem_getlong (xdrs, lp)
   return TRUE;
 }
 
+/*
+ * Puts the long pointed to by lp in the memory referenced by xdrs.  It
+ * then increments the private word to point at the next element.  The
+ * long pointed at is const
+ */
 static bool_t
 xdrmem_putlong (xdrs, lp)
      XDR *xdrs;
-     long *lp;
+     const long *lp;
 {
 
   if ((xdrs->x_handy -= 4) < 0)
@@ -116,6 +131,12 @@ xdrmem_putlong (xdrs, lp)
   return TRUE;
 }
 
+/*
+ * Gets an unaligned number of bytes from the xdrs structure and writes them
+ * to the address passed in addr.  Be very careful when calling this routine
+ * as it could leave the xdrs pointing to an unaligned structure which is not
+ * a good idea.  None of the things pointed to are const.
+ */
 static bool_t
 xdrmem_getbytes (xdrs, addr, len)
      XDR *xdrs;
@@ -130,10 +151,14 @@ xdrmem_getbytes (xdrs, addr, len)
   return TRUE;
 }
 
+/*
+ * The complementary function to the above.  The same warnings apply about
+ * unaligned data.  The source address is const.
+ */
 static bool_t
 xdrmem_putbytes (xdrs, addr, len)
      XDR *xdrs;
-     caddr_t addr;
+     const caddr_t addr;
      u_int len;
 {
 
@@ -144,14 +169,21 @@ xdrmem_putbytes (xdrs, addr, len)
   return TRUE;
 }
 
+/*
+ * Not sure what this one does.  But it clearly doesn't modify the contents
+ * of xdrs.  **FIXME** does this not assume u_int == u_long?
+ */
 static u_int
 xdrmem_getpos (xdrs)
-     XDR *xdrs;
+     const XDR *xdrs;
 {
 
   return (u_long) xdrs->x_private - (u_long) xdrs->x_base;
 }
 
+/*
+ * xdrs modified
+ */
 static bool_t
 xdrmem_setpos (xdrs, pos)
      XDR *xdrs;
@@ -167,6 +199,9 @@ xdrmem_setpos (xdrs, pos)
   return TRUE;
 }
 
+/*
+ * xdrs modified
+ */
 static long *
 xdrmem_inline (xdrs, len)
      XDR *xdrs;
diff --git a/sunrpc/xdr_rec.c b/sunrpc/xdr_rec.c
index af2f9f5ed7..66b33f8456 100644
--- a/sunrpc/xdr_rec.c
+++ b/sunrpc/xdr_rec.c
@@ -54,9 +54,9 @@ static char sccsid[] = "@(#)xdr_rec.c 1.21 87/08/11 Copyr 1984 Sun Micro";
 #include <rpc/rpc.h>
 
 static bool_t xdrrec_getlong (XDR *, long *);
-static bool_t xdrrec_putlong (XDR *, long *);
+static bool_t xdrrec_putlong (XDR *, const long *);
 static bool_t xdrrec_getbytes (XDR *, caddr_t, u_int);
-static bool_t xdrrec_putbytes (XDR *, caddr_t, u_int);
+static bool_t xdrrec_putbytes (XDR *, const caddr_t, u_int);
 static u_int xdrrec_getpos (XDR *);
 static bool_t xdrrec_setpos (XDR *, u_int);
 static long *xdrrec_inline (XDR *, int);
@@ -221,7 +221,7 @@ xdrrec_getlong (xdrs, lp)
 static bool_t
 xdrrec_putlong (xdrs, lp)
      XDR *xdrs;
-     long *lp;
+     const long *lp;
 {
   RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
   int32_t *dest_lp = (int32_t *) rstrm->out_finger;
@@ -276,7 +276,7 @@ xdrrec_getbytes (xdrs, addr, len)
 static bool_t
 xdrrec_putbytes (xdrs, addr, len)
      XDR *xdrs;
-     caddr_t addr;
+     const caddr_t addr;
      u_int len;
 {
   RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
diff --git a/sunrpc/xdr_stdio.c b/sunrpc/xdr_stdio.c
index f95bc70be1..ddd726d8cb 100644
--- a/sunrpc/xdr_stdio.c
+++ b/sunrpc/xdr_stdio.c
@@ -46,9 +46,9 @@ static char sccsid[] = "@(#)xdr_stdio.c 1.16 87/08/11 Copyr 1984 Sun Micro";
 #include <rpc/xdr.h>
 
 static bool_t xdrstdio_getlong (XDR *, long *);
-static bool_t xdrstdio_putlong (XDR *, long *);
+static bool_t xdrstdio_putlong (XDR *, const long *);
 static bool_t xdrstdio_getbytes (XDR *, caddr_t, u_int);
-static bool_t xdrstdio_putbytes (XDR *, caddr_t, u_int);
+static bool_t xdrstdio_putbytes (XDR *, const caddr_t, u_int);
 static u_int xdrstdio_getpos (XDR *);
 static bool_t xdrstdio_setpos (XDR *, u_int);
 static long *xdrstdio_inline (XDR *, int);
@@ -114,7 +114,7 @@ xdrstdio_getlong (xdrs, lp)
 }
 
 static bool_t
-xdrstdio_putlong (XDR *xdrs, long *lp)
+xdrstdio_putlong (XDR *xdrs, const long *lp)
 {
 
   long mycopy = htonl (*lp);
@@ -127,7 +127,7 @@ xdrstdio_putlong (XDR *xdrs, long *lp)
 static bool_t
 xdrstdio_getbytes (xdrs, addr, len)
      XDR *xdrs;
-     caddr_t addr;
+     const caddr_t addr;
      u_int len;
 {
 
@@ -137,7 +137,7 @@ xdrstdio_getbytes (xdrs, addr, len)
 }
 
 static bool_t
-xdrstdio_putbytes (XDR *xdrs, caddr_t addr, u_int len)
+xdrstdio_putbytes (XDR *xdrs, const caddr_t addr, u_int len)
 {
   if ((len != 0) && (fwrite (addr, (int) len, 1, (FILE *) xdrs->x_private) != 1))
     return FALSE;
diff --git a/sysdeps/generic/rpc/auth.h b/sysdeps/generic/rpc/auth.h
index 61cd351485..532c4d295f 100644
--- a/sysdeps/generic/rpc/auth.h
+++ b/sysdeps/generic/rpc/auth.h
@@ -42,6 +42,8 @@
 
 #define _RPC_AUTH_H	1
 #include <features.h>
+#include <sys/types.h>
+#include <rpc/types.h>
 #include <rpc/xdr.h>
 
 __BEGIN_DECLS
@@ -99,7 +101,7 @@ struct AUTH {
   struct auth_ops {
     void (*ah_nextverf) __P ((AUTH *));
     int  (*ah_marshal) __P ((AUTH *, XDR *));	/* nextverf & serialize */
-    int  (*ah_validate) __P ((AUTH *, struct opaque_auth *));	
+    int  (*ah_validate) __P ((AUTH *, struct opaque_auth *));
 						/* validate verifier */
     int  (*ah_refresh) __P ((AUTH *));		/* refresh credentials */
     void (*ah_destroy) __P ((AUTH *));     	/* destroy this structure */
@@ -163,7 +165,7 @@ extern AUTH *authunix_create __P ((char *__machname, __uid_t __uid,
 				   __gid_t *__aup_gids));
 extern AUTH *authunix_create_default __P ((void));
 extern AUTH *authnone_create __P ((void));
-extern AUTH *authdes_create __P ((char *__servername, u_int __window, 
+extern AUTH *authdes_create __P ((char *__servername, u_int __window,
 				  struct sockaddr *__syncaddr,
 				  des_block *__ckey));
 
diff --git a/sysdeps/i386/fpu/__math.h b/sysdeps/i386/fpu/__math.h
index d79fe7dd5c..7758fe8598 100644
--- a/sysdeps/i386/fpu/__math.h
+++ b/sysdeps/i386/fpu/__math.h
@@ -460,7 +460,7 @@ __finite (double __x)
 {
   register int __result;
   __asm__ __volatile__
-    ("orl	$x0x800fffff, %0\n\t"
+    ("orl	$0x800fffff, %0\n\t"
      "incl	%0\n\t"
      "shrl	$31, %0"
      : "=q" (__result) : "0" (((int *) &__x)[1]));
diff --git a/sysdeps/mach/hurd/setitimer.c b/sysdeps/mach/hurd/setitimer.c
index 6cad6eab2e..b0e70e89f9 100644
--- a/sysdeps/mach/hurd/setitimer.c
+++ b/sysdeps/mach/hurd/setitimer.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <ansidecl.h>
 #include <stddef.h>
 #include <errno.h>
 #include <sys/time.h>
@@ -310,9 +309,8 @@ setitimer_locked (const struct itimerval *new, struct itimerval *old,
    set *OLD to the old value of timer WHICH.
    Returns 0 on success, -1 on errors.  */
 int
-DEFUN(__setitimer, (which, new, old),
-      enum __itimer_which which AND
-      struct itimerval *new AND struct itimerval *old)
+__setitimer (enum __itimer_which which, const struct itimerval *new,
+	     struct itimerval *old)
 {
   void *crit;
 
diff --git a/sysdeps/powerpc/Dist b/sysdeps/powerpc/Dist
new file mode 100644
index 0000000000..ba908dc0cb
--- /dev/null
+++ b/sysdeps/powerpc/Dist
@@ -0,0 +1 @@
+fenv_libc.h
diff --git a/sysdeps/powerpc/Makefile b/sysdeps/powerpc/Makefile
new file mode 100644
index 0000000000..4100901d62
--- /dev/null
+++ b/sysdeps/powerpc/Makefile
@@ -0,0 +1,3 @@
+ifeq ($(subdir),math)
+libm-support += fenv_const
+endif
diff --git a/sysdeps/powerpc/__longjmp.S b/sysdeps/powerpc/__longjmp.S
index da621e22c0..02292a0eb2 100644
--- a/sysdeps/powerpc/__longjmp.S
+++ b/sysdeps/powerpc/__longjmp.S
@@ -22,46 +22,46 @@
 #include <jmp_buf.h>
 
 ENTRY (__longjmp)
-	lwz 1,(JB_GPR1*4)(3)
-	lwz 2,(JB_GPR2*4)(3)
-	lwz 0,(JB_LR*4)(3)
-	lwz 14,((JB_GPRS+0)*4)(3)
-	lfd 14,((JB_FPRS+0*2)*4)(3)
-	lwz 15,((JB_GPRS+1)*4)(3)
-	lfd 15,((JB_FPRS+1*2)*4)(3)
-	lwz 16,((JB_GPRS+2)*4)(3)
-	lfd 16,((JB_FPRS+2*2)*4)(3)
-	lwz 17,((JB_GPRS+3)*4)(3)
-	lfd 17,((JB_FPRS+3*2)*4)(3)
-	lwz 18,((JB_GPRS+4)*4)(3)
-	lfd 18,((JB_FPRS+4*2)*4)(3)
-	lwz 19,((JB_GPRS+5)*4)(3)
-	lfd 19,((JB_FPRS+5*2)*4)(3)
-	lwz 20,((JB_GPRS+6)*4)(3)
-	lfd 20,((JB_FPRS+6*2)*4)(3)
-	mtlr 0
-	lwz 21,((JB_GPRS+7)*4)(3)
-	lfd 21,((JB_FPRS+7*2)*4)(3)
-	lwz 22,((JB_GPRS+8)*4)(3)
-	lfd 22,((JB_FPRS+8*2)*4)(3)
-	lwz 23,((JB_GPRS+9)*4)(3)
-	lfd 23,((JB_FPRS+9*2)*4)(3)
-	lwz 24,((JB_GPRS+10)*4)(3)
-	lfd 24,((JB_FPRS+10*2)*4)(3)
-	lwz 25,((JB_GPRS+11)*4)(3)
-	lfd 25,((JB_FPRS+11*2)*4)(3)
-	lwz 26,((JB_GPRS+12)*4)(3)
-	lfd 26,((JB_FPRS+12*2)*4)(3)
-	lwz 27,((JB_GPRS+13)*4)(3)
-	lfd 27,((JB_FPRS+13*2)*4)(3)
-	lwz 28,((JB_GPRS+14)*4)(3)
-	lfd 28,((JB_FPRS+14*2)*4)(3)
-	lwz 29,((JB_GPRS+15)*4)(3)
-	lfd 29,((JB_FPRS+15*2)*4)(3)
-	lwz 30,((JB_GPRS+16)*4)(3)
-	lfd 30,((JB_FPRS+16*2)*4)(3)
-	lwz 31,((JB_GPRS+17)*4)(3)
-	lfd 31,((JB_FPRS+17*2)*4)(3)
-	mr 3,4
+	lwz %r1,(JB_GPR1*4)(%r3)
+	lwz %r2,(JB_GPR2*4)(%r3)
+	lwz %r0,(JB_LR*4)(%r3)
+	lwz %r14,((JB_GPRS+0)*4)(%r3)
+	lfd %f14,((JB_FPRS+0*2)*4)(%r3)
+	lwz %r15,((JB_GPRS+1)*4)(%r3)
+	lfd %f15,((JB_FPRS+1*2)*4)(%r3)
+	lwz %r16,((JB_GPRS+2)*4)(%r3)
+	lfd %f16,((JB_FPRS+2*2)*4)(%r3)
+	lwz %r17,((JB_GPRS+3)*4)(%r3)
+	lfd %f17,((JB_FPRS+3*2)*4)(%r3)
+	lwz %r18,((JB_GPRS+4)*4)(%r3)
+	lfd %f18,((JB_FPRS+4*2)*4)(%r3)
+	lwz %r19,((JB_GPRS+5)*4)(%r3)
+	lfd %f19,((JB_FPRS+5*2)*4)(%r3)
+	lwz %r20,((JB_GPRS+6)*4)(%r3)
+	lfd %f20,((JB_FPRS+6*2)*4)(%r3)
+	mtlr %r0
+	lwz %r21,((JB_GPRS+7)*4)(%r3)
+	lfd %f21,((JB_FPRS+7*2)*4)(%r3)
+	lwz %r22,((JB_GPRS+8)*4)(%r3)
+	lfd %f22,((JB_FPRS+8*2)*4)(%r3)
+	lwz %r23,((JB_GPRS+9)*4)(%r3)
+	lfd %f23,((JB_FPRS+9*2)*4)(%r3)
+	lwz %r24,((JB_GPRS+10)*4)(%r3)
+	lfd %f24,((JB_FPRS+10*2)*4)(%r3)
+	lwz %r25,((JB_GPRS+11)*4)(%r3)
+	lfd %f25,((JB_FPRS+11*2)*4)(%r3)
+	lwz %r26,((JB_GPRS+12)*4)(%r3)
+	lfd %f26,((JB_FPRS+12*2)*4)(%r3)
+	lwz %r27,((JB_GPRS+13)*4)(%r3)
+	lfd %f27,((JB_FPRS+13*2)*4)(%r3)
+	lwz %r28,((JB_GPRS+14)*4)(%r3)
+	lfd %f28,((JB_FPRS+14*2)*4)(%r3)
+	lwz %r29,((JB_GPRS+15)*4)(%r3)
+	lfd %f29,((JB_FPRS+15*2)*4)(%r3)
+	lwz %r30,((JB_GPRS+16)*4)(%r3)
+	lfd %f30,((JB_FPRS+16*2)*4)(%r3)
+	lwz %r31,((JB_GPRS+17)*4)(%r3)
+	lfd %f31,((JB_FPRS+17*2)*4)(%r3)
+	mr %r3,%r4
 	blr
 END (__longjmp)
diff --git a/sysdeps/powerpc/__math.h b/sysdeps/powerpc/__math.h
index 9dc19a91a5..db9688cfc5 100644
--- a/sysdeps/powerpc/__math.h
+++ b/sysdeps/powerpc/__math.h
@@ -64,25 +64,6 @@ fabs (double __x)
   return __value;
 }
 
-/* Optimized versions for some non-standardized functions.  */
-#ifdef __USE_MISC
-
-__MATH_INLINE double hypot (double __x, double __y);
-__MATH_INLINE double
-hypot (double __x, double __y)
-{
-  return sqrt (__x * __x + __y * __y);
-}
-
-__MATH_INLINE double __sgn (double __x);
-__MATH_INLINE double
-sgn (double __x)
-{
-  return (__x == 0.0 ? 0.0 : (__x > 0.0 ? 1.0 : -1.0));
-}
-
-#endif /* __USE_MISC  */
-
 #endif /* __NO_MATH_INLINES  */
 #endif /* __GNUC__  */
 
diff --git a/sysdeps/powerpc/bsd-_setjmp.S b/sysdeps/powerpc/bsd-_setjmp.S
index a9aefcc977..ffd90d5bd2 100644
--- a/sysdeps/powerpc/bsd-_setjmp.S
+++ b/sysdeps/powerpc/bsd-_setjmp.S
@@ -24,7 +24,7 @@
 #include <sysdep.h>
 
 ENTRY (_setjmp)
-	li 4,0				/* Set second argument to 0.  */
+	li %r4,0			/* Set second argument to 0.  */
 #ifdef PIC
 	b __sigsetjmp@plt
 #else
diff --git a/sysdeps/powerpc/bsd-setjmp.S b/sysdeps/powerpc/bsd-setjmp.S
index 1a6300660e..f02d7815ed 100644
--- a/sysdeps/powerpc/bsd-setjmp.S
+++ b/sysdeps/powerpc/bsd-setjmp.S
@@ -24,7 +24,7 @@
 #include <sysdep.h>
 
 ENTRY (__setjmp)
-	li 4,1				/* Set second argument to 1.  */
+	li %r4,1			/* Set second argument to 1.  */
 #ifdef PIC
 	b __sigsetjmp@plt
 #else
diff --git a/sysdeps/powerpc/dl-machine.h b/sysdeps/powerpc/dl-machine.h
index 3ad5ca89c9..cfada93cd4 100644
--- a/sysdeps/powerpc/dl-machine.h
+++ b/sysdeps/powerpc/dl-machine.h
@@ -17,6 +17,9 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#ifndef dl_machine_h
+#define dl_machine_h
+
 #define ELF_MACHINE_NAME "powerpc"
 
 #include <assert.h>
@@ -134,318 +137,13 @@ elf_machine_load_address (void)
 
   /* So now work out the difference between where the branch actually points,
      and the offset of that location in memory from the start of the file.  */
-  return (Elf32_Addr)branchaddr - *got +
-    (*branchaddr & 0x3fffffc |
-     (int)(*branchaddr << 6 & 0x80000000) >> 6);
+  return ((Elf32_Addr)branchaddr - *got
+	  + (*branchaddr & 0x3fffffc
+	     | (int)(*branchaddr << 6 & 0x80000000) >> 6));
 }
 
 #define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info) /* nothing */
 
-/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
-   LOADADDR is the load address of the object; INFO is an array indexed
-   by DT_* of the .dynamic section info.  */
-
-#ifdef RESOLVE
-
-static inline void
-elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
-		  const Elf32_Sym *sym, const struct r_found_version *version)
-{
-  const Elf32_Sym *const refsym = sym;
-  Elf32_Addr *const reloc_addr = (Elf32_Addr *)(map->l_addr + reloc->r_offset);
-  Elf32_Word loadbase, finaladdr;
-  const int rinfo = ELF32_R_TYPE (reloc->r_info);
-
-  if (rinfo == R_PPC_NONE)
-    return;
-
-  assert (sym != NULL);
-  if (ELF32_ST_TYPE (sym->st_info) == STT_SECTION ||
-      rinfo == R_PPC_RELATIVE)
-    {
-      /* Has already been relocated.  */
-      loadbase = map->l_addr;
-      finaladdr = loadbase + reloc->r_addend;
-    }
-  else
-    {
-      int flags;
-
-      /* We never want to use a PLT entry as the destination of a
-	 reloc, when what is being relocated is a branch. This is
-	 partly for efficiency, but mostly so we avoid loops.  */
-      if (rinfo == R_PPC_REL24 ||
-	  rinfo == R_PPC_ADDR24 ||
-	  rinfo == R_PPC_JMP_SLOT)
-	flags = DL_LOOKUP_NOPLT;
-      else if (rinfo == R_PPC_COPY)
-	flags = DL_LOOKUP_NOEXEC;
-      else
-	flags = 0;
-
-      loadbase = (Elf32_Word) (char *) (RESOLVE (&sym, version, flags));
-      if (sym == NULL)
-	{
-	  /* Weak symbol that wasn't actually defined anywhere.  */
-	  assert(loadbase == 0);
-	  finaladdr = reloc->r_addend;
-	}
-      else
-	finaladdr = (loadbase + (Elf32_Word) (char *) sym->st_value
-		     + reloc->r_addend);
-    }
-
-  /* This is an if/else if chain because GCC 2.7.2.[012] turns case
-     statements into non-PIC table lookups.  When a later version
-     comes out that fixes this, this should be changed.  */
-  if (rinfo == R_PPC_UADDR32 ||
-      rinfo == R_PPC_GLOB_DAT ||
-      rinfo == R_PPC_ADDR32 ||
-      rinfo == R_PPC_RELATIVE)
-    {
-      *reloc_addr = finaladdr;
-    }
-  else if (rinfo == R_PPC_ADDR16_LO)
-    {
-      *(Elf32_Half*) reloc_addr = finaladdr;
-    }
-  else if (rinfo == R_PPC_ADDR16_HI)
-    {
-      *(Elf32_Half*) reloc_addr = finaladdr >> 16;
-    }
-  else if (rinfo == R_PPC_ADDR16_HA)
-    {
-      *(Elf32_Half*) reloc_addr = (finaladdr + 0x8000) >> 16;
-    }
-#ifndef RTLD_BOOTSTRAP
-  else if (rinfo == R_PPC_REL24)
-    {
-      Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
-      if (delta << 6 >> 6 != delta)
-	_dl_signal_error (0, map->l_name,
-			  "R_PPC_REL24 relocation out of range");
-      *reloc_addr = *reloc_addr & 0xfc000003 | delta & 0x3fffffc;
-    }
-  else if (rinfo == R_PPC_ADDR24)
-    {
-      if (finaladdr << 6 >> 6 != finaladdr)
-	_dl_signal_error (0, map->l_name,
-			  "R_PPC_ADDR24 relocation out of range");
-      *reloc_addr = *reloc_addr & 0xfc000003 | finaladdr & 0x3fffffc;
-    }
-  else if (rinfo == R_PPC_COPY)
-    {
-      if (sym->st_size != refsym->st_size)
-	{
-	  const char *strtab;
-
-	  strtab = ((void *) map->l_addr
-		    + map->l_info[DT_STRTAB]->d_un.d_ptr);
-	  _dl_sysdep_error ("Symbol `", strtab + refsym->st_name,
-			    "' has different size in shared object, "
-			    "consider re-linking\n", NULL);
-	}
-      memcpy (reloc_addr, (char *) finaladdr, MIN (sym->st_size,
-						   refsym->st_size));
-    }
-#endif
-  else if (rinfo == R_PPC_REL32)
-    {
-      *reloc_addr = finaladdr - (Elf32_Word) (char *) reloc_addr;
-    }
-  else if (rinfo == R_PPC_JMP_SLOT)
-    {
-      Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
-      if (delta << 6 >> 6 == delta)
-	*reloc_addr = OPCODE_B (delta);
-      else if (finaladdr <= 0x01fffffc || finaladdr >= 0xfe000000)
-	*reloc_addr = OPCODE_BA (finaladdr);
-      else
-	{
-	  Elf32_Word *plt;
-	  Elf32_Word index;
-
-	  plt = (Elf32_Word *)((char *)map->l_addr
-			       + map->l_info[DT_PLTGOT]->d_un.d_val);
-	  index = (reloc_addr - plt - PLT_INITIAL_ENTRY_WORDS)/2;
-
-	  if (index >= PLT_DOUBLE_SIZE)
-	    {
-	      /* Slots greater than or equal to 2^13 have 4 words available
-		 instead of two.  */
-	      reloc_addr[0] = OPCODE_LI (11, finaladdr);
-	      reloc_addr[1] = OPCODE_ADDIS (11, 11, finaladdr + 0x8000 >> 16);
-	      reloc_addr[2] = OPCODE_MTCTR (11);
-	      reloc_addr[3] = OPCODE_BCTR ();
-	    }
-	  else
-	    {
-	      Elf32_Word num_plt_entries;
-
-	      num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
-				 / sizeof(Elf32_Rela));
-
-	      reloc_addr[0] = OPCODE_LI (11, index*4);
-	      reloc_addr[1] =
-		OPCODE_B (-(4*(index*2
-			       + 1
-			       - PLT_LONGBRANCH_ENTRY_WORDS
-			       + PLT_INITIAL_ENTRY_WORDS)));
-	      plt[index+PLT_DATA_START_WORDS (num_plt_entries)] = finaladdr;
-	    }
-	}
-      MODIFIED_CODE (reloc_addr);
-    }
-  else
-    assert (! "unexpected dynamic reloc type");
-
-  if (rinfo == R_PPC_ADDR16_LO ||
-      rinfo == R_PPC_ADDR16_HI ||
-      rinfo == R_PPC_ADDR16_HA ||
-      rinfo == R_PPC_REL24 ||
-      rinfo == R_PPC_ADDR24)
-    MODIFIED_CODE_NOQUEUE (reloc_addr);
-}
-
-#define ELF_MACHINE_NO_REL 1
-
-#endif
-
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
-#define elf_machine_pltrel_p(type) ((type) == R_PPC_JMP_SLOT)
-
-/* Set up the loaded object described by L so its unrelocated PLT
-   entries will jump to the on-demand fixup code in dl-runtime.c.
-   Also install a small trampoline to be used by entries that have
-   been relocated to an address too far away for a single branch.  */
-
-/* A PLT entry does one of three things:
-   (i)   Jumps to the actual routine. Such entries are set up above, in
-         elf_machine_rela.
-
-   (ii)  Jumps to the actual routine via glue at the start of the PLT.
-         We do this by putting the address of the routine in space
-         allocated at the end of the PLT, and when the PLT entry is
-         called we load the offset of that word (from the start of the
-         space) into r11, then call the glue, which loads the word and
-         branches to that address. These entries are set up in
-         elf_machine_rela, but the glue is set up here.
-
-   (iii) Loads the index of this PLT entry (we count the double-size
-	 entries as one entry for this purpose) into r11, then
-	 branches to code at the start of the PLT. This code then
-	 calls `fixup', in dl-runtime.c, via the glue in the macro
-	 ELF_MACHINE_RUNTIME_TRAMPOLINE, which resets the PLT entry to
-	 be one of the above two types. These entries are set up here.  */
-static inline void
-elf_machine_runtime_setup (struct link_map *map, int lazy)
-{
-  if (map->l_info[DT_JMPREL])
-    {
-      int i;
-      /* Fill in the PLT. Its initial contents are directed to a
-	 function earlier in the PLT which arranges for the dynamic
-	 linker to be called back.  */
-      Elf32_Word *plt = (Elf32_Word *) ((char *) map->l_addr
-					+ map->l_info[DT_PLTGOT]->d_un.d_val);
-      Elf32_Word num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
-				    / sizeof (Elf32_Rela));
-      Elf32_Word rel_offset_words = PLT_DATA_START_WORDS (num_plt_entries);
-      extern void _dl_runtime_resolve (void);
-      Elf32_Word size_modified;
-
-      if (lazy)
-	for (i = 0; i < num_plt_entries; i++)
-	{
-	  Elf32_Word offset = PLT_ENTRY_START_WORDS (i);
-
-	  if (i >= PLT_DOUBLE_SIZE)
-	    {
-	      plt[offset  ] = OPCODE_LI (11, i * 4);
-	      plt[offset+1] = OPCODE_ADDIS (11, 11, (i * 4 + 0x8000) >> 16);
-	      plt[offset+2] = OPCODE_B (-(4 * (offset + 2)));
-	    }
-	  else
-	    {
-	      plt[offset  ] = OPCODE_LI (11, i * 4);
-	      plt[offset+1] = OPCODE_B (-(4 * (offset + 1)));
-	    }
-	}
-
-      /* Multiply index of entry by 3 (in r11).  */
-      plt[0] = OPCODE_SLWI (12, 11, 1);
-      plt[1] = OPCODE_ADD (11, 12, 11);
-      if ((Elf32_Word) (char *) _dl_runtime_resolve <= 0x01fffffc ||
-	  (Elf32_Word) (char *) _dl_runtime_resolve >= 0xfe000000)
-	{
-	  /* Load address of link map in r12.  */
-	  plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) map);
-	  plt[3] = OPCODE_ADDIS (12, 12, (((Elf32_Word) (char *) map
-					   + 0x8000) >> 16));
-
-	  /* Call _dl_runtime_resolve.  */
-	  plt[4] = OPCODE_BA ((Elf32_Word) (char *) _dl_runtime_resolve);
-	}
-      else
-	{
-	  /* Get address of _dl_runtime_resolve in CTR.  */
-	  plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) _dl_runtime_resolve);
-	  plt[3] = OPCODE_ADDIS (12, 12, ((((Elf32_Word) (char *)
-					    _dl_runtime_resolve)
-					   + 0x8000) >> 16));
-	  plt[4] = OPCODE_MTCTR (12);
-
-	  /* Load address of link map in r12.  */
-	  plt[5] = OPCODE_LI (12, (Elf32_Word) (char *) map);
-	  plt[6] = OPCODE_ADDIS (12, 12, (((Elf32_Word) (char *) map
-					   + 0x8000) >> 16));
-
-	  /* Call _dl_runtime_resolve.  */
-	  plt[7] = OPCODE_BCTR ();
-	}
-
-
-      /* Convert the index in r11 into an actual address, and get the
-	 word at that address.  */
-      plt[PLT_LONGBRANCH_ENTRY_WORDS] =
-	OPCODE_ADDIS (11, 11, (((Elf32_Word) (char*) (plt + rel_offset_words)
-				+ 0x8000) >> 16));
-      plt[PLT_LONGBRANCH_ENTRY_WORDS+1] =
-	OPCODE_LWZ (11, (Elf32_Word) (char*) (plt+rel_offset_words), 11);
-
-      /* Call the procedure at that address.  */
-      plt[PLT_LONGBRANCH_ENTRY_WORDS+2] = OPCODE_MTCTR (11);
-      plt[PLT_LONGBRANCH_ENTRY_WORDS+3] = OPCODE_BCTR ();
-
-
-      /* Now, we've modified code (quite a lot of code, possibly).  We
-	 need to write the changes from the data cache to a
-	 second-level unified cache, then make sure that stale data in
-	 the instruction cache is removed.  (In a multiprocessor
-	 system, the effect is more complex.)
-
-	 Assumes the cache line size is at least 32 bytes, or at least
-	 that dcbst and icbi apply to 32-byte lines. At present, all
-	 PowerPC processors have line sizes of exactly 32 bytes.  */
-
-      size_modified = lazy ? rel_offset_words : PLT_INITIAL_ENTRY_WORDS;
-      for (i = 0; i < size_modified; i+=8)
-	PPC_DCBST (plt + i);
-      PPC_SYNC;
-      for (i = 0; i < size_modified; i+=8)
-	PPC_ICBI (plt + i);
-      PPC_ISYNC;
-    }
-}
-
-static inline void
-elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
-{
-  assert (ELF32_R_TYPE (reloc->r_info) == R_PPC_JMP_SLOT);
-  /* elf_machine_runtime_setup handles this. */
-}
-
 /* The PLT uses Elf32_Rela relocs.  */
 #define elf_machine_relplt elf_machine_rela
 
@@ -617,7 +315,7 @@ _start:
    information here about the way memory is mapped.  */
 
 #define ELF_PREFERRED_ADDRESS_DATA					      \
-static ElfW(Addr) _dl_preferred_address = 1;
+static ElfW(Addr) _dl_preferred_address = 1
 
 #define ELF_PREFERRED_ADDRESS(loader, maplength, mapstartpref)		      \
 ( {									      \
@@ -645,4 +343,326 @@ static ElfW(Addr) _dl_preferred_address = 1;
      _dl_preferred_address = mapstart;					      \
 } )
 
+/* We require the address of the PLT entry returned from fixup, not
+   the first word of the PLT entry. */
 #define ELF_FIXUP_RETURNS_ADDRESS 1
+
+/* Nonzero iff TYPE should not be allowed to resolve to one of
+   the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_lookup_noexec_p(type) ((type) == R_PPC_COPY)
+
+/* Nonzero iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.  */
+/* We never want to use a PLT entry as the destination of a
+   reloc, when what is being relocated is a branch. This is
+   partly for efficiency, but mostly so we avoid loops.  */
+#define elf_machine_lookup_noplt_p(type) ((type) == R_PPC_REL24 ||            \
+					  (type) == R_PPC_ADDR24 ||           \
+					  (type) == R_PPC_JMP_SLOT)
+
+/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
+#define ELF_MACHINE_RELOC_NOPLT	R_PPC_JMP_SLOT
+
+/* Nonzero iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.  */
+#define elf_machine_pltrel_p(type) ((type) == R_PPC_JMP_SLOT)
+
+/* Set up the loaded object described by L so its unrelocated PLT
+   entries will jump to the on-demand fixup code in dl-runtime.c.
+   Also install a small trampoline to be used by entries that have
+   been relocated to an address too far away for a single branch.  */
+
+/* A PLT entry does one of three things:
+   (i)   Jumps to the actual routine. Such entries are set up above, in
+         elf_machine_rela.
+
+   (ii)  Jumps to the actual routine via glue at the start of the PLT.
+         We do this by putting the address of the routine in space
+         allocated at the end of the PLT, and when the PLT entry is
+         called we load the offset of that word (from the start of the
+         space) into r11, then call the glue, which loads the word and
+         branches to that address. These entries are set up in
+         elf_machine_rela, but the glue is set up here.
+
+   (iii) Loads the index of this PLT entry (we count the double-size
+	 entries as one entry for this purpose) into r11, then
+	 branches to code at the start of the PLT. This code then
+	 calls `fixup', in dl-runtime.c, via the glue in the macro
+	 ELF_MACHINE_RUNTIME_TRAMPOLINE, which resets the PLT entry to
+	 be one of the above two types. These entries are set up here.  */
+static inline void
+elf_machine_runtime_setup (struct link_map *map, int lazy)
+{
+  if (map->l_info[DT_JMPREL])
+    {
+      int i;
+      /* Fill in the PLT. Its initial contents are directed to a
+	 function earlier in the PLT which arranges for the dynamic
+	 linker to be called back.  */
+      Elf32_Word *plt = (Elf32_Word *) ((char *) map->l_addr
+					+ map->l_info[DT_PLTGOT]->d_un.d_val);
+      Elf32_Word num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
+				    / sizeof (Elf32_Rela));
+      Elf32_Word rel_offset_words = PLT_DATA_START_WORDS (num_plt_entries);
+      extern void _dl_runtime_resolve (void);
+      Elf32_Word size_modified;
+
+      if (lazy)
+	for (i = 0; i < num_plt_entries; i++)
+	{
+	  Elf32_Word offset = PLT_ENTRY_START_WORDS (i);
+
+	  if (i >= PLT_DOUBLE_SIZE)
+	    {
+	      plt[offset  ] = OPCODE_LI (11, i * 4);
+	      plt[offset+1] = OPCODE_ADDIS (11, 11, (i * 4 + 0x8000) >> 16);
+	      plt[offset+2] = OPCODE_B (-(4 * (offset + 2)));
+	    }
+	  else
+	    {
+	      plt[offset  ] = OPCODE_LI (11, i * 4);
+	      plt[offset+1] = OPCODE_B (-(4 * (offset + 1)));
+	    }
+	}
+
+      /* Multiply index of entry by 3 (in r11).  */
+      plt[0] = OPCODE_SLWI (12, 11, 1);
+      plt[1] = OPCODE_ADD (11, 12, 11);
+      if ((Elf32_Word) (char *) _dl_runtime_resolve <= 0x01fffffc ||
+	  (Elf32_Word) (char *) _dl_runtime_resolve >= 0xfe000000)
+	{
+	  /* Load address of link map in r12.  */
+	  plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) map);
+	  plt[3] = OPCODE_ADDIS (12, 12, (((Elf32_Word) (char *) map
+					   + 0x8000) >> 16));
+
+	  /* Call _dl_runtime_resolve.  */
+	  plt[4] = OPCODE_BA ((Elf32_Word) (char *) _dl_runtime_resolve);
+	}
+      else
+	{
+	  /* Get address of _dl_runtime_resolve in CTR.  */
+	  plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) _dl_runtime_resolve);
+	  plt[3] = OPCODE_ADDIS (12, 12, ((((Elf32_Word) (char *)
+					    _dl_runtime_resolve)
+					   + 0x8000) >> 16));
+	  plt[4] = OPCODE_MTCTR (12);
+
+	  /* Load address of link map in r12.  */
+	  plt[5] = OPCODE_LI (12, (Elf32_Word) (char *) map);
+	  plt[6] = OPCODE_ADDIS (12, 12, (((Elf32_Word) (char *) map
+					   + 0x8000) >> 16));
+
+	  /* Call _dl_runtime_resolve.  */
+	  plt[7] = OPCODE_BCTR ();
+	}
+
+
+      /* Convert the index in r11 into an actual address, and get the
+	 word at that address.  */
+      plt[PLT_LONGBRANCH_ENTRY_WORDS] =
+	OPCODE_ADDIS (11, 11, (((Elf32_Word) (char*) (plt + rel_offset_words)
+				+ 0x8000) >> 16));
+      plt[PLT_LONGBRANCH_ENTRY_WORDS+1] =
+	OPCODE_LWZ (11, (Elf32_Word) (char*) (plt+rel_offset_words), 11);
+
+      /* Call the procedure at that address.  */
+      plt[PLT_LONGBRANCH_ENTRY_WORDS+2] = OPCODE_MTCTR (11);
+      plt[PLT_LONGBRANCH_ENTRY_WORDS+3] = OPCODE_BCTR ();
+
+
+      /* Now, we've modified code (quite a lot of code, possibly).  We
+	 need to write the changes from the data cache to a
+	 second-level unified cache, then make sure that stale data in
+	 the instruction cache is removed.  (In a multiprocessor
+	 system, the effect is more complex.)
+
+	 Assumes the cache line size is at least 32 bytes, or at least
+	 that dcbst and icbi apply to 32-byte lines. At present, all
+	 PowerPC processors have line sizes of exactly 32 bytes.  */
+
+      size_modified = lazy ? rel_offset_words : PLT_INITIAL_ENTRY_WORDS;
+      for (i = 0; i < size_modified; i+=8)
+	PPC_DCBST (plt + i);
+      PPC_SYNC;
+      for (i = 0; i < size_modified; i+=8)
+	PPC_ICBI (plt + i);
+      PPC_ISYNC;
+    }
+}
+
+static inline void
+elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
+{
+  assert (ELF32_R_TYPE (reloc->r_info) == R_PPC_JMP_SLOT);
+  /* elf_machine_runtime_setup handles this. */
+}
+
+#endif /* dl_machine_h */
+
+#ifdef RESOLVE
+
+/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+   LOADADDR is the load address of the object; INFO is an array indexed
+   by DT_* of the .dynamic section info.  */
+
+static inline void
+elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
+		  const Elf32_Sym *sym, const struct r_found_version *version)
+{
+  const Elf32_Sym *const refsym = sym;
+  Elf32_Addr *const reloc_addr = (Elf32_Addr *)(map->l_addr + reloc->r_offset);
+  Elf32_Word loadbase, finaladdr;
+  const int rinfo = ELF32_R_TYPE (reloc->r_info);
+
+  if (rinfo == R_PPC_NONE)
+    return;
+
+  assert (sym != NULL);
+  /* The condition on the next two lines is a hack around a bug in Solaris
+     tools on Sparc.  It's not clear whether it should really be here at all,
+     but if not the binutils need to be changed.  */
+  if ((sym->st_shndx != SHN_UNDEF
+       && ELF32_ST_BIND (sym->st_info) == STB_LOCAL)
+      || rinfo == R_PPC_RELATIVE)
+    {
+      /* Has already been relocated.  */
+      loadbase = map->l_addr;
+      finaladdr = loadbase + reloc->r_addend;
+    }
+  else
+    {
+      loadbase = (Elf32_Word) (char *) (RESOLVE (&sym, version,
+						 ELF32_R_TYPE(reloc->r_info)));
+      if (sym == NULL)
+	{
+	  /* Weak symbol that wasn't actually defined anywhere.  */
+	  assert(loadbase == 0);
+	  finaladdr = reloc->r_addend;
+	}
+      else
+	finaladdr = (loadbase + (Elf32_Word) (char *) sym->st_value
+		     + reloc->r_addend);
+    }
+
+  /* This is an if/else if chain because GCC 2.7.2.[012] turns case
+     statements into non-PIC table lookups.  When a later version
+     comes out that fixes this, this should be changed.  */
+  if (rinfo == R_PPC_UADDR32 ||
+      rinfo == R_PPC_GLOB_DAT ||
+      rinfo == R_PPC_ADDR32 ||
+      rinfo == R_PPC_RELATIVE)
+    {
+      *reloc_addr = finaladdr;
+    }
+  else if (rinfo == R_PPC_ADDR16_LO)
+    {
+      *(Elf32_Half*) reloc_addr = finaladdr;
+    }
+  else if (rinfo == R_PPC_ADDR16_HI)
+    {
+      *(Elf32_Half*) reloc_addr = finaladdr >> 16;
+    }
+  else if (rinfo == R_PPC_ADDR16_HA)
+    {
+      *(Elf32_Half*) reloc_addr = (finaladdr + 0x8000) >> 16;
+    }
+#ifndef RTLD_BOOTSTRAP
+  else if (rinfo == R_PPC_REL24)
+    {
+      Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
+      if (delta << 6 >> 6 != delta)
+	{
+	  _dl_signal_error(0, map->l_name,
+			   "R_PPC_REL24 relocation out of range");
+	}
+      *reloc_addr = *reloc_addr & 0xfc000003 | delta & 0x3fffffc;
+    }
+  else if (rinfo == R_PPC_ADDR24)
+    {
+      if (finaladdr << 6 >> 6 != finaladdr)
+	{
+	  _dl_signal_error(0, map->l_name,
+			   "R_PPC_ADDR24 relocation out of range");
+	}
+      *reloc_addr = *reloc_addr & 0xfc000003 | finaladdr & 0x3fffffc;
+    }
+  else if (rinfo == R_PPC_COPY)
+    {
+      if (sym->st_size != refsym->st_size)
+	{
+	  const char *strtab;
+
+	  strtab = ((void *) map->l_addr
+		    + map->l_info[DT_STRTAB]->d_un.d_ptr);
+	  _dl_sysdep_error ("Symbol `", strtab + refsym->st_name,
+			    "' has different size in shared object, "
+			    "consider re-linking\n", NULL);
+	}
+      memcpy (reloc_addr, (char *) finaladdr, MIN (sym->st_size,
+						   refsym->st_size));
+    }
+#endif
+  else if (rinfo == R_PPC_REL32)
+    {
+      *reloc_addr = finaladdr - (Elf32_Word) (char *) reloc_addr;
+    }
+  else if (rinfo == R_PPC_JMP_SLOT)
+    {
+      Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
+      if (delta << 6 >> 6 == delta)
+	*reloc_addr = OPCODE_B (delta);
+      else if (finaladdr <= 0x01fffffc || finaladdr >= 0xfe000000)
+	*reloc_addr = OPCODE_BA (finaladdr);
+      else
+	{
+	  Elf32_Word *plt;
+	  Elf32_Word index;
+
+	  plt = (Elf32_Word *)((char *)map->l_addr
+			       + map->l_info[DT_PLTGOT]->d_un.d_val);
+	  index = (reloc_addr - plt - PLT_INITIAL_ENTRY_WORDS)/2;
+
+	  if (index >= PLT_DOUBLE_SIZE)
+	    {
+	      /* Slots greater than or equal to 2^13 have 4 words available
+		 instead of two.  */
+	      reloc_addr[0] = OPCODE_LI (11, finaladdr);
+	      reloc_addr[1] = OPCODE_ADDIS (11, 11, finaladdr + 0x8000 >> 16);
+	      reloc_addr[2] = OPCODE_MTCTR (11);
+	      reloc_addr[3] = OPCODE_BCTR ();
+	    }
+	  else
+	    {
+	      Elf32_Word num_plt_entries;
+
+	      num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
+				 / sizeof(Elf32_Rela));
+
+	      reloc_addr[0] = OPCODE_LI (11, index*4);
+	      reloc_addr[1] =
+		OPCODE_B (-(4*(index*2
+			       + 1
+			       - PLT_LONGBRANCH_ENTRY_WORDS
+			       + PLT_INITIAL_ENTRY_WORDS)));
+	      plt[index+PLT_DATA_START_WORDS (num_plt_entries)] = finaladdr;
+	    }
+	}
+      MODIFIED_CODE (reloc_addr);
+    }
+  else
+    assert (! "unexpected dynamic reloc type");
+
+  if (rinfo == R_PPC_ADDR16_LO ||
+      rinfo == R_PPC_ADDR16_HI ||
+      rinfo == R_PPC_ADDR16_HA ||
+      rinfo == R_PPC_REL24 ||
+      rinfo == R_PPC_ADDR24)
+    MODIFIED_CODE_NOQUEUE (reloc_addr);
+}
+
+#define ELF_MACHINE_NO_REL 1
+
+#endif
+
+
diff --git a/sysdeps/powerpc/fclrexcpt.c b/sysdeps/powerpc/fclrexcpt.c
new file mode 100644
index 0000000000..1e66140c2e
--- /dev/null
+++ b/sysdeps/powerpc/fclrexcpt.c
@@ -0,0 +1,35 @@
+/* Clear given exceptions in current floating-point environment.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <fenv_libc.h>
+
+void
+feclearexcept (int excepts)
+{
+  fenv_union_t u;
+
+  /* Get the current state.  */
+  u.fenv = fegetenv_register ();
+
+  /* Clear the relevant bits.  */
+  u.l[1] = u.l[1] & ~FE_to_sticky (excepts);
+
+  /* Put the new state in effect.  */
+  fesetenv_register (u.fenv);
+}
diff --git a/sysdeps/powerpc/fegetenv.c b/sysdeps/powerpc/fegetenv.c
new file mode 100644
index 0000000000..de778fa5a9
--- /dev/null
+++ b/sysdeps/powerpc/fegetenv.c
@@ -0,0 +1,26 @@
+/* Store current floating-point environment.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <fenv_libc.h>
+
+void
+fegetenv (fenv_t *envp)
+{
+  *envp = fegetenv_register ();
+}
diff --git a/sysdeps/powerpc/fegetround.c b/sysdeps/powerpc/fegetround.c
new file mode 100644
index 0000000000..05395f0797
--- /dev/null
+++ b/sysdeps/powerpc/fegetround.c
@@ -0,0 +1,31 @@
+/* Return current rounding direction.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <fenv_libc.h>
+
+int
+fegetround (void)
+{
+  fenv_union_t u;
+
+  u.fenv = fegetenv_register ();
+
+  /* The rounding mode is bits 30 and 31 of the FPSCR.  */
+  return u.l[1] & 3;
+}
diff --git a/sysdeps/powerpc/feholdexcpt.c b/sysdeps/powerpc/feholdexcpt.c
new file mode 100644
index 0000000000..a75adbf49e
--- /dev/null
+++ b/sysdeps/powerpc/feholdexcpt.c
@@ -0,0 +1,38 @@
+/* Store current floating-point environment and clear exceptions.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <fenv_libc.h>
+
+int
+feholdexcept (fenv_t *envp)
+{
+  fenv_union_t u;
+
+  /* Get the current state.  */
+  u.fenv = *envp = fegetenv_register ();
+
+  /* Clear everything except for the rounding mode and non-IEEE arithmetic
+     flag.  */
+  u.l[1] = u.l[1] & 7;
+
+  /* Put the new state in effect.  */
+  fesetenv_register (u.fenv);
+
+  return 1;
+}
diff --git a/sysdeps/powerpc/fenv_const.c b/sysdeps/powerpc/fenv_const.c
new file mode 100644
index 0000000000..fa35fbc0cf
--- /dev/null
+++ b/sysdeps/powerpc/fenv_const.c
@@ -0,0 +1,29 @@
+/* Constants for fenv_bits.h.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* We want to specify the bit pattern of the __fe_*_env constants, so 
+   pretend they're really `long long' instead of `double'.  */
+
+/* If the default argument is used we use this value.  */
+const unsigned long long __fe_dfl_env __attribute__ ((aligned (8))) = 
+0xfff8000000000000ULL;
+
+/* Floating-point environment where none of the exceptions are masked.  */
+const unsigned long long __fe_nomask_env __attribute__ ((aligned (8))) = 
+0xfff80000000000f8ULL;
diff --git a/sysdeps/powerpc/fenv_libc.h b/sysdeps/powerpc/fenv_libc.h
new file mode 100644
index 0000000000..45d61e1565
--- /dev/null
+++ b/sysdeps/powerpc/fenv_libc.h
@@ -0,0 +1,57 @@
+/* Internal libc stuff for floating point environment routines.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _FENV_LIBC_H
+#define _FENV_LIBC_H	1
+
+#include <fenv.h>
+
+/* Transform a logical or of the FE_* bits to a bit pattern for the
+   appropriate sticky bits in the FPSCR.  */
+#define FE_to_sticky(excepts) \
+        (-(excepts & FE_INVALID) & FE_ALL_INVALID \
+	 |  (excepts) & (FE_ALL_EXCEPT & ~FE_INVALID  | FE_ALL_INVALID))
+
+/* The sticky bits in the FPSCR indicating exceptions have occurred.  */
+#define FPSCR_STICKY_BITS ((FE_ALL_EXCEPT | FE_ALL_INVALID) & ~FE_INVALID)
+
+/* Equivalent to fegetenv, but returns a fenv_t instead of taking a
+   pointer.  */
+#define fegetenv_register() \
+        ({ fenv_t env; asm ("mffs %0" : "=f" (env)); env; })
+
+/* Equivalent to fesetenv, but takes a fenv_t instead of a pointer.  */
+#define fesetenv_register(env) \
+        ({ double d = (env); asm ("mtfsf 0xff,%0" : : "f" (d)); })
+
+/* This very handy macro:
+   - Sets the rounding mode to 'round to nearest';
+   - Sets the processor into IEEE mode; and
+   - Prevents exceptions from being raised for inexact results.
+   These things happen to be exactly what you need for typical elementary
+   functions.  */
+#define relax_fenv_state() asm ("mtfsfi 7,0")
+
+typedef union
+{
+  fenv_t fenv;
+  unsigned int l[2];
+} fenv_union_t;
+
+#endif /* fenv_libc.h */
diff --git a/sysdeps/powerpc/fenvbits.h b/sysdeps/powerpc/fenvbits.h
new file mode 100644
index 0000000000..867ea5f5b4
--- /dev/null
+++ b/sysdeps/powerpc/fenvbits.h
@@ -0,0 +1,130 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* This file should never be included directly.  */
+
+#ifndef _FENVBITS_H
+#define _FENVBITS_H	1
+
+/* Define bits representing the exception.  We use the bit positions of
+   the appropriate bits in the FPSCR...  */
+enum
+  {
+    FE_INEXACT = 1 << 31-6,
+#define FE_INEXACT	FE_INEXACT
+    FE_DIVBYZERO = 1 << 31-5,
+#define FE_DIVBYZERO	FE_DIVBYZERO
+    FE_UNDERFLOW = 1 << 31-4,
+#define FE_UNDERFLOW	FE_UNDERFLOW
+    FE_OVERFLOW = 1 << 31-3,
+#define FE_OVERFLOW	FE_OVERFLOW
+
+    /* ... except for FE_INVALID, for which we use bit 31. FE_INVALID
+       actually corresponds to bits 7 through 12 and 21 through 23
+       in the FPSCR, but we can't use that because the current draft
+       says that it must be a power of 2.  Instead we use bit 24 which
+       is the enable bit for all the FE_INVALID exceptions.  */
+    FE_INVALID = 1 << 31-24,
+#define FE_INVALID	FE_INVALID
+
+#ifdef __USE_GNU
+    /* Breakdown of the FE_INVALID bits. Setting FE_INVALID on an
+       input to a routine is equivalent to setting all of these bits;
+       FE_INVALID will be set on output from a routine iff one of
+       these bits is set.  Note, though, that you can't disable or
+       enable these exceptions individually.  */
+
+    /* Operation with SNaN. */
+    FE_INVALID_SNAN = 1 << 31-7,
+#define FE_INVALID_SNAN	FE_INVALID_SNAN
+
+    /* Inf - Inf */
+    FE_INVALID_ISI = 1 << 31-8,
+#define FE_INVALID_ISI	FE_INVALID_ISI
+
+    /* Inf / Inf */
+    FE_INVALID_IDI = 1 << 31-9,
+#define FE_INVALID_IDI	FE_INVALID_IDI
+
+    /* 0 / 0 */
+    FE_INVALID_ZDZ = 1 << 31-10,
+#define FE_INVALID_ZDZ	FE_INVALID_ZDZ
+
+    /* Inf * 0 */
+    FE_INVALID_IMZ = 1 << 31-11,
+#define FE_INVALID_IMZ	FE_INVALID_IMZ
+
+    /* Comparison with NaN or SNaN. */
+    FE_INVALID_COMPARE = 1 << 31-12,
+#define FE_INVALID_COMPARE	FE_INVALID_COMPARE
+
+    /* Invalid operation flag for software (not set by hardware). */
+    FE_INVALID_SOFTWARE = 1 << 31-21,
+#define FE_INVALID_SOFTWARE	FE_INVALID_SOFTWARE
+
+    /* Square root of negative number (including -Inf). */
+    FE_INVALID_SQRT = 1 << 31-22,
+#define FE_INVALID_SQRT	FE_INVALID_SQRT
+
+    /* Conversion-to-integer of a NaN or a number too large or too small. */
+    FE_INVALID_INTEGER_CONVERSION = 1 << 31-23,
+#define FE_INVALID_INTEGER_CONVERSION	FE_INVALID_INTEGER_CONVERSION
+
+#define __FE_ALL_INVALID \
+        (FE_INVALID_SNAN | FE_INVALID_ISI | FE_INVALID_IDI | FE_INVALID_ZDZ \
+	 | FE_INVALID_IMZ | FE_INVALID_COMPARE | FE_INVALID_SOFTWARE \
+	 | FE_INVALID_SQRT | FE_INVALID_INTEGER_CONVERSION)
+#endif
+  };
+
+#define FE_ALL_EXCEPT \
+	(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
+
+/* PowerPC chips support all of the four defined rounding modes.  We
+   use the bit pattern in the FPSCR as the values for the
+   appropriate macros.  */
+enum
+  {
+    FE_TONEAREST = 0,
+#define FE_TONEAREST	FE_TONEAREST
+    FE_TOWARDSZERO = 1,
+#define FE_TOWARDSZERO	FE_TOWARDSZERO
+    FE_UPWARD = 2,
+#define FE_UPWARD	FE_UPWARD
+    FE_DOWNWARD = 3,
+#define FE_DOWNWARD	FE_DOWNWARD
+  };
+
+/* Type representing exception flags.  */
+typedef unsigned int fexcept_t;
+
+/* Type representing floating-point environment.  We leave it as 'double'
+   for efficiency reasons (rather than writing it to a 32-bit integer). */
+typedef double fenv_t;
+
+/* If the default argument is used we use this value.  */
+extern const fenv_t __fe_dfl_env;
+#define FE_DFL_ENV	(&__fe_dfl_env);
+
+#ifdef __USE_GNU
+/* Floating-point environment where none of the exceptions are masked.  */
+extern const fenv_t __fe_nomask_env;
+# define FE_NOMASK_ENV	(&__fe_nomask_env);
+#endif
+
+#endif /* fenvbits.h */
diff --git a/sysdeps/powerpc/fesetenv.c b/sysdeps/powerpc/fesetenv.c
new file mode 100644
index 0000000000..136a835d21
--- /dev/null
+++ b/sysdeps/powerpc/fesetenv.c
@@ -0,0 +1,26 @@
+/* Install given floating-point environment.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <fenv_libc.h>
+
+void
+fesetenv (const fenv_t *envp)
+{
+  fesetenv_register (*envp);
+}
diff --git a/sysdeps/powerpc/fesetround.c b/sysdeps/powerpc/fesetround.c
new file mode 100644
index 0000000000..0afd6ceaa5
--- /dev/null
+++ b/sysdeps/powerpc/fesetround.c
@@ -0,0 +1,41 @@
+/* Set current rounding direction.
+   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 <fenv_libc.h>
+
+int
+fesetround (int round)
+{
+  fenv_union_t u;
+
+  if ((unsigned int) round > 3)
+    return 0;
+
+  /* Get the current state.  */
+  u.fenv = fegetenv_register ();
+
+  /* Set the relevant bits.  */
+  u.l[1] = u.l[1] & ~3  |  round & 3;
+
+  /* Put the new state in effect.  */
+  fesetenv_register (u.fenv);
+
+  return 1;
+}
diff --git a/sysdeps/powerpc/feupdateenv.c b/sysdeps/powerpc/feupdateenv.c
new file mode 100644
index 0000000000..b3a3f95ac3
--- /dev/null
+++ b/sysdeps/powerpc/feupdateenv.c
@@ -0,0 +1,37 @@
+/* Install given floating-point environment and raise exceptions.
+   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 <fenv_libc.h>
+
+void
+feupdateenv (const fenv_t *envp)
+{
+  fenv_union_t old, new;
+
+  /* Save the currently set exceptions.  */
+  new.fenv = *envp;
+  old.fenv = fegetenv_register ();
+
+  /* Copy the set exceptions from `old' to `new'.  */
+  new.l[1] = new.l[1] & 0xE00000FF | old.l[1] & 0x1FFFFF00;
+
+  /* Atomically enable and raise (if appropriate) exceptions set in `new'. */
+  fesetenv_register (new.fenv);
+}
diff --git a/sysdeps/powerpc/ffs.c b/sysdeps/powerpc/ffs.c
index d9d7f267af..1e65bea459 100644
--- a/sysdeps/powerpc/ffs.c
+++ b/sysdeps/powerpc/ffs.c
@@ -18,11 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <bstring.h>
-
-#undef	ffs
-
-#ifdef	__GNUC__
+#include <string.h>
 
 int
 ffs (int x)
@@ -32,7 +28,3 @@ ffs (int x)
   asm ("cntlzw %0,%1" : "=r" (cnt) : "r" (x & -x));
   return 32 - cnt;
 }
-
-#else
-#include <sysdeps/generic/ffs.c>
-#endif
diff --git a/sysdeps/powerpc/fgetexcptflg.c b/sysdeps/powerpc/fgetexcptflg.c
new file mode 100644
index 0000000000..d6bd58dc69
--- /dev/null
+++ b/sysdeps/powerpc/fgetexcptflg.c
@@ -0,0 +1,33 @@
+/* Store current representation for exceptions.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <fenv_libc.h>
+
+void
+fegetexceptflag (fexcept_t *flagp, int excepts)
+{
+  fenv_union_t u;
+  unsigned int flag;
+
+  /* Get the current state.  */
+  u.fenv = fegetenv_register ();
+
+  /* Return that portion that corresponds to the requested exceptions. */
+  *flagp = flag = u.l[1] & FPSCR_STICKY_BITS & FE_to_sticky (excepts);
+}
diff --git a/sysdeps/powerpc/fpu_control.h b/sysdeps/powerpc/fpu_control.h
index b31e0eeefd..d21987ffd8 100644
--- a/sysdeps/powerpc/fpu_control.h
+++ b/sysdeps/powerpc/fpu_control.h
@@ -34,20 +34,16 @@
 #define _FPU_MASK_UM  0x20 /* underflow */
 #define _FPU_MASK_XM  0x08 /* inexact */
 #define _FPU_MASK_IM  0x80 /* invalid operation */
-#define _FPU_MASK_VXCVI 0x100 /* invalid operation for integer convert */
-#define _FPU_MASK_VXSQRT 0x200 /* invalid operation for square root */
-#define _FPU_MASK_VXSOFT 0x400 /* invalid operation raised by software */
 
-#define _FPU_RESERVED 0xfffff800 /* These bits are reserved are not changed. */
+#define _FPU_RESERVED 0xffffff00 /* These bits are reserved are not changed. */
 
-/* The fdlibm code requires no interrupts for exceptions.  Don't
-   change the rounding mode, it would break long double I/O!  */
+/* The fdlibm code requires no interrupts for exceptions.  */
 #define _FPU_DEFAULT  0x00000000 /* Default value.  */
 
 /* IEEE:  same as above, but (some) exceptions;
    we leave the 'inexact' exception off.
  */
-#define _FPU_IEEE     0x000003f0
+#define _FPU_IEEE     0x000000f0
 
 /* Type of the control word.  */
 typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
@@ -59,7 +55,7 @@ typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
   tmp[1]; } )
 #define _FPU_SETCW(cw) { \
   fpu_control_t tmp[2] __attribute__ ((__aligned__(8))); \
-  tmp[0] = 0xFFF80000; /* arbitrary, more-or-less */ \
+  tmp[0] = 0xFFF80000; /* More-or-less arbitrary; this is a QNaN. */ \
   tmp[1] = cw; \
   __asm__ ("lfd 0,%0; mtfsf 255,0" : : "m" (*tmp) : "fr0"); \
 }
diff --git a/sysdeps/powerpc/fraiseexcpt.c b/sysdeps/powerpc/fraiseexcpt.c
new file mode 100644
index 0000000000..aa8f1fcdc6
--- /dev/null
+++ b/sysdeps/powerpc/fraiseexcpt.c
@@ -0,0 +1,44 @@
+/* Raise given exceptions.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <fenv_libc.h>
+
+void
+feraiseexcept (int excepts)
+{
+  fenv_union_t u;
+
+  /* Raise exceptions represented by EXCEPTS.  It is the responsibility of
+     the OS to ensure that if multiple exceptions occur they are fed back
+     to this process in the proper way; this can happen in hardware,
+     anyway (in particular, inexact with overflow or underflow). */
+
+  /* Get the current state.  */
+  u.fenv = fegetenv_register ();
+
+  /* Add the exceptions */
+  u.l[1] = (u.l[1]
+	    | excepts & __FPSCR_STICKY_BITS
+	    /* Turn FE_INVALID into FE_INVALID_SOFTWARE.  */
+	    | excepts << (31 - 21) - (31 - 24)  &  __FE_INVALID_SOFTWARE);
+
+  /* Store the new status word (along with the rest of the environment),
+     triggering any appropriate exceptions.  */
+  fesetenv_register (u.fenv);
+}
diff --git a/sysdeps/powerpc/fsetexcptflg.c b/sysdeps/powerpc/fsetexcptflg.c
new file mode 100644
index 0000000000..4279b74849
--- /dev/null
+++ b/sysdeps/powerpc/fsetexcptflg.c
@@ -0,0 +1,37 @@
+/* Set floating-point environment exception handling.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <fenv_libc.h>
+
+void
+fesetexceptflag (const fexcept_t *flagp, int excepts)
+{
+  fenv_union_t u;
+
+  /* Get the current state.  */
+  u.fenv = fegetenv_register ();
+
+  /* Replace the exception status */
+  u.l[1] = u.l[1] & FPSCR_STICKY_BITS  |  *flagp & FE_to_sticky (excepts);
+
+  /* Store the new status word (along with the rest of the environment).
+     This may cause floating-point exceptions if the restored state
+     requests it.  */
+  fesetenv_register (u.fenv);
+}
diff --git a/sysdeps/powerpc/ftestexcept.c b/sysdeps/powerpc/ftestexcept.c
new file mode 100644
index 0000000000..52733f7ae7
--- /dev/null
+++ b/sysdeps/powerpc/ftestexcept.c
@@ -0,0 +1,38 @@
+/* Test exception in current environment.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <fenv_libc.h>
+
+int
+fetestexcept (int excepts)
+{
+  fenv_union_t u;
+  int flags;
+
+  /* Get the current state.  */
+  u.fenv = fegetenv_register ();
+
+  /* Find the bits that indicate exceptions have occurred.  */
+  flags = u.l[1] & FPSCR_STICKY_BITS;
+
+  /* Set the FE_INVALID bit if any of the FE_INVALID_* bits are set.  */
+  flags |= ((u.l[1] & FE_ALL_INVALID) != 0) << 31-24;
+
+  return flags & excepts;
+}
diff --git a/sysdeps/powerpc/mathbits.h b/sysdeps/powerpc/mathbits.h
new file mode 100644
index 0000000000..2cecb6fa88
--- /dev/null
+++ b/sysdeps/powerpc/mathbits.h
@@ -0,0 +1,72 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _MATHBITS_H
+#define _MATHBITS_H	1
+
+/* FIXME! This file describes properties of the compiler, not the machine;
+   it should not be part of libc!
+
+   FIXME! This file does not deal with the -fshort-double option of
+   gcc! */
+
+#ifdef __GNUC__
+#if __STDC__ == 1
+
+/* In GNU or ANSI mode, gcc leaves `float' expressions as-is, I think.  */
+typedef float float_t;		/* `float' expressions are evaluated as
+				   `float'.  */
+typedef double double_t;	/* `double' expressions are evaluated as
+				   `double'.  */
+
+/* Signal that types stay as they were declared.  */
+#define FLT_EVAL_METHOD	0
+
+/* Define `INFINITY' as value of type `float_t'.  */
+#define INFINITY	HUGE_VALF
+
+#else 
+
+/* For `gcc -traditional', `float' expressions are evaluated as `double'. */
+typedef double float_t;		/* `float' expressions are evaluated as
+				   `double'.  */
+typedef double double_t;	/* `double' expressions are evaluated as
+				   `double'.  */
+
+/* Signal that both types are `double'.  */
+#define FLT_EVAL_METHOD	1
+
+/* Define `INFINITY' as value of type `float_t'.  */
+#define INFINITY	HUGE_VAL
+
+#endif
+#else
+
+/* Wild guess at types for float_t and double_t. */
+typedef double float_t;
+typedef double double_t;
+
+/* Strange compiler, we don't know how it works.  */
+#define FLT_EVAL_METHOD	-1
+
+/* Define `INFINITY' as value of type `float_t'.  */
+#define INFINITY	HUGE_VAL
+
+#endif
+
+#endif /* mathbits.h */
diff --git a/sysdeps/powerpc/setjmp.S b/sysdeps/powerpc/setjmp.S
index 755ef6504c..af10581af0 100644
--- a/sysdeps/powerpc/setjmp.S
+++ b/sysdeps/powerpc/setjmp.S
@@ -22,46 +22,46 @@
 #include <jmp_buf.h>
 
 ENTRY (__sigsetjmp)
-	stw 1,(JB_GPR1*4)(3)
-	mflr 0
-	stw 2,(JB_GPR2*4)(3)
-	stw 14,((JB_GPRS+0)*4)(3)
-	stfd 14,((JB_FPRS+0*2)*4)(3)
-	stw 0,(JB_LR*4)(3)
-	stw 15,((JB_GPRS+1)*4)(3)
-	stfd 15,((JB_FPRS+1*2)*4)(3)
-	stw 16,((JB_GPRS+2)*4)(3)
-	stfd 16,((JB_FPRS+2*2)*4)(3)
-	stw 17,((JB_GPRS+3)*4)(3)
-	stfd 17,((JB_FPRS+3*2)*4)(3)
-	stw 18,((JB_GPRS+4)*4)(3)
-	stfd 18,((JB_FPRS+4*2)*4)(3)
-	stw 19,((JB_GPRS+5)*4)(3)
-	stfd 19,((JB_FPRS+5*2)*4)(3)
-	stw 20,((JB_GPRS+6)*4)(3)
-	stfd 20,((JB_FPRS+6*2)*4)(3)
-	stw 21,((JB_GPRS+7)*4)(3)
-	stfd 21,((JB_FPRS+7*2)*4)(3)
-	stw 22,((JB_GPRS+8)*4)(3)
-	stfd 22,((JB_FPRS+8*2)*4)(3)
-	stw 23,((JB_GPRS+9)*4)(3)
-	stfd 23,((JB_FPRS+9*2)*4)(3)
-	stw 24,((JB_GPRS+10)*4)(3)
-	stfd 24,((JB_FPRS+10*2)*4)(3)
-	stw 25,((JB_GPRS+11)*4)(3)
-	stfd 25,((JB_FPRS+11*2)*4)(3)
-	stw 26,((JB_GPRS+12)*4)(3)
-	stfd 26,((JB_FPRS+12*2)*4)(3)
-	stw 27,((JB_GPRS+13)*4)(3)
-	stfd 27,((JB_FPRS+13*2)*4)(3)
-	stw 28,((JB_GPRS+14)*4)(3)
-	stfd 28,((JB_FPRS+14*2)*4)(3)
-	stw 29,((JB_GPRS+15)*4)(3)
-	stfd 29,((JB_FPRS+15*2)*4)(3)
-	stw 30,((JB_GPRS+16)*4)(3)
-	stfd 30,((JB_FPRS+16*2)*4)(3)
-	stw 31,((JB_GPRS+17)*4)(3)
-	stfd 31,((JB_FPRS+17*2)*4)(3)
+	stw  %r1,(JB_GPR1*4)(3)
+	mflr %r0
+	stw  %r2,(JB_GPR2*4)(3)
+	stw  %r14,((JB_GPRS+0)*4)(3)
+	stfd %f14,((JB_FPRS+0*2)*4)(3)
+	stw  %r0,(JB_LR*4)(3)
+	stw  %r15,((JB_GPRS+1)*4)(3)
+	stfd %f15,((JB_FPRS+1*2)*4)(3)
+	stw  %r16,((JB_GPRS+2)*4)(3)
+	stfd %f16,((JB_FPRS+2*2)*4)(3)
+	stw  %r17,((JB_GPRS+3)*4)(3)
+	stfd %f17,((JB_FPRS+3*2)*4)(3)
+	stw  %r18,((JB_GPRS+4)*4)(3)
+	stfd %f18,((JB_FPRS+4*2)*4)(3)
+	stw  %r19,((JB_GPRS+5)*4)(3)
+	stfd %f19,((JB_FPRS+5*2)*4)(3)
+	stw  %r20,((JB_GPRS+6)*4)(3)
+	stfd %f20,((JB_FPRS+6*2)*4)(3)
+	stw  %r21,((JB_GPRS+7)*4)(3)
+	stfd %f21,((JB_FPRS+7*2)*4)(3)
+	stw  %r22,((JB_GPRS+8)*4)(3)
+	stfd %f22,((JB_FPRS+8*2)*4)(3)
+	stw  %r23,((JB_GPRS+9)*4)(3)
+	stfd %f23,((JB_FPRS+9*2)*4)(3)
+	stw  %r24,((JB_GPRS+10)*4)(3)
+	stfd %f24,((JB_FPRS+10*2)*4)(3)
+	stw  %r25,((JB_GPRS+11)*4)(3)
+	stfd %f25,((JB_FPRS+11*2)*4)(3)
+	stw  %r26,((JB_GPRS+12)*4)(3)
+	stfd %f26,((JB_FPRS+12*2)*4)(3)
+	stw  %r27,((JB_GPRS+13)*4)(3)
+	stfd %f27,((JB_FPRS+13*2)*4)(3)
+	stw  %r28,((JB_GPRS+14)*4)(3)
+	stfd %f28,((JB_FPRS+14*2)*4)(3)
+	stw  %r29,((JB_GPRS+15)*4)(3)
+	stfd %f29,((JB_FPRS+15*2)*4)(3)
+	stw  %r30,((JB_GPRS+16)*4)(3)
+	stfd %f30,((JB_FPRS+16*2)*4)(3)
+	stw  %r31,((JB_GPRS+17)*4)(3)
+	stfd %f31,((JB_FPRS+17*2)*4)(3)
 #ifdef PIC
 	b __sigjmp_save@plt
 #else
diff --git a/sysdeps/powerpc/strlen.s b/sysdeps/powerpc/strlen.s
index eb6a88e2b8..fa1c670912 100644
--- a/sysdeps/powerpc/strlen.s
+++ b/sysdeps/powerpc/strlen.s
@@ -68,78 +68,78 @@
  # them, the others we must save.
 
 	.section ".text"
-	.align 3
+	.align 2
 	.globl strlen
 	.type strlen,@function
 strlen:
  # On entry, r3 points to the string, and it's left that way.
- # We use r6 to store 0x01010101, and r7 to store 0x7f7f7f7f.
+ # We use r6 to store 0xfefefeff, and r7 to store 0x7f7f7f7f.
  # r4 is used to keep the current index into the string; r5 holds
  # the number of padding bits we prepend to the string to make it
  # start at a word boundary. r8 holds the 'current' word.
  # r9-12 are temporaries. r0 is used as a temporary and for discarded
  # results.
-	clrrwi 4,3,2
-	lis 6,0xfeff
-	lis 7,0x7f7f
-	rlwinm 10,3,0,29,29
-	lwz 8,0(4)
-	addi 7,7,0x7f7f
-	rlwinm 5,3,3,27,28
-	cmpwi 1,10,0
-	li 9,-1
+	clrrwi %r4,%r3,2
+	lis   %r6,0xfeff
+	lis   %r7,0x7f7f
+	rlwinm %r10,%r3,0,29,29
+	lwz   %r8,0(%r4)
+	addi  %r7,%r7,0x7f7f
+	rlwinm %r5,%r3,3,27,28
+	cmpwi %cr1,%r10,0
+	li    %r9,-1
  # That's the setup done, now do the first pair of words.
  # We make an exception and use method (2) on the first two words, to reduce
  # overhead.
-	srw 9,9,5
-	and 0,7,8
-	or 10,7,8
-	add 0,0,7
-	nor 0,10,0
-	and. 8,0,9
-	bne done0
+	srw   %r9,%r9,%r5
+	and   %r0,%r7,%r8
+	or    %r10,%r7,%r8
+	add   %r0,%r0,%r7
+	nor   %r0,%r10,%r0
+	and.  %r8,%r0,%r9
+	bne   done0
  # Handle second word of pair. Put addi between branches to avoid hurting
  # branch prediction.
-	addi 6,6,0xfffffeff
-
-	bne 1,loop
-	lwzu 8,4(4)
-	and 0,7,8
-	or 10,7,8
-	add 0,0,7
-	nor. 0,10,0
-	bne done0
+	addi  %r6,%r6,0xfffffeff
+	
+	bne   %cr1,loop
+	lwzu  %r8,4(%r4)
+	and   %r0,%r7,%r8
+	or    %r10,%r7,%r8
+	add   %r0,%r0,%r7
+	nor.  %r8,%r10,%r0
+	bne   done0
 
  # The loop.
+	
+loop:	lwz   %r8,4(%r4)
+	lwzu  %r9,8(%r4)
+	add   %r0,%r6,%r8
+	nor   %r10,%r7,%r8
+	and.  %r0,%r0,%r10
+	add   %r11,%r6,%r9
+	nor   %r12,%r7,%r9
+	bne   done1
+	and.  %r0,%r11,%r12
+	beq   loop
 
-loop:	lwz 8,4(4)
-	lwzu 9,8(4)
-	add 0,6,8
-	nor 10,7,8
-	and. 0,0,10
-	add 11,6,9
-	nor 12,7,9
-	bne done1
-	and. 0,11,12
-	beq loop
-
-	and 0,7,9
-	or 10,7,9
-	b done2
-
-done1:	addi 4,4,-4
-	and 0,7,9
-	or 10,7,9
-done2:	add 0,0,7
-	nor 0,10,0
-
+	and   %r0,%r7,%r9
+	add   %r0,%r0,%r7
+	andc  %r8,%r12,%r0
+	b     done0
+	
+done1:	and   %r0,%r7,%r8
+	subi  %r4,%r4,4
+	add   %r0,%r0,%r7
+	andc  %r8,%r10,%r0
+	
  # When we get to here, r4 points to the first word in the string that
  # contains a zero byte, and the most significant set bit in r8 is in that
  # byte.
-done0:	cntlzw 11,8
-	subf 0,3,4
-	srwi 11,11,3
-	add 3,0,11
+done0:	cntlzw %r11,%r8
+	subf  %r0,%r3,%r4
+	srwi  %r11,%r11,3
+	add   %r3,%r0,%r11
 	blr
 0:
 	.size	 strlen,0b-strlen
diff --git a/sysdeps/rs6000/ffs.c b/sysdeps/rs6000/ffs.c
index 44e7a434d2..598c15c01a 100644
--- a/sysdeps/rs6000/ffs.c
+++ b/sysdeps/rs6000/ffs.c
@@ -19,7 +19,7 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
 #include <ansidecl.h>
-#include <bstring.h>
+#include <string.h>
 
 #undef	ffs
 
diff --git a/sysdeps/sparc/setjmp.S b/sysdeps/sparc/setjmp.S
index 9e93668d96..84c63542cc 100644
--- a/sysdeps/sparc/setjmp.S
+++ b/sysdeps/sparc/setjmp.S
@@ -25,6 +25,7 @@ ENTRY (__sigsetjmp)
 	/* Save our SP and FP; in the delay slot of the jump, save our
 	   return PC.  Save the signal mask if requested with a tail-call
 	   for simplicity; it always returns zero.  */
+	ta   ST_FLUSH_WINDOWS
 #ifdef PIC
 	mov  %o7,%g1
 2:
diff --git a/sysdeps/standalone/arm/errnos.h b/sysdeps/standalone/arm/errnos.h
new file mode 100644
index 0000000000..0b635e649d
--- /dev/null
+++ b/sysdeps/standalone/arm/errnos.h
@@ -0,0 +1,49 @@
+/* Copyright (C) 1991, 1994, 1996, 1997 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/* This file defines the `errno' constants for standalone ARM machines.
+   These constants are essentially arbitrary.  */
+
+#if !defined(__Emath_defined) && (defined(_ERRNO_H) || defined(__need_Emath))
+#undef	__need_Emath
+#define	__Emath_defined	1
+
+#define	EDOM		1
+#define	ERANGE		2
+#endif
+
+#ifdef	_ERRNO_H
+#define	ENOSYS		3
+#define	EINVAL		4
+#define	ESPIPE		5
+#define	EBADF		6
+#define	ENOMEM		7
+#define	EACCES		8
+#define ENFILE		9
+#define EMFILE		10
+#define	ENAMETOOLONG	11	/* File name too long */
+#define	ELOOP		12	/* Too many symbolic links encountered */
+#define ENOMSG          13      /* No message of desired type */
+#define	E2BIG		14	/* Arg list too long */
+#define EINTR		15
+#define EILSEQ		16
+#define ENOEXEC		17
+#define ENOENT		18
+#endif
+
+#define __set_errno(val) errno = (val)
diff --git a/sysdeps/standalone/dirstream.h b/sysdeps/standalone/dirstream.h
index 20c4922fb9..064513222e 100644
--- a/sysdeps/standalone/dirstream.h
+++ b/sysdeps/standalone/dirstream.h
@@ -28,7 +28,7 @@ Cambridge, MA 02139, USA.  */
    The miscellaneous Unix `readdir' implementations read directory data
    into a buffer and fill in a `struct dirent' copy in the `DIR' object. */
 
-typedef struct
+struct __dirstream
   {
     int __fd;			/* File descriptor.  */
 
@@ -38,6 +38,6 @@ typedef struct
     size_t __size;		/* Total valid data in the block.  */
 
     struct dirent __entry;	/* Returned by `readdir'.  */
-  } DIR;
+  };
 
 #endif	/* dirstream.h */
diff --git a/sysdeps/stub/direntry.h b/sysdeps/stub/direntry.h
index f84425b5a4..4b22f31bd6 100644
--- a/sysdeps/stub/direntry.h
+++ b/sysdeps/stub/direntry.h
@@ -20,4 +20,4 @@
 struct dirent
   {
     char d_name[1];		/* Variable length.  */
-  }
+  };
diff --git a/sysdeps/stub/dirfd.c b/sysdeps/stub/dirfd.c
index ce40a28013..767bc215f8 100644
--- a/sysdeps/stub/dirfd.c
+++ b/sysdeps/stub/dirfd.c
@@ -23,7 +23,7 @@
 
 int
 dirfd (dirp)
-     FILE *dirp;
+     DIR *dirp;
 {
   __set_errno (ENOSYS);
   return -1;
diff --git a/sysdeps/stub/if_index.c b/sysdeps/stub/if_index.c
new file mode 100644
index 0000000000..f1cb0c5b0e
--- /dev/null
+++ b/sysdeps/stub/if_index.c
@@ -0,0 +1,36 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+unsigned int if_nametoindex(const char *ifname)
+{
+  return 0;
+}
+
+char *if_indextoname(unsigned int ifindex, char *ifname)
+{
+  return NULL;
+}
+
+void if_freenameindex(struct if_nameindex *ifn)
+{
+}
+
+struct if_nameindex *if_nameindex(void)
+{
+  return NULL;
+}
diff --git a/sysdeps/stub/seekdir.c b/sysdeps/stub/seekdir.c
index fe40c8b51d..514b59d2b8 100644
--- a/sysdeps/stub/seekdir.c
+++ b/sysdeps/stub/seekdir.c
@@ -24,7 +24,7 @@ Cambridge, MA 02139, USA.  */
 /* Seek to position POS in DIRP.  */
 void
 seekdir (dirp, pos)
-     DIR *dirp
+     DIR *dirp;
      off_t pos;
 {
   if (dirp == NULL)
diff --git a/sysdeps/stub/setitimer.c b/sysdeps/stub/setitimer.c
index 737257fa7f..21af5173c9 100644
--- a/sysdeps/stub/setitimer.c
+++ b/sysdeps/stub/setitimer.c
@@ -1,20 +1,20 @@
-/* Copyright (C) 1991, 1994, 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1991, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <stddef.h>
 #include <errno.h>
@@ -26,7 +26,7 @@ Cambridge, MA 02139, USA.  */
 int
 __setitimer (which, new, old)
      enum __itimer_which which;
-     struct itimerval *new;
+     const struct itimerval *new;
      struct itimerval *old;
 {
   if (new == NULL)
diff --git a/sysdeps/stub/sigaction.c b/sysdeps/stub/sigaction.c
index 1344d45044..523daec8ad 100644
--- a/sysdeps/stub/sigaction.c
+++ b/sysdeps/stub/sigaction.c
@@ -26,7 +26,7 @@ int
 __sigaction (sig, act, oact)
      int sig;
      const struct sigaction *act;
-     struct sigaction *OACT;
+     struct sigaction *oact;
 {
   if (sig <= 0 || sig >= NSIG)
     {
diff --git a/sysdeps/stub/sys/param.h b/sysdeps/stub/sys/param.h
index 8a3e73b406..b1ea52add9 100644
--- a/sysdeps/stub/sys/param.h
+++ b/sysdeps/stub/sys/param.h
@@ -6,3 +6,5 @@
    the installed headers on the system.  */
 
 #include <limits.h>
+
+#define MAXSYMLINKS  1
diff --git a/sysdeps/stub/sysconf.c b/sysdeps/stub/sysconf.c
index 00480fb2e9..3d3c0e9759 100644
--- a/sysdeps/stub/sysconf.c
+++ b/sysdeps/stub/sysconf.c
@@ -164,10 +164,10 @@ __sysconf (name)
     case _SC_SEMAPHORES:
     case _SC_SHARED_MEMORY_OBJECTS:
 
-    case _SC_AIO_LIST_MAX:
+    case _SC_AIO_LISTIO_MAX:
     case _SC_AIO_MAX:
     case _SC_AIO_PRIO_DELTA_MAX:
-    case _SC_DELAYTIME_MAX:
+    case _SC_DELAYTIMER_MAX:
     case _SC_MQ_OPEN_MAX:
     case _SC_MQ_PRIO_MAX:
     case _SC_VERSION:
diff --git a/sysdeps/stub/tempname.c b/sysdeps/stub/tempname.c
index 984d4becd3..b93b948ca6 100644
--- a/sysdeps/stub/tempname.c
+++ b/sysdeps/stub/tempname.c
@@ -26,7 +26,7 @@
    Return the generated filename or NULL if one could not
    be generated, putting the length of the string in *LENPTR.  */
 char *
-__stdio_gen_tempname (buf, bufsize, dir, pfx, dir_search, lenptr)
+__stdio_gen_tempname (buf, bufsize, dir, pfx, dir_search, lenptr, streamptr)
      char *buf;
      size_t bufsize;
      const char *dir;
diff --git a/sysdeps/stub/vdprintf.c b/sysdeps/stub/vdprintf.c
index f7ae121097..88c855eb11 100644
--- a/sysdeps/stub/vdprintf.c
+++ b/sysdeps/stub/vdprintf.c
@@ -18,6 +18,7 @@ Cambridge, MA 02139, USA.  */
  
 #include <errno.h>
 #include <stdio.h>
+#include <stdarg.h>
 
 /* Write formatted output to file descriptor D according to the format string
    FORMAT, using the argument list in ARG.  */
@@ -25,38 +26,7 @@ int
 vdprintf (int d, const char *format, va_list arg)
 {
   __set_errno (ENOSYS);
-  return NULL;
-}
-
-stub_warning (vdprintf)
-/* Copyright (C) 1997 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
- 
-#include <errno.h>
-#include <stdio.h>
-
-/* Write formatted output to file descriptor D according to the format string
-   FORMAT, using the argument list in ARG.  */
-int
-vdprintf (int d, const char *format, va_list arg)
-{
-  __set_errno (ENOSYS);
-  return NULL;
+  return 0;
 }
 
 stub_warning (vdprintf)
diff --git a/sysdeps/unix/arm/fork.S b/sysdeps/unix/arm/fork.S
new file mode 100644
index 0000000000..baa33e31b7
--- /dev/null
+++ b/sysdeps/unix/arm/fork.S
@@ -0,0 +1,33 @@
+/* Copyright (C) 1991, 1992, 1994, 1995, 1997 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <sysdep.h>
+
+/* ARM version.  */
+
+SYSCALL__ (fork, 0)
+	/* R1 is now 0 for the parent and 1 for the child.  Decrement it to
+	   make it -1 (all bits set) for the parent, and 0 (no bits set)
+	   for the child.  Then AND it with R0, so the parent gets
+	   R0&-1==R0, and the child gets R0&0==0.  */
+	sub r1, r1, $1
+	and r0, r0, r1
+	RETINSTR(mov, pc, r14)
+PSEUDO_END(fork)
+
+weak_alias (__fork, fork)
diff --git a/sysdeps/unix/arm/sysdep.h b/sysdeps/unix/arm/sysdep.h
index 18e812b9f1..1c580731ba 100644
--- a/sysdeps/unix/arm/sysdep.h
+++ b/sysdeps/unix/arm/sysdep.h
@@ -19,3 +19,8 @@ Cambridge, MA 02139, USA.  */
 #include <sysdeps/unix/sysdep.h>
 #include <sysdeps/arm/sysdep.h>
 
+/* Some definitions to allow the assembler in sysdeps/unix/*.S to build
+   without needing ARM-specific versions of all the files.  */
+
+#define ret		RETINSTR(mov, pc, r14)
+#define MOVE(a,b)	mov b,a
diff --git a/sysdeps/unix/sysv/linux/arm/clone.S b/sysdeps/unix/sysv/linux/arm/clone.S
new file mode 100644
index 0000000000..c7e7aed9c8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/clone.S
@@ -0,0 +1,33 @@
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   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.  */
+
+/* clone() is even more special than fork() as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+
+#include <sysdep.h>
+#define _ERRNO_H	1
+#include <errnos.h>
+
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
+
+        .text
+ENTRY(__clone)
+	/* Somebody needs to write this.  */
+PSEUDO_END (__clone)
+
+weak_alias (__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/arm/socket.S b/sysdeps/unix/sysv/linux/arm/socket.S
new file mode 100644
index 0000000000..e8db072971
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/socket.S
@@ -0,0 +1,49 @@
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is 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 <sysdep.h>
+#include <sys/socketcall.h>
+
+#define P(a, b) P2(a, b)
+#define P2(a, b) a##b
+
+	.text
+/* The socket-oriented system calls are handled unusally in Linux.
+   They are all gated through the single `socketcall' system call number.
+   `socketcall' takes two arguments: the first is the subcode, specifying
+   which socket function is being called; and the second is a pointer to
+   the arguments to the specific function.
+
+   The .S files for the other calls just #define socket and #include this.  */
+
+.globl P(__,socket)
+ENTRY (P(__,socket))
+
+        /* Do the system call trap.  */
+	swi SYS_ify(socketcall)
+
+	/* %eax is < 0 if there was an error.  */
+	cmn r0, $124
+	bge syscall_error
+
+	/* Successful; return the syscall's value.  */
+	RETINSTR(mov,pc,r14)
+
+PSEUDO_END (P(__,socket))
+
+weak_alias (P(__,socket), socket)
diff --git a/sysdeps/unix/sysv/linux/arm/syscall.S b/sysdeps/unix/sysv/linux/arm/syscall.S
new file mode 100644
index 0000000000..7a87278303
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/syscall.S
@@ -0,0 +1,47 @@
+/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+/* Please consult the file sysdeps/unix/sysv/linux/arm/sysdep.h for
+   more information about the value -4095 used below.*/
+
+	.text
+ENTRY (syscall)
+
+	/* Normally encoding the system call number in the instruction is
+	   good.  But we pay the price here.  */
+	
+	sub sp, sp, $0xc		@ get 3 words on the stack
+	orr r0, r0, $0xef000000		@ make up a SWI instruction
+	orr r0, r0, $SWI_BASE  
+	str r0, [sp]
+	ldr r0, _reti
+	str r0, [sp, $4]
+	adr r0, _ret
+	str r0, [sp, $8]
+	mov r0, r1
+	mov r1, r2
+	mov r2, r3
+	mov pc, sp
+_ret:	add sp, sp, $0xc
+	RETINSTR(mov, pc, r14)
+
+_reti:	.word	0xe51ff004	@ ldr pc, [pc, $4]
+	
+PSEUDO_END (syscall)
diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h
new file mode 100644
index 0000000000..6478a5d182
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/sysdep.h
@@ -0,0 +1,73 @@
+/* Copyright (C) 1992, 93, 95, 96, 97 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995.
+ARM changes by Philip Blundell, <pjb27@cam.ac.uk>, May 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., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#ifndef _LINUX_ARM_SYSDEP_H
+#define _LINUX_ARM_SYSDEP_H 1
+
+/* There is some commonality.  */
+#include <sysdeps/unix/arm/sysdep.h>
+
+/* For Linux we can use the system call table in the header file
+	/usr/include/asm/unistd.h
+   of the kernel.  But these symbols do not follow the SYS_* syntax
+   so we have to redefine the `SYS_ify' macro here.  */
+#undef SYS_ify
+#define SWI_BASE  (9 << 20)
+#define SYS_ify(syscall_name)	(SWI_BASE + __NR_##syscall_name)
+
+
+#ifdef ASSEMBLER
+
+/* Linux uses a negative return value to indicate syscall errors,
+   unlike most Unices, which use the condition codes' carry flag.
+
+   Since version 2.1 the return value of a system call might be
+   negative even if the call succeeded.  E.g., the `lseek' system call
+   might return a large offset.  Therefore we must not anymore test
+   for < 0, but test for a real error by making sure the value in %eax
+   is a real error number.  Linus said he will make sure the no syscall
+   returns a value in -1 .. -4095 as a valid result so we can savely
+   test with -4095.  */
+#undef	PSEUDO
+#define	PSEUDO(name, syscall_name, args)				      \
+  .text;								      \
+  ENTRY (name)								      \
+    DO_CALL (args, syscall_name);					      \
+    cmn r0, $4096;							      \
+    bge syscall_error;
+
+#undef	PSEUDO_END
+#define	PSEUDO_END(name)						      \
+  SYSCALL_ERROR_HANDLER							      \
+  END (name)
+
+#ifndef PIC
+#define SYSCALL_ERROR_HANDLER	/* Nothing here; code in sysdep.S is used.  */
+#else
+#error Aiee 
+#endif	/* PIC */
+
+#undef	DO_CALL
+#define DO_CALL(args, syscall_name)			      		      \
+    swi SYS_ify (syscall_name);					      
+
+#endif	/* ASSEMBLER */
+
+#endif /* linux/arm/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/if_index.c b/sysdeps/unix/sysv/linux/if_index.c
new file mode 100644
index 0000000000..3f5a890a9c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/if_index.c
@@ -0,0 +1,140 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <net/if.h>
+
+#define IF_INET6_FILENAME   "/proc/net/if_inet6"
+
+/* /proc/net/if_inet6 contains lines that look like this:
+ *
+ * fe8000000000000000000000836fc168 0b 00 20 80     sit7 
+ *                        
+ *                               |   |  |  |  |      |
+ *                     address --'   |  |  |  |      |
+ *                     index --------'  |  |  |      |
+ *                     prefix length ---'  |  |      |
+ *                     scope --------------'  |      |
+ *                     flags -----------------'      |
+ *                     name -------------------------'
+ *
+ */
+
+static int get_one_interface(FILE *fd, char *interface, int iflen, unsigned int *index)
+{
+  char buffer[80];
+  static char seps[] = " \012";
+  char *c = buffer;
+  char *sp;
+  if (!fgets(buffer, 80, fd))
+    return 1;
+  if (strtok_r(buffer, seps, &sp) == NULL) return 1;
+  if (c = strtok_r(NULL, seps, &sp), c == NULL) return 1;
+  *index = strtoul(c, NULL, 16);
+  if (strtok_r(NULL, seps, &sp) == NULL) return 1;
+  if (strtok_r(NULL, seps, &sp) == NULL) return 1;
+  if (strtok_r(NULL, seps, &sp) == NULL) return 1;
+  if (c = strtok_r(NULL, seps, &sp), c == NULL) return 1;
+  strncpy(interface, c, iflen);
+  return 0;
+}
+
+unsigned int if_nametoindex(const char *ifname)
+{
+  FILE *fd = fopen(IF_INET6_FILENAME, "r");
+  char this_ifname[IFNAMSIZ];
+  unsigned int this_index;
+  if (!fd) return 0;
+  while (get_one_interface(fd, this_ifname, IFNAMSIZ, &this_index) == 0) {
+    if (!strcmp(this_ifname, ifname)) {
+      fclose(fd);
+      return this_index;
+    }
+  } 
+  fclose(fd);
+  return 0;
+}
+
+char *if_indextoname(unsigned int ifindex, char *ifname)
+{
+  FILE *fd = fopen(IF_INET6_FILENAME, "r");
+  unsigned int this_index;
+  if (!fd) return NULL;
+  while (get_one_interface(fd, ifname, IFNAMSIZ, &this_index) == 0) {
+    if (this_index == ifindex) {
+      fclose(fd);
+      return ifname;
+    }
+  } 
+  fclose(fd);
+  return NULL;
+}
+
+void if_freenameindex(struct if_nameindex *ifn)
+{
+  struct if_nameindex *ptr = ifn;
+  while (ptr->if_name || ptr->if_index) 
+    {
+      if (ptr->if_name)
+	free(ptr->if_name);
+      ptr++;
+    }
+  free(ifn);
+}
+
+struct if_nameindex *if_nameindex(void)
+{
+  FILE *fd = fopen(IF_INET6_FILENAME, "r");
+  struct if_nameindex *ifn = NULL;
+  int nifs = 0;
+  if (!fd) return NULL;
+  do 
+    {
+      struct if_nameindex *newifn;
+      nifs++;
+      newifn = realloc(ifn, nifs*sizeof(struct if_nameindex));
+      if (!newifn) 
+	{
+	  /* We ran out of memory. */
+	  if (--nifs) 
+	    {
+	      free(ifn[nifs-1].if_name);
+	      ifn[nifs-1].if_name = 0;
+	      ifn[nifs-1].if_index = 0;
+	      if_freenameindex(ifn);
+	    }
+	  return NULL;
+	}
+      ifn = newifn;
+      ifn[nifs-1].if_index = 0;
+      ifn[nifs-1].if_name = malloc(IFNAMSIZ);
+      if (ifn[nifs-1].if_name == NULL) 
+	{
+	  if_freenameindex(ifn);
+	  return NULL;
+	}
+    }
+  while (get_one_interface(fd, ifn[nifs-1].if_name, IFNAMSIZ, 
+			   &ifn[nifs-1].if_index) == 0);
+  free(ifn[nifs-1].if_name);
+  ifn[nifs-1].if_name = NULL;
+  fclose(fd);
+  return ifn;
+}
diff --git a/sysdeps/unix/sysv/linux/m68k/syscalls.list b/sysdeps/unix/sysv/linux/m68k/syscalls.list
index 9a3e4d0e58..473c2ec5b2 100644
--- a/sysdeps/unix/sysv/linux/m68k/syscalls.list
+++ b/sysdeps/unix/sysv/linux/m68k/syscalls.list
@@ -1,5 +1,7 @@
 # File name	Caller	Syscall name	# args	Strong name	Weak names
 
+cacheflush	EXTRA	cacheflush	4	__cacheflush	cacheflush
+
 s_getgroups	getgroups getgroups	2	__syscall_getgroups
 s_llseek	llseek	_llseek		5	__sys_llseek
 s_setgroups	setgroups setgroups	2	__syscall_setgroups
diff --git a/sysdeps/unix/sysv/linux/net/if.h b/sysdeps/unix/sysv/linux/net/if.h
index db86d20f23..01e9f00943 100644
--- a/sysdeps/unix/sysv/linux/net/if.h
+++ b/sysdeps/unix/sysv/linux/net/if.h
@@ -144,4 +144,23 @@ struct ifconf
 #define	ifc_buf	ifc_ifcu.ifcu_buf	/* Buffer address.  */
 #define	ifc_req	ifc_ifcu.ifcu_req	/* Array of structures.  */
 
+
+/* Convert an interface name to an index, and vice versa.  */
+
+unsigned int  if_nametoindex(const char *ifname);
+char  *if_indextoname(unsigned int ifindex, char *ifname);
+
+/* Return a list of all interfaces and their indices.  */
+
+struct if_nameindex {
+  unsigned int   if_index;  /* 1, 2, ... */
+  char          *if_name;   /* null terminated name: "eth0", ... */
+};
+
+struct if_nameindex  *if_nameindex(void);
+
+/* Free the data returned from if_nameindex.  */
+
+void  if_freenameindex(struct if_nameindex *ptr);
+
 #endif /* net/if.h */
diff --git a/sysdeps/unix/sysv/linux/netinet/in.h b/sysdeps/unix/sysv/linux/netinet/in.h
index bbc625435c..451f8f5a20 100644
--- a/sysdeps/unix/sysv/linux/netinet/in.h
+++ b/sysdeps/unix/sysv/linux/netinet/in.h
@@ -259,7 +259,7 @@ extern u_int16_t htons __P ((u_int16_t __hostshort));
 
 /* IPV6 socket options.  */
 #define IPV6_ADDRFORM		1
-#define IPV6_RXINFO		2
+#define IPV6_PKTINFO		2
 #define IPV6_RXHOPOPTS		3
 #define IPV6_RXDSTOPTS		4
 #define IPV6_RXSRCRT		5
@@ -267,8 +267,6 @@ extern u_int16_t htons __P ((u_int16_t __hostshort));
 #define IPV6_CHECKSUM		7
 #define IPV6_HOPLIMIT		8
 
-#define IPV6_TXINFO		IPV6_RXINFO
-#define SCM_SRCINFO		IPV6_TXINFO
 #define SCM_SRCRT		IPV6_RXSRCRT
 
 #define IPV6_UNICAST_HOPS	16
@@ -306,6 +304,14 @@ extern u_int16_t htons __P ((u_int16_t __hostshort));
 /* Bind socket to a priviledged IP port.  */
 extern int bindresvport __P ((int __sockfd, struct sockaddr_in *__sin));
 
+
+/* IPv6 packet information.  */
+struct in6_pktinfo 
+  {
+    struct in6_addr ipi6_addr;    /* src/dst IPv6 address */
+    int             ipi6_ifindex; /* send/recv interface index */
+  };
+
 __END_DECLS
 
 #endif	/* netinet/in.h */
diff --git a/sysdeps/unix/sysv/linux/powerpc/clone.S b/sysdeps/unix/sysv/linux/powerpc/clone.S
index d255abfe0f..068b14c538 100644
--- a/sysdeps/unix/sysv/linux/powerpc/clone.S
+++ b/sysdeps/unix/sysv/linux/powerpc/clone.S
@@ -29,45 +29,45 @@
 
 ENTRY(__clone)
 	/* Set up stack frame, save registers.  */
-	stwu 1,-32(1)
-	stw 31,16(1)
-	stw 30,20(1)
+	stwu  %r1,-32(%r1)
+	stw   %r31,16(%r1)
+	stw   %r30,20(%r1)
 
 	/* Check for child_stack == NULL || fn == NULL.  */
-	cmpwi 0,4,0
-	cmpwi 1,3,0
-	cror 2+0*4,2+0*4,2+1*4
-	beq- 0,badargs
+	cmpwi %cr0,%r4,0
+	beq-  %cr0,badargs
+	cmpwi %cr1,%r3,0
+	beq-  %cr1,badargs
 
 	/* Set up stack frame for child.  */
-	addi 4,4,-16
-	clrrwi 4,4,4
-	li 0,0
-	stw 0,0(4)
+	addi  %r4,%r4,-16
+	clrrwi %r4,%r4,4
+	li    %r0,0
+	stw   %r0,0(%r4)
 
 	/* Save new stack, fn, args across syscall.  */
-	mr 30,3		/* Function in r30.  */
-	mr 31,6		/* Arguments in r31.  */
+	mr    %r30,%r3		/* Function in r30.  */
+	mr    %r31,%r6		/* Arguments in r31.  */
 
 	/* 'flags' argument is first parameter to clone syscall. (The other
 	   argument is the stack pointer, already in r4.)  */
-	mr 3,5
+	mr    %r3,%r5
 
 	/* Do the call.  */
 	DO_CALL(SYS_ify(clone))
-	bso- error
-	beq child
+	bso-  error
+	beq   child
 
 	/* Parent.  Restore registers & return.  */
-	lwz 31,16(1)
-	lwz 30,20(1)
-	addi 1,1,32
+	lwz   %r31,16(%r1)
+	lwz   %r30,20(%r1)
+	addi  %r1,%r1,32
 	blr
 
 child:
 	/* Call procedure.  */
-	mtlr 30
-	mr 3,31
+	mtlr  %r30
+	mr    %r3,%r31
 	blrl
 	/* Call _exit with result from procedure.  */
 #ifdef PIC
diff --git a/sysdeps/unix/sysv/linux/powerpc/socket.S b/sysdeps/unix/sysv/linux/powerpc/socket.S
index 12417faac6..305aba9281 100644
--- a/sysdeps/unix/sysv/linux/powerpc/socket.S
+++ b/sysdeps/unix/sysv/linux/powerpc/socket.S
@@ -43,38 +43,38 @@
 
 	.text
 ENTRY(P(__,socket))
-	stwu 1,-48(1)
+	stwu %r1,-48(%r1)
 #if NARGS >= 1
-	stw 3,stackblock(1)
+	stw  %r3,stackblock(%r1)
 #endif
 #if NARGS >= 2
-	stw 4,4+stackblock(1)
+	stw  %r4,4+stackblock(%r1)
 #endif
 #if NARGS >= 3
-	stw 5,8+stackblock(1)
+	stw  %r5,8+stackblock(%r1)
 #endif
 #if NARGS >= 4
-	stw 6,12+stackblock(1)
+	stw  %r6,12+stackblock(%r1)
 #endif
 #if NARGS >= 5
-	stw 7,16+stackblock(1)
+	stw  %r7,16+stackblock(%r1)
 #endif
 #if NARGS >= 6
-	stw 8,20+stackblock(1)
+	stw  %r8,20+stackblock(%r1)
 #endif
 #if NARGS >= 7
-	stw 9,24+stackblock(1)
+	stw  %r9,24+stackblock(%r1)
 #endif
 #if NARGS >= 8
-	stw 10,28+stackblock(1)
+	stw  %r10,28+stackblock(%r1)
 #endif
 #if NARGS >= 9
 #error too many arguments!
 #endif
-	li 3,P(SOCKOP_,socket)
-	addi 4,1,stackblock
+	li   %r3,P(SOCKOP_,socket)
+	addi %r4,%r1,stackblock
 	DO_CALL(SYS_ify(socketcall))
-	addi 1,1,48
+	addi %r1,%r1,48
 	bnslr
 #ifdef PIC
 	b __syscall_error@plt
diff --git a/sysdeps/unix/sysv/linux/powerpc/syscall.S b/sysdeps/unix/sysv/linux/powerpc/syscall.S
index 441dd5d433..2cb548245b 100644
--- a/sysdeps/unix/sysv/linux/powerpc/syscall.S
+++ b/sysdeps/unix/sysv/linux/powerpc/syscall.S
@@ -20,12 +20,12 @@
 
 	.text
 ENTRY (syscall)
-	mr	0,3
-	mr	3,4
-	mr	4,5
-	mr	5,6
-	mr	6,7
-	mr	7,8
+	mr   %r0,%r3
+	mr   %r3,%r4
+	mr   %r4,%r5
+	mr   %r5,%r6
+	mr   %r6,%r7
+	mr   %r7,%r8
 	sc
 	bnslr
 #ifdef PIC
diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/sysdep.h
index 6cad9ae087..577809acb8 100644
--- a/sysdeps/unix/sysv/linux/powerpc/sysdep.h
+++ b/sysdeps/unix/sysv/linux/powerpc/sysdep.h
@@ -50,7 +50,7 @@
     b __syscall_error@plt
 #else
 #define PSEUDO(name, syscall_name, args)                                      \
-  .text;								      \
+  .section ".text";							      \
   ENTRY (name)                                                                \
     DO_CALL (SYS_ify (syscall_name));				              \
     bnslr;                                                                    \
diff --git a/sysdeps/unix/sysv/linux/shmdt.c b/sysdeps/unix/sysv/linux/shmdt.c
index dcda701e45..70526e6ae0 100644
--- a/sysdeps/unix/sysv/linux/shmdt.c
+++ b/sysdeps/unix/sysv/linux/shmdt.c
@@ -26,5 +26,5 @@ int
 shmdt (shmaddr)
      const void *shmaddr;
 {
-  return __ipc (IPCOP_shmdt, 0, 0, 0, shmaddr);
+  return __ipc (IPCOP_shmdt, 0, 0, 0, (void *) shmaddr);
 }
diff --git a/sysdeps/unix/sysv/linux/statfsbuf.h b/sysdeps/unix/sysv/linux/statfsbuf.h
index 1d1bbdae0d..7e1aa55334 100644
--- a/sysdeps/unix/sysv/linux/statfsbuf.h
+++ b/sysdeps/unix/sysv/linux/statfsbuf.h
@@ -19,6 +19,8 @@
 #ifndef _STATFSBUF_H
 #define _STATFSBUF_H
 
+#include <gnu/types.h>  /* for __fsid_t */
+
 struct statfs
   {
     int f_type;
diff --git a/time/europe b/time/europe
index 23f45ada8d..6611520e98 100644
--- a/time/europe
+++ b/time/europe
@@ -1,4 +1,4 @@
-# @(#)europe	7.43
+# @(#)europe	7.44
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
@@ -1037,7 +1037,7 @@ Zone	Europe/Sarajevo	1:13:40	-	LMT	1884
 			1:00	-	CET	1941 Apr 18 23:00
 			1:00	C-Eur	CE%sT	1945 May  8  2:00s
 			1:00	1:00	CEST	1945 Sep 16  2:00s
-			1:00	-	CET	1983
+			1:00	-	CET	1982 Oct 11
 			1:00	EU	CE%sT
 
 # Bulgaria
@@ -1063,7 +1063,7 @@ Zone	Europe/Zagreb	1:03:52	-	LMT	1884
 			1:00	-	CET	1941 Apr 18 23:00
 			1:00	C-Eur	CE%sT	1945 May  8  2:00s
 			1:00	1:00	CEST	1945 Sep 16  2:00s
-			1:00	-	CET	1983
+			1:00	-	CET	1982 Oct 11
 			1:00	EU	CE%sT
 
 # Czech Republic
@@ -1562,7 +1562,7 @@ Zone	Europe/Skopje	1:25:44	-	LMT	1884
 			1:00	-	CET	1941 Apr 18 23:00
 			1:00	C-Eur	CE%sT	1945 May  8  2:00s
 			1:00	1:00	CEST	1945 Sep 16  2:00s
-			1:00	-	CET	1983
+			1:00	-	CET	1982 Oct 11
 			1:00	EU	CE%sT
 
 # Malta
@@ -1958,7 +1958,7 @@ Zone Europe/Ljubljana	0:58:04	-	LMT	1884
 			1:00	-	CET	1941 Apr 18 23:00
 			1:00	C-Eur	CE%sT	1945 May  8  2:00s
 			1:00	1:00	CEST	1945 Sep 16  2:00s
-			1:00	-	CET	1983
+			1:00	-	CET	1982 Oct 11
 			1:00	EU	CE%sT
 
 # Spain
@@ -2198,7 +2198,10 @@ Zone	Europe/Belgrade	1:22:00	-	LMT	1884
 			1:00	-	CET	1941 Apr 18 23:00
 			1:00	C-Eur	CE%sT	1945 May  8  2:00s
 			1:00	1:00	CEST	1945 Sep 16  2:00s
-			1:00	-	CET	1983
+# Metod Kozelj <metod.kozelj@rzs-hm.si> reports that the legal date of
+# transition to EU rules was 1982-10-11, for all of Yugoslavia at the time.
+# Shanks doesn't give as much detail, so go with Kozelj.
+			1:00	-	CET	1982 Oct 11
 			1:00	EU	CE%sT
 
 ###############################################################################
diff --git a/time/sys/time.h b/time/sys/time.h
index c4745f1546..0204050d22 100644
--- a/time/sys/time.h
+++ b/time/sys/time.h
@@ -112,10 +112,10 @@ extern int getitimer __P ((enum __itimer_which __which,
    set *OLD to the old value of timer WHICH.
    Returns 0 on success, -1 on errors.  */
 extern int __setitimer __P ((enum __itimer_which __which,
-			     struct itimerval *__new,
+			     __const struct itimerval *__new,
 			     struct itimerval *__old));
 extern int setitimer __P ((enum __itimer_which __which,
-			   struct itimerval *__new,
+			   __const struct itimerval *__new,
 			   struct itimerval *__old));
 
 /* Change the access time of FILE to TVP[0] and
diff --git a/time/zic.c b/time/zic.c
index b9518c4649..c95887c9b4 100644
--- a/time/zic.c
+++ b/time/zic.c
@@ -1,6 +1,6 @@
 #ifndef lint
 #ifndef NOID
-static char	elsieid[] = "@(#)zic.c	7.83";
+static char	elsieid[] = "@(#)zic.c	7.87";
 #endif /* !defined NOID */
 #endif /* !defined lint */
 
@@ -141,8 +141,10 @@ static int		leapcnt;
 static int		linenum;
 static time_t		max_time;
 static int		max_year;
+static int		max_year_representable;
 static time_t		min_time;
 static int		min_year;
+static int		min_year_representable;
 static int		noise;
 static const char *	rfilename;
 static int		rlinenum;
@@ -430,7 +432,7 @@ const char * const	string;
 
 	cp = ecpyalloc("warning: ");
 	cp = ecatalloc(cp, string);
-	error(string);
+	error(cp);
 	ifree(cp);
 	--errors;
 }
@@ -649,6 +651,8 @@ setboundaries P((void))
 	}
 	min_year = TM_YEAR_BASE + gmtime(&min_time)->tm_year;
 	max_year = TM_YEAR_BASE + gmtime(&max_time)->tm_year;
+	min_year_representable = min_year;
+	max_year_representable = max_year;
 }
 
 static int
@@ -1218,6 +1222,7 @@ const char * const		timep;
 				rp->r_todisstd = FALSE;
 				rp->r_todisgmt = FALSE;
 				*ep = '\0';
+				break;
 			case 'g':	/* Greenwich */
 			case 'u':	/* Universal */
 			case 'z':	/* Zulu */
@@ -1249,7 +1254,11 @@ const char * const		timep;
 	} else if (sscanf(cp, scheck(cp, "%d"), &rp->r_loyear) != 1) {
 		error(_("invalid starting year"));
 		return;
-	}
+	} else if (noise)
+		if (rp->r_loyear < min_year_representable)
+			warning(_("starting year too low to be represented"));
+		else if (rp->r_loyear > max_year_representable)
+			warning(_("starting year too high to be represented"));
 	cp = hiyearp;
 	if ((lp = byword(cp, end_years)) != NULL) switch ((int) lp->l_value) {
 		case YR_MINIMUM:
@@ -1269,7 +1278,11 @@ const char * const		timep;
 	} else if (sscanf(cp, scheck(cp, "%d"), &rp->r_hiyear) != 1) {
 		error(_("invalid ending year"));
 		return;
-	}
+	} else if (noise)
+		if (rp->r_loyear < min_year_representable)
+			warning(_("starting year too low to be represented"));
+		else if (rp->r_loyear > max_year_representable)
+			warning(_("starting year too high to be represented"));
 	if (rp->r_loyear > rp->r_hiyear) {
 		error(_("starting year greater than ending year"));
 		return;