mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-09 14:50:05 +00:00
Update.
1998-07-04 10:14 Ulrich Drepper <drepper@cygnus.com> * libio/Makefile (routines): Add iofread_u and iofwrite_u. * libio/Versions: Add fread_unlocked and fwrite_unlocked. * Makerules (lib%.so): Adjust ignore pattern for last makefile change. * time/tzfile.c (decode): Optimize by using bswap_32. (__tzfile_read): Use _unlocked stream functions. Correct setting of __tzname array values. (__tzfile_compute): Correct setting of __tzname array values. * time/tzset.c (__tzstring): Clean up a bit. 1998-06-29 19:01 Jim Wilson <wilson@cygnus.com> * posix/regex.c (re_comp): Add cast to char * before gettext calls. 1998-06-30 Andreas Jaeger <aj@arthur.rhein-neckar.de> * sysdeps/unix/bsd/poll.c (__poll): Allocate fd_set dynamically so that fd can be bigger than FD_SETSIZE. 1998-07-01 Andreas Jaeger <aj@arthur.rhein-neckar.de> * nscd/grpcache.c: Include <unistd.h>. * nscd/pwdcache.c: Likewise. * nis/nis_modify.c: Include <string.h>. * nis/nis_add.c: Likewise. * nis/nis_checkpoint.c: Likewise. * posix/runptests.c: Likewise. * sysdeps/generic/statvfs64.c: Likewise. * sysdeps/generic/fstatvfs64.c: Likewise. 1998-07-03 13:16 Ulrich Drepper <drepper@cygnus.com> * localedata/charmaps/ISO-8859-9: Change mapping for 0xea, 0xec, 0xef to match data from Unicode. Reported by Michael Deutschmann <michael@talamasca.wkpowerlink.com>. 1998-07-03 11:45 Ulrich Drepper <drepper@cygnus.com> * stdio-common/printf.h: Define printf_function and printf_arginfo_function types using __PMT not __P. Reported by Marc Lehmann. 1998-07-02 14:07 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu> * assert/test-assert.c: New test. * assert/test-assert-perr.c: New test. * assert/Makefile (tests): Add test-assert and test-assert-perr. 1998-07-02 13:45 Zack Weinberg <zack@rabi.phys.columbia.edu> BSD-style SCM_CREDS support. * sysdeps/unix/sysv/linux/socket.h: Define struct cmsgcred and SCM_CREDS. * sysdeps/unix/sysv/linux/sendmsg.c: New file. Convert user visible SCM_CREDS packet to what the kernel wants. * sysdeps/unix/sysv/linux/recvmsg.c: New file. Convert SCM_CREDS packet output by kernel to what users want. * sysdeps/unix/sysv/linux/sendmsg.S: Moved to... * sysdeps/unix/sysv/linux/__sendmsg.S: here. * sysdeps/unix/sysv/linux/recvmsg.S: Moved to... * sysdeps/unix/sysv/linux/__recvmsg.S: here. * sysdeps/unix/sysv/linux/Makefile [subdir=socket]: Add __sendmsg and __recvmsg to sysdep_routines. * sysdeps/unix/sysv/linux/Dist: Add __sendmsg.S and __recvmsg.S. 1998-07-02 Thorsten Kukuk <kukuk@vt.uni-paderborn.de> * nscd/grpcache.c: Fix gid pointer handling and debug messages. * nscd/pwdcache.c: Fix uid pointer handling and debug messages. * nscd/nscd.c: Check, if pthread_create fails. 1998-07-02 Andreas Jaeger <aj@arthur.rhein-neckar.de> * stdio-common/test_rdwr.c (main): Use %Zu for size_t in printf format strings. * stdio-common/bug1.c (main): Likewise. * stdio-common/bug5.c (main): Likewise. * stdio-common/tstgetln.c (main): Likewise. * elf/sprof.c (generate_call_graph): Likewise. (load_shobj): Likewise. * posix/runptests.c (main): Likewise. * string/tst-strlen.c (main): Likewise. * sysdeps/libm-ieee754/e_acos.c (__ieee754_acos): Remove unused variable q3. * sysdeps/libm-ieee754/e_asin.c (__ieee754_asin): Likewise 1998-07-03 Andreas Jaeger <aj@arthur.rhein-neckar.de> * wctype/Versions: Add __towctrans. Noticed by Alex Buell <alex.buell@tahallah.demon.co.uk>. 1998-07-02 Mark Kettenis <kettenis@phys.uva.nl> * grp/initgroups.c (compat_call): Only call dynamically loaded functions if they are really present. 1998-07-02 Mark Kettenis <kettenis@phys.uva.nl> * sysdeps/unix/sysv/linux/bits/sched.h: Move __END_DECLS within #ifdef that contains __BEGIN_DECLS. 1998-07-02 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * libio/iofwrite.c: Fix return value when size == 0. 1998-07-01 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * posix/Makefile (distribute): Add annexc.c. (generated): Add $(objpfx)annexc and $(objpfx)annexc.out. 1998-07-01 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/pthreadtypes.h here, and do not clobber headers. * sysdeps/unix/sysv/linux/Dist: Add bits/pthreadtypes.h. 1998-07-03 Andreas Jaeger <aj@arthur.rhein-neckar.de> * timezone/tst-timezone.c: Add tests for tzname variable. 1998-07-03 12:17 Zack Weinberg <zack@rabi.phys.columbia.edu> * Makefile [versioning=yes]: Build the mapfiles with a pattern rule that lists all of them as targets. (sysd-versions): Depend only on Versions.def. Write a Makefile fragment that defines $(vers-libs) based on contents of that file; then include it. (lib-noranlib): Depend on lib-mapfiles not sysd-versions. (lib-mapfiles): New target, depends on sysd-versions and $(vers-libs). Predicate all this on avoid-generated unset as well as versioning. 1998-07-03 14:35 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
This commit is contained in:
parent
6ef9f70bdb
commit
ba9234d947
142
ChangeLog
142
ChangeLog
@ -1,4 +1,144 @@
|
|||||||
Fri Jul 3 14:35:55 1998 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
1998-07-04 10:14 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* libio/Makefile (routines): Add iofread_u and iofwrite_u.
|
||||||
|
* libio/Versions: Add fread_unlocked and fwrite_unlocked.
|
||||||
|
|
||||||
|
* Makerules (lib%.so): Adjust ignore pattern for last makefile change.
|
||||||
|
|
||||||
|
* time/tzfile.c (decode): Optimize by using bswap_32.
|
||||||
|
(__tzfile_read): Use _unlocked stream functions. Correct setting of
|
||||||
|
__tzname array values.
|
||||||
|
(__tzfile_compute): Correct setting of __tzname array values.
|
||||||
|
* time/tzset.c (__tzstring): Clean up a bit.
|
||||||
|
|
||||||
|
1998-06-29 19:01 Jim Wilson <wilson@cygnus.com>
|
||||||
|
|
||||||
|
* posix/regex.c (re_comp): Add cast to char * before gettext calls.
|
||||||
|
|
||||||
|
1998-06-30 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||||
|
|
||||||
|
* sysdeps/unix/bsd/poll.c (__poll): Allocate fd_set dynamically so
|
||||||
|
that fd can be bigger than FD_SETSIZE.
|
||||||
|
|
||||||
|
1998-07-01 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||||
|
|
||||||
|
* nscd/grpcache.c: Include <unistd.h>.
|
||||||
|
* nscd/pwdcache.c: Likewise.
|
||||||
|
|
||||||
|
* nis/nis_modify.c: Include <string.h>.
|
||||||
|
* nis/nis_add.c: Likewise.
|
||||||
|
* nis/nis_checkpoint.c: Likewise.
|
||||||
|
* posix/runptests.c: Likewise.
|
||||||
|
* sysdeps/generic/statvfs64.c: Likewise.
|
||||||
|
* sysdeps/generic/fstatvfs64.c: Likewise.
|
||||||
|
|
||||||
|
1998-07-03 13:16 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* localedata/charmaps/ISO-8859-9: Change mapping for 0xea, 0xec, 0xef
|
||||||
|
to match data from Unicode.
|
||||||
|
Reported by Michael Deutschmann <michael@talamasca.wkpowerlink.com>.
|
||||||
|
|
||||||
|
1998-07-03 11:45 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* stdio-common/printf.h: Define printf_function and
|
||||||
|
printf_arginfo_function types using __PMT not __P.
|
||||||
|
Reported by Marc Lehmann.
|
||||||
|
|
||||||
|
1998-07-02 14:07 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu>
|
||||||
|
|
||||||
|
* assert/test-assert.c: New test.
|
||||||
|
* assert/test-assert-perr.c: New test.
|
||||||
|
* assert/Makefile (tests): Add test-assert and test-assert-perr.
|
||||||
|
|
||||||
|
1998-07-02 13:45 Zack Weinberg <zack@rabi.phys.columbia.edu>
|
||||||
|
|
||||||
|
BSD-style SCM_CREDS support.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/socket.h: Define struct cmsgcred and
|
||||||
|
SCM_CREDS.
|
||||||
|
* sysdeps/unix/sysv/linux/sendmsg.c: New file. Convert user
|
||||||
|
visible SCM_CREDS packet to what the kernel wants.
|
||||||
|
* sysdeps/unix/sysv/linux/recvmsg.c: New file. Convert
|
||||||
|
SCM_CREDS packet output by kernel to what users want.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/sendmsg.S: Moved to...
|
||||||
|
* sysdeps/unix/sysv/linux/__sendmsg.S: here.
|
||||||
|
* sysdeps/unix/sysv/linux/recvmsg.S: Moved to...
|
||||||
|
* sysdeps/unix/sysv/linux/__recvmsg.S: here.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/Makefile [subdir=socket]: Add
|
||||||
|
__sendmsg and __recvmsg to sysdep_routines.
|
||||||
|
* sysdeps/unix/sysv/linux/Dist: Add __sendmsg.S and __recvmsg.S.
|
||||||
|
|
||||||
|
1998-07-02 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
|
||||||
|
|
||||||
|
* nscd/grpcache.c: Fix gid pointer handling and debug messages.
|
||||||
|
* nscd/pwdcache.c: Fix uid pointer handling and debug messages.
|
||||||
|
* nscd/nscd.c: Check, if pthread_create fails.
|
||||||
|
|
||||||
|
1998-07-02 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||||
|
|
||||||
|
* stdio-common/test_rdwr.c (main): Use %Zu for size_t in printf
|
||||||
|
format strings.
|
||||||
|
* stdio-common/bug1.c (main): Likewise.
|
||||||
|
* stdio-common/bug5.c (main): Likewise.
|
||||||
|
* stdio-common/tstgetln.c (main): Likewise.
|
||||||
|
* elf/sprof.c (generate_call_graph): Likewise.
|
||||||
|
(load_shobj): Likewise.
|
||||||
|
* posix/runptests.c (main): Likewise.
|
||||||
|
* string/tst-strlen.c (main): Likewise.
|
||||||
|
|
||||||
|
* sysdeps/libm-ieee754/e_acos.c (__ieee754_acos): Remove unused
|
||||||
|
variable q3.
|
||||||
|
* sysdeps/libm-ieee754/e_asin.c (__ieee754_asin): Likewise
|
||||||
|
|
||||||
|
1998-07-03 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||||
|
|
||||||
|
* wctype/Versions: Add __towctrans.
|
||||||
|
Noticed by Alex Buell <alex.buell@tahallah.demon.co.uk>.
|
||||||
|
|
||||||
|
1998-07-02 Mark Kettenis <kettenis@phys.uva.nl>
|
||||||
|
|
||||||
|
* grp/initgroups.c (compat_call): Only call dynamically loaded
|
||||||
|
functions if they are really present.
|
||||||
|
|
||||||
|
1998-07-02 Mark Kettenis <kettenis@phys.uva.nl>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/bits/sched.h: Move __END_DECLS within
|
||||||
|
#ifdef that contains __BEGIN_DECLS.
|
||||||
|
|
||||||
|
1998-07-02 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* libio/iofwrite.c: Fix return value when size == 0.
|
||||||
|
|
||||||
|
1998-07-01 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* posix/Makefile (distribute): Add annexc.c.
|
||||||
|
(generated): Add $(objpfx)annexc and $(objpfx)annexc.out.
|
||||||
|
|
||||||
|
1998-07-01 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add
|
||||||
|
bits/pthreadtypes.h here, and do not clobber headers.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/Dist: Add bits/pthreadtypes.h.
|
||||||
|
|
||||||
|
1998-07-03 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||||
|
|
||||||
|
* timezone/tst-timezone.c: Add tests for tzname variable.
|
||||||
|
|
||||||
|
1998-07-03 12:17 Zack Weinberg <zack@rabi.phys.columbia.edu>
|
||||||
|
|
||||||
|
* Makefile [versioning=yes]: Build the mapfiles with a pattern
|
||||||
|
rule that lists all of them as targets.
|
||||||
|
(sysd-versions): Depend only on Versions.def. Write a Makefile
|
||||||
|
fragment that defines $(vers-libs) based on contents of that file;
|
||||||
|
then include it.
|
||||||
|
(lib-noranlib): Depend on lib-mapfiles not sysd-versions.
|
||||||
|
(lib-mapfiles): New target, depends on sysd-versions and $(vers-libs).
|
||||||
|
Predicate all this on avoid-generated unset as well as versioning.
|
||||||
|
|
||||||
|
1998-07-03 14:35 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/m68k/Versions: New file.
|
* sysdeps/unix/sysv/linux/m68k/Versions: New file.
|
||||||
|
|
||||||
|
@ -345,7 +345,8 @@ $(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS) \
|
|||||||
$(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
|
$(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
|
||||||
-L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
|
-L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
|
||||||
-Wl,--whole-archive \
|
-Wl,--whole-archive \
|
||||||
$(filter-out $(map-file) $(@F:.so=.map) $(+preinit) $(+postinit),$^) \
|
$(filter-out $(map-file) $(common-objpfx)$(@F:.so=.map) \
|
||||||
|
$(+preinit) $(+postinit),$^) \
|
||||||
$(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so)
|
$(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (C) 1991, 1994, 1997 Free Software Foundation, Inc.
|
# Copyright (C) 1991, 1994, 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
|
||||||
@ -23,5 +23,6 @@ subdir := assert
|
|||||||
headers := assert.h
|
headers := assert.h
|
||||||
|
|
||||||
routines := assert assert-perr
|
routines := assert assert-perr
|
||||||
|
tests := test-assert test-assert-perr
|
||||||
|
|
||||||
include ../Rules
|
include ../Rules
|
||||||
|
86
assert/test-assert-perr.c
Normal file
86
assert/test-assert-perr.c
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/* Test assert_perror().
|
||||||
|
*
|
||||||
|
* This is hairier than you'd think, involving games with
|
||||||
|
* stdio and signals.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
|
jmp_buf rec;
|
||||||
|
char buf[160];
|
||||||
|
|
||||||
|
void
|
||||||
|
sigabrt (int unused)
|
||||||
|
{
|
||||||
|
longjmp (rec, 1); /* recover control */
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef NDEBUG
|
||||||
|
#include <assert.h>
|
||||||
|
void
|
||||||
|
assert1 (void)
|
||||||
|
{
|
||||||
|
assert_perror (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
assert2 (void)
|
||||||
|
{
|
||||||
|
assert_perror (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <assert.h>
|
||||||
|
void
|
||||||
|
assert3 (void)
|
||||||
|
{
|
||||||
|
assert_perror (2);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
volatile int failed = 1; /* safety in presence of longjmp() */
|
||||||
|
|
||||||
|
fclose (stderr);
|
||||||
|
stderr = tmpfile ();
|
||||||
|
if (!stderr)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
signal (SIGABRT, sigabrt);
|
||||||
|
|
||||||
|
if (!setjmp (rec))
|
||||||
|
assert1 ();
|
||||||
|
else
|
||||||
|
failed = 0; /* should happen */
|
||||||
|
|
||||||
|
if (!setjmp (rec))
|
||||||
|
assert2 ();
|
||||||
|
else
|
||||||
|
failed = 1; /* should not happen */
|
||||||
|
|
||||||
|
if (!setjmp (rec))
|
||||||
|
assert3 ();
|
||||||
|
else
|
||||||
|
failed = 1; /* should not happen */
|
||||||
|
|
||||||
|
rewind (stderr);
|
||||||
|
fgets (buf, 160, stderr);
|
||||||
|
if (!strstr(buf, strerror (1)))
|
||||||
|
failed = 1;
|
||||||
|
|
||||||
|
fgets (buf, 160, stderr);
|
||||||
|
if (strstr (buf, strerror (0)))
|
||||||
|
failed = 1;
|
||||||
|
|
||||||
|
fgets (buf, 160, stderr);
|
||||||
|
if (strstr (buf, strerror (2)))
|
||||||
|
failed = 1;
|
||||||
|
|
||||||
|
return failed;
|
||||||
|
}
|
88
assert/test-assert.c
Normal file
88
assert/test-assert.c
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/* Test assert().
|
||||||
|
*
|
||||||
|
* This is hairier than you'd think, involving games with
|
||||||
|
* stdio and signals.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
|
jmp_buf rec;
|
||||||
|
char buf[160];
|
||||||
|
|
||||||
|
void
|
||||||
|
sigabrt (int unused)
|
||||||
|
{
|
||||||
|
longjmp (rec, 1); /* recover control */
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef NDEBUG
|
||||||
|
#include <assert.h>
|
||||||
|
void
|
||||||
|
assert1 (void)
|
||||||
|
{
|
||||||
|
assert (1 == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
assert2 (void)
|
||||||
|
{
|
||||||
|
assert (1 == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <assert.h>
|
||||||
|
void
|
||||||
|
assert3 (void)
|
||||||
|
{
|
||||||
|
assert (2 == 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
|
||||||
|
volatile int failed = 1;
|
||||||
|
|
||||||
|
fclose (stderr);
|
||||||
|
stderr = tmpfile ();
|
||||||
|
if(!stderr)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
signal (SIGABRT, sigabrt);
|
||||||
|
|
||||||
|
if (!setjmp (rec))
|
||||||
|
assert1 ();
|
||||||
|
else
|
||||||
|
failed = 0; /* should happen */
|
||||||
|
|
||||||
|
if (!setjmp (rec))
|
||||||
|
assert2 ();
|
||||||
|
else
|
||||||
|
failed = 1; /* should not happen */
|
||||||
|
|
||||||
|
if (!setjmp (rec))
|
||||||
|
assert3 ();
|
||||||
|
else
|
||||||
|
failed = 1; /* should not happen */
|
||||||
|
|
||||||
|
rewind (stderr);
|
||||||
|
fgets (buf, 160, stderr);
|
||||||
|
if (!strstr (buf, "1 == 2"))
|
||||||
|
failed = 1;
|
||||||
|
|
||||||
|
fgets (buf, 160, stderr);
|
||||||
|
if (strstr (buf, "1 == 1"))
|
||||||
|
failed = 1;
|
||||||
|
|
||||||
|
fgets (buf, 160, stderr);
|
||||||
|
if (strstr (buf, "2 == 3"))
|
||||||
|
failed = 1;
|
||||||
|
|
||||||
|
return failed;
|
||||||
|
}
|
@ -449,7 +449,7 @@ load_shobj (const char *name)
|
|||||||
else
|
else
|
||||||
log_hashfraction = -1;
|
log_hashfraction = -1;
|
||||||
if (do_test)
|
if (do_test)
|
||||||
printf ("hashfraction = %d\ndivider = %d\n",
|
printf ("hashfraction = %d\ndivider = %Zu\n",
|
||||||
result->hashfraction,
|
result->hashfraction,
|
||||||
result->hashfraction * sizeof (struct here_fromstruct));
|
result->hashfraction * sizeof (struct here_fromstruct));
|
||||||
result->tossize = textsize / HASHFRACTION;
|
result->tossize = textsize / HASHFRACTION;
|
||||||
@ -1197,7 +1197,7 @@ generate_call_graph (struct profdata *profdata)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Info abount the function itself. */
|
/* Info abount the function itself. */
|
||||||
n = printf ("[%d]", cnt);
|
n = printf ("[%Zu]", cnt);
|
||||||
printf ("%*s%5.1f%8.2f%8.2f%9" PRIdMAX " %s [%Zd]\n",
|
printf ("%*s%5.1f%8.2f%8.2f%9" PRIdMAX " %s [%Zd]\n",
|
||||||
7 - n, " ",
|
7 - n, " ",
|
||||||
total_ticks ? (100.0 * sortsym[cnt]->ticks) / total_ticks : 0,
|
total_ticks ? (100.0 * sortsym[cnt]->ticks) / total_ticks : 0,
|
||||||
|
@ -59,12 +59,18 @@ compat_call (service_user *nip, const char *user, gid_t group, long int *start,
|
|||||||
get_function getgrent_fct;
|
get_function getgrent_fct;
|
||||||
end_function endgrent_fct;
|
end_function endgrent_fct;
|
||||||
|
|
||||||
setgrent_fct = __nss_lookup_function (nip, "setgrent");
|
|
||||||
status = _CALL_DL_FCT (setgrent_fct, ());
|
|
||||||
if (status != NSS_STATUS_SUCCESS)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
getgrent_fct = __nss_lookup_function (nip, "getgrent_r");
|
getgrent_fct = __nss_lookup_function (nip, "getgrent_r");
|
||||||
|
if (getgrent_fct == NULL)
|
||||||
|
return NSS_STATUS_UNAVAIL;
|
||||||
|
|
||||||
|
setgrent_fct = __nss_lookup_function (nip, "setgrent");
|
||||||
|
if (setgrent_fct)
|
||||||
|
{
|
||||||
|
status = _CALL_DL_FCT (setgrent_fct, ());
|
||||||
|
if (status != NSS_STATUS_SUCCESS)
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
endgrent_fct = __nss_lookup_function (nip, "endgrent");
|
endgrent_fct = __nss_lookup_function (nip, "endgrent");
|
||||||
|
|
||||||
tmpbuf = __alloca (buflen);
|
tmpbuf = __alloca (buflen);
|
||||||
@ -115,7 +121,8 @@ compat_call (service_user *nip, const char *user, gid_t group, long int *start,
|
|||||||
while (status == NSS_STATUS_SUCCESS);
|
while (status == NSS_STATUS_SUCCESS);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
_CALL_DL_FCT (endgrent_fct, ());
|
if (endgrent_fct)
|
||||||
|
_CALL_DL_FCT (endgrent_fct, ());
|
||||||
|
|
||||||
return NSS_STATUS_SUCCESS;
|
return NSS_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ routines := \
|
|||||||
clearerr feof ferror fgetc fileno fputc freopen fseek getc getchar \
|
clearerr feof ferror fgetc fileno fputc freopen fseek getc getchar \
|
||||||
memstream pclose putc putchar rewind setbuf setlinebuf vasprintf \
|
memstream pclose putc putchar rewind setbuf setlinebuf vasprintf \
|
||||||
iovdprintf vscanf vsnprintf obprintf fcloseall fseeko ftello \
|
iovdprintf vscanf vsnprintf obprintf fcloseall fseeko ftello \
|
||||||
freopen64 fseeko64 ftello64 \
|
freopen64 fseeko64 ftello64 iofread_u iofwrite_u \
|
||||||
\
|
\
|
||||||
libc_fatal
|
libc_fatal
|
||||||
|
|
||||||
|
@ -98,6 +98,6 @@ libc {
|
|||||||
|
|
||||||
# f*
|
# f*
|
||||||
fgetpos64; fopen64; freopen64; fseeko; fseeko64; fsetpos64; ftello;
|
fgetpos64; fopen64; freopen64; fseeko; fseeko64; fsetpos64; ftello;
|
||||||
ftello64; fopen; fclose; fdopen;
|
ftello64; fopen; fclose; fdopen; fread_unlocked; fwrite_unlocked;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
42
libio/iofread_u.c
Normal file
42
libio/iofread_u.c
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/* Copyright (C) 1993, 1995, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU IO Library.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2, or (at
|
||||||
|
your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this library; see the file COPYING. If not, write to
|
||||||
|
the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||||
|
MA 02111-1307, USA.
|
||||||
|
|
||||||
|
As a special exception, if you link this library with files
|
||||||
|
compiled with a GNU compiler to produce an executable, this does
|
||||||
|
not cause the resulting executable to be covered by the GNU General
|
||||||
|
Public License. This exception does not however invalidate any
|
||||||
|
other reasons why the executable file might be covered by the GNU
|
||||||
|
General Public License. */
|
||||||
|
|
||||||
|
#include "libioP.h"
|
||||||
|
|
||||||
|
_IO_size_t
|
||||||
|
fread_unlocked (buf, size, count, fp)
|
||||||
|
void *buf;
|
||||||
|
_IO_size_t size;
|
||||||
|
_IO_size_t count;
|
||||||
|
_IO_FILE *fp;
|
||||||
|
{
|
||||||
|
_IO_size_t bytes_requested = size*count;
|
||||||
|
_IO_size_t bytes_read;
|
||||||
|
CHECK_FILE (fp, 0);
|
||||||
|
if (bytes_requested == 0)
|
||||||
|
return 0;
|
||||||
|
bytes_read = _IO_sgetn (fp, (char *) buf, bytes_requested);
|
||||||
|
return bytes_requested == bytes_read ? count : bytes_read / size;
|
||||||
|
}
|
@ -35,15 +35,15 @@ _IO_fwrite (buf, size, count, fp)
|
|||||||
_IO_size_t request = size * count;
|
_IO_size_t request = size * count;
|
||||||
_IO_size_t written;
|
_IO_size_t written;
|
||||||
CHECK_FILE (fp, 0);
|
CHECK_FILE (fp, 0);
|
||||||
|
/* Many traditional implementations return 0 if size==0 && count > 0,
|
||||||
|
but ANSI requires us to return count in this case. */
|
||||||
if (request == 0)
|
if (request == 0)
|
||||||
return 0;
|
return count;
|
||||||
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
|
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
|
||||||
_IO_flockfile (fp);
|
_IO_flockfile (fp);
|
||||||
written = _IO_sputn (fp, (const char *) buf, request);
|
written = _IO_sputn (fp, (const char *) buf, request);
|
||||||
_IO_funlockfile (fp);
|
_IO_funlockfile (fp);
|
||||||
_IO_cleanup_region_end (0);
|
_IO_cleanup_region_end (0);
|
||||||
/* Many traditional implementations return 0 if size==0 && count > 0,
|
|
||||||
but ANSI requires us to return count in this case. */
|
|
||||||
if (written == request)
|
if (written == request)
|
||||||
return count;
|
return count;
|
||||||
else
|
else
|
||||||
|
47
libio/iofwrite_u.c
Normal file
47
libio/iofwrite_u.c
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/* Copyright (C) 1993, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU IO Library.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2, or (at
|
||||||
|
your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this library; see the file COPYING. If not, write to
|
||||||
|
the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||||
|
MA 02111-1307, USA.
|
||||||
|
|
||||||
|
As a special exception, if you link this library with files
|
||||||
|
compiled with a GNU compiler to produce an executable, this does
|
||||||
|
not cause the resulting executable to be covered by the GNU General
|
||||||
|
Public License. This exception does not however invalidate any
|
||||||
|
other reasons why the executable file might be covered by the GNU
|
||||||
|
General Public License. */
|
||||||
|
|
||||||
|
#include "libioP.h"
|
||||||
|
|
||||||
|
_IO_size_t
|
||||||
|
fwrite_unlocked (buf, size, count, fp)
|
||||||
|
const void *buf;
|
||||||
|
_IO_size_t size;
|
||||||
|
_IO_size_t count;
|
||||||
|
_IO_FILE *fp;
|
||||||
|
{
|
||||||
|
_IO_size_t request = size * count;
|
||||||
|
_IO_size_t written;
|
||||||
|
CHECK_FILE (fp, 0);
|
||||||
|
/* Many traditional implementations return 0 if size==0 && count > 0,
|
||||||
|
but ANSI requires us to return count in this case. */
|
||||||
|
if (request == 0)
|
||||||
|
return count;
|
||||||
|
written = _IO_sputn (fp, (const char *) buf, request);
|
||||||
|
if (written == request)
|
||||||
|
return count;
|
||||||
|
else
|
||||||
|
return written / size;
|
||||||
|
}
|
@ -1,3 +1,7 @@
|
|||||||
|
1998-07-01 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||||
|
|
||||||
|
* attr.c: Include <string.h>.
|
||||||
|
|
||||||
1998-06-30 11:47 Ulrich Drepper <drepper@cygnus.com>
|
1998-06-30 11:47 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
* attr.c: Include errno.h. Use memcpy to copy sched_param.
|
* attr.c: Include errno.h. Use memcpy to copy sched_param.
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
/* Handling of thread attributes */
|
/* Handling of thread attributes */
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include "pthread.h"
|
#include "pthread.h"
|
||||||
|
@ -245,12 +245,12 @@ CHARMAP
|
|||||||
<c,> /xE7 <U00E7> LATIN SMALL LETTER C WITH CEDILLA
|
<c,> /xE7 <U00E7> LATIN SMALL LETTER C WITH CEDILLA
|
||||||
<e!> /xE8 <U00E8> LATIN SMALL LETTER E WITH GRAVE
|
<e!> /xE8 <U00E8> LATIN SMALL LETTER E WITH GRAVE
|
||||||
<e'> /xE9 <U00E9> LATIN SMALL LETTER E WITH ACUTE
|
<e'> /xE9 <U00E9> LATIN SMALL LETTER E WITH ACUTE
|
||||||
<e;> /xEA <U0119> LATIN SMALL LETTER E WITH OGONEK
|
<e/>> /xEA <U00EA> LATIN SMALL LETTER E WITH CIRCUMFLEX
|
||||||
<e:> /xEB <U00EB> LATIN SMALL LETTER E WITH DIAERESIS
|
<e:> /xEB <U00EB> LATIN SMALL LETTER E WITH DIAERESIS
|
||||||
<e.> /xEC <U0117> LATIN SMALL LETTER E WITH DOT ABOVE
|
<i!> /xEC <U00EC> LATIN SMALL LETTER I WITH GRAVE
|
||||||
<i'> /xED <U00ED> LATIN SMALL LETTER I WITH ACUTE
|
<i'> /xED <U00ED> LATIN SMALL LETTER I WITH ACUTE
|
||||||
<i/>> /xEE <U00EE> LATIN SMALL LETTER I WITH CIRCUMFLEX
|
<i/>> /xEE <U00EE> LATIN SMALL LETTER I WITH CIRCUMFLEX
|
||||||
<i-> /xEF <U012B> LATIN SMALL LETTER I WITH MACRON
|
<i:> /xEF <U00EF> LATIN SMALL LETTER I WITH DIAERESIS
|
||||||
<g(> /xF0 <U011F> LATIN SMALL LETTER G WITH BREVE
|
<g(> /xF0 <U011F> LATIN SMALL LETTER G WITH BREVE
|
||||||
<n?> /xF1 <U00F1> LATIN SMALL LETTER N WITH TILDE
|
<n?> /xF1 <U00F1> LATIN SMALL LETTER N WITH TILDE
|
||||||
<o!> /xF2 <U00F2> LATIN SMALL LETTER O WITH GRAVE
|
<o!> /xF2 <U00F2> LATIN SMALL LETTER O WITH GRAVE
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include <rpcsvc/nis.h>
|
#include <rpcsvc/nis.h>
|
||||||
|
|
||||||
#include "nis_xdr.h"
|
#include "nis_xdr.h"
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include <rpcsvc/nis.h>
|
#include <rpcsvc/nis.h>
|
||||||
|
|
||||||
#include "nis_xdr.h"
|
#include "nis_xdr.h"
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include <rpcsvc/nis.h>
|
#include <rpcsvc/nis.h>
|
||||||
|
|
||||||
#include "nis_xdr.h"
|
#include "nis_xdr.h"
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include <rpcsvc/nis.h>
|
#include <rpcsvc/nis.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
@ -48,7 +49,7 @@ typedef struct grphash grphash;
|
|||||||
struct gidhash
|
struct gidhash
|
||||||
{
|
{
|
||||||
struct gidhash *next;
|
struct gidhash *next;
|
||||||
struct grphash *grptr;
|
struct group *grptr;
|
||||||
};
|
};
|
||||||
typedef struct gidhash gidhash;
|
typedef struct gidhash gidhash;
|
||||||
|
|
||||||
@ -176,6 +177,7 @@ static int
|
|||||||
add_cache (struct group *grp)
|
add_cache (struct group *grp)
|
||||||
{
|
{
|
||||||
grphash *work;
|
grphash *work;
|
||||||
|
gidhash *gidwork;
|
||||||
unsigned long int hash = __nis_hash (grp->gr_name,
|
unsigned long int hash = __nis_hash (grp->gr_name,
|
||||||
strlen (grp->gr_name)) % modulo;
|
strlen (grp->gr_name)) % modulo;
|
||||||
|
|
||||||
@ -197,7 +199,17 @@ add_cache (struct group *grp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
time (&work->create);
|
time (&work->create);
|
||||||
gidtbl[grp->gr_gid % modulo].grptr = work;
|
gidwork = &gidtbl[grp->gr_gid % modulo];
|
||||||
|
if (gidwork->grptr == NULL)
|
||||||
|
gidwork->grptr = work->grp;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (gidwork->next != NULL)
|
||||||
|
gidwork = gidwork->next;
|
||||||
|
|
||||||
|
gidwork->next = calloc (1, sizeof (gidhash));
|
||||||
|
gidwork->next->grptr = work->grp;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -231,8 +243,8 @@ cache_search_gid (gid_t gid)
|
|||||||
|
|
||||||
while (work->grptr != NULL)
|
while (work->grptr != NULL)
|
||||||
{
|
{
|
||||||
if (work->grptr->grp->gr_gid == gid)
|
if (work->grptr->gr_gid == gid)
|
||||||
return work->grptr->grp;
|
return work->grptr;
|
||||||
if (work->next != NULL)
|
if (work->next != NULL)
|
||||||
work = work->next;
|
work = work->next;
|
||||||
else
|
else
|
||||||
@ -475,7 +487,7 @@ cache_getgrgid (void *v_param)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
static void *
|
||||||
grptable_update (void *v)
|
grptable_update (void *v)
|
||||||
{
|
{
|
||||||
time_t now;
|
time_t now;
|
||||||
@ -509,7 +521,7 @@ grptable_update (void *v)
|
|||||||
|
|
||||||
while (uh && uh->grptr)
|
while (uh && uh->grptr)
|
||||||
{
|
{
|
||||||
if (uh->grptr->grp->gr_gid == work->grp->gr_gid)
|
if (uh->grptr->gr_gid == work->grp->gr_gid)
|
||||||
{
|
{
|
||||||
if (debug_flag > 3)
|
if (debug_flag > 3)
|
||||||
dbg_log (_("Give gid for \"%s\" free"),
|
dbg_log (_("Give gid for \"%s\" free"),
|
||||||
@ -543,14 +555,14 @@ grptable_update (void *v)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (debug_flag > 2)
|
if (debug_flag > 2)
|
||||||
dbg_log (_("(pwdtable_update) Release wait lock\n"));
|
dbg_log (_("(grptable_update) Release wait lock"));
|
||||||
pthread_rwlock_unlock (&grplock);
|
pthread_rwlock_unlock (&grplock);
|
||||||
sleep (20);
|
sleep (20);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
static void *
|
||||||
negtable_update (void *v)
|
negtable_update (void *v)
|
||||||
{
|
{
|
||||||
time_t now;
|
time_t now;
|
||||||
@ -561,12 +573,12 @@ negtable_update (void *v)
|
|||||||
while (!do_shutdown)
|
while (!do_shutdown)
|
||||||
{
|
{
|
||||||
if (debug_flag > 2)
|
if (debug_flag > 2)
|
||||||
dbg_log (_("(negtable_update) Wait for write lock!"));
|
dbg_log (_("(neggrptable_update) Wait for write lock!"));
|
||||||
|
|
||||||
pthread_rwlock_wrlock (&neglock);
|
pthread_rwlock_wrlock (&neglock);
|
||||||
|
|
||||||
if (debug_flag > 2)
|
if (debug_flag > 2)
|
||||||
dbg_log (_("(negtable_update) Have write lock"));
|
dbg_log (_("(neggrptable_update) Have write lock"));
|
||||||
|
|
||||||
time (&now);
|
time (&now);
|
||||||
for (i = 0; i < modulo; ++i)
|
for (i = 0; i < modulo; ++i)
|
||||||
@ -597,7 +609,7 @@ negtable_update (void *v)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (debug_flag > 2)
|
if (debug_flag > 2)
|
||||||
dbg_log (_("(negtable_update) Release wait lock"));
|
dbg_log (_("(neggrptable_update) Release wait lock"));
|
||||||
pthread_rwlock_unlock (&neglock);
|
pthread_rwlock_unlock (&neglock);
|
||||||
sleep (10);
|
sleep (10);
|
||||||
}
|
}
|
||||||
|
61
nscd/nscd.c
61
nscd/nscd.c
@ -309,7 +309,7 @@ write_pid (const char *file)
|
|||||||
typedef int (*pwbyname_function) (const char *name, struct passwd *pw,
|
typedef int (*pwbyname_function) (const char *name, struct passwd *pw,
|
||||||
char *buffer, size_t buflen);
|
char *buffer, size_t buflen);
|
||||||
|
|
||||||
/* Hanlde incoming requests. */
|
/* Handle incoming requests. */
|
||||||
static
|
static
|
||||||
void handle_requests (void)
|
void handle_requests (void)
|
||||||
{
|
{
|
||||||
@ -317,6 +317,12 @@ void handle_requests (void)
|
|||||||
int conn; /* Handle on which connection (client) the request came from. */
|
int conn; /* Handle on which connection (client) the request came from. */
|
||||||
int done = 0;
|
int done = 0;
|
||||||
char *key;
|
char *key;
|
||||||
|
pthread_attr_t th_attr;
|
||||||
|
|
||||||
|
/* We will create all threads detached. Therefore prepare an attribute
|
||||||
|
now. */
|
||||||
|
pthread_attr_init (&th_attr);
|
||||||
|
pthread_attr_setdetachstate (&th_attr, PTHREAD_CREATE_DETACHED);
|
||||||
|
|
||||||
while (!done)
|
while (!done)
|
||||||
{
|
{
|
||||||
@ -331,15 +337,23 @@ void handle_requests (void)
|
|||||||
{
|
{
|
||||||
param_t *param = malloc (sizeof (param_t));
|
param_t *param = malloc (sizeof (param_t));
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
|
int status;
|
||||||
|
|
||||||
if (debug_flag)
|
if (debug_flag)
|
||||||
dbg_log ("\tGETPWBYNAME (%s)", key);
|
dbg_log ("\tGETPWBYNAME (%s)", key);
|
||||||
param->key = key;
|
param->key = key;
|
||||||
param->conn = conn;
|
param->conn = conn;
|
||||||
if (disabled_passwd)
|
if (disabled_passwd)
|
||||||
pthread_create (&thread, NULL, cache_pw_disabled, (void *)param);
|
status = pthread_create (&thread, &th_attr, cache_pw_disabled,
|
||||||
|
(void *)param);
|
||||||
else
|
else
|
||||||
pthread_create (&thread, NULL, cache_getpwnam, (void *)param);
|
status = pthread_create (&thread, &th_attr, cache_getpwnam,
|
||||||
|
(void *)param);
|
||||||
|
if (status != 0)
|
||||||
|
{
|
||||||
|
dbg_log (_("Creation of thread failed: %s"), strerror (errno));
|
||||||
|
close_socket (conn);
|
||||||
|
}
|
||||||
pthread_detach (thread);
|
pthread_detach (thread);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -347,48 +361,69 @@ void handle_requests (void)
|
|||||||
{
|
{
|
||||||
param_t *param = malloc (sizeof (param_t));
|
param_t *param = malloc (sizeof (param_t));
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
|
int status;
|
||||||
|
|
||||||
if (debug_flag)
|
if (debug_flag)
|
||||||
dbg_log ("\tGETPWBYUID (%s)", key);
|
dbg_log ("\tGETPWBYUID (%s)", key);
|
||||||
param->key = key;
|
param->key = key;
|
||||||
param->conn = conn;
|
param->conn = conn;
|
||||||
if (disabled_passwd)
|
if (disabled_passwd)
|
||||||
pthread_create (&thread, NULL, cache_pw_disabled, (void *)param);
|
status = pthread_create (&thread, &th_attr, cache_pw_disabled,
|
||||||
|
(void *)param);
|
||||||
else
|
else
|
||||||
pthread_create (&thread, NULL, cache_getpwuid, (void *)param);
|
status = pthread_create (&thread, &th_attr, cache_getpwuid,
|
||||||
pthread_detach (thread);
|
(void *)param);
|
||||||
|
if (status != 0)
|
||||||
|
{
|
||||||
|
dbg_log (_("Creation of thread failed: %s"), strerror (errno));
|
||||||
|
close_socket (conn);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GETGRBYNAME:
|
case GETGRBYNAME:
|
||||||
{
|
{
|
||||||
param_t *param = malloc (sizeof (param_t));
|
param_t *param = malloc (sizeof (param_t));
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
|
int status;
|
||||||
|
|
||||||
if (debug_flag)
|
if (debug_flag)
|
||||||
dbg_log ("\tGETGRBYNAME (%s)", key);
|
dbg_log ("\tGETGRBYNAME (%s)", key);
|
||||||
param->key = key;
|
param->key = key;
|
||||||
param->conn = conn;
|
param->conn = conn;
|
||||||
if (disabled_group)
|
if (disabled_group)
|
||||||
pthread_create (&thread, NULL, cache_gr_disabled, (void *)param);
|
status = pthread_create (&thread, &th_attr, cache_gr_disabled,
|
||||||
|
(void *)param);
|
||||||
else
|
else
|
||||||
pthread_create (&thread, NULL, cache_getgrnam, (void *)param);
|
status = pthread_create (&thread, &th_attr, cache_getgrnam,
|
||||||
pthread_detach (thread);
|
(void *)param);
|
||||||
|
if (status != 0)
|
||||||
|
{
|
||||||
|
dbg_log (_("Creation of thread failed: %s"), strerror (errno));
|
||||||
|
close_socket (conn);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GETGRBYGID:
|
case GETGRBYGID:
|
||||||
{
|
{
|
||||||
param_t *param = malloc (sizeof (param_t));
|
param_t *param = malloc (sizeof (param_t));
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
|
int status;
|
||||||
|
|
||||||
if (debug_flag)
|
if (debug_flag)
|
||||||
dbg_log ("\tGETGRBYGID (%s)", key);
|
dbg_log ("\tGETGRBYGID (%s)", key);
|
||||||
param->key = key;
|
param->key = key;
|
||||||
param->conn = conn;
|
param->conn = conn;
|
||||||
if (disabled_group)
|
if (disabled_group)
|
||||||
pthread_create (&thread, NULL, cache_gr_disabled, (void *)param);
|
status = pthread_create (&thread, &th_attr, cache_gr_disabled,
|
||||||
|
(void *)param);
|
||||||
else
|
else
|
||||||
pthread_create (&thread, NULL, cache_getgrgid, (void *)param);
|
status = pthread_create (&thread, &th_attr, cache_getgrgid,
|
||||||
pthread_detach (thread);
|
(void *)param);
|
||||||
|
if (status != 0)
|
||||||
|
{
|
||||||
|
dbg_log (_("Creation of thread failed: %s"), strerror (errno));
|
||||||
|
close_socket (conn);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GETHOSTBYNAME:
|
case GETHOSTBYNAME:
|
||||||
@ -432,4 +467,6 @@ void handle_requests (void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_attr_destroy (&th_attr);
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include <rpcsvc/nis.h>
|
#include <rpcsvc/nis.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
@ -48,7 +49,7 @@ typedef struct pwdhash pwdhash;
|
|||||||
struct uidhash
|
struct uidhash
|
||||||
{
|
{
|
||||||
struct uidhash *next;
|
struct uidhash *next;
|
||||||
struct pwdhash *pwptr;
|
struct passwd *pwptr;
|
||||||
};
|
};
|
||||||
typedef struct uidhash uidhash;
|
typedef struct uidhash uidhash;
|
||||||
|
|
||||||
@ -159,6 +160,7 @@ static int
|
|||||||
add_cache (struct passwd *pwd)
|
add_cache (struct passwd *pwd)
|
||||||
{
|
{
|
||||||
pwdhash *work;
|
pwdhash *work;
|
||||||
|
uidhash *uidwork;
|
||||||
unsigned long int hash = __nis_hash (pwd->pw_name,
|
unsigned long int hash = __nis_hash (pwd->pw_name,
|
||||||
strlen (pwd->pw_name)) % modulo;
|
strlen (pwd->pw_name)) % modulo;
|
||||||
|
|
||||||
@ -180,8 +182,17 @@ add_cache (struct passwd *pwd)
|
|||||||
}
|
}
|
||||||
/* Set a pointer from the pwuid hash table to the pwname hash table */
|
/* Set a pointer from the pwuid hash table to the pwname hash table */
|
||||||
time (&work->create);
|
time (&work->create);
|
||||||
uidtbl[pwd->pw_uid % modulo].pwptr = work;
|
uidwork = &uidtbl[pwd->pw_uid % modulo];
|
||||||
|
if (uidwork->pwptr == NULL)
|
||||||
|
uidwork->pwptr = work->pwd;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (uidwork->next != NULL)
|
||||||
|
uidwork = uidwork->next;
|
||||||
|
|
||||||
|
uidwork->next = calloc (1, sizeof (uidhash));
|
||||||
|
uidwork->next->pwptr = work->pwd;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,8 +225,8 @@ cache_search_uid (uid_t uid)
|
|||||||
|
|
||||||
while (work->pwptr != NULL)
|
while (work->pwptr != NULL)
|
||||||
{
|
{
|
||||||
if (work->pwptr->pwd->pw_uid == uid)
|
if (work->pwptr->pw_uid == uid)
|
||||||
return work->pwptr->pwd;
|
return work->pwptr;
|
||||||
if (work->next != NULL)
|
if (work->next != NULL)
|
||||||
work = work->next;
|
work = work->next;
|
||||||
else
|
else
|
||||||
@ -458,7 +469,7 @@ cache_getpwuid (void *v_param)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
static void *
|
||||||
pwdtable_update (void *v)
|
pwdtable_update (void *v)
|
||||||
{
|
{
|
||||||
time_t now;
|
time_t now;
|
||||||
@ -492,7 +503,7 @@ pwdtable_update (void *v)
|
|||||||
|
|
||||||
while (uh != NULL && uh->pwptr)
|
while (uh != NULL && uh->pwptr)
|
||||||
{
|
{
|
||||||
if (uh->pwptr->pwd->pw_uid == work->pwd->pw_uid)
|
if (uh->pwptr->pw_uid == work->pwd->pw_uid)
|
||||||
{
|
{
|
||||||
if (debug_flag)
|
if (debug_flag)
|
||||||
dbg_log (_("Give uid for \"%s\" free"),
|
dbg_log (_("Give uid for \"%s\" free"),
|
||||||
@ -533,7 +544,7 @@ pwdtable_update (void *v)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
static void *
|
||||||
negtable_update (void *v)
|
negtable_update (void *v)
|
||||||
{
|
{
|
||||||
time_t now;
|
time_t now;
|
||||||
@ -544,12 +555,12 @@ negtable_update (void *v)
|
|||||||
while (!do_shutdown)
|
while (!do_shutdown)
|
||||||
{
|
{
|
||||||
if (debug_flag > 2)
|
if (debug_flag > 2)
|
||||||
dbg_log (_("(negtable_update) Wait for write lock!"));
|
dbg_log (_("(negpwdtable_update) Wait for write lock!"));
|
||||||
|
|
||||||
pthread_rwlock_wrlock (&neglock);
|
pthread_rwlock_wrlock (&neglock);
|
||||||
|
|
||||||
if (debug_flag)
|
if (debug_flag > 2)
|
||||||
dbg_log (_("(negtable_update) Have write lock"));
|
dbg_log (_("(negpwdtable_update) Have write lock"));
|
||||||
|
|
||||||
time (&now);
|
time (&now);
|
||||||
for (i = 0; i < modulo; ++i)
|
for (i = 0; i < modulo; ++i)
|
||||||
@ -579,8 +590,8 @@ negtable_update (void *v)
|
|||||||
work = work->next;
|
work = work->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (debug_flag)
|
if (debug_flag > 2)
|
||||||
dbg_log (_("(negtable_update) Release wait lock"));
|
dbg_log (_("(negpwdtable_update) Release wait lock"));
|
||||||
|
|
||||||
pthread_rwlock_unlock (&neglock);
|
pthread_rwlock_unlock (&neglock);
|
||||||
sleep (10);
|
sleep (10);
|
||||||
|
@ -30,7 +30,7 @@ headers := sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h \
|
|||||||
|
|
||||||
distribute := confstr.h TESTS TESTS2C.sed testcases.h \
|
distribute := confstr.h TESTS TESTS2C.sed testcases.h \
|
||||||
PTESTS PTESTS2C.sed ptestcases.h \
|
PTESTS PTESTS2C.sed ptestcases.h \
|
||||||
globtest.c globtest.sh wordexp-tst.sh
|
globtest.c globtest.sh wordexp-tst.sh annexc.c
|
||||||
|
|
||||||
routines := \
|
routines := \
|
||||||
uname \
|
uname \
|
||||||
@ -63,7 +63,8 @@ gpl2lgpl := getopt.c getopt1.c getopt.h regex.c regex.h
|
|||||||
before-compile := testcases.h ptestcases.h
|
before-compile := testcases.h ptestcases.h
|
||||||
|
|
||||||
# So they get cleaned up.
|
# So they get cleaned up.
|
||||||
generated := $(addprefix wordexp-test-result, 1 2 3 4 5 6 7 8 9 10)
|
generated := $(addprefix wordexp-test-result, 1 2 3 4 5 6 7 8 9 10) \
|
||||||
|
$(objpfx)annexc $(objpfx)annexc.out
|
||||||
|
|
||||||
include ../Rules
|
include ../Rules
|
||||||
|
|
||||||
|
@ -5509,12 +5509,12 @@ re_comp (s)
|
|||||||
{
|
{
|
||||||
re_comp_buf.buffer = (unsigned char *) malloc (200);
|
re_comp_buf.buffer = (unsigned char *) malloc (200);
|
||||||
if (re_comp_buf.buffer == NULL)
|
if (re_comp_buf.buffer == NULL)
|
||||||
return gettext (re_error_msgid[(int) REG_ESPACE]);
|
return (char *) gettext (re_error_msgid[(int) REG_ESPACE]);
|
||||||
re_comp_buf.allocated = 200;
|
re_comp_buf.allocated = 200;
|
||||||
|
|
||||||
re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
|
re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
|
||||||
if (re_comp_buf.fastmap == NULL)
|
if (re_comp_buf.fastmap == NULL)
|
||||||
return gettext (re_error_msgid[(int) REG_ESPACE]);
|
return (char *) gettext (re_error_msgid[(int) REG_ESPACE]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Since `re_exec' always passes NULL for the `regs' argument, we
|
/* Since `re_exec' always passes NULL for the `regs' argument, we
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
/* Data structure to describe the tests. */
|
/* Data structure to describe the tests. */
|
||||||
struct test
|
struct test
|
||||||
@ -108,7 +109,7 @@ main (int argc, char *argv[])
|
|||||||
regfree (&re);
|
regfree (&re);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf ("\n%u tests, %d errors\n", cnt, errors);
|
printf ("\n%Zu tests, %d errors\n", cnt, errors);
|
||||||
|
|
||||||
/* We should return here the error status but since some tests are known
|
/* We should return here the error status but since some tests are known
|
||||||
to fail this would only cause the libc testsuite to fail. */
|
to fail this would only cause the libc testsuite to fail. */
|
||||||
|
@ -12,12 +12,12 @@ main (void)
|
|||||||
stream = open_memstream (&bp, &size);
|
stream = open_memstream (&bp, &size);
|
||||||
fprintf (stream, "hello");
|
fprintf (stream, "hello");
|
||||||
fflush (stream);
|
fflush (stream);
|
||||||
printf ("buf = %s, size = %d\n", bp, size);
|
printf ("buf = %s, size = %Zu\n", bp, size);
|
||||||
lose |= size != 5;
|
lose |= size != 5;
|
||||||
lose |= strncmp (bp, "hello", size);
|
lose |= strncmp (bp, "hello", size);
|
||||||
fprintf (stream, ", world");
|
fprintf (stream, ", world");
|
||||||
fclose (stream);
|
fclose (stream);
|
||||||
printf ("buf = %s, size = %d\n", bp, size);
|
printf ("buf = %s, size = %Zu\n", bp, size);
|
||||||
lose |= size != 12;
|
lose |= size != 12;
|
||||||
lose |= strncmp (bp, "hello, world", 12);
|
lose |= strncmp (bp, "hello, world", 12);
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ main (void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
for (i = 0; i < 1000; ++i)
|
for (i = 0; i < 1000; ++i)
|
||||||
fprintf (in, "%u\n", i);
|
fprintf (in, "%Zu\n", i);
|
||||||
|
|
||||||
out = fopen (outname, "w");
|
out = fopen (outname, "w");
|
||||||
if (out == NULL)
|
if (out == NULL)
|
||||||
|
@ -59,17 +59,17 @@ struct printf_info
|
|||||||
The function should return the number of characters written,
|
The function should return the number of characters written,
|
||||||
or -1 for errors. */
|
or -1 for errors. */
|
||||||
|
|
||||||
typedef int printf_function __P ((FILE *__stream,
|
typedef int printf_function __PMT ((FILE *__stream,
|
||||||
__const struct printf_info *__info,
|
__const struct printf_info *__info,
|
||||||
__const void *__const *__args));
|
__const void *__const *__args));
|
||||||
|
|
||||||
/* Type of a printf specifier-arginfo function.
|
/* Type of a printf specifier-arginfo function.
|
||||||
INFO gives information about the format specification.
|
INFO gives information about the format specification.
|
||||||
N, ARGTYPES, and return value are as for printf_parse_format. */
|
N, ARGTYPES, and return value are as for printf_parse_format. */
|
||||||
|
|
||||||
typedef int printf_arginfo_function __P ((__const struct printf_info *__info,
|
typedef int printf_arginfo_function __PMT ((__const struct printf_info *__info,
|
||||||
size_t __n,
|
size_t __n,
|
||||||
int *__argtypes));
|
int *__argtypes));
|
||||||
|
|
||||||
|
|
||||||
/* Register FUNC to be called to format SPEC specifiers; ARGINFO must be
|
/* Register FUNC to be called to format SPEC specifiers; ARGINFO must be
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1991, 1992, 1996, 1997 Free Software Foundation, Inc.
|
/* Copyright (C) 1991, 1992, 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
|
||||||
@ -61,13 +61,13 @@ main (int argc, char **argv)
|
|||||||
int c = getc (f);
|
int c = getc (f);
|
||||||
if (c == EOF)
|
if (c == EOF)
|
||||||
{
|
{
|
||||||
printf ("EOF at %u.\n", i);
|
printf ("EOF at %Zu.\n", i);
|
||||||
lose = 1;
|
lose = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (c != hello[i])
|
else if (c != hello[i])
|
||||||
{
|
{
|
||||||
printf ("Got '%c' instead of '%c' at %u.\n",
|
printf ("Got '%c' instead of '%c' at %Zu.\n",
|
||||||
(unsigned char) c, hello[i], i);
|
(unsigned char) c, hello[i], i);
|
||||||
lose = 1;
|
lose = 1;
|
||||||
break;
|
break;
|
||||||
@ -83,7 +83,7 @@ main (int argc, char **argv)
|
|||||||
for (i = replace_from; i < replace_to; ++i)
|
for (i = replace_from; i < replace_to; ++i)
|
||||||
if (putc(replace[i], f) == EOF)
|
if (putc(replace[i], f) == EOF)
|
||||||
{
|
{
|
||||||
printf ("putc('%c') got %s at %u.\n",
|
printf ("putc('%c') got %s at %Zu.\n",
|
||||||
replace[i], strerror (errno), i);
|
replace[i], strerror (errno), i);
|
||||||
lose = 1;
|
lose = 1;
|
||||||
break;
|
break;
|
||||||
@ -97,7 +97,7 @@ main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf ("ftell returns %lu; should be %u.\n", where, replace_from);
|
printf ("ftell returns %lu; should be %Zu.\n", where, replace_from);
|
||||||
lose = 1;
|
lose = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
|
/* Copyright (C) 1992, 1995, 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
|
||||||
@ -32,7 +32,7 @@ main (int argc, char *argv[])
|
|||||||
|
|
||||||
while ((len = getline (&buf, &size, stdin)) != -1)
|
while ((len = getline (&buf, &size, stdin)) != -1)
|
||||||
{
|
{
|
||||||
printf ("bufsize %u; read %d: ", size, len);
|
printf ("bufsize %Zu; read %Zd: ", size, len);
|
||||||
if (fwrite (buf, len, 1, stdout) != 1)
|
if (fwrite (buf, len, 1, stdout) != 1)
|
||||||
{
|
{
|
||||||
perror ("fwrite");
|
perror ("fwrite");
|
||||||
|
@ -33,7 +33,7 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (strlen (buf) != words * 4 + lens[last])
|
if (strlen (buf) != words * 4 + lens[last])
|
||||||
{
|
{
|
||||||
printf ("failed for base=%d, words=%d, and last=%d\n",
|
printf ("failed for base=%Zu, words=%Zu, and last=%Zu\n",
|
||||||
base, words, last);
|
base, words, last);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/statvfs.h>
|
#include <sys/statvfs.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
/* Return information about the filesystem on which FD resides. */
|
/* Return information about the filesystem on which FD resides. */
|
||||||
int
|
int
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/statvfs.h>
|
#include <sys/statvfs.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
/* Return information about the filesystem on which FILE resides. */
|
/* Return information about the filesystem on which FILE resides. */
|
||||||
int
|
int
|
||||||
|
@ -71,7 +71,7 @@ qS[] ={1.0, -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
|
|||||||
double x;
|
double x;
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
double z,p,q,r,w,s,c,df,p1,p2,p3,q1,q2,q3,z2,z4,z6;
|
double z,p,q,r,w,s,c,df,p1,p2,p3,q1,q2,z2,z4,z6;
|
||||||
int32_t hx,ix;
|
int32_t hx,ix;
|
||||||
GET_HIGH_WORD(hx,x);
|
GET_HIGH_WORD(hx,x);
|
||||||
ix = hx&0x7fffffff;
|
ix = hx&0x7fffffff;
|
||||||
|
@ -79,7 +79,7 @@ qS[] = {1.0, -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
|
|||||||
double x;
|
double x;
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
double t,w,p,q,c,r,s,p1,p2,p3,q1,q2,q3,z2,z4,z6;
|
double t,w,p,q,c,r,s,p1,p2,p3,q1,q2,z2,z4,z6;
|
||||||
int32_t hx,ix;
|
int32_t hx,ix;
|
||||||
GET_HIGH_WORD(hx,x);
|
GET_HIGH_WORD(hx,x);
|
||||||
ix = hx&0x7fffffff;
|
ix = hx&0x7fffffff;
|
||||||
|
@ -16,11 +16,14 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <alloca.h>
|
||||||
#include <sys/poll.h>
|
#include <sys/poll.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
/* Poll the file descriptors described by the NFDS structures starting at
|
/* Poll the file descriptors described by the NFDS structures starting at
|
||||||
FDS. If TIMEOUT is nonzero and not -1, allow TIMEOUT milliseconds for
|
FDS. If TIMEOUT is nonzero and not -1, allow TIMEOUT milliseconds for
|
||||||
@ -34,25 +37,37 @@ __poll (fds, nfds, timeout)
|
|||||||
unsigned long int nfds;
|
unsigned long int nfds;
|
||||||
int timeout;
|
int timeout;
|
||||||
{
|
{
|
||||||
|
static int max_fd_size;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
fd_set rset, wset, xset;
|
fd_set *rset, *wset, *xset;
|
||||||
struct pollfd *f;
|
struct pollfd *f;
|
||||||
int ready;
|
int ready;
|
||||||
int maxfd = 0;
|
int maxfd = 0;
|
||||||
|
int bytes;
|
||||||
|
|
||||||
FD_ZERO (&rset);
|
if (!max_fd_size)
|
||||||
FD_ZERO (&wset);
|
max_fd_size = __getdtablesize ();
|
||||||
FD_ZERO (&xset);
|
|
||||||
|
bytes = howmany (max_fd_size, __NFDBITS);
|
||||||
|
rset = alloca (bytes);
|
||||||
|
wset = alloca (bytes);
|
||||||
|
xset = alloca (bytes);
|
||||||
|
|
||||||
|
/* We can't call FD_ZERO, since FD_ZERO only works with sets
|
||||||
|
of exactly __FD_SETSIZE size. */
|
||||||
|
__bzero (rset, bytes);
|
||||||
|
__bzero (wset, bytes);
|
||||||
|
__bzero (xset, bytes);
|
||||||
|
|
||||||
for (f = fds; f < &fds[nfds]; ++f)
|
for (f = fds; f < &fds[nfds]; ++f)
|
||||||
if (f->fd >= 0)
|
if (f->fd >= 0)
|
||||||
{
|
{
|
||||||
if (f->events & POLLIN)
|
if (f->events & POLLIN)
|
||||||
FD_SET (f->fd, &rset);
|
FD_SET (f->fd, rset);
|
||||||
if (f->events & POLLOUT)
|
if (f->events & POLLOUT)
|
||||||
FD_SET (f->fd, &wset);
|
FD_SET (f->fd, wset);
|
||||||
if (f->events & POLLPRI)
|
if (f->events & POLLPRI)
|
||||||
FD_SET (f->fd, &xset);
|
FD_SET (f->fd, xset);
|
||||||
if (f->fd > maxfd && (f->events & (POLLIN|POLLOUT|POLLPRI)))
|
if (f->fd > maxfd && (f->events & (POLLIN|POLLOUT|POLLPRI)))
|
||||||
maxfd = f->fd;
|
maxfd = f->fd;
|
||||||
}
|
}
|
||||||
@ -60,19 +75,18 @@ __poll (fds, nfds, timeout)
|
|||||||
tv.tv_sec = timeout / 1000;
|
tv.tv_sec = timeout / 1000;
|
||||||
tv.tv_usec = (timeout % 1000) * 1000;
|
tv.tv_usec = (timeout % 1000) * 1000;
|
||||||
|
|
||||||
ready = __select (maxfd + 1, &rset, &wset, &xset,
|
ready = __select (maxfd + 1, rset, wset, xset, timeout == -1 ? NULL : &tv);
|
||||||
timeout == -1 ? NULL : &tv);
|
|
||||||
if (ready > 0)
|
if (ready > 0)
|
||||||
for (f = fds; f < &fds[nfds]; ++f)
|
for (f = fds; f < &fds[nfds]; ++f)
|
||||||
{
|
{
|
||||||
f->revents = 0;
|
f->revents = 0;
|
||||||
if (f->fd >= 0)
|
if (f->fd >= 0)
|
||||||
{
|
{
|
||||||
if (FD_ISSET (f->fd, &rset))
|
if (FD_ISSET (f->fd, rset))
|
||||||
f->revents |= POLLIN;
|
f->revents |= POLLIN;
|
||||||
if (FD_ISSET (f->fd, &wset))
|
if (FD_ISSET (f->fd, wset))
|
||||||
f->revents |= POLLOUT;
|
f->revents |= POLLOUT;
|
||||||
if (FD_ISSET (f->fd, &xset))
|
if (FD_ISSET (f->fd, xset))
|
||||||
f->revents |= POLLPRI;
|
f->revents |= POLLPRI;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
bits/pthreadtypes.h
|
||||||
stdio_lim.h.in
|
stdio_lim.h.in
|
||||||
cmsg_nxthdr.c
|
cmsg_nxthdr.c
|
||||||
errlist.h
|
errlist.h
|
||||||
@ -74,3 +75,5 @@ sys/user.h
|
|||||||
sys/vt.h
|
sys/vt.h
|
||||||
xstatconv.c
|
xstatconv.c
|
||||||
getdents64.c
|
getdents64.c
|
||||||
|
__sendmsg.S
|
||||||
|
__recvmsg.S
|
||||||
|
@ -58,7 +58,7 @@ ifeq ($(subdir),socket)
|
|||||||
sysdep_headers += net/if.h net/if_ppp.h net/ppp-comp.h \
|
sysdep_headers += net/if.h net/if_ppp.h net/ppp-comp.h \
|
||||||
net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \
|
net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \
|
||||||
net/if_slip.h net/if_packet.h
|
net/if_slip.h net/if_packet.h
|
||||||
sysdep_routines += cmsg_nxthdr sa_len
|
sysdep_routines += cmsg_nxthdr sa_len __sendmsg __recvmsg
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(subdir),sunrpc)
|
ifeq ($(subdir),sunrpc)
|
||||||
@ -75,7 +75,7 @@ inhibit-siglist := yes
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(subdir),posix)
|
ifeq ($(subdir),posix)
|
||||||
headers := bits/pthreadtypes.h
|
sysdep_headers += bits/pthreadtypes.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(subdir),inet)
|
ifeq ($(subdir),inet)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#define socket recvmsg
|
#define socket __recvmsg
|
||||||
#define __socket __libc_recvmsg
|
#define __socket __libc_recvmsg
|
||||||
|
#define SOCKOP___recvmsg SOCKOP_recvmsg
|
||||||
#define NARGS 3
|
#define NARGS 3
|
||||||
#include <socket.S>
|
#include <socket.S>
|
||||||
weak_alias (__libc_recvmsg, __recvmsg)
|
|
@ -1,5 +1,5 @@
|
|||||||
#define socket sendmsg
|
#define socket __sendmsg
|
||||||
#define __socket __libc_sendmsg
|
#define __socket __libc_sendmsg
|
||||||
|
#define SOCKOP___sendmsg SOCKOP_sendmsg
|
||||||
#define NARGS 3
|
#define NARGS 3
|
||||||
#include <socket.S>
|
#include <socket.S>
|
||||||
weak_alias (__libc_sendmsg, __sendmsg)
|
|
@ -24,9 +24,6 @@
|
|||||||
|
|
||||||
extern int __syscall_rt_sigqueueinfo (int, int, siginfo_t *);
|
extern int __syscall_rt_sigqueueinfo (int, int, siginfo_t *);
|
||||||
|
|
||||||
/* This variable is 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
|
||||||
@ -40,10 +37,8 @@ __aio_sigqueue (sig, val)
|
|||||||
info.si_signo = sig;
|
info.si_signo = sig;
|
||||||
info.si_errno = 0;
|
info.si_errno = 0;
|
||||||
info.si_code = SI_ASYNCIO;
|
info.si_code = SI_ASYNCIO;
|
||||||
|
|
||||||
info.si_pid = getpid ();
|
info.si_pid = getpid ();
|
||||||
info.si_uid = getuid ();
|
info.si_uid = getuid ();
|
||||||
|
|
||||||
info.si_value = val;
|
info.si_value = val;
|
||||||
|
|
||||||
return __syscall_rt_sigqueueinfo (info.si_pid, sig, &info);
|
return __syscall_rt_sigqueueinfo (info.si_pid, sig, &info);
|
||||||
|
@ -57,6 +57,8 @@ extern int clone __P ((int (*__fn) (void *__arg), void *__child_stack,
|
|||||||
int __flags, void *__arg));
|
int __flags, void *__arg));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
#endif /* need schedparam */
|
#endif /* need schedparam */
|
||||||
|
|
||||||
#if !defined __defined_schedparam \
|
#if !defined __defined_schedparam \
|
||||||
@ -69,5 +71,3 @@ struct __sched_param
|
|||||||
};
|
};
|
||||||
# undef __need_schedparam
|
# undef __need_schedparam
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__END_DECLS
|
|
||||||
|
@ -222,12 +222,32 @@ __cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg)
|
|||||||
<linux/socket.h>. */
|
<linux/socket.h>. */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
SCM_RIGHTS = 0x01, /* Data array contains access rights. */
|
SCM_RIGHTS = 0x01, /* Transfer file descriptors. */
|
||||||
#define SCM_RIGHTS SCM_RIGHTS
|
#define SCM_RIGHTS SCM_RIGHTS
|
||||||
__SCM_CREDENTIALS = 0x02, /* Data array is `struct ucred'. */
|
#ifdef __USE_BSD
|
||||||
__SCM_CONNECT = 0x03 /* Data array is `struct scm_connect'. */
|
SCM_CREDS = 0x02, /* BSD-compatible credentials passing. */
|
||||||
|
# define SCM_CREDS SCM_CREDS
|
||||||
|
#endif
|
||||||
|
__SCM_CONNECT = 0x03, /* Data array is `struct scm_connect'. */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef __USE_BSD
|
||||||
|
|
||||||
|
/* User visible structure for SCM_CREDS message
|
||||||
|
(chosen for BSD source compatibility) */
|
||||||
|
|
||||||
|
# define CMGROUP_MAX 16 /* Linux does not provide this info, so it doesn't
|
||||||
|
matter... use what bsd does. */
|
||||||
|
struct cmsgcred
|
||||||
|
{
|
||||||
|
pid_t cmcred_pid; /* PID of sending process. */
|
||||||
|
uid_t cmcred_uid; /* Real UID of sending process. */
|
||||||
|
uid_t cmcred_euid; /* Effective UID of sending process. */
|
||||||
|
gid_t cmcred_gid; /* Real GID of sending process. */
|
||||||
|
short int cmcred_ngroups; /* Number or groups. */
|
||||||
|
gid_t cmcred_groups[CMGROUP_MAX]; /* Groups. */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Get socket manipulation related informations from kernel headers. */
|
/* Get socket manipulation related informations from kernel headers. */
|
||||||
#include <asm/socket.h>
|
#include <asm/socket.h>
|
||||||
|
93
sysdeps/unix/sysv/linux/recvmsg.c
Normal file
93
sysdeps/unix/sysv/linux/recvmsg.c
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/* Copyright (C) 1998 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <asm/posix_types.h>
|
||||||
|
|
||||||
|
/* The kernel expects this structure in SCM_CREDS messages.
|
||||||
|
* Note: sizeof(struct __kernel_ucred) <= sizeof(struct cmsgcred) must hold.
|
||||||
|
*/
|
||||||
|
struct __kernel_ucred
|
||||||
|
{
|
||||||
|
__kernel_pid_t pid;
|
||||||
|
__kernel_uid_t uid;
|
||||||
|
__kernel_gid_t gid;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int __recvmsg (int, struct msghdr *, int);
|
||||||
|
|
||||||
|
int
|
||||||
|
recvmsg (fd, message, flags)
|
||||||
|
int fd;
|
||||||
|
struct msghdr *message;
|
||||||
|
int flags;
|
||||||
|
{
|
||||||
|
struct cmsghdr *cm;
|
||||||
|
int ret;
|
||||||
|
int found_creds = 0;
|
||||||
|
|
||||||
|
/* Must check for space first. */
|
||||||
|
cm = CMSG_FIRSTHDR (message);
|
||||||
|
while (cm)
|
||||||
|
{
|
||||||
|
if (cm->cmsg_type == SCM_CREDS)
|
||||||
|
{
|
||||||
|
if (cm->cmsg_len < CMSG_SPACE (sizeof (struct cmsgcred)))
|
||||||
|
{
|
||||||
|
__set_errno (EINVAL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
found_creds = 1;
|
||||||
|
}
|
||||||
|
cm = CMSG_NXTHDR (message, cm);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ret = __recvmsg (fd, message, flags);
|
||||||
|
|
||||||
|
if (ret == -1)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* Postprocess the message control block for SCM_CREDS. */
|
||||||
|
cm = CMSG_FIRSTHDR (message);
|
||||||
|
if (found_creds)
|
||||||
|
while (cm)
|
||||||
|
{
|
||||||
|
if (cm->cmsg_type == SCM_CREDS)
|
||||||
|
{
|
||||||
|
struct cmsgcred *c = (struct cmsgcred *) CMSG_DATA (cm);
|
||||||
|
struct __kernel_ucred u;
|
||||||
|
int i;
|
||||||
|
memcpy (&u, CMSG_DATA (cm), sizeof (struct __kernel_ucred));
|
||||||
|
|
||||||
|
c->cmcred_pid = u.pid;
|
||||||
|
c->cmcred_uid = u.uid;
|
||||||
|
c->cmcred_gid = u.gid;
|
||||||
|
|
||||||
|
c->cmcred_euid = -1;
|
||||||
|
c->cmcred_ngroups = 0;
|
||||||
|
for (i = 0; i < CMGROUP_MAX; i++)
|
||||||
|
c->cmcred_groups[i] = -1;
|
||||||
|
}
|
||||||
|
cm = CMSG_NXTHDR (message, cm);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
91
sysdeps/unix/sysv/linux/sendmsg.c
Normal file
91
sysdeps/unix/sysv/linux/sendmsg.c
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/* Copyright (C) 1998 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <asm/posix_types.h>
|
||||||
|
|
||||||
|
/* The kernel expects this structure in SCM_CREDS messages.
|
||||||
|
* Note: sizeof(struct __kernel_ucred) <= sizeof(struct cmsgcred) must hold.
|
||||||
|
*/
|
||||||
|
struct __kernel_ucred
|
||||||
|
{
|
||||||
|
__kernel_pid_t pid;
|
||||||
|
__kernel_uid_t uid;
|
||||||
|
__kernel_gid_t gid;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int __sendmsg (int, const struct msghdr *, int);
|
||||||
|
|
||||||
|
/* Send a message described by MESSAGE on socket FD.
|
||||||
|
Returns the number of bytes sent, or -1 for errors. */
|
||||||
|
int
|
||||||
|
sendmsg (fd, message, flags)
|
||||||
|
int fd;
|
||||||
|
const struct msghdr *message;
|
||||||
|
int flags;
|
||||||
|
{
|
||||||
|
struct cmsghdr *cm;
|
||||||
|
struct cmsgcred *cc;
|
||||||
|
struct __kernel_ucred *u;
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
/* Preprocess the message control block for SCM_CREDS. */
|
||||||
|
cm = CMSG_FIRSTHDR (message);
|
||||||
|
while (cm)
|
||||||
|
{
|
||||||
|
if (cm->cmsg_type == SCM_CREDS)
|
||||||
|
{
|
||||||
|
if (cm->cmsg_len < CMSG_SPACE (sizeof (struct cmsgcred)))
|
||||||
|
{
|
||||||
|
__set_errno (EINVAL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
u = (struct __kernel_ucred *) CMSG_DATA (cm);
|
||||||
|
cc = (struct cmsgcred *) CMSG_DATA (cm);
|
||||||
|
/* Linux expects the calling process to pass in
|
||||||
|
its credentials, and sanity checks them.
|
||||||
|
You can send real, effective, or set- uid and gid.
|
||||||
|
If the user hasn't filled in the buffer, we default to
|
||||||
|
real uid and gid. */
|
||||||
|
pid = getpid ();
|
||||||
|
if (cc->cmcred_pid != pid)
|
||||||
|
{
|
||||||
|
u->pid = pid;
|
||||||
|
u->uid = getuid ();
|
||||||
|
u->gid = getgid ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct __kernel_ucred v;
|
||||||
|
v.pid = cc->cmcred_pid;
|
||||||
|
v.uid = cc->cmcred_uid;
|
||||||
|
v.gid = cc->cmcred_gid;
|
||||||
|
u->pid = v.pid;
|
||||||
|
u->uid = v.uid;
|
||||||
|
u->gid = v.gid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cm = CMSG_NXTHDR ((struct msghdr *) message, cm);
|
||||||
|
}
|
||||||
|
|
||||||
|
return __sendmsg (fd, message, flags);
|
||||||
|
}
|
@ -60,6 +60,7 @@ static size_t num_leaps;
|
|||||||
static struct leap *leaps = NULL;
|
static struct leap *leaps = NULL;
|
||||||
|
|
||||||
#include <endian.h>
|
#include <endian.h>
|
||||||
|
#include <byteswap.h>
|
||||||
|
|
||||||
/* Decode the four bytes at PTR as a signed integer in network byte order. */
|
/* Decode the four bytes at PTR as a signed integer in network byte order. */
|
||||||
static inline int
|
static inline int
|
||||||
@ -67,6 +68,8 @@ decode (const void *ptr)
|
|||||||
{
|
{
|
||||||
if ((BYTE_ORDER == BIG_ENDIAN) && sizeof (int) == 4)
|
if ((BYTE_ORDER == BIG_ENDIAN) && sizeof (int) == 4)
|
||||||
return *(const int *) ptr;
|
return *(const int *) ptr;
|
||||||
|
else if (BYTE_ORDER == LITTLE_ENDIAN && sizeof (int) == 4)
|
||||||
|
return bswap_32 (*(const int *) ptr);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const unsigned char *p = ptr;
|
const unsigned char *p = ptr;
|
||||||
@ -157,7 +160,7 @@ __tzfile_read (const char *file)
|
|||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (fread ((void *) &tzhead, sizeof (tzhead), 1, f) != 1)
|
if (fread_unlocked ((void *) &tzhead, sizeof (tzhead), 1, f) != 1)
|
||||||
goto lose;
|
goto lose;
|
||||||
|
|
||||||
num_transitions = (size_t) decode (tzhead.tzh_timecnt);
|
num_transitions = (size_t) decode (tzhead.tzh_timecnt);
|
||||||
@ -198,8 +201,8 @@ __tzfile_read (const char *file)
|
|||||||
if (sizeof (time_t) < 4)
|
if (sizeof (time_t) < 4)
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
if (fread(transitions, 4, num_transitions, f) != num_transitions ||
|
if (fread_unlocked (transitions, 4, num_transitions, f) != num_transitions
|
||||||
fread(type_idxs, 1, num_transitions, f) != num_transitions)
|
|| fread_unlocked (type_idxs, 1, num_transitions, f) != num_transitions)
|
||||||
goto lose;
|
goto lose;
|
||||||
|
|
||||||
/* Check for bogus indices in the data file, so we can hereafter
|
/* Check for bogus indices in the data file, so we can hereafter
|
||||||
@ -222,32 +225,32 @@ __tzfile_read (const char *file)
|
|||||||
for (i = 0; i < num_types; ++i)
|
for (i = 0; i < num_types; ++i)
|
||||||
{
|
{
|
||||||
unsigned char x[4];
|
unsigned char x[4];
|
||||||
if (fread (x, 1, 4, f) != 4 ||
|
if (fread_unlocked (x, 1, 4, f) != 4
|
||||||
fread (&types[i].isdst, 1, 1, f) != 1 ||
|
|| fread_unlocked (&types[i].isdst, 1, 1, f) != 1
|
||||||
fread (&types[i].idx, 1, 1, f) != 1)
|
|| fread_unlocked (&types[i].idx, 1, 1, f) != 1)
|
||||||
goto lose;
|
goto lose;
|
||||||
if (types[i].idx >= chars) /* Bogus index in data file. */
|
if (types[i].idx >= chars) /* Bogus index in data file. */
|
||||||
goto lose;
|
goto lose;
|
||||||
types[i].offset = (long int) decode (x);
|
types[i].offset = (long int) decode (x);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fread (zone_names, 1, chars, f) != chars)
|
if (fread_unlocked (zone_names, 1, chars, f) != chars)
|
||||||
goto lose;
|
goto lose;
|
||||||
|
|
||||||
for (i = 0; i < num_leaps; ++i)
|
for (i = 0; i < num_leaps; ++i)
|
||||||
{
|
{
|
||||||
unsigned char x[4];
|
unsigned char x[4];
|
||||||
if (fread (x, 1, sizeof (x), f) != sizeof (x))
|
if (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x))
|
||||||
goto lose;
|
goto lose;
|
||||||
leaps[i].transition = (time_t) decode (x);
|
leaps[i].transition = (time_t) decode (x);
|
||||||
if (fread (x, 1, sizeof (x), f) != sizeof (x))
|
if (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x))
|
||||||
goto lose;
|
goto lose;
|
||||||
leaps[i].change = (long int) decode (x);
|
leaps[i].change = (long int) decode (x);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < num_isstd; ++i)
|
for (i = 0; i < num_isstd; ++i)
|
||||||
{
|
{
|
||||||
int c = getc (f);
|
int c = getc_unlocked (f);
|
||||||
if (c == EOF)
|
if (c == EOF)
|
||||||
goto lose;
|
goto lose;
|
||||||
types[i].isstd = c != 0;
|
types[i].isstd = c != 0;
|
||||||
@ -257,7 +260,7 @@ __tzfile_read (const char *file)
|
|||||||
|
|
||||||
for (i = 0; i < num_isgmt; ++i)
|
for (i = 0; i < num_isgmt; ++i)
|
||||||
{
|
{
|
||||||
int c = getc (f);
|
int c = getc_unlocked (f);
|
||||||
if (c == EOF)
|
if (c == EOF)
|
||||||
goto lose;
|
goto lose;
|
||||||
types[i].isgmt = c != 0;
|
types[i].isgmt = c != 0;
|
||||||
@ -271,8 +274,7 @@ __tzfile_read (const char *file)
|
|||||||
We choose the offsets in the types of each flavor that are
|
We choose the offsets in the types of each flavor that are
|
||||||
transitioned to earliest in time. */
|
transitioned to earliest in time. */
|
||||||
__tzname[1] = NULL;
|
__tzname[1] = NULL;
|
||||||
for (i = 0; i < num_types && i < sizeof (__tzname) / sizeof (__tzname[0]);
|
for (i = 0; i < num_types; ++i)
|
||||||
++i)
|
|
||||||
__tzname[types[i].isdst] = __tzstring (&zone_names[types[i].idx]);
|
__tzname[types[i].isdst] = __tzstring (&zone_names[types[i].idx]);
|
||||||
if (__tzname[1] == NULL)
|
if (__tzname[1] == NULL)
|
||||||
__tzname[1] = __tzname[0];
|
__tzname[1] = __tzname[0];
|
||||||
@ -296,8 +298,8 @@ __tzfile_read (const char *file)
|
|||||||
__use_tzfile = 1;
|
__use_tzfile = 1;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
lose:;
|
lose:
|
||||||
fclose(f);
|
fclose (f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The user specified a hand-made timezone, but not its DST rules.
|
/* The user specified a hand-made timezone, but not its DST rules.
|
||||||
@ -425,10 +427,8 @@ __tzfile_compute (time_t timer, int use_localtime,
|
|||||||
__daylight = rule_stdoff != rule_dstoff;
|
__daylight = rule_stdoff != rule_dstoff;
|
||||||
__timezone = -rule_stdoff;
|
__timezone = -rule_stdoff;
|
||||||
__tzname[1] = NULL;
|
__tzname[1] = NULL;
|
||||||
for (i = 0;
|
for (i = 0; i < num_types; ++i)
|
||||||
i < num_types && i < sizeof (__tzname) / sizeof (__tzname[0]);
|
__tzname[types[i].isdst] = __tzstring (&zone_names[types[i].idx]);
|
||||||
++i)
|
|
||||||
__tzname[types[i].isdst] = &zone_names[types[i].idx];
|
|
||||||
if (__tzname[1] == NULL)
|
if (__tzname[1] == NULL)
|
||||||
/* There is no daylight saving time. */
|
/* There is no daylight saving time. */
|
||||||
__tzname[1] = __tzname[0];
|
__tzname[1] = __tzname[0];
|
||||||
@ -455,9 +455,9 @@ __tzfile_compute (time_t timer, int use_localtime,
|
|||||||
leaps[i].change > leaps[i - 1].change))
|
leaps[i].change > leaps[i - 1].change))
|
||||||
{
|
{
|
||||||
*leap_hit = 1;
|
*leap_hit = 1;
|
||||||
while (i > 0 &&
|
while (i > 0
|
||||||
leaps[i].transition == leaps[i - 1].transition + 1 &&
|
&& leaps[i].transition == leaps[i - 1].transition + 1
|
||||||
leaps[i].change == leaps[i - 1].change + 1)
|
&& leaps[i].change == leaps[i - 1].change + 1)
|
||||||
{
|
{
|
||||||
++*leap_hit;
|
++*leap_hit;
|
||||||
--i;
|
--i;
|
||||||
@ -483,5 +483,6 @@ compute_tzname_max (size_t chars)
|
|||||||
++p;
|
++p;
|
||||||
if ((size_t) (p - start) > __tzname_cur_max)
|
if ((size_t) (p - start) > __tzname_cur_max)
|
||||||
__tzname_cur_max = p - start;
|
__tzname_cur_max = p - start;
|
||||||
} while (++p < &zone_names[chars]);
|
}
|
||||||
|
while (++p < &zone_names[chars]);
|
||||||
}
|
}
|
||||||
|
@ -115,7 +115,7 @@ char *
|
|||||||
__tzstring (string)
|
__tzstring (string)
|
||||||
const char *string;
|
const char *string;
|
||||||
{
|
{
|
||||||
struct tzstring_head *h = &tzstring_list.head;
|
struct tzstring_head *h;
|
||||||
size_t needed;
|
size_t needed;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
@ -139,7 +139,8 @@ __tzstring (string)
|
|||||||
size_t buffer_size = tzstring_last_buffer_size;
|
size_t buffer_size = tzstring_last_buffer_size;
|
||||||
while ((buffer_size *= 2) < needed)
|
while ((buffer_size *= 2) < needed)
|
||||||
continue;
|
continue;
|
||||||
if (! (h = h->next = malloc (sizeof *h + buffer_size)))
|
h = malloc (sizeof *h + buffer_size);
|
||||||
|
if (h == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
h->next = NULL;
|
h->next = NULL;
|
||||||
tzstring_last_buffer_size = buffer_size;
|
tzstring_last_buffer_size = buffer_size;
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
int failed = 0;
|
int failed = 0;
|
||||||
@ -29,14 +30,16 @@ struct test_times
|
|||||||
const char *name;
|
const char *name;
|
||||||
int daylight;
|
int daylight;
|
||||||
int timezone;
|
int timezone;
|
||||||
|
const char *tzname[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct test_times tests[] =
|
static const struct test_times tests[] =
|
||||||
{
|
{
|
||||||
{ "Europe/Berlin", 1, -3600 },
|
{ "Europe/Berlin", 1, -3600, { "CET", "CEST" }},
|
||||||
{ "Universal", 0, 0 },
|
{ "Universal", 0, 0, {"UTC", "UTC" }},
|
||||||
{ "Australia/Melbourne", 1, -36000 },
|
{ "Australia/Melbourne", 1, -36000, { "EST", "EST" }},
|
||||||
{ "America/Sao_Paulo", 1, 10800 },
|
{ "America/Sao_Paulo", 1, 10800, {"EST", "EDT" }},
|
||||||
|
{ "America/Los_Angeles", 1, 28800, {"PST", "PDT" }},
|
||||||
{ NULL, 0, 0 }
|
{ NULL, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -52,8 +55,10 @@ print_tzvars (void)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
check_tzvars (const char *name, int dayl, int timez)
|
check_tzvars (const char *name, int dayl, int timez, const char *const tznam[])
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
if (daylight != dayl)
|
if (daylight != dayl)
|
||||||
{
|
{
|
||||||
printf ("Timezone: %s, daylight is: %d but should be: %d\n",
|
printf ("Timezone: %s, daylight is: %d but should be: %d\n",
|
||||||
@ -66,6 +71,13 @@ check_tzvars (const char *name, int dayl, int timez)
|
|||||||
name, timezone, timez);
|
name, timezone, timez);
|
||||||
++failed;
|
++failed;
|
||||||
}
|
}
|
||||||
|
for (i = 0; i <= 1; ++i)
|
||||||
|
if (strcmp (tzname[i], tznam[i]) != 0)
|
||||||
|
{
|
||||||
|
printf ("Timezone: %s, tzname[%d] is: %s but should be: %s\n",
|
||||||
|
name, i, tzname[i], tznam[i]);
|
||||||
|
++failed;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -92,12 +104,12 @@ main (int argc, char ** argv)
|
|||||||
}
|
}
|
||||||
tzset ();
|
tzset ();
|
||||||
print_tzvars ();
|
print_tzvars ();
|
||||||
check_tzvars (pt->name, pt->daylight, pt->timezone);
|
check_tzvars (pt->name, pt->daylight, pt->timezone, pt->tzname);
|
||||||
|
|
||||||
/* calling localtime shouldn't make a difference */
|
/* calling localtime shouldn't make a difference */
|
||||||
localtime (&t);
|
localtime (&t);
|
||||||
print_tzvars ();
|
print_tzvars ();
|
||||||
check_tzvars (pt->name, pt->daylight, pt->timezone);
|
check_tzvars (pt->name, pt->daylight, pt->timezone, pt->tzname);
|
||||||
}
|
}
|
||||||
|
|
||||||
return failed ? EXIT_FAILURE : EXIT_SUCCESS;
|
return failed ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||||
|
@ -14,6 +14,9 @@ libc {
|
|||||||
wctrans; wctype; wcwidth;
|
wctrans; wctype; wcwidth;
|
||||||
}
|
}
|
||||||
GLIBC_2.1 {
|
GLIBC_2.1 {
|
||||||
|
# functions used in inline functions or macros
|
||||||
|
__towctrans;
|
||||||
|
|
||||||
# i*
|
# i*
|
||||||
iswblank;
|
iswblank;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user