+1998-07-20 17:09 Ulrich Drepper <drepper@cygnus.com>
+
+ * shlib-versions: Remove definition for libSegFault.
+
+ * memory.texi: Comment out the relocating allocator description.
+ * manual/signal.texi: Remove reference to relocating allocator.
+ * manual/top-menu.texi: Regenerated.
+
+ * posix/fnmatch.c: Implement [: :] and change to recognize
+ ^ as negation only when not _POSIXLY_CORRECT.
+
+ * sysdeps/generic/glob.c: Add several optimizations.
+
+ * posix/glob.h: Undefine __PMT to prevent warnings.
+ Reported by Roland McGrath.
+
+ * posix/regex.c: Define namespace macros only for _LIBC.
+
+ * sysdeps/arm/dl-machine.h: Fix typo.
+
+ * sysdeps/unix/sysv/sysv4/solaris2/sigpending.c: New file.
+ * sysdeps/unix/sysv/sysv4/solaris2/sigstack.c: New file.
+ * sysdeps/unix/sysv/sysv4/solaris2/sigwaitinfo.c: New file.
+ * sysdeps/unix/sysv/sysv4/solaris2/syscalls.list: Add sigaltstack,
+ sigpending, sigqueue, and sigtimedwait.
+ * sysdeps/unix/sysv/sysv4/solaris2/sparc/sparc32/syscall.S: New file.
+
+ * timezone/leapseconds: Update from tzdata1998f.
+
+1998-07-18 Mark Kettenis <kettenis@phys.uva.nl>
+
+ * stdio/stdio.h [__USE_GNU]: Add prototype for fputs_unlocked.
+ * stdio/Versions [GLIBC_2.1]: Add fputs_unlocked.
+ * libio/stdio.h: Fix typo.
+
+1998-07-19 Roland McGrath <roland@baalperazim.frob.com>
+
+ * sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_start): #if 0 out the
+ magic memobj port arg parsing stuff. Fix it someday when we are ready
+ to really use it.
+ (_dl_sysdep_output): New function, modified from _dl_sysdep_error.
+ (_dl_sysdep_error, _dl_sysdep_message, _dl_sysdep_fatal): Removed.
+
+1998-07-19 Roland McGrath <roland@baalperazim.frob.com>
+
+ * stdio/fputs.c: Add fputs_unlocked as weak alias for fputs.
+
+1998-07-19 Roland McGrath <roland@baalperazim.frob.com>
+
+ * sysdeps/posix/sigsuspend.c: Define __sigsuspend with sigsuspend as
+ a weak alias.
+ * sysdeps/mach/hurd/sigsuspend.c: Likewise.
+ * sysdeps/generic/sigsuspend.c: Likewise.
+
+1998-07-19 Roland McGrath <roland@baalperazim.frob.com>
+
+ * sysdeps/mach/hurd/i386/sigcontextinfo.h: New file.
+
+1998-07-19 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * Makerules (map-file): Don't use $(wildcard) to find the
+ generated version script, instead look in $(version-maps).
+ ($(common-objpfx)libc.so): Only depend on libc.map if versioning
+ is used.
+ * extra-lib.mk ($(objpfx)$(lib).so): Only depend on version script
+ if versioning is used. Don't use $(wildcard) to find the
+ generated version script, instead look in $(verson-maps).
+
+1998-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/generic/segfault.c: Rename GET_EIP to GET_PC. Remove
+ unused function handle.
+ * sysdeps/generic/sigcontextinfo.h: Rename GET_EIP to GET_PC.
+ * sysdeps/unix/sysv/linux/i386/sigcontextinfo.h: Likewise.
+ * debug/catchsegv.sh: Fix argument processing, quoting and various
+ typos. Put the crash info always in the current directory. Find
+ program in $PATH if it contains no directory component.
+ * Makerules (install-lib.so-versioned,
+ install-lib.so-unversioned): New variables.
+ (install-lib-nosubdir): Depend on unversioned libs in
+ slibdir, not libdir.
+
+1998-07-19 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * Make-dist (+tsrcs): Remove references to %-map variables and
+ *.map files. Add Versions in subdirs.
+ * Makerules (distinfo-vars): Don't write out %-map variables.
+
+1998-07-20 13:55 Ulrich Drepper <drepper@cygnus.com>
+
+ * inet/protocols/rwhod.h: Remove definition of _PATH_RWHODIR.
+ Include <paths.h> instead.
+ * sysdeps/generic/paths.h: Define _PATH_RWHODIR.
+ * sysdeps/unix/sysv/linux/paths.h: Likewise.
+ Reported by Dale Scheetz <dwarf@polaris.net>.
+
+1998-07-17 21:44 Ulrich Drepper <drepper@cygnus.com>
+
+ * catgets/open_catalog.c: Strictly check whether catalog file is
+ larger enough for the data. Reported by Andries.Brouwer@cwi.nl.
+
1998-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h: New file.
{UD,AJ} On Linux, the use of kernel headers is reduced to the minimum. This
gives Linus the ability to change the headers more freely. Also, user
-programs are not insulated from changes in the size of kernel data
+programs are now insulated from changes in the size of kernel data
structures.
For example, the sigset_t type is 32 or 64 bits wide in the kernel. In
$(+subdir-nodist) $(dont_distribute)
foo:=$(shell echo '+out=$(+out)' >&2; echo foofoo >&2)
+tsrcs := $(filter-out $(+out), $(sources) $(all-headers) $(distribute)) \
- $(foreach l,$(extra-libs),$($l-map)) \
- $(wildcard $(addsuffix .map,$(extra-libs))) $(+sysdeps)
+ $(+sysdeps)
foo:=$(shell echo 'made +tsrcs=$(+tsrcs)'>&2)
foo:=$(shell echo generated='$(generated)' >&2)
#generated := $(sort $(generated) $(generated:.S=.c) $(generated:.s=.c))
foo:=$(shell echo subdir foo >&2)
-+tsrcs := Makefile $(+tsrcs) \
++tsrcs := Makefile $(wildcard Versions) $(+tsrcs) \
$(addsuffix .c,$(others) $(tests) $(tests-static) $(test-srcs)) \
$(wildcard $(addsuffix .input,$(tests) (tests-static) $(test-srcs)) \
$(addsuffix .args,$(tests) $(tests-static) $(test-srcs)))
# Reference map file only when versioning is selected and a map file name
# is given.
ifeq ($(versioning),yes)
-map-file = $(firstword $(wildcard $($(@F:.so=-map)) \
- $(common-objpfx)$(@F:.so=.map)))
+map-file = $(firstword $($(@F:.so=-map)) \
+ $(addprefix $(common-objpfx), \
+ $(filter $(@F:.so=.map),$(version-maps))))
load-map-file = $(map-file:%=-Wl,--version-script=%)
endif
$(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
-L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
-Wl,--whole-archive \
- $(filter-out $(map-file) $(common-objpfx)$(@F:.so=.map) \
- $(+preinit) $(+postinit),$^) \
+ $(filter-out $(map-file) $(+preinit) $(+postinit),$^) \
$(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so)
endef
$(common-objpfx)libc.so: $(elfobjdir)/soinit.os \
$(common-objpfx)libc_pic.os \
$(elfobjdir)/sofini.os \
- $(elfobjdir)/interp.os $(elfobjdir)/ld.so \
- $(common-objpfx)libc.map
+ $(elfobjdir)/interp.os $(elfobjdir)/ld.so
$(build-shlib)
+ifeq ($(versioning),yes)
+$(common-objpfx)libc.so: $(common-objpfx)libc.map
+endif
common-generated += libc.so libc_pic.os
ifdef libc.so-version
$(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so
install-lib.so := $(filter %.so,$(install-lib:%_pic.a=%.so))
install-lib := $(filter-out %.so %_pic.a,$(install-lib))
-ifeq (yes,$(build-shared))
-
-install-lib-nosubdir: $(install-lib.so:%=$(inst_libdir)/%)
+ifeq (yes,$(build-shared))
# Find which .so's have versions.
versioned := $(strip $(foreach so,$(install-lib.so),\
$(patsubst %,$(so),$($(so)-version))))
+install-lib.so-versioned := $(filter $(versioned), $(install-lib.so))
+install-lib.so-unversioned := $(filter-out $(versioned), $(install-lib.so))
+
+install-lib-nosubdir: $(install-lib.so-versioned:%=$(inst_libdir)/%) \
+ $(install-lib.so-unversioned:%=$(inst_slibdir)/%)
+
# Install all the unversioned shared libraries.
-$(addprefix $(inst_slibdir)/, $(filter-out $(versioned),$(install-lib.so))): \
- $(inst_slibdir)/%.so: $(objpfx)%.so $(+force); $(do-install-program)
+$(install-lib.so-unversioned:%=$(inst_slibdir)/%): $(inst_slibdir)/%.so: \
+ $(objpfx)%.so $(+force)
+ $(do-install-program)
ifneq ($(findstring -s,$(LN_S)),)
define make-link
$(foreach var,subdir-dirs sources elided-routines sysdep_routines \
headers sysdep_headers distribute dont_distribute generated \
others tests test-srcs extra-libs $(extra-libs:%=%-routines) \
- tests-static $(extra-libs:%=%-map) versioned \
+ tests-static versioned \
$(addprefix install-,lib lib.so data bin sbin others),
echo >> $@.new '$(subdir)-$(var) := $($(var))'
echo >> $@.new '$(var) = $$($(subdir)-$(var))')
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
+if test $# -eq 0; then
+ echo "$0: missing programm name" >&2
+ echo "Try \`$0 --help' for more information." >&2
+ exit 1
+fi
+
prog="$1"
shift
-args="$*"
if test $# -eq 0; then
case "$prog" in
esac
fi
-LD_PRELOAD="${LD_PRELOAD:+${LD_PRELOAD}:}@SLIB@/libSegFault.so@SOVER@"
-export LD_PRELOAD
-SEGFAULT_USE_ALTSTACK=1
-export SEGFAULT_USE_ALTSTACK
-SEGFAULT_OUTPUT_NAME="${TMPDIR:-/tmp}/`basename $prog`.segv.$$"
-export SEGFAULT_OUTPUT_NAME
+segv_output=`basename "$prog"`.segv.$$
-$prog $args
+LD_PRELOAD=${LD_PRELOAD:+${LD_PRELOAD}:}@SLIB@/libSegFault.so \
+SEGFAULT_USE_ALTSTACK=1 \
+SEGFAULT_OUTPUT_NAME=$segv_output \
+"$prog" ${1+"$@"}
exval=$?
-unset LD_PRELOAD
-# Check for an segmentation error.
-if test $exval -eq 139; then
+# Check for a segmentation error.
+if test $exval -eq 139 && test -f "$segv_output"; then
# We caught a segmentation error. The output is in the file with the
# name we have in SEGFAULT_OUTPUT_NAME. In the output the names of
# functions in shared objects are available, but names in the static
# part of the program are not. We use addr2line to get this information.
+ case $prog in
+ */*) ;;
+ *)
+ old_IFS=$IFS
+ IFS=:
+ for p in $PATH; do
+ test -n "$p" || p=.
+ if test -f "$p/$prog"; then
+ prog=$p/$prog
+ break
+ fi
+ done
+ IFS=$old_IFS
+ ;;
+ esac
(read line; echo "$line"
read line; echo "$line"
while read line; do
case "$line" in
- [*) addr="`echo $line | sed 's/^\[\(.*\)\]$/\1/'`"
- complete="`addr2line -f -e $prog $addr 2>/dev/null`"
- if test $? -eq 0; then
- echo "`echo $complete|sed 's/\(.*\) \(.*\)/\2(\1)/;'`$line"
+ [*) addr=`echo $line | sed 's/^\[\(.*\)\]$/\1/'`
+ complete=`addr2line -f -e "$prog" $addr 2>/dev/null`
+ if test $? -eq 0; then
+ echo "`echo "$complete"|sed 'N;s/\(.*\)\n\(.*\)/\2(\1)/;'`$line"
else
echo "$line"
fi
*) echo "$line"
;;
esac
- done) < $SEGFAULT_OUTPUT_NAME
- rm $SEGFAULT_OUTPUT_NAME
+ done) < "$segv_output"
+ rm -f "$segv_output"
fi
exit $exval
object-suffixes-left = $(object-suffixes-$(lib))
include $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-$(lib)))
+ifeq ($(versioning),yes)
# Add the version script to the dependencies of the shared library.
-$(objpfx)$(lib).so: $(firstword $(wildcard $($(lib)-map) $(lib).map $(..)$(lib).map))
+$(objpfx)$(lib).so: $(firstword $($(lib)-map) \
+ $(addprefix $(common-objpfx), \
+ $(filter $(lib).map, \
+ $(version-maps))))
+endif
endif
#define WHODVERSION 1
#define WHODTYPE_STATUS 1 /* host status */
-#define _PATH_RWHODIR "/var/rwho"
+/* We used to define _PATH_RWHOD here but it's now in <paths.h>. */
+#include <paths.h>
#endif /* protocols/rwhod.h */
FILE *__restrict __stream));
#ifdef __USE_GNU
-/* This function does the same as `fgets' but does not lock the stream. */
+/* This function does the same as `fputs' but does not lock the stream. */
extern int fputs_unlocked __P ((__const char *__restrict __s,
FILE *__restrict __stream));
#endif
+
/* Write a string, followed by a newline, to stdout. */
extern int puts __P ((__const char *__s));
* Variable Size Automatic:: Allocation of variable-sized blocks
of automatic storage that are freed when the
calling function returns.
-* Relocating Allocator:: Waste less memory, if you can tolerate
- automatic relocation of the blocks you get.
@end menu
@node Memory Concepts
declared frees all blocks allocated with @code{alloca} during the
execution of that scope.
-
+@ignore
+@c This was never actually implemented. -zw
@node Relocating Allocator
@section Relocating Allocator
@dfn{relocating memory allocator} achieves very low overhead by moving
blocks in memory as necessary, on its own initiative.
-@menu
-* Relocator Concepts:: How to understand relocating allocation.
-* Using Relocator:: Functions for relocating allocation.
-@end menu
+@c @menu
+@c * Relocator Concepts:: How to understand relocating allocation.
+@c * Using Relocator:: Functions for relocating allocation.
+@c @end menu
@node Relocator Concepts
@subsection Concepts of Relocating Allocation
@comment malloc.h
@comment GNU
-@deftypefun {void *} r_alloc (void **@var{handleptr}, size_t @var{size})
+@c @deftypefun {void *} r_alloc (void **@var{handleptr}, size_t @var{size})
This function allocates a relocatable block of size @var{size}. It
stores the block's address in @code{*@var{handleptr}} and returns
a non-null pointer to indicate success.
@comment malloc.h
@comment GNU
-@deftypefun void r_alloc_free (void **@var{handleptr})
+@c @deftypefun void r_alloc_free (void **@var{handleptr})
This function is the way to free a relocatable block. It frees the
block that @code{*@var{handleptr}} points to, and stores a null pointer
in @code{*@var{handleptr}} to show it doesn't point to an allocated
@comment malloc.h
@comment GNU
-@deftypefun {void *} r_re_alloc (void **@var{handleptr}, size_t @var{size})
+@c @deftypefun {void *} r_re_alloc (void **@var{handleptr}, size_t @var{size})
The function @code{r_re_alloc} adjusts the size of the block that
@code{*@var{handleptr}} points to, making it @var{size} bytes long. It
stores the address of the resized block in @code{*@var{handleptr}} and
If enough memory is not available, this function returns a null pointer
and does not modify @code{*@var{handleptr}}.
@end deftypefun
+@end ignore
@ignore
@comment No longer available...
don't use the same obstack both inside and outside of a signal handler.
@end ignore
+@ignore
+@comment Once we have r_alloc again add this paragraph.
The relocating allocation functions (@pxref{Relocating Allocator})
are certainly not safe to use in a signal handler.
+@end ignore
@item
Any function that modifies @code{errno} is non-reentrant, but you can
* Variable Size Automatic:: Allocation of variable-sized blocks
of automatic storage that are freed when the
calling function returns.
-* Relocating Allocator:: Waste less memory, if you can tolerate
- automatic relocation of the blocks you get.
Unconstrained Allocation
method of allocating dynamically and
freeing automatically.
-Relocating Allocator
-
-* Relocator Concepts:: How to understand relocating allocation.
-* Using Relocator:: Functions for relocating allocation.
-
Character Handling
* Classification of Characters:: Testing whether characters are
-/* Copyright (C) 1991, 1992, 1993, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 96, 97, 98 Free Software Foundation, Inc.
This file is part of the GNU C Library.
This library is free software; you can redistribute it and/or
#include <fnmatch.h>
#include <ctype.h>
+#if HAVE_STRING_H
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+#endif
+
+/* For platform which support the ISO C amendement 1 functionality we
+ support user defined character classes. */
+#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */
+# include <wchar.h>
+# include <wctype.h>
+#endif
/* Comment out all this code if we are using the GNU C Library, and are not
actually compiling the library itself. This code is part of the GNU C
# define ISASCII(c) isascii(c)
# endif
-# define ISUPPER(c) (ISASCII (c) && isupper (c))
+#ifdef isblank
+# define ISBLANK(c) (ISASCII (c) && isblank (c))
+#else
+# define ISBLANK(c) ((c) == ' ' || (c) == '\t')
+#endif
+#ifdef isgraph
+# define ISGRAPH(c) (ISASCII (c) && isgraph (c))
+#else
+# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
+#endif
+
+#define ISPRINT(c) (ISASCII (c) && isprint (c))
+#define ISDIGIT(c) (ISASCII (c) && isdigit (c))
+#define ISALNUM(c) (ISASCII (c) && isalnum (c))
+#define ISALPHA(c) (ISASCII (c) && isalpha (c))
+#define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
+#define ISLOWER(c) (ISASCII (c) && islower (c))
+#define ISPUNCT(c) (ISASCII (c) && ispunct (c))
+#define ISSPACE(c) (ISASCII (c) && isspace (c))
+#define ISUPPER(c) (ISASCII (c) && isupper (c))
+#define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
+
+# define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
+
+# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+/* The GNU C library provides support for user-defined character classes
+ and the functions from ISO C amendement 1. */
+# ifdef CHARCLASS_NAME_MAX
+# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
+# else
+/* This shouldn't happen but some implementation might still have this
+ problem. Use a reasonable default value. */
+# define CHAR_CLASS_MAX_LENGTH 256
+# endif
+
+# ifdef _LIBC
+# define IS_CHAR_CLASS(string) __wctype (string)
+# else
+# define IS_CHAR_CLASS(string) wctype (string)
+# endif
+# else
+# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */
+
+# define IS_CHAR_CLASS(string) \
+ (STREQ (string, "alpha") || STREQ (string, "upper") \
+ || STREQ (string, "lower") || STREQ (string, "digit") \
+ || STREQ (string, "alnum") || STREQ (string, "xdigit") \
+ || STREQ (string, "space") || STREQ (string, "print") \
+ || STREQ (string, "punct") || STREQ (string, "graph") \
+ || STREQ (string, "cntrl") || STREQ (string, "blank"))
+# endif
+
+/* Avoid depending on library functions or files
+ whose names are inconsistent. */
+# if !defined _LIBC && !defined getenv
+extern char *getenv ();
+# endif
# ifndef errno
extern int errno;
register char c;
/* Note that this evaluates C many times. */
-# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
+# ifdef _LIBC
+# define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
+# else
+# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
+# endif
while ((c = *p++) != '\0')
{
case '[':
{
/* Nonzero if the sense of the character class is inverted. */
+ static int posixly_correct;
register int not;
+ if (posixly_correct == 0)
+ posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
+
if (*n == '\0')
return FNM_NOMATCH;
- if ((flags & FNM_PERIOD) && *n == '.' &&
+ if (*n == '.' && (flags & FNM_PERIOD) &&
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
return FNM_NOMATCH;
- not = (*p == '!' || *p == '^');
+ not = (*p == '!' || (posixly_correct < 0 && *p == '^'));
if (not)
++p;
c = *p++;
for (;;)
{
- register char cstart = c, cend = c;
+ int fn = FOLD (*n);
if (!(flags & FNM_NOESCAPE) && c == '\\')
{
if (*p == '\0')
return FNM_NOMATCH;
- cstart = cend = *p++;
+ c = FOLD (*p++);
+
+ if (c == fn)
+ goto matched;
}
+ else if (c == '[' && *p == ':')
+ {
+ /* Leave room for the null. */
+ char str[CHAR_CLASS_MAX_LENGTH + 1];
+ size_t c1 = 0;
+# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+ wctype_t wt;
+# endif
- cstart = cend = FOLD (cstart);
+ for (;;)
+ {
+ if (c1 == CHAR_CLASS_MAX_LENGTH)
+ /* The name is too long and therefore the pattern
+ is ill-formed. */
+ return FNM_NOMATCH;
+
+ c = *++p;
+ if (c == ':' && p[1] == ']')
+ {
+ p += 2;
+ break;
+ }
+ str[c1++] = 'c';
+ }
+ str[c1] = '\0';
+
+# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+ wt = IS_CHAR_CLASS (str);
+ if (wt == 0)
+ /* Invalid character class name. */
+ return FNM_NOMATCH;
- if (c == '\0')
+ if (__iswctype (__btowc (*n), wt))
+ goto matched;
+# else
+ if ((STREQ (str, "alnum") && ISALNUM (*n))
+ || (STREQ (str, "alpha") && ISALPHA (*n))
+ || (STREQ (str, "blank") && ISBLANK (*n))
+ || (STREQ (str, "cntrl") && ISCNTRL (*n))
+ || (STREQ (str, "digit") && ISDIGIT (*n))
+ || (STREQ (str, "graph") && ISGRAPH (*n))
+ || (STREQ (str, "lower") && ISLOWER (*n))
+ || (STREQ (str, "print") && ISPRINT (*n))
+ || (STREQ (str, "punct") && ISPUNCT (*n))
+ || (STREQ (str, "space") && ISSPACE (*n))
+ || (STREQ (str, "upper") && ISUPPER (*n))
+ || (STREQ (str, "xdigit") && ISXDIGIT (*n)))
+ goto matched;
+# endif
+ }
+ else if (c == '\0')
/* [ (unterminated) loses. */
return FNM_NOMATCH;
+ else if (FOLD (c) == fn)
+ goto matched;
c = *p++;
- c = FOLD (c);
-
- if ((flags & FNM_FILE_NAME) && c == '/')
- /* [/] can never match. */
- return FNM_NOMATCH;
-
- if (c == '-' && *p != ']')
- {
- cend = *p++;
- if (!(flags & FNM_NOESCAPE) && cend == '\\')
- cend = *p++;
- if (cend == '\0')
- return FNM_NOMATCH;
- cend = FOLD (cend);
-
- c = *p++;
- }
-
- if (FOLD (*n) >= cstart && FOLD (*n) <= cend)
- goto matched;
if (c == ']')
break;
}
+
if (!not)
return FNM_NOMATCH;
break;
- matched:;
+ matched:
/* Skip the rest of the [...] that already matched. */
while (c != ']')
{
/* XXX 1003.2d11 is unclear if this is right. */
++p;
}
+ else if (c == '[' && *p == ':')
+ {
+ do
+ if (*++p == '\0')
+ return FNM_NOMATCH;
+ while (*p != ':' || p[1] == ']');
+ p += 2;
+ c = *p;
+ }
}
if (not)
return FNM_NOMATCH;
#undef __ptr_t
#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
# undef __P
+# undef __PMT
# define __P(protos) protos
# define __PMT(protos) protos
# define __ptr_t void *
# endif
#else /* Not C++ or ANSI C. */
# undef __P
+# undef __PMT
# define __P(protos) ()
# define __PMT(protos) ()
# undef __const
/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */
# include <wchar.h>
# include <wctype.h>
+#endif
+#ifdef _LIBC
/* We have to keep the namespace clean. */
# define regfree(preg) __regfree (preg)
# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
# The real-time library from POSIX.1b.
.*-.*-.* librt=1
-
-# Preloading modules.
-.*-.*-.* libSegFault=1
# f*
feof_unlocked; ferror_unlocked; fflush_unlocked; fgets_unlocked;
- fileno_unlocked; fputc_unlocked; fread_unlocked; fwrite_unlocked;
+ fileno_unlocked; fputc_unlocked; fputs_unlocked;
+ fread_unlocked; fwrite_unlocked;
# g*
getc_unlocked; getchar_unlocked;
-/* Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
return EOF;
return 0;
}
+weak_alias (fputs, fputs_unlocked)
/* Write a string to STREAM. */
extern int fputs __P ((__const char *__restrict __s,
FILE *__restrict __stream));
+
+#ifdef __USE_GNU
+/* This function does the same as `fputs' but does not lock the stream. */
+extern int fputs_unlocked __P ((__const char *__restrict __s,
+ FILE *__restrict __stream));
+#endif
+
/* Write a string, followed by a newline, to stdout. */
extern int puts __P ((__const char *__s));
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
#define ELF_MACHINE_JMP_SLOT R_ARM_JUMP_SLOT
-/* The i386 never uses Elf32_Rela relocations. */
+/* The ARM never uses Elf32_Rela relocations. */
#define ELF_MACHINE_NO_RELA 1
/* We define an initialization functions. This is called very early in
int i;
struct stat st;
for (i = oldcount; i < pglob->gl_pathc; ++i)
- if (((flags & GLOB_ALTDIRFUNC) ?
- (*pglob->gl_stat) (pglob->gl_pathv[i], &st) :
- __stat (pglob->gl_pathv[i], &st)) == 0 &&
- S_ISDIR (st.st_mode))
+ if (((flags & GLOB_ALTDIRFUNC)
+ ? (*pglob->gl_stat) (pglob->gl_pathv[i], &st)
+ : __stat (pglob->gl_pathv[i], &st)) == 0
+ && S_ISDIR (st.st_mode))
{
size_t len = strlen (pglob->gl_pathv[i]) + 2;
char *new = realloc (pglob->gl_pathv[i], len);
int (*errfunc) __P ((const char *, int));
glob_t *pglob;
{
- __ptr_t stream;
+ __ptr_t stream = NULL;
struct globlink
{
int meta;
int save;
- stream = ((flags & GLOB_ALTDIRFUNC) ?
- (*pglob->gl_opendir) (directory) :
- (__ptr_t) opendir (directory));
- if (stream == NULL)
+ meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE));
+ if (meta == 0)
{
- if ((errfunc != NULL && (*errfunc) (directory, errno)) ||
- (flags & GLOB_ERR))
- return GLOB_ABORTED;
+ if (flags & (GLOB_NOCHECK|GLOB_NOMAGIC))
+ /* We need not do any tests. The PATTERN contains no meta
+ characters and we must not return an error therefore the
+ result will always contain exactly the one name. */
+ flags |= GLOB_NOCHECK;
+ else
+ {
+ /* Since we use the normal file functions we can also use stat()
+ to verify the file is there. */
+ struct stat st;
+ size_t patlen = strlen (pattern);
+ size_t dirlen = strlen (directory);
+ char *fullname = __alloca (dirlen + 1 + patlen + 1);
+
+# ifdef HAVE_MEMPCPY
+ mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
+ "/", 1),
+ pattern, patlen + 1);
+# else
+ memcpy (fullname, directory, dirlen);
+ fullname[dirlen] = '/';
+ memcpy (&fullname[dirlen + 1], pattern, patlen + 1);
+# endif
+ if (((flags & GLOB_ALTDIRFUNC)
+ ? (*pglob->gl_stat) (fullname, &st)
+ : __stat (fullname, &st)) == 0)
+ /* We found this file to be existing. No tell the rest
+ of the function to copy this name into the result. */
+ flags |= GLOB_NOCHECK;
+ }
+
nfound = 0;
- meta = 0;
- }
- else if (pattern[0] == '\0')
- {
- /* This is a special case for matching directories like in
- "*a/". */
- names = (struct globlink *) __alloca (sizeof (struct globlink));
- names->name = (char *) malloc (1);
- if (names->name == NULL)
- goto memory_error;
- names->name[0] = '\0';
- names->next = NULL;
- nfound = 1;
- meta = 0;
}
else
{
- nfound = 0;
- meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE));
- if(meta)
- flags |= GLOB_MAGCHAR;
-
- while (1)
+ if (pattern[0] == '\0')
{
- const char *name;
- size_t len;
- struct dirent *d = ((flags & GLOB_ALTDIRFUNC) ?
- (*pglob->gl_readdir) (stream) :
- readdir ((DIR *) stream));
- if (d == NULL)
- break;
- if (! REAL_DIR_ENTRY (d))
- continue;
+ /* This is a special case for matching directories like in
+ "*a/". */
+ names = (struct globlink *) __alloca (sizeof (struct globlink));
+ names->name = (char *) malloc (1);
+ if (names->name == NULL)
+ goto memory_error;
+ names->name[0] = '\0';
+ names->next = NULL;
+ nfound = 1;
+ meta = 0;
+ }
+ else
+ {
+ stream = ((flags & GLOB_ALTDIRFUNC)
+ ? (*pglob->gl_opendir) (directory)
+ : (__ptr_t) opendir (directory));
+ if (stream == NULL)
+ {
+ if ((errfunc != NULL && (*errfunc) (directory, errno))
+ || (flags & GLOB_ERR))
+ return GLOB_ABORTED;
+ nfound = 0;
+ meta = 0;
+ }
+ else
+ {
+ int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
+ | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
+#if defined _AMIGA || defined VMS
+ | FNM_CASEFOLD
+#endif
+ );
+ nfound = 0;
+ flags |= GLOB_MAGCHAR;
+
+ while (1)
+ {
+ const char *name;
+ size_t len;
+ struct dirent *d = ((flags & GLOB_ALTDIRFUNC)
+ ? (*pglob->gl_readdir) (stream)
+ : readdir ((DIR *) stream));
+ if (d == NULL)
+ break;
+ if (! REAL_DIR_ENTRY (d))
+ continue;
#ifdef HAVE_D_TYPE
- /* If we shall match only directories use the information
- provided by the dirent call if possible. */
- if ((flags & GLOB_ONLYDIR)
- && d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
- continue;
+ /* If we shall match only directories use the information
+ provided by the dirent call if possible. */
+ if ((flags & GLOB_ONLYDIR)
+ && d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
+ continue;
#endif
- name = d->d_name;
+ name = d->d_name;
- if ((!meta && strcmp (pattern, name) == 0)
- || fnmatch (pattern, name,
- (!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0) |
- ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
-#if defined _AMIGA || defined VMS
- | FNM_CASEFOLD
-#endif
- ) == 0)
- {
- struct globlink *new
- = (struct globlink *) __alloca (sizeof (struct globlink));
- len = NAMLEN (d);
- new->name = (char *) malloc (len + 1);
- if (new->name == NULL)
- goto memory_error;
+ if (fnmatch (pattern, name, fnm_flags) == 0)
+ {
+ struct globlink *new = (struct globlink *)
+ __alloca (sizeof (struct globlink));
+ len = NAMLEN (d);
+ new->name = (char *) malloc (len + 1);
+ if (new->name == NULL)
+ goto memory_error;
#ifdef HAVE_MEMPCPY
- *((char *) mempcpy ((__ptr_t) new->name, name, len)) = '\0';
+ *((char *) mempcpy ((__ptr_t) new->name, name, len))
+ = '\0';
#else
- memcpy ((__ptr_t) new->name, name, len);
- new->name[len] = '\0';
+ memcpy ((__ptr_t) new->name, name, len);
+ new->name[len] = '\0';
#endif
- new->next = names;
- names = new;
- ++nfound;
- if (!meta)
- break;
+ new->next = names;
+ names = new;
+ ++nfound;
+ }
+ }
}
}
}
- if (nfound == 0 && (flags & GLOB_NOMAGIC) && !meta)
- flags |= GLOB_NOCHECK;
-
if (nfound == 0 && (flags & GLOB_NOCHECK))
{
size_t len = strlen (pattern);
}
save = errno;
- if (flags & GLOB_ALTDIRFUNC)
- (*pglob->gl_closedir) (stream);
- else
- closedir ((DIR *) stream);
+ if (stream != NULL)
+ if (flags & GLOB_ALTDIRFUNC)
+ (*pglob->gl_closedir) (stream);
+ else
+ closedir ((DIR *) stream);
__set_errno (save);
return nfound == 0 ? GLOB_NOMATCH : 0;
#define _PATH_MOUNTED "/var/run/mtab"
#define _PATH_NOLOGIN "/etc/nologin"
#define _PATH_PRESERVE "/var/preserve"
+#define _PATH_RWHODIR "/var/rwho"
#define _PATH_SENDMAIL "/usr/sbin/sendmail"
#define _PATH_SHADOW "/etc/shadow"
#define _PATH_SHELLS "/etc/shells"
};
-static void
-handle (int fd, void *addr)
-{
-}
-
-
/* This function is called when a segmentation fault is caught. The system
is in an instable state now. This means especially that malloc() might
not work anymore. */
arr = alloca (cnt * sizeof (void *));
/* First handle the program counter from the structure. */
- arr[0] = GET_EIP (ctx);
+ arr[0] = GET_PC (ctx);
current = (struct layout *) top_frame;
cnt = 1;
/* In general we cannot provide any information. */
#define SIGCONTEXT struct sigcontext *
-#define GET_EIP(ctx) ((void *) 0)
+#define GET_PC(ctx) ((void *) 0)
#define GET_FRAME(ctx) ((void *) 0)
#define GET_STACK(ctx) ((void *) 0)
-/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
/* Change the set of blocked signals to SET,
wait until a signal arrives, and restore the set of blocked signals. */
int
-sigsuspend (set)
+__sigsuspend (set)
const sigset_t *set;
{
__set_errno (ENOSYS);
return -1;
}
-
+weak_alias (__sigsuspend, sigsuspend)
stub_warning (sigsuspend)
+stub_warning (__sigsuspend)
#include <stub-tag.h>
unfmh(); /* XXX */
+#if 0 /* XXX make this work for real someday... */
if (_dl_hurd_data->user_entry == (vm_address_t) &ENTRY_POINT)
/* We were invoked as a command, not as the program interpreter.
The generic ld.so code supports this: it will parse the args
can be retrieved by the program later. */
l->l_info[DT_NULL] = (void *) memobj;
}
+#endif
/* Call elf/rtld.c's main program. It will set everything
up and leave us to transfer control to USER_ENTRY. */
return result;
}
-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, ...)
+_dl_sysdep_output (int fd, 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;
+ assert(fd < _hurd_init_dtablesize);
va_start (ap, msg);
do
mach_msg_type_number_t nwrote;
do
{
- if (__io_write (_hurd_init_dtable[1], msg, len, -1, &nwrote))
+ if (__io_write (_hurd_init_dtable[fd], msg, len, -1, &nwrote))
break;
len -= nwrote;
msg += nwrote;
--- /dev/null
+/* Copyright (C) 1998 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#define SIGCONTEXT struct sigcontext
+#define GET_PC(ctx) ((void *) (ctx).sc_eip)
+#define GET_FRAME(ctx) ((void *) (ctx).sc_ebp)
+#define GET_STACK(ctx) ((void *) (ctx).sc_uesp)
-/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,93,94,95,96,97,98 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
/* Change the set of blocked signals to SET,
wait until a signal arrives, and restore the set of blocked signals. */
-/* XXX should be __sigsuspend ? */
int
-sigsuspend (set)
+__sigsuspend (set)
const sigset_t *set;
{
struct hurd_sigstate *ss;
errno = EINTR;
return -1;
}
+weak_alias (__sigsuspend, sigsuspend)
-/* Copyright (C) 1991, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
/* Change the set of blocked signals to SET,
wait until a signal arrives, and restore the set of blocked signals. */
int
-sigsuspend (set)
+__sigsuspend (set)
const sigset_t *set;
{
sigset_t oset;
__set_errno (save);
return -1;
}
+weak_alias (__sigsuspend, sigsuspend)
Boston, MA 02111-1307, USA. */
#define SIGCONTEXT struct sigcontext
-#define GET_EIP(ctx) ((void *) ctx.eip)
+#define GET_PC(ctx) ((void *) ctx.eip)
#define GET_FRAME(ctx) ((void *) ctx.ebp)
#define GET_STACK(ctx) ((void *) ctx.esp_at_signal)
#define _PATH_MOUNTED "/etc/mtab"
#define _PATH_NOLOGIN "/etc/nologin"
#define _PATH_PRESERVE "/var/preserve"
+#define _PATH_RWHODIR "/var/spool/rwho"
#define _PATH_SENDMAIL "/usr/sbin/sendmail"
#define _PATH_SHADOW "/etc/shadow"
#define _PATH_SHELLS "/etc/shells"
--- /dev/null
+/* Copyright (C) 1998 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <errno.h>
+#include <stddef.h>
+#include <signal.h>
+
+extern int __syscall_sigpending (int subcode, sigset_t *set);
+
+
+/* Store in SET all signals that are blocked and pending. */
+int
+sigpending (sigset_t *set)
+{
+ if (set == NULL)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ return __syscall_sigpending (1, set);
+}
--- /dev/null
+/* We can reuse the Linux implementation with some tricks. */
+#define __NR_sigaltstack 1
+#include <sysdeps/unix/sysv/linux/sigstack.c>
--- /dev/null
+/* We can reuse the Linux implementation. */
+#include <sysdeps/unix/sysv/linux/sigwaitinfo.h>
--- /dev/null
+/* Bets are that the Linux code works... */
+#include <sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S>
# File name Caller Syscall name # args Strong name Weak names
sigaction - sigaction 3 __sigaction sigaction
+sigaltstack - sigaltstack 2 sigaltstack
+sigpending - sigpending 2 __syscall_sigpending
+sigqueue - sigqueue 3 __sigqueue sigqueue
+sigtimedwait - sigtimedwait 3 __sigtimedwait sigtime
-# @(#)leapseconds 7.10
+# @(#)leapseconds 7.11
# Allowance for leapseconds added to each timezone file.
Leap 1994 Jun 30 23:59:60 + S
Leap 1995 Dec 31 23:59:60 + S
Leap 1997 Jun 30 23:59:60 + S
+Leap 1998 Dec 31 23:59:60 + S