]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
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 77b054bdb73e0a2ca354873be0b66c66dcebccc1..faab56a1844ca3133ae7dd4637ca44f7031c4f6a 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 3d666ffbbc1996228cf72f2827c73032146908f8..9c7df17ffdb5e26b72300f5fa777ac05c34bbcf3 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 a2509248d57b587191f9efae9712e22eb65b474d..bebffa472229b82b98547d9a1235e6aa2fc4adbc 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 8d644aac8bff7ffd944c7ff4d774376e54d985fa..ae7dda9638d8fd5ea2db6f265ec8840fba061b0f 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 ed6078714d14ae4f6b61e8925a7d473c34cc3d11..d5b1464a6b9a49377a81a532e94e46f3d74aaba8 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 f1c43ea174490f1a67b90ee493e028491094a69b..bec5881d0e4976eb0f9ab5ce92afa95d4d883f3a 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 8a52fc7790dc10a13522e7c41c89140bc7c269ad..e59b84727e907889d50bee59e5fb9494c665f41d 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 1d134ddf2fc6cb18236baa8a1e641443c0d9e798..da63633361d94edeff6876ced14b616aa5e23b52 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 6f9737e0604c4cbb2653dcdced5b786a6cd384b1..bad01a8844bd4aca6b8553be9d42b37fed257f9f 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 fe4ace39b261d201522e11dc26989d924db4fd14..847d9944787e12d62bdaf4d4d6d85d0526bb2a22 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 f41cdfeeeb10e5b13c91404ded6b4ad99d6df93e..ef85269117fe1dfc375a780b0458fdb9172f1538 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 b0c793e7cfbf9973bce41e8cd70959d1e30a16b5..a85dccd6de25d3ec71cf59309f1640f2ce833378 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 487cafa374e48b980f8ddfa3593b740fc466cabb..65bf7211e84055192995257907ee09b6f3b01a82 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 3e73155f4ab50ea10eb3ea58ff957696d4bc905e..3d6a6c1f2f6fb5a07759ce55f22deb7f41feddd8 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 545e009e8dfe4493ce435b38da8d1db6bb328885..28ac3828c2e3d7bfe6d5e48ef3230aa464102cd0 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 7e70e5a1bb60cf904e931099fd36563ad7f21361..b5a38bd9656c249e89da7fe71be9a1f2ca4c0164 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 98ed88986b87eb98fc431f25e3dcb89fae513b4e..40c24eb8f0c81da6daa1e598aa5b8ed09ba761e4 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 e0c9b08031363e6c03ec72d9a21eacfeedcd513d..5ddb956081805392891edb90ceef34da2921e70a 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 026b5eead3bb249d25de9452a7ed84335835f263..9d070279f89fbfc9205f764f579ec0dfbc70e6eb 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 6ec096daf6baab176bb762f0788adaa7be4c94e2..97ad23453b4c8af01bd18c1f83e66ba085156183 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 9747232ef2b4209d07eb43568e25607a5f84a7bf..32e7e90943a084fa1b6a2687f5fff1b25181bb2e 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 6704dbf4e0c0521d537777593fa5f597b59333c3..b924dfc87d604ec7c3fee5f46054ac58f6e0e1e1 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 4a79dcecc2e305b3593eae86504ea7eaa5383eff..24beb6caa2767e9291b15296a8a0d4284de461fa 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 716098367f4730d322f145d6f881c620e316c3d6..641d3c2b16a34005a93e160f740f8b56bb8d9c8a 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 7a51df5f0020363ccca36f7fdda1c358dded33ae..49d6830a652b33984ecb95f7a4cbbeac75005552 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 b7e1410b895d11257abf8480cc6d1bb38cd1b7fd..f10fca81fd3d8d38a68117c701fa11b396e823ed 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 cca51f3dc9fd1d604c790670f447342b097b9b6d..4640372ebdc912daded205be1933dd49b655d06a 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 b0b1044777fa4f43d5f49d4502b8bf237f53f825..cd2914955b5454a5a149f6ecc73dac8e77cb841d 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 fa4f23f51a793e45c7a81dac36adff73561c7d78..ea938c3b88fadc56baad8e544bd33f4ee3f5f650 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 7758fe85982e195faea1bad0b59916b5244a0b98..e6f5a315819ded5f0e4404d8f03af8ecf9e8b87d 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 e6b8f9e362c0ac6e28561c821be9f06d817af340..dee2a4653b63e12f6ec9d049b4da87db9d16bf7c 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 8d5975cf8b927f5f0f65d7399d75df9a14548b08..0f26abeb817eda5579b7576ee2cdac77f7c1d548 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 39a1cc8be6d839e483dc0cd931f2fb4be9b976d7..422179c47db4baf565b0f8f5bc6b98b9e125dc6f 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 cfada93cd467642cd855f4232696e948d03f4679..64ca7b4b691f4325b9e254aeff0027b796adbe22 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 03458144b7ddec437e90dc26e1cccf6b5fec3e1a..accd3a1682fd8f9cc81df7c7e24b919517b76a99 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 f44266f7b7d85ed771bcfad1b40b2bd689bb80e9..239d0b0e9ff86987e2e87e3fc2a717e6fd3eb56f 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 c33b655705abf1cd0fde5e0dd681e3b48dfc4fc1..1c79f6a93cf9407744ef38f75c8fefc3ba9bcd34 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 76f0fd03b944067c224d56013b694843232370be..e39ba61684c0b584aaf83289191f9f30a7f83c0f 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 5247a866d3d3031f06aae9610924d0f5e5a53024..d74a1bc492e0f1e74a4d40cd402a9b9e73a74686 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 74908229a0ad782ac7f9e4f260d5f251f01a3832..f32b4a14d2b299809147ccf61485c42542a139dd 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 c5b10c57a4a8ccd3134a10b9697fff1765d933cf..0f1dce261b12177a438cd96136d35f74a01b17be 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 f410e4cf32c972fd5c8a09e15779b90b87f343c4..38cd95a4e19c6acc4e310ba48132b6c21ed961c0 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 1a3f0d2c6e564c70230a1372de7cb7011699a536..1c7cc6527fbe9e8ea3f0087dd54eba3f4e4095b6 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>