From c792262b137a5f2daddac22f82e7d8d98d0d7d31 Mon Sep 17 00:00:00 2001 From: Andrew Gregory Date: Wed, 6 Aug 2014 16:36:00 -0400 Subject: 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 --- src/pacman/ini.c | 2 +- src/pacman/util.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'src/pacman') diff --git a/src/pacman/ini.c b/src/pacman/ini.c index 2a3ef0ed..2eb32302 100644 --- a/src/pacman/ini.c +++ b/src/pacman/ini.c @@ -66,7 +66,7 @@ static int _parse_ini(const char *file, ini_parser_fn cb, void *data, goto cleanup; } - while(fgets(line, PATH_MAX, fp)) { + while(safe_fgets(line, PATH_MAX, fp)) { char *key, *value, *ptr; size_t line_len; 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; -- cgit v1.2.3-54-g00ecf