Update.
authorUlrich Drepper <drepper@redhat.com>
Sat, 24 May 1997 02:30:09 +0000 (02:30 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 24 May 1997 02:30:09 +0000 (02:30 +0000)
1997-05-24 03:51  Ulrich Drepper  <drepper@cygnus.com>

* stdlib/Makefile (routines): Add strtol_l, strtoul_l, strtoll_l,
strtoull_l, strtof_l, strtod_l, and strtold_l.
* stdlib/stdlib.h: Add prototypes for new functions.
* stdlib/strtod.c: Change for compiling as strtoX_l.
* stdlib/strtol.c: Likewise.
* stdlib/strtof.c: Likewise.
* stdlib/strtold.c: Likewise.
* stdlib/strtod_l.c: New file.
* stdlib/strtof_l.c: New file.
* stdlib/strtold_l.c: New file.
* stdlib/strtol_l.c: New file.
* stdlib/strtoul_l.c: New file.
* stdlib/strtoll_l.c: New file.
* stdlib/strtoull_l.c: New file.
* string/Makefile (routines): Add strcasecmp_l and strncase_l.
* string/string.h: Add prototypes for new functions.
* sysdeps/generic/strcasecmp.c: Change for compiling as strcasecmp_l.
* sysdeps/generic/strncase.c: Change for compiling as strncasecmp_l.
* sysdeps/generic/strcasecmp_l.c: New file.
* sysdeps/generic/strncase_l.c: New file.
* wcsmbs/Makefile (routines): Add wcstol_l, wcstoul_l, wcstoll_l,
wcstoull_l, wcstod_l, wcstold_l, wcstof_l, wcscasecmp_l, and
wcsncase_l.
* wcsmbs/wchar.h: Add prototypes for new functions.
* wcsmbs/wcscasecmp.c: Change for compiling as wcscasecmp_l.
* wcsmbs/wcsncase.c: Change for compiling as wcsncasecmp_l.
* wcsmbs/wcscasecmp_l.c: New file.
* wcsmbs/wcsncase_l.c: New file.
* wcsmbs/wcstof.c: Change for compiling as wcstof_l.c
* wcsmbs/wcstold.c: Change for compiling as wcstold_l.c
* wcsmcs/wcstod_l.c: New file.
* wcsmcs/wcstof_l.c: New file.
* wcsmcs/wcstold_l.c: New file.
* wcsmcs/wcstol_l.c: New file.
* wcsmcs/wcstoul_l.c: New file.
* wcsmcs/wcstoll_l.c: New file.
* wcsmcs/wcstoull_l.c: New file.

* Makeconfig (binfmt-subdir): New variable.  Set to `elf' if
$(elf) is defined.  More to come later when other binary formats
are supported.
* Makefile (subdirs): Remove elf.  Add $(binfmt-subdir).
Suggested by Philip Blundell.

* stdlib/Makefile (headers): Add fmtmsg.h.
(routines): Add fmtmsg.
* stdlib/fmtmsg.c: New file.
* stdlib/fmtmsg.h: New file.
* manual/stdio.texi: Add description of fmtmsg and addseverity.
* manual/examples/fmtmsgexpl.c: Example program for fmtmsg
documentation.

1997-05-23 15:26  Philip Blundell  <pjb27@cam.ac.uk>

* resolv/res_query.c (res_querydomain): Avoid potential buffer
overrun.  Reported by Dan A. Dickey <ddickey@transition.com>.

1997-05-22 18:36  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

* elf/dl-support.c (_dl_sysdep_open_zero_fill,
_dl_sysdep_read_whole_file): Moved functions to ...
* elf/dl-misc.c: This new file.
* sysdeps/generic/dl-sysdepio.c: Delete file and move functions...
* elf/dl-misc.c: ... here.
* sysdeps/generic/dl-sysdep.c (_dl_sysdep_open_zero_fill,
_dl_sysdep_read_whole_file): Delete functions; they now come from
elf/dl-misc.c (dl-support.c had contained identical versions).
* sysdeps/mach/hurd/dl-sysdepio.c: Delete file; move functions...
* sysdeps/mach/hurd/dl-sysdep.c: ... here, but mark them weak so
that the regular ones in dl-misc work once we've initialized.
* elf/Makefile (dl-routines): Remove dl-sysdepio.c.  Add dl-misc.c.

1997-05-22 21:55  Philip Blundell  <pjb27@cam.ac.uk>

* inet/Makefile (headers): Add netinet/inbits.h.
* inet/netinet/in.h: New file.
* sysdeps/generic/netinet/inbits.h: Likewise.
* sysdeps/unix/sysv/linux/netinet/inbits.h: Likewise.
* sysdeps/generic/netinet/ip6.h: Move to...
* inet/netinet/ip6.h: ... here.
* sysdeps/generic/netinet/icmp6.h: Move to...
* inet/netinet/icmp6.h: ... here.
* sysdeps/unix/sysv/linux/netinet/in.h: Remove.
* sysdeps/generic/netinet/in.h: Remove.

1997-05-22 05:40  Richard Henderson  <rth@tamu.edu>

* sysdeps/alpha/dl-machine.h (elf_machine_runtime_setup): If we are
not looking at the new thread-safe .plt, don't be lazy about relocs.
(_dl_runtime_resolve): Fix up arithmetic for new .plt layout.
(elf_alpha_fix_plt): Insert wmb as appropriate to ensure safety.
* elf/dynamic-link.h (ELF_DYNAMIC_RELOCATE): Let
elf_machine_runtime_setup() decide if we can actually be lazy.
* elf/rtld.c (_dl_start): So don't call it.
* elf/dl-reloc.c (_dl_relocate_object): Likewise.
* sysdeps/i386/dl-machine.h (elf_machine_runtime_setup): Return lazy.
* sysdeps/m68k/dl-machine.h (elf_machine_runtime_setup): Likewise.
* sysdeps/mips/dl-machine.h (elf_machine_runtime_setup): Likewise.
* sysdeps/powerpc/dl-machine.h (elf_machine_runtime_setup): Likewise.
* sysdeps/sparc/dl-machine.h (elf_machine_runtime_setup): Likewise.
* sysdeps/stub/dl-machine.h (elf_machine_runtime_setup): Update
skeleton definition.

1997-05-22 18:45  Ulrich Drepper  <drepper@cygnus.com>

* sysdeps/i386/fpu/__math.h (logb): Remove second value placed on
stack by fxtract.

1997-05-22 13:07  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

* sunrpc/rpcsvc/rusers.x: Provide and correct prototypes,
add cast to (xdrproc_t) where necessary to prevent warnings.

1997-05-22 12:18  Ulrich Drepper  <drepper@cygnus.com>

* sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c: Remove I/O functions.

* sunrpc/rpcinfo.c (get_inet_address): Use INADDR_NONE and INADDR_ANY
* sysdeps/libm-ieee754/s_cexp.c: Fix typo: string_alias ->
* nss/XXX-lookup.c: Add missing explanation.

68 files changed:
ChangeLog
Makeconfig
Makefile
elf/Makefile
elf/dl-misc.c [moved from sysdeps/generic/dl-sysdepio.c with 57% similarity]
elf/dl-reloc.c
elf/dl-support.c
elf/dynamic-link.h
elf/rtld.c
inet/Makefile
inet/netinet/icmp6.h [moved from sysdeps/generic/netinet/icmp6.h with 94% similarity]
inet/netinet/in.h [moved from sysdeps/unix/sysv/linux/netinet/in.h with 73% similarity]
inet/netinet/ip6.h [moved from sysdeps/generic/netinet/ip6.h with 91% similarity]
manual/examples/fmtmsgexpl.c [new file with mode: 0644]
manual/stdio.texi
resolv/res_query.c
stdlib/Makefile
stdlib/fmtmsg.c [new file with mode: 0644]
stdlib/fmtmsg.h [new file with mode: 0644]
stdlib/stdlib.h
stdlib/strtod.c
stdlib/strtod_l.c [new file with mode: 0644]
stdlib/strtof.c
stdlib/strtof_l.c [new file with mode: 0644]
stdlib/strtol.c
stdlib/strtol_l.c [new file with mode: 0644]
stdlib/strtold.c
stdlib/strtold_l.c [new file with mode: 0644]
stdlib/strtoll_l.c [new file with mode: 0644]
stdlib/strtoul_l.c [new file with mode: 0644]
stdlib/strtoull_l.c [new file with mode: 0644]
string/Makefile
string/string.h
sunrpc/rpcsvc/rusers.x
sysdeps/alpha/dl-machine.h
sysdeps/generic/dl-sysdep.c
sysdeps/generic/netinet/in.h [deleted file]
sysdeps/generic/netinet/inbits.h [new file with mode: 0644]
sysdeps/generic/strcasecmp.c
sysdeps/generic/strcasecmp_l.c [new file with mode: 0644]
sysdeps/generic/strncase.c
sysdeps/generic/strncase_l.c [new file with mode: 0644]
sysdeps/i386/dl-machine.h
sysdeps/i386/fpu/__math.h
sysdeps/m68k/dl-machine.h
sysdeps/mach/hurd/dl-sysdep.c
sysdeps/mach/hurd/dl-sysdepio.c [deleted file]
sysdeps/mips/dl-machine.h
sysdeps/powerpc/dl-machine.h
sysdeps/sparc/dl-machine.h
sysdeps/stub/dl-machine.h
sysdeps/unix/sysv/linux/netinet/inbits.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c
wcsmbs/Makefile
wcsmbs/wchar.h
wcsmbs/wcscasecmp.c
wcsmbs/wcscasecmp_l.c [new file with mode: 0644]
wcsmbs/wcsncase.c
wcsmbs/wcsncase_l.c [new file with mode: 0644]
wcsmbs/wcstod_l.c [new file with mode: 0644]
wcsmbs/wcstof.c
wcsmbs/wcstof_l.c [new file with mode: 0644]
wcsmbs/wcstol_l.c [new file with mode: 0644]
wcsmbs/wcstold.c
wcsmbs/wcstold_l.c [new file with mode: 0644]
wcsmbs/wcstoll_l.c [new file with mode: 0644]
wcsmbs/wcstoul_l.c [new file with mode: 0644]
wcsmbs/wcstoull_l.c [new file with mode: 0644]

index 77b054b..faab56a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,127 @@
+1997-05-24 03:51  Ulrich Drepper  <drepper@cygnus.com>
+
+       * stdlib/Makefile (routines): Add strtol_l, strtoul_l, strtoll_l,
+       strtoull_l, strtof_l, strtod_l, and strtold_l.
+       * stdlib/stdlib.h: Add prototypes for new functions.
+       * stdlib/strtod.c: Change for compiling as strtoX_l.
+       * stdlib/strtol.c: Likewise.
+       * stdlib/strtof.c: Likewise.
+       * stdlib/strtold.c: Likewise.
+       * stdlib/strtod_l.c: New file.
+       * stdlib/strtof_l.c: New file.
+       * stdlib/strtold_l.c: New file.
+       * stdlib/strtol_l.c: New file.
+       * stdlib/strtoul_l.c: New file.
+       * stdlib/strtoll_l.c: New file.
+       * stdlib/strtoull_l.c: New file.
+       * string/Makefile (routines): Add strcasecmp_l and strncase_l.
+       * string/string.h: Add prototypes for new functions.
+       * sysdeps/generic/strcasecmp.c: Change for compiling as strcasecmp_l.
+       * sysdeps/generic/strncase.c: Change for compiling as strncasecmp_l.
+       * sysdeps/generic/strcasecmp_l.c: New file.
+       * sysdeps/generic/strncase_l.c: New file.
+       * wcsmbs/Makefile (routines): Add wcstol_l, wcstoul_l, wcstoll_l,
+       wcstoull_l, wcstod_l, wcstold_l, wcstof_l, wcscasecmp_l, and
+       wcsncase_l.
+       * wcsmbs/wchar.h: Add prototypes for new functions.
+       * wcsmbs/wcscasecmp.c: Change for compiling as wcscasecmp_l.
+       * wcsmbs/wcsncase.c: Change for compiling as wcsncasecmp_l.
+       * wcsmbs/wcscasecmp_l.c: New file.
+       * wcsmbs/wcsncase_l.c: New file.
+       * wcsmbs/wcstof.c: Change for compiling as wcstof_l.c
+       * wcsmbs/wcstold.c: Change for compiling as wcstold_l.c
+       * wcsmcs/wcstod_l.c: New file.
+       * wcsmcs/wcstof_l.c: New file.
+       * wcsmcs/wcstold_l.c: New file.
+       * wcsmcs/wcstol_l.c: New file.
+       * wcsmcs/wcstoul_l.c: New file.
+       * wcsmcs/wcstoll_l.c: New file.
+       * wcsmcs/wcstoull_l.c: New file.
+
+       * Makeconfig (binfmt-subdir): New variable.  Set to `elf' if
+       $(elf) is defined.  More to come later when other binary formats
+       are supported.
+       * Makefile (subdirs): Remove elf.  Add $(binfmt-subdir).
+       Suggested by Philip Blundell.
+
+       * stdlib/Makefile (headers): Add fmtmsg.h.
+       (routines): Add fmtmsg.
+       * stdlib/fmtmsg.c: New file.
+       * stdlib/fmtmsg.h: New file.
+       * manual/stdio.texi: Add description of fmtmsg and addseverity.
+       * manual/examples/fmtmsgexpl.c: Example program for fmtmsg
+       documentation.
+
+1997-05-23 15:26  Philip Blundell  <pjb27@cam.ac.uk>
+
+       * resolv/res_query.c (res_querydomain): Avoid potential buffer
+       overrun.  Reported by Dan A. Dickey <ddickey@transition.com>.
+
+1997-05-22 18:36  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>
+
+       * elf/dl-support.c (_dl_sysdep_open_zero_fill,
+       _dl_sysdep_read_whole_file): Moved functions to ...
+       * elf/dl-misc.c: This new file.
+       * sysdeps/generic/dl-sysdepio.c: Delete file and move functions...
+       * elf/dl-misc.c: ... here.
+       * sysdeps/generic/dl-sysdep.c (_dl_sysdep_open_zero_fill,
+       _dl_sysdep_read_whole_file): Delete functions; they now come from
+       elf/dl-misc.c (dl-support.c had contained identical versions).
+       * sysdeps/mach/hurd/dl-sysdepio.c: Delete file; move functions...
+       * sysdeps/mach/hurd/dl-sysdep.c: ... here, but mark them weak so
+       that the regular ones in dl-misc work once we've initialized.
+       * elf/Makefile (dl-routines): Remove dl-sysdepio.c.  Add dl-misc.c.
+
+1997-05-22 21:55  Philip Blundell  <pjb27@cam.ac.uk>
+
+       * inet/Makefile (headers): Add netinet/inbits.h.
+       * inet/netinet/in.h: New file.
+       * sysdeps/generic/netinet/inbits.h: Likewise.
+       * sysdeps/unix/sysv/linux/netinet/inbits.h: Likewise.
+       * sysdeps/generic/netinet/ip6.h: Move to...
+       * inet/netinet/ip6.h: ... here.
+       * sysdeps/generic/netinet/icmp6.h: Move to...
+       * inet/netinet/icmp6.h: ... here.
+       * sysdeps/unix/sysv/linux/netinet/in.h: Remove.
+       * sysdeps/generic/netinet/in.h: Remove.
+
+1997-05-22 05:40  Richard Henderson  <rth@tamu.edu>
+
+       * sysdeps/alpha/dl-machine.h (elf_machine_runtime_setup): If we are
+       not looking at the new thread-safe .plt, don't be lazy about relocs.
+       (_dl_runtime_resolve): Fix up arithmetic for new .plt layout.
+       (elf_alpha_fix_plt): Insert wmb as appropriate to ensure safety.
+       * elf/dynamic-link.h (ELF_DYNAMIC_RELOCATE): Let
+       elf_machine_runtime_setup() decide if we can actually be lazy.
+       * elf/rtld.c (_dl_start): So don't call it.
+       * elf/dl-reloc.c (_dl_relocate_object): Likewise.
+       * sysdeps/i386/dl-machine.h (elf_machine_runtime_setup): Return lazy.
+       * sysdeps/m68k/dl-machine.h (elf_machine_runtime_setup): Likewise.
+       * sysdeps/mips/dl-machine.h (elf_machine_runtime_setup): Likewise.
+       * sysdeps/powerpc/dl-machine.h (elf_machine_runtime_setup): Likewise.
+       * sysdeps/sparc/dl-machine.h (elf_machine_runtime_setup): Likewise.
+       * sysdeps/stub/dl-machine.h (elf_machine_runtime_setup): Update
+       skeleton definition.
+
+1997-05-22 18:45  Ulrich Drepper  <drepper@cygnus.com>
+
+       * sysdeps/i386/fpu/__math.h (logb): Remove second value placed on
+       stack by fxtract.
+
+1997-05-22 13:07  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
+
+       * sunrpc/rpcsvc/rusers.x: Provide and correct prototypes,
+       add cast to (xdrproc_t) where necessary to prevent warnings.
+
+1997-05-22 12:18  Ulrich Drepper  <drepper@cygnus.com>
+
+       * sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c: Remove I/O functions.
+
 1997-05-22 04:09  Ulrich Drepper  <drepper@cygnus.com>
 
        * sunrpc/clnt_perr.c (clnt_sperrno): Change type of variable i
        to size_t to prevent warning.
-       * sunrpc/rpcinfo.c (get_inet_address): Use UNADDR_NONE and INADDR_ANY
+       * sunrpc/rpcinfo.c (get_inet_address): Use INADDR_NONE and INADDR_ANY
        instead of numeric values.
        Various cleanups.
        * sunrpc/xdr_mem.c: Use `const char *' instead of `const caddr_t'
 
 1997-04-03 13:37  Ulrich Drepper  <drepper@cygnus.com>
 
-       * sysdeps/libm-ieee754/s_cexp.c: Fix type: string_alias ->
+       * sysdeps/libm-ieee754/s_cexp.c: Fix typo: string_alias ->
        strong_alias.
        Reported by sun <asun@zoology.washington.edu>.
 
        * locale/programs/ld-time.c (time_finish): t_fmt_ampm is optional.
        Use default value instead of printing a warning.
 
-       * nss/XXX-lookup.c: Add misssing explanation.
+       * nss/XXX-lookup.c: Add missing explanation.
 
 1997-02-19 19:14  Andreas Jaeger  <aj@arthur.pfalz.de>
 
index 3d666ff..9c7df17 100644 (file)
@@ -83,6 +83,14 @@ export sysdep_dir := $(sysdep_dir)
 # Get the values defined by options to `configure'.
 include $(common-objpfx)config.make
 
+# We have a special subdir for each binary format.
+# For now, only ELF is fully supported.
+ifeq ($(elf),yes)
+binfmt-subdir = elf
+else
+binfmt-subdir =
+endif
+
 # Complete path to sysdep dirs.
 full-config-sysdirs := $(filter /%, $(config-sysdirs)) \
                       $(addprefix $(..), $(filter-out /%, $(config-sysdirs)))
index a250924..bebffa4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -55,7 +55,7 @@ subdirs = csu assert ctype db locale intl catgets math setjmp signal stdlib \
          stdio-common $(stdio) malloc string wcsmbs time dirent grp pwd \
          posix io termios resource misc login socket sysvipc gmon gnulib \
          wctype manual shadow md5-crypt nss $(sysdep-subdirs) po argp \
-         $(add-ons) elf
+         $(add-ons) $(binfmt-subdir)
 export subdirs := $(subdirs)   # Benign, useless in GNU make before 3.63.
 
 # The mach and hurd subdirectories have many generated header files which
index 8d644aa..ae7dda9 100644 (file)
@@ -27,7 +27,7 @@ routines      = $(dl-routines) dl-open dl-close dl-symbol dl-support \
 # The core dynamic linking functions are in libc for the static and
 # profiled libraries.
 dl-routines    = $(addprefix dl-,load cache lookup object reloc deps \
-                                 runtime error init fini debug sysdepio)
+                                 runtime error init fini debug misc)
 # But they are absent from the shared libc, because that code is in ld.so.
 elide-routines.so = $(dl-routines) dl-support enbl-secure
 
similarity index 57%
rename from sysdeps/generic/dl-sysdepio.c
rename to elf/dl-misc.c
index ed60787..d5b1464 100644 (file)
@@ -1,5 +1,5 @@
-/* Operating I/O support for run-time dynamic linker.  Generic Unix version.
-   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Miscellaneous support functions for dynamic linker
+   Copyright (C) 1997 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
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <assert.h>
+#include <fcntl.h>
 #include <unistd.h>
 #include <stdarg.h>
 #include <string.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+
+#ifndef MAP_ANON
+/* This is the only dl-sysdep.c function that is actually needed at run-time
+   by _dl_map_object.  */
+
+int
+_dl_sysdep_open_zero_fill (void)
+{
+  return __open ("/dev/zero", O_RDONLY);
+}
+#endif
+
+/* Read the whole contents of FILE into new mmap'd space with given
+   protections.  *SIZEP gets the size of the file.  */
+
+void *
+_dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot)
+{
+  void *result;
+  struct stat st;
+  int fd = __open (file, O_RDONLY);
+  if (fd < 0)
+    return NULL;
+  if (__fxstat (_STAT_VER, fd, &st) < 0)
+    result = NULL;
+  else
+    {
+      /* Map a copy of the file contents.  */
+      result = __mmap (0, st.st_size, prot,
+#ifdef MAP_COPY
+                       MAP_COPY
+#else
+                       MAP_PRIVATE
+#endif
+#ifdef MAP_FILE
+                       | MAP_FILE
+#endif
+                       , fd, 0);
+      if (result == (void *) -1)
+        result = NULL;
+      else
+        *sizep = st.st_size;
+    }
+  __close (fd);
+  return result;
+}
 
 
 void
index f1c43ea..bec5881 100644 (file)
@@ -68,10 +68,6 @@ _dl_relocate_object (struct link_map *l, struct link_map *scope[], int lazy)
     ELF_DYNAMIC_RELOCATE (l, lazy);
   }
 
-  /* Set up the PLT so its unrelocated entries will jump to
-     _dl_runtime_resolve (dl-runtime.c), which will relocate them.  */
-  elf_machine_runtime_setup (l, lazy);
-
   /* Mark the object so we know ths work has been done.  */
   l->l_relocated = 1;
 
index 8a52fc7..e59b847 100644 (file)
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <assert.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-
 /* This file defines some things that for the dynamic linker are defined in
    rtld.c and dl-sysdep.c in ways appropriate to bootstrap dynamic linking.  */
 
@@ -32,49 +26,3 @@ char **_dl_argv = &__progname;       /* This is checked for some error messages.  */
 /* This defines the default search path for libraries.
    For the dynamic linker it is set by -rpath when linking.  */
 const char *_dl_rpath = DEFAULT_RPATH;
-\f
-#ifndef MAP_ANON
-/* This is the only dl-sysdep.c function that is actually needed at run-time
-   by _dl_map_object.  */
-
-int
-_dl_sysdep_open_zero_fill (void)
-{
-  return __open ("/dev/zero", O_RDONLY);
-}
-#endif
-
-/* Read the whole contents of FILE into new mmap'd space with given
-   protections.  *SIZEP gets the size of the file.  */
-
-void *
-_dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot)
-{
-  void *result;
-  struct stat st;
-  int fd = __open (file, O_RDONLY);
-  if (fd < 0)
-    return NULL;
-  if (__fxstat (_STAT_VER, fd, &st) < 0)
-    result = NULL;
-  else
-    {
-      /* Map a copy of the file contents.  */
-      result = __mmap (0, st.st_size, prot,
-#ifdef MAP_COPY
-                       MAP_COPY
-#else
-                       MAP_PRIVATE
-#endif
-#ifdef MAP_FILE
-                       | MAP_FILE
-#endif
-                       , fd, 0);
-      if (result == (void *) -1)
-        result = NULL;
-      else
-        *sizep = st.st_size;
-    }
-  __close (fd);
-  return result;
-}
index 1d134dd..da63633 100644 (file)
@@ -97,8 +97,11 @@ elf_get_dynamic_info (ElfW(Dyn) *dyn,
 
 /* This can't just be an inline function because GCC is too dumb
    to inline functions containing inlines themselves.  */
-#define ELF_DYNAMIC_RELOCATE(map, lazy) \
-  do { ELF_DYNAMIC_DO_REL ((map), (lazy)); \
-       ELF_DYNAMIC_DO_RELA ((map), (lazy)); } while (0)
+#define ELF_DYNAMIC_RELOCATE(map, lazy)                                \
+  do {                                                         \
+    int edr_lazy = elf_machine_runtime_setup((map), (lazy));   \
+    ELF_DYNAMIC_DO_REL ((map), edr_lazy);                      \
+    ELF_DYNAMIC_DO_RELA ((map), edr_lazy);                     \
+  } while (0)
 
 #endif
index 6f9737e..bad01a8 100644 (file)
@@ -106,8 +106,6 @@ _dl_start (void *arg)
 
   ELF_DYNAMIC_RELOCATE (&bootstrap_map, 0);
 
-  elf_machine_runtime_setup (&bootstrap_map, 0);
-
   /* Now life is sane; we can call functions and access global data.
      Set up to use the operating system facilities, and find out from
      the operating system's program loader where to find the program
index fe4ace3..847d994 100644 (file)
@@ -23,7 +23,7 @@ subdir        := inet
 
 headers        := netinet/ether.h netinet/in.h netinet/if_ether.h \
           netinet/tcp.h netinet/ip.h $(wildcard arpa/*.h protocols/*.h) \
-          aliases.h netinet/ip6.h netinet/icmp6.h
+          aliases.h netinet/ip6.h netinet/icmp6.h netinet/inbits.h
 
 distribute := netgroup.h
 
similarity index 94%
rename from sysdeps/generic/netinet/icmp6.h
rename to inet/netinet/icmp6.h
index f41cdfe..ef85269 100644 (file)
 #define ICMPV6_FILTER_BLOCKOTHERS      3
 #define ICMPV6_FILTER_PASSONLY         4
 
-struct icmpv6_filter 
+struct icmpv6_filter
   {
     u_int32_t data[8];
   };
 
-struct icmpv6hdr 
+struct icmpv6hdr
   {
     u_int8_t icmpv6_type;   /* type field */
     u_int8_t icmpv6_code;   /* code field */
     u_int16_t icmpv6_cksum;  /* checksum field */
-    union 
+    union
       {
        u_int32_t un_data32[1]; /* type-specific field */
        u_int16_t un_data16[2]; /* type-specific field */
@@ -81,17 +81,17 @@ struct icmpv6hdr
 #include <asm/bitops.h>
 
 #define ICMPV6_FILTER_WILLPASS(type, filterp) \
-       (test_bit(type, filterp) == 0)
+       (test_bit (type, filterp) == 0)
 
 #define ICMPV6_FILTER_WILLBLOCK(type, filterp) \
-       test_bit(type, filterp)
+       test_bit (type, filterp)
 
 #define ICMPV6_FILTER_SETPASS(type, filterp) \
-       clear_bit(type & 0x1f, &((filterp)->data[type >> 5]))
+       clear_bit (type & 0x1f, &((filterp)->data[type >> 5]))
 
 #define ICMPV6_FILTER_SETBLOCK(type, filterp) \
-       set_bit(type & 0x1f, &((filterp)->data[type >> 5]))
-#else 
+       set_bit (type & 0x1f, &((filterp)->data[type >> 5]))
+#else
 #define ICMPV6_FILTER_WILLPASS(type, filterp) \
        ((((filterp)->data[(type) >> 5]) & (1 << ((type) & 31))) == 0)
 
@@ -106,10 +106,10 @@ struct icmpv6hdr
 #endif
 
 #define ICMPV6_FILTER_SETPASSALL(filterp) \
-       memset(filterp, 0, sizeof(struct icmpv6_filter));
+       memset (filterp, 0, sizeof (struct icmpv6_filter));
 
 #define ICMPV6_FILTER_SETBLOCKALL(filterp) \
-       memset(filterp, 0xFF, sizeof(struct icmpv6_filter));
+       memset (filterp, 0xFF, sizeof (struct icmpv6_filter));
 
 #define ND6_ROUTER_SOLICITATION                133
 #define ND6_ROUTER_ADVERTISEMENT       134
@@ -117,7 +117,7 @@ struct icmpv6hdr
 #define ND6_NEIGHBOR_ADVERTISEMENT     136
 #define ND6_REDIRECT                   137
 
-enum nd6_option 
+enum nd6_option
   {
     ND6_OPT_SOURCE_LINKADDR=1,
     ND6_OPT_TARGET_LINKADDR=2,
@@ -137,7 +137,7 @@ struct nd6_router_solicit      /* router solicitation */
 #define rsol_cksum             rsol_hdr.icmpv6_cksum
 #define rsol_reserved          rsol_hdr.icmpv6_data32[0]
 
-struct nd6_router_advert 
+struct nd6_router_advert
   {
     struct icmpv6hdr   radv_hdr;
     u_int32_t          radv_reachable;  /* reachable time      */
similarity index 73%
rename from sysdeps/unix/sysv/linux/netinet/in.h
rename to inet/netinet/in.h
index b0c793e..a85dccd 100644 (file)
@@ -175,10 +175,10 @@ struct sockaddr_in
     struct in_addr sin_addr;           /* Internet address.  */
 
     /* Pad to size of `struct sockaddr'.  */
-    unsigned char sin_zero[sizeof(struct sockaddr) -
+    unsigned char sin_zero[sizeof (struct sockaddr) -
                           __SOCKADDR_COMMON_SIZE -
-                          sizeof(unsigned short int) -
-                          sizeof(struct in_addr)];
+                          sizeof (unsigned short int) -
+                          sizeof (struct in_addr)];
   };
 
 /* Ditto, for IPv6.  */
@@ -200,38 +200,8 @@ struct ipv6_mreq
     int                ipv6mr_ifindex;
   };
 
-
-/* Options for use with `getsockopt' and `setsockopt' at the IP level.
-   The first word in the comment at the right is the data type used;
-   "bool" means a boolean value stored in an `int'.  */
-#define        IP_TOS             1    /* int; IP type of service and precedence.  */
-#define        IP_TTL             2    /* int; IP time to live.  */
-#define        IP_HDRINCL         3    /* int; Header is included with data.  */
-#define        IP_OPTIONS         4    /* ip_opts; IP per-packet options.  */
-#define IP_MULTICAST_IF    32  /* in_addr; set/get IP multicast i/f */
-#define IP_MULTICAST_TTL   33  /* u_char; set/get IP multicast ttl */
-#define IP_MULTICAST_LOOP  34  /* i_char; set/get IP multicast loopback */
-#define IP_ADD_MEMBERSHIP  35  /* ip_mreq; add an IP group membership */
-#define IP_DROP_MEMBERSHIP 36  /* ip_mreq; drop an IP group membership */
-
-/* To select the IP level.  */
-#define SOL_IP 0
-
-/* Structure used to describe IP options for IP_OPTIONS. The `ip_dst'
-   field is used for the first-hop gateway when using a source route
-   (this gets put into the header proper).  */
-struct ip_opts
-  {
-    struct in_addr ip_dst;     /* First hop; zero without source route.  */
-    char ip_opts[40];          /* Actually variable in size.  */
-  };
-
-/* Structure used for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. */
-struct ip_mreq
-  {
-    struct in_addr imr_multiaddr;      /* IP multicast address of group */
-    struct in_addr imr_interface;      /* local IP address of interface */
-  };
+/* Get system-specific definitions.  */
+#include <netinet/inbits.h>
 
 /* Functions to convert between host and network byte order.
 
@@ -256,49 +226,29 @@ extern u_int16_t htons __P ((u_int16_t __hostshort));
 #define        htons(x)        (x)
 #endif
 
-
-/* IPV6 socket options.  */
-#define IPV6_ADDRFORM          1
-#define IPV6_PKTINFO           2
-#define IPV6_RXHOPOPTS         3
-#define IPV6_RXDSTOPTS         4
-#define IPV6_RXSRCRT           5
-#define IPV6_PKTOPTIONS                6
-#define IPV6_CHECKSUM          7
-#define IPV6_HOPLIMIT          8
-
-#define SCM_SRCRT              IPV6_RXSRCRT
-
-#define IPV6_UNICAST_HOPS      16
-#define IPV6_MULTICAST_IF      17
-#define IPV6_MULTICAST_HOPS    18
-#define IPV6_MULTICAST_LOOP    19
-#define IPV6_ADD_MEMBERSHIP    20
-#define IPV6_DROP_MEMBERSHIP   21
-
 #define IN6_IS_ADDR_UNSPECIFIED(a) \
-        ((((u_int32_t *)(a))[0] == 0) && ((u_int32_t *)(a))[1] == 0) && \
-         (((u_int32_t *)(a))[2] == 0) && ((u_int32_t *)(a))[3] == 0))
+        ((((u_int32_t *) (a))[0] == 0) && ((u_int32_t *) (a))[1] == 0) && \
+         (((u_int32_t *) (a))[2] == 0) && ((u_int32_t *) (a))[3] == 0))
 
 #define IN6_IS_ADDR_LOOPBACK(a) \
-        ((((u_int32_t *)(a))[0] == 0) && ((u_int32_t *)(a))[1] == 0) && \
-         (((u_int32_t *)(a))[2] == 0) && ((u_int32_t *)(a))[3] == htonl(1)))
+        ((((u_int32_t *) (a))[0] == 0) && ((u_int32_t *) (a))[1] == 0) && \
+         (((u_int32_t *) (a))[2] == 0) && ((u_int32_t *) (a))[3] == htonl (1)))
 
-#define IN6_IS_ADDR_MULTICAST(a) (((u_int8_t *)(a))[0] == 0xff)
+#define IN6_IS_ADDR_MULTICAST(a) (((u_int8_t *) (a))[0] == 0xff)
 
 #define IN6_IS_ADDR_LINKLOCAL(a) \
-        ((((u_int32_t *)(a))[0] & htonl(0xffc00000)) == htonl(0xfe800000))
+        ((((u_int32_t *) (a))[0] & htonl (0xffc00000)) == htonl (0xfe800000))
 
 #define IN6_IS_ADDR_SITELOCAL(a) \
-        ((((u_int32_t *)(a))[0] & htonl(0xffc00000)) == htonl(0xfec00000))
+        ((((u_int32_t *) (a))[0] & htonl (0xffc00000)) == htonl (0xfec00000))
 
 #define IN6_IS_ADDR_V4MAPPED(a) \
-        ((((u_int32_t *)(a))[0] == 0) && (((u_int32_t *)(a))[1] == 0) && \
-         (((u_int32_t *)(a))[2] == htonl(0xffff)))
+        ((((u_int32_t *) (a))[0] == 0) && (((u_int32_t *) (a))[1] == 0) && \
+         (((u_int32_t *) (a))[2] == htonl (0xffff)))
 
 #define IN6_IS_ADDR_V4COMPAT(a) \
-        ((((u_int32_t *)(a))[0] == 0) && (((u_int32_t *)(a))[1] == 0) && \
-         (((u_int32_t *)(a))[2] == 0) && (ntohl(((u_int32_t *)(a))[3]) > 1))
+        ((((u_int32_t *) (a))[0] == 0) && (((u_int32_t *) (a))[1] == 0) && \
+         (((u_int32_t *) (a))[2] == 0) && (ntohl (((u_int32_t *) (a))[3]) > 1))
 
 
 /* Bind socket to a privileged IP port.  */
@@ -306,7 +256,7 @@ extern int bindresvport __P ((int __sockfd, struct sockaddr_in *__sin));
 
 
 /* IPv6 packet information.  */
-struct in6_pktinfo 
+struct in6_pktinfo
   {
     struct in6_addr ipi6_addr;    /* src/dst IPv6 address */
     int             ipi6_ifindex; /* send/recv interface index */
similarity index 91%
rename from sysdeps/generic/netinet/ip6.h
rename to inet/netinet/ip6.h
index 487cafa..65bf721 100644 (file)
 #include <netinet/in.h>
 #include <endian.h>
 
-struct ipv6hdr {
-#if (__BYTE_ORDER == __LITTLE_ENDIAN)
+struct ipv6hdr
+{
+#if __BYTE_ORDER == __LITTLE_ENDIAN
   u_int8_t ipv6_version:4;
   u_int8_t ipv6_priority:4; /* going away? */
   u_int32_t ipv6_flowid:24;
-#elif (__BYTE_ORDER == __BIG_ENDIAN)
+#elif __BYTE_ORDER == __BIG_ENDIAN
   u_int32_t ipv6_flowid:24;
   u_int8_t ipv6_priority:4; /* going away? */
   u_int8_t ipv6_version:4;
 #else
-#error  Unknown endianness
+# error  Unknown endianness
 #endif
   u_int16_t ipv6_len;
   u_int8_t ipv6_nextheader;
diff --git a/manual/examples/fmtmsgexpl.c b/manual/examples/fmtmsgexpl.c
new file mode 100644 (file)
index 0000000..42b8bb5
--- /dev/null
@@ -0,0 +1,12 @@
+#include <fmtmsg.h>
+
+int
+main (void)
+{
+  addseverity (5, "NOTE2");
+  fmtmsg (MM_PRINT, "only1field", MM_INFO, "text2", "action2", "tag2");
+  fmtmsg (MM_PRINT, "UX:cat", 5, "invalid syntax", "refer to manual",
+          "UX:cat:001");
+  fmtmsg (MM_PRINT, "label:foo", 6, "text", "action", "tag");
+  return 0;
+}
index 3e73155..3d6a6c1 100644 (file)
@@ -29,6 +29,7 @@ representing a communications channel to a file, device, or process.
 * Stream Buffering::            How to control buffering of streams.
 * Other Kinds of Streams::      Streams that do not necessarily correspond
                                  to an open file.
+* Formatted Messages::          Print strictly formatted messages.
 @end menu
 
 @node Streams
@@ -3815,3 +3816,311 @@ wait until the rest of the manual is more done and polished.
 @end ignore
 
 @c ??? This section could use an example.
+
+
+@node Formatted Messages
+@section Formatted Messages
+@cindex formatted messages
+
+On systems which are based on System V messages of programs (especially
+the system tools) are printed in a strict form using the @code{fmtmsg}
+function.  The uniformity sometimes helps the user to interpret messages
+and the strictness tests of the @code{fmtmsg} function ensures that the
+programmer follows some minimal requirements.
+
+@menu
+* Printing Formatted Messages::   The @code{fmtmsg} function.
+* Adding Severity Classes::       Add more severity classes.
+* Example::                       How to use @code{fmtmsg} and @code{addseverity}.
+@end menu
+
+
+@node Printing Formatted Messages
+@subsection Printing Formatted Messages
+
+Messages can be printed to standard error and/or to the console.  To
+select the destination the programmer can use the following to values,
+bitwise OR combined if wanted, for the @var{classification} parameter of
+@code{fmtmsg}:
+
+@vtable @code
+@item MM_PRINT
+Display the message in standard error.
+@item MM_CONSOLE
+Display the message on the system console.
+@end vtable
+
+The errorneous piece of the system can be signal by exactly one of the
+following values which also is bitwise ORed with the
+@var{classification} parameter to @code{fmtmsg}:
+
+@vtable @code
+@item MM_HARD
+The source of the condition is some hardware.
+@item MM_SOFT
+The source of the condition is some software.
+@item MM_FIRM
+The source of the condition is some firmware.
+@end vtable
+
+A third component of the @var{classification} parameter to @code{fmtmsg}
+can describe the part of the system which detects the problem.  This is
+done by using exactly one of the following values:
+
+@vtable @code
+@item MM_APPL
+The errorneous condition is detected by the application.
+@item MM_UTIL
+The errorneous condition is detected by a utility.
+@item MM_OPSYS
+The errorneous condition is detected by the operating system.
+@end vtable
+
+A last component of @var{classification} can signal the results of this
+message.  Exactly one of the following values can be used:
+
+@vtable @code
+@item MM_RECOVER
+It is a recoverable error.
+@item MM_NRECOV
+It is a non-recoverable error.
+@end vtable
+
+@comment fmtmsg.h
+@comment XPG
+@deftypefun int fmtmsg (long int @var{classification}, const char *@var{label}, int @var{severity}, const char *@var{text}, const char *@var{action}, const char *@var{tag})
+Display a message described by its parameters on the device(s) specified
+in the @var{classification} parameter.  The @var{label} parameter
+identifies the source of the message.  The string should consist of two
+colon separated parts where the first part has not more than 10 and the
+second part not more the 14 characters.  The @var{text} parameter
+descries the condition of the error, the @var{action} parameter possible
+steps to recover from the error and the @var{tag} parameter is a
+reference to the online documentation where more information can be
+found.  It should contain the @var{label} value and a unique
+identification number.
+
+Each of the parameters can be of a special value which means this value
+is to be omitted.  The symbolic names for these values are:
+
+@vtable @code
+@item MM_NULLLBL
+Ignore @var{label} parameter.
+@item MM_NULLSEV
+Ignore @var{severity} parameter.
+@item MM_NULLMC
+Ignore @var{classification} parameter.  This implies that nothing is
+actually printed.
+@item MM_NULLTXT
+Ignore @var{text} parameter.
+@item MM_NULLACT
+Ignore @var{action} parameter.
+@item MM_NULLTAG
+Ignore @var{tag} parameter.
+@end vtable
+
+There is another way certain fields can be omitted from the output the
+standard error.  This is described below in the description of
+environment variables influencing the behaviour.
+
+The @var{severity} parameter can have one of the values in the following
+table:
+@cindex severity class
+
+@vtable @code
+@item MM_NOSEV
+Nothing is printed, this value is the same as @code{MM_NULLSEV}.
+@item MM_HALT
+This value is printed as @code{HALT}.
+@item MM_ERROR
+This value is printed as @code{ERROR}.
+@item MM_WARNING
+This value is printed as @code{WARNING}.
+@item MM_INFO
+This value is printed as @code{INFO}.
+@end vtable
+
+The numeric value of these five macros are between @code{0} and
+@code{4}.  Using the environment variable @code{SEV_LEVEL} or using the
+@code{addseverity} function one can add more severity levels with their
+corresponding string to print.  This is described below
+(@pxref{Adding Severity Classes}).
+
+@noindent
+If no parameter is ignored the output looks like this:
+
+@smallexample
+@var{label}: @var{severity-string}: @var{text}
+TO FIX: @var{action} @var{tag}
+@end smallexample
+
+The colons, new line characters and the @code{TO FIX} string are
+inserted if necessary, i.e., if the corresponding parameter is not
+ignored.
+
+This function is specified in the X/Open Portability Guide.  It is also
+available on all system derived from System V.
+
+The function return the value @code{MM_OK} if no error occurred.  If
+only the printing to standard error failed, it returns @code{MM_NOMSG}.
+If printing to the console fails, it returns @code{MM_NOCON}.  If
+nothing is printed @code{MM_NOTOK} is returned.  Among situation where
+all outputs fail this last value is also returned if a parameter value
+is incorrect.
+@end deftypefun
+
+There are two environment variables which influence the behaviour of
+@code{fmtmsg}.  The first is @code{MSGVERB}.  It is used to control the
+output actually happening on standard error (@emph{not} the console
+output).  Each of the five fields can explicitely be enabled.  To do
+this the user has to put the @code{MSGVERB} variable with a format like
+following in the environment before calling the @code{fmtmsg} function
+the first time:
+
+@smallexample
+MSGVERB=@var{keyword}[:@var{keyword}[:...]]
+@end smallexample
+
+Valid @var{keyword}s are @code{label}, @code{severity}, @code{text},
+@code{action}, and @code{tag}.  If the environment variable is not given
+or is the empty string, a not supported keyword is given or the value is
+somehow else invalid, no part of the message is masked out.
+
+The second environment variable which influences the behaviour of
+@code{fmtmsg} is @code{SEV_LEVEL}.  This variable and the change in the
+behaviour of @code{fmtmsg} is not specified in the X/Open Portability
+Guide.  It is available in System V systems, though.  It can be used to
+introduce no severity levels.  By default, only the five severity levels
+described above are available.  Any other numeric value would make
+@code{fmtmsg} print nothing.
+
+If the user puts @code{SEV_LEVEL} with a format like
+
+@smallexample
+SEV_LEVEL=[@var{description}[:@var{description}[:...]]]
+@end smallexample
+
+@noindent
+in the environment of the process before the first call to
+@code{fmtmsg}, where @var{description} has a value of the form
+
+@smallexample
+@var{severity-keyword},@var{level},@var{printstring}
+@end smallexample
+
+The @var{severity-keyword} part is not used by @code{fmtmsg} but it has
+to be present.  The @var{level} part is a string representation of a
+number.  The numeric value must be a number greater than 4.  This value
+must be used in the @var{severity} parameter of @code{fmtmsg} to select
+this class.  It is not possible to overwrite any of the predefined
+classes.  The @var{printstring} is the string printed when a message of
+this class is processed by @code{fmtmsg} (see above, @code{fmtsmg} does
+not print the numeric value but instead the string representation).
+
+
+@node Adding Severity Classes
+@subsection Adding Severity Classes
+@cindex severity class
+
+There is another possibility to introduce severity classes beside using
+the environment variable @code{SEV_LEVEL}.  This simplifies the task of
+introducing new classes in a running program.  One could use the
+@code{setenv} or @code{putenv} function to set the environment variable,
+but this toilsome.
+
+@deftypefun int addseverity (int @var{severity}, const char *@var{string})
+This function allows to introduce new severity classes which can be
+addressed by the @var{severity} parameter of the @code{fmtmsg} function.
+The @var{severity} parameter of @code{addseverity} must match the value
+for the parameter with the same name of @code{fmtmsg} and @var{string}
+is the string printed in the actual messages instead of the numeric
+value.
+
+If @var{string} is @code{NULL} the severity class with the numeric value
+according to @var{severity} is removed.
+
+The return value is @code{MM_OK} if the task was successfully performed.
+If the return value is @code{MM_NOTOK} something went wrong.  This could
+mean that no more memory is available or a class is not available when
+it has to be removed.
+
+This function is not specified in the X/Open Portability Guide although
+the @code{fmtsmg} is.  It is available on System V systems.
+@end deftypefun
+
+
+@node Example
+@subsection How to use @code{fmtmsg} and @code{addseverity}
+
+Here is a simple example program to illustrate the use of the both
+functions described in this section.
+
+@smallexample
+@include fmtmsgexpl.c.texi
+@end smallexample
+
+The second call to @code{fmtmsg} illustrates a use of this function how
+it usually happens on System V systems which heavily use this function.
+It might be worth a thought to follow the scheme used in System V
+systems so we give a short explanation here.  The value of the
+@var{label} field (@code{UX:cat}) says that the error occured in the
+Unix program @code{cat}.  The explanation of the error follows and the
+value for the @var{action} parameter is @code{"refer to manual"}.  One
+could me more specific here, if needed.  The @var{tag} field contains,
+as proposed above, the value of the string given for the @var{label}
+parameter, and additionally a unique ID (@code{001} in this case).  For
+a GNU environment this string could contain a reference to the
+corresponding node in the Info page for the program.
+
+@noindent
+Running this program without specifying the @code{MSGVERB} and
+@code{SEV_LEVEL} function produces the following output:
+
+@smallexample
+UX:cat: NOTE2: invalid syntax
+TO FIX: refer to manual UX:cat:001
+@end smallexample
+
+We see the different fields of the message and how the extra glue (the
+colons and the @code{TO FIX} string) are printed.  But only one of the
+three calls to @code{fmtmsg} produced output.  The first call does not
+print anything because the @var{label} parameter is not in the correct
+form.  As specified in @ref{Printing Formatted Messages} the string must
+contain two fields, separated by a colon.  The third @code{fmtmsg} call
+produced no output since the class with the numeric value @code{6} is
+not defined.  Although a class with numeric value @code{5} is also not
+defined by default, the call the @code{addseverity} introduces it and
+the second call to @code{fmtmsg} produces the above outout.
+
+When we change the environment of the program to contain
+@code{SEV_LEVEL=XXX,6,NOTE} when running it we get a different result:
+
+@smallexample
+UX:cat: NOTE2: invalid syntax
+TO FIX: refer to manual UX:cat:001
+label:foo: NOTE: text
+TO FIX: action tag
+@end smallexample
+
+Now the third call the @code{fmtmsg} produced some output and we see how
+the string @code{NOTE} from the environment variable appears in the
+message.
+
+Now we can reduce the output by specifying in which fields we are
+interested in.  If we additionally set the environment variable
+@code{MSGVERB} to the value @code{severity:label:action} we get the
+following output:
+
+@smallexample
+UX:cat: NOTE2
+TO FIX: refer to manual
+label:foo: NOTE
+TO FIX: action
+@end smallexample
+
+@noindent
+I.e., the output produced by the @var{text} and the @var{tag} parameters
+to @code{fmtmsg} vanished.  Please also note the now there is no colon
+after the @code{NOTE} and @code{NOTE2} strings in the output.  This is
+not necessary since there is no more output on this line since the text
+is missing.
index 545e009..28ac382 100644 (file)
@@ -321,7 +321,7 @@ res_querydomain(name, domain, class, type, answer, anslen)
        u_char *answer;         /* buffer to put answer */
        int anslen;             /* size of answer */
 {
-       char nbuf[MAXDNAME];
+       char nbuf[MAXDNAME * 2 + 2];
        const char *longname = nbuf;
        int n;
 
index 7e70e5a..b5a38bd 100644 (file)
@@ -21,7 +21,7 @@
 #
 subdir := stdlib
 
-headers        := stdlib.h alloca.h monetary.h inttypes.h
+headers        := stdlib.h alloca.h monetary.h inttypes.h fmtmsg.h
 
 routines       :=                                                            \
        atof atoi atol atoll                                                  \
@@ -39,10 +39,12 @@ routines    :=                                                            \
        srand48_r seed48_r lcong48_r                                          \
        drand48-iter                                                          \
        strtol strtoul strtoll strtoull                                       \
+       strtol_l strtoul_l strtoll_l strtoull_l                               \
        strtof strtod strtold                                                 \
+       strtof_l strtod_l strtold_l                                           \
        system canonicalize                                                   \
        a64l l64a                                                             \
-       rpmatch strfmon strfmon_l getsubopt xpg_basename
+       rpmatch strfmon strfmon_l getsubopt xpg_basename fmtmsg
 
 distribute     := exit.h grouping.h abort-instr.h
 tests          := tst-strtol tst-strtod testmb testrand testsort testdiv \
diff --git a/stdlib/fmtmsg.c b/stdlib/fmtmsg.c
new file mode 100644 (file)
index 0000000..9ce492b
--- /dev/null
@@ -0,0 +1,358 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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 <fmtmsg.h>
+#include <libc-lock.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/syslog.h>
+
+
+/* We have global data, protect the modification.  */
+__libc_lock_define_initialized (static, lock)
+
+
+enum
+{
+  label_mask = 0x01,
+  severity_mask = 0x02,
+  text_mask = 0x04,
+  action_mask = 0x08,
+  tag_mask = 0x10,
+  all_mask = label_mask | severity_mask | text_mask | action_mask | tag_mask
+};
+
+static struct
+{
+  const char *name;
+  size_t len;
+} keywords[] =
+  {
+    { "label", 5 },
+    { "severity", 8 },
+    { "text", 4 },
+    { "action", 6},
+    { "tag", 3 }
+  };
+#define NKEYWORDS (sizeof( keywords) / sizeof (keywords[0]))
+
+
+struct severity_info
+{
+  int severity;
+  const char *string;
+  struct severity_info *next;
+};
+
+
+/* List of known severities.  */
+static const struct severity_info nosev =
+{
+  MM_NOSEV, "", NULL
+};
+static const struct severity_info haltsev =
+{
+  MM_HALT, "HALT", (struct severity_info *) &nosev
+};
+static const struct severity_info errorsev =
+{
+  MM_ERROR, "ERROR", (struct severity_info *) &haltsev
+};
+static const struct severity_info warningsev =
+{
+  MM_WARNING, "WARNING", (struct severity_info *) &errorsev
+};
+static const struct severity_info infosev =
+{
+  MM_INFO, "INFO", (struct severity_info *) &warningsev
+};
+
+/* Start of the list.  */
+static struct severity_info *severity_list = (struct severity_info *) &infosev;
+
+
+/* Prototypes for local functions.  */
+static int internal_addseverity (int severity, const char *string);
+
+
+int
+fmtmsg (long int classification, const char *label, int severity,
+       const char *text, const char *action, const char *tag)
+{
+  static int print = -1;
+  int result = MM_OK;
+  struct severity_info *severity_rec;
+
+  if (print == -1)
+    {
+      __libc_lock_lock (lock);
+
+      if (print == -1)
+       {
+         const char *msgverb_var = getenv ("MSGVERB");
+         const char *sevlevel_var = getenv ("SEV_LEVEL");
+
+         if (msgverb_var != NULL && msgverb_var[0] != '\0')
+           {
+             /* Using this extra variable allows us to work without
+                locking.  */
+             print = 0;
+
+             do
+               {
+                 size_t cnt;
+
+                 for (cnt = 0; cnt < NKEYWORDS; ++cnt)
+                   if (memcmp (msgverb_var,
+                               keywords[cnt].name, keywords[cnt].len) == 0
+                       && (msgverb_var[keywords[cnt].len] == ':'
+                           || msgverb_var[keywords[cnt].len] == '\0'))
+                     break;
+
+                 if (cnt < NKEYWORDS)
+                   {
+                     print |= 1 << cnt;
+
+                     msgverb_var += keywords[cnt].len;
+                     if (msgverb_var[0] == ':')
+                       ++msgverb_var;
+                   }
+                 else
+                   {
+                    /* We found an illegal keyword in the
+                       environment variable.  The specifications say
+                       that we print all fields.  */
+                     print = all_mask;
+                     break;
+                   }
+               }
+             while (msgverb_var[0] != '\0');
+           }
+         else
+           print = all_mask;
+
+
+         if (sevlevel_var != NULL)
+           while (sevlevel_var[0] != '\0')
+             {
+               const char *end = strchr (sevlevel_var, ':');
+               int level;
+
+               if (end == NULL)
+                 end = strchr (sevlevel_var, '\0');
+
+               /* First field: keyword.  This is not used here but it
+                  must be present.  */
+               while (sevlevel_var < end)
+                 if (*sevlevel_var++ == ',')
+                   break;
+
+               if (sevlevel_var < end)
+                 {
+                   /* Second field: severity level, a number.  */
+                   char *cp;
+
+                   level = strtol (sevlevel_var, &cp, 0);
+                   if (cp != sevlevel_var && cp < end && *cp++ == ','
+                       && level > MM_INFO)
+                     {
+                       const char *new_string;
+
+                       new_string = __strndup (cp, end - cp);
+
+                       if (new_string != NULL
+                           && (internal_addseverity (level, new_string)
+                               != MM_OK))
+                         free ((char *) new_string);
+                     }
+                 }
+
+               sevlevel_var = end + (*end == ':' ? 1 : 0);
+             }
+       }
+
+      __libc_lock_unlock (lock);
+    }
+
+  /* Start the real work.  First check whether the input is ok.  */
+  if (label != MM_NULLLBL)
+    {
+      /* Must be two fields, separated by a colon.  */
+      const char *cp = strchr (label, ':');
+      if (cp == NULL)
+       return MM_NOTOK;
+
+      /* The first field must not contain more then 10 bytes.  */
+      if (cp - label > 10
+         /* The second field must not have more then 14 bytes.  */
+         || strlen (cp + 1) > 14)
+       return MM_NOTOK;
+    }
+
+  for (severity_rec = severity_list; severity_rec != NULL;
+       severity_rec = severity_rec->next)
+    if (severity == severity_rec->severity)
+      /* Bingo.  */
+      break;
+
+  /* If we don't know anything about the severity level return an error.  */
+  if (severity_rec == NULL)
+    return MM_NOTOK;
+
+
+  /* Now we can print.  */
+  if (classification & MM_PRINT)
+    {
+      int do_label = (print & label_mask) && label != MM_NULLLBL;
+      int do_severity = (print & severity_mask) && severity != MM_NULLSEV;
+      int do_text = (print & text_mask) && text != MM_NULLTXT;
+      int do_action = (print & action_mask) && action != MM_NULLACT;
+      int do_tag = (print & tag_mask) && tag != MM_NULLTAG;
+
+      if (fprintf (stderr, "%s%s%s%s%s%s%s%s%s%s\n",
+                  do_label ? label : "",
+                  do_label && (do_severity | do_text) ? ": " : "",
+                  do_severity ? severity_rec->string : "",
+                  do_severity && do_text ? ": " : "",
+                  do_text ? text : "",
+                  (do_label | do_severity | do_text) && (do_action | do_tag)
+                  ? "\n" : "",
+                  do_action ? "TO FIX: " : "",
+                  do_action ? action : "",
+                  do_action && do_tag ? " " : "",
+                  do_tag ? tag : "") == EOF)
+       /* Oh, oh.  An error occured during the output.  */
+       result = MM_NOMSG;
+    }
+
+  if (classification & MM_CONSOLE)
+    {
+      int do_label = label != MM_NULLLBL;
+      int do_severity = severity != MM_NULLSEV;
+      int do_text = text != MM_NULLTXT;
+      int do_action = action != MM_NULLACT;
+      int do_tag = tag != MM_NULLTAG;
+
+      syslog (LOG_ERR, "%s%s%s%s%s%s%s%s%s%s\n",
+             do_label ? label : "",
+             do_label && (do_severity | do_text) ? ": " : "",
+             do_severity ? severity_rec->string : "",
+             do_severity && do_text ? ": " : "",
+             do_text ? text : "",
+             (do_label | do_severity | do_text) && (do_action | do_tag)
+             ? "\n" : "",
+             do_action ? "TO FIX: " : "",
+             do_action ? action : "",
+             do_action && do_tag ? " " : "",
+             do_tag ? tag : "");
+    }
+
+  return result;
+}
+
+
+/* Add the new entry to the list.  */
+static int
+internal_addseverity (int severity, const char *string)
+{
+  struct severity_info *runp, *lastp;
+  int result = MM_OK;
+
+  /* First see if there is already a record for the severity level.  */
+  for (runp = severity_list, lastp = NULL; runp != NULL; runp = runp-> next)
+    if (runp->severity == severity)
+      break;
+    else
+      lastp = runp;
+
+  if (runp != NULL)
+    {
+      /* Release old string.  */
+      free ((char *) runp->string);
+
+      if (string != NULL)
+       /* Change the string.  */
+       runp->string = string;
+      else
+       {
+         /* Remove the severity class.  */
+         if (lastp == NULL)
+           severity_list = runp->next;
+         else
+           lastp->next = runp->next;
+
+         free (runp);
+       }
+    }
+  else if (string != NULL)
+    {
+      runp = malloc (sizeof (*runp));
+      if (runp == NULL)
+       result = MM_NOTOK;
+      else
+       {
+         runp->severity = severity;
+         runp->next = severity_list;
+         runp->string = string;
+         severity_list = runp;
+       }
+    }
+  else
+    /* We tried to remove a non-existing severity class.  */
+    result = MM_NOTOK;
+
+  return result;
+}
+
+
+/* Add new severity level or remove old one.  */
+int
+addseverity (int severity, const char *string)
+{
+  int result;
+  const char *new_string;
+
+  if (string == NULL)
+    /* We want to remove the severity class.  */
+    new_string = NULL;
+  else
+    {
+      new_string = __strdup (string);
+
+      if (new_string == NULL || severity <= MM_INFO)
+       /* Allocation failed or illegal value.  */
+       return MM_NOTOK;
+    }
+
+  /* Protect the global data.  */
+  __libc_lock_lock (lock);
+
+  /* Do the real work.  */
+  result = internal_addseverity (severity, string);
+
+  if (result != MM_OK)
+    /* Free the allocated string.  */
+    free ((char *) new_string);
+
+  /* Release the lock.  */
+  __libc_lock_unlock (lock);
+
+  return result;
+}
diff --git a/stdlib/fmtmsg.h b/stdlib/fmtmsg.h
new file mode 100644 (file)
index 0000000..07fa98a
--- /dev/null
@@ -0,0 +1,107 @@
+/* Message display handling.
+   Copyright (C) 1997 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.  */
+
+#ifndef __FMTMSG_H
+
+#define __FMTMSG_H     1
+#include <features.h>
+
+#define __need_NULL
+#include <stddef.h>
+
+
+__BEGIN_DECLS
+
+/* Values to control `fmtmsg' function.  */
+enum
+{
+  MM_HARD = 0x001,     /* Source of the condition is hardware.  */
+#define MM_HARD MM_HARD
+  MM_SOFT = 0x002,     /* Source of the condition is software.  */
+#define MM_SOFT MM_SOFT
+  MM_FIRM = 0x004,     /* Source of the condition is firmware.  */
+#define MM_FIRM MM_FIRM
+  MM_APPL = 0x008,     /* Condition detected by application.  */
+#define MM_APPL MM_APPL
+  MM_UTIL = 0x010,     /* Condition detected by utility.  */
+#define MM_UTIL MM_UTIL
+  MM_OPSYS = 0x020,    /* Condition detected by operating system.  */
+#define MM_OPSYS MM_OPSYS
+  MM_RECOVER = 0x040,  /* Recoverable error.  */
+#define MM_RECOVER MM_RECOVER
+  MM_NRECOV = 0x080,   /* Non-recoverable error.  */
+#define MM_NRECOV MM_NRECOV
+  MM_PRINT = 0x100,    /* Display message in standard error.  */
+#define MM_PRINT MM_PRINT
+  MM_CONSOLE = 0x200   /* Display message on system console.  */
+#define MM_CONSOLE MM_CONSOLE
+};
+
+/* Values to be for SEVERITY parameter of `fmtmsg'.  */
+enum
+{
+  MM_NOSEV = 0,                /* No severity level provided for the message.  */
+#define MM_NOSEV MM_NOSEV
+  MM_HALT,             /* Error causing application to halt.  */
+#define MM_HALT MM_HALT
+  MM_ERROR,            /* Application has encountered a non-fatal fault.  */
+#define MM_ERROR MM_ERROR
+  MM_WARNING,          /* Application has detected unusual non-error
+                          condition.  */
+#define MM_WARNING MM_WARNING
+  MM_INFO              /* Informative message.  */
+#define MM_INFO MM_INFO
+};
+
+
+/* Macros which can be used as null values for the arguments of `fmtmsg'.  */
+#define MM_NULLLBL     NULL
+#define MM_NULLSEV     0
+#define MM_NULLMC      ((long int) 0)
+#define MM_NULLTXT     NULL
+#define MM_NULLACT     NULL
+#define MM_NULLTAG     NULL
+
+
+/* Possible return values of `fmtmsg'.  */
+enum
+{
+  MM_NOTOK = -1,
+#define MM_NOTOK MM_NOTOK
+  MM_OK = 0,
+#define MM_OK MM_OK
+  MM_NOMSG = 1,
+#define MM_NOMSG MM_NOMSG
+  MM_NOCON = 4
+#define MM_NOCON MM_NOCON
+};
+
+
+/* Print message with given CLASSIFICATION, LABEL, SEVERITY, TEXT, ACTION
+   and TAG to console or standard error.  */
+extern int fmtmsg __P ((long int __classification, __const char *__label,
+                       int __severity, __const char *__text,
+                       __const char *__action, __const char *__tag));
+
+/* Add or remove severity level.  */
+extern int addseverity __P ((int __severity, __const char *__string));
+
+__END_DECLS
+
+#endif /* fmtmsg.h */
index 98ed889..40c24eb 100644 (file)
@@ -128,6 +128,53 @@ extern unsigned long long int strtoull __P ((__const char *__restrict __nptr,
 #endif /* ISO C 9X or GCC and use MISC.  */
 
 
+#ifdef __USE_GNU
+/* The concept of one static locale per category is not very well
+   thought out.  Many applications will need to process its data using
+   information from several different locales.  Another application is
+   the implementation of the internationalization handling in the
+   upcoming ISO C++ standard library.  To support this another set of
+   the functions using locale data exist which have an additional
+   argument.
+
+   Attention: all these functions are *not* standardized in any form.
+   This is a proof-of-concept implementation.  */
+
+/* Structure for reentrant locale using functions.  This is an
+   (almost) opaque type for the user level programs.  */
+# include <xlocale.h>
+
+/* Special versions of the functions above which take the locale to
+   use as an additional parameter.  */
+extern long int __strtol_l __P ((__const char *__restrict __nptr,
+                                char **__restrict __endptr, int __base,
+                                __locale_t __loc));
+
+extern unsigned long int __strtoul_l __P ((__const char *__restrict __nptr,
+                                          char **__restrict __endptr,
+                                          int __base, __locale_t __loc));
+
+extern long long int __strtoll_l __P ((__const char *__restrict __nptr,
+                                      char **__restrict __endptr, int __base,
+                                      __locale_t __loc));
+
+extern unsigned long long int __strtoull_l __P ((__const char *__restrict
+                                                __nptr,
+                                                char **__restrict __endptr,
+                                                int __base,
+                                                __locale_t __loc));
+
+extern double __strtod_l __P ((__const char *__restrict __nptr,
+                              char **__restrict __endptr, __locale_t __loc));
+
+extern float __strtof_l __P ((__const char *__restrict __nptr,
+                             char **__restrict __endptr, __locale_t __loc));
+
+extern __long_double_t __strtold_l __P ((__const char *__restrict __nptr,
+                                        char **__restrict __endptr,
+                                        __locale_t __loc));
+#endif /* GNU */
+
 
 /* The internal entry points for `strtoX' take an extra flag argument
    saying whether or not to parse locale-dependent number grouping.  */
index e0c9b08..5ddb956 100644 (file)
 # define FLOAT         double
 # define FLT           DBL
 # ifdef USE_WIDE_CHAR
-#  define STRTOF       wcstod
+#  ifdef USE_IN_EXTENDED_LOCALE_MODEL
+#   define STRTOF      __wcstod_l
+#  else
+#   define STRTOF      wcstod
+#  endif
 # else
-#  define STRTOF       strtod
+#  ifdef USE_IN_EXTENDED_LOCALE_MODEL
+#   define STRTOF      __strtod_l
+#  else
+#   define STRTOF      strtod
+#  endif
 # endif
 # define MPN2FLOAT     __mpn_construct_double
 # define FLOAT_HUGE_VAL        HUGE_VAL
        u.ieee.mantissa1 = (mant) & 0xffffffff;                               \
   } while (0)
 #endif
-
-#ifdef USE_WIDE_CHAR
-# include <wctype.h>
-# include <wchar.h>
-# define STRING_TYPE wchar_t
-# define CHAR_TYPE wint_t
-# define L_(Ch) L##Ch
-# define ISSPACE(Ch) iswspace (Ch)
-# define ISDIGIT(Ch) iswdigit (Ch)
-# define ISXDIGIT(Ch) iswxdigit (Ch)
-# define TOLOWER(Ch) towlower (Ch)
-# define STRNCASECMP(S1, S2, N) __wcsncasecmp ((S1), (S2), (N))
-# define STRTOULL(S, E, B) wcstoull ((S), (E), (B))
-#else
-# define STRING_TYPE char
-# define CHAR_TYPE char
-# define L_(Ch) Ch
-# define ISSPACE(Ch) isspace (Ch)
-# define ISDIGIT(Ch) isdigit (Ch)
-# define ISXDIGIT(Ch) isxdigit (Ch)
-# define TOLOWER(Ch) tolower (Ch)
-# define STRNCASECMP(S1, S2, N) __strncasecmp ((S1), (S2), (N))
-# define STRTOULL(S, E, B) strtoull ((S), (E), (B))
-#endif
 /* End of configuration part.  */
 \f
 #include <ctype.h>
 #include <assert.h>
 
 
+/* We use this code also for the extended locale handling where the
+   function gets as an additional argument the locale which has to be
+   used.  To access the values we have to redefine the _NL_CURRENT
+   macro.  */
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# undef _NL_CURRENT
+# define _NL_CURRENT(category, item) \
+  (current->values[_NL_ITEM_INDEX (item)].string)
+# define LOCALE_PARAM , loc
+# define LOCALE_PARAM_DECL __locale_t loc;
+#else
+# define LOCALE_PARAM
+# define LOCALE_PARAM_DECL
+#endif
+
+
+#ifdef USE_WIDE_CHAR
+# include <wctype.h>
+# include <wchar.h>
+# define STRING_TYPE wchar_t
+# define CHAR_TYPE wint_t
+# define L_(Ch) L##Ch
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+#  define ISSPACE(Ch) __iswspace_l ((Ch), loc)
+#  define ISDIGIT(Ch) __iswdigit_l ((Ch), loc)
+#  define ISXDIGIT(Ch) __iswxdigit_l ((Ch), loc)
+#  define TOLOWER(Ch) __towlower_l ((Ch), loc)
+#  define STRNCASECMP(S1, S2, N) __wcsncasecmp_l ((S1), (S2), (N), loc)
+#  define STRTOULL(S, E, B) __wcstoull_l ((S), (E), (B), loc)
+# else
+#  define ISSPACE(Ch) iswspace (Ch)
+#  define ISDIGIT(Ch) iswdigit (Ch)
+#  define ISXDIGIT(Ch) iswxdigit (Ch)
+#  define TOLOWER(Ch) towlower (Ch)
+#  define STRNCASECMP(S1, S2, N) __wcsncasecmp ((S1), (S2), (N))
+#  define STRTOULL(S, E, B) wcstoull ((S), (E), (B))
+# endif
+#else
+# define STRING_TYPE char
+# define CHAR_TYPE char
+# define L_(Ch) Ch
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+#  define ISSPACE(Ch) __isspace_l ((Ch), loc)
+#  define ISDIGIT(Ch) __isdigit_l ((Ch), loc)
+#  define ISXDIGIT(Ch) __isxdigit_l ((Ch), loc)
+#  define TOLOWER(Ch) __tolower_l ((Ch), loc)
+#  define STRNCASECMP(S1, S2, N) __strncasecmp_l ((S1), (S2), (N), loc)
+#  define STRTOULL(S, E, B) __strtoull_l ((S), (E), (B), loc)
+# else
+#  define ISSPACE(Ch) isspace (Ch)
+#  define ISDIGIT(Ch) isdigit (Ch)
+#  define ISXDIGIT(Ch) isxdigit (Ch)
+#  define TOLOWER(Ch) tolower (Ch)
+#  define STRNCASECMP(S1, S2, N) __strncasecmp ((S1), (S2), (N))
+#  define STRTOULL(S, E, B) strtoull ((S), (E), (B))
+# endif
+#endif
+
+
 /* Constants we need from float.h; select the set for the FLOAT precision.  */
 #define MANT_DIG       PASTE(FLT,_MANT_DIG)
 #define        DIG             PASTE(FLT,_DIG)
@@ -354,10 +397,11 @@ __mpn_lshift_1 (mp_limb_t *ptr, mp_size_t size, unsigned int count,
    return 0.0.  If the number is too big to be represented, set `errno' to
    ERANGE and return HUGE_VAL with the appropriate sign.  */
 FLOAT
-INTERNAL (STRTOF) (nptr, endptr, group)
+INTERNAL (STRTOF) (nptr, endptr, group LOCALE_PARAM)
      const STRING_TYPE *nptr;
      STRING_TYPE **endptr;
      int group;
+     LOCALE_PARAM_DECL
 {
   int negative;                        /* The sign of the number.  */
   MPN_VAR (num);               /* MP representation of the number.  */
@@ -400,6 +444,10 @@ INTERNAL (STRTOF) (nptr, endptr, group)
      in the format described in <locale.h>.  */
   const char *grouping;
 
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+  struct locale_data *current = loc->__locales[LC_NUMERIC];
+#endif
+
   if (group)
     {
       grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
@@ -1352,9 +1400,10 @@ FLOAT
 #ifdef weak_function
 weak_function
 #endif
-STRTOF (nptr, endptr)
+STRTOF (nptr, endptr LOCALE_PARAM)
      const STRING_TYPE *nptr;
      STRING_TYPE **endptr;
+     LOCALE_PARAM_DECL
 {
-  return INTERNAL (STRTOF) (nptr, endptr, 0);
+  return INTERNAL (STRTOF) (nptr, endptr, 0 LOCALE_PARAM);
 }
diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c
new file mode 100644 (file)
index 0000000..c2f0823
--- /dev/null
@@ -0,0 +1,25 @@
+/* Convert string representing a number to float value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern double ____strtod_l_internal (const char *, char **, int, __locale_t);
+
+#include <strtod.c>
index 026b5ee..9d07027 100644 (file)
@@ -3,7 +3,11 @@
 
 #define        FLOAT           float
 #define        FLT             FLT
-#define        STRTOF          strtof
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define STRTOF                __strtof_l
+#else
+# define STRTOF                strtof
+#endif
 #define        MPN2FLOAT       __mpn_construct_float
 #define        FLOAT_HUGE_VAL  HUGE_VALF
 #define SET_MANTISSA(flt, mant) \
diff --git a/stdlib/strtof_l.c b/stdlib/strtof_l.c
new file mode 100644 (file)
index 0000000..262c5e0
--- /dev/null
@@ -0,0 +1,25 @@
+/* Convert string representing a number to float value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern float ____strtof_l_internal (const char *, char **, int, __locale_t);
+
+#include <strtof.c>
index 6ec096d..97ad234 100644 (file)
@@ -64,30 +64,62 @@ extern int errno;
 #endif
 
 /* Determine the name.  */
-#if UNSIGNED
-# ifdef USE_WIDE_CHAR
-#  ifdef QUAD
-#   define strtol wcstoull
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# if UNSIGNED
+#  ifdef USE_WIDE_CHAR
+#   ifdef QUAD
+#    define strtol __wcstoull_l
+#   else
+#    define strtol __wcstoul_l
+#   endif
 #  else
-#   define strtol wcstoul
+#   ifdef QUAD
+#    define strtol __strtoull_l
+#   else
+#    define strtol __strtoul_l
+#   endif
 #  endif
 # else
-#  ifdef QUAD
-#   define strtol strtoull
+#  ifdef USE_WIDE_CHAR
+#   ifdef QUAD
+#    define strtol __wcstoll_l
+#   else
+#    define strtol __wcstol_l
+#   endif
 #  else
-#   define strtol strtoul
+#   ifdef QUAD
+#    define strtol __strtoll_l
+#   else
+#    define strtol __strtol_l
+#   endif
 #  endif
 # endif
 #else
-# ifdef USE_WIDE_CHAR
-#  ifdef QUAD
-#   define strtol wcstoll
+# if UNSIGNED
+#  ifdef USE_WIDE_CHAR
+#   ifdef QUAD
+#    define strtol wcstoull
+#   else
+#    define strtol wcstoul
+#   endif
 #  else
-#   define strtol wcstol
+#   ifdef QUAD
+#    define strtol strtoull
+#   else
+#    define strtol strtoul
+#   endif
 #  endif
 # else
-#  ifdef QUAD
-#   define strtol strtoll
+#  ifdef USE_WIDE_CHAR
+#   ifdef QUAD
+#    define strtol wcstoll
+#   else
+#    define strtol wcstol
+#   endif
+#  else
+#   ifdef QUAD
+#    define strtol strtoll
+#   endif
 #  endif
 # endif
 #endif
@@ -119,22 +151,51 @@ extern int errno;
 #endif
 #endif
 
+
+/* We use this code also for the extended locale handling where the
+   function gets as an additional argument the locale which has to be
+   used.  To access the values we have to redefine the _NL_CURRENT
+   macro.  */
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# undef _NL_CURRENT
+# define _NL_CURRENT(category, item) \
+  (current->values[_NL_ITEM_INDEX (item)].string)
+# define LOCALE_PARAM , loc
+# define LOCALE_PARAM_DECL __locale_t loc;
+#else
+# define LOCALE_PARAM
+# define LOCALE_PARAM_DECL
+#endif
+
+
 #ifdef USE_WIDE_CHAR
 # include <wchar.h>
 # include <wctype.h>
 # define L_(Ch) L##Ch
 # define UCHAR_TYPE wint_t
 # define STRING_TYPE wchar_t
-# define ISSPACE(Ch) iswspace (Ch)
-# define ISALPHA(Ch) iswalpha (Ch)
-# define TOUPPER(Ch) towupper (Ch)
-#else
-# define L_(Ch) Ch
-# define UCHAR_TYPE unsigned char
-# define STRING_TYPE char
-# define ISSPACE(Ch) isspace (Ch)
-# define ISALPHA(Ch) isalpha (Ch)
-# define TOUPPER(Ch) toupper (Ch)
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+#  define ISSPACE(Ch) __iswspace_l ((Ch), loc)
+#  define ISALPHA(Ch) __iswalpha_l ((Ch), loc)
+#  define TOUPPER(Ch) __towupper_l ((Ch), loc)
+# else
+#  define ISSPACE(Ch) iswspace (Ch)
+#  define ISALPHA(Ch) iswalpha (Ch)
+#  define TOUPPER(Ch) towupper (Ch)
+# endif
+# else
+#  define L_(Ch) Ch
+#  define UCHAR_TYPE unsigned char
+#  define STRING_TYPE char
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+#  define ISSPACE(Ch) __isspace_l ((Ch), loc)
+#  define ISALPHA(Ch) __isalpha_l ((Ch), loc)
+#  define TOUPPER(Ch) __toupper_l ((Ch), loc)
+# else
+#  define ISSPACE(Ch) isspace (Ch)
+#  define ISALPHA(Ch) isalpha (Ch)
+#  define TOUPPER(Ch) toupper (Ch)
+# endif
 #endif
 
 #ifdef __STDC__
@@ -151,6 +212,7 @@ extern int errno;
 #endif
 
 
+
 /* Convert NPTR to an `unsigned long int' or `long int' in base BASE.
    If BASE is 0 the base is determined by the presence of a leading
    zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
@@ -159,11 +221,12 @@ extern int errno;
    one converted is stored in *ENDPTR.  */
 
 INT
-INTERNAL (strtol) (nptr, endptr, base, group)
+INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
      const STRING_TYPE *nptr;
      STRING_TYPE **endptr;
      int base;
      int group;
+     LOCALE_PARAM_DECL
 {
   int negative;
   register unsigned LONG int cutoff;
@@ -175,6 +238,9 @@ INTERNAL (strtol) (nptr, endptr, base, group)
   int overflow;
 
 #ifdef USE_NUMBER_GROUPING
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+  struct locale_data *current = loc->__locales[LC_NUMERIC];
+# endif
   /* The thousands character of the current locale.  */
   wchar_t thousands;
   /* The numeric grouping specification of the current locale,
@@ -362,10 +428,11 @@ INT
 #ifdef weak_function
 weak_function
 #endif
-strtol (nptr, endptr, base)
+strtol (nptr, endptr, base LOCALE_PARAM)
      const STRING_TYPE *nptr;
      STRING_TYPE **endptr;
      int base;
+     LOCALE_PARAM_DECL
 {
-  return INTERNAL (strtol) (nptr, endptr, base, 0);
+  return INTERNAL (strtol) (nptr, endptr, base, 0 LOCALE_PARAM);
 }
diff --git a/stdlib/strtol_l.c b/stdlib/strtol_l.c
new file mode 100644 (file)
index 0000000..38f7555
--- /dev/null
@@ -0,0 +1,26 @@
+/* Convert string representing a number to integer value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern long int ____strtol_l_internal (const char *, char **, int, int,
+                                      __locale_t);
+
+#include <strtol.c>
index 9747232..32e7e90 100644 (file)
@@ -3,7 +3,11 @@
 
 #define        FLOAT           long double
 #define        FLT             LDBL
-#define        STRTOF          strtold
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define STRTOF                __strtold_l
+#else
+# define STRTOF                strtold
+#endif
 #define        MPN2FLOAT       __mpn_construct_long_double
 #define        FLOAT_HUGE_VAL  HUGE_VALL
 #define SET_MANTISSA(flt, mant) \
diff --git a/stdlib/strtold_l.c b/stdlib/strtold_l.c
new file mode 100644 (file)
index 0000000..fb36ef7
--- /dev/null
@@ -0,0 +1,26 @@
+/* Convert string representing a number to float value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern long double ____strtold_l_internal (const char *, char **, int,
+                                          __locale_t);
+
+#include <strtold.c>
diff --git a/stdlib/strtoll_l.c b/stdlib/strtoll_l.c
new file mode 100644 (file)
index 0000000..7611887
--- /dev/null
@@ -0,0 +1,26 @@
+/* Convert string representing a number to integer value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern long long int ____strtoll_l_internal (const char *, char **, int, int,
+                                            __locale_t);
+
+#include <strtoll.c>
diff --git a/stdlib/strtoul_l.c b/stdlib/strtoul_l.c
new file mode 100644 (file)
index 0000000..c26e234
--- /dev/null
@@ -0,0 +1,26 @@
+/* Convert string representing a number to integer value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern unsigned long int ____strtoul_l_internal (const char *, char **, int,
+                                                int, __locale_t);
+
+#include <strtoul.c>
diff --git a/stdlib/strtoull_l.c b/stdlib/strtoull_l.c
new file mode 100644 (file)
index 0000000..2d8058f
--- /dev/null
@@ -0,0 +1,26 @@
+/* Convert string representing a number to integer value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern unsigned long long int ____strtoull_l_internal (const char *, char **,
+                                                      int, int, __locale_t);
+
+#include <strtoull.c>
index 6704dbf..b924dfc 100644 (file)
@@ -24,14 +24,14 @@ subdir      := string
 headers        := string.h strings.h memory.h endian.h bytesex.h \
           argz.h envz.h
 
-routines       := strcat strchr strcmp strcoll strcpy strcspn strverscmp       \
-                  strdup strndup       \
+routines       := strcat strchr strcmp strcoll strcpy strcspn          \
+                  strverscmp strdup strndup                            \
                   strerror _strerror strerror_r strlen strnlen         \
                   strncat strncmp strncpy                              \
                   strrchr strpbrk strsignal strspn strstr strtok       \
                   strtok_r strxfrm memchr memcmp memmove memset        \
                   bcopy bzero ffs stpcpy stpncpy                       \
-                  strcasecmp strncase                                  \
+                  strcasecmp strncase strcasecmp_l strncase_l          \
                   memccpy memcpy wordcopy strsep                       \
                   swab strfry memfrob memmem                           \
                   $(addprefix argz-,append count create ctsep next     \
index 4a79dce..24beb6c 100644 (file)
@@ -233,6 +233,16 @@ extern int strncasecmp __P ((__const char *__s1, __const char *__s2,
                             size_t __n));
 #endif /* Use BSD or X/Open Unix.  */
 
+#ifdef __USE_GNU
+/* Again versions of a few functions which use the given locale instead
+   of the global one.  */
+extern int __strcasecmp_l __P ((__const char *__s1, __const char *__s2,
+                               __locale_t __loc));
+
+extern int __strncasecmp_l __P ((__const char *__s1, __const char *__s2,
+                                size_t __n, __locale_t __loc));
+#endif
+
 #ifdef __USE_BSD
 /* Return the next DELIM-delimited token from *STRINGP,
    terminating it with a '\0', and update *STRINGP to point past it.  */
index 7160983..641d3c2 100644 (file)
@@ -112,7 +112,8 @@ program RUSERSPROG {
 %       int uta_cnt;
 %};
 %typedef struct utmparr utmparr;
-%int xdr_utmparr(XDR *xdrs, struct utmparr *objp);
+%
+%extern bool_t xdr_utmparr __P ((XDR *xdrs, struct utmparr *objp));
 %
 %struct utmpidle {
 %      struct ru_utmp ui_utmp;
@@ -124,7 +125,7 @@ program RUSERSPROG {
 %      int uia_cnt;
 %};
 %
-%int xdr_utmpidlearr(XDR *xdrs, struct utmpidlearr *objp);
+%extern bool_t xdr_utmpidlearr __P ((XDR *xdrs, struct utmpidlearr *objp));
 %
 %#ifdef        __cplusplus
 %}
@@ -133,6 +134,8 @@ program RUSERSPROG {
 
 
 #ifdef RPC_XDR
+%bool_t xdr_utmp (XDR *xdrs, struct ru_utmp *objp);
+%
 %bool_t
 %xdr_utmp(xdrs, objp)
 %      XDR *xdrs;
@@ -161,13 +164,15 @@ program RUSERSPROG {
 %      return (TRUE);
 %}
 %
+%bool_t xdr_utmpptr(XDR *xdrs, struct ru_utmp **objpp);
+%
 %bool_t
 %xdr_utmpptr(xdrs, objpp)
 %      XDR *xdrs;
 %      struct ru_utmp **objpp;
 %{
 %      if (!xdr_reference(xdrs, (char **) objpp, sizeof (struct ru_utmp),
-%                         xdr_utmp)) {
+%                         (xdrproc_t) xdr_utmp)) {
 %              return (FALSE);
 %      }
 %      return (TRUE);
@@ -179,12 +184,15 @@ program RUSERSPROG {
 %      struct utmparr *objp;
 %{
 %      if (!xdr_array(xdrs, (char **)&objp->uta_arr, (u_int *)&objp->uta_cnt,
-%                     MAXUSERS, sizeof(struct ru_utmp *), xdr_utmpptr)) {
+%                     MAXUSERS, sizeof(struct ru_utmp *),
+%                     (xdrproc_t) xdr_utmpptr)) {
 %              return (FALSE);
 %      }
 %      return (TRUE);
 %}
 %
+%bool_t xdr_utmpidle(XDR *xdrs, struct utmpidle *objp);
+%
 %bool_t
 %xdr_utmpidle(xdrs, objp)
 %      XDR *xdrs;
@@ -199,13 +207,15 @@ program RUSERSPROG {
 %      return (TRUE);
 %}
 %
+%bool_t xdr_utmpidleptr(XDR *xdrs, struct utmpidle **objp);
+%
 %bool_t
 %xdr_utmpidleptr(xdrs, objpp)
 %      XDR *xdrs;
 %      struct utmpidle **objpp;
 %{
 %      if (!xdr_reference(xdrs, (char **) objpp, sizeof (struct utmpidle),
-%                         xdr_utmpidle)) {
+%                         (xdrproc_t) xdr_utmpidle)) {
 %              return (FALSE);
 %      }
 %      return (TRUE);
@@ -217,7 +227,8 @@ program RUSERSPROG {
 %      struct utmpidlearr *objp;
 %{
 %      if (!xdr_array(xdrs, (char **)&objp->uia_arr, (u_int *)&objp->uia_cnt,
-%                     MAXUSERS, sizeof(struct utmpidle *), xdr_utmpidleptr)) {
+%                     MAXUSERS, sizeof(struct utmpidle *),
+%                     (xdrproc_t) xdr_utmpidleptr)) {
 %              return (FALSE);
 %      }
 %      return (TRUE);
index 7a51df5..49d6830 100644 (file)
@@ -86,7 +86,7 @@ elf_machine_load_address (void)
 /* Set up the loaded object described by L so its unrelocated PLT
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
 
-static inline void
+static inline int
 elf_machine_runtime_setup (struct link_map *l, int lazy)
 {
   Elf64_Addr plt;
@@ -104,7 +104,13 @@ elf_machine_runtime_setup (struct link_map *l, int lazy)
 
       /* Identify this shared object */
       *(Elf64_Addr *)(plt + 24) = (Elf64_Addr) l;
+
+      /* If the first instruction of the plt entry is not
+        "br $28, plt0", we cannot do lazy relocation.  */
+      lazy = (*(unsigned *)(plt + 32) == 0xc39ffff7);
     }
+
+  return lazy;
 }
 
 /* This code is used in dl-runtime.c to call the `fixup' function
@@ -145,9 +151,11 @@ _dl_runtime_resolve:
        .prologue 1
        /* Set up the arguments for _dl_runtime_resolve. */
        /* $16 = link_map out of plt0 */
+       /* $17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24 */
+       subq    $28, $27, $17
        ldq     $16, 8($27)
-       /* $17 = offset of reloc entry */
-       mov     $28, $17
+       subq    $17, 20, $17
+       addq    $17, $17, $17
        /* Do the fixup */
        bsr     $26, fixup..ng
        /* Move the destination address into position.  */
@@ -290,14 +298,18 @@ elf_alpha_fix_plt(struct link_map *l,
       lo = (short)hi;
       hi = (hi - lo) >> 16;
 
-      /* Emit "ldah $27,H($27)" */
-      plte[0] = 0x277b0000 | (hi & 0xffff);
-
       /* Emit "lda $27,L($27)" */
       plte[1] = 0x237b0000 | (lo & 0xffff);
 
       /* Emit "br $31,function" */
       plte[2] = 0xc3e00000 | (edisp & 0x1fffff);
+
+      /* Think about thread-safety -- the previous instructions must be
+        committed to memory before the first is overwritten.  */
+      __asm__ __volatile__("wmb" : : : "memory");
+
+      /* Emit "ldah $27,H($27)" */
+      plte[0] = 0x277b0000 | (hi & 0xffff);
     }
   else
     {
@@ -310,14 +322,18 @@ elf_alpha_fix_plt(struct link_map *l,
       lo = (short)hi;
       hi = (hi - lo) >> 16;
 
-      /* Emit "ldah $27,H($27)" */
-      plte[0] = 0x277b0000 | (hi & 0xffff);
-
       /* Emit "ldq $27,L($27)" */
       plte[1] = 0xa77b0000 | (lo & 0xffff);
 
       /* Emit "jmp $31,($27)" */
       plte[2] = 0x6bfb0000;
+
+      /* Think about thread-safety -- the previous instructions must be
+        committed to memory before the first is overwritten.  */
+      __asm__ __volatile__("wmb" : : : "memory");
+
+      /* Emit "ldah $27,H($27)" */
+      plte[0] = 0x277b0000 | (hi & 0xffff);
     }
 
   /* At this point, if we've been doing runtime resolution, Icache is dirty.
index b7e1410..f10fca8 100644 (file)
@@ -130,48 +130,3 @@ void
 _dl_sysdep_start_cleanup (void)
 {
 }
-\f
-#ifndef MAP_ANON
-/* This is only needed if the system doesn't support MAP_ANON.  */
-
-int
-_dl_sysdep_open_zero_fill (void)
-{
-  return __open ("/dev/zero", O_RDONLY);
-}
-#endif
-
-/* Read the whole contents of FILE into new mmap'd space with given
-   protections.  *SIZEP gets the size of the file.  */
-
-void *
-_dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot)
-{
-  void *result;
-  struct stat st;
-  int fd = __open (file, O_RDONLY);
-  if (fd < 0)
-    return NULL;
-  if (__fxstat (_STAT_VER, fd, &st) < 0)
-    result = NULL;
-  else
-    {
-      /* Map a copy of the file contents.  */
-      result = __mmap (0, st.st_size, prot,
-#ifdef MAP_COPY
-                      MAP_COPY
-#else
-                      MAP_PRIVATE
-#endif
-#ifdef MAP_FILE
-                      | MAP_FILE
-#endif
-                      , fd, 0);
-      if (result == (void *) -1)
-       result = NULL;
-      else
-       *sizep = st.st_size;
-    }
-  __close (fd);
-  return result;
-}
diff --git a/sysdeps/generic/netinet/in.h b/sysdeps/generic/netinet/in.h
deleted file mode 100644 (file)
index 1f3e241..0000000
+++ /dev/null
@@ -1,311 +0,0 @@
-/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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 General Public License as published by
-   the Free Software Foundation; either version 2, 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 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.  */
-
-#ifndef        _NETINET_IN_H
-
-#define        _NETINET_IN_H   1
-#include <features.h>
-
-#include <sys/socket.h>
-#include <sys/types.h>
-
-__BEGIN_DECLS
-
-/* Standard well-defined IP protocols.  */
-enum
-  {
-    IPPROTO_IP = 0,    /* Dummy protocol for TCP.  */
-    IPPROTO_ICMP = 1,  /* Internet Control Message Protocol.  */
-    IPPROTO_IGMP = 2,  /* Internet Group Management Protocol. */
-    IPPROTO_TCP = 6,   /* Transmission Control Protocol.  */
-    IPPROTO_EGP = 8,   /* Exterior Gateway Protocol.  */
-    IPPROTO_PUP = 12,  /* PUP protocol.  */
-    IPPROTO_UDP = 17,  /* User Datagram Protocol.  */
-    IPPROTO_IDP = 22,  /* XNS IDP protocol.  */
-
-    IPPROTO_RAW = 255, /* Raw IP packets.  */
-    IPPROTO_MAX
-  };
-
-/* Standard well-known ports.  */
-enum
-  {
-    IPPORT_ECHO = 7,           /* Echo service.  */
-    IPPORT_DISCARD = 9,                /* Discard transmissions service.  */
-    IPPORT_SYSTAT = 11,                /* System status service.  */
-    IPPORT_DAYTIME = 13,       /* Time of day service.  */
-    IPPORT_NETSTAT = 15,       /* Network status service.  */
-    IPPORT_FTP = 21,           /* File Transfer Protocol.  */
-    IPPORT_TELNET = 23,                /* Telnet protocol.  */
-    IPPORT_SMTP = 25,          /* Simple Mail Transfer Protocol.  */
-    IPPORT_TIMESERVER = 37,    /* Timeserver service.  */
-    IPPORT_NAMESERVER = 42,    /* Domain Name Service.  */
-    IPPORT_WHOIS = 43,         /* Internet Whois service.  */
-    IPPORT_MTP = 57,
-
-    IPPORT_TFTP = 69,          /* Trivial File Transfer Protocol.  */
-    IPPORT_RJE = 77,
-    IPPORT_FINGER = 79,                /* Finger service.  */
-    IPPORT_TTYLINK = 87,
-    IPPORT_SUPDUP = 95,                /* SUPDUP protocol.  */
-
-
-    IPPORT_EXECSERVER = 512,   /* execd service.  */
-    IPPORT_LOGINSERVER = 513,  /* rlogind service.  */
-    IPPORT_CMDSERVER = 514,
-    IPPORT_EFSSERVER = 520,
-
-    /* UDP ports.  */
-    IPPORT_BIFFUDP = 512,
-    IPPORT_WHOSERVER = 513,
-    IPPORT_ROUTESERVER = 520,
-
-    /* Ports less than this value are reserved for privileged processes.  */
-    IPPORT_RESERVED = 1024,
-
-    /* Ports greater this value are reserved for (non-privileged) servers.  */
-    IPPORT_USERRESERVED = 5000
-  };
-
-
-/* Link numbers.  */
-#define        IMPLINK_IP              155
-#define        IMPLINK_LOWEXPER        156
-#define        IMPLINK_HIGHEXPER       158
-
-
-/* Internet address.  */
-struct in_addr
-  {
-    unsigned int s_addr;
-  };
-
-
-/* Definitions of the bits in an Internet address integer.
-
-   On subnets, host and network parts are found according to
-   the subnet mask, not these masks.  */
-
-#define        IN_CLASSA(a)            ((((unsigned) (a)) & 0x80000000) == 0)
-#define        IN_CLASSA_NET           0xff000000
-#define        IN_CLASSA_NSHIFT        24
-#define        IN_CLASSA_HOST          (0xffffffff & ~IN_CLASSA_NET)
-#define        IN_CLASSA_MAX           128
-
-#define        IN_CLASSB(a)            ((((unsigned) (a)) & 0xc0000000) == 0x80000000)
-#define        IN_CLASSB_NET           0xffff0000
-#define        IN_CLASSB_NSHIFT        16
-#define        IN_CLASSB_HOST          (0xffffffff & ~IN_CLASSB_NET)
-#define        IN_CLASSB_MAX           65536
-
-#define        IN_CLASSC(a)            ((((unsigned) (a)) & 0xc0000000) == 0xc0000000)
-#define        IN_CLASSC_NET           0xffffff00
-#define        IN_CLASSC_NSHIFT        8
-#define        IN_CLASSC_HOST          (0xffffffff & ~IN_CLASSC_NET)
-
-#define        IN_CLASSD(a)            ((((unsigned) (a)) & 0xf0000000) == 0xe0000000)
-#define        IN_MULTICAST(a)         IN_CLASSD(a)
-
-#define        IN_EXPERIMENTAL(a)      ((((unsigned) (a)) & 0xe0000000) == 0xe0000000)
-#define        IN_BADCLASS(a)          ((((unsigned) (a)) & 0xf0000000) == 0xf0000000)
-
-/* Address to accept any incoming messages.  */
-#define        INADDR_ANY              ((unsigned) 0x00000000)
-/* Address to send to all hosts.  */
-#define        INADDR_BROADCAST        ((unsigned) 0xffffffff)
-/* Address indicating an error return.  */
-#define        INADDR_NONE             ((unsigned) 0xffffffff)
-
-/* Network number for local host loopback.  */
-#define        IN_LOOPBACKNET  127
-/* Address to loopback in software to local host.  */
-#ifndef INADDR_LOOPBACK
-#define        INADDR_LOOPBACK ((unsigned) 0x7f000001) /* Inet address 127.0.0.1.  */
-#endif
-
-
-/* IPv6 address */
-struct in6_addr
-  {
-    union
-      {
-       u_int8_t        u6_addr8[16];
-       u_int16_t       u6_addr16[8];
-       u_int32_t       u6_addr32[4];
-#if (~0UL) > 0xffffffff
-       u_int64_t       u6_addr64[2];
-#endif
-      } in6_u;
-#define s6_addr                        in6_u.u6_addr8
-#define s6_addr16              in6_u.u6_addr16
-#define s6_addr32              in6_u.u6_addr32
-#define s6_addr64              in6_u.u6_addr64
-  };
-
-extern const struct in6_addr in6addr_any;        /* :: */
-extern const struct in6_addr in6addr_loopback;   /* ::1 */
-#define IN6ADDR_ANY_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
-#define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }
-
-#define INET_ADDRSTRLEN 16
-#define INET6_ADDRSTRLEN 46
-
-
-
-/* Get the definition of the macro to define the common sockaddr members.  */
-#include <sockaddrcom.h>
-
-
-/* Structure describing an Internet socket address.  */
-struct sockaddr_in
-  {
-    __SOCKADDR_COMMON (sin_);
-    unsigned short int sin_port;       /* Port number.  */
-    struct in_addr sin_addr;           /* Internet address.  */
-
-    /* Pad to size of `struct sockaddr'.  */
-    unsigned char sin_zero[sizeof(struct sockaddr) -
-                          __SOCKADDR_COMMON_SIZE -
-                          sizeof(unsigned short int) -
-                          sizeof(struct in_addr)];
-  };
-
-/* Ditto, for IPv6.  */
-struct sockaddr_in6
-  {
-    __SOCKADDR_COMMON (sin6_);
-    u_int16_t          sin6_port;      /* Transport layer port # */
-    u_int32_t          sin6_flowinfo;  /* IPv6 flow information */
-    struct in6_addr    sin6_addr;      /* IPv6 address */
-  };
-
-/* IPv6 multicast request.  */
-struct ipv6_mreq
-  {
-    /* IPv6 multicast address of group */
-    struct in6_addr ipv6mr_multiaddr;
-
-    /* local IPv6 address of interface */
-    int                ipv6mr_ifindex;
-  };
-
-/* Options for use with `getsockopt' and `setsockopt' at the IP level.
-   The first word in the comment at the right is the data type used;
-   "bool" means a boolean value stored in an `int'.  */
-#define        IP_OPTIONS      1       /* ip_opts; IP per-packet options.  */
-#define        IP_HDRINCL      2       /* int; Header is included with data.  */
-#define        IP_TOS          3       /* int; IP type of service and precedence.  */
-#define        IP_TTL          4       /* int; IP time to live.  */
-#define        IP_RECVOPTS     5       /* bool; Receive all IP options w/datagram.  */
-#define        IP_RECVRETOPTS  6       /* bool; Receive IP options for response.  */
-#define        IP_RECVDSTADDR  7       /* bool; Receive IP dst addr w/datagram.  */
-#define        IP_RETOPTS      8       /* ip_opts; Set/get IP per-packet options.  */
-#define IP_MULTICAST_IF 9      /* in_addr; set/get IP multicast i/f */
-#define IP_MULTICAST_TTL 10    /* u_char; set/get IP multicast ttl */
-#define IP_MULTICAST_LOOP 11   /* i_char; set/get IP multicast loopback */
-#define IP_ADD_MEMBERSHIP 12   /* ip_mreq; add an IP group membership */
-#define IP_DROP_MEMBERSHIP 13  /* ip_mreq; drop an IP group membership */
-
-/* Structure used to describe IP options for IP_OPTIONS and IP_RETOPTS.
-   The `ip_dst' field is used for the first-hop gateway when using a
-   source route (this gets put into the header proper).  */
-struct ip_opts
-  {
-    struct in_addr ip_dst;     /* First hop; zero without source route.  */
-    char ip_opts[40];          /* Actually variable in size.  */
-  };
-
-/* Structure used for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. */
-struct ip_mreq
-{
-  struct in_addr imr_multiaddr;        /* IP multicast address of group */
-  struct in_addr imr_interface;        /* local IP address of interface */
-};
-
-/* Functions to convert between host and network byte order.
-
-   Please note that these functions normally take `unsigned long int' or
-   `unsigned short int' values as arguments and also return them.  But
-   this was a short-sighted decision since on different systems the types
-   may have different representations but the values are always the same.  */
-
-extern u_int32_t ntohl __P ((u_int32_t __netlong));
-extern u_int16_t ntohs __P ((u_int16_t __netshort));
-extern u_int32_t htonl __P ((u_int32_t __hostlong));
-extern u_int16_t htons __P ((u_int16_t __hostshort));
-
-#include <endian.h>
-
-#if __BYTE_ORDER == __BIG_ENDIAN
-/* The host byte order is the same as network byte order,
-   so these functions are all just identity.  */
-#define        ntohl(x)        (x)
-#define        ntohs(x)        (x)
-#define        htonl(x)        (x)
-#define        htons(x)        (x)
-#endif
-
-/* IPV6 socket options.  */
-#define IPV6_ADDRFORM          1
-#define IPV6_RXINFO            2
-#define IPV6_RXHOPOPTS         3
-#define IPV6_RXDSTOPTS         4
-#define IPV6_RXSRCRT           5
-#define IPV6_PKTOPTIONS                6
-#define IPV6_CHECKSUM          7
-#define IPV6_HOPLIMIT          8
-
-#define IPV6_TXINFO            IPV6_RXINFO
-#define SCM_SRCINFO            IPV6_TXINFO
-#define SCM_SRCRT              IPV6_RXSRCRT
-
-#define IPV6_UNICAST_HOPS      16
-#define IPV6_MULTICAST_IF      17
-#define IPV6_MULTICAST_HOPS    18
-#define IPV6_MULTICAST_LOOP    19
-#define IPV6_ADD_MEMBERSHIP    20
-#define IPV6_DROP_MEMBERSHIP   21
-
-#define IN6_IS_ADDR_UNSPECIFIED(a) \
-        ((((u_int32_t *)(a))[0] == 0) && ((u_int32_t *)(a))[1] == 0) && \
-         (((u_int32_t *)(a))[2] == 0) && ((u_int32_t *)(a))[3] == 0))
-
-#define IN6_IS_ADDR_LOOPBACK(a) \
-        ((((u_int32_t *)(a))[0] == 0) && ((u_int32_t *)(a))[1] == 0) && \
-         (((u_int32_t *)(a))[2] == 0) && ((u_int32_t *)(a))[3] == htonl(1)))
-
-#define IN6_IS_ADDR_MULTICAST(a) (((u_int8_t *)(a))[0] == 0xff)
-
-#define IN6_IS_ADDR_LINKLOCAL(a) \
-        ((((u_int32_t *)(a))[0] & htonl(0xffc00000)) == htonl(0xfe800000))
-
-#define IN6_IS_ADDR_SITELOCAL(a) \
-        ((((u_int32_t *)(a))[0] & htonl(0xffc00000)) == htonl(0xfec00000))
-
-#define IN6_IS_ADDR_V4MAPPED(a) \
-        ((((u_int32_t *)(a))[0] == 0) && (((u_int32_t *)(a))[1] == 0) && \
-         (((u_int32_t *)(a))[2] == htonl(0xffff)))
-
-#define IN6_IS_ADDR_V4COMPAT(a) \
-        ((((u_int32_t *)(a))[0] == 0) && (((u_int32_t *)(a))[1] == 0) && \
-         (((u_int32_t *)(a))[2] == 0) && (ntohl(((u_int32_t *)(a))[3]) > 1))
-
-
-__END_DECLS
-
-#endif /* netinet/in.h */
diff --git a/sysdeps/generic/netinet/inbits.h b/sysdeps/generic/netinet/inbits.h
new file mode 100644 (file)
index 0000000..ae6afa7
--- /dev/null
@@ -0,0 +1,84 @@
+/* Copyright (C) 1997 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 General Public License as published by
+   the Free Software Foundation; either version 2, 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 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.  */
+
+/* Generic version.  */
+
+#ifndef _NETINET_INBITS_H
+#define _NETINET_INBITS_H 1
+
+/* Link numbers.  */
+#define        IMPLINK_IP              155
+#define        IMPLINK_LOWEXPER        156
+#define        IMPLINK_HIGHEXPER       158
+
+
+/* Options for use with `getsockopt' and `setsockopt' at the IP level.
+   The first word in the comment at the right is the data type used;
+   "bool" means a boolean value stored in an `int'.  */
+#define        IP_OPTIONS      1       /* ip_opts; IP per-packet options.  */
+#define        IP_HDRINCL      2       /* int; Header is included with data.  */
+#define        IP_TOS          3       /* int; IP type of service and precedence.  */
+#define        IP_TTL          4       /* int; IP time to live.  */
+#define        IP_RECVOPTS     5       /* bool; Receive all IP options w/datagram.  */
+#define        IP_RECVRETOPTS  6       /* bool; Receive IP options for response.  */
+#define        IP_RECVDSTADDR  7       /* bool; Receive IP dst addr w/datagram.  */
+#define        IP_RETOPTS      8       /* ip_opts; Set/get IP per-packet options.  */
+#define IP_MULTICAST_IF 9      /* in_addr; set/get IP multicast i/f */
+#define IP_MULTICAST_TTL 10    /* u_char; set/get IP multicast ttl */
+#define IP_MULTICAST_LOOP 11   /* i_char; set/get IP multicast loopback */
+#define IP_ADD_MEMBERSHIP 12   /* ip_mreq; add an IP group membership */
+#define IP_DROP_MEMBERSHIP 13  /* ip_mreq; drop an IP group membership */
+
+/* Structure used to describe IP options for IP_OPTIONS and IP_RETOPTS.
+   The `ip_dst' field is used for the first-hop gateway when using a
+   source route (this gets put into the header proper).  */
+struct ip_opts
+  {
+    struct in_addr ip_dst;     /* First hop; zero without source route.  */
+    char ip_opts[40];          /* Actually variable in size.  */
+  };
+
+/* Structure used for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. */
+struct ip_mreq
+{
+  struct in_addr imr_multiaddr;        /* IP multicast address of group */
+  struct in_addr imr_interface;        /* local IP address of interface */
+};
+
+/* IPV6 socket options.  */
+#define IPV6_ADDRFORM          1
+#define IPV6_RXINFO            2
+#define IPV6_RXHOPOPTS         3
+#define IPV6_RXDSTOPTS         4
+#define IPV6_RXSRCRT           5
+#define IPV6_PKTOPTIONS                6
+#define IPV6_CHECKSUM          7
+#define IPV6_HOPLIMIT          8
+
+#define IPV6_TXINFO            IPV6_RXINFO
+#define SCM_SRCINFO            IPV6_TXINFO
+#define SCM_SRCRT              IPV6_RXSRCRT
+
+#define IPV6_UNICAST_HOPS      16
+#define IPV6_MULTICAST_IF      17
+#define IPV6_MULTICAST_HOPS    18
+#define IPV6_MULTICAST_LOOP    19
+#define IPV6_ADD_MEMBERSHIP    20
+#define IPV6_DROP_MEMBERSHIP   21
+
+#endif /* netinet/inbits.h */
index cca51f3..4640372 100644 (file)
 
 #ifndef weak_alias
 # define __strcasecmp strcasecmp
+# define TOLOWER(Ch) tolower (Ch)
+#else
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+#  define __strcasecmp __strcasecmp_l
+#  define TOLOWER(Ch) __tolower_l ((Ch), loc)
+# else
+#  define TOLOWER(Ch) tolower (Ch)
+# endif
+#endif
+
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define LOCALE_PARAM , loc
+# define LOCALE_PARAM_DECL __locale_t loc;
+#else
+# define LOCALE_PARAM
+# define LOCALE_PARAM_DECL
 #endif
 
 /* Compare S1 and S2, ignoring case, returning less than, equal to or
    greater than zero if S1 is lexicographically less than,
    equal to or greater than S2.  */
 int
-__strcasecmp (s1, s2)
+__strcasecmp (s1, s2 LOCALE_PARAM)
      const char *s1;
      const char *s2;
+     LOCALE_PARAM_DECL
 {
   const unsigned char *p1 = (const unsigned char *) s1;
   const unsigned char *p2 = (const unsigned char *) s2;
@@ -44,8 +61,8 @@ __strcasecmp (s1, s2)
 
   do
     {
-      c1 = tolower (*p1++);
-      c2 = tolower (*p2++);
+      c1 = TOLOWER (*p1++);
+      c2 = TOLOWER (*p2++);
       if (c1 == '\0')
        break;
     }
@@ -53,6 +70,6 @@ __strcasecmp (s1, s2)
 
   return c1 - c2;
 }
-#ifdef weak_alias
+#ifndef __strcasecmp
 weak_alias (__strcasecmp, strcasecmp)
 #endif
diff --git a/sysdeps/generic/strcasecmp_l.c b/sysdeps/generic/strcasecmp_l.c
new file mode 100644 (file)
index 0000000..61e8987
--- /dev/null
@@ -0,0 +1,20 @@
+/* Copyright (C) 1997 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.  */
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+#include <sysdeps/generic/strcasecmp.c>
index b0b1044..cd29149 100644 (file)
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 #include <string.h>
 #include <ctype.h>
 
 #ifndef weak_alias
 # define __strncasecmp strncasecmp
+# define TOLOWER(Ch) tolower (Ch)
+#else
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+#  define __strncasecmp __strncasecmp_l
+#  define TOLOWER(Ch) __tolower_l ((Ch), loc)
+# else
+#  define TOLOWER(Ch) tolower (Ch)
+# endif
+#endif
+
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define LOCALE_PARAM , loc
+# define LOCALE_PARAM_DECL __locale_t loc;
+#else
+# define LOCALE_PARAM
+# define LOCALE_PARAM_DECL
 #endif
 
 /* Compare no more than N characters of S1 and S2,
    greater than zero if S1 is lexicographically less
    than, equal to or greater than S2.  */
 int
-__strncasecmp (s1, s2, n)
+__strncasecmp (s1, s2, n LOCALE_PARAM)
      const char *s1;
      const char *s2;
      size_t n;
+     LOCALE_PARAM_DECL
 {
   const unsigned char *p1 = (const unsigned char *) s1;
   const unsigned char *p2 = (const unsigned char *) s2;
@@ -44,14 +65,14 @@ __strncasecmp (s1, s2, n)
 
   do
     {
-      c1 = tolower (*p1++);
-      c2 = tolower (*p2++);
+      c1 = TOLOWER (*p1++);
+      c2 = TOLOWER (*p2++);
       if (c1 == '\0' || c1 != c2)
        return c1 - c2;
     } while (--n > 0);
 
   return c1 - c2;
 }
-#ifdef weak_alias
+#ifndef __strncasecmp
 weak_alias (__strncasecmp, strncasecmp)
 #endif
diff --git a/sysdeps/generic/strncase_l.c b/sysdeps/generic/strncase_l.c
new file mode 100644 (file)
index 0000000..757a3a6
--- /dev/null
@@ -0,0 +1,22 @@
+/* Compare at most N characters of two strings without taking care for
+   the case using given locale.
+   Copyright (C) 1997 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.  */
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+#include <sysdeps/generic/strncase.c>
index fa4f23f..ea938c3 100644 (file)
@@ -86,7 +86,7 @@ static ElfW(Addr) fixup (struct link_map *l, ElfW(Word) reloc_offset)
 /* Set up the loaded object described by L so its unrelocated PLT
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
 
-static inline void __attribute__ ((unused))
+static inline int
 elf_machine_runtime_setup (struct link_map *l, int lazy)
 {
   Elf32_Addr *got;
@@ -105,9 +105,11 @@ elf_machine_runtime_setup (struct link_map *l, int lazy)
       got[2] = (Elf32_Addr) &_dl_runtime_resolve;
     }
 
+  return lazy;
+}
 
-  /* This code is used in dl-runtime.c to call the `fixup' function
-     and then redirect to the address it returns.  */
+/* This code is used in dl-runtime.c to call the `fixup' function
+   and then redirect to the address it returns.  */
 #ifndef PROF
 # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
        .globl _dl_runtime_resolve
@@ -149,7 +151,6 @@ _dl_runtime_resolve:
 #endif
 /* The PLT uses Elf32_Rel relocs.  */
 #define elf_machine_relplt elf_machine_rel
-}
 
 /* Mask identifying addresses reserved for the user program,
    where the dynamic linker should not map anything.  */
index 7758fe8..e6f5a31 100644 (file)
@@ -430,10 +430,10 @@ __MATH_INLINE double logb (double __x);
 __MATH_INLINE double
 logb (double __x)
 {
-  register double __value;
+  register double __value, __junk;
   __asm __volatile__
     ("fxtract\n\t"
-     : "=t" (__value) : "0" (__x));
+     : "=t" (__value), "=u" (__junk) : "0" (__x));
 
   return __value;
 }
index e6b8f9e..dee2a46 100644 (file)
@@ -75,7 +75,7 @@ elf_machine_load_address (void)
 /* Set up the loaded object described by L so its unrelocated PLT
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
 
-static inline void
+static inline int
 elf_machine_runtime_setup (struct link_map *l, int lazy)
 {
   Elf32_Addr *got;
@@ -96,8 +96,11 @@ elf_machine_runtime_setup (struct link_map *l, int lazy)
       got[2] = (Elf32_Addr) &_dl_runtime_resolve;
     }
 
-  /* This code is used in dl-runtime.c to call the `fixup' function
-     and then redirect to the address it returns.  */
+  return lazy;
+}
+
+/* This code is used in dl-runtime.c to call the `fixup' function
+   and then redirect to the address it returns.  */
 #define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
 | Trampoline for _dl_runtime_resolver
        .globl _dl_runtime_resolve
@@ -120,7 +123,6 @@ _dl_runtime_resolve:
 #define ELF_MACHINE_RUNTIME_FIXUP_ARGS long int save_a0, long int save_a1
 /* The PLT uses Elf32_Rela relocs.  */
 #define elf_machine_relplt elf_machine_rela
-}
 
 
 /* Mask identifying addresses reserved for the user program,
index 8d5975c..0f26abe 100644 (file)
@@ -209,6 +209,79 @@ _dl_sysdep_start_cleanup (void)
   __mach_port_deallocate (__mach_task_self (), __mach_task_self_);
 }
 \f
+void
+_dl_sysdep_fatal (const char *msg, ...)
+{
+  va_list ap;
+
+  va_start (ap, msg);
+  do
+    {
+      size_t len = strlen (msg);
+      mach_msg_type_number_t nwrote;
+      do
+       {
+         if (__io_write (_hurd_init_dtable[2], msg, len, -1, &nwrote))
+           break;
+         len -= nwrote;
+         msg += nwrote;
+       } while (nwrote > 0);
+      msg = va_arg (ap, const char *);
+    } while (msg);
+  va_end (ap);
+
+  _exit (127);
+}
+
+
+void
+_dl_sysdep_error (const char *msg, ...)
+{
+  va_list ap;
+
+  va_start (ap, msg);
+  do
+    {
+      size_t len = strlen (msg);
+      mach_msg_type_number_t nwrote;
+      do
+       {
+         if (__io_write (_hurd_init_dtable[2], msg, len, -1, &nwrote))
+           break;
+         len -= nwrote;
+         msg += nwrote;
+       } while (nwrote > 0);
+      msg = va_arg (ap, const char *);
+    } while (msg);
+  va_end (ap);
+}
+
+
+void
+_dl_sysdep_message (const char *msg, ...)
+{
+  va_list ap;
+
+  va_start (ap, msg);
+  do
+    {
+      size_t len = strlen (msg);
+      mach_msg_type_number_t nwrote;
+      do
+       {
+         if (__io_write (_hurd_init_dtable[1], msg, len, -1, &nwrote))
+           break;
+         len -= nwrote;
+         msg += nwrote;
+       } while (nwrote > 0);
+      msg = va_arg (ap, const char *);
+    } while (msg);
+  va_end (ap);
+}
+\f
+ /* Minimal open/close/mmap implementation sufficient for initial loading of
+    shared libraries.  These are weak definitions so that when the
+    dynamic linker re-relocates itself to be user-visible (for -ldl),
 /* Minimal open/close/mmap implementation sufficient for initial loading of
    shared libraries.  These are weak definitions so that when the
    dynamic linker re-relocates itself to be user-visible (for -ldl),
@@ -493,6 +566,76 @@ __mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
                  (flags & MAP_SHARED) ? VM_INHERIT_SHARE : VM_INHERIT_COPY);
   if (err == KERN_NO_SPACE && (flags & MAP_FIXED))
     {
+
+void weak_function
+_dl_sysdep_fatal (const char *msg, ...)
+{
+  va_list ap;
+
+  va_start (ap, msg);
+  do
+    {
+      size_t len = strlen (msg);
+      mach_msg_type_number_t nwrote;
+      do
+       {
+         if (__io_write (_hurd_init_dtable[2], msg, len, -1, &nwrote))
+           break;
+         len -= nwrote;
+         msg += nwrote;
+       } while (nwrote > 0);
+      msg = va_arg (ap, const char *);
+    } while (msg);
+  va_end (ap);
+
+  _exit (127);
+}
+
+
+void weak_function
+_dl_sysdep_error (const char *msg, ...)
+{
+  va_list ap;
+
+  va_start (ap, msg);
+  do
+    {
+      size_t len = strlen (msg);
+      mach_msg_type_number_t nwrote;
+      do
+       {
+         if (__io_write (_hurd_init_dtable[2], msg, len, -1, &nwrote))
+           break;
+         len -= nwrote;
+         msg += nwrote;
+       } while (nwrote > 0);
+      msg = va_arg (ap, const char *);
+    } while (msg);
+  va_end (ap);
+}
+
+
+void weak_function
+_dl_sysdep_message (const char *msg, ...)
+{
+  va_list ap;
+
+  va_start (ap, msg);
+  do
+    {
+      size_t len = strlen (msg);
+      mach_msg_type_number_t nwrote;
+      do
+       {
+         if (__io_write (_hurd_init_dtable[1], msg, len, -1, &nwrote))
+           break;
+         len -= nwrote;
+         msg += nwrote;
+       } while (nwrote > 0);
+      msg = va_arg (ap, const char *);
+    } while (msg);
+  va_end (ap);
+}
       /* XXX this is not atomic as it is in unix! */
       /* The region is already allocated; deallocate it first.  */
       err = __vm_deallocate (__mach_task_self (), mapaddr, len);
diff --git a/sysdeps/mach/hurd/dl-sysdepio.c b/sysdeps/mach/hurd/dl-sysdepio.c
deleted file mode 100644 (file)
index c177a77..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-/* Operating system support for run-time dynamic linker.  Hurd version.
-   Copyright (C) 1995, 1996, 1997 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 <hurd.h>
-#include <link.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <sys/mman.h>
-#include <sys/wait.h>
-#include <assert.h>
-#include <sysdep.h>
-#include <mach/mig_support.h>
-#include "hurdstartup.h"
-#include <mach/host_info.h>
-#include "../stdio-common/_itoa.h"
-#include <hurd/auth.h>
-#include <hurd/term.h>
-#include <stdarg.h>
-#include <ctype.h>
-#include <sys/stat.h>
-
-void
-_dl_sysdep_fatal (const char *msg, ...)
-{
-  va_list ap;
-
-  va_start (ap, msg);
-  do
-    {
-      size_t len = strlen (msg);
-      mach_msg_type_number_t nwrote;
-      do
-       {
-         if (__io_write (_hurd_init_dtable[2], msg, len, -1, &nwrote))
-           break;
-         len -= nwrote;
-         msg += nwrote;
-       } while (nwrote > 0);
-      msg = va_arg (ap, const char *);
-    } while (msg);
-  va_end (ap);
-
-  _exit (127);
-}
-
-
-void
-_dl_sysdep_error (const char *msg, ...)
-{
-  va_list ap;
-
-  va_start (ap, msg);
-  do
-    {
-      size_t len = strlen (msg);
-      mach_msg_type_number_t nwrote;
-      do
-       {
-         if (__io_write (_hurd_init_dtable[2], msg, len, -1, &nwrote))
-           break;
-         len -= nwrote;
-         msg += nwrote;
-       } while (nwrote > 0);
-      msg = va_arg (ap, const char *);
-    } while (msg);
-  va_end (ap);
-}
-
-
-void
-_dl_sysdep_message (const char *msg, ...)
-{
-  va_list ap;
-
-  va_start (ap, msg);
-  do
-    {
-      size_t len = strlen (msg);
-      mach_msg_type_number_t nwrote;
-      do
-       {
-         if (__io_write (_hurd_init_dtable[1], msg, len, -1, &nwrote))
-           break;
-         len -= nwrote;
-         msg += nwrote;
-       } while (nwrote > 0);
-      msg = va_arg (ap, const char *);
-    } while (msg);
-  va_end (ap);
-}
index 39a1cc8..422179c 100644 (file)
@@ -183,7 +183,7 @@ elf_machine_got_rel (struct link_map *map)
 /* Set up the loaded object described by L so its stub function
    will jump to the on-demand fixup code in dl-runtime.c.  */
 
-static inline void
+static inline int
 elf_machine_runtime_setup (struct link_map *l, int lazy)
 {
   ElfW(Addr) *got;
@@ -213,6 +213,8 @@ elf_machine_runtime_setup (struct link_map *l, int lazy)
 
   /* Relocate global offset table.  */
   elf_machine_got_rel (l);
+
+  return lazy;
 }
 
 /* Get link_map for this object.  */
index cfada93..64ca7b4 100644 (file)
@@ -390,7 +390,7 @@ static ElfW(Addr) _dl_preferred_address = 1
         calls `fixup', in dl-runtime.c, via the glue in the macro
         ELF_MACHINE_RUNTIME_TRAMPOLINE, which resets the PLT entry to
         be one of the above two types. These entries are set up here.  */
-static inline void
+static inline int
 elf_machine_runtime_setup (struct link_map *map, int lazy)
 {
   if (map->l_info[DT_JMPREL])
@@ -489,6 +489,8 @@ elf_machine_runtime_setup (struct link_map *map, int lazy)
        PPC_ICBI (plt + i);
       PPC_ISYNC;
     }
+
+  return lazy;
 }
 
 static inline void
index 0345814..accd3a1 100644 (file)
@@ -220,7 +220,7 @@ elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
 /* Set up the loaded object described by L so its unrelocated PLT
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
 
-static inline void
+static inline int
 elf_machine_runtime_setup (struct link_map *l, int lazy)
 {
   Elf32_Addr *plt;
@@ -253,8 +253,11 @@ elf_machine_runtime_setup (struct link_map *l, int lazy)
       plt[3] = (Elf32_Addr *) l;
     }
 
-  /* This code is used in dl-runtime.c to call the `fixup' function
-     and then redirect to the address it returns.  */
+  return lazy;
+}
+
+/* This code is used in dl-runtime.c to call the `fixup' function
+   and then redirect to the address it returns.  */
 #define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
 # Trampoline for _dl_runtime_resolver
        .globl _dl_runtime_resolve
@@ -274,9 +277,9 @@ _dl_runtime_resolve:
        #restore
        .size _dl_runtime_resolve, . - _dl_runtime_resolve
 ");
+
 /* The PLT uses Elf32_Rela relocs.  */
 #define elf_machine_relplt elf_machine_rela
-}
 
 
 /* Mask identifying addresses reserved for the user program,
index f44266f..239d0b0 100644 (file)
@@ -102,19 +102,26 @@ elf_machine_rela (Elf32_Addr loadaddr, Elf32_Dyn *info[DT_NUM],
 /* Set up the loaded object described by L so its unrelocated PLT
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
 
-static inline void
-elf_machine_runtime_setup (struct link_map *l)
+static inline int
+elf_machine_runtime_setup (struct link_map *l, int lazy)
 {
   extern void _dl_runtime_resolve (Elf32_Word);
-  /* The GOT entries for functions in the PLT have not yet been filled
-     in.  Their initial contents will arrange when called to push an
-     offset into the .rel.plt section, push _GLOBAL_OFFSET_TABLE_[1],
-     and then jump to _GLOBAL_OFFSET_TABLE[2].  */
-  Elf32_Addr *got = (Elf32_Addr *) l->l_info[DT_PLTGOT]->d_un.d_ptr;
-  got[1] = (Elf32_Addr) l;     /* Identify this shared object.  */
-  /* This function will get called to fix up the GOT entry indicated by
-     the offset on the stack, and then jump to the resolved address.  */
-  got[2] = (Elf32_Addr) &_dl_runtime_resolve;
+
+  if (lazy) 
+    {
+      /* The GOT entries for functions in the PLT have not yet been filled
+         in.  Their initial contents will arrange when called to push an
+         offset into the .rel.plt section, push _GLOBAL_OFFSET_TABLE_[1],
+         and then jump to _GLOBAL_OFFSET_TABLE[2].  */
+      Elf32_Addr *got = (Elf32_Addr *) l->l_info[DT_PLTGOT]->d_un.d_ptr;
+      got[1] = (Elf32_Addr) l; /* Identify this shared object.  */
+
+      /* This function will get called to fix up the GOT entry indicated by
+         the offset on the stack, and then jump to the resolved address.  */
+      got[2] = (Elf32_Addr) &_dl_runtime_resolve;
+    }
+
+  return lazy;
 }
 
 
diff --git a/sysdeps/unix/sysv/linux/netinet/inbits.h b/sysdeps/unix/sysv/linux/netinet/inbits.h
new file mode 100644 (file)
index 0000000..0215ed5
--- /dev/null
@@ -0,0 +1,75 @@
+/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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 General Public License as published by
+   the Free Software Foundation; either version 2, 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 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.  */
+
+/* Linux version.  */
+
+#ifndef _NETINET_INBITS_H
+#define _NETINET_INBITS_H 1
+
+/* Options for use with `getsockopt' and `setsockopt' at the IP level.
+   The first word in the comment at the right is the data type used;
+   "bool" means a boolean value stored in an `int'.  */
+#define        IP_TOS             1    /* int; IP type of service and precedence.  */
+#define        IP_TTL             2    /* int; IP time to live.  */
+#define        IP_HDRINCL         3    /* int; Header is included with data.  */
+#define        IP_OPTIONS         4    /* ip_opts; IP per-packet options.  */
+#define IP_MULTICAST_IF    32  /* in_addr; set/get IP multicast i/f */
+#define IP_MULTICAST_TTL   33  /* u_char; set/get IP multicast ttl */
+#define IP_MULTICAST_LOOP  34  /* i_char; set/get IP multicast loopback */
+#define IP_ADD_MEMBERSHIP  35  /* ip_mreq; add an IP group membership */
+#define IP_DROP_MEMBERSHIP 36  /* ip_mreq; drop an IP group membership */
+
+/* To select the IP level.  */
+#define SOL_IP 0
+
+/* Structure used to describe IP options for IP_OPTIONS. The `ip_dst'
+   field is used for the first-hop gateway when using a source route
+   (this gets put into the header proper).  */
+struct ip_opts
+  {
+    struct in_addr ip_dst;     /* First hop; zero without source route.  */
+    char ip_opts[40];          /* Actually variable in size.  */
+  };
+
+/* Structure used for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. */
+struct ip_mreq
+  {
+    struct in_addr imr_multiaddr;      /* IP multicast address of group */
+    struct in_addr imr_interface;      /* local IP address of interface */
+  };
+
+/* IPV6 socket options.  */
+#define IPV6_ADDRFORM          1
+#define IPV6_PKTINFO           2
+#define IPV6_RXHOPOPTS         3
+#define IPV6_RXDSTOPTS         4
+#define IPV6_RXSRCRT           5
+#define IPV6_PKTOPTIONS                6
+#define IPV6_CHECKSUM          7
+#define IPV6_HOPLIMIT          8
+
+#define SCM_SRCRT              IPV6_RXSRCRT
+
+#define IPV6_UNICAST_HOPS      16
+#define IPV6_MULTICAST_IF      17
+#define IPV6_MULTICAST_HOPS    18
+#define IPV6_MULTICAST_LOOP    19
+#define IPV6_ADD_MEMBERSHIP    20
+#define IPV6_DROP_MEMBERSHIP   21
+
+#endif /* netinet/inbits.h */
index c33b655..1c79f6a 100644 (file)
@@ -184,52 +184,3 @@ _dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot)
   __close (fd);
   return result;
 }
-
-void
-_dl_sysdep_fatal (const char *msg, ...)
-{
-  va_list ap;
-
-  va_start (ap, msg);
-  do
-    {
-      size_t len = strlen (msg);
-      __write (STDERR_FILENO, msg, len);
-      msg = va_arg (ap, const char *);
-    } while (msg);
-  va_end (ap);
-
-  _exit (127);
-}
-
-
-void
-_dl_sysdep_error (const char *msg, ...)
-{
-  va_list ap;
-
-  va_start (ap, msg);
-  do
-    {
-      size_t len = strlen (msg);
-      __write (STDERR_FILENO, msg, len);
-      msg = va_arg (ap, const char *);
-    } while (msg);
-  va_end (ap);
-}
-
-
-void
-_dl_sysdep_message (const char *msg, ...)
-{
-  va_list ap;
-
-  va_start (ap, msg);
-  do
-    {
-      size_t len = strlen (msg);
-      __write (STDOUT_FILENO, msg, len);
-      msg = va_arg (ap, const char *);
-    } while (msg);
-  va_end (ap);
-}
index 76f0fd0..e39ba61 100644 (file)
@@ -31,10 +31,12 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
            mbrlen mbrtowc wcrtomb mbsrtowcs wcsrtombs \
            mbsnrtowcs wcsnrtombs \
            wcstol wcstoul wcstoll wcstoull wcstod wcstold wcstof \
+           wcstol_l wcstoul_l wcstoll_l wcstoull_l \
+           wcstod_l wcstold_l wcstof_l \
            wcscoll wcsxfrm \
            wcwidth wcswidth \
            wcscoll_l wcsxfrm_l \
-           wcscasecmp wcsncase
+           wcscasecmp wcsncase wcscasecmp_l wcsncase_l
 
 include ../Rules
 
@@ -48,3 +50,10 @@ CFLAGS-wcstoull.c = -I../stdlib
 CFLAGS-wcstod.c = -I../stdlib
 CFLAGS-wcstold.c = -I../stdlib
 CFLAGS-wcstof.c = -I../stdlib
+CFLAGS-wcstol_l.c = -I../stdlib
+CFLAGS-wcstoul_l.c = -I../stdlib
+CFLAGS-wcstoll_l.c = -I../stdlib
+CFLAGS-wcstoull_l.c = -I../stdlib
+CFLAGS-wcstod_l.c = -I../stdlib
+CFLAGS-wcstold_l.c = -I../stdlib
+CFLAGS-wcstof_l.c = -I../stdlib
index 5247a86..d74a1bc 100644 (file)
@@ -93,6 +93,16 @@ extern int __wcsncasecmp __P ((__const wchar_t *__s1, __const wchar_t *__s2,
                                size_t __n));
 extern int wcsncasecmp __P ((__const wchar_t *__s1, __const wchar_t *__s2,
                              size_t __n));
+
+/* Similar to the two functions above but take the information from
+   the provided locale and not the global locale.  */
+# include <xlocale.h>
+
+extern int __wcscasecmp_l __P ((__const wchar_t *__s1, __const wchar_t *__s2,
+                               __locale_t __loc));
+
+extern int __wcsncasecmp_l __P ((__const wchar_t *__s1, __const wchar_t *__s2,
+                                size_t __n, __locale_t __loc));
 #endif
 
 /* Compare S1 and S2, both interpreted as appropriate to the
@@ -107,7 +117,6 @@ extern size_t wcsxfrm __P ((wchar_t *__restrict __s1,
 #ifdef __USE_GNU
 /* Similar to the two functions above but take the information from
    the provided locale and not the global locale.  */
-# include <xlocale.h>
 
 /* Compare S1 and S2, both interpreted as appropriate to the
    LC_COLLATE category of the given locale.  */
@@ -316,6 +325,55 @@ extern unsigned long long int wcstoull __P ((__const wchar_t *
                                             int __base));
 #endif /* ISO C 9X or GCC and GNU.  */
 
+#ifdef __USE_GNU
+/* The concept of one static locale per category is not very well
+   thought out.  Many applications will need to process its data using
+   information from several different locales.  Another application is
+   the implementation of the internationalization handling in the
+   upcoming ISO C++ standard library.  To support this another set of
+   the functions using locale data exist which have an additional
+   argument.
+
+   Attention: all these functions are *not* standardized in any form.
+   This is a proof-of-concept implementation.  */
+
+/* Structure for reentrant locale using functions.  This is an
+   (almost) opaque type for the user level programs.  */
+# include <xlocale.h>
+
+/* Special versions of the functions above which take the locale to
+   use as an additional parameter.  */
+extern long int __wcstol_l __P ((__const wchar_t *__restrict __nptr,
+                                wchar_t **__restrict __endptr, int __base,
+                                __locale_t __loc));
+
+extern unsigned long int __wcstoul_l __P ((__const wchar_t *__restrict __nptr,
+                                          wchar_t **__restrict __endptr,
+                                          int __base, __locale_t __loc));
+
+extern long long int __wcstoll_l __P ((__const wchar_t *__restrict __nptr,
+                                      wchar_t **__restrict __endptr,
+                                      int __base, __locale_t __loc));
+
+extern unsigned long long int __wcstoull_l __P ((__const wchar_t *__restrict
+                                                __nptr,
+                                                wchar_t **__restrict __endptr,
+                                                int __base,
+                                                __locale_t __loc));
+
+extern double __wcstod_l __P ((__const wchar_t *__restrict __nptr,
+                              wchar_t **__restrict __endptr,
+                              __locale_t __loc));
+
+extern float __wcstof_l __P ((__const wchar_t *__restrict __nptr,
+                             wchar_t **__restrict __endptr,
+                             __locale_t __loc));
+
+extern __long_double_t __wcstold_l __P ((__const wchar_t *__restrict __nptr,
+                                        wchar_t **__restrict __endptr,
+                                        __locale_t __loc));
+#endif /* GNU */
+
 
 /* The internal entry points for `wcstoX' take an extra flag argument
    saying whether or not to parse locale-dependent number grouping.  */
index 7490822..f32b4a1 100644 (file)
 
 #ifndef weak_alias
 # define __wcscasecmp wcscasecmp
+# define TOLOWER(Ch) towlower (Ch)
+#else
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+#  define __wcscasecmp __wcscasecmp_l
+#  define TOLOWER(Ch) __towlower_l ((Ch), loc)
+# else
+#  define TOLOWER(Ch) towlower (Ch)
+# endif
+#endif
+
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define LOCALE_PARAM , loc
+# define LOCALE_PARAM_DECL __locale_t loc;
+#else
+# define LOCALE_PARAM
+# define LOCALE_PARAM_DECL
 #endif
 
 /* Compare S1 and S2, ignoring case, returning less than, equal to or
    greater than zero if S1 is lexicographically less than,
    equal to or greater than S2.  */
 int
-__wcscasecmp (s1, s2)
+__wcscasecmp (s1, s2 LOCALE_PARAM)
      const wchar_t *s1;
      const wchar_t *s2;
+     LOCALE_PARAM_DECL
 {
   wint_t c1, c2;
 
@@ -42,15 +59,15 @@ __wcscasecmp (s1, s2)
 
   do
     {
-      c1 = towlower (*s1++);
-      c2 = towlower (*s2++);
-      if (c1 == '\0')
+      c1 = TOLOWER (*s1++);
+      c2 = TOLOWER (*s2++);
+      if (c1 == L'\0')
        break;
     }
   while (c1 == c2);
 
   return c1 - c2;
 }
-#ifdef weak_alias
+#ifndef __wcscasecmp
 weak_alias (__wcscasecmp, wcscasecmp)
 #endif
diff --git a/wcsmbs/wcscasecmp_l.c b/wcsmbs/wcscasecmp_l.c
new file mode 100644 (file)
index 0000000..1f6a0e9
--- /dev/null
@@ -0,0 +1,21 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+#include <wcscasecmp.c>
index c5b10c5..0f1dce2 100644 (file)
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 #include <wchar.h>
 #include <wctype.h>
 
 #ifndef weak_alias
 # define __wcsncasecmp wcsncasecmp
+# define TOLOWER(Ch) towlower (Ch)
+#else
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+#  define __wcsncasecmp __wcsncasecmp_l
+#  define TOLOWER(Ch) __towlower_l ((Ch), loc)
+# else
+#  define TOLOWER(Ch) towlower (Ch)
+# endif
+#endif
+
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define LOCALE_PARAM , loc
+# define LOCALE_PARAM_DECL __locale_t loc;
+#else
+# define LOCALE_PARAM
+# define LOCALE_PARAM_DECL
 #endif
 
 /* Compare no more than N wide characters of S1 and S2,
    greater than zero if S1 is lexicographically less
    than, equal to or greater than S2.  */
 int
-__wcsncasecmp (s1, s2, n)
+__wcsncasecmp (s1, s2, n LOCALE_PARAM)
      const wchar_t *s1;
      const wchar_t *s2;
      size_t n;
+     LOCALE_PARAM_DECL
 {
   wint_t c1, c2;
 
@@ -42,14 +63,14 @@ __wcsncasecmp (s1, s2, n)
 
   do
     {
-      c1 = (wint_t) towlower (*s1++);
-      c2 = (wint_t) towlower (*s2++);
+      c1 = (wint_t) TOLOWER (*s1++);
+      c2 = (wint_t) TOLOWER (*s2++);
       if (c1 == L'\0' || c1 != c2)
        return c1 - c2;
     } while (--n > 0);
 
   return c1 - c2;
 }
-#ifdef weak_alias
+#ifndef __wcsncasecmp
 weak_alias (__wcsncasecmp, wcsncasecmp)
 #endif
diff --git a/wcsmbs/wcsncase_l.c b/wcsmbs/wcsncase_l.c
new file mode 100644 (file)
index 0000000..76e8cac
--- /dev/null
@@ -0,0 +1,21 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+#include <wcsncase.c>
diff --git a/wcsmbs/wcstod_l.c b/wcsmbs/wcstod_l.c
new file mode 100644 (file)
index 0000000..b5a715b
--- /dev/null
@@ -0,0 +1,29 @@
+/* Convert string representing a number to integer value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define __need_wchar_t
+#include <stddef.h>
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern double ____wcstod_l_internal (const wchar_t *, wchar_t **, int,
+                                    __locale_t);
+
+#include <wcstod.c>
index f410e4c..38cd95a 100644 (file)
    These macros tell it to produce the `float' version, `wcstof'.  */
 
 #define        FLOAT           float
-#define        FLT             LDBL
-#define        STRTOF          wcstof
+#define        FLT             FLT
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define STRTOF                __wcstof_l
+#else
+# define STRTOF                wcstof
+#endif
 #define        MPN2FLOAT       __mpn_construct_float
 #define        FLOAT_HUGE_VAL  HUGE_VALF
 #define        USE_WIDE_CHAR   1
diff --git a/wcsmbs/wcstof_l.c b/wcsmbs/wcstof_l.c
new file mode 100644 (file)
index 0000000..13d4c10
--- /dev/null
@@ -0,0 +1,29 @@
+/* Convert string representing a number to integer value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define __need_wchar_t
+#include <stddef.h>
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern float ____wcstof_l_internal (const wchar_t *, wchar_t **, int,
+                                   __locale_t);
+
+#include <wcstof.c>
diff --git a/wcsmbs/wcstol_l.c b/wcsmbs/wcstol_l.c
new file mode 100644 (file)
index 0000000..5d8fdb0
--- /dev/null
@@ -0,0 +1,29 @@
+/* Convert string representing a number to integer value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define __need_wchar_t
+#include <stddef.h>
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern long int ____wcstol_l_internal (const wchar_t *, wchar_t **, int, int,
+                                      __locale_t);
+
+#include <wcstol.c>
index 1a3f0d2..1c7cc65 100644 (file)
 
 #define        FLOAT           long double
 #define        FLT             LDBL
-#define        STRTOF          wcstold
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define STRTOF                __wcstold_l
+#else
+# define STRTOF                wcstold
+#endif
 #define        MPN2FLOAT       __mpn_construct_long_double
 #define        FLOAT_HUGE_VAL  HUGE_VALL
 #define        USE_WIDE_CHAR   1
diff --git a/wcsmbs/wcstold_l.c b/wcsmbs/wcstold_l.c
new file mode 100644 (file)
index 0000000..20a2228
--- /dev/null
@@ -0,0 +1,29 @@
+/* Convert string representing a number to integer value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define __need_wchar_t
+#include <stddef.h>
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern long double ____wcstold_l_internal (const wchar_t *, wchar_t **, int,
+                                          __locale_t);
+
+#include <wcstold.c>
diff --git a/wcsmbs/wcstoll_l.c b/wcsmbs/wcstoll_l.c
new file mode 100644 (file)
index 0000000..12a8c2d
--- /dev/null
@@ -0,0 +1,29 @@
+/* Convert string representing a number to integer value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define __need_wchar_t
+#include <stddef.h>
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern long long int ____wcstoll_l_internal (const wchar_t *, wchar_t **,
+                                            int, int, __locale_t);
+
+#include <wcstoll.c>
diff --git a/wcsmbs/wcstoul_l.c b/wcsmbs/wcstoul_l.c
new file mode 100644 (file)
index 0000000..852d930
--- /dev/null
@@ -0,0 +1,29 @@
+/* Convert string representing a number to integer value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define __need_wchar_t
+#include <stddef.h>
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern unsigned long int ____wcstoul_l_internal (const wchar_t *, wchar_t **,
+                                                int, int, __locale_t);
+
+#include <wcstoul.c>
diff --git a/wcsmbs/wcstoull_l.c b/wcsmbs/wcstoull_l.c
new file mode 100644 (file)
index 0000000..c849a31
--- /dev/null
@@ -0,0 +1,30 @@
+/* Convert string representing a number to integer value, using given locale.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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.  */
+
+#define __need_wchar_t
+#include <stddef.h>
+
+#define USE_IN_EXTENDED_LOCALE_MODEL   1
+
+extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
+                                                      wchar_t **, int, int,
+                                                      __locale_t);
+
+#include <wcstoull.c>