]>
git.proxmox.com Git - qemu.git/blob - iov.c
2 * Helpers for getting linearized buffers from iov / filling buffers into iovs
4 * Copyright IBM, Corp. 2007, 2008
5 * Copyright (C) 2010 Red Hat, Inc.
8 * Anthony Liguori <aliguori@us.ibm.com>
9 * Amit Shah <amit.shah@redhat.com>
10 * Michael Tokarev <mjt@tls.msk.ru>
12 * This work is licensed under the terms of the GNU GPL, version 2. See
13 * the COPYING file in the top-level directory.
15 * Contributions after 2012-01-13 are licensed under the terms of the
16 * GNU GPL, version 2 or (at your option) any later version.
21 size_t iov_from_buf(struct iovec
*iov
, unsigned int iov_cnt
,
22 size_t offset
, const void *buf
, size_t bytes
)
26 for (i
= 0, done
= 0; (offset
|| done
< bytes
) && i
< iov_cnt
; i
++) {
27 if (offset
< iov
[i
].iov_len
) {
28 size_t len
= MIN(iov
[i
].iov_len
- offset
, bytes
- done
);
29 memcpy(iov
[i
].iov_base
+ offset
, buf
+ done
, len
);
33 offset
-= iov
[i
].iov_len
;
40 size_t iov_to_buf(const struct iovec
*iov
, const unsigned int iov_cnt
,
41 size_t offset
, void *buf
, size_t bytes
)
45 for (i
= 0, done
= 0; (offset
|| done
< bytes
) && i
< iov_cnt
; i
++) {
46 if (offset
< iov
[i
].iov_len
) {
47 size_t len
= MIN(iov
[i
].iov_len
- offset
, bytes
- done
);
48 memcpy(buf
+ done
, iov
[i
].iov_base
+ offset
, len
);
52 offset
-= iov
[i
].iov_len
;
59 size_t iov_memset(const struct iovec
*iov
, const unsigned int iov_cnt
,
60 size_t offset
, int fillc
, size_t bytes
)
64 for (i
= 0, done
= 0; (offset
|| done
< bytes
) && i
< iov_cnt
; i
++) {
65 if (offset
< iov
[i
].iov_len
) {
66 size_t len
= MIN(iov
[i
].iov_len
- offset
, bytes
- done
);
67 memset(iov
[i
].iov_base
+ offset
, fillc
, len
);
71 offset
-= iov
[i
].iov_len
;
78 size_t iov_size(const struct iovec
*iov
, const unsigned int iov_cnt
)
84 for (i
= 0; i
< iov_cnt
; i
++) {
85 len
+= iov
[i
].iov_len
;
90 void iov_hexdump(const struct iovec
*iov
, const unsigned int iov_cnt
,
91 FILE *fp
, const char *prefix
, size_t limit
)
97 for (i
= 0, v
= 0, b
= 0; b
< limit
; i
++, b
++) {
98 if (i
== iov
[v
].iov_len
) {
106 fprintf(fp
, "%s: %04x:", prefix
, b
);
111 fprintf(fp
, " %02x", c
[i
]);
112 if ((b
% 16) == 15) {