aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.cvsignore2
-rw-r--r--ChangeLog65
-rw-r--r--MakeTAGS2
-rw-r--r--Makeconfig4
-rw-r--r--Makerules6
-rw-r--r--conform/Makefile5
-rw-r--r--hesiod/nss_hesiod/hesiod-grp.c37
-rw-r--r--intl/bindtextdom.c6
-rw-r--r--intl/dcigettext.c328
-rw-r--r--intl/l10nflist.c10
-rw-r--r--intl/loadmsgcat.c19
-rw-r--r--intl/textdomain.c6
-rw-r--r--nis/nis_print_group_entry.c1
-rw-r--r--nscd/grpcache.c5
-rw-r--r--po/.cvsignore2
-rw-r--r--posix/glob/.cvsignore1
-rw-r--r--sysdeps/sparc/sparc64/elf/Dist4
-rw-r--r--sysdeps/sparc/sparc64/elf/Makefile10
-rw-r--r--sysdeps/sparc/sparc64/elf/crtbegin.S68
-rw-r--r--sysdeps/sparc/sparc64/elf/crtbeginS.S1
-rw-r--r--sysdeps/sparc/sparc64/elf/crtend.S69
-rw-r--r--sysdeps/sparc/sparc64/elf/crtendS.S1
-rw-r--r--sysdeps/unix/bsd/osf/.cvsignore1
23 files changed, 329 insertions, 324 deletions
diff --git a/.cvsignore b/.cvsignore
index 2f8a931382..e9b99fe5fb 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -19,8 +19,6 @@ analysis
docs
releases
-linuxthreads
-
libc.prj .libc.prcs_aux
libc.proj .snprj
diff --git a/ChangeLog b/ChangeLog
index 9bd6674f43..97c0d43985 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,68 @@
+2000-04-27 Ulrich Drepper <drepper@redhat.com>
+
+ * hesiod/nss_hesiod/hesiod-grp.c (_nss_hesiod_initgroups): Handle
+ overflows in conversion from ASCII.
+
+2000-04-26 Jakub Jelinek <jakub@redhat.com>
+
+ * Makeconfig (full_config_sysdirs): Renamed from full-config-sysdirs.
+ * Makerules (full_config_sysdirs): Likewise.
+ * MakeTAGS (full_config_sysdirs): Likewise.
+
+2000-04-26 Jakub Jelinek <jakub@redhat.com>
+
+ * .cvsignore: Remove linuxthreads.
+ * po/.cvsignore: Remove *.pot.
+ * posix/glob/.cvsignore: Removed.
+ * sysdeps/unix/bsd/osf/.cvsignore: Removed.
+
+2000-04-25 Andreas Jaeger <aj@suse.de>
+
+ * conform/Makefile (distribute): Also distribute contents of
+ subdirectories.
+
+ * Makerules (no_deps): Remove abi-versions.h.
+
+ * nis/nis_print_group_entry.c: Include alloca.h for alloca prototype.
+
+2000-04-25 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/sparc/sparc64/elf/Dist: Remove.
+ * sysdeps/sparc/sparc64/elf/crtbegin.S: Remove.
+ * sysdeps/sparc/sparc64/elf/crtbeginS.S: Remove.
+ * sysdeps/sparc/sparc64/elf/crtend.S: Remove.
+ * sysdeps/sparc/sparc64/elf/crtendS.S: Remove.
+ * sysdeps/sparc/sparc64/elf/Makefile: Don't build crtbegin/crtend
+ objects.
+
+2000-04-25 Thorsten Kukuk <kukuk@suse.de>
+
+ * nscd/grpcache.c: Fix gr_name pointer [PR/1702].
+
+2000-04-23 Bruno Haible <clisp.cons.org>
+
+ * intl/dcigettext.c: Define _GNU_SOURCE as early as possible.
+ * intl/l10nflist.c: Likewise.
+
+2000-04-23 Bruno Haible <clisp.cons.org>
+
+ * intl/bindtextdom.c [!_LIBC]: Define __libc_rwlock_define,
+ __libc_rwlock_wrlock, __libc_rwlock_unlock as empty.
+ * intl/textdomain.c [!_LIBC]: Likewise.
+ * intl/dcigettext.c [!_LIBC]: Define __libc_rwlock_define_initialized,
+ __libc_rwlock_rdlock, __libc_rwlock_unlock as empty.
+ * intl/loadmsgcat.c (_nl_load_domain) [!_LIBC, !HAVE_ICONV]: Avoid
+ syntax error.
+
+2000-04-23 Bruno Haible <clisp.cons.org>
+
+ * intl/dcigettext.c (_nl_find_msg): Do the plural treatment and
+ character set conversion also in the case the translation was found
+ after a hash collision or through binary search. Store the maximum
+ index together with the converted message. Use iconv() when available.
+ In case of out of memory during conversion, return the unconverted
+ translated string, not NULL.
+
2000-04-25 Jes Sorensen <Jes.Sorensen@cern.ch>
* shlib-versions: Rename ia64 dynamic linker to ld-linux-ia64.so.1
diff --git a/MakeTAGS b/MakeTAGS
index f6546e8f3c..ac028d70c9 100644
--- a/MakeTAGS
+++ b/MakeTAGS
@@ -39,7 +39,7 @@ tags_sources = $(all-sources) $(all-headers) $(all-dist)
endif # ctype
endif # No tags_sources
-sysdep-dirs := $(full-config-sysdirs)
+sysdep-dirs := $(full_config_sysdirs)
ifndef sysdep_dirs
# Find all sysdep directories.
diff --git a/Makeconfig b/Makeconfig
index 8a7f94849b..c4f682968c 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -93,7 +93,7 @@ binfmt-subdir = aout
endif
# Complete path to sysdep dirs.
-export full-config-sysdirs := $(addprefix $(..),$(config-sysdirs))
+export full_config_sysdirs := $(addprefix $(..),$(config-sysdirs))
# Run config.status to update config.make and config.h. We don't show the
# dependence of config.h to Make, because it is only touched when it
@@ -107,7 +107,7 @@ $(common-objpfx)config.make: $(common-objpfx)config.status \
# Find all the sysdeps configure fragments, to make sure we re-run
# configure when any of them changes.
$(common-objpfx)config.status: $(..)version.h $(..)configure \
- $(foreach dir,$(full-config-sysdirs),\
+ $(foreach dir,$(full_config_sysdirs),\
$(wildcard \
$(dir)/Implies) \
$(patsubst %.in,%,\
diff --git a/Makerules b/Makerules
index 731ad0e873..baeb9b6ab0 100644
--- a/Makerules
+++ b/Makerules
@@ -58,13 +58,13 @@ include $(..)Makeconfig
endif
# `configure' writes a definition of `config-sysdirs' in `config.make'.
-sysdirs = $(strip $(full-config-sysdirs))
+sysdirs = $(strip $(full_config_sysdirs))
+sysdir_pfx = $(common-objpfx)
export sysdirs := $(sysdirs)
-+sysdep_dirs := $(full-config-sysdirs)
++sysdep_dirs := $(full_config_sysdirs)
ifdef objdir
+sysdep_dirs := $(objdir) $(+sysdep_dirs)
endif
@@ -283,7 +283,7 @@ ifeq ($(versioning),yes)
-include $(common-objpfx)sysd-versions
$(addprefix $(common-objpfx),$(version-maps)): $(common-objpfx)sysd-versions
common-generated += $(version-maps)
-postclean-generated += sysd-versions Versions.all
+postclean-generated += sysd-versions Versions.all abi-versions.h
ifndef avoid-generated
ifneq ($(sysd-versions-subdirs),$(all-subdirs) $(config-sysdirs))
diff --git a/conform/Makefile b/conform/Makefile
index bfa860b44f..af8f2a033a 100644
--- a/conform/Makefile
+++ b/conform/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1999 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000 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
@@ -21,4 +21,5 @@
#
subdir := conform
-distribute = conformtest.pl $(wildcard data/*.h-data)
+distribute = conformtest.pl $(wildcard data/*.h-data) \
+ $(wildcard data/*/*.h-data)
diff --git a/hesiod/nss_hesiod/hesiod-grp.c b/hesiod/nss_hesiod/hesiod-grp.c
index c0b56ac214..a973fab80f 100644
--- a/hesiod/nss_hesiod/hesiod-grp.c
+++ b/hesiod/nss_hesiod/hesiod-grp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997.
@@ -188,14 +188,19 @@ internal_gid_from_group (void *context, const char *groupname, gid_t *group)
{
char *endp;
char *q = ++p;
+ long int val;
q = p;
while (*q != '\0' && *q != ':')
++q;
- *group = strtol (p, &endp, 10);
- if (endp == q && endp != p)
- status = NSS_STATUS_SUCCESS;
+ val = strtol (p, &endp, 10);
+ if (sizeof (gid_t) == sizeof (long int) || (gid_t) val == val)
+ {
+ *group = val;
+ if (endp == q && endp != p)
+ status = NSS_STATUS_SUCCESS;
+ }
}
hesiod_free_list (context, grp_res);
}
@@ -219,7 +224,7 @@ _nss_hesiod_initgroups (const char *user, gid_t group, long int *start,
if (list == NULL)
{
- hesiod_end(context);
+ hesiod_end (context);
return errno == ENOENT ? NSS_STATUS_NOTFOUND : NSS_STATUS_UNAVAIL;
}
@@ -231,6 +236,7 @@ _nss_hesiod_initgroups (const char *user, gid_t group, long int *start,
{
char *endp;
char *q;
+ long int val;
status = NSS_STATUS_NOTFOUND;
@@ -241,21 +247,24 @@ _nss_hesiod_initgroups (const char *user, gid_t group, long int *start,
if (*q != '\0')
*q++ = '\0';
- group = strtol (p, &endp, 10);
- if (*endp == '\0' && endp != p)
- status = NSS_STATUS_SUCCESS;
- else
- status = internal_gid_from_group (context, p, &group);
+ val = strtol (p, &endp, 10);
+ if (sizeof (gid_t) == sizeof (long int) || (gid_t) val == val)
+ {
+ if (*endp == '\0' && endp != p)
+ status = NSS_STATUS_SUCCESS;
+ else
+ status = internal_gid_from_group (context, p, &group);
- if (status == NSS_STATUS_SUCCESS
- && !internal_gid_in_list (groups, group, *start))
- groups[(*start)++] = group;
+ if (status == NSS_STATUS_SUCCESS
+ && !internal_gid_in_list (groups, group, *start))
+ groups[(*start)++] = group;
+ }
p = q;
}
hesiod_free_list (context, list);
- hesiod_end(context);
+ hesiod_end (context);
return NSS_STATUS_SUCCESS;
}
diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c
index dde7eb131d..c5d4901a85 100644
--- a/intl/bindtextdom.c
+++ b/intl/bindtextdom.c
@@ -52,9 +52,9 @@ void free ();
# include <bits/libc-lock.h>
#else
/* Provide dummy implementation if this is outside glibc. */
-# define __libc_lock_define_initialized (CLASS, NAME)
-# define __libc_lock_lock(NAME)
-# define __libc_lock_unlock(NAME)
+# define __libc_rwlock_define(CLASS, NAME)
+# define __libc_rwlock_wrlock(NAME)
+# define __libc_rwlock_unlock(NAME)
#endif
/* @@ end of prolog @@ */
diff --git a/intl/dcigettext.c b/intl/dcigettext.c
index be312ce967..4f27cbb3d8 100644
--- a/intl/dcigettext.c
+++ b/intl/dcigettext.c
@@ -16,6 +16,13 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
@@ -59,9 +66,6 @@ void free ();
#endif
#if defined HAVE_STRING_H || defined _LIBC
-# ifndef _GNU_SOURCE
-# define _GNU_SOURCE 1
-# endif
# include <string.h>
#else
# include <strings.h>
@@ -98,9 +102,12 @@ void free ();
# include <bits/libc-lock.h>
#else
/* Provide dummy implementation if this is outside glibc. */
-# define __libc_lock_define_initialized (CLASS, NAME)
+# define __libc_lock_define_initialized(CLASS, NAME)
# define __libc_lock_lock(NAME)
# define __libc_lock_unlock(NAME)
+# define __libc_rwlock_define_initialized(CLASS, NAME)
+# define __libc_rwlock_rdlock(NAME)
+# define __libc_rwlock_unlock(NAME)
#endif
/* @@ end of prolog @@ */
@@ -626,9 +633,9 @@ _nl_find_msg (domain_file, msgid, index)
const char *msgid;
unsigned long int index;
{
- size_t act = 0;
- size_t top, bottom;
struct loaded_domain *domain;
+ size_t act;
+ char *result;
if (domain_file->decided == 0)
_nl_load_domain (domain_file);
@@ -657,103 +664,8 @@ _nl_find_msg (domain_file, msgid, index)
domain->data + W (domain->must_swap,
domain->orig_tab[nstr - 1].offset)) == 0)
{
- /* We found an entry. If we have to convert the string to use
- a different character set this is the time. */
- char *result =
- (char *) domain->data + W (domain->must_swap,
- domain->trans_tab[nstr - 1].offset);
-
- /* Now skip some strings. How much depends on the index passed
- in. */
- while (index-- > 0)
- {
-#ifdef _LIBC
- result = __rawmemchr (result, '\0');
-#else
- result = strchr (result, '\0');
-#endif
- /* And skip over the NUL byte. */
- ++result;
- }
-
- if (
-#ifdef _LIBC
- domain->conv != (__gconv_t) -1
-#else
-# if HAVE_ICONV
- domain->conv != (iconv_t) -1
-# endif
-#endif
- )
- {
- /* We are supposed to do a conversion. First allocate an
- appropriate table with the same structure as the hash
- table in the file where we can put the pointers to the
- converted strings in. */
- if (domain->conv_tab == NULL
- && ((domain->conv_tab = (char **) calloc (domain->hash_size,
- sizeof (char *)))
- == NULL))
- /* Mark that we didn't succeed allocating a table. */
- domain->conv_tab = (char **) -1;
-
- if (domain->conv_tab == (char **) -1)
- /* Nothing we can do, no more memory. */
- return NULL;
-
- if (domain->conv_tab[idx] == NULL)
- {
- /* We haven't used this string so far, so it is not
- translated yet. Do this now. */
-#ifdef _LIBC
- /* For glibc we use a bit more efficient memory handling.
- We allocate always larger blocks which get used over
- time. This is faster than many small allocations. */
- __libc_lock_define_initialized (static, lock)
- static unsigned char *freemem;
- static size_t freemem_size;
- /* Note that we include the NUL byte. */
- size_t resultlen = strlen (result) + 1;
- const unsigned char *inbuf = result;
- unsigned char *outbuf = freemem;
- size_t written;
- int res;
-
- __libc_lock_lock (lock);
-
- while ((res = __gconv (domain->conv,
- &inbuf, inbuf + resultlen,
- &outbuf, outbuf + freemem_size,
- &written)) == __GCONV_OK)
- {
- if (res != __GCONV_FULL_OUTPUT)
- goto out;
-
- /* We must resize the buffer. */
- freemem_size = MAX (2 * freemem_size, 4064);
- freemem = (char *) malloc (freemem_size);
- if (freemem == NULL)
- goto out;
-
- inbuf = result;
- outbuf = freemem;
- }
-
- /* We have now in our buffer a converted string. Put this
- in the hash table */
- domain->conv_tab[idx] = freemem;
- freemem_size -= outbuf - freemem;
- freemem = outbuf;
-
- out:
- __libc_lock_unlock (lock);
-#endif
- }
-
- result = domain->conv_tab[idx];
- }
-
- return result;
+ act = nstr - 1;
+ goto found;
}
while (1)
@@ -773,37 +685,199 @@ _nl_find_msg (domain_file, msgid, index)
domain->data + W (domain->must_swap,
domain->orig_tab[nstr - 1].offset))
== 0))
- return ((char *) domain->data
- + W (domain->must_swap,
- domain->trans_tab[nstr - 1].offset));
+ {
+ act = nstr - 1;
+ goto found;
+ }
}
/* NOTREACHED */
}
+ else
+ {
+ /* Try the default method: binary search in the sorted array of
+ messages. */
+ size_t top, bottom;
+
+ bottom = 0;
+ top = domain->nstrings;
+ while (bottom < top)
+ {
+ int cmp_val;
+
+ act = (bottom + top) / 2;
+ cmp_val = strcmp (msgid, (domain->data
+ + W (domain->must_swap,
+ domain->orig_tab[act].offset)));
+ if (cmp_val < 0)
+ top = act;
+ else if (cmp_val > 0)
+ bottom = act + 1;
+ else
+ goto found;
+ }
+ /* No translation was found. */
+ return NULL;
+ }
- /* Now we try the default method: binary search in the sorted
- array of messages. */
- bottom = 0;
- top = domain->nstrings;
- while (bottom < top)
+ found:
+ /* The translation was found at index ACT. If we have to convert the
+ string to use a different character set, this is the time. */
+ result = (char *) domain->data
+ + W (domain->must_swap, domain->trans_tab[act].offset);
+
+#if defined _LIBC || HAVE_ICONV
+ if (
+# ifdef _LIBC
+ domain->conv != (__gconv_t) -1
+# else
+# if HAVE_ICONV
+ domain->conv != (iconv_t) -1
+# endif
+# endif
+ )
{
- int cmp_val;
-
- act = (bottom + top) / 2;
- cmp_val = strcmp (msgid, (domain->data
- + W (domain->must_swap,
- domain->orig_tab[act].offset)));
- if (cmp_val < 0)
- top = act;
- else if (cmp_val > 0)
- bottom = act + 1;
- else
- break;
+ /* We are supposed to do a conversion. First allocate an
+ appropriate table with the same structure as the table
+ of translations in the file, where we can put the pointers
+ to the converted strings in.
+ The is a slight complication with the INDEX: We don't know
+ a priori which entries are plural entries. Therefore at any
+ moment we can only translate the variants 0 .. INDEX. */
+
+ if (domain->conv_tab == NULL
+ && ((domain->conv_tab = (char **) calloc (domain->nstrings,
+ sizeof (char *)))
+ == NULL))
+ /* Mark that we didn't succeed allocating a table. */
+ domain->conv_tab = (char **) -1;
+
+ if (domain->conv_tab == (char **) -1)
+ /* Nothing we can do, no more memory. */
+ goto converted;
+
+ if (domain->conv_tab[act] == NULL
+ || *(nls_uint32 *) domain->conv_tab[act] < index)
+ {
+ /* We haven't used this string so far, so it is not
+ translated yet. Do this now. */
+ /* We use a bit more efficient memory handling.
+ We allocate always larger blocks which get used over
+ time. This is faster than many small allocations. */
+ __libc_lock_define_initialized (static, lock)
+ static unsigned char *freemem;
+ static size_t freemem_size;
+
+ size_t resultlen;
+ const unsigned char *inbuf;
+ unsigned char *outbuf;
+
+ /* Note that we translate (index + 1) consecutive strings at
+ once, including the final NUL byte. */
+ {
+ unsigned long int i = index;
+ char *p = result;
+ do
+ p += strlen (p) + 1;
+ while (i-- > 0);
+ resultlen = p - result;
+ }
+
+ inbuf = result;
+ outbuf = freemem + 4;
+
+ __libc_lock_lock (lock);
+
+# ifdef _LIBC
+ {
+ size_t written;
+ int res;
+
+ while ((res = __gconv (domain->conv,
+ &inbuf, inbuf + resultlen,
+ &outbuf, outbuf + freemem_size,
+ &written)) == __GCONV_OK)
+ {
+ if (res != __GCONV_FULL_OUTPUT)
+ goto out;
+
+ /* We must resize the buffer. */
+ freemem_size = MAX (2 * freemem_size, 4064);
+ freemem = (char *) malloc (freemem_size);
+ if (freemem == NULL)
+ goto out;
+
+ inbuf = result;
+ outbuf = freemem + 4;
+ }
+