about summary refs log tree commit diff
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
glibc-39e16978c3b4ac8eaf2201fac56316623910d9da.tar.xz
glibc-39e16978c3b4ac8eaf2201fac56316623910d9da.zip
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);
 }