blob: b611a397a7c7e2bda23c6dfe0445961a1738ba28 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <string.h>
#include <zircon/types.h>
#include "private.h"
size_t fdio_iovec_get_capacity(const zx_iovec_t* vector, size_t vector_count) {
size_t total_capacity = 0u;
for (size_t i = 0; i < vector_count; ++i) {
total_capacity += vector[i].capacity;
}
return total_capacity;
}
void fdio_iovec_copy_to(const uint8_t* buffer, size_t buffer_size, const zx_iovec_t* vector,
size_t vector_count, size_t* out_actual) {
size_t remaining = buffer_size;
for (size_t i = 0; i < vector_count && remaining > 0; ++i) {
size_t chunk_size = remaining;
if (chunk_size > vector[i].capacity) {
chunk_size = vector[i].capacity;
}
memcpy(vector[i].buffer, buffer, chunk_size);
buffer += chunk_size;
remaining -= chunk_size;
}
*out_actual = buffer_size - remaining;
}
void fdio_iovec_copy_from(const zx_iovec_t* vector, size_t vector_count, uint8_t* buffer,
size_t buffer_size, size_t* out_actual) {
size_t remaining = buffer_size;
for (size_t i = 0; i < vector_count && remaining > 0; ++i) {
size_t chunk_size = remaining;
if (chunk_size > vector[i].capacity) {
chunk_size = vector[i].capacity;
}
memcpy(buffer, vector[i].buffer, chunk_size);
buffer += chunk_size;
remaining -= chunk_size;
}
*out_actual = buffer_size - remaining;
}