blob: 6b04028db1dbb0ed2f551f4863a57cd8e212b5fb [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 <fidl/fuchsia.boot/cpp/wire.h>
#include <lib/component/incoming/cpp/protocol.h>
#include <lib/fdio/fdio.h>
#include <lib/zx/debuglog.h>
namespace StdoutToDebuglog {
zx_status_t Init() {
zx::result client_end = component::Connect<fuchsia_boot::WriteOnlyLog>();
if (client_end.is_error()) {
return client_end.status_value();
}
const fidl::WireSyncClient write_only_log(std::move(client_end.value()));
const fidl::WireResult result = write_only_log->Get();
if (!result.ok()) {
return result.status();
}
const auto& response = result.value();
const zx::debuglog& log = response.log;
for (int fd = 1; fd <= 2; ++fd) {
zx::debuglog dup;
if (zx_status_t status = log.duplicate(ZX_RIGHT_SAME_RIGHTS, &dup); status != ZX_OK) {
return status;
}
fdio_t* logger = nullptr;
if (zx_status_t status = fdio_create(dup.release(), &logger); status != ZX_OK) {
return status;
}
const int out_fd = fdio_bind_to_fd(logger, fd, 0);
if (out_fd != fd) {
return ZX_ERR_BAD_STATE;
}
}
return ZX_OK;
}
} // namespace StdoutToDebuglog