Statistics
| Branch: | Revision:

root / iov.c @ d7582078

History | View | Annotate | Download (3.3 kB)

1 e4d5639d Amit Shah
/*
2 e4d5639d Amit Shah
 * Helpers for getting linearized buffers from iov / filling buffers into iovs
3 e4d5639d Amit Shah
 *
4 e4d5639d Amit Shah
 * Copyright IBM, Corp. 2007, 2008
5 e4d5639d Amit Shah
 * Copyright (C) 2010 Red Hat, Inc.
6 e4d5639d Amit Shah
 *
7 e4d5639d Amit Shah
 * Author(s):
8 e4d5639d Amit Shah
 *  Anthony Liguori <aliguori@us.ibm.com>
9 e4d5639d Amit Shah
 *  Amit Shah <amit.shah@redhat.com>
10 e4d5639d Amit Shah
 *
11 e4d5639d Amit Shah
 * This work is licensed under the terms of the GNU GPL, version 2.  See
12 e4d5639d Amit Shah
 * the COPYING file in the top-level directory.
13 6b620ca3 Paolo Bonzini
 *
14 6b620ca3 Paolo Bonzini
 * Contributions after 2012-01-13 are licensed under the terms of the
15 6b620ca3 Paolo Bonzini
 * GNU GPL, version 2 or (at your option) any later version.
16 e4d5639d Amit Shah
 */
17 e4d5639d Amit Shah
18 e4d5639d Amit Shah
#include "iov.h"
19 e4d5639d Amit Shah
20 348e7b8d Hannes Reinecke
size_t iov_from_buf(struct iovec *iov, unsigned int iov_cnt,
21 348e7b8d Hannes Reinecke
                    const void *buf, size_t iov_off, size_t size)
22 e4d5639d Amit Shah
{
23 348e7b8d Hannes Reinecke
    size_t iovec_off, buf_off;
24 e4d5639d Amit Shah
    unsigned int i;
25 e4d5639d Amit Shah
26 348e7b8d Hannes Reinecke
    iovec_off = 0;
27 348e7b8d Hannes Reinecke
    buf_off = 0;
28 348e7b8d Hannes Reinecke
    for (i = 0; i < iov_cnt && size; i++) {
29 348e7b8d Hannes Reinecke
        if (iov_off < (iovec_off + iov[i].iov_len)) {
30 348e7b8d Hannes Reinecke
            size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off, size);
31 e4d5639d Amit Shah
32 348e7b8d Hannes Reinecke
            memcpy(iov[i].iov_base + (iov_off - iovec_off), buf + buf_off, len);
33 e4d5639d Amit Shah
34 348e7b8d Hannes Reinecke
            buf_off += len;
35 348e7b8d Hannes Reinecke
            iov_off += len;
36 348e7b8d Hannes Reinecke
            size -= len;
37 348e7b8d Hannes Reinecke
        }
38 348e7b8d Hannes Reinecke
        iovec_off += iov[i].iov_len;
39 e4d5639d Amit Shah
    }
40 348e7b8d Hannes Reinecke
    return buf_off;
41 e4d5639d Amit Shah
}
42 fa6111f2 Amit Shah
43 348e7b8d Hannes Reinecke
size_t iov_to_buf(const struct iovec *iov, const unsigned int iov_cnt,
44 348e7b8d Hannes Reinecke
                  void *buf, size_t iov_off, size_t size)
45 fa6111f2 Amit Shah
{
46 fa6111f2 Amit Shah
    uint8_t *ptr;
47 348e7b8d Hannes Reinecke
    size_t iovec_off, buf_off;
48 fa6111f2 Amit Shah
    unsigned int i;
49 fa6111f2 Amit Shah
50 fa6111f2 Amit Shah
    ptr = buf;
51 348e7b8d Hannes Reinecke
    iovec_off = 0;
52 fa6111f2 Amit Shah
    buf_off = 0;
53 348e7b8d Hannes Reinecke
    for (i = 0; i < iov_cnt && size; i++) {
54 348e7b8d Hannes Reinecke
        if (iov_off < (iovec_off + iov[i].iov_len)) {
55 348e7b8d Hannes Reinecke
            size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off , size);
56 fa6111f2 Amit Shah
57 348e7b8d Hannes Reinecke
            memcpy(ptr + buf_off, iov[i].iov_base + (iov_off - iovec_off), len);
58 fa6111f2 Amit Shah
59 fa6111f2 Amit Shah
            buf_off += len;
60 348e7b8d Hannes Reinecke
            iov_off += len;
61 fa6111f2 Amit Shah
            size -= len;
62 fa6111f2 Amit Shah
        }
63 348e7b8d Hannes Reinecke
        iovec_off += iov[i].iov_len;
64 8d15028e Gerd Hoffmann
    }
65 8d15028e Gerd Hoffmann
    return buf_off;
66 8d15028e Gerd Hoffmann
}
67 8d15028e Gerd Hoffmann
68 8d15028e Gerd Hoffmann
size_t iov_clear(const struct iovec *iov, const unsigned int iov_cnt,
69 8d15028e Gerd Hoffmann
                 size_t iov_off, size_t size)
70 8d15028e Gerd Hoffmann
{
71 8d15028e Gerd Hoffmann
    size_t iovec_off, buf_off;
72 8d15028e Gerd Hoffmann
    unsigned int i;
73 8d15028e Gerd Hoffmann
74 8d15028e Gerd Hoffmann
    iovec_off = 0;
75 8d15028e Gerd Hoffmann
    buf_off = 0;
76 8d15028e Gerd Hoffmann
    for (i = 0; i < iov_cnt && size; i++) {
77 8d15028e Gerd Hoffmann
        if (iov_off < (iovec_off + iov[i].iov_len)) {
78 8d15028e Gerd Hoffmann
            size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off , size);
79 8d15028e Gerd Hoffmann
80 8d15028e Gerd Hoffmann
            memset(iov[i].iov_base + (iov_off - iovec_off), 0, len);
81 8d15028e Gerd Hoffmann
82 8d15028e Gerd Hoffmann
            buf_off += len;
83 8d15028e Gerd Hoffmann
            iov_off += len;
84 8d15028e Gerd Hoffmann
            size -= len;
85 8d15028e Gerd Hoffmann
        }
86 8d15028e Gerd Hoffmann
        iovec_off += iov[i].iov_len;
87 fa6111f2 Amit Shah
    }
88 fa6111f2 Amit Shah
    return buf_off;
89 fa6111f2 Amit Shah
}
90 fa6111f2 Amit Shah
91 348e7b8d Hannes Reinecke
size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt)
92 fa6111f2 Amit Shah
{
93 fa6111f2 Amit Shah
    size_t len;
94 fa6111f2 Amit Shah
    unsigned int i;
95 fa6111f2 Amit Shah
96 fa6111f2 Amit Shah
    len = 0;
97 348e7b8d Hannes Reinecke
    for (i = 0; i < iov_cnt; i++) {
98 fa6111f2 Amit Shah
        len += iov[i].iov_len;
99 fa6111f2 Amit Shah
    }
100 fa6111f2 Amit Shah
    return len;
101 fa6111f2 Amit Shah
}
102 3a1dca94 Gerd Hoffmann
103 3a1dca94 Gerd Hoffmann
void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt,
104 3a1dca94 Gerd Hoffmann
                 FILE *fp, const char *prefix, size_t limit)
105 3a1dca94 Gerd Hoffmann
{
106 3a1dca94 Gerd Hoffmann
    unsigned int i, v, b;
107 3a1dca94 Gerd Hoffmann
    uint8_t *c;
108 3a1dca94 Gerd Hoffmann
109 3a1dca94 Gerd Hoffmann
    c = iov[0].iov_base;
110 3a1dca94 Gerd Hoffmann
    for (i = 0, v = 0, b = 0; b < limit; i++, b++) {
111 3a1dca94 Gerd Hoffmann
        if (i == iov[v].iov_len) {
112 3a1dca94 Gerd Hoffmann
            i = 0; v++;
113 3a1dca94 Gerd Hoffmann
            if (v == iov_cnt) {
114 3a1dca94 Gerd Hoffmann
                break;
115 3a1dca94 Gerd Hoffmann
            }
116 3a1dca94 Gerd Hoffmann
            c = iov[v].iov_base;
117 3a1dca94 Gerd Hoffmann
        }
118 3a1dca94 Gerd Hoffmann
        if ((b % 16) == 0) {
119 3a1dca94 Gerd Hoffmann
            fprintf(fp, "%s: %04x:", prefix, b);
120 3a1dca94 Gerd Hoffmann
        }
121 3a1dca94 Gerd Hoffmann
        if ((b % 4) == 0) {
122 3a1dca94 Gerd Hoffmann
            fprintf(fp, " ");
123 3a1dca94 Gerd Hoffmann
        }
124 3a1dca94 Gerd Hoffmann
        fprintf(fp, " %02x", c[i]);
125 3a1dca94 Gerd Hoffmann
        if ((b % 16) == 15) {
126 3a1dca94 Gerd Hoffmann
            fprintf(fp, "\n");
127 3a1dca94 Gerd Hoffmann
        }
128 3a1dca94 Gerd Hoffmann
    }
129 3a1dca94 Gerd Hoffmann
    if ((b % 16) != 0) {
130 3a1dca94 Gerd Hoffmann
        fprintf(fp, "\n");
131 3a1dca94 Gerd Hoffmann
    }
132 3a1dca94 Gerd Hoffmann
}