summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--MakeTAGS13
-rw-r--r--Makerules9
-rw-r--r--config.make.in1
-rw-r--r--configure.in2
-rw-r--r--elf/dl-load.c42
-rw-r--r--elf/dl-lookup.c19
-rw-r--r--elf/dl-reloc.c4
-rw-r--r--elf/dl-runtime.c4
-rw-r--r--elf/dl-symbol.c2
-rw-r--r--elf/dlsym.c2
-rw-r--r--elf/link.h14
-rw-r--r--elf/rtld.c4
-rw-r--r--manual/examples/strdupa.c19
-rw-r--r--manual/libc.texinfo9
-rw-r--r--manual/nss.texi586
-rw-r--r--manual/nsswitch.texi16
-rw-r--r--manual/string.texi77
-rw-r--r--manual/users.texi18
-rw-r--r--nss/nsswitch.c2
-rw-r--r--po/SYS_libc.pot1378
-rw-r--r--po/header.pot1
-rw-r--r--shadow/sgetspent_r.c2
-rw-r--r--stdlib/strtod.c2
-rw-r--r--string/strdup.c4
-rw-r--r--sysdeps/alpha/dl-machine.h4
-rw-r--r--sysdeps/i386/dl-machine.h10
-rw-r--r--sysdeps/m68k/dl-machine.h18
-rw-r--r--sysdeps/mips/dl-machine.h2
-rw-r--r--sysdeps/unix/sysv/linux/i386/clone.S1
-rw-r--r--sysdeps/unix/sysv/linux/m68k/clone.S75
30 files changed, 2080 insertions, 260 deletions
diff --git a/MakeTAGS b/MakeTAGS
index 10b837c9cb..0416493489 100644
--- a/MakeTAGS
+++ b/MakeTAGS
@@ -132,8 +132,8 @@ endif
 
 define extract
 @rm -f $@.new
-$(XGETTEXT) --keyword=_ --keyword=N_ --add-comments=TRANS --sort-output -d - \
-	    $(XGETTEXTFLAGS-$(@F)) > $@.new $^
+$(XGETTEXT) --keyword=_ --keyword=N_ --add-comments=TRANS  --sort-output \
+	    --omit-header -n -d - $(XGETTEXTFLAGS-$(@F)) > $@.new $^
 mv -f $@.new $@
 endef
 
@@ -146,15 +146,12 @@ else
 endif
 
 $P/siglist.pot: $(common-objpfx)siglist.c; $(extract)
-$P/errlist.pot: $(..)sysdeps/gnu/errlist.c; $(extract)
 
-# Extract all strings from these files; their strings are not marked.
+# Extract all strings from this file; its strings are not marked.
 # Their surroundings are also not interesting.
 XGETTEXTFLAGS-siglist.pot = -a --no-location
-XGETTEXTFLAGS-errlist.pot = -a --no-location
 
-all-pot = $P/libc-top.pot $P/subdirs.pot \
-	  $P/siglist.pot $P/errlist.pot
+all-pot = $P/libc-top.pot $P/subdirs.pot $P/siglist.pot
 
 ifndef subdir
 # Collect all the subdir messages, massaging the file names in comments
@@ -173,7 +170,7 @@ $P/SYS_libc.pot: $(all-pot)
 	@rm -f $@.new
 	sed -e 's/VERSION/$(version)/' -e "s/DATE/`date +'%Y-%m-%d %k:%M'`/" \
 	    po/header.pot > $@.new
-	$(XGETTEXT) -d - -n -s --omit-header $^ >> $@.new
+	$(XGETTEXT) -d - --omit-header -n -s $^ >> $@.new
 	mv -f $@.new $@
 	test ! -d CVS || cvs ci -m'Regenerated from source files' $@
 
diff --git a/Makerules b/Makerules
index 14f5b5b54b..f82408146a 100644
--- a/Makerules
+++ b/Makerules
@@ -454,9 +454,10 @@ endef
 object-suffixes-left := $(object-suffixes)
 include $(o-iterator)
 define do-ar
+topdir=`cd $(..).; pwd`; \
 $(patsubst %,cd %;,$(objdir)) \
-$(AUTOLOCK) ${O%-lib}.lck $(AR) cru$(verbose) ${O%-lib} \
-				$(patsubst $(objpfx)%,%,$^)
+$$topdir/autolock.sh ${O%-lib}.lck $(AR) cru$(verbose) ${O%-lib} \
+					 $(patsubst $(objpfx)%,%,$^)
 rm -f $@
 touch $@
 endef
@@ -474,7 +475,9 @@ define o-iterator-doit
 $(common-objpfx)$(patsubst %,$(libtype$o),c)($(ar-symtab-name)): \
 	  $(common-objpfx)$(patsubst %,$(libtype$o),c)(\
 	    $(patsubst $(objpfx)%,%,$(o-objects))) $(subdirs-stamp-o); \
-	$(AUTOLOCK) $$(common-objpfx)$$(patsubst %,$$(libtype$o),c).lck \
+	topdir=`cd $(..).; pwd`; \
+	$$$$topdir/autolock.sh \
+	  $$(common-objpfx)$$(patsubst %,$$(libtype$o),c).lck \
 	  $$(RANLIB) $$(common-objpfx)$$(patsubst %,$$(libtype$o),c)
 endef
 ifndef subdir
diff --git a/config.make.in b/config.make.in
index a496e29f0d..b099199c36 100644
--- a/config.make.in
+++ b/config.make.in
@@ -34,7 +34,6 @@ CC = @CC@
 BUILD_CC = @BUILD_CC@
 CFLAGS = @CFLAGS@
 AR = @AR@
-AUTOLOCK = @AUTOLOCK@
 RANLIB = @RANLIB@
 AS = $(CC) -c
 
diff --git a/configure.in b/configure.in
index aebc785904..631a035e92 100644
--- a/configure.in
+++ b/configure.in
@@ -308,8 +308,6 @@ fi
 AC_PROG_CPP
 AC_CHECK_TOOL(AR, ar)
 AC_CHECK_TOOL(RANLIB, ranlib, :)
-AUTOLOCK="`(cd $srcdir; pwd)`/autolock.sh"
-AC_SUBST(AUTOLOCK)
 
 AC_CACHE_CHECK(for signed size_t type, libc_cv_signed_size_t, [dnl
 echo '#include <stddef.h>
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 8ccc838b2b..6fd6a6cbe0 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -70,11 +70,25 @@ int _dl_zerofd = -1;
 size_t _dl_pagesize;
 
 
+/* Local version of `strdup' function.  */
+static inline char *
+local_strdup (const char *s)
+{
+  size_t len = strlen (s) + 1;
+  void *new = malloc (len);
+
+  if (new == NULL)
+    return NULL;
+
+  return (char *) memcpy (new, s, len);
+}
+
+
 /* Map in the shared object NAME, actually located in REALNAME, and already
    opened on FD.  */
 
 struct link_map *
-_dl_map_object_from_fd (const char *name, int fd, char *realname,
+_dl_map_object_from_fd (char *name, int fd, char *realname,
 			struct link_map *loader, int l_type)
 {
   struct link_map *l = NULL;
@@ -96,6 +110,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
 	    l->l_next->l_prev = l->l_prev;
 	  free (l);
 	}
+      free (name);
       free (realname);
       _dl_signal_error (code, name, msg);
     }
@@ -142,6 +157,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
 	/* The object is already loaded.
 	   Just bump its reference count and return it.  */
 	__close (fd);
+	free (name);
 	free (realname);
 	++l->l_opencount;
 	return l;
@@ -524,11 +540,8 @@ _dl_map_object (struct link_map *loader, const char *name, int type)
 	      fd = __open (cached, O_RDONLY);
 	      if (fd != -1)
 		{
-		  size_t cl = strlen (cached) + 1;
-		  realname = malloc (cl);
-		  if (realname)
-		    memcpy (realname, cached, cl);
-		  else
+		  realname = local_strdup (cached);
+		  if (realname == NULL)
 		    {
 		      __close (fd);
 		      fd = -1;
@@ -548,11 +561,8 @@ _dl_map_object (struct link_map *loader, const char *name, int type)
       fd = __open (name, O_RDONLY);
       if (fd != -1)
 	{
-	  size_t len = strlen (name) + 1;
-	  realname = malloc (len);
-	  if (realname)
-	    memcpy (realname, name, len);
-	  else
+	  realname = local_strdup (name);
+	  if (realname == NULL)
 	    {
 	      __close (fd);
 	      fd = -1;
@@ -560,6 +570,16 @@ _dl_map_object (struct link_map *loader, const char *name, int type)
 	}
     }
 
+  if (fd != -1)
+    {
+      name = local_strdup (name);
+      if (name == NULL)
+	{
+	  __close (fd);
+	  fd = -1;
+	}
+    }
+
   if (fd == -1)
     _dl_signal_error (errno, name, "cannot open shared object file");
 
diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
index 44f91fca7d..e57887bfdd 100644
--- a/elf/dl-lookup.c
+++ b/elf/dl-lookup.c
@@ -45,16 +45,16 @@ _dl_elf_hash (const char *name)
 }
 
 /* Search loaded objects' symbol tables for a definition of the symbol
-   UNDEF_NAME.  The chosen value can't be RELOC_ADDR.  If NOPLT is nonzero,
-   then a PLT entry cannot satisfy the reference; some different binding
-   must be found.  */
+   UNDEF_NAME.  FLAGS is a set of flags.  If DL_LOOKUP_NOEXEC is set,
+   then don't search the executable for a definition; this used for
+   copy relocs.  If DL_LOOKUP_NOPLT is set, then a PLT entry cannot
+   satisfy the reference; some different binding must be found.  */
 
 ElfW(Addr)
 _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref,
 		   struct link_map *symbol_scope[],
 		   const char *reference_name,
-		   ElfW(Addr) reloc_addr,
-		   int noplt)
+		   int flags)
 {
   const unsigned long int hash = _dl_elf_hash (undef_name);
   struct
@@ -75,6 +75,10 @@ _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref,
 
 	map = (*scope)->l_searchlist[i];
 
+	/* Don't search the executable when resolving a copy reloc.  */
+	if (flags & DL_LOOKUP_NOEXEC && map->l_type == lt_executable)
+	  continue;
+
 	symtab = ((void *) map->l_addr + map->l_info[DT_SYMTAB]->d_un.d_ptr);
 	strtab = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr);
 
@@ -87,9 +91,8 @@ _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref,
 	    const ElfW(Sym) *sym = &symtab[symidx];
 
 	    if (sym->st_value == 0 || /* No value.  */
-		/* Cannot resolve to the location being filled in.  */
-		reloc_addr == map->l_addr + sym->st_value ||
-		(noplt && sym->st_shndx == SHN_UNDEF)) /* Reject PLT.  */
+		((flags & DL_LOOKUP_NOPLT) != 0 /* Reject PLT entry.  */
+		 && sym->st_shndx == SHN_UNDEF))
 	      continue;
 
 	    switch (ELFW(ST_TYPE) (sym->st_info))
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index 5adf0f6dac..fa424a4d01 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -57,9 +57,9 @@ _dl_relocate_object (struct link_map *l, struct link_map *scope[], int lazy)
       = ((void *) l->l_addr + l->l_info[DT_STRTAB]->d_un.d_ptr);
 
     /* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code.  */
-#define RESOLVE(ref, reloc_addr, noplt) \
+#define RESOLVE(ref, flags) \
     (_dl_lookup_symbol (strtab + (*ref)->st_name, ref, scope, \
-			l->l_name, reloc_addr, noplt))
+			l->l_name, flags))
 
 #include "dynamic-link.h"
     ELF_DYNAMIC_RELOCATE (l, lazy);
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
index 16e037914b..4e7b5296d4 100644
--- a/elf/dl-runtime.c
+++ b/elf/dl-runtime.c
@@ -122,9 +122,9 @@ fixup (
 
   {
     /* This macro is used as a callback from the elf_machine_relplt code.  */
-#define RESOLVE(ref, reloc_addr, noplt) \
+#define RESOLVE(ref, flags) \
   (_dl_lookup_symbol (strtab + (*ref)->st_name, ref, scope, \
-		      l->l_name, reloc_addr, noplt))
+		      l->l_name, flags))
 #include "dynamic-link.h"
 
     /* Perform the specified relocation.  */
diff --git a/elf/dl-symbol.c b/elf/dl-symbol.c
index 7977e69ab6..04dd122ef1 100644
--- a/elf/dl-symbol.c
+++ b/elf/dl-symbol.c
@@ -28,6 +28,6 @@ _dl_symbol_value (struct link_map *map, const char *name)
   ElfW(Addr) loadbase;
   const ElfW(Sym) *ref = NULL;
   struct link_map *scope[2] = { map, NULL };
-  loadbase = _dl_lookup_symbol (name, &ref, scope, map->l_name, 0, 0);
+  loadbase = _dl_lookup_symbol (name, &ref, scope, map->l_name, 0);
   return loadbase + ref->st_value;
 }
diff --git a/elf/dlsym.c b/elf/dlsym.c
index 256eba800e..98e36290c2 100644
--- a/elf/dlsym.c
+++ b/elf/dlsym.c
@@ -44,7 +44,7 @@ dlsym (void *handle, const char *name)
 	  scope = &(_dl_global_scope ?: _dl_default_scope)[2];
 	  owner = NULL;
 	}
-      loadbase = _dl_lookup_symbol (name, &ref, scope, owner, 0, 0);
+      loadbase = _dl_lookup_symbol (name, &ref, scope, owner, 0);
     }
 
   return _dlerror_run (doit) ? NULL : (void *) (loadbase + ref->st_value);
diff --git a/elf/link.h b/elf/link.h
index fa96613478..a9637000e5 100644
--- a/elf/link.h
+++ b/elf/link.h
@@ -224,16 +224,18 @@ extern void _dl_close (struct link_map *map);
    null-terminated list of object scopes to search; each object's
    l_searchlist (i.e. the segment of the dependency tree starting at that
    object) is searched in turn.  REFERENCE_NAME should name the object
-   containing the reference; it is used in error messages.  RELOC_ADDR is
-   the address being fixed up and the chosen symbol cannot be one with this
-   value.  If NOPLT is nonzero, then the reference must not be resolved to
-   a PLT entry.  */
+   containing the reference; it is used in error messages.  FLAGS is a
+   set of flags:  */
+#define DL_LOOKUP_NOEXEC 1	/* Don't search the executable for a
+				   definition; this is used for copy
+				   relocs. */
+#define DL_LOOKUP_NOPLT 2	/* The reference must not be resolved
+				   to a PLT entry.  */
 extern ElfW(Addr) _dl_lookup_symbol (const char *undef,
 				     const ElfW(Sym) **sym,
 				     struct link_map *symbol_scope[],
 				     const char *reference_name,
-				     ElfW(Addr) reloc_addr,
-				     int noplt);
+				     int flags);
 
 /* Look up symbol NAME in MAP's scope and return its run-time address.  */
 extern ElfW(Addr) _dl_symbol_value (struct link_map *map, const char *name);
diff --git a/elf/rtld.c b/elf/rtld.c
index fe5d269de2..308c2f4d6d 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -62,7 +62,7 @@ _dl_start (void *arg)
   /* This #define produces dynamic linking inline functions for
      bootstrap relocation instead of general-purpose relocation.  */
 #define RTLD_BOOTSTRAP
-#define RESOLVE(sym, reloc_addr, noplt) bootstrap_map.l_addr
+#define RESOLVE(sym, flags) bootstrap_map.l_addr
 #include "dynamic-link.h"
 
   /* Figure out the run-time load address of the dynamic linker itself.  */
@@ -369,7 +369,7 @@ of this helper program; chances are you did not intend to run this program.\n",
 	    const ElfW(Sym) *ref = NULL;
 	    ElfW(Addr) loadbase = _dl_lookup_symbol (_dl_argv[i], &ref,
 						     &_dl_default_scope[2],
-						     "argument", 0, 0);
+						     "argument", 0);
 	    char buf[20], *bp;
 	    buf[sizeof buf - 1] = '\0';
 	    bp = _itoa (ref->st_value, &buf[sizeof buf - 1], 16, 0);
diff --git a/manual/examples/strdupa.c b/manual/examples/strdupa.c
new file mode 100644
index 0000000000..7d6ef39947
--- /dev/null
+++ b/manual/examples/strdupa.c
@@ -0,0 +1,19 @@
+#include <paths.h>
+#include <string.h>
+#include <stdio.h>
+
+const char path[] = _PATH_STDPATH;
+
+int
+main (void)
+{
+  char *wr_path = strdupa (path);
+  char *cp = strtok (wr_path, ":");
+
+  while (cp != NULL)
+    {
+      puts (cp);
+      cp = strtok (NULL, ":");
+    }
+  return 0;
+}
diff --git a/manual/libc.texinfo b/manual/libc.texinfo
index 7a8c1c3327..8622e04fcb 100644
--- a/manual/libc.texinfo
+++ b/manual/libc.texinfo
@@ -137,6 +137,7 @@ of the GNU C Library.
 * Process Startup::             Writing the beginning and end of your program.
 * Processes::                   How to create processes and run other programs.
 * Job Control::                 All about process groups and sessions.
+* Name Service Switch::         Accessing the various system databases.
 * Users and Groups::            How users are identified and classified.
 * System Information::          Getting information about the
                                  hardware and software configuration
@@ -806,6 +807,13 @@ Functions for Job Control
 * Process Group Functions::     Functions for manipulating process groups.
 * Terminal Access Functions::   Functions for controlling terminal access.
 
+Name Service Switch
+
+* NSS Basics::                  What is this NSS good for.
+* NSS Configuration File::      Configuring NSS.
+* NSS Module Internals::        How does it work internally.
+* Extending NSS::               What to do to add services or databases.
+
 Users and Groups
 
 * User and Group IDs::          Each user and group has a unique numeric ID.
@@ -961,6 +969,7 @@ Porting the GNU C Library
 @include startup.texi
 @include process.texi
 @include job.texi
+@include nss.texi
 @include users.texi
 @include sysinfo.texi
 @include conf.texi
diff --git a/manual/nss.texi b/manual/nss.texi
new file mode 100644
index 0000000000..cd1f4af0ec
--- /dev/null
+++ b/manual/nss.texi
@@ -0,0 +1,586 @@
+@c each section should have index entries corresponding to the section title
+
+@node Name Service Switch
+@chapter System Databases and Name Service Switch
+
+Various functions in the C Library need to be configured to work
+correctly in the local environment.  Traditionally, this was done by
+using files (e.g., @file{/etc/passwd}), but other nameservices (line the
+Network Information Service (NIS) and the Domain Name Service (DNS))
+became popular, and were hacked into the C library, usually with a fixed
+search order @pxref{frobnicate, frobnicate, ,jargon}.
+
+The GNU C Library contains a cleaner solution of this problem.  It is
+designed after a method used by Sun Microsystems in the C library of
+@w{Solaris 2}.  GNU C Library follows their name and calls this
+scheme @dfn{Name Service Switch} (NSS).
+
+Though the interface might be similar to Sun's version there is no
+common code.  We never saw any source code of Sun's implementation and
+so the internal interface are incompatible.  This is also manifest in the
+file names we use as we will see later.
+
+
+@menu
+* NSS Basics::                  What is this NSS good for.
+* NSS Configuration File::      Configuring NSS.
+* NSS Module Internals::        How does it work internally.
+* Extending NSS::               What to do to add services or databases.
+@end menu
+
+@node NSS Basics, NSS Configuration File, Name Service Switch, Name Service Switch
+@section NSS Basics
+
+The basic idea is to put the implementation of the different services
+offered to access the databases in separate modules.  This has some
+advantages:
+
+@enumerate
+@item
+Contributors can add new services without adding them to GNU C Library.
+@item
+The modules can be updated separately.
+@item
+The C library image is smaller.
+@end enumerate
+
+To fulfill the first goal above the ABI of the modules will be described
+below.  For getting the implementation of a new service right it is
+important to understand how the functions in the modules get called.
+They are in no way designed to be used by the programmer directly.
+Instead the programmer should only use the documented and standardized
+functions to access the databases.
+
+@noindent
+The databases available in the NSS are
+
+@cindex ethers
+@cindex group
+@cindex hosts
+@cindex network
+@cindex protocols
+@cindex passwd
+@cindex rpc
+@cindex services
+@cindex shadow
+@vtable @code
+@item ethers
+Ethernet numbers,
+@comment @pxref{Ethernet Numbers}.
+@item group
+Groups of users, @pxref{Group Database}.
+@item hosts
+Host names and numbers, @pxref{Host Names}.
+@item network
+Network names and numbers, @pxref{Networks Database}.
+@item protocols
+Network protocols, @pxref{Protocols Database}.
+@item passwd
+User passwords, @pxref{User Database}.
+@item rpc
+Remote procedure call names and numbers,
+@comment @pxref{RPC Database}.
+@item services
+Network services, @pxref{Services Database}.
+@item shadow
+Shadow user passwords,
+@comment @pxref{Shadow Password Database}.
+@end vtable
+
+@noindent
+There will be some more added later (@code{aliases}, @code{automount},
+@code{bootparams}, @code{netgroup}, @code{netmasks}, and
+@code{publickey}).
+
+@node NSS Configuration File, NSS Module Internals, NSS Basics, Name Service Switch
+@section The NSS Configuration File
+
+@cindex @file{/etc/nsswitch.conf}
+@cindex @file{nsswitch.conf}
+Somehow the NSS code must be told about the wishes of the user.  For
+this reason there is the file @file{/etc/nsswitch.conf}.  For each
+database this file contain a specification how the lookup process should
+work.  The file could look like this:
+
+@example
+@include nsswitch.texi
+@end example
+
+The first column is the database as you can guess from the table above.
+The rest of the line specifies how the lookup process works.  Please
+note that you specify the way it works for each database individually.
+This cannot be done with the old way of a monolithic implementation.
+
+The configuration specification for each database can contain two
+different items:
+
+@itemize @bullet
+@item
+the service specification like @code{files}, @code{db}, or @code{nis}.
+@item
+the reaction on lookup result line @code{[NOTFOUND=return]}.
+@end itemize
+
+@menu
+* Services in the NSS configuration::  Service names in the NSS configuratin.
+* Actions in the NSS configuration::  React approprite on the lookup result.
+* Notes on NSS Configuration File::  Things to take care about while
+                                     configuring NSS.
+@end menu
+
+@node Services in the NSS configuration, Actions in the NSS configuration, NSS Configuration File, NSS Configuration File
+@subsection Services in the NSS configuration File
+
+The above example file mentions four different services: @code{files},
+@code{db}, @code{nis}, and @code{nisplus}.  This does not mean these
+services are available on all sites and it does also not mean these are
+all the services which will ever be available.
+
+In fact, these names are simply strings which the NSS code uses to find
+the implicitly addressed functions.  The internal interface will be
+described later.  Visible to the user are the modules which implement an
+individual service.
+
+Assume the service @var{name} shall be used for a lookup.  The code for
+this service is implemented in a module called @file{libnss_@var{name}}.
+On a system supporting shared libraries this is in fact a shared library
+with the name (for example) @file{libnss_@var{name}.so.1}.  The number
+at the end is the currently used version of the interface which will not
+change frequently.  Normally the user should not have to be cognizant of
+these files since they should be placed in a directory where they are
+found automatically.  Only the names of all available services are
+important.
+
+@node Actions in the NSS configuration, Notes on NSS Configuration File, Services in the NSS configuration, NSS Configuration File
+@subsection Actions in the NSS configuration
+
+The second item in the specification gives the user much finer control
+on the lookup process.  Action items are placed between two service
+names and are written within brackets.  The general form is
+
+@smallexample
+[ @r{(}!@r{?} @var{status} = @var{action}@r{)+} ]
+@end smallexample
+
+@noindent
+where
+
+@smallexample
+@var{status} @result{} success | notfound | unavail | tryagain
+@var{action} @result{} return | continue
+@end smallexample
+
+The case of the keywords is insignificant.  The @var{status}
+values are the results of a call to a lookup function of a specific
+service.  They mean
+
+@ftable @samp
+@item success
+No error occured an the wanted entry is returned.  The default action
+for this is @code{return}.
+
+@item notfound
+The lookup process works ok but the needed value was not found.  The
+default action is @code{continue}.
+
+@item unavail
+@cindex DNS server unavailable
+The service is permanently unavailable.  This can either mean the needed
+file is not available, or, for DNS, the server is not available or does
+not allow queries.  The default action is @code{continue}.
+
+@item tryagain
+The service is temporarily unavailable.  This could mean a file is
+locked or a server currently cannot accept more connections.  The
+default action is @code{continue}.
+@end ftable
+
+@noindent
+If we have a line like
+
+@smallexample
+ethers: nisplus [NOTFOUND=return] db files
+@end smallexample
+
+@noindent
+this is equivalent to
+
+@smallexample
+ethers: nisplus [SUCCESS=return NOTFOUND=return UNAVAIL=continue
+                 TRYAGAIN=continue]
+        db      [SUCCESS=return NOTFOUND=continue UNAVAIL=continue
+                 TRYAGAIN=continue]
+        files
+@end smallexample
+
+@noindent
+(except that it would have to be written on one line).  The default
+value for the actions are normally what you want, and only need to be
+changed in exceptional cases.
+
+If the optional @code{!} is placed before the @var{status} this means
+the following action is used for all statii but @var{status} itself.
+I.e., @code{!} is negation as in the C language (and others).
+
+Before we explain the exception which makes this action item necessary
+one more remark: obviously it makes no sense to add another action
+item after the @code{files} service.  Since there is no other service
+following the action @emph{always} is @code{return}.
+
+@cindex nisplus, and completeness
+Now, why is this @code{[NOTFOUND=return]} action useful?  To understand
+this we should know that the @code{nisplus} service is often
+complete; i.e., if an entry is not available in the NIS+ tables it is
+not available anywhere else.  This is what is expressed by this action
+item: it is useless to examine further services since they will not give
+us a result.
+
+@cindex nisplus, and booting
+@cindex bootstrapping, and services
+The situation would be different if the NIS+ service is not available
+because the machine is booting.  In this case the return value of the
+lookup function is not @code{notfound} but instead @code{unavail}.  And
+as you can see in the complete form above: in this situation the
+@code{db} and @code{files} services are used.  Neat, isn't it?  The
+system administrator need not pay special care for the time the system
+is not completely ready to work (while booting or shutdown or
+network problems).
+
+
+@node Notes on NSS Configuration File,  , Actions in the NSS configuration, NSS Configuration File
+@subsection Notes on the NSS Configuration File
+
+Finally a few more hints.  The NSS implementation is not completely
+helpless if @file{/etc/nsswitch.conf} does not exist.  For
+all supported databases there is a default value so it should normally
+be possible to get the system running even if the file is corrupted or
+missing.
+
+A second point is that the user should try to optimize the lookup
+process.  The different service have different response times.  A simple
+file look up on a local file could be fast, but if the file is long and the
+needed entry is near the end of the file this may take quite some time.
+In this case it might be better to use the @code{db} service which
+allows fast local access to large data sets.
+
+Often the situation is that some global information like NIS must be
+used.  So it is unavoidable to use service entries like @code{nis} etc.
+But one should avoid slow services like this if possible.
+
+
+@node NSS Module Internals, Extending NSS, NSS Configuration File, Name Service Switch
+@section NSS Module Internals
+
+Now it is time to described how the modules look like.  The functions
+contained in a module are identified by their names.  I.e., there is no
+jump table or the like.  How this is done is of no interest here; those
+interested in this topic should read about Dynamic Linking.
+@comment @ref{Dynamic Linking}.
+
+
+@menu
+* NSS Module Names::            Construction of the interface function of
+                                the NSS modules.
+* NSS Modules Interface::       Programming interface in the NSS module
+                                functions.
+@end menu
+
+@node NSS Module Names, NSS Modules Interface, NSS Module Internals, NSS Module Internals
+@subsection The Naming Scheme of the NSS Modules
+
+@noindent
+The name of each function consist of various parts:
+
+@quotation
+       _nss_@var{service}_@var{function}
+@end quotation
+
+@var{service} of course corresponds to the name of the module this
+function is found in.@footnote{Now you might ask why to duplicate this
+information.  The answer is that we want to keep the possibility to link
+directly with these shared objects.}  The @var{function} part is derived
+from the interface function in the C library itself.  If the user calls
+the function @code{gethostbyname} and the service used is @code{files}
+the function
+
+@smallexample
+       _nss_files_gethostbyname_r
+@end smallexample
+
+@noindent
+in the module
+
+@smallexample
+       libnss_files.so.1
+@end smallexample
+
+@noindent
+@cindex reentrant NSS functions
+is used.  You see, what is explained above in not the whole truth.  In
+fact the NSS modules only contain reentrant versions of the lookup
+functions.  I.e., if the user would call the @code{gethostbyname_r}
+function this also would end in the above function.  For all user
+interface functions the C library maps this call to a call to the
+reentrant function.  For reentrant functions this is trivial since the
+interface is (nearly) the same.  For the non-reentrant version pointers
+to static buffers are used to replace the user supplied buffers.
+
+I.e., the reentrant functions @emph{can} have counterparts.  No service
+module is forced to have functions for all databases and all kinds to
+access them.  If a function is not available it is simply treated as if
+the function would return @code{unavail}
+(@pxref{Actions in the NSS configuration}).
+
+
+@node NSS Modules Interface,  , NSS Module Names, NSS Module Internals
+@subsection The Interface of the Function in NSS Modules
+
+Now we know about the functions contained in the modules.  It is now
+time to describe the types.  When we mentioned the reentrant versions of
+the functions above, this means there are some additional arguments
+(compared with the standard, non-reentrant version).  The prototypes for
+the non-reentrant and reentrant versions of our function above are:
+
+@smallexample
+struct hostent *gethostbyname (const char *name)
+
+struct hostent *gethostbyname_r (const char *name,
+                                 struct hostent *result_buf, char *buf,
+                                 int buflen, int *h_errnop)
+@end smallexample
+
+@noindent
+The actual prototype of the function is the NSS modules in this case is
+
+@smallexample
+int _nss_files_gethostbyname_r (const char *name,
+                                struct hostent *result_buf, char *buf,
+                                int buflen, int *h_errnop)
+@end smallexample
+
+I.e., the interface function is in fact the reentrant function with
+the change of the return value.  While the user-level function returns a
+pointer to the result the reentrant function return an @code{int} value:
+
+@cindex NSS_STATUS_TRYAGAIN
+@cindex NSS_STATUS_UNAVAIL
+@cindex NSS_STATUS_NOTFOUND
+@cindex NSS_STATUS_SUCCESS
+@ftable @code
+@item NSS_STATUS_TRYAGAIN
+numeric value @code{-2}
+
+@item NSS_STATUS_UNAVAIL
+numeric value @code{-1}
+
+@item NSS_STATUS_NOTFOUND
+numeric value @code{0}
+
+@item NSS_STATUS_SUCCESS
+numeric value @code{1}
+@end ftable
+
+@noindent
+Now you see where the action items of the @file{/etc/nsswitch.conf} file
+are used.
+
+The above function has somthing special which is missing for almost all
+the other module functions.  There is an argument @var{h_errnop}.  This
+points to a variable which will be filled with the error code in case
+the execution of the function fails for some reason.  The reentrant
+function cannot use the global variable @var{h_errno};
+@code{gethostbyname} calls @code{gethostbyname_r} with the
+last argument set to @code{&h_errno}.
+
+The @code{get@var{XXX}by@var{YYY}} functions are the most important
+functions in the NSS modules.  But there are others which implement
+the other ways to access system databases (say for the
+password database, there are @code{setpwent}, @code{getpwent}, and
+@code{endpwent}).  These will be described in more detail later.
+Here we give a general way to determine the
+signature of the module function:
+
+@itemize @bullet
+@item
+the return value is @code{int};
+@item
+the name is as explain in @pxref{NSS Module Names};
+@item
+the first arguments are identical to the arguments of the non-reentrant
+function;
+@item
+the next three arguments are:
+
+@table @code
+@item STRUCT_TYPE result_buf
+pointer to buffer where the result is stored.  @code{STRUCT_TYPE} is
+normally a struct which corresponds to the database.
+@item char *buffer
+pointer to a buffer where the function can store additional adata for
+the result etc.
+@item int buflen
+length of the buffer pointed to by @var{buffer}.
+@end table
+
+@item
+possibly a last argument @var{h_errnop}, for the host name and network
+name lookup functions.
+@end itemize
+
+@noindent
+This table is correct for all functions but the @code{set@dots{}ent}
+and @code{end@dots{}ent} functions.
+
+
+@node Extending NSS,  , NSS Module Internals, Name Service Switch
+@section Extending NSS
+
+One of the advantages of NSS mentioned above is that it can be extended
+quite easily.  There are two ways in which the extension can happen:
+adding another database or adding another service.  The former is
+normally done only by the C library developers.  It is
+here only important to remember that adding another database is
+independent from adding another service because a service need not
+support all databases or lookup functions.
+
+A designer/implementor of a new service is therefore free to choose the
+databases s/he is interested in and leave the rest for later (or
+completely aside).
+
+@menu
+* Adding another Service to NSS::  What is to do to add a new service.
+* NSS Module Function Internals::  Guidelines for writing new NSS
+                                        service functions.
+@end menu
+
+@node Adding another Service to NSS, NSS Module Function Internals, Extending NSS, Extending NSS
+@subsection Adding another Service to NSS
+
+The sources for a new service need not (and should not) be part of the
+GNU C Library itself.  The developer retains complete control over the
+sources and its development.  The links between the C library and the
+new service module consists solely of the interface functions.
+
+Each module is designed following a specific interface specification.
+For now the version is 1 and this manifests in the version number of the
+shared library object of the NSS modules: they have the extension
+@code{.1}.  If the interface ever changes in an incompatible way,
+this number will be increased---hopefully this will never be necessary.
+Modules using the old interface will still be usable.
+
+Developers of a new service will have to make sure that their module is
+created using the correct interface number.  This means the file itself
+must have the correct name and on ElF systems the @dfn{soname} (Shared
+Object Name) must also have this number.  Building a module from a bunch
+of object files on an ELF system using GNU CC could be done like this:
+
+@smallexample
+gcc -shared -o libnss_NAME.so.1 -Wl,-soname,libnss_NAME.so.1 OBJECTS
+@end smallexample
+
+@noindent
+@ref{Link Options, Options for Linking, , gcc, GNU CC}, to learn
+more about this command line.
+
+To use the new module the library must be able to find it.  This can be
+achieved by using options for the dynamic linker so that it will search
+directory where the binary is placed.  For an ELF system this could be
+done by adding the wanted directory to the value of
+@code{LD_LIBRARY_PATH}.
+
+But this is not always possible since some program (those which run
+under IDs which do not belong to the user) ignore this variable.
+Therefore the stable version of the module should be placed into a
+directory which is searched by the dynamic linker.  Normally this should
+be the directory @file{$prefix/lib}, where @file{$prefix} corresponds to
+the value given to configure using the @code{--prefix} option.  But be
+careful: this should only be done if it is clear the module does not
+cause any harm.  System administrators should be careful.
+
+
+@node NSS Module Function Internals,  , Adding another Service to NSS, Extending NSS
+@subsection Internals of the NSS Module Functions
+
+Until now we only provided the syntactic interface for the functions in
+the NSS module.  In fact there is not more much we can tell since the
+implementation obviously is different for each function.  But a few
+general rules must be followed by all functions.
+
+In fact there are four kinds of different functions which may appear in
+the interface.  All derive from the traditional ones for system databases.
+@var{db} in the following table is normally an abbreviation for the
+database (e.g., it is @code{pw} for the password database).
+
+@table @code
+@item int _nss_@var{database}_set@var{db}ent (void)
+This function prepares the service for following operations.  For a
+simple file based lookup this means files could be opened, for other
+services this function simply is a noop.
+
+One special case for this function is that it takes an additional
+argument for some @var{database}s (i.e., the interface is
+@code{int set@var{db}ent (int)}).  @ref{Host Names}, which describes the
+@code{sethostent} function.
+
+The return value should be @var{NSS_STATUS_SUCCESS} or according to the
+table above in case of an error (@pxref{NSS Modules Interface}).
+
+@item int _nss_@var{database}_end@var{db}ent (void)
+This function simply closes all files which are still open or removes
+buffer caches.  If there are no files or buffers to remove this is again
+a simple noop.
+
+There normally is no return value different to @var{NSS_STATUS_SUCCESS}.
+
+@item int _nss_@var{database}_get@var{db}ent_r (@var{STRUCTURE} *result, char *buffer, int buflen)
+Since this function will be called several times in a row to retrieve
+one entry after the other it must keep some kind of state.  But this
+also means the functions are not really reentrant.  They are reentrant
+only in that simultaneous calls to this function will not try to
+write the retrieved data in the same place (as it would be the case for
+the non-reentrant functions); instead, it writes to the structure
+pointed to by the @var{result} parameter.  But the calls share a common
+state and in the case of a file access this means they return neighboring
+entries in the file.
+
+The buffer of length @var{buflen} pointed to by @var{buffer} can be used
+for storing some additional data for the result.  It is @emph{not}
+guaranteed that the same buffer will be passed for the next call of this
+function.  Therefore one must not misuse this buffer to save some state
+information from one call to another.
+
+As explained above this function could also have an additional last
+argument.  This depends on the database used; it happens only for
+@code{host} and @code{network}.
+
+The function shall return @code{NSS_STATUS_SUCCESS} as long as their are
+more entries.  When the last entry was read it should return
+@code{NSS_STATUS_NOTFOUND}.  When the buffer given as an argument is too
+small for the data to be returned @code{NSS_STATUS_TRYAGAIN} should be
+returned.  When the service was not formerly initialized by a call to
+@code{_nss_@var{DATABASE}_set@var{db}ent} all return value allowed for
+this function can also be returned here.
+
+@item int _nss_@var{DATABASE}_get@var{db}by@var{XX}_r (@var{PARAMS}, @var{STRUCTURE} *result, char *buffer, int buflen)
+This function shall return the entry from the database which is
+addressed by the @var{PARAMS}.  The type and number of these arguments
+vary.  It must be individually determined by looking to the user-level
+interface functions.  All arguments given to the non-reentrant version
+are here described by @var{PARAMS}.
+
+The result must be stored in the structure pointed to by @var{result}.
+If there is additional data to return (say strings, where the
+@var{result} structure only contains pointers) the function must use the
+@var{buffer} or length @var{buflen}.  There must not be any references
+to non-constant global data.
+
+The implementation of this function should honour the @var{stayopen}
+flag set by the @code{set@var{DB}ent} function whenever this makes sense.
+
+Again, this function takes an additional last argument for the
+@code{host} and @code{network} database.
+
+The return value should as always follow the rules given above
+(@pxref{NSS Modules Interface}).
+
+@end table
diff --git a/manual/nsswitch.texi b/manual/nsswitch.texi
new file mode 100644
index 0000000000..62e7f607d1
--- /dev/null
+++ b/manual/nsswitch.texi
@@ -0,0 +1,16 @@
+# /etc/nsswitch.conf
+#
+# Name Service Switch configuration file.
+#
+
+passwd:     db files nis
+shadow:     files
+group:      db files nis
+
+hosts:      files nisplus nis dns
+networks:   nisplus [NOTFOUND=return] files
+
+ethers:     nisplus [NOTFOUND=return] db files
+protocols:  nisplus [NOTFOUND=return] db files
+rpc:        nisplus [NOTFOUND=return] db files
+services:   nisplus [NOTFOUND=return] db files
diff --git a/manual/string.texi b/manual/string.texi
index 8b7e9da96b..ccaf9e4494 100644
--- a/manual/string.texi
+++ b/manual/string.texi
@@ -294,6 +294,21 @@ returns a pointer to the new string.
 @end deftypefun
 
 @comment string.h
+@comment GNU
+@deftypefun {char *} strndup (const char *@var{s}, size_t @var{size})
+This function is similar to @code{strdup} but always copies at most
+@var{size} characters into the newly allocated string.
+
+If the length of @var{s} is more than @var{size}, then @code{strndup}
+copies just the first @var{size} characters and adds a closing null
+terminator.  Otherwise all characters are copied and the string is
+terminated.
+
+This function is different to @code{strncpy} in that it always
+terminates the destination string.
+@end deftypefun
+
+@comment string.h
 @comment Unknown origin
 @deftypefun {char *} stpcpy (char *@var{to}, const char *@var{from})
 This function is like @code{strcpy}, except that it returns a pointer to
@@ -315,6 +330,68 @@ Its behavior is undefined if the strings overlap.
 @end deftypefun
 
 @comment string.h
+@comment GNU
+@deftypefun {char *} stpncpy (char *@var{to}, const char *@var{from}, size_t @var{size})
+This function is similar to @code{stpcpy} but copies always exactly
+@var{size} characters into @var{to}.
+
+If the length of @var{from} is more then @var{size}, then @code{stpncpy}
+copies just the first @var{size} characters and returns a pointer to the
+character directly following the one which was copied last.  Note that in
+this case there is no null terminator written into @var{to}.
+
+If the length of @var{from} is less than @var{size}, then @code{stpncpy}
+copies all of @var{from}, followed by enough null characters to add up
+to @var{size} characters in all.  This behaviour is rarely useful, but it
+is implemented to be useful in contexts where this behaviour of the
+@code{strncpy} is used.  @code{stpncpy} returns a pointer to the
+@emph{first} written null character.
+
+This function is not part of ANSI or POSIX but was found useful while
+developing GNU C Library itself.
+
+Its behaviour is undefined if the strings overlap.
+@end deftypefun
+
+@comment string.h
+@comment GNU
+@deftypefun {char *} strdupa (const char *@var{s})
+This function is similar to @code{strdup} but allocates the new string
+using @code{alloca} instead of @code{malloc}
+@pxref{Variable Size Automatic}.  This means of course the returned
+string has the same limitations as any block of memory allocated using
+@code{alloca}.
+
+For obvious reasons @code{strdupa} is implemented only as a macro.  I.e.,
+you cannot get the address of this function.  Despite this limitations
+it is a useful function.  The following code shows a situation where
+using @code{malloc} would be a lot more expensive.
+
+@smallexample
+@include strdupa.c.texi
+@end smallexample
+
+Please note that calling @code{strtok} using @var{path} directly is
+illegal.
+
+This function is only available if GNU CC is used.
+@end deftypefun
+
+@comment string.h
+@comment GNU
+@deftypefun {char *} strndupa (const char *@var{s}, size_t @var{size})
+This function is similar to @code{strndup} but like @code{strdupa} it
+allocates the new string using @code{alloca}
+@pxref{Variable Size Automatic}.  The same advantages and limitations
+of @code{strdupa} are valid for @code{strndupa}, too.
+
+This function is implemented only as a macro which means one cannot
+get the address of it.
+
+@code{strndupa} is only available if GNU CC is used.
+@end deftypefun
+
+@comment string.h
 @comment ANSI
 @deftypefun {char *} strcat (char *@var{to}, const char *@var{from})
 The @code{strcat} function is similar to @code{strcpy}, except that the
diff --git a/manual/users.texi b/manual/users.texi
index 9b5e1ce9b5..b1d0d6f929 100644
--- a/manual/users.texi
+++ b/manual/users.texi
@@ -1,4 +1,4 @@
-@node Users and Groups, System Information, Job Control, Top
+@node Users and Groups, System Information, Name Service Switch, Top
 @chapter Users and Groups
 
 Every user who can log in on the system is identified by a unique number
@@ -87,7 +87,7 @@ for purposes of access control.  These IDs are also called the
 @dfn{effective user ID} and @dfn{effective group ID} of the process.
 
 Your login shell starts out with a persona which consists of your user
-ID and your default group ID.  
+ID and your default group ID.
 @c !!! also supplementary group IDs.
 In normal circumstances, all your other processes inherit these values.
 
@@ -367,7 +367,7 @@ The return values and error conditions for @code{setregid} are the same
 as those for @code{setreuid}.
 @end deftypefun
 
-The GNU system also lets privileged processes change their supplementary 
+The GNU system also lets privileged processes change their supplementary
 group IDs.  To use @code{setgroups} or @code{initgroups}, your programs
 should include the header file @file{grp.h}.
 @pindex grp.h
@@ -417,14 +417,14 @@ user_user_id = getuid ();
 game_user_id = geteuid ();
 @end smallexample
 
-Then it can turn off game file access with 
+Then it can turn off game file access with
 
 @smallexample
 setuid (user_user_id);
 @end smallexample
 
 @noindent
-and turn it on with 
+and turn it on with
 
 @smallexample
 setuid (game_user_id);
@@ -478,7 +478,7 @@ file will be installed with the set-user-ID bit set and owned by the
 same user as the @file{scores} file.  Typically, a system
 administrator will set up an account like @code{games} for this purpose.
 
-The executable file is given mode @code{4755}, so that doing an 
+The executable file is given mode @code{4755}, so that doing an
 @samp{ls -l} on it produces output like:
 
 @smallexample
@@ -608,7 +608,7 @@ record_score (int score)
 @node Tips for Setuid
 @section Tips for Writing Setuid Programs
 
-It is easy for setuid programs to give the user access that isn't 
+It is easy for setuid programs to give the user access that isn't
 intended---in fact, if you want to avoid this, you need to be careful.
 Here are some guidelines for preventing unintended access and
 minimizing its consequences when it does occur:
@@ -731,7 +731,7 @@ are declared in the header file @file{pwd.h}.
 @comment pwd.h
 @comment POSIX.1
 @deftp {Data Type} {struct passwd}
-The @code{passwd} data structure is used to hold information about 
+The @code{passwd} data structure is used to hold information about
 entries in the system user data base.  It has at least the following members:
 
 @table @code
@@ -887,7 +887,7 @@ database are declared in the header file @file{grp.h}.
 
 @comment grp.h
 @comment POSIX.1
-@deftp {Data Type} {struct group} 
+@deftp {Data Type} {struct group}
 The @code{group} structure is used to hold information about an entry in
 the system group database.  It has at least the following members:
 
diff --git a/nss/nsswitch.c b/nss/nsswitch.c
index 099f405c6e..16e1caf50d 100644
--- a/nss/nsswitch.c
+++ b/nss/nsswitch.c
@@ -353,7 +353,7 @@ nss_lookup_function (service_user *ni, const char *fct_name)
 		{
 		  struct link_map *scope[2] = { map, NULL };
 		  loadbase = _dl_lookup_symbol (name, &ref,
-						scope, map->l_name, 0, 0);
+						scope, map->l_name, 0);
 		}
 
 	      /* Construct the function name.  */
diff --git a/po/SYS_libc.pot b/po/SYS_libc.pot
index b30691f9d3..3bc8a9b8a7 100644
--- a/po/SYS_libc.pot
+++ b/po/SYS_libc.pot
@@ -1,17 +1,18 @@
-# GNU libc message catalog of translations
-# Copyright (C) 1996 Free Software Foundation, Inc.
-# Automatically generated; contact <bug-glibc@prep.ai.mit.edu>
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: libc 1.90\n"
-"PO-Revision-Date: 1996-05-29 14:03\n"
-"Last-Translator: GNU libc maintainers <bug-glibc@prep.ai.mit.edu>\n"
+"Project-Id-Version: libc 1.93\n"
+"POT-Creation-Date: 1996-08-14 18:02\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+DIST\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-1\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: ENCODING\n"
 
 #: sunrpc/rpc_main.c:80
 #, c-format
@@ -43,27 +44,31 @@ msgstr ""
 msgid "   program vers proto   port\n"
 msgstr ""
 
-#: time/zic.c:423
+#: time/zic.c:425
 #, c-format
 msgid " (rule from \"%s\", line %d)"
 msgstr ""
 
-#: time/zic.c:420
+#: locale/programs/ld-collate.c:360 programs/ld-ctype.c:1233
+msgid " done\n"
+msgstr ""
+
+#: time/zic.c:422
 #, c-format
 msgid "\"%s\", line %d: %s"
 msgstr ""
 
-#: time/zic.c:908
+#: time/zic.c:946
 #, c-format
 msgid "\"Zone %s\" line and -l option are mutually exclusive"
 msgstr ""
 
-#: time/zic.c:916
+#: time/zic.c:954
 #, c-format
 msgid "\"Zone %s\" line and -p option are mutually exclusive"
 msgstr ""
 
-#: time/zic.c:721
+#: time/zic.c:759
 #, c-format
 msgid "%s in ruleless zone"
 msgstr ""
@@ -88,94 +93,99 @@ msgstr ""
 msgid "%s, line %d: "
 msgstr ""
 
-#: time/zic.c:2035
+#: time/zic.c:2140
 #, c-format
 msgid "%s: %d did not sign extend correctly\n"
 msgstr ""
 
-#: time/zic.c:1339
+#: locale/programs/charmap.c:176
+#, c-format
+msgid "%s: <mb_cur_max> must be greater than <mb_cur_min>\n"
+msgstr ""
+
+#: time/zic.c:1431
 #, c-format
 msgid "%s: Can't create %s: %s\n"
 msgstr ""
 
-#: time/zic.c:2014
+#: time/zic.c:2119
 #, c-format
 msgid "%s: Can't create directory %s: %s\n"
 msgstr ""
 
-#: time/zic.c:600
+#: time/zic.c:613
 #, c-format
 msgid "%s: Can't link from %s to %s: %s\n"
 msgstr ""
 
-#: time/zic.c:746
+#: time/zic.c:784
 #, c-format
 msgid "%s: Can't open %s: %s\n"
 msgstr ""
 
-#: time/zic.c:814
+#: time/zic.c:852
 #, c-format
 msgid "%s: Error closing %s: %s\n"
 msgstr ""
 
-#: time/zic.c:808
+#: time/zic.c:846
 #, c-format
 msgid "%s: Error reading %s\n"
 msgstr ""
 
-#: time/zic.c:1404
+#: time/zic.c:1495
 #, c-format
 msgid "%s: Error writing %s\n"
 msgstr ""
 
-#: time/zdump.c:257
+#: time/zdump.c:258
 #, c-format
 msgid "%s: Error writing standard output "
 msgstr ""
 
-#: time/zic.c:793
+#: time/zic.c:831
 #, c-format
 msgid "%s: Leap line in non leap seconds file %s\n"
 msgstr ""
 
-#: time/zic.c:360
+#: time/zic.c:362
 #, c-format
 msgid "%s: Memory exhausted: %s\n"
 msgstr ""
 
-#: time/zic.c:515
+#: time/zic.c:528
 #, c-format
 msgid "%s: More than one -L option specified\n"
 msgstr ""
 
-#: time/zic.c:475
+#: time/zic.c:488
 #, c-format
 msgid "%s: More than one -d option specified\n"
 msgstr ""
 
-#: time/zic.c:485
+#: time/zic.c:498
 #, c-format
 msgid "%s: More than one -l option specified\n"
 msgstr ""
 
-#: time/zic.c:495
+#: time/zic.c:508
 #, c-format
 msgid "%s: More than one -p option specified\n"
 msgstr ""
 
-#: time/zic.c:505
+#: time/zic.c:518
 #, c-format
 msgid "%s: More than one -y option specified\n"
 msgstr ""
 
-#: posix/getconf.c:149
+#: time/zic.c:1846
 #, c-format
-msgid "%s: Unrecognized variable `%s'\n"
+msgid "%s: command was '%s', result was %d\n"
 msgstr ""
 
-#: time/zic.c:1741
+#: locale/programs/charmap.c:593 programs/locfile.c:878
 #, c-format
-msgid "%s: command was '%s', result was %d\n"
+msgid "%s: error in state machine"
 msgstr ""
 
 #: posix/getopt.c:686
@@ -218,11 +228,16 @@ msgstr ""
 msgid "%s: output would overwrite %s\n"
 msgstr ""
 
-#: time/zic.c:800 zic.c:1212 zic.c:1232
+#: time/zic.c:838 zic.c:1249 zic.c:1269
 #, c-format
 msgid "%s: panic: Invalid l_value %d\n"
 msgstr ""
 
+#: locale/programs/charmap.c:600
+#, c-format
+msgid "%s: premature end of file"
+msgstr ""
+
 #: sunrpc/rpc_main.c:152
 #, c-format
 msgid "%s: unable to open "
@@ -238,10 +253,11 @@ msgstr ""
 msgid "%s: unrecognized option `--%s'\n"
 msgstr ""
 
-#: time/zic.c:432
+#: time/zic.c:447
 #, c-format
 msgid ""
-"%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]\n"
+"%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d "
+"directory ]\n"
 "\t[ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n"
 msgstr ""
 
@@ -259,10 +275,14 @@ msgstr ""
 msgid "(unknown)"
 msgstr ""
 
-#: catgets/gencat.c:242
+#: catgets/gencat.c:243
 msgid "*standard input*"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:766
+msgid ".lib section in a.out corrupted"
+msgstr ""
+
 #: inet/rcmd.c:325
 msgid ".rhosts fstat failed"
 msgstr ""
@@ -288,41 +308,100 @@ msgstr ""
 msgid "; why = "
 msgstr ""
 
+#: locale/programs/ld-ctype.c:325
+#, c-format
+msgid "<SP> character must not be in class `%s'"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:316
+#, c-format
+msgid "<SP> character not in class `%s'"
+msgstr ""
+
+#. TRANS The experienced user will know what is wrong.
+#. TRANS @c This error code is a joke.  Its perror text is part of the joke.
+#. TRANS @c Don't change it.
+#: stdio-common/../sysdeps/gnu/errlist.c:591
 msgid "?"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:762
+msgid "Accessing a corrupted shared library"
+msgstr ""
+
+#. 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 ""
 
-msgid "Address family not supported by protocol family"
+#. 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}.
+#: stdio-common/../sysdeps/gnu/errlist.c:349
+msgid "Address family not supported by protocol"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:714
+msgid "Advertise error"
 msgstr ""
 
 msgid "Alarm clock"
 msgstr ""
 
+#. TRANS Argument list too long; used when the arguments passed to a new program
+#. TRANS being executed with one of the @code{exec} functions (@pxref{Executing a
+#. TRANS File}) occupy too much memory space.  This condition never arises in the
+#. TRANS GNU system.
+#: stdio-common/../sysdeps/gnu/errlist.c:57
 msgid "Argument list too long"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:770
+msgid "Attempting to link in too many shared libraries"
+msgstr ""
+
 #: sunrpc/clnt_perr.c:276
 msgid "Authentication OK"
 msgstr ""
 
+#. TRANS ???
+#: stdio-common/../sysdeps/gnu/errlist.c:549
 msgid "Authentication error"
 msgstr ""
 
+#. TRANS Bad address; an invalid pointer was detected.
+#. TRANS In the GNU system, this error never happens; you get a signal instead.
+#: stdio-common/../sysdeps/gnu/errlist.c:102
 msgid "Bad address"
 msgstr ""
 
+#. TRANS Bad file descriptor; for example, I/O on a descriptor that has been
+#. TRANS closed or reading from a descriptor open only for writing (or vice
+#. TRANS versa).
+#: stdio-common/../sysdeps/gnu/errlist.c:70
 msgid "Bad file descriptor"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:682
+msgid "Bad font file format"
+msgstr ""
+
+#. 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.
+#: stdio-common/../sysdeps/gnu/errlist.c:109
 msgid "Block device required"
 msgstr ""
 
-#: sunrpc/pmap_rmt.c:336
+#: sunrpc/pmap_rmt.c:335
 msgid "Broadcast select problem"
 msgstr ""
 
+#. TRANS Broken pipe; there is no process reading from the other end of a pipe.
+#. TRANS Every library function that returns this error code also generates a
+#. TRANS @code{SIGPIPE} signal; this signal terminates the program if not handled
+#. 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
 msgid "Broken pipe"
 msgstr ""
 
@@ -332,20 +411,32 @@ msgstr ""
 msgid "CPU time limit exceeded"
 msgstr ""
 
-msgid "Can't assign requested address"
+#: stdio-common/../sysdeps/gnu/errlist.c:758
+msgid "Can not access a needed shared library"
 msgstr ""
 
-msgid "Can't send after socket shutdown"
+#. TRANS No memory available.  The system cannot allocate more virtual memory
+#. TRANS because its capacity is full.
+#: stdio-common/../sysdeps/gnu/errlist.c:91
+msgid "Cannot allocate memory"
 msgstr ""
 
-msgid "Cannot allocate memory"
+#. TRANS The requested socket address is not available; for example, you tried
+#. TRANS to give a socket a name that doesn't match the local host name.
+#. TRANS @xref{Socket Addresses}.
+#: stdio-common/../sysdeps/gnu/errlist.c:361
+msgid "Cannot assign requested address"
 msgstr ""
 
-#: sunrpc/pmap_rmt.c:254
+#: sunrpc/pmap_rmt.c:253
 msgid "Cannot create socket for broadcast rpc"
 msgstr ""
 
-#: sunrpc/pmap_rmt.c:348
+#: stdio-common/../sysdeps/gnu/errlist.c:774
+msgid "Cannot exec a shared library directly"
+msgstr ""
+
+#: sunrpc/pmap_rmt.c:347
 msgid "Cannot receive reply to broadcast"
 msgstr ""
 
@@ -353,14 +444,23 @@ msgstr ""
 msgid "Cannot register service"
 msgstr ""
 
-#: sunrpc/pmap_rmt.c:312
+#. TRANS The socket has already been shut down.
+#: stdio-common/../sysdeps/gnu/errlist.c:422
+msgid "Cannot send after transport endpoint shutdown"
+msgstr ""
+
+#: sunrpc/pmap_rmt.c:311
 msgid "Cannot send broadcast packet"
 msgstr ""
 
-#: sunrpc/pmap_rmt.c:260
+#: sunrpc/pmap_rmt.c:259
 msgid "Cannot set socket option SO_BROADCAST"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:622
+msgid "Channel number out of range"
+msgstr ""
+
 msgid "Child exited"
 msgstr ""
 
@@ -368,33 +468,80 @@ msgstr ""
 msgid "Client credential too weak"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:722
+msgid "Communication error on send"
+msgstr ""
+
+#. TRANS Go home and have a glass of warm, dairy-fresh milk.
+#: stdio-common/../sysdeps/gnu/errlist.c:601
 msgid "Computer bought the farm"
 msgstr ""
 
+#: locale/programs/ld-ctype.c:1196
+msgid "Computing table size for character classes might take a while..."
+msgstr ""
+
+#: locale/programs/ld-collate.c:327
+msgid "Computing table size for collation information might take a while..."
+msgstr ""
+
+#. TRANS A remote host refused to allow the network connection (typically because
+#. TRANS it is not running the requested service).
+#: stdio-common/../sysdeps/gnu/errlist.c:439
 msgid "Connection refused"
 msgstr ""
 
+#. TRANS A network connection was closed for reasons outside the control of the
+#. TRANS local host, such as by the remote machine rebooting or an unrecoverable
+#. TRANS protocol violation.
+#: stdio-common/../sysdeps/gnu/errlist.c:389
 msgid "Connection reset by peer"
 msgstr ""
 
+#. TRANS A socket operation with a specified timeout received no response during
+#. TRANS the timeout period.
+#: stdio-common/../sysdeps/gnu/errlist.c:433
 msgid "Connection timed out"
 msgstr ""
 
 msgid "Continued"
 msgstr ""
 
+#. TRANS No default destination address was set for the socket.  You get this
+#. TRANS error when you try to transmit data over a connectionless socket,
+#. TRANS without first specifying a destination for the data with @code{connect}.
+#: stdio-common/../sysdeps/gnu/errlist.c:417
 msgid "Destination address required"
 msgstr ""
 
-msgid "Device busy"
+#: stdio-common/../sysdeps/gnu/errlist.c:686
+msgid "Device not a stream"
 msgstr ""
 
+#. TRANS No such device or address.  The system tried to use the device
+#. TRANS represented by a file you specified, and it couldn't find the device.
+#. TRANS This can mean that the device file was installed incorrectly, or that
+#. TRANS the physical device is missing or not correctly attached to the
+#. TRANS computer.
+#: stdio-common/../sysdeps/gnu/errlist.c:49
 msgid "Device not configured"
 msgstr ""
 
+#. TRANS Resource busy; a system resource that can't be shared is already in use.
+#. TRANS For example, if you try to delete a file that is the root of a currently
+#. TRANS mounted filesystem, you get this error.
+#: stdio-common/../sysdeps/gnu/errlist.c:116
+msgid "Device or resource busy"
+msgstr ""
+
+#. TRANS Directory not empty, where an empty directory was expected.  Typically,
+#. TRANS this error occurs when you are trying to delete a directory.
+#: stdio-common/../sysdeps/gnu/errlist.c:468
 msgid "Directory not empty"
 msgstr ""
 
+#. TRANS The user's disk quota was exceeded.
+#: stdio-common/../sysdeps/gnu/errlist.c:486
 msgid "Disc quota exceeded"
 msgstr ""
 
@@ -407,6 +554,13 @@ msgstr ""
 msgid "Error in unknown error system: "
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:662
+msgid "Exchange full"
+msgstr ""
+
+#. TRANS Invalid executable file format.  This condition is detected by the
+#. TRANS @code{exec} functions; see @ref{Executing a File}.
+#: stdio-common/../sysdeps/gnu/errlist.c:63
 msgid "Exec format error"
 msgstr ""
 
@@ -414,34 +568,59 @@ msgstr ""
 msgid "Failed (unspecified error)"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:750
+msgid "File descriptor in bad state"
+msgstr ""
+
+#. TRANS File exists; an existing file was specified in a context where it only
+#. TRANS makes sense to specify a new file.
+#: stdio-common/../sysdeps/gnu/errlist.c:122
 msgid "File exists"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:678
+msgid "File locking deadlock error"
+msgstr ""
+
+#. TRANS Filename too long (longer than @code{PATH_MAX}; @pxref{Limits for
+#. TRANS Files}) or host name too long (in @code{gethostname} or
+#. TRANS @code{sethostname}; @pxref{Host Identification}).
+#: stdio-common/../sysdeps/gnu/errlist.c:452
 msgid "File name too long"
 msgstr ""
 
 msgid "File size limit exceeded"
 msgstr ""
 
+#. TRANS File too big; the size of a file would be larger than allowed by the system.
+#: stdio-common/../sysdeps/gnu/errlist.c:190
 msgid "File too large"
 msgstr ""
 
 msgid "Floating point exception"
 msgstr ""
 
+#. 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
+#. TRANS of error you get if you request them and they are not supported.
+#: stdio-common/../sysdeps/gnu/errlist.c:561
 msgid "Function not implemented"
 msgstr ""
 
+#. TRANS This error code has no purpose.
+#: stdio-common/../sysdeps/gnu/errlist.c:606
 msgid "Gratuitous error"
 msgstr ""
 
 msgid "Hangup"
 msgstr ""
 
+#. TRANS The remote host for a requested network connection is down.
+#: stdio-common/../sysdeps/gnu/errlist.c:457
 msgid "Host is down"
 msgstr ""
 
-#: resolv/herror.c:74
+#: resolv/herror.c:75
 msgid "Host name lookup failure"
 msgstr ""
 
@@ -451,30 +630,69 @@ msgstr ""
 msgid "IOT trap"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:618
+msgid "Identifier removed"
+msgstr ""
+
 msgid "Illegal Instruction"
 msgstr ""
 
+#. TRANS Invalid seek operation (such as on a pipe).
+#: stdio-common/../sysdeps/gnu/errlist.c:201
 msgid "Illegal seek"
 msgstr ""
 
+#. TRANS Inappropriate file type or format.  The file was the wrong type for the
+#. TRANS operation, or a data file had the wrong format.
+#. TRANS
+#. TRANS On some systems @code{chmod} returns this error if you try to set the
+#. TRANS sticky bit on a non-directory file; @pxref{Setting Permissions}.
+#: stdio-common/../sysdeps/gnu/errlist.c:544
 msgid "Inappropriate file type or format"
 msgstr ""
 
+#. TRANS Inappropriate I/O control operation, such as trying to set terminal
+#. TRANS modes on an ordinary file.
+#: stdio-common/../sysdeps/gnu/errlist.c:176
 msgid "Inappropriate ioctl for device"
 msgstr ""
 
+#. TRANS In the GNU system, servers supporting the @code{term} protocol return
+#. TRANS this error for certain operations when the caller is not in the
+#. TRANS foreground process group of the terminal.  Users do not usually see this
+#. TRANS error because functions such as @code{read} and @code{write} translate
+#. TRANS it into a @code{SIGTTIN} or @code{SIGTTOU} signal.  @xref{Job Control},
+#. TRANS for information on process groups and these signals.
+#: stdio-common/../sysdeps/gnu/errlist.c:577
 msgid "Inappropriate operation for background process"
 msgstr ""
 
+#. TRANS Input/output error; usually used for physical read or write errors.
+#: stdio-common/../sysdeps/gnu/errlist.c:40
 msgid "Input/output error"
 msgstr ""
 
 msgid "Interrupt"
 msgstr ""
 
+#. TRANS Interrupted function call; an asynchronous signal occured and prevented
+#. TRANS completion of the call.  When this happens, you should try the call
+#. TRANS again.
+#. TRANS
+#. TRANS You can choose to have functions resume after a signal that is handled,
+#. TRANS rather than failing with @code{EINTR}; see @ref{Interrupted
+#. TRANS Primitives}.
+#: stdio-common/../sysdeps/gnu/errlist.c:35
 msgid "Interrupted system call"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:610
+msgid "Interrupted system call should be restarted"
+msgstr ""
+
+#. TRANS Invalid argument.  This is used to indicate various kinds of problems
+#. TRANS with passing the wrong argument to a library function.
+#: stdio-common/../sysdeps/gnu/errlist.c:152
 msgid "Invalid argument"
 msgstr ""
 
@@ -502,9 +720,23 @@ msgstr ""
 msgid "Invalid content of \\{\\}"
 msgstr ""
 
+#. 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
+#. TRANS also when you rename a file with @code{rename} (@pxref{Renaming Files}).
+#: stdio-common/../sysdeps/gnu/errlist.c:129
 msgid "Invalid cross-device link"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:654
+msgid "Invalid exchange"
+msgstr ""
+
+#. TRANS While decoding a multibyte character the function came along an invalid
+#. 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 ""
+
 #: posix/regex.c:953
 msgid "Invalid preceding regular expression"
 msgstr ""
@@ -517,45 +749,141 @@ msgstr ""
 msgid "Invalid regular expression"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:670
+msgid "Invalid request code"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:658
+msgid "Invalid request descriptor"
+msgstr ""
+
 #: sunrpc/clnt_perr.c:288
 msgid "Invalid server verifier"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:674
+msgid "Invalid slot"
+msgstr ""
+
+#. TRANS File is a directory; you cannot open a directory for writing,
+#. TRANS or create or remove hard links to it.
+#: stdio-common/../sysdeps/gnu/errlist.c:146
 msgid "Is a directory"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:794
+msgid "Is a named type file"
+msgstr ""
+
 msgid "Killed"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:650
+msgid "Level 2 halted"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:626
+msgid "Level 2 not synchronized"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:630
+msgid "Level 3 halted"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:634
+msgid "Level 3 reset"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:710
+msgid "Link has been severed"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:638
+msgid "Link number out of range"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:702
+msgid "Machine is not on the network"
+msgstr ""
+
 #: posix/regex.c:952
 msgid "Memory exhausted"
 msgstr ""
 
+#. TRANS The size of a message sent on a socket was larger than the supported
+#. TRANS maximum size.
+#: stdio-common/../sysdeps/gnu/errlist.c:305
 msgid "Message too long"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:730
+msgid "Multihop attempted"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:746
+msgid "Name not unique on network"
+msgstr ""
+
+#. TRANS ???
+#: stdio-common/../sysdeps/gnu/errlist.c:554
 msgid "Need authenticator"
 msgstr ""
 
+#. TRANS A network connection was reset because the remote host crashed.
+#: stdio-common/../sysdeps/gnu/errlist.c:377
 msgid "Network dropped connection on reset"
 msgstr ""
 
+#. TRANS A socket operation failed because the network was down.
+#: stdio-common/../sysdeps/gnu/errlist.c:366
 msgid "Network is down"
 msgstr ""
 
+#. TRANS A socket operation failed because the subnet containing the remote host
+#. TRANS was unreachable.
+#: stdio-common/../sysdeps/gnu/errlist.c:372
 msgid "Network is unreachable"
 msgstr ""
 
-#: resolv/herror.c:76
+#: stdio-common/../sysdeps/gnu/errlist.c:646
+msgid "No CSI structure available"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:790
+msgid "No XENIX semaphores available"
+msgstr ""
+
+#: resolv/herror.c:77
 msgid "No address associated with name"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:666
+msgid "No anode"
+msgstr ""
+
+#. TRANS The kernel's buffers for I/O operations are all in use.  In GNU, this
+#. TRANS error is always synonymous with @code{ENOMEM}; you may get one or the
+#. TRANS other from network operations.
+#: stdio-common/../sysdeps/gnu/errlist.c:396
 msgid "No buffer space available"
 msgstr ""
 
+#. TRANS There are no child processes.  This error happens on operations that are
+#. TRANS supposed to manipulate child processes, when there aren't any processes
+#. TRANS to manipulate.
+#: stdio-common/../sysdeps/gnu/errlist.c:77
 msgid "No child processes"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:690
+msgid "No data available"
+msgstr ""
+
+#. 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
+#. TRANS it can result from an operation to an NFS server running another
+#. TRANS operating system.
+#: stdio-common/../sysdeps/gnu/errlist.c:535
 msgid "No locks available"
 msgstr ""
 
@@ -563,7 +891,11 @@ msgstr ""
 msgid "No match"
 msgstr ""
 
-#: posix/regex.c:5200
+#: stdio-common/../sysdeps/gnu/errlist.c:614
+msgid "No message of desired type"
+msgstr ""
+
+#: posix/regex.c:5202
 msgid "No previous regular expression"
 msgstr ""
 
@@ -571,46 +903,125 @@ msgstr ""
 msgid "No remote programs registered.\n"
 msgstr ""
 
+#. TRANS The remote host for a requested network connection is not reachable.
+#: stdio-common/../sysdeps/gnu/errlist.c:462
 msgid "No route to host"
 msgstr ""
 
+#. TRANS No space left on device; write operation on a file failed because the
+#. TRANS disk is full.
+#: stdio-common/../sysdeps/gnu/errlist.c:196
 msgid "No space left on device"
 msgstr ""
 
+#. TRANS No such file or directory.  This is a ``file doesn't exist'' error
+#. TRANS for ordinary files that are referenced in contexts where they are
+#. TRANS expected to already exist.
+#: stdio-common/../sysdeps/gnu/errlist.c:19
 msgid "No such file or directory"
 msgstr ""
 
+#. TRANS No process matches the specified process ID.
+#: stdio-common/../sysdeps/gnu/errlist.c:24
 msgid "No such process"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:786
+msgid "Not a XENIX named type file"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:738
+msgid "Not a data message"
+msgstr ""
+
+#. TRANS A file that isn't a directory was specified when a directory is required.
+#: stdio-common/../sysdeps/gnu/errlist.c:140
 msgid "Not a directory"
 msgstr ""
 
+#. TRANS Domain error; used by mathematical functions when an argument value does
+#. TRANS not fall into the domain over which the function is defined.
+#: stdio-common/../sysdeps/gnu/errlist.c:228
 msgid "Numerical argument out of domain"
 msgstr ""
 
+#. TRANS Range error; used by mathematical functions when the result value is
+#. TRANS not representable because of overflow or underflow.
+#: stdio-common/../sysdeps/gnu/errlist.c:234
 msgid "Numerical result out of range"
 msgstr ""
 
-#: time/zic.c:1835
+#. TRANS An attempt was made to NFS-mount a remote file system with a file name that
+#. TRANS already specifies an NFS-mounted file.
+#. TRANS (This is an error on some operating systems, but we expect it to work
+#. TRANS properly on the GNU system, making this error code impossible.)
+#: stdio-common/../sysdeps/gnu/errlist.c:502
+msgid "Object is remote"
+msgstr ""
+
+#: time/zic.c:1940
 msgid "Odd number of quotation marks"
 msgstr ""
 
+#. TRANS An operation is already in progress on an object that has non-blocking
+#. TRANS mode selected.
+#: stdio-common/../sysdeps/gnu/errlist.c:294
 msgid "Operation already in progress"
 msgstr ""
 
+#. TRANS Operation not permitted; only the owner of the file (or other resource)
+#. TRANS or processes with special privileges can perform the operation.
+#: stdio-common/../sysdeps/gnu/errlist.c:12
 msgid "Operation not permitted"
 msgstr ""
 
+#. TRANS The operation you requested is not supported.  Some socket functions
+#. TRANS don't make sense for all types of sockets, and others may not be
+#. TRANS implemented for all communications protocols.  In the GNU system, this
+#. TRANS error can happen for many calls when the object does not support the
+#. TRANS particular operation; it is a generic indication that the server knows
+#. TRANS nothing to do for that call.
+#: stdio-common/../sysdeps/gnu/errlist.c:338
 msgid "Operation not supported"
 msgstr ""
 
+#. TRANS The wrong type of device was given to a function that expects a
+#. TRANS particular sort of device.
+#: stdio-common/../sysdeps/gnu/errlist.c:135
 msgid "Operation not supported by device"
 msgstr ""
 
+#. TRANS An operation that cannot complete immediately was initiated on an object
+#. TRANS that has non-blocking mode selected.  Some functions that must always
+#. TRANS block (such as @code{connect}; @pxref{Connecting}) never return
+#. TRANS @code{EAGAIN}.  Instead, they return @code{EINPROGRESS} to indicate that
+#. TRANS the operation has begun and will take some time.  Attempts to manipulate
+#. TRANS the object before the call completes return @code{EALREADY}.  You can
+#. TRANS use the @code{select} function to find out when the pending operation
+#. TRANS has completed; @pxref{Waiting for I/O}.
+#: stdio-common/../sysdeps/gnu/errlist.c:288
 msgid "Operation now in progress"
 msgstr ""
 
+#. TRANS In the GNU C library, this is another name for @code{EAGAIN} (above).
+#. TRANS The values are always the same, on every operating system.
+#. TRANS
+#. TRANS C libraries in many older Unix systems have @code{EWOULDBLOCK} as a
+#. TRANS separate error code.
+#: stdio-common/../sysdeps/gnu/errlist.c:276
+msgid "Operation would block"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:698
+msgid "Out of streams resources"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:706
+msgid "Package not installed"
+msgstr ""
+
+#. TRANS Permission denied; the file permissions do not allow the attempted operation.
+#: stdio-common/../sysdeps/gnu/errlist.c:96
 msgid "Permission denied"
 msgstr ""
 
@@ -624,33 +1035,66 @@ msgstr ""
 msgid "Profiling timer expired"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:642
+msgid "Protocol driver not attached"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:726
+msgid "Protocol error"
+msgstr ""
+
+#. TRANS The socket communications protocol family you requested is not supported.
+#: stdio-common/../sysdeps/gnu/errlist.c:343
 msgid "Protocol family not supported"
 msgstr ""
 
+#. TRANS You specified a socket option that doesn't make sense for the
+#. TRANS particular protocol being used by the socket.  @xref{Socket Options}.
+#: stdio-common/../sysdeps/gnu/errlist.c:316
 msgid "Protocol not available"
 msgstr ""
 
+#. TRANS The socket domain does not support the requested communications protocol
+#. TRANS (perhaps because the requested protocol is completely invalid.)
+#. TRANS @xref{Creating a Socket}.
+#: stdio-common/../sysdeps/gnu/errlist.c:323
 msgid "Protocol not supported"
 msgstr ""
 
+#. TRANS The socket type does not support the requested communications protocol.
+#: stdio-common/../sysdeps/gnu/errlist.c:310
 msgid "Protocol wrong type for socket"
 msgstr ""
 
 msgid "Quit"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:734
+msgid "RFS specific error"
+msgstr ""
+
+#. TRANS ???
+#: stdio-common/../sysdeps/gnu/errlist.c:527
 msgid "RPC bad procedure for program"
 msgstr ""
 
+#. TRANS ???
+#: stdio-common/../sysdeps/gnu/errlist.c:517
 msgid "RPC program not available"
 msgstr ""
 
+#. TRANS ???
+#: stdio-common/../sysdeps/gnu/errlist.c:522
 msgid "RPC program version wrong"
 msgstr ""
 
+#. TRANS ???
+#: stdio-common/../sysdeps/gnu/errlist.c:507
 msgid "RPC struct is bad"
 msgstr ""
 
+#. TRANS ???
+#: stdio-common/../sysdeps/gnu/errlist.c:512
 msgid "RPC version wrong"
 msgstr ""
 
@@ -730,6 +1174,8 @@ msgstr ""
 msgid "RPC: Unknown protocol"
 msgstr ""
 
+#. TRANS An attempt was made to modify something on a read-only file system.
+#: stdio-common/../sysdeps/gnu/errlist.c:206
 msgid "Read-only file system"
 msgstr ""
 
@@ -737,71 +1183,60 @@ msgstr ""
 msgid "Regular expression too big"
 msgstr ""
 
-msgid "Reserved error 82"
-msgstr ""
-
-msgid "Reserved error 83"
-msgstr ""
-
-msgid "Reserved error 84"
-msgstr ""
-
-msgid "Reserved error 85"
-msgstr ""
-
-msgid "Reserved error 86"
-msgstr ""
-
-msgid "Reserved error 87"
-msgstr ""
-
-msgid "Reserved error 88"
-msgstr ""
-
-msgid "Reserved error 89"
-msgstr ""
-
-msgid "Reserved error 90"
-msgstr ""
-
-msgid "Reserved error 91"
-msgstr ""
-
-msgid "Reserved error 92"
-msgstr ""
-
-msgid "Reserved error 93"
-msgstr ""
-
-msgid "Reserved error 94"
+#: stdio-common/../sysdeps/gnu/errlist.c:798
+msgid "Remote I/O error"
 msgstr ""
 
-msgid "Reserved error 95"
+#: stdio-common/../sysdeps/gnu/errlist.c:754
+msgid "Remote address changed"
 msgstr ""
 
-msgid "Reserved error 96"
-msgstr ""
-
-msgid "Reserved error 97"
-msgstr ""
-
-msgid "Reserved error 98"
-msgstr ""
-
-msgid "Reserved error 99"
-msgstr ""
-
-#: resolv/herror.c:72
+#: resolv/herror.c:73
 msgid "Resolver Error 0 (no error)"
 msgstr ""
 
-#: resolv/herror.c:114
+#: resolv/herror.c:115
 msgid "Resolver internal error"
 msgstr ""
 
+#. TRANS Deadlock avoided; allocating a system resource would have resulted in a
+#. TRANS deadlock situation.  The system does not guarantee that it will notice
+#. TRANS all such situations.  This error means you got lucky and the system
+#. TRANS noticed; it might just hang.  @xref{File Locks}, for an example.
+#: stdio-common/../sysdeps/gnu/errlist.c:85
 msgid "Resource deadlock avoided"
 msgstr ""
 
+#. 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.
+#. TRANS
+#. TRANS This error can happen in a few different situations:
+#. TRANS
+#. TRANS @itemize @bullet
+#. TRANS @item
+#. TRANS An operation that would block was attempted on an object that has
+#. TRANS non-blocking mode selected.  Trying the same operation again will block
+#. TRANS until some external condition makes it possible to read, write, or
+#. TRANS connect (whatever the operation).  You can use @code{select} to find out
+#. TRANS when the operation will be possible; @pxref{Waiting for I/O}.
+#. TRANS
+#. TRANS @strong{Portability Note:} In older Unix many systems, this condition
+#. TRANS was indicated by @code{EWOULDBLOCK}, which was a distinct error code
+#. TRANS different from @code{EAGAIN}.  To make your program portable, you should
+#. TRANS check for both codes and treat them the same.
+#. TRANS
+#. TRANS @item
+#. TRANS A temporary resource shortage made an operation impossible.  @code{fork}
+#. TRANS can return this error.  It indicates that the shortage is expected to
+#. TRANS pass, so your program can try the call again later and it may succeed.
+#. TRANS It is probably a good idea to delay for a few seconds before trying it
+#. TRANS again, to allow time for other processes to release scarce resources.
+#. TRANS Such shortages are usually fairly serious and affect the whole system,
+#. TRANS so usually an interactive program should report the error to the user
+#. TRANS and return to its command loop.
+#. TRANS @end itemize
+#: stdio-common/../sysdeps/gnu/errlist.c:267
 msgid "Resource temporarily unavailable"
 msgstr ""
 
@@ -816,21 +1251,30 @@ msgstr ""
 msgid "Server rejected verifier"
 msgstr ""
 
-msgid "Socket is already connected"
-msgstr ""
-
-msgid "Socket is not connected"
-msgstr ""
-
+#. 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"
 msgstr ""
 
+#. TRANS The socket type is not supported.
+#: stdio-common/../sysdeps/gnu/errlist.c:328
 msgid "Socket type not supported"
 msgstr ""
 
+#. TRANS A network connection was aborted locally.
+#: stdio-common/../sysdeps/gnu/errlist.c:382
 msgid "Software caused connection abort"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:718
+msgid "Srmount error"
+msgstr ""
+
+#. 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
+#. TRANS the NFS file system on the local host.
+#: stdio-common/../sysdeps/gnu/errlist.c:494
 msgid "Stale NFS file handle"
 msgstr ""
 
@@ -846,37 +1290,80 @@ msgstr ""
 msgid "Stopped (tty output)"
 msgstr ""
 
-#: posix/regex.c:940
+#: stdio-common/../sysdeps/gnu/errlist.c:778
+msgid "Streams pipe error"
+msgstr ""
+
+#: stdio-common/../sysdeps/gnu/errlist.c:782
+msgid "Structure needs cleaning"
+msgstr ""
+
+#: posix/regex.c:940 stdio-common/../sysdeps/gnu/errlist.c:7
 msgid "Success"
 msgstr ""
 
 msgid "Terminated"
 msgstr ""
 
+#. 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
+#. TRANS debugger to run a program is considered having it open for writing and
+#. TRANS will cause this error.  (The name stands for ``text file busy''.)  This
+#. TRANS is not an error in the GNU system; the text is copied as necessary.
+#: stdio-common/../sysdeps/gnu/errlist.c:185
 msgid "Text file busy"
 msgstr ""
 
-msgid "Too many levels of remote in path"
+#: stdio-common/../sysdeps/gnu/errlist.c:694
+msgid "Timer expired"
 msgstr ""
 
+#. TRANS Too many levels of symbolic links were encountered in looking up a file name.
+#. TRANS This often indicates a cycle of symbolic links.
+#: stdio-common/../sysdeps/gnu/errlist.c:445
 msgid "Too many levels of symbolic links"
 msgstr ""
 
+#. TRANS Too many links; the link count of a single file would become too large.
+#. TRANS @code{rename} can cause this error if the file being renamed already has
+#. TRANS as many links as it can take (@pxref{Renaming Files}).
+#: stdio-common/../sysdeps/gnu/errlist.c:213
 msgid "Too many links"
 msgstr ""
 
+#. TRANS The current process has too many files open and can't open any more.
+#. TRANS Duplicate descriptors do count toward this limit.
+#. TRANS
+#. TRANS In BSD and GNU, the number of open files is controlled by a resource
+#. TRANS limit that can usually be increased.  If you get this error, you might
+#. TRANS want to increase the @code{RLIMIT_NOFILE} limit or make it unlimited;
+#. TRANS @pxref{Limits on Resources}.
+#: stdio-common/../sysdeps/gnu/errlist.c:163
 msgid "Too many open files"
 msgstr ""
 
+#. TRANS There are too many distinct file openings in the entire system.  Note
+#. TRANS that any number of linked channels count as just one file opening; see
+#. TRANS @ref{Linked Channels}.  This error never occurs in the GNU system.
+#: stdio-common/../sysdeps/gnu/errlist.c:170
 msgid "Too many open files in system"
 msgstr ""
 
+#. TRANS This means that the per-user limit on new process would be exceeded by
+#. TRANS an attempted @code{fork}.  @xref{Limits on Resources}, for details on
+#. TRANS the @code{RLIMIT_NPROC} limit.
+#: stdio-common/../sysdeps/gnu/errlist.c:475
 msgid "Too many processes"
 msgstr ""
 
-msgid "Too many references: can't splice"
+#. TRANS ???
+#: stdio-common/../sysdeps/gnu/errlist.c:427
+msgid "Too many references: cannot splice"
 msgstr ""
 
+#. TRANS The file quota system is confused because there are too many users.
+#. TRANS @c This can probably happen in a GNU system when using NFS.
+#: stdio-common/../sysdeps/gnu/errlist.c:481
 msgid "Too many users"
 msgstr ""
 
@@ -887,10 +1374,28 @@ msgstr ""
 msgid "Trailing backslash"
 msgstr ""
 
+#. 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
+#. TRANS up, before it has connected to the file.
+#: stdio-common/../sysdeps/gnu/errlist.c:584
 msgid "Translator died"
 msgstr ""
 
-#: catgets/gencat.c:201
+#. TRANS You tried to connect a socket that is already connected.
+#. TRANS @xref{Connecting}.
+#: stdio-common/../sysdeps/gnu/errlist.c:402
+msgid "Transport endpoint is already connected"
+msgstr ""
+
+#. TRANS The socket is not connected to anything.  You get this error when you
+#. TRANS try to transmit data over a socket, without first specifying a
+#. TRANS destination for the data.  For a connectionless socket (for datagram
+#. TRANS protocols, such as UDP), you get @code{EDESTADDRREQ} instead.
+#: stdio-common/../sysdeps/gnu/errlist.c:410
+msgid "Transport endpoint is not connected"
+msgstr ""
+
+#: catgets/gencat.c:202
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr ""
@@ -904,15 +1409,15 @@ msgstr ""
 msgid "Unknown error "
 msgstr ""
 
-#: resolv/herror.c:73
+#: resolv/herror.c:74
 msgid "Unknown host"
 msgstr ""
 
-#: resolv/herror.c:117
+#: resolv/herror.c:118
 msgid "Unknown resolver error"
 msgstr ""
 
-#: resolv/herror.c:75
+#: resolv/herror.c:76
 msgid "Unknown server error"
 msgstr ""
 
@@ -941,10 +1446,15 @@ msgstr ""
 msgid "Unmatched \\{"
 msgstr ""
 
+#: posix/getconf.c:184
+#, c-format
+msgid "Unrecognized variable `%s'"
+msgstr ""
+
 msgid "Urgent I/O condition"
 msgstr ""
 
-#: catgets/gencat.c:204
+#: catgets/gencat.c:205
 #, c-format
 msgid ""
 "Usage: %s [OPTION]... -o OUTPUT-FILE [INPUT-FILE]...\n"
@@ -959,7 +1469,7 @@ msgid ""
 "is -, output is written to standard output.\n"
 msgstr ""
 
-#: posix/getconf.c:81
+#: posix/getconf.c:131
 #, c-format
 msgid "Usage: %s variable_name [pathname]\n"
 msgstr ""
@@ -974,23 +1484,62 @@ msgstr ""
 msgid "User defined signal 2"
 msgstr ""
 
+#: stdio-common/../sysdeps/gnu/errlist.c:742
+msgid "Value too large for defined data type"
+msgstr ""
+
 msgid "Virtual timer expired"
 msgstr ""
 
-#: time/zic.c:1740
+#: time/zic.c:1845
 msgid "Wild result from command execution"
 msgstr ""
 
 msgid "Window changed"
 msgstr ""
 
+#. TRANS You did @strong{what}?
+#: stdio-common/../sysdeps/gnu/errlist.c:596
 msgid "You really blew it this time"
 msgstr ""
 
-#: time/zic.c:1013
+#: time/zic.c:1051
 msgid "Zone continuation line end time is not after end time of previous line"
 msgstr ""
 
+#: locale/programs/charmap.c:397 programs/locfile.c:341
+#, c-format
+msgid "`%1$s' definition does not end with `END %1$s'"
+msgstr ""
+
+#: locale/programs/ld-monetary.c:358 programs/ld-numeric.c:190
+#, c-format
+msgid "`-1' must be last entry in `%s' field in `%s' category"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1651
+msgid "`...' must only be used in `...' and `UNDEFINED' entries"
+msgstr ""
+
+#: locale/programs/locfile.c:538
+msgid "`from' expected after first argument to `collating-element'"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1108
+msgid ""
+"`from' string in collation element declaration contains unknown character"
+msgstr ""
+
+#: locale/programs/charmap.c:267
+#, c-format
+msgid "argument to <%s> must be a single character"
+msgstr ""
+
+#: locale/programs/locfile.c:215
+#, c-format
+msgid "argument to `%s' must be a single character"
+msgstr ""
+
 #: sunrpc/rpc_parse.c:326
 msgid "array declaration expected"
 msgstr ""
@@ -1003,19 +1552,23 @@ msgstr ""
 msgid "bad .rhosts owner"
 msgstr ""
 
-#: time/zic.c:1136
+#: locale/programs/charmap.c:212 programs/locfile.c:209
+msgid "bad argument"
+msgstr ""
+
+#: time/zic.c:1173
 msgid "blank FROM field on Link line"
 msgstr ""
 
-#: time/zic.c:1140
+#: time/zic.c:1177
 msgid "blank TO field on Link line"
 msgstr ""
 
-#: malloc/mcheck.c:174
+#: malloc/mcheck.c:189
 msgid "block freed twice"
 msgstr ""
 
-#: malloc/mcheck.c:177
+#: malloc/mcheck.c:192
 msgid "bogus mcheck_status, library is buggy"
 msgstr ""
 
@@ -1031,25 +1584,109 @@ msgstr ""
 msgid "cache_set: victim not found"
 msgstr ""
 
+#: time/zic.c:1686
+msgid "can't determine time zone abbrevation to use just after until time"
+msgstr ""
+
 #: sunrpc/svc_simple.c:64
 #, c-format
 msgid "can't reassign procedure number %d\n"
 msgstr ""
 
-#: catgets/gencat.c:248
+#: locale/programs/ld-collate.c:1313
+#, c-format
+msgid "cannot insert collation element `%.*s'"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1492 programs/ld-collate.c:1497
+msgid "cannot insert into result table"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1165 programs/ld-collate.c:1207
+#, c-format
+msgid "cannot insert new collating symbol definition: %s"
+msgstr ""
+
+#: catgets/gencat.c:249
 #, c-format
 msgid "cannot open input file `%s'"
 msgstr ""
 
-#: catgets/gencat.c:753 gencat.c:794
+#: catgets/gencat.c:754 gencat.c:795
 #, c-format
 msgid "cannot open output file `%s'"
 msgstr ""
 
+#: locale/programs/locfile.c:986
+#, c-format
+msgid "cannot open output file `%s' for category `%s'"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1359
+msgid "cannot process order specification"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:264
+#, c-format
+msgid "character %s'%s' in class `%s' must be in class `%s'"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:288
+#, c-format
+msgid "character %s'%s' in class `%s' must not be in class `%s'"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:309
+msgid "character <SP> not defined in character map"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:1140
+#, c-format
+msgid "character `%c' not defined while needed as default value"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:938 locale/programs/ld-ctype.c:1017
+#: locale/programs/ld-ctype.c:1041 locale/programs/ld-ctype.c:1113
+#: programs/ld-ctype.c:1001 programs/ld-ctype.c:1009 programs/ld-ctype.c:1025
+#: programs/ld-ctype.c:1033 programs/ld-ctype.c:1067 programs/ld-ctype.c:1075
+#: programs/ld-ctype.c:1151
+#, c-format
+msgid "character `%s' not defined while needed as default value"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:800
+#, c-format
+msgid "character class `%s' already defined"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:832
+#, c-format
+msgid "character map `%s' already defined"
+msgstr ""
+
+#: locale/programs/charmap.c:76
+#, c-format
+msgid "character map file `%s' not found"
+msgstr ""
+
 #: sunrpc/clnt_raw.c:106
 msgid "clnt_raw.c - Fatal header serialization error."
 msgstr ""
 
+#: locale/programs/ld-collate.c:1328
+#, c-format
+msgid "collation element `%.*s' appears more than once: ignore line"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1346
+msgid "collation symbol `.*s' appears more than once: ignore line"
+msgstr ""
+
+#: locale/programs/locfile.c:522
+#, c-format
+msgid "collation symbol expected after `%s'"
+msgstr ""
+
 #: inet/rcmd.c:112
 #, c-format
 msgid "connect to address %s: "
@@ -1063,11 +1700,11 @@ msgstr ""
 msgid "couldn't create an rpc server\n"
 msgstr ""
 
-#: sunrpc/portmap.c:122
+#: sunrpc/portmap.c:121
 msgid "couldn't do tcp_create\n"
 msgstr ""
 
-#: sunrpc/portmap.c:100
+#: sunrpc/portmap.c:99
 msgid "couldn't do udp_create\n"
 msgstr ""
 
@@ -1076,27 +1713,50 @@ msgstr ""
 msgid "couldn't register prog %d vers %d\n"
 msgstr ""
 
+#: locale/programs/charmap.c:86
+#, c-format
+msgid "default character map file `%s' not found"
+msgstr ""
+
 #: sunrpc/rpc_parse.c:77
 msgid "definition keyword expected"
 msgstr ""
 
-#: catgets/gencat.c:367
+#: locale/programs/charset.c:87 programs/charset.c:132
+#, c-format
+msgid "duplicate character name `%s'"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1140
+msgid "duplicate collating element definition"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1286
+#, c-format
+msgid "duplicate definition for character `%.*s'"
+msgstr ""
+
+#: catgets/gencat.c:368
 msgid "duplicate set definition"
 msgstr ""
 
-#: time/zic.c:928
+#: time/zic.c:966
 #, c-format
 msgid "duplicate zone name %s (file \"%s\", line %d)"
 msgstr ""
 
-#: catgets/gencat.c:530
+#: catgets/gencat.c:531
 msgid "duplicated message identifier"
 msgstr ""
 
-#: catgets/gencat.c:503
+#: catgets/gencat.c:504
 msgid "duplicated message number"
 msgstr ""
 
+#: locale/programs/ld-collate.c:1695
+msgid "empty weight name: line ignored"
+msgstr ""
+
 #: sunrpc/svc_udp.c:344
 msgid "enablecache: cache already enabled"
 msgstr ""
@@ -1113,6 +1773,22 @@ msgstr ""
 msgid "enablecache: could not allocate cache fifo"
 msgstr ""
 
+#: locale/programs/ld-collate.c:1418
+msgid "end point of ellipsis range is bigger then start"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1148
+msgid "error while inserting collation element into hash table"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1160
+msgid "error while inserting to hash table"
+msgstr ""
+
+#: locale/programs/locfile.c:465
+msgid "expect string argument for `copy'"
+msgstr ""
+
 #: sunrpc/rpc_util.c:300
 #, c-format
 msgid "expected '%s'"
@@ -1128,7 +1804,7 @@ msgstr ""
 msgid "expected '%s', '%s' or '%s'"
 msgstr ""
 
-#: time/zic.c:819
+#: time/zic.c:857
 msgid "expected continuation line not found"
 msgstr ""
 
@@ -1136,95 +1812,188 @@ msgstr ""
 msgid "expected type specifier"
 msgstr ""
 
+#: locale/programs/locfile.c:1010
+#, c-format
+msgid "failure while writing data for category `%s'"
+msgstr ""
+
+#: locale/programs/ld-monetary.c:154 programs/ld-numeric.c:95
+#, c-format
+msgid "field `%s' in category `%s' not defined"
+msgstr ""
+
+#: locale/programs/ld-messages.c:81 programs/ld-messages.c:102
+#, c-format
+msgid "field `%s' in category `%s' undefined"
+msgstr ""
+
+#: locale/programs/locfile.c:547
+msgid "from-value of `collating-element' must be a string"
+msgstr ""
+
+#: locale/programs/linereader.c:328
+msgid "garbage at end of character code specification"
+msgstr ""
+
+#: locale/programs/linereader.c:214
+msgid "garbage at end of digit"
+msgstr ""
+
 #: sunrpc/get_myaddr.c:73
 msgid "get_myaddress: ioctl (get interface configuration)"
 msgstr ""
 
-#: time/zic.c:1113
+#: time/zic.c:1150
 msgid "illegal CORRECTION field on Leap line"
 msgstr ""
 
-#: time/zic.c:1117
+#: time/zic.c:1154
 msgid "illegal Rolling/Stationary field on Leap line"
 msgstr ""
 
+#: locale/programs/ld-collate.c:1766
+msgid "illegal character constant in string"
+msgstr ""
+
 #: sunrpc/rpc_scan.c:281
 msgid "illegal character in file: "
 msgstr ""
 
+#: locale/programs/ld-collate.c:1115
+msgid "illegal collation element"
+msgstr ""
+
+#: locale/programs/charmap.c:196
+msgid "illegal definition"
+msgstr ""
+
+#: locale/programs/charmap.c:349
+msgid "illegal encoding given"
+msgstr ""
+
+#: locale/programs/linereader.c:546
+msgid "illegal escape sequence at end of string"
+msgstr ""
+
+#: locale/programs/charset.c:101
+msgid "illegal names for character range"
+msgstr ""
+
 #: sunrpc/rpc_parse.c:146
 msgid "illegal result type"
 msgstr ""
 
-#: catgets/gencat.c:340 gencat.c:417
+#: catgets/gencat.c:341 gencat.c:418
 msgid "illegal set number"
 msgstr ""
 
-#: time/zic.c:777
+#: locale/programs/ld-ctype.c:806
+#, c-format
+msgid "implementation limit: no more than %d character classes allowed"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:838
+#, c-format
+msgid "implementation limit: no more than %d character maps allowed"
+msgstr ""
+
+#: time/zic.c:815
 msgid "input line of unknown type"
 msgstr ""
 
-#: time/zic.c:984
+#: time/zic.c:1734
+msgid "internal error - addtype called with bad isdst"
+msgstr ""
+
+#: time/zic.c:1742
+msgid "internal error - addtype called with bad ttisgmt"
+msgstr ""
+
+#: time/zic.c:1738
+msgid "internal error - addtype called with bad ttisstd"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:300
+#, c-format
+msgid "internal error in %s, line %u"
+msgstr ""
+
+#: time/zic.c:1022
 msgid "invalid GMT offset"
 msgstr ""
 
-#: time/zic.c:987
+#: time/zic.c:1025
 msgid "invalid abbreviation format"
 msgstr ""
 
-#: time/zic.c:1078 zic.c:1277 zic.c:1291
+#: time/zic.c:1115 zic.c:1314 zic.c:1328
 msgid "invalid day of month"
 msgstr ""
 
-#: time/zic.c:1236
+#: time/zic.c:1273
 msgid "invalid ending year"
 msgstr ""
 
-#: time/zic.c:1050
+#: time/zic.c:1087
 msgid "invalid leaping year"
 msgstr ""
 
-#: time/zic.c:1065 zic.c:1168
+#: time/zic.c:1102 zic.c:1205
 msgid "invalid month name"
 msgstr ""
 
-#: time/zic.c:883
+#: time/zic.c:921
 msgid "invalid saved time"
 msgstr ""
 
-#: time/zic.c:1216
+#: time/zic.c:1253
 msgid "invalid starting year"
 msgstr ""
 
-#: time/zic.c:1094 zic.c:1196
+#: time/zic.c:1131 zic.c:1233
 msgid "invalid time of day"
 msgstr ""
 
-#: time/zic.c:1282
+#: time/zic.c:1319
 msgid "invalid weekday name"
 msgstr ""
 
-#: time/zic.c:757
+#: locale/programs/ld-collate.c:1411
+msgid "line after ellipsis must contain character definition"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1390
+msgid "line before ellipsis does not contain definition for character constant"
+msgstr ""
+
+#: time/zic.c:795
 msgid "line too long"
 msgstr ""
 
-#: catgets/gencat.c:598
+#: catgets/gencat.c:599
 msgid "malformed line ignored"
 msgstr ""
 
-#: malloc/mcheck.c:168
+#: malloc/mcheck.c:183
 msgid "memory clobbered before allocated block"
 msgstr ""
 
-#: malloc/mcheck.c:171
+#: malloc/mcheck.c:186
 msgid "memory clobbered past end of allocated block"
 msgstr ""
 
-#: malloc/mcheck.c:165
+#: locale/programs/ld-collate.c:167 locale/programs/ld-collate.c:177
+#: locale/programs/ld-collate.c:1467 posix/getconf.c:174
+#: programs/ld-collate.c:173 programs/ld-collate.c:1438 programs/locfile.c:940
+#: programs/xmalloc.c:64
+msgid "memory exhausted"
+msgstr ""
+
+#: malloc/mcheck.c:180
 msgid "memory is consistent, library is buggy"
 msgstr ""
 
-#: time/zic.c:878
+#: time/zic.c:916
 msgid "nameless rule"
 msgstr ""
 
@@ -1237,19 +2006,49 @@ msgstr ""
 msgid "no array-of-pointer declarations -- use typedef"
 msgstr ""
 
-#: time/zic.c:1955
+#: locale/programs/ld-messages.c:95 programs/ld-messages.c:116
+#, c-format
+msgid "no correct regular expression for field `%s' in category `%s': %s"
+msgstr ""
+
+#: time/zic.c:2060
 msgid "no day in month matches rule"
 msgstr ""
 
-#: sunrpc/portmap.c:452
+#: locale/programs/ld-collate.c:259
+msgid "no definition of `UNDEFINED'"
+msgstr ""
+
+#: locale/programs/locfile.c:479
+msgid "no other keyword shall be specified when `copy' is used"
+msgstr ""
+
+#: locale/programs/charmap.c:315 programs/charmap.c:466 programs/charmap.c:545
+msgid "no symbolic name given"
+msgstr ""
+
+#: locale/programs/charmap.c:380 programs/charmap.c:512 programs/charmap.c:578
+msgid "no symbolic name given for end of range"
+msgstr ""
+
+#: locale/programs/ld-collate.c:244
+#, c-format
+msgid "no weight defined for symbol `%s'"
+msgstr ""
+
+#: locale/programs/charmap.c:430
+msgid "only WIDTH definitions are allowed to follow the CHARMAP definition"
+msgstr ""
+
+#: sunrpc/portmap.c:451
 msgid "portmap CALLIT: cannot fork.\n"
 msgstr ""
 
-#: portmap.c:117 sunrpc/portmap.c:95
+#: portmap.c:116 sunrpc/portmap.c:94
 msgid "portmap cannot bind"
 msgstr ""
 
-#: portmap.c:113 sunrpc/portmap.c:87
+#: portmap.c:112 sunrpc/portmap.c:86
 msgid "portmap cannot create socket"
 msgstr ""
 
@@ -1291,7 +2090,7 @@ msgstr ""
 msgid "registerrpc: out of memory\n"
 msgstr ""
 
-#: time/zic.c:1690
+#: time/zic.c:1795
 msgid "repeated leap second moment"
 msgstr ""
 
@@ -1323,10 +2122,14 @@ msgstr ""
 msgid "rpcinfo: can't contact portmapper: "
 msgstr ""
 
-#: sunrpc/portmap.c:138
+#: sunrpc/portmap.c:137
 msgid "run_svc returned unexpectedly\n"
 msgstr ""
 
+#: time/zic.c:709 zic.c:711
+msgid "same rule name in multiple files"
+msgstr ""
+
 #: inet/rcmd.c:158
 msgid "select: protocol failure in circuit setup\n"
 msgstr ""
@@ -1335,15 +2138,24 @@ msgstr ""
 msgid "socket: protocol failure in circuit setup.\n"
 msgstr ""
 
-#: time/zic.c:742
+#: locale/programs/locfile.c:600
+msgid "sorting order `forward' and `backward' are mutually exclusive"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1567 programs/ld-collate.c:1613
+msgid ""
+"specification of sorting weight for collation symbol does not make sense"
+msgstr ""
+
+#: time/zic.c:780
 msgid "standard input"
 msgstr ""
 
-#: time/zdump.c:259
+#: time/zdump.c:260
 msgid "standard output"
 msgstr ""
 
-#: time/zic.c:1240
+#: time/zic.c:1277
 msgid "starting year greater than ending year"
 msgstr ""
 
@@ -1371,53 +2183,195 @@ msgstr ""
 msgid "svcudp_create: socket creation problem"
 msgstr ""
 
-#: catgets/gencat.c:369 gencat.c:505 gencat.c:532
+#: locale/programs/ld-collate.c:1190
+#, c-format
+msgid ""
+"symbol for multicharacter collating element `%.*s' duplicates element "
+"definition"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1063
+#, c-format
+msgid ""
+"symbol for multicharacter collating element `%.*s' duplicates other element "
+"definition"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1199
+#, c-format
+msgid ""
+"symbol for multicharacter collating element `%.*s' duplicates other symbol "
+"definition"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1072
+#, c-format
+msgid ""
+"symbol for multicharacter collating element `%.*s' duplicates symbol "
+"definition"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1054 programs/ld-collate.c:1181
+#, c-format
+msgid ""
+"symbol for multicharacter collating element `%.*s' duplicates symbolic name "
+"in charset"
+msgstr ""
+
+#: locale/programs/charmap.c:314 locale/programs/charmap.c:465
+#: locale/programs/charmap.c:576 programs/charmap.c:348 programs/charmap.c:378
+#: programs/charmap.c:511 programs/charmap.c:544
+#, c-format
+msgid "syntax error in %s definition: %s"
+msgstr ""
+
+#: locale/programs/locfile.c:620
+msgid "syntax error in `order_start' directive"
+msgstr ""
+
+#: locale/programs/locfile.c:362
+msgid "syntax error in character class definition"
+msgstr ""
+
+#: locale/programs/locfile.c:420
+msgid "syntax error in character conversion definition"
+msgstr ""
+
+#: locale/programs/locfile.c:662
+msgid "syntax error in collating order definition"
+msgstr ""
+
+#: locale/programs/locfile.c:512
+msgid "syntax error in collation definition"
+msgstr ""
+
+#: locale/programs/locfile.c:335
+msgid "syntax error in definition of LC_CTYPE category"
+msgstr ""
+
+#: locale/programs/locfile.c:278
+msgid "syntax error in definition of new character class"
+msgstr ""
+
+#: locale/programs/locfile.c:288
+msgid "syntax error in definition of new character map"
+msgstr ""
+
+#: locale/programs/locfile.c:873
+msgid "syntax error in message locale definition"
+msgstr ""
+
+#: locale/programs/locfile.c:784
+msgid "syntax error in monetary locale definition"
+msgstr ""
+
+#: locale/programs/locfile.c:811
+msgid "syntax error in numeric locale definition"
+msgstr ""
+
+#: locale/programs/locfile.c:722
+msgid "syntax error in order specification"
+msgstr ""
+
+#: locale/programs/charmap.c:195 programs/charmap.c:211
+#, c-format
+msgid "syntax error in prolog: %s"
+msgstr ""
+
+#: locale/programs/locfile.c:849
+msgid "syntax error in time locale definition"
+msgstr ""
+
+#: locale/programs/locfile.c:255
+msgid "syntax error: not inside a locale definition section"
+msgstr ""
+
+#: catgets/gencat.c:370 gencat.c:506 gencat.c:533
 msgid "this is the first definition"
 msgstr ""
 
-#: time/zic.c:1083
+#: time/zic.c:1120
 msgid "time before zero"
 msgstr ""
 
-#: time/zic.c:1091 zic.c:1855 zic.c:1874
+#: time/zic.c:1128 zic.c:1960 zic.c:1979
 msgid "time overflow"
 msgstr ""
 
+#: locale/programs/charset.c:44
+msgid "too few bytes in character encoding"
+msgstr ""
+
+#: locale/programs/charset.c:46
+msgid "too many bytes in character encoding"
+msgstr ""
+
+#: locale/programs/locales.h:72
+msgid "too many character classes defined"
+msgstr ""
+
 #: sunrpc/rpc_util.c:285
 msgid "too many files!\n"
 msgstr ""
 
-#: time/zic.c:1684
+#: time/zic.c:1789
 msgid "too many leap seconds"
 msgstr ""
 
-#: time/zic.c:1656
+#: time/zic.c:1761
 msgid "too many local time types"
 msgstr ""
 
-#: time/zic.c:1622
+#: time/zic.c:1715
 msgid "too many transitions?!"
 msgstr ""
 
-#: time/zic.c:1978
+#: locale/programs/ld-collate.c:1622
+msgid "too many weights"
+msgstr ""
+
+#: time/zic.c:2083
 msgid "too many, or too long, time zone abbreviations"
 msgstr ""
 
+#: locale/programs/linereader.h:146
+msgid "trailing garbage at end of line"
+msgstr ""
+
 #: sunrpc/svc_simple.c:132
 #, c-format
 msgid "trouble replying to prog %d\n"
 msgstr ""
 
-#: time/zic.c:1247
+#: locale/programs/ld-collate.c:1382
+msgid "two lines in a row containing `...' are not allowed"
+msgstr ""
+
+#: time/zic.c:1284
 msgid "typed single year"
 msgstr ""
 
-#: catgets/gencat.c:466
+#: locale/programs/charmap.c:617 programs/charmap.c:628
+#, c-format
+msgid "unknown character `%s'"
+msgstr ""
+
+#: locale/programs/ld-messages.c:193 locale/programs/ld-messages.c:215
+#: programs/ld-messages.c:204 programs/ld-messages.c:226
+#, c-format
+msgid "unknown character in field `%s' of category `%s'"
+msgstr ""
+
+#: locale/programs/locfile.c:585
+msgid "unknown collation directive"
+msgstr ""
+
+#: catgets/gencat.c:467
 #, c-format
 msgid "unknown directive `%s': line ignored"
 msgstr ""
 
-#: catgets/gencat.c:445
+#: catgets/gencat.c:446
 #, c-format
 msgid "unknown set `%s'"
 msgstr ""
@@ -1425,27 +2379,89 @@ msgstr ""
 msgid "unknown signal"
 msgstr ""
 
-#: time/zic.c:714
+#: locale/programs/ld-collate.c:1366 locale/programs/ld-collate.c:1731
+#: programs/ld-collate.c:1557
+#, c-format
+msgid "unknown symbol `%.*s': line ignored"
+msgstr ""
+
+#: time/zic.c:752
 msgid "unruly zone"
 msgstr ""
 
-#: catgets/gencat.c:950
+#: catgets/gencat.c:951
 msgid "unterminated message"
 msgstr ""
 
+#: locale/programs/linereader.c:515 programs/linereader.c:550
+msgid "unterminated string"
+msgstr ""
+
 #: sunrpc/rpc_scan.c:319
 msgid "unterminated string constant"
 msgstr ""
 
+#: locale/programs/linereader.c:385
+msgid "unterminated symbolic name"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1684
+msgid "unterminated weight name"
+msgstr ""
+
+#: locale/programs/charset.c:119
+msgid "upper limit in range is not smaller then lower limit"
+msgstr ""
+
 #: sunrpc/rpc_main.c:78
 #, c-format
 msgid "usage: %s infile\n"
 msgstr ""
 
-#: time/zic.c:1921
+#: time/zic.c:2026
 msgid "use of 2/29 in non leap-year"
 msgstr ""
 
+#: locale/programs/charmap.c:438 programs/charmap.c:492
+#, c-format
+msgid "value for %s must be an integer"
+msgstr ""
+
+#: locale/programs/charmap.c:233
+#, c-format
+msgid "value for <%s> must lie between 1 and 4"
+msgstr ""
+
+#: locale/programs/ld-monetary.c:148 programs/ld-numeric.c:89
+#, c-format
+msgid "value for field `%s' in category `%s' must not be the empty string"
+msgstr ""
+
+#: locale/programs/charmap.c:245
+msgid "value of <mb_cur_max> must be greater than the value of <mb_cur_min>"
+msgstr ""
+
+#: locale/programs/ld-monetary.c:138
+msgid ""
+"value of field `int_curr_symbol' in category `LC_MONETARY' does not "
+"correspond to a valid name in ISO 4217"
+msgstr ""
+
+#: locale/programs/ld-monetary.c:133
+msgid ""
+"value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length"
+msgstr ""
+
+#: locale/programs/ld-monetary.c:370 programs/ld-numeric.c:199
+#, c-format
+msgid "values for field `%s' in category `%s' must be smaller than 127"
+msgstr ""
+
+#: locale/programs/ld-monetary.c:366
+#, c-format
+msgid "values for field `%s' in category `%s' must not be zero"
+msgstr ""
+
 #: sunrpc/rpc_parse.c:330
 msgid "variable-length array declaration expected"
 msgstr ""
@@ -1458,26 +2474,26 @@ msgstr ""
 msgid "while opening UTMP file"
 msgstr ""
 
-#: catgets/gencat.c:977
+#: catgets/gencat.c:978
 msgid "while opening old catalog file"
 msgstr ""
 
-#: time/zic.c:1041
+#: time/zic.c:1078
 msgid "wrong number of fields on Leap line"
 msgstr ""
 
-#: time/zic.c:1132
+#: time/zic.c:1169
 msgid "wrong number of fields on Link line"
 msgstr ""
 
-#: time/zic.c:874
+#: time/zic.c:912
 msgid "wrong number of fields on Rule line"
 msgstr ""
 
-#: time/zic.c:944
+#: time/zic.c:982
 msgid "wrong number of fields on Zone continuation line"
 msgstr ""
 
-#: time/zic.c:902
+#: time/zic.c:940
 msgid "wrong number of fields on Zone line"
 msgstr ""
diff --git a/po/header.pot b/po/header.pot
index c74bd351ec..ea05c22466 100644
--- a/po/header.pot
+++ b/po/header.pot
@@ -13,3 +13,4 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: ENCODING\n"
+
diff --git a/shadow/sgetspent_r.c b/shadow/sgetspent_r.c
index 3ad72f0c0a..134a45e5b4 100644
--- a/shadow/sgetspent_r.c
+++ b/shadow/sgetspent_r.c
@@ -66,7 +66,7 @@ struct spwd *
 __sgetspent_r (const char *string, struct spwd *result, char *buffer,
 	       int buflen)
 {
-  return parse_line (strncpy (string, buffer, buflen), result, NULL, 0)
+  return parse_line (strncpy (buffer, string, buflen), result, NULL, 0)
     ? result : NULL;
 }
 weak_alias (__sgetspent_r, sgetspent_r)
diff --git a/stdlib/strtod.c b/stdlib/strtod.c
index 8269010bc3..66d6726a30 100644
--- a/stdlib/strtod.c
+++ b/stdlib/strtod.c
@@ -378,7 +378,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
      in the format described in <locale.h>.  */
   const char *grouping;
 
-  assert (sizeof (wchar_t) <= sizeof (wint_t));
+  assert (sizeof (wchar_t) == sizeof (wint_t));
 
   if (group)
     {
diff --git a/string/strdup.c b/string/strdup.c
index 3e9eee0945..ef883eecdd 100644
--- a/string/strdup.c
+++ b/string/strdup.c
@@ -31,8 +31,6 @@ __strdup (const char *s)
   if (new == NULL)
     return NULL;
 
-  memcpy (new, s, len);
-
-  return (char *) new;
+  return (char *) memcpy (new, s, len);
 }
 weak_alias (__strdup, strdup)
diff --git a/sysdeps/alpha/dl-machine.h b/sysdeps/alpha/dl-machine.h
index a75011fccb..2bf8f9b7ec 100644
--- a/sysdeps/alpha/dl-machine.h
+++ b/sysdeps/alpha/dl-machine.h
@@ -341,8 +341,8 @@ elf_machine_rela (struct link_map *map,
     {
       Elf64_Addr loadbase, sym_value;
 
-      loadbase = RESOLVE (&sym, (Elf64_Addr)reloc_addr,
-			  r_info == R_ALPHA_JMP_SLOT);
+      loadbase = RESOLVE (&sym,
+			  r_info == R_ALPHA_JMP_SLOT ? DL_LOOKUP_NOPLT : 0);
       sym_value = sym ? loadbase + sym->st_value : 0;
 
       if (r_info == R_ALPHA_GLOB_DAT)
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
index 111122e437..d616bf4db8 100644
--- a/sysdeps/i386/dl-machine.h
+++ b/sysdeps/i386/dl-machine.h
@@ -193,15 +193,15 @@ elf_machine_rel (struct link_map *map,
   switch (ELF32_R_TYPE (reloc->r_info))
     {
     case R_386_COPY:
-      loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 0);
+      loadbase = RESOLVE (&sym, DL_LOOKUP_NOEXEC);
       memcpy (reloc_addr, (void *) (loadbase + sym->st_value), sym->st_size);
       break;
     case R_386_GLOB_DAT:
-      loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 0);
+      loadbase = RESOLVE (&sym, 0);
       *reloc_addr = sym ? (loadbase + sym->st_value) : 0;
       break;
     case R_386_JMP_SLOT:
-      loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 1);
+      loadbase = RESOLVE (&sym, DL_LOOKUP_NOPLT);
       *reloc_addr = sym ? (loadbase + sym->st_value) : 0;
       break;
     case R_386_32:
@@ -222,7 +222,7 @@ elf_machine_rel (struct link_map *map,
 	     built-in definitions used while loading those libraries.  */
 	  undo = map->l_addr + sym->st_value;
 #endif
-	loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 0);
+	loadbase = RESOLVE (&sym, 0);
 	*reloc_addr += (sym ? (loadbase + sym->st_value) : 0) - undo;
 	break;
       }
@@ -233,7 +233,7 @@ elf_machine_rel (struct link_map *map,
 	*reloc_addr += map->l_addr;
       break;
     case R_386_PC32:
-      loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 0);
+      loadbase = RESOLVE (&sym, 0);
       *reloc_addr += ((sym ? (loadbase + sym->st_value) : 0) -
 		      (Elf32_Addr) reloc_addr);
       break;
diff --git a/sysdeps/m68k/dl-machine.h b/sysdeps/m68k/dl-machine.h
index 4642f00c63..15aa5325fc 100644
--- a/sysdeps/m68k/dl-machine.h
+++ b/sysdeps/m68k/dl-machine.h
@@ -205,29 +205,29 @@ elf_machine_rela (struct link_map *map,
   switch (ELF32_R_TYPE (reloc->r_info))
     {
     case R_68K_COPY:
-      loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 0);
+      loadbase = RESOLVE (&sym, DL_LOOKUP_NOEXEC);
       memcpy (reloc_addr, (void *) (loadbase + sym->st_value), sym->st_size);
       break;
     case R_68K_GLOB_DAT:
-      loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 0);
+      loadbase = RESOLVE (&sym, 0);
       *reloc_addr = sym ? (loadbase + sym->st_value) : 0;
       break;
     case R_68K_JMP_SLOT:
-      loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 1);
+      loadbase = RESOLVE (&sym, DL_LOOKUP_NOPLT);
       *reloc_addr = sym ? (loadbase + sym->st_value) : 0;
       break;
     case R_68K_8:
-      loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 0);
+      loadbase = RESOLVE (&sym, 0);
       *(char *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
 			      + reloc->r_addend);
       break;
     case R_68K_16:
-      loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 0);
+      loadbase = RESOLVE (&sym, 0);
       *(short *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
 			       + reloc->r_addend);
       break;
     case R_68K_32:
-      loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 0);
+      loadbase = RESOLVE (&sym, 0);
       *reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
 		     + reloc->r_addend);
       break;
@@ -235,17 +235,17 @@ elf_machine_rela (struct link_map *map,
       *reloc_addr = map->l_addr + reloc->r_addend;
       break;
     case R_68K_PC8:
-      loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 0);
+      loadbase = RESOLVE (&sym, 0);
       *(char *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
 			      + reloc->r_addend - (Elf32_Addr) reloc_addr);
       break;
     case R_68K_PC16:
-      loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 0);
+      loadbase = RESOLVE (&sym, 0);
       *(short *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
 			       + reloc->r_addend - (Elf32_Addr) reloc_addr);
       break;
     case R_68K_PC32:
-      loadbase = RESOLVE (&sym, (Elf32_Addr) reloc_addr, 0);
+      loadbase = RESOLVE (&sym, 0);
       *reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
 		     + reloc->r_addend - (Elf32_Addr) reloc_addr);
       break;
diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h
index 50e9f64665..c0ac649144 100644
--- a/sysdeps/mips/dl-machine.h
+++ b/sysdeps/mips/dl-machine.h
@@ -453,7 +453,7 @@ elf_machine_rel (struct link_map *map,
 	  else
 #endif
 	    undo = 0;
-	  loadbase = RESOLVE (&sym, (ElfW(Addr)) reloc_addr, 0);
+	  loadbase = RESOLVE (&sym, 0);
 	  *reloc_addr += (sym ? (loadbase + sym->st_value) : 0) - undo;
 	}
       break;
diff --git a/sysdeps/unix/sysv/linux/i386/clone.S b/sysdeps/unix/sysv/linux/i386/clone.S
index 02f561927e..b60bc8ed92 100644
--- a/sysdeps/unix/sysv/linux/i386/clone.S
+++ b/sysdeps/unix/sysv/linux/i386/clone.S
@@ -71,6 +71,7 @@ ENTRY(__clone)
 thread_start:
 	subl	%ebp,%ebp	/* terminate the stack frame */
 	call	*%ebx
+	pushl	%eax
 #ifdef PIC
 	call	_exit@PLT
 #else
diff --git a/sysdeps/unix/sysv/linux/m68k/clone.S b/sysdeps/unix/sysv/linux/m68k/clone.S
new file mode 100644
index 0000000000..64077e00de
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/m68k/clone.S
@@ -0,0 +1,75 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+   Contributed by Andreas Schwab (schwab@issan.informatik.uni-dortmund.de)
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, 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>
+#include <errnos.h>
+
+/* int clone (int (*fn) (), void *child_stack, int flags, int nargs, ...) */
+
+        .text
+ENTRY (__clone)
+	/* Sanity check arguments.  */
+	movel	#-EINVAL, %d0
+	movel	4(%sp), %a0		/* no NULL function pointers */
+	tstl	%a0
+	jeq	syscall_error
+	movel	8(%sp), %a1		/* no NULL stack pointers */
+	tstl	%a1
+	jeq	syscall_error
+	movel	16(%sp), %d1		/* no negative argument counts */
+	jmi	syscall_error
+
+	/* Allocate space on the new stack and copy args over */
+	movel	%d1, %d0
+	negl	%d0
+	lea	(%a1,%d0.l*4), %a1
+	jeq	2f
+1:	movel	16(%sp,%d1.l*4), -4(%a1,%d1.l*4)
+	subql	#1, %d1
+	jne	1b
+2:
+
+	/* Do the system call */
+	exg	%d2, %a1		/* save %d2 and get stack pointer */
+	movel	12(%sp), %d1		/* get flags */
+	movel	#SYS_ify (clone), %d0
+	trap	#0
+	exg	%d2, %a1		/* restore %d2 */
+
+	tstl	%d0
+	jmi	syscall_error
+	jeq	thread_start
+
+	rts
+
+	SYSCALL_ERROR_HANDLER
+
+thread_start:
+	subl	%fp, %fp	/* terminate the stack frame */
+	jsr	(%a0)
+	movel	%d0, -(%sp)
+#ifdef PIC
+	bsrl	_exit@PLTPC
+#else
+	jbsr	_exit
+#endif
+
+weak_alias (__clone, clone)