about summary refs log tree commit diff
path: root/catgets/open_catalog.c
diff options
context:
space:
mode:
Diffstat (limited to 'catgets/open_catalog.c')
-rw-r--r--catgets/open_catalog.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/catgets/open_catalog.c b/catgets/open_catalog.c
index c5193e166d..4a63a138e0 100644
--- a/catgets/open_catalog.c
+++ b/catgets/open_catalog.c
@@ -50,7 +50,7 @@ __open_catalog (__nl_catd catalog)
   __libc_lock_lock (catalog->lock);
 
   /* Check whether there was no other thread faster.  */
-  if (catalog->status != closed)
+  if (__builtin_expect (catalog->status != closed, 0))
     /* While we waited some other thread tried to open the catalog.  */
     goto unlock_return;
 
@@ -60,7 +60,7 @@ __open_catalog (__nl_catd catalog)
     {
       const char *run_nlspath = catalog->nlspath;
 #define ENOUGH(n)							      \
-  if (bufact + (n) >=bufmax) 						      \
+  if (__builtin_expect (bufact + (n) >= bufmax, 0))			      \
     {									      \
       char *old_buf = buf;						      \
       bufmax += 256 + (n);						      \
@@ -251,8 +251,12 @@ __open_catalog (__nl_catd catalog)
 	{
 	  size_t now = __read (fd, (((char *) &catalog->file_ptr)
 				    + (st.st_size - todo)), todo);
-	  if (now == 0)
+	  if (now == 0 || now == (size_t) -1)
 	    {
+#ifdef EINTR
+	      if (now == (size_t) -1 && errno == EINTR)
+		continue;
+#endif
 	      free ((void *) catalog->file_ptr);
 	      catalog->status = nonexisting;
 	      goto close_unlock_return;