summaryrefslogtreecommitdiffstats
path: root/src/pacman/util.c
diff options
context:
space:
mode:
authorAndrew Gregory <andrew.gregory.8@gmail.com>2014-08-06 22:36:00 +0200
committerAllan McRae <allan@archlinux.org>2014-09-23 13:43:16 +0200
commitc792262b137a5f2daddac22f82e7d8d98d0d7d31 (patch)
treed3177e6c722a96da72503a912d4c5fded0ef78e8 /src/pacman/util.c
parent9c066dff439ba453f4c362e1875b794cf3f362ed (diff)
downloadpacman-c792262b137a5f2daddac22f82e7d8d98d0d7d31.tar.gz
pacman-c792262b137a5f2daddac22f82e7d8d98d0d7d31.tar.xz
wrap fgets to retry on EINTR
The read() underlying fgets() can be interrupted by a signal handler causing fgets() to return NULL. Before we started handling SIGWINCH, the odds of interrupting a read were low and typically resulted in termination anyway. Replace all fgets calls with a wrapper that retries in EINTR. Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com>
Diffstat (limited to 'src/pacman/util.c')
-rw-r--r--src/pacman/util.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/pacman/util.c b/src/pacman/util.c
index 6a095fdb..2671e54c 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -1403,7 +1403,7 @@ int multiselect_question(char *array, int count)
flush_term_input(fileno(stdin));
- if(fgets(response, response_len, stdin)) {
+ if(safe_fgets(response, response_len, stdin)) {
const size_t response_incr = 64;
size_t len;
/* handle buffer not being large enough to read full line case */
@@ -1416,7 +1416,7 @@ int multiselect_question(char *array, int count)
lastchar = response + response_len - 1;
/* sentinel byte */
*lastchar = 1;
- if(fgets(response + response_len - response_incr - 1,
+ if(safe_fgets(response + response_len - response_incr - 1,
response_incr + 1, stdin) == 0) {
free(response);
return -1;
@@ -1467,7 +1467,7 @@ int select_question(int count)
flush_term_input(fileno(stdin));
- if(fgets(response, sizeof(response), stdin)) {
+ if(safe_fgets(response, sizeof(response), stdin)) {
size_t len = strtrim(response);
if(len > 0) {
int n;
@@ -1521,7 +1521,7 @@ static int question(short preset, const char *format, va_list args)
flush_term_input(fd_in);
- if(fgets(response, sizeof(response), stdin)) {
+ if(safe_fgets(response, sizeof(response), stdin)) {
size_t len = strtrim(response);
if(len == 0) {
return preset;