mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 17:53:37 +08: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:
parent
ba488034ea
commit
fdacb17d48
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>
|
||||
|
||||
* 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.
|
||||
|
||||
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
|
||||
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.21. Even statically linked programs need some shared libraries
|
||||
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
|
||||
|
||||
@ -123,6 +125,7 @@ please let me know.
|
||||
4.3. When I set the timezone by setting the TZ environment variable
|
||||
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?
|
||||
|
||||
|
||||
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
||||
@ -376,10 +379,10 @@ any other link path.
|
||||
1.14. 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
|
||||
pointers. Some compilers produce buggy code for this model and therefore we
|
||||
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
|
||||
without --enable-omitfp. If the problem vanishes consider tracking the
|
||||
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
|
||||
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?
|
||||
|
||||
{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.
|
||||
|
||||
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:
|
||||
|
||||
* __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,
|
||||
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.
|
||||
|
||||
{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:
|
||||
static FILE *InPtr = stdin;
|
||||
|
||||
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
|
||||
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 allow above constructs.
|
||||
|
||||
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;'),
|
||||
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.
|
||||
|
||||
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
|
||||
-traditional-cpp). Why?
|
||||
|
||||
{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
|
||||
#define foo foo
|
||||
@ -1063,7 +1100,7 @@ check with #ifdef).
|
||||
|
||||
{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
|
||||
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
|
||||
include files (btw. you can still enable additional standards with feature
|
||||
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
|
||||
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.
|
||||
|
||||
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
|
||||
understand what you are undertaking before you begin.
|
||||
|
||||
@ -251,10 +251,10 @@ any other link path.
|
||||
?? 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
|
||||
pointers. Some compilers produce buggy code for this model and therefore we
|
||||
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
|
||||
without --enable-omitfp. If the problem vanishes consider tracking the
|
||||
problem down and report it as compiler failure.
|
||||
@ -859,11 +859,11 @@ siginterrupt().
|
||||
functions. Why?
|
||||
|
||||
{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.
|
||||
|
||||
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:
|
||||
|
||||
* __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,
|
||||
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.
|
||||
|
||||
{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:
|
||||
static FILE *InPtr = stdin;
|
||||
|
||||
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
|
||||
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 allow above constructs.
|
||||
|
||||
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;'),
|
||||
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.
|
||||
|
||||
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
|
||||
-traditional-cpp). Why?
|
||||
|
||||
{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
|
||||
#define foo foo
|
||||
@ -925,7 +940,7 @@ check with #ifdef).
|
||||
|
||||
{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
|
||||
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
|
||||
include files (btw. you can still enable additional standards with feature
|
||||
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
|
||||
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:
|
||||
{UD} Ulrich Drepper, <drepper@cygnus.com>
|
||||
|
@ -566,8 +566,7 @@ libio-include = -I$(..)libio
|
||||
# These are the variables that the implicit compilation rules use.
|
||||
CPPFLAGS = $($(subdir)-CPPFLAGS) $(+includes) $(defines) \
|
||||
-include $(..)include/libc-symbols.h $(sysdep-CPPFLAGS) \
|
||||
$($(subdir)-CPPFLAGS) $(CPPFLAGS-$(suffix $@)) $(CPPFLAGS-$(<F)) \
|
||||
$(CPPFLAGS-$(@F))
|
||||
$(CPPFLAGS-$(suffix $@)) $(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F))
|
||||
override CFLAGS = $(filter-out %frame-pointer,$(+cflags)) $(sysdep-CFLAGS) \
|
||||
$(CFLAGS-$(suffix $@)) $(CFLAGS-$(<F)) $(CFLAGS-$(@F))
|
||||
|
||||
|
18
argp/argp.h
18
argp/argp.h
@ -39,9 +39,15 @@ typedef int error_t;
|
||||
|
||||
#ifndef __P
|
||||
# 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
|
||||
# define __P(args) ()
|
||||
# define __PMT(args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
@ -124,7 +130,8 @@ struct argp_state; /* " */
|
||||
struct argp_child; /* " */
|
||||
|
||||
/* 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
|
||||
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,
|
||||
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. */
|
||||
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
|
||||
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
|
||||
the current parsing state, and then exits (unless the ARGP_NO_EXIT flag is
|
||||
used). This variable takes precedent over ARGP_PROGRAM_VERSION. */
|
||||
extern void (*argp_program_version_hook) __P ((FILE *__stream,
|
||||
struct argp_state *__state));
|
||||
extern void (*argp_program_version_hook) __PMT ((FILE *__stream,
|
||||
struct argp_state *__state));
|
||||
|
||||
/* 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
|
||||
|
@ -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
|
||||
lines using the current PID. */
|
||||
static int pid;
|
||||
int pid = 0;
|
||||
va_list ap;
|
||||
|
||||
if (pid == 0)
|
||||
pid = __getpid ();
|
||||
|
||||
va_start (ap, msg);
|
||||
do
|
||||
if (msg[0] == '\0')
|
||||
@ -127,6 +124,8 @@ _dl_debug_message (int new_line, const char *msg, ...)
|
||||
{
|
||||
char buf[7];
|
||||
char *p;
|
||||
if (pid == 0)
|
||||
pid = __getpid ();
|
||||
assert (pid >= 0 && pid < 100000);
|
||||
p = _itoa_word (pid, &buf[5], 10, 0);
|
||||
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. */
|
||||
while (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];
|
||||
}
|
||||
}
|
||||
|
@ -56,13 +56,13 @@ struct gconv_loaded_object;
|
||||
|
||||
|
||||
/* Type of a conversion function. */
|
||||
typedef int (*gconv_fct) __P ((struct gconv_step *,
|
||||
struct gconv_step_data *, __const char **,
|
||||
__const char *, size_t *, int));
|
||||
typedef int (*gconv_fct) __PMT ((struct gconv_step *,
|
||||
struct gconv_step_data *, __const char **,
|
||||
__const char *, size_t *, int));
|
||||
|
||||
/* Constructor and destructor for local data for conversion step. */
|
||||
typedef int (*gconv_init_fct) __P ((struct gconv_step *));
|
||||
typedef void (*gconv_end_fct) __P ((struct gconv_step *));
|
||||
typedef int (*gconv_init_fct) __PMT ((struct gconv_step *));
|
||||
typedef void (*gconv_end_fct) __PMT ((struct gconv_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_pathlen; /* sizeof(path) */
|
||||
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_LOGICAL 0x0002 /* logical walk */
|
||||
|
23
io/ftw.h
23
io/ftw.h
@ -86,21 +86,22 @@ struct FTW
|
||||
|
||||
|
||||
/* Convenient types for callback functions. */
|
||||
typedef int (*__ftw_func_t) __P ((__const char *__filename,
|
||||
__const struct stat *__status, int __flag));
|
||||
#ifdef __USE_LARGEFILE64
|
||||
typedef int (*__ftw64_func_t) __P ((__const char *__filename,
|
||||
__const struct stat64 *__status,
|
||||
typedef int (*__ftw_func_t) __PMT ((__const char *__filename,
|
||||
__const struct stat *__status,
|
||||
int __flag));
|
||||
#ifdef __USE_LARGEFILE64
|
||||
typedef int (*__ftw64_func_t) __PMT ((__const char *__filename,
|
||||
__const struct stat64 *__status,
|
||||
int __flag));
|
||||
#endif
|
||||
#ifdef __USE_XOPEN_EXTENDED
|
||||
typedef int (*__nftw_func_t) __P ((__const char *__filename,
|
||||
__const struct stat *__status, int __flag,
|
||||
struct FTW *__info));
|
||||
typedef int (*__nftw_func_t) __PMT ((__const char *__filename,
|
||||
__const struct stat *__status, int __flag,
|
||||
struct FTW *__info));
|
||||
# ifdef __USE_LARGEFILE64
|
||||
typedef int (*__nftw64_func_t) __P ((__const char *__filename,
|
||||
__const struct stat64 *__status,
|
||||
int __flag, struct FTW *__info));
|
||||
typedef int (*__nftw64_func_t) __PMT ((__const char *__filename,
|
||||
__const struct stat64 *__status,
|
||||
int __flag, struct FTW *__info));
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
6
libc.map
6
libc.map
@ -15,8 +15,6 @@ GLIBC_2.0 {
|
||||
|
||||
_IO_list_all; _IO_stderr_; _IO_stdin_; _IO_stdout_;
|
||||
|
||||
__libc_pid;
|
||||
|
||||
# This is for sparc only.
|
||||
.div; .mul; .rem; .udiv; .umul; .urem;
|
||||
|
||||
@ -106,8 +104,8 @@ GLIBC_2.0 {
|
||||
_IO_file_write; _IO_file_xsputn; _IO_fileno; _IO_flockfile;
|
||||
_IO_flush_all; _IO_flush_all_linebuffered; _IO_fopen; _IO_fprintf;
|
||||
_IO_fputs; _IO_fread; _IO_free_backup_area; _IO_freopen;
|
||||
_IO_fscanf; _IO_fseek; _IO_fsetpos; _IO_ftell; _IO_funlockfile;
|
||||
_IO_fwrite; _IO_getc; _IO_getline; _IO_gets;
|
||||
_IO_fscanf; _IO_fseek; _IO_fsetpos; _IO_ftell; _IO_ftrylockfile;
|
||||
_IO_funlockfile; _IO_fwrite; _IO_getc; _IO_getline; _IO_gets;
|
||||
_IO_init; _IO_init_marker; _IO_link_in; _IO_marker_delta;
|
||||
_IO_marker_difference; _IO_padn; _IO_pclose; _IO_peekc_locked;
|
||||
_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.
|
||||
Written by Per Bothner <bothner@cygnus.com>.
|
||||
|
||||
@ -58,8 +58,10 @@
|
||||
# else
|
||||
# ifdef __STDC__
|
||||
# define __P(p) p
|
||||
# define __PMT(p) p
|
||||
# else
|
||||
# define __P(p) ()
|
||||
# define __PMT(p) ()
|
||||
# endif
|
||||
# endif
|
||||
#endif /*!__P*/
|
||||
@ -253,10 +255,10 @@ extern _IO_FILE *_IO_stderr;
|
||||
/* Define the user-visible type, with user-friendly member names. */
|
||||
typedef struct
|
||||
{
|
||||
_IO_ssize_t (*read) __P ((struct _IO_FILE *, void *, _IO_ssize_t));
|
||||
_IO_ssize_t (*write) __P ((struct _IO_FILE *, const void *, _IO_ssize_t));
|
||||
_IO_fpos_t (*seek) __P ((struct _IO_FILE *, _IO_off_t, int));
|
||||
int (*close) __P ((struct _IO_FILE *));
|
||||
_IO_ssize_t (*read) __PMT ((struct _IO_FILE *, void *, _IO_ssize_t));
|
||||
_IO_ssize_t (*write) __PMT ((struct _IO_FILE *, const void *, _IO_ssize_t));
|
||||
_IO_fpos_t (*seek) __PMT ((struct _IO_FILE *, _IO_off_t, int));
|
||||
int (*close) __PMT ((struct _IO_FILE *));
|
||||
} _IO_cookie_io_functions_t;
|
||||
|
||||
/* 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>
|
||||
|
||||
* 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 */
|
||||
void ** p_specific[PTHREAD_KEY_1STLEVEL_SIZE]; /* thread-specific data */
|
||||
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 */
|
||||
size_t p_guardsize; /* size of guard area */
|
||||
};
|
||||
@ -117,7 +117,7 @@ struct pthread_request {
|
||||
sigset_t mask; /* signal mask */
|
||||
} create;
|
||||
struct { /* For REQ_FREE: */
|
||||
pthread_descr thread; /* descriptor of thread to free */
|
||||
pthread_t thread_id; /* identifier of thread to free */
|
||||
} free;
|
||||
struct { /* For REQ_PROCESS_EXIT: */
|
||||
int code; /* exit status */
|
||||
@ -171,7 +171,7 @@ extern char *__pthread_initial_thread_bos;
|
||||
extern int __pthread_nonstandard_stacks;
|
||||
|
||||
/* 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;
|
||||
|
||||
|
@ -99,7 +99,7 @@ int pthread_join(pthread_t thread_id, void ** thread_return)
|
||||
if (__pthread_manager_request >= 0) {
|
||||
request.req_thread = self;
|
||||
request.req_kind = REQ_FREE;
|
||||
request.req_args.free.thread = th;
|
||||
request.req_args.free.thread_id = thread_id;
|
||||
__libc_write(__pthread_manager_request,
|
||||
(char *) &request, sizeof(request));
|
||||
}
|
||||
@ -137,7 +137,7 @@ int pthread_detach(pthread_t thread_id)
|
||||
if (terminated && __pthread_manager_request >= 0) {
|
||||
request.req_thread = thread_self();
|
||||
request.req_kind = REQ_FREE;
|
||||
request.req_args.free.thread = th;
|
||||
request.req_args.free.thread_id = thread_id;
|
||||
__libc_write(__pthread_manager_request,
|
||||
(char *) &request, sizeof(request));
|
||||
}
|
||||
|
@ -8,11 +8,13 @@ GLIBC_2.0 {
|
||||
__libc_internal_tsd_get; __libc_internal_tsd_set;
|
||||
|
||||
# Overwritten libc functions.
|
||||
close; connect; fcntl; fork; fsync; lseek; msync; nanosleep; open;
|
||||
pause; raise; read; recv; recvfrom; recvmsg; send; sendmsg; sendto;
|
||||
system; tcdrain; wait; waitpid; write;
|
||||
accept; close; connect; fcntl; fork; fsync; longjmp; lseek; msync;
|
||||
nanosleep; open; pause; raise; read; recv; recvfrom; recvmsg; send;
|
||||
sendmsg; sendto; sigaction; siglongjmp; system; tcdrain; wait;
|
||||
waitpid; write;
|
||||
__close; __connect; __fcntl; __lseek; __open; __read; __send; __wait;
|
||||
__write;
|
||||
_IO_flockfile; _IO_ftrylockfile; _IO_funlockfile;
|
||||
|
||||
# POSIX.1c extensions to libc.
|
||||
flockfile; funlockfile; ftrylockfile;
|
||||
@ -43,11 +45,11 @@ GLIBC_2.0 {
|
||||
sigwait;
|
||||
|
||||
# Protected names for functions used in other shared objects.
|
||||
__pthread_getspecific; __pthread_initialize; __pthread_mutex_destroy;
|
||||
__pthread_mutex_init; __pthread_mutex_lock; __pthread_mutex_trylock;
|
||||
__pthread_mutex_unlock; __pthread_mutexattr_destroy;
|
||||
__pthread_mutexattr_init; __pthread_mutexattr_setkind_np;
|
||||
__pthread_setspecific;
|
||||
__pthread_atfork; __pthread_initialize; __pthread_getspecific;
|
||||
__pthread_key_create; __pthread_mutex_destroy; __pthread_mutex_init;
|
||||
__pthread_mutex_lock; __pthread_mutex_trylock; __pthread_mutex_unlock;
|
||||
__pthread_mutexattr_destroy; __pthread_mutexattr_init;
|
||||
__pthread_mutexattr_setkind_np; __pthread_once; __pthread_setspecific;
|
||||
|
||||
# The error functions.
|
||||
__errno_location; __h_errno_location;
|
||||
|
@ -37,12 +37,6 @@
|
||||
struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX] =
|
||||
{ { 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),
|
||||
or if all threads have stacks supplied by LinuxThreads (if 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,
|
||||
void * (*start_routine)(void *), void *arg,
|
||||
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_reap_children(void);
|
||||
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);
|
||||
break;
|
||||
case REQ_FREE:
|
||||
pthread_handle_free(request.req_args.free.thread);
|
||||
pthread_handle_free(request.req_args.free.thread_id);
|
||||
break;
|
||||
case REQ_PROCESS_EXIT:
|
||||
pthread_handle_exit(request.req_thread,
|
||||
@ -406,14 +400,6 @@ static void pthread_exited(pid_t pid)
|
||||
__pthread_unlock(th->p_lock);
|
||||
if (detached)
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -445,49 +431,28 @@ static void pthread_reap_children(void)
|
||||
/* Try to free the resources of a thread when requested by pthread_join
|
||||
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;
|
||||
/* Check that the thread th is still there -- pthread_reap_children
|
||||
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;
|
||||
pthread_handle handle = thread_handle(th_id);
|
||||
pthread_descr th;
|
||||
|
||||
/* Finally free it. */
|
||||
pthread_free (th);
|
||||
}
|
||||
__pthread_lock(&handle->h_lock);
|
||||
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;
|
||||
}
|
||||
__pthread_lock(th->p_lock);
|
||||
th = handle->h_descr;
|
||||
if (th->p_exited) {
|
||||
__pthread_unlock(th->p_lock);
|
||||
__pthread_unlock(&handle->h_lock);
|
||||
pthread_free(th);
|
||||
} else {
|
||||
/* The Unix process of the thread is still running.
|
||||
Mark the thread as detached so that the thread manager will
|
||||
deallocate its resources when the Unix process exits. */
|
||||
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);
|
||||
}
|
||||
|
||||
void __pthread_initialize(void)
|
||||
{
|
||||
pthread_initialize();
|
||||
}
|
||||
|
||||
int __pthread_initialize_manager(void)
|
||||
{
|
||||
int manager_pipe[2];
|
||||
|
@ -100,19 +100,25 @@ typedef struct
|
||||
enum
|
||||
{
|
||||
PTHREAD_CREATE_JOINABLE,
|
||||
#define PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_JOINABLE
|
||||
PTHREAD_CREATE_DETACHED
|
||||
#define PTHREAD_CREATE_DETACHED PTHREAD_CREATE_DETACHED
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
PTHREAD_INHERIT_SCHED,
|
||||
#define PTHREAD_INHERIT_SCHED PTHREAD_INHERIT_SCHED
|
||||
PTHREAD_EXPLICIT_SCHED
|
||||
#define PTHREAD_EXPLICIT_SCHED PTHREAD_EXPLICIT_SCHED
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
PTHREAD_SCOPE_SYSTEM,
|
||||
#define PTHREAD_SCOPE_SYSTEM PTHREAD_SCOPE_SYSTEM
|
||||
PTHREAD_SCOPE_PROCESS
|
||||
#define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_PROCESS
|
||||
};
|
||||
|
||||
typedef struct
|
||||
@ -156,7 +162,9 @@ typedef struct
|
||||
enum
|
||||
{
|
||||
PTHREAD_PROCESS_PRIVATE,
|
||||
# define PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE
|
||||
PTHREAD_PROCESS_SHARED
|
||||
# define PTHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED
|
||||
};
|
||||
|
||||
enum
|
||||
@ -187,7 +195,7 @@ typedef int pthread_once_t;
|
||||
|
||||
struct _pthread_cleanup_buffer
|
||||
{
|
||||
void (*routine) __P ((void *)); /* Function to call. */
|
||||
void (*routine) __PMT ((void *)); /* Function to call. */
|
||||
void *arg; /* Its argument. */
|
||||
int canceltype; /* Saved cancellation type. */
|
||||
struct _pthread_cleanup_buffer *prev; /* Chaining of cleanup functions. */
|
||||
@ -195,8 +203,20 @@ struct _pthread_cleanup_buffer
|
||||
|
||||
/* Cancellation */
|
||||
|
||||
enum { PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DISABLE };
|
||||
enum { PTHREAD_CANCEL_DEFERRED, PTHREAD_CANCEL_ASYNCHRONOUS };
|
||||
enum
|
||||
{
|
||||
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)
|
||||
|
||||
|
||||
|
@ -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.
|
||||
Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997.
|
||||
|
||||
@ -28,6 +28,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/stat.h>
|
||||
@ -270,6 +271,7 @@ void handle_requests (void)
|
||||
fd_set read_fd_set;
|
||||
fd_set write_fd_set;
|
||||
int fd;
|
||||
int maxfd; /* Highest used fd to optimize select/loop. */
|
||||
|
||||
/* Initialize the set of active sockets. */
|
||||
FD_ZERO (&active_read_fd_set);
|
||||
@ -277,16 +279,18 @@ void handle_requests (void)
|
||||
FD_SET (rw_sock, &active_read_fd_set);
|
||||
FD_SET (ro_sock, &active_read_fd_set);
|
||||
|
||||
maxfd = MAX (rw_sock, ro_sock);
|
||||
|
||||
while (1)
|
||||
{
|
||||
/* Block until input arrives on one or more active sockets. */
|
||||
read_fd_set = active_read_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"));
|
||||
|
||||
/* 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))
|
||||
{
|
||||
@ -299,6 +303,7 @@ void handle_requests (void)
|
||||
error (0, errno, _("cannot accept connection"));
|
||||
|
||||
FD_SET (connection->sock, &active_read_fd_set);
|
||||
maxfd = MAX (maxfd, connection->sock);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -335,6 +340,14 @@ void handle_requests (void)
|
||||
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.
|
||||
|
||||
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
|
||||
(see enum above) when an inconsistency is detected. If ABORTFUNC is
|
||||
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
|
||||
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). */
|
||||
#ifndef __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
|
||||
typedef __compar_fn_t comparison_fn_t;
|
||||
@ -147,9 +147,9 @@ extern void *tdelete __PMT ((__const void *__key, void **__rootp,
|
||||
|
||||
#ifndef __ACTION_FN_T
|
||||
# define __ACTION_FN_T
|
||||
typedef void (*__action_fn_t) __P ((__const void *__nodep,
|
||||
VISIT __value,
|
||||
int __level));
|
||||
typedef void (*__action_fn_t) __PMT ((__const void *__nodep,
|
||||
VISIT __value,
|
||||
int __level));
|
||||
#endif
|
||||
|
||||
/* Walk through the whole tree and call the ACTION callback for every node
|
||||
|
@ -32,8 +32,6 @@
|
||||
/* Variable to synchronize work. */
|
||||
char *__getopt_nonoption_flags;
|
||||
|
||||
extern pid_t __libc_pid;
|
||||
|
||||
|
||||
/* Remove the environment variable "_<PID>_GNU_nonoption_argv_flags_" if
|
||||
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;
|
||||
size_t len;
|
||||
|
||||
/* Generate name of the environment variable. We must know the PID
|
||||
and we must not use `sprintf'. */
|
||||
if (__libc_pid == 0xf00baa)
|
||||
__libc_pid = __getpid ();
|
||||
|
||||
/* Construct "_<PID>_GNU_nonoption_argv_flags_=" string. */
|
||||
/* Construct the "_<PID>_GNU_nonoption_argv_flags_=" string. We must
|
||||
not use `sprintf'. */
|
||||
cp = memcpy (&var[sizeof (var) - sizeof (envvar_tail)], envvar_tail,
|
||||
sizeof (envvar_tail));
|
||||
cp = _itoa_word (__libc_pid, cp, 10, 0);
|
||||
cp = _itoa_word (__getpid (), cp, 10, 0);
|
||||
*--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
|
||||
# undef __P
|
||||
# define __P(protos) protos
|
||||
# define __PMT(protos) protos
|
||||
# define __ptr_t void *
|
||||
# if !defined __GNUC__ || __GNUC__ < 2
|
||||
# undef __const
|
||||
@ -34,6 +35,7 @@ extern "C" {
|
||||
#else /* Not C++ or ANSI C. */
|
||||
# undef __P
|
||||
# define __P(protos) ()
|
||||
# define __PMT(protos) ()
|
||||
# undef __const
|
||||
# define __const
|
||||
# define __ptr_t char *
|
||||
@ -99,11 +101,11 @@ typedef struct
|
||||
|
||||
/* If the GLOB_ALTDIRFUNC flag is set, the following functions
|
||||
are used instead of the normal file access functions. */
|
||||
void (*gl_closedir) __P ((void *));
|
||||
struct dirent *(*gl_readdir) __P ((void *));
|
||||
__ptr_t (*gl_opendir) __P ((__const char *));
|
||||
int (*gl_lstat) __P ((__const char *, struct stat *));
|
||||
int (*gl_stat) __P ((__const char *, struct stat *));
|
||||
void (*gl_closedir) __PMT ((void *));
|
||||
struct dirent *(*gl_readdir) __PMT ((void *));
|
||||
__ptr_t (*gl_opendir) __PMT ((__const char *));
|
||||
int (*gl_lstat) __PMT ((__const char *, struct stat *));
|
||||
int (*gl_stat) __PMT ((__const char *, struct stat *));
|
||||
} glob_t;
|
||||
|
||||
/* Do glob searching for PATTERN, placing results in PGLOB.
|
||||
|
@ -1343,7 +1343,7 @@ envsubst:
|
||||
|
||||
/* Start a new word with the last parameter. */
|
||||
*word = w_newword (word_length, max_length);
|
||||
value = __strdup (__libc_argv[p]);
|
||||
value = __libc_argv[p];
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -170,19 +170,19 @@ struct __res_state {
|
||||
typedef enum { res_goahead, res_nextns, res_modified, res_done, res_error }
|
||||
res_sendhookact;
|
||||
|
||||
typedef res_sendhookact (*res_send_qhook)__P((struct sockaddr_in * const *ns,
|
||||
const u_char **query,
|
||||
int *querylen,
|
||||
u_char *ans,
|
||||
int anssiz,
|
||||
int *resplen));
|
||||
typedef res_sendhookact (*res_send_qhook)__PMT((struct sockaddr_in * const *ns,
|
||||
const u_char **query,
|
||||
int *querylen,
|
||||
u_char *ans,
|
||||
int anssiz,
|
||||
int *resplen));
|
||||
|
||||
typedef res_sendhookact (*res_send_rhook)__P((const struct sockaddr_in *ns,
|
||||
const u_char *query,
|
||||
int querylen,
|
||||
u_char *ans,
|
||||
int anssiz,
|
||||
int *resplen));
|
||||
typedef res_sendhookact (*res_send_rhook)__PMT((const struct sockaddr_in *ns,
|
||||
const u_char *query,
|
||||
int querylen,
|
||||
u_char *ans,
|
||||
int anssiz,
|
||||
int *resplen));
|
||||
|
||||
struct res_sym {
|
||||
int number; /* Identifying number, like T_MX */
|
||||
|
@ -51,7 +51,7 @@ typedef __sig_atomic_t sig_atomic_t;
|
||||
#include <bits/signum.h>
|
||||
|
||||
/* 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 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. */
|
||||
#ifndef __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
|
||||
typedef __compar_fn_t comparison_fn_t;
|
||||
|
@ -25,8 +25,6 @@ extern void __libc_global_ctors (void);
|
||||
|
||||
int __libc_multiple_libcs = 1;
|
||||
|
||||
pid_t __libc_pid;
|
||||
|
||||
static void
|
||||
init (int *data)
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
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 __getopt_clean_environment (char **);
|
||||
|
||||
pid_t __libc_pid;
|
||||
|
||||
#ifdef PIC
|
||||
void
|
||||
__libc_init_first (void)
|
||||
|
@ -41,9 +41,6 @@ int __libc_multiple_libcs = 1;
|
||||
extern int __libc_argc;
|
||||
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_exit_routine) (int status) __attribute__ ((__noreturn__));
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
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;
|
||||
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_exit_routine) (int status) __attribute__ ((__noreturn__));
|
||||
|
||||
|
@ -41,13 +41,10 @@ __aio_sigqueue (sig, val)
|
||||
info.si_errno = 0;
|
||||
info.si_code = SI_ASYNCIO;
|
||||
|
||||
if (__libc_pid ==0xf00baa)
|
||||
__libc_pid = __getpid ();
|
||||
info.si_pid = __libc_pid;
|
||||
|
||||
info.si_pid = getpid ();
|
||||
info.si_uid = getuid ();
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
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. */
|
||||
__sighandler_t sa_handler;
|
||||
/* Used if SA_SIGINFO is set. */
|
||||
void (*sa_sigaction) __P ((int, siginfo_t *, void *));
|
||||
void (*sa_sigaction) __PMT ((int, siginfo_t *, void *));
|
||||
}
|
||||
__sigaction_handler;
|
||||
#define sa_handler __sigaction_handler.sa_handler
|
||||
@ -43,7 +43,7 @@ struct sigaction
|
||||
int sa_flags;
|
||||
|
||||
/* Restore handler. */
|
||||
void (*sa_restorer) __P ((void));
|
||||
void (*sa_restorer) __PMT ((void));
|
||||
};
|
||||
|
||||
/* Bits in `sa_flags'. */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -252,8 +252,8 @@ typedef struct sigevent
|
||||
|
||||
struct
|
||||
{
|
||||
void (*_function) __P ((sigval_t)); /* Function to start. */
|
||||
void *_attribute; /* Really pthread_attr_t. */
|
||||
void (*_function) __PMT ((sigval_t)); /* Function to start. */
|
||||
void *_attribute; /* Really pthread_attr_t. */
|
||||
} _sigev_thread;
|
||||
} _sigev_un;
|
||||
} sigevent_t;
|
||||
|
@ -43,9 +43,6 @@ int __libc_multiple_libcs = 1;
|
||||
int __libc_argc;
|
||||
char **__libc_argv;
|
||||
|
||||
/* We often need the UID and PID. Cache these values. */
|
||||
pid_t __libc_pid = 0xf00baa;
|
||||
|
||||
|
||||
static void
|
||||
init (int argc, char **argv, char **envp)
|
||||
|
@ -21,9 +21,6 @@
|
||||
|
||||
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. */
|
||||
int
|
||||
@ -38,11 +35,7 @@ __sigqueue (pid, sig, val)
|
||||
info.si_signo = sig;
|
||||
info.si_errno = 0;
|
||||
info.si_code = SI_QUEUE;
|
||||
|
||||
if (__libc_pid == 0xf00baa)
|
||||
__libc_pid = __getpid ();
|
||||
info.si_pid = __libc_pid;
|
||||
|
||||
info.si_pid = __getpid ();
|
||||
info.si_uid = __getuid ();
|
||||
info.si_value = val;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user