2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 * Copyright (c) 2016 Jakub Klama <jceel@FreeBSD.org>.
5 * Copyright (c) 2018 Alexander Motin <mav@FreeBSD.org>
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer
13 * in this position and unchanged.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 #include <sys/cdefs.h>
32 __FBSDID("$FreeBSD$");
34 #include <sys/param.h>
35 #include <sys/types.h>
43 seek_iov(const struct iovec
*iov1
, int niov1
, struct iovec
*iov2
, int *niov2
,
50 for (i
= 0; i
< niov1
; i
++) {
51 size_t toseek
= MIN(left
, iov1
[i
].iov_len
);
54 if (toseek
== iov1
[i
].iov_len
)
63 for (j
= i
; j
< niov1
; j
++) {
64 iov2
[j
- i
].iov_base
= (char *)iov1
[j
].iov_base
+ remainder
;
65 iov2
[j
- i
].iov_len
= iov1
[j
].iov_len
- remainder
;
73 count_iov(const struct iovec
*iov
, int niov
)
78 for (i
= 0; i
< niov
; i
++)
79 total
+= iov
[i
].iov_len
;
85 truncate_iov(struct iovec
*iov
, int *niov
, size_t length
)
90 for (i
= 0; i
< *niov
; i
++) {
91 size_t toseek
= MIN(length
- done
, iov
[i
].iov_len
);
94 if (toseek
<= iov
[i
].iov_len
) {
95 iov
[i
].iov_len
= toseek
;
103 iov_to_buf(const struct iovec
*iov
, int niov
, void **buf
)
108 total
= count_iov(iov
, niov
);
109 *buf
= realloc(*buf
, total
);
113 for (i
= 0, ptr
= 0; i
< niov
; i
++) {
114 memcpy((uint8_t *)*buf
+ ptr
, iov
[i
].iov_base
, iov
[i
].iov_len
);
115 ptr
+= iov
[i
].iov_len
;
122 buf_to_iov(const void *buf
, size_t buflen
, const struct iovec
*iov
, int niov
,
136 diov
= malloc(sizeof(struct iovec
) * niov
);
137 seek_iov(iov
, niov
, diov
, &ndiov
, seek
);
142 for (i
= 0; i
< niov
&& off
< buflen
; i
++) {
143 len
= MIN(iov
[i
].iov_len
, buflen
- off
);
144 memcpy(iov
[i
].iov_base
, (const uint8_t *)buf
+ off
, len
);
151 return ((ssize_t
)off
);