| // 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 "src/developer/forensics/utils/component/component.h" | |
| #include <lib/async-loop/default.h> | |
| #include <lib/syslog/cpp/macros.h> | |
| #include <string> | |
| #include "src/lib/files/directory.h" | |
| #include "src/lib/files/file.h" | |
| namespace forensics { | |
| namespace component { | |
| constexpr char kComponentDirectory[] = "/tmp/component"; | |
| constexpr char kInstanceIndexPath[] = "/tmp/component/instance_index.txt"; | |
| Component::Component() | |
| : loop_(&kAsyncLoopConfigAttachToCurrentThread), | |
| context_(sys::ComponentContext::CreateAndServeOutgoingDirectory()), | |
| inspector_(context_.get()), | |
| instance_index_(1u /*default if no file present*/) { | |
| if (!files::IsDirectory(kComponentDirectory) && !files::CreateDirectory(kComponentDirectory)) { | |
| FX_LOGS(INFO) << "Unable to create " << kComponentDirectory | |
| << ", assuming first instance of component"; | |
| return; | |
| } | |
| std::string starts_str; | |
| if (files::ReadFileToString(kInstanceIndexPath, &starts_str)) { | |
| instance_index_ = std::stoull(starts_str) + 1; | |
| } | |
| files::WriteFile(kInstanceIndexPath, std::to_string(instance_index_)); | |
| } | |
| async_dispatcher_t* Component::Dispatcher() { return loop_.dispatcher(); } | |
| std::shared_ptr<sys::ServiceDirectory> Component::Services() { return context_->svc(); } | |
| inspect::Node* Component::InspectRoot() { return &(inspector_.root()); } | |
| bool Component::IsFirstInstance() const { return instance_index_ == 1; } | |
| zx_status_t Component::RunLoop() { return loop_.Run(); } | |
| } // namespace component | |
| } // namespace forensics |