File:  [Qemu by Fabrice Bellard] / qemu / iov.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 18:56:38 2018 UTC (3 years, 1 month ago) by root
Branches: qemu, MAIN
CVS tags: qemu1000, qemu0151, HEAD
qemu 0.15.1

    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>
   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: }

unix.superglobalmegacorp.com