]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update. cvs/libc-970405 cvs/libc-970406 cvs/libc-970407 cvs/libc-970408 cvs/libc-970409 cvs/libc-970410 cvs/libc-970411 cvs/libc-970412 cvs/libc-ud-970404
authorUlrich Drepper <drepper@redhat.com>
Sat, 5 Apr 1997 01:26:47 +0000 (01:26 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 5 Apr 1997 01:26:47 +0000 (01:26 +0000)
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.

Describe `inf', `infinity', `nan', `nan(...)' inputs for strtod
* sysdeps/i386/memcmp.S: Likewise.
* time/antarctica: Likewise.
* time/australasia: Likewise.

49 files changed:
ChangeLog
FAQ
PROJECTS
inet/arpa/inet.h
manual/nss.texi
math/libm-test.c
nis/Makefile
nis/TODO
nis/nis_call.c
nis/nis_intern.h
nis/nis_names.c
nis/nis_server.c
nis/nss_compat/compat-grp.c
nis/nss_compat/compat-pwd.c
nis/nss_compat/compat-spwd.c
nis/nss_nis/nis-grp.c
nis/nss_nis/nis-publickey.c
nis/nss_nisplus/nisplus-alias.c
nis/nss_nisplus/nisplus-ethers.c
nis/nss_nisplus/nisplus-grp.c
nis/nss_nisplus/nisplus-hosts.c
nis/nss_nisplus/nisplus-netgrp.c
nis/nss_nisplus/nisplus-network.c
nis/nss_nisplus/nisplus-proto.c
nis/nss_nisplus/nisplus-publickey.c
nis/nss_nisplus/nisplus-pwd.c
nis/nss_nisplus/nisplus-rpc.c
nis/nss_nisplus/nisplus-service.c
nis/nss_nisplus/nisplus-spwd.c
nis/ypclnt.c
po/fr.po
rpc/auth.h [deleted file]
rpc/auth_des.h [deleted file]
sysdeps/generic/rpc/auth.h [moved from sunrpc/rpc/auth.h with 100% similarity]
sysdeps/generic/rpc/auth_des.h [moved from sunrpc/rpc/auth_des.h with 100% similarity]
sysdeps/libm-i387/s_cbrt.S [new file with mode: 0644]
sysdeps/libm-i387/s_cbrtf.S [new file with mode: 0644]
sysdeps/libm-i387/s_cbrtl.S [new file with mode: 0644]
sysdeps/libm-i387/s_frexp.S [new file with mode: 0644]
sysdeps/libm-i387/s_frexpf.S [new file with mode: 0644]
sysdeps/libm-i387/s_frexpl.S [new file with mode: 0644]
sysdeps/libm-ieee754/s_cbrt.c
sysdeps/libm-ieee754/s_cbrtf.c
sysdeps/libm-ieee754/s_cbrtl.c
sysdeps/libm-ieee754/s_nan.c
sysdeps/libm-ieee754/s_nanf.c
sysdeps/libm-ieee754/s_nanl.c
sysdeps/unix/sysv/linux/Makefile
sysdeps/unix/sysv/linux/sigset.h

index e5ee09de449782c07e4db6e0252424ca0601cd00..bc4513d603c027aa66b8b355651bd04180e13daf 100644 (file)
--- 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-
        * 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.
        * 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.
        * 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 9e70f8c95f4c154c0ae1a7b85d7009a02bb58ff9..16f6157f33bfc177596b923944e7a71bdede511d 100644 (file)
--- 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.''
 \f
 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 [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).
+
+
 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 \f
 Answers were given by:
index 6b381f7cebcd71741a445ae90b52c9003fc7fc76..9be423e1cef0cde3e15018913e24ebc8ae507af7 100644 (file)
--- 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!
index 03021e614cfd3cfd1d12a734d805c45fc0b1ea3c..0593c8fad668ef519b9f80fa6f6645ba9b2794b5 100644 (file)
@@ -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 */
index ba333e02aa0ad0d7e06eb6019b6881c1bc240847..0ed50afe7aa86fa6dc2c1f79106cf71fe1fbdd77 100644 (file)
@@ -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
 
index a7a53cb6bcee7b6382779a9150fe5c536fee35aa..0c65eb174f242cf487000953d9bdcd293efecf54 100644 (file)
@@ -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);
 }
index 31fda25a4561901429c903911c20f08916b43eaa..fe4dd94ebbf71c72aa192bb9b29aefc063504eef 100644 (file)
@@ -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)
index 9b675dfbc61353053382cfeb119909cf376f4a1c..628e646d15d8fb49e7d0aaea1b838cbc0d537bc5 100644 (file)
--- 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
  * 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)
        
-       
index bf64558adc1206b7bb2350f4b009ed1e3c419486..78e8767318d6020722635adb45dd6f447255c8fe 100644 (file)
@@ -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;
            }
index b5fb60550678e8fdec22fb7b0cd48dc308b01272..8201ccd533d93caf3301bab555332cdb29190f28 100644 (file)
@@ -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
index 92f8040b3ddc823129facb13ff668ff3e415265f..aa8c8802493ce44e5819253d38cc2e5fcd9e3135 100644 (file)
@@ -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;
index 48d2144c787156521e90a47cd4ccd9a6b93ba33f..0ed3c81042b68f7e9fb1745f4f3a742f5d996770 100644 (file)
@@ -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;
index de96dbbeb6c1016f4a2617a038bffc6fc8b2960b..6231a1e911b6b678a8b2a32d1d7d7245c1a193d5 100644 (file)
 #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;
index 56659e9ed52b6ee65cf3a89ba25c2636884eb85e..317e2d18bfbf51f5a8a526810559250ecb373e1c 100644 (file)
@@ -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.
 
 #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;
@@ -340,13 +382,176 @@ getpwent_next_netgr (struct passwd *result, ent_t *ent, char *group,
   return NSS_STATUS_SUCCESS;
 }
 
+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;
index 47dd22970af116f8533de03f8145a2ce23e66186..7c0eb24fc15e08f344d044bcfb02993fa5b4aa53 100644 (file)
@@ -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.
 
 #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;
@@ -280,13 +334,177 @@ getspent_next_netgr (struct spwd *result, ent_t *ent, char *group,
   return NSS_STATUS_SUCCESS;
 }
 
+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;
 }
+
index d727202513aadf17501bdc6afd4bbd84e1085664..139edf2dd8d7e70ca16a5ea25ee6c9293266592b 100644 (file)
@@ -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;
index aad4da5cc28101835fff7513be62686eaa2e261b..f50f7095fca37ce47390b3294abe934fc2f36222 100644 (file)
 #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;
 }
 
index b0f035178e65f71c176bdd4399d4a04bad461170..b27f1a87ab5b1b5fd5092b6228e9a979dc8e39aa 100644 (file)
@@ -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
        {
index ac3e06960aebf22d8d51b0d97fe89993cba7031c..2cdc2dfd7ad70e283f508dae3cd6e7002d0e82e6 100644 (file)
@@ -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));
index 2e56afa6fc7582d87b7b4737eefc52454125f200..1c73ca555b62b07b1692fb9afc86aab00783ecf6 100644 (file)
@@ -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
index 0a486411debd4e5bcd55bdec246c8edbddf98a31..1bcbe40e876ebc00e77e1f873fd7bc6eb2101f63 100644 (file)
@@ -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));
index 766d2bc7739b6e0d4f7221d4931291422ad1b342..f2a1b301b9140a3ad80d0ff0e718277911a69206 100644 (file)
 
 __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);
 
index 28580b6bc9659cac3e5fd8d87e5fc991fc43dcba..7e0ccd6411d7990634c077317af2ff72b8b44d10 100644 (file)
@@ -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));
index b26cb8230ec9197f793a9f46515a79b335b2e8ce..5cb55d367cddec0eb48b16074926305898e0e683 100644 (file)
@@ -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));
index 7312c91229cb3f65e0c220b2753541954490720c..91cfba730e4b46f17e28416af2e1be64f8f5fd63 100644 (file)
 #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;
 }
index 3717d5e98a480f4d0aaaaf6e3dadf89d845d388c..b65a9fe3951205cad1f97c361e1e06ac01bd1c8a 100644 (file)
@@ -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),
index 326f2627494adebc05b886b0a59c5bb04bd935e3..9cf9f68b4468816d5f56d4d39ebec74656a8981f 100644 (file)
@@ -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));
index 54f4f876c7e0ee71c3c41839a1c9d4da4926421b..1a8716ab9db9bacb9d801a761bb3049b28eb68e4 100644 (file)
@@ -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));
index ec4b5b33406a6b6956ea5bd8a1b41b75c4e5a68b..3400e28da7fbb64812dc888adf92f72279425b39 100644 (file)
@@ -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),
index e4667f79a66552fb3002354163bde1dda2906962..01bf8bc6b0b760105a3628d5b83289b66fd13867 100644 (file)
@@ -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)
     {
index b255cb240965b188a2fe90e3e58bf4efc5735421..8f20403658457ce42bdcb3614a49ed13ff43e1f8 100644 (file)
--- 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
 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
 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
 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
 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
 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
 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
 #. 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
 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
 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
 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'
 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
 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
 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
 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
 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
 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
 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
 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 "
 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
 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 
 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 "
 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
 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
 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
 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
 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
 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 
 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
 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
 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
 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 "
 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
 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
 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
 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
 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
 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 
 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: 
 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
 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
 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 
 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
 
 #: 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
 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 
 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'
 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 (file)
index 5721091..0000000
+++ /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 (file)
index 02736aa..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <sunrpc/rpc/auth_des.h>
similarity index 100%
rename from sunrpc/rpc/auth.h
rename to sysdeps/generic/rpc/auth.h
diff --git a/sysdeps/libm-i387/s_cbrt.S b/sysdeps/libm-i387/s_cbrt.S
new file mode 100644 (file)
index 0000000..4b9a2b1
--- /dev/null
@@ -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 (file)
index 0000000..6978da2
--- /dev/null
@@ -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 (file)
index 0000000..b2023d1
--- /dev/null
@@ -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 (file)
index 0000000..6a05f26
--- /dev/null
@@ -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 (file)
index 0000000..1021b97
--- /dev/null
@@ -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 (file)
index 0000000..e3019ce
--- /dev/null
@@ -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)
index 24a9c9adbdc4912dfb11350afbd1c623969aa417..a5033ff468f63d2ba00fd7d00fa4ece261243471 100644 (file)
@@ -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
index a2b3c8106c98c5f821e68d78c5d7969b63b7c862..f9f687c011ce1d38bc8a26d3c2cd324e9dfe016f 100644 (file)
@@ -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)
index 21e7727728f32ce8879dca93157fb4a79488c6c1..b3a53a39e1a37b32a264ce106cc60fe5c16f35dc 100644 (file)
-/* 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)
index 35d92646c08eaeef371ec5bc48e15a3e5780b235..1d2319cbd81d277c08620b323500a3efe57421b5 100644 (file)
@@ -19,6 +19,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <math.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ieee754.h>
index 8e6e3fc1fd11d814b885fe70371839939cadcc12..56fb9e7e3db763c10b1444736a8354e006f2bab5 100644 (file)
@@ -19,6 +19,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <math.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ieee754.h>
index 1cd026e00ca6622254232a596c7c0d80202a91fb..279e070492822bcb81922ae8ec7965ab28bfd087 100644 (file)
@@ -19,6 +19,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <math.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ieee754.h>
index 888ab9bd85d125e33f45c07e0b2dbaecdedd8ffd..4e698ce1d860f4aed186e52432b4b923493ef50b 100644 (file)
@@ -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
index 62e668773c9a67af1f862718b1270fdceeab0eca..741ff9ac9d9e847be3a06fd34d963d2abea85cfa 100644 (file)
@@ -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);                                \