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.
This commit is contained in:
Ulrich Drepper 1998-11-30 14:21:53 +00:00
parent 3f7b3d9b1f
commit 348ed5157b
23 changed files with 523 additions and 139 deletions

View File

@ -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

95
FAQ
View File

@ -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.
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
@ -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.
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

51
bits/libc-tsd.h Normal file
View File

@ -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 */

View 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;

View 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.
memory. */
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
__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

View 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.

View 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)

View 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>

33
linuxthreads/no-tsd.c Normal file
View File

@ -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 *));

View 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;

View 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

View File

@ -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 */

View 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>

View 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
@ -30,27 +30,28 @@
__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

View File

@ -28,6 +28,7 @@
#include <sys/un.h>
#include "nscd-client.h"
#include "nscd_proto.h"
int __nss_not_use_nscd_passwd;

View File

@ -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 */

View 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

View 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)
{

View 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,6 +108,9 @@ __memcpy_by2 (void *__dest, __const void *__src, size_t __n)
return __dest;
}
__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)
{
@ -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)
{

View File

@ -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 */

View 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

View 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>

View 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>