Update. cvs/libc-ud-970920
authorUlrich Drepper <drepper@redhat.com>
Sun, 21 Sep 1997 01:47:02 +0000 (01:47 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 21 Sep 1997 01:47:02 +0000 (01:47 +0000)
1997-09-21 03:19  Ulrich Drepper  <drepper@cygnus.com>

* libio/libio.h: More libstdc++ cleanups.  Define _IO_USE_DTOA if
_G_HAVE_PRINTF_FP is not defined.
* libio/strops.c: Undo patch of 1997-07-08 02:18.  Must find a
different solution for the problem.

* misc/search.h [__USE_GNU]: Define comparison_fn_t.
* stdlib/stdlib.h: Define comparison_fn_t only if __COMPAR_FN_T is
not defined.
Fix typo.  Pretty print inline functions.

* sysdeps/i386/i486/string.h (__stpcpy_small): Increment __cp not cp.
Patch by HJ Lu <hjl@gnu.ai.mit.edu>.

1997-09-20 16:45  Ulrich Drepper  <drepper@cygnus.com>

* hesiod/hesiod.c (hesiod_init): Use __secure_getenv to get
HES_DOMAIN environment variable.
Suggested by Mark Kettenis <kettenis@phys.uva.nl>.

* hesiod/README.hesiod: A bit of information about Hesiod and how
to use it.  Written by Mark Kettenis <kettenis@phys.uva.nl>.

1997-09-20 05:15  Ulrich Drepper  <drepper@cygnus.com>

* manual/maint.texi: Update requirement list.

* io/ftw.h: Don't use parameter names from global namespace in
prototypes.

* stdlib/strtol.c: If used outside glibc handle broken systems
which have character classification functions which are not 8-bit
clean gracefully.  Patch by Bruno Haible <haible@ilog.fr>.

1997-09-19 21:42  David S. Miller  <davem@tanya.rutgers.edu>

* sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h: ssize_t is
a long long int.

1997-09-19 15:12  H.J. Lu  <hjl@gnu.ai.mit.edu>

* posix/Makefile (test-srcs): New, set to globtest.

1997-09-20 00:24  Ulrich Drepper  <drepper@cygnus.com>

* manual/filesys.texi: Document ftw, nftw and needed data types.

1997-09-19 12:53  H.J. Lu  <hjl@gnu.ai.mit.edu>

* sysdeps/i386/i486/bits/string.h: Fix typo.

1997-09-19 14:11  Ulrich Drepper  <drepper@cygnus.com>

* io/ftwtest.c (cb): Print level.
* io/ftwtest-sh: Updated for ftwtest.c change.

* string/argz.h (__argz_next): Cast NULL to char * to satisfy C++
compilers.
Reported by Mirko Streckenbach <mirko@ramz.ing.tu-bs.de>.

* catgets/catgets.c (catopen): Correctly allocate string of nlspath.
Reported by Charles C. Fu <ccwf@klab.caltech.edu>.

1997-09-18 13:30  Klaus Espenlaub  <kespenla@student.informatik.uni-ulm.de>

* sysdeps/i386/init-first.c: Call __getopt_clean_environment with
additional argument.
* sysdeps/mach/hurd/i386/init-first.c: Likewise.
* sysdeps/mach/hurd/mips/init-first.c: Likewise.
* sysdeps/stub/init-first.c: Likewise.

1997-09-18 03:16  Ulrich Drepper  <drepper@cygnus.com>

* manual/search.texi: Document lsearch, lfind, the hsearch and
tsearch functions.

1997-09-18 00:04  Ulrich Drepper  <drepper@cygnus.com>

* misc/hsearch_r.c (hsearch_r): Only return error for ENTER action
if the table is full and we *really* have to enter a new entry.

1997-09-17 19:44  Ulrich Drepper  <drepper@cygnus.com>

* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela): Get rid
of hack for handling flush opcode.
Patch by Richard Henderson <rth@cygnus.com>.

27 files changed:
ChangeLog
INSTALL
PROJECTS
catgets/catgets.c
hesiod/README.hesiod [new file with mode: 0644]
hesiod/hesiod.c
io/ftw.h
io/ftwtest-sh
io/ftwtest.c
libio/libio.h
libio/strops.c
manual/filesys.texi
manual/maint.texi
manual/search.texi
misc/hsearch_r.c
misc/search.h
posix/Makefile
stdlib/stdlib.h
stdlib/strtol.c
string/argz.h
sysdeps/i386/i486/bits/string.h
sysdeps/i386/init-first.c
sysdeps/mach/hurd/i386/init-first.c
sysdeps/mach/hurd/mips/init-first.c
sysdeps/sparc/sparc32/dl-machine.h
sysdeps/stub/init-first.c
sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h

index 4dca6d8b915291a00538fd5dee4a90b4602ce2db..6048b08796a238bbbc47bf1ecde19cab71c5e6ce 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,91 @@
+1997-09-21 03:19  Ulrich Drepper  <drepper@cygnus.com>
+
+       * libio/libio.h: More libstdc++ cleanups.  Define _IO_USE_DTOA if
+       _G_HAVE_PRINTF_FP is not defined.
+       * libio/strops.c: Undo patch of 1997-07-08 02:18.  Must find a
+       different solution for the problem.
+
+       * misc/search.h [__USE_GNU]: Define comparison_fn_t.
+       * stdlib/stdlib.h: Define comparison_fn_t only if __COMPAR_FN_T is
+       not defined.
+       Fix typo.  Pretty print inline functions.
+
+       * sysdeps/i386/i486/string.h (__stpcpy_small): Increment __cp not cp.
+       Patch by HJ Lu <hjl@gnu.ai.mit.edu>.
+
+1997-09-20 16:45  Ulrich Drepper  <drepper@cygnus.com>
+
+       * hesiod/hesiod.c (hesiod_init): Use __secure_getenv to get
+       HES_DOMAIN environment variable.
+       Suggested by Mark Kettenis <kettenis@phys.uva.nl>.
+
+       * hesiod/README.hesiod: A bit of information about Hesiod and how
+       to use it.  Written by Mark Kettenis <kettenis@phys.uva.nl>.
+
+1997-09-20 05:15  Ulrich Drepper  <drepper@cygnus.com>
+
+       * manual/maint.texi: Update requirement list.
+
+       * io/ftw.h: Don't use parameter names from global namespace in
+       prototypes.
+
+       * stdlib/strtol.c: If used outside glibc handle broken systems
+       which have character classification functions which are not 8-bit
+       clean gracefully.  Patch by Bruno Haible <haible@ilog.fr>.
+
+1997-09-19 21:42  David S. Miller  <davem@tanya.rutgers.edu>
+
+       * sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h: ssize_t is
+       a long long int.
+
+1997-09-19 15:12  H.J. Lu  <hjl@gnu.ai.mit.edu>
+
+       * posix/Makefile (test-srcs): New, set to globtest.
+
+1997-09-20 00:24  Ulrich Drepper  <drepper@cygnus.com>
+
+       * manual/filesys.texi: Document ftw, nftw and needed data types.
+
+1997-09-19 12:53  H.J. Lu  <hjl@gnu.ai.mit.edu>
+
+       * sysdeps/i386/i486/bits/string.h: Fix typo.
+
+1997-09-19 14:11  Ulrich Drepper  <drepper@cygnus.com>
+
+       * io/ftwtest.c (cb): Print level.
+       * io/ftwtest-sh: Updated for ftwtest.c change.
+
+       * string/argz.h (__argz_next): Cast NULL to char * to satisfy C++
+       compilers.
+       Reported by Mirko Streckenbach <mirko@ramz.ing.tu-bs.de>.
+
+       * catgets/catgets.c (catopen): Correctly allocate string of nlspath.
+       Reported by Charles C. Fu <ccwf@klab.caltech.edu>.
+
+1997-09-18 13:30  Klaus Espenlaub  <kespenla@student.informatik.uni-ulm.de>
+
+       * sysdeps/i386/init-first.c: Call __getopt_clean_environment with
+       additional argument.
+       * sysdeps/mach/hurd/i386/init-first.c: Likewise.
+       * sysdeps/mach/hurd/mips/init-first.c: Likewise.
+       * sysdeps/stub/init-first.c: Likewise.
+
+1997-09-18 03:16  Ulrich Drepper  <drepper@cygnus.com>
+
+       * manual/search.texi: Document lsearch, lfind, the hsearch and
+       tsearch functions.
+
+1997-09-18 00:04  Ulrich Drepper  <drepper@cygnus.com>
+
+       * misc/hsearch_r.c (hsearch_r): Only return error for ENTER action
+       if the table is full and we *really* have to enter a new entry.
+
+1997-09-17 19:44  Ulrich Drepper  <drepper@cygnus.com>
+
+       * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela): Get rid
+       of hack for handling flush opcode.
+       Patch by Richard Henderson <rth@cygnus.com>.
+
 1997-09-16 23:48  Ulrich Drepper  <drepper@cygnus.com>
 
        * libio/fileops.c: Define __set_errno if necessary.
diff --git a/INSTALL b/INSTALL
index 889780433ee0ea65817a2e14518e3d52d648162f..85fe1eb9040f76f1b6aaf4f505d40fd5caf9907d 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -47,11 +47,13 @@ you run `configure':
 `--prefix=DIRECTORY'
      Install machine-independent data files in subdirectories of
      `DIRECTORY'.  (You can also set this in `configparms'; see below.)
+     The default is to install in `/usr/local'.
 
 `--exec-prefix=DIRECTORY'
      Install the library and other machine-dependent files in
      subdirectories of `DIRECTORY'.  (You can also set this in
-     `configparms'; see below.)
+     `configparms'; see below.)  The default is to use <prefix>/bin and
+     <prefix>/sbin.
 
 `--enable-shared'
 `--disable-shared'
@@ -76,23 +78,6 @@ you run `configure':
      static library is compiled with no optimization and full debugging
      information, and installed as `-lc_g'.
 
-`--enable-bounded'
-`--disable-bounded'
-     Enable or disable building of the C library with support for bounded
-     pointers.  To do this one need the enhanced version of the GNU CC
-     with can generate code for bounded pointers.  This version of the
-     C library is necessary to run code which is also compiled using the
-     enhanced gcc for debugging purposes.
-
-There are two more options:
-
-`--with-gmp'
-`--with-gettext'
-     These options are not of much use for the normal installer of the
-     GNU libc.  Only maintainers need this to get automatic updates of
-     the files from these packages in the GNU C library source tree.
-
-
    The simplest way to run `configure' is to do it in the directory
 that contains the library sources.  This prepares to build the library
 in that very directory.
@@ -127,7 +112,7 @@ and define in that file the parameters you want to specify.
 `configparms' should *not* be an edited copy of `Makeconfig'; specify
 only the parameters that you want to override.  To see how to set these
 parameters, find the section of `Makeconfig' that says "These are the
-configuration variables." Then for each parameter that you want to
+configuration variables."  Then for each parameter that you want to
 change, copy the definition from `Makeconfig' to your new `configparms'
 file, and change the value as appropriate for your system.
 
@@ -155,11 +140,15 @@ library facilities, type `make check'.  This will produce several files
 with names like `PROGRAM.out'.
 
    To format the `GNU C Library Reference Manual' for printing, type
-`make dvi'.
+`make dvi'.  You need a working TeX installation to do this.
 
    To install the library and its header files, and the Info files of
 the manual, type `make install'.  This will build things if necessary,
-before installing them.
+before installing them.  If you want to install the files in a different
+place than the one specified at configuration time you can specify a
+value for the Makefile variable `install_root' on the command line.
+This is useful to create chroot'ed environment or to prepare binary
+releases.
 
 Recommended Tools to Install the GNU C Library
 ----------------------------------------------
@@ -167,27 +156,57 @@ Recommended Tools to Install the GNU C Library
    We recommend installing the following GNU tools before attempting to
 build the GNU C library:
 
-   * `make' 3.75
+   * `make' 3.76.1
 
      You need the latest version of GNU `make'.  Modifying the GNU C
      Library to work with other `make' programs would be so hard that we
-     recommend you port GNU `make' instead.  *Really.* We recommend
-     version GNU `make' version 3.75 or later.
+     recommend you port GNU `make' instead.  *Really.*  We recommend
+     version GNU `make' version 3.75, 3.76.1 or later.  Version 3.76 is
+     known to have a bug which only shows up in big projects like GNU
+     `libc'.
 
-   * GCC 2.7.2.1
+   * GCC 2.7.2.3
 
      On most platforms, the GNU C library can only be compiled with the
      GNU C compiler.  We recommend GCC version 2.7.2 or later; earlier
      versions may have problems.
 
-   * `binutils' 2.7
+     On PowerPC, GCC versions dated earlier than 970904 are known not
+     to work (they crash), including 2.7.2.
+
+   * `binutils' 2.8.1
 
      Using the GNU `binutils' (assembler, linker, and related tools) is
      preferable when possible, and they are required to build an ELF
-     shared C library.  We recommend `binutils' version 2.7 or later;
+     shared C library.  We recommend `binutils' version 2.8.1 or later;
      earlier versions are known to have problems or to not support all
      architectures.
 
+   * `texinfo' 3.11
+
+     To correctly translate and install the Texinfo documentation you
+     need this version of the `texinfo' package.  Former versions did
+     not understand all the tags used in the document and also the
+     installation mechanisms for the info files was not present or
+     worked differently.
+
+     On some Debian Linux based systems the used `install-info' program
+     works differently.  Here you have to run make like this:
+
+          make INSTALL_INFO=/path/to/GNU/install-info install
+
+   If you change any configuration file you will need also
+
+   * `autoconf' 2.12
+
+and if you change any of the message translation files you will also
+need
+
+   * `GNU gettext' 0.10 or later
+
+If you upgrade your source tree using the patches made available you
+probably will need those package above in any case.
+
 Supported Configurations
 ------------------------
 
@@ -195,18 +214,16 @@ Supported Configurations
 following patterns:
 
      alpha-ANYTHING-linux
-     alpha-ANYTHING-linuxecoff
      iX86-ANYTHING-gnu
      iX86-ANYTHING-linux
      m68k-ANYTHING-linux
-     mips-ANYTHING-linux
-     sparc-ANYTHING-linux
      powerpc-ANYTHING-linux
 
-   Former versions of this library used to support the following
-configurations but the current status is unknown:
+   Former releases of this library (version 1.09.1 and perhaps earlier
+versions) used to run on the following configurations:
 
      alpha-dec-osf1
+     alpha-ANYTHING-linuxecoff
      iX86-ANYTHING-bsd4.3
      iX86-ANYTHING-isc2.2
      iX86-ANYTHING-isc3.N
@@ -228,6 +245,12 @@ configurations but the current status is unknown:
      sparc-sun-solaris2.N
      sparc-sun-sunos4.N
 
+   Since no one has volunteered to test and fix the above
+configurations, these are not supported at the moment.  It's expected
+that these don't work anymore.  Porting the library is not hard.  If
+you are interested in doing a port, please contact the glibc
+maintainers by sending electronic mail to <bug-glibc@prep.ai.mit.edu>.
+
    Each case of `iX86' can be `i386', `i486', `i586', or `i686'.  All
 of those configurations produce a library that can run on any of these
 processors.  The library will be optimized for the specified processor,
@@ -278,11 +301,11 @@ and `config.make' which are created by running `configure'; they will
 be in whatever directory was current when you ran `configure'.
 
    If you think you have found some way in which the GNU C library does
-not conform to the ANSI and POSIX standards (*note Standards and
+not conform to the ISO and POSIX standards (*note Standards and
 Portability::.), that is definitely a bug.  Report it!
 
-   Send bug reports to the Internet address `bug-glibc@prep.ai.mit.edu'
-or the UUCP path `mit-eddie!prep.ai.mit.edu!bug-glibc'.  If you have
+   Send bug reports to the Internet address <bug-glibc@prep.ai.mit.edu>
+or the UUCP path <mit-eddie!prep.ai.mit.edu!bug-glibc>.  If you have
 other problems with installation or use, please report those as well.
 
    If you are not sure how a function should behave, and this manual
@@ -290,8 +313,8 @@ doesn't tell you, that's a bug in the manual.  Report that too!  If the
 function's behavior disagrees with the manual, then either the library
 or the manual has a bug, so report the disagreement.  If you find any
 errors or omissions in this manual, please report them to the Internet
-address `bug-glibc-manual@prep.ai.mit.edu' or the UUCP path
-`mit-eddie!prep.ai.mit.edu!bug-glibc-manual'.
+address <bug-glibc-manual@prep.ai.mit.edu> or the UUCP path
+<mit-eddie!prep.ai.mit.edu!bug-glibc-manual>.
 
 Adding New Functions
 ====================
@@ -672,10 +695,11 @@ level of the `sysdeps' hierarchy.  This directory contains
 subdirectories (and subdirectory trees) for various Unix variants.
 
    The functions which are system calls in most Unix systems are
-automatically generated from the `syscalls.list' files for the appropriate
-archirecture.  The format of the syscalls.list files is quite easy: only
-a few informations are necessary line the system call name, the number of
-arguments and such.  The files are run through the C preprocessor.
+implemented in assembly code, which is generated automatically from
+specifications in the file `sysdeps/unix/syscalls.list'.  Some special
+system calls are implemented in files that are named with a suffix of
+`.S'; for example, `_exit.S'.  Files ending in `.S' are run through the
+C preprocessor before being fed to the assembler.
 
    These files all use a set of macros that should be defined in
 `sysdep.h'.  The `sysdep.h' file in `sysdeps/unix' partially defines
@@ -711,7 +735,7 @@ parts of the library were contributed or worked on by other people.
      related code were written by Michael J. Haertel.
 
    * Fast implementations of many of the string functions (`memcpy',
-     `strlen', etc.) were written by Torbjorn Granlund.
+     `strlen', etc.) were written by Torbj"orn Granlund.
 
    * The `tar.h' header file was written by David J. MacKenzie.
 
@@ -722,7 +746,7 @@ parts of the library were contributed or worked on by other people.
    * The DES encryption function `crypt' and related functions were
      contributed by Michael Glad.
 
-   * The `ftw' function was contributed by Ian Lance Taylor.
+   * The `ftw' and `nftw' function was contributed by Ulrich Drepper.
 
    * The startup code to support SunOS shared libraries was contributed
      by Tom Quinn.
@@ -749,7 +773,7 @@ parts of the library were contributed or worked on by other people.
      and the floating-point reading function used by `scanf', `strtod'
      and friends were written by Ulrich Drepper.  The multi-precision
      integer functions used in those functions are taken from GNU MP,
-     which was contributed by Torbjorn Granlund.
+     which was contributed by Torbj"orn Granlund.
 
    * The internationalization support in the library, and the support
      programs `locale' and `localedef', were written by Ulrich Drepper.
@@ -771,9 +795,9 @@ parts of the library were contributed or worked on by other people.
    * The port to Linux/m68k (`m68k-ANYTHING-linux') was contributed by
      Andreas Schwab.
 
-   * The ports to Linux/ARM (`arm-ANYTHING-linuxaout') and ARM standalone
-     (`arm-ANYTHING-none'), as well as parts of the IPv6 support code, were
-     contributed by Philip Blundell.
+   * The ports to Linux/ARM (`arm-ANYTHING-linuxaout') and ARM
+     standalone (`arm-ANYTHING-none'), as well as parts of the IPv6
+     support code, were contributed by Philip Blundell.
 
    * Richard Henderson contributed the ELF dynamic linking code and
      other support for the Alpha processor.
@@ -781,6 +805,12 @@ parts of the library were contributed or worked on by other people.
    * David Mosberger-Tang contributed the port to Linux/Alpha
      (`alpha-ANYTHING-linux').
 
+   * The port to Linux on PowerPC (`powerpc-ANYTHING-linux') was
+     contributed by Geoffrey Keating.
+
+   * Miles Bader wrote the argp argument-parsing package, and the
+     argz/envz interfaces.
+
    * Stephen R. van den Berg contributed a highly-optimized `strstr'
      function.
 
@@ -797,10 +827,9 @@ parts of the library were contributed or worked on by other people.
      platforms was written by Per Bothner and modified by Ulrich
      Drepper.
 
-   * Some of the Internet-related code (most of the `inet'
-     subdirectory) and several other miscellaneous functions and
-     header files have been included from 4.4 BSD with little or no
-     modification.
+   * The Internet-related code (most of the `inet' subdirectory) and
+     several other miscellaneous functions and header files have been
+     included from 4.4 BSD with little or no modification.
 
      All code incorporated from 4.4 BSD is under the following
      copyright:
@@ -851,7 +880,7 @@ parts of the library were contributed or worked on by other people.
      `rand' and `srand' functions, were written by Earl T. Cohen for
      the University of California at Berkeley and are copyrighted by the
      Regents of the University of California.  They have undergone minor
-     changes to fit into the GNU C library and to fit the ANSI C
+     changes to fit into the GNU C library and to fit the ISO C
      standard, but the functional code is Berkeley's.
 
    * The Internet resolver code is taken directly from BIND 4.9.5,
@@ -938,187 +967,7 @@ parts of the library were contributed or worked on by other people.
                 Carnegie Mellon University
                 Pittsburgh PA 15213-3890
 
-          or `Software.Distribution@CS.CMU.EDU' any improvements or
+          or <Software.Distribution@CS.CMU.EDU> any improvements or
           extensions that they make and grant Carnegie Mellon the
           rights to redistribute these changes.
 
-   * The `getaddrinfo' function is written by Craig Metz and it has the
-     following copyright:
-
-       The Inner Net License, Version 2.00
-       ===================================
-
-       The author(s) grant permission for redistribution and use in source and
-       binary forms, with or without modification, of the software
-       and documentation provided that the following conditions are met:
-
-       0. If you receive a version of the software that is
-          specifically labelled as not being for redistribution
-          (check the version message and/or README), you are not
-          permitted to redistribute that version of the software in
-          any way or form.
-       1. All terms of the all other applicable copyrights and
-          licenses must be followed.
-       2. Redistributions of source code must retain the authors'
-          copyright notice(s), this list of conditions, and the
-          following disclaimer.
-       3. Redistributions in binary form must reproduce the authors'
-          copyright notice(s), this list of conditions, and the
-          following disclaimer in the documentation and/or other
-          materials provided with the distribution.
-       4. All advertising materials mentioning features or use of
-          this software must display the following acknowledgement
-          with the name(s) of the authors as specified in the
-          copyright notice(s) substituted where indicated:
-
-       This product includes software developed by <name(s)>, The Inner
-       Net, and other contributors.
-
-       5. Neither the name(s) of the author(s) 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 ITS AUTHORS 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 AUTHORS 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.
-
-       If these license terms cause you a real problem, contact the author.
-+
-   * The `db' library is taken from the db-2.3.4 distribution by Sleepycat
-     Software, and is covered by the following terms:
-
-       /*-
-        * @(#)LICENSE  10.4 (Sleepycat) 7/24/97
-        */
-
-       The following are the copyrights and redistribution conditions
-       that apply to this copy of the DB software.  For a license to use,
-       redistribute or sell DB software under conditions other than those
-       described here, or to purchase support for this software, please
-       contact Sleepycat Software at one of the following addresses:
-
-               Sleepycat Software              db@sleepycat.com
-               394 E. Riding Dr.               +1-508-287-4781
-               Carlisle, MA 01741
-               USA
-
-       =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-       /*
-        * Copyright (c) 1990, 1993, 1994, 1995, 1996, 1997
-        *      Sleepycat Software.  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. Redistributions in any form must be accompanied by information on
-        *    how to obtain complete source code for the DB software and any
-        *    accompanying software that uses the DB software.  The source code
-        *    must either be included in the distribution or be available for
-        *    no more than the cost of distribution plus a nominal fee, and
-        *    must be freely redistributable under reasonable conditions.  For
-        *    an executable file, complete source code means the source code
-        *    for all modules it contains.  It does not mean source code for
-        *    modules or files that typically accompany the operating system
-        *    on which the executable file runs, e.g., standard library
-        *    modules or system header files.
-        *
-        * THIS SOFTWARE IS PROVIDED BY SLEEPYCAT SOFTWARE ``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 SLEEPYCAT
-        * SOFTWARE 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.
-        */
-       /*
-        * Copyright (c) 1990, 1993, 1994, 1995
-        *      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.
-        */
-       /*
-        * Copyright (c) 1995, 1996
-        *      The President and Fellows of Harvard University.  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 Harvard University
-        *      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 HARVARD AND ITS 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 HARVARD OR
-        * ITS 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.
-        */
index 0cff31ae35ab90fad9c26390501c0794befbc136..d7291b8744700fe963474f7806b6fbc57ba6dfb1 100644 (file)
--- a/PROJECTS
+++ b/PROJECTS
@@ -107,7 +107,3 @@ contact <bug-glibc@prep.ai.mit.edu>
                int foo __P ((int, int, int, int));
 
      Blargh!
-
-[16] Write an nss_hesiod module.  The Hesiod daemon from the MIT Athena
-     project should be available.  The goal is to avoid the ugly NIS
-     emulation interface and contacting the daemon directly.
index d5eefc9e085d5a9b12957b54d42c8db4ee05f927..ebfb2c54ccd27bb38666dfe520466b2beed27031 100644 (file)
@@ -94,8 +94,9 @@ catopen (const char *cat_name, int flag)
          nlspath = tmp;
        }
       else
-       result->nlspath = __strdup (NLSPATH);
+       nlspath = NLSPATH;
 
+      result->nlspath = __strdup (NLSPATH);
       if (result->nlspath == NULL)
        {
          free ((void *) result->cat_name);
diff --git a/hesiod/README.hesiod b/hesiod/README.hesiod
new file mode 100644 (file)
index 0000000..914e0d1
--- /dev/null
@@ -0,0 +1,150 @@
+The GNU C library contains an NSS module for the Hesiod name service.
+Hesiod is a general name service for a variety of applications and is
+based on the Berkeley Internet Name Daemon (BIND).
+
+Introduction
+============
+
+The Hesiod NSS module implements access to all relevant standard
+Hesiod types, which means that Hesiod can be used for the `group',
+`passwd' and `services' databases.  There is however a restriction.
+In the same way that it is impossible to use `gethostent()' to iterate
+over all the data provided by DNS, it is not possible to scan the
+entire Hesiod database by means of `getgrent()', `getpwent()' and
+`getservent()'.  Besides, Hesiod only provides support for looking up
+services by name and not for looking them up by port.  In essence this
+means that the Hesiod name service is only consulted as a result of
+one of the following function calls:
+
+  * getgrname(), getgrgid()
+  * getpwname(), getpwuid()
+  * getservbyname()
+
+and their reentrant counterparts.
+
+
+Configuring your systems
+========================
+
+Configuring your systems to make use use the Hesiod name service
+requires one or more of the following steps, depending on whether you
+are already running Hesiod in your network.
+
+Configuring NSS
+---------------
+
+First you should modify the file `/etc/nsswitch.conf' to tell
+NSS for which database you want to use the Hesiod name service.  If
+you want to use Hesiod for all databases it can handle your
+configuration file could look like this:
+
+  # /etc/nsswitch.conf
+  #
+  # Example configuration of GNU Name Service Switch functionality.
+  #
+
+  passwd:        db files hesiod
+  group:         db files hesiod
+  shadow:        db files
+
+  hosts:         files dns
+  networks:      files dns
+
+  protocols:     db files
+  services:      db files hesiod
+  ethers:        db files
+  rpc:           db files
+
+For more information on NSS, please refer to the `The GNU C Library
+Reference Manual'.
+
+
+Configuring Hesiod
+------------------
+
+Next, you will have to configure Hesiod.  If you are already running
+Hesiod in your network, you probably already have a file named
+`hesiod.conf' on your machines (probably as `/etc/hesiod.conf' or
+`/usr/local/etc/hesiod.conf').  The Hesiod NSS module expects this
+file to be found in the sysconfdir (`/usr/local/etc/hesiod.conf' by
+default, see the installation notes on how to change this) or in the
+location specified by the environment variable `HESIOD_CONFIG'.  If
+there is no configuration file you will want to create your own.  It
+should look something like:
+
+  rhs=.your.domain
+  lhs=.ns
+
+The value of rhs can be overridden by the environment variable
+HES_DOMAIN.
+
+Configuring your name servers
+-----------------------------
+
+In addition, if you are not already running Hesiod in your network,
+you need to create Hesiod information on your central name servers.
+You need to run `named' from BIND 4.9 or higher on these servers, and
+make them authoritative for the domain `ns.your.domain' with a line in
+`/etc/named.boot' reading something like:
+
+  primary         ns.your.domain          named.hesiod
+
+or if you are using the new BIND 8.1 or higher add something to
+`/etc/named.conf' like:
+
+  zone "ns.your.domain" {
+          type master;
+          file "named.hesiod";
+  };
+
+Then in the BIND working directory (usually `/var/named') create the
+file `named.hesiod' containing data that looks something like:
+
+  ; SOA and NS records.
+  @       IN      SOA     server1.your.domain admin-address.your.domain (
+                  40000           ; serial - database version number
+                  1800            ; refresh - sec servers
+                  300             ; retry - for refresh
+                  3600000         ; expire - unrefreshed data
+                  7200 )          ; min
+                  NS      server1.your.domain
+                  NS      server2.your.domain
+
+  ; Actual Hesiod data.
+  libc.group      TXT     "libc:*:123:gnu,gnat"
+  123.gid         CNAME   libc.group
+  gnu.passwd      TXT     "gnu:*:4567:123:GNU:/home/gnu:/bin/bash"
+  456.uid         CNAME   mark.passwd
+  nss.service     TXT     "nss;tcp;789;switch sw "
+  nss.service     TXT     "nss;udp;789;switch sw"
+
+where `libc' is an example of a group, `gnu' an example of an user,
+and `nss' an example of a service.  Note that the format used to
+describe services differs from the format used in `/etc/services'.
+For more information on `named' refer to the `Name Server Operations
+Guide for BIND' that is included in the BIND distribution.
+
+
+Security
+========
+
+Note that the information stored in the Hesiod database in principle
+is publicly available.  Care should be taken with including vulnerable
+information like encrypted passwords in the Hesiod database.  There
+are some ways to improve security by using features provided by
+`named' (see the discussion about `secure zones' in the BIND
+documentation), but one should keep in mind that Hesiod was never
+intended to distribute passwords.  In the origional design
+authenticating users was the job of the Kerberos service.
+
+
+More information
+================
+
+For more information on the Hesiod name service take a look at some of
+the papers in ftp://athena-dist.mit.edu:/pub/ATHENA/usenix and the
+documentation that accompanies the source code for the Hesiod name
+service library in ftp://athena-dist.mit.edu:/pub/ATHENA/hesiod.
+
+There is a mailing list at MIT for Hesiod users, hesiod@mit.edu.  To
+get yourself on or off the list, send mail to hesiod-request@mit.edu.
index 076b6e7dbcd122d91c0f4dd8e2d9c16bc2684c01..46ae9a988c1eff42e1f961e01463d8048290ce7d 100644 (file)
@@ -89,7 +89,7 @@ int hesiod_init(void **context)
       if (read_config_file(ctx, configname) >= 0)
        {
          /* The default rhs can be overridden by an environment variable. */
-         p = getenv("HES_DOMAIN");
+         p = __secure_getenv("HES_DOMAIN");
          if (p)
            {
              if (ctx->rhs)
index d788b39d16d7261499d5b466474aed7973b8b8c5..d377f2c947f5d799f3fdccfc6e165c731e0c517a 100644 (file)
--- a/io/ftw.h
+++ b/io/ftw.h
@@ -86,22 +86,23 @@ struct FTW
 
 
 /* Convenient types for callback functions.  */
-typedef int (*__ftw_func_t) __P ((__const char *filename,
-                                 __const struct stat *status, int flag));
+typedef int (*__ftw_func_t) __P ((__const char *__filename,
+                                 __const struct stat *__status, int __flag));
 #ifdef __USE_XOPEN_EXTENDED
-typedef int (*__nftw_func_t) __P ((__const char *filename,
-                                  __const struct stat *status, int flag,
-                                  struct FTW *));
+typedef int (*__nftw_func_t) __P ((__const char *__filename,
+                                  __const struct stat *__status, int __flag,
+                                  struct FTW *__info));
 #endif
 
 /* Call a function on every element in a directory tree.  */
-extern int ftw __P ((__const char *dir, __ftw_func_t func, int descriptors));
+extern int ftw __P ((__const char *__dir, __ftw_func_t __func,
+                    int __descriptors));
 
 #ifdef __USE_XOPEN_EXTENDED
 /* Call a function on every element in a directory tree.  FLAG allows
    to specify the behaviour more detailed.  */
-extern int nftw __P ((__const char *dir, __nftw_func_t func,
-                     int descriptors, int flag));
+extern int nftw __P ((__const char *__dir, __nftw_func_t __func,
+                     int __descriptors, int __flag));
 #endif
 
 __END_DECLS
index 79c35d4f9c711120502170fd3faac032566ae946..f0cd56ab0235fc2455678e4b68ba2ab58ebe681e 100644 (file)
@@ -46,18 +46,18 @@ LD_LIBRARY_PATH=$objpfx $ldso $testprogram $tmpdir |
     sort > $testout
 
 cat <<EOF | cmp $testout - || exit 1
-base = "$tmp/", file = "ftwtest.d", flag = FTW_D
-base = "$tmp/ftwtest.d/", file = "bar", flag = FTW_D
-base = "$tmp/ftwtest.d/", file = "baz", flag = FTW_F
-base = "$tmp/ftwtest.d/", file = "foo", flag = FTW_D
-base = "$tmp/ftwtest.d/bar/", file = "xo", flag = FTW_NS
-base = "$tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_D
-base = "$tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F
-base = "$tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SLN
-base = "$tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_D
-base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F
-base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_D
-base = "$tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F
+base = "/tmp/", file = "ftwtest.d", flag = FTW_D, level = 0
+base = "/tmp/ftwtest.d/", file = "bar", flag = FTW_D, level = 1
+base = "/tmp/ftwtest.d/", file = "baz", flag = FTW_F, level = 1
+base = "/tmp/ftwtest.d/", file = "foo", flag = FTW_D, level = 1
+base = "/tmp/ftwtest.d/bar/", file = "xo", flag = FTW_NS, level = 2
+base = "/tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_D, level = 2
+base = "/tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F, level = 3
+base = "/tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SLN, level = 3
+base = "/tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_D, level = 3
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F, level = 4
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_D, level = 4
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F, level = 5
 EOF
 rm $testout
 
@@ -65,18 +65,18 @@ LD_LIBRARY_PATH=$objpfx $ldso $testprogram --depth $tmpdir |
     sort > $testout
 
 cat <<EOF | cmp $testout - || exit 1
-base = "$tmp/", file = "ftwtest.d", flag = FTW_DP
-base = "$tmp/ftwtest.d/", file = "bar", flag = FTW_DP
-base = "$tmp/ftwtest.d/", file = "baz", flag = FTW_F
-base = "$tmp/ftwtest.d/", file = "foo", flag = FTW_DP
-base = "$tmp/ftwtest.d/bar/", file = "xo", flag = FTW_NS
-base = "$tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_DP
-base = "$tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F
-base = "$tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SLN
-base = "$tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_DP
-base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F
-base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_DP
-base = "$tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F
+base = "/tmp/", file = "ftwtest.d", flag = FTW_DP, level = 0
+base = "/tmp/ftwtest.d/", file = "bar", flag = FTW_DP, level = 1
+base = "/tmp/ftwtest.d/", file = "baz", flag = FTW_F, level = 1
+base = "/tmp/ftwtest.d/", file = "foo", flag = FTW_DP, level = 1
+base = "/tmp/ftwtest.d/bar/", file = "xo", flag = FTW_NS, level = 2
+base = "/tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_DP, level = 2
+base = "/tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F, level = 3
+base = "/tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SLN, level = 3
+base = "/tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_DP, level = 3
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F, level = 4
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_DP, level = 4
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F, level = 5
 EOF
 rm $testout
 
@@ -84,24 +84,45 @@ LD_LIBRARY_PATH=$objpfx $ldso $testprogram --phys $tmpdir |
     sort > $testout
 
 cat <<EOF | cmp $testout - || exit 1
-base = "$tmp/", file = "ftwtest.d", flag = FTW_D
-base = "$tmp/ftwtest.d/", file = "bar", flag = FTW_D
-base = "$tmp/ftwtest.d/", file = "baz", flag = FTW_F
-base = "$tmp/ftwtest.d/", file = "foo", flag = FTW_D
-base = "$tmp/ftwtest.d/bar/", file = "xo", flag = FTW_NS
-base = "$tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_D
-base = "$tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F
-base = "$tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SL
-base = "$tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_D
-base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F
-base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "link@2", flag = FTW_SL
-base = "$tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_D
-base = "$tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F
-base = "$tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "link@3", flag = FTW_SL
+base = "/tmp/", file = "ftwtest.d", flag = FTW_D, level = 0
+base = "/tmp/ftwtest.d/", file = "bar", flag = FTW_D, level = 1
+base = "/tmp/ftwtest.d/", file = "baz", flag = FTW_F, level = 1
+base = "/tmp/ftwtest.d/", file = "foo", flag = FTW_D, level = 1
+base = "/tmp/ftwtest.d/bar/", file = "xo", flag = FTW_NS, level = 2
+base = "/tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_D, level = 2
+base = "/tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F, level = 3
+base = "/tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SL, level = 3
+base = "/tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_D, level = 3
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F, level = 4
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "link@2", flag = FTW_SL, level = 4
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_D, level = 4
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F, level = 5
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "link@3", flag = FTW_SL, level = 5
 EOF
 rm $testout
 
+# For the next test everything must be readable.
 chmod -R a+x $tmpdir
+
+LD_LIBRARY_PATH=$objpfx $ldso $testprogram --chdir $tmpdir |
+    sort > $testout
+
+cat <<EOF | cmp $testout - || exit 1
+base = "/tmp/", file = "ftwtest.d", flag = FTW_D, cwd = /tmp, level = 0
+base = "/tmp/ftwtest.d/", file = "bar", flag = FTW_D, cwd = /tmp/ftwtest.d, level = 1
+base = "/tmp/ftwtest.d/", file = "baz", flag = FTW_F, cwd = /tmp/ftwtest.d, level = 1
+base = "/tmp/ftwtest.d/", file = "foo", flag = FTW_D, cwd = /tmp/ftwtest.d, level = 1
+base = "/tmp/ftwtest.d/bar/", file = "xo", flag = FTW_F, cwd = /tmp/ftwtest.d/bar, level = 2
+base = "/tmp/ftwtest.d/foo/", file = "lvl1", flag = FTW_D, cwd = /tmp/ftwtest.d/foo, level = 2
+base = "/tmp/ftwtest.d/foo/lvl1/", file = "file@1", flag = FTW_F, cwd = /tmp/ftwtest.d/foo/lvl1, level = 3
+base = "/tmp/ftwtest.d/foo/lvl1/", file = "link@1", flag = FTW_SLN, cwd = /tmp/ftwtest.d/foo/lvl1, level = 3
+base = "/tmp/ftwtest.d/foo/lvl1/", file = "lvl2", flag = FTW_D, cwd = /tmp/ftwtest.d/foo/lvl1, level = 3
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "file@2", flag = FTW_F, cwd = /tmp/ftwtest.d/foo/lvl1/lvl2, level = 4
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/", file = "lvl3", flag = FTW_D, cwd = /tmp/ftwtest.d/foo/lvl1/lvl2, level = 4
+base = "/tmp/ftwtest.d/foo/lvl1/lvl2/lvl3/", file = "file@3", flag = FTW_F, cwd = /tmp/ftwtest.d/foo/lvl1/lvl2/lvl3, level = 5
+EOF
+rm $testout
+
 rm -fr $tmpdir
 
 exit 0
index 6daa7e9eee20ce19e3eb746b7b9939efdc23431d..607926517595149cca20cc83335a3b5fe2cd3c2e 100644 (file)
@@ -42,7 +42,7 @@ cb (const char *name, const struct stat *st, int flag, struct FTW *f)
       printf (", cwd = %s", cwd);
       free (cwd);
     }
-  puts ("");
+  printf (", level = %d\n", f->level);
   return 0;
 }
 
index 03b2afdf2810d43efa2dd1d69abeb349febdace7..9e8c108af6efb39f806ff632b6dc05849a906a86 100644 (file)
@@ -72,6 +72,9 @@
 # define const
 #endif
 #define _IO_UNIFIED_JUMPTABLES 1
+#ifndef _G_HAVE_PRINTF_FP
+# define _IO_USE_DTOA 1
+#endif
 
 #if 0
 # ifdef _IO_NEED_STDARG_H
index f7c22627e7197b0cc0b568381e9cd7e6729f1fbb..a9f812e04511cf9d23962cea0b6b9c292afb57da 100644 (file)
@@ -200,8 +200,8 @@ _IO_ssize_t
 _IO_str_count (fp)
      _IO_FILE *fp;
 {
-  return ((fp->_IO_write_end > fp->_IO_read_end
-          ? fp->_IO_write_end : fp->_IO_read_end)
+  return ((fp->_IO_write_ptr > fp->_IO_read_end
+          ? fp->_IO_write_ptr : fp->_IO_read_end)
          - fp->_IO_read_base);
 }
 
index 5ddd8a20a7ed240e5cd50e89531430d7ecb40f42..7e8a1a12d2faea8f577a0ab72db61511cd0e52f1 100644 (file)
@@ -17,6 +17,8 @@ access permissions and modification times.
                                 file names.
 * Accessing Directories::       Finding out what files a directory
                                 contains.
+* Working on Directory Trees::  Apply actions to all files or a selectable
+                                 subset of a directory hierachy.
 * Hard Links::                  Adding alternate names to a file.
 * Symbolic Links::              A file that ``points to'' a file name.
 * Deleting Files::              How to delete a file, and what that means.
@@ -500,6 +502,210 @@ Please note the simple selector function for this example.  Since
 we want to see all directory entries we always return @code{1}.
 
 
+@node Working on Directory Trees
+@section Working on Directory Trees
+@cindex directory hierachy
+@cindex hierachy, directory
+@cindex tree, directory
+
+The functions to handle files in directories described so far allowed to
+retrieve all the information in small pieces or process all files in a
+directory (see @code{scandir}).  Sometimes it is useful to process whole
+hierachies of directories and the contained files.  The X/Open
+specification define two functions to do this.  The simpler form is
+derived from an early definition in @w{System V} systems and therefore
+this function is available on SVID derived systems.  The prototypes and
+required definitions can be found in the @file{ftw.h} header.
+
+Both functions of this @code{ftw} family take as one of the arguments a
+reference to a callback function.  The functions must be of these types.
+
+@deftp {Data Type} __ftw_func_t
+
+@smallexample
+int (*) (const char *, const struct stat *, int)
+@end smallexample
+
+Type for callback functions given to the @code{ftw} function.  The first
+parameter will contain a pointer to the filename, the second parameter
+will point to an object of type @code{struct stat} which will be filled
+for the file named by the first parameter.
+
+@noindent
+The last parameter is a flag given more information about the current
+file.  It can have the following values:
+
+@vindex FTW_F
+@vindex FTW_D
+@vindex FTW_NS
+@vindex FTW_DNR
+@vindex FTW_SL
+@table @code
+@item FTW_F
+The current item is a normal file or files which do not fit into one of
+the following categories.  This means especially special files, sockets
+etc.
+@item FTW_D
+The current item is a directory.
+@item FTW_NS
+The @code{stat} call to fill the object pointed to by the second
+parameter failed and so the information is invalid.
+@item FTW_DNR
+The item is a directory which cannot be read.
+@item FTW_SL
+The item is a symbolic link.  Since symbolic links are normally followed
+seeing this value in a @code{ftw} callback function means the referenced
+file does not exist.  The situation for @code{nftw} is different.
+
+This value is only available if the program is compiled with
+@code{_BSD_SOURCE} or @code{_XOPEN_EXTENDED} defined before including
+the first header.  The original SVID systems do not have symbolic links.
+@end table
+@end deftp
+
+@deftp {Data Type} __nftw_func_t
+
+@smallexample
+int (*) (const char *, const struct stat *, int, struct FTW *)
+@end smallexample
+
+@vindex FTW_DP
+@vindex FTW_SLN
+The first three arguments have the same as for the @code{__ftw_func_t}
+type.  A difference is that for the third argument some additional
+values are defined to allow finer differentiation:
+@table @code
+@item FTW_DP
+The current item is a directory and all subdirectories have already been
+visited and reported.  This flag is returned instead of @code{FTW_D} if
+the @code{FTW_DEPTH} flag is given to @code{nftw} (see below).
+@item FTW_SLN
+The current item is a stale symbolic link.  The file it points to does
+not exist.
+@end table
+
+The last parameter of the callback function is a pointer to a structure
+with some extra information as described below.
+@end deftp
+
+@deftp {Data Type} {struct FTW}
+The contained information helps to interpret the name parameter and
+gives some information about current state of the traversal of the
+directory hierachy.
+
+@table @code
+@item int base
+The value specifies which part of the filename argument given in the
+first parameter to the callback function is the name of the file.  The
+rest of the string is the path to locate the file.  This information is
+especially important if the @code{FTW_CHDIR} flag for @code{nftw} was
+set since then the current directory is the one the current item is
+found in.
+@item int level
+While processing the directory the functions tracks how many directories
+have been examine to find the current item.  This nesting level is
+@math{0} for the item given starting item (file or directory) and is
+incremented by one for each entered directory.
+@end table
+@end deftp
+
+
+@comment ftw.h
+@comment SVID
+@deftypefun int ftw (const char *@var{filename}, __ftw_func_t @var{func}, int @var{descriptors})
+The @code{ftw} function calls the callback function given in the
+parameter @var{func} for every item which is found in the directory
+specified by @var{filename} and all directories below.  The function
+follows symbolic links if necessary but does not process an item twice.
+If @var{filename} names no directory this item is the only object
+reported by calling the callback function.
+
+The filename given to the callback function is constructed by taking the
+@var{filename} parameter and appending the names of all passed
+directories and then the local file name.  So the callback function can
+use this parameter to access the file.  Before the callback function is
+called @code{ftw} calls @code{stat} for this file and passes the
+information up to the callback function.  If this @code{stat} call was
+not successful the failure is indicated by setting the falg argument of
+the callback function to @code{FTW_NS}.  Otherwise the flag is set
+according to the description given in the description of
+@code{__ftw_func_t} above.
+
+The callback function is expected to return @math{0} to indicate that no
+error occurred and the processing should be continued.  If an error
+occurred in the callback function or the call to @code{ftw} shall return
+immediately the callback function can return a value other than
+@math{0}.  This is the only correct way to stop the function.  The
+program must not use @code{setjmp} or similar techniques to continue the
+program in another place.  This would leave the resources allocated in
+the @code{ftw} function allocated.
+
+The @var{descriptors} parameter to the @code{ftw} function specifies how
+many file descriptors the @code{ftw} function is allowed to consume.
+The more descriptors can be used the faster the function can run.  For
+each level of directories at most one descriptor is used so that for
+very deep directory hierachies the limit on open file descriptors for
+the process or the system can be exceeded.  Beside this the limit on
+file descriptors is counted together for all threads in a multi-threaded
+program and therefore it is always good too limit the maximal number of
+open descriptors to a reasonable number.
+
+The return value of the @code{ftw} function is @math{0} if all callback
+function calls returned @math{0} and all actions performed by the
+@code{ftw} succeeded.  If some function call failed (other than calling
+@code{stat} on an item) the function return @math{-1}.  If a callback
+function returns a value other than @math{0} this value is returned as
+the return value of @code{ftw}.
+@end deftypefun
+
+@comment ftw.h
+@comment XPG4.2
+@deftypefun int nftw (const char *@var{filename}, __nftw_func_t @var{func}, int @var{descriptors}, int @var{flag})
+The @code{nftw} functions works like the @code{ftw} functions.  It calls
+the callback function @var{func} for all items it finds in the directory
+@var{filename} and below.  At most @var{descriptors} file descriptors
+are consumed during the @code{nftw} call.
+
+The differences are that for one the callback function is of a different
+type.  It is of type @w{@code{struct FTW *}} and provides the callback
+functions the information described above.
+
+The second difference is that @code{nftw} takes an additional fourth
+argument which is @math{0} or a combination of any of the following
+values, combined using bitwise OR.
+
+@table @code
+@item FTW_PHYS
+While traversing the directory symbolic links are not followed.  I.e.,
+if this flag is given symbolic links are reported using the
+@code{FTW_SL} value for the type parameter to the callback function.
+Please note that if this flag is used the appearence of @code{FTW_SL} in
+a callback function does not mean the referenced file does not exist.
+To indicate this the extra value @code{FTW_SLN} exists.
+@item FTW_MOUNT
+The callback function is only called for items which are on the same
+mounted filesystem as the directory given as the @var{filename}
+parameter to @code{nftw}.
+@item FTW_CHDIR
+If this flag is given the current working directory is changed to the
+directory containing the reported object before the callback function is
+called.
+@item FTW_DEPTH
+If this option is given the function visits first all files and
+subdirectories before the callback function is called for the directory
+itself (depth-first processing).  This also means the type flag given to
+the callback function is @code{FTW_DP} and not @code{FTW_D}.
+@end table
+
+The return value is computed in the same way as for @code{ftw}.
+@code{nftw} return @math{0} if no failure occurred in @code{nftw} and
+all callback function call return values are also @math{0}.  For
+internal errors such as memory problems @math{-1} is returned and
+@var{errno} is set accordingly.  If the return value of a callback
+invocation is nonzero this very same value is returned.
+@end deftypefun
+
+
 @node Hard Links
 @section Hard Links
 @cindex hard link
index 3675c4faba9ffc6f85806242f56e928628816e97..d8e835f441771690699807099006d9696bd3930b 100644 (file)
@@ -176,11 +176,15 @@ facilities, type @code{make check}.  This will produce several files
 with names like @file{@var{program}.out}.
 
 To format the @cite{GNU C Library Reference Manual} for printing, type
-@w{@code{make dvi}}.
+@w{@code{make dvi}}.  You need a working @TeX{} installation to do this.
 
 To install the library and its header files, and the Info files of the
 manual, type @code{make install}.  This will build things if necessary,
-before installing them.@refill
+before installing them.  If you want to install the files in a different
+place than the one specified at configuration time you can specify a
+value for the Makefile variable @code{install_root} on the command line.
+This is useful to create chroot'ed environment or to prepare binary
+releases.@refill
 
 @node Tools for Installation
 @appendixsubsec Recommended Tools to Install the GNU C Library
@@ -192,15 +196,17 @@ build the GNU C library:
 
 @itemize @bullet
 @item
-@code{make} 3.75
+@code{make} 3.76.1
 
 You need the latest version of GNU @code{make}.  Modifying the GNU C
 Library to work with other @code{make} programs would be so hard that we
-recommend you port GNU @code{make} instead.  @strong{Really.}
-We recommend version GNU @code{make} version 3.75 or later.
+recommend you port GNU @code{make} instead.  @strong{Really.}  We
+recommend version GNU @code{make} version 3.75, 3.76.1 or later.
+Version 3.76 is known to have a bug which only shows up in big projects
+like GNU @code{libc}.
 
 @item
-GCC 2.7.2
+GCC 2.7.2.3
 
 On most platforms, the GNU C library can only be compiled with the GNU C
 compiler.  We recommend GCC version 2.7.2 or later; earlier versions may
@@ -216,8 +222,43 @@ Using the GNU @code{binutils} (assembler, linker, and related tools) is
 preferable when possible, and they are required to build an ELF shared C
 library.  We recommend @code{binutils} version 2.8.1 or later; earlier
 versions are known to have problems or to not support all architectures.
+
+@item
+@code{texinfo} 3.11
+
+To correctly translate and install the Texinfo documentation you need
+this version of the @code{texinfo} package.  Former versions did not
+understand all the tags used in the document and also the installation
+mechanisms for the info files was not present or worked differently.
+
+On some Debian Linux based systems the used @code{install-info} program
+works differently.  Here you have to run make like this:
+
+@smallexample
+make INSTALL_INFO=/path/to/GNU/install-info install
+@end smallexample
+@end itemize
+
+If you change any configuration file you will need also
+
+@itemize @bullet
+@item
+@code{autoconf} 2.12
 @end itemize
 
+@noindent
+and if you change any of the message translation files you will also need
+
+@itemize @bullet
+@item
+@code{GNU gettext} 0.10 or later
+@end itemize
+
+@noindent
+If you upgrade your source tree using the patches made available you probably
+will need those package above in any case.
+
+
 @node Supported Configurations
 @appendixsubsec Supported Configurations
 @cindex configurations, all supported
@@ -834,7 +875,7 @@ The DES encryption function @code{crypt} and related functions were
 contributed by Michael Glad.
 
 @item
-The @code{ftw} function was contributed by Ian Lance Taylor.
+The @code{ftw} and @code{nftw} function was contributed by Ulrich Drepper.
 
 @item
 The startup code to support SunOS shared libraries was contributed by
@@ -893,6 +934,11 @@ Hongjiu Lu's Linux version of the GNU C Library.
 The port to Linux/m68k (@code{m68k-@var{anything}-linux}) was
 contributed by Andreas Schwab.
 
+@item
+The ports to Linux/ARM (@code{arm-@var{ANYTHING}-linuxaout}) and ARM
+standalone (@code{arm-@var{ANYTHING}-none}), as well as parts of the
+IPv6 support code, were contributed by Philip Blundell.
+
 @item
 Richard Henderson contributed the ELF dynamic linking code and other
 support for the Alpha processor.
index abb93bb5a88e134b71c8ab82185b41fb188d34ab..356d976555799d8021e43c1c75fa8f444754a7fd 100644 (file)
@@ -14,9 +14,11 @@ and the total number of elements.
 * Array Search Function::       The @code{bsearch} function.
 * Array Sort Function::         The @code{qsort} function.
 * Search/Sort Example::         An example program.
+* Hash Search Function::        The @code{hsearch} function.
+* Tree Search Function::        The @code{tsearch} function.
 @end menu
 
-@node Comparison Functions, Array Search Function,  , Searching and Sorting
+@node Comparison Functions
 @section Defining the Comparison Function
 @cindex Comparison Function
 
@@ -52,12 +54,53 @@ comparison functions.  This type is a GNU extension.
 int comparison_fn_t (const void *, const void *);
 @end smallexample
 
-@node Array Search Function, Array Sort Function, Comparison Functions, Searching and Sorting
+@node Array Search Function
 @section Array Search Function
 @cindex search function (for arrays)
 @cindex binary search function (for arrays)
 @cindex array search function
 
+Generally searching for a specific element in an array means that
+potentially all elements must be checked.  The GNU C library contains
+functions to perform linear search.  The prototypes for the following
+two functions can be found in @file{search.h}.
+
+@comment search.h
+@comment SVID
+@deftypefun {void *} lfind (const void *@var{key}, void *@var{base}, size_t *@var{nmemb}, size_t @var{size}, comparison_fn_t @var{compar})
+The @code{lfind} function searches in the array with @code{*@var{nmemb}}
+elements of @var{size} bytes pointed to by @var{base} for an element
+which matches the one pointed to by @var{key}.  The function pointed to
+by @var{compar} is used decide whether two elements match.
+
+The return value is a pointer to the matching element in the array
+starting at @var{base} if it is found.  If no matching element is
+available @code{NULL} is returned.
+
+The mean runtime of this function is @code{*@var{nmemb}}/2.  This
+function should only be used elements often get added to or deleted from
+the array in which case it might not be useful to sort the array before
+searching.
+@end deftypefun
+
+@comment search.h
+@comment SVID
+@deftypefun {void *} lsearch (const void *@var{key}, void *@var{base}, size_t *@var{nmemb}, size_t @var{size}, comparison_fn_t @var{compar})
+The @code{lsearch} function is similar to the @code{lfind} function.  It
+searches the given array for an element and returns it if found.  The
+difference is that if no matching element is found the @code{lsearch}
+function adds the object pointed to by @var{key} (with a size of
+@var{size} bytes) at the end of the array and it increments the value of
+@code{*@var{nmemb}} to reflect this addition.
+
+This means for the caller that if it is not sure that the array contains
+the element one is searching for the memory allocated for the array
+starting at @var{base} must have room for at least @var{size} more
+bytes.  If one is sure the element is in the array it is better to use
+@code{lfind} so having more room in the array is always necessary when
+calling @code{lsearch}.
+@end deftypefun
+
 To search a sorted array for an element matching the key, use the
 @code{bsearch} function.  The prototype for this function is in
 the header file @file{stdlib.h}.
@@ -85,7 +128,7 @@ This function derives its name from the fact that it is implemented
 using the binary search algorithm.
 @end deftypefun
 
-@node Array Sort Function, Search/Sort Example, Array Search Function, Searching and Sorting
+@node Array Sort Function
 @section Array Sort Function
 @cindex sort function (for arrays)
 @cindex quick sort function (for arrays)
@@ -138,7 +181,7 @@ The @code{qsort} function derives its name from the fact that it was
 originally implemented using the ``quick sort'' algorithm.
 @end deftypefun
 
-@node Search/Sort Example,  , Array Sort Function, Searching and Sorting
+@node Search/Sort Example
 @section Searching and Sorting Example
 
 Here is an example showing the use of @code{qsort} and @code{bsearch}
@@ -191,3 +234,318 @@ Kermit, the frog
 Gonzo, the whatever
 Couldn't find Janice.
 @end smallexample
+
+
+@node Hash Search Function
+@section The @code{hsearch} function.
+
+The functions mentioned so far in this chapter are searching in a sorted
+or unsorted array.  There are other methods to organize information
+which later should be searched.  The costs of insert, delete and search
+differ.  One possible implementation is using hashing tables.
+
+@comment search.h
+@comment SVID
+@deftypefun int hcreate (size_t @var{nel})
+The @code{hcreate} function creates a hashing table which can contain at
+least @var{nel} elements.  There is no possibility to grow this table so
+it is necessary to choose the value for @var{nel} wisely.  The used
+methods to implement this function might make it necessary to make the
+number of elements in the hashing table larger than the expected maximal
+number of elements.  Hashing tables usually work inefficient if they are
+filled 80% or more.  The constant access time guaranteed by hashing can
+only be achieved if few collisions exist.  See Knuth's ``The Art of
+Computer Programming, Part 3: Searching and Sorting'' for more
+information.
+
+The weakest aspect of this function is that there can be at most one
+hashing table used throught the whole program.  The table is allocated
+in local memory out of control of the programmer.  As an extension the
+GNU C library provides an additional set of functions with an reentrant
+interface which provide a similar interface but which allow to keep
+arbitrary many hashing tables.
+
+It is possible to use more than one hashing table in the program run if
+the former table is first destroyed by a call to @code{hdestroy}.
+
+The function returns a non-zero value if successful.  If it return zero
+something went wrong.  This could either mean there is already a hashing
+table in use or the program runs out of memory.
+@end deftypefun
+
+@comment search.h
+@comment SVID
+@deftypefun void hdestroy (void)
+The @code{hdestroy} function can be used to free all the resources
+allocated in a previous call of @code{hcreate}.  After a call to this
+function it is again possible to call @code{hcreate} and allocate a new
+table with possibly different size.
+
+It is important to remember that the elements contained in the hashing
+table at the time @code{hdestroy} is called are @emph{not} freed by this
+function.  It is the responsibility of the program code to free those
+strings (if necessary at all).  Freeing all the element memory iss not
+possible without extra, separately kept information since there is no
+function to iterate through all available elements in the hashing table.
+If it is really necessary to free a table and all elements the
+programmer has to keep a list of all table elements and before calling
+@code{hdestroy} s/he has to free all element's data using this list.
+This is a very unpleasent mechanism and it also shows that this kind of
+hashing tables is mainly meant for tables which are created once and
+used until the end of the program run.
+@end deftypefun
+
+Entries of the hashing table and keys for the search are defined using
+this type:
+
+@deftp {Data type} {struct ENTRY}
+Both elements of this structure are pointers to zero-terminated strings.
+This is a limiting restriction of the functionality of the
+@code{hsearch} functions.  They can only be used for data sets which use
+the NUL character always and solely to terminate the records.  It is not
+possible to handle general binary data.
+
+@table @code
+@item char *key
+Pointer to a zero-terminated string of characters describing the key for
+the search or the element in the hashing table.
+@item char *data
+Pointer to a zero-terminated string of characters describing the data.
+If the functions will be called only for searching an existing entry
+this element might stay undefined since it is not used.
+@end table
+@end deftp
+
+@comment search.h
+@comment SVID
+@deftypefun {ENTRY *} hsearch (ENTRY @var{item}, ACTION @var{action})
+To search in a hashing table created using @code{hcreate} the
+@code{hsearch} function must be used.  This function can perform simple
+search for an element (if @var{action} has the @code{FIND}) or it can
+alternatively insert the key element into the hashing table, possibly
+replacing a previous value (if @var{action} is @code{ENTER}).
+
+The key is denoted by a pointer to an object of type @code{ENTRY}.  For
+locating the corresponding position in the hashing table only the
+@code{key} element of the structure is used.
+
+The return value depends on the @var{action} parameter value.  If it is
+@code{FIND} the value is a pointer to the matching element in the
+hashing table or @code{NULL} if no matching element exists.  If
+@var{action} is @code{ENTER} the return value is only @code{NULL} if the
+programs runs out of memory while adding the new element to the table.
+Otherwise the return value is a pointer to the element in the hashing
+table which contains newly added element based on the data in @var{key}.
+@end deftypefun
+
+As mentioned before the hashing table used by the functions described so
+far is global and there can be at any time at most one hashing table in
+the program.  A solution is to use the following functions which are a
+GNU extension.  All have in common that they operate on a hashing table
+which is described by the content of an object of the type @code{struct
+hsearch_data}.  This type should be treated as opaque, none of its
+members should be changed directly.
+
+@comment search.h
+@comment GNU
+@deftypefun int hcreate_r (size_t @var{nel}, struct hsearch_data *@var{htab})
+The @code{hcreate_r} function intializes the object pointed to by
+@var{htab} to contain a hashing table with at least @var{nel} elements.
+So this function is equivalent to the @code{hcreate} function except
+that the initialized data structure is controlled by the user.
+
+This allows to have more than once hashing table at one time.  The
+memory necessary for the @code{struct hsearch_data} object can be
+allocated dynamically.
+
+The return value is non-zero if the operation were successful.  if the
+return value is zero something went wrong which probably means the
+programs runs out of memory.
+@end deftypefun
+
+@comment search.h
+@comment GNU
+@deftypefun void hdestroy_r (struct hsearch_data *@var{htab})
+The @code{hdestroy_r} function frees all resources allocated by the
+@code{hcreate_r} function for this very same object @var{htab}.  As for
+@code{hdestroy} it is the programs responsibility to free the strings
+for the elements of the table.
+@end deftypefun
+
+@comment search.h
+@comment GNU
+@deftypefun int hsearch_r (ENTRY @var{item}, ACTION @var{action}, ENTRY **@var{retval}, struct hsearch_data *@var{htab})
+The @code{hsearch_r} function is equivalent to @code{hsearch}.  The
+meaning of the first two arguments is identical.  But instead of
+operating on a single global hashing table the functio works on the
+table described by the object pointed to by @var{htab} (which is
+initialized by a call to @code{hcreate_r}).
+
+Another difference to @code{hcreate} is that the pointer to the found
+entry in the table is not the return value of the functions.  It is
+returned by storing it in a pointer variables pointed to by the
+@var{retval} parameter.  The return value of the function is an integer
+value indicating success if it is non-zero and failure if it is zero.
+In the later case the global variable @var{errno} signals the reason for
+the failure.
+
+@table @code
+@item ENOMEM
+The table is filled and @code{hsearch_r} was called with an so far
+unknown key and @var{action} set to @code{ENTER}.
+@item ESRCH
+The @var{action} parameter is @code{FIND} and no corresponding element
+is found in the table.
+@end table
+@end deftypefun
+
+
+@node Tree Search Function
+@section The @code{tsearch} function.
+
+Another common form to organize data for efficient search is to use
+trees.  The @code{tsearch} function family provides a nice interface to
+functions to organize possibly large amounts of data by providing a mean
+access time proportional to the logarithm of the number of elements.
+The GNU C library implementation even guarantees that this bound is
+never exceeded even for input data which cause problems for simple
+binary tree implementations.
+
+The functions desribed in the chapter are all described in the @w{System
+V} and X/Open specifications and are therefore quite portable.
+
+In contrast to the @code{hsearch} functions the @code{tsearch} functions
+can be used with arbitrary data and not only zero-terminated strings.
+
+The @code{tsearch} functions have the advantage that no function to
+initialize data structures is necessary.  A simple pointer of type
+@code{void *} initialized to @code{NULL} is a valid tree and can be
+extended or searched.
+
+@comment search.h
+@comment SVID
+@deftypefun {void *} tsearch (const void *@var{key}, void **@var{rootp}, comparison_fn_t @var{compar})
+The @code{tsearch} function searches in the tree pointed to by
+@code{*@var{rootp}} for an element matching @var{key}.  The function
+pointed to by @var{compar} is used to determine wether two elements
+match.  @xref{Comparison Functions} for a specification of the functions
+which can be used for the @var{compar} parameter.
+
+If the tree does not contain a matching entry the @var{key} value will
+be added to the tree.  @code{tsearch} does not make a copy of the object
+pointed to by @var{key} (how could it since the size is unknown).
+Instead it adds a reference to this object which means the object must
+be available as long as the tree data structure is used.
+
+The tree is represented by a pointer to a pointer since it is sometimes
+necessary to change the root node of the tree.  So it must not be
+assumed that the variable pointed to by @var{rootp} has the same value
+after the call.  This also shows that it is not safe to call the
+@code{tsearch} function more than once at the same time using the same
+tree.  It is no problem to run it more than once at a time on different
+trees.
+
+The return value is a pointer to the matching element in the tree.  If a
+new element was created the pointer points to the new data (which is in
+fact @var{key}).  If an entry had to be created and the program ran out
+of space @code{NULL} is returned.
+@end deftypefun
+
+@comment search.h
+@comment SVID
+@deftypefun {void *} tfind (const void *@var{key}, void *const *@var{rootp}, comparison_fn_t @var{compar})
+The @code{tfind} function is similar to the @code{tsearch} function.  It
+locates an element matching the one pointed to by @var{key} and returns
+a pointer to this element.  But if no matching element is available no
+new element is entered (note that the @var{rootp} parameter points to a
+constant pointer).  Instead the function returns @code{NULL}.
+@end deftypefun
+
+Another advantage of the @code{tsearch} function in contrast to the
+@code{hsearch} functions is that there is an easy way to remove
+elements.
+
+@comment search.h
+@comment SVID
+@deftypefun {void *} tdelete (const void *@var{key}, void **@var{rootp}, comparison_fn_t @var{compar})
+To remove a specific element matching @var{key} from the tree
+@code{tdelete} can be used.  It locates the matching element using the
+same method as @code{tfind}.  The corresponding element is then removed
+and the data if this tree node is returned by the function.  If there is
+no matching entry in the tree nothing can be deleted and the function
+returns @code{NULL}.
+@end deftypefun
+
+@comment search.h
+@comment GNU
+@deftypefun void tdestroy (void *@var{vroot}, __free_fn_t @var{freefct})
+If the complete search tree has to be removed one can use
+@code{tdestroy}.  It frees all resources allocated by the @code{tsearch}
+function to generate the tree pointed to by @var{vroot}.
+
+For the data in each tree node the function @var{freefct} is called.
+The pointer to the data is passed as the argument to the function.  If
+no such work is necessary @var{freefct} must point to a function doing
+nothing.  It is called in any case.
+
+This function is a GNU extension and not covered by the @w{System V} or
+X/Open specifications.
+@end deftypefun
+
+In addition to the function to create and destroy the tree data
+structure there is another function which allows to apply a function on
+all elements of the tree.  The function must have this type:
+
+@smallexample
+int __action_fn_t (const void *nodep, VISIT value, int level);
+@end smallexample
+
+The @var{nodep} is the data value of the current node (nce given as the
+@var{key} argument to @code{tsearch}).  @var{level} is a numeric value
+which corresponds to the depth of the current node in the tree.  The
+root node has the depth @math{0} and its children have a depth of
+@math{1} and so on.  The @code{VISIT} type is an enumeration type.
+
+@deftp {Data Type} VISIT
+The @code{VISIT} value indicates the status of the current node in the
+tree and how the function is called.  The status of a node is either
+`leaf' or `internal node'.  For each leaf node the function is called
+exactly once, for each internal node it is called three times: before
+the first child is processed, after the first child is processed and
+after both childs are processed.  This makes it possible to handle all
+three methods of tree traversal (or even a combination of them).
+
+@table @code
+@item preorder
+The current node is an internal node and the function is called before
+the first child was processed.
+@item endorder
+The current node is an internal node and the function is called after
+the first child was processed.
+@item postorder
+The current node is an internal node and the function is called after
+the second child was processed.
+@item leaf
+The current node is a leaf.
+@end table
+@end deftp
+
+@comment search.h
+@comment SVID
+@deftypefun void twalk (const void *@var{root}, __action_fn_t @var{action})
+For each node in the tree with a node pointed to by @var{root} the
+@code{twalk} function calls the function provided by the parameter
+@var{action}.  For leaf nodes the function is called exactly once with
+@var{value} set to @code{leaf}.  For internal nodes the function is
+called three times, setting the @var{value} parameter or @var{action} to
+the appropriate value.  The @var{level} argument for the @var{action}
+function is computed while descending the tree with increasing the value
+by one for the escend to a child, starting with the value @math{0} for
+the root node.
+
+Since the functions used for the @var{action} parameter to @code{twalk}
+must not modify the tree data it is safe to run @code{twalk} is more
+than one thread at the same time working on the same tree.  It is also
+safe to call @code{tfind} in parallel.  Functions which modify the tree
+must not be used.  Otherwise the behaviour is undefined.
+@end deftypefun
index 980b7c8d7226d82ecd7c23fedfcbb15b2ffd8fea..d9255e1c6be4d223b696ead5d8bccf1ca068c0e6 100644 (file)
@@ -1,6 +1,6 @@
-/* Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc.
-   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+/* Copyright (C) 1993, 1995, 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1993.
 
    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
@@ -143,15 +143,6 @@ hsearch_r (item, action, retval, htab)
   unsigned int len = strlen (item.key);
   unsigned int idx;
 
-  /* If table is full and another entry should be entered return with
-     error.  */
-  if (action == ENTER && htab->filled == htab->size)
-    {
-      __set_errno (ENOMEM);
-      *retval = NULL;
-      return 0;
-    }
-
   /* Compute an value for the given string. Perhaps use a better method. */
   hval = len;
   count = len;
@@ -213,6 +204,15 @@ hsearch_r (item, action, retval, htab)
   /* An empty bucket has been found. */
   if (action == ENTER)
     {
+      /* If table is full and another entry should be entered return
+        with error.  */
+      if (action == ENTER && htab->filled == htab->size)
+       {
+         __set_errno (ENOMEM);
+         *retval = NULL;
+         return 0;
+       }
+
       htab->table[idx].used  = hval;
       htab->table[idx].entry = item;
 
index 2b0106463d9d75dc56f5e7fc44b66a3bff407671..1cd4fdb9ef9fbfc73a48fb29f71fbcf71772bebe 100644 (file)
@@ -52,6 +52,10 @@ extern void remque __P ((void *__elem));
 #ifndef __COMPAR_FN_T
 # define __COMPAR_FN_T
 typedef int (*__compar_fn_t) __P ((__const __ptr_t, __const __ptr_t));
+
+# ifdef        __USE_GNU
+typedef __compar_fn_t comparison_fn_t;
+# endif
 #endif
 
 /* Action which shall be performed in the call the hsearch.  */
index 2b14fac1381a4faedbf76b6fb8fa54ba1f31cb6b..cbcb6d1b1bd43590b179a05ee19ba2f029aa582a 100644 (file)
@@ -52,6 +52,7 @@ routines :=                                                                 \
 
 aux            := init-posix environ
 tests          := tstgetopt testfnm runtests
+test-srcs      := globtest
 others         := getconf
 install-bin    := getconf
 install-lib    := libposix.a
index 7963cb6fecec879d941d60f85a1b4a24367408d8..a92df4bc9edc1360698bba796026378990e7e4d7 100644 (file)
@@ -210,58 +210,90 @@ extern unsigned long long int __strtoull_internal __P ((__const char *
 #if defined __OPTIMIZE__ && __GNUC__ >= 2
 /* Define inline functions which call the internal entry points.  */
 
-extern __inline double strtod (__const char *__restrict __nptr,
-                              char **__restrict __endptr)
-{ return __strtod_internal (__nptr, __endptr, 0); }
-extern __inline long int strtol (__const char *__restrict __nptr,
-                                char **__restrict __endptr, int __base)
-{ return __strtol_internal (__nptr, __endptr, __base, 0); }
-extern __inline unsigned long int strtoul (__const char *__restrict __nptr,
-                                          char **__restrict __endptr,
-                                          int __base)
-{ return __strtoul_internal (__nptr, __endptr, __base, 0); }
-
-#ifdef __USE_GNU
-extern __inline float strtof (__const char *__restrict __nptr,
-                             char **__restrict __endptr)
-{ return __strtof_internal (__nptr, __endptr, 0); }
-extern __inline __long_double_t strtold (__const char *__restrict __nptr,
-                                        char **__restrict __endptr)
-{ return __strtold_internal (__nptr, __endptr, 0); }
-#endif
-
-#ifdef __USE_BSD
-extern __inline long long int strtoq (__const char *__restrict __nptr,
-                                     char **__restrict __endptr, int __base)
-{ return __strtoll_internal (__nptr, __endptr, __base, 0); }
-extern __inline unsigned long long int strtouq (__const char *__restrict __nptr,
-                                               char **__restrict __endptr,
-                                               int __base)
-{ return __strtoull_internal (__nptr, __endptr, __base, 0); }
-#endif
-
-#if defined __USE_MISC || defined __USE_ISOC9X
-extern __inline long long int strtoll (__const char *__restrict __nptr,
-                                      char **__restrict __endptr, int __base)
-{ return __strtoll_internal (__nptr, __endptr, __base, 0); }
-extern __inline unsigned long long int strtoull (__const char *
-                                                __restrict __nptr,
-                                                char **__restrict __endptr,
-                                                int __base)
-{ return __strtoull_internal (__nptr, __endptr, __base, 0); }
-#endif
-
-extern __inline double atof (__const char *__nptr)
-{ return strtod (__nptr, (char **) NULL); }
-extern __inline int atoi (__const char *__nptr)
-{ return (int) strtol (__nptr, (char **) NULL, 10); }
-extern __inline long int atol (__const char *__nptr)
-{ return strtol (__nptr, (char **) NULL, 10); }
-
-#if defined __USE_MISC || defined __USE_ISOC9X
-extern __inline long long int atoll (__const char *__nptr)
-{ return strtoll (__nptr, (char **) NULL, 10); }
-#endif
+extern __inline double
+strtod (__const char *__restrict __nptr, char **__restrict __endptr)
+{
+  return __strtod_internal (__nptr, __endptr, 0);
+}
+extern __inline long int
+strtol (__const char *__restrict __nptr, char **__restrict __endptr,
+       int __base)
+{
+  return __strtol_internal (__nptr, __endptr, __base, 0);
+}
+extern __inline unsigned long int
+strtoul (__const char *__restrict __nptr, char **__restrict __endptr,
+        int __base)
+{
+  return __strtoul_internal (__nptr, __endptr, __base, 0);
+}
+
+# ifdef __USE_GNU
+extern __inline float
+strtof (__const char *__restrict __nptr, char **__restrict __endptr)
+{
+  return __strtof_internal (__nptr, __endptr, 0);
+}
+extern __inline __long_double_t
+strtold (__const char *__restrict __nptr, char **__restrict __endptr)
+{
+  return __strtold_internal (__nptr, __endptr, 0);
+}
+# endif
+
+# ifdef __USE_BSD
+extern __inline long long int
+strtoq (__const char *__restrict __nptr, char **__restrict __endptr,
+       int __base)
+{
+  return __strtoll_internal (__nptr, __endptr, __base, 0);
+}
+extern __inline unsigned long long int
+strtouq (__const char *__restrict __nptr, char **__restrict __endptr,
+        int __base)
+{
+  return __strtoull_internal (__nptr, __endptr, __base, 0);
+}
+# endif
+
+# if defined __USE_MISC || defined __USE_ISOC9X
+extern __inline long long int
+strtoll (__const char *__restrict __nptr, char **__restrict __endptr,
+        int __base)
+{
+  return __strtoll_internal (__nptr, __endptr, __base, 0);
+}
+extern __inline unsigned long long int
+strtoull (__const char * __restrict __nptr, char **__restrict __endptr,
+         int __base)
+{
+  return __strtoull_internal (__nptr, __endptr, __base, 0);
+}
+# endif
+
+extern __inline double
+atof (__const char *__nptr)
+{
+  return strtod (__nptr, (char **) NULL);
+}
+extern __inline int
+atoi (__const char *__nptr)
+{
+  return (int) strtol (__nptr, (char **) NULL, 10);
+}
+extern __inline long int
+atol (__const char *__nptr)
+{
+  return strtol (__nptr, (char **) NULL, 10);
+}
+
+# if defined __USE_MISC || defined __USE_ISOC9X
+extern __inline long long int
+atoll (__const char *__nptr)
+{
+  return strtoll (__nptr, (char **) NULL, 10);
+}
+# endif
 #endif /* Optimizing GCC >=2.  */
 
 
@@ -304,7 +336,7 @@ extern __ptr_t __setstate __P ((__ptr_t __statebuf));
 extern __ptr_t setstate __P ((__ptr_t __statebuf));
 
 
-#ifdef __USE_MISC
+# ifdef __USE_MISC
 /* Reentrant versions of the `random' family of functions.
    These functions all use the following data structure to contain
    state, rather than global state variables.  */
@@ -333,7 +365,7 @@ extern int initstate_r __P ((unsigned int __seed, __ptr_t __statebuf,
 
 extern int __setstate_r __P ((__ptr_t __statebuf, struct random_data *__buf));
 extern int setstate_r __P ((__ptr_t __statebuf, struct random_data *__buf));
-#endif /* Use misc.  */
+# endif        /* Use misc.  */
 #endif /* Use SVID || extended X/Open.  */
 
 
@@ -441,7 +473,7 @@ extern void cfree __P ((__ptr_t __ptr));
 #endif /* Use misc.  */
 
 #if defined __USE_GNU || defined __USE_BSD || defined __USE_MISC
-#include <alloca.h>
+# include <alloca.h>
 #endif /* Use GNU, BSD, or misc.  */
 
 #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
@@ -545,12 +577,12 @@ extern char *realpath __P ((__const char *__name, char *__resolved));
 
 /* Shorthand for type of comparison functions.  */
 #ifndef __COMPAR_FN_T
-#define __COMPAR_FN_T
+# define __COMPAR_FN_T
 typedef int (*__compar_fn_t) __P ((__const __ptr_t, __const __ptr_t));
-#endif
 
-#ifdef __USE_GNU
+# ifdef        __USE_GNU
 typedef __compar_fn_t comparison_fn_t;
+# endif
 #endif
 
 /* Do a binary search for KEY in BASE, which consists of NMEMB elements
@@ -568,7 +600,7 @@ extern void qsort __P ((__ptr_t __base, size_t __nmemb, size_t __size,
 /* Return the absolute value of X.  */
 extern int abs __P ((int __x)) __attribute__ ((__const__));
 extern long int labs __P ((long int __x)) __attribute__ ((__const__));
-#if defined __USE_ISOC9X
+#ifdef __USE_ISOC9X
 extern long long int llabs __P ((long long int __x))
      __attribute__ ((__const__));
 #endif
@@ -643,8 +675,11 @@ extern int mbtowc __P ((wchar_t *__restrict __pwc,
 extern int wctomb __P ((char *__s, wchar_t __wchar));
 
 #if defined __OPTIMIZE__ && __GNUC__ >= 2
-extern __inline int mblen (__const char *__s, size_t __n)
-{ return mbtowc ((wchar_t *) NULL, __s, __n); }
+extern __inline int
+mblen (__const char *__s, size_t __n)
+{
+  return mbtowc ((wchar_t *) NULL, __s, __n);
+}
 #endif /* Optimizing GCC >=2.  */
 
 
@@ -671,7 +706,7 @@ extern int rpmatch __P ((__const char *__response));
    optional value introduced by an equal sign.  If the suboption is
    not part of TOKENS return in *VALUEP beginning of unknown
    suboption.  On exit *OPTIONP is set to the beginning of the next
-   otken or at the terminating NUL character.  */
+   token or at the terminating NUL character.  */
 extern int getsubopt __P ((char **__optionp, __const char *__const *__tokens,
                           char **__valuep));
 #endif
index 97ad23453b4c8af01bd18c1f83e66ba085156183..19e4a52880597c7d508227b0efac17e9bdb9d197 100644 (file)
@@ -184,6 +184,11 @@ extern int errno;
 #  define TOUPPER(Ch) towupper (Ch)
 # endif
 # else
+#  if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII)
+#   define IN_CTYPE_DOMAIN(c) 1
+#  else
+#   define IN_CTYPE_DOMAIN(c) isascii(c)
+#  endif
 #  define L_(Ch) Ch
 #  define UCHAR_TYPE unsigned char
 #  define STRING_TYPE char
@@ -192,9 +197,9 @@ extern int errno;
 #  define ISALPHA(Ch) __isalpha_l ((Ch), loc)
 #  define TOUPPER(Ch) __toupper_l ((Ch), loc)
 # else
-#  define ISSPACE(Ch) isspace (Ch)
-#  define ISALPHA(Ch) isalpha (Ch)
-#  define TOUPPER(Ch) toupper (Ch)
+#  define ISSPACE(Ch) (IN_CTYPE_DOMAIN (Ch) && isspace (Ch))
+#  define ISALPHA(Ch) (IN_CTYPE_DOMAIN (Ch) && isalpha (Ch))
+#  define TOUPPER(Ch) (IN_CTYPE_DOMAIN (Ch) ? toupper (Ch) : (Ch))
 # endif
 #endif
 
index d5847cb425df8a8ceaa30c0896f684b1ee686c18..20e8a55321c4841055269eb92fbda70b81fe8e37 100644 (file)
@@ -27,7 +27,7 @@
 #include <string.h>            /* Need size_t, and strchr is called below.  */
 
 #ifndef __const
-#define __const const
+# define __const const
 #endif
 
 #ifndef __error_t_defined
@@ -133,7 +133,7 @@ extern char *__argz_next __P ((char *argz, size_t __argz_len,
 extern char *argz_next __P ((char *argz, size_t __argz_len,
                             __const char *entry));
 
-#if defined (__OPTIMIZE__) && __GNUC__ >= 2
+#if defined __OPTIMIZE__ && __GNUC__ >= 2
 extern inline char *
 __argz_next (char *__argz, size_t __argz_len, __const char *__entry)
 {
@@ -142,7 +142,7 @@ __argz_next (char *__argz, size_t __argz_len, __const char *__entry)
       if (__entry < __argz + __argz_len)
        __entry = strchr (__entry, '\0') + 1;
 
-      return __entry >= __argz + __argz_len ? NULL : (char *) __entry;
+      return __entry >= __argz + __argz_len ? (char *) NULL : (char *) __entry;
     }
   else
     return __argz_len > 0 ? __argz : 0;
index 5e4abbc3e52f7d6fe9f76c13e1ae58dd3e1680df..10915ced1d10d016e27704003679bcc8f1d51818 100644 (file)
@@ -471,7 +471,7 @@ __strcpy_g (char *__dest, __const char *__src)
                      case 2:                                                 \
                        *((__uint16_t *) __cp) =                              \
                          __STRING_SMALL_GET16 (src, 0);                      \
-                       ++cp;                                                 \
+                       ++__cp;                                               \
                        break;                                                \
                      case 3:                                                 \
                        *((__uint16_t *) __cp)++ =                            \
@@ -481,7 +481,7 @@ __strcpy_g (char *__dest, __const char *__src)
                      case 4:                                                 \
                        *((__uint32_t *) __cp) =                              \
                          __STRING_SMALL_GET32 (src, 0);                      \
-                       cp += 3;                                              \
+                       __cp += 3;                                            \
                        break;                                                \
                      case 5:                                                 \
                        *((__uint32_t *) __cp)++ =                            \
@@ -493,7 +493,7 @@ __strcpy_g (char *__dest, __const char *__src)
                          __STRING_SMALL_GET32 (src, 0);                      \
                        *((__uint16_t *) __cp) =                              \
                          __STRING_SMALL_GET16 (src, 4);                      \
-                       ++cp;                                                 \
+                       ++__cp;                                               \
                        break;                                                \
                      case 7:                                                 \
                        *((__uint32_t *) __cp)++ =                            \
@@ -507,7 +507,7 @@ __strcpy_g (char *__dest, __const char *__src)
                          __STRING_SMALL_GET32 (src, 0);                      \
                        *((__uint32_t *) __cp) =                              \
                          __STRING_SMALL_GET32 (src, 4);                      \
-                       cp += 3;                                              \
+                       __cp += 3;                                            \
                        break;                                                \
                      }                                                       \
                    __cp; }))
index 47dd299e186855df9d1f61ccb107a0c7f6d89569..118f84201feda4cf4f6f86b3519b9c26617c679a 100644 (file)
@@ -1,6 +1,6 @@
 /* Initialization code run first thing by the ELF startup code.  For i386/Unix.
-     Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
-     This file is part of the GNU C Library.
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as
@@ -20,7 +20,7 @@
 #include <unistd.h>
 
 extern void __libc_init (int, char **, char **);
-extern void __getopt_clean_environment (void);
+extern void __getopt_clean_environment (char **);
 extern void __libc_global_ctors (void);
 
 int __libc_multiple_libcs = 1;
@@ -36,7 +36,7 @@ init (int *data)
   __libc_init (argc, argv, envp);
 
   /* This is a hack to make the special getopt in GNU libc working.  */
-  __getopt_clean_environment ();
+  __getopt_clean_environment (envp);
 }
 
 #ifdef PIC
index 4c4f6ff6654804fb20fefc738f73227bf5dc1291..10094f096708707cbf6af99d2d348d29dbab9351 100644 (file)
@@ -27,7 +27,7 @@
 
 extern void __mach_init (void);
 extern void __libc_init (int, char **, char **);
-extern void __getopt_clean_environment (void);
+extern void __getopt_clean_environment (char **);
 extern void __libc_global_ctors (void);
 
 unsigned int __hurd_threadvar_max;
@@ -109,7 +109,7 @@ init1 (int argc, char *arg0, ...)
   __libc_init (argc, argv, __environ);
 
   /* This is a hack to make the special getopt in GNU libc working.  */
-  __getopt_clean_environment ();
+  __getopt_clean_environment (envp);
 
 #ifdef PIC
   __libc_global_ctors ();
@@ -170,7 +170,7 @@ init (int *data)
       /* Force NEWSP into %ecx and &init1 into %eax, which are not restored
         by function return.  */
       asm volatile ("# a %0 c %1" : : "a" (newsp), "c" (&init1));
-    } 
+    }
   else
     {
       /* The argument data is just above the stack frame we will unwind by
@@ -202,7 +202,7 @@ init (int *data)
      init1's return address, and then jump there.  */
   asm volatile ("pushl %eax; jmp *%ecx");
   /* NOTREACHED */
-}  
+}
 
 
 #ifdef PIC
@@ -223,7 +223,7 @@ _init (int argc, ...)
   __mach_init ();
 
   RUN_HOOK (_hurd_preinit_hook, ());
-  
+
   init (&argc);
 }
 #endif
@@ -256,7 +256,7 @@ __libc_init_first (int argc __attribute__ ((unused)), ...)
   __mach_init ();
 
   RUN_HOOK (_hurd_preinit_hook, ());
-  
+
   _hurd_startup ((void **) &argc, &doinit);
 #endif
 }
@@ -267,8 +267,8 @@ __libc_init_first (int argc __attribute__ ((unused)), ...)
    in ld.so causes disaster, because the _init definition above will
    cause ld.so to gain an init function, which is not a cool thing. */
 
-void 
-_dl_start (void) 
-{ 
-  abort (); 
+void
+_dl_start (void)
+{
+  abort ();
 }
index b057aeb097fdf38eb8ae07b4525fb7b309520fe2..a411a1b0e9cf66eee7ad05e65089c255921bc8fa 100644 (file)
@@ -27,7 +27,7 @@
 
 extern void __mach_init (void);
 extern void __libc_init (int, char **, char **);
-extern void __getopt_clean_environment (void);
+extern void __getopt_clean_environment (char **);
 extern void __libc_global_ctors (void);
 
 unsigned int __hurd_threadvar_max;
@@ -110,7 +110,7 @@ init1 (int argc, char *arg0, ...)
   __libc_init (argc, argv, __environ);
 
   /* This is a hack to make the special getopt in GNU libc working.  */
-  __getopt_clean_environment ();
+  __getopt_clean_environment (envp);
 
 #ifdef PIC
   __libc_global_ctors ();
@@ -169,14 +169,14 @@ __init (int *data)
         be the return address for `init1'; we will jump there with NEWSP
         as the stack pointer.  */
       return newsp;
-    } 
+    }
 
   /* The argument data is just above the stack frame we will unwind by
      returning.  */
   return (void *) data;
 
   (void) &__init;
-}  
+}
 
 #ifdef PIC
 /* This function is called to initialize the shared C library.
@@ -399,7 +399,7 @@ ___libc_init_first (int return_addr, int argc, ...)
 #endif
 
   RUN_HOOK (_hurd_preinit_hook, ());
-  
+
   _hurd_startup ((void **) &argc, &doinit);
 
   (void) &___libc_init_first;
index 39bcab7df51bf63588c165f3dd395af2f6d2032a..b80c1264878dd3dc5534f8c2e1daa162ba970fe6 100644 (file)
@@ -308,10 +308,10 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
          /* For thread safety, write the instructions from the bottom and
             flush before we overwrite the critical "b,a".  */
          reloc_addr[2] = OPCODE_JMP_G1 | (value & 0x3ff);
-         if (1 || (_dl_hwcap & 1)) /* HWCAP_SPARC_FLUSH */
+         if (_dl_hwcap & HWCAP_SPARC_FLUSH)
            __asm __volatile ("flush %0+8" : : "r"(reloc_addr));
          reloc_addr[1] = OPCODE_SETHI_G1 | (value >> 10);
-         if (1 || (_dl_hwcap & 1)) /* HWCAP_SPARC_FLUSH */
+         if (_dl_hwcap & HWCAP_SPARC_FLUSH)
            __asm __volatile ("flush %0+4" : : "r"(reloc_addr));
          break;
        case R_SPARC_8:
index 4fcc67ddbe7d93b9091a28eab5c0bba6a45c817e..dacefdcb634246c51854ebfdeaf38f84d93d3e08 100644 (file)
@@ -23,7 +23,7 @@
 int __libc_multiple_libcs = 1;
 
 extern void __libc_init (int, char **, char **);
-extern void __getopt_clean_environment (void);
+extern void __getopt_clean_environment (char **);
 
 pid_t __libc_pid;
 
@@ -51,5 +51,5 @@ void __libc_init_first
   __libc_init (argc, argv, envp);
 
   /* This is a hack to make the special getopt in GNU libc working.  */
-  __getopt_clean_environment ();
+  __getopt_clean_environment (envp);
 }
index 9a4666a508778e03fbe0e61b661a3259283d8a9b..462f7c299832cb3a92499e0b44aa4c3bbe7dbbe0 100644 (file)
@@ -51,7 +51,7 @@ typedef __u_int __nlink_t;            /* Type of file link counts.  */
 typedef long int __off_t;              /* Type of file sizes and offsets.  */
 typedef __quad_t __loff_t;             /* Type of file sizes and offsets.  */
 typedef int __pid_t;                   /* Type of process identifications.  */
-typedef long int __ssize_t;            /* Type of a byte count, or error.  */
+typedef long long int __ssize_t;       /* Type of a byte count, or error.  */
 
 typedef struct
   {