about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--locale/programs/ld-collate.c5
-rw-r--r--sysdeps/posix/system.c28
3 files changed, 30 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 3cac10bf26..257dee79f4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+1999-12-24  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/posix/system.c (__libc_system): Check whether command
+	processor is available if LINE is NULL.  Don't return immediately
+	if wait call returned with EINTR.
+	Patches by Geoff Clare <gwc@unisoft.com> (PR libc/1497 and libc/1498).
+
 1999-12-23  Ulrich Drepper  <drepper@cygnus.com>
 
 	* locale/programs/ld-monetary.c (monetary_finish): Add cast to
diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c
index a0f1139cde..65229275ff 100644
--- a/locale/programs/ld-collate.c
+++ b/locale/programs/ld-collate.c
@@ -1583,7 +1583,7 @@ output_weight (struct obstack *pool, struct locale_collate_t *collate,
 	if (elem->weights[cnt].w[i] == NULL)
 	  {
 	    /* This entry was IGNORE.  */
-	    buf[len++] = '\3';
+	    buf[len++] = IGNORE_CHAR;
 	  }
 	else
 	  len += utf8_encode (&buf[len],
@@ -1839,6 +1839,9 @@ collate_output (struct localedef_t *locale, struct charmap_t *charmap,
   assert (cnt == _NL_ITEM_INDEX (_NL_NUM_LC_COLLATE));
 
   write_locale_data (output_path, "LC_COLLATE", 2 + cnt, iov);
+
+  obstack_free (&weightpool, NULL);
+  obstack_free (&extrapool, NULL);
 }
 
 
diff --git a/sysdeps/posix/system.c b/sysdeps/posix/system.c
index 1111646bbd..10c86a998b 100644
--- a/sysdeps/posix/system.c
+++ b/sysdeps/posix/system.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 94, 95, 96, 97 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 94, 95, 96, 97, 99 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
@@ -44,8 +44,9 @@ __libc_system (const char *line)
 #endif
 
   if (line == NULL)
-    /* This signals that we have a command processor available.  */
-    return 1;
+    /* Check that we have a command processor available.  It might
+       not be available after a chroot(), for example.  */
+    return __libc_system ("exit 0");
 
   sa.sa_handler = SIG_IGN;
   sa.sa_flags = 0;
@@ -113,23 +114,32 @@ __libc_system (const char *line)
     status = -1;
   else
     /* Parent side.  */
-#ifdef	NO_WAITPID
     {
+#ifdef	NO_WAITPID
       pid_t child;
       do
 	{
 	  child = __wait (&status);
-	  if (child <= -1)
+	  if (child <= -1 && errno != EINTR)
 	    {
 	      status = -1;
 	      break;
 	    }
-	} while (child != pid);
-    }
+	  /* Note that pid cannot be <= -1 and therefore the loop continues
+	     when __wait returned with EINTR.  */
+	}
+      while (child != pid);
 #else
-    if (__waitpid (pid, &status, 0) != pid)
-      status = -1;
+      int n;
+
+      do
+	n = __waitpid (pid, &status, 0);
+      while (n == -1 && errno == EINTR);
+
+      if (n != pid)
+	status = -1;
 #endif
+    }
 
   save = errno;
   if ((__sigaction (SIGINT, &intr, (struct sigaction *) NULL) |