提交 b8a83a4f 编写于 作者: K Kevin Wolf

cutils: qemu_iovec_copy and qemu_iovec_memset

This adds two functions that work on QEMUIOVectors and will be used by the next
qcow2 patches.
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
上级 1b2adf28
...@@ -168,30 +168,50 @@ void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len) ...@@ -168,30 +168,50 @@ void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len)
} }
/* /*
* Copies iovecs from src to the end dst until src is completely copied or the * Copies iovecs from src to the end of dst. It starts copying after skipping
* total size of the copied iovec reaches size. The size of the last copied * the given number of bytes in src and copies until src is completely copied
* iovec is changed in order to fit the specified total size if it isn't a * or the total size of the copied iovec reaches size.The size of the last
* perfect fit already. * copied iovec is changed in order to fit the specified total size if it isn't
* a perfect fit already.
*/ */
void qemu_iovec_concat(QEMUIOVector *dst, QEMUIOVector *src, size_t size) void qemu_iovec_copy(QEMUIOVector *dst, QEMUIOVector *src, uint64_t skip,
size_t size)
{ {
int i; int i;
size_t done; size_t done;
void *iov_base;
uint64_t iov_len;
assert(dst->nalloc != -1); assert(dst->nalloc != -1);
done = 0; done = 0;
for (i = 0; (i < src->niov) && (done != size); i++) { for (i = 0; (i < src->niov) && (done != size); i++) {
if (done + src->iov[i].iov_len > size) { if (skip >= src->iov[i].iov_len) {
qemu_iovec_add(dst, src->iov[i].iov_base, size - done); /* Skip the whole iov */
skip -= src->iov[i].iov_len;
continue;
} else {
/* Skip only part (or nothing) of the iov */
iov_base = (uint8_t*) src->iov[i].iov_base + skip;
iov_len = src->iov[i].iov_len - skip;
skip = 0;
}
if (done + iov_len > size) {
qemu_iovec_add(dst, iov_base, size - done);
break; break;
} else { } else {
qemu_iovec_add(dst, src->iov[i].iov_base, src->iov[i].iov_len); qemu_iovec_add(dst, iov_base, iov_len);
} }
done += src->iov[i].iov_len; done += iov_len;
} }
} }
void qemu_iovec_concat(QEMUIOVector *dst, QEMUIOVector *src, size_t size)
{
qemu_iovec_copy(dst, src, 0, size);
}
void qemu_iovec_destroy(QEMUIOVector *qiov) void qemu_iovec_destroy(QEMUIOVector *qiov)
{ {
assert(qiov->nalloc != -1); assert(qiov->nalloc != -1);
...@@ -234,6 +254,18 @@ void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf, size_t count) ...@@ -234,6 +254,18 @@ void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf, size_t count)
} }
} }
void qemu_iovec_memset(QEMUIOVector *qiov, int c, size_t count)
{
size_t n;
int i;
for (i = 0; i < qiov->niov && count; ++i) {
n = MIN(count, qiov->iov[i].iov_len);
memset(qiov->iov[i].iov_base, c, n);
count -= n;
}
}
#ifndef _WIN32 #ifndef _WIN32
/* Sets a specific flag */ /* Sets a specific flag */
int fcntl_setfl(int fd, int flag) int fcntl_setfl(int fd, int flag)
......
...@@ -278,11 +278,14 @@ typedef struct QEMUIOVector { ...@@ -278,11 +278,14 @@ typedef struct QEMUIOVector {
void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint); void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint);
void qemu_iovec_init_external(QEMUIOVector *qiov, struct iovec *iov, int niov); void qemu_iovec_init_external(QEMUIOVector *qiov, struct iovec *iov, int niov);
void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len); void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len);
void qemu_iovec_copy(QEMUIOVector *dst, QEMUIOVector *src, uint64_t skip,
size_t size);
void qemu_iovec_concat(QEMUIOVector *dst, QEMUIOVector *src, size_t size); void qemu_iovec_concat(QEMUIOVector *dst, QEMUIOVector *src, size_t size);
void qemu_iovec_destroy(QEMUIOVector *qiov); void qemu_iovec_destroy(QEMUIOVector *qiov);
void qemu_iovec_reset(QEMUIOVector *qiov); void qemu_iovec_reset(QEMUIOVector *qiov);
void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf); void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf);
void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf, size_t count); void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf, size_t count);
void qemu_iovec_memset(QEMUIOVector *qiov, int c, size_t count);
struct Monitor; struct Monitor;
typedef struct Monitor Monitor; typedef struct Monitor Monitor;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册