Update.
authorUlrich Drepper <drepper@redhat.com>
Sat, 4 Jul 1998 10:39:13 +0000 (10:39 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 4 Jul 1998 10:39:13 +0000 (10:39 +0000)
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>

48 files changed:
ChangeLog
Makerules
assert/Makefile
assert/test-assert-perr.c [new file with mode: 0644]
assert/test-assert.c [new file with mode: 0644]
elf/sprof.c
grp/initgroups.c
libio/Makefile
libio/Versions
libio/iofread_u.c [new file with mode: 0644]
libio/iofwrite.c
libio/iofwrite_u.c [new file with mode: 0644]
linuxthreads/ChangeLog
linuxthreads/attr.c
localedata/charmaps/ISO-8859-9
nis/nis_add.c
nis/nis_checkpoint.c
nis/nis_modify.c
nscd/grpcache.c
nscd/nscd.c
nscd/pwdcache.c
posix/Makefile
posix/regex.c
posix/runptests.c
stdio-common/bug1.c
stdio-common/bug5.c
stdio-common/printf.h
stdio-common/test_rdwr.c
stdio-common/tstgetln.c
string/tst-strlen.c
sysdeps/generic/fstatvfs64.c
sysdeps/generic/statvfs64.c
sysdeps/libm-ieee754/e_acos.c
sysdeps/libm-ieee754/e_asin.c
sysdeps/unix/bsd/poll.c
sysdeps/unix/sysv/linux/Dist
sysdeps/unix/sysv/linux/Makefile
sysdeps/unix/sysv/linux/__recvmsg.S [moved from sysdeps/unix/sysv/linux/recvmsg.S with 51% similarity]
sysdeps/unix/sysv/linux/__sendmsg.S [moved from sysdeps/unix/sysv/linux/sendmsg.S with 51% similarity]
sysdeps/unix/sysv/linux/aio_sigqueue.c
sysdeps/unix/sysv/linux/bits/sched.h
sysdeps/unix/sysv/linux/bits/socket.h
sysdeps/unix/sysv/linux/recvmsg.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sendmsg.c [new file with mode: 0644]
time/tzfile.c
time/tzset.c
timezone/tst-timezone.c
wctype/Versions

index 02d6720..1c65987 100644 (file)
--- a/ChangeLog
+++ b/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.
 
index 72caf60..998f866 100644 (file)
--- a/Makerules
+++ b/Makerules
@@ -345,7 +345,8 @@ $(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS)  \
          $(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
          -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
          -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)
 endef
 
index 5780457..63fb925 100644 (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.
 
 # The GNU C Library is free software; you can redistribute it and/or
@@ -23,5 +23,6 @@ subdir        := assert
 headers        := assert.h
 
 routines := assert assert-perr
+tests := test-assert test-assert-perr
 
 include ../Rules
diff --git a/assert/test-assert-perr.c b/assert/test-assert-perr.c
new file mode 100644 (file)
index 0000000..824c1a9
--- /dev/null
@@ -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;
+}
diff --git a/assert/test-assert.c b/assert/test-assert.c
new file mode 100644 (file)
index 0000000..045721e
--- /dev/null
@@ -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;
+}
index f54a616..c6a9b30 100644 (file)
@@ -449,7 +449,7 @@ load_shobj (const char *name)
   else
     log_hashfraction = -1;
   if (do_test)
-    printf ("hashfraction = %d\ndivider = %d\n",
+    printf ("hashfraction = %d\ndivider = %Zu\n",
            result->hashfraction,
            result->hashfraction * sizeof (struct here_fromstruct));
   result->tossize = textsize / HASHFRACTION;
@@ -1197,7 +1197,7 @@ generate_call_graph (struct profdata *profdata)
          }
 
        /* 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",
                7 - n, " ",
                total_ticks ? (100.0 * sortsym[cnt]->ticks) / total_ticks : 0,
index f42c92d..454882e 100644 (file)
@@ -59,12 +59,18 @@ compat_call (service_user *nip, const char *user, gid_t group, long int *start,
   get_function getgrent_fct;
   end_function endgrent_fct;
 
+  getgrent_fct = __nss_lookup_function (nip, "getgrent_r");
+  if (getgrent_fct == NULL)
+    return NSS_STATUS_UNAVAIL;
+
   setgrent_fct = __nss_lookup_function (nip, "setgrent");
-  status = _CALL_DL_FCT (setgrent_fct, ());
-  if (status != NSS_STATUS_SUCCESS)
-    return status;
+  if (setgrent_fct)
+    {
+      status = _CALL_DL_FCT (setgrent_fct, ());
+      if (status != NSS_STATUS_SUCCESS)
+       return status;
+    }
 
-  getgrent_fct = __nss_lookup_function (nip, "getgrent_r");
   endgrent_fct = __nss_lookup_function (nip, "endgrent");
 
   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);
 
  done:
-  _CALL_DL_FCT (endgrent_fct, ());
+  if (endgrent_fct)
+    _CALL_DL_FCT (endgrent_fct, ());
 
   return NSS_STATUS_SUCCESS;
 }
index 61bd54f..3c75183 100644 (file)
@@ -34,7 +34,7 @@ routines      :=                                                            \
        clearerr feof ferror fgetc fileno fputc freopen fseek getc getchar    \
        memstream pclose putc putchar rewind setbuf setlinebuf vasprintf      \
        iovdprintf vscanf vsnprintf obprintf fcloseall fseeko ftello          \
-       freopen64 fseeko64 ftello64                                           \
+       freopen64 fseeko64 ftello64 iofread_u iofwrite_u                      \
                                                                              \
        libc_fatal
 
index ea58a29..12277ae 100644 (file)
@@ -98,6 +98,6 @@ libc {
 
     # f*
     fgetpos64; fopen64; freopen64; fseeko; fseeko64; fsetpos64; ftello;
-    ftello64; fopen; fclose; fdopen;
+    ftello64; fopen; fclose; fdopen; fread_unlocked; fwrite_unlocked;
   }
 }
diff --git a/libio/iofread_u.c b/libio/iofread_u.c
new file mode 100644 (file)
index 0000000..bd7ceaf
--- /dev/null
@@ -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;
+}
index 0f82797..d163d29 100644 (file)
@@ -35,15 +35,15 @@ _IO_fwrite (buf, size, count, 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 0;
+    return count;
   _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
   _IO_flockfile (fp);
   written = _IO_sputn (fp, (const char *) buf, request);
   _IO_funlockfile (fp);
   _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)
     return count;
   else
diff --git a/libio/iofwrite_u.c b/libio/iofwrite_u.c
new file mode 100644 (file)
index 0000000..7d1d24b
--- /dev/null
@@ -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;
+}
index 0852500..9619ae4 100644 (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>
 
        * attr.c: Include errno.h.  Use memcpy to copy sched_param.
index cdd27d6..b561003 100644 (file)
@@ -15,6 +15,7 @@
 /* Handling of thread attributes */
 
 #include <errno.h>
+#include <string.h>
 #include <unistd.h>
 #include <sys/param.h>
 #include "pthread.h"
index 43fd5f6..12455ec 100644 (file)
@@ -245,12 +245,12 @@ CHARMAP
 <c,>                   /xE7   <U00E7> LATIN SMALL LETTER C WITH CEDILLA
 <e!>                   /xE8   <U00E8> LATIN SMALL LETTER E WITH GRAVE
 <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.>                   /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/>>                  /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
 <n?>                   /xF1   <U00F1> LATIN SMALL LETTER N WITH TILDE
 <o!>                   /xF2   <U00F2> LATIN SMALL LETTER O WITH GRAVE
index 10b46af..9618ad8 100644 (file)
@@ -17,6 +17,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <string.h>
 #include <rpcsvc/nis.h>
 
 #include "nis_xdr.h"
index 585214a..f1e860f 100644 (file)
@@ -17,6 +17,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA. */
 
+#include <string.h>
 #include <rpcsvc/nis.h>
 
 #include "nis_xdr.h"
index 57efe82..a1bcd7f 100644 (file)
@@ -17,6 +17,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <string.h>
 #include <rpcsvc/nis.h>
 
 #include "nis_xdr.h"
index 3f3f4ba..2806ddd 100644 (file)
@@ -22,6 +22,7 @@
 #include <pthread.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 #include <rpcsvc/nis.h>
 #include <sys/types.h>
 
@@ -48,7 +49,7 @@ typedef struct grphash grphash;
 struct gidhash
 {
   struct gidhash *next;
-  struct grphash *grptr;
+  struct group *grptr;
 };
 typedef struct gidhash gidhash;
 
@@ -176,6 +177,7 @@ static int
 add_cache (struct group *grp)
 {
   grphash *work;
+  gidhash *gidwork;
   unsigned long int hash = __nis_hash (grp->gr_name,
                                       strlen (grp->gr_name)) % modulo;
 
@@ -197,7 +199,17 @@ add_cache (struct group *grp)
     }
 
   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;
 }
@@ -231,8 +243,8 @@ cache_search_gid (gid_t gid)
 
   while (work->grptr != NULL)
     {
-      if (work->grptr->grp->gr_gid == gid)
-       return work->grptr->grp;
+      if (work->grptr->gr_gid == gid)
+       return work->grptr;
       if (work->next != NULL)
        work = work->next;
       else
@@ -475,7 +487,7 @@ cache_getgrgid (void *v_param)
   return NULL;
 }
 
-void *
+static void *
 grptable_update (void *v)
 {
   time_t now;
@@ -509,7 +521,7 @@ grptable_update (void *v)
 
                  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)
                            dbg_log (_("Give gid for \"%s\" free"),
@@ -543,14 +555,14 @@ grptable_update (void *v)
            }
        }
       if (debug_flag > 2)
-       dbg_log (_("(pwdtable_update) Release wait lock\n"));
+       dbg_log (_("(grptable_update) Release wait lock"));
       pthread_rwlock_unlock (&grplock);
       sleep (20);
     }
   return NULL;
 }
 
-void *
+static void *
 negtable_update (void *v)
 {
   time_t now;
@@ -561,12 +573,12 @@ negtable_update (void *v)
   while (!do_shutdown)
     {
       if (debug_flag > 2)
-       dbg_log (_("(negtable_update) Wait for write lock!"));
+       dbg_log (_("(neggrptable_update) Wait for write lock!"));
 
       pthread_rwlock_wrlock (&neglock);
 
       if (debug_flag > 2)
-       dbg_log (_("(negtable_update) Have write lock"));
+       dbg_log (_("(neggrptable_update) Have write lock"));
 
       time (&now);
       for (i = 0; i < modulo; ++i)
@@ -597,7 +609,7 @@ negtable_update (void *v)
            }
        }
       if (debug_flag > 2)
-       dbg_log (_("(negtable_update) Release wait lock"));
+       dbg_log (_("(neggrptable_update) Release wait lock"));
       pthread_rwlock_unlock (&neglock);
       sleep (10);
     }
index 9f167d2..e1c6367 100644 (file)
@@ -309,7 +309,7 @@ write_pid (const char *file)
 typedef int (*pwbyname_function) (const char *name, struct passwd *pw,
                                   char *buffer, size_t buflen);
 
-/* Hanlde incoming requests.  */
+/* Handle incoming requests.  */
 static
 void handle_requests (void)
 {
@@ -317,6 +317,12 @@ void handle_requests (void)
   int conn; /* Handle on which connection (client) the request came from.  */
   int done = 0;
   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)
     {
@@ -331,15 +337,23 @@ void handle_requests (void)
          {
            param_t *param = malloc (sizeof (param_t));
            pthread_t thread;
+           int status;
 
            if (debug_flag)
              dbg_log ("\tGETPWBYNAME (%s)", key);
            param->key = key;
            param->conn = conn;
            if (disabled_passwd)
-             pthread_create (&thread, NULL, cache_pw_disabled, (void *)param);
+             status = pthread_create (&thread, &th_attr, cache_pw_disabled,
+                                      (void *)param);
            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);
          }
          break;
@@ -347,48 +361,69 @@ void handle_requests (void)
          {
            param_t *param = malloc (sizeof (param_t));
            pthread_t thread;
+           int status;
 
            if (debug_flag)
              dbg_log ("\tGETPWBYUID (%s)", key);
            param->key = key;
            param->conn = conn;
            if (disabled_passwd)
-             pthread_create (&thread, NULL, cache_pw_disabled, (void *)param);
+             status = pthread_create (&thread, &th_attr, cache_pw_disabled,
+                             (void *)param);
            else
-             pthread_create (&thread, NULL, cache_getpwuid, (void *)param);
-           pthread_detach (thread);
+             status = pthread_create (&thread, &th_attr, cache_getpwuid,
+                                      (void *)param);
+           if (status != 0)
+             {
+               dbg_log (_("Creation of thread failed: %s"), strerror (errno));
+               close_socket (conn);
+             }
          }
          break;
        case GETGRBYNAME:
          {
            param_t *param = malloc (sizeof (param_t));
            pthread_t thread;
+           int status;
 
            if (debug_flag)
              dbg_log ("\tGETGRBYNAME (%s)", key);
            param->key = key;
            param->conn = conn;
            if (disabled_group)
-             pthread_create (&thread, NULL, cache_gr_disabled, (void *)param);
+             status = pthread_create (&thread, &th_attr, cache_gr_disabled,
+                                      (void *)param);
            else
-             pthread_create (&thread, NULL, cache_getgrnam, (void *)param);
-           pthread_detach (thread);
+             status = pthread_create (&thread, &th_attr, cache_getgrnam,
+                                      (void *)param);
+           if (status != 0)
+             {
+               dbg_log (_("Creation of thread failed: %s"), strerror (errno));
+               close_socket (conn);
+             }
          }
          break;
        case GETGRBYGID:
          {
            param_t *param = malloc (sizeof (param_t));
            pthread_t thread;
+           int status;
 
            if (debug_flag)
              dbg_log ("\tGETGRBYGID (%s)", key);
            param->key = key;
            param->conn = conn;
            if (disabled_group)
-             pthread_create (&thread, NULL, cache_gr_disabled, (void *)param);
+             status = pthread_create (&thread, &th_attr, cache_gr_disabled,
+                                      (void *)param);
            else
-             pthread_create (&thread, NULL, cache_getgrgid, (void *)param);
-           pthread_detach (thread);
+             status = pthread_create (&thread, &th_attr, cache_getgrgid,
+                                      (void *)param);
+           if (status != 0)
+             {
+               dbg_log (_("Creation of thread failed: %s"), strerror (errno));
+               close_socket (conn);
+             }
          }
          break;
        case GETHOSTBYNAME:
@@ -432,4 +467,6 @@ void handle_requests (void)
          break;
        }
     }
+
+  pthread_attr_destroy (&th_attr);
 }
index 721e77b..e2bf73a 100644 (file)
@@ -22,6 +22,7 @@
 #include <pthread.h>
 #include <pwd.h>
 #include <string.h>
+#include <unistd.h>
 #include <rpcsvc/nis.h>
 #include <sys/types.h>
 
@@ -48,7 +49,7 @@ typedef struct pwdhash pwdhash;
 struct uidhash
 {
   struct uidhash *next;
-  struct pwdhash *pwptr;
+  struct passwd *pwptr;
 };
 typedef struct uidhash uidhash;
 
@@ -159,6 +160,7 @@ static int
 add_cache (struct passwd *pwd)
 {
   pwdhash *work;
+  uidhash *uidwork;
   unsigned long int hash = __nis_hash (pwd->pw_name,
                                       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 */
   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;
 }
 
@@ -214,8 +225,8 @@ cache_search_uid (uid_t uid)
 
   while (work->pwptr != NULL)
     {
-      if (work->pwptr->pwd->pw_uid == uid)
-       return work->pwptr->pwd;
+      if (work->pwptr->pw_uid == uid)
+       return work->pwptr;
       if (work->next != NULL)
        work = work->next;
       else
@@ -458,7 +469,7 @@ cache_getpwuid (void *v_param)
   return NULL;
 }
 
-void *
+static void *
 pwdtable_update (void *v)
 {
   time_t now;
@@ -492,7 +503,7 @@ pwdtable_update (void *v)
 
                  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)
                            dbg_log (_("Give uid for \"%s\" free"),
@@ -533,7 +544,7 @@ pwdtable_update (void *v)
   return NULL;
 }
 
-void *
+static void *
 negtable_update (void *v)
 {
   time_t now;
@@ -544,12 +555,12 @@ negtable_update (void *v)
   while (!do_shutdown)
     {
       if (debug_flag > 2)
-       dbg_log (_("(negtable_update) Wait for write lock!"));
+       dbg_log (_("(negpwdtable_update) Wait for write lock!"));
 
       pthread_rwlock_wrlock (&neglock);
 
-      if (debug_flag)
-       dbg_log (_("(negtable_update) Have write lock"));
+      if (debug_flag > 2)
+       dbg_log (_("(negpwdtable_update) Have write lock"));
 
       time (&now);
       for (i = 0; i < modulo; ++i)
@@ -579,8 +590,8 @@ negtable_update (void *v)
              work = work->next;
            }
        }
-      if (debug_flag)
-       dbg_log (_("(negtable_update) Release wait lock"));
+      if (debug_flag > 2)
+       dbg_log (_("(negpwdtable_update) Release wait lock"));
 
       pthread_rwlock_unlock (&neglock);
       sleep (10);
index 5a37df6..ad70fdd 100644 (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 \
              PTESTS PTESTS2C.sed ptestcases.h \
-             globtest.c globtest.sh wordexp-tst.sh
+             globtest.c globtest.sh wordexp-tst.sh annexc.c
 
 routines :=                                                                  \
        uname                                                                 \
@@ -63,7 +63,8 @@ gpl2lgpl := getopt.c getopt1.c getopt.h       regex.c regex.h
 before-compile := testcases.h ptestcases.h
 
 # 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
 
index 26c876a..3868da3 100644 (file)
@@ -5509,12 +5509,12 @@ re_comp (s)
     {
       re_comp_buf.buffer = (unsigned char *) malloc (200);
       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.fastmap = (char *) malloc (1 << BYTEWIDTH);
       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
index 50b157b..b1eabb9 100644 (file)
@@ -21,6 +21,7 @@
 #include <sys/types.h>
 #include <regex.h>
 #include <stdio.h>
+#include <string.h>
 
 /* Data structure to describe the tests.  */
 struct test
@@ -108,7 +109,7 @@ main (int argc, char *argv[])
        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
      to fail this would only cause the libc testsuite to fail.  */
index 455b14d..51639d3 100644 (file)
@@ -12,12 +12,12 @@ main (void)
   stream = open_memstream (&bp, &size);
   fprintf (stream, "hello");
   fflush (stream);
-  printf ("buf = %s, size = %d\n", bp, size);
+  printf ("buf = %s, size = %Zu\n", bp, size);
   lose |= size != 5;
   lose |= strncmp (bp, "hello", size);
   fprintf (stream, ", world");
   fclose (stream);
-  printf ("buf = %s, size = %d\n", bp, size);
+  printf ("buf = %s, size = %Zu\n", bp, size);
   lose |= size != 12;
   lose |= strncmp (bp, "hello, world", 12);
 
index 8c3d0e3..f655845 100644 (file)
@@ -28,7 +28,7 @@ main (void)
       return 1;
     }
   for (i = 0; i < 1000; ++i)
-    fprintf (in, "%u\n", i);
+    fprintf (in, "%Zu\n", i);
 
   out = fopen (outname, "w");
   if (out == NULL)
index 8b3b4eb..852027c 100644 (file)
@@ -59,17 +59,17 @@ struct printf_info
    The function should return the number of characters written,
    or -1 for errors.  */
 
-typedef int printf_function __P ((FILE *__stream,
-                                 __const struct printf_info *__info,
-                                 __const void *__const *__args));
+typedef int printf_function __PMT ((FILE *__stream,
+                                   __const struct printf_info *__info,
+                                   __const void *__const *__args));
 
 /* Type of a printf specifier-arginfo function.
    INFO gives information about the format specification.
    N, ARGTYPES, and return value are as for printf_parse_format.  */
 
-typedef int printf_arginfo_function __P ((__const struct printf_info *__info,
-                                         size_t __n,
-                                         int *__argtypes));
+typedef int printf_arginfo_function __PMT ((__const struct printf_info *__info,
+                                           size_t __n,
+                                           int *__argtypes));
 
 
 /* Register FUNC to be called to format SPEC specifiers; ARGINFO must be
index 32bce5b..e274dcc 100644 (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.
 
    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);
        if (c == EOF)
          {
-           printf ("EOF at %u.\n", i);
+           printf ("EOF at %Zu.\n", i);
            lose = 1;
            break;
          }
        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);
            lose = 1;
            break;
@@ -83,7 +83,7 @@ main (int argc, char **argv)
        for (i = replace_from; i < replace_to; ++i)
          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);
              lose = 1;
              break;
@@ -97,7 +97,7 @@ main (int argc, char **argv)
       }
     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;
       }
   }
index fe37672..d6ff2c1 100644 (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.
 
    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)
     {
-      printf ("bufsize %u; read %d: ", size, len);
+      printf ("bufsize %Zu; read %Zd: ", size, len);
       if (fwrite (buf, len, 1, stdout) != 1)
        {
          perror ("fwrite");
index c43cb1a..1b1f834 100644 (file)
@@ -33,7 +33,7 @@ main(int argc, char *argv[])
 
              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);
                  return 1;
                }
index a96c7bd..8ede56e 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <errno.h>
 #include <sys/statvfs.h>
+#include <string.h>
 
 /* Return information about the filesystem on which FD resides.  */
 int
index 3497603..d88bd59 100644 (file)
@@ -20,6 +20,7 @@
 #include <errno.h>
 #include <sys/statvfs.h>
 #include <stddef.h>
+#include <string.h>
 
 /* Return information about the filesystem on which FILE resides.  */
 int
index fa858de..eb4080a 100644 (file)
@@ -71,7 +71,7 @@ qS[] ={1.0, -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
        double x;
 #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;
        GET_HIGH_WORD(hx,x);
        ix = hx&0x7fffffff;
index 65dc318..aa19598 100644 (file)
@@ -79,7 +79,7 @@ qS[] = {1.0, -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
        double x;
 #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;
        GET_HIGH_WORD(hx,x);
        ix = hx&0x7fffffff;
index e92b718..23ae6e2 100644 (file)
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <alloca.h>
 #include <sys/poll.h>
 #include <sys/types.h>
 #include <errno.h>
 #include <string.h>
 #include <sys/time.h>
+#include <sys/param.h>
+#include <unistd.h>
 
 /* Poll the file descriptors described by the NFDS structures starting at
    FDS.  If TIMEOUT is nonzero and not -1, allow TIMEOUT milliseconds for
@@ -34,25 +37,37 @@ __poll (fds, nfds, timeout)
      unsigned long int nfds;
      int timeout;
 {
+  static int max_fd_size;
   struct timeval tv;
-  fd_set rset, wset, xset;
+  fd_set *rset, *wset, *xset;
   struct pollfd *f;
   int ready;
   int maxfd = 0;
+  int bytes;
 
-  FD_ZERO (&rset);
-  FD_ZERO (&wset);
-  FD_ZERO (&xset);
+  if (!max_fd_size)
+    max_fd_size = __getdtablesize ();
+
+  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)
     if (f->fd >= 0)
       {
        if (f->events & POLLIN)
-         FD_SET (f->fd, &rset);
+         FD_SET (f->fd, rset);
        if (f->events & POLLOUT)
-         FD_SET (f->fd, &wset);
+         FD_SET (f->fd, wset);
        if (f->events & POLLPRI)
-         FD_SET (f->fd, &xset);
+         FD_SET (f->fd, xset);
        if (f->fd > maxfd && (f->events & (POLLIN|POLLOUT|POLLPRI)))
          maxfd = f->fd;
       }
@@ -60,19 +75,18 @@ __poll (fds, nfds, timeout)
   tv.tv_sec = timeout / 1000;
   tv.tv_usec = (timeout % 1000) * 1000;
 
-  ready = __select (maxfd + 1, &rset, &wset, &xset,
-                   timeout == -1 ? NULL : &tv);
+  ready = __select (maxfd + 1, rset, wset, xset, timeout == -1 ? NULL : &tv);
   if (ready > 0)
     for (f = fds; f < &fds[nfds]; ++f)
       {
        f->revents = 0;
        if (f->fd >= 0)
          {
-           if (FD_ISSET (f->fd, &rset))
+           if (FD_ISSET (f->fd, rset))
              f->revents |= POLLIN;
-           if (FD_ISSET (f->fd, &wset))
+           if (FD_ISSET (f->fd, wset))
              f->revents |= POLLOUT;
-           if (FD_ISSET (f->fd, &xset))
+           if (FD_ISSET (f->fd, xset))
              f->revents |= POLLPRI;
          }
       }
index 27b3077..89758cd 100644 (file)
@@ -1,3 +1,4 @@
+bits/pthreadtypes.h
 stdio_lim.h.in
 cmsg_nxthdr.c
 errlist.h
@@ -74,3 +75,5 @@ sys/user.h
 sys/vt.h
 xstatconv.c
 getdents64.c
+__sendmsg.S
+__recvmsg.S
index ec42e77..7de1008 100644 (file)
@@ -58,7 +58,7 @@ ifeq ($(subdir),socket)
 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/if_slip.h net/if_packet.h
-sysdep_routines += cmsg_nxthdr sa_len
+sysdep_routines += cmsg_nxthdr sa_len __sendmsg __recvmsg
 endif
 
 ifeq ($(subdir),sunrpc)
@@ -75,7 +75,7 @@ inhibit-siglist := yes
 endif
 
 ifeq ($(subdir),posix)
-headers := bits/pthreadtypes.h
+sysdep_headers += bits/pthreadtypes.h
 endif
 
 ifeq ($(subdir),inet)
similarity index 51%
rename from sysdeps/unix/sysv/linux/recvmsg.S
rename to sysdeps/unix/sysv/linux/__recvmsg.S
index 98be36b..515ff55 100644 (file)
@@ -1,5 +1,5 @@
-#define        socket  recvmsg
+#define        socket  __recvmsg
 #define        __socket __libc_recvmsg
+#define SOCKOP___recvmsg SOCKOP_recvmsg
 #define        NARGS   3
 #include <socket.S>
-weak_alias (__libc_recvmsg, __recvmsg)
similarity index 51%
rename from sysdeps/unix/sysv/linux/sendmsg.S
rename to sysdeps/unix/sysv/linux/__sendmsg.S
index c01d9b6..165ee14 100644 (file)
@@ -1,5 +1,5 @@
-#define        socket  sendmsg
+#define        socket  __sendmsg
 #define        __socket __libc_sendmsg
+#define SOCKOP___sendmsg SOCKOP_sendmsg
 #define        NARGS   3
 #include <socket.S>
-weak_alias (__libc_sendmsg, __sendmsg)
index fc1187b..5dea29f 100644 (file)
@@ -24,9 +24,6 @@
 
 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.  */
 int
@@ -40,10 +37,8 @@ __aio_sigqueue (sig, val)
   info.si_signo = sig;
   info.si_errno = 0;
   info.si_code = SI_ASYNCIO;
-
   info.si_pid = getpid ();
   info.si_uid = getuid ();
-
   info.si_value = val;
 
   return __syscall_rt_sigqueueinfo (info.si_pid, sig, &info);
index c7f6d8d..9d5d5e6 100644 (file)
@@ -57,6 +57,8 @@ extern int clone __P ((int (*__fn) (void *__arg), void *__child_stack,
                       int __flags, void *__arg));
 #endif
 
+__END_DECLS
+
 #endif /* need schedparam */
 
 #if !defined __defined_schedparam \
@@ -69,5 +71,3 @@ struct __sched_param
   };
 # undef __need_schedparam
 #endif
-
-__END_DECLS
index 5517ba8..c1f752e 100644 (file)
@@ -222,12 +222,32 @@ __cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg)
    <linux/socket.h>.  */
 enum
   {
-    SCM_RIGHTS = 0x01,         /* Data array contains access rights.  */
+    SCM_RIGHTS = 0x01,         /* Transfer file descriptors.  */
 #define SCM_RIGHTS SCM_RIGHTS
-    __SCM_CREDENTIALS = 0x02,  /* Data array is `struct ucred'.  */
-    __SCM_CONNECT = 0x03       /* Data array is `struct scm_connect'.  */
+#ifdef __USE_BSD
+    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.  */
 #include <asm/socket.h>
diff --git a/sysdeps/unix/sysv/linux/recvmsg.c b/sysdeps/unix/sysv/linux/recvmsg.c
new file mode 100644 (file)
index 0000000..04cf230
--- /dev/null
@@ -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;
+}
diff --git a/sysdeps/unix/sysv/linux/sendmsg.c b/sysdeps/unix/sysv/linux/sendmsg.c
new file mode 100644 (file)
index 0000000..8902530
--- /dev/null
@@ -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);
+}
index 1d51a69..eca09e2 100644 (file)
@@ -60,6 +60,7 @@ static size_t num_leaps;
 static struct leap *leaps = NULL;
 
 #include <endian.h>
+#include <byteswap.h>
 
 /* Decode the four bytes at PTR as a signed integer in network byte order.  */
 static inline int
@@ -67,6 +68,8 @@ decode (const void *ptr)
 {
   if ((BYTE_ORDER == BIG_ENDIAN) && sizeof (int) == 4)
     return *(const int *) ptr;
+  else if (BYTE_ORDER == LITTLE_ENDIAN && sizeof (int) == 4)
+    return bswap_32 (*(const int *) ptr);
   else
     {
       const unsigned char *p = ptr;
@@ -157,7 +160,7 @@ __tzfile_read (const char *file)
   if (f == NULL)
     return;
 
-  if (fread ((void *) &tzhead, sizeof (tzhead), 1, f) != 1)
+  if (fread_unlocked ((void *) &tzhead, sizeof (tzhead), 1, f) != 1)
     goto lose;
 
   num_transitions = (size_t) decode (tzhead.tzh_timecnt);
@@ -198,8 +201,8 @@ __tzfile_read (const char *file)
   if (sizeof (time_t) < 4)
       abort ();
 
-  if (fread(transitions, 4, num_transitions, f) != num_transitions ||
-      fread(type_idxs, 1, num_transitions, f) != num_transitions)
+  if (fread_unlocked (transitions, 4, num_transitions, f) != num_transitions
+      || fread_unlocked (type_idxs, 1, num_transitions, f) != num_transitions)
     goto lose;
 
   /* 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)
     {
       unsigned char x[4];
-      if (fread (x, 1, 4, f) != 4 ||
-         fread (&types[i].isdst, 1, 1, f) != 1 ||
-         fread (&types[i].idx, 1, 1, f) != 1)
+      if (fread_unlocked (x, 1, 4, f) != 4
+         || fread_unlocked (&types[i].isdst, 1, 1, f) != 1
+         || fread_unlocked (&types[i].idx, 1, 1, f) != 1)
        goto lose;
       if (types[i].idx >= chars) /* Bogus index in data file.  */
        goto lose;
       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;
 
   for (i = 0; i < num_leaps; ++i)
     {
       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;
       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;
       leaps[i].change = (long int) decode (x);
     }
 
   for (i = 0; i < num_isstd; ++i)
     {
-      int c = getc (f);
+      int c = getc_unlocked (f);
       if (c == EOF)
        goto lose;
       types[i].isstd = c != 0;
@@ -257,7 +260,7 @@ __tzfile_read (const char *file)
 
   for (i = 0; i < num_isgmt; ++i)
     {
-      int c = getc (f);
+      int c = getc_unlocked (f);
       if (c == EOF)
        goto lose;
       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
      transitioned to earliest in time.  */
   __tzname[1] = NULL;
-  for (i = 0; i < num_types && i < sizeof (__tzname) / sizeof (__tzname[0]);
-       ++i)
+  for (i = 0; i < num_types; ++i)
     __tzname[types[i].isdst] = __tzstring (&zone_names[types[i].idx]);
   if (__tzname[1] == NULL)
     __tzname[1] = __tzname[0];
@@ -296,8 +298,8 @@ __tzfile_read (const char *file)
   __use_tzfile = 1;
   return;
 
- lose:;
-  fclose(f);
+ lose:
+  fclose (f);
 }
 \f
 /* 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;
       __timezone = -rule_stdoff;
       __tzname[1] = NULL;
-      for (i = 0;
-          i < num_types && i < sizeof (__tzname) / sizeof (__tzname[0]);
-          ++i)
-       __tzname[types[i].isdst] = &zone_names[types[i].idx];
+      for (i = 0; i < num_types; ++i)
+       __tzname[types[i].isdst] = __tzstring (&zone_names[types[i].idx]);
       if (__tzname[1] == NULL)
        /* There is no daylight saving time.  */
        __tzname[1] = __tzname[0];
@@ -455,9 +455,9 @@ __tzfile_compute (time_t timer, int use_localtime,
        leaps[i].change > leaps[i - 1].change))
     {
       *leap_hit = 1;
-      while (i > 0 &&
-            leaps[i].transition == leaps[i - 1].transition + 1 &&
-            leaps[i].change == leaps[i - 1].change + 1)
+      while (i > 0
+            && leaps[i].transition == leaps[i - 1].transition + 1
+            && leaps[i].change == leaps[i - 1].change + 1)
        {
          ++*leap_hit;
          --i;
@@ -483,5 +483,6 @@ compute_tzname_max (size_t chars)
        ++p;
       if ((size_t) (p - start) > __tzname_cur_max)
        __tzname_cur_max = p - start;
-    } while (++p < &zone_names[chars]);
+    }
+  while (++p < &zone_names[chars]);
 }
index 4b8fa41..9c8e5d7 100644 (file)
@@ -115,7 +115,7 @@ char *
 __tzstring (string)
      const char *string;
 {
-  struct tzstring_head *h = &tzstring_list.head;
+  struct tzstring_head *h;
   size_t needed;
   char *p;
 
@@ -139,7 +139,8 @@ __tzstring (string)
       size_t buffer_size = tzstring_last_buffer_size;
       while ((buffer_size *= 2) < needed)
        continue;
-      if (! (h = h->next = malloc (sizeof *h + buffer_size)))
+      h = malloc (sizeof *h + buffer_size);
+      if (h == NULL)
        return NULL;
       h->next = NULL;
       tzstring_last_buffer_size = buffer_size;
index 49b3621..d05632d 100644 (file)
@@ -20,6 +20,7 @@
 #include <time.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 
 int failed = 0;
@@ -29,14 +30,16 @@ struct test_times
   const char *name;
   int daylight;
   int timezone;
+  const char *tzname[2];
 };
 
 static const struct test_times tests[] =
 {
-  { "Europe/Berlin", 1, -3600 },
-  { "Universal", 0, 0 },
-  { "Australia/Melbourne", 1, -36000 },
-  { "America/Sao_Paulo", 1, 10800 },
+  { "Europe/Berlin", 1, -3600, { "CET", "CEST" }},
+  { "Universal", 0, 0, {"UTC", "UTC" }},
+  { "Australia/Melbourne", 1, -36000, { "EST", "EST" }},
+  { "America/Sao_Paulo", 1, 10800, {"EST", "EDT" }},
+  { "America/Los_Angeles", 1, 28800, {"PST", "PDT" }},
   { NULL, 0, 0 }
 };
 
@@ -52,8 +55,10 @@ print_tzvars (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)
     {
       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);
       ++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 ();
       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 */
       localtime (&t);
       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;
index 3c24c22..9b4fc57 100644 (file)
@@ -14,6 +14,9 @@ libc {
     wctrans; wctype; wcwidth;
   }
   GLIBC_2.1 {
+    # functions used in inline functions or macros
+    __towctrans;
+
     # i*
     iswblank;
   }