diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | locale/programs/ld-collate.c | 5 | ||||
-rw-r--r-- | sysdeps/posix/system.c | 28 |
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) | |