iov.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. #include "iov.h"
  15. size_t iov_from_buf(struct iovec *iov, unsigned int iov_cnt,
  16. const void *buf, size_t iov_off, size_t size)
  17. {
  18. size_t iovec_off, buf_off;
  19. unsigned int i;
  20. iovec_off = 0;
  21. buf_off = 0;
  22. for (i = 0; i < iov_cnt && size; i++) {
  23. if (iov_off < (iovec_off + iov[i].iov_len)) {
  24. size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off, size);
  25. memcpy(iov[i].iov_base + (iov_off - iovec_off), buf + buf_off, len);
  26. buf_off += len;
  27. iov_off += len;
  28. size -= len;
  29. }
  30. iovec_off += iov[i].iov_len;
  31. }
  32. return buf_off;
  33. }
  34. size_t iov_to_buf(const struct iovec *iov, const unsigned int iov_cnt,
  35. void *buf, size_t iov_off, size_t size)
  36. {
  37. uint8_t *ptr;
  38. size_t iovec_off, buf_off;
  39. unsigned int i;
  40. ptr = buf;
  41. iovec_off = 0;
  42. buf_off = 0;
  43. for (i = 0; i < iov_cnt && size; i++) {
  44. if (iov_off < (iovec_off + iov[i].iov_len)) {
  45. size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off , size);
  46. memcpy(ptr + buf_off, iov[i].iov_base + (iov_off - iovec_off), len);
  47. buf_off += len;
  48. iov_off += len;
  49. size -= len;
  50. }
  51. iovec_off += iov[i].iov_len;
  52. }
  53. return buf_off;
  54. }
  55. size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt)
  56. {
  57. size_t len;
  58. unsigned int i;
  59. len = 0;
  60. for (i = 0; i < iov_cnt; i++) {
  61. len += iov[i].iov_len;
  62. }
  63. return len;
  64. }