Update.
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.
This commit is contained in:
parent
bfbc57545a
commit
0501d60367
125
ChangeLog
125
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'
|
||||
@ -1484,7 +1603,7 @@
|
||||
|
||||
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>.
|
||||
|
||||
@ -3975,7 +4094,7 @@
|
||||
* 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>
|
||||
|
||||
|
@ -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)))
|
||||
|
2
Makefile
2
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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
@ -17,9 +17,59 @@
|
||||
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
|
@ -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;
|
||||
|
||||
|
@ -17,12 +17,6 @@
|
||||
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;
|
||||
|
||||
#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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -28,17 +28,17 @@
|
||||
#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 */
|
@ -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 */
|
@ -22,17 +22,18 @@
|
||||
#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;
|
12
manual/examples/fmtmsgexpl.c
Normal file
12
manual/examples/fmtmsgexpl.c
Normal file
@ -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;
|
||||
}
|
@ -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.
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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 \
|
||||
|
358
stdlib/fmtmsg.c
Normal file
358
stdlib/fmtmsg.c
Normal file
@ -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;
|
||||
}
|
107
stdlib/fmtmsg.h
Normal file
107
stdlib/fmtmsg.h
Normal file
@ -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 */
|
@ -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. */
|
||||
|
107
stdlib/strtod.c
107
stdlib/strtod.c
@ -25,9 +25,17 @@
|
||||
# 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
|
||||
@ -40,30 +48,6 @@
|
||||
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. */
|
||||
|
||||
#include <ctype.h>
|
||||
@ -88,6 +72,65 @@
|
||||
#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);
|
||||
}
|
||||
|
25
stdlib/strtod_l.c
Normal file
25
stdlib/strtod_l.c
Normal file
@ -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>
|
@ -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) \
|
||||
|
25
stdlib/strtof_l.c
Normal file
25
stdlib/strtof_l.c
Normal file
@ -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>
|
121
stdlib/strtol.c
121
stdlib/strtol.c
@ -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);
|
||||
}
|
||||
|
26
stdlib/strtol_l.c
Normal file
26
stdlib/strtol_l.c
Normal file
@ -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>
|
@ -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) \
|
||||
|
26
stdlib/strtold_l.c
Normal file
26
stdlib/strtold_l.c
Normal file
@ -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>
|
26
stdlib/strtoll_l.c
Normal file
26
stdlib/strtoll_l.c
Normal file
@ -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>
|
26
stdlib/strtoul_l.c
Normal file
26
stdlib/strtoul_l.c
Normal file
@ -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>
|
26
stdlib/strtoull_l.c
Normal file
26
stdlib/strtoull_l.c
Normal file
@ -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>
|
@ -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 \
|
||||
|
@ -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. */
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
@ -130,48 +130,3 @@ void
|
||||
_dl_sysdep_start_cleanup (void)
|
||||
{
|
||||
}
|
||||
|
||||
#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;
|
||||
}
|
||||
|
@ -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 */
|
84
sysdeps/generic/netinet/inbits.h
Normal file
84
sysdeps/generic/netinet/inbits.h
Normal file
@ -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 */
|
@ -25,15 +25,32 @@
|
||||
|
||||
#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
|
||||
|
20
sysdeps/generic/strcasecmp_l.c
Normal file
20
sysdeps/generic/strcasecmp_l.c
Normal file
@ -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>
|
@ -18,11 +18,31 @@
|
||||
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,
|
||||
@ -30,10 +50,11 @@
|
||||
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
|
||||
|
22
sysdeps/generic/strncase_l.c
Normal file
22
sysdeps/generic/strncase_l.c
Normal file
@ -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>
|
@ -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. */
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -209,6 +209,79 @@ _dl_sysdep_start_cleanup (void)
|
||||
__mach_port_deallocate (__mach_task_self (), __mach_task_self_);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/* 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);
|
||||
|
@ -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);
|
||||
}
|
@ -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. */
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
75
sysdeps/unix/sysv/linux/netinet/inbits.h
Normal file
75
sysdeps/unix/sysv/linux/netinet/inbits.h
Normal file
@ -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 */
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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. */
|
||||
|
@ -25,15 +25,32 @@
|
||||
|
||||
#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
|
||||
|
21
wcsmbs/wcscasecmp_l.c
Normal file
21
wcsmbs/wcscasecmp_l.c
Normal file
@ -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>
|
@ -18,11 +18,31 @@
|
||||
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,
|
||||
@ -30,10 +50,11 @@
|
||||
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
|
||||
|
21
wcsmbs/wcsncase_l.c
Normal file
21
wcsmbs/wcsncase_l.c
Normal file
@ -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>
|
29
wcsmbs/wcstod_l.c
Normal file
29
wcsmbs/wcstod_l.c
Normal file
@ -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>
|
@ -22,8 +22,12 @@
|
||||
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
|
||||
|
29
wcsmbs/wcstof_l.c
Normal file
29
wcsmbs/wcstof_l.c
Normal file
@ -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>
|
29
wcsmbs/wcstol_l.c
Normal file
29
wcsmbs/wcstol_l.c
Normal file
@ -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>
|
@ -23,7 +23,11 @@
|
||||
|
||||
#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
|
||||
|
29
wcsmbs/wcstold_l.c
Normal file
29
wcsmbs/wcstold_l.c
Normal file
@ -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>
|
29
wcsmbs/wcstoll_l.c
Normal file
29
wcsmbs/wcstoll_l.c
Normal file
@ -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>
|
29
wcsmbs/wcstoul_l.c
Normal file
29
wcsmbs/wcstoul_l.c
Normal file
@ -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>
|
30
wcsmbs/wcstoull_l.c
Normal file
30
wcsmbs/wcstoull_l.c
Normal file
@ -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>
|
Loading…
Reference in New Issue
Block a user