blob: de7d82572f2666a91c04bdf1ac979d34a8ee3261 [file] [log] [blame]
// Copyright 2016 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 "src/lib/fsl/socket/strings.h"
#include <lib/syslog/cpp/macros.h>
#include <utility>
#include "src/lib/fsl/socket/blocking_drain.h"
namespace fsl {
bool BlockingCopyToString(zx::socket source, std::string* result) {
FX_CHECK(result);
result->clear();
return BlockingDrainFrom(std::move(source), [result](const void* buffer, uint32_t num_bytes) {
result->append(static_cast<const char*>(buffer), num_bytes);
return num_bytes;
});
}
bool BlockingCopyFromString(std::string_view source, const zx::socket& destination) {
const char* ptr = source.data();
size_t to_write = source.size();
for (;;) {
size_t written;
zx_status_t result = destination.write(0, ptr, to_write, &written);
if (result == ZX_OK) {
if (written == to_write)
return true;
to_write -= written;
ptr += written;
} else if (result == ZX_ERR_SHOULD_WAIT) {
result = destination.wait_one(ZX_SOCKET_WRITABLE | ZX_SOCKET_PEER_CLOSED,
zx::time::infinite(), nullptr);
if (result != ZX_OK) {
// If the socket was closed, then treat as EOF.
return result == ZX_ERR_PEER_CLOSED;
}
} else {
// If the socket was closed, then treat as EOF.
return result == ZX_ERR_PEER_CLOSED;
}
}
}
zx::socket WriteStringToSocket(std::string_view source) {
// TODO(qsr): Check that source.size() <= socket max capacity when the
// information is retrievable. Until then use the know socket capacity.
FX_DCHECK(source.size() < 256 * 1024);
zx::socket socket1, socket2;
zx::socket::create(0u, &socket1, &socket2);
BlockingCopyFromString(source, std::move(socket1));
return socket2;
}
} // namespace fsl