about summary refs log tree commit diff
path: root/catgets/open_catalog.c
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/open_catalog.c
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/open_catalog.c')
-rw-r--r--catgets/open_catalog.c28
1 files changed, 20 insertions, 8 deletions
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);
 }