Statistics
| Branch: | Revision:

root / iov.c @ 4581cbcd

History | View | Annotate | Download (1.6 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 e4d5639d Amit Shah
size_t iov_from_buf(struct iovec *iov, unsigned int iovcnt,
18 e4d5639d Amit Shah
                    const void *buf, size_t size)
19 e4d5639d Amit Shah
{
20 e4d5639d Amit Shah
    size_t offset;
21 e4d5639d Amit Shah
    unsigned int i;
22 e4d5639d Amit Shah
23 e4d5639d Amit Shah
    offset = 0;
24 e4d5639d Amit Shah
    for (i = 0; offset < size && i < iovcnt; i++) {
25 e4d5639d Amit Shah
        size_t len;
26 e4d5639d Amit Shah
27 e4d5639d Amit Shah
        len = MIN(iov[i].iov_len, size - offset);
28 e4d5639d Amit Shah
29 e4d5639d Amit Shah
        memcpy(iov[i].iov_base, buf + offset, len);
30 e4d5639d Amit Shah
        offset += len;
31 e4d5639d Amit Shah
    }
32 e4d5639d Amit Shah
    return offset;
33 e4d5639d Amit Shah
}
34 fa6111f2 Amit Shah
35 fa6111f2 Amit Shah
size_t iov_to_buf(const struct iovec *iov, const unsigned int iovcnt,
36 fa6111f2 Amit Shah
                  void *buf, size_t offset, size_t size)
37 fa6111f2 Amit Shah
{
38 fa6111f2 Amit Shah
    uint8_t *ptr;
39 fa6111f2 Amit Shah
    size_t iov_off, buf_off;
40 fa6111f2 Amit Shah
    unsigned int i;
41 fa6111f2 Amit Shah
42 fa6111f2 Amit Shah
    ptr = buf;
43 fa6111f2 Amit Shah
    iov_off = 0;
44 fa6111f2 Amit Shah
    buf_off = 0;
45 fa6111f2 Amit Shah
    for (i = 0; i < iovcnt && size; i++) {
46 fa6111f2 Amit Shah
        if (offset < (iov_off + iov[i].iov_len)) {
47 fa6111f2 Amit Shah
            size_t len = MIN((iov_off + iov[i].iov_len) - offset , size);
48 fa6111f2 Amit Shah
49 fa6111f2 Amit Shah
            memcpy(ptr + buf_off, iov[i].iov_base + (offset - iov_off), len);
50 fa6111f2 Amit Shah
51 fa6111f2 Amit Shah
            buf_off += len;
52 fa6111f2 Amit Shah
            offset += len;
53 fa6111f2 Amit Shah
            size -= len;
54 fa6111f2 Amit Shah
        }
55 fa6111f2 Amit Shah
        iov_off += iov[i].iov_len;
56 fa6111f2 Amit Shah
    }
57 fa6111f2 Amit Shah
    return buf_off;
58 fa6111f2 Amit Shah
}
59 fa6111f2 Amit Shah
60 fa6111f2 Amit Shah
size_t iov_size(const struct iovec *iov, const unsigned int iovcnt)
61 fa6111f2 Amit Shah
{
62 fa6111f2 Amit Shah
    size_t len;
63 fa6111f2 Amit Shah
    unsigned int i;
64 fa6111f2 Amit Shah
65 fa6111f2 Amit Shah
    len = 0;
66 fa6111f2 Amit Shah
    for (i = 0; i < iovcnt; i++) {
67 fa6111f2 Amit Shah
        len += iov[i].iov_len;
68 fa6111f2 Amit Shah
    }
69 fa6111f2 Amit Shah
    return len;
70 fa6111f2 Amit Shah
}