diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2011-07-13 15:16:08 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2011-08-04 15:51:22 +0200 |
commit | 8d15028ec03999fa6eca8dba7ef7cd4eb575486b (patch) | |
tree | f1e307c00f1bf86de0e9a177f9069f3f005adfdd | |
parent | 3a1dca94d6dba00fe0fd4c4a28449f57e01b9b6c (diff) | |
download | hqemu-8d15028ec03999fa6eca8dba7ef7cd4eb575486b.zip hqemu-8d15028ec03999fa6eca8dba7ef7cd4eb575486b.tar.gz |
Add iov_clear()
Fill the spefified area with zeros.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r-- | iov.c | 23 | ||||
-rw-r--r-- | iov.h | 2 |
2 files changed, 25 insertions, 0 deletions
@@ -62,6 +62,29 @@ size_t iov_to_buf(const struct iovec *iov, const unsigned int iov_cnt, return buf_off; } +size_t iov_clear(const struct iovec *iov, const unsigned int iov_cnt, + size_t iov_off, size_t size) +{ + size_t iovec_off, buf_off; + unsigned int i; + + iovec_off = 0; + buf_off = 0; + for (i = 0; i < iov_cnt && size; i++) { + if (iov_off < (iovec_off + iov[i].iov_len)) { + size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off , size); + + memset(iov[i].iov_base + (iov_off - iovec_off), 0, len); + + buf_off += len; + iov_off += len; + size -= len; + } + iovec_off += iov[i].iov_len; + } + return buf_off; +} + size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt) { size_t len; @@ -17,5 +17,7 @@ size_t iov_from_buf(struct iovec *iov, unsigned int iov_cnt, size_t iov_to_buf(const struct iovec *iov, const unsigned int iov_cnt, void *buf, size_t iov_off, size_t size); size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt); +size_t iov_clear(const struct iovec *iov, const unsigned int iov_cnt, + size_t iov_off, size_t size); void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt, FILE *fp, const char *prefix, size_t limit); |