From fdea75a55560b95ae051635eb2a591275b446ab7 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sun, 17 Oct 2021 16:20:46 +0200 Subject: [PATCH] Add read_pipe_all() Add a convenience function to read from a pipe until all requested data has been read. --- app/src/util/process.c | 15 +++++++++++++++ app/src/util/process.h | 3 +++ 2 files changed, 18 insertions(+) diff --git a/app/src/util/process.c b/app/src/util/process.c index 5edeeee6..c7a22ef4 100644 --- a/app/src/util/process.c +++ b/app/src/util/process.c @@ -19,3 +19,18 @@ process_check_success(process_t proc, const char *name, bool close) { } return true; } + +ssize_t +read_pipe_all(pipe_t pipe, char *data, size_t len) { + size_t copied = 0; + while (len > 0) { + ssize_t r = read_pipe(pipe, data, len); + if (r <= 0) { + return copied ? (ssize_t) copied : r; + } + len -= r; + data += r; + copied += r; + } + return copied; +} diff --git a/app/src/util/process.h b/app/src/util/process.h index beea7d61..09683016 100644 --- a/app/src/util/process.h +++ b/app/src/util/process.h @@ -91,6 +91,9 @@ is_regular_file(const char *path); ssize_t read_pipe(pipe_t pipe, char *data, size_t len); +ssize_t +read_pipe_all(pipe_t pipe, char *data, size_t len); + void close_pipe(pipe_t pipe);