blob: 6f0acecbb1926e8703761d81866a047de6c6ad6b [file] [log] [blame]
// Copyright 2019 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 <fuchsia/feedback/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/fidl/cpp/interface_request.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/syslog/cpp/logger.h>
#include <lib/zx/channel.h>
#include <stdlib.h>
#include <zircon/errors.h>
#include <zircon/process.h>
#include <zircon/processargs.h>
#include <zircon/status.h>
#include <memory>
#include "src/developer/feedback_agent/data_provider.h"
int main(int argc, const char** argv) {
syslog::InitLogger({"feedback"});
// This process is spawned by the feedback_agent process, which forwards it
// the incoming request through PA_USER0.
fidl::InterfaceRequest<fuchsia::feedback::DataProvider> request(
zx::channel(zx_take_startup_handle(PA_HND(PA_USER0, 0))));
if (!request.is_valid()) {
FX_LOGS(ERROR) << "Invalid incoming fuchsia.feedback.DataProvider request";
return EXIT_FAILURE;
}
async::Loop loop(&kAsyncLoopConfigAttachToThread);
auto context = sys::ComponentContext::Create();
std::unique_ptr<fuchsia::feedback::DataProviderImpl> data_provider =
fuchsia::feedback::DataProviderImpl::TryCreate(loop.dispatcher(),
context->svc());
if (!data_provider) {
return EXIT_FAILURE;
}
fidl::Binding<fuchsia::feedback::DataProvider> binding(data_provider.get());
// TODO(DX-1497): in addition to exiting the process when the connection is
// closed, we should have an internal timeout since the last call and exit the
// process then in case clients don't close the connection themselves.
binding.set_error_handler([&loop](zx_status_t status) {
loop.Shutdown();
// We exit successfully when the client closes the connection.
if (status == ZX_ERR_PEER_CLOSED) {
exit(0);
} else {
FX_PLOGS(ERROR, status) << "Received channel error";
exit(1);
}
});
binding.Bind(std::move(request));
loop.Run();
return EXIT_SUCCESS;
}