Statistics
| Branch: | Revision:

root / iov.c @ 753d11f2

History | View | Annotate | Download (3.2 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 e4d5639d Amit Shah
 */
14 e4d5639d Amit Shah
15 e4d5639d Amit Shah
#include "iov.h"
16 e4d5639d Amit Shah
17 348e7b8d Hannes Reinecke
size_t iov_from_buf(struct iovec *iov, unsigned int iov_cnt,
18 348e7b8d Hannes Reinecke
                    const void *buf, size_t iov_off, size_t size)
19 e4d5639d Amit Shah
{
20 348e7b8d Hannes Reinecke
    size_t iovec_off, buf_off;
21 e4d5639d Amit Shah
    unsigned int i;
22 e4d5639d Amit Shah
23 348e7b8d Hannes Reinecke
    iovec_off = 0;
24 348e7b8d Hannes Reinecke
    buf_off = 0;
25 348e7b8d Hannes Reinecke
    for (i = 0; i < iov_cnt && size; i++) {
26 348e7b8d Hannes Reinecke
        if (iov_off < (iovec_off + iov[i].iov_len)) {
27 348e7b8d Hannes Reinecke
            size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off, size);
28 e4d5639d Amit Shah
29 348e7b8d Hannes Reinecke
            memcpy(iov[i].iov_base + (iov_off - iovec_off), buf + buf_off, len);
30 e4d5639d Amit Shah
31 348e7b8d Hannes Reinecke
            buf_off += len;
32 348e7b8d Hannes Reinecke
            iov_off += len;
33 348e7b8d Hannes Reinecke
            size -= len;
34 348e7b8d Hannes Reinecke
        }
35 348e7b8d Hannes Reinecke
        iovec_off += iov[i].iov_len;
36 e4d5639d Amit Shah
    }
37 348e7b8d Hannes Reinecke
    return buf_off;
38 e4d5639d Amit Shah
}
39 fa6111f2 Amit Shah
40 348e7b8d Hannes Reinecke
size_t iov_to_buf(const struct iovec *iov, const unsigned int iov_cnt,
41 348e7b8d Hannes Reinecke
                  void *buf, size_t iov_off, size_t size)
42 fa6111f2 Amit Shah
{
43 fa6111f2 Amit Shah
    uint8_t *ptr;
44 348e7b8d Hannes Reinecke
    size_t iovec_off, buf_off;
45 fa6111f2 Amit Shah
    unsigned int i;
46 fa6111f2 Amit Shah
47 fa6111f2 Amit Shah
    ptr = buf;
48 348e7b8d Hannes Reinecke
    iovec_off = 0;
49 fa6111f2 Amit Shah
    buf_off = 0;
50 348e7b8d Hannes Reinecke
    for (i = 0; i < iov_cnt && size; i++) {
51 348e7b8d Hannes Reinecke
        if (iov_off < (iovec_off + iov[i].iov_len)) {
52 348e7b8d Hannes Reinecke
            size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off , size);
53 fa6111f2 Amit Shah
54 348e7b8d Hannes Reinecke
            memcpy(ptr + buf_off, iov[i].iov_base + (iov_off - iovec_off), len);
55 fa6111f2 Amit Shah
56 fa6111f2 Amit Shah
            buf_off += len;
57 348e7b8d Hannes Reinecke
            iov_off += len;
58 fa6111f2 Amit Shah
            size -= len;
59 fa6111f2 Amit Shah
        }
60 348e7b8d Hannes Reinecke
        iovec_off += iov[i].iov_len;
61 8d15028e Gerd Hoffmann
    }
62 8d15028e Gerd Hoffmann
    return buf_off;
63 8d15028e Gerd Hoffmann
}
64 8d15028e Gerd Hoffmann
65 8d15028e Gerd Hoffmann
size_t iov_clear(const struct iovec *iov, const unsigned int iov_cnt,
66 8d15028e Gerd Hoffmann
                 size_t iov_off, size_t size)
67 8d15028e Gerd Hoffmann
{
68 8d15028e Gerd Hoffmann
    size_t iovec_off, buf_off;
69 8d15028e Gerd Hoffmann
    unsigned int i;
70 8d15028e Gerd Hoffmann
71 8d15028e Gerd Hoffmann
    iovec_off = 0;
72 8d15028e Gerd Hoffmann
    buf_off = 0;
73 8d15028e Gerd Hoffmann
    for (i = 0; i < iov_cnt && size; i++) {
74 8d15028e Gerd Hoffmann
        if (iov_off < (iovec_off + iov[i].iov_len)) {
75 8d15028e Gerd Hoffmann
            size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off , size);
76 8d15028e Gerd Hoffmann
77 8d15028e Gerd Hoffmann
            memset(iov[i].iov_base + (iov_off - iovec_off), 0, len);
78 8d15028e Gerd Hoffmann
79 8d15028e Gerd Hoffmann
            buf_off += len;
80 8d15028e Gerd Hoffmann
            iov_off += len;
81 8d15028e Gerd Hoffmann
            size -= len;
82 8d15028e Gerd Hoffmann
        }
83 8d15028e Gerd Hoffmann
        iovec_off += iov[i].iov_len;
84 fa6111f2 Amit Shah
    }
85 fa6111f2 Amit Shah
    return buf_off;
86 fa6111f2 Amit Shah
}
87 fa6111f2 Amit Shah
88 348e7b8d Hannes Reinecke
size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt)
89 fa6111f2 Amit Shah
{
90 fa6111f2 Amit Shah
    size_t len;
91 fa6111f2 Amit Shah
    unsigned int i;
92 fa6111f2 Amit Shah
93 fa6111f2 Amit Shah
    len = 0;
94 348e7b8d Hannes Reinecke
    for (i = 0; i < iov_cnt; i++) {
95 fa6111f2 Amit Shah
        len += iov[i].iov_len;
96 fa6111f2 Amit Shah
    }
97 fa6111f2 Amit Shah
    return len;
98 fa6111f2 Amit Shah
}
99 3a1dca94 Gerd Hoffmann
100 3a1dca94 Gerd Hoffmann
void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt,
101 3a1dca94 Gerd Hoffmann
                 FILE *fp, const char *prefix, size_t limit)
102 3a1dca94 Gerd Hoffmann
{
103 3a1dca94 Gerd Hoffmann
    unsigned int i, v, b;
104 3a1dca94 Gerd Hoffmann
    uint8_t *c;
105 3a1dca94 Gerd Hoffmann
106 3a1dca94 Gerd Hoffmann
    c = iov[0].iov_base;
107 3a1dca94 Gerd Hoffmann
    for (i = 0, v = 0, b = 0; b < limit; i++, b++) {
108 3a1dca94 Gerd Hoffmann
        if (i == iov[v].iov_len) {
109 3a1dca94 Gerd Hoffmann
            i = 0; v++;
110 3a1dca94 Gerd Hoffmann
            if (v == iov_cnt) {
111 3a1dca94 Gerd Hoffmann
                break;
112 3a1dca94 Gerd Hoffmann
            }
113 3a1dca94 Gerd Hoffmann
            c = iov[v].iov_base;
114 3a1dca94 Gerd Hoffmann
        }
115 3a1dca94 Gerd Hoffmann
        if ((b % 16) == 0) {
116 3a1dca94 Gerd Hoffmann
            fprintf(fp, "%s: %04x:", prefix, b);
117 3a1dca94 Gerd Hoffmann
        }
118 3a1dca94 Gerd Hoffmann
        if ((b % 4) == 0) {
119 3a1dca94 Gerd Hoffmann
            fprintf(fp, " ");
120 3a1dca94 Gerd Hoffmann
        }
121 3a1dca94 Gerd Hoffmann
        fprintf(fp, " %02x", c[i]);
122 3a1dca94 Gerd Hoffmann
        if ((b % 16) == 15) {
123 3a1dca94 Gerd Hoffmann
            fprintf(fp, "\n");
124 3a1dca94 Gerd Hoffmann
        }
125 3a1dca94 Gerd Hoffmann
    }
126 3a1dca94 Gerd Hoffmann
    if ((b % 16) != 0) {
127 3a1dca94 Gerd Hoffmann
        fprintf(fp, "\n");
128 3a1dca94 Gerd Hoffmann
    }
129 3a1dca94 Gerd Hoffmann
}