diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2012-10-31 10:42:51 +0100 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2012-10-31 10:42:51 +0100 |
commit | f563a5d7a820424756f358e747238f03e866838a (patch) | |
tree | f78fa474b1933bd395af401a6d745150f4ecd15e /iov.c | |
parent | a27365265cc2fed1178bf25a205e8ee02a9c0caf (diff) | |
parent | aee0bf7d8d7564f8f2c40e4501695c492b7dd8d1 (diff) | |
download | qemu-f563a5d7a820424756f358e747238f03e866838a.zip qemu-f563a5d7a820424756f358e747238f03e866838a.tar.gz qemu-f563a5d7a820424756f358e747238f03e866838a.tar.bz2 |
Merge remote-tracking branch 'origin/master' into threadpool
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'iov.c')
-rw-r--r-- | iov.c | 23 |
1 files changed, 23 insertions, 0 deletions
@@ -229,6 +229,29 @@ void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt, } } +unsigned iov_copy(struct iovec *dst_iov, unsigned int dst_iov_cnt, + const struct iovec *iov, unsigned int iov_cnt, + size_t offset, size_t bytes) +{ + size_t len; + unsigned int i, j; + for (i = 0, j = 0; i < iov_cnt && j < dst_iov_cnt && bytes; i++) { + if (offset >= iov[i].iov_len) { + offset -= iov[i].iov_len; + continue; + } + len = MIN(bytes, iov[i].iov_len - offset); + + dst_iov[j].iov_base = iov[i].iov_base + offset; + dst_iov[j].iov_len = len; + j++; + bytes -= len; + offset = 0; + } + assert(offset == 0); + return j; +} + /* io vectors */ void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint) |