Update.
authorUlrich Drepper <drepper@redhat.com>
Mon, 30 Nov 1998 14:21:53 +0000 (14:21 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 30 Nov 1998 14:21:53 +0000 (14:21 +0000)
1998-11-30  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

* nscd/nscd_getpw_r.c: Include nscd_proto.h for prototypes.

* sysdeps/generic/errno-loc.c: Include <errno.h> for prototype,
undefine errno to get variable.

* sysdeps/unix/sysv/linux/i386/setfsuid.c: Include <sys/fsuid.h>
instead of <unistd.h> for prototype.
* sysdeps/unix/sysv/linux/i386/setfsgid.c: Likewise.

1998-11-30  Ulrich Drepper  <drepper@cygnus.com>

* misc/err.h: Correct comments and use protected attribute keywords.
Reported by Joseph Myers <jsm28@cam.ac.uk>.

1998-11-29  Roland McGrath  <roland@baalperazim.frob.com>

* malloc/thread-m.h [_LIBC]: Include <bits/libc-tsd.h>, and
remove tsd stuff from pthreads/cthreads libc sections.
Use __libc_tsd_define for MALLOC key.
[_LIBC] (tsd_key_t, tsd_key_create): Define to a zero-size type and a
no-op, respectively.
[_LIBC] (tsd_setspecific, tsd_getspecific): Use __libc_tsd_get/set.

* elf/dl-error.c: Include <bits/libc-tsd.h>.
Use __libc_tsd_define for DL_ERROR key.
(tsd_setspecific, tsd_getspecific): Rewritten using __libc_tsd_get/set.

* sysdeps/mach/hurd/bits/libc-tsd.h: New file.
* sysdeps/generic/bits/libc-tsd.h: New file.
* Makefile (distribute): Add bits/libc-tsd.h.

1998-10-12  Roland McGrath  <roland@baalperazim.frob.com>

* elf/dl-error.c: Remove kludge to check for ld.so load address.
There is no need if weak undefined symbols are not used in ld.so;
see linuxthreads/ChangeLog for changes to files
linuxthreads/sysdeps/pthread/bits/libc-lock.h and
linuxthreads/sysdeps/pthread/bits/libc-tsd.h.

1998-11-30  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

* sysdeps/i386/bits/string.h (__memset_cc): Fix typo (s->__s).

* sysdeps/i386/i486/bits/string.h: Add prototypes for all new
inline functions.
* sysdeps/i386/bits/string.h: Likewise.

1998-11-30  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

* sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Remove ipc_kludge.

1998-11-30  Andreas Schwab  <schwab@issan.cs.uni-dortmund.de>

* db2/progs/db_load/db_load.c (main): Avoid -Wparentheses warning.

23 files changed:
ChangeLog
FAQ
bits/libc-tsd.h [new file with mode: 0644]
db2/progs/db_load/db_load.c
elf/dl-error.c
linuxthreads/ChangeLog
linuxthreads/Makefile
linuxthreads/internals.h
linuxthreads/no-tsd.c [new file with mode: 0644]
linuxthreads/specific.c
linuxthreads/sysdeps/pthread/bits/libc-lock.h
linuxthreads/sysdeps/pthread/bits/libc-tsd.h [new file with mode: 0644]
malloc/thread-m.h
misc/err.h
nscd/nscd_getpw_r.c
sysdeps/generic/bits/libc-tsd.h [new file with mode: 0644]
sysdeps/generic/errno-loc.c
sysdeps/i386/bits/string.h
sysdeps/i386/i486/bits/string.h
sysdeps/mach/hurd/bits/libc-tsd.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/alpha/bits/ipc.h
sysdeps/unix/sysv/linux/i386/setfsgid.c
sysdeps/unix/sysv/linux/i386/setfsuid.c

index 47c812f..180ccd4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,60 @@
+1998-11-30  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
+
+       * nscd/nscd_getpw_r.c: Include nscd_proto.h for prototypes.
+
+       * sysdeps/generic/errno-loc.c: Include <errno.h> for prototype,
+       undefine errno to get variable.
+
+       * sysdeps/unix/sysv/linux/i386/setfsuid.c: Include <sys/fsuid.h>
+       instead of <unistd.h> for prototype.
+       * sysdeps/unix/sysv/linux/i386/setfsgid.c: Likewise.
+
+1998-11-30  Ulrich Drepper  <drepper@cygnus.com>
+
+       * misc/err.h: Correct comments and use protected attribute keywords.
+       Reported by Joseph Myers <jsm28@cam.ac.uk>.
+
+1998-11-29  Roland McGrath  <roland@baalperazim.frob.com>
+
+       * malloc/thread-m.h [_LIBC]: Include <bits/libc-tsd.h>, and
+       remove tsd stuff from pthreads/cthreads libc sections.
+       Use __libc_tsd_define for MALLOC key.
+       [_LIBC] (tsd_key_t, tsd_key_create): Define to a zero-size type and a
+       no-op, respectively.
+       [_LIBC] (tsd_setspecific, tsd_getspecific): Use __libc_tsd_get/set.
+
+       * elf/dl-error.c: Include <bits/libc-tsd.h>.
+       Use __libc_tsd_define for DL_ERROR key.
+       (tsd_setspecific, tsd_getspecific): Rewritten using __libc_tsd_get/set.
+
+       * sysdeps/mach/hurd/bits/libc-tsd.h: New file.
+       * sysdeps/generic/bits/libc-tsd.h: New file.
+       * Makefile (distribute): Add bits/libc-tsd.h.
+
+1998-10-12  Roland McGrath  <roland@baalperazim.frob.com>
+
+       * elf/dl-error.c: Remove kludge to check for ld.so load address.
+       There is no need if weak undefined symbols are not used in ld.so;
+       see linuxthreads/ChangeLog for changes to files
+       linuxthreads/sysdeps/pthread/bits/libc-lock.h and
+       linuxthreads/sysdeps/pthread/bits/libc-tsd.h.
+
+1998-11-30  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
+
+       * sysdeps/i386/bits/string.h (__memset_cc): Fix typo (s->__s).
+
+       * sysdeps/i386/i486/bits/string.h: Add prototypes for all new
+       inline functions.
+       * sysdeps/i386/bits/string.h: Likewise.
+
+1998-11-30  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
+
+       * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Remove ipc_kludge.
+
+1998-11-30  Andreas Schwab  <schwab@issan.cs.uni-dortmund.de>
+
+       * db2/progs/db_load/db_load.c (main): Avoid -Wparentheses warning.
+
 1998-09-12  Mark Kettenis  <kettenis@phys.uva.nl>
 
        * sysdeps/mach/hurd/dl-sysdep.c: Do not define
diff --git a/FAQ b/FAQ
index a3d3b5a..e88fb73 100644 (file)
--- a/FAQ
+++ b/FAQ
@@ -24,22 +24,23 @@ please let me know.
        What's wrong?
 1.4.   Do I need a special linker or assembler?
 1.5.   Which compiler should I use for powerpc?
-1.6.   Do I need some more things to compile the GNU C Library?
-1.7.   What version of the Linux kernel headers should be used?
-1.8.   The compiler hangs while building iconvdata modules.  What's
+1.6.   Which tools should I use for ARM?
+1.7.   Do I need some more things to compile the GNU C Library?
+1.8.   What version of the Linux kernel headers should be used?
+1.9.   The compiler hangs while building iconvdata modules.  What's
        wrong?
-1.9.   When I run `nm -u libc.so' on the produced library I still
+1.10.  When I run `nm -u libc.so' on the produced library I still
        find unresolved symbols.  Can this be ok?
-1.10.  What are these `add-ons'?
-1.11.  My XXX kernel emulates a floating-point coprocessor for me.
+1.11.  What are these `add-ons'?
+1.12.  My XXX kernel emulates a floating-point coprocessor for me.
        Should I enable --with-fp?
-1.12.  When compiling GNU libc I get lots of errors saying functions
+1.13.  When compiling GNU libc I get lots of errors saying functions
        in glibc are duplicated in libgcc.
-1.13.  Why do I get messages about missing thread functions when I use
+1.14.  Why do I get messages about missing thread functions when I use
        librt?  I don't even use threads.
-1.14.  What's the problem with configure --enable-omitfp?
-1.15.  I get failures during `make check'.  What shall I do?
-1.16.  What is symbol versioning good for?  Do I need it?
+1.15.  What's the problem with configure --enable-omitfp?
+1.16.  I get failures during `make check'.  What shall I do?
+1.17.  What is symbol versioning good for?  Do I need it?
 
 2. Installation and configuration issues
 
@@ -140,6 +141,8 @@ please let me know.
        to EST5EDT things go wrong since glibc computes the wrong time
        from this information.
 4.4.   What other sources of documentation about glibc are available?
+4.5.   The timezone string for Sydney/Australia is wrong since even when
+       daylight saving time is in effect the timezone string is EST.
 
 \f
 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
@@ -163,6 +166,7 @@ in the future, are:
        sparc-*-linux-gnu       Linux-2.x on SPARC
        sparc64-*-linux-gnu     Linux-2.x on UltraSPARC
        arm-*-none              ARM standalone systems
+       arm-*-linux             Linux-2.x on ARM
        arm-*-linuxaout         Linux-2.x on ARM using a.out binaries
 
 Ports to other Linux platforms are in development, and may in fact work
@@ -191,7 +195,7 @@ a local mirror first.
 You should always try to use the latest official release.  Older versions
 may not have all the features GNU libc requires.  The current releases of
 egcs (1.0.3 and 1.1) and GNU CC (2.8.1) should work with the GNU C library
-(for powerpc see question question 1.5).
+(for powerpc see question question 1.5; for ARM see question question 1.6).
 
 {ZW} You may have problems if you try to mix code compiled with
 EGCS and with GCC 2.8.1. See question 2.8 for details.
@@ -240,7 +244,18 @@ variables.  There is a temporary patch at:
 Later versions of egcs may fix this problem.
 
 
-1.6.   Do I need some more things to compile the GNU C Library?
+1.6.   Which tools should I use for ARM?
+
+{PB} You should use egcs 1.1 or a later version.  For ELF systems some
+changes are needed to the compiler; a patch against egcs-1.1.x can be found
+at:
+
+<ftp://ftp.netwinder.org/users/p/philb/egcs-1.1.1pre2-diff-981126>
+
+Binutils 2.9.1.0.16 or later is also required.
+
+
+1.7.   Do I need some more things to compile the GNU C Library?
 
 {UD} Yes, there are some more :-).
 
@@ -284,7 +299,7 @@ Later versions of egcs may fix this problem.
   If you have some more measurements let me know.
 
 
-1.7.   What version of the Linux kernel headers should be used?
+1.8.   What version of the Linux kernel headers should be used?
 
 {AJ,UD} The headers from the most recent Linux kernel should be used.  The
 headers used while compiling the GNU C library and the kernel binary used
@@ -307,7 +322,7 @@ kernel sources to the 2.1 tree, do `make oldconfig', and say no to all the
 new options.
 
 
-1.8.   The compiler hangs while building iconvdata modules.  What's
+1.9.   The compiler hangs while building iconvdata modules.  What's
        wrong?
 
 {ZW} This is a problem with old versions of GCC.  Initialization of large
@@ -317,7 +332,7 @@ time.
 The problem is fixed in egcs 1.1 but not in earlier releases.
 
 
-1.9.   When I run `nm -u libc.so' on the produced library I still
+1.10.  When I run `nm -u libc.so' on the produced library I still
        find unresolved symbols.  Can this be ok?
 
 {UD} Yes, this is ok.  There can be several kinds of unresolved symbols:
@@ -333,7 +348,7 @@ Generally, you should make sure you find a real program which produces
 errors while linking before deciding there is a problem.
 
 
-1.10.  What are these `add-ons'?
+1.11.  What are these `add-ons'?
 
 {UD} To avoid complications with export rules or external source code some
 optional parts of the libc are distributed as separate packages (e.g., the
@@ -356,7 +371,7 @@ else.  The existing makefiles do most of the work; only some few stub rules
 must be written to get everything running.
 
 
-1.11.  My XXX kernel emulates a floating-point coprocessor for me.
+1.12.  My XXX kernel emulates a floating-point coprocessor for me.
        Should I enable --with-fp?
 
 {ZW} An emulated FPU is just as good as a real one, as far as the C library
@@ -370,7 +385,7 @@ far more trouble than it's worth: you then have to compile
 (libgcc.a for GNU C), because the calling conventions change.
 
 
-1.12.  When compiling GNU libc I get lots of errors saying functions
+1.13.  When compiling GNU libc I get lots of errors saying functions
        in glibc are duplicated in libgcc.
 
 {EY} This is *exactly* the same problem that I was having.  The problem was
@@ -387,7 +402,7 @@ problems of this kind.  The setting of CFLAGS is checked at the very
 beginning and if it is not usable `configure' will bark.
 
 
-1.13.  Why do I get messages about missing thread functions when I use
+1.14.  Why do I get messages about missing thread functions when I use
        librt?  I don't even use threads.
 
 {UD} In this case you probably mixed up your installation.  librt uses
@@ -403,7 +418,7 @@ given path to find the implicitly referenced library while not disturbing
 any other link path.
 
 
-1.14.  What's the problem with configure --enable-omitfp?
+1.15.  What's the problem with configure --enable-omitfp?
 
 {AJ} When --enable-omitfp is set the libraries are built without frame
 pointers.  Some compilers produce buggy code for this model and therefore we
@@ -422,7 +437,7 @@ The compilation of these extra libraries and the compiler optimizations slow
 down the build process and need more disk space.
 
 
-1.15.  I get failures during `make check'.  What shall I do?
+1.16.  I get failures during `make check'.  What shall I do?
 
 {AJ} The testsuite should compile and run cleanly on your system, every
 failure should be looked into.  Depending on the failure I wouldn't advise
@@ -445,7 +460,7 @@ There are some failures which are not directly related to the GNU libc:
   development kernels have fixes for the floating point support on Alpha.
 
 
-1.16.  What is symbol versioning good for?  Do I need it?
+1.17.  What is symbol versioning good for?  Do I need it?
 
 {AJ} Symbol versioning solves problems that are related to interface
 changes.  One version of an interface might have been introduced in a
@@ -565,7 +580,7 @@ question 3.8 for details.
 source code.  Until this law gets abolished we cannot ship the cryptographic
 functions together with glibc.
 
-The functions are available, as an add-on (see question 1.10).  People in the US
+The functions are available, as an add-on (see question 1.11).  People in the US
 may get it from the same place they got GNU libc from.  People outside the
 US should get the code from ftp://ftp.ifi.uio.no/pub/gnu, or another archive
 site outside the USA.  The README explains how to install the sources.
@@ -1333,9 +1348,20 @@ from your favorite mirror of ftp.gnu.org.
 where the headers are stable.  There are still lots of incompatible changes
 made and the libc headers have to follow.
 
-Also, make sure you have a suitably recent kernel.  As of the 970401
-snapshot, according to Philip Blundell <Philip.Blundell@pobox.com>, the
-required kernel version is at least 2.1.30.
+{PB} The 2.1 release of GNU libc aims to comply with the current versions of
+all the relevant standards.  The IPv6 support libraries for older Linux
+systems used a different naming convention and so code written to work with
+them may need to be modified.  If the standards make incompatible changes in
+the future then the libc may need to change again.
+
+IPv6 will not work with a 2.0.x kernel.  When kernel 2.2 is released it
+should contain all the necessary support; until then you should use the
+latest 2.1.x release you can find.  As of 98/11/26 the currently recommended
+kernel for IPv6 is 2.1.129.
+
+Also, as of the 2.1 release the IPv6 API provided by GNU libc is not
+100% complete.  In particular the getipnodebyname and getipnodebyaddr
+functions are not implemented.
 
 
 4.3.   When I set the timezone by setting the TZ environment variable
@@ -1375,6 +1401,21 @@ Looijaard describes a different way installing glibc2 as secondary libc at
 
 Please note that this is not a complete list.
 
+
+4.5.   The timezone string for Sydney/Australia is wrong since even when
+       daylight saving time is in effect the timezone string is EST.
+
+{UD} The problem for some timezones is that the local authorities decided
+to use the term "summer time" instead of "daylight saving time".  In this
+case the abbreviation character `S' is the same as the standard one.  So,
+for Sydney we have
+
+       Eastern Standard Time   = EST
+       Eastern Summer Time     = EST
+
+Great!  To get this bug fixed convince the authorities to change the laws
+and regulations of the country this effects.  glibc behaves correctly.
+
 \f
 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
 
diff --git a/bits/libc-tsd.h b/bits/libc-tsd.h
new file mode 100644 (file)
index 0000000..6048d99
--- /dev/null
@@ -0,0 +1,51 @@
+/* libc-internal interface for thread-specific data.  Stub version.
+   Copyright (C) 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _BITS_LIBC_TSD_H
+#define _BITS_LIBC_TSD_H 1
+
+/* This file defines the following macros for accessing a small fixed
+   set of thread-specific `void *' data used only internally by libc.
+
+   __libc_tsd_define(CLASS, KEY)       -- Define or declare a `void *' datum
+                                          for KEY.  CLASS can be `static' for
+                                          keys used in only one source file,
+                                          empty for global definitions, or
+                                          `extern' for global declarations.
+   __libc_tsd_get(KEY)                 -- Return the `void *' datum for KEY.
+   __libc_tsd_set(KEY, VALUE)          -- Set the datum for KEY to VALUE.
+
+   The set of available KEY's will usually be provided as an enum,
+   and contains (at least):
+               _LIBC_TSD_KEY_MALLOC
+               _LIBC_TSD_KEY_DL_ERROR
+   All uses must be the literal _LIBC_TSD_* name in the __libc_tsd_* macros.
+   Some implementations may not provide any enum at all and instead
+   using string pasting in the macros.  */
+
+/* This is the generic/stub implementation for wholly single-threaded
+   systems.  We don't define an enum for the possible key values, because
+   the KEYs translate directly into variables by macro magic.  */
+
+#define __libc_tsd_define(CLASS, KEY)  CLASS void *__libc_tsd_##KEY##_data;
+#define __libc_tsd_get(KEY)            (__libc_tsd_##KEY##_data)
+#define __libc_tsd_set(KEY, VALUE)     (__libc_tsd_##KEY##_data = (VALUE))
+
+
+#endif /* bits/libc-tsd.h */
index 5ac1775..84cfb36 100644 (file)
@@ -161,7 +161,7 @@ main(argc, argv)
 
        /* Get each key/data pair and add them to the database. */
        for (recno = 1;; ++recno) {
-               if (dbtype == DB_RECNO)
+               if (dbtype == DB_RECNO) {
                        if (checkprint) {
                                if (dbt_rprint(&data))
                                        break;
@@ -169,7 +169,7 @@ main(argc, argv)
                                if (dbt_rdump(&data))
                                        break;
                        }
-               else
+               else
                        if (checkprint) {
                                if (dbt_rprint(&key))
                                        break;
index ae63447..9ccc193 100644 (file)
@@ -22,7 +22,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <elf/ldsodefs.h>
-#include <bits/libc-lock.h>
+#include <bits/libc-tsd.h>
 
 /* This structure communicates state between _dl_catch_error and
    _dl_signal_error.  */
@@ -36,44 +36,11 @@ struct catch
    calls can come from `_dl_map_object_deps', `_dlerror_run', or from
    any of the libc functionality which loads dynamic objects (NSS, iconv).
    Therefore we have to be prepared to save the state in thread-local
-   memory.  `catch' will only be used for the non-threaded case.
-
-   Please note the horrible kludge we have to use to check for the
-   thread functions to be defined.  The problem is that while running
-   ld.so standalone (i.e., before the relocation with the available
-   libc symbols) we do not have a real handling of undefined weak symbols.
-   All symbols are relocated, regardless of the availability.  They are
-   relocated relative to the load address of the dynamic linker.  Adding
-   this start address to zero (the value in the GOT for undefined symbols)
-   leads to an address which is the load address of ld.so.  Once we have
-   relocated with the libc values the value is NULL if the function is
-   not available.  Our "solution" is to regard NULL and the ld.so load
-   address as indicators for unavailable weak symbols.   */
-static struct catch *catch;
-
-#ifdef PIC
-# define tsd_setspecific(data) \
-  if (__libc_internal_tsd_set != (void *) _dl_rtld_map.l_addr                \
-      && __libc_internal_tsd_set != NULL)                                    \
-    __libc_internal_tsd_set (_LIBC_TSD_KEY_DL_ERROR, data);                  \
-  else                                                                       \
-    catch = (data)
-# define tsd_getspecific() \
-  (__libc_internal_tsd_set != (void *) _dl_rtld_map.l_addr                   \
-   && __libc_internal_tsd_set != NULL                                        \
-   ? (struct catch *) __libc_internal_tsd_get (_LIBC_TSD_KEY_DL_ERROR)       \
-   : catch)
-#else
-# define tsd_setspecific(data) \
-  if (__libc_internal_tsd_set != NULL)                                       \
-    __libc_internal_tsd_set (_LIBC_TSD_KEY_DL_ERROR, data);                  \
-  else                                                                       \
-    catch = (data)
-# define tsd_getspecific() \
-  (__libc_internal_tsd_set != NULL                                           \
-   ? (struct catch *) __libc_internal_tsd_get (_LIBC_TSD_KEY_DL_ERROR)       \
-   : catch)
-#endif
+   memory.  */
+
+__libc_tsd_define (static, DL_ERROR)
+#define tsd_getspecific()      __libc_tsd_get (DL_ERROR)
+#define tsd_setspecific(data)  __libc_tsd_set (DL_ERROR, (data))
 
 
 /* This points to a function which is called when an error is
index 3448666..32b0159 100644 (file)
@@ -1,3 +1,25 @@
+1998-11-29  Roland McGrath  <roland@baalperazim.frob.com>
+
+       * sysdeps/pthread/bits/libc-tsd.h (__libc_tsd_define, __libc_tsd_get,
+       __libc_tsd_set): New macros for new interface.
+       * no-tsd.c: New file, provide uninitialized defns of
+       __libc_internal_tsd_get and __libc_internal_tsd_set.
+       * Makefile (routines): Add no-tsd.
+
+1998-10-12  Roland McGrath  <roland@baalperazim.frob.com>
+
+       * internals.h: Include <bits/libc-tsd.h>, not <bits/libc-lock.h>.
+       * sysdeps/pthread/bits/libc-lock.h (__libc_internal_tsd_get,
+       __libc_internal_tsd_set): Move decls to ...
+       * sysdeps/pthread/bits/libc-tsd.h: New file for __libc_internal_tsd_*
+       declarations.
+
+       * sysdeps/pthread/bits/libc-lock.h (__libc_internal_tsd_get,
+       __libc_internal_tsd_set): Make these pointers to functions, not
+       functions; remove #pragma weak decls for them.
+       * specific.c (__libc_internal_tsd_get, __libc_internal_tsd_set):
+       Define static functions and initialized pointers to them.
+
 1998-11-18  Ulrich Drepper  <drepper@cygnus.com>
 
        * Makefile (CFLAGS-mutex.c): Define as -D__NO_WEAK_PTHREAD_ALIASES.
index aad7106..c19145f 100644 (file)
@@ -27,7 +27,7 @@ linuxthreads-version := $(shell sed -n 's/^.*$(subdir)-\([0-9.]*\).*$$/\1/p' \
 headers := pthread.h semaphore.h bits/semaphore.h
 distribute := internals.h queue.h restart.h spinlock.h
 
-routines := weaks
+routines := weaks no-tsd
 
 extra-libs := libpthread
 extra-libs-others := $(extra-libs)
index d11cf84..9765402 100644 (file)
@@ -16,7 +16,7 @@
 
 /* Includes */
 
-#include <bits/libc-lock.h> /* for _LIBC_TSD_KEY_N */
+#include <bits/libc-tsd.h> /* for _LIBC_TSD_KEY_N */
 #include <limits.h>
 #include <setjmp.h>
 #include <signal.h>
diff --git a/linuxthreads/no-tsd.c b/linuxthreads/no-tsd.c
new file mode 100644 (file)
index 0000000..ef79cb8
--- /dev/null
@@ -0,0 +1,33 @@
+/* libc-internal interface for thread-specific data.
+   Copyright (C) 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <bits/libc-tsd.h>
+
+/* This file provides uinitialized (common) definitions for the
+   hooks used internally by libc to access thread-specific data.
+
+   When -lpthread is used, it provides initialized definitions for these
+   variables (in specific.c), which override these uninitialized definitions.
+
+   If -lpthread is not used, these uninitialized variables default to zero,
+   which the __libc_tsd_* macros check for.   */
+
+void *(*__libc_internal_tsd_get) __P ((enum __libc_tsd_key_t));
+int (*__libc_internal_tsd_set) __P ((enum __libc_tsd_key_t,
+                                    __const void *));
index a86b1a0..674353d 100644 (file)
@@ -161,17 +161,23 @@ void __pthread_destroy_specifics()
 
 /* Thread-specific data for libc. */
 
-int __libc_internal_tsd_set(enum __libc_tsd_key_t key, const void * pointer)
+static int
+libc_internal_tsd_set(enum __libc_tsd_key_t key, const void * pointer)
 {
   pthread_descr self = thread_self();
 
   THREAD_SETMEM_NC(self, p_libc_specific[key], (void *) pointer);
   return 0;
 }
+int (*__libc_internal_tsd_set)(enum __libc_tsd_key_t key, const void * pointer)
+     = libc_internal_tsd_set;
 
-void * __libc_internal_tsd_get(enum __libc_tsd_key_t key)
+static void *
+libc_internal_tsd_get(enum __libc_tsd_key_t key)
 {
   pthread_descr self = thread_self();
 
   return THREAD_GETMEM_NC(self, p_libc_specific[key]);
 }
+void * (*__libc_internal_tsd_get)(enum __libc_tsd_key_t key)
+     = libc_internal_tsd_get;
index 1763a42..5931170 100644 (file)
@@ -149,19 +149,6 @@ typedef pthread_key_t __libc_key_t;
 #define __libc_setspecific(KEY, VALUE) \
   (__pthread_setspecific != NULL ? __pthread_setspecific (KEY, VALUE) : 0)
 
-#ifdef _LIBC
-
-/* Fast thread-specific data internal to libc.  */
-enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0,
-                       _LIBC_TSD_KEY_DL_ERROR,
-                       _LIBC_TSD_KEY_N };
-
-extern void *__libc_internal_tsd_get __P ((enum __libc_tsd_key_t));
-extern int __libc_internal_tsd_set __P ((enum __libc_tsd_key_t,
-                                        __const void *));
-
-#endif
-
 
 /* Register handlers to execute before and after `fork'.  */
 #define __libc_atfork(PREPARE, PARENT, CHILD) \
@@ -183,8 +170,6 @@ weak_extern (__pthread_mutexattr_settype)
 weak_extern (__pthread_key_create)
 weak_extern (__pthread_setspecific)
 weak_extern (__pthread_getspecific)
-weak_extern (__libc_internal_tsd_get)
-weak_extern (__libc_internal_tsd_set)
 weak_extern (__pthread_once)
 weak_extern (__pthread_initialize)
 weak_extern (__pthread_atfork)
@@ -202,8 +187,6 @@ weak_extern (_pthread_cleanup_pop_restore)
 #  pragma weak __pthread_key_create
 #  pragma weak __pthread_setspecific
 #  pragma weak __pthread_getspecific
-#  pragma weak __libc_internal_tsd_get
-#  pragma weak __libc_internal_tsd_set
 #  pragma weak __pthread_once
 #  pragma weak __pthread_initialize
 #  pragma weak __pthread_atfork
diff --git a/linuxthreads/sysdeps/pthread/bits/libc-tsd.h b/linuxthreads/sysdeps/pthread/bits/libc-tsd.h
new file mode 100644 (file)
index 0000000..42a8b80
--- /dev/null
@@ -0,0 +1,43 @@
+/* libc-internal interface for thread-specific data.  LinuxThreads version.
+   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _BITS_LIBC_TSD_H
+#define _BITS_LIBC_TSD_H 1
+
+
+/* Fast thread-specific data internal to libc.  */
+enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0,
+                       _LIBC_TSD_KEY_DL_ERROR,
+                       _LIBC_TSD_KEY_N };
+
+extern void *(*__libc_internal_tsd_get) __P ((enum __libc_tsd_key_t));
+extern int (*__libc_internal_tsd_set) __P ((enum __libc_tsd_key_t,
+                                           __const void *));
+
+#define __libc_tsd_define(CLASS, KEY)  CLASS void *__libc_tsd_##KEY##_data;
+#define __libc_tsd_get(KEY) \
+  (__libc_internal_tsd_get != NULL \
+   ? __libc_internal_tsd_get (_LIBC_TSD_KEY_##KEY) \
+   : __libc_tsd_##KEY##_data)
+#define __libc_tsd_set(KEY, VALUE) \
+  (__libc_internal_tsd_set != NULL \
+   ? __libc_internal_tsd_set (_LIBC_TSD_KEY_##KEY, (VALUE)) \
+   : ((__libc_tsd_##KEY##_data = (VALUE)), 0))
+
+#endif /* bits/libc-tsd.h */
index d9e1739..bb9cba5 100644 (file)
@@ -40,20 +40,8 @@ typedef pthread_t thread_id;
 /* mutex */
 typedef pthread_mutex_t        mutex_t;
 
-/* thread specific data */
-typedef void * tsd_key_t;
-
 #define MUTEX_INITIALIZER      PTHREAD_MUTEX_INITIALIZER
 
-#define tsd_key_create(key, destr) ( *(key) = NULL )
-#define tsd_setspecific(key, data) \
-  if (__libc_internal_tsd_set != NULL) {                                     \
-    __libc_internal_tsd_set(_LIBC_TSD_KEY_MALLOC, data);                     \
-  } else { (key) = (Void_t *) data; }
-#define tsd_getspecific(key, vptr) \
-  (vptr = (__libc_internal_tsd_get != NULL                                   \
-          ? __libc_internal_tsd_get(_LIBC_TSD_KEY_MALLOC) : (key)))
-
 #define mutex_init(m)          \
    (__pthread_mutex_init != NULL ? __pthread_mutex_init (m, NULL) : 0)
 #define mutex_lock(m)          \
@@ -85,20 +73,6 @@ typedef void * tsd_key_t;
 
 #define mutex_trylock(m) (!__mutex_trylock(m))
 
-#include <hurd/threadvar.h>
-
-/* thread specific data */
-typedef int tsd_key_t;
-
-static int tsd_keys_alloced = 0;
-
-#define tsd_key_create(key, destr) \
-  (assert (tsd_keys_alloced == 0), tsd_keys_alloced++)
-#define tsd_setspecific(key, data) \
-  (*__hurd_threadvar_location (_HURD_THREADVAR_MALLOC) = (unsigned long)(data))
-#define tsd_getspecific(key, vptr) \
-  ((vptr) = (void *)*__hurd_threadvar_location (_HURD_THREADVAR_MALLOC))
-
 #define thread_atfork(prepare, parent, child) do {} while(0)
 #define thread_atfork_static(prepare, parent, child) \
  text_set_element(_hurd_fork_prepare_hook, prepare); \
@@ -114,6 +88,18 @@ static int tsd_keys_alloced = 0;
 
 #endif /* MUTEX_INITIALIZER && PTHREAD_MUTEX_INITIALIZER */
 
+
+/* thread specific data */
+
+#include <bits/libc-tsd.h>
+
+typedef int tsd_key_t[0];      /* no key data structure, libc magic does it */
+__libc_tsd_define (, MALLOC)   /* declaration/common definition */
+#define tsd_key_create(key, destr)     ((void) (key))
+#define tsd_setspecific(key, data)     __libc_tsd_set (MALLOC, (data))
+#define tsd_getspecific(key, vptr)     ((vptr) = __libc_tsd_get (MALLOC))
+
+
 #elif defined(USE_PTHREADS) /* Posix threads */
 
 #include <pthread.h>
index 643e96f..6170006 100644 (file)
@@ -1,5 +1,5 @@
 /* 4.4BSD utility functions for error messages.
-   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998 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
 
 __BEGIN_DECLS
 
-/* Print FORMAT on stderr.  */
+/* Print "program: ", FORMAT, ": ", the standard error string for errno,
+   and a newline, on stderr.  */
 extern void warn __P ((__const char *__format, ...))
-     __attribute__ ((format (printf, 1, 2)));
+     __attribute__ ((__format__ (__printf__, 1, 2)));
 extern void vwarn __P ((__const char *__format, __gnuc_va_list))
-     __attribute__ ((format (printf, 1, 0)));
+     __attribute__ ((__format__ (__printf__, 1, 0)));
 
-/* Print "program: ", and FORMAT, and a newline, on stderr.  */
+/* Likewise, but without ": " and the standard error string.  */
 extern void warnx __P ((__const char *__format, ...))
-     __attribute__ ((format (printf, 1, 2)));
+     __attribute__ ((__format__ (__printf__, 1, 2)));
 extern void vwarnx __P ((__const char *__format, __gnuc_va_list))
-     __attribute__ ((format (printf, 1, 0)));
+     __attribute__ ((__format__ (__printf__, 1, 0)));
 
 /* Likewise, and then exit with STATUS.  */
 extern void err __P ((int __status, __const char *__format, ...))
-     __attribute__ ((noreturn, format (printf, 2, 3)));
+     __attribute__ ((__noreturn__, __format__ (__printf__, 2, 3)));
 extern void verr __P ((int __status, __const char *__format, __gnuc_va_list))
-     __attribute__ ((noreturn, format (printf, 2, 0)));
+     __attribute__ ((__noreturn__, __format__ (__printf__, 2, 0)));
 extern void errx __P ((int __status, __const char *__format, ...))
-     __attribute__ ((noreturn, format (printf, 2, 3)));
+     __attribute__ ((__noreturn__, __format__ (__printf__, 2, 3)));
 extern void verrx __P ((int __status, __const char *, __gnuc_va_list))
-     __attribute__ ((noreturn, format (printf, 2, 0)));
+     __attribute__ ((__noreturn__, __format__ (__printf__, 2, 0)));
 
 __END_DECLS
 
index da4de5a..4360f8f 100644 (file)
@@ -28,6 +28,7 @@
 #include <sys/un.h>
 
 #include "nscd-client.h"
+#include "nscd_proto.h"
 
 int __nss_not_use_nscd_passwd;
 
diff --git a/sysdeps/generic/bits/libc-tsd.h b/sysdeps/generic/bits/libc-tsd.h
new file mode 100644 (file)
index 0000000..6048d99
--- /dev/null
@@ -0,0 +1,51 @@
+/* libc-internal interface for thread-specific data.  Stub version.
+   Copyright (C) 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _BITS_LIBC_TSD_H
+#define _BITS_LIBC_TSD_H 1
+
+/* This file defines the following macros for accessing a small fixed
+   set of thread-specific `void *' data used only internally by libc.
+
+   __libc_tsd_define(CLASS, KEY)       -- Define or declare a `void *' datum
+                                          for KEY.  CLASS can be `static' for
+                                          keys used in only one source file,
+                                          empty for global definitions, or
+                                          `extern' for global declarations.
+   __libc_tsd_get(KEY)                 -- Return the `void *' datum for KEY.
+   __libc_tsd_set(KEY, VALUE)          -- Set the datum for KEY to VALUE.
+
+   The set of available KEY's will usually be provided as an enum,
+   and contains (at least):
+               _LIBC_TSD_KEY_MALLOC
+               _LIBC_TSD_KEY_DL_ERROR
+   All uses must be the literal _LIBC_TSD_* name in the __libc_tsd_* macros.
+   Some implementations may not provide any enum at all and instead
+   using string pasting in the macros.  */
+
+/* This is the generic/stub implementation for wholly single-threaded
+   systems.  We don't define an enum for the possible key values, because
+   the KEYs translate directly into variables by macro magic.  */
+
+#define __libc_tsd_define(CLASS, KEY)  CLASS void *__libc_tsd_##KEY##_data;
+#define __libc_tsd_get(KEY)            (__libc_tsd_##KEY##_data)
+#define __libc_tsd_set(KEY, VALUE)     (__libc_tsd_##KEY##_data = (VALUE))
+
+
+#endif /* bits/libc-tsd.h */
index 46b9f17..43fea06 100644 (file)
@@ -1,6 +1,6 @@
 /* MT support function to get address of `errno' variable, non-threaded
    version.
-   Copyright (C) 1996 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1998 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
@@ -18,7 +18,8 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-extern int errno;
+#include <errno.h>
+#undef errno
 
 int *
 weak_const_function
index 6885cbb..016f414 100644 (file)
@@ -45,6 +45,9 @@
                  : memcpy (dest, src, n)))
 /* This looks horribly ugly, but the compiler can optimize it totally,
    as the count is constant.  */
+__STRING_INLINE void *__memcpy_c (void *__dest, __const void *__src,
+                                 size_t __n);
+
 __STRING_INLINE void *
 __memcpy_c (void *__dest, __const void *__src, size_t __n)
 {
@@ -170,6 +173,9 @@ memmove (void *__dest, __const void *__src, size_t __n)
                     : __memset_cg (s, 0x01010101UL * (unsigned char) (c), n))\
                  : __memset_gg (s, c, n)))
 
+__STRING_INLINE void *__memset_cc (void *__s, unsigned long int __pattern,
+                                  size_t __n);
+
 __STRING_INLINE void *
 __memset_cc (void *__s, unsigned long int __pattern, size_t __n)
 {
@@ -211,7 +217,7 @@ __memset_cc (void *__s, unsigned long int __pattern, size_t __n)
       return __s;
     case 2:
       __COMMON_CODE ("\n\tstosw");
-      return s;
+      return __s;
     case 3:
       __COMMON_CODE ("\n\tstosw\n\tstosb");
       return __s;
@@ -219,6 +225,8 @@ __memset_cc (void *__s, unsigned long int __pattern, size_t __n)
 #undef __COMMON_CODE
 }
 
+__STRING_INLINE void *__memset_cg (void *__s, unsigned long __c, size_t __n);
+
 __STRING_INLINE void *
 __memset_cg (void *__s, unsigned long __c, size_t __n)
 {
@@ -240,6 +248,8 @@ __memset_cg (void *__s, unsigned long __c, size_t __n)
   return __s;
 }
 
+__STRING_INLINE void *__memset_gg (void *__s, char __c, size_t __n);
+
 __STRING_INLINE void *
 __memset_gg (void *__s, char __c, size_t __n)
 {
@@ -455,6 +465,8 @@ strncmp (__const char *__s1, __const char *__s2, size_t __n)
                  ? __strchr_c (s, ((c) & 0xff) << 8)                         \
                  : __strchr_g (s, c)))
 
+__STRING_INLINE char *__strchr_g (__const char *__s, int __c);
+
 __STRING_INLINE char *
 __strchr_g (__const char *__s, int __c)
 {
@@ -478,6 +490,8 @@ __strchr_g (__const char *__s, int __c)
   return __res - 1;
 }
 
+__STRING_INLINE char *__strchr_c (__const char *__s, int __c);
+
 __STRING_INLINE char *
 __strchr_c (__const char *__s, int __c)
 {
index 9c4bb52..5fe2062 100644 (file)
@@ -59,6 +59,9 @@
         ? __memcpy_by2 (dest, src, n)                                        \
         : __memcpy_g (dest, src, n))))
 
+__STRING_INLINE void *__memcpy_by4 (void *__dest, __const void *__src,
+                                   size_t __n);
+
 __STRING_INLINE void *
 __memcpy_by4 (void *__dest, __const void *__src, size_t __n)
 {
@@ -78,6 +81,9 @@ __memcpy_by4 (void *__dest, __const void *__src, size_t __n)
   return __dest;
 }
 
+__STRING_INLINE void *__memcpy_by2 (void *__dest, __const void *__src,
+                                   size_t __n);
+
 __STRING_INLINE void *
 __memcpy_by2 (void *__dest, __const void *__src, size_t __n)
 {
@@ -102,7 +108,10 @@ __memcpy_by2 (void *__dest, __const void *__src, size_t __n)
   return __dest;
 }
 
-__STRING_INLINE void *
+__STRING_INLINE void *__memcpy_g (void *__dest, __const void *__src,
+                                 size_t __n);
+
+     __STRING_INLINE void *
 __memcpy_g (void *__dest, __const void *__src, size_t __n)
 {
   register unsigned long int __d0, __d1, __d2;
@@ -203,6 +212,8 @@ memcmp (__const void *__s1, __const void *__s2, size_t __n)
         ? __memset_gc_by2 (s, c, n)                                          \
         : __memset_gg (s, c, n))))
 
+__STRING_INLINE void *__memset_cc_by4 (void *__s, int __c, size_t __n);
+
 __STRING_INLINE void *
 __memset_cc_by4 (void *__s, int __c, size_t __n)
 {
@@ -220,6 +231,8 @@ __memset_cc_by4 (void *__s, int __c, size_t __n)
   return __s;
 }
 
+__STRING_INLINE void *__memset_cc_by2 (void *__s, int __c, size_t __n);
+
 __STRING_INLINE void *
 __memset_cc_by2 (void *__s, int __c, size_t __n)
 {
@@ -241,6 +254,8 @@ __memset_cc_by2 (void *__s, int __c, size_t __n)
   return __s;
 }
 
+__STRING_INLINE void *__memset_gc_by4 (void *__s, int __c, size_t __n);
+
 __STRING_INLINE void *
 __memset_gc_by4 (void *__s, int __c, size_t __n)
 {
@@ -262,6 +277,8 @@ __memset_gc_by4 (void *__s, int __c, size_t __n)
   return __s;
 }
 
+__STRING_INLINE void *__memset_gc_by2 (void *__s, int __c, size_t __n);
+
 __STRING_INLINE void *
 __memset_gc_by2 (void *__s, int __c, size_t __n)
 {
@@ -287,6 +304,8 @@ __memset_gc_by2 (void *__s, int __c, size_t __n)
   return __s;
 }
 
+__STRING_INLINE void *__memset_cg (void *__s, int __c, size_t __n);
+
 __STRING_INLINE void *
 __memset_cg (void *__s, int __c, size_t __n)
 {
@@ -304,6 +323,8 @@ __memset_cg (void *__s, int __c, size_t __n)
   return __s;
 }
 
+__STRING_INLINE void *__memset_gg (void *__s, int __c, size_t __n);
+
 __STRING_INLINE void *
 __memset_gg (void *__s, int __c, size_t __n)
 {
@@ -362,6 +383,8 @@ memchr (__const void *__s, int __c, size_t __n)
   (__extension__ (__builtin_constant_p (str)                                 \
                  ? __builtin_strlen (str)                                    \
                  : __strlen_g (str)))
+__STRING_INLINE size_t __strlen_g (__const char *__str);
+
 __STRING_INLINE size_t
 __strlen_g (__const char *__str)
 {
@@ -438,6 +461,8 @@ __strlen_g (__const char *__str)
                      }                                                       \
                    (char *) __dest; }))
 
+__STRING_INLINE char *__strcpy_g (char *__dest, __const char *__src);
+
 __STRING_INLINE char *
 __strcpy_g (char *__dest, __const char *__src)
 {
@@ -530,6 +555,9 @@ __strcpy_g (char *__dest, __const char *__src)
                      }                                                       \
                    (char *) __dest; }))
 
+__STRING_INLINE char *__mempcpy_by4 (char *__dest, __const char *__src,
+                                    size_t __srclen);
+
 __STRING_INLINE char *
 __mempcpy_by4 (char *__dest, __const char *__src, size_t __srclen)
 {
@@ -549,6 +577,9 @@ __mempcpy_by4 (char *__dest, __const char *__src, size_t __srclen)
   return __tmp;
 }
 
+__STRING_INLINE char *__mempcpy_by2 (char *__dest, __const char *__src,
+                                    size_t __srclen);
+
 __STRING_INLINE char *
 __mempcpy_by2 (char *__dest, __const char *__src, size_t __srclen)
 {
@@ -573,6 +604,9 @@ __mempcpy_by2 (char *__dest, __const char *__src, size_t __srclen)
   return __tmp + 2;
 }
 
+__STRING_INLINE char *__mempcpy_byn (char *__dest, __const char *__src,
+                                    size_t __srclen);
+
 __STRING_INLINE char *
 __mempcpy_byn (char *__dest, __const char *__src, size_t __srclen)
 {
@@ -595,6 +629,8 @@ __mempcpy_byn (char *__dest, __const char *__src, size_t __srclen)
   return __tmp;
 }
 
+__STRING_INLINE char *__stpcpy_g (char *__dest, __const char *__src);
+
 __STRING_INLINE char *
 __stpcpy_g (char *__dest, __const char *__src)
 {
@@ -633,6 +669,9 @@ __stpcpy_g (char *__dest, __const char *__src)
       ? __strncpy_by2 (dest, src, srclen, n)                                 \
       : __strncpy_byn (dest, src, srclen, n)))
 
+__STRING_INLINE char *__strncpy_by4 (char *__dest, __const char __src[],
+                                    size_t __srclen, size_t __n);
+
 __STRING_INLINE char *
 __strncpy_by4 (char *__dest, __const char __src[], size_t __srclen, size_t __n)
 {
@@ -653,6 +692,9 @@ __strncpy_by4 (char *__dest, __const char __src[], size_t __srclen, size_t __n)
   return __dest;
 }
 
+__STRING_INLINE char *__strncpy_by2 (char *__dest, __const char __src[],
+                                    size_t __srclen, size_t __n);
+
 __STRING_INLINE char *
 __strncpy_by2 (char *__dest, __const char __src[], size_t __srclen, size_t __n)
 {
@@ -678,6 +720,9 @@ __strncpy_by2 (char *__dest, __const char __src[], size_t __srclen, size_t __n)
   return __dest;
 }
 
+__STRING_INLINE char *__strncpy_byn (char *__dest, __const char __src[],
+                                    size_t __srclen, size_t __n);
+
 __STRING_INLINE char *
 __strncpy_byn (char *__dest, __const char __src[], size_t __srclen, size_t __n)
 {
@@ -701,6 +746,9 @@ __strncpy_byn (char *__dest, __const char __src[], size_t __srclen, size_t __n)
   return __dest;
 }
 
+__STRING_INLINE char *__strncpy_gg (char *__dest, __const char *__src,
+                                   size_t __n);
+
 __STRING_INLINE char *
 __strncpy_gg (char *__dest, __const char *__src, size_t __n)
 {
@@ -738,6 +786,9 @@ __strncpy_gg (char *__dest, __const char *__src, size_t __n)
                  ? __strcat_c (dest, src, strlen (src) + 1)                  \
                  : __strcat_g (dest, src)))
 
+__STRING_INLINE char *__strcat_c (char *__dest, __const char __src[],
+                                 size_t __srclen);
+
 __STRING_INLINE char *
 __strcat_c (char *__dest, __const char __src[], size_t __srclen)
 {
@@ -765,6 +816,8 @@ __strcat_c (char *__dest, __const char __src[], size_t __srclen)
   return __dest;
 }
 
+__STRING_INLINE char *__strcat_g (char *__dest, __const char *__src);
+
 __STRING_INLINE char *
 __strcat_g (char *__dest, __const char *__src)
 {
@@ -800,6 +853,9 @@ __strcat_g (char *__dest, __const char *__src)
                                  (__const char *) src, n), __dest))          \
                    : __strncat_g (__dest, src, n); }))
 
+__STRING_INLINE char *__strncat_g (char *__dest, __const char __src[],
+                                  size_t __n);
+
 __STRING_INLINE char *
 __strncat_g (char *__dest, __const char __src[], size_t __n)
 {
@@ -918,6 +974,8 @@ __strncat_g (char *__dest, __const char __src[], size_t __n)
                      }                                                       \
                    __result; }))
 
+__STRING_INLINE int __strcmp_gg (__const char *__s1, __const char *__s2);
+
 __STRING_INLINE int
 __strcmp_gg (__const char *__s1, __const char *__s2)
 {
@@ -954,6 +1012,9 @@ __strcmp_gg (__const char *__s1, __const char *__s2)
                     ? strcmp (s1, s2)                                        \
                     : __strncmp_g (s1, s2, n))))
 
+__STRING_INLINE int __strncmp_g (__const char *__s1, __const char *__s2,
+                               size_t __n);
+
 __STRING_INLINE int
 __strncmp_g (__const char *__s1, __const char *__s2, size_t __n)
 {
@@ -991,6 +1052,8 @@ __strncmp_g (__const char *__s1, __const char *__s2, size_t __n)
                  ? __strchr_c (s, ((c) & 0xff) << 8)                         \
                  : __strchr_g (s, c)))
 
+__STRING_INLINE char *__strchr_c (__const char *__s, int __c);
+
 __STRING_INLINE char *
 __strchr_c (__const char *__s, int __c)
 {
@@ -1012,6 +1075,8 @@ __strchr_c (__const char *__s, int __c)
   return __res;
 }
 
+__STRING_INLINE char *__strchr_g (__const char *__s, int __c);
+
 __STRING_INLINE char *
 __strchr_g (__const char *__s, int __c)
 {
@@ -1053,6 +1118,8 @@ __strchr_g (__const char *__s, int __c)
                  : __strrchr_g (s, c)))
 
 #ifdef __i686__
+__STRING_INLINE char *__strrchr_c (__const char *__s, int __c);
+
 __STRING_INLINE char *
 __strrchr_c (__const char *__s, int __c)
 {
@@ -1072,6 +1139,8 @@ __strrchr_c (__const char *__s, int __c)
   return __res - 1;
 }
 
+__STRING_INLINE char *__strrchr_g (__const char *__s, int __c);
+
 __STRING_INLINE char *
 __strrchr_g (__const char *__s, int __c)
 {
@@ -1092,6 +1161,8 @@ __strrchr_g (__const char *__s, int __c)
   return __res - 1;
 }
 #else
+__STRING_INLINE char *__strrchr_c (__const char *__s, int __c);
+
 __STRING_INLINE char *
 __strrchr_c (__const char *__s, int __c)
 {
@@ -1113,6 +1184,8 @@ __strrchr_c (__const char *__s, int __c)
   return __res;
 }
 
+__STRING_INLINE char *__strrchr_g (__const char *__s, int __c);
+
 __STRING_INLINE char *
 __strrchr_g (__const char *__s, int __c)
 {
@@ -1159,6 +1232,8 @@ __strrchr_g (__const char *__s, int __c)
                        : __strcspn_cg (s, reject, strlen (reject))))         \
                  : __strcspn_g (s, reject)))
 
+__STRING_INLINE size_t __strcspn_c1 (__const char *__s, int __reject);
+
 __STRING_INLINE size_t
 __strcspn_c1 (__const char *__s, int __reject)
 {
@@ -1179,6 +1254,9 @@ __strcspn_c1 (__const char *__s, int __reject)
   return (__res - 1) - __s;
 }
 
+__STRING_INLINE size_t __strcspn_cg (__const char *__s, __const char __reject[],
+                                   size_t __reject_len);
+
 __STRING_INLINE size_t
 __strcspn_cg (__const char *__s, __const char __reject[], size_t __reject_len)
 {
@@ -1201,7 +1279,9 @@ __strcspn_cg (__const char *__s, __const char __reject[], size_t __reject_len)
   return (__res - 1) - __s;
 }
 
+__STRING_INLINE size_t __strcspn_g (__const char *__s, __const char *__reject);
 #ifdef __PIC__
+
 __STRING_INLINE size_t
 __strcspn_g (__const char *__s, __const char *__reject)
 {
@@ -1269,6 +1349,8 @@ __strcspn_g (__const char *__s, __const char *__reject)
                        : __strspn_cg (s, accept, strlen (accept))))          \
                  : __strspn_g (s, accept)))
 
+__STRING_INLINE size_t __strspn_c1 (__const char *__s, int __accept);
+
 __STRING_INLINE size_t
 __strspn_c1 (__const char *__s, int __accept)
 {
@@ -1287,6 +1369,9 @@ __strspn_c1 (__const char *__s, int __accept)
   return (__res - 1) - __s;
 }
 
+__STRING_INLINE size_t __strspn_cg (__const char *__s, __const char __accept[],
+                                   size_t __accept_len);
+
 __STRING_INLINE size_t
 __strspn_cg (__const char *__s, __const char __accept[], size_t __accept_len)
 {
@@ -1309,7 +1394,9 @@ __strspn_cg (__const char *__s, __const char __accept[], size_t __accept_len)
   return (__res - 1) - __s;
 }
 
+__STRING_INLINE size_t __strspn_g (__const char *__s, __const char *__accept);
 #ifdef __PIC__
+
 __STRING_INLINE size_t
 __strspn_g (__const char *__s, __const char *__accept)
 {
@@ -1375,6 +1462,9 @@ __strspn_g (__const char *__s, __const char *__accept)
                        : __strpbrk_cg (s, accept, strlen (accept))))         \
                  : __strpbrk_g (s, accept)))
 
+__STRING_INLINE char *__strpbrk_cg (__const char *__s, __const char __accept[],
+                                   size_t __accept_len);
+
 __STRING_INLINE char *
 __strpbrk_cg (__const char *__s, __const char __accept[], size_t __accept_len)
 {
@@ -1401,7 +1491,9 @@ __strpbrk_cg (__const char *__s, __const char __accept[], size_t __accept_len)
   return __res;
 }
 
+__STRING_INLINE char *__strpbrk_g (__const char *__s, __const char *__accept);
 #ifdef __PIC__
+
 __STRING_INLINE char *
 __strpbrk_g (__const char *__s, __const char *__accept)
 {
@@ -1479,6 +1571,9 @@ __strpbrk_g (__const char *__s, __const char *__accept)
 
 /* Please note that this function need not handle NEEDLEs with a
    length shorter than two.  */
+__STRING_INLINE char *__strstr_cg (__const char *__haystack, __const char __needle[],
+                                  size_t __needle_len);
+
 __STRING_INLINE char *
 __strstr_cg (__const char *__haystack, __const char __needle[],
             size_t __needle_len)
@@ -1504,7 +1599,9 @@ __strstr_cg (__const char *__haystack, __const char __needle[],
   return __res;
 }
 
+__STRING_INLINE char *__strstr_g (__const char *__haystack, __const char *__needle);
 #ifdef __PIC__
+
 __STRING_INLINE char *
 __strstr_g (__const char *__haystack, __const char *__needle)
 {
diff --git a/sysdeps/mach/hurd/bits/libc-tsd.h b/sysdeps/mach/hurd/bits/libc-tsd.h
new file mode 100644 (file)
index 0000000..6f074c7
--- /dev/null
@@ -0,0 +1,37 @@
+/* libc-internal interface for thread-specific data.  Hurd version.
+   Copyright (C) 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _BITS_LIBC_TSD_H
+#define _BITS_LIBC_TSD_H 1
+
+#include <hurd/threadvar.h>
+
+#define __libc_tsd_define(CLASS, KEY) /* nothing, always have threadvars */
+
+#define __libc_tsd_threadvar_location(KEY) \
+  ((void **) __hurd_threadvar_location (_HURD_THREADVAR_##KEY))
+
+#define __libc_tsd_get(KEY) \
+  (*__libc_tsd_threadvar_location (KEY))
+
+#define __libc_tsd_set(KEY, VALUE) \
+  (*__libc_tsd_threadvar_location (KEY) = (VALUE))
+
+
+#endif /* bits/libc-tsd.h */
index ec116f6..7b644e8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997, 1998 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
@@ -50,13 +50,6 @@ struct ipc_perm
   };
 
 
-/* Kludge to work around Linux' restriction of only up to five
-   arguments to a system call.  */
-struct ipc_kludge
-  {
-    void *msgp;
-    long int msgtyp;
-  };
 
 __BEGIN_DECLS
 
index 1614431..434b193 100644 (file)
@@ -17,8 +17,8 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <errno.h>
-#include <unistd.h>
 #include <sys/types.h>
+#include <sys/fsuid.h>
 
 #include <sysdep.h>
 #include <sys/syscall.h>
index a2983a5..f377169 100644 (file)
@@ -17,8 +17,8 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <errno.h>
-#include <unistd.h>
 #include <sys/types.h>
+#include <sys/fsuid.h>
 
 #include <sysdep.h>
 #include <sys/syscall.h>