summaryrefslogtreecommitdiff
path: root/catgets
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-08-29 01:19:12 +0000
committerUlrich Drepper <drepper@redhat.com>1997-08-29 01:19:12 +0000
commit39e16978c3b4ac8eaf2201fac56316623910d9da (patch)
tree054fff18119b31464b3133ad91050694130c7d2a /catgets
parent92f1da4da04a7a86ddee91be5eaf0b10c333ac64 (diff)
downloadglibc-39e16978c3b4ac8eaf2201fac56316623910d9da.tar.gz
1997-08-29 02:36 Ulrich Drepper <drepper@cygnus.com> * Makefile (version-info.h): Use ISO form for the date. * catgets/catgetsinfo.h: Include <bits/libc-lock.h>. (struct catalog_obj): Add lock field. (__open_catalog): Remove second parameter from prototype. * catgets/catgets.c (catopen): Initialize lock field. (catgets): Don't pass second parameter to __open_catalog. * catgets/gencat.c: Initialize lock field and don't pass second parameter to __open_catalog. * catgets/open_catalog.c (__open_catalog): Decide about use of path by examining path in struct, not based on extra argument. Acquire a the lock before trying to load the catalog and release it before returning. * csu/Makefile (abi-tag.h): Make sure target directory exists. * io/Makefile (headers): Add bits/poll.h. * io/sys/poll.h: Remove definitions of POLL* constants. Include <bits/poll.h>. * sysdeps/generic/bits/poll.h: New file. * sysdeps/unix/sysv/linux/bits/poll.h: New file. * sysdeps/unix/sysv/linux/m68k/bits/poll.h: New file. * sysdeps/unix/sysv/linux/mips/bits/poll.h: New file. * sysdeps/unix/sysv/linux/sparc/bits/poll.h: New file. * libio/fileops.c (_IO_file_read, _IO_file_write): Remove dead code. * malloc/obstack.c: Add casts to keep very verbose compilers on 64bit machine quiet. * nss/Makefile (libnss_db.so): Find libdb.so in db2 directory. 1997-08-28 17:30 Ulrich Drepper <drepper@cygnus.com> * catgets/catgets.c (catopen): Correctly determine length of string in NLSPATH evironment variable. Patch by HJ Lu <hjl@gnu.ai.mit.edu>. 1997-08-27 23:19 Richard Henderson <rth@cygnus.com> * sysdeps/generic/dl-sysdep.c (DL_FIND_ARG_COMPONENTS): Provide default macro to track down arguments from stack start. (_dl_sysdep_start): Use it. * sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c: Truncate to simply providing a special DL_FIND_ARG_COMPONENTS and including the next file up the line. * sysdeps/powerpc/e_sqrt.c: Move contents to w_sqrt.c and provide stub. * sysdeps/powerpc/e_sqrtf.c: Likewise. * sysdeps/powerpc/s_copysignf.S: Provide empty file; symbol is with the double precision version. * sysdeps/powerpc/s_fabsf.S: Likewise. * sysdeps/powerpc/s_isnanf.S: Likewise.
Diffstat (limited to 'catgets')
-rw-r--r--catgets/catgets.c6
-rw-r--r--catgets/catgetsinfo.h7
-rw-r--r--catgets/gencat.c4
-rw-r--r--catgets/open_catalog.c28
4 files changed, 32 insertions, 13 deletions
diff --git a/catgets/catgets.c b/catgets/catgets.c
index 4c6997e567..d5eefc9e08 100644
--- a/catgets/catgets.c
+++ b/catgets/catgets.c
@@ -87,7 +87,7 @@ catopen (const char *cat_name, int flag)
if (nlspath != NULL && *nlspath != '\0')
{
/* Append the system dependent directory. */
- size_t len = strlen (nlspath + 1 + sizeof NLSPATH);
+ size_t len = strlen (nlspath) + 1 + sizeof NLSPATH;
char *tmp = alloca (len);
__stpcpy (__stpcpy (__stpcpy (tmp, nlspath), ":"), NLSPATH);
@@ -111,6 +111,8 @@ catopen (const char *cat_name, int flag)
result->nlspath = NULL;
}
+ __libc_lock_init (result->lock);
+
return (nl_catd) result;
}
@@ -130,7 +132,7 @@ catgets (nl_catd catalog_desc, int set, int message, const char *string)
catalog = (__nl_catd) catalog_desc;
if (catalog->status == closed)
- __open_catalog (catalog, 1);
+ __open_catalog (catalog);
if (catalog->status == nonexisting)
{
diff --git a/catgets/catgetsinfo.h b/catgets/catgetsinfo.h
index 292572decf..edb1099d8c 100644
--- a/catgets/catgetsinfo.h
+++ b/catgets/catgetsinfo.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
@@ -18,6 +18,7 @@
Boston, MA 02111-1307, USA. */
#include <sys/types.h>
+#include <bits/libc-lock.h>
struct catalog_obj
@@ -47,6 +48,8 @@ typedef struct catalog_info
struct catalog_obj *file_ptr;
size_t file_size;
+
+ __libc_lock_define (,lock);
} *__nl_catd;
@@ -56,4 +59,4 @@ typedef struct catalog_info
/* Prototypes for helper functions. */
-void __open_catalog (__nl_catd __catalog, int __with_path);
+void __open_catalog (__nl_catd __catalog);
diff --git a/catgets/gencat.c b/catgets/gencat.c
index 9ce962c3c9..8d310d81f4 100644
--- a/catgets/gencat.c
+++ b/catgets/gencat.c
@@ -988,9 +988,11 @@ read_old (struct catalog *catalog, const char *file_name)
old_cat_obj.status = closed;
old_cat_obj.cat_name = file_name;
+ old_cat_obj.nlspath = NULL;
+ __libc_lock_init (old_cat_obj.lock);
/* Try to open catalog, but don't look through the NLSPATH. */
- __open_catalog (&old_cat_obj, 0);
+ __open_catalog (&old_cat_obj);
if (old_cat_obj.status != mmapped && old_cat_obj.status != malloced)
if (errno == ENOENT)
diff --git a/catgets/open_catalog.c b/catgets/open_catalog.c
index 2c1cbb4a4c..62fb111e43 100644
--- a/catgets/open_catalog.c
+++ b/catgets/open_catalog.c
@@ -33,14 +33,22 @@
void
-__open_catalog (__nl_catd catalog, int with_path)
+__open_catalog (__nl_catd catalog)
{
int fd;
struct stat st;
int swapping;
- if (strchr (catalog->cat_name, '/') != NULL || !with_path)
- fd = open (catalog->cat_name, O_RDONLY);
+ /* Make sure we are alone. */
+ __libc_lock_lock (catalog->lock);
+
+ /* Check whether there was no other thread faster. */
+ if (catalog->status != closed)
+ /* While we waited some other thread tried to open the catalog. */
+ goto unlock_return;
+
+ if (strchr (catalog->cat_name, '/') != NULL || catalog->nlspath == NULL)
+ fd = __open (catalog->cat_name, O_RDONLY);
else
{
const char *run_nlspath = catalog->nlspath;
@@ -164,7 +172,7 @@ __open_catalog (__nl_catd catalog, int with_path)
if (fd < 0 || __fstat (fd, &st) < 0)
{
catalog->status = nonexisting;
- return;
+ goto unlock_return;
}
#ifndef MAP_COPY
@@ -195,7 +203,7 @@ __open_catalog (__nl_catd catalog, int with_path)
if (catalog->file_ptr == NULL)
{
catalog->status = nonexisting;
- return;
+ goto unlock_return;
}
todo = st.st_size;
/* Save read, handle partial reads. */
@@ -207,7 +215,7 @@ __open_catalog (__nl_catd catalog, int with_path)
{
free ((void *) catalog->file_ptr);
catalog->status = nonexisting;
- return;
+ goto unlock_return;
}
todo -= now;
}
@@ -227,14 +235,14 @@ __open_catalog (__nl_catd catalog, int with_path)
swapping = 1;
else
{
- /* Illegal file. Free he resources and mark catalog as not
+ /* Illegal file. Free the resources and mark catalog as not
usable. */
if (catalog->status == mmapped)
__munmap ((void *) catalog->file_ptr, catalog->file_size);
else
free (catalog->file_ptr);
catalog->status = nonexisting;
- return;
+ goto unlock_return;
}
#define SWAP(x) (swapping ? SWAPU32 (x) : (x))
@@ -260,4 +268,8 @@ __open_catalog (__nl_catd catalog, int with_path)
catalog->strings =
(const char *) &catalog->file_ptr->name_ptr[catalog->plane_size
* catalog->plane_depth * 3 * 2];
+
+ /* Release the lock again. */
+ unlock_return:
+ __libc_lock_unlock (catalog->lock);
}