]> Git Repo - qemu.git/blob - iov.c
Makefile: Minor cscope fixups
[qemu.git] / iov.c
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 <[email protected]>
9  *  Amit Shah <[email protected]>
10  *
11  * This work is licensed under the terms of the GNU GPL, version 2.  See
12  * the COPYING file in the top-level directory.
13  */
14
15 #include "iov.h"
16
17 size_t iov_from_buf(struct iovec *iov, unsigned int iov_cnt,
18                     const void *buf, size_t iov_off, size_t size)
19 {
20     size_t iovec_off, buf_off;
21     unsigned int i;
22
23     iovec_off = 0;
24     buf_off = 0;
25     for (i = 0; i < iov_cnt && size; i++) {
26         if (iov_off < (iovec_off + iov[i].iov_len)) {
27             size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off, size);
28
29             memcpy(iov[i].iov_base + (iov_off - iovec_off), buf + buf_off, len);
30
31             buf_off += len;
32             iov_off += len;
33             size -= len;
34         }
35         iovec_off += iov[i].iov_len;
36     }
37     return buf_off;
38 }
39
40 size_t iov_to_buf(const struct iovec *iov, const unsigned int iov_cnt,
41                   void *buf, size_t iov_off, size_t size)
42 {
43     uint8_t *ptr;
44     size_t iovec_off, buf_off;
45     unsigned int i;
46
47     ptr = buf;
48     iovec_off = 0;
49     buf_off = 0;
50     for (i = 0; i < iov_cnt && size; i++) {
51         if (iov_off < (iovec_off + iov[i].iov_len)) {
52             size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off , size);
53
54             memcpy(ptr + buf_off, iov[i].iov_base + (iov_off - iovec_off), len);
55
56             buf_off += len;
57             iov_off += len;
58             size -= len;
59         }
60         iovec_off += iov[i].iov_len;
61     }
62     return buf_off;
63 }
64
65 size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt)
66 {
67     size_t len;
68     unsigned int i;
69
70     len = 0;
71     for (i = 0; i < iov_cnt; i++) {
72         len += iov[i].iov_len;
73     }
74     return len;
75 }
This page took 0.028256 seconds and 4 git commands to generate.