about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog109
-rw-r--r--FAQ18
-rw-r--r--PROJECTS16
-rw-r--r--inet/arpa/inet.h145
-rw-r--r--manual/nss.texi24
-rw-r--r--math/libm-test.c4
-rw-r--r--nis/Makefile51
-rw-r--r--nis/TODO10
-rw-r--r--nis/nis_call.c86
-rw-r--r--nis/nis_intern.h5
-rw-r--r--nis/nis_names.c2
-rw-r--r--nis/nis_server.c16
-rw-r--r--nis/nss_compat/compat-grp.c255
-rw-r--r--nis/nss_compat/compat-pwd.c406
-rw-r--r--nis/nss_compat/compat-spwd.c408
-rw-r--r--nis/nss_nis/nis-grp.c8
-rw-r--r--nis/nss_nis/nis-publickey.c16
-rw-r--r--nis/nss_nisplus/nisplus-alias.c6
-rw-r--r--nis/nss_nisplus/nisplus-ethers.c8
-rw-r--r--nis/nss_nisplus/nisplus-grp.c107
-rw-r--r--nis/nss_nisplus/nisplus-hosts.c10
-rw-r--r--nis/nss_nisplus/nisplus-netgrp.c151
-rw-r--r--nis/nss_nisplus/nisplus-network.c11
-rw-r--r--nis/nss_nisplus/nisplus-proto.c10
-rw-r--r--nis/nss_nisplus/nisplus-publickey.c16
-rw-r--r--nis/nss_nisplus/nisplus-pwd.c8
-rw-r--r--nis/nss_nisplus/nisplus-rpc.c10
-rw-r--r--nis/nss_nisplus/nisplus-service.c12
-rw-r--r--nis/nss_nisplus/nisplus-spwd.c8
-rw-r--r--nis/ypclnt.c7
-rw-r--r--po/fr.po700
-rw-r--r--rpc/auth.h1
-rw-r--r--rpc/auth_des.h1
-rw-r--r--sysdeps/generic/rpc/auth.h (renamed from sunrpc/rpc/auth.h)0
-rw-r--r--sysdeps/generic/rpc/auth_des.h (renamed from sunrpc/rpc/auth_des.h)0
-rw-r--r--sysdeps/libm-i387/s_cbrt.S185
-rw-r--r--sysdeps/libm-i387/s_cbrtf.S166
-rw-r--r--sysdeps/libm-i387/s_cbrtl.S188
-rw-r--r--sysdeps/libm-i387/s_frexp.S82
-rw-r--r--sysdeps/libm-i387/s_frexpf.S80
-rw-r--r--sysdeps/libm-i387/s_frexpl.S82
-rw-r--r--sysdeps/libm-ieee754/s_cbrt.c128
-rw-r--r--sysdeps/libm-ieee754/s_cbrtf.c118
-rw-r--r--sysdeps/libm-ieee754/s_cbrtl.c176
-rw-r--r--sysdeps/libm-ieee754/s_nan.c1
-rw-r--r--sysdeps/libm-ieee754/s_nanf.c1
-rw-r--r--sysdeps/libm-ieee754/s_nanl.c1
-rw-r--r--sysdeps/unix/sysv/linux/Makefile2
-rw-r--r--sysdeps/unix/sysv/linux/sigset.h2
49 files changed, 2768 insertions, 1089 deletions
diff --git a/ChangeLog b/ChangeLog
index e5ee09de44..bc4513d603 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,104 @@
+1997-04-05 03:11  Ulrich Drepper  <drepper@cygnus.com>
+
+	* inet/arpa/inet.h: Rewrite.  Don't use the ugly BSD way to write
+	headers but instead add comments and parameter names.
+	Don't use BSD specific types in prototypes.
+
+	* manual/nss.texi: Correct a few typos and errors.
+
+	* sysdeps/libm-ieee754/s_cbrt.c: Complete rewrite based on better
+	algorithm.
+	* sysdeps/libm-ieee754/s_cbrtf.c: Likewise.
+	* sysdeps/libm-ieee754/s_cbrtl.c: Likewise.
+
+	* sysdeps/libm-i387/s_cbrt.S: New file.  Optimized assembler version
+	with new algorithm.
+	* sysdeps/libm-i387/s_cbrtf.S: New file.
+	* sysdeps/libm-i387/s_cbrtl.S: New file.
+
+	* sysdeps/libm-i387/s_frexp.S: Optimize even more.
+	* sysdeps/libm-i387/s_frexpf.S: Likewise.
+	* sysdeps/libm-i387/s_frexpl.S: Likewise.
+
+1997-04-04 18:55  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>
+
+	* nis/Makefile: Remove CFLAGS-*, add publickey to databases.
+
+	* nis/nis_call.c: Add MASTER_ONLY and HARD_LOOKUP flags, compile
+	DES part only with secure RPC add-on.
+
+	* nis/nis_names.c (nis_modify): Fix rpc function number.
+
+	* nis/nis_server.c: Fix typos.
+
+	* nis/nss_compat/compat-grp.c: Add NIS+ support.
+	* nis/nss_compat/compat-pwd.c: Likewise.
+	* nis/nss_compat/compat-spwd.c: Likewise.
+
+	* nis/nss_nis/nis-grp.c: Only a return value > 0 from parse_line
+	signals success.
+
+	* nis/nss_nis/nis-publickey.c: Changes for compiling with/without
+	secure RPC.
+	* nis/nss_nisplus/nisplus-publickey.c: Likewise.
+	* nis/ypclnt.c: Likewise.
+	* nis/nis_intern.h: Likewise.
+
+	* nis/nss_nisplus/nisplus-alias.c: Correct parser return code.
+	* nis/nss_nisplus/nisplus-ethers.c: Likewise.
+	* nis/nss_nisplus/nisplus-hosts.c: Likewise.
+	* nis/nss_nisplus/nisplus-network.c: Likewise.
+	* nis/nss_nisplus/nisplus-proto.c: Likewise.
+	* nis/nss_nisplus/nisplus-pwd.c: Likewise.
+	* nis/nss_nisplus/nisplus-rpc.c: Likewise.
+	* nis/nss_nisplus/nisplus-service.c: Likewise.
+	* nis/nss_nisplus/nisplus-spwd.c: Likewise.
+
+	* nis/nss_nisplus/nisplus-grp.c: Rewrite parser for fixing errors
+	and speedup.
+	* nis/nss_nisplus/nisplus-netgrp.c: Likewise.
+
+1997-04-04 17:03  Ulrich Drepper  <drepper@cygnus.com>
+
+	* math/libm-test.c (cbrt_test): Add tests for +-inf and NaN
+	arguments.
+
+1997-04-03 19:24  H.J. Lu  <hjl@gnu.ai.mit.edu>
+
+	* sysdeps/unix/sysv/linux/sigset.h (__sigisemptyset): Fix a
+	typo.
+
+1997-04-03 16:10  Andreas Jaeger  <aj@arthur.pfalz.de>
+
+	* sysdeps/libm-ieee754/s_nanf.c:
+	* sysdeps/libm-ieee754/s_nan.c:
+	* sysdeps/libm-ieee754/s_nanl.c: Include <stdio.h> for
+	declaration of sprintf.
+
+1997-04-03 13:37  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/libm-ieee754/s_cexp.c: Fix type: string_alias ->
+	strong_alias.
+	Reported by sun <asun@zoology.washington.edu>.
+
+	* rpc/auth.h: Removed.
+	* rpc/auth_des.h: Removed.
+	* sunrpc/rpc/auth.h: Moved to ...
+	* sysdeps/generic/rpc/auth.h: ...here.
+	* sunrpc/rpc/auth_des.h: Moved to ...
+	* sysdeps/generic/rpc/auth_des.h: ...here.
+
+1997-04-03 04:28  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/libm-i387/s_frexp.S: New file.  ix87 optimized version.
+	* sysdeps/libm-i387/s_frexpf.S: New file.
+	* sysdeps/libm-i387/s_frexpl.S: New file.
+
+1997-04-01 10:11  H.J. Lu  <hjl@gnu.ai.mit.edu>
+
+	* sysdeps/unix/sysv/linux/Makefile [$(subdir)=inet]
+	(sysdep_headers): Remove netinet/icmp.h.
+
 1997-04-02 16:55  Ulrich Drepper  <drepper@cygnus.com>
 
 	* manual/socket.texi: Document behaviour of inet_ntoa in multi-
@@ -12,7 +113,7 @@
 	* manual/arith.texi: Add description of lldiv_t, lldiv, and atoll.
 	Change description of strtoll and strtoull to make clear these
 	are the preferred names.
-	Describe `inf', `inifinity', `nan', `nan(...)' inputs for strtod
+	Describe `inf', `infinity', `nan', `nan(...)' inputs for strtod
 	and friends.
 	Change references to HUGE_VALf and HUGE_VALl to HUGE_VALF and
 	HUGE_VALL.
@@ -146,7 +247,7 @@
 	* sysdeps/i386/addmul_1.S: Likewise.
 	* sysdeps/i386/lshift.S: Likewise.
 	* sysdeps/i386/memchr.S: Likewise.
-	* sysdeps/i386/memset.S: Likewise.
+	* sysdeps/i386/memcmp.S: Likewise.
 	* sysdeps/i386/mul_1.S: Likewise.
 	* sysdeps/i386/rshift.S: Likewise.
 	* sysdeps/i386/stpcpy.S: Likewise.
@@ -176,9 +277,9 @@
 	* sysdeps/stub/s_log2l.c: Correct function name.
 
 	* time/africa: Updated from ADO tzdata1997e.
-	* time/aantarctica: Likewise.
+	* time/antarctica: Likewise.
 	* time/asia: Likewise.
-	* time/australia: Likewise.
+	* time/australasia: Likewise.
 	* time/europe: Likewise.
 	* time/northamerica: Likewise.
 	* time/southamerica: Likewise.
diff --git a/FAQ b/FAQ
index 9e70f8c95f..16f6157f33 100644
--- a/FAQ
+++ b/FAQ
@@ -84,6 +84,9 @@ please let me know.
 
 [Q23]	``When compiling GNU libc I get lots of errors saying functions
 	  in glibc are duplicated in libgcc.''
+
+[Q24]	``I have set up /etc/nis.conf, and the Linux libc 5 with NYS
+	  works great.  But the glibc NIS+ doesn't seem to work.''
 
 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 [Q1]	``What systems does the GNU C Library run on?''
@@ -674,6 +677,21 @@ you first delete config.cache.
 some problems of this kind.  The setting of CFLAGS is checked at the
 very beginning and if it is not usable `configure' will bark.
 
+
+
+~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+[Q24]	``I have set up /etc/nis.conf, and the Linux libc 5 with NYS
+	  works great.  But the glibc NIS+ doesn't seem to work.''
+
+[A24]	The glibc NIS+ implementation uses a /var/nis/NIS_COLD_START
+	file for storing information about the NIS+ server and their
+	public keys, because the nis.conf file do not contain all
+	necessary information.  You have to copy a NIS_COLD_START file
+	from a Solaris client (the NIS_COLD_START file is byte order
+	independend) or generate it new with nisinit from the nis-tools
+	(look at http://www-vt.uni-paderborn.de/~kukuk/linux/nisplus.html).
+
+
 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 
 Answers were given by:
diff --git a/PROJECTS b/PROJECTS
index 6b381f7ceb..9be423e1ce 100644
--- a/PROJECTS
+++ b/PROJECTS
@@ -1,6 +1,6 @@
 Open jobs for finishing GNU libc:
 ---------------------------------
-Status: March 1997
+Status: April 1997
 
 If you have time and talent to take over any of the jobs below please
 contact <bug-glibc@prep.ai.mit.edu>
@@ -57,7 +57,6 @@ contact <bug-glibc@prep.ai.mit.edu>
 [ 7] Several math functions have to be written:
 
      - exp2
-     - log2
      - nearbyint
      - ceil
      - round
@@ -138,7 +137,9 @@ contact <bug-glibc@prep.ai.mit.edu>
      + tcgetid() and waitid()			from XPG4.2
      + grantpt(), ptsname(), unlockpt()		from XPG4.2
      + getdate()				from XPG4.2
+	*** Probably underway
      + fmtmsg()					from SVID
+	*** Probably underway
 
      More information are available on request.
 
@@ -147,3 +148,14 @@ contact <bug-glibc@prep.ai.mit.edu>
      of text.  In fact, this would be a recode-library (you know, GNU recode).
      This is needed in several places in the GNU libc and I already have
      rather concrete plans but so far no possibility to start this.
+
+
+[15] Cleaning up the header files.  Ideally, each header style should
+     follow the "good examples".  Each variable and function should have
+     a short description of the function and its parameters.  The prototypes
+     should always contain variable names which can help to identify their
+     meaning; better than
+
+		int foo __P ((int, int, int, int));
+
+     Blargh!
diff --git a/inet/arpa/inet.h b/inet/arpa/inet.h
index 03021e614c..0593c8fad6 100644
--- a/inet/arpa/inet.h
+++ b/inet/arpa/inet.h
@@ -1,62 +1,95 @@
-/*
- * Copyright (c) 1983, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)inet.h	8.1 (Berkeley) 6/2/93
- */
-
-#ifndef _INET_H_
-#define	_INET_H_
-
-/* External definitions for functions in inet(3) */
-
-#include <sys/cdefs.h>
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _ARPA_INET_H
+
+#define	_ARPA_INET_H	1
+#include <features.h>
+
 #include <sys/types.h>
 #include <netinet/in.h>		/* To define `struct in_addr'.  */
 
 __BEGIN_DECLS
-u_long		 inet_addr __P((const char *));
-int		 inet_aton __P((const char *, struct in_addr *));
-u_int32_t	 inet_lnaof __P((struct in_addr));
-struct in_addr	 inet_makeaddr __P((u_int32_t , u_int32_t));
-char *		 inet_neta __P((u_long, char *, size_t));
-u_int32_t	 inet_netof __P((struct in_addr));
-u_int32_t	 inet_network __P((const char *));
-char		*inet_net_ntop __P((int, const void *, int, char *, size_t));
-int		 inet_net_pton __P((int, const char *, void *, size_t));
-char		*inet_ntoa __P((struct in_addr));
-int		 inet_pton __P((int, const char *, void *));
-const char	*inet_ntop __P((int, const void *, char *, size_t));
-u_int		 inet_nsap_addr __P((const char *, u_char *, int));
-char		*inet_nsap_ntoa __P((int, const u_char *, char *));
+
+/* Convert Internet host address from numbers-and-dots notation in CP
+   into binary data in network byte order.  */
+extern unsigned long int inet_addr __P ((__const char *__cp));
+
+/* Convert Internet host address from numbers-and-dots notation in CP
+   into binary data and store the result in the structure INP.  */
+extern int inet_aton __P ((__const char *__cp, struct in_addr *__inp));
+
+/* Return the local host address part of the Internet address in IN.  */
+extern u_int32_t inet_lnaof __P ((struct in_addr __in));
+
+/* Make Internet host address in network byte order by combining the
+   network number NET with the local address HOST.  */
+extern struct in_addr inet_makeaddr __P ((u_int32_t __net, u_int32_t __host));
+
+/* Format a network number NET into presentation format and place result
+   in buffer starting at BUF with length of LEN bytes.  */
+extern char *inet_neta __P ((u_long __net, char *__buf, size_t __len));
+
+/* Return network number part of the Internet address IN.  */
+extern u_int32_t inet_netof __P ((struct in_addr __in));
+
+/* Extract the network number in network byte order from the address
+   in numbers-and-dots natation starting at CP.  */
+extern u_int32_t inet_network __P ((__const char *__cp));
+
+/* Convert network number for interface type AF in buffer starting at
+   CP to presentation format.  The result will specifiy BITS bits of
+   the number.  */
+extern char *inet_net_ntop __P((int __af, __const void *__cp, int __bits,
+				char *__buf, size_t __len));
+
+/* Convert network number for interface type AF from presentation in
+   buffer starting at CP to network format and store result int
+   buffer starting at BUF of size LEN.  */
+extern int inet_net_pton __P ((int __af, __const char *__cp,
+			       void *__buf, size_t __len));
+
+/* Convert Internet number in IN to ASCII representation.  The return value
+   is a pointer to an internal array containing the string.  */
+extern char *inet_ntoa __P ((struct in_addr __in));
+
+/* Convert from presentation format of an Internet number in buffer
+   starting at CP to the binary network format and store result for
+   interface type AF in buffer starting at BUF.  */
+extern int inet_pton __P ((int __af, __const char *__cp, void *__buf));
+
+/* Convert a Internet address in binary network format for interface
+   type AF in buffer starting at CP to presentation form and place
+   result in buffer of length LEN astarting at BUF.  */
+extern __const char *inet_ntop __P ((int __af, __const void *__cp,
+				     char *__buf, size_t __len));
+
+/* Convert ASCII representation in hexadecimal form of the Internet
+   address to binary form and place result in buffer of length LEN
+   starting at BUF.  */
+extern unsigned int inet_nsap_addr __P ((__const char *__cp,
+					 unsigned char *__buf, int __len));
+
+/* Convert internet address in binary form in LEN bytes starting at CP
+   a presentation form and place result in BUF.  */
+extern char *inet_nsap_ntoa __P ((int __len, __const unsigned char *__cp,
+				  char *__buf));
+
 __END_DECLS
 
-#endif /* !_INET_H_ */
+#endif /* arpa/inet.h */
diff --git a/manual/nss.texi b/manual/nss.texi
index ba333e02aa..0ed50afe7a 100644
--- a/manual/nss.texi
+++ b/manual/nss.texi
@@ -68,6 +68,9 @@ The databases available in the NSS are
 @cindex services
 @cindex shadow
 @vtable @code
+@item aliases
+Mail aliases
+@comment @pxref{Mail Aliases}.
 @item ethers
 Ethernet numbers,
 @comment @pxref{Ethernet Numbers}.
@@ -94,8 +97,8 @@ Shadow user passwords,
 @end vtable
 
 @noindent
-There will be some more added later (@code{aliases}, @code{automount},
-@code{bootparams}, @code{netmasks}, and @code{publickey}).
+There will be some more added later (@code{automount}, @code{bootparams},
+@code{netmasks}, and @code{publickey}).
 
 @node NSS Configuration File, NSS Module Internals, NSS Basics, Name Service Switch
 @section The NSS Configuration File
@@ -123,7 +126,7 @@ different items:
 @item
 the service specification like @code{files}, @code{db}, or @code{nis}.
 @item
-the reaction on lookup result line @code{[NOTFOUND=return]}.
+the reaction on lookup result like @code{[NOTFOUND=return]}.
 @end itemize
 
 @menu
@@ -346,8 +349,9 @@ 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.
+interface is (nearly) the same.  For the non-reentrant version The
+library keeps internal buffers which are used to replace the user
+supplied buffer.
 
 I.e., the reentrant functions @emph{can} have counterparts.  No service
 module is forced to have functions for all databases and all kinds to
@@ -399,9 +403,9 @@ enum nss_status _nss_files_gethostbyname_r (const char *name,
 @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{enum
-nss_status} value:
+change of the return value and the omission of the @var{result}
+parameter.  While the user-level function returns a pointer to the
+result the reentrant function return an @code{enum nss_status} value:
 
 @vindex NSS_STATUS_TRYAGAIN
 @vindex NSS_STATUS_UNAVAIL
@@ -458,13 +462,13 @@ function;
 the next three arguments are:
 
 @table @code
-@item STRUCT_TYPE result_buf
+@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
+@item size_t buflen
 length of the buffer pointed to by @var{buffer}.
 @end table
 
diff --git a/math/libm-test.c b/math/libm-test.c
index a7a53cb6bc..0c65eb174f 100644
--- a/math/libm-test.c
+++ b/math/libm-test.c
@@ -572,6 +572,10 @@ cbrt_test (void)
   check ("cbrt (+0) == +0", FUNC(cbrt) (0.0), 0.0);
   check ("cbrt (-0) == -0", FUNC(cbrt) (minus_zero), minus_zero);
 
+  check_isinfp ("cbrt (+inf) == +inf", FUNC(cbrt) (plus_infty));
+  check_isinfn ("cbrt (-inf) == -inf", FUNC(cbrt) (minus_infty));
+  check_isnan ("cbrt (NaN) == NaN", FUNC(cbrt) (nan_value));
+
   check ("cbrt (8) == 2", FUNC(cbrt) (8), 2);
   check ("cbrt (-27) == -3", FUNC(cbrt) (-27.0), -3.0);
 }
diff --git a/nis/Makefile b/nis/Makefile
index 31fda25a45..fe4dd94ebb 100644
--- a/nis/Makefile
+++ b/nis/Makefile
@@ -27,7 +27,7 @@ distribute		:= nss-nis.h nss-nisplus.h
 # These are the databases available for the nis (and perhaps later nisplus)
 # service.  This must be a superset of the services in nss.
 databases		= proto service hosts network grp pwd rpc ethers \
-			  spwd netgrp alias
+			  spwd netgrp alias publickey
 
 # Specify rules for the nss_* modules.
 services		:= nis compat nisplus
@@ -55,57 +55,12 @@ libnss_nis-inhibit-o	= $(filter-out .so,$(object-suffixes))
 libnss_nisplus-routines	:= $(addprefix nisplus-,$(databases))
 libnss_nisplus-inhibit-o = $(filter-out .so,$(object-suffixes))
 
-# Sun's header files are not too clean.
-CFLAGS-compat-pwd.c = -Wno-strict-prototypes
-CFLAGS-compat-spwd.c = -Wno-strict-prototypes
-CFLAGS-compat-grp.c = -Wno-strict-prototypes
-CFLAGS-nis-alias.c = -Wno-strict-prototypes
-CFLAGS-nis-ethers.c = -Wno-strict-prototypes
-CFLAGS-nis-grp.c = -Wno-strict-prototypes
-CFLAGS-nis-hosts.c = -Wno-strict-prototypes
-CFLAGS-nis-netgrp.c = -Wno-strict-prototypes
-CFLAGS-nis-network.c = -Wno-strict-prototypes
-CFLAGS-nis-proto.c = -Wno-strict-prototypes
-CFLAGS-nis-publickey.c = -Wno-strict-prototypes
-CFLAGS-nis-pwd.c = -Wno-strict-prototypes
-CFLAGS-nis-rpc.c = -Wno-strict-prototypes
-CFLAGS-nis-service.c = -Wno-strict-prototypes
-CFLAGS-nis-spwd.c = -Wno-strict-prototypes
-CFLAGS-ypclnt.c = -Wno-strict-prototypes -Wno-write-strings -Irpcsvc
-CFLAGS-yp_xdr.c = -Wno-strict-prototypes -Irpcsvc
-CFLAGS-ypupdate_xdr.c = -Wno-strict-prototypes -Irpcsvc
-# For the NIS+ Code
-CFLAGS-nis_call.c = -DNO_DES_RPC -Wno-strict-prototypes
-CFLAGS-nis_subr.c = -Wno-strict-prototypes
-CFLAGS-nis_local_names.c = -Wno-strict-prototypes
-CFLAGS-nis_free.c = -Wno-strict-prototypes
-CFLAGS-nis_file.c = -Wno-strict-prototypes
-CFLAGS-nis_print.c = -Wno-strict-prototypes
-CFLAGS-nis_error.c = -Wno-strict-prototypes
-CFLAGS-nis_names.c = -Wno-strict-prototypes
-CFLAGS-nis_clone.c = -Wno-strict-prototypes
-CFLAGS-nis_table.c = -Wno-strict-prototypes
-CFLAGS-nis_server.c = -Wno-strict-prototypes
-CFLAGS-nis_xdr.c = -Wno-strict-prototypes
-CFLAGS-nis_intern.c = -Wno-strict-prototypes
-CFLAGS-nisplus-alias.c = -Wno-strict-prototypes
-CFLAGS-nisplus-ethers.c = -Wno-strict-prototypes
-CFLAGS-nisplus-grp.c = -Wno-strict-prototypes
-CFLAGS-nisplus-hosts.c = -Wno-strict-prototypes
-CFLAGS-nisplus-netgrp.c = -Wno-strict-prototypes
-CFLAGS-nisplus-network.c = -Wno-strict-prototypes
-CFLAGS-nisplus-proto.c = -Wno-strict-prototypes
-CFLAGS-nisplus-publickey.c = -Wno-strict-prototypes
-CFLAGS-nisplus-pwd.c = -Wno-strict-prototypes
-CFLAGS-nisplus-rpc.c = -Wno-strict-prototypes
-CFLAGS-nisplus-service.c = -Wno-strict-prototypes
-CFLAGS-nisplus-spwd.c = -Wno-strict-prototypes
-
 include ../Rules
 
 
 $(objpfx)libnss_compat.so: $(objpfx)libnsl.so$(libnsl.so-version) \
-			   $(common-objpfx)nss/libnss_files.so
+			   $(common-objpfx)nss/libnss_files.so \
+			   $(common-objpfx)nis/libnss_nisplus.so
 $(objpfx)libnss_nis.so: $(objpfx)libnsl.so$(libnsl.so-version) \
 			$(common-objpfx)nss/libnss_files.so
 $(objpfx)libnss_nisplus.so: $(objpfx)libnsl.so$(libnsl.so-version)
diff --git a/nis/TODO b/nis/TODO
index 9b675dfbc6..628e646d15 100644
--- a/nis/TODO
+++ b/nis/TODO
@@ -1,8 +1,9 @@
 
  * nss_nisplus: When using parser form nss_files, rewrite parser
- 
- * compat could use data from nisplus, too. Implement this
 
+ * nss_nisplus: Search the data in the complete NIS+ namespace
+		specified by NIS_PATH
+ 
  * nis_server: implement nis_getservlist, nis_stats, nis_servstate
 
  * nis_groups: implement it
@@ -22,10 +23,10 @@
  * Possible flags:
 	- FOLLOW_LINKS	(nis_list, nis_lookup)
 	- FOLLOW_PATH	(nis_list, not supported)
-	- HARD_LOOKUP	(__do_niscall, not supported)
+	- HARD_LOOKUP	(__do_niscall)
 	- ALL_RESULTS	(nis_list, not supported, needs server callback)
 	- NO_CACHE	(__do_niscall, cache not supported yet)
-	- MASTER_ONLY	(__do_niscall, not supported)
+	- MASTER_ONLY	(__do_niscall)
 	- EXPAND_NAME	(nis_lookup, nis_list)
 	- RETURN_RESULT (nis_table.c)
 	- ADD_OVERWRITE	(nis_table.c)
@@ -37,4 +38,3 @@
 	- USE_DGRAM	(__do_niscall)
 	- NO_AUTHINFO 	(__do_niscall)
 	
-	
diff --git a/nis/nis_call.c b/nis/nis_call.c
index bf64558adc..78e8767318 100644
--- a/nis/nis_call.c
+++ b/nis/nis_call.c
@@ -60,13 +60,11 @@ __nis_dobind (const nis_server *server, u_long flags)
   int clnt_sock;
   size_t i;
   CLIENT *client = NULL;
-  /* XXX What is this variable for?  */
-  void *out = NULL;
 
+  memset (&clnt_saddr, '\0', sizeof clnt_saddr);
+  clnt_saddr.sin_family = AF_INET;
   for (i = 0; i < server->ep.ep_len; i++)
     {
-      memset (&clnt_saddr, '\0', sizeof clnt_saddr);
-      clnt_saddr.sin_family = AF_INET;
       if (strcmp (server->ep.ep_val[i].family,"loopback") == 0)
 	{
 	  if (server->ep.ep_val[i].uaddr[i] == '-')
@@ -79,14 +77,14 @@ __nis_dobind (const nis_server *server, u_long flags)
 		else
 		  continue;
 	      }
-	  else
-	    if (strcmp (server->ep.ep_val[i].proto,"tcp") == 0)
-	      {
-		if ((flags & USE_DGRAM) == USE_DGRAM)
-		  continue;
-		else
-		  clnt_saddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
-	      }
+	    else
+	      if (strcmp (server->ep.ep_val[i].proto,"tcp") == 0)
+		{
+		  if ((flags & USE_DGRAM) == USE_DGRAM)
+		    continue;
+		  else
+		    clnt_saddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+		}
 	}
       else
 	if (strcmp (server->ep.ep_val[i].family,"inet") == 0)
@@ -115,7 +113,7 @@ __nis_dobind (const nis_server *server, u_long flags)
 	  }
 	else
 	  continue;
-
+      
       clnt_sock = RPC_ANYSOCK;
       if ((flags & USE_DGRAM) == USE_DGRAM)
 	client = clntudp_create (&clnt_saddr, NIS_PROG, NIS_VERSION,
@@ -123,42 +121,41 @@ __nis_dobind (const nis_server *server, u_long flags)
       else
 	client = clnttcp_create (&clnt_saddr, NIS_PROG, NIS_VERSION,
 				 &clnt_sock, 0, 0);
-
+      
       if (client == NULL)
 	continue;
-#if 1
       if (clnt_call (client, 0, (xdrproc_t) xdr_void, NULL,
-		     (xdrproc_t) xdr_void, out, TIMEOUT) != RPC_SUCCESS)
+		     (xdrproc_t) xdr_void, NULL, TIMEOUT) != RPC_SUCCESS)
 	{
 	  clnt_destroy (client);
 	  continue;
 	}
-#endif
+
       if ((flags & NO_AUTHINFO) != NO_AUTHINFO)
-	  {
-#if !defined(NO_DES_RPC)
-	    if (server->key_type == NIS_PK_DH)
-	      {
-		char netname[MAXNETNAMELEN+1];
-		char *p;
-
-		strcpy (netname, "unix.");
-		strncat (netname, server->name,MAXNETNAMELEN-5);
-		netname[MAXNETNAMELEN-5] = '\0';
-		p = strchr (netname, '.');
-		*p = '@';
-		client->cl_auth =
-		  authdes_pk_create (netname, &server->pkey, 300, NULL, NULL);
-		if (!client->cl_auth)
-		  client->cl_auth = authunix_create_default ();
-	      }
-	    else
+	{
+#if defined(HAVE_SECURE_RPC)
+	  if (server->key_type == NIS_PK_DH)
+	    {
+	      char netname[MAXNETNAMELEN+1];
+	      char *p;
+	      
+	      p = stpcpy (netname, "unix.");
+	      strncpy (p, server->name,MAXNETNAMELEN-5);
+	      netname[MAXNETNAMELEN] = '\0';
+	      p = strchr (netname, '.');
+	      *p = '@';
+	      client->cl_auth =
+		authdes_pk_create (netname, &server->pkey, 300, NULL, NULL);
+	      if (!client->cl_auth)
+		client->cl_auth = authunix_create_default ();
+	    }
+	  else
 #endif
-	      client->cl_auth = authunix_create_default ();
-	  }
+	    client->cl_auth = authunix_create_default ();
+	}
       return client;
     }
-
+  
   return NULL;
 }
 
@@ -189,14 +186,19 @@ __do_niscall (const nis_server *serv, int serv_len, u_long prog,
       server_len = serv_len;
     }
 
+  if (((flags & MASTER_ONLY) == MASTER_ONLY) && server_len > 1)
+    server_len = 1; /* The first entry is the master */
+
   try = 0;
   result = NIS_NAMEUNREACHABLE;
 
   while (try < MAXTRIES && result != RPC_SUCCESS)
     {
       unsigned int i;
-
-      ++try;
+      
+      if ((flags & HARD_LOOKUP) == 0)
+	++try;
+      
       for (i = 0; i < server_len; i++)
 	{
 	  if ((clnt = __nis_dobind (&server[i], flags)) == NULL)
@@ -206,9 +208,7 @@ __do_niscall (const nis_server *serv, int serv_len, u_long prog,
 
 	  if (result != RPC_SUCCESS)
 	    {
-	      /* XXX Grrr.  The cast is needed for now since Sun code does
-		 note know about `const'.  */
-	      clnt_perror (clnt, (char *) "do_niscall: clnt_call");
+	      clnt_perror (clnt, "do_niscall: clnt_call");
 	      clnt_destroy (clnt);
 	      result = NIS_RPCERROR;
 	    }
diff --git a/nis/nis_intern.h b/nis/nis_intern.h
index b5fb605506..8201ccd533 100644
--- a/nis/nis_intern.h
+++ b/nis/nis_intern.h
@@ -27,11 +27,10 @@ __BEGIN_DECLS
 extern nis_error __do_niscall (__const nis_server *server, int server_len,
 			       u_long prog, xdrproc_t xargs, caddr_t req,
 			       xdrproc_t xres, caddr_t resp, u_long flags);
-#if !defined(NO_DES_RPC)
-extern AUTH *authdes_pk_create (char *, netobj *, u_int,
+#if defined (HAVE_SECURE_RPC)
+extern AUTH *authdes_pk_create (const char *, const netobj *, u_int,
 				struct sockaddr *, des_block *);
 #endif
-
 extern nis_name *__nis_expandname (__const nis_name);
 
 __END_DECLS
diff --git a/nis/nis_names.c b/nis/nis_names.c
index 92f8040b3d..aa8c880249 100644
--- a/nis/nis_names.c
+++ b/nis/nis_names.c
@@ -227,7 +227,7 @@ nis_modify (const nis_name name, const nis_object *obj)
   req.ns_object.ns_object_len = 1;
   req.ns_object.ns_object_val = nis_clone_object (obj, NULL);
 
-  if ((status = __do_niscall (NULL, 0, NIS_REMOVE, (xdrproc_t) xdr_ns_request,
+  if ((status = __do_niscall (NULL, 0, NIS_MODIFY, (xdrproc_t) xdr_ns_request,
 			      (caddr_t) & req, (xdrproc_t) xdr_nis_result,
 			      (caddr_t) res, 0)) != RPC_SUCCESS)
     res->status = status;
diff --git a/nis/nis_server.c b/nis/nis_server.c
index 48d2144c78..0ed3c81042 100644
--- a/nis/nis_server.c
+++ b/nis/nis_server.c
@@ -30,8 +30,8 @@ nis_mkdir (const nis_name dir, const nis_server *server)
     {
       int result;
       if ((result = __do_niscall (NULL, 0, NIS_MKDIR, (xdrproc_t) xdr_nis_name,
-				  (caddr_t) dir, (xdrproc_t) xdr_nis_error,
-				  (caddr_t) & res, 0)) != RPC_SUCCESS)
+				  (caddr_t) &dir, (xdrproc_t) xdr_nis_error,
+				  (caddr_t) &res, 0)) != RPC_SUCCESS)
 	{
 	  fprintf (stderr, _("__do_niscall: Error #%d\n"), result);
 	  return NIS_RPCERROR;
@@ -42,8 +42,8 @@ nis_mkdir (const nis_name dir, const nis_server *server)
       int result;
       if ((result = __do_niscall (server, 1, NIS_MKDIR,
 				  (xdrproc_t) xdr_nis_name,
-				  (caddr_t) dir, (xdrproc_t) xdr_nis_error,
-				  (caddr_t) & res, 0)) != RPC_SUCCESS)
+				  (caddr_t) &dir, (xdrproc_t) xdr_nis_error,
+				  (caddr_t) &res, 0)) != RPC_SUCCESS)
 	{
 	  fprintf (stderr, _("__do_niscall: Error #%d\n"), result);
 	  return NIS_RPCERROR;
@@ -62,8 +62,8 @@ nis_rmdir (const nis_name dir, const nis_server *server)
     {
       int result;
       if ((result = __do_niscall (NULL, 0, NIS_RMDIR, (xdrproc_t) xdr_nis_name,
-				  (caddr_t) dir, (xdrproc_t) xdr_nis_error,
-				  (caddr_t) & res, 0)) != RPC_SUCCESS)
+				  (caddr_t) &dir, (xdrproc_t) xdr_nis_error,
+				  (caddr_t) &res, 0)) != RPC_SUCCESS)
 	{
 	  fprintf (stderr, _("__do_niscall: Error #%d\n"), result);
 	  return NIS_RPCERROR;
@@ -74,8 +74,8 @@ nis_rmdir (const nis_name dir, const nis_server *server)
       int result;
       if ((result = __do_niscall (server, 1, NIS_RMDIR,
 				  (xdrproc_t) xdr_nis_name,
-				  (caddr_t) dir, (xdrproc_t) xdr_nis_error,
-				  (caddr_t) & res, 0)) != RPC_SUCCESS)
+				  (caddr_t) &dir, (xdrproc_t) xdr_nis_error,
+				  (caddr_t) &res, 0)) != RPC_SUCCESS)
 	{
 	  fprintf (stderr, _("__do_niscall: Error #%d\n"), result);
 	  return NIS_RPCERROR;
diff --git a/nis/nss_compat/compat-grp.c b/nis/nss_compat/compat-grp.c
index de96dbbeb6..6231a1e911 100644
--- a/nis/nss_compat/compat-grp.c
+++ b/nis/nss_compat/compat-grp.c
@@ -25,6 +25,14 @@
 #include <string.h>
 #include <rpcsvc/yp.h>
 #include <rpcsvc/ypclnt.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+#include <nsswitch.h>
+
+#include "nss-nisplus.h"
+
+static service_user *ni = NULL;
+static bool_t use_nisplus = FALSE; /* default: group_compat: nis */
 
 /* Get the declaration of the parser function.  */
 #define ENTNAME grent
@@ -32,7 +40,7 @@
 #define EXTERN_PARSER
 #include "../../nss/nss_files/files-parse.c"
 
-/* Structure for remembering -@netgroup and -user members ... */
+/* Structure for remembering -group members ... */
 #define BLACKLIST_INITIAL_SIZE 512
 #define BLACKLIST_INCREMENT 256
 struct blacklist_t
@@ -48,12 +56,15 @@ struct ent_t
     bool_t nis_first;
     char *oldkey;
     int oldkeylen;
+    nis_result *result;
+    nis_name *names;
+    u_long names_nr;
     FILE *stream;
     struct blacklist_t blacklist;
-  };
+};
 typedef struct ent_t ent_t;
 
-static ent_t ext_ent = {0, 0, NULL, 0, NULL, {NULL, 0, 0}};
+static ent_t ext_ent = {0, 0, NULL, 0, NULL, NULL, 0, NULL, {NULL, 0, 0}};
 
 /* Protect global state against multiple changers.  */
 __libc_lock_define_initialized (static, lock)
@@ -61,6 +72,8 @@ __libc_lock_define_initialized (static, lock)
 /* Prototypes for local functions.  */
 static void blacklist_store_name (const char *, ent_t *);
 static int in_blacklist (const char *, int, ent_t *);
+extern int _nss_nisplus_parse_grent (nis_result *, struct group *,
+				     char *, size_t);
 
 static enum nss_status
 internal_setgrent (ent_t *ent)
@@ -75,15 +88,27 @@ internal_setgrent (ent_t *ent)
       ent->oldkey = NULL;
       ent->oldkeylen = 0;
     }
-
+  
+  if (ent->result != NULL)
+    {
+      nis_freeresult (ent->result);
+      ent->result = NULL;
+    }
+  
+  if (ent->names != NULL)
+    {
+      nis_freenames (ent->names);
+      ent->names = NULL;
+    }
+  ent->names_nr = 0;
   ent->blacklist.current = 0;
   if (ent->blacklist.data != NULL)
     ent->blacklist.data[0] = '\0';
-
+  
   if (ent->stream == NULL)
     {
       ent->stream = fopen ("/etc/group", "r");
-
+      
       if (ent->stream == NULL)
 	status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
     }
@@ -101,6 +126,12 @@ _nss_compat_setgrent (void)
 
   __libc_lock_lock (lock);
 
+  if (ni == NULL)
+    {
+      __nss_database_lookup ("group_compat", NULL, "nis", &ni);
+      use_nisplus = (strcmp (ni->name, "nisplus") == 0);
+    }
+
   result = internal_setgrent (&ext_ent);
 
   __libc_lock_unlock (lock);
@@ -127,6 +158,18 @@ internal_endgrent (ent_t *ent)
       ent->oldkeylen = 0;
     }
 
+  if (ent->result != NULL)
+    {
+      nis_freeresult (ent->result);
+      ent->result = NULL;
+    }
+  
+  if (ent->names != NULL)
+    {
+      nis_freenames (ent->names);
+      ent->names = NULL;
+    }
+  ent->names_nr = 0;
   ent->blacklist.current = 0;
   if (ent->blacklist.data != NULL)
     ent->blacklist.data[0] = '\0';
@@ -155,7 +198,7 @@ getgrent_next_nis (struct group *result, ent_t *ent, char *buffer,
   struct parser_data *data = (void *) buffer;
   char *domain;
   char *outkey, *outval;
-  int outkeylen, outvallen;
+  int outkeylen, outvallen, parse_res;
   char *p;
 
   if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
@@ -202,13 +245,133 @@ getgrent_next_nis (struct group *result, ent_t *ent, char *buffer,
 
       while (isspace (*p))
 	++p;
+      
+      parse_res = _nss_files_parse_grent (p, result, data, buflen);
+      
+      if (parse_res && 
+	  in_blacklist (result->gr_name, strlen (result->gr_name), ent))
+	parse_res = 0; /* if result->gr_name in blacklist,search next entry */
+    }
+  while (!parse_res);
+  
+  return NSS_STATUS_SUCCESS;
+}
+
+static enum nss_status
+getgrent_next_nisplus (struct group *result, ent_t *ent, char *buffer,
+                       size_t buflen)
+{
+  int parse_res;
+  
+  if (ent->names == NULL)
+    {
+      ent->names = nis_getnames ("group.org_dir");
+      if (ent->names == NULL || ent->names[0] == NULL)
+        {
+          ent->nis = 0;
+          return NSS_STATUS_UNAVAIL;
+        }
     }
-  while (!_nss_files_parse_grent (p, result, data, buflen));
+  
+  do
+    {
+      if (ent->nis_first)
+        {
+	next_name:
+          ent->result = nis_first_entry(ent->names[ent->names_nr]);
+          if (niserr2nss (ent->result->status) != NSS_STATUS_SUCCESS)
+            {
+              ent->nis = 0;
+              return niserr2nss (ent->result->status);
+            }
+          ent->nis_first = FALSE;
+        }
+      else
+        {
+          nis_result *res;
+          
+          res = nis_next_entry(ent->names[ent->names_nr], 
+                               &ent->result->cookie);
+          nis_freeresult (ent->result);
+          ent->result = res;
+          if (niserr2nss (ent->result->status) != NSS_STATUS_SUCCESS)
+            {
+              if ((ent->result->status == NIS_NOTFOUND) &&
+                  ent->names[ent->names_nr + 1] != NULL)
+                {
+                  nis_freeresult (ent->result);
+                  ent->names_nr += 1;
+                  goto next_name;
+                }
+              else
+                {
+                  ent->nis = 0;
+                  return niserr2nss (ent->result->status);
+                }
+            }
+        }
+      parse_res = _nss_nisplus_parse_grent (ent->result, result, buffer, 
+                                            buflen);
+      if (parse_res && 
+          in_blacklist (result->gr_name, strlen (result->gr_name), ent))
+        parse_res = 0; /* if result->gr_name in blacklist,search next entry */
+    }
+  while (!parse_res);
+  
+  return NSS_STATUS_SUCCESS;
+}
 
-  if (!in_blacklist (result->gr_name, strlen (result->gr_name), ent))
+/* This function handle the +group entrys in /etc/group */
+static enum nss_status
+getgrent_next_file_plusgroup (struct group *result, char *buffer,
+			      size_t buflen)
+{
+  struct parser_data *data = (void *) buffer;
+  int parse_res;
+      
+  if (use_nisplus) /* Do the NIS+ query here */
+    {
+      nis_result *res;
+      char buf[strlen (result->gr_name) + 24];
+
+      sprintf(buf, "[name=%s],group.org_dir",
+              &result->gr_name[1]);
+      res = nis_list(buf, EXPAND_NAME, NULL, NULL);
+      if (niserr2nss (res->status) != NSS_STATUS_SUCCESS)
+        {
+          enum nss_status status =  niserr2nss (res->status);
+	  
+          nis_freeresult (res);
+          return status;
+        }
+      parse_res = _nss_nisplus_parse_grent (res, result, buffer, buflen);
+      nis_freeresult (res);
+    }
+  else /* Use NIS */
+    {
+      char *domain, *outval, *p;
+      int outvallen;
+
+      if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
+        return NSS_STATUS_TRYAGAIN;
+      
+      if (yp_match (domain, "group.byname", &result->gr_name[1],
+                    strlen (result->gr_name) - 1, &outval, &outvallen)
+          != YPERR_SUCCESS)
+        return NSS_STATUS_TRYAGAIN;
+      p = strncpy (buffer, outval,
+                   buflen < outvallen ? buflen : outvallen);
+      free (outval);
+      while (isspace (*p))
+        p++;
+      parse_res = _nss_files_parse_grent (p, result, data, buflen);
+    }
+
+  if (parse_res)
+    /* We found the entry.  */
     return NSS_STATUS_SUCCESS;
   else
-    return NSS_STATUS_NOTFOUND;
+    return NSS_STATUS_RETURN;
 }
 
 
@@ -256,27 +419,16 @@ getgrent_next_file (struct group *result, ent_t *ent,
       if (result->gr_name[0] == '+' && result->gr_name[1] != '\0'
 	  && result->gr_name[1] != '@')
 	{
-	  char *domain;
-	  char *outval;
-	  int outvallen;
-
-	  if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
-	    /* XXX Should we regard this as an fatal error?  I don't
-	       think so.  Just continue working.  --drepper@gnu  */
-	    continue;
-
-	  if (yp_match (domain, "group.byname", &result->gr_name[1],
-			strlen (result->gr_name) - 1, &outval, &outvallen)
-	      != YPERR_SUCCESS)
-	    continue;
-
-	  p = strncpy (buffer, outval, buflen);
-	  while (isspace (*p))
-	    p++;
-	  free (outval);
-	  if (_nss_files_parse_grent (p, result, data, buflen))
-	    /* We found the entry.  */
-	    break;
+          enum nss_status status;
+	  
+          status = getgrent_next_file_plusgroup (result, buffer, buflen);
+          if (status == NSS_STATUS_SUCCESS) /* We found the entry. */
+            break;
+          else
+            if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
+              continue;
+            else
+              return status;
 	}
 
       /* +:... */
@@ -285,7 +437,10 @@ getgrent_next_file (struct group *result, ent_t *ent,
 	  ent->nis = TRUE;
 	  ent->nis_first = TRUE;
 
-	  return getgrent_next_nis (result, ent, buffer, buflen);
+	  if (use_nisplus)
+	    return getgrent_next_nisplus (result, ent, buffer, buflen);
+	  else
+	    return getgrent_next_nis (result, ent, buffer, buflen);
 	}
     }
 
@@ -298,7 +453,12 @@ internal_getgrent_r (struct group *gr, ent_t *ent, char *buffer,
 		     size_t buflen)
 {
   if (ent->nis)
-    return getgrent_next_nis (gr, ent, buffer, buflen);
+    {
+      if (use_nisplus)
+	return getgrent_next_nisplus (gr, ent, buffer, buflen);
+      else
+	return getgrent_next_nis (gr, ent, buffer, buflen);
+    }
   else
     return getgrent_next_file (gr, ent, buffer, buflen);
 }
@@ -310,6 +470,12 @@ _nss_compat_getgrent_r (struct group *grp, char *buffer, size_t buflen)
 
   __libc_lock_lock (lock);
 
+  if (ni == NULL)
+    {
+      __nss_database_lookup ("group_compat", NULL, "nis", &ni);
+      use_nisplus = (strcmp (ni->name, "nisplus") == 0);
+    }
+
   /* Be prepared that the setgrent function was not called before.  */
   if (ext_ent.stream == NULL)
     status = internal_setgrent (&ext_ent);
@@ -327,12 +493,21 @@ enum nss_status
 _nss_compat_getgrnam_r (const char *name, struct group *grp,
 			char *buffer, size_t buflen)
 {
-  ent_t ent = {0, 0, NULL, 0, NULL, {NULL, 0, 0}};
+  ent_t ent = {0, 0, NULL, 0, NULL, NULL, 0, NULL, {NULL, 0, 0}};
   enum nss_status status;
 
   if (name[0] == '-' || name[0] == '+')
     return NSS_STATUS_NOTFOUND;
 
+  __libc_lock_lock (lock);
+
+  if (ni == NULL)
+    {
+      __nss_database_lookup ("group_compat", NULL, "nis", &ni);
+      use_nisplus = (strcmp (ni->name, "nisplus") == 0);
+    }
+  
+  __libc_lock_unlock (lock);
 
   status = internal_setgrent (&ent);
   if (status != NSS_STATUS_SUCCESS)
@@ -352,9 +527,19 @@ enum nss_status
 _nss_compat_getgrgid_r (gid_t gid, struct group *grp,
 			char *buffer, size_t buflen)
 {
-  ent_t ent = {0, 0, NULL, 0, NULL, {NULL, 0, 0}};
+  ent_t ent = {0, 0, NULL, 0, NULL, NULL, 0, NULL, {NULL, 0, 0}};
   enum nss_status status;
 
+  __libc_lock_lock (lock);
+  
+  if (ni == NULL)
+    {
+      __nss_database_lookup ("group_compat", NULL, "nis", &ni);
+      use_nisplus = (strcmp (ni->name, "nisplus") == 0);
+    }
+  
+  __libc_lock_unlock (lock);
+
   status = internal_setgrent (&ent);
   if (status != NSS_STATUS_SUCCESS)
     return status;
diff --git a/nis/nss_compat/compat-pwd.c b/nis/nss_compat/compat-pwd.c
index 56659e9ed5..317e2d18bf 100644
--- a/nis/nss_compat/compat-pwd.c
+++ b/nis/nss_compat/compat-pwd.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
 
@@ -26,8 +26,15 @@
 #include <libc-lock.h>
 #include <rpcsvc/yp.h>
 #include <rpcsvc/ypclnt.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+#include <nsswitch.h>
 
 #include "netgroup.h"
+#include "nss-nisplus.h"
+
+static service_user *ni = NULL;
+static bool_t use_nisplus = FALSE; /* default: passwd_compat: nis */
 
 /* Get the declaration of the parser function.  */
 #define ENTNAME pwent
@@ -52,6 +59,9 @@ struct ent_t
     bool_t first;
     char *oldkey;
     int oldkeylen;
+    nis_result *result;
+    nis_name *names;
+    u_long names_nr;
     FILE *stream;
     struct blacklist_t blacklist;
     struct passwd pwd;
@@ -59,7 +69,7 @@ struct ent_t
   };
 typedef struct ent_t ent_t;
 
-static ent_t ext_ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0},
+static ent_t ext_ent = {0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, {NULL, 0, 0},
 			{NULL, NULL, 0, 0, NULL, NULL, NULL}};
 
 /* Protect global state against multiple changers.  */
@@ -68,7 +78,8 @@ __libc_lock_define_initialized (static, lock)
 /* Prototypes for local functions.  */
 static void blacklist_store_name (const char *, ent_t *);
 static int in_blacklist (const char *, int, ent_t *);
-
+extern int _nss_nisplus_parse_pwent (nis_result *, struct passwd *,
+				     char *, size_t);
 static void
 give_pwd_free (struct passwd *pwd)
 {
@@ -192,6 +203,18 @@ internal_setpwent (ent_t *ent)
       ent->oldkeylen = 0;
     }
 
+  if (ent->result != NULL)
+    {
+      nis_freeresult (ent->result);
+      ent->result = NULL;
+    }
+
+  if (ent->names != NULL)
+    {
+      nis_freenames (ent->names);
+      ent->names = NULL;
+    }
+  ent->names_nr = 0;
   ent->blacklist.current = 0;
   if (ent->blacklist.data != NULL)
     ent->blacklist.data[0] = '\0';
@@ -219,6 +242,12 @@ _nss_compat_setpwent (void)
 
   __libc_lock_lock (lock);
 
+  if (ni == NULL)
+    {
+      __nss_database_lookup ("passwd_compat", NULL, "nis", &ni);
+      use_nisplus = (strcmp (ni->name, "nisplus") == 0);
+    }
+
   result = internal_setpwent (&ext_ent);
 
   __libc_lock_unlock (lock);
@@ -245,6 +274,19 @@ internal_endpwent (ent_t *ent)
       ent->oldkeylen = 0;
     }
 
+  if (ent->result != NULL)
+    {
+      nis_freeresult (ent->result);
+      ent->result = NULL;
+    }
+
+  if (ent->names != NULL)
+    {
+      nis_freenames (ent->names);
+      ent->names = NULL;
+    }
+  ent->names_nr = 0;
+
   ent->blacklist.current = 0;
   if (ent->blacklist.data != NULL)
     ent->blacklist.data[0] = '\0';
@@ -272,14 +314,14 @@ _nss_compat_endpwent (void)
 }
 
 static enum nss_status
-getpwent_next_netgr (struct passwd *result, ent_t *ent, char *group,
-		     char *buffer, size_t buflen)
+getpwent_next_nis_netgr (struct passwd *result, ent_t *ent, char *group,
+			 char *buffer, size_t buflen)
 {
   struct parser_data *data = (void *) buffer;
   char *ypdomain, *host, *user, *domain, *outval, *p, *p2;
   int status, outvallen;
   size_t p2len;
-
+  
   if (yp_get_default_domain (&ypdomain) != YPERR_SUCCESS)
     {
       ent->netgroup = 0;
@@ -341,12 +383,175 @@ getpwent_next_netgr (struct passwd *result, ent_t *ent, char *group,
 }
 
 static enum nss_status
+getpwent_next_nisplus_netgr (struct passwd *result, ent_t *ent, char *group,
+			     char *buffer, size_t buflen)
+{
+  char *ypdomain, *host, *user, *domain, *p2;
+  int status, parse_res;
+  size_t p2len;
+  nis_result *nisres;
+  
+  /* Maybe we should use domainname here ? We need the current 
+     domainname for the domain field in netgroups */
+  if (yp_get_default_domain (&ypdomain) != YPERR_SUCCESS)
+    {
+      ent->netgroup = 0;
+      ent->first = 0;
+      give_pwd_free (&ent->pwd);
+      return NSS_STATUS_UNAVAIL;
+    }
+
+  if (ent->first == TRUE)
+    {
+      bzero (&ent->netgrdata, sizeof (struct __netgrent));
+      __internal_setnetgrent (group, &ent->netgrdata);
+      ent->first = FALSE;
+    }
+
+  while (1)
+    {
+      status = __internal_getnetgrent_r (&host, &user, &domain,
+					 &ent->netgrdata, buffer, buflen);
+      if (status != 1)
+	{
+	  __internal_endnetgrent (&ent->netgrdata);
+	  ent->netgroup = 0;
+	  give_pwd_free (&ent->pwd);
+	  return NSS_STATUS_RETURN;
+	}
+
+      if (user == NULL || user[0] == '-')
+	continue;
+
+      if (domain != NULL && strcmp (ypdomain, domain) != 0)
+	continue;
+
+      p2len = pwd_need_buflen (&ent->pwd);
+      if (p2len > buflen)
+	{
+	  __set_errno (ERANGE);
+	  return NSS_STATUS_TRYAGAIN;
+	}
+      p2 = buffer + (buflen - p2len);
+      buflen -= p2len;
+      {      
+	char buf[strlen (user) + 30];
+	sprintf(buf, "[name=%s],passwd.org_dir", user);
+	nisres = nis_list(buf, EXPAND_NAME, NULL, NULL);
+      }
+      if (niserr2nss (nisres->status) != NSS_STATUS_SUCCESS)
+	{
+	  nis_freeresult (nisres);
+	  continue;
+	}
+      parse_res = _nss_nisplus_parse_pwent (nisres, result, buffer, buflen);
+      nis_freeresult (nisres);
+      
+      if (parse_res)
+	{
+	  copy_pwd_changes (result, &ent->pwd, p2, p2len);
+	  break;
+	}
+    }
+
+  return NSS_STATUS_SUCCESS;
+}
+
+static enum nss_status
+getpwent_next_netgr (struct passwd *result, ent_t *ent, char *group,
+		     char *buffer, size_t buflen)
+{
+  if (use_nisplus)
+    return getpwent_next_nisplus_netgr (result, ent, group, buffer, buflen);
+  else
+    return getpwent_next_nis_netgr (result, ent, group, buffer, buflen);
+}
+
+static enum nss_status
+getpwent_next_nisplus (struct passwd *result, ent_t *ent, char *buffer,
+		       size_t buflen)
+{
+  int parse_res;
+  size_t p2len;
+  char *p2;
+
+  if (ent->names == NULL)
+    {
+      ent->names = nis_getnames ("passwd.org_dir");
+      if (ent->names == NULL || ent->names[0] == NULL)
+	{
+	  ent->nis = 0;
+	  return NSS_STATUS_UNAVAIL;
+	}
+    }
+  
+  p2len = pwd_need_buflen (&ent->pwd);
+  if (p2len > buflen)
+    {
+      __set_errno (ERANGE);
+      return NSS_STATUS_TRYAGAIN;
+    }
+  p2 = buffer + (buflen - p2len);
+  buflen -= p2len;
+  do
+    {
+      if (ent->first)
+	{
+	next_name:
+	  ent->result = nis_first_entry(ent->names[ent->names_nr]);
+          if (niserr2nss (ent->result->status) != NSS_STATUS_SUCCESS)
+	    {
+	      ent->nis = 0;
+	      give_pwd_free (&ent->pwd);
+	      return niserr2nss (ent->result->status);
+	    }
+	  ent->first = FALSE;
+	}
+      else
+	{
+	  nis_result *res;
+	  
+	  res = nis_next_entry(ent->names[ent->names_nr], 
+			       &ent->result->cookie);
+	  nis_freeresult (ent->result);
+	  ent->result = res;
+	  if (niserr2nss (ent->result->status) != NSS_STATUS_SUCCESS)
+	    {
+	      if ((ent->result->status == NIS_NOTFOUND) &&
+		  ent->names[ent->names_nr + 1] != NULL)
+		{
+		  nis_freeresult (ent->result);
+		  ent->names_nr += 1;
+		  goto next_name;
+		}
+	      else
+		{
+		  ent->nis = 0;
+		  give_pwd_free (&ent->pwd);
+		  return niserr2nss (ent->result->status);
+		}
+	    }
+	}
+      parse_res = _nss_nisplus_parse_pwent (ent->result, result, buffer, 
+					    buflen);
+      if (parse_res && 
+	  in_blacklist (result->pw_name, strlen (result->pw_name), ent))
+	parse_res = 0; /* if result->pw_name in blacklist,search next entry */
+    }
+  while (!parse_res);
+  
+  copy_pwd_changes (result, &ent->pwd, p2, p2len);
+  
+  return NSS_STATUS_SUCCESS;
+}
+
+static enum nss_status
 getpwent_next_nis (struct passwd *result, ent_t *ent, char *buffer,
 		   size_t buflen)
 {
   struct parser_data *data = (void *) buffer;
   char *domain, *outkey, *outval, *p, *p2;
-  int outkeylen, outvallen;
+  int outkeylen, outvallen, parse_res;
   size_t p2len;
 
   if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
@@ -404,17 +609,96 @@ getpwent_next_nis (struct passwd *result, ent_t *ent, char *buffer,
 
       while (isspace (*p))
 	++p;
+      parse_res = _nss_files_parse_pwent (p, result, data, buflen);
+      if (parse_res &&
+	  in_blacklist (result->pw_name, strlen (result->pw_name), ent))
+	parse_res = 0;
     }
-  while (!_nss_files_parse_pwent (p, result, data, buflen));
+  while (!parse_res);
 
   copy_pwd_changes (result, &ent->pwd, p2, p2len);
 
-  if (!in_blacklist (result->pw_name, strlen (result->pw_name), ent))
-    return NSS_STATUS_SUCCESS;
-  else
-    return NSS_STATUS_NOTFOUND;
+  return NSS_STATUS_SUCCESS;
 }
 
+/* This function handle the +user entrys in /etc/passwd */
+static enum nss_status
+getpwent_next_file_plususer (struct passwd *result, char *buffer, 
+			     size_t buflen)
+{
+  struct parser_data *data = (void *) buffer;
+  struct passwd pwd;
+  int parse_res;
+  char *p;
+  size_t plen;
+  
+  memset (&pwd, '\0', sizeof (struct passwd));
+  
+  copy_pwd_changes (&pwd, result, NULL, 0);
+  
+  plen = pwd_need_buflen (&pwd);
+  if (plen > buflen)
+    {
+      __set_errno (ERANGE);
+      return NSS_STATUS_TRYAGAIN;
+    }
+  p = buffer + (buflen - plen);
+  buflen -= plen;
+  
+  if (use_nisplus) /* Do the NIS+ query here */
+    {
+      nis_result *res;
+      char buf[strlen (result->pw_name) + 24];
+      
+      sprintf(buf, "[name=%s],passwd.org_dir",
+	      &result->pw_name[1]);
+      res = nis_list(buf, EXPAND_NAME, NULL, NULL);
+      if (niserr2nss (res->status) != NSS_STATUS_SUCCESS)
+	{
+	  enum nss_status status =  niserr2nss (res->status);
+	  
+	  nis_freeresult (res);
+	  return status;
+	}
+      parse_res = _nss_nisplus_parse_pwent (res, result, buffer, buflen);
+      nis_freeresult (res);
+    }
+  else /* Use NIS */
+    {
+      char *domain;
+      char *outval;
+      int outvallen;
+      
+      if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
+	return NSS_STATUS_TRYAGAIN;
+      
+      if (yp_match (domain, "passwd.byname", &result->pw_name[1],
+		    strlen (result->pw_name) - 1, &outval, &outvallen)
+	  != YPERR_SUCCESS)
+	return NSS_STATUS_TRYAGAIN;
+      p = strncpy (buffer, outval, 
+		   buflen < outvallen ? buflen : outvallen);
+      free (outval);
+      while (isspace (*p))
+	p++;
+      parse_res = _nss_files_parse_pwent (p, result, data, buflen);
+    }
+  
+  if (parse_res)
+    {
+      copy_pwd_changes (result, &pwd, p, plen);
+      give_pwd_free (&pwd);
+      /* We found the entry.  */
+      return NSS_STATUS_SUCCESS;
+    }
+  else
+    {
+      /* Give buffer the old len back */
+      buflen += plen;
+      give_pwd_free (&pwd);
+    }
+  return NSS_STATUS_RETURN;
+}
 
 static enum nss_status
 getpwent_next_file (struct passwd *result, ent_t *ent,
@@ -423,8 +707,7 @@ getpwent_next_file (struct passwd *result, ent_t *ent,
   struct parser_data *data = (void *) buffer;
   while (1)
     {
-      char *p, *p2;
-      size_t p2len;
+      char *p;
 
       do
 	{
@@ -494,50 +777,16 @@ getpwent_next_file (struct passwd *result, ent_t *ent,
       if (result->pw_name[0] == '+' && result->pw_name[1] != '\0'
 	  && result->pw_name[1] != '@')
 	{
-	  char *domain;
-	  char *outval;
-	  int outvallen;
-	  struct passwd pwd;
-
-	  memset (&pwd, '\0', sizeof (struct passwd));
-
-	  if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
-	    /* XXX Should we regard this as an fatal error?  I don't
-	       think so.  Just continue working.  --drepper@gnu  */
-	    continue;
-
-	  if (yp_match (domain, "passwd.byname", &result->pw_name[1],
-			strlen (result->pw_name) - 1, &outval, &outvallen)
-	      != YPERR_SUCCESS)
-	    continue;
-
-	  copy_pwd_changes (&pwd, result, NULL, 0);
-
-	  p2len = pwd_need_buflen (&pwd);
-	  if (p2len > buflen)
-	    {
-	      __set_errno (ERANGE);
-	      return NSS_STATUS_TRYAGAIN;
-	    }
-	  p2 = buffer + (buflen - p2len);
-	  buflen -= p2len;
-	  p = strncpy (buffer, outval, buflen);
-	  while (isspace (*p))
-	    p++;
-	  free (outval);
-	  if (_nss_files_parse_pwent (p, result, data, buflen))
-	    {
-	      copy_pwd_changes (result, &pwd, p2, p2len);
-	      give_pwd_free (&pwd);
-	      /* We found the entry.  */
-	      break;
-	    }
+	  enum nss_status status;
+	
+	  status = getpwent_next_file_plususer (result, buffer, buflen);
+	  if (status == NSS_STATUS_SUCCESS) /* We found the entry. */
+	    break;
 	  else
-	    {
-	      /* Give buffer the old len back */
-	      buflen += p2len;
-	      give_pwd_free (&pwd);
-	    }
+	    if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
+	      continue;
+	    else
+	      return status;
 	}
 
       /* +:... */
@@ -547,7 +796,10 @@ getpwent_next_file (struct passwd *result, ent_t *ent,
 	  ent->first = TRUE;
 	  copy_pwd_changes (&ent->pwd, result, NULL, 0);
 
-	  return getpwent_next_nis (result, ent, buffer, buflen);
+	  if (use_nisplus)
+	    return getpwent_next_nisplus (result, ent, buffer, buflen);
+	  else
+	    return getpwent_next_nis (result, ent, buffer, buflen);
 	}
     }
 
@@ -572,7 +824,12 @@ internal_getpwent_r (struct passwd *pw, ent_t *ent, char *buffer,
 	return status;
     }
   else if (ent->nis)
-    return getpwent_next_nis (pw, ent, buffer, buflen);
+    {
+      if (use_nisplus)
+	return getpwent_next_nisplus (pw, ent, buffer, buflen);
+      else
+	return getpwent_next_nis (pw, ent, buffer, buflen);
+    }
   else
     return getpwent_next_file (pw, ent, buffer, buflen);
 }
@@ -585,6 +842,12 @@ _nss_compat_getpwent_r (struct passwd *pwd, char *buffer,
 
   __libc_lock_lock (lock);
 
+  if (ni == NULL)
+    {
+      __nss_database_lookup ("passwd_compat", NULL, "nis", &ni);
+      use_nisplus = (strcmp (ni->name, "nisplus") == 0);
+    }
+
   /* Be prepared that the setpwent function was not called before.  */
   if (ext_ent.stream == NULL)
     status = internal_setpwent (&ext_ent);
@@ -602,13 +865,22 @@ enum nss_status
 _nss_compat_getpwnam_r (const char *name, struct passwd *pwd,
 			char *buffer, size_t buflen)
 {
-  ent_t ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0},
+  ent_t ent = {0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, {NULL, 0, 0},
 	       {NULL, NULL, 0, 0, NULL, NULL, NULL}};
   enum nss_status status;
 
   if (name[0] == '-' || name[0] == '+')
     return NSS_STATUS_NOTFOUND;
 
+  __libc_lock_lock (lock);
+
+  if (ni == NULL)
+    {
+      __nss_database_lookup ("passwd_compat", NULL, "nis", &ni);
+      use_nisplus = (strcmp (ni->name, "nisplus") == 0);
+    }
+  
+  __libc_lock_unlock (lock);
 
   status = internal_setpwent (&ent);
   if (status != NSS_STATUS_SUCCESS)
@@ -628,10 +900,20 @@ enum nss_status
 _nss_compat_getpwuid_r (uid_t uid, struct passwd *pwd,
 			char *buffer, size_t buflen)
 {
-  ent_t ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0},
+  ent_t ent = {0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, {NULL, 0, 0},
 	       {NULL, NULL, 0, 0, NULL, NULL, NULL}};
   enum nss_status status;
-
+  
+  __libc_lock_lock (lock);
+  
+  if (ni == NULL)
+    {
+      __nss_database_lookup ("passwd_compat", NULL, "nis", &ni);
+      use_nisplus = (strcmp (ni->name, "nisplus") == 0);
+    }
+  
+  __libc_lock_unlock (lock);
+  
   status = internal_setpwent (&ent);
   if (status != NSS_STATUS_SUCCESS)
     return status;
diff --git a/nis/nss_compat/compat-spwd.c b/nis/nss_compat/compat-spwd.c
index 47dd22970a..7c0eb24fc1 100644
--- a/nis/nss_compat/compat-spwd.c
+++ b/nis/nss_compat/compat-spwd.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
 
@@ -26,6 +26,15 @@
 #include <libc-lock.h>
 #include <rpcsvc/yp.h>
 #include <rpcsvc/ypclnt.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+#include <nsswitch.h>
+
+#include "netgroup.h"
+#include "nss-nisplus.h"
+
+static service_user *ni = NULL;
+static bool_t use_nisplus = FALSE; /* default: passwd_compat: nis */
 
 /* Get the declaration of the parser function.  */
 #define ENTNAME spent
@@ -50,13 +59,17 @@ struct ent_t
     bool_t first;
     char *oldkey;
     int oldkeylen;
+    nis_result *result;
+    nis_name *names;
+    u_long names_nr;
     FILE *stream;
     struct blacklist_t blacklist;
     struct spwd pwd;
+    struct __netgrent netgrdata;
   };
 typedef struct ent_t ent_t;
 
-static ent_t ext_ent = {0, 0, 0, NULL, 0, NULL,	{NULL, 0, 0},
+static ent_t ext_ent = {0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, {NULL, 0, 0},
 			{NULL, NULL, 0, 0, 0, 0, 0, 0, 0}};
 
 /* Protect global state against multiple changers.  */
@@ -65,7 +78,8 @@ __libc_lock_define_initialized (static, lock)
 /* Prototypes for local functions.  */
 static void blacklist_store_name (const char *, ent_t *);
 static int in_blacklist (const char *, int, ent_t *);
-
+extern int _nss_nisplus_parse_spent (nis_result *, struct spwd *,
+				     char *, size_t);
 static void
 give_spwd_free (struct spwd *pwd)
 {
@@ -130,6 +144,10 @@ internal_setspent (ent_t *ent)
 
   ent->nis = ent->first = ent->netgroup = 0;
 
+  /* If something was left over free it.  */
+  if (ent->netgroup)
+    __internal_endnetgrent (&ent->netgrdata);
+  
   if (ent->oldkey != NULL)
     {
       free (ent->oldkey);
@@ -137,6 +155,18 @@ internal_setspent (ent_t *ent)
       ent->oldkeylen = 0;
     }
 
+  if (ent->result != NULL)
+    {
+      nis_freeresult (ent->result);
+      ent->result = NULL;
+    }
+  if (ent->names != NULL)
+    {
+      nis_freenames (ent->names);
+      ent->names = NULL;
+    }
+  ent->names_nr = 0;
+  
   ent->blacklist.current = 0;
   if (ent->blacklist.data != NULL)
     ent->blacklist.data[0] = '\0';
@@ -164,6 +194,12 @@ _nss_compat_setspent (void)
 
   __libc_lock_lock (lock);
 
+  if (ni == NULL)
+    {
+      __nss_database_lookup ("shadow_compat", "passwd_compat", "nis", &ni);
+      use_nisplus = (strcmp (ni->name, "nisplus") == 0);
+    }
+  
   result = internal_setspent (&ext_ent);
 
   __libc_lock_unlock (lock);
@@ -181,6 +217,9 @@ internal_endspent (ent_t *ent)
       ent->stream = NULL;
     }
 
+  if (ent->netgroup)
+    __internal_endnetgrent (&ent->netgrdata);
+
   ent->nis = ent->first = ent->netgroup = 0;
 
   if (ent->oldkey != NULL)
@@ -190,10 +229,22 @@ internal_endspent (ent_t *ent)
       ent->oldkeylen = 0;
     }
 
+  if (ent->result != NULL)
+    {
+      nis_freeresult (ent->result);
+      ent->result = NULL;
+    }
+  if (ent->names != NULL)
+    {
+      nis_freenames (ent->names);
+      ent->names = NULL;
+    }
+  ent->names_nr = 0;
+  
   ent->blacklist.current = 0;
   if (ent->blacklist.data != NULL)
     ent->blacklist.data[0] = '\0';
-
+  
   give_spwd_free (&ent->pwd);
 
   return NSS_STATUS_SUCCESS;
@@ -215,8 +266,8 @@ _nss_compat_endspent (void)
 
 
 static enum nss_status
-getspent_next_netgr (struct spwd *result, ent_t *ent, char *group,
-		     char *buffer, size_t buflen)
+getspent_next_nis_netgr (struct spwd *result, ent_t *ent, char *group,
+			 char *buffer, size_t buflen)
 {
   struct parser_data *data = (void *) buffer;
   char *ypdomain, *host, *user, *domain, *outval, *p, *p2;
@@ -233,15 +284,18 @@ getspent_next_netgr (struct spwd *result, ent_t *ent, char *group,
 
   if (ent->first == TRUE)
     {
-      setnetgrent (group);
+      bzero (&ent->netgrdata, sizeof (struct __netgrent));
+      __internal_setnetgrent (group, &ent->netgrdata);
       ent->first = FALSE;
     }
 
   while (1)
     {
-      if ((status = getnetgrent (&host, &user, &domain)) != 1)
+      status = __internal_getnetgrent_r (&host, &user, &domain,
+					 &ent->netgrdata, buffer, buflen);
+      if (status != 1)
 	{
-	  endnetgrent ();
+	  __internal_endnetgrent (&ent->netgrdata);
 	  ent->netgroup = 0;
 	  give_spwd_free (&ent->pwd);
 	  return NSS_STATUS_RETURN;
@@ -281,12 +335,176 @@ getspent_next_netgr (struct spwd *result, ent_t *ent, char *group,
 }
 
 static enum nss_status
+getspent_next_nisplus_netgr (struct spwd *result, ent_t *ent, char *group,
+                             char *buffer, size_t buflen)
+{
+  char *ypdomain, *host, *user, *domain, *p2;
+  int status, parse_res;
+  size_t p2len;
+  nis_result *nisres;
+  
+  /* Maybe we should use domainname here ? We need the current 
+     domainname for the domain field in netgroups */
+  if (yp_get_default_domain (&ypdomain) != YPERR_SUCCESS)
+    {
+      ent->netgroup = 0;
+      ent->first = 0;
+      give_spwd_free (&ent->pwd);
+      return NSS_STATUS_UNAVAIL;
+    }
+
+  if (ent->first == TRUE)
+    {
+      bzero (&ent->netgrdata, sizeof (struct __netgrent));
+      __internal_setnetgrent (group, &ent->netgrdata);
+      ent->first = FALSE;
+    }
+
+  while (1)
+    {
+      status = __internal_getnetgrent_r (&host, &user, &domain,
+                                         &ent->netgrdata, buffer, buflen);
+      if (status != 1)
+        {
+          __internal_endnetgrent (&ent->netgrdata);
+          ent->netgroup = 0;
+          give_spwd_free (&ent->pwd);
+          return NSS_STATUS_RETURN;
+        }
+
+      if (user == NULL || user[0] == '-')
+        continue;
+
+      if (domain != NULL && strcmp (ypdomain, domain) != 0)
+        continue;
+
+      p2len = spwd_need_buflen (&ent->pwd);
+      if (p2len > buflen)
+        {
+          __set_errno (ERANGE);
+          return NSS_STATUS_TRYAGAIN;
+        }
+      p2 = buffer + (buflen - p2len);
+      buflen -= p2len;
+      {      
+        char buf[strlen (user) + 30];
+        sprintf(buf, "[name=%s],passwd.org_dir", user);
+        nisres = nis_list(buf, EXPAND_NAME, NULL, NULL);
+      }
+      if (niserr2nss (nisres->status) != NSS_STATUS_SUCCESS)
+        {
+          nis_freeresult (nisres);
+          continue;
+        }
+      parse_res = _nss_nisplus_parse_spent (nisres, result, buffer, buflen);
+      nis_freeresult (nisres);
+      
+      if (parse_res)
+        {
+          copy_spwd_changes (result, &ent->pwd, p2, p2len);
+          break;
+        }
+    }
+
+  return NSS_STATUS_SUCCESS;
+}
+
+static enum nss_status
+getspent_next_netgr (struct spwd *result, ent_t *ent, char *group,
+                     char *buffer, size_t buflen)
+{
+  if (use_nisplus)
+    return getpwent_next_nisplus_netgr (result, ent, group, buffer, buflen);
+  else
+    return getpwent_next_nis_netgr (result, ent, group, buffer, buflen);
+}
+
+static enum nss_status
+getspent_next_nisplus (struct spwd *result, ent_t *ent, char *buffer,
+                       size_t buflen)
+{
+  int parse_res;
+  size_t p2len;
+  char *p2;
+  
+  if (ent->names == NULL)
+    {
+      ent->names = nis_getnames ("passwd.org_dir");
+      if (ent->names == NULL || ent->names[0] == NULL)
+        {
+          ent->nis = 0;
+          return NSS_STATUS_UNAVAIL;
+        }
+    }
+  
+  p2len = spwd_need_buflen (&ent->pwd);
+  if (p2len > buflen)
+    {
+      __set_errno (ERANGE);
+      return NSS_STATUS_TRYAGAIN;
+    }
+  p2 = buffer + (buflen - p2len);
+  buflen -= p2len;
+  do
+    {
+      if (ent->first)
+        {
+        next_name:
+          ent->result = nis_first_entry(ent->names[ent->names_nr]);
+          if (niserr2nss (ent->result->status) != NSS_STATUS_SUCCESS)
+            {
+              ent->nis = 0;
+              give_spwd_free (&ent->pwd);
+              return niserr2nss (ent->result->status);
+            }
+          ent->first = FALSE;
+        }
+      else
+        {
+          nis_result *res;
+          
+          res = nis_next_entry(ent->names[ent->names_nr], 
+                               &ent->result->cookie);
+          nis_freeresult (ent->result);
+          ent->result = res;
+          if (niserr2nss (ent->result->status) != NSS_STATUS_SUCCESS)
+            {
+              if ((ent->result->status == NIS_NOTFOUND) &&
+                  ent->names[ent->names_nr + 1] != NULL)
+                {
+                  nis_freeresult (ent->result);
+                  ent->names_nr += 1;
+                  goto next_name;
+                }
+              else
+                {
+                  ent->nis = 0;
+                  give_spwd_free (&ent->pwd);
+                  return niserr2nss (ent->result->status);
+                }
+            }
+        }
+      parse_res = _nss_nisplus_parse_spent (ent->result, result, buffer, 
+                                            buflen);
+      if (parse_res && 
+          in_blacklist (result->sp_namp, strlen (result->sp_namp), ent))
+        parse_res = 0; /* if result->pw_name in blacklist,search next entry */
+    }
+  while (!parse_res);
+  
+  copy_spwd_changes (result, &ent->pwd, p2, p2len);
+  
+  return NSS_STATUS_SUCCESS;
+}
+
+
+static enum nss_status
 getspent_next_nis (struct spwd *result, ent_t *ent,
 		   char *buffer, size_t buflen)
 {
   struct parser_data *data = (void *) buffer;
   char *domain, *outkey, *outval, *p, *p2;
-  int outkeylen, outvallen;
+  int outkeylen, outvallen, parse_res;
   size_t p2len;
 
   if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
@@ -344,17 +562,96 @@ getspent_next_nis (struct spwd *result, ent_t *ent,
 
       while (isspace (*p))
 	++p;
+      parse_res = _nss_files_parse_spent (p, result, data, buflen);
+      if (parse_res &&
+          in_blacklist (result->sp_namp, strlen (result->sp_namp), ent))
+        parse_res = 0;
     }
-  while (!_nss_files_parse_spent (p, result, data, buflen));
+  while (!parse_res);
 
   copy_spwd_changes (result, &ent->pwd, p2, p2len);
 
-  if (!in_blacklist (result->sp_namp, strlen (result->sp_namp), ent))
-    return NSS_STATUS_SUCCESS;
-  else
-    return NSS_STATUS_NOTFOUND;
+  return NSS_STATUS_SUCCESS;
 }
 
+/* This function handle the +user entrys in /etc/shadow */
+static enum nss_status
+getspent_next_file_plususer (struct spwd *result, char *buffer, 
+                             size_t buflen)
+{
+  struct parser_data *data = (void *) buffer;
+  struct spwd pwd;
+  int parse_res;
+  char *p;
+  size_t plen;
+  
+  memset (&pwd, '\0', sizeof (struct spwd));
+  
+  copy_spwd_changes (&pwd, result, NULL, 0);
+  
+  plen = spwd_need_buflen (&pwd);
+  if (plen > buflen)
+    {
+      __set_errno (ERANGE);
+      return NSS_STATUS_TRYAGAIN;
+    }
+  p = buffer + (buflen - plen);
+  buflen -= plen;
+  
+  if (use_nisplus) /* Do the NIS+ query here */
+    {
+      nis_result *res;
+      char buf[strlen (result->sp_namp) + 24];
+      
+      sprintf(buf, "[name=%s],passwd.org_dir",
+              &result->sp_namp[1]);
+      res = nis_list(buf, EXPAND_NAME, NULL, NULL);
+      if (niserr2nss (res->status) != NSS_STATUS_SUCCESS)
+        {
+          enum nss_status status =  niserr2nss (res->status);
+          
+          nis_freeresult (res);
+          return status;
+        }
+      parse_res = _nss_nisplus_parse_spent (res, result, buffer, buflen);
+      nis_freeresult (res);
+    }
+  else /* Use NIS */
+    {
+      char *domain;
+      char *outval;
+      int outvallen;
+      
+      if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
+        return NSS_STATUS_TRYAGAIN;
+      
+      if (yp_match (domain, "passwd.byname", &result->sp_namp[1],
+                    strlen (result->sp_namp) - 1, &outval, &outvallen)
+          != YPERR_SUCCESS)
+        return NSS_STATUS_TRYAGAIN;
+      p = strncpy (buffer, outval, 
+                   buflen < outvallen ? buflen : outvallen);
+      free (outval);
+      while (isspace (*p))
+        p++;
+      parse_res = _nss_files_parse_spent (p, result, data, buflen);
+    }
+  
+  if (parse_res)
+    {
+      copy_spwd_changes (result, &pwd, p, plen);
+      give_spwd_free (&pwd);
+      /* We found the entry.  */
+      return NSS_STATUS_SUCCESS;
+    }
+  else
+    {
+      /* Give buffer the old len back */
+      buflen += plen;
+      give_spwd_free (&pwd);
+    }
+  return NSS_STATUS_RETURN;
+}
 
 static enum nss_status
 getspent_next_file (struct spwd *result, ent_t *ent,
@@ -434,50 +731,16 @@ getspent_next_file (struct spwd *result, ent_t *ent,
       if (result->sp_namp[0] == '+' && result->sp_namp[1] != '\0'
 	  && result->sp_namp[1] != '@')
 	{
-	  char *domain;
-	  char *outval;
-	  int outvallen;
-	  struct spwd pwd;
-
-	  memset (&pwd, '\0', sizeof (struct spwd));
-
-	  if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
-	    /* XXX Should we regard this as an fatal error?  I don't
-	       think so.  Just continue working.  --drepper@gnu  */
-	    continue;
-
-	  if (yp_match (domain, "shadow.byname", &result->sp_namp[1],
-			strlen (result->sp_namp) - 1, &outval, &outvallen)
-	      != YPERR_SUCCESS)
-	    continue;
-
-	  copy_spwd_changes (&pwd, result, NULL, 0);
-
-	  p2len = spwd_need_buflen (&pwd);
-	  if (p2len > buflen)
-	    {
-	      __set_errno (ERANGE);
-	      return NSS_STATUS_TRYAGAIN;
-	    }
-	  p2 = buffer + (buflen - p2len);
-	  buflen -= p2len;
-	  p = strncpy (buffer, outval, buflen);
-	  while (isspace (*p))
-	    p++;
-	  free (outval);
-	  if (_nss_files_parse_spent (p, result, data, buflen))
-	    {
-	      copy_spwd_changes (result, &pwd, p2, p2len);
-	      give_spwd_free (&pwd);
-	      /* We found the entry.  */
-	      break;
-	    }
-	  else
-	    {
-	      /* Give buffer the old len back */
-	      buflen += p2len;
-	      give_spwd_free (&pwd);
-	    }
+          enum nss_status status;
+	  
+          status = getspent_next_file_plususer (result, buffer, buflen);
+          if (status == NSS_STATUS_SUCCESS) /* We found the entry. */
+            break;
+          else
+            if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
+              continue;
+            else
+              return status;
 	}
 
       /* +:... */
@@ -487,7 +750,10 @@ getspent_next_file (struct spwd *result, ent_t *ent,
 	  ent->first = TRUE;
 	  copy_spwd_changes (&ent->pwd, result, NULL, 0);
 
-	  return getspent_next_nis (result, ent, buffer, buflen);
+	  if (use_nisplus)
+	    return getspent_next_nisplus (result, ent, buffer, buflen);
+	  else
+	    return getspent_next_nis (result, ent, buffer, buflen);
 	}
     }
 
@@ -512,7 +778,12 @@ internal_getspent_r (struct spwd *pw, ent_t *ent,
 	return status;
     }
   else if (ent->nis)
-    return getspent_next_nis (pw, ent, buffer, buflen);
+    {
+      if (use_nisplus)
+	return getspent_next_nisplus (pw, ent, buffer, buflen);
+      else
+	return getspent_next_nis (pw, ent, buffer, buflen);
+    }
   else
     return getspent_next_file (pw, ent, buffer, buflen);
 }
@@ -524,6 +795,12 @@ _nss_compat_getspent_r (struct spwd *pwd, char *buffer, size_t buflen)
 
   __libc_lock_lock (lock);
 
+  if (ni == NULL)
+    {
+      __nss_database_lookup ("shadow_compat", "passwd_compat", "nis", &ni);
+      use_nisplus = (strcmp (ni->name, "nisplus") == 0);
+    }
+  
   /* Be prepared that the setspent function was not called before.  */
   if (ext_ent.stream == NULL)
     status = internal_setspent (&ext_ent);
@@ -541,13 +818,19 @@ enum nss_status
 _nss_compat_getspnam_r (const char *name, struct spwd *pwd,
 			char *buffer, size_t buflen)
 {
-  ent_t ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0},
+  ent_t ent = {0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, {NULL, 0, 0},
 	       {NULL, NULL, 0, 0, 0, 0, 0, 0, 0}};
   enum nss_status status;
 
   if (name[0] == '-' || name[0] == '+')
     return NSS_STATUS_NOTFOUND;
 
+  if (ni == NULL)
+    {
+      __nss_database_lookup ("shadow_compat", "passwd_compat", "nis", &ni);
+      use_nisplus = (strcmp (ni->name, "nisplus") == 0);
+    }
+  
   status = internal_setspent (&ent);
   if (status != NSS_STATUS_SUCCESS)
     return status;
@@ -619,3 +902,4 @@ in_blacklist (const char *name, int namelen, ent_t *ent)
   stpcpy (stpcpy (stpcpy (buf, "|"), name), "|");
   return strstr (ent->blacklist.data, buf) != NULL;
 }
+
diff --git a/nis/nss_nis/nis-grp.c b/nis/nss_nis/nis-grp.c
index d727202513..139edf2dd8 100644
--- a/nis/nss_nis/nis-grp.c
+++ b/nis/nss_nis/nis-grp.c
@@ -122,7 +122,7 @@ internal_nis_getgrent_r (struct group *grp, char *buffer, size_t buflen)
       free (result);
 
       parse_res = _nss_files_parse_grent (p, grp, data, buflen);
-      if (!parse_res && errno == ERANGE)
+      if (parse_res < 1 && errno == ERANGE)
         return NSS_STATUS_TRYAGAIN;
 
       free (oldkey);
@@ -130,7 +130,7 @@ internal_nis_getgrent_r (struct group *grp, char *buffer, size_t buflen)
       oldkeylen = keylen;
       new_start = 0;
     }
-  while (!parse_res);
+  while (parse_res < 1);
 
   return NSS_STATUS_SUCCESS;
 }
@@ -192,7 +192,7 @@ _nss_nis_getgrnam_r (const char *name, struct group *grp,
 
   parse_res = _nss_files_parse_grent (p, grp, data, buflen);
 
-  if (!parse_res)
+  if (parse_res < 1)
     {
       if (errno == ERANGE)
         return NSS_STATUS_TRYAGAIN;
@@ -243,7 +243,7 @@ _nss_nis_getgrgid_r (gid_t gid, struct group *grp,
 
   parse_res = _nss_files_parse_grent (p, grp, data, buflen);
 
-  if (!parse_res)
+  if (parse_res < 1)
     {
       if (errno == ERANGE)
         return NSS_STATUS_TRYAGAIN;
diff --git a/nis/nss_nis/nis-publickey.c b/nis/nss_nis/nis-publickey.c
index aad4da5cc2..f50f7095fc 100644
--- a/nis/nss_nis/nis-publickey.c
+++ b/nis/nss_nis/nis-publickey.c
@@ -23,22 +23,24 @@
 #include <string.h>
 #include <syslog.h>
 #include <libc-lock.h>
-#include <rpc/key_prot.h>
+#include <rpc/rpc.h>
 #include <rpcsvc/yp.h>
 #include <rpcsvc/ypclnt.h>
+#if defined (HAVE_SECURE_RPC)
+#include <rpc/key_prot.h>
+extern int xdecrypt (char *, char *);
+#endif
 
 #include "nss-nis.h"
 
-extern int xdecrypt (char *, char *);
-
-/* If we found the entry, we give a SUCCESS and an empty key back. */
+/* If we haven't found the entry, we give a SUCCESS and an empty key back. */
 enum nss_status
 _nss_nis_getpublickey (const char *netname, char *pkey)
 {
   enum nss_status retval;
   char *domain, *result;
   int len;
-
+  
   pkey[0] = 0;
 
   if (netname == NULL)
@@ -75,6 +77,7 @@ _nss_nis_getpublickey (const char *netname, char *pkey)
 enum nss_status
 _nss_nis_getsecretkey (const char *netname, char *skey, char *passwd)
 {
+#if defined (HAVE_SECURE_RPC)
   enum nss_status retval;
   char buf[1024];
   char *domain, *result;
@@ -120,6 +123,9 @@ _nss_nis_getsecretkey (const char *netname, char *skey, char *passwd)
       buf[HEXKEYBYTES] = 0;
       strcpy (skey, buf);
     }
+#else
+  skey[0] = 0;
+#endif
   return NSS_STATUS_SUCCESS;
 }
 
diff --git a/nis/nss_nisplus/nisplus-alias.c b/nis/nss_nisplus/nisplus-alias.c
index b0f035178e..b27f1a87ab 100644
--- a/nis/nss_nisplus/nisplus-alias.c
+++ b/nis/nss_nisplus/nisplus-alias.c
@@ -44,7 +44,7 @@ _nss_nisplus_parse_aliasent (nis_result *result, struct aliasent *alias,
 			  char *buffer, size_t buflen)
 {
   if (result == NULL)
-    return -1;
+    return 0;
 
   if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) ||
       result->objects.objects_len != 1 ||
@@ -52,7 +52,7 @@ _nss_nisplus_parse_aliasent (nis_result *result, struct aliasent *alias,
       strcmp(result->objects.objects_val[0].zo_data.objdata_u.en_data.en_type,
 	     "mail_aliases") != 0 ||
       result->objects.objects_val[0].zo_data.objdata_u.en_data.en_cols.en_cols_len < 2)
-    return -1;
+    return 0;
   else
     {
       char *first_unused = buffer + NISENTRYLEN(0, 1, result) + 1;
@@ -67,7 +67,7 @@ _nss_nisplus_parse_aliasent (nis_result *result, struct aliasent *alias,
 	  /* The line is too long for our buffer.  */
 	no_more_room:
 	  __set_errno (ERANGE);
-	  return -1;
+	  return 0;
 	}
       else
 	{
diff --git a/nis/nss_nisplus/nisplus-ethers.c b/nis/nss_nisplus/nisplus-ethers.c
index ac3e06960a..2cdc2dfd7a 100644
--- a/nis/nss_nisplus/nisplus-ethers.c
+++ b/nis/nss_nisplus/nisplus-ethers.c
@@ -86,7 +86,7 @@ _nss_nisplus_parse_etherent (nis_result *result, struct etherent *ether,
   struct parser_data *data = (void *) buffer;
 
   if (result == NULL)
-    return -1;
+    return 0;
 
   if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) ||
       result->objects.objects_len != 1 ||
@@ -94,7 +94,7 @@ _nss_nisplus_parse_etherent (nis_result *result, struct etherent *ether,
       strcmp(result->objects.objects_val[0].zo_data.objdata_u.en_data.en_type,
              "ethers_tbl") != 0 ||
       result->objects.objects_val[0].zo_data.objdata_u.en_data.en_cols.en_cols_len < 2)
-    return -1;
+    return 0;
 
   memset (p, '\0', room_left);
 
@@ -102,7 +102,7 @@ _nss_nisplus_parse_etherent (nis_result *result, struct etherent *ether,
   if (NISENTRYLEN (0, 0, result) +1 > room_left)
     {
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
   strncpy (p, NISENTRYVAL (0, 0, result), NISENTRYLEN (0, 0, result));
   room_left -= (NISENTRYLEN (0, 0, result) +1);
@@ -110,7 +110,7 @@ _nss_nisplus_parse_etherent (nis_result *result, struct etherent *ether,
   if (NISENTRYLEN (0, 1, result) +1 > room_left)
     {
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
   strcat (p, "\t");
   strncat (p, NISENTRYVAL (0, 1, result), NISENTRYLEN (0, 1, result));
diff --git a/nis/nss_nisplus/nisplus-grp.c b/nis/nss_nisplus/nisplus-grp.c
index 2e56afa6fc..1c73ca555b 100644
--- a/nis/nss_nisplus/nisplus-grp.c
+++ b/nis/nss_nisplus/nisplus-grp.c
@@ -39,63 +39,34 @@ static nis_name *names = NULL;
 #define NISENTRYLEN(idx,col,res) \
   ((res)->objects.objects_val[(idx)].zo_data.objdata_u.en_data.en_cols.en_cols_val[(col)].ec_value.ec_value_len)
 
-#define STRUCTURE       group
-#define ENTNAME         grent
-struct grent_data {};
-
-#define TRAILING_LIST_MEMBER            gr_mem
-#define TRAILING_LIST_SEPARATOR_P(c)    ((c) == ',')
-#include "../../nss/nss_files/files-parse.c"
-LINE_PARSER
-(,
- STRING_FIELD (result->gr_name, ISCOLON, 0);
- if (line[0] == '\0'
-     && (result->gr_name[0] == '+' || result->gr_name[0] == '-'))
-   {
-     result->gr_passwd = NULL;
-     result->gr_gid = 0;
-   }
- else
-   {
-     STRING_FIELD (result->gr_passwd, ISCOLON, 0);
-     if (result->gr_name[0] == '+' || result->gr_name[0] == '-')
-       INT_FIELD_MAYBE_NULL (result->gr_gid, ISCOLON, 0, 10, , 0)
-     else
-       INT_FIELD (result->gr_gid, ISCOLON, 0, 10,)
-   }
- )
-
-static int
+int
 _nss_nisplus_parse_grent (nis_result * result, struct group *gr,
 			  char *buffer, size_t buflen)
 {
-#if 0
-  /* XXX here is a bug, sometimes we get some special characters at the
-     end of a line */
   char *first_unused = buffer;
   size_t room_left = buflen;
   char *line;
   int count;
-
+  
   if (result == NULL)
-    return -1;
-
+    return 0;
+  
   if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) ||
       result->objects.objects_len != 1 ||
       result->objects.objects_val[0].zo_data.zo_type != ENTRY_OBJ ||
-   strcmp (result->objects.objects_val[0].zo_data.objdata_u.en_data.en_type,
-	   "group_tbl") != 0 ||
+      strcmp (result->objects.objects_val[0].zo_data.objdata_u.en_data.en_type,
+	      "group_tbl") != 0 ||
       result->objects.objects_val[0].zo_data.objdata_u.en_data.en_cols.en_cols_len < 4)
-    return -1;
+    return 0;
 
   if (NISENTRYLEN (0, 0, result) >= room_left)
     {
       /* The line is too long for our buffer.  */
     no_more_room:
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
-
+  
   strncpy (first_unused, NISENTRYVAL (0, 0, result),
 	   NISENTRYLEN (0, 0, result));
   first_unused[NISENTRYLEN (0, 0, result)] = '\0';
@@ -158,8 +129,11 @@ _nss_nisplus_parse_grent (nis_result * result, struct group *gr,
 
       if (line != gr->gr_mem[count])
 	{
-	  *line = '\0';
-	  ++line;
+	  if (*line != '\0')
+	    {
+	      *line = '\0';
+	      ++line;
+	    }
 	  ++count;
 	}
       else
@@ -171,59 +145,6 @@ _nss_nisplus_parse_grent (nis_result * result, struct group *gr,
   gr->gr_mem[count] = NULL;
 
   return 1;
-#else
-  char *p = buffer;
-  size_t room_left = buflen;
-  struct parser_data *data = (void *) buffer;
-
-  if (result == NULL)
-    return -1;
-
-  if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) ||
-      result->objects.objects_len != 1 ||
-      result->objects.objects_val[0].zo_data.zo_type != ENTRY_OBJ ||
-   strcmp (result->objects.objects_val[0].zo_data.objdata_u.en_data.en_type,
-	   "group_tbl") != 0 ||
-      result->objects.objects_val[0].zo_data.objdata_u.en_data.en_cols.en_cols_len < 4)
-    return -1;
-
-  memset (p, '\0', room_left);
-
-  if (NISENTRYLEN (0, 0, result) + 1 > room_left)
-    {
-      __set_errno (ERANGE);
-      return -1;
-    }
-  strncpy (p, NISENTRYVAL (0, 0, result), NISENTRYLEN (0, 0, result));
-  room_left -= (NISENTRYLEN (0, 0, result) + 1);
-  strcat (p, ":");
-
-  if (NISENTRYLEN (0, 1, result) + 1 > room_left)
-    {
-      __set_errno (ERANGE);
-      return -1;
-    }
-  strncat (p, NISENTRYVAL (0, 1, result), NISENTRYLEN (0, 1, result));
-  room_left -= (NISENTRYLEN (0, 1, result) + 1);
-  strcat (p, ":");
-  if (NISENTRYLEN (0, 2, result) + 1 > room_left)
-    {
-      __set_errno (ERANGE);
-      return -1;
-    }
-  strncat (p, NISENTRYVAL (0, 2, result), NISENTRYLEN (0, 2, result));
-  room_left -= (NISENTRYLEN (0, 2, result) + 1);
-  strcat (p, ":");
-  if (NISENTRYLEN (0, 3, result) + 1 > room_left)
-    {
-      __set_errno (ERANGE);
-      return -1;
-    }
-  strncat (p, NISENTRYVAL (0, 3, result), NISENTRYLEN (0, 3, result));
-  room_left -= (NISENTRYLEN (0, 3, result) + 1);
-
-  return _nss_files_parse_grent (p, gr, data, buflen);
-#endif
 }
 
 enum nss_status
diff --git a/nis/nss_nisplus/nisplus-hosts.c b/nis/nss_nisplus/nisplus-hosts.c
index 0a486411de..1bcbe40e87 100644
--- a/nis/nss_nisplus/nisplus-hosts.c
+++ b/nis/nss_nisplus/nisplus-hosts.c
@@ -121,14 +121,14 @@ _nss_nisplus_parse_hostent (nis_result *result, struct hostent *host,
   struct parser_data *data = (void *) buffer;
 
   if (result == NULL)
-    return -1;
+    return 0;
 
   if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) ||
       result->objects.objects_val[0].zo_data.zo_type != ENTRY_OBJ ||
       strcmp(result->objects.objects_val[0].zo_data.objdata_u.en_data.en_type,
              "hosts_tbl") != 0 ||
       result->objects.objects_val[0].zo_data.objdata_u.en_data.en_cols.en_cols_len < 4)
-    return -1;
+    return 0;
 
   memset (p, '\0', room_left);
 
@@ -136,7 +136,7 @@ _nss_nisplus_parse_hostent (nis_result *result, struct hostent *host,
   if (NISENTRYLEN (0, 2, result) + 1 > room_left)
     {
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
   strncpy (p, NISENTRYVAL (0, 2, result),
 	   NISENTRYLEN (0, 2, result));
@@ -145,7 +145,7 @@ _nss_nisplus_parse_hostent (nis_result *result, struct hostent *host,
   if (NISENTRYLEN (0, 0, result) + 1 > room_left)
     {
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
   strcat (p, "\t");
   strncat (p, NISENTRYVAL (0, 0, result), NISENTRYLEN (0, 0, result));
@@ -157,7 +157,7 @@ _nss_nisplus_parse_hostent (nis_result *result, struct hostent *host,
       if (NISENTRYLEN (i, 1, result) + 1 > room_left)
 	{
 	  __set_errno (ERANGE);
-	  return -1;
+	  return 0;
 	}
       strcat (p, " ");
       strcat (p, NISENTRYVAL (i, 1, result));
diff --git a/nis/nss_nisplus/nisplus-netgrp.c b/nis/nss_nisplus/nisplus-netgrp.c
index 766d2bc773..f2a1b301b9 100644
--- a/nis/nss_nisplus/nisplus-netgrp.c
+++ b/nis/nss_nisplus/nisplus-netgrp.c
@@ -31,13 +31,9 @@
 
 __libc_lock_define_initialized (static, lock)
 
-static char *data = NULL;
-static size_t data_size = 0;
-static char *cursor = NULL;;
-
-extern enum nss_status
-_nss_netgroup_parseline (char **cursor, struct __netgrent *result,
-                         char *buffer, size_t buflen);
+static nis_result *data = NULL;
+static unsigned long data_size = 0;
+static unsigned long position = 0;
 
 #define NISENTRYVAL(idx,col,res) \
         ((res)->objects.objects_val[(idx)].zo_data.objdata_u.en_data.en_cols.en_cols_val[(col)].ec_value.ec_value_val)
@@ -45,15 +41,103 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result,
 #define NISENTRYLEN(idx,col,res) \
         ((res)->objects.objects_val[(idx)].zo_data.objdata_u.en_data.en_cols.en_cols_val[(col)].ec_value.ec_value_len)
 
+static enum nss_status
+_nss_nisplus_parse_netgroup (struct __netgrent *result, char *buffer, 
+			     size_t buflen)
+{
+  enum nss_status status;
+
+  /* Some sanity checks.  */
+  if (data == NULL || data_size == 0)
+    /* User bug.  setnetgrent() wasn't called before.  */
+    abort ();
+  
+  if (position == data_size)
+    return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
+  
+  if (NISENTRYLEN (position, 1, data) > 0)
+    {
+      /* We have a list of other netgroups.  */
+      
+      result->type = group_val;
+      if (NISENTRYLEN (position, 1, data) >= buflen)
+	{
+	  __set_errno (ERANGE);
+	  return NSS_STATUS_TRYAGAIN;
+	}
+      strncpy (buffer, NISENTRYVAL (position, 1, data),
+	       NISENTRYLEN (position, 1, data));
+      buffer[NISENTRYLEN (position, 1, data)] = '\0';
+      result->val.group = buffer;
+      ++position;
+      result->first = 0;
+      
+      return NSS_STATUS_SUCCESS;
+    }
+
+  /* Before we can copy the entry to the private buffer we have to make 
+     sure it is big enough.  */
+  if (NISENTRYLEN (position, 2, data) + NISENTRYLEN (position, 3, data) + 
+      NISENTRYLEN (position, 4, data) + 6 > buflen)
+    {
+      __set_errno (ERANGE);
+      status = NSS_STATUS_UNAVAIL;
+    }
+  else
+    {
+      char *cp = buffer;
+      
+      result->type = triple_val;
+      
+      if (NISENTRYLEN (position, 2, data) == 0)
+	result->val.triple.host = NULL;
+      else
+	{
+	  result->val.triple.host = cp;
+	  cp = stpncpy (cp, NISENTRYVAL (position, 2, data),
+			NISENTRYLEN (position, 2, data));
+	  *cp = '\0';
+	  ++cp;
+	}
+
+      if (NISENTRYLEN (position, 3, data) == 0)
+	result->val.triple.user = NULL;
+      else
+	{
+	  result->val.triple.user = cp;
+	  cp = stpncpy (cp, NISENTRYVAL (position, 3, data),
+			NISENTRYLEN (position, 3, data));
+	  *cp = '\0';
+	  ++cp;
+	}
+
+      if (NISENTRYLEN (position, 4, data) == 0)
+	result->val.triple.domain = NULL;
+      else
+	{
+	  result->val.triple.domain = cp;
+	  cp = stpncpy (cp, NISENTRYVAL (position, 4, data),
+			NISENTRYLEN (position, 4, data));
+	  *cp = '\0';
+	}
+
+      status = NSS_STATUS_SUCCESS;
+
+      /* Remember where we stopped reading.  */
+      ++position;
+
+      result->first = 0;
+    }
+
+  return status;
+}
+
 enum nss_status
 _nss_nisplus_setnetgrent (char *group)
 
 {
   enum nss_status status;
-  nis_result *result;
   char buf[strlen (group) + 30];
-  int i;
-  size_t len;
 
   if (group == NULL || group[0] == '\0')
     return NSS_STATUS_UNAVAIL;
@@ -64,43 +148,27 @@ _nss_nisplus_setnetgrent (char *group)
 
   if (data != NULL)
     {
-      free (data);
+      nis_freeresult (data);
       data = NULL;
       data_size = 0;
-      cursor = NULL;
+      position = 0;
     }
 
   sprintf(buf, "[name=%s],netgroup.org_dir", group);
 
-  result = nis_list(buf, EXPAND_NAME, NULL, NULL);
-
-  if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
-    status = niserr2nss (result->status);
-
-  len = 0;
-  for (i = 0; i < result->objects.objects_len; i++)
-    len += 1 + NISENTRYLEN (i, 1, result) + 1 + NISENTRYLEN(i,2,result)
-      + 1 + NISENTRYLEN(i,3,result) + 1 + NISENTRYLEN(i,4,result) + 2;
-
-  data = malloc (len+1);
-  memset (data, '\0', len+1);
+  data = nis_list(buf, EXPAND_NAME, NULL, NULL);
 
-  for (i = 0; i < result->objects.objects_len; i++)
+  if (niserr2nss (data->status) != NSS_STATUS_SUCCESS)
     {
-      strncat (data, NISENTRYVAL (i, 1, result), NISENTRYLEN (i, 1, result));
-      strcat (data," (");
-      strncat (data, NISENTRYVAL(i,2,result), NISENTRYLEN (i, 2, result));
-      strcat (data, ",");
-      strncat (data, NISENTRYVAL(i,3,result), NISENTRYLEN (i, 3, result));
-      strcat (data, ",");
-      strncat (data, NISENTRYVAL(i,4,result), NISENTRYLEN (i, 4, result));
-      strcat (data, ") ");
+      status = niserr2nss (data->status);
+      nis_freeresult (data);
+      data = NULL;
     }
-
-  nis_freeresult (result);
-
+  else
+    data_size = data->objects.objects_len;
+  
   __libc_lock_unlock (lock);
-
+  
   return status;
 }
 
@@ -111,10 +179,10 @@ _nss_nisplus_endnetgrent (void)
 
   if (data != NULL)
     {
-      free (data);
+      nis_freeresult (data);
       data = NULL;
       data_size = 0;
-      cursor = NULL;
+      position = 0;
     }
 
   __libc_lock_unlock (lock);
@@ -128,12 +196,9 @@ _nss_nisplus_getnetgrent_r (struct __netgrent *result,
 {
   enum nss_status status;
 
-  if (cursor == NULL)
-    return NSS_STATUS_NOTFOUND;
-
   __libc_lock_lock (lock);
 
-  status = _nss_netgroup_parseline (&cursor, result, buffer, buflen);
+  status = _nss_nisplus_parse_netgroup (result, buffer, buflen);
 
   __libc_lock_unlock (lock);
 
diff --git a/nis/nss_nisplus/nisplus-network.c b/nis/nss_nisplus/nisplus-network.c
index 28580b6bc9..7e0ccd6411 100644
--- a/nis/nss_nisplus/nisplus-network.c
+++ b/nis/nss_nisplus/nisplus-network.c
@@ -69,20 +69,20 @@ _nss_nisplus_parse_netent (nis_result *result, struct netent *network,
   struct parser_data *data = (void *) buffer;
 
   if (result == NULL)
-    return -1;
+    return 0;
 
   if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) ||
       result->objects.objects_val[0].zo_data.zo_type != ENTRY_OBJ ||
       strcmp(result->objects.objects_val[0].zo_data.objdata_u.en_data.en_type,
              "networks_tbl") != 0 ||
       result->objects.objects_val[0].zo_data.objdata_u.en_data.en_cols.en_cols_len < 3)
-    return -1;
+    return 0;
 
   /* Generate the network entry format and use the normal parser */
   if (NISENTRYLEN (0, 0, result) +1 > room_left)
     {
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
 
   memset (p, '\0', room_left);
@@ -93,7 +93,7 @@ _nss_nisplus_parse_netent (nis_result *result, struct netent *network,
   if (NISENTRYLEN (0, 2, result) +1 > room_left)
     {
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
   strcat (p, "\t");
   strncat (p, NISENTRYVAL (0, 2, result), NISENTRYLEN (0, 2, result));
@@ -101,12 +101,11 @@ _nss_nisplus_parse_netent (nis_result *result, struct netent *network,
                                         /* + 1: We overwrite the last \0 */
 
   for (i = 1; i < result->objects.objects_len; i++)
-    /* XXX should we start with i = 0 or with i = 1 ? */
     {
       if (NISENTRYLEN (i, 1, result) +1 > room_left)
 	{
 	  __set_errno (ERANGE);
-	  return -1;
+	  return 0;
 	}
       strcat (p, " ");
       strncat (p, NISENTRYVAL (i, 1, result), NISENTRYLEN (i, 1, result));
diff --git a/nis/nss_nisplus/nisplus-proto.c b/nis/nss_nisplus/nisplus-proto.c
index b26cb8230e..5cb55d367c 100644
--- a/nis/nss_nisplus/nisplus-proto.c
+++ b/nis/nss_nisplus/nisplus-proto.c
@@ -60,14 +60,14 @@ _nss_nisplus_parse_protoent (nis_result * result, struct protoent *proto,
   struct parser_data *data = (void *) buffer;
 
   if (result == NULL)
-    return -1;
+    return 0;
 
   if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) ||
       result->objects.objects_val[0].zo_data.zo_type != ENTRY_OBJ ||
    strcmp (result->objects.objects_val[0].zo_data.objdata_u.en_data.en_type,
 	   "protocols_tbl") != 0 ||
       result->objects.objects_val[0].zo_data.objdata_u.en_data.en_cols.en_cols_len < 3)
-    return -1;
+    return 0;
 
   memset (p, '\0', room_left);
 
@@ -75,7 +75,7 @@ _nss_nisplus_parse_protoent (nis_result * result, struct protoent *proto,
   if (NISENTRYLEN (0, 0, result) + 1 > room_left)
     {
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
   strncpy (p, NISENTRYVAL (0, 0, result), NISENTRYLEN (0, 0, result));
   room_left -= (NISENTRYLEN (0, 0, result) + 1);
@@ -83,7 +83,7 @@ _nss_nisplus_parse_protoent (nis_result * result, struct protoent *proto,
   if (NISENTRYLEN (0, 2, result) + 1 > room_left)
     {
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
   strcat (p, "\t");
   strncat (p, NISENTRYVAL (0, 2, result), NISENTRYLEN (0, 2, result));
@@ -95,7 +95,7 @@ _nss_nisplus_parse_protoent (nis_result * result, struct protoent *proto,
       if (NISENTRYLEN (i, 1, result) + 1 > room_left)
 	{
 	  __set_errno (ERANGE);
-	  return -1;
+	  return 0;
 	}
       strcat (p, " ");
       strncat (p, NISENTRYVAL (i, 1, result), NISENTRYLEN (i, 1, result));
diff --git a/nis/nss_nisplus/nisplus-publickey.c b/nis/nss_nisplus/nisplus-publickey.c
index 7312c91229..91cfba730e 100644
--- a/nis/nss_nisplus/nisplus-publickey.c
+++ b/nis/nss_nisplus/nisplus-publickey.c
@@ -23,15 +23,17 @@
 #include <stdio.h>
 #include <string.h>
 #include <syslog.h>
-#include <rpc/key_prot.h>
+#include <rpc/rpc.h>
 #include <rpcsvc/nis.h>
 #include <rpcsvc/nislib.h>
+#ifdef HAVE_SECURE_RPC
+#include <rpc/key_prot.h>
+extern int xdecrypt (char *, char *);
+#endif
 
 #include <nss-nisplus.h>
 
-extern int xdecrypt (char *, char *);
-
-/* If we found the entry, we give a SUCCESS and an empty key back. */
+/* If we haven't found the entry, we give a SUCCESS and an empty key back. */
 enum nss_status
 _nss_nisplus_getpublickey (const char *netname, char *pkey)
 {
@@ -70,6 +72,8 @@ _nss_nisplus_getpublickey (const char *netname, char *pkey)
     {
       if (retval == NSS_STATUS_TRYAGAIN)
 	__set_errno (EAGAIN);
+      if (res->status == NIS_NOTFOUND)
+	retval = NSS_STATUS_SUCCESS;
       nis_freeresult (res);
       return retval;
     }
@@ -100,6 +104,7 @@ _nss_nisplus_getpublickey (const char *netname, char *pkey)
 enum nss_status
 _nss_nisplus_getsecretkey (const char *netname, char *skey, char *passwd)
 {
+#ifdef HAVE_SECURE_RPC
   nis_result *res;
   enum nss_status retval;
   char buf[NIS_MAXNAMELEN+2];
@@ -167,6 +172,9 @@ _nss_nisplus_getsecretkey (const char *netname, char *skey, char *passwd)
 
   buf[HEXKEYBYTES] = 0;
   strcpy (skey, buf);
+#else
+  skey[0] = 0;
+#endif
 
   return NSS_STATUS_SUCCESS;
 }
diff --git a/nis/nss_nisplus/nisplus-pwd.c b/nis/nss_nisplus/nisplus-pwd.c
index 3717d5e98a..b65a9fe395 100644
--- a/nis/nss_nisplus/nisplus-pwd.c
+++ b/nis/nss_nisplus/nisplus-pwd.c
@@ -38,7 +38,7 @@ static nis_name *names = NULL;
 #define NISENTRYLEN(idx,col,res) \
         ((res)->objects.objects_val[(idx)].zo_data.objdata_u.en_data.en_cols.en_cols_val[(col)].ec_value.ec_value_len)
 
-static int
+int
 _nss_nisplus_parse_pwent (nis_result *result, struct passwd *pw,
 			  char *buffer, size_t buflen)
 {
@@ -46,7 +46,7 @@ _nss_nisplus_parse_pwent (nis_result *result, struct passwd *pw,
   size_t room_left = buflen;
 
   if (result == NULL)
-    return -1;
+    return 0;
 
   if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) ||
       result->objects.objects_len != 1 ||
@@ -54,14 +54,14 @@ _nss_nisplus_parse_pwent (nis_result *result, struct passwd *pw,
       strcmp(result->objects.objects_val[0].zo_data.objdata_u.en_data.en_type,
 	     "passwd_tbl") != 0 ||
       result->objects.objects_val[0].zo_data.objdata_u.en_data.en_cols.en_cols_len < 7)
-    return -1;
+    return 0;
 
   if (NISENTRYLEN(0, 0, result) >= room_left)
     {
       /* The line is too long for our buffer.  */
     no_more_room:
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
 
   strncpy (first_unused, NISENTRYVAL(0, 0, result),
diff --git a/nis/nss_nisplus/nisplus-rpc.c b/nis/nss_nisplus/nisplus-rpc.c
index 326f262749..9cf9f68b44 100644
--- a/nis/nss_nisplus/nisplus-rpc.c
+++ b/nis/nss_nisplus/nisplus-rpc.c
@@ -60,14 +60,14 @@ _nss_nisplus_parse_rpcent (nis_result *result, struct rpcent *rpc,
   struct parser_data *data = (void *) buffer;
 
   if (result == NULL)
-    return -1;
+    return 0;
 
   if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) ||
       result->objects.objects_val[0].zo_data.zo_type != ENTRY_OBJ ||
       strcmp(result->objects.objects_val[0].zo_data.objdata_u.en_data.en_type,
              "rpc_tbl") != 0 ||
       result->objects.objects_val[0].zo_data.objdata_u.en_data.en_cols.en_cols_len < 3)
-    return -1;
+    return 0;
 
   memset (p, '\0', room_left);
 
@@ -75,7 +75,7 @@ _nss_nisplus_parse_rpcent (nis_result *result, struct rpcent *rpc,
   if (NISENTRYLEN (0, 0, result) +1 > room_left)
     {
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
   strncpy (p, NISENTRYVAL (0, 0, result), NISENTRYLEN (0, 0, result));
   room_left -= (NISENTRYLEN (0, 0, result) +1);
@@ -83,7 +83,7 @@ _nss_nisplus_parse_rpcent (nis_result *result, struct rpcent *rpc,
   if (NISENTRYLEN (0, 2, result) +1 > room_left)
     {
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
   strcat (p, "\t");
   strncat (p, NISENTRYVAL (0, 2, result), NISENTRYLEN (0, 2, result));
@@ -96,7 +96,7 @@ _nss_nisplus_parse_rpcent (nis_result *result, struct rpcent *rpc,
       if (NISENTRYLEN (i, 1, result) +1 > room_left)
         {
           __set_errno (ERANGE);
-          return -1;
+          return 0;
         }
       strcat (p, " ");
       strncat (p, NISENTRYVAL (i, 1, result), NISENTRYLEN (i, 1, result));
diff --git a/nis/nss_nisplus/nisplus-service.c b/nis/nss_nisplus/nisplus-service.c
index 54f4f876c7..1a8716ab9d 100644
--- a/nis/nss_nisplus/nisplus-service.c
+++ b/nis/nss_nisplus/nisplus-service.c
@@ -63,14 +63,14 @@ _nss_nisplus_parse_servent (nis_result *result, struct servent *serv,
   struct parser_data *data = (void *) buffer;
 
   if (result == NULL)
-    return -1;
+    return 0;
 
   if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) ||
       result->objects.objects_val[0].zo_data.zo_type != ENTRY_OBJ ||
    strcmp (result->objects.objects_val[0].zo_data.objdata_u.en_data.en_type,
 	   "services_tbl") != 0 ||
       result->objects.objects_val[0].zo_data.objdata_u.en_data.en_cols.en_cols_len < 4)
-    return -1;
+    return 0;
 
   memset (p, '\0', room_left);
 
@@ -78,7 +78,7 @@ _nss_nisplus_parse_servent (nis_result *result, struct servent *serv,
   if (NISENTRYLEN (0, 0, result) + 1 > room_left)
     {
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
   strncpy (p, NISENTRYVAL (0, 0, result), NISENTRYLEN (0, 0, result));
   room_left -= (NISENTRYLEN (0, 0, result) + 1);
@@ -86,7 +86,7 @@ _nss_nisplus_parse_servent (nis_result *result, struct servent *serv,
   if (NISENTRYLEN (0, 3, result) + 1 > room_left)
     {
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
   strcat (p, "\t");
   strncat (p, NISENTRYVAL (0, 3, result), NISENTRYLEN (0, 3, result));
@@ -94,7 +94,7 @@ _nss_nisplus_parse_servent (nis_result *result, struct servent *serv,
   if (NISENTRYLEN (0, 2, result) + 1 > room_left)
     {
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
   strcat (p, "/");
   strncat (p, NISENTRYVAL (0, 2, result), NISENTRYLEN (0, 2, result));
@@ -105,7 +105,7 @@ _nss_nisplus_parse_servent (nis_result *result, struct servent *serv,
       if (NISENTRYLEN (i, 1, result) + 1 > room_left)
 	{
 	  __set_errno (ERANGE);
-	  return -1;
+	  return 0;
 	}
       strcat (p, " ");
       strcat (p, NISENTRYVAL (i, 1, result));
diff --git a/nis/nss_nisplus/nisplus-spwd.c b/nis/nss_nisplus/nisplus-spwd.c
index ec4b5b3340..3400e28da7 100644
--- a/nis/nss_nisplus/nisplus-spwd.c
+++ b/nis/nss_nisplus/nisplus-spwd.c
@@ -38,7 +38,7 @@ static nis_name *names = NULL;
 #define NISENTRYLEN(idx,col,res) \
         ((res)->objects.objects_val[(idx)].zo_data.objdata_u.en_data.en_cols.en_cols_val[(col)].ec_value.ec_value_len)
 
-static int
+int
 _nss_nisplus_parse_spent (nis_result *result, struct spwd *sp,
 			  char *buffer, size_t buflen)
 {
@@ -47,7 +47,7 @@ _nss_nisplus_parse_spent (nis_result *result, struct spwd *sp,
   char *line, *cp;
 
   if (result == NULL)
-    return -1;
+    return 0;
 
   if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) ||
       result->objects.objects_len != 1 ||
@@ -55,14 +55,14 @@ _nss_nisplus_parse_spent (nis_result *result, struct spwd *sp,
       strcmp (result->objects.objects_val[0].zo_data.objdata_u.en_data.en_type,
 	      "passwd_tbl") != 0 ||
       result->objects.objects_val[0].zo_data.objdata_u.en_data.en_cols.en_cols_len < 8)
-    return -1;
+    return 0;
 
   if (NISENTRYLEN(0, 0, result) >= room_left)
     {
       /* The line is too long for our buffer.  */
     no_more_room:
       __set_errno (ERANGE);
-      return -1;
+      return 0;
     }
 
   strncpy (first_unused, NISENTRYVAL (0, 0, result),
diff --git a/nis/ypclnt.c b/nis/ypclnt.c
index e4667f79a6..01bf8bc6b0 100644
--- a/nis/ypclnt.c
+++ b/nis/ypclnt.c
@@ -21,6 +21,7 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <libc-lock.h>
+#include <rpc/rpc.h>
 #include <rpcsvc/yp.h>
 #include <rpcsvc/ypclnt.h>
 #include <rpcsvc/ypupd.h>
@@ -781,7 +782,7 @@ int
 yp_update (char *domain, char *map, unsigned ypop,
 	   char *key, int keylen, char *data, int datalen)
 {
-#if 0
+#if defined (HAVE_SECURE_RPC)
   union
     {
       ypupdate_args update_args;
@@ -847,8 +848,8 @@ yp_update (char *domain, char *map, unsigned ypop,
     clnt->cl_auth = authunix_create_default ();
 
 again:
-  r = clnt_call (clnt, ypop, xdr_argument, &args,
-		 (xdrproc_t) xdr_u_int, &res, TIMEOUT);
+  r = clnt_call (clnt, ypop, xdr_argument, (caddr_t) &args,
+		 (xdrproc_t) xdr_u_int, (caddr_t) &res, TIMEOUT);
 
   if (r == RPC_AUTHERROR)
     {
diff --git a/po/fr.po b/po/fr.po
index b255cb2409..8f20403658 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -4,9 +4,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: GNU libc 1.98\n"
-"POT-Creation-Date: 1996-12-03 13:50+0100\n"
-"PO-Revision-Date: 1997-01-24 20:13 -0500\n"
+"Project-Id-Version: GNU libc 2.0.3\n"
+"POT-Creation-Date: 1997-03-30 19:08+0200\n"
+"PO-Revision-Date: 1997-04-02 23:02 -0500\n"
 "Last-Translator: Michel Robitaille <robitail@IRO.UMontreal.CA>\n"
 "Language-Team: French <fr@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -33,31 +33,31 @@ msgstr "       rpcinfo [ -n no_de_port ] -t hôte no_program [ no_version ]\n"
 msgid "   program vers proto   port\n"
 msgstr "   program no_version protocole  no_port\n"
 
-#: time/zic.c:424
+#: time/zic.c:419
 #, c-format
 msgid " (rule from \"%s\", line %d)"
 msgstr " (règles de \"%s\", ligne %d)"
 
-#: locale/programs/ld-collate.c:360 locale/programs/ld-ctype.c:1234
+#: locale/programs/ld-collate.c:363 locale/programs/ld-ctype.c:1242
 msgid " done\n"
 msgstr " complété.\n"
 
-#: time/zic.c:421
+#: time/zic.c:416
 #, c-format
 msgid "\"%s\", line %d: %s"
 msgstr "\"%s\", ligne %d: %s."
 
-#: time/zic.c:945
+#: time/zic.c:943
 #, c-format
 msgid "\"Zone %s\" line and -l option are mutually exclusive"
 msgstr "La ligne \"Zone %s\" et l'option -l sont mutuellement exclusives."
 
-#: time/zic.c:953
+#: time/zic.c:951
 #, c-format
 msgid "\"Zone %s\" line and -p option are mutually exclusive"
 msgstr "La ligne \"Zone %s\" et l'option -p sont mutuellement exclusives."
 
-#: time/zic.c:758
+#: time/zic.c:754
 #, c-format
 msgid "%s in ruleless zone"
 msgstr "%s est dans une zone sans règle."
@@ -77,7 +77,7 @@ msgstr "%s%s%s:%u: %s%s erreur imprévue: %s.\n"
 msgid "%s%sUnknown signal %d\n"
 msgstr "%s%ssignal inconnu %d.\n"
 
-#: time/zic.c:2139
+#: time/zic.c:2172
 #, c-format
 msgid "%s: %d did not sign extend correctly\n"
 msgstr "%s: %d n'a pas fait correctement l'expansion de la valeur signée.\n"
@@ -87,139 +87,144 @@ msgstr "%s: %d n'a pas fait correctement l'expansion de la valeur signée.\n"
 msgid "%s: <mb_cur_max> must be greater than <mb_cur_min>\n"
 msgstr "%s: <mb_cur_max> doit être plus grande que <mb_cur_min>.\n"
 
-#: time/zic.c:1430
+#: time/zic.c:1443
 #, c-format
 msgid "%s: Can't create %s: %s\n"
 msgstr "%s: ne peut créer %s: %s.\n"
 
-#: time/zic.c:2118
+#: time/zic.c:2150
 #, c-format
 msgid "%s: Can't create directory %s: %s\n"
 msgstr "%s: ne peut créer le répertoire %s: %s.\n"
 
-#: time/zic.c:612
+#: time/zic.c:608
 #, c-format
 msgid "%s: Can't link from %s to %s: %s\n"
 msgstr "%s: ne peut établir un lien entre %s et %s: %s.\n"
 
-#: time/zic.c:783
+#: time/zic.c:780
 #, c-format
 msgid "%s: Can't open %s: %s\n"
 msgstr "%s: ne peut ouvrir %s: %s.\n"
 
-#: time/zic.c:851
+#: time/zic.c:1433
+#, c-format
+msgid "%s: Can't remove %s: %s\n"
+msgstr "%s: ne peut enlever %s: %s.\n"
+
+#: time/zic.c:849
 #, c-format
 msgid "%s: Error closing %s: %s\n"
 msgstr "%s: erreur lors de la fermeture de %s: %s.\n"
 
-#: time/zic.c:845
+#: time/zic.c:842
 #, c-format
 msgid "%s: Error reading %s\n"
 msgstr "%s: erreur de lecture de %s.\n"
 
-#: time/zic.c:1494
+#: time/zic.c:1507
 #, c-format
 msgid "%s: Error writing %s\n"
 msgstr "%s: erreur d'écriture de %s.\n"
 
-#: time/zdump.c:258
+#: time/zdump.c:266
 #, c-format
 msgid "%s: Error writing standard output "
 msgstr "%s: erreur d'écriture sur la sortie standard."
 
-#: time/zic.c:830
+#: time/zic.c:827
 #, c-format
 msgid "%s: Leap line in non leap seconds file %s\n"
 msgstr ""
 "%s: ligne de type `Leap' dans un fichier qui n'a pas\n"
 "de délai en secondes %s.\n"
 
-#: time/zic.c:362
+#: time/zic.c:357
 #, c-format
 msgid "%s: Memory exhausted: %s\n"
 msgstr "%s: mémoire épuisée: %s.\n"
 
-#: time/zic.c:527
+#: time/zic.c:522
 #, c-format
 msgid "%s: More than one -L option specified\n"
 msgstr "%s: option -L spécifiée plus d'une fois.\n"
 
-#: time/zic.c:487
+#: time/zic.c:482
 #, c-format
 msgid "%s: More than one -d option specified\n"
 msgstr "%s: option -d spécifiée plus d'une fois.\n"
 
-#: time/zic.c:497
+#: time/zic.c:492
 #, c-format
 msgid "%s: More than one -l option specified\n"
 msgstr "%s: option -l spécifiée plus d'une fois.\n"
 
-#: time/zic.c:507
+#: time/zic.c:502
 #, c-format
 msgid "%s: More than one -p option specified\n"
 msgstr "%s: option -p spécifiée plus d'une fois.\n"
 
-#: time/zic.c:517
+#: time/zic.c:512
 #, c-format
 msgid "%s: More than one -y option specified\n"
 msgstr "%s: option -y spécifiée plus d'une fois.\n"
 
-#: time/zic.c:1845
+#: time/zic.c:1872
 #, c-format
 msgid "%s: command was '%s', result was %d\n"
 msgstr "%s: la commande était '%s', le résultat était %d.\n"
 
-#: locale/programs/charmap.c:593 locale/programs/locfile.c:878
+#: locale/programs/charmap.c:593 locale/programs/locfile.c:900
 #, c-format
 msgid "%s: error in state machine"
 msgstr "%s: erreur de l'automate à états finis."
 
-#: posix/getopt.c:687
+#: posix/getopt.c:783
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: option illégale -- %c.\n"
 
-#: posix/getopt.c:690
+#: posix/getopt.c:786
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: option invalide -- %c.\n"
 
-#: posix/getopt.c:611
+#: posix/getopt.c:707
 #, c-format
 msgid "%s: option `%c%s' doesn't allow an argument\n"
 msgstr "%s: l'option `%c%s' ne permet pas de paramètre.\n"
 
-#: posix/getopt.c:582
+#: posix/getopt.c:678
 #, c-format
 msgid "%s: option `%s' is ambiguous\n"
 msgstr "%s: l'option `%s' est ambiguë.\n"
 
-#: posix/getopt.c:628 posix/getopt.c:801
+#: posix/getopt.c:724 posix/getopt.c:897
 #, c-format
 msgid "%s: option `%s' requires an argument\n"
 msgstr "%s: l'option `%s' requiert un paramètre.\n"
 
-#: posix/getopt.c:606
+#: posix/getopt.c:702
 #, c-format
 msgid "%s: option `--%s' doesn't allow an argument\n"
 msgstr "%s: l'option `--%s' ne permet pas de paramètre.\n"
 
-#: posix/getopt.c:786
+#: posix/getopt.c:881
 #, c-format
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr "%s: l'option `-W %s' ne permet pas de paramètre.\n"
 
-#: posix/getopt.c:767
+#: posix/getopt.c:863
 #, c-format
 msgid "%s: option `-W %s' is ambiguous\n"
 msgstr "%s: l'option `-W %s' est ambiguë.\n"
 
-#: posix/getopt.c:721 posix/getopt.c:850
+#: posix/getopt.c:816 posix/getopt.c:946
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: l'option requiert un paramètre -- %c.\n"
 
-#: time/zic.c:837 time/zic.c:1248 time/zic.c:1268
+#: time/zic.c:834 time/zic.c:1246 time/zic.c:1266
 #, c-format
 msgid "%s: panic: Invalid l_value %d\n"
 msgstr "%s: panique: valeur %d de type `l_value' invalide.\n"
@@ -229,17 +234,17 @@ msgstr "%s: panique: valeur %d de type `l_value' invalide.\n"
 msgid "%s: premature end of file"
 msgstr "%s: fin prématurée de fichier."
 
-#: posix/getopt.c:661
+#: posix/getopt.c:757
 #, c-format
 msgid "%s: unrecognized option `%c%s'\n"
 msgstr "%s: option non reconnue `%c%s'.\n"
 
-#: posix/getopt.c:657
+#: posix/getopt.c:753
 #, c-format
 msgid "%s: unrecognized option `--%s'\n"
 msgstr "%s: option non reconnue `--%s'.\n"
 
-#: time/zic.c:446
+#: time/zic.c:441
 #, c-format
 msgid ""
 "%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d "
@@ -250,7 +255,7 @@ msgstr ""
 "\t[ -d répertoire ]\n"
 "\t[ -L secondes_écoulées ] [ -y type_année ] [ fichier ... ]\n"
 
-#: time/zdump.c:165
+#: time/zdump.c:174
 #, c-format
 msgid "%s: usage is %s [ -v ] [ -c cutoff ] zonename ...\n"
 msgstr "%s: usage: %s [ -v ] [ -c seuil ] nom_de_zone ...\n"
@@ -264,7 +269,7 @@ msgstr "(erreur inconnue d'authentification - %d)"
 msgid "(unknown)"
 msgstr "(inconnu)"
 
-#: catgets/gencat.c:253
+#: catgets/gencat.c:254
 msgid "*standard input*"
 msgstr "*entrée standard*"
 
@@ -272,19 +277,19 @@ msgstr "*entrée standard*"
 msgid ".lib section in a.out corrupted"
 msgstr "La section .lib dans a.out est corrompue."
 
-#: inet/rcmd.c:358
+#: inet/rcmd.c:363
 msgid ".rhosts fstat failed"
 msgstr "Échec d'évaluation fstat() de .rhosts."
 
-#: inet/rcmd.c:354
+#: inet/rcmd.c:359
 msgid ".rhosts lstat failed"
 msgstr "Échec d'évaluation lstat() de .rhosts."
 
-#: inet/rcmd.c:356
+#: inet/rcmd.c:361
 msgid ".rhosts not regular file"
 msgstr ".rhosts n'est pas un fichier régulier."
 
-#: inet/rcmd.c:362
+#: inet/rcmd.c:367
 msgid ".rhosts writeable by other than owner"
 msgstr ".rhosts accessible en écriture par d'autres que le propriétaire."
 
@@ -297,12 +302,12 @@ msgstr "; version basse = %lu, version haute = %lu"
 msgid "; why = "
 msgstr "; pourquoi = "
 
-#: locale/programs/ld-ctype.c:326
+#: locale/programs/ld-ctype.c:331
 #, c-format
 msgid "<SP> character must not be in class `%s'"
 msgstr "Le caractère <SP> ne doit pas être dans la classe `%s'."
 
-#: locale/programs/ld-ctype.c:317
+#: locale/programs/ld-ctype.c:321
 #, c-format
 msgid "<SP> character not in class `%s'"
 msgstr "Le caractère <SP> n'est pas dans la classe `%s'."
@@ -314,6 +319,10 @@ msgstr "Le caractère <SP> n'est pas dans la classe `%s'."
 msgid "?"
 msgstr "?"
 
+#: sysdeps/unix/sysv/linux/siglist.h:27
+msgid "Aborted"
+msgstr "Abandon"
+
 #: stdio-common/../sysdeps/gnu/errlist.c:762
 msgid "Accessing a corrupted shared library"
 msgstr "Accès d'une librairie partagée corrompue."
@@ -333,6 +342,8 @@ msgstr "Famille d'adresses non supportée par le protocole."
 msgid "Advertise error"
 msgstr "Erreur d'annonce."
 
+#: stdio-common/../sysdeps/unix/siglist.c:43
+#: sysdeps/unix/sysv/linux/siglist.h:33
 msgid "Alarm clock"
 msgstr "Minuterie d'alerte"
 
@@ -378,6 +389,11 @@ msgstr "Mauvais format du fichier de fontes."
 msgid "Bad message"
 msgstr "Message invalide."
 
+#: stdio-common/../sysdeps/unix/siglist.c:41
+#: sysdeps/unix/sysv/linux/siglist.h:56
+msgid "Bad system call"
+msgstr "Appel système erroné."
+
 #. 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.
@@ -385,7 +401,7 @@ msgstr "Message invalide."
 msgid "Block device required"
 msgstr "Bloc de périphérique requis."
 
-#: sunrpc/pmap_rmt.c:337
+#: sunrpc/pmap_rmt.c:338
 msgid "Broadcast select problem"
 msgstr "Problème de sélection durant la diffusion."
 
@@ -395,12 +411,17 @@ msgstr "Problème de sélection durant la diffusion."
 #. TRANS or blocked.  Thus, your program will never actually see @code{EPIPE}
 #. TRANS unless it has handled or blocked @code{SIGPIPE}.
 #: stdio-common/../sysdeps/gnu/errlist.c:222
+#: stdio-common/../sysdeps/unix/siglist.c:42
+#: sysdeps/unix/sysv/linux/siglist.h:32
 msgid "Broken pipe"
 msgstr "Relais brisé (pipe)"
 
+#: stdio-common/../sysdeps/unix/siglist.c:39
+#: sysdeps/unix/sysv/linux/siglist.h:30
 msgid "Bus error"
 msgstr "Erreur du BUS."
 
+#: sysdeps/unix/sysv/linux/siglist.h:43
 msgid "CPU time limit exceeded"
 msgstr "Temps limite expiré."
 
@@ -408,19 +429,19 @@ msgstr "Temps limite expiré."
 msgid "Can not access a needed shared library"
 msgstr "Ne peut accéder à la librairie partagée demandée."
 
-#: nis/ypclnt.c:637
+#: nis/ypclnt.c:695
 msgid "Can't bind to server which serves this domain"
 msgstr "Ne peut établir un lien avec le serveur qui dessert ce domaine."
 
-#: nis/ypclnt.c:649
+#: nis/ypclnt.c:707
 msgid "Can't communicate with portmapper"
 msgstr "Ne peut communiquer avec le convertisseur de ports."
 
-#: nis/ypclnt.c:651
+#: nis/ypclnt.c:709
 msgid "Can't communicate with ypbind"
 msgstr "Ne peut communiquer par ypbind."
 
-#: nis/ypclnt.c:653
+#: nis/ypclnt.c:711
 msgid "Can't communicate with ypserv"
 msgstr "Ne peut communiquer par ypserv."
 
@@ -445,7 +466,7 @@ msgstr "Ne peut créer un socket pour une diffusion de type rpc."
 msgid "Cannot exec a shared library directly"
 msgstr "Ne peut exécuter une librairie partagée directement."
 
-#: sunrpc/pmap_rmt.c:349
+#: sunrpc/pmap_rmt.c:350
 msgid "Cannot receive reply to broadcast"
 msgstr "Ne peut recevoir l'accusé réception à la requête faite par diffusion."
 
@@ -470,6 +491,8 @@ msgstr "Ne peut initialiser l'option `SO_BROADCAST' de socket."
 msgid "Channel number out of range"
 msgstr "Numéro de canal en dehors des limites."
 
+#: stdio-common/../sysdeps/unix/siglist.c:49
+#: sysdeps/unix/sysv/linux/siglist.h:39
 msgid "Child exited"
 msgstr "Le processus `enfant' a terminé."
 
@@ -486,13 +509,13 @@ msgstr "Erreur de communication lors de la transmission."
 msgid "Computer bought the farm"
 msgstr "Allez à la maison et buvez un verre de lait."
 
-#: locale/programs/ld-ctype.c:1197
+#: locale/programs/ld-ctype.c:1204
 msgid "Computing table size for character classes might take a while..."
 msgstr ""
 "Le calcul de la taille de la table des classes de caractères\n"
 "peut prendre un certain temps..."
 
-#: locale/programs/ld-collate.c:327
+#: locale/programs/ld-collate.c:329
 msgid "Computing table size for collation information might take a while..."
 msgstr ""
 "Le calcul de la taille de la table pour le fusionnement des informations\n"
@@ -517,11 +540,13 @@ msgstr "Connexion ré-initialisée par le correspondant."
 msgid "Connection timed out"
 msgstr "Connexion terminée par expiration du délai d'inactivité."
 
+#: stdio-common/../sysdeps/unix/siglist.c:48
+#: sysdeps/unix/sysv/linux/siglist.h:38
 msgid "Continued"
 msgstr "Poursuite."
 
 #: catgets/gencat.c:169 db/makedb.c:120 locale/programs/locale.c:187
-#: locale/programs/localedef.c:177
+#: locale/programs/localedef.c:180
 #, c-format
 msgid ""
 "Copyright (C) %s Free Software Foundation, Inc.\n"
@@ -533,7 +558,11 @@ msgstr ""
 "reproduction. AUCUNE garantie n'est donnée; tant pour des raisons\n"
 "COMMERÇIALES que pour RÉPONDRE À UN BESOIN PARTICULIER.\n"
 
-#: nis/ypclnt.c:663
+#: stdio-common/../sysdeps/unix/siglist.c:53
+msgid "Cputime limit exceeded"
+msgstr "Temps d'exécution CPU limite expiré."
+
+#: nis/ypclnt.c:721
 msgid "Database is busy"
 msgstr "La base de données est occupée."
 
@@ -575,10 +604,15 @@ msgstr "Le répertoire n'est pas vide."
 msgid "Disc quota exceeded"
 msgstr "Débordement du quota du disque."
 
-#: nis/ypclnt.c:709
+#: nis/ypclnt.c:767
 msgid "Domain not bound"
 msgstr "Le domaine n'est fixé."
 
+#: stdio-common/../sysdeps/unix/siglist.c:36
+#: sysdeps/unix/sysv/linux/siglist.h:53
+msgid "EMT trap"
+msgstr "Trappe EMT."
+
 #: sunrpc/clnt_perr.c:254
 #, c-format
 msgid "Error %d"
@@ -602,7 +636,7 @@ msgstr "L'échangeur est plein."
 msgid "Exec format error"
 msgstr "Erreur de format pour exec()."
 
-#: locale/programs/localedef.c:213
+#: locale/programs/localedef.c:216
 msgid "FATAL: system does not define `_POSIX2_LOCALEDEF'"
 msgstr "ERREUR FATALE: le système ne peut définir `_POSIX2_LOCALEDEF'"
 
@@ -631,6 +665,7 @@ msgstr "Erreur de verrou bloquant l'accès au fichier"
 msgid "File name too long"
 msgstr "Nom de fichier trop long."
 
+#: sysdeps/unix/sysv/linux/siglist.h:44
 msgid "File size limit exceeded"
 msgstr "Débordement de la taille permise pour un fichier."
 
@@ -639,6 +674,12 @@ msgstr "Débordement de la taille permise pour un fichier."
 msgid "File too large"
 msgstr "Fichier trop gros."
 
+#: stdio-common/../sysdeps/unix/siglist.c:54
+msgid "Filesize limit exceeded"
+msgstr "Taille limite de fichier débordée."
+
+#: stdio-common/../sysdeps/unix/siglist.c:37
+#: sysdeps/unix/sysv/linux/siglist.h:28
 msgid "Floating point exception"
 msgstr "Exception en point flottant."
 
@@ -654,6 +695,8 @@ msgstr "Fonction non implantée."
 msgid "Gratuitous error"
 msgstr "Erreur gratuite."
 
+#: stdio-common/../sysdeps/unix/siglist.c:30
+#: sysdeps/unix/sysv/linux/siglist.h:22
 msgid "Hangup"
 msgstr "Fin de la connexion (raccroché)."
 
@@ -666,9 +709,12 @@ msgstr "L'hôte cible est arrêté ou en panne."
 msgid "Host name lookup failure"
 msgstr "Erreur de repérage du nom de l'hôte cible."
 
+#: stdio-common/../sysdeps/unix/siglist.c:52
+#: sysdeps/unix/sysv/linux/siglist.h:42
 msgid "I/O possible"
 msgstr "E/S possible."
 
+#: stdio-common/../sysdeps/unix/siglist.c:35
 msgid "IOT trap"
 msgstr "Trappe IOT."
 
@@ -676,9 +722,14 @@ msgstr "Trappe IOT."
 msgid "Identifier removed"
 msgstr "Identificateur éliminé."
 
+#: sysdeps/unix/sysv/linux/siglist.h:25
 msgid "Illegal Instruction"
 msgstr "Instruction illégale."
 
+#: stdio-common/../sysdeps/unix/siglist.c:33
+msgid "Illegal instruction"
+msgstr "Instruction illégale."
+
 #. TRANS Invalid seek operation (such as on a pipe).
 #: stdio-common/../sysdeps/gnu/errlist.c:201
 msgid "Illegal seek"
@@ -709,23 +760,29 @@ msgstr "Ioctl() inappropré pour un périphérique."
 msgid "Inappropriate operation for background process"
 msgstr "Opération inappropriée pour un processus d'arrière-plan."
 
+#: sysdeps/unix/sysv/linux/siglist.h:62
+msgid "Information request"
+msgstr "Requête d'information."
+
 #. TRANS Input/output error; usually used for physical read or write errors.
 #: stdio-common/../sysdeps/gnu/errlist.c:40
 msgid "Input/output error"
 msgstr "Erreur d'entrée/sortie."
 
-#: nis/ypclnt.c:643
+#: nis/ypclnt.c:701
 msgid "Internal NIS error"
 msgstr "Erreur interne de NIS."
 
-#: nis/ypclnt.c:707
+#: nis/ypclnt.c:765
 msgid "Internal ypbind error"
 msgstr "Erreur interne de ypbind."
 
+#: stdio-common/../sysdeps/unix/siglist.c:31
+#: sysdeps/unix/sysv/linux/siglist.h:23
 msgid "Interrupt"
 msgstr "Interruption."
 
-#. TRANS Interrupted function call; an asynchronous signal occured and prevented
+#. TRANS Interrupted function call; an asynchronous signal occurred and prevented
 #. TRANS completion of the call.  When this happens, you should try the call
 #. TRANS again.
 #. TRANS
@@ -746,11 +803,11 @@ msgstr "Appel système interrompu, il aurait dû être relancé."
 msgid "Invalid argument"
 msgstr "Paramètre invalide."
 
-#: posix/regex.c:946
+#: posix/regex.c:960
 msgid "Invalid back reference"
 msgstr "Référence arrière invalide."
 
-#: posix/regex.c:944
+#: posix/regex.c:958
 msgid "Invalid character class name"
 msgstr "Nom de classe de caractères invalide."
 
@@ -762,11 +819,11 @@ msgstr "Identité du client invalide."
 msgid "Invalid client verifier"
 msgstr "Vérificateur du client invalide."
 
-#: posix/regex.c:943
+#: posix/regex.c:957
 msgid "Invalid collation character"
 msgstr "Caractère de fusionnement invalide."
 
-#: posix/regex.c:950
+#: posix/regex.c:964
 msgid "Invalid content of \\{\\}"
 msgstr "Contenu invalide de \\{\\}"
 
@@ -787,15 +844,15 @@ msgstr "Échange invalide."
 msgid "Invalid or incomplete multibyte or wide character"
 msgstr "Chaîne multi-octets ou étendue de caractères invalide ou incomplète."
 
-#: posix/regex.c:953
+#: posix/regex.c:967
 msgid "Invalid preceding regular expression"
 msgstr "Expression régulière précédente invalide."
 
-#: posix/regex.c:951
+#: posix/regex.c:965
 msgid "Invalid range end"
 msgstr "Fin d'intervalle invalide."
 
-#: posix/regex.c:942
+#: posix/regex.c:956
 msgid "Invalid regular expression"
 msgstr "Expression régulière invalide."
 
@@ -825,6 +882,8 @@ msgstr "est un répertoire."
 msgid "Is a named type file"
 msgstr "est un type de fichier nommé (named)."
 
+#: stdio-common/../sysdeps/unix/siglist.c:38
+#: sysdeps/unix/sysv/linux/siglist.h:29
 msgid "Killed"
 msgstr "Processus arrêté."
 
@@ -852,11 +911,11 @@ msgstr "Le lien a été endommagé."
 msgid "Link number out of range"
 msgstr "Numéro du lien hors intervalle."
 
-#: nis/ypclnt.c:655
+#: nis/ypclnt.c:713
 msgid "Local domain name not set"
 msgstr "Le nom du domaine local n'est pas initialisé."
 
-#: nis/ypclnt.c:645
+#: nis/ypclnt.c:703
 msgid "Local resource allocation failure"
 msgstr "Échec d'allocation de ressources locales."
 
@@ -864,7 +923,7 @@ msgstr "Échec d'allocation de ressources locales."
 msgid "Machine is not on the network"
 msgstr "La machine cible n'est pas sur le réseau."
 
-#: posix/regex.c:952
+#: posix/regex.c:966
 msgid "Memory exhausted"
 msgstr "Mémoire épuisée."
 
@@ -879,11 +938,13 @@ msgstr "Message trop long."
 msgid "Multihop attempted"
 msgstr "Connexion par liens par noeuds multiples de relais tentée."
 
-#: nis/ypclnt.c:659
+#: nis/ypclnt.c:717
 msgid "NIS client/server version mismatch - can't supply service"
-msgstr "Non concordance de la version client/serveur NIS - ne peut fournir le service."
+msgstr ""
+"Non concordance de la version client/serveur NIS - ne peut fournir le "
+"service."
 
-#: nis/ypclnt.c:657
+#: nis/ypclnt.c:715
 msgid "NIS map data base is bad"
 msgstr "La table de la base de données NIS est corrompue."
 
@@ -955,7 +1016,7 @@ msgstr "Aucune donnée disponible."
 msgid "No locks available"
 msgstr "Aucun verrou disponible."
 
-#: posix/regex.c:941
+#: posix/regex.c:955
 msgid "No match"
 msgstr "Pas de concordance."
 
@@ -963,11 +1024,11 @@ msgstr "Pas de concordance."
 msgid "No message of desired type"
 msgstr "Aucun message du type désiré."
 
-#: nis/ypclnt.c:647
+#: nis/ypclnt.c:705
 msgid "No more records in map database"
 msgstr "Aucun autre enregistrement dans la table de la base de données."
 
-#: posix/regex.c:5204
+#: posix/regex.c:5324
 msgid "No previous regular expression"
 msgstr "Aucune expression régulière ne précède."
 
@@ -993,11 +1054,11 @@ msgstr "Aucun espace disponible sur le périphérique."
 msgid "No such file or directory"
 msgstr "Aucun fichier ou répertoire de ce type."
 
-#: nis/ypclnt.c:641
+#: nis/ypclnt.c:699
 msgid "No such key in map"
 msgstr "Cette clé n'est pas dans la table."
 
-#: nis/ypclnt.c:639
+#: nis/ypclnt.c:697
 msgid "No such map in server's domain"
 msgstr "Cette table n'est pas dans le domaine du serveur."
 
@@ -1035,7 +1096,7 @@ msgstr "Le résultat numérique est en dehors de l'intervalle."
 msgid "Object is remote"
 msgstr "L'objet est télé-accessible."
 
-#: time/zic.c:1939
+#: time/zic.c:1966
 msgid "Odd number of quotation marks"
 msgstr "Nombre impair de caractères apostrophe."
 
@@ -1097,17 +1158,20 @@ msgid "Package not installed"
 msgstr "Le package n'est pas installé."
 
 #. TRANS Permission denied; the file permissions do not allow the attempted operation.
-#: nis/ypclnt.c:661 stdio-common/../sysdeps/gnu/errlist.c:96
+#: nis/ypclnt.c:719 stdio-common/../sysdeps/gnu/errlist.c:96
 msgid "Permission denied"
 msgstr "Permission non accordée."
 
+#: sysdeps/unix/sysv/linux/siglist.h:64
 msgid "Power failure"
 msgstr "Panne d'alimentation."
 
-#: posix/regex.c:954
+#: posix/regex.c:968
 msgid "Premature end of regular expression"
 msgstr "Fin prématurée de l'expression régulière."
 
+#: stdio-common/../sysdeps/unix/siglist.c:56
+#: sysdeps/unix/sysv/linux/siglist.h:46
 msgid "Profiling timer expired"
 msgstr "Expiration de la minuterie durant l'établissement du profile."
 
@@ -1142,6 +1206,8 @@ msgstr "Protocole non supporté."
 msgid "Protocol wrong type for socket"
 msgstr "Mauvais type pour un socket de protocole."
 
+#: stdio-common/../sysdeps/unix/siglist.c:32
+#: sysdeps/unix/sysv/linux/siglist.h:24
 msgid "Quit"
 msgstr "Quitter."
 
@@ -1154,7 +1220,7 @@ msgstr "Erreur spécifique à RFS."
 msgid "RPC bad procedure for program"
 msgstr "Mauvaise procédure RPC du programme."
 
-#: nis/ypclnt.c:635
+#: nis/ypclnt.c:693
 msgid "RPC failure on NIS operation"
 msgstr "Échec RPC durant l'opération NIS."
 
@@ -1263,7 +1329,7 @@ msgstr "Le RTLD_NEXT utilisé dans le code n'est pas chargé dynamiquement."
 msgid "Read-only file system"
 msgstr "Système de fichiers accessible en lecture seulement."
 
-#: posix/regex.c:955
+#: posix/regex.c:969
 msgid "Regular expression too big"
 msgstr "Expression régulière trop grosse."
 
@@ -1281,11 +1347,13 @@ msgstr ""
 "Retirer le mot de passe ou rendre les fichiers illisibles par les autres."
 
 #: catgets/gencat.c:224 db/makedb.c:227 locale/programs/locale.c:257
-#: locale/programs/localedef.c:408
-msgid "Report bugs to <bug-glibc@prep.ai.mit.edu>.\n"
-msgstr "Rapporter toutes anomalies à l'adresse: <bug-glibc@prep.ai.mit.edu>.\n"
+#: locale/programs/localedef.c:412
+msgid "Report bugs using the `glibcbug' script to <bugs@gnu.ai.mit.edu>.\n"
+msgstr ""
+"Rapporter toutes anomalies via le script `glibcbug' à l'adresse:\n"
+"<bugs@gnu.ai.mit.edu>.\n"
 
-#: nis/ypclnt.c:633
+#: nis/ypclnt.c:691
 msgid "Request arguments bad"
 msgstr "Le paramètre de la requête est invalide."
 
@@ -1305,6 +1373,10 @@ msgstr "Erreur interne du `resolver'."
 msgid "Resource deadlock avoided"
 msgstr "Blocage évité des accès aux ressources."
 
+#: stdio-common/../sysdeps/unix/siglist.c:58
+msgid "Resource lost"
+msgstr "Ressource perdue"
+
 #. 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.
@@ -1338,6 +1410,8 @@ msgstr "Blocage évité des accès aux ressources."
 msgid "Resource temporarily unavailable"
 msgstr "Ressource temporairement non disponible."
 
+#: stdio-common/../sysdeps/unix/siglist.c:40
+#: sysdeps/unix/sysv/linux/siglist.h:31
 msgid "Segmentation fault"
 msgstr "Erreur de segmentation."
 
@@ -1349,6 +1423,10 @@ msgstr "Le serveur a rejeté l'identité."
 msgid "Server rejected verifier"
 msgstr "Le server a rejeté la vérification."
 
+#: stdio-common/../sysdeps/unix/siglist.c:29
+msgid "Signal 0"
+msgstr "Signal 0"
+
 #. TRANS A file that isn't a socket was specified when a socket is required.
 #: stdio-common/../sysdeps/gnu/errlist.c:299
 msgid "Socket operation on non-socket"
@@ -1368,6 +1446,10 @@ msgstr "Le logiciel a provoqué l'abandon de la connexion."
 msgid "Srmount error"
 msgstr "Erreur srmount()."
 
+#: sysdeps/unix/sysv/linux/siglist.h:59
+msgid "Stack fault"
+msgstr "Erreur sur la pile."
+
 #. 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
@@ -1376,15 +1458,23 @@ msgstr "Erreur srmount()."
 msgid "Stale NFS file handle"
 msgstr "Panne d'accès au fichier NFS."
 
+#: stdio-common/../sysdeps/unix/siglist.c:47
+#: sysdeps/unix/sysv/linux/siglist.h:37
 msgid "Stopped"
 msgstr "Arrêté."
 
+#: stdio-common/../sysdeps/unix/siglist.c:46
+#: sysdeps/unix/sysv/linux/siglist.h:36
 msgid "Stopped (signal)"
 msgstr "Signal d'arrêt."
 
+#: stdio-common/../sysdeps/unix/siglist.c:50
+#: sysdeps/unix/sysv/linux/siglist.h:40
 msgid "Stopped (tty input)"
 msgstr "Arrêté (via l'entrée sur tty)."
 
+#: stdio-common/../sysdeps/unix/siglist.c:51
+#: sysdeps/unix/sysv/linux/siglist.h:41
 msgid "Stopped (tty output)"
 msgstr "Arrêté (via la sortie sur tty)."
 
@@ -1396,15 +1486,17 @@ msgstr "Erreur de relais de type streams."
 msgid "Structure needs cleaning"
 msgstr "La structure a besoin d'un nettoyage."
 
-#: nis/ypclnt.c:631 nis/ypclnt.c:705 posix/regex.c:940
+#: nis/ypclnt.c:689 nis/ypclnt.c:763 posix/regex.c:954
 #: stdio-common/../sysdeps/gnu/errlist.c:7
 msgid "Success"
 msgstr "Succès."
 
-#: nis/ypclnt.c:711
+#: nis/ypclnt.c:769
 msgid "System resource allocation failure"
 msgstr "Échec d'allocation de ressources système."
 
+#: stdio-common/../sysdeps/unix/siglist.c:44
+#: sysdeps/unix/sysv/linux/siglist.h:34
 msgid "Terminated"
 msgstr "Complété."
 
@@ -1470,10 +1562,15 @@ msgstr "Trop de références: ne peut segmenter."
 msgid "Too many users"
 msgstr "Trop d'usagers."
 
+#: stdio-common/../sysdeps/unix/siglist.c:34
+msgid "Trace/BPT trap"
+msgstr "Trappe de point d'arrêt lors de trace."
+
+#: sysdeps/unix/sysv/linux/siglist.h:26
 msgid "Trace/breakpoint trap"
 msgstr "Trappe pour point d'arrêt et de trace."
 
-#: posix/regex.c:945
+#: posix/regex.c:959
 msgid "Trailing backslash"
 msgstr "Barre oblique en suffixe."
 
@@ -1499,12 +1596,12 @@ msgid "Transport endpoint is not connected"
 msgstr "Le noeud final de transport n'est pas connecté."
 
 #: catgets/gencat.c:208 db/makedb.c:209 locale/programs/locale.c:241
-#: locale/programs/localedef.c:389
+#: locale/programs/localedef.c:393
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Pour en savoir davantage, faites: `%s --help'.\n"
 
-#: inet/rcmd.c:136
+#: inet/rcmd.c:137
 #, c-format
 msgid "Trying %s...\n"
 msgstr "On tente %s...\n"
@@ -1514,7 +1611,7 @@ msgstr "On tente %s...\n"
 msgid "Unknown .netrc keyword %s"
 msgstr "Mot clé inconnu %s dans .netrc."
 
-#: nis/ypclnt.c:665
+#: nis/ypclnt.c:723
 msgid "Unknown NIS error code"
 msgstr "Code d'erreur NIS inconnu."
 
@@ -1540,27 +1637,27 @@ msgstr "Erreur du serveur inconnu."
 msgid "Unknown signal %d"
 msgstr "Signal inconnu %d"
 
-#: misc/error.c:95
+#: misc/error.c:100
 msgid "Unknown system error"
 msgstr "Erreur système inconnue."
 
-#: nis/ypclnt.c:713
+#: nis/ypclnt.c:771
 msgid "Unknown ypbind error"
 msgstr "Erreur inconnue de ypbind."
 
-#: posix/regex.c:948
+#: posix/regex.c:962
 msgid "Unmatched ( or \\("
 msgstr "Échec du pairage de ( ou de \\("
 
-#: posix/regex.c:956
+#: posix/regex.c:970
 msgid "Unmatched ) or \\)"
 msgstr "Échec du pairage de ) ou de \\)"
 
-#: posix/regex.c:947
+#: posix/regex.c:961
 msgid "Unmatched [ or [^"
 msgstr "Échec du pairage de [ ou de [^"
 
-#: posix/regex.c:949
+#: posix/regex.c:963
 msgid "Unmatched \\{"
 msgstr "Échec du pairage de \\{."
 
@@ -1569,6 +1666,8 @@ msgstr "Échec du pairage de \\{."
 msgid "Unrecognized variable `%s'"
 msgstr "Variable non reconnue `%s'."
 
+#: stdio-common/../sysdeps/unix/siglist.c:45
+#: sysdeps/unix/sysv/linux/siglist.h:35
 msgid "Urgent I/O condition"
 msgstr "Condition d'E/S urgente."
 
@@ -1630,7 +1729,7 @@ msgstr ""
 "  -V, --version        afficher le nom et la version du logiciel\n"
 "Si le FICHIER_D_ENTRÉE est -, la lecture se fait l'entrée standard.\n"
 
-#: locale/programs/localedef.c:393
+#: locale/programs/localedef.c:397
 #, c-format
 msgid ""
 "Usage: %s [OPTION]... name\n"
@@ -1704,9 +1803,13 @@ msgstr "Usage: %s nom_de_variable [chemin_d_accès]\n"
 msgid "Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]\n"
 msgstr "Usage: rpcinfo [ -n no_port ] -u hôte no_prog [ no_version ]\n"
 
+#: stdio-common/../sysdeps/unix/siglist.c:59
+#: sysdeps/unix/sysv/linux/siglist.h:48
 msgid "User defined signal 1"
 msgstr "Signal #1 défini par l'usager."
 
+#: stdio-common/../sysdeps/unix/siglist.c:60
+#: sysdeps/unix/sysv/linux/siglist.h:49
 msgid "User defined signal 2"
 msgstr "Signal #2 défini par l'usager."
 
@@ -1714,36 +1817,40 @@ msgstr "Signal #2 défini par l'usager."
 msgid "Value too large for defined data type"
 msgstr "Valeur trop grande pour le type défini de données."
 
+#: stdio-common/../sysdeps/unix/siglist.c:55
+#: sysdeps/unix/sysv/linux/siglist.h:45
 msgid "Virtual timer expired"
 msgstr "Expiration de la minuterie virtuelle."
 
-#: time/zic.c:1844
+#: time/zic.c:1871
 msgid "Wild result from command execution"
 msgstr "Résultat anarchique résultant de l'exécution de la commande."
 
+#: stdio-common/../sysdeps/unix/siglist.c:57
+#: sysdeps/unix/sysv/linux/siglist.h:47
 msgid "Window changed"
 msgstr "La fenêtre a changée."
 
 #: catgets/gencat.c:174 db/makedb.c:125 locale/programs/locale.c:192
-#: locale/programs/localedef.c:182
+#: locale/programs/localedef.c:185
 #, c-format
 msgid "Written by %s.\n"
 msgstr "Écrits par %s.\n"
 
-#: nis/ypclnt.c:146
+#: nis/ypclnt.c:142
 msgid "YPBINDPROC_DOMAIN: Internal error\n"
 msgstr "YPBINDPROC_DOMAIN: erreur interne.\n"
 
-#: nis/ypclnt.c:150
+#: nis/ypclnt.c:146
 #, c-format
 msgid "YPBINDPROC_DOMAIN: No server for domain %s\n"
 msgstr "YPBINDPROC_DOMAIN: échec d'allocation de ressources %s.\n"
 
-#: nis/ypclnt.c:154
+#: nis/ypclnt.c:150
 msgid "YPBINDPROC_DOMAIN: Resource allocation failure\n"
 msgstr "YPBINDPROC_DOMAIN: échec d'allocation de ressources.\n"
 
-#: nis/ypclnt.c:158
+#: nis/ypclnt.c:154
 msgid "YPBINDPROC_DOMAIN: Unknown error\n"
 msgstr "YPBINDPROC_DOMAIN: erreur inconnue.\n"
 
@@ -1752,32 +1859,32 @@ msgstr "YPBINDPROC_DOMAIN: erreur inconnue.\n"
 msgid "You really blew it this time"
 msgstr "Vous avez vraiment tout gâcher cette fois-ci."
 
-#: time/zic.c:1050
+#: time/zic.c:1048
 msgid "Zone continuation line end time is not after end time of previous line"
 msgstr ""
 "Temps final de la ligne de la zone de continuation est antérieur\n"
 "au temps final de la ligne précédente."
 
-#: locale/programs/charmap.c:397 locale/programs/locfile.c:341
+#: locale/programs/charmap.c:397 locale/programs/locfile.c:363
 #, c-format
 msgid "`%1$s' definition does not end with `END %1$s'"
 msgstr "`%1$s' la définition ne se termine pas par `END %1$s'."
 
-#: locale/programs/ld-monetary.c:358 locale/programs/ld-numeric.c:190
+#: locale/programs/ld-monetary.c:359 locale/programs/ld-numeric.c:190
 #, c-format
 msgid "`-1' must be last entry in `%s' field in `%s' category"
 msgstr "`-1' doit être la dernière entrée du champ `%s' de catégorie `%s'."
 
-#: locale/programs/ld-collate.c:1652
+#: locale/programs/ld-collate.c:1655
 msgid "`...' must only be used in `...' and `UNDEFINED' entries"
 msgstr ""
 "`...' doit être utilisé seulement avec les entrées `...' et  `UNDEFINED'."
 
-#: locale/programs/locfile.c:538
+#: locale/programs/locfile.c:560
 msgid "`from' expected after first argument to `collating-element'"
 msgstr "`from' attendu après le premier paramètre de `collating-element'"
 
-#: locale/programs/ld-collate.c:1109
+#: locale/programs/ld-collate.c:1112
 msgid ""
 "`from' string in collation element declaration contains unknown character"
 msgstr ""
@@ -1789,36 +1896,36 @@ msgstr ""
 msgid "argument to <%s> must be a single character"
 msgstr "Le paramètre de <%s> doit être un caractère simple."
 
-#: locale/programs/locfile.c:215
+#: locale/programs/locfile.c:237
 #, c-format
 msgid "argument to `%s' must be a single character"
 msgstr "Le paramètre de `%s' doit être un caractère simple."
 
-#: sunrpc/auth_unix.c:322
+#: sunrpc/auth_unix.c:323
 msgid "auth_none.c - Fatal marshalling problem"
 msgstr "auth_none.c - problème fatal de mise en ordre."
 
-#: inet/rcmd.c:360
+#: inet/rcmd.c:365
 msgid "bad .rhosts owner"
 msgstr "Mauvais propriétaire du fichier .rhosts."
 
-#: locale/programs/charmap.c:212 locale/programs/locfile.c:209
+#: locale/programs/charmap.c:212 locale/programs/locfile.c:231
 msgid "bad argument"
 msgstr "Mauvais paramètre."
 
-#: time/zic.c:1172
+#: time/zic.c:1170
 msgid "blank FROM field on Link line"
 msgstr "Champ `FROM' vide dans la ligne de type `Link'."
 
-#: time/zic.c:1176
+#: time/zic.c:1174
 msgid "blank TO field on Link line"
 msgstr "Champ `TO' vide dans la ligne de type `Link'."
 
-#: malloc/mcheck.c:189
+#: malloc/mcheck.c:191
 msgid "block freed twice"
 msgstr "Bloc libéré deux fois."
 
-#: malloc/mcheck.c:192
+#: malloc/mcheck.c:194
 msgid "bogus mcheck_status, library is buggy"
 msgstr "Statut de `mcheck_status' erroné, la librarie est erronée."
 
@@ -1834,32 +1941,32 @@ msgstr "Diffusion: ioctl (a obtenu la valeur des fanions de l'interface)"
 msgid "cache_set: victim not found"
 msgstr "cache_set: victime non repérée."
 
-#: time/zic.c:1685
-msgid "can't determine time zone abbrevation to use just after until time"
+#: time/zic.c:1698
+msgid "can't determine time zone abbreviation to use just after until time"
 msgstr ""
-"Ne peut déterminer le nom abrégé du fuseau horaire à utiliser\n"
-"pour rencontrer la condition `jusqu'au temps voulue'."
+"Ne peut déterminer l'abréviation du fuseau horaire à utiliser\n"
+"juste après le champ date."
 
 #: sunrpc/svc_simple.c:64
 #, c-format
 msgid "can't reassign procedure number %d\n"
 msgstr "Ne peut réassigner le numéro de procédure %d.\n"
 
-#: locale/programs/localedef.c:287
+#: locale/programs/localedef.c:291
 #, c-format
 msgid "cannot `stat' locale file `%s'"
 msgstr "Ne peut effectuer l'évaluation `stat' du fichier local `%s'."
 
-#: locale/programs/ld-collate.c:1314
+#: locale/programs/ld-collate.c:1317
 #, c-format
 msgid "cannot insert collation element `%.*s'"
 msgstr "Ne peut insérer l'élément de fusionnement `%.*s'."
 
-#: locale/programs/ld-collate.c:1493 locale/programs/ld-collate.c:1498
+#: locale/programs/ld-collate.c:1496 locale/programs/ld-collate.c:1501
 msgid "cannot insert into result table"
 msgstr "Ne peut effectuer une insertion dans la table des résultats."
 
-#: locale/programs/ld-collate.c:1166 locale/programs/ld-collate.c:1208
+#: locale/programs/ld-collate.c:1169 locale/programs/ld-collate.c:1211
 #, c-format
 msgid "cannot insert new collating symbol definition: %s"
 msgstr ""
@@ -1870,86 +1977,86 @@ msgstr ""
 msgid "cannot open database file `%s': %s"
 msgstr "Ne peut ouvrir le fichier de base de données `%s': %s."
 
-#: catgets/gencat.c:259 db/makedb.c:180
+#: catgets/gencat.c:260 db/makedb.c:180
 #, c-format
 msgid "cannot open input file `%s'"
 msgstr "Ne peut ouvrir le fichier d'entrée `%s'."
 
-#: locale/programs/localedef.c:221
+#: locale/programs/localedef.c:224
 #, c-format
 msgid "cannot open locale definition file `%s'"
 msgstr "Ne peut ouvrir le fichier des localisations `%s'."
 
-#: catgets/gencat.c:764 catgets/gencat.c:805 db/makedb.c:189
+#: catgets/gencat.c:765 catgets/gencat.c:806 db/makedb.c:189
 #, c-format
 msgid "cannot open output file `%s'"
 msgstr "Ne peut ouvrir le fichier de sortie `%s'."
 
-#: locale/programs/locfile.c:986
+#: locale/programs/locfile.c:1008
 #, c-format
 msgid "cannot open output file `%s' for category `%s'"
 msgstr "Ne peut ouvrir le fichier de sortie `%s' de catégorie `%s'."
 
-#: locale/programs/ld-collate.c:1360
+#: locale/programs/ld-collate.c:1363
 msgid "cannot process order specification"
 msgstr "Ne peut traiter la spécification d'ordonnancement."
 
-#: locale/programs/locale.c:303
+#: locale/programs/locale.c:304
 #, c-format
 msgid "cannot read character map directory `%s'"
 msgstr "Ne peut lire via le répertoire de la table des caractères `%s'."
 
-#: locale/programs/locale.c:278
+#: locale/programs/locale.c:279
 #, c-format
 msgid "cannot read locale directory `%s'"
 msgstr "Ne peut lire via le répertoire des définitions localisées `%s'."
 
-#: locale/programs/localedef.c:309
+#: locale/programs/localedef.c:313
 #, c-format
 msgid "cannot read locale file `%s'"
 msgstr "Ne peut lire le fichier des définitions localisées `%s'."
 
-#: locale/programs/localedef.c:334
+#: locale/programs/localedef.c:338
 #, c-format
 msgid "cannot write output files to `%s'"
 msgstr "Ne peut écrire dans les fichiers de sortie vers `%s'."
 
-#: locale/programs/localedef.c:377
+#: locale/programs/localedef.c:381
 msgid "category data requested more than once: should not happen"
 msgstr ""
 "Catégorie de données requises plus d'une fois: n'aurait pas dû se produire."
 
-#: locale/programs/ld-ctype.c:265
+#: locale/programs/ld-ctype.c:266
 #, c-format
 msgid "character %s'%s' in class `%s' must be in class `%s'"
 msgstr "Caractère %s'%s' de la classe `%s' doit être dans la classe `%s'."
 
-#: locale/programs/ld-ctype.c:289
+#: locale/programs/ld-ctype.c:291
 #, c-format
 msgid "character %s'%s' in class `%s' must not be in class `%s'"
 msgstr ""
 "Caractère %s'%s' de la classe `%s' ne doit pas être dans la classe `%s'."
 
-#: locale/programs/ld-ctype.c:310
+#: locale/programs/ld-ctype.c:313
 msgid "character <SP> not defined in character map"
 msgstr "Caractère <SP> non défini dans la table des caractères."
 
-#: locale/programs/ld-ctype.c:939 locale/programs/ld-ctype.c:1002
-#: locale/programs/ld-ctype.c:1010 locale/programs/ld-ctype.c:1018
-#: locale/programs/ld-ctype.c:1026 locale/programs/ld-ctype.c:1034
-#: locale/programs/ld-ctype.c:1042 locale/programs/ld-ctype.c:1068
-#: locale/programs/ld-ctype.c:1076 locale/programs/ld-ctype.c:1114
-#: locale/programs/ld-ctype.c:1141 locale/programs/ld-ctype.c:1152
+#: locale/programs/ld-ctype.c:944 locale/programs/ld-ctype.c:1007
+#: locale/programs/ld-ctype.c:1015 locale/programs/ld-ctype.c:1023
+#: locale/programs/ld-ctype.c:1031 locale/programs/ld-ctype.c:1039
+#: locale/programs/ld-ctype.c:1047 locale/programs/ld-ctype.c:1073
+#: locale/programs/ld-ctype.c:1081 locale/programs/ld-ctype.c:1119
+#: locale/programs/ld-ctype.c:1146 locale/programs/ld-ctype.c:1157
 #, c-format
 msgid "character `%s' not defined while needed as default value"
 msgstr "Caractère `%s' non défini alors qu'attendu comme valeur par défaut."
 
-#: locale/programs/ld-ctype.c:801
+#: locale/programs/ld-ctype.c:806
 #, c-format
 msgid "character class `%s' already defined"
 msgstr "Classe de caractères `%s' déjà définie."
 
-#: locale/programs/ld-ctype.c:833
+#: locale/programs/ld-ctype.c:838
 #, c-format
 msgid "character map `%s' already defined"
 msgstr "Table de caractères `%s' déjà définie."
@@ -1963,23 +2070,24 @@ msgstr "Fichier de la table des caractères `%s' non repérable."
 msgid "clnt_raw.c - Fatal header serialization error."
 msgstr "clnt_raw.c - erreur fatale de sérialisation d'en-tête."
 
-#: locale/programs/ld-collate.c:1329
+#: locale/programs/ld-collate.c:1332
 #, c-format
 msgid "collation element `%.*s' appears more than once: ignore line"
 msgstr ""
 "Élément de fusionnement `%.*s' apparaît plus d'une fois: ligne ignorée."
 
-#: locale/programs/ld-collate.c:1347
+#: locale/programs/ld-collate.c:1350
 #, c-format
 msgid "collation symbol `%.*s' appears more than once: ignore line"
-msgstr "Symbole de fusionnement `%.*s' apparaît plus d'une fois: ligne ignorée."
+msgstr ""
+"Symbole de fusionnement `%.*s' apparaît plus d'une fois: ligne ignorée."
 
-#: locale/programs/locfile.c:522
+#: locale/programs/locfile.c:544
 #, c-format
 msgid "collation symbol expected after `%s'"
 msgstr "Symbole de fusionnement attendu après `%s'."
 
-#: inet/rcmd.c:129
+#: inet/rcmd.c:130
 #, c-format
 msgid "connect to address %s: "
 msgstr "Connexion établie à l'adresse %s: "
@@ -2021,37 +2129,37 @@ msgstr ""
 msgid "duplicate character name `%s'"
 msgstr "Duplicité du nom de caractère `%s'."
 
-#: locale/programs/ld-collate.c:1141
+#: locale/programs/ld-collate.c:1144
 msgid "duplicate collating element definition"
 msgstr "Duplicité de la définition d'élément de fusionnement."
 
-#: locale/programs/ld-collate.c:1287
+#: locale/programs/ld-collate.c:1290
 #, c-format
 msgid "duplicate definition for character `%.*s'"
 msgstr "Duplicité de la définition du caractère `%.*s'."
 
-#: db/makedb.c:310
+#: db/makedb.c:311
 msgid "duplicate key"
 msgstr "Duplicité de clé."
 
-#: catgets/gencat.c:378
+#: catgets/gencat.c:379
 msgid "duplicate set definition"
 msgstr "Duplicité de la définition d'ensemble."
 
-#: time/zic.c:965
+#: time/zic.c:963
 #, c-format
 msgid "duplicate zone name %s (file \"%s\", line %d)"
 msgstr "Duplicité du nom de zone  %s (fichier \"%s\", ligne %d)."
 
-#: catgets/gencat.c:541
+#: catgets/gencat.c:542
 msgid "duplicated message identifier"
 msgstr "Duplicité de l'identificateur de message."
 
-#: catgets/gencat.c:514
+#: catgets/gencat.c:515
 msgid "duplicated message number"
 msgstr "Duplicité du numéro de message"
 
-#: locale/programs/ld-collate.c:1696
+#: locale/programs/ld-collate.c:1699
 msgid "empty weight name: line ignored"
 msgstr "Nom du poids vide: ligne ignorée."
 
@@ -2071,34 +2179,38 @@ msgstr "enablecache: ne peut allouer une cache de données."
 msgid "enablecache: could not allocate cache fifo"
 msgstr "enablecache: ne peut allouer une cache de type fifo."
 
-#: locale/programs/ld-collate.c:1419
+#: locale/programs/ld-collate.c:1422
 msgid "end point of ellipsis range is bigger then start"
 msgstr "Le noeud final de l'intervalle d'ellipse est plus grand que l'initial."
 
-#: locale/programs/ld-collate.c:1149
+#: locale/programs/ld-collate.c:1152
 msgid "error while inserting collation element into hash table"
 msgstr ""
 "Erreur durant l'insertion d'un élément de fusionnement dans la table de "
 "hachage."
 
-#: locale/programs/ld-collate.c:1161
+#: locale/programs/ld-collate.c:1164
 msgid "error while inserting to hash table"
 msgstr "Erreur lors de l'insertion dans la table de hachage."
 
-#: locale/programs/locfile.c:465
+#: locale/programs/locfile.c:487
 msgid "expect string argument for `copy'"
 msgstr "Chaîne attendue pour le paramètre de `copy'."
 
-#: time/zic.c:856
+#: time/zic.c:854
 msgid "expected continuation line not found"
 msgstr "Ligne de continuation attendue, non repérée."
 
-#: locale/programs/locfile.c:1010
+#: locale/programs/locfile.c:1032
 #, c-format
 msgid "failure while writing data for category `%s'"
 msgstr "Échec durant l'écriture des données de catégorie `%s'."
 
-#: locale/programs/ld-monetary.c:154 locale/programs/ld-numeric.c:95
+#: nis/ypclnt.c:187
+msgid "fcntl: F_SETFD"
+msgstr "fcntl: F_SETFD"
+
+#: locale/programs/ld-monetary.c:155 locale/programs/ld-numeric.c:95
 #, c-format
 msgid "field `%s' in category `%s' not defined"
 msgstr "Champ `%s' de catégorie `%s' n'est pas défini."
@@ -2108,7 +2220,7 @@ msgstr "Champ `%s' de catégorie `%s' n'est pas défini."
 msgid "field `%s' in category `%s' undefined"
 msgstr "Champ `%s' de catégorie `%s' indéfini."
 
-#: locale/programs/locfile.c:547
+#: locale/programs/locfile.c:569
 msgid "from-value of `collating-element' must be a string"
 msgstr "La valeur de départ de `collating-element' doit être une chaîne."
 
@@ -2117,7 +2229,7 @@ msgid "garbage at end of character code specification"
 msgstr "Rebut à la fin du caractère du code de spécification."
 
 #: locale/programs/linereader.c:214
-msgid "garbage at end of digit"
+msgid "garbage at end of number"
 msgstr "Rebut à la fin des chiffres."
 
 #: locale/programs/ld-time.c:183
@@ -2136,7 +2248,7 @@ msgstr ""
 "Rebut à la fin de la date finale dans la chaîne %d du champ `era'\n"
 "de catégorie `%s'."
 
-#: locale/programs/ld-time.c:310
+#: locale/programs/ld-time.c:311
 #, c-format
 msgid ""
 "garbage at end of stopping date in string %d in `era' field in category `%s'"
@@ -2148,19 +2260,19 @@ msgstr ""
 msgid "get_myaddress: ioctl (get interface configuration)"
 msgstr "get_myaddress: ioctl (a obtenu la configuration de l'interface)."
 
-#: time/zic.c:1149
+#: time/zic.c:1147
 msgid "illegal CORRECTION field on Leap line"
 msgstr "CORRECTION illégale du champ dans la ligne de type `Leap'."
 
-#: time/zic.c:1153
+#: time/zic.c:1151
 msgid "illegal Rolling/Stationary field on Leap line"
 msgstr "Champ `Rolling/Stationary' illégal sur la ligne de type `Leap'."
 
-#: locale/programs/ld-collate.c:1767
+#: locale/programs/ld-collate.c:1770
 msgid "illegal character constant in string"
 msgstr "Caractère illégal de constante dans la chaîne."
 
-#: locale/programs/ld-collate.c:1116
+#: locale/programs/ld-collate.c:1119
 msgid "illegal collation element"
 msgstr "Élément de fusionnement illégal."
 
@@ -2187,7 +2299,7 @@ msgstr ""
 "Nombre illégal pour la valeur de saut dans la chaîne %d du champ `era'\n"
 "de catégorie `%s'."
 
-#: catgets/gencat.c:351 catgets/gencat.c:428
+#: catgets/gencat.c:352 catgets/gencat.c:429
 msgid "illegal set number"
 msgstr "Numéro d'ensemble illégal."
 
@@ -2198,20 +2310,20 @@ msgstr ""
 "Date finale illégale dans la chaîne %d du champ `era'\n"
 "de catégorie `%s'."
 
-#: locale/programs/ld-time.c:302
+#: locale/programs/ld-time.c:303
 #, c-format
 msgid "illegal stopping date in string %d in `era' field in category `%s'"
 msgstr ""
 "Date finale illégale dans la chaîne %d du champ `era'\n"
 "de catégorie `%s'."
 
-#: locale/programs/ld-ctype.c:807
+#: locale/programs/ld-ctype.c:812
 #, c-format
 msgid "implementation limit: no more than %d character classes allowed"
 msgstr ""
 "Limite d'impantation: pas plus de %d classes de caractères sont permises."
 
-#: locale/programs/ld-ctype.c:839
+#: locale/programs/ld-ctype.c:844
 #, c-format
 msgid "implementation limit: no more than %d character maps allowed"
 msgstr ""
@@ -2221,60 +2333,60 @@ msgstr ""
 msgid "incorrectly formatted file"
 msgstr "Fichier incorrectement formaté."
 
-#: time/zic.c:814
+#: time/zic.c:811
 msgid "input line of unknown type"
 msgstr "Ligne d'entrée de type inconnu."
 
-#: time/zic.c:1733
+#: time/zic.c:1760
 msgid "internal error - addtype called with bad isdst"
 msgstr "Erreur interne - addtype appellé avec un mauvais bloc isdst."
 
-#: time/zic.c:1741
+#: time/zic.c:1768
 msgid "internal error - addtype called with bad ttisgmt"
 msgstr "Erreur interne - addtype appellé avec un mauvais bloc ttisgmt."
 
-#: time/zic.c:1737
+#: time/zic.c:1764
 msgid "internal error - addtype called with bad ttisstd"
 msgstr "Erreur interne - addtype appellé avec un mauvais bloc ttisstd."
 
-#: locale/programs/ld-ctype.c:301
+#: locale/programs/ld-ctype.c:304
 #, c-format
 msgid "internal error in %s, line %u"
 msgstr "Erreur interne dans %s, ligne %u."
 
-#: time/zic.c:1021
+#: time/zic.c:1019
 msgid "invalid GMT offset"
 msgstr "Décalage relatif GMT invalide."
 
-#: time/zic.c:1024
+#: time/zic.c:1022
 msgid "invalid abbreviation format"
 msgstr "Format d'abréviation invalide."
 
-#: time/zic.c:1114 time/zic.c:1313 time/zic.c:1327
+#: time/zic.c:1112 time/zic.c:1313 time/zic.c:1327
 msgid "invalid day of month"
 msgstr "Jour du mois invalide."
 
-#: time/zic.c:1272
+#: time/zic.c:1270
 msgid "invalid ending year"
 msgstr "Année finale invalide."
 
-#: time/zic.c:1086
+#: time/zic.c:1084
 msgid "invalid leaping year"
 msgstr "Année bissextile invalide."
 
-#: time/zic.c:1101 time/zic.c:1204
+#: time/zic.c:1099 time/zic.c:1202
 msgid "invalid month name"
 msgstr "Nom de mois invalide."
 
-#: time/zic.c:920
+#: time/zic.c:918
 msgid "invalid saved time"
 msgstr "Temps sauvegardé invalide."
 
-#: time/zic.c:1252
+#: time/zic.c:1250
 msgid "invalid starting year"
 msgstr "Année initiale invalide."
 
-#: time/zic.c:1130 time/zic.c:1232
+#: time/zic.c:1128 time/zic.c:1230
 msgid "invalid time of day"
 msgstr "Heure du jour invalide."
 
@@ -2282,68 +2394,66 @@ msgstr "Heure du jour invalide."
 msgid "invalid weekday name"
 msgstr "Nom du jour de semaine invalide."
 
-#: locale/programs/ld-collate.c:1412
+#: locale/programs/ld-collate.c:1415
 msgid "line after ellipsis must contain character definition"
 msgstr "La ligne après l'ellipse doit contenir la définition d'un caractère."
 
-#: locale/programs/ld-collate.c:1391
+#: locale/programs/ld-collate.c:1394
 msgid "line before ellipsis does not contain definition for character constant"
 msgstr ""
 "La ligne avant l'ellipse ne doit pas contenir la définition d'une constante "
 "de caractères."
 
-#: time/zic.c:794
+#: time/zic.c:791
 msgid "line too long"
 msgstr "Ligne trop longue."
 
-#: locale/programs/localedef.c:281
+#: locale/programs/localedef.c:285
 #, c-format
 msgid "locale file `%s', used in `copy' statement, not found"
 msgstr ""
 "Fichier localisé `%s', utilisé dans la déclaration de `copy', non repéré."
 
-#: catgets/gencat.c:609
+#: catgets/gencat.c:610
 msgid "malformed line ignored"
 msgstr "Ligne incorrecte ignorée."
 
-#: malloc/mcheck.c:183
+#: malloc/mcheck.c:185
 msgid "memory clobbered before allocated block"
 msgstr "Mémoire écrasée avant le bloc alloué."
 
-#: malloc/mcheck.c:186
+#: malloc/mcheck.c:188
 msgid "memory clobbered past end of allocated block"
 msgstr "Mémoire écrasée après la fin du bloc alloué."
 
 #: locale/programs/ld-collate.c:167 locale/programs/ld-collate.c:173
-#: locale/programs/ld-collate.c:177 locale/programs/ld-collate.c:1439
-#: locale/programs/ld-collate.c:1468 locale/programs/locfile.c:940
+#: locale/programs/ld-collate.c:177 locale/programs/ld-collate.c:1442
+#: locale/programs/ld-collate.c:1471 locale/programs/locfile.c:962
 #: locale/programs/xmalloc.c:68 posix/getconf.c:250
 msgid "memory exhausted"
 msgstr "Mémoire épuisée."
 
-#: malloc/obstack.c:425
+#: malloc/obstack.c:462
 msgid "memory exhausted\n"
 msgstr "Mémoire épuisée.\n"
 
-#: malloc/mcheck.c:180
+#: malloc/mcheck.c:182
 msgid "memory is consistent, library is buggy"
 msgstr "Mémoire consistente, la librairie est fautive."
 
-#: locale/programs/ld-time.c:348
+#: locale/programs/ld-time.c:350
 #, c-format
 msgid "missing era format in string %d in `era' field in category `%s'"
 msgstr ""
 "Format de type era manquant dans la chaîne %d du champ `era'\n"
 "de catégorie `%s'."
 
-#: locale/programs/ld-time.c:337
+#: locale/programs/ld-time.c:339
 #, c-format
-msgid "missing era name in string %d in `era' fieldin category `%s'"
-msgstr ""
-"Nom de type era manquant dans la chaîne %d du champ `era'\n"
-"de catégorie `%s'."
+msgid "missing era name in string %d in `era' field in category `%s'"
+msgstr "Nom manquant dans la chaîne %d du champ `era' de catégorie `%s'."
 
-#: time/zic.c:915
+#: time/zic.c:913
 msgid "nameless rule"
 msgstr "Règle sans nom."
 
@@ -2357,19 +2467,19 @@ msgstr "Le programme %d n'a jamais été enregistré.\n"
 msgid "no correct regular expression for field `%s' in category `%s': %s"
 msgstr "Expression reguliere incorrecte du champ `%s' de catégorie `%s': %s"
 
-#: time/zic.c:2059
+#: time/zic.c:2086
 msgid "no day in month matches rule"
 msgstr "Pas de jour dans les règles de concordance."
 
-#: locale/programs/ld-collate.c:259
+#: locale/programs/ld-collate.c:260
 msgid "no definition of `UNDEFINED'"
 msgstr "Pas de définition de type `UNDEFINED'."
 
-#: locale/programs/locfile.c:479
+#: locale/programs/locfile.c:501
 msgid "no other keyword shall be specified when `copy' is used"
 msgstr "Aucun autre mot clé ne doit être spécifié lorsque `copy' est utilisé."
 
-#: locale/programs/localedef.c:340
+#: locale/programs/localedef.c:344
 msgid "no output file produced because warning were issued"
 msgstr "Aucun fichier de sortie généré en raison d'un avertissement déjà émis."
 
@@ -2394,7 +2504,7 @@ msgstr ""
 "Seules les définitions de type `WIDTH' sont autorisées à suivre\n"
 "la définition de `CHARMAP'."
 
-#: db/makedb.c:326
+#: db/makedb.c:327
 #, c-format
 msgid "problems while reading `%s'"
 msgstr "Problèmes lors de la lecture de `%s'"
@@ -2415,16 +2525,16 @@ msgstr "Le programme %lu de version %lu n'est pas disponible.\n"
 msgid "program %lu version %lu ready and waiting\n"
 msgstr "Le programme %lu de version %lu est prêt et en attente.\n"
 
-#: inet/rcmd.c:171
+#: inet/rcmd.c:172
 #, c-format
 msgid "rcmd: select (setting up stderr): %m\n"
 msgstr "rcmd: sélection (configuration de stderr): %m.\n"
 
-#: inet/rcmd.c:103
+#: inet/rcmd.c:104
 msgid "rcmd: socket: All ports in use\n"
 msgstr "rcmd: socket: tous les ports sont occupés.\n"
 
-#: inet/rcmd.c:159
+#: inet/rcmd.c:160
 #, c-format
 msgid "rcmd: write (setting up stderr): %m\n"
 msgstr "rcmd: écriture (configuration de stderr): %m.\n"
@@ -2433,7 +2543,7 @@ msgstr "rcmd: écriture (configuration de stderr): %m.\n"
 msgid "registerrpc: out of memory\n"
 msgstr "registerrpc: mémoire épuisée.\n"
 
-#: time/zic.c:1794
+#: time/zic.c:1821
 msgid "repeated leap second moment"
 msgstr "Répétition du délai une seconde fois."
 
@@ -2466,50 +2576,50 @@ msgstr "rpcinfo: ne peut contacter le convertisseur de ports."
 msgid "rpcinfo: can't contact portmapper: "
 msgstr "rpcinfo: ne peut contacter le convertisseur de ports."
 
-#: time/zic.c:708 time/zic.c:710
+#: time/zic.c:704 time/zic.c:706
 msgid "same rule name in multiple files"
 msgstr "Même nom de règle dans plusieurs fichiers."
 
-#: inet/rcmd.c:174
+#: inet/rcmd.c:175
 msgid "select: protocol failure in circuit setup\n"
 msgstr "select: échec de protocole dans la configuration du circuit.\n"
 
-#: inet/rcmd.c:192
+#: inet/rcmd.c:193
 msgid "socket: protocol failure in circuit setup\n"
 msgstr "socket: échec de protocole dans la configuration du circuit.\n"
 
-#: locale/programs/locfile.c:600
+#: locale/programs/locfile.c:622
 msgid "sorting order `forward' and `backward' are mutually exclusive"
 msgstr ""
 "Les options de tri `forward' et `backward' sont mutuellement exclusives."
 
-#: locale/programs/ld-collate.c:1568 locale/programs/ld-collate.c:1614
+#: locale/programs/ld-collate.c:1571 locale/programs/ld-collate.c:1617
 msgid ""
 "specification of sorting weight for collation symbol does not make sense"
 msgstr ""
 "La spécification de tri par le poids des symboles de\n"
 "fusionnement n'a aucun sens."
 
-#: time/zic.c:779
+#: time/zic.c:775
 msgid "standard input"
 msgstr "entrée standard"
 
-#: time/zdump.c:260
+#: time/zdump.c:268
 msgid "standard output"
 msgstr "sortie standard"
 
-#: locale/programs/ld-time.c:256
+#: locale/programs/ld-time.c:257
 #, c-format
 msgid "starting date is illegal in string %d in `era' field in category `%s'"
 msgstr ""
 "Date initiale illégale dans la chaîne %d du champ `era'\n"
 "de catégorie `%s'."
 
-#: time/zic.c:1276
+#: time/zic.c:1274
 msgid "starting year greater than ending year"
 msgstr "Année initiale plus grande que l'année finale."
 
-#: locale/programs/ld-time.c:328
+#: locale/programs/ld-time.c:330
 #, c-format
 msgid "stopping date is illegal in string %d in `era' field in category `%s'"
 msgstr ""
@@ -2541,7 +2651,7 @@ msgstr "svcudp_create - ne peut trouver le nom du socket par getsockname()."
 msgid "svcudp_create: socket creation problem"
 msgstr "svcudp_create: problème de création du socket."
 
-#: locale/programs/ld-collate.c:1191
+#: locale/programs/ld-collate.c:1194
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates element "
@@ -2550,7 +2660,7 @@ msgstr ""
 "Le symbole d'un élément de fusionnement multi-caractères `%.*s' \n"
 "provoque la duplication de la définition d'un élément."
 
-#: locale/programs/ld-collate.c:1064
+#: locale/programs/ld-collate.c:1067
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates other element "
@@ -2559,7 +2669,7 @@ msgstr ""
 "Le symbole d'un élément de fusionnement multi-caractères `%.*s' \n"
 "provoque la duplication d'autres définitions d'éléments."
 
-#: locale/programs/ld-collate.c:1200
+#: locale/programs/ld-collate.c:1203
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates other symbol "
@@ -2568,7 +2678,7 @@ msgstr ""
 "Le symbole d'un élément de fusionnement multi-caractères `%.*s' \n"
 "provoque la duplication d'autres définitions de symboles."
 
-#: locale/programs/ld-collate.c:1073
+#: locale/programs/ld-collate.c:1076
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates symbol "
@@ -2577,7 +2687,7 @@ msgstr ""
 "Le symbole d'un élément de fusionnement multi-caractères `%.*s' \n"
 "provoque la duplication de la définition d'un symbole."
 
-#: locale/programs/ld-collate.c:1055 locale/programs/ld-collate.c:1182
+#: locale/programs/ld-collate.c:1058 locale/programs/ld-collate.c:1185
 #, c-format
 msgid ""
 "symbol for multicharacter collating element `%.*s' duplicates symbolic name "
@@ -2594,55 +2704,55 @@ msgstr ""
 msgid "syntax error in %s definition: %s"
 msgstr "Erreur de syntaxe dans la définition de %s: %s."
 
-#: locale/programs/locfile.c:620
+#: locale/programs/locfile.c:642
 msgid "syntax error in `order_start' directive"
 msgstr "Erreur de syntaxe dans la directive `order_start'."
 
-#: locale/programs/locfile.c:362
+#: locale/programs/locfile.c:384
 msgid "syntax error in character class definition"
 msgstr "Erreur de syntaxe dans la définition de la classe de caractères."
 
-#: locale/programs/locfile.c:420
+#: locale/programs/locfile.c:442
 msgid "syntax error in character conversion definition"
 msgstr "Erreur de syntaxe dans la définition du caractère de conversion."
 
-#: locale/programs/locfile.c:662
+#: locale/programs/locfile.c:684
 msgid "syntax error in collating order definition"
 msgstr "Erreur de syntaxe dans l'ordre de la définition du fusionnement."
 
-#: locale/programs/locfile.c:512
+#: locale/programs/locfile.c:534
 msgid "syntax error in collation definition"
 msgstr "Erreur de syntaxe dans la définition du fusionnement."
 
-#: locale/programs/locfile.c:335
+#: locale/programs/locfile.c:357
 msgid "syntax error in definition of LC_CTYPE category"
 msgstr ""
 "Erreur de syntaxe dans la définition d'une catégorie de type `LC_CTYPE'."
 
-#: locale/programs/locfile.c:278
+#: locale/programs/locfile.c:300
 msgid "syntax error in definition of new character class"
 msgstr ""
 "Erreur de syntaxe dans la définition d'une nouvelle classe de caractères."
 
-#: locale/programs/locfile.c:288
+#: locale/programs/locfile.c:310
 msgid "syntax error in definition of new character map"
 msgstr ""
 "Erreur de syntaxe dans la définition d'une nouvelle table de caractères."
 
-#: locale/programs/locfile.c:873
+#: locale/programs/locfile.c:895
 msgid "syntax error in message locale definition"
 msgstr "Erreur de syntaxe dans la définition localisée du message."
 
-#: locale/programs/locfile.c:784
+#: locale/programs/locfile.c:806
 msgid "syntax error in monetary locale definition"
 msgstr "Erreur de syntaxe dans la définition localisée des valeurs monétaires."
 
-#: locale/programs/locfile.c:811
+#: locale/programs/locfile.c:833
 msgid "syntax error in numeric locale definition"
 msgstr ""
 "Erreur de syntaxe dans la définition localisée de représentation numérique."
 
-#: locale/programs/locfile.c:722
+#: locale/programs/locfile.c:744
 msgid "syntax error in order specification"
 msgstr "Erreur de syntaxe dans la spéficication de l'ordonnancement."
 
@@ -2651,27 +2761,27 @@ msgstr "Erreur de syntaxe dans la spéficication de l'ordonnancement."
 msgid "syntax error in prolog: %s"
 msgstr "Erreur de syntaxe du prologue: %s."
 
-#: locale/programs/locfile.c:849
+#: locale/programs/locfile.c:871
 msgid "syntax error in time locale definition"
 msgstr ""
 "Erreur de syntaxe dans la définition localisée de la représentation du temps."
 
-#: locale/programs/locfile.c:255
+#: locale/programs/locfile.c:277
 msgid "syntax error: not inside a locale definition section"
 msgstr ""
 "Erreur de syntaxe: pas à l'intérieur d'une section de définition localisée."
 
-#: catgets/gencat.c:380 catgets/gencat.c:516 catgets/gencat.c:543
+#: catgets/gencat.c:381 catgets/gencat.c:517 catgets/gencat.c:544
 msgid "this is the first definition"
 msgstr "Ceci est la première définition."
 
 # time/zic.c:1120A
 # mro: à investiguer dans le code source
-#: time/zic.c:1119
+#: time/zic.c:1117
 msgid "time before zero"
 msgstr "Temps défini avant le zéro."
 
-#: time/zic.c:1127 time/zic.c:1959 time/zic.c:1978
+#: time/zic.c:1125 time/zic.c:1986 time/zic.c:2005
 msgid "time overflow"
 msgstr "Débordement du temps alloué."
 
@@ -2687,23 +2797,23 @@ msgstr "Trop d'octets pour l'encodage des caractères."
 msgid "too many character classes defined"
 msgstr "Trop de définitions de classes de caractères."
 
-#: time/zic.c:1788
+#: time/zic.c:1815
 msgid "too many leap seconds"
 msgstr "Trop de délai en secondes."
 
-#: time/zic.c:1760
+#: time/zic.c:1787
 msgid "too many local time types"
 msgstr "Trop de types localisés pour la représentation du temps."
 
-#: time/zic.c:1714
+#: time/zic.c:1741
 msgid "too many transitions?!"
 msgstr "Trop de transitions définies?!"
 
-#: locale/programs/ld-collate.c:1623
+#: locale/programs/ld-collate.c:1626
 msgid "too many weights"
 msgstr "Trop de poids définis."
 
-#: time/zic.c:2082
+#: time/zic.c:2109
 msgid "too many, or too long, time zone abbreviations"
 msgstr "Trop ou de trop longues abréviations de fuseaux horaires."
 
@@ -2716,11 +2826,11 @@ msgstr "Suffixe en rebut à la fin de la ligne."
 msgid "trouble replying to prog %d\n"
 msgstr "Problème à répondre au programme %d.\n"
 
-#: locale/programs/ld-collate.c:1383
+#: locale/programs/ld-collate.c:1386
 msgid "two lines in a row containing `...' are not allowed"
 msgstr "Deux lignes consécutives contenant `...' ne sont pas permises."
 
-#: time/zic.c:1283
+#: time/zic.c:1281
 msgid "typed single year"
 msgstr "Une seule année fournie."
 
@@ -2735,39 +2845,36 @@ msgstr "Caractère inconnu `%s'."
 
 #: locale/programs/ld-messages.c:193 locale/programs/ld-messages.c:204
 #: locale/programs/ld-messages.c:215 locale/programs/ld-messages.c:226
-#: locale/programs/ld-time.c:696
+#: locale/programs/ld-time.c:698
 #, c-format
 msgid "unknown character in field `%s' of category `%s'"
 msgstr "Caractère inconnu dans le champ `%s' de catégorie `%s'."
 
-#: locale/programs/locfile.c:585
+#: locale/programs/locfile.c:607
 msgid "unknown collation directive"
 msgstr "Directive de fusionnement inconnue."
 
-#: catgets/gencat.c:477
+#: catgets/gencat.c:478
 #, c-format
 msgid "unknown directive `%s': line ignored"
 msgstr "Directive inconnue `%s': ligne ignorée."
 
-#: catgets/gencat.c:456
+#: catgets/gencat.c:457
 #, c-format
 msgid "unknown set `%s'"
 msgstr "Ensemble inconnu `%s'."
 
-msgid "unknown signal"
-msgstr "Signal inconnu."
-
-#: locale/programs/ld-collate.c:1367 locale/programs/ld-collate.c:1558
-#: locale/programs/ld-collate.c:1732
+#: locale/programs/ld-collate.c:1370 locale/programs/ld-collate.c:1561
+#: locale/programs/ld-collate.c:1735
 #, c-format
 msgid "unknown symbol `%.*s': line ignored"
 msgstr "Symbole inconnu `%.*s': ligne ignorée."
 
-#: time/zic.c:751
+#: time/zic.c:747
 msgid "unruly zone"
 msgstr "Zone sans règle."
 
-#: catgets/gencat.c:961
+#: catgets/gencat.c:962
 msgid "unterminated message"
 msgstr "Message incomplet."
 
@@ -2779,7 +2886,7 @@ msgstr "Chaîne incomplète."
 msgid "unterminated symbolic name"
 msgstr "Nom symbolique incomplet."
 
-#: locale/programs/ld-collate.c:1685
+#: locale/programs/ld-collate.c:1688
 msgid "unterminated weight name"
 msgstr "Nom de poids incomplet."
 
@@ -2789,7 +2896,7 @@ msgstr ""
 "Limite supérieure de l'intervalle n'est pas plus petite que la limite "
 "inférieure."
 
-#: time/zic.c:2025
+#: time/zic.c:2052
 msgid "use of 2/29 in non leap-year"
 msgstr "Utiliser 2/29 pour les années non-bissextiles."
 
@@ -2803,7 +2910,7 @@ msgstr "La valeur de %s doit être un entier."
 msgid "value for <%s> must lie between 1 and 4"
 msgstr "La valeur de <%s> doit être comprise entre 1 et 4."
 
-#: locale/programs/ld-monetary.c:148 locale/programs/ld-numeric.c:89
+#: locale/programs/ld-monetary.c:149 locale/programs/ld-numeric.c:89
 #, c-format
 msgid "value for field `%s' in category `%s' must not be the empty string"
 msgstr ""
@@ -2815,7 +2922,7 @@ msgstr ""
 "La valeur de <mb_cur_max> doit être plus grande que la valeur de "
 "<mb_cur_min>."
 
-#: locale/programs/ld-monetary.c:138
+#: locale/programs/ld-monetary.c:139
 msgid ""
 "value of field `int_curr_symbol' in category `LC_MONETARY' does not "
 "correspond to a valid name in ISO 4217"
@@ -2830,13 +2937,13 @@ msgstr ""
 "La valeur du champ `int_curr_symbol' de catégorie `LC_MONETARY' n'a pas la "
 "bonne longueur."
 
-#: locale/programs/ld-monetary.c:370 locale/programs/ld-numeric.c:199
+#: locale/programs/ld-monetary.c:371 locale/programs/ld-numeric.c:199
 #, c-format
 msgid "values for field `%s' in category `%s' must be smaller than 127"
 msgstr ""
 "Les valeurs du champ `%s' de catégorie `%s' doivent être plus petite que 127."
 
-#: locale/programs/ld-monetary.c:366
+#: locale/programs/ld-monetary.c:367
 #, c-format
 msgid "values for field `%s' in category `%s' must not be zero"
 msgstr ""
@@ -2846,15 +2953,15 @@ msgstr ""
 msgid "while opening UTMP file"
 msgstr "durant l'ouverture du fichier UTMP."
 
-#: catgets/gencat.c:988
+#: catgets/gencat.c:989
 msgid "while opening old catalog file"
 msgstr "durant l'ouverture du vieux fichier du catalogue."
 
-#: db/makedb.c:353
+#: db/makedb.c:354
 msgid "while reading database"
 msgstr "durant la lecture de la base de données."
 
-#: db/makedb.c:315
+#: db/makedb.c:316
 msgid "while writing data base file"
 msgstr "durant l'écriture dans le fichier de la base de données."
 
@@ -2862,38 +2969,41 @@ msgstr "durant l'écriture dans le fichier de la base de données."
 msgid "wrong number of arguments"
 msgstr "Mauvais nombre de paramètres."
 
-#: time/zic.c:1077
+#: time/zic.c:1075
 msgid "wrong number of fields on Leap line"
 msgstr "Mauvais nombre de champs sur la ligne de type `Leap'."
 
-#: time/zic.c:1168
+#: time/zic.c:1166
 msgid "wrong number of fields on Link line"
 msgstr "Mauvais nombre de champs sur la ligne de type `Link'."
 
-#: time/zic.c:911
+#: time/zic.c:909
 msgid "wrong number of fields on Rule line"
 msgstr "Mauvais nombre de champs sur la ligne de type `Rule'."
 
-#: time/zic.c:981
+#: time/zic.c:979
 msgid "wrong number of fields on Zone continuation line"
 msgstr "Mauvais nombre de champs sur la ligne de type continuation de `Zone'."
 
-#: time/zic.c:939
+#: time/zic.c:937
 msgid "wrong number of fields on Zone line"
 msgstr "Mauvais nombre de champs sur la ligne de type `Zone'."
 
-#: nis/ypclnt.c:570
-msgid "yp_all: clnttcp_create failed"
-msgstr "yp_all: échec de la fonction clnttcp_create()."
-
-#: nis/ypclnt.c:772
+#: nis/ypclnt.c:811
 msgid "yp_update: cannot convert host to netname\n"
-msgstr "yp_update: ne peut convertir le nom de l'hôte à un nom réseau (netname).\n"
+msgstr ""
+"yp_update: ne peut convertir le nom de l'hôte à un nom réseau (netname).\n"
 
-#: nis/ypclnt.c:784
+#: nis/ypclnt.c:823
 msgid "yp_update: cannot get server address\n"
 msgstr "yp_update: ne peut obtenir l'adresse du serveur.\n"
 
+#~ msgid "unknown signal"
+#~ msgstr "Signal inconnu."
+
+#~ msgid "yp_all: clnttcp_create failed"
+#~ msgstr "yp_all: échec de la fonction clnttcp_create()."
+
 #~ msgid "character `%c' not defined while needed as default value"
 #~ msgstr "Caractère `%c' non défini alors qu'attendu comme valeur par défaut."
 
diff --git a/rpc/auth.h b/rpc/auth.h
deleted file mode 100644
index 5721091a56..0000000000
--- a/rpc/auth.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <sunrpc/rpc/auth.h>
diff --git a/rpc/auth_des.h b/rpc/auth_des.h
deleted file mode 100644
index 02736aa03b..0000000000
--- a/rpc/auth_des.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <sunrpc/rpc/auth_des.h>
diff --git a/sunrpc/rpc/auth.h b/sysdeps/generic/rpc/auth.h
index 61cd351485..61cd351485 100644
--- a/sunrpc/rpc/auth.h
+++ b/sysdeps/generic/rpc/auth.h
diff --git a/sunrpc/rpc/auth_des.h b/sysdeps/generic/rpc/auth_des.h
index 8c2f794691..8c2f794691 100644
--- a/sunrpc/rpc/auth_des.h
+++ b/sysdeps/generic/rpc/auth_des.h
diff --git a/sysdeps/libm-i387/s_cbrt.S b/sysdeps/libm-i387/s_cbrt.S
new file mode 100644
index 0000000000..4b9a2b11c6
--- /dev/null
+++ b/sysdeps/libm-i387/s_cbrt.S
@@ -0,0 +1,185 @@
+/* Compute cubic root of double value.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Dirk Alboth <dirka@uni-paderborn.de> and
+   Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <machine/asm.h>
+
+#ifdef __ELF__
+        .section .rodata
+#else
+        .text
+#endif
+
+        .align ALIGNARG(4)
+        ASM_TYPE_DIRECTIVE(f1,@object)
+f1:	.double 0.354895765043919860
+	ASM_SIZE_DIRECTIVE(f1)
+        ASM_TYPE_DIRECTIVE(f2,@object)
+f2:	.double 1.50819193781584896
+	ASM_SIZE_DIRECTIVE(f2)
+        ASM_TYPE_DIRECTIVE(f3,@object)
+f3:	.double -2.11499494167371287
+	ASM_SIZE_DIRECTIVE(f3)
+        ASM_TYPE_DIRECTIVE(f4,@object)
+f4:	.double 2.44693122563534430
+	ASM_SIZE_DIRECTIVE(f4)
+        ASM_TYPE_DIRECTIVE(f5,@object)
+f5:	.double -1.83469277483613086
+	ASM_SIZE_DIRECTIVE(f5)
+        ASM_TYPE_DIRECTIVE(f6,@object)
+f6:	.double 0.784932344976639262
+	ASM_SIZE_DIRECTIVE(f6)
+        ASM_TYPE_DIRECTIVE(f7,@object)
+f7:	.double -0.145263899385486377
+	ASM_SIZE_DIRECTIVE(f7)
+
+#define CBRT2 1.2599210498948731648
+#define SQR_CBRT2 1.5874010519681994748
+
+	ASM_TYPE_DIRECTIVE(factor,@object)
+factor:	.double 1.0 / SQR_CBRT2
+	.double 1.0 / CBRT2
+	.double 1.0
+	.double CBRT2
+	.double SQR_CBRT2
+	ASM_SIZE_DIRECTIVE(factor)
+
+        ASM_TYPE_DIRECTIVE(two54,@object)
+two54:  .byte 0, 0, 0, 0, 0, 0, 0x50, 0x43
+        ASM_SIZE_DIRECTIVE(two54)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ebx)
+#define MOX(op,x,f) op##@GOTOFF(%ebx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+	.text
+ENTRY(__cbrt)
+	movl	4(%esp), %ecx
+	movl	8(%esp), %eax
+	movl	%eax, %edx
+	andl	$0x7fffffff, %eax
+	orl	%eax, %ecx
+	jz	1f
+	xorl	%ecx, %ecx
+	cmpl	$0x7ff00000, %eax
+	jae	1f
+
+#ifdef PIC
+	pushl	%ebx
+	call	3f
+3:	popl	%ebx
+	addl    $_GLOBAL_OFFSET_TABLE_+[.-3b], %ebx
+#endif
+
+	cmpl	$0x00100000, %eax
+	jae	2f
+
+#ifdef PIC
+	fldl	8(%esp)
+#else
+	fldl	4(%esp)
+#endif
+	fmull	MO(two54)
+	movl	$-54, %ecx
+	fstpl	4(%esp)
+	movl	8(%esp), %eax
+	movl	%eax, %edx
+	andl	$0x7fffffff, %eax
+
+2:	shrl	$20, %eax
+	andl	$0x800fffff, %edx
+	subl	$1022, %eax
+	orl	$0x3fe00000, %edx
+	addl	%eax, %ecx
+#ifdef PIC
+	movl	%edx, 12(%esp)
+
+	fldl	8(%esp)			/* xm */
+#else
+	movl	%edx, 8(%esp)
+
+	fldl	4(%esp)			/* xm */
+#endif
+	fabs
+
+	/* The following code has two track:
+	    a) compute the normalized cbrt value
+	    b) compute xe/3 and xe%3
+	   The right track computes the value for b) and this is done
+	   in an optimized way by avoiding division.  */
+
+	fld	%st(0)			/* xm : xm */
+
+	fmull	MO(f7)			/* f7*xm : xm */
+			movl	$1431655766, %eax
+	faddl	MO(f6)			/* f6+f7*xm : xm */
+			imull	%ecx
+	fmul	%st(1)			/* (f6+f7*xm)*xm : xm */
+			movl	%ecx, %eax
+	faddl	MO(f5)			/* f5+(f6+f7*xm)*xm : xm */
+			sarl	$31, %eax
+	fmul	%st(1)			/* (f5+(f6+f7*xm)*xm)*xm : xm */
+			subl	%eax, %edx
+	faddl	MO(f4)			/* f4+(f5+(f6+f7*xm)*xm)*xm : xm */
+	fmul	%st(1)			/* (f4+(f5+(f6+f7*xm)*xm)*xm)*xm : xm */
+	faddl	MO(f3)			/* f3+(f4+(f5+(f6+f7*xm)*xm)*xm)*xm : xm */
+	fmul	%st(1)			/* (f3+(f4+(f5+(f6+f7*xm)*xm)*xm)*xm)*xm : xm */
+	faddl	MO(f2)			/* f2+(f3+(f4+(f5+(f6+f7*xm)*xm)*xm)*xm)*xm : xm */
+	fmul	%st(1)			/* (f2+(f3+(f4+(f5+(f6+f7*xm)*xm)*xm)*xm)*xm)*xm : xm */
+	faddl	MO(f1)			/* u:=f1+(f2+(f3+(f4+(f5+(f6+f7*xm)*xm)*xm)*xm)*xm)*xm : xm */
+
+	fld	%st			/* u : u : xm */
+	fmul	%st(1)			/* u*u : u : xm */
+	fld	%st(2)			/* xm : u*u : u : xm */
+	fadd	%st			/* 2*xm : u*u : u : xm */
+	fxch	%st(1)			/* u*u : 2*xm : u : xm */
+	fmul	%st(2)			/* t2:=u*u*u : 2*xm : u : xm */
+			movl	%edx, %eax
+	fadd	%st, %st(1)		/* t2 : t2+2*xm : u : xm */
+			leal	(%edx,%edx,2),%edx
+	fadd	%st(0)			/* 2*t2 : t2+2*xm : u : xm */
+			subl	%edx, %ecx
+	faddp	%st, %st(3)		/* t2+2*xm : u : 2*t2+xm */
+	fmulp				/* u*(t2+2*xm) : 2*t2+xm */
+	fdivp	%st, %st(1)		/* u*(t2+2*xm)/(2*t2+xm) */
+	fmull	MOX(16+factor,%ecx,8)	/* u*(t2+2*xm)/(2*t2+xm)*FACT */
+	pushl	%eax
+	fildl	(%esp)			/* xe/3 : u*(t2+2*xm)/(2*t2+xm)*FACT */
+	fxch				/* u*(t2+2*xm)/(2*t2+xm)*FACT : xe/3 */
+	popl	%eax
+	fscale				/* u*(t2+2*xm)/(2*t2+xm)*FACT*2^xe/3 */
+	fstp	%st(1)
+#ifdef PIC
+	popl	%ebx
+#endif
+	testl	$0x80000000, 8(%esp)
+	jz	4f
+	fchs
+4:	ret
+
+	/* Return the argument.  */
+1:	fldl	4(%esp)
+	ret
+END(__cbrt)
+weak_alias (__cbrt, cbrt)
diff --git a/sysdeps/libm-i387/s_cbrtf.S b/sysdeps/libm-i387/s_cbrtf.S
new file mode 100644
index 0000000000..6978da2d40
--- /dev/null
+++ b/sysdeps/libm-i387/s_cbrtf.S
@@ -0,0 +1,166 @@
+/* Compute cubic root of float value.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Dirk Alboth <dirka@uni-paderborn.de> and
+   Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <machine/asm.h>
+
+#ifdef __ELF__
+        .section .rodata
+#else
+        .text
+#endif
+
+        .align ALIGNARG(4)
+        ASM_TYPE_DIRECTIVE(f1,@object)
+f1:	.double 0.492659620528969547
+        ASM_SIZE_DIRECTIVE(f1)
+        ASM_TYPE_DIRECTIVE(f2,@object)
+f2:	.double 0.697570460207922770
+        ASM_SIZE_DIRECTIVE(f2)
+        ASM_TYPE_DIRECTIVE(f3,@object)
+f3:	.double 0.191502161678719066
+        ASM_SIZE_DIRECTIVE(f3)
+
+#define CBRT2 1.2599210498948731648
+#define SQR_CBRT2 1.5874010519681994748
+
+	ASM_TYPE_DIRECTIVE(factor,@object)
+factor:	.double 1.0 / SQR_CBRT2
+	.double 1.0 / CBRT2
+	.double 1.0
+	.double CBRT2
+	.double SQR_CBRT2
+	ASM_SIZE_DIRECTIVE(factor)
+
+        ASM_TYPE_DIRECTIVE(two25,@object)
+two25:	.byte 0, 0, 0, 0x4c
+        ASM_SIZE_DIRECTIVE(two25)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ebx)
+#define MOX(op,x,f) op##@GOTOFF(%ebx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+	.text
+ENTRY(__cbrtf)
+	movl	4(%esp), %eax
+	xorl	%ecx, %ecx
+	movl	%eax, %edx
+	andl	$0x7fffffff, %eax
+	jz	1f
+	cmpl	$0x7f800000, %eax
+	jae	1f
+
+#ifdef PIC
+	pushl	%ebx
+	call	3f
+3:	popl	%ebx
+	addl    $_GLOBAL_OFFSET_TABLE_+[.-3b], %ebx
+#endif
+
+	cmpl	$0x00800000, %eax
+	jae	2f
+
+#ifdef PIC
+	flds	8(%esp)
+#else
+	flds	4(%esp)
+#endif
+	fmuls	MO(two25)
+	movl	$-25, %ecx
+#ifdef PIC
+	fstps	8(%esp)
+	movl	8(%esp), %eax
+#else
+	fstps	4(%esp)
+	movl	4(%esp), %eax
+#endif
+	movl	%eax, %edx
+	andl	$0x7fffffff, %eax
+
+2:	shrl	$23, %eax
+	andl	$0x807fffff, %edx
+	subl	$126, %eax
+	orl	$0x3f000000, %edx
+	addl	%eax, %ecx
+#ifdef PIC
+	movl	%edx, 8(%esp)
+
+	flds	8(%esp)			/* xm */
+#else
+	movl	%edx, 4(%esp)
+
+	flds	4(%esp)			/* xm */
+#endif
+	fabs
+
+	/* The following code has two track:
+	    a) compute the normalized cbrt value
+	    b) compute xe/3 and xe%3
+	   The right track computes the value for b) and this is done
+	   in an optimized way by avoiding division.  */
+
+	fld	%st(0)			/* xm : xm */
+	fmull	MO(f3)			/* f3*xm : xm */
+			movl	$1431655766, %eax
+	fsubrl	MO(f2)			/* f2-f3*xm : xm */
+			imull	%ecx
+	fmul	%st(1)			/* (f2-f3*xm)*xm : xm */
+			movl	%ecx, %eax
+	faddl	MO(f1)			/* u:=f1+(f2-f3*xm)*xm : xm */
+			sarl	$31, %eax
+	fld	%st			/* u : u : xm */
+			subl	%eax, %edx
+	fmul	%st(1)			/* u*u : u : xm */
+	fld	%st(2)			/* xm : u*u : u : xm */
+	fadd	%st			/* 2*xm : u*u : u : xm */
+	fxch	%st(1)			/* u*u : 2*xm : u : xm */
+	fmul	%st(2)			/* t2:=u*u*u : 2*xm : u : xm */
+			movl	%edx, %eax
+	fadd	%st, %st(1)		/* t2 : t2+2*xm : u : xm */
+			leal	(%edx,%edx,2),%edx
+	fadd	%st(0)			/* 2*t2 : t2+2*xm : u : xm */
+			subl	%edx, %ecx
+	faddp	%st, %st(3)		/* t2+2*xm : u : 2*t2+xm */
+	fmulp				/* u*(t2+2*xm) : 2*t2+xm */
+	fdivp	%st, %st(1)		/* u*(t2+2*xm)/(2*t2+xm) */
+	fmull	MOX(16+factor,%ecx,8)	/* u*(t2+2*xm)/(2*t2+xm)*FACT */
+	pushl	%eax
+	fildl	(%esp)			/* xe/3 : u*(t2+2*xm)/(2*t2+xm)*FACT */
+	fxch				/* u*(t2+2*xm)/(2*t2+xm)*FACT : xe/3 */
+	popl	%eax
+	fscale				/* u*(t2+2*xm)/(2*t2+xm)*FACT*2^xe/3 */
+	fstp	%st(1)
+#ifdef PIC
+	popl	%ebx
+#endif
+	testl	$0x80000000, 4(%esp)
+	jz	4f
+	fchs
+4:	ret
+
+	/* Return the argument.  */
+1:	flds	4(%esp)
+	ret
+END(__cbrtf)
+weak_alias (__cbrtf, cbrtf)
diff --git a/sysdeps/libm-i387/s_cbrtl.S b/sysdeps/libm-i387/s_cbrtl.S
new file mode 100644
index 0000000000..b2023d1991
--- /dev/null
+++ b/sysdeps/libm-i387/s_cbrtl.S
@@ -0,0 +1,188 @@
+/* Compute cubic root of long double value.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Dirk Alboth <dirka@uni-paderborn.de> and
+   Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <machine/asm.h>
+
+#ifdef __ELF__
+        .section .rodata
+#else
+        .text
+#endif
+
+        .align ALIGNARG(4)
+        ASM_TYPE_DIRECTIVE(f1,@object)
+f1:	.double 0.338058687610520237
+	ASM_SIZE_DIRECTIVE(f1)
+        ASM_TYPE_DIRECTIVE(f2,@object)
+f2:	.double 1.67595307700780102
+	ASM_SIZE_DIRECTIVE(f2)
+        ASM_TYPE_DIRECTIVE(f3,@object)
+f3:	.double -2.82414939754975962
+	ASM_SIZE_DIRECTIVE(f3)
+        ASM_TYPE_DIRECTIVE(f4,@object)
+f4:	.double 4.09559907378707839
+	ASM_SIZE_DIRECTIVE(f4)
+        ASM_TYPE_DIRECTIVE(f5,@object)
+f5:	.double -4.11151425200350531
+	ASM_SIZE_DIRECTIVE(f5)
+        ASM_TYPE_DIRECTIVE(f6,@object)
+f6:	.double 2.65298938441952296
+	ASM_SIZE_DIRECTIVE(f6)
+        ASM_TYPE_DIRECTIVE(f7,@object)
+f7:	.double -0.988553671195413709
+	ASM_SIZE_DIRECTIVE(f7)
+        ASM_TYPE_DIRECTIVE(f8,@object)
+f8:	.double 0.161617097923756032
+	ASM_SIZE_DIRECTIVE(f8)
+
+#define CBRT2 1.2599210498948731648
+#define SQR_CBRT2 1.5874010519681994748
+
+	ASM_TYPE_DIRECTIVE(factor,@object)
+factor:	.double 1.0 / SQR_CBRT2
+	.double 1.0 / CBRT2
+	.double 1.0
+	.double CBRT2
+	.double SQR_CBRT2
+	ASM_SIZE_DIRECTIVE(factor)
+
+        ASM_TYPE_DIRECTIVE(two64,@object)
+two64:  .byte 0, 0, 0, 0, 0, 0, 0xf0, 0x43
+        ASM_SIZE_DIRECTIVE(two64)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ebx)
+#define MOX(op,x,f) op##@GOTOFF(%ebx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+	.text
+ENTRY(__cbrtl)
+	movl	4(%esp), %ecx
+	movl	12(%esp), %eax
+	orl	8(%esp), %ecx
+	movl	%eax, %edx
+	andl	$0x7fff, %eax
+	orl	%eax, %ecx
+	jz	1f
+	xorl	%ecx, %ecx
+	cmpl	$0x7fff, %eax
+	je	1f
+
+#ifdef PIC
+	pushl	%ebx
+	call	3f
+3:	popl	%ebx
+	addl    $_GLOBAL_OFFSET_TABLE_+[.-3b], %ebx
+#endif
+
+	cmpl	$0, %eax
+	je	2f
+
+#ifdef PIC
+	fldt	8(%esp)
+#else
+	fldt	4(%esp)
+#endif
+	fmull	MO(two64)
+	movl	$-64, %ecx
+	fstpt	4(%esp)
+	movl	12(%esp), %eax
+	movl	%eax, %edx
+	andl	$0x7fff, %eax
+
+2:	andl	$0x8000, %edx
+	subl	$16382, %eax
+	orl	$0x3ffe, %edx
+	addl	%eax, %ecx
+#ifdef PIC
+	movl	%edx, 16(%esp)
+
+	fldt	8(%esp)			/* xm */
+#else
+	movl	%edx, 12(%esp)
+
+	fldt	4(%esp)			/* xm */
+#endif
+	fabs
+
+	/* The following code has two track:
+	    a) compute the normalized cbrt value
+	    b) compute xe/3 and xe%3
+	   The right track computes the value for b) and this is done
+	   in an optimized way by avoiding division.  */
+
+	fld	%st(0)			/* xm : xm */
+
+	fmull	MO(f7)			/* f7*xm : xm */
+			movl	$1431655766, %eax
+	faddl	MO(f6)			/* f6+f7*xm : xm */
+			imull	%ecx
+	fmul	%st(1)			/* (f6+f7*xm)*xm : xm */
+			movl	%ecx, %eax
+	faddl	MO(f5)			/* f5+(f6+f7*xm)*xm : xm */
+			sarl	$31, %eax
+	fmul	%st(1)			/* (f5+(f6+f7*xm)*xm)*xm : xm */
+			subl	%eax, %edx
+	faddl	MO(f4)			/* f4+(f5+(f6+f7*xm)*xm)*xm : xm */
+	fmul	%st(1)			/* (f4+(f5+(f6+f7*xm)*xm)*xm)*xm : xm */
+	faddl	MO(f3)			/* f3+(f4+(f5+(f6+f7*xm)*xm)*xm)*xm : xm */
+	fmul	%st(1)			/* (f3+(f4+(f5+(f6+f7*xm)*xm)*xm)*xm)*xm : xm */
+	faddl	MO(f2)			/* f2+(f3+(f4+(f5+(f6+f7*xm)*xm)*xm)*xm)*xm : xm */
+	fmul	%st(1)			/* (f2+(f3+(f4+(f5+(f6+f7*xm)*xm)*xm)*xm)*xm)*xm : xm */
+	faddl	MO(f1)			/* u:=f1+(f2+(f3+(f4+(f5+(f6+f7*xm)*xm)*xm)*xm)*xm)*xm : xm */
+
+	fld	%st			/* u : u : xm */
+	fmul	%st(1)			/* u*u : u : xm */
+	fld	%st(2)			/* xm : u*u : u : xm */
+	fadd	%st			/* 2*xm : u*u : u : xm */
+	fxch	%st(1)			/* u*u : 2*xm : u : xm */
+	fmul	%st(2)			/* t2:=u*u*u : 2*xm : u : xm */
+			movl	%edx, %eax
+	fadd	%st, %st(1)		/* t2 : t2+2*xm : u : xm */
+			leal	(%edx,%edx,2),%edx
+	fadd	%st(0)			/* 2*t2 : t2+2*xm : u : xm */
+			subl	%edx, %ecx
+	faddp	%st, %st(3)		/* t2+2*xm : u : 2*t2+xm */
+	fmulp				/* u*(t2+2*xm) : 2*t2+xm */
+	fdivp	%st, %st(1)		/* u*(t2+2*xm)/(2*t2+xm) */
+	fmull	MOX(16+factor,%ecx,8)	/* u*(t2+2*xm)/(2*t2+xm)*FACT */
+	pushl	%eax
+	fildl	(%esp)			/* xe/3 : u*(t2+2*xm)/(2*t2+xm)*FACT */
+	fxch				/* u*(t2+2*xm)/(2*t2+xm)*FACT : xe/3 */
+	popl	%eax
+	fscale				/* u*(t2+2*xm)/(2*t2+xm)*FACT*2^xe/3 */
+	fstp	%st(1)
+#ifdef PIC
+	popl	%ebx
+#endif
+	testl	$0x8000, 12(%esp)
+	jz	4f
+	fchs
+4:	ret
+
+	/* Return the argument.  */
+1:	fldt	4(%esp)
+	ret
+END(__cbrtl)
+weak_alias (__cbrtl, cbrtl)
diff --git a/sysdeps/libm-i387/s_frexp.S b/sysdeps/libm-i387/s_frexp.S
new file mode 100644
index 0000000000..6a05f26720
--- /dev/null
+++ b/sysdeps/libm-i387/s_frexp.S
@@ -0,0 +1,82 @@
+/* ix87 specific frexp implementation for double.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <machine/asm.h>
+
+#ifdef __ELF__
+	.section .rodata
+#else
+	.text
+#endif
+
+	.align ALIGNARG(4)
+	ASM_TYPE_DIRECTIVE(two54,@object)
+two54:	.byte 0, 0, 0, 0, 0, 0, 0x50, 0x43
+	ASM_SIZE_DIRECTIVE(two54)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%edx)
+#else
+#define MO(op) op
+#endif
+
+	.text
+ENTRY(__frexp)
+	movl	4(%esp), %ecx
+	movl	8(%esp), %eax
+	movl	%eax, %edx
+	andl	$0x7fffffff, %eax
+	orl	%eax, %ecx
+	jz	1f
+	xorl	%ecx, %ecx
+	cmpl	$0x7ff00000, %eax
+	jae	1f
+
+	cmpl	$0x00100000, %eax
+	jae	2f
+
+	fldl	4(%esp)
+#ifdef	PIC
+	call	3f
+3:	popl	%edx
+	addl	$_GLOBAL_OFFSET_TABLE_+[.-3b], %edx
+#endif
+	fmull	MO(two54)
+	movl	$-54, %ecx
+	fstpl	4(%esp)
+	movl	8(%esp), %eax
+	movl	%eax, %edx
+	andl	$0x7fffffff, %eax
+
+2:	shrl	$20, %eax
+	andl	$0x800fffff, %edx
+	subl	$1022, %eax
+	orl	$0x3fe00000, %edx
+	addl	%eax, %ecx
+	movl	%edx, 8(%esp)
+
+	/* Store %ecx in the variable pointed to by the second argument,
+	   get the factor from the stack and return.  */
+1:	movl	12(%esp), %eax
+	fldl	4(%esp)
+	movl	%ecx, (%eax)
+	ret
+END(__frexp)
+weak_alias (__frexp, frexp)
diff --git a/sysdeps/libm-i387/s_frexpf.S b/sysdeps/libm-i387/s_frexpf.S
new file mode 100644
index 0000000000..1021b97aee
--- /dev/null
+++ b/sysdeps/libm-i387/s_frexpf.S
@@ -0,0 +1,80 @@
+/* ix87 specific frexp implementation for float.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <machine/asm.h>
+
+#ifdef __ELF__
+	.section .rodata
+#else
+	.text
+#endif
+
+	.align ALIGNARG(4)
+	ASM_TYPE_DIRECTIVE(two25,@object)
+two25:	.byte 0, 0, 0, 0x4c
+	ASM_SIZE_DIRECTIVE(two25)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%edx)
+#else
+#define MO(op) op
+#endif
+
+	.text
+ENTRY(__frexpf)
+	movl	4(%esp), %eax
+	xorl	%ecx, %ecx
+	movl	%eax, %edx
+	andl	$0x7fffffff, %eax
+	jz	1f
+	cmpl	$0x7f800000, %eax
+	jae	1f
+
+	cmpl	$0x00800000, %eax
+	jae	2f
+
+	flds	4(%esp)
+#ifdef	PIC
+	call	3f
+3:	popl	%edx
+	addl	$_GLOBAL_OFFSET_TABLE_+[.-3b], %edx
+#endif
+	fmuls	MO(two25)
+	movl	$-25, %ecx
+	fstps	4(%esp)
+	movl	4(%esp), %eax
+	movl	%eax, %edx
+	andl	$0x7fffffff, %eax
+
+2:	shrl	$23, %eax
+	andl	$0x807fffff, %edx
+	subl	$126, %eax
+	orl	$0x3f000000, %edx
+	addl	%eax, %ecx
+	movl	%edx, 4(%esp)
+
+	/* Store %ecx in the variable pointed to by the second argument,
+	   get the factor from the stack and return.  */
+1:	movl	8(%esp), %eax
+	flds	4(%esp)
+	movl	%ecx, (%eax)
+	ret
+END(__frexpf)
+weak_alias (__frexpf, frexpf)
diff --git a/sysdeps/libm-i387/s_frexpl.S b/sysdeps/libm-i387/s_frexpl.S
new file mode 100644
index 0000000000..e3019ced6d
--- /dev/null
+++ b/sysdeps/libm-i387/s_frexpl.S
@@ -0,0 +1,82 @@
+/* ix87 specific frexp implementation for long double.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <machine/asm.h>
+
+#ifdef __ELF__
+	.section .rodata
+#else
+	.text
+#endif
+
+	.align ALIGNARG(4)
+	ASM_TYPE_DIRECTIVE(two64,@object)
+two64:	.byte 0, 0, 0, 0, 0, 0, 0xf0, 0x43
+	ASM_SIZE_DIRECTIVE(two64)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%edx)
+#else
+#define MO(op) op
+#endif
+
+	.text
+ENTRY(__frexpl)
+	movl	4(%esp), %ecx
+	movl	12(%esp), %eax
+	orl	8(%esp), %ecx
+	movl	%eax, %edx
+	andl	$0x7fff, %eax
+	orl	%eax, %ecx
+	jz	1f
+	xorl	%ecx, %ecx
+	cmpl	$0x7fff, %eax
+	je	1f
+
+	cmpl	$0, %eax
+	je	2f
+
+	fldt	4(%esp)
+#ifdef	PIC
+	call	3f
+3:	popl	%edx
+	addl	$_GLOBAL_OFFSET_TABLE_+[.-3b], %edx
+#endif
+	fmull	MO(two64)	/* It's not necessary to use a 80bit factor */
+	movl	$-64, %ecx
+	fstpt	4(%esp)
+	movl	12(%esp), %eax
+	movl	%eax, %edx
+	andl	$0x7fff, %eax
+
+2:	andl	$0x8000, %edx
+	subl	$16382, %eax
+	orl	$0x3ffe, %edx
+	addl	%eax, %ecx
+	movl	%edx, 12(%esp)
+
+	/* Store %ecx in the variable pointed to by the second argument,
+	   get the factor from the stack and return.  */
+1:	movl	16(%esp), %eax
+	fldt	4(%esp)
+	movl	%ecx, (%eax)
+	ret
+END(__frexpl)
+weak_alias (__frexpl, frexpl)
diff --git a/sysdeps/libm-ieee754/s_cbrt.c b/sysdeps/libm-ieee754/s_cbrt.c
index 24a9c9adbd..a5033ff468 100644
--- a/sysdeps/libm-ieee754/s_cbrt.c
+++ b/sysdeps/libm-ieee754/s_cbrt.c
@@ -1,95 +1,71 @@
-/* @(#)s_cbrt.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
+/* Compute cubic root of double value.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Dirk Alboth <dirka@uni-paderborn.de> and
+   Ulrich Drepper <drepper@cygnus.com>, 1997.
 
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: s_cbrt.c,v 1.8 1995/05/10 20:46:49 jtc Exp $";
-#endif
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include "math.h"
 #include "math_private.h"
 
-/* cbrt(x)
- * Return cube root of x
- */
-#ifdef __STDC__
-static const u_int32_t
-#else
-static u_int32_t
-#endif
-	B1 = 715094163, /* B1 = (682-0.03306235651)*2**20 */
-	B2 = 696219795; /* B2 = (664-0.03306235651)*2**20 */
 
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-C =  5.42857142857142815906e-01, /* 19/35     = 0x3FE15F15, 0xF15F15F1 */
-D = -7.05306122448979611050e-01, /* -864/1225 = 0xBFE691DE, 0x2532C834 */
-E =  1.41428571428571436819e+00, /* 99/70     = 0x3FF6A0EA, 0x0EA0EA0F */
-F =  1.60714285714285720630e+00, /* 45/28     = 0x3FF9B6DB, 0x6DB6DB6E */
-G =  3.57142857142857150787e-01; /* 5/14      = 0x3FD6DB6D, 0xB6DB6DB7 */
+#define CBRT2 1.2599210498948731648		/* 2^(1/3) */
+#define SQR_CBRT2 1.5874010519681994748		/* 2^(2/3) */
 
-#ifdef __STDC__
-	double __cbrt(double x)
-#else
-	double __cbrt(x)
-	double x;
-#endif
+static const double factor[5] =
 {
-	int32_t	hx;
-	double r,s,t=0.0,w;
-	u_int32_t sign;
-	u_int32_t high,low;
+  1.0 / SQR_CBRT2,
+  1.0 / CBRT2,
+  1.0,
+  CBRT2,
+  SQR_CBRT2
+};
 
-	GET_HIGH_WORD(hx,x);
-	sign=hx&0x80000000; 		/* sign= sign(x) */
-	hx  ^=sign;
-	if(hx>=0x7ff00000) return(x+x); /* cbrt(NaN,INF) is itself */
-	GET_LOW_WORD(low,x);
-	if((hx|low)==0)
-	    return(x);		/* cbrt(0) is itself */
 
-	SET_HIGH_WORD(x,hx);	/* x <- |x| */
-    /* rough cbrt to 5 bits */
-	if(hx<0x00100000) 		/* subnormal number */
-	  {SET_HIGH_WORD(t,0x43500000);	/* set t= 2**54 */
-	   t*=x; GET_HIGH_WORD(high,t); SET_HIGH_WORD(t,high/3+B2);
-	  }
-	else
-	  SET_HIGH_WORD(t,hx/3+B1);
+double
+__cbrt (double x)
+{
+  double xm, ym, u, t2;
+  int xe;
 
+  /* Reduce X.  XM now is an range 1.0 to 0.5.  */
+  xm = __frexp (fabs (x), &xe);
 
-    /* new cbrt to 23 bits, may be implemented in single precision */
-	r=t*t/x;
-	s=C+r*t;
-	t*=G+F/(s+E+D/s);
+  /* If X is not finite or is null return it (with raising exceptions
+     if necessary.  */
+  if (xe == 0)
+    return x + x;
 
-    /* chopped to 20 bits and make it larger than cbrt(x) */
-	GET_HIGH_WORD(high,t);
-	INSERT_WORDS(t,high+0x00000001,0);
+ u = (0.354895765043919860
+      + ((1.50819193781584896
+	 + ((-2.11499494167371287
+	    + ((2.44693122563534430
+	       + ((-1.83469277483613086
+		  + (0.784932344976639262 - 0.145263899385486377 * xm) * xm)
+		  * xm))
+	       * xm))
+	    * xm))
+	 * xm));
 
+  t2 = u * u * u;
 
-    /* one step newton iteration to 53 bits with error less than 0.667 ulps */
-	s=t*t;		/* t*t is exact */
-	r=x/s;
-	w=t+t;
-	r=(r-t)/(w+r);	/* r-s is exact */
-	t=t+t*r;
+  ym = u * (t2 + 2.0 * xm) / (2.0 * t2 + xm) * factor[2 + xe % 3];
 
-    /* retore the sign bit */
-	GET_HIGH_WORD(high,t);
-	SET_HIGH_WORD(t,high|sign);
-	return(t);
+  return __ldexp (x > 0.0 ? ym : -ym, xe / 3);
 }
 weak_alias (__cbrt, cbrt)
 #ifdef NO_LONG_DOUBLE
diff --git a/sysdeps/libm-ieee754/s_cbrtf.c b/sysdeps/libm-ieee754/s_cbrtf.c
index a2b3c8106c..f9f687c011 100644
--- a/sysdeps/libm-ieee754/s_cbrtf.c
+++ b/sysdeps/libm-ieee754/s_cbrtf.c
@@ -1,84 +1,62 @@
-/* s_cbrtf.c -- float version of s_cbrt.c.
- * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice 
- * is preserved.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: s_cbrtf.c,v 1.4 1995/05/10 20:46:51 jtc Exp $";
-#endif
+/* Compute cubic root of float value.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Dirk Alboth <dirka@uni-paderborn.de> and
+   Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include "math.h"
 #include "math_private.h"
 
-/* cbrtf(x)
- * Return cube root of x
- */
-#ifdef __STDC__
-static const unsigned 
-#else
-static unsigned 
-#endif
-	B1 = 709958130, /* B1 = (84+2/3-0.03306235651)*2**23 */
-	B2 = 642849266; /* B2 = (76+2/3-0.03306235651)*2**23 */
 
-#ifdef __STDC__
-static const float
-#else
-static float
-#endif
-C =  5.4285717010e-01, /* 19/35     = 0x3f0af8b0 */
-D = -7.0530611277e-01, /* -864/1225 = 0xbf348ef1 */
-E =  1.4142856598e+00, /* 99/70     = 0x3fb50750 */
-F =  1.6071428061e+00, /* 45/28     = 0x3fcdb6db */
-G =  3.5714286566e-01; /* 5/14      = 0x3eb6db6e */
+#define CBRT2 1.2599210498948731648		/* 2^(1/3) */
+#define SQR_CBRT2 1.5874010519681994748		/* 2^(2/3) */
+
+static const double factor[5] =
+{
+  1.0 / SQR_CBRT2,
+  1.0 / CBRT2,
+  1.0,
+  CBRT2,
+  SQR_CBRT2
+};
+
 
-#ifdef __STDC__
-	float __cbrtf(float x) 
-#else
-	float __cbrtf(x) 
-	float x;
-#endif
+float
+__cbrtf (float x)
 {
-	float r,s,t;
-	int32_t hx;
-	u_int32_t sign;
-	u_int32_t high;
+  float xm, ym, u, t2;
+  int xe;
+
+  /* Reduce X.  XM now is an range 1.0 to 0.5.  */
+  xm = __frexpf (fabsf (x), &xe);
 
-	GET_FLOAT_WORD(hx,x);
-	sign=hx&0x80000000; 		/* sign= sign(x) */
-	hx  ^=sign;
-	if(hx>=0x7f800000) return(x+x); /* cbrt(NaN,INF) is itself */
-	if(hx==0) 
-	    return(x);		/* cbrt(0) is itself */
+  /* If X is not finite or is null return it (with raising exceptions
+     if necessary.  */
+  if (xe == 0)
+    return x + x;
 
-	SET_FLOAT_WORD(x,hx);	/* x <- |x| */
-    /* rough cbrt to 5 bits */
-	if(hx<0x00800000) 		/* subnormal number */
-	  {SET_FLOAT_WORD(t,0x4b800000); /* set t= 2**24 */
-	   t*=x; GET_FLOAT_WORD(high,t); SET_FLOAT_WORD(t,high/3+B2);
-	  }
-	else
-	  SET_FLOAT_WORD(t,hx/3+B1);
+  u = (0.492659620528969547 + (0.697570460207922770
+			       - 0.191502161678719066 * xm) * xm);
 
+  t2 = u * u * u;
 
-    /* new cbrt to 23 bits */
-	r=t*t/x;
-	s=C+r*t;
-	t*=G+F/(s+E+D/s);	
+  ym = u * (t2 + 2.0 * xm) / (2.0 * t2 + xm) * factor[2 + xe % 3];
 
-    /* retore the sign bit */
-	GET_FLOAT_WORD(high,t);
-	SET_FLOAT_WORD(t,high|sign);
-	return(t);
+  return __ldexpf (x > 0.0 ? ym : -ym, xe / 3);
 }
 weak_alias (__cbrtf, cbrtf)
diff --git a/sysdeps/libm-ieee754/s_cbrtl.c b/sysdeps/libm-ieee754/s_cbrtl.c
index 21e7727728..b3a53a39e1 100644
--- a/sysdeps/libm-ieee754/s_cbrtl.c
+++ b/sysdeps/libm-ieee754/s_cbrtl.c
@@ -1,122 +1,76 @@
-/* s_cbrtl.c -- long double version of s_cbrt.c.
- * Conversion to long double by Ulrich Drepper,
- * Cygnus Support, drepper@cygnus.com.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: $";
-#endif
+/* Compute cubic root of double value.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Dirk Alboth <dirka@uni-paderborn.de> and
+   Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include "math.h"
 #include "math_private.h"
 
-/* cbrtl(x)
- * Return cube root of x
- */
-#ifdef __STDC__
-static const u_int32_t
-#else
-static u_int32_t
-#endif
-	B1_EXP = 10921,		/* = Int(B1) */
-	B1_MANT = 0x7bc4b064,	/* = Int(1.0-0.03306235651)*2**31 */
-
-	B2_EXP = 10900,
-	B2_MANT = 0x7bc4b064;	/* = Int(1.0-0.03306235651)*2**31 */
 
-#ifdef __STDC__
-static const long double
-#else
-static long double
-#endif
-C =  5.42857142857142815906e-01L, /* 19/35 */
-D = -7.05306122448979611050e-01L, /* -864/1225 */
-E =  1.41428571428571436819e+00L, /* 99/70 */
-F =  1.60714285714285720630e+00L, /* 45/28 */
-G =  3.57142857142857150787e-01L; /* 5/14 */
+#define CBRT2 1.2599210498948731648		/* 2^(1/3) */
+#define SQR_CBRT2 1.5874010519681994748		/* 2^(2/3) */
 
-#ifdef __STDC__
-	long double __cbrtl(long double x)
-#else
-	long double __cbrtl(x)
-	long double x;
-#endif
+/* We don't use long double values here since U need not be computed
+   with full precision.  */
+static const double factor[5] =
 {
-	long double r,s,t=0.0,w;
-	u_int32_t sign, se, x0, x1;
-
-	GET_LDOUBLE_WORDS(se,x0,x1,x);
-	sign=se&0x8000; 		/* sign= sign(x) */
-	se ^= sign;
-	if(se==0x7fff) return(x+x); /* cbrt(NaN,INF) is itself */
-	if((se|x0|x1)==0)
-	    return(x);		/* cbrt(0) is itself */
-
-	SET_LDOUBLE_EXP(x,se);	/* x <- |x| */
-
-/* XXX I don't know whether the numbers for correct are correct.  The
-   precalculation is extended from 20 bits to 32 bits.  This hopefully
-   gives us the needed bits to get us still along with one iteration
-   step.  */
+  1.0 / SQR_CBRT2,
+  1.0 / CBRT2,
+  1.0,
+  CBRT2,
+  SQR_CBRT2
+};
 
-    /* rough cbrt to 5 bits */
-	if(se==0) 		/* subnormal number */
-	  {
-	    u_int64_t xxl;
-	    u_int32_t set,t0,t1;
-	    SET_LDOUBLE_EXP(t,0x4035);	/* set t= 2**54 */
-	    SET_LDOUBLE_MSW(t,0x80000000);
-	    t*=x;
-	    GET_LDOUBLE_WORDS(set,t0,t1,t);
-	    xxl = ((u_int64_t) set) << 32 | t0;
-	    xxl /= 3;
-	    xxl += B2_EXP << 16 | B2_MANT;
-	    t0 = xxl & 0xffffffffu;
-	    set = xxl >> 32;
-	    SET_LDOUBLE_WORDS(t,set,t0,t1);
-	  }
-	else
-	  {
-	    u_int64_t xxl = ((u_int64_t) se) << 32 | x0;
-	    xxl /= 3;
-	    xxl += ((u_int64_t) B1_EXP) << 32 | B1_MANT;
-	    SET_LDOUBLE_MSW(t,xxl&0xffffffffu);
-	    xxl >>= 32;
-	    SET_LDOUBLE_EXP(t,xxl);
-	  }
 
-
-    /* new cbrt to 23 bits, may be implemented in single precision */
-	r=t*t/x;
-	s=C+r*t;
-	t*=G+F/(s+E+D/s);
-
-    /* chopped to 32 bits and make it larger than cbrt(x) */
-	GET_LDOUBLE_WORDS(se,x0,x1,t);
-	SET_LDOUBLE_WORDS(t,se,x0+1,0);
-
-
-    /* one step newton iteration to 53 bits with error less than 0.667 ulps */
-	s=t*t;		/* t*t is exact */
-	r=x/s;
-	w=t+t;
-	r=(r-t)/(w+r);	/* r-s is exact */
-	t=t+t*r;
-
-    /* retore the sign bit */
-	GET_LDOUBLE_EXP(se,t);
-	SET_LDOUBLE_EXP(t,se|sign);
-	return(t);
+long double
+__cbrtl (long double x)
+{
+  long double xm, ym, u, t2;
+  int xe;
+
+  /* Reduce X.  XM now is an range 1.0 to 0.5.  */
+  xm = __frexpl (fabs (x), &xe);
+
+  /* If X is not finite or is null return it (with raising exceptions
+     if necessary.  */
+  if (xe == 0)
+    return x + x;
+
+  u = (0.338058687610520237
+       + (1.67595307700780102
+	  + (-2.82414939754975962
+	     + (4.09559907378707839 +
+		(-4.11151425200350531
+		 + (2.65298938441952296 +
+		    (-0.988553671195413709
+		     + 0.161617097923756032 * xm)
+		    * xm)
+		 * xm)
+		* xm)
+	     * xm)
+	  * xm)
+       *xm);
+
+  t2 = u * u * u;
+
+  ym = u * (t2 + 2.0 * xm) / (2.0 * t2 + xm) * factor[2 + xe % 3];
+
+  return __ldexpl (x > 0.0 ? ym : -ym, xe / 3);
 }
 weak_alias (__cbrtl, cbrtl)
diff --git a/sysdeps/libm-ieee754/s_nan.c b/sysdeps/libm-ieee754/s_nan.c
index 35d92646c0..1d2319cbd8 100644
--- a/sysdeps/libm-ieee754/s_nan.c
+++ b/sysdeps/libm-ieee754/s_nan.c
@@ -19,6 +19,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <math.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ieee754.h>
diff --git a/sysdeps/libm-ieee754/s_nanf.c b/sysdeps/libm-ieee754/s_nanf.c
index 8e6e3fc1fd..56fb9e7e3d 100644
--- a/sysdeps/libm-ieee754/s_nanf.c
+++ b/sysdeps/libm-ieee754/s_nanf.c
@@ -19,6 +19,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <math.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ieee754.h>
diff --git a/sysdeps/libm-ieee754/s_nanl.c b/sysdeps/libm-ieee754/s_nanl.c
index 1cd026e00c..279e070492 100644
--- a/sysdeps/libm-ieee754/s_nanl.c
+++ b/sysdeps/libm-ieee754/s_nanl.c
@@ -19,6 +19,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <math.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ieee754.h>
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 888ab9bd85..4e698ce1d8 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -53,7 +53,7 @@ inhibit-siglist := yes
 endif
 
 ifeq ($(subdir),inet)
-sysdep_headers += netinet/in_systm.h netinet/udp.h netinet/icmp.h \
+sysdep_headers += netinet/in_systm.h netinet/udp.h \
 		  netinet/if_fddi.h netinet/if_tr.h netinet/igmp.h \
 		  netinet/ip_fw.h  netinet/ip_icmp.h sys/socketvar.h
 endif
diff --git a/sysdeps/unix/sysv/linux/sigset.h b/sysdeps/unix/sysv/linux/sigset.h
index 62e668773c..741ff9ac9d 100644
--- a/sysdeps/unix/sysv/linux/sigset.h
+++ b/sysdeps/unix/sysv/linux/sigset.h
@@ -75,7 +75,7 @@ typedef struct
 		    int __ret = __set->__val[--__cnt];			      \
 		    while (!__ret && --__cnt >= 0)			      \
 			__ret = __set->__val[__cnt];			      \
-		    __ret; }))
+		    __ret == 0; }))
 # define __sigandset(dest, left, right) \
   (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
 		    sigset_t *__dest = (dest);				      \