mirror of https://github.com/xqemu/xqemu.git
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: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
1b2adf2803
commit
b8a83a4f79
50
cutils.c
50
cutils.c
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue