]> git.proxmox.com Git - qemu.git/blame - iov.c
rewrite iov_* functions
[qemu.git] / iov.c
CommitLineData
e4d5639d
AS
1/*
2 * Helpers for getting linearized buffers from iov / filling buffers into iovs
3 *
4 * Copyright IBM, Corp. 2007, 2008
5 * Copyright (C) 2010 Red Hat, Inc.
6 *
7 * Author(s):
8 * Anthony Liguori <aliguori@us.ibm.com>
9 * Amit Shah <amit.shah@redhat.com>
2278a69e 10 * Michael Tokarev <mjt@tls.msk.ru>
e4d5639d
AS
11 *
12 * This work is licensed under the terms of the GNU GPL, version 2. See
13 * the COPYING file in the top-level directory.
6b620ca3
PB
14 *
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.
e4d5639d
AS
17 */
18
19#include "iov.h"
20
2278a69e
MT
21size_t iov_from_buf(struct iovec *iov, unsigned int iov_cnt,
22 size_t offset, const void *buf, size_t bytes)
e4d5639d 23{
2278a69e 24 size_t done;
e4d5639d 25 unsigned int i;
2278a69e
MT
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);
30 done += len;
31 offset = 0;
32 } else {
33 offset -= iov[i].iov_len;
348e7b8d 34 }
e4d5639d 35 }
2278a69e
MT
36 assert(offset == 0);
37 return done;
e4d5639d 38}
fa6111f2 39
2278a69e
MT
40size_t iov_to_buf(const struct iovec *iov, const unsigned int iov_cnt,
41 size_t offset, void *buf, size_t bytes)
fa6111f2 42{
2278a69e 43 size_t done;
fa6111f2 44 unsigned int i;
2278a69e
MT
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);
49 done += len;
50 offset = 0;
51 } else {
52 offset -= iov[i].iov_len;
fa6111f2 53 }
8d15028e 54 }
2278a69e
MT
55 assert(offset == 0);
56 return done;
8d15028e
GH
57}
58
dcf6f5e1 59size_t iov_memset(const struct iovec *iov, const unsigned int iov_cnt,
2278a69e 60 size_t offset, int fillc, size_t bytes)
8d15028e 61{
2278a69e 62 size_t done;
8d15028e 63 unsigned int i;
2278a69e
MT
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);
68 done += len;
69 offset = 0;
70 } else {
71 offset -= iov[i].iov_len;
8d15028e 72 }
fa6111f2 73 }
2278a69e
MT
74 assert(offset == 0);
75 return done;
fa6111f2
AS
76}
77
348e7b8d 78size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt)
fa6111f2
AS
79{
80 size_t len;
81 unsigned int i;
82
83 len = 0;
348e7b8d 84 for (i = 0; i < iov_cnt; i++) {
fa6111f2
AS
85 len += iov[i].iov_len;
86 }
87 return len;
88}
3a1dca94
GH
89
90void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt,
91 FILE *fp, const char *prefix, size_t limit)
92{
93 unsigned int i, v, b;
94 uint8_t *c;
95
96 c = iov[0].iov_base;
97 for (i = 0, v = 0, b = 0; b < limit; i++, b++) {
98 if (i == iov[v].iov_len) {
99 i = 0; v++;
100 if (v == iov_cnt) {
101 break;
102 }
103 c = iov[v].iov_base;
104 }
105 if ((b % 16) == 0) {
106 fprintf(fp, "%s: %04x:", prefix, b);
107 }
108 if ((b % 4) == 0) {
109 fprintf(fp, " ");
110 }
111 fprintf(fp, " %02x", c[i]);
112 if ((b % 16) == 15) {
113 fprintf(fp, "\n");
114 }
115 }
116 if ((b % 16) != 0) {
117 fprintf(fp, "\n");
118 }
119}