iov.c (4c87aefe) iov.c (154972af)
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2016 Jakub Klama <jceel@FreeBSD.org>.
5 * Copyright (c) 2018 Alexander Motin <mav@FreeBSD.org>
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 105 unchanged lines hidden (view full) ---

114 memcpy(*buf + ptr, iov[i].iov_base, iov[i].iov_len);
115 ptr += iov[i].iov_len;
116 }
117
118 return (total);
119}
120
121ssize_t
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2016 Jakub Klama <jceel@FreeBSD.org>.
5 * Copyright (c) 2018 Alexander Motin <mav@FreeBSD.org>
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 105 unchanged lines hidden (view full) ---

114 memcpy(*buf + ptr, iov[i].iov_base, iov[i].iov_len);
115 ptr += iov[i].iov_len;
116 }
117
118 return (total);
119}
120
121ssize_t
122buf_to_iov(const void *buf, size_t buflen, struct iovec *iov, int niov,
122buf_to_iov(const void *buf, size_t buflen, const struct iovec *iov, int niov,
123 size_t seek)
124{
125 struct iovec *diov;
123 size_t seek)
124{
125 struct iovec *diov;
126 int ndiov, i;
127 size_t off = 0, len;
126 size_t off = 0, len;
127 int i;
128
128
129#ifndef __FreeBSD__
130 diov = NULL;
131#endif
132
129 if (seek > 0) {
133 if (seek > 0) {
134 int ndiov;
135
130 diov = malloc(sizeof(struct iovec) * niov);
131 seek_iov(iov, niov, diov, &ndiov, seek);
136 diov = malloc(sizeof(struct iovec) * niov);
137 seek_iov(iov, niov, diov, &ndiov, seek);
132 } else {
133 diov = iov;
134 ndiov = niov;
138 iov = diov;
139 niov = ndiov;
135 }
136
140 }
141
137 for (i = 0; i < ndiov && off < buflen; i++) {
138 len = MIN(diov[i].iov_len, buflen - off);
139 memcpy(diov[i].iov_base, buf + off, len);
142 for (i = 0; i < niov && off < buflen; i++) {
143 len = MIN(iov[i].iov_len, buflen - off);
144 memcpy(iov[i].iov_base, buf + off, len);
140 off += len;
141 }
142
143 if (seek > 0)
144 free(diov);
145
146 return ((ssize_t)off);
147}
148
145 off += len;
146 }
147
148 if (seek > 0)
149 free(diov);
150
151 return ((ssize_t)off);
152}
153