ACK: [PATCH 1/6] pipeio: fix fwts_pipe_read return value when child produces no output
Alex Hung
alex.hung at canonical.com
Wed Apr 27 04:30:42 UTC 2016
On 2016-04-22 01:41 PM, Jeremy Kerr wrote:
> Currently, it's not possible to distinguish between a failure in
> fwts_pipe_read(), and the child process outputting no data - in both
> cases, NULL is returned.
>
> This change moves the returned buffer to an output argument, with the
> return value indicating errors.
>
> Signed-off-by: Jeremy Kerr <jk at ozlabs.org>
> ---
> src/lib/include/fwts_pipeio.h | 2 +-
> src/lib/src/fwts_devicetree.c | 6 +++---
> src/lib/src/fwts_dump.c | 2 +-
> src/lib/src/fwts_pipeio.c | 21 +++++++++++----------
> 4 files changed, 16 insertions(+), 15 deletions(-)
>
> diff --git a/src/lib/include/fwts_pipeio.h b/src/lib/include/fwts_pipeio.h
> index b014587..96952e0 100644
> --- a/src/lib/include/fwts_pipeio.h
> +++ b/src/lib/include/fwts_pipeio.h
> @@ -31,7 +31,7 @@
> #define FWTS_EXEC_ERROR (127)
>
> int fwts_pipe_open(const char *command, pid_t *childpid);
> -char *fwts_pipe_read(const int fd, ssize_t *length);
> +int fwts_pipe_read(const int fd, char **out_buf, ssize_t *out_len);
> int fwts_pipe_close(const int fd, const pid_t pid);
> int fwts_pipe_exec(const char *command, fwts_list **list, int *status);
> int fwts_exec(const char *command, int *status);
> diff --git a/src/lib/src/fwts_devicetree.c b/src/lib/src/fwts_devicetree.c
> index 41cee54..b68a00e 100644
> --- a/src/lib/src/fwts_devicetree.c
> +++ b/src/lib/src/fwts_devicetree.c
> @@ -46,15 +46,15 @@ int fwts_devicetree_read(fwts_framework *fwts)
> }
> free(command);
>
> - data = fwts_pipe_read(fd, &len);
> - if (data == NULL) {
> + rc = fwts_pipe_read(fd, &data, &len);
> + if (rc) {
> fwts_pipe_close(fd, pid);
> return FWTS_ERROR;
> }
>
> status = fwts_pipe_close(fd, pid);
>
> - if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
> + if (!WIFEXITED(status) || WEXITSTATUS(status) != 0 || len == 0) {
> fprintf(stderr, "Cannot read devicetree data: dtc failed\n");
> return FWTS_ERROR;
> }
> diff --git a/src/lib/src/fwts_dump.c b/src/lib/src/fwts_dump.c
> index b348d6f..edd2850 100644
> --- a/src/lib/src/fwts_dump.c
> +++ b/src/lib/src/fwts_dump.c
> @@ -94,7 +94,7 @@ static int dump_exec(const char *filename, const char *command)
> if ((fd = fwts_pipe_open(command, &pid)) < 0)
> return FWTS_ERROR;
>
> - if ((data = fwts_pipe_read(fd, &len)) == NULL) {
> + if (fwts_pipe_read(fd, &data, &len) != 0) {
> fwts_pipe_close(fd, pid);
> return FWTS_ERROR;
> }
> diff --git a/src/lib/src/fwts_pipeio.c b/src/lib/src/fwts_pipeio.c
> index 7dda976..75addc5 100644
> --- a/src/lib/src/fwts_pipeio.c
> +++ b/src/lib/src/fwts_pipeio.c
> @@ -85,16 +85,16 @@ int fwts_pipe_open(const char *command, pid_t *childpid)
>
> /*
> * fwts_pipe_read()
> - * read output from fwts_pipe_open(), *length is
> - * set to the number of chars read and we return
> - * a buffer of read data.
> + * read output from fwts_pipe_open(), *out_buf is populated with returned
> + * data (allocated, must be free()-ed after use), and length in *out_len.
> + * Returns non-zero on failure.
> */
> -char *fwts_pipe_read(const int fd, ssize_t *length)
> +int fwts_pipe_read(const int fd, char **out_buf, ssize_t *out_len)
> {
> char *ptr = NULL;
> char buffer[8192];
> ssize_t size = 0;
> - *length = 0;
> + *out_len = 0;
>
> ptr = NULL;
>
> @@ -107,22 +107,23 @@ char *fwts_pipe_read(const int fd, ssize_t *length)
> if (n < 0) {
> if (errno != EINTR && errno != EAGAIN) {
> free(ptr);
> - return NULL;
> + return -1;
> }
> continue;
> }
>
> if ((tmp = realloc(ptr, size + n + 1)) == NULL) {
> free(ptr);
> - return NULL;
> + return -1;
> }
> ptr = tmp;
> memcpy(ptr + size, buffer, n);
> size += n;
> *(ptr+size) = 0;
> }
> - *length = size;
> - return ptr;
> + *out_len = size;
> + *out_buf = ptr;
> + return 0;
> }
>
> /*
> @@ -162,7 +163,7 @@ int fwts_pipe_exec(const char *command, fwts_list **list, int *status)
> if ((fd = fwts_pipe_open(command, &pid)) < 0)
> return FWTS_ERROR;
>
> - text = fwts_pipe_read(fd, &len);
> + fwts_pipe_read(fd, &text, &len);
> *list = fwts_list_from_text(text);
> free(text);
>
>
Acked-by: Alex Hung <alex.hung at canonical.com>
More information about the fwts-devel
mailing list