From 020f341f98301fbb595341e1ff447bc99b00e9d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Fri, 27 Dec 2013 05:53:19 +0100 Subject: [PATCH] qrexec-utils: add read_vchan_all and write_vchan_all Similar to read_all and write_all. --- qrexec-lib/libqrexec-utils.h | 2 ++ qrexec-lib/txrx-vchan.c | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/qrexec-lib/libqrexec-utils.h b/qrexec-lib/libqrexec-utils.h index b4f3204..9b03caf 100644 --- a/qrexec-lib/libqrexec-utils.h +++ b/qrexec-lib/libqrexec-utils.h @@ -42,6 +42,8 @@ void *buffer_data(struct buffer *b); void do_fork_exec(const char *cmdline, int *pid, int *stdin_fd, int *stdout_fd, int *stderr_fd); void wait_for_vchan_or_argfd(libvchan_t *vchan, int max, fd_set * rdset, fd_set * wrset); +int read_vchan_all(libvchan_t *vchan, void *data, size_t size); +int write_vchan_all(libvchan_t *vchan, void *data, size_t size); int read_all(int fd, void *buf, int size); int write_all(int fd, const void *buf, int size); void fix_fds(int fdin, int fdout, int fderr); diff --git a/qrexec-lib/txrx-vchan.c b/qrexec-lib/txrx-vchan.c index b3d252e..c552b84 100644 --- a/qrexec-lib/txrx-vchan.c +++ b/qrexec-lib/txrx-vchan.c @@ -74,3 +74,29 @@ void wait_for_vchan_or_argfd(libvchan_t *ctrl, int max, fd_set * rdset, fd_set * } while (wait_for_vchan_or_argfd_once(ctrl, max, rdset, wrset) == 0); } + +int write_vchan_all(libvchan_t *vchan, void *data, size_t size) { + int pos, ret; + + pos = 0; + while (pos < size) { + ret = libvchan_write(vchan, data+pos, size-pos); + if (ret < 0) + return 0; + pos += ret; + } + return 1; +} + +int read_vchan_all(libvchan_t *vchan, void *data, size_t size) { + int pos, ret; + + pos = 0; + while (pos < size) { + ret = libvchan_read(vchan, data+pos, size-pos); + if (ret < 0) + return 0; + pos += ret; + } + return 1; +}