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:
Ulrich Drepper 1998-07-04 10:39:13 +00:00
parent 6ef9f70bdb
commit ba9234d947
48 changed files with 855 additions and 138 deletions

142
ChangeLog
View File

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

View 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

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

View File

@ -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]);
} }

View File

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

View File

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

View File

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