[PATCH v7 10/10] convert: Update subprocess_read_status to not die on EOF
flat view
STALE3444d
From: Ben Peart <hidden>
Date: 2017-05-05 15:28:58
Subsystem:
the rest · Maintainer:
Linus Torvalds
Enable sub-processes to gracefully handle when the process dies by updating subprocess_read_status to return an error on EOF instead of dying. Update apply_multi_file_filter to take advantage of the revised subprocess_read_status. Signed-off-by: Ben Peart <redacted> --- convert.c | 10 ++++++++-- sub-process.c | 10 +++++++--- sub-process.h | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/convert.c b/convert.c
index acf51416d1..85238e4976 100644
--- a/convert.c
+++ b/convert.c@@ -635,7 +635,10 @@ static int apply_multi_file_filter(const char *path, const char *src, size_t len if (err) goto done; - subprocess_read_status(process->out, &filter_status); + err = subprocess_read_status(process->out, &filter_status); + if (err) + goto done; + err = strcmp(filter_status.buf, "success"); if (err) goto done;
@@ -644,7 +647,10 @@ static int apply_multi_file_filter(const char *path, const char *src, size_t len if (err) goto done; - subprocess_read_status(process->out, &filter_status); + err = subprocess_read_status(process->out, &filter_status); + if (err) + goto done; + err = strcmp(filter_status.buf, "success"); done:
diff --git a/sub-process.c b/sub-process.c
index 536b60cced..92f8aea70a 100644
--- a/sub-process.c
+++ b/sub-process.c@@ -21,13 +21,15 @@ struct subprocess_entry *subprocess_find_entry(struct hashmap *hashmap, const ch return hashmap_get(hashmap, &key, NULL); } -void subprocess_read_status(int fd, struct strbuf *status) +int subprocess_read_status(int fd, struct strbuf *status) { struct strbuf **pair; char *line; + int len; + for (;;) { - line = packet_read_line(fd, NULL); - if (!line) + len = packet_read_line_gently(fd, NULL, &line); + if ((len < 0) || !line) break; pair = strbuf_split_str(line, '=', 2); if (pair[0] && pair[0]->len && pair[1]) {
@@ -39,6 +41,8 @@ void subprocess_read_status(int fd, struct strbuf *status) } strbuf_list_free(pair); } + + return (len < 0) ? len : 0; } void subprocess_stop(struct hashmap *hashmap, struct subprocess_entry *entry)
diff --git a/sub-process.h b/sub-process.h
index a88e782bfc..7d451e1cde 100644
--- a/sub-process.h
+++ b/sub-process.h@@ -44,6 +44,6 @@ static inline struct child_process *subprocess_get_child_process( * key/value pairs and return the value from the last "status" packet */ -void subprocess_read_status(int fd, struct strbuf *status); +int subprocess_read_status(int fd, struct strbuf *status); #endif
--
2.12.2.gvfs.2.20.g3624a68d62.dirty