2 * Unix SMB/CIFS implementation.
3 * Samba system utilities
4 * Copyright (C) Volker Lendecke 2014
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include "system/filesys.h"
25 ssize_t
iov_buflen(const struct iovec
*iov
, int iovcnt
)
27 return iov_buf(iov
, iovcnt
, NULL
, 0);
30 ssize_t
iov_buf(const struct iovec
*iov
, int iovcnt
,
31 uint8_t *buf
, size_t buflen
)
37 for (i
=0; i
<iovcnt
; i
++) {
38 size_t thislen
= iov
[i
].iov_len
;
41 tmp
= needed
+ thislen
;
49 if (needed
<= buflen
) {
50 memcpy(p
, iov
[i
].iov_base
, thislen
);
58 bool iov_advance(struct iovec
**iov
, int *iovcnt
, size_t n
)
60 struct iovec
*v
= *iov
;
68 v
->iov_base
= (char *)v
->iov_base
+ n
;
78 * Skip 0-length iovec's
80 * There might be empty buffers at the end of iov. Next time we do a
81 * readv/writev based on this iov would give 0 transferred bytes, also
82 * known as EPIPE. So we need to be careful discarding them.
85 while ((cnt
> 0) && (v
->iov_len
== 0)) {
95 uint8_t *iov_concat(TALLOC_CTX
*mem_ctx
, const struct iovec
*iov
, int count
)
100 buflen
= iov_buflen(iov
, count
);
105 buf
= talloc_array(mem_ctx
, uint8_t, buflen
);
110 iov_buf(iov
, count
, buf
, buflen
);