mirror of https://github.com/xqemu/xqemu.git
iov: add iov_cpy
Add API to copy part of iovec safely. Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
e35e23f655
commit
d336336c81
23
iov.c
23
iov.c
|
@ -228,3 +228,26 @@ void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt,
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
9
iov.h
9
iov.h
|
@ -86,3 +86,12 @@ ssize_t iov_send_recv(int sockfd, struct iovec *iov, unsigned iov_cnt,
|
||||||
*/
|
*/
|
||||||
void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt,
|
void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt,
|
||||||
FILE *fp, const char *prefix, size_t limit);
|
FILE *fp, const char *prefix, size_t limit);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Partial copy of vector from iov to dst_iov (data is not copied).
|
||||||
|
* dst_iov overlaps iov at a specified offset.
|
||||||
|
* size of dst_iov is at most bytes. dst vector count is returned.
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
|
Loading…
Reference in New Issue