aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog63
-rw-r--r--INSTALL455
-rw-r--r--catgets/catgets.c8
-rw-r--r--catgets/open_catalog.c20
-rwxr-xr-xconfigure35
-rw-r--r--elf/Makefile2
-rw-r--r--elf/dl-open.c2
-rw-r--r--elf/dl-support.c37
-rw-r--r--locale/C-ctype.c8
-rw-r--r--locale/categories.def3
-rw-r--r--locale/setlocale.c90
-rw-r--r--manual/maint.texi4
-rw-r--r--manual/memory.texi19
-rw-r--r--manual/string.texi109
-rw-r--r--misc/Makefile4
-rw-r--r--misc/sys/select.h2
-rw-r--r--misc/sys/ustat.h8
-rw-r--r--misc/syslog.c51
-rw-r--r--nss/nsswitch.c4
-rw-r--r--socket/sys/socket.h11
-rw-r--r--string/tester.c13
-rw-r--r--sunrpc/Makefile8
-rw-r--r--sunrpc/rpc_prot.c22
-rw-r--r--sysdeps/alpha/_mcount.S11
-rw-r--r--sysdeps/alpha/bb_init_func.S12
-rw-r--r--sysdeps/alpha/bsd-_setjmp.S7
-rw-r--r--sysdeps/alpha/bsd-setjmp.S7
-rw-r--r--sysdeps/alpha/divrem.h11
-rw-r--r--sysdeps/alpha/ffs.S4
-rw-r--r--sysdeps/alpha/memchr.S36
-rw-r--r--sysdeps/alpha/setjmp.S5
-rw-r--r--sysdeps/alpha/strlen.S82
-rw-r--r--sysdeps/generic/stpncpy.c8
-rw-r--r--sysdeps/generic/ustatbits.h10
-rw-r--r--sysdeps/i386/fpu_control.h6
-rw-r--r--sysdeps/unix/sysv/linux/Makefile2
-rw-r--r--sysdeps/unix/sysv/linux/alpha/brk.S11
-rw-r--r--sysdeps/unix/sysv/linux/alpha/ioperm.c3
-rw-r--r--sysdeps/unix/sysv/linux/gnu/types.h4
-rw-r--r--time/localtime.c2
40 files changed, 755 insertions, 444 deletions
diff --git a/ChangeLog b/ChangeLog
index fc8b65f97a..6aa81bbd5c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,64 @@
+Thu Aug 8 16:17:38 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * pwd/getpwent.c: Define BUFLEN from NSS_BUFLEN_PASSWD.
+ * pwd/getpwent_r.c: Likewise.
+ * pwd/getpwnam.c: Likewise.
+ * pwd/getpwnam_r.c: Likewise.
+ * pwd/getpwuid.c: Likewise.
+ * pwd/getpwuid_r.c: Likewise.
+
+ * grp/getgrent.c: Define BUFLEN from NSS_BUFLEN_GROUP.
+ * grp/getgrent_r.c: Likewise.
+ * grp/getgrgid.c: Likewise.
+ * grp/getgrgid_r.c: Likewise.
+ * grp/getgrnam.c: Likewise.
+
+ * pwd/fgetpwent_r.c: New file. Reentrant version of fgetpwent.
+ * pwd/fgetpwent.c: Rewrite to use fgetpwent_r.
+ * pwd/Makefile (routines): Add fgetpwent_r.
+ * pwd/pwd.h: Add prototypes for __fgetpwent_r and fgetpwent_r.
+
+ * grp/fgetgrent_r.c: New file. Reentrant version of fgetgrent.
+ * grp/fgetgrent.c: Rewrite to use fgetgrent_r.
+ * grp/Makefile (routines): Add fgetgrent_r.
+ * grp/grp.h: Add prototypes for __fgetgrent_r and fgetgrent_r.
+
+ Implement shadow password lookup functions. This is no complete
+ shadow password suite.
+ * shadow/Makefile: New file.
+ * shadow/fgetspent.c: New file.
+ * shadow/fgetspent_r.c: New file.
+ * shadow/getspent.c: New file.
+ * shadow/getspent_r.c: New file.
+ * shadow/getspnam.c: New file.
+ * shadow/getspnam_r.c: New file.
+ * shadow/putspent.c: New file.
+ * shadow/sgetspent.c: New file.
+ * shadow/sgetspent_r.c: New file.
+ * shadow/shadow.h: New file.
+ * shadow/spwd-lookup.c: New file.
+ * shadow/nss_files/files-spwd.c: New file.
+
+Thu Aug 8 13:33:45 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/unix/sysv/linux/ftime.c: New file. Available system
+ call is only a stub.
+ Reported by Matthias Urlichs.
+
+ * Makeconfig [!default_cflags]: Change default value from `-g'
+ to `-g -O'.
+
+ * configure.in: Recognize i686.
+ * sysdeps/i386/i686/Implies: Default on i586 optimized code.
+
+Thu Aug 8 12:40:20 1996 Matthias Urlichs <smurf@smurf.noris.de>
+
+ * Makeconfig [$(build-omitfp) == yes]: Add to CFLAGS-.so
+ value of CFLAGS-.o, not CFLAGS-o.
+
+ * sysdeps/unix/sysv/linux/init-first.c (init): Add volatile
+ pointer to ourself. Otherwise `gcc -O3' optimized init away.
+
Thu Aug 8 01:41:43 1996 Ulrich Drepper <drepper@cygnus.com>
* elf/Makefile: Undo change of Tue Aug 6 14:27:11 1996.
@@ -479,7 +540,7 @@ Mon Jul 29 02:46:23 1996 Ulrich Drepper <drepper@cygnus.com>
warning.
* locale/programs/ld-ctype.c (ctype_output): Add code to make
- sure that all tables in binary file are words aligned.
+ sure that all tables in binary file are word-aligned.
* locale/programs/locfile.c (write_locale_data): Correct handling
of LC_MESSAGES locale. Create directory if necessary.
diff --git a/INSTALL b/INSTALL
index 1476bd8246..25ede5f565 100644
--- a/INSTALL
+++ b/INSTALL
@@ -4,16 +4,13 @@ Library Maintenance
How to Install the GNU C Library
================================
- Installation of the GNU C library is relatively simple.
-
- 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.*
+ Installation of the GNU C library is relatively simple, but usually
+requires several GNU tools to be installed already.
To configure the GNU C library for your system, run the shell script
`configure' with `sh'. Use an argument which is the conventional GNU
name for your system configuration--for example, `sparc-sun-sunos4.1',
-for a Sun 4 running Sunos 4.1. *Note Installation:
+for a Sun 4 running SunOS 4.1. *Note Installation:
(gcc.info)Installation, for a full description of standard GNU
configuration names. If you omit the configuration name, `configure'
will try to guess one for you by inspecting the system it is running
@@ -21,46 +18,6 @@ on. It may or may not be able to come up with a guess, and the its
guess might be wrong. `configure' will tell you the canonical name of
the chosen configuration before proceeding.
- The GNU C Library currently supports configurations that match the
-following patterns:
-
- alpha-dec-osf1
- i386-ANYTHING-bsd4.3
- i386-ANYTHING-gnu
- i386-ANYTHING-isc2.2
- i386-ANYTHING-isc3.N
- i386-ANYTHING-sco3.2
- i386-ANYTHING-sco3.2v4
- i386-ANYTHING-sysv
- i386-ANYTHING-sysv4
- i386-force_cpu386-none
- i386-sequent-bsd
- i960-nindy960-none
- m68k-hp-bsd4.3
- m68k-mvme135-none
- m68k-mvme136-none
- m68k-sony-newsos3
- m68k-sony-newsos4
- m68k-sun-sunos4.N
- mips-dec-ultrix4.N
- mips-sgi-irix4.N
- sparc-sun-solaris2.N
- sparc-sun-sunos4.N
-
- While no other configurations are supported, there are handy aliases
-for these few. (These aliases work in other GNU software as well.)
-
- decstation
- hp320-bsd4.3 hp300bsd
- i386-sco
- i386-sco3.2v4
- i386-sequent-dynix
- i386-svr4
- news
- sun3-sunos4.N sun3
- sun4-solaris2.N sun4-sunos5.N
- sun4-sunos4.N sun4
-
Here are some options that you should specify (if appropriate) when
you run `configure':
@@ -76,8 +33,15 @@ you run `configure':
building the GNU C Library. On some systems, the library may not
build properly if you do *not* use `gas'.
+`--with-gnu-binutils'
+ This option implies both `--with-gnu-ld' and `--with-gnu-as'. On
+ systems where GNU tools are the system tools, there is no need to
+ specify this option. These include GNU, GNU/Linux, and free BSD
+ systems.
+
+`--without-fp'
`--nfp'
- Use this option if your computer lacks hardware floating point
+ Use this option if your computer lacks hardware floating-point
support.
`--prefix=DIRECTORY'
@@ -89,6 +53,29 @@ you run `configure':
subdirectories of `DIRECTORY'. (You can also set this in
`configparms'; see below.)
+`--enable-shared'
+`--disable-shared'
+ Enable or disable building of an ELF shared library on systems that
+ support it. The default is to build the shared library on systems
+ using ELF when the GNU `binutils' are available.
+
+`--enable-profile'
+`--disable-profile'
+ Enable or disable building of the profiled C library, `-lc_p'. The
+ default is to build the profiled library. You may wish to disable
+ it if you don't plan to do profiling, because it doubles the build
+ time of compiling just the unprofiled static library.
+
+`--enable-omitfp'
+ Enable building a highly-optimized but possibly undebuggable
+ static C library. This causes the normal static and shared (if
+ enabled) C libraries to be compiled with maximal optimization,
+ including the `-fomit-frame-pointer' switch that makes debugging
+ impossible on many machines, and without debugging information
+ (which makes the binaries substantially smaller). An additional
+ static library is compiled with no optimization and full debugging
+ information, and installed as `-lc_g'.
+
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.
@@ -141,57 +128,101 @@ work with object files for the target you configured for.
in the GNU C compiler, so you may need to compile the library with GCC.
(In fact, all of the existing complete ports require GCC.)
- The current release of the C library contains some header files that
-the compiler normally provides: `stddef.h', `stdarg.h', and several
-files with names of the form `va-MACHINE.h'. The versions of these
-files that came with older releases of GCC do not work properly with
-the GNU C library. The `stddef.h' file in release 2.2 and later of GCC
-is correct. If you have release 2.2 or later of GCC, use its version
-of `stddef.h' instead of the C library's. To do this, put the line
-`override stddef.h =' in `configparms'. The other files are corrected
-in release 2.3 and later of GCC. `configure' will automatically detect
-whether the installed `stdarg.h' and `va-MACHINE.h' files are
-compatible with the C library, and use its own if not.
-
- There is a potential problem with the `size_t' type and versions of
-GCC prior to release 2.4. ANSI C requires that `size_t' always be an
-unsigned type. For compatibility with existing systems' header files,
-GCC defines `size_t' in `stddef.h' to be whatever type the system's
-`sys/types.h' defines it to be. Most Unix systems that define `size_t'
-in `sys/types.h', define it to be a signed type. Some code in the
-library depends on `size_t' being an unsigned type, and will not work
-correctly if it is signed.
-
- The GNU C library code which expects `size_t' to be unsigned is
-correct. The definition of `size_t' as a signed type is incorrect.
-Versions 2.4 and later of GCC always define `size_t' as an unsigned
-type, and GCC's `fixincludes' script massages the system's
-`sys/types.h' so as not to conflict with this.
-
- In the meantime, we work around this problem by telling GCC
-explicitly to use an unsigned type for `size_t' when compiling the GNU C
-library. `configure' will automatically detect what type GCC uses for
-`size_t' arrange to override it if necessary.
-
- To build the library, type `make lib'. This will produce a lot of
-output, some of which looks like errors from `make' (but isn't). Look
-for error messages from `make' containing `***'. Those indicate that
-something is really wrong.
+ To build the library and related programs, type `make'. This will
+produce a lot of output, some of which may look like errors from `make'
+(but isn't). Look for error messages from `make' containing `***'.
+Those indicate that something is really wrong.
To build and run some test programs which exercise some of the
-library facilities, type `make tests'. This will produce several files
+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'. To format the Info version of the manual for on line
-reading with `C-h i' in Emacs or with the `info' program, type
-`make info'.
+`make dvi'.
To install the library and its header files, and the Info files of
-the manual, type `make install', after setting the installation
-directories in `configparms'. This will build things if necessary,
+the manual, type `make install'. This will build things if necessary,
before installing them.
+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
+
+ 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.
+
+ * GCC 2.7.2
+
+ 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.6
+
+ 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.6 or later;
+ earlier versions are known to have problems.
+
+Supported Configurations
+------------------------
+
+ The GNU C Library currently supports configurations that match the
+following patterns:
+
+ alpha-dec-osf1
+ alpha-ANYTHING-linux
+ alpha-ANYTHING-linuxecoff
+ iX86-ANYTHING-bsd4.3
+ iX86-ANYTHING-gnu
+ iX86-ANYTHING-isc2.2
+ iX86-ANYTHING-isc3.N
+ iX86-ANYTHING-linux
+ iX86-ANYTHING-sco3.2
+ iX86-ANYTHING-sco3.2v4
+ iX86-ANYTHING-sysv
+ iX86-ANYTHING-sysv4
+ iX86-force_cpu386-none
+ iX86-sequent-bsd
+ i960-nindy960-none
+ m68k-hp-bsd4.3
+ m68k-mvme135-none
+ m68k-mvme136-none
+ m68k-sony-newsos3
+ m68k-sony-newsos4
+ m68k-sun-sunos4.N
+ mips-dec-ultrix4.N
+ mips-sgi-irix4.N
+ sparc-sun-solaris2.N
+ sparc-sun-sunos4.N
+
+ 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,
+but will not use instructions not available on all of them.
+
+ While no other configurations are supported, there are handy aliases
+for these few. (These aliases work in other GNU software as well.)
+
+ decstation
+ hp320-bsd4.3 hp300bsd
+ i486-gnu
+ i586-linux
+ i386-sco
+ i386-sco3.2v4
+ i386-sequent-dynix
+ i386-svr4
+ news
+ sun3-sunos4.N sun3
+ sun4-solaris2.N sun4-sunos5.N
+ sun4-sunos4.N sun4
+
Reporting Bugs
==============
@@ -246,8 +277,10 @@ But what they do is fairly straightforward, and only requires that you
define a few variables in the right places.
The library sources are divided into subdirectories, grouped by
-topic. The `string' subdirectory has all the string-manipulation
-functions, `stdio' has all the standard I/O functions, etc.
+topic.
+
+ The `string' subdirectory has all the string-manipulation functions,
+`math' has all the mathematical functions, etc.
Each subdirectory contains a simple makefile, called `Makefile',
which defines a few `make' variables and then includes the global
@@ -283,7 +316,9 @@ The basic variables that a subdirectory makefile defines are:
data in a file called `TEST-PROGRAM.input'; it will be given to
the test program on its standard input. If a test program wants
to be run with arguments, put the arguments (all on a single line)
- in a file called `TEST-PROGRAM.args'.
+ in a file called `TEST-PROGRAM.args'. Test programs should exit
+ with zero status when the test passes, and nonzero status when the
+ test indicates a bug in the library or error in building.
`others'
The names of "other" programs associated with this section of the
@@ -362,18 +397,24 @@ So the final list is `unix/bsd/vax unix/bsd unix/inet unix posix'.
`sysdeps' has two "special" subdirectories, called `generic' and
`stub'. These two are always implicitly appended to the list of
subdirectories (in that order), so you needn't put them in an `Implies'
-file, and you should not create any subdirectories under them.
-`generic' is for things that can be implemented in machine-independent
-C, using only other machine-independent functions in the C library.
-`stub' is for "stub" versions of functions which cannot be implemented
-on a particular machine or operating system. The stub functions always
-return an error, and set `errno' to `ENOSYS' (Function not
-implemented). *Note Error Reporting::.
+file, and you should not create any subdirectories under them intended
+to be new specific categories. `generic' is for things that can be
+implemented in machine-independent C, using only other
+machine-independent functions in the C library. `stub' is for "stub"
+versions of functions which cannot be implemented on a particular
+machine or operating system. The stub functions always return an
+error, and set `errno' to `ENOSYS' (Function not implemented). *Note
+Error Reporting::.
A source file is known to be system-dependent by its having a
-version in `generic' or `stub'; every system-dependent function should
-have either a generic or stub implementation (there is no point in
-having both).
+version in `generic' or `stub'; every generally-available function whose
+implementation is system-dependent in should have either a generic or
+stub implementation (there is no point in having both). Some rare
+functions are only useful on specific systems and aren't defined at all
+on others; these do not appear anywhere in the system-independent
+source code or makefiles (including the `generic' and `stub'
+directories), only in the system-dependent `Makefile' in the specific
+system's subdirectory.
If you come across a file that is in one of the main source
directories (`string', `stdio', etc.), and you want to write a machine-
@@ -629,18 +670,106 @@ generated are `ioctls.h', `errnos.h', `sys/param.h', and `errlist.c'
Contributors to the GNU C Library
=================================
- The GNU C library was written almost entirely by Roland McGrath, who
-now maintains it. Some parts of the library were contributed or worked
-on by other people.
+ The GNU C library was written originally by Roland McGrath. Some
+parts of the library were contributed or worked on by other people.
* The `getopt' function and related code were written by Richard
Stallman, David J. MacKenzie, and Roland McGrath.
- * Most of the math functions are taken from 4.4 BSD; they have been
- modified only slightly to work with the GNU C library. The
- Internet-related code (most of the `inet' subdirectory) and several
- other miscellaneous functions and header files have been included
- with little or no modification.
+ * The merge sort function `qsort' was written by Michael J. Haertel.
+
+ * The quick sort function used as a fallback by `qsort' was written
+ by Douglas C. Schmidt.
+
+ * The memory allocation functions `malloc', `realloc' and `free' and
+ related code were written by Michael J. Haertel.
+
+ * Fast implementations of many of the string functions (`memcpy',
+ `strlen', etc.) were written by Torbjorn Granlund.
+
+ * The `tar.h' header file was written by David J. MacKenzie.
+
+ * The port to the MIPS DECStation running Ultrix 4
+ (`mips-dec-ultrix4') was contributed by Brendan Kehoe and Ian
+ Lance Taylor.
+
+ * The DES encryption function `crypt' and related functions were
+ contributed by Michael Glad.
+
+ * The `ftw' function was contributed by Ian Lance Taylor.
+
+ * The startup code to support SunOS shared libraries was contributed
+ by Tom Quinn.
+
+ * The `mktime' function was contributed by Paul Eggert.
+
+ * The port to the Sequent Symmetry running Dynix version 3
+ (`i386-sequent-bsd') was contributed by Jason Merrill.
+
+ * The timezone support code is derived from the public-domain
+ timezone package by Arthur David Olson and his many contributors.
+
+ * The port to the DEC Alpha running OSF/1 (`alpha-dec-osf1') was
+ contributed by Brendan Kehoe, using some code written by Roland
+ McGrath.
+
+ * The port to SGI machines running Irix 4 (`mips-sgi-irix4') was
+ contributed by Tom Quinn.
+
+ * The port of the Mach and Hurd code to the MIPS architecture
+ (`mips-ANYTHING-gnu') was contributed by Kazumoto Kojima.
+
+ * The floating-point printing function used by `printf' and friends
+ 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.
+
+ * The internationalization support in the library, and the support
+ programs `locale' and `localedef', were written by Ulrich Drepper.
+ Ulrich Drepper adapted the support code for message catalogs
+ (`libintl.h', etc.) from the GNU `gettext' package, which he also
+ wrote. He also contributed the `catgets' support and the entire
+ suite of multi-byte and wide-character support functions
+ (`wctype.h', `wchar.h', etc.).
+
+ * The implementations of the `nsswitch.conf' mechanism and the files
+ and DNS backends for it were designed and written by Ulrich
+ Drepper and Roland McGrath, based on a backend interface defined
+ by Peter Eriksson.
+
+ * The port to Linux i386/ELF (`i386-ANYTHING-linux') was contributed
+ by Ulrich Drepper, based in large part on work done in Hongjiu
+ Lu's Linux version of the GNU C Library.
+
+ * The port to Linux/m68k (`m68k-ANYTHING-linux') was contributed by
+ Andreas Schwab.
+
+ * Richard Henderson contributed the ELF dynamic linking code and
+ other support for the Alpha processor.
+
+ * David Mosberger-Tang contributed the port to Linux/Alpha
+ (`alpha-ANYTHING-linux').
+
+ * Stephen R. van den Berg contributed a highly-optimized `strstr'
+ function.
+
+ * Ulrich Drepper contributed the `hsearch' and `drand48' families of
+ functions; reentrant `...`_r'' versions of the `random' family;
+ System V shared memory and IPC support code; and several
+ highly-optimized string functions for iX86 processors.
+
+ * The math functions are taken from `fdlibm-5.1' by Sun
+ Microsystems, as modified by J.T. Conklin, Ian Lance Taylor,
+ Ulrich Drepper, Andreas Schwab, and Roland McGrath.
+
+ * The `libio' library used to implement `stdio' functions on some
+ platforms was written by Per Bothner and modified by Ulrich
+ Drepper.
+
+ * 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:
@@ -694,70 +823,7 @@ on by other people.
changes to fit into the GNU C library and to fit the ANSI C
standard, but the functional code is Berkeley's.
- * The merge sort function `qsort' was written by Michael J. Haertel.
-
- * The quick sort function used as a fallback by `qsort' was written
- by Douglas C. Schmidt.
-
- * The memory allocation functions `malloc', `realloc' and `free' and
- related code were written by Michael J. Haertel.
-
- * Fast implementations of many of the string functions (`memcpy',
- `strlen', etc.) were written by Torbjorn Granlund.
-
- * Some of the support code for Mach is taken from Mach 3.0 by CMU,
- and is under the following copyright terms:
-
- Mach Operating System
- Copyright (C) 1991,1990,1989 Carnegie Mellon University
- All Rights Reserved.
-
- Permission to use, copy, modify and distribute this software
- and its documentation is hereby granted, provided that both
- the copyright notice and this permission notice appear in all
- copies of the software, derivative works or modified
- versions, and any portions thereof, and that both notices
- appear in supporting documentation.
-
- CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS
- IS" CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF
- ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF
- THIS SOFTWARE.
-
- Carnegie Mellon requests users of this software to return to
-
- Software Distribution Coordinator
- School of Computer Science
- Carnegie Mellon University
- Pittsburgh PA 15213-3890
-
- or `Software.Distribution@CS.CMU.EDU' any improvements or
- extensions that they make and grant Carnegie Mellon the
- rights to redistribute these changes.
-
- * The `tar.h' header file was written by David J. MacKenzie.
-
- * The port to the MIPS DECStation running Ultrix 4
- (`mips-dec-ultrix4') was contributed by Brendan Kehoe and Ian
- Lance Taylor.
-
- * The DES encryption function `crypt' and related functions were
- contributed by Michael Glad.
-
- * The `ftw' function was contributed by Ian Lance Taylor.
-
- * The code to support SunOS shared libraries was contributed by Tom
- Quinn.
-
- * The `mktime' function was contributed by Noel Cragg.
-
- * The port to the Sequent Symmetry running Dynix version 3
- (`i386-sequent-bsd') was contributed by Jason Merrill.
-
- * The timezone support code is derived from the public-domain
- timezone package by Arthur David Olson.
-
- * The Internet resolver code is taken directly from BIND 4.9.1,
+ * The Internet resolver code is taken directly from BIND 4.9.4,
which is under both the Berkeley copyright above and also:
Portions Copyright (C) 1993 by Digital Equipment Corporation.
@@ -780,15 +846,6 @@ on by other people.
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- * The port to the DEC Alpha running OSF/1 (`alpha-dec-osf1') was
- contributed by Brendan Kehoe, using some code written by Roland
- McGrath.
-
- * The floating-point printing function used by `printf' and friends
- was written by Roland McGrath and Torbjorn Granlund. The
- multi-precision integer functions used in that function are taken
- from GNU MP, which was contributed by Torbjorn Granlund.
-
* The code to support Sun RPC is taken verbatim from Sun's
RPCSRC-4.0 distribution, and is covered by this copyright:
@@ -824,9 +881,33 @@ on by other people.
2550 Garcia Avenue
Mountain View, California 94043
- * The port to SGI machines running Irix 4 (`mips-sgi-irix4') was
- contributed by Tom Quinn.
+ * Some of the support code for Mach is taken from Mach 3.0 by CMU,
+ and is under the following copyright terms:
- * The port of the Mach and Hurd code to the MIPS architecture
- (`mips-ANYTHING-gnu') was contribued by Kazumoto Kojima.
+ Mach Operating System
+ Copyright (C) 1991,1990,1989 Carnegie Mellon University
+ All Rights Reserved.
+
+ Permission to use, copy, modify and distribute this software
+ and its documentation is hereby granted, provided that both
+ the copyright notice and this permission notice appear in all
+ copies of the software, derivative works or modified
+ versions, and any portions thereof, and that both notices
+ appear in supporting documentation.
+
+ CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS
+ IS" CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF
+ ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF
+ THIS SOFTWARE.
+
+ Carnegie Mellon requests users of this software to return to
+
+ Software Distribution Coordinator
+ School of Computer Science
+ Carnegie Mellon University
+ Pittsburgh PA 15213-3890
+
+ or `Software.Distribution@CS.CMU.EDU' any improvements or
+ extensions that they make and grant Carnegie Mellon the
+ rights to redistribute these changes.
diff --git a/catgets/catgets.c b/catgets/catgets.c
index ca0fdd693c..eae962ffd7 100644
--- a/catgets/catgets.c
+++ b/catgets/catgets.c
@@ -41,7 +41,7 @@ catopen (const char *cat_name, int flag)
result->status = closed;
- result->cat_name = strdup (cat_name);
+ result->cat_name = __strdup (cat_name);
if (result->cat_name == NULL)
{
free (result);
@@ -71,7 +71,7 @@ catopen (const char *cat_name, int flag)
env_var = "C";
}
- result->env_var = strdup (env_var);
+ result->env_var = __strdup (env_var);
if (result->env_var == NULL)
{
free ((void *) result->cat_name);
@@ -80,9 +80,9 @@ catopen (const char *cat_name, int flag)
}
if (getenv ("NLSPATH") != NULL)
- result->nlspath = strdup (getenv ("NLSPATH"));
+ result->nlspath = __strdup (getenv ("NLSPATH"));
else
- result->nlspath = strdup (NLSPATH);
+ result->nlspath = __strdup (NLSPATH);
if (result->nlspath == NULL)
{
diff --git a/catgets/open_catalog.c b/catgets/open_catalog.c
index 9a8c7e643e..2a52877bbe 100644
--- a/catgets/open_catalog.c
+++ b/catgets/open_catalog.c
@@ -79,12 +79,12 @@ __open_catalog (__nl_catd catalog, int with_path)
case 'N':
/* Use the catalog name. */
ENOUGH (strlen (catalog->cat_name));
- bufact = stpcpy (&buf[bufact], catalog->cat_name) - buf;
+ bufact = __stpcpy (&buf[bufact], catalog->cat_name) - buf;
break;
case 'L':
/* Use the current locale category value. */
ENOUGH (strlen (catalog->env_var));
- bufact = stpcpy (&buf[bufact], catalog->env_var) - buf;
+ bufact = __stpcpy (&buf[bufact], catalog->env_var) - buf;
break;
case 'l':
/* Use language element of locale category value. */
@@ -152,7 +152,7 @@ __open_catalog (__nl_catd catalog, int with_path)
if (bufact != 0)
{
- fd = open (buf, O_RDONLY);
+ fd = __open (buf, O_RDONLY);
if (fd >= 0)
break;
}
@@ -161,7 +161,7 @@ __open_catalog (__nl_catd catalog, int with_path)
}
}
- if (fd < 0 || fstat (fd, &st) < 0)
+ if (fd < 0 || __fstat (fd, &st) < 0)
{
catalog->status = nonexisting;
return;
@@ -181,8 +181,8 @@ __open_catalog (__nl_catd catalog, int with_path)
#endif
catalog->file_size = st.st_size;
catalog->file_ptr =
- (struct catalog_obj *) mmap (NULL, st.st_size, PROT_READ,
- MAP_FILE|MAP_COPY|MAP_INHERIT, fd, 0);
+ (struct catalog_obj *) __mmap (NULL, st.st_size, PROT_READ,
+ MAP_FILE|MAP_COPY|MAP_INHERIT, fd, 0);
if (catalog->file_ptr != (struct catalog_obj *) -1)
/* Tell the world we managed to mmap the file. */
catalog->status = mmaped;
@@ -201,8 +201,8 @@ __open_catalog (__nl_catd catalog, int with_path)
/* Save read, handle partial reads. */
do
{
- size_t now = read (fd, (((char *) &catalog->file_ptr)
- + (st.st_size - todo)), todo);
+ size_t now = __read (fd, (((char *) &catalog->file_ptr)
+ + (st.st_size - todo)), todo);
if (now == 0)
{
free ((void *) catalog->file_ptr);
@@ -216,7 +216,7 @@ __open_catalog (__nl_catd catalog, int with_path)
}
/* We don't need the file anymore. */
- close (fd);
+ __close (fd);
/* Determine whether the file is a catalog file and if yes whether
it is written using the correct byte order. Else we have to swap
@@ -230,7 +230,7 @@ __open_catalog (__nl_catd catalog, int with_path)
/* Illegal file. Free he resources and mark catalog as not
usable. */
if (catalog->status == mmaped)
- munmap ((void *) catalog->file_ptr, catalog->file_size);
+ __munmap ((void *) catalog->file_ptr, catalog->file_size);
else
free (catalog->file_ptr);
catalog->status = nonexisting;
diff --git a/configure b/configure
index f0cb69482b..1882a6c6ca 100755
--- a/configure
+++ b/configure
@@ -2,7 +2,7 @@
# From configure.in CVSid
# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.10
+# Generated automatically using autoconf version 2.99
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
@@ -355,7 +355,7 @@ EOF
verbose=yes ;;
-version | --version | --versio | --versi | --vers)
- echo "configure generated by autoconf version 2.10"
+ echo "configure generated by autoconf version 2.99"
exit 0 ;;
-with-* | --with-*)
@@ -682,6 +682,7 @@ done
if test -z "$ac_aux_dir"; then
{ echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
fi
+ac_config_mkinstalldirs=$ac_aux_dir/mkinstalldirs
ac_config_guess=$ac_aux_dir/config.guess
ac_config_sub=$ac_aux_dir/config.sub
ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
@@ -745,7 +746,7 @@ case "$machine" in
a29k | am29000) base_machine=a29k machine=a29k ;;
alpha*) base_machine=alpha machine=alpha/$machine ;;
hppa*) base_machine=hppa machine=hppa/$machine ;;
-i[345]86) base_machine=i386 machine=i386/$machine ;;
+i[3456]86) base_machine=i386 machine=i386/$machine ;;
m680?0) base_machine=m68k machine=m68k/$machine ;;
m68k) base_machine=m68k machine=m68k/m68020 ;;
m88???) base_machine=m88k machine=m88k/$machine ;;
@@ -973,6 +974,10 @@ fi
fi
echo "$ac_t""$INSTALL" 1>&6
+# The purpose of this command is only to make sure the auxiliary path
+# is set and that the symbol AC_REQUIRE_AC_PROG_MKINSTALLDIRS is set.
+
+
# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
@@ -1134,13 +1139,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 1138 "configure"
+#line 1143 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1144: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1149: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
:
@@ -1149,13 +1154,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 1153 "configure"
+#line 1158 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1159: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1164: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
:
@@ -1297,7 +1302,7 @@ if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1301 "configure"
+#line 1306 "configure"
#include "confdefs.h"
#define __need_size_t
#define __need_wchar_t
@@ -1313,7 +1318,7 @@ size_t size; wchar_t wchar;
if (&size == NULL || &wchar == NULL) abort ();
; return 0; }
EOF
-if { (eval echo configure:1317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1322: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libc_cv_friendly_stddef=yes
else
@@ -1420,7 +1425,7 @@ if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1424 "configure"
+#line 1429 "configure"
#include "confdefs.h"
int main() { return 0; }
@@ -1430,7 +1435,7 @@ asm (".section .init");
asm (".text");
; return 0; }
EOF
-if { (eval echo configure:1434: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1439: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libc_cv_have_initfini=yes
else
@@ -1458,7 +1463,7 @@ if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1462 "configure"
+#line 1467 "configure"
#include "confdefs.h"
asm ("_glibc_foobar:");
int main() { return 0; }
@@ -1466,7 +1471,7 @@ int t() {
glibc_foobar ();
; return 0; }
EOF
-if { (eval echo configure:1470: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1475: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
libc_cv_asm_underscores=yes
else
@@ -1558,7 +1563,7 @@ _start () {}
EOF
if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles -Wl,--no-whole-archive
- -o conftest conftest.c'; { (eval echo configure:1562: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+ -o conftest conftest.c'; { (eval echo configure:1567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_ld_no_whole_archive=yes
else
libc_cv_ld_no_whole_archive=no
@@ -1769,7 +1774,7 @@ do
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
- echo "$CONFIG_STATUS generated by autoconf version 2.10"
+ echo "$CONFIG_STATUS generated by autoconf version 2.99"
exit 0 ;;
-help | --help | --hel | --he | --h)
echo "\$ac_cs_usage"; exit 0 ;;
diff --git a/elf/Makefile b/elf/Makefile
index a19a8b42ba..cf9eaa8cb4 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -69,8 +69,6 @@ $(objpfx)dl-allobjs.so: $(rtld-routines:%=$(objpfx)%.so)
$(reloc-link) $^
# Link together the dynamic linker into a single relocatable object.
-# We use this to produce both the ABI-compliant and Linux-compatible
-# dynamic linker shared objects below.
$(objpfx)librtld.so: $(objpfx)dl-allobjs.so $(common-objpfx)libc_pic.a
$(reloc-link) '-Wl,-(' $^ -lgcc '-Wl,-)'
diff --git a/elf/dl-open.c b/elf/dl-open.c
index 021c4bea74..9dda31e761 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -97,7 +97,7 @@ _dl_open (const char *file, int mode)
else
{
if (_dl_global_scope_alloc <
- _dl_global_scope_end - _dl_global_scope + 2)
+ (size_t) (_dl_global_scope_end - _dl_global_scope + 2))
{
/* Must extend the list. */
struct link_map **new = realloc (_dl_global_scope,
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 50ebfbfe5a..03c9d9c5c7 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -20,6 +20,8 @@ Cambridge, MA 02139, USA. */
#include <assert.h>
#include <fcntl.h>
#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
/* This file defines some things that for the dynamic linker are defined in
rtld.c and dl-sysdep.c in ways appropriate to bootstrap dynamic linking. */
@@ -46,3 +48,38 @@ _dl_sysdep_fatal (void)
{
assert (! "_dl_sysdep_fatal called");
}
+
+/* Read the whole contents of FILE into new mmap'd space with given
+ protections. *SIZEP gets the size of the file. */
+
+void *
+_dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot)
+{
+ void *result;
+ struct stat st;
+ int fd = __open (file, O_RDONLY);
+ if (fd < 0)
+ return NULL;
+ if (__fstat (fd, &st) < 0)
+ result = NULL;
+ else
+ {
+ /* Map a copy of the file contents. */
+ result = __mmap (0, st.st_size, prot,
+#ifdef MAP_COPY
+ MAP_COPY
+#else
+ MAP_PRIVATE
+#endif
+#ifdef MAP_FILE
+ | MAP_FILE
+#endif
+ , fd, 0);
+ if (result == (void *) -1)
+ result = NULL;
+ else
+ *sizep = st.st_size;
+ }
+ __close (fd);
+ return result;
+}
diff --git a/locale/C-ctype.c b/locale/C-ctype.c
index ab7e68eb6c..6daeb1d7cd 100644
--- a/locale/C-ctype.c
+++ b/locale/C-ctype.c
@@ -42,7 +42,7 @@ const char _nl_C_LC_CTYPE_class[768] =
/* 0xec */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000"
/* 0xf2 */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000"
/* 0xf8 */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000"
- /* 0xfe */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000"
+ /* 0xfe */ "\002\000" "\000\000" "\002\000" "\002\000" "\002\000" "\002\000"
/* 0x04 */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\003\040"
/* 0x0a */ "\002\040" "\002\040" "\002\040" "\002\040" "\002\000" "\002\000"
/* 0x10 */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000"
@@ -342,11 +342,13 @@ const struct locale_data _nl_C_LC_CTYPE =
#endif
{ string: (const char *) _nl_C_LC_CTYPE_toupper },
{ string: (const char *) _nl_C_LC_CTYPE_tolower },
- { string: NULL },
#if BYTE_ORDER == BIG_ENDIAN
- { string: NULL },
+ { string: NULL }, { string: NULL },
#endif
{ string: _nl_C_LC_CTYPE_class32 },
+#if BYTE_ORDER == LITTLE_ENDIAN
+ { string: NULL },
+#endif
{ string: (const char *) _nl_C_LC_CTYPE_names },
#if BYTE_ORDER == BIG_ENDIAN
{ string: NULL },
diff --git a/locale/categories.def b/locale/categories.def
index 4caef24087..7c47fd4662 100644
--- a/locale/categories.def
+++ b/locale/categories.def
@@ -79,8 +79,9 @@ DEFINE_CATEGORY
DEFINE_ELEMENT (_NL_CTYPE_TOLOWER_EB, "ctype-tolower-eb", std, string)
DEFINE_ELEMENT (_NL_CTYPE_TOUPPER_EL, "ctype-toupper-el", std, string)
DEFINE_ELEMENT (_NL_CTYPE_TOLOWER_EL, "ctype-tolower-el", std, string)
+ DEFINE_ELEMENT (_NL_CTYPE_CLASS32, "ctype-class32", std, string)
DEFINE_ELEMENT (_NL_CTYPE_NAMES_EB, "ctype-names-eb", std, string)
- DEFINE_ELEMENT (_NL_CTYPE_NAMES_EL, "ctype-names-eb", std, string)
+ DEFINE_ELEMENT (_NL_CTYPE_NAMES_EL, "ctype-names-el", std, string)
DEFINE_ELEMENT (_NL_CTYPE_HASH_SIZE, "ctype-hash-size", std, word)
DEFINE_ELEMENT (_NL_CTYPE_HASH_LAYERS, "ctype-hash-layers", std, word)
DEFINE_ELEMENT (_NL_CTYPE_CLASS_NAMES, "ctype-class-names", std, string)
diff --git a/locale/setlocale.c b/locale/setlocale.c
index 8bf58da608..4eeb5b3bce 100644
--- a/locale/setlocale.c
+++ b/locale/setlocale.c
@@ -19,6 +19,7 @@ Boston, MA 02111-1307, USA. */
#include <alloca.h>
#include <argz.h>
#include <errno.h>
+#include <libc-lock.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
@@ -93,7 +94,7 @@ extern void postload (void);
/* Define an array indexed by category of postload functions to call after
loading and installing that category's data. */
-void (*const _nl_category_postload[]) (void) =
+static void (*const _nl_category_postload[]) (void) =
{
#define DEFINE_CATEGORY(category, category_name, items, postload, b, c, d) \
[category] = postload,
@@ -114,6 +115,9 @@ static const char *_nl_current_names[] =
};
+/* Lock for protecting global data. */
+__libc_lock_define_initialized (static, lock)
+
/* Use this when we come along an error. */
#define ERROR_RETURN \
@@ -238,8 +242,8 @@ setlocale (int category, const char *locale)
return (char *) _nl_current_names[category];
/* We perhaps really have to load some data. So we determine the
- path in which to look for the data now. But this environment
- variable must only be used when the binary has no SUID or SGID
+ path in which to look for the data now. The environment variable
+ `LOCPATH' must only be used when the binary has no SUID or SGID
bit set. */
locale_path = NULL;
locale_path_len = 0;
@@ -309,6 +313,9 @@ setlocale (int category, const char *locale)
ERROR_RETURN;
}
+ /* Protect global data. */
+ __libc_lock_lock (lock);
+
/* Load the new data for each category. */
while (category-- > 0)
/* Only actually load the data if anything will use it. */
@@ -319,25 +326,7 @@ setlocale (int category, const char *locale)
&newnames[category]);
if (newdata[category] == NULL)
- {
- /* Loading this part of the locale failed. Abort the
- composite load. */
- int save_errno;
- abort_composite:
- save_errno = errno;
-
- while (++category < LC_ALL)
- if (_nl_current[category] != NULL
- && newdata[category] != _nl_C[category])
- _nl_free_locale (newdata[category]);
- else
- if (_nl_current[category] == NULL
- && newnames[category] != _nl_C_name)
- free (newnames[category]);
-
- errno = save_errno;
- return NULL;
- }
+ goto abort_composite;
}
else
{
@@ -351,17 +340,39 @@ setlocale (int category, const char *locale)
composite = new_composite_name (LC_ALL, newnames);
if (composite == NULL)
{
+ /* Loading this part of the locale failed. Abort the
+ composite load. */
+ int save_errno;
+
category = -1;
- goto abort_composite;
- }
+ abort_composite:
+ save_errno = errno;
+
+ while (++category < LC_ALL)
+ if (_nl_current[category] != NULL
+ && newdata[category] != _nl_C[category])
+ _nl_free_locale (newdata[category]);
+ else
+ if (_nl_current[category] == NULL
+ && newnames[category] != _nl_C_name)
+ free (newnames[category]);
- /* Now we have loaded all the new data. Put it in place. */
- for (category = 0; category < LC_ALL; ++category)
+ errno = save_errno;
+ composite = NULL;
+ }
+ else
{
- setdata (category, newdata[category]);
- setname (category, newnames[category]);
+ /* Now we have loaded all the new data. Put it in place. */
+ for (category = 0; category < LC_ALL; ++category)
+ {
+ setdata (category, newdata[category]);
+ setname (category, newnames[category]);
+ }
+ setname (LC_ALL, composite);
}
- setname (LC_ALL, composite);
+
+ /* Critical section left. */
+ __libc_lock_unlock (lock);
return composite;
}
@@ -370,6 +381,9 @@ setlocale (int category, const char *locale)
const struct locale_data *newdata = NULL;
char *newname = NULL;
+ /* Protect global data. */
+ __libc_lock_lock (lock);
+
if (_nl_current[category] != NULL)
{
/* Only actually load the data if anything will use it. */
@@ -377,7 +391,7 @@ setlocale (int category, const char *locale)
newdata = _nl_find_locale (locale_path, locale_path_len, category,
(char **) &newname);
if (newdata == NULL)
- return NULL;
+ goto abort_single;
}
/* Create new composite name. */
@@ -392,14 +406,20 @@ setlocale (int category, const char *locale)
_nl_free_locale (newdata);
errno = save_errno;
- return NULL;
+ abort_single:
+ newname = NULL;
}
+ else
+ {
+ if (_nl_current[category] != NULL)
+ setdata (category, newdata);
- if (_nl_current[category] != NULL)
- setdata (category, newdata);
+ setname (category, newname);
+ setname (LC_ALL, composite);
+ }
- setname (category, newname);
- setname (LC_ALL, composite);
+ /* Critical section left. */
+ __libc_lock_unlock (lock);
return newname;
}
diff --git a/manual/maint.texi b/manual/maint.texi
index 5bf473ecfd..98467e4b7b 100644
--- a/manual/maint.texi
+++ b/manual/maint.texi
@@ -223,8 +223,8 @@ following patterns:
@smallexample
alpha-dec-osf1
-alpha-gnu-linux
-alpha-gnu-linuxecoff
+alpha-@var{anything}-linux
+alpha-@var{anything}-linuxecoff
i@var{x}86-@var{anything}-bsd4.3
i@var{x}86-@var{anything}-gnu
i@var{x}86-@var{anything}-isc2.2
diff --git a/manual/memory.texi b/manual/memory.texi
index de543ec684..343da0bb7e 100644
--- a/manual/memory.texi
+++ b/manual/memory.texi
@@ -756,7 +756,7 @@ the padding needed to start each object on a suitable boundary.
* Obstacks Data Alignment:: Controlling alignment of objects in obstacks.
* Obstack Chunks:: How obstacks obtain and release chunks;
efficiency considerations.
-* Summary of Obstacks::
+* Summary of Obstacks::
@end menu
@node Creating Obstacks
@@ -1182,7 +1182,7 @@ When you check for space using @code{obstack_room} and there is not
enough room for what you want to add, the fast growth functions
are not safe. In this case, simply use the corresponding ordinary
growth function instead. Very soon this will copy the object to a
-new chunk; then there will be lots of room available again.
+new chunk; then there will be lots of room available again.
So, each time you use an ordinary growth function, check afterward for
sufficient space using @code{obstack_room}. Once the object is copied
@@ -1206,7 +1206,7 @@ add_string (struct obstack *obstack, const char *ptr, int len)
obstack_1grow (obstack, *ptr++);
len--;
@}
- else
+ else
@{
if (room > len)
room = len;
@@ -1494,8 +1494,7 @@ int
open2 (char *str1, char *str2, int flags, int mode)
@{
char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
- strcpy (name, str1);
- strcat (name, str2);
+ stpcpy (stpcpy (name, str1), str2);
return open (name, flags, mode);
@}
@end smallexample
@@ -1512,8 +1511,7 @@ open2 (char *str1, char *str2, int flags, int mode)
int desc;
if (name == 0)
fatal ("virtual memory exceeded");
- strcpy (name, str1);
- strcat (name, str2);
+ stpcpy (stpcpy (name, str1), str2);
desc = open (name, flags, mode);
free (name);
return desc;
@@ -1558,8 +1556,7 @@ int
open2 (char *str1, char *str2, int flags, int mode)
@{
char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
- strcpy (name, str1);
- strcat (name, str2);
+ stpcpy (stpcpy (name, str1), str2);
return open_or_report_error (name, flags, mode);
@}
@end smallexample
@@ -1606,8 +1603,7 @@ variable size. Here is how @code{open2} would look then:
int open2 (char *str1, char *str2, int flags, int mode)
@{
char name[strlen (str1) + strlen (str2) + 1];
- strcpy (name, str1);
- strcat (name, str2);
+ stpcpy (stpcpy (name, str1), str2);
return open (name, flags, mode);
@}
@end smallexample
@@ -1748,4 +1744,3 @@ Normally it ought to display the string for the user to read.
The warnings come when memory becomes 75% full, when it becomes 85%
full, and when it becomes 95% full. Above 95% you get another warning
each time memory usage increases.
-
diff --git a/manual/string.texi b/manual/string.texi
index c638912229..8b7e9da96b 100644
--- a/manual/string.texi
+++ b/manual/string.texi
@@ -6,7 +6,7 @@ many programs. The GNU C library provides an extensive set of string
utility functions, including functions for copying, concatenating,
comparing, and searching strings. Many of these functions can also
operate on arbitrary regions of storage; for example, the @code{memcpy}
-function can be used to copy the contents of any kind of array.
+function can be used to copy the contents of any kind of array.
It's fairly common for beginning C programmers to ``reinvent the wheel''
by duplicating this functionality in their own code, but it pays to
@@ -158,7 +158,7 @@ get the allocation size of the character array that holds a string using
the @code{sizeof} operator:
@smallexample
-char string[32] = "hello, world";
+char string[32] = "hello, world";
sizeof (string)
@result{} 32
strlen (string)
@@ -411,7 +411,7 @@ return a nonzero value if the strings are @emph{not} equivalent rather
than if they are. The sign of the value indicates the relative ordering
of the first characters in the strings that are not equivalent: a
negative value indicates that the first string is ``less'' than the
-second, while a positive value indicates that the first string is
+second, while a positive value indicates that the first string is
``greater''.
The most common use of these functions is to check only for equality.
@@ -623,10 +623,10 @@ overlap; see @ref{Copying and Concatenation}.
The return value is the length of the entire transformed string. This
value is not affected by the value of @var{size}, but if it is greater
-than @var{size}, it means that the transformed string did not entirely
-fit in the array @var{to}. In this case, only as much of the string as
-actually fits was stored. To get the whole transformed string, call
-@code{strxfrm} again with a bigger output array.
+or equal than @var{size}, it means that the transformed string did not
+entirely fit in the array @var{to}. In this case, only as much of the
+string as actually fits was stored. To get the whole transformed
+string, call @code{strxfrm} again with a bigger output array.
The transformed string may be longer than the original string, and it
may also be shorter.
@@ -671,23 +671,32 @@ sort_strings_fast (char **array, int nstrings)
for (i = 0; i < nstrings; i++)
@{
size_t length = strlen (array[i]) * 2;
+ char *transformed;
+ size_t transformed_lenght;
temp_array[i].input = array[i];
- /* @r{Transform @code{array[i]}.}
- @r{First try a buffer probably big enough.} */
- while (1)
+ /* @r{First try a buffer perhaps big enough.} */
+ transformed = (char *) xmalloc (length);
+
+ /* @r{Transform @code{array[i]}.} */
+ transformed_length = strxfrm (transformed, array[i], length);
+
+ /* @r{If the buffer was not large enough, resize it}
+ @r{and try again.} */
+ if (transformed_length >= length)
@{
- char *transformed = (char *) xmalloc (length);
- if (strxfrm (transformed, array[i], length) < length)
- @{
- temp_array[i].transformed = transformed;
- break;
- @}
- /* @r{Try again with a bigger buffer.} */
- free (transformed);
- length *= 2;
+ /* @r{Allocate the needed space. +1 for terminating}
+ @r{@code{NUL} character.} */
+ transformed = (char *) xrealloc (transformed,
+ transformed_length + 1);
+
+ /* @r{The return value is not interesting because we know}
+ @r{how long the transformed string is.} */
+ (void) strxfrm (transformed, array[i], transformed_length + 1);
@}
+
+ temp_array[i].transformed = transformed;
@}
/* @r{Sort @code{temp_array} by comparing transformed strings.} */
@@ -741,7 +750,7 @@ strchr ("hello, world", 'l')
@result{} "llo, world"
strchr ("hello, world", '?')
@result{} NULL
-@end smallexample
+@end smallexample
The terminating null character is considered to be part of the string,
so you can use this function get a pointer to the end of a string by
@@ -857,8 +866,6 @@ strpbrk ("hello, world", " \t\n,.;!?")
@node Finding Tokens in a String, , Search Functions, String and Array Utilities
@section Finding Tokens in a String
-@c !!! Document strsep, which is a better thing to use than strtok.
-
@cindex tokenizing strings
@cindex breaking a string into tokens
@cindex parsing tokens from a string
@@ -945,3 +952,61 @@ token = strtok (NULL, delimiters); /* token => "and" */
token = strtok (NULL, delimiters); /* token => "punctuation" */
token = strtok (NULL, delimiters); /* token => NULL */
@end smallexample
+
+The GNU C library contains two more functions for tokenizing a string
+which overcome the limitation of non-reentrancy.
+
+@comment string.h
+@comment POSIX
+@deftypefun {char *} strtok_r (char *@var{newstring}, const char *@var{delimiters}, char **@var{save_ptr})
+Just like @code{strtok} this function splits the string into several
+tokens which can be accessed be successive calls to @code{strtok_r}.
+The difference is that the information about the next token is not set
+up in some internal state information. Instead the caller has to
+provide another argument @var{save_ptr} which is a pointer to a string
+pointer. Calling @code{strtok_r} with a null pointer for
+@var{newstring} and leaving @var{save_ptr} between the calls unchanged
+does the job without limiting reentrancy.
+
+This function was proposed for POSIX.1b and can be found on many systems
+which support multi-threading.
+@end deftypefun
+
+@comment string.h
+@comment BSD
+@deftypefun {char *} strsep (char **@var{string_ptr}, const char *@var{delimiter})
+A second reentrant approach is to avoid the additional first argument.
+The initialization of the moving pointer has to be done by the user.
+Successive calls of @code{strsep} move the pointer along the tokens
+separated by @var{delimiter}, returning the address of the next token
+and updating @var{string_ptr} to point to the beginning of the next
+token.
+
+This function was introduced in 4.3BSD and therefore is widely available.
+@end deftypefun
+
+Here is how the above example looks like when @code{strsep} is used.
+
+@comment Yes, this example has been tested.
+@smallexample
+#include <string.h>
+#include <stddef.h>
+
+@dots{}
+
+char string[] = "words separated by spaces -- and, punctuation!";
+const char delimiters[] = " .,;:!-";
+char *running;
+char *token;
+
+@dots{}
+
+running = string;
+token = strsep (&running, delimiters); /* token => "words" */
+token = strsep (&running, delimiters); /* token => "separated" */
+token = strsep (&running, delimiters); /* token => "by" */
+token = strsep (&running, delimiters); /* token => "spaces" */
+token = strsep (&running, delimiters); /* token => "and" */
+token = strsep (&running, delimiters); /* token => "punctuation" */
+token = strsep (&running, delimiters); /* token => NULL */
+@end smallexample
diff --git a/misc/Makefile b/misc/Makefile
index 01e223836f..1631b2121d 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -28,7 +28,7 @@ headers := sys/uio.h iovec.h sys/ioctl.h ioctls.h ioctl-types.h \
ttyent.h syslog.h sys/syslog.h paths.h sys/reboot.h \
sys/mman.h sys/param.h fstab.h mntent.h search.h err.h error.h\
sys/queue.h sysexits.h syscall.h sys/syscall.h sys/swap.h \
- sys/select.h
+ sys/select.h ustat.h sys/ustat.h ustatbits.h
routines := brk sbrk sstk ioctl \
readv writev \
@@ -54,7 +54,7 @@ routines := brk sbrk sstk ioctl \
mmap munmap mprotect msync madvise \
efgcvt efgcvt_r qefgcvt qefgcvt_r \
hsearch hsearch_r tsearch lsearch \
- err error
+ err error ustat
aux := init-misc
distribute := bsd-compat.c
extra-objs := bsd-compat.o
diff --git a/misc/sys/select.h b/misc/sys/select.h
index dcb2012cff..729ce7a988 100644
--- a/misc/sys/select.h
+++ b/misc/sys/select.h
@@ -39,6 +39,8 @@ __BEGIN_DECLS
of `struct timeval'. */
struct timeval;
+typedef __fd_mask fd_mask;
+
/* Representation of a set of file descriptors. */
#define fd_set __fd_set
diff --git a/misc/sys/ustat.h b/misc/sys/ustat.h
index 57086c96da..fd51c5904e 100644
--- a/misc/sys/ustat.h
+++ b/misc/sys/ustat.h
@@ -20,15 +20,17 @@ Cambridge, MA 02139, USA. */
/* This interface is obsolete. Use <sys/statfs.h> instead. */
#ifndef _SYS_USTAT_H
-#define _SYS_USTAT_H 1
+
+#define _SYS_USTAT_H 1
+#include <features.h>
#include <sys/types.h>
#include <ustatbits.h>
__BEGIN_DECLS
-extern int __ustat __P ((dev_t, struct ustat *));
-extern int ustat __P ((dev_t, struct ustat *));
+extern int __ustat __P ((__dev_t __dev, struct ustat *__ubuf));
+extern int ustat __P ((__dev_t __dev, struct ustat *__ubuf));
__END_DECLS
diff --git a/misc/syslog.c b/misc/syslog.c
index bcac6c74cb..3a39c4317a 100644
--- a/misc/syslog.c
+++ b/misc/syslog.c
@@ -56,6 +56,7 @@ static char sccsid[] = "@(#)syslog.c 8.4 (Berkeley) 3/18/94";
#include <varargs.h>
#endif
+static int LogType = SOCK_DGRAM; /* type of socket connection */
static int LogFile = -1; /* fd for log */
static int connected; /* have done connect */
static int LogStat = 0; /* status bits, set by openlog() */
@@ -163,8 +164,15 @@ vsyslog(pri, fmt, ap)
/* Get connected, output the message to the local logger. */
if (!connected)
openlog(LogTag, LogStat | LOG_NDELAY, 0);
+
+ /* If we have a SOCK_STREAM connection, also send ASCII NUL as
+ a record terminator. */
+ if (LogType == SOCK_STREAM)
+ ++bufsize;
+
if (__send(LogFile, buf, bufsize, 0) < 0)
{
+ closelog (); /* attempt re-open next time */
/*
* Output the message to the console; don't worry about blocking,
* if console blocks everything will. Make sure the error reported
@@ -194,23 +202,36 @@ openlog(ident, logstat, logfac)
if (logfac != 0 && (logfac &~ LOG_FACMASK) == 0)
LogFacility = logfac;
- if (LogFile == -1) {
- SyslogAddr.sa_family = AF_UNIX;
- (void)strncpy(SyslogAddr.sa_data, _PATH_LOG,
- sizeof(SyslogAddr.sa_data));
- if (LogStat & LOG_NDELAY) {
- if ((LogFile = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1)
- return;
- (void)fcntl(LogFile, F_SETFD, 1);
+ while (1) {
+ if (LogFile == -1) {
+ SyslogAddr.sa_family = AF_UNIX;
+ (void)strncpy(SyslogAddr.sa_data, _PATH_LOG,
+ sizeof(SyslogAddr.sa_data));
+ if (LogStat & LOG_NDELAY) {
+ if ((LogFile = socket(AF_UNIX, LogType, 0))
+ == -1)
+ return;
+ (void)fcntl(LogFile, F_SETFD, 1);
+ }
}
+ if (LogFile != -1 && !connected)
+ if (__connect(LogFile, &SyslogAddr, sizeof(SyslogAddr))
+ == -1)
+ {
+ int saved_errno = errno;
+ (void)close(LogFile);
+ LogFile = -1;
+ if (LogType == SOCK_DGRAM
+ && saved_errno == EPROTOTYPE)
+ {
+ /* retry with next SOCK_STREAM: */
+ LogType = SOCK_STREAM;
+ continue;
+ }
+ } else
+ connected = 1;
+ break;
}
- if (LogFile != -1 && !connected)
- if (__connect(LogFile, &SyslogAddr, sizeof(SyslogAddr)) == -1)
- {
- (void)close(LogFile);
- LogFile = -1;
- } else
- connected = 1;
}
void
diff --git a/nss/nsswitch.c b/nss/nsswitch.c
index 3490594559..1349e0ca08 100644
--- a/nss/nsswitch.c
+++ b/nss/nsswitch.c
@@ -42,10 +42,6 @@ static service_library *nss_new_service (name_database *database,
__libc_lock_define_initialized (static, lock)
-/* Global variable. */
-struct __res_state _res;
-
-
/* Nonzero if the sevices are already initialized. */
static int nss_initialized;
diff --git a/socket/sys/socket.h b/socket/sys/socket.h
index 9c3c3e73fe..3124de0e34 100644
--- a/socket/sys/socket.h
+++ b/socket/sys/socket.h
@@ -115,8 +115,10 @@ extern int getpeername __P ((int __fd, __SOCKADDR_ARG __addr,
/* Send N bytes of BUF to socket FD. Returns the number sent or -1. */
-extern int __send __P ((int __fd, __ptr_t __buf, size_t __n, int __flags));
-extern int send __P ((int __fd, __ptr_t __buf, size_t __n, int __flags));
+extern int __send __P ((int __fd, __const __ptr_t __buf, size_t __n,
+ int __flags));
+extern int send __P ((int __fd, __const __ptr_t __buf, size_t __n,
+ int __flags));
/* Read N bytes into BUF from socket FD.
Returns the number read or -1 for errors. */
@@ -124,8 +126,9 @@ extern int recv __P ((int __fd, __ptr_t __buf, size_t __n, int __flags));
/* Send N bytes of BUF on socket FD to peer at address ADDR (which is
ADDR_LEN bytes long). Returns the number sent, or -1 for errors. */
-extern int sendto __P ((int __fd, __ptr_t __buf, size_t __n, int __flags,
- __CONST_SOCKADDR_ARG __addr, size_t __addr_len));
+extern int sendto __P ((int __fd, __const __ptr_t __buf, size_t __n,
+ int __flags, __CONST_SOCKADDR_ARG __addr,
+ size_t __addr_len));
/* Read N bytes into BUF through socket FD.
If ADDR is not NULL, fill in *ADDR_LEN bytes of it with tha address of
diff --git a/string/tester.c b/string/tester.c
index 6be3d2dade..e57b279fa4 100644
--- a/string/tester.c
+++ b/string/tester.c
@@ -71,6 +71,19 @@ DEFUN(main, (argc, argv), int argc AND char **argv)
(void) strcpy(one, "");
equal(one, "", 7); /* Boundary condition. */
+ /* stpncpy. */
+ it = "stpncpy";
+
+ memset(one, 'x', sizeof(one));
+ check(stpncpy(one, "abc", 2) == one + 2, 1);
+ check(stpncpy(one, "abc", 3) == one + 3, 2);
+ check(stpncpy(one, "abc", 4) == one + 3, 3);
+ check(one[3] == '\0' && one[4] == 'x', 4);
+ check(stpncpy(one, "abcd", 5) == one + 4, 5);
+ check(one[4] == '\0' && one[5] == 'x', 6);
+ check(stpncpy(one, "abcd", 6) == one + 4, 7);
+ check(one[4] == '\0' && one[5] == '\0' && one[6] == 'x', 8);
+
/* strcat. */
it = "strcat";
(void) strcpy(one, "ijk");
diff --git a/sunrpc/Makefile b/sunrpc/Makefile
index 11f5541542..efad599716 100644
--- a/sunrpc/Makefile
+++ b/sunrpc/Makefile
@@ -75,9 +75,12 @@ extra-objs = $(rpcgen-objs)
all: # Make this the default target; it will be defined in Rules.
+# Sun's code is not too clean.
+override +gccwarn := -w
+
include ../Makeconfig
-ifeq (no,$(cross-compile))
+ifeq (no,$(cross-compiling))
# We can only build this library if we can run the rpcgen we build.
extra-libs := librpcsvc
extra-libs-others := librpcsvc # Make it in `others' pass, not `lib' pass.
@@ -86,9 +89,6 @@ librpcsvc-inhibit-o = .so # Build no shared rpcsvc library.
omit-deps = $(librpcsvc-routines)
endif
-# Sun's code is not too clean.
-override +gccwarn := -w
-
include ../Rules
$(objpfx)rpcgen: $(addprefix $(objpfx),$(rpcgen-objs)) $(common-objpfx)libc.a
diff --git a/sunrpc/rpc_prot.c b/sunrpc/rpc_prot.c
index 4b1319ad56..8da20c61c8 100644
--- a/sunrpc/rpc_prot.c
+++ b/sunrpc/rpc_prot.c
@@ -6,23 +6,23 @@
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
* program developed by the user.
- *
+ *
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
+ *
* Sun RPC is provided with no support and without any obligation on the
* part of Sun Microsystems, Inc. to assist in its use, correction,
* modification or enhancement.
- *
+ *
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
* OR ANY PART THEREOF.
- *
+ *
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
- *
+ *
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
@@ -50,8 +50,6 @@ static char sccsid[] = "@(#)rpc_prot.c 1.36 87/08/11 Copyr 1984 Sun Micro";
/* * * * * * * * * * * * * * XDR Authentication * * * * * * * * * * * */
-struct opaque_auth _null_auth;
-
/*
* XDR an opaque authentication struct
* (see auth.h)
@@ -84,9 +82,9 @@ xdr_des_block(xdrs, blkp)
/*
* XDR the MSG_ACCEPTED part of a reply message union
*/
-bool_t
+bool_t
xdr_accepted_reply(xdrs, ar)
- register XDR *xdrs;
+ register XDR *xdrs;
register struct accepted_reply *ar;
{
@@ -111,7 +109,7 @@ xdr_accepted_reply(xdrs, ar)
/*
* XDR the MSG_DENIED part of a reply message union
*/
-bool_t
+bool_t
xdr_rejected_reply(xdrs, rr)
register XDR *xdrs;
register struct rejected_reply *rr;
@@ -147,7 +145,7 @@ xdr_replymsg(xdrs, rmsg)
register struct rpc_msg *rmsg;
{
if (
- xdr_u_long(xdrs, &(rmsg->rm_xid)) &&
+ xdr_u_long(xdrs, &(rmsg->rm_xid)) &&
xdr_enum(xdrs, (enum_t *)&(rmsg->rm_direction)) &&
(rmsg->rm_direction == REPLY) )
return (xdr_union(xdrs, (enum_t *)&(rmsg->rm_reply.rp_stat),
@@ -219,7 +217,7 @@ accepted(acpt_stat, error)
error->re_lb.s2 = (long)acpt_stat;
}
-static void
+static void
rejected(rjct_stat, error)
register enum reject_stat rjct_stat;
register struct rpc_err *error;
diff --git a/sysdeps/alpha/_mcount.S b/sysdeps/alpha/_mcount.S
index e813ebdd58..6c4af3f233 100644
--- a/sysdeps/alpha/_mcount.S
+++ b/sysdeps/alpha/_mcount.S
@@ -28,20 +28,17 @@ compiler treats those calls as if they were instructions. In
particular, it doesn't save any of the temporary registers (caller
saved registers). It is therefore necessary to preserve all
caller-saved registers as well
-
+
Upon entering _mcount, register $at holds the return address and ra
holds the return address of the function's caller (selfpc and frompc,
respectively in gmon.c language...). */
#include <sysdep.h>
-#undef ret /* discard `ret' as defined in sysdep.h */
-
.set noat
.set noreorder
LEAF(_mcount, 0xb0)
-weak_alias (_mcount, mcount)
.prologue 0
subq sp, 0xb0, sp
@@ -69,8 +66,6 @@ weak_alias (_mcount, mcount)
stq t5, 0x70(sp)
stq t6, 0x78(sp)
- lda pv, __mcount
-
stq t7, 0x80(sp)
stq t8, 0x88(sp)
stq t9, 0x90(sp)
@@ -78,7 +73,7 @@ weak_alias (_mcount, mcount)
stq t11, 0xa0(sp)
stq v0, 0xa8(sp)
- jsr ra, (pv), __mcount
+ jsr ra, __mcount
ldq a0, 0x00(sp)
ldq a1, 0x08(sp)
@@ -108,3 +103,5 @@ weak_alias (_mcount, mcount)
ret zero,($at),1
END(_mcount)
+
+weak_alias (_mcount, mcount)
diff --git a/sysdeps/alpha/bb_init_func.S b/sysdeps/alpha/bb_init_func.S
index 49be0b2bfe..dcd4eac231 100644
--- a/sysdeps/alpha/bb_init_func.S
+++ b/sysdeps/alpha/bb_init_func.S
@@ -40,10 +40,10 @@ ENTRY(__bb_init_func)
ldq t0, ZERO_WORD(a0) /* t0 <- blocks->zero_word */
beq t0, init /* not initialized yet -> */
ret
-
+
END(__bb_init_func)
-.ent init
+ .ent init
init:
.frame sp, 0x38, ra, 0
subq sp, 0x38, sp
@@ -61,8 +61,8 @@ init:
stq t0, ZERO_WORD(a0) /* blocks->zero_word = 1 */
stq t2, NEXT(a0) /* blocks->next = __bb_head */
stq a0, 0(t1)
- bne t2, leave
- beq t3, leave /* t3 == GMON_PROF_ON? yes -> */
+ bne t2, $leave
+ beq t3, $leave /* t3 == GMON_PROF_ON? yes -> */
/* also need to initialize destructor: */
stq ra, 0x00(sp)
@@ -81,8 +81,8 @@ init:
ldq a4, 0x20(sp)
ldq a5, 0x28(sp)
-leave: ldq pv, 0x30(sp)
+$leave: ldq pv, 0x30(sp)
addq sp, 0x38, sp
ret
-.end init
+ .end init
diff --git a/sysdeps/alpha/bsd-_setjmp.S b/sysdeps/alpha/bsd-_setjmp.S
index da60442c23..a7bdbb5a61 100644
--- a/sysdeps/alpha/bsd-_setjmp.S
+++ b/sysdeps/alpha/bsd-_setjmp.S
@@ -1,5 +1,5 @@
/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. Alpha version.
-Copyright (C) 1994 Free Software Foundation, Inc.
+Copyright (C) 1994, 1996 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
@@ -24,7 +24,8 @@ Cambridge, MA 02139, USA. */
#include <sysdep.h>
ENTRY(_setjmp)
- lda $27, __sigsetjmp /* Load address to jump to. */
+ ldgp $29,0($27)
+ .prologue 1
bis $31, $31, $17 /* Pass a second argument of zero. */
- jmp $31, ($27), __sigsetjmp /* Call __sigsetjmp. */
+ jmp $31, __sigsetjmp /* Call __sigsetjmp. */
END(_setjmp)
diff --git a/sysdeps/alpha/bsd-setjmp.S b/sysdeps/alpha/bsd-setjmp.S
index fc73815a84..c0ed691f40 100644
--- a/sysdeps/alpha/bsd-setjmp.S
+++ b/sysdeps/alpha/bsd-setjmp.S
@@ -1,5 +1,5 @@
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. Alpha version.
-Copyright (C) 1994 Free Software Foundation, Inc.
+Copyright (C) 1994, 1996 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
@@ -24,7 +24,8 @@ Cambridge, MA 02139, USA. */
#include <sysdep.h>
ENTRY(setjmp)
- lda $27, __sigsetjmp /* Load address to jump to. */
+ ldgp $29, 0($27)
+ .prologue 1
bis $31, 1, $17 /* Pass a second argument of one. */
- jmp $31, ($27), __sigsetjmp /* Call __sigsetjmp. */
+ jmp $31, __sigsetjmp /* Call __sigsetjmp. */
END(setjmp)
diff --git a/sysdeps/alpha/divrem.h b/sysdeps/alpha/divrem.h
index 2951335c49..b5b66ae10b 100644
--- a/sysdeps/alpha/divrem.h
+++ b/sysdeps/alpha/divrem.h
@@ -115,10 +115,9 @@ FUNC_NAME:
br AT, 1f
1: ldgp gp, 0(AT)
- lda AT, _mcount
mov retaddr, ra
- jsr AT, (AT), _mcount
+ jsr AT, _mcount
ldq ra, 0x00(sp)
ldq pv, 0x08(sp)
@@ -137,7 +136,7 @@ FUNC_NAME:
stq tmp0,0x18(sp)
bis zero,zero,quotient
stq tmp1,0x20(sp)
- beq divisor,divbyzero
+ beq divisor,$divbyzero
stq sign,0x28(sp)
GETSIGN(dividend,divisor,sign)
#if SIGNED
@@ -170,7 +169,7 @@ FUNC_NAME:
ldq arg1,0x00(sp)
SETSIGN(sign,result,tmp0)
-done: ldq arg2,0x08(sp)
+$done: ldq arg2,0x08(sp)
ldq mask,0x10(sp)
ldq tmp0,0x18(sp)
ldq tmp1,0x20(sp)
@@ -178,11 +177,11 @@ done: ldq arg2,0x08(sp)
lda sp,FRAME_SIZE(sp)
ret zero,(retaddr),0
-divbyzero:
+$divbyzero:
lda a0,GEN_INTDIV(zero)
call_pal PAL_gentrap
bis zero,zero,result /* if trap returns, return 0 */
ldq arg1,0x00(sp)
- br done
+ br $done
END(FUNC_NAME)
diff --git a/sysdeps/alpha/ffs.S b/sysdeps/alpha/ffs.S
index e4dd87c9f1..b84a51d326 100644
--- a/sysdeps/alpha/ffs.S
+++ b/sysdeps/alpha/ffs.S
@@ -34,7 +34,7 @@ ENTRY(ffs)
negq a0, t0 # due to the srl instruction
and a0, t0, t0
clr v0
- beq a0, done
+ beq a0, $done
# now do binary search for first non-zero bit
@@ -61,6 +61,6 @@ ENTRY(ffs)
addq v0, 1, t3
cmoveq t2, t3, v0
-done: ret
+$done: ret
END(ffs)
diff --git a/sysdeps/alpha/memchr.S b/sysdeps/alpha/memchr.S
index 2d21247174..a47ac96e01 100644
--- a/sysdeps/alpha/memchr.S
+++ b/sysdeps/alpha/memchr.S
@@ -42,7 +42,7 @@ For correctness consider that:
ENTRY(memchr)
.prologue 0
- beq a2, not_found
+ beq a2, $not_found
ldq_u t0, 0(a0) # load first quadword (a0 may be misaligned)
addq a0, a2, t4
and a1, 0xff, a1 # a1 = 00000000000000ch
@@ -57,7 +57,7 @@ ENTRY(memchr)
extql t0, a0, t6
or t1, a1, a1 # a1 = chchchchchchchch
- beq t3, first_quad
+ beq t3, $first_quad
extqh t5, a0, t5
mov a0, v0
@@ -68,15 +68,15 @@ ENTRY(memchr)
# in t0. E.g.:
# a2 = 6
# t0 = ????c6c5c4c3c2c1
-last_quad:
+$last_quad:
negq a2, t5
srl t2, t5, t5 # t5 = mask of a2 bits set
xor a1, t0, t0
cmpbge zero, t0, t1
and t1, t5, t1
- beq t1, not_found
+ beq t1, $not_found
-found_it:
+$found_it:
# now, determine which byte matched:
negq t1, t2
and t1, t2, t1
@@ -93,20 +93,20 @@ found_it:
addq v0, 1, t2
cmoveq t0, t2, v0
-done: ret
+$done: ret
#
# Deal with the case where a2 > 8 bytes remain to be
# searched. a0 may not be aligned.
#
-first_quad:
+$first_quad:
andnot a0, 0x7, v0
insqh t2, a0, t1 # t1 = 0000ffffffffffff (a0<0:2> ff bytes)
xor t0, a1, t0
or t0, t1, t0 # t0 = ====ffffffffffff
cmpbge zero, t0, t1
- bne t1, found_it
+ bne t1, $found_it
/* at least one byte left to process */
@@ -119,41 +119,41 @@ first_quad:
subq t4, 1, a2
andnot a2, 0x7, a2
cmpult v0, a2, t1
- beq t1, final
+ beq t1, $final
/* at least two quads remain to be accessed */
subq a2, v0, t3 # t3 <- number of quads to be processed in loop
and t3, 8, t3 # odd number of quads?
- bne t3, odd_quad_count
+ bne t3, $odd_quad_count
/* at least three quads remain to be accessed */
mov t0, t3 # move prefetched value into correct register
.align 3
-unrolled_loop:
+$unrolled_loop:
ldq t0, 8(v0) # prefetch t0
xor a1, t3, t1
cmpbge zero, t1, t1
- bne t1, found_it
+ bne t1, $found_it
addq v0, 8, v0
-odd_quad_count:
+$odd_quad_count:
xor a1, t0, t1
ldq t3, 8(v0) # prefetch t3
cmpbge zero, t1, t1
- bne t1, found_it
+ bne t1, $found_it
addq v0, 8, v0
cmpult v0, a2, t5
- bne t5, unrolled_loop
+ bne t5, $unrolled_loop
mov t3, t0 # move prefetched value into t0
-final: subq t4, v0, a2 # a2 <- number of bytes left to do
- bne a2, last_quad
+$final: subq t4, v0, a2 # a2 <- number of bytes left to do
+ bne a2, $last_quad
-not_found:
+$not_found:
mov zero, v0
ret
diff --git a/sysdeps/alpha/setjmp.S b/sysdeps/alpha/setjmp.S
index da71a3292a..59929a0234 100644
--- a/sysdeps/alpha/setjmp.S
+++ b/sysdeps/alpha/setjmp.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1994, 1996 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
@@ -25,9 +25,8 @@ ENTRY (__sigsetjmp)
ldgp $29, 0($27)
.prologue 1
- lda $27, __sigsetjmp_aux /* Load address to jump to. */
bis $30, $30, $18 /* Pass SP as 3rd arg. */
bis $15, $15, $19 /* Pass FP as 4th arg. */
- jmp $31, ($27), __sigsetjmp_aux /* Call __sigsetjmp_aux. */
+ jmp $31, __sigsetjmp_aux /* Call __sigsetjmp_aux. */
END(__sigsetjmp)
diff --git a/sysdeps/alpha/strlen.S b/sysdeps/alpha/strlen.S
index 15c78cde64..9eab707388 100644
--- a/sysdeps/alpha/strlen.S
+++ b/sysdeps/alpha/strlen.S
@@ -19,52 +19,50 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
/* Finds length of a 0-terminated string. Optimized for the Alpha
-architecture:
+ architecture:
- memory accessed as aligned quadwords only
- - uses bcmpge to compare 8 bytes in parallel
- - does binary search to find 0 byte in last
- quadword (HAKMEM needed 12 instructions to
- do this instead of the 9 instructions that
- binary search needs). */
+ - uses cmpbge to compare 8 bytes in parallel
+ - does binary search to find 0 byte in last quadword (HAKMEM
+ needed 12 instructions to do this instead of the 8 instructions
+ that the binary search needs).
+*/
#include <sysdep.h>
- .set noreorder
- .set noat
+ .set noreorder
+ .set noat
ENTRY(strlen)
- ldq_u t0, 0(a0) # load first quadword (a0 may be misaligned)
- lda t1, -1(zero)
- insqh t1, a0, t1
- andnot a0, 7, v0
- or t1, t0, t0
- cmpbge zero, t0, t1 # t1 <- bitmask: bit i == 1 <==> i-th byte == 0
- bne t1, found
-
-loop: ldq t0, 8(v0)
- addq v0, 8, v0 # addr += 8
- nop # helps dual issue last two insns
- cmpbge zero, t0, t1
- beq t1, loop
-
-found: blbs t1, done # make aligned case fast
- negq t1, t2
- and t1, t2, t1
-
- and t1, 0x0f, t0
- addq v0, 4, t2
- cmoveq t0, t2, v0
-
- and t1, 0x33, t0
- addq v0, 2, t2
- cmoveq t0, t2, v0
-
- and t1, 0x55, t0
- addq v0, 1, t2
- cmoveq t0, t2, v0
-
-done: subq v0, a0, v0
- ret
-
- END(strlen)
+ ldq_u t0, 0(a0) # load first quadword (a0 may be misaligned)
+ lda t1, -1(zero)
+ insqh t1, a0, t1
+ andnot a0, 7, v0
+ or t1, t0, t0
+ nop # dual issue the next two on ev5
+ cmpbge zero, t0, t1 # t1 <- bitmask: bit i == 1 <==> i-th byte == 0
+ bne t1, $found
+
+$loop: ldq t0, 8(v0)
+ addq v0, 8, v0 # addr += 8
+ cmpbge zero, t0, t1
+ beq t1, $loop
+
+$found: negq t1, t2 # clear all but least set bit
+ and t1, t2, t1
+
+ and t1, 0xf0, t2 # binary search for that set bit
+ and t1, 0xcc, t3
+ and t1, 0xaa, t4
+ cmovne t2, 4, t2
+ cmovne t3, 2, t3
+ cmovne t4, 1, t4
+ addq t2, t3, t2
+ addq v0, t4, v0
+ addq v0, t2, v0
+ nop # dual issue next two on ev4 and ev5
+
+ subq v0, a0, v0
+ ret
+
+ END(strlen)
diff --git a/sysdeps/generic/stpncpy.c b/sysdeps/generic/stpncpy.c
index 427ed4b228..c821e95419 100644
--- a/sysdeps/generic/stpncpy.c
+++ b/sysdeps/generic/stpncpy.c
@@ -57,8 +57,6 @@ DEFUN(__stpncpy, (dest, src, n), char *dest AND CONST char *src AND size_t n)
goto last_chars;
}
n -= dest - s;
- if (n == 0)
- return dest - 1;
goto zero_fill;
}
@@ -70,16 +68,16 @@ DEFUN(__stpncpy, (dest, src, n), char *dest AND CONST char *src AND size_t n)
for (;;)
{
c = *src++;
+ --n;
*dest++ = c;
if (c == '\0')
break;
- if (--n == 0)
+ if (n == 0)
return dest;
}
- --n;
zero_fill:
- while (--n > 0)
+ while (n-- > 0)
dest[n] = '\0';
return dest - 1;
diff --git a/sysdeps/generic/ustatbits.h b/sysdeps/generic/ustatbits.h
index 57bebdc66f..aa5d493e63 100644
--- a/sysdeps/generic/ustatbits.h
+++ b/sysdeps/generic/ustatbits.h
@@ -1,5 +1,5 @@
/* Generic declaration of ustat structure.
-Copyright (C) 1994 Free Software Foundation, Inc.
+Copyright (C) 1994, 1996 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
@@ -17,10 +17,14 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
+__BEGIN_DECLS
+
struct ustat
{
- daddr_t f_tfree; /* total free */
- ino_t f_tinode; /* total inodes free */
+ __daddr_t f_tfree; /* total free */
+ __ino_t f_tinode; /* total inodes free */
char f_fname[6]; /* filesystem name */
char f_fpack[6]; /* filesystem pack name */
};
+
+__END_DECLS
diff --git a/sysdeps/i386/fpu_control.h b/sysdeps/i386/fpu_control.h
index d72f474eb6..706dea3d6d 100644
--- a/sysdeps/i386/fpu_control.h
+++ b/sysdeps/i386/fpu_control.h
@@ -19,7 +19,7 @@ not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _FPU_CONTROL_H
-#define _FPU_CONTROL_H
+#define _FPU_CONTROL_H 1
/* Here is the dirty part. Settup up your 387 through the control word
* (cw) register.
@@ -80,10 +80,10 @@ Boston, MA 02111-1307, USA. */
/* The fdlibm code requires strict IEEE double precision arithmetic,
and no interrupts for exceptions, rounding to nearest. */
-#define _FPU_DEFAULT 0x127f
+#define _FPU_DEFAULT 0x137f
/* IEEE: same as above, but exceptions */
-#define _FPU_IEEE 0x127f
+#define _FPU_IEEE 0x137f
/* Type of the control word. */
typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__)));
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 85bab92635..5f6b6b00ca 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -1,5 +1,5 @@
ifeq ($(subdir), misc)
-sysdep_routines += sysctl
+sysdep_routines += sysctl clone
sysdep_headers += sys/mount.h sys/sysinfo.h sys/acct.h sys/sysctl.h \
sys/module.h sys/io.h sys/klog.h sys/kdaemon.h \
diff --git a/sysdeps/unix/sysv/linux/alpha/brk.S b/sysdeps/unix/sysv/linux/alpha/brk.S
index 26bf97f2bd..ad5f021e99 100644
--- a/sysdeps/unix/sysv/linux/alpha/brk.S
+++ b/sysdeps/unix/sysv/linux/alpha/brk.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc.
Contributed by Brendan Kehoe (brendan@zen.org).
The GNU C Library is free software; you can redistribute it and/or
@@ -23,7 +23,16 @@ break value (instead of the new, requested one). */
#include <sysdep.h>
#include <errnos.h>
+#ifdef PIC
+.section .bss
+ .align 3
+ .globl __curbrk
+__curbrk: .skip 8
+ .type __curbrk,@object
+ .size __curbrk,8
+#else
.comm __curbrk, 8
+#endif
.text
LEAF(__brk, 0)
diff --git a/sysdeps/unix/sysv/linux/alpha/ioperm.c b/sysdeps/unix/sysv/linux/alpha/ioperm.c
index cee5f482bb..56331cb596 100644
--- a/sysdeps/unix/sysv/linux/alpha/ioperm.c
+++ b/sysdeps/unix/sysv/linux/alpha/ioperm.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David Mosberger.
@@ -92,6 +92,7 @@ static struct platform {
{"EB66", IOSYS_APECS, APECS_DENSE_MEM}, /* LCA same as APECS */
{"EB66P", IOSYS_APECS, APECS_DENSE_MEM}, /* LCA same as APECS */
{"Jensen", IOSYS_JENSEN, JENSEN_MEM},
+ {"Mikasa", IOSYS_APECS, APECS_DENSE_MEM},
{"Mustang", IOSYS_APECS, APECS_DENSE_MEM},
{"Noname", IOSYS_APECS, APECS_DENSE_MEM}, /* LCA same as APECS */
};
diff --git a/sysdeps/unix/sysv/linux/gnu/types.h b/sysdeps/unix/sysv/linux/gnu/types.h
index 0bc072b092..89b815dd60 100644
--- a/sysdeps/unix/sysv/linux/gnu/types.h
+++ b/sysdeps/unix/sysv/linux/gnu/types.h
@@ -65,4 +65,8 @@ typedef long int __swblk_t; /* Type of a swap block maybe? */
typedef __kernel_fd_set __fd_set;
typedef __kernel_clock_t __clock_t;
+/* Linus doesn't want __kernel_fd_mask in <linux/posix_types.h> since
+ XPG4 seems to require `unsigned long'. */
+typedef unsigned long __fd_mask;
+
#endif /* gnu/types.h */
diff --git a/time/localtime.c b/time/localtime.c
index 3800d8b5b0..2a780304d6 100644
--- a/time/localtime.c
+++ b/time/localtime.c
@@ -40,13 +40,13 @@ __localtime_r (timer, tp)
/* This lock is defined in tzset.c and locks all the data defined there
and in tzfile.c; the internal functions do no locking themselves.
This lock is only taken here and in `tzset'. */
+ __libc_lock_define (extern, __tzset_lock)
extern int __tzset_run, __use_tzfile;
extern int __tz_compute __P ((time_t timer, struct tm *tp));
extern int __tzfile_compute __P ((time_t timer,
long int *leap_correct, int *leap_hit));
long int leap_correction;
int leap_extra_secs;
- __libc_lock_define (extern, __tzset_lock);
if (timer == NULL)
{