mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-09 23:00:07 +00:00
Update.
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>.
This commit is contained in:
parent
4547c1a410
commit
2604afb1b2
88
ChangeLog
88
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.
|
||||
|
315
INSTALL
315
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.
|
||||
*/
|
||||
|
4
PROJECTS
4
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.
|
||||
|
@ -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);
|
||||
|
150
hesiod/README.hesiod
Normal file
150
hesiod/README.hesiod
Normal file
@ -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.
|
@ -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)
|
||||
|
17
io/ftw.h
17
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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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. */
|
||||
|
@ -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
|
||||
|
149
stdlib/stdlib.h
149
stdlib/stdlib.h
@ -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); }
|
||||
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_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
|
||||
# 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
|
||||
# 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); }
|
||||
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
|
||||
# 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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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; }))
|
||||
|
@ -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
|
||||
|
@ -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 ();
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user