diff options
author | Amit Shah <amit.shah@redhat.com> | 2010-05-04 16:39:07 +0530 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2010-05-10 11:36:03 -0500 |
commit | 4c64d5b52ed5287bb31489bba39cf41628230bce (patch) | |
tree | bb64c58482faa9f725daf2a28eda434d169efbac /iov.c | |
parent | 14eb8b6829ad9dee7035de729e083844a425f274 (diff) | |
download | qemu-4c64d5b52ed5287bb31489bba39cf41628230bce.tar.gz qemu-4c64d5b52ed5287bb31489bba39cf41628230bce.tar.bz2 qemu-4c64d5b52ed5287bb31489bba39cf41628230bce.zip |
iov: Move from hw/ to topdir
The iov functions can be useful to other code as well.
Signed-off-by: Amit Shah <amit.shah@redhat.com>
CC: Christoph Hellwig <hch@lst.de>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'iov.c')
-rw-r--r-- | iov.c | 70 |
1 files changed, 70 insertions, 0 deletions
@@ -0,0 +1,70 @@ +/* + * Helpers for getting linearized buffers from iov / filling buffers into iovs + * + * Copyright IBM, Corp. 2007, 2008 + * Copyright (C) 2010 Red Hat, Inc. + * + * Author(s): + * Anthony Liguori <aliguori@us.ibm.com> + * Amit Shah <amit.shah@redhat.com> + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + */ + +#include "iov.h" + +size_t iov_from_buf(struct iovec *iov, unsigned int iovcnt, + const void *buf, size_t size) +{ + size_t offset; + unsigned int i; + + offset = 0; + for (i = 0; offset < size && i < iovcnt; i++) { + size_t len; + + len = MIN(iov[i].iov_len, size - offset); + + memcpy(iov[i].iov_base, buf + offset, len); + offset += len; + } + return offset; +} + +size_t iov_to_buf(const struct iovec *iov, const unsigned int iovcnt, + void *buf, size_t offset, size_t size) +{ + uint8_t *ptr; + size_t iov_off, buf_off; + unsigned int i; + + ptr = buf; + iov_off = 0; + buf_off = 0; + for (i = 0; i < iovcnt && size; i++) { + if (offset < (iov_off + iov[i].iov_len)) { + size_t len = MIN((iov_off + iov[i].iov_len) - offset , size); + + memcpy(ptr + buf_off, iov[i].iov_base + (offset - iov_off), len); + + buf_off += len; + offset += len; + size -= len; + } + iov_off += iov[i].iov_len; + } + return buf_off; +} + +size_t iov_size(const struct iovec *iov, const unsigned int iovcnt) +{ + size_t len; + unsigned int i; + + len = 0; + for (i = 0; i < iovcnt; i++) { + len += iov[i].iov_len; + } + return len; +} |