mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
Update.
1998-06-29 12:27 Ulrich Drepper <drepper@cygnus.com> * argp/argp.h: Use __PMT instead of __P for function pointer. * iconv/gconv.h: Likewise. * io/fts.h: Likewise. * io/ftw.h: Likewise. * libio/libio.h: Likewise. * malloc/mcheck.h: Likewise. * misc/search.h: Likewise. * posix/glob.h: Likewise. * resolv/resolv.h: Likewise. * signal/signal.h: Likewise. * stdlib/stdlib.h: Likewise. * sysdeps/unix/sysv/linux/bits/sigaction.h: Likewise. * sysdeps/unix/sysv/linux/bits/siginfo.h: Likewise. 1998-06-26 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makeconfig (CPPFLAGS): Use $($(subdir)-CPPFLAGS) only once. 1998-06-27 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * posix/wordexp.c (parse_param): Fix memory leak. 1998-06-27 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * libc.map: Export _IO_ftrylockfile. 1998-06-27 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/unix/sysv/linux/aio_sigqueue.c: Use get[pu]id instead of __get[pu]id. 1998-06-28 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * elf/dl-misc.c (_dl_debug_message): Don't cache the pid. * elf/dl-runtime.c (_dl_object_relocation_scope): Avoid adding the same search list twice. 1998-06-29 Andreas Jaeger <aj@arthur.rhein-neckar.de> * login/programs/utmpd.c (handle_requests): Set and use maximal fd used to optimize loop/select. 1998-06-24 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/generic/init-first.c: Don't define __libc_pid. * sysdeps/unix/sysv/linux/init-first.c: Likewise. * sysdeps/mach/hurd/i386/init-first.c: Likewise. * sysdeps/mach/hurd/mips/init-first.c: Likewise. * sysdeps/arm/init-first.c: Likewise. * posix/getopt_init.c: Don't use __libc_pid. * sysdeps/unix/sysv/linux/aio_sigqueue.c: Likewise. * sysdeps/unix/sysv/linux/sigqueue.c: Likewise. * libc.map: Remove __libc_uid and __libc_pid.
This commit is contained in:
57
ChangeLog
57
ChangeLog
@ -1,3 +1,60 @@
|
|||||||
|
1998-06-29 12:27 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* argp/argp.h: Use __PMT instead of __P for function pointer.
|
||||||
|
* iconv/gconv.h: Likewise.
|
||||||
|
* io/fts.h: Likewise.
|
||||||
|
* io/ftw.h: Likewise.
|
||||||
|
* libio/libio.h: Likewise.
|
||||||
|
* malloc/mcheck.h: Likewise.
|
||||||
|
* misc/search.h: Likewise.
|
||||||
|
* posix/glob.h: Likewise.
|
||||||
|
* resolv/resolv.h: Likewise.
|
||||||
|
* signal/signal.h: Likewise.
|
||||||
|
* stdlib/stdlib.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/bits/sigaction.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/bits/siginfo.h: Likewise.
|
||||||
|
|
||||||
|
1998-06-26 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* Makeconfig (CPPFLAGS): Use $($(subdir)-CPPFLAGS) only once.
|
||||||
|
|
||||||
|
1998-06-27 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* posix/wordexp.c (parse_param): Fix memory leak.
|
||||||
|
|
||||||
|
1998-06-27 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* libc.map: Export _IO_ftrylockfile.
|
||||||
|
|
||||||
|
1998-06-27 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/aio_sigqueue.c: Use get[pu]id instead of
|
||||||
|
__get[pu]id.
|
||||||
|
|
||||||
|
1998-06-28 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* elf/dl-misc.c (_dl_debug_message): Don't cache the pid.
|
||||||
|
|
||||||
|
* elf/dl-runtime.c (_dl_object_relocation_scope): Avoid adding the
|
||||||
|
same search list twice.
|
||||||
|
|
||||||
|
1998-06-29 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||||
|
|
||||||
|
* login/programs/utmpd.c (handle_requests): Set and use maximal fd
|
||||||
|
used to optimize loop/select.
|
||||||
|
|
||||||
|
1998-06-24 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* sysdeps/generic/init-first.c: Don't define __libc_pid.
|
||||||
|
* sysdeps/unix/sysv/linux/init-first.c: Likewise.
|
||||||
|
* sysdeps/mach/hurd/i386/init-first.c: Likewise.
|
||||||
|
* sysdeps/mach/hurd/mips/init-first.c: Likewise.
|
||||||
|
* sysdeps/arm/init-first.c: Likewise.
|
||||||
|
* posix/getopt_init.c: Don't use __libc_pid.
|
||||||
|
* sysdeps/unix/sysv/linux/aio_sigqueue.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sigqueue.c: Likewise.
|
||||||
|
* libc.map: Remove __libc_uid and __libc_pid.
|
||||||
|
|
||||||
1998-06-28 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
1998-06-28 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||||
|
|
||||||
* sunrpc/rtime.c (rtime): Use poll instead of select.
|
* sunrpc/rtime.c (rtime): Use poll instead of select.
|
||||||
|
73
FAQ
73
FAQ
@ -5,7 +5,7 @@ and using glibc. Please make sure you read this before sending questions or
|
|||||||
bug reports to the maintainers.
|
bug reports to the maintainers.
|
||||||
|
|
||||||
The GNU C library is very complex. The installation process has not been
|
The GNU C library is very complex. The installation process has not been
|
||||||
completely automated; there are too many variables. You can do substantial
|
completely automated; there are too many variables. You can do substantial
|
||||||
damage to your system by installing the library incorrectly. Make sure you
|
damage to your system by installing the library incorrectly. Make sure you
|
||||||
understand what you are undertaking before you begin.
|
understand what you are undertaking before you begin.
|
||||||
|
|
||||||
@ -85,6 +85,8 @@ please let me know.
|
|||||||
2.20. What do I need for C++ development?
|
2.20. What do I need for C++ development?
|
||||||
2.21. Even statically linked programs need some shared libraries
|
2.21. Even statically linked programs need some shared libraries
|
||||||
which is not acceptable for me. What can I do?
|
which is not acceptable for me. What can I do?
|
||||||
|
2.22. I just upgraded my Linux system to glibc and now I get
|
||||||
|
errors whenever I try to link any program.
|
||||||
|
|
||||||
3. Source and binary incompatibilities, and what to do about them
|
3. Source and binary incompatibilities, and what to do about them
|
||||||
|
|
||||||
@ -123,6 +125,7 @@ please let me know.
|
|||||||
4.3. When I set the timezone by setting the TZ environment variable
|
4.3. When I set the timezone by setting the TZ environment variable
|
||||||
to EST5EDT things go wrong since glibc computes the wrong time
|
to EST5EDT things go wrong since glibc computes the wrong time
|
||||||
from this information.
|
from this information.
|
||||||
|
4.4. What other sources of documentation about glibc are available?
|
||||||
|
|
||||||
|
|
||||||
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
||||||
@ -376,10 +379,10 @@ any other link path.
|
|||||||
1.14. What's the problem with configure --enable-omitfp?
|
1.14. What's the problem with configure --enable-omitfp?
|
||||||
|
|
||||||
{AJ} When --enable-omitfp is set the libraries are built without frame
|
{AJ} When --enable-omitfp is set the libraries are built without frame
|
||||||
pointers. Some compilers produce buggy code for this model and therefore we
|
pointers. Some compilers produce buggy code for this model and therefore we
|
||||||
don't advise using it at the moment.
|
don't advise using it at the moment.
|
||||||
|
|
||||||
If you use --enable-omitfp, you're on your own. If you encounter problems
|
If you use --enable-omitfp, you're on your own. If you encounter problems
|
||||||
with a library that was build this way, we advise you to rebuild the library
|
with a library that was build this way, we advise you to rebuild the library
|
||||||
without --enable-omitfp. If the problem vanishes consider tracking the
|
without --enable-omitfp. If the problem vanishes consider tracking the
|
||||||
problem down and report it as compiler failure.
|
problem down and report it as compiler failure.
|
||||||
@ -802,6 +805,25 @@ option is using NSS. There is no switch anymore. Therefore it is
|
|||||||
*highly* recommended *not* to use --enable-static-nss since this makes
|
*highly* recommended *not* to use --enable-static-nss since this makes
|
||||||
the behaviour of the programs on the system inconsistent.
|
the behaviour of the programs on the system inconsistent.
|
||||||
|
|
||||||
|
|
||||||
|
2.22. I just upgraded my Linux system to glibc and now I get
|
||||||
|
errors whenever I try to link any program.
|
||||||
|
|
||||||
|
{ZW} This happens when you have installed glibc as the primary C library but
|
||||||
|
have stray symbolic links pointing at your old C library. If the first
|
||||||
|
`libc.so' the linker finds is libc 5, it will use that. Your program
|
||||||
|
expects to be linked with glibc, so the link fails.
|
||||||
|
|
||||||
|
The most common case is that glibc put its `libc.so' in /usr/lib, but there
|
||||||
|
was a `libc.so' from libc 5 in /lib, which gets searched first. To fix the
|
||||||
|
problem, just delete /lib/libc.so. You may also need to delete other
|
||||||
|
symbolic links in /lib, such as /lib/libm.so if it points to libm.so.5.
|
||||||
|
|
||||||
|
{AJ} The perl script test-installation.pl which is run as last step during
|
||||||
|
an installation of glibc that is configured with --prefix=/usr should help
|
||||||
|
detect these situations. If the script reports problems, something is
|
||||||
|
really screwed up.
|
||||||
|
|
||||||
|
|
||||||
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||||||
|
|
||||||
@ -995,11 +1017,11 @@ siginterrupt().
|
|||||||
functions. Why?
|
functions. Why?
|
||||||
|
|
||||||
{AJ} glibc 2.1 has special string functions that are faster than the normal
|
{AJ} glibc 2.1 has special string functions that are faster than the normal
|
||||||
library functions. Some of the functions are additionally implemented as
|
library functions. Some of the functions are additionally implemented as
|
||||||
inline functions and others as macros.
|
inline functions and others as macros.
|
||||||
|
|
||||||
The optimized string functions are only used when compiling with
|
The optimized string functions are only used when compiling with
|
||||||
optimizations (-O1 or higher). The behavior can be changed with two feature
|
optimizations (-O1 or higher). The behavior can be changed with two feature
|
||||||
macros:
|
macros:
|
||||||
|
|
||||||
* __NO_STRING_INLINES: Don't do any string optimizations.
|
* __NO_STRING_INLINES: Don't do any string optimizations.
|
||||||
@ -1008,7 +1030,7 @@ macros:
|
|||||||
|
|
||||||
Since some of these string functions are now additionally defined as macros,
|
Since some of these string functions are now additionally defined as macros,
|
||||||
code like "char *strncpy();" doesn't work anymore (and is unnecessary, since
|
code like "char *strncpy();" doesn't work anymore (and is unnecessary, since
|
||||||
<string.h> has the necessary declarations). Either change your code or
|
<string.h> has the necessary declarations). Either change your code or
|
||||||
define __NO_STRING_INLINES.
|
define __NO_STRING_INLINES.
|
||||||
|
|
||||||
{UD} Another problem in this area is that gcc still has problems on machines
|
{UD} Another problem in this area is that gcc still has problems on machines
|
||||||
@ -1033,22 +1055,37 @@ This disables the optimization for that specific call.
|
|||||||
{RM,AJ} Constructs like:
|
{RM,AJ} Constructs like:
|
||||||
static FILE *InPtr = stdin;
|
static FILE *InPtr = stdin;
|
||||||
|
|
||||||
lead to this message. This is correct behaviour with glibc since stdin is
|
lead to this message. This is correct behaviour with glibc since stdin is
|
||||||
not a constant expression. Please note that a strict reading of ISO C does
|
not a constant expression. Please note that a strict reading of ISO C does
|
||||||
not allow above constructs.
|
not allow above constructs.
|
||||||
|
|
||||||
One of the advantages of this is that you can assign to stdin, stdout, and
|
One of the advantages of this is that you can assign to stdin, stdout, and
|
||||||
stderr just like any other global variable (e.g. `stdout = my_stream;'),
|
stderr just like any other global variable (e.g. `stdout = my_stream;'),
|
||||||
which can be very useful with custom streams that you can write with libio
|
which can be very useful with custom streams that you can write with libio
|
||||||
(but beware this is not necessarily portable). The reason to implement it
|
(but beware this is not necessarily portable). The reason to implement it
|
||||||
this way were versioning problems with the size of the FILE structure.
|
this way were versioning problems with the size of the FILE structure.
|
||||||
|
|
||||||
|
To fix those programs you've got to initialize the variable at run time.
|
||||||
|
This can be done, e.g. in main, like:
|
||||||
|
|
||||||
|
static FILE *InPtr;
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
InPtr = stdin;
|
||||||
|
}
|
||||||
|
|
||||||
|
or by constructors (beware this is gcc specific):
|
||||||
|
|
||||||
|
static FILE *InPtr;
|
||||||
|
static void inPtr_construct (void) __attribute__((constructor));
|
||||||
|
static void inPtr_construct (void) { InPtr = stdin; }
|
||||||
|
|
||||||
|
|
||||||
3.10. I can't compile with gcc -traditional (or
|
3.10. I can't compile with gcc -traditional (or
|
||||||
-traditional-cpp). Why?
|
-traditional-cpp). Why?
|
||||||
|
|
||||||
{AJ} glibc2 does break -traditional and -traditonal-cpp - and will continue
|
{AJ} glibc2 does break -traditional and -traditonal-cpp - and will continue
|
||||||
to do so. For example constructs of the form:
|
to do so. For example constructs of the form:
|
||||||
|
|
||||||
enum {foo
|
enum {foo
|
||||||
#define foo foo
|
#define foo foo
|
||||||
@ -1063,7 +1100,7 @@ check with #ifdef).
|
|||||||
|
|
||||||
{AJ} The GNU C library is compatible with the ANSI/ISO C standard. If
|
{AJ} The GNU C library is compatible with the ANSI/ISO C standard. If
|
||||||
you're using `gcc -ansi', the glibc includes which are specified in the
|
you're using `gcc -ansi', the glibc includes which are specified in the
|
||||||
standard follow the standard. The ANSI/ISO C standard defines what has to be
|
standard follow the standard. The ANSI/ISO C standard defines what has to be
|
||||||
in the include files - and also states that nothing else should be in the
|
in the include files - and also states that nothing else should be in the
|
||||||
include files (btw. you can still enable additional standards with feature
|
include files (btw. you can still enable additional standards with feature
|
||||||
flags).
|
flags).
|
||||||
@ -1134,6 +1171,20 @@ So, please avoid sending bug reports about time related problems if you use
|
|||||||
the POSIX method and you have not verified something is really broken by
|
the POSIX method and you have not verified something is really broken by
|
||||||
reading the POSIX standards.
|
reading the POSIX standards.
|
||||||
|
|
||||||
|
|
||||||
|
4.4. What other sources of documentation about glibc are available?
|
||||||
|
|
||||||
|
{AJ} The FSF has a page about the GNU C library at
|
||||||
|
<http://www.gnu.org/software/libc/>. The problem data base of open and
|
||||||
|
solved bugs in GNU libc is available at
|
||||||
|
<http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl>. Eric Green has written
|
||||||
|
a HowTo for converting from Linux libc5 to glibc2. The HowTo is accessable
|
||||||
|
via the FSF page and at <http://www.imaxx.net/~thrytis/glibc>. Frodo
|
||||||
|
Looijaard describes a different way installing glibc2 as secondary libc at
|
||||||
|
<http://huizen.dds.nl/~frodol/glibc>.
|
||||||
|
|
||||||
|
Please note that this is not a complete list.
|
||||||
|
|
||||||
|
|
||||||
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
||||||
|
|
||||||
|
50
FAQ.in
50
FAQ.in
@ -5,7 +5,7 @@ and using glibc. Please make sure you read this before sending questions or
|
|||||||
bug reports to the maintainers.
|
bug reports to the maintainers.
|
||||||
|
|
||||||
The GNU C library is very complex. The installation process has not been
|
The GNU C library is very complex. The installation process has not been
|
||||||
completely automated; there are too many variables. You can do substantial
|
completely automated; there are too many variables. You can do substantial
|
||||||
damage to your system by installing the library incorrectly. Make sure you
|
damage to your system by installing the library incorrectly. Make sure you
|
||||||
understand what you are undertaking before you begin.
|
understand what you are undertaking before you begin.
|
||||||
|
|
||||||
@ -251,10 +251,10 @@ any other link path.
|
|||||||
?? What's the problem with configure --enable-omitfp?
|
?? What's the problem with configure --enable-omitfp?
|
||||||
|
|
||||||
{AJ} When --enable-omitfp is set the libraries are built without frame
|
{AJ} When --enable-omitfp is set the libraries are built without frame
|
||||||
pointers. Some compilers produce buggy code for this model and therefore we
|
pointers. Some compilers produce buggy code for this model and therefore we
|
||||||
don't advise using it at the moment.
|
don't advise using it at the moment.
|
||||||
|
|
||||||
If you use --enable-omitfp, you're on your own. If you encounter problems
|
If you use --enable-omitfp, you're on your own. If you encounter problems
|
||||||
with a library that was build this way, we advise you to rebuild the library
|
with a library that was build this way, we advise you to rebuild the library
|
||||||
without --enable-omitfp. If the problem vanishes consider tracking the
|
without --enable-omitfp. If the problem vanishes consider tracking the
|
||||||
problem down and report it as compiler failure.
|
problem down and report it as compiler failure.
|
||||||
@ -859,11 +859,11 @@ siginterrupt().
|
|||||||
functions. Why?
|
functions. Why?
|
||||||
|
|
||||||
{AJ} glibc 2.1 has special string functions that are faster than the normal
|
{AJ} glibc 2.1 has special string functions that are faster than the normal
|
||||||
library functions. Some of the functions are additionally implemented as
|
library functions. Some of the functions are additionally implemented as
|
||||||
inline functions and others as macros.
|
inline functions and others as macros.
|
||||||
|
|
||||||
The optimized string functions are only used when compiling with
|
The optimized string functions are only used when compiling with
|
||||||
optimizations (-O1 or higher). The behavior can be changed with two feature
|
optimizations (-O1 or higher). The behavior can be changed with two feature
|
||||||
macros:
|
macros:
|
||||||
|
|
||||||
* __NO_STRING_INLINES: Don't do any string optimizations.
|
* __NO_STRING_INLINES: Don't do any string optimizations.
|
||||||
@ -872,7 +872,7 @@ macros:
|
|||||||
|
|
||||||
Since some of these string functions are now additionally defined as macros,
|
Since some of these string functions are now additionally defined as macros,
|
||||||
code like "char *strncpy();" doesn't work anymore (and is unnecessary, since
|
code like "char *strncpy();" doesn't work anymore (and is unnecessary, since
|
||||||
<string.h> has the necessary declarations). Either change your code or
|
<string.h> has the necessary declarations). Either change your code or
|
||||||
define __NO_STRING_INLINES.
|
define __NO_STRING_INLINES.
|
||||||
|
|
||||||
{UD} Another problem in this area is that gcc still has problems on machines
|
{UD} Another problem in this area is that gcc still has problems on machines
|
||||||
@ -896,22 +896,37 @@ This disables the optimization for that specific call.
|
|||||||
{RM,AJ} Constructs like:
|
{RM,AJ} Constructs like:
|
||||||
static FILE *InPtr = stdin;
|
static FILE *InPtr = stdin;
|
||||||
|
|
||||||
lead to this message. This is correct behaviour with glibc since stdin is
|
lead to this message. This is correct behaviour with glibc since stdin is
|
||||||
not a constant expression. Please note that a strict reading of ISO C does
|
not a constant expression. Please note that a strict reading of ISO C does
|
||||||
not allow above constructs.
|
not allow above constructs.
|
||||||
|
|
||||||
One of the advantages of this is that you can assign to stdin, stdout, and
|
One of the advantages of this is that you can assign to stdin, stdout, and
|
||||||
stderr just like any other global variable (e.g. `stdout = my_stream;'),
|
stderr just like any other global variable (e.g. `stdout = my_stream;'),
|
||||||
which can be very useful with custom streams that you can write with libio
|
which can be very useful with custom streams that you can write with libio
|
||||||
(but beware this is not necessarily portable). The reason to implement it
|
(but beware this is not necessarily portable). The reason to implement it
|
||||||
this way were versioning problems with the size of the FILE structure.
|
this way were versioning problems with the size of the FILE structure.
|
||||||
|
|
||||||
|
To fix those programs you've got to initialize the variable at run time.
|
||||||
|
This can be done, e.g. in main, like:
|
||||||
|
|
||||||
|
static FILE *InPtr;
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
InPtr = stdin;
|
||||||
|
}
|
||||||
|
|
||||||
|
or by constructors (beware this is gcc specific):
|
||||||
|
|
||||||
|
static FILE *InPtr;
|
||||||
|
static void inPtr_construct (void) __attribute__((constructor));
|
||||||
|
static void inPtr_construct (void) { InPtr = stdin; }
|
||||||
|
|
||||||
|
|
||||||
?? I can't compile with gcc -traditional (or
|
?? I can't compile with gcc -traditional (or
|
||||||
-traditional-cpp). Why?
|
-traditional-cpp). Why?
|
||||||
|
|
||||||
{AJ} glibc2 does break -traditional and -traditonal-cpp - and will continue
|
{AJ} glibc2 does break -traditional and -traditonal-cpp - and will continue
|
||||||
to do so. For example constructs of the form:
|
to do so. For example constructs of the form:
|
||||||
|
|
||||||
enum {foo
|
enum {foo
|
||||||
#define foo foo
|
#define foo foo
|
||||||
@ -925,7 +940,7 @@ check with #ifdef).
|
|||||||
|
|
||||||
{AJ} The GNU C library is compatible with the ANSI/ISO C standard. If
|
{AJ} The GNU C library is compatible with the ANSI/ISO C standard. If
|
||||||
you're using `gcc -ansi', the glibc includes which are specified in the
|
you're using `gcc -ansi', the glibc includes which are specified in the
|
||||||
standard follow the standard. The ANSI/ISO C standard defines what has to be
|
standard follow the standard. The ANSI/ISO C standard defines what has to be
|
||||||
in the include files - and also states that nothing else should be in the
|
in the include files - and also states that nothing else should be in the
|
||||||
include files (btw. you can still enable additional standards with feature
|
include files (btw. you can still enable additional standards with feature
|
||||||
flags).
|
flags).
|
||||||
@ -991,6 +1006,19 @@ So, please avoid sending bug reports about time related problems if you use
|
|||||||
the POSIX method and you have not verified something is really broken by
|
the POSIX method and you have not verified something is really broken by
|
||||||
reading the POSIX standards.
|
reading the POSIX standards.
|
||||||
|
|
||||||
|
?? What other sources of documentation about glibc are available?
|
||||||
|
|
||||||
|
{AJ} The FSF has a page about the GNU C library at
|
||||||
|
<http://www.gnu.org/software/libc/>. The problem data base of open and
|
||||||
|
solved bugs in GNU libc is available at
|
||||||
|
<http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl>. Eric Green has written
|
||||||
|
a HowTo for converting from Linux libc5 to glibc2. The HowTo is accessable
|
||||||
|
via the FSF page and at <http://www.imaxx.net/~thrytis/glibc>. Frodo
|
||||||
|
Looijaard describes a different way installing glibc2 as secondary libc at
|
||||||
|
<http://huizen.dds.nl/~frodol/glibc>.
|
||||||
|
|
||||||
|
Please note that this is not a complete list.
|
||||||
|
|
||||||
|
|
||||||
Answers were given by:
|
Answers were given by:
|
||||||
{UD} Ulrich Drepper, <drepper@cygnus.com>
|
{UD} Ulrich Drepper, <drepper@cygnus.com>
|
||||||
|
@ -566,8 +566,7 @@ libio-include = -I$(..)libio
|
|||||||
# These are the variables that the implicit compilation rules use.
|
# These are the variables that the implicit compilation rules use.
|
||||||
CPPFLAGS = $($(subdir)-CPPFLAGS) $(+includes) $(defines) \
|
CPPFLAGS = $($(subdir)-CPPFLAGS) $(+includes) $(defines) \
|
||||||
-include $(..)include/libc-symbols.h $(sysdep-CPPFLAGS) \
|
-include $(..)include/libc-symbols.h $(sysdep-CPPFLAGS) \
|
||||||
$($(subdir)-CPPFLAGS) $(CPPFLAGS-$(suffix $@)) $(CPPFLAGS-$(<F)) \
|
$(CPPFLAGS-$(suffix $@)) $(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F))
|
||||||
$(CPPFLAGS-$(@F))
|
|
||||||
override CFLAGS = $(filter-out %frame-pointer,$(+cflags)) $(sysdep-CFLAGS) \
|
override CFLAGS = $(filter-out %frame-pointer,$(+cflags)) $(sysdep-CFLAGS) \
|
||||||
$(CFLAGS-$(suffix $@)) $(CFLAGS-$(<F)) $(CFLAGS-$(@F))
|
$(CFLAGS-$(suffix $@)) $(CFLAGS-$(<F)) $(CFLAGS-$(@F))
|
||||||
|
|
||||||
|
18
argp/argp.h
18
argp/argp.h
@ -39,9 +39,15 @@ typedef int error_t;
|
|||||||
|
|
||||||
#ifndef __P
|
#ifndef __P
|
||||||
# if (defined __STDC__ && __STDC__) || defined __cplusplus
|
# if (defined __STDC__ && __STDC__) || defined __cplusplus
|
||||||
# define __P(args) args
|
# if defined __GNUC__ && defined __cplusplus && __GNUC_MINOR__ >= 8
|
||||||
|
# define __P(args) args throw ()
|
||||||
|
# else
|
||||||
|
# define __P(args) args
|
||||||
|
# endif
|
||||||
|
# define __PMT(args) args
|
||||||
# else
|
# else
|
||||||
# define __P(args) ()
|
# define __P(args) ()
|
||||||
|
# define __PMT(args) ()
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -124,7 +130,8 @@ struct argp_state; /* " */
|
|||||||
struct argp_child; /* " */
|
struct argp_child; /* " */
|
||||||
|
|
||||||
/* The type of a pointer to an argp parsing function. */
|
/* The type of a pointer to an argp parsing function. */
|
||||||
typedef error_t (*argp_parser_t)(int key, char *arg, struct argp_state *state);
|
typedef error_t (*argp_parser_t) __PMT ((int key, char *arg,
|
||||||
|
struct argp_state *state));
|
||||||
|
|
||||||
/* What to return for unrecognized keys. For special ARGP_KEY_ keys, such
|
/* What to return for unrecognized keys. For special ARGP_KEY_ keys, such
|
||||||
returns will simply be ignored. For user keys, this error will be turned
|
returns will simply be ignored. For user keys, this error will be turned
|
||||||
@ -237,7 +244,8 @@ struct argp
|
|||||||
has been done, so if any of the replacement text also needs translation,
|
has been done, so if any of the replacement text also needs translation,
|
||||||
that should be done by the filter function. INPUT is either the input
|
that should be done by the filter function. INPUT is either the input
|
||||||
supplied to argp_parse, or NULL, if argp_help was called directly. */
|
supplied to argp_parse, or NULL, if argp_help was called directly. */
|
||||||
char *(*help_filter)(int __key, __const char *__text, void *__input);
|
char *(*help_filter) __PMT ((int __key, __const char *__text,
|
||||||
|
void *__input));
|
||||||
|
|
||||||
/* If non-zero the strings used in the argp library are translated using
|
/* If non-zero the strings used in the argp library are translated using
|
||||||
the domain described by this string. Otherwise the currently installed
|
the domain described by this string. Otherwise the currently installed
|
||||||
@ -400,8 +408,8 @@ extern __const char *argp_program_version;
|
|||||||
calls this function with a stream to print the version to and a pointer to
|
calls this function with a stream to print the version to and a pointer to
|
||||||
the current parsing state, and then exits (unless the ARGP_NO_EXIT flag is
|
the current parsing state, and then exits (unless the ARGP_NO_EXIT flag is
|
||||||
used). This variable takes precedent over ARGP_PROGRAM_VERSION. */
|
used). This variable takes precedent over ARGP_PROGRAM_VERSION. */
|
||||||
extern void (*argp_program_version_hook) __P ((FILE *__stream,
|
extern void (*argp_program_version_hook) __PMT ((FILE *__stream,
|
||||||
struct argp_state *__state));
|
struct argp_state *__state));
|
||||||
|
|
||||||
/* If defined or set by the user program, it should point to string that is
|
/* If defined or set by the user program, it should point to string that is
|
||||||
the bug-reporting address for the program. It will be printed by
|
the bug-reporting address for the program. It will be printed by
|
||||||
|
@ -106,12 +106,9 @@ _dl_debug_message (int new_line, const char *msg, ...)
|
|||||||
{
|
{
|
||||||
/* We print the strings we get passed one after the other but start all
|
/* We print the strings we get passed one after the other but start all
|
||||||
lines using the current PID. */
|
lines using the current PID. */
|
||||||
static int pid;
|
int pid = 0;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
if (pid == 0)
|
|
||||||
pid = __getpid ();
|
|
||||||
|
|
||||||
va_start (ap, msg);
|
va_start (ap, msg);
|
||||||
do
|
do
|
||||||
if (msg[0] == '\0')
|
if (msg[0] == '\0')
|
||||||
@ -127,6 +124,8 @@ _dl_debug_message (int new_line, const char *msg, ...)
|
|||||||
{
|
{
|
||||||
char buf[7];
|
char buf[7];
|
||||||
char *p;
|
char *p;
|
||||||
|
if (pid == 0)
|
||||||
|
pid = __getpid ();
|
||||||
assert (pid >= 0 && pid < 100000);
|
assert (pid >= 0 && pid < 100000);
|
||||||
p = _itoa_word (pid, &buf[5], 10, 0);
|
p = _itoa_word (pid, &buf[5], 10, 0);
|
||||||
while (p > buf)
|
while (p > buf)
|
||||||
|
@ -64,7 +64,11 @@ _dl_object_relocation_scope (struct link_map *l)
|
|||||||
dependency tree that first caused this object to be loaded. */
|
dependency tree that first caused this object to be loaded. */
|
||||||
while (l->l_loader)
|
while (l->l_loader)
|
||||||
l = l->l_loader;
|
l = l->l_loader;
|
||||||
*_dl_global_scope_end = l;
|
/* There is no point in searching the same list twice. This isn't
|
||||||
|
guaranteed to always find all duplicates if new objects are added
|
||||||
|
to the global scope, but is good enough most of the time. */
|
||||||
|
if (_dl_global_scope[2] != l)
|
||||||
|
*_dl_global_scope_end = l;
|
||||||
return &_dl_global_scope[2];
|
return &_dl_global_scope[2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,13 +56,13 @@ struct gconv_loaded_object;
|
|||||||
|
|
||||||
|
|
||||||
/* Type of a conversion function. */
|
/* Type of a conversion function. */
|
||||||
typedef int (*gconv_fct) __P ((struct gconv_step *,
|
typedef int (*gconv_fct) __PMT ((struct gconv_step *,
|
||||||
struct gconv_step_data *, __const char **,
|
struct gconv_step_data *, __const char **,
|
||||||
__const char *, size_t *, int));
|
__const char *, size_t *, int));
|
||||||
|
|
||||||
/* Constructor and destructor for local data for conversion step. */
|
/* Constructor and destructor for local data for conversion step. */
|
||||||
typedef int (*gconv_init_fct) __P ((struct gconv_step *));
|
typedef int (*gconv_init_fct) __PMT ((struct gconv_step *));
|
||||||
typedef void (*gconv_end_fct) __P ((struct gconv_step *));
|
typedef void (*gconv_end_fct) __PMT ((struct gconv_step *));
|
||||||
|
|
||||||
|
|
||||||
/* Description of a conversion step. */
|
/* Description of a conversion step. */
|
||||||
|
2
io/fts.h
2
io/fts.h
@ -48,7 +48,7 @@ typedef struct {
|
|||||||
int fts_rfd; /* fd for root */
|
int fts_rfd; /* fd for root */
|
||||||
int fts_pathlen; /* sizeof(path) */
|
int fts_pathlen; /* sizeof(path) */
|
||||||
int fts_nitems; /* elements in the sort array */
|
int fts_nitems; /* elements in the sort array */
|
||||||
int (*fts_compar) __P((const void *, const void *)); /* compare fn */
|
int (*fts_compar) __PMT((const void *, const void *)); /* compare fn */
|
||||||
|
|
||||||
#define FTS_COMFOLLOW 0x0001 /* follow command line symlinks */
|
#define FTS_COMFOLLOW 0x0001 /* follow command line symlinks */
|
||||||
#define FTS_LOGICAL 0x0002 /* logical walk */
|
#define FTS_LOGICAL 0x0002 /* logical walk */
|
||||||
|
23
io/ftw.h
23
io/ftw.h
@ -86,21 +86,22 @@ struct FTW
|
|||||||
|
|
||||||
|
|
||||||
/* Convenient types for callback functions. */
|
/* Convenient types for callback functions. */
|
||||||
typedef int (*__ftw_func_t) __P ((__const char *__filename,
|
typedef int (*__ftw_func_t) __PMT ((__const char *__filename,
|
||||||
__const struct stat *__status, int __flag));
|
__const struct stat *__status,
|
||||||
#ifdef __USE_LARGEFILE64
|
|
||||||
typedef int (*__ftw64_func_t) __P ((__const char *__filename,
|
|
||||||
__const struct stat64 *__status,
|
|
||||||
int __flag));
|
int __flag));
|
||||||
|
#ifdef __USE_LARGEFILE64
|
||||||
|
typedef int (*__ftw64_func_t) __PMT ((__const char *__filename,
|
||||||
|
__const struct stat64 *__status,
|
||||||
|
int __flag));
|
||||||
#endif
|
#endif
|
||||||
#ifdef __USE_XOPEN_EXTENDED
|
#ifdef __USE_XOPEN_EXTENDED
|
||||||
typedef int (*__nftw_func_t) __P ((__const char *__filename,
|
typedef int (*__nftw_func_t) __PMT ((__const char *__filename,
|
||||||
__const struct stat *__status, int __flag,
|
__const struct stat *__status, int __flag,
|
||||||
struct FTW *__info));
|
struct FTW *__info));
|
||||||
# ifdef __USE_LARGEFILE64
|
# ifdef __USE_LARGEFILE64
|
||||||
typedef int (*__nftw64_func_t) __P ((__const char *__filename,
|
typedef int (*__nftw64_func_t) __PMT ((__const char *__filename,
|
||||||
__const struct stat64 *__status,
|
__const struct stat64 *__status,
|
||||||
int __flag, struct FTW *__info));
|
int __flag, struct FTW *__info));
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
6
libc.map
6
libc.map
@ -15,8 +15,6 @@ GLIBC_2.0 {
|
|||||||
|
|
||||||
_IO_list_all; _IO_stderr_; _IO_stdin_; _IO_stdout_;
|
_IO_list_all; _IO_stderr_; _IO_stdin_; _IO_stdout_;
|
||||||
|
|
||||||
__libc_pid;
|
|
||||||
|
|
||||||
# This is for sparc only.
|
# This is for sparc only.
|
||||||
.div; .mul; .rem; .udiv; .umul; .urem;
|
.div; .mul; .rem; .udiv; .umul; .urem;
|
||||||
|
|
||||||
@ -106,8 +104,8 @@ GLIBC_2.0 {
|
|||||||
_IO_file_write; _IO_file_xsputn; _IO_fileno; _IO_flockfile;
|
_IO_file_write; _IO_file_xsputn; _IO_fileno; _IO_flockfile;
|
||||||
_IO_flush_all; _IO_flush_all_linebuffered; _IO_fopen; _IO_fprintf;
|
_IO_flush_all; _IO_flush_all_linebuffered; _IO_fopen; _IO_fprintf;
|
||||||
_IO_fputs; _IO_fread; _IO_free_backup_area; _IO_freopen;
|
_IO_fputs; _IO_fread; _IO_free_backup_area; _IO_freopen;
|
||||||
_IO_fscanf; _IO_fseek; _IO_fsetpos; _IO_ftell; _IO_funlockfile;
|
_IO_fscanf; _IO_fseek; _IO_fsetpos; _IO_ftell; _IO_ftrylockfile;
|
||||||
_IO_fwrite; _IO_getc; _IO_getline; _IO_gets;
|
_IO_funlockfile; _IO_fwrite; _IO_getc; _IO_getline; _IO_gets;
|
||||||
_IO_init; _IO_init_marker; _IO_link_in; _IO_marker_delta;
|
_IO_init; _IO_init_marker; _IO_link_in; _IO_marker_delta;
|
||||||
_IO_marker_difference; _IO_padn; _IO_pclose; _IO_peekc_locked;
|
_IO_marker_difference; _IO_padn; _IO_pclose; _IO_peekc_locked;
|
||||||
_IO_perror; _IO_popen; _IO_printf; _IO_proc_close; _IO_proc_open;
|
_IO_perror; _IO_popen; _IO_printf; _IO_proc_close; _IO_proc_open;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1991, 92, 93, 94, 95, 97 Free Software Foundation, Inc.
|
/* Copyright (C) 1991, 92, 93, 94, 95, 97, 98 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU IO Library.
|
This file is part of the GNU IO Library.
|
||||||
Written by Per Bothner <bothner@cygnus.com>.
|
Written by Per Bothner <bothner@cygnus.com>.
|
||||||
|
|
||||||
@ -58,8 +58,10 @@
|
|||||||
# else
|
# else
|
||||||
# ifdef __STDC__
|
# ifdef __STDC__
|
||||||
# define __P(p) p
|
# define __P(p) p
|
||||||
|
# define __PMT(p) p
|
||||||
# else
|
# else
|
||||||
# define __P(p) ()
|
# define __P(p) ()
|
||||||
|
# define __PMT(p) ()
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
#endif /*!__P*/
|
#endif /*!__P*/
|
||||||
@ -253,10 +255,10 @@ extern _IO_FILE *_IO_stderr;
|
|||||||
/* Define the user-visible type, with user-friendly member names. */
|
/* Define the user-visible type, with user-friendly member names. */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
_IO_ssize_t (*read) __P ((struct _IO_FILE *, void *, _IO_ssize_t));
|
_IO_ssize_t (*read) __PMT ((struct _IO_FILE *, void *, _IO_ssize_t));
|
||||||
_IO_ssize_t (*write) __P ((struct _IO_FILE *, const void *, _IO_ssize_t));
|
_IO_ssize_t (*write) __PMT ((struct _IO_FILE *, const void *, _IO_ssize_t));
|
||||||
_IO_fpos_t (*seek) __P ((struct _IO_FILE *, _IO_off_t, int));
|
_IO_fpos_t (*seek) __PMT ((struct _IO_FILE *, _IO_off_t, int));
|
||||||
int (*close) __P ((struct _IO_FILE *));
|
int (*close) __PMT ((struct _IO_FILE *));
|
||||||
} _IO_cookie_io_functions_t;
|
} _IO_cookie_io_functions_t;
|
||||||
|
|
||||||
/* Special file type for fopencookie function. */
|
/* Special file type for fopencookie function. */
|
||||||
|
@ -1,3 +1,30 @@
|
|||||||
|
1998-06-29 12:34 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* sysdeps/pthread/pthread.h: Use __PMT not __P for function pointers.
|
||||||
|
|
||||||
|
* sysdeps/pthread/pthread.h: Define various PTHREAD_* symbols also
|
||||||
|
as macros as demanded in POSIX.1, Annex C.
|
||||||
|
|
||||||
|
1998-06-29 12:29 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* internals.h (struct pthread_request): For free use pthread_t
|
||||||
|
instead of pthread_descr.
|
||||||
|
* join.c (pthread_join): Pass thread_id, not th to manager.
|
||||||
|
(pthread_detach): Likewise.
|
||||||
|
* manager.c (__pthread_manager): Except thread ID in FREE_REQ case.
|
||||||
|
(pthread_exited): Remove detached queue code.
|
||||||
|
(pthread_handle_free): Expect thread ID parameter and use it to
|
||||||
|
validate the thread decsriptor. Don't use detached queue.
|
||||||
|
Patches by Xavier Leroy.
|
||||||
|
|
||||||
|
1998-06-27 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* libpthread.map: Export accept, longjmp, sigaction, siglongjmp,
|
||||||
|
_IO_flockfile, _IO_ftrylockfile, _IO_funlockfile,
|
||||||
|
__pthread_atfork, __pthread_key_create, __pthread_once.
|
||||||
|
* internals.h: Doc fix.
|
||||||
|
* pthread.c (__pthread_initialize): Define again.
|
||||||
|
|
||||||
1998-06-26 Ulrich Drepper <drepper@cygnus.com>
|
1998-06-26 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
* manager.c (pthread_exited): If thread is not detached put it on
|
* manager.c (pthread_exited): If thread is not detached put it on
|
||||||
|
@ -86,7 +86,7 @@ struct _pthread_descr_struct {
|
|||||||
struct pthread_start_args p_start_args; /* arguments for thread creation */
|
struct pthread_start_args p_start_args; /* arguments for thread creation */
|
||||||
void ** p_specific[PTHREAD_KEY_1STLEVEL_SIZE]; /* thread-specific data */
|
void ** p_specific[PTHREAD_KEY_1STLEVEL_SIZE]; /* thread-specific data */
|
||||||
void * p_libc_specific[_LIBC_TSD_KEY_N]; /* thread-specific data for libc */
|
void * p_libc_specific[_LIBC_TSD_KEY_N]; /* thread-specific data for libc */
|
||||||
int p_userstack; /* nonzero if the user provided the thread */
|
int p_userstack; /* nonzero if the user provided the stack */
|
||||||
void *p_guardaddr; /* address of guard area or NULL */
|
void *p_guardaddr; /* address of guard area or NULL */
|
||||||
size_t p_guardsize; /* size of guard area */
|
size_t p_guardsize; /* size of guard area */
|
||||||
};
|
};
|
||||||
@ -117,7 +117,7 @@ struct pthread_request {
|
|||||||
sigset_t mask; /* signal mask */
|
sigset_t mask; /* signal mask */
|
||||||
} create;
|
} create;
|
||||||
struct { /* For REQ_FREE: */
|
struct { /* For REQ_FREE: */
|
||||||
pthread_descr thread; /* descriptor of thread to free */
|
pthread_t thread_id; /* identifier of thread to free */
|
||||||
} free;
|
} free;
|
||||||
struct { /* For REQ_PROCESS_EXIT: */
|
struct { /* For REQ_PROCESS_EXIT: */
|
||||||
int code; /* exit status */
|
int code; /* exit status */
|
||||||
@ -171,7 +171,7 @@ extern char *__pthread_initial_thread_bos;
|
|||||||
extern int __pthread_nonstandard_stacks;
|
extern int __pthread_nonstandard_stacks;
|
||||||
|
|
||||||
/* File descriptor for sending requests to the thread manager.
|
/* File descriptor for sending requests to the thread manager.
|
||||||
Initially -1, meaning that pthread_initialize must be called. */
|
Initially -1, meaning that __pthread_initialize_manager must be called. */
|
||||||
|
|
||||||
extern int __pthread_manager_request;
|
extern int __pthread_manager_request;
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ int pthread_join(pthread_t thread_id, void ** thread_return)
|
|||||||
if (__pthread_manager_request >= 0) {
|
if (__pthread_manager_request >= 0) {
|
||||||
request.req_thread = self;
|
request.req_thread = self;
|
||||||
request.req_kind = REQ_FREE;
|
request.req_kind = REQ_FREE;
|
||||||
request.req_args.free.thread = th;
|
request.req_args.free.thread_id = thread_id;
|
||||||
__libc_write(__pthread_manager_request,
|
__libc_write(__pthread_manager_request,
|
||||||
(char *) &request, sizeof(request));
|
(char *) &request, sizeof(request));
|
||||||
}
|
}
|
||||||
@ -137,7 +137,7 @@ int pthread_detach(pthread_t thread_id)
|
|||||||
if (terminated && __pthread_manager_request >= 0) {
|
if (terminated && __pthread_manager_request >= 0) {
|
||||||
request.req_thread = thread_self();
|
request.req_thread = thread_self();
|
||||||
request.req_kind = REQ_FREE;
|
request.req_kind = REQ_FREE;
|
||||||
request.req_args.free.thread = th;
|
request.req_args.free.thread_id = thread_id;
|
||||||
__libc_write(__pthread_manager_request,
|
__libc_write(__pthread_manager_request,
|
||||||
(char *) &request, sizeof(request));
|
(char *) &request, sizeof(request));
|
||||||
}
|
}
|
||||||
|
@ -8,11 +8,13 @@ GLIBC_2.0 {
|
|||||||
__libc_internal_tsd_get; __libc_internal_tsd_set;
|
__libc_internal_tsd_get; __libc_internal_tsd_set;
|
||||||
|
|
||||||
# Overwritten libc functions.
|
# Overwritten libc functions.
|
||||||
close; connect; fcntl; fork; fsync; lseek; msync; nanosleep; open;
|
accept; close; connect; fcntl; fork; fsync; longjmp; lseek; msync;
|
||||||
pause; raise; read; recv; recvfrom; recvmsg; send; sendmsg; sendto;
|
nanosleep; open; pause; raise; read; recv; recvfrom; recvmsg; send;
|
||||||
system; tcdrain; wait; waitpid; write;
|
sendmsg; sendto; sigaction; siglongjmp; system; tcdrain; wait;
|
||||||
|
waitpid; write;
|
||||||
__close; __connect; __fcntl; __lseek; __open; __read; __send; __wait;
|
__close; __connect; __fcntl; __lseek; __open; __read; __send; __wait;
|
||||||
__write;
|
__write;
|
||||||
|
_IO_flockfile; _IO_ftrylockfile; _IO_funlockfile;
|
||||||
|
|
||||||
# POSIX.1c extensions to libc.
|
# POSIX.1c extensions to libc.
|
||||||
flockfile; funlockfile; ftrylockfile;
|
flockfile; funlockfile; ftrylockfile;
|
||||||
@ -43,11 +45,11 @@ GLIBC_2.0 {
|
|||||||
sigwait;
|
sigwait;
|
||||||
|
|
||||||
# Protected names for functions used in other shared objects.
|
# Protected names for functions used in other shared objects.
|
||||||
__pthread_getspecific; __pthread_initialize; __pthread_mutex_destroy;
|
__pthread_atfork; __pthread_initialize; __pthread_getspecific;
|
||||||
__pthread_mutex_init; __pthread_mutex_lock; __pthread_mutex_trylock;
|
__pthread_key_create; __pthread_mutex_destroy; __pthread_mutex_init;
|
||||||
__pthread_mutex_unlock; __pthread_mutexattr_destroy;
|
__pthread_mutex_lock; __pthread_mutex_trylock; __pthread_mutex_unlock;
|
||||||
__pthread_mutexattr_init; __pthread_mutexattr_setkind_np;
|
__pthread_mutexattr_destroy; __pthread_mutexattr_init;
|
||||||
__pthread_setspecific;
|
__pthread_mutexattr_setkind_np; __pthread_once; __pthread_setspecific;
|
||||||
|
|
||||||
# The error functions.
|
# The error functions.
|
||||||
__errno_location; __h_errno_location;
|
__errno_location; __h_errno_location;
|
||||||
|
@ -37,12 +37,6 @@
|
|||||||
struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX] =
|
struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX] =
|
||||||
{ { LOCK_INITIALIZER, &__pthread_initial_thread, 0}, /* All NULLs */ };
|
{ { LOCK_INITIALIZER, &__pthread_initial_thread, 0}, /* All NULLs */ };
|
||||||
|
|
||||||
/* This is a list of terminated, but not detached threads. This can happen
|
|
||||||
when pthread_join() is called and the pthread_reap_children() function
|
|
||||||
removes the thread from the live list before processing the FREE_REQ
|
|
||||||
request. */
|
|
||||||
static pthread_descr non_detached;
|
|
||||||
|
|
||||||
/* Indicate whether at least one thread has a user-defined stack (if 1),
|
/* Indicate whether at least one thread has a user-defined stack (if 1),
|
||||||
or if all threads have stacks supplied by LinuxThreads (if 0). */
|
or if all threads have stacks supplied by LinuxThreads (if 0). */
|
||||||
int __pthread_nonstandard_stacks = 0;
|
int __pthread_nonstandard_stacks = 0;
|
||||||
@ -83,7 +77,7 @@ static pthread_t pthread_threads_counter = 0;
|
|||||||
static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
|
static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
|
||||||
void * (*start_routine)(void *), void *arg,
|
void * (*start_routine)(void *), void *arg,
|
||||||
sigset_t *mask, int father_pid);
|
sigset_t *mask, int father_pid);
|
||||||
static void pthread_handle_free(pthread_descr th);
|
static void pthread_handle_free(pthread_t th_id);
|
||||||
static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode);
|
static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode);
|
||||||
static void pthread_reap_children(void);
|
static void pthread_reap_children(void);
|
||||||
static void pthread_kill_all_threads(int sig, int main_thread_also);
|
static void pthread_kill_all_threads(int sig, int main_thread_also);
|
||||||
@ -149,7 +143,7 @@ int __pthread_manager(void *arg)
|
|||||||
restart(request.req_thread);
|
restart(request.req_thread);
|
||||||
break;
|
break;
|
||||||
case REQ_FREE:
|
case REQ_FREE:
|
||||||
pthread_handle_free(request.req_args.free.thread);
|
pthread_handle_free(request.req_args.free.thread_id);
|
||||||
break;
|
break;
|
||||||
case REQ_PROCESS_EXIT:
|
case REQ_PROCESS_EXIT:
|
||||||
pthread_handle_exit(request.req_thread,
|
pthread_handle_exit(request.req_thread,
|
||||||
@ -406,14 +400,6 @@ static void pthread_exited(pid_t pid)
|
|||||||
__pthread_unlock(th->p_lock);
|
__pthread_unlock(th->p_lock);
|
||||||
if (detached)
|
if (detached)
|
||||||
pthread_free(th);
|
pthread_free(th);
|
||||||
else {
|
|
||||||
/* Enqueue in the detached list. */
|
|
||||||
th->p_nextlive = non_detached;
|
|
||||||
if (non_detached != NULL)
|
|
||||||
non_detached->p_prevlive = th;
|
|
||||||
th->p_prevlive = NULL;
|
|
||||||
non_detached = th;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -445,49 +431,28 @@ static void pthread_reap_children(void)
|
|||||||
/* Try to free the resources of a thread when requested by pthread_join
|
/* Try to free the resources of a thread when requested by pthread_join
|
||||||
or pthread_detach on a terminated thread. */
|
or pthread_detach on a terminated thread. */
|
||||||
|
|
||||||
static void pthread_handle_free(pthread_descr th)
|
static void pthread_handle_free(pthread_t th_id)
|
||||||
{
|
{
|
||||||
pthread_descr t;
|
pthread_handle handle = thread_handle(th_id);
|
||||||
/* Check that the thread th is still there -- pthread_reap_children
|
pthread_descr th;
|
||||||
might have deallocated it already */
|
|
||||||
t = __pthread_main_thread;
|
|
||||||
do {
|
|
||||||
if (t == th) break;
|
|
||||||
t = t->p_nextlive;
|
|
||||||
} while (t != __pthread_main_thread);
|
|
||||||
if (t != th) {
|
|
||||||
/* Hum, it might be that the thread already was dequeued but
|
|
||||||
wasn't detached. In the case the thread is already detached
|
|
||||||
and we cannot find it this is a user bug but we must be
|
|
||||||
gracious. */
|
|
||||||
t = non_detached;
|
|
||||||
while (t != NULL) {
|
|
||||||
if (t == th) break;
|
|
||||||
t = t->p_nextlive;
|
|
||||||
}
|
|
||||||
if (t == th) {
|
|
||||||
if (th->p_prevlive == NULL)
|
|
||||||
non_detached = th->p_nextlive;
|
|
||||||
else
|
|
||||||
th->p_prevlive->p_nextlive = th->p_nextlive;
|
|
||||||
if (th->p_nextlive != NULL)
|
|
||||||
th->p_nextlive->p_prevlive = th->p_prevlive;
|
|
||||||
|
|
||||||
/* Finally free it. */
|
__pthread_lock(&handle->h_lock);
|
||||||
pthread_free (th);
|
if (invalid_handle(handle, th_id)) {
|
||||||
}
|
/* pthread_reap_children has deallocated the thread already,
|
||||||
|
nothing needs to be done */
|
||||||
|
__pthread_unlock(&handle->h_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
__pthread_lock(th->p_lock);
|
th = handle->h_descr;
|
||||||
if (th->p_exited) {
|
if (th->p_exited) {
|
||||||
__pthread_unlock(th->p_lock);
|
__pthread_unlock(&handle->h_lock);
|
||||||
pthread_free(th);
|
pthread_free(th);
|
||||||
} else {
|
} else {
|
||||||
/* The Unix process of the thread is still running.
|
/* The Unix process of the thread is still running.
|
||||||
Mark the thread as detached so that the thread manager will
|
Mark the thread as detached so that the thread manager will
|
||||||
deallocate its resources when the Unix process exits. */
|
deallocate its resources when the Unix process exits. */
|
||||||
th->p_detached = 1;
|
th->p_detached = 1;
|
||||||
__pthread_unlock(th->p_lock);
|
__pthread_unlock(&handle->h_lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,6 +215,11 @@ static void pthread_initialize(void)
|
|||||||
__on_exit(pthread_exit_process, NULL);
|
__on_exit(pthread_exit_process, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __pthread_initialize(void)
|
||||||
|
{
|
||||||
|
pthread_initialize();
|
||||||
|
}
|
||||||
|
|
||||||
int __pthread_initialize_manager(void)
|
int __pthread_initialize_manager(void)
|
||||||
{
|
{
|
||||||
int manager_pipe[2];
|
int manager_pipe[2];
|
||||||
|
@ -100,19 +100,25 @@ typedef struct
|
|||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PTHREAD_CREATE_JOINABLE,
|
PTHREAD_CREATE_JOINABLE,
|
||||||
|
#define PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_JOINABLE
|
||||||
PTHREAD_CREATE_DETACHED
|
PTHREAD_CREATE_DETACHED
|
||||||
|
#define PTHREAD_CREATE_DETACHED PTHREAD_CREATE_DETACHED
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PTHREAD_INHERIT_SCHED,
|
PTHREAD_INHERIT_SCHED,
|
||||||
|
#define PTHREAD_INHERIT_SCHED PTHREAD_INHERIT_SCHED
|
||||||
PTHREAD_EXPLICIT_SCHED
|
PTHREAD_EXPLICIT_SCHED
|
||||||
|
#define PTHREAD_EXPLICIT_SCHED PTHREAD_EXPLICIT_SCHED
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PTHREAD_SCOPE_SYSTEM,
|
PTHREAD_SCOPE_SYSTEM,
|
||||||
|
#define PTHREAD_SCOPE_SYSTEM PTHREAD_SCOPE_SYSTEM
|
||||||
PTHREAD_SCOPE_PROCESS
|
PTHREAD_SCOPE_PROCESS
|
||||||
|
#define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_PROCESS
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -156,7 +162,9 @@ typedef struct
|
|||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PTHREAD_PROCESS_PRIVATE,
|
PTHREAD_PROCESS_PRIVATE,
|
||||||
|
# define PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE
|
||||||
PTHREAD_PROCESS_SHARED
|
PTHREAD_PROCESS_SHARED
|
||||||
|
# define PTHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@ -187,7 +195,7 @@ typedef int pthread_once_t;
|
|||||||
|
|
||||||
struct _pthread_cleanup_buffer
|
struct _pthread_cleanup_buffer
|
||||||
{
|
{
|
||||||
void (*routine) __P ((void *)); /* Function to call. */
|
void (*routine) __PMT ((void *)); /* Function to call. */
|
||||||
void *arg; /* Its argument. */
|
void *arg; /* Its argument. */
|
||||||
int canceltype; /* Saved cancellation type. */
|
int canceltype; /* Saved cancellation type. */
|
||||||
struct _pthread_cleanup_buffer *prev; /* Chaining of cleanup functions. */
|
struct _pthread_cleanup_buffer *prev; /* Chaining of cleanup functions. */
|
||||||
@ -195,8 +203,20 @@ struct _pthread_cleanup_buffer
|
|||||||
|
|
||||||
/* Cancellation */
|
/* Cancellation */
|
||||||
|
|
||||||
enum { PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DISABLE };
|
enum
|
||||||
enum { PTHREAD_CANCEL_DEFERRED, PTHREAD_CANCEL_ASYNCHRONOUS };
|
{
|
||||||
|
PTHREAD_CANCEL_ENABLE,
|
||||||
|
#define PTHREAD_CANCEL_ENABLE PTHREAD_CANCEL_ENABLE
|
||||||
|
PTHREAD_CANCEL_DISABLE
|
||||||
|
#define PTHREAD_CANCEL_DISABLE PTHREAD_CANCEL_DISABLE
|
||||||
|
};
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
PTHREAD_CANCEL_DEFERRED,
|
||||||
|
#define PTHREAD_CANCEL_DEFERRED PTHREAD_CANCEL_DEFERRED
|
||||||
|
PTHREAD_CANCEL_ASYNCHRONOUS
|
||||||
|
#define PTHREAD_CANCEL_ASYNCHRONOUS PTHREAD_CANCEL_ASYNCHRONOUS
|
||||||
|
};
|
||||||
#define PTHREAD_CANCELED ((void *) -1)
|
#define PTHREAD_CANCELED ((void *) -1)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997.
|
Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997.
|
||||||
|
|
||||||
@ -28,6 +28,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/param.h>
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
@ -270,6 +271,7 @@ void handle_requests (void)
|
|||||||
fd_set read_fd_set;
|
fd_set read_fd_set;
|
||||||
fd_set write_fd_set;
|
fd_set write_fd_set;
|
||||||
int fd;
|
int fd;
|
||||||
|
int maxfd; /* Highest used fd to optimize select/loop. */
|
||||||
|
|
||||||
/* Initialize the set of active sockets. */
|
/* Initialize the set of active sockets. */
|
||||||
FD_ZERO (&active_read_fd_set);
|
FD_ZERO (&active_read_fd_set);
|
||||||
@ -277,16 +279,18 @@ void handle_requests (void)
|
|||||||
FD_SET (rw_sock, &active_read_fd_set);
|
FD_SET (rw_sock, &active_read_fd_set);
|
||||||
FD_SET (ro_sock, &active_read_fd_set);
|
FD_SET (ro_sock, &active_read_fd_set);
|
||||||
|
|
||||||
|
maxfd = MAX (rw_sock, ro_sock);
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
/* Block until input arrives on one or more active sockets. */
|
/* Block until input arrives on one or more active sockets. */
|
||||||
read_fd_set = active_read_fd_set;
|
read_fd_set = active_read_fd_set;
|
||||||
write_fd_set = active_write_fd_set;
|
write_fd_set = active_write_fd_set;
|
||||||
if (select (FD_SETSIZE, &read_fd_set, &write_fd_set, NULL, NULL) < 0)
|
if (select (maxfd + 1, &read_fd_set, &write_fd_set, NULL, NULL) < 0)
|
||||||
error (EXIT_FAILURE, errno, _("cannot get input on sockets"));
|
error (EXIT_FAILURE, errno, _("cannot get input on sockets"));
|
||||||
|
|
||||||
/* Service all the sockets with input pending. */
|
/* Service all the sockets with input pending. */
|
||||||
for (fd = 0; fd < FD_SETSIZE; fd++)
|
for (fd = 0; fd <= maxfd; ++fd)
|
||||||
{
|
{
|
||||||
if (FD_ISSET (fd, &read_fd_set))
|
if (FD_ISSET (fd, &read_fd_set))
|
||||||
{
|
{
|
||||||
@ -299,6 +303,7 @@ void handle_requests (void)
|
|||||||
error (0, errno, _("cannot accept connection"));
|
error (0, errno, _("cannot accept connection"));
|
||||||
|
|
||||||
FD_SET (connection->sock, &active_read_fd_set);
|
FD_SET (connection->sock, &active_read_fd_set);
|
||||||
|
maxfd = MAX (maxfd, connection->sock);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -335,6 +340,14 @@ void handle_requests (void)
|
|||||||
FD_CLR (fd, &active_write_fd_set);
|
FD_CLR (fd, &active_write_fd_set);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if maxfd can be lowered. */
|
||||||
|
for (; maxfd >= 0; --maxfd)
|
||||||
|
{
|
||||||
|
if (FD_ISSET (maxfd, &active_read_fd_set)
|
||||||
|
|| FD_ISSET (maxfd, &active_write_fd_set))
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -39,7 +39,7 @@ enum mcheck_status
|
|||||||
before `malloc' is ever called. ABORTFUNC is called with an error code
|
before `malloc' is ever called. ABORTFUNC is called with an error code
|
||||||
(see enum above) when an inconsistency is detected. If ABORTFUNC is
|
(see enum above) when an inconsistency is detected. If ABORTFUNC is
|
||||||
null, the standard function prints on stderr and then calls `abort'. */
|
null, the standard function prints on stderr and then calls `abort'. */
|
||||||
extern int mcheck __P ((void (*__abortfunc) __P ((enum mcheck_status))));
|
extern int mcheck __P ((void (*__abortfunc) (enum mcheck_status)));
|
||||||
|
|
||||||
/* Check for aberrations in a particular malloc'd block. You must have
|
/* Check for aberrations in a particular malloc'd block. You must have
|
||||||
called `mcheck' already. These are the same checks that `mcheck' does
|
called `mcheck' already. These are the same checks that `mcheck' does
|
||||||
|
@ -51,7 +51,7 @@ extern void remque __P ((void *__elem));
|
|||||||
/* For use with hsearch(3). */
|
/* For use with hsearch(3). */
|
||||||
#ifndef __COMPAR_FN_T
|
#ifndef __COMPAR_FN_T
|
||||||
# define __COMPAR_FN_T
|
# define __COMPAR_FN_T
|
||||||
typedef int (*__compar_fn_t) __P ((__const __ptr_t, __const __ptr_t));
|
typedef int (*__compar_fn_t) __PMT ((__const __ptr_t, __const __ptr_t));
|
||||||
|
|
||||||
# ifdef __USE_GNU
|
# ifdef __USE_GNU
|
||||||
typedef __compar_fn_t comparison_fn_t;
|
typedef __compar_fn_t comparison_fn_t;
|
||||||
@ -147,9 +147,9 @@ extern void *tdelete __PMT ((__const void *__key, void **__rootp,
|
|||||||
|
|
||||||
#ifndef __ACTION_FN_T
|
#ifndef __ACTION_FN_T
|
||||||
# define __ACTION_FN_T
|
# define __ACTION_FN_T
|
||||||
typedef void (*__action_fn_t) __P ((__const void *__nodep,
|
typedef void (*__action_fn_t) __PMT ((__const void *__nodep,
|
||||||
VISIT __value,
|
VISIT __value,
|
||||||
int __level));
|
int __level));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Walk through the whole tree and call the ACTION callback for every node
|
/* Walk through the whole tree and call the ACTION callback for every node
|
||||||
|
@ -32,8 +32,6 @@
|
|||||||
/* Variable to synchronize work. */
|
/* Variable to synchronize work. */
|
||||||
char *__getopt_nonoption_flags;
|
char *__getopt_nonoption_flags;
|
||||||
|
|
||||||
extern pid_t __libc_pid;
|
|
||||||
|
|
||||||
|
|
||||||
/* Remove the environment variable "_<PID>_GNU_nonoption_argv_flags_" if
|
/* Remove the environment variable "_<PID>_GNU_nonoption_argv_flags_" if
|
||||||
it is still available. If the getopt functions are also used in the
|
it is still available. If the getopt functions are also used in the
|
||||||
@ -51,15 +49,11 @@ __getopt_clean_environment (char **env)
|
|||||||
char *cp, **ep;
|
char *cp, **ep;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
/* Generate name of the environment variable. We must know the PID
|
/* Construct the "_<PID>_GNU_nonoption_argv_flags_=" string. We must
|
||||||
and we must not use `sprintf'. */
|
not use `sprintf'. */
|
||||||
if (__libc_pid == 0xf00baa)
|
|
||||||
__libc_pid = __getpid ();
|
|
||||||
|
|
||||||
/* Construct "_<PID>_GNU_nonoption_argv_flags_=" string. */
|
|
||||||
cp = memcpy (&var[sizeof (var) - sizeof (envvar_tail)], envvar_tail,
|
cp = memcpy (&var[sizeof (var) - sizeof (envvar_tail)], envvar_tail,
|
||||||
sizeof (envvar_tail));
|
sizeof (envvar_tail));
|
||||||
cp = _itoa_word (__libc_pid, cp, 10, 0);
|
cp = _itoa_word (__getpid (), cp, 10, 0);
|
||||||
*--cp = '_';
|
*--cp = '_';
|
||||||
len = (var + sizeof (var) - 1) - cp;
|
len = (var + sizeof (var) - 1) - cp;
|
||||||
|
|
||||||
|
12
posix/glob.h
12
posix/glob.h
@ -26,6 +26,7 @@ extern "C" {
|
|||||||
#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
|
#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
|
||||||
# undef __P
|
# undef __P
|
||||||
# define __P(protos) protos
|
# define __P(protos) protos
|
||||||
|
# define __PMT(protos) protos
|
||||||
# define __ptr_t void *
|
# define __ptr_t void *
|
||||||
# if !defined __GNUC__ || __GNUC__ < 2
|
# if !defined __GNUC__ || __GNUC__ < 2
|
||||||
# undef __const
|
# undef __const
|
||||||
@ -34,6 +35,7 @@ extern "C" {
|
|||||||
#else /* Not C++ or ANSI C. */
|
#else /* Not C++ or ANSI C. */
|
||||||
# undef __P
|
# undef __P
|
||||||
# define __P(protos) ()
|
# define __P(protos) ()
|
||||||
|
# define __PMT(protos) ()
|
||||||
# undef __const
|
# undef __const
|
||||||
# define __const
|
# define __const
|
||||||
# define __ptr_t char *
|
# define __ptr_t char *
|
||||||
@ -99,11 +101,11 @@ typedef struct
|
|||||||
|
|
||||||
/* If the GLOB_ALTDIRFUNC flag is set, the following functions
|
/* If the GLOB_ALTDIRFUNC flag is set, the following functions
|
||||||
are used instead of the normal file access functions. */
|
are used instead of the normal file access functions. */
|
||||||
void (*gl_closedir) __P ((void *));
|
void (*gl_closedir) __PMT ((void *));
|
||||||
struct dirent *(*gl_readdir) __P ((void *));
|
struct dirent *(*gl_readdir) __PMT ((void *));
|
||||||
__ptr_t (*gl_opendir) __P ((__const char *));
|
__ptr_t (*gl_opendir) __PMT ((__const char *));
|
||||||
int (*gl_lstat) __P ((__const char *, struct stat *));
|
int (*gl_lstat) __PMT ((__const char *, struct stat *));
|
||||||
int (*gl_stat) __P ((__const char *, struct stat *));
|
int (*gl_stat) __PMT ((__const char *, struct stat *));
|
||||||
} glob_t;
|
} glob_t;
|
||||||
|
|
||||||
/* Do glob searching for PATTERN, placing results in PGLOB.
|
/* Do glob searching for PATTERN, placing results in PGLOB.
|
||||||
|
@ -1343,7 +1343,7 @@ envsubst:
|
|||||||
|
|
||||||
/* Start a new word with the last parameter. */
|
/* Start a new word with the last parameter. */
|
||||||
*word = w_newword (word_length, max_length);
|
*word = w_newword (word_length, max_length);
|
||||||
value = __strdup (__libc_argv[p]);
|
value = __libc_argv[p];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -170,19 +170,19 @@ struct __res_state {
|
|||||||
typedef enum { res_goahead, res_nextns, res_modified, res_done, res_error }
|
typedef enum { res_goahead, res_nextns, res_modified, res_done, res_error }
|
||||||
res_sendhookact;
|
res_sendhookact;
|
||||||
|
|
||||||
typedef res_sendhookact (*res_send_qhook)__P((struct sockaddr_in * const *ns,
|
typedef res_sendhookact (*res_send_qhook)__PMT((struct sockaddr_in * const *ns,
|
||||||
const u_char **query,
|
const u_char **query,
|
||||||
int *querylen,
|
int *querylen,
|
||||||
u_char *ans,
|
u_char *ans,
|
||||||
int anssiz,
|
int anssiz,
|
||||||
int *resplen));
|
int *resplen));
|
||||||
|
|
||||||
typedef res_sendhookact (*res_send_rhook)__P((const struct sockaddr_in *ns,
|
typedef res_sendhookact (*res_send_rhook)__PMT((const struct sockaddr_in *ns,
|
||||||
const u_char *query,
|
const u_char *query,
|
||||||
int querylen,
|
int querylen,
|
||||||
u_char *ans,
|
u_char *ans,
|
||||||
int anssiz,
|
int anssiz,
|
||||||
int *resplen));
|
int *resplen));
|
||||||
|
|
||||||
struct res_sym {
|
struct res_sym {
|
||||||
int number; /* Identifying number, like T_MX */
|
int number; /* Identifying number, like T_MX */
|
||||||
|
@ -51,7 +51,7 @@ typedef __sig_atomic_t sig_atomic_t;
|
|||||||
#include <bits/signum.h>
|
#include <bits/signum.h>
|
||||||
|
|
||||||
/* Type of a signal handler. */
|
/* Type of a signal handler. */
|
||||||
typedef void (*__sighandler_t) __P ((int));
|
typedef void (*__sighandler_t) __PMT ((int));
|
||||||
|
|
||||||
/* The X/Open definition of `signal' specifies the SVID semantic. Use
|
/* The X/Open definition of `signal' specifies the SVID semantic. Use
|
||||||
the additional function `sysv_signal' when X/Open compatibility is
|
the additional function `sysv_signal' when X/Open compatibility is
|
||||||
|
@ -595,7 +595,7 @@ extern char *realpath __P ((__const char *__name, char *__resolved));
|
|||||||
/* Shorthand for type of comparison functions. */
|
/* Shorthand for type of comparison functions. */
|
||||||
#ifndef __COMPAR_FN_T
|
#ifndef __COMPAR_FN_T
|
||||||
# define __COMPAR_FN_T
|
# define __COMPAR_FN_T
|
||||||
typedef int (*__compar_fn_t) __P ((__const __ptr_t, __const __ptr_t));
|
typedef int (*__compar_fn_t) __PMT ((__const __ptr_t, __const __ptr_t));
|
||||||
|
|
||||||
# ifdef __USE_GNU
|
# ifdef __USE_GNU
|
||||||
typedef __compar_fn_t comparison_fn_t;
|
typedef __compar_fn_t comparison_fn_t;
|
||||||
|
@ -25,8 +25,6 @@ extern void __libc_global_ctors (void);
|
|||||||
|
|
||||||
int __libc_multiple_libcs = 1;
|
int __libc_multiple_libcs = 1;
|
||||||
|
|
||||||
pid_t __libc_pid;
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init (int *data)
|
init (int *data)
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Initialization code run first thing by the ELF startup code. Stub version.
|
/* Initialization code run first thing by the ELF startup code. Stub version.
|
||||||
Copyright (C) 1995, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -25,8 +25,6 @@ int __libc_multiple_libcs = 1;
|
|||||||
extern void __libc_init (int, char **, char **);
|
extern void __libc_init (int, char **, char **);
|
||||||
extern void __getopt_clean_environment (char **);
|
extern void __getopt_clean_environment (char **);
|
||||||
|
|
||||||
pid_t __libc_pid;
|
|
||||||
|
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
void
|
void
|
||||||
__libc_init_first (void)
|
__libc_init_first (void)
|
||||||
|
@ -41,9 +41,6 @@ int __libc_multiple_libcs = 1;
|
|||||||
extern int __libc_argc;
|
extern int __libc_argc;
|
||||||
extern char **__libc_argv;
|
extern char **__libc_argv;
|
||||||
|
|
||||||
/* We often need the PID. Cache this value. */
|
|
||||||
pid_t __libc_pid = 0xf00baa;
|
|
||||||
|
|
||||||
void *(*_cthread_init_routine) (void); /* Returns new SP to use. */
|
void *(*_cthread_init_routine) (void); /* Returns new SP to use. */
|
||||||
void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__));
|
void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__));
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Initialization code run first thing by the ELF startup code. For Mips/Hurd.
|
/* Initialization code run first thing by the ELF startup code. For Mips/Hurd.
|
||||||
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -39,9 +39,6 @@ int __libc_multiple_libcs = 1;
|
|||||||
int __libc_argc;
|
int __libc_argc;
|
||||||
char **__libc_argv;
|
char **__libc_argv;
|
||||||
|
|
||||||
/* We often need the PID. Cache this value. */
|
|
||||||
pid_t __libc_pid;
|
|
||||||
|
|
||||||
void *(*_cthread_init_routine) (void); /* Returns new SP to use. */
|
void *(*_cthread_init_routine) (void); /* Returns new SP to use. */
|
||||||
void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__));
|
void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__));
|
||||||
|
|
||||||
|
@ -41,13 +41,10 @@ __aio_sigqueue (sig, val)
|
|||||||
info.si_errno = 0;
|
info.si_errno = 0;
|
||||||
info.si_code = SI_ASYNCIO;
|
info.si_code = SI_ASYNCIO;
|
||||||
|
|
||||||
if (__libc_pid ==0xf00baa)
|
info.si_pid = getpid ();
|
||||||
__libc_pid = __getpid ();
|
|
||||||
info.si_pid = __libc_pid;
|
|
||||||
|
|
||||||
info.si_uid = getuid ();
|
info.si_uid = getuid ();
|
||||||
|
|
||||||
info.si_value = val;
|
info.si_value = val;
|
||||||
|
|
||||||
return __syscall_rt_sigqueueinfo (__libc_pid, sig, &info);
|
return __syscall_rt_sigqueueinfo (info.si_pid, sig, &info);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* The proper definitions for Linux's sigaction.
|
/* The proper definitions for Linux's sigaction.
|
||||||
Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -30,7 +30,7 @@ struct sigaction
|
|||||||
/* Used if SA_SIGINFO is not set. */
|
/* Used if SA_SIGINFO is not set. */
|
||||||
__sighandler_t sa_handler;
|
__sighandler_t sa_handler;
|
||||||
/* Used if SA_SIGINFO is set. */
|
/* Used if SA_SIGINFO is set. */
|
||||||
void (*sa_sigaction) __P ((int, siginfo_t *, void *));
|
void (*sa_sigaction) __PMT ((int, siginfo_t *, void *));
|
||||||
}
|
}
|
||||||
__sigaction_handler;
|
__sigaction_handler;
|
||||||
#define sa_handler __sigaction_handler.sa_handler
|
#define sa_handler __sigaction_handler.sa_handler
|
||||||
@ -43,7 +43,7 @@ struct sigaction
|
|||||||
int sa_flags;
|
int sa_flags;
|
||||||
|
|
||||||
/* Restore handler. */
|
/* Restore handler. */
|
||||||
void (*sa_restorer) __P ((void));
|
void (*sa_restorer) __PMT ((void));
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Bits in `sa_flags'. */
|
/* Bits in `sa_flags'. */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* siginfo_t, sigevent and constants. Linux version.
|
/* siginfo_t, sigevent and constants. Linux version.
|
||||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -252,8 +252,8 @@ typedef struct sigevent
|
|||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
void (*_function) __P ((sigval_t)); /* Function to start. */
|
void (*_function) __PMT ((sigval_t)); /* Function to start. */
|
||||||
void *_attribute; /* Really pthread_attr_t. */
|
void *_attribute; /* Really pthread_attr_t. */
|
||||||
} _sigev_thread;
|
} _sigev_thread;
|
||||||
} _sigev_un;
|
} _sigev_un;
|
||||||
} sigevent_t;
|
} sigevent_t;
|
||||||
|
@ -43,9 +43,6 @@ int __libc_multiple_libcs = 1;
|
|||||||
int __libc_argc;
|
int __libc_argc;
|
||||||
char **__libc_argv;
|
char **__libc_argv;
|
||||||
|
|
||||||
/* We often need the UID and PID. Cache these values. */
|
|
||||||
pid_t __libc_pid = 0xf00baa;
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init (int argc, char **argv, char **envp)
|
init (int argc, char **argv, char **envp)
|
||||||
|
@ -21,9 +21,6 @@
|
|||||||
|
|
||||||
extern int __syscall_rt_sigqueueinfo (int, int, siginfo_t *);
|
extern int __syscall_rt_sigqueueinfo (int, int, siginfo_t *);
|
||||||
|
|
||||||
/* These variables are used quite often in the libc code. */
|
|
||||||
extern pid_t __libc_pid;
|
|
||||||
|
|
||||||
|
|
||||||
/* Return any pending signal or wait for one for the given time. */
|
/* Return any pending signal or wait for one for the given time. */
|
||||||
int
|
int
|
||||||
@ -38,11 +35,7 @@ __sigqueue (pid, sig, val)
|
|||||||
info.si_signo = sig;
|
info.si_signo = sig;
|
||||||
info.si_errno = 0;
|
info.si_errno = 0;
|
||||||
info.si_code = SI_QUEUE;
|
info.si_code = SI_QUEUE;
|
||||||
|
info.si_pid = __getpid ();
|
||||||
if (__libc_pid == 0xf00baa)
|
|
||||||
__libc_pid = __getpid ();
|
|
||||||
info.si_pid = __libc_pid;
|
|
||||||
|
|
||||||
info.si_uid = __getuid ();
|
info.si_uid = __getuid ();
|
||||||
info.si_value = val;
|
info.si_value = val;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user