blob: 343c68d41cf70bd651d22950529da532da72166e [file] [log] [blame] [edit]
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "farfetchd/daemon.h"
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sysexits.h>
#include <unistd.h>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/files/scoped_file.h>
#include <base/time/time.h>
#include <chromeos/dbus/service_constants.h>
#include <dbus/bus.h>
#include "farfetchd/prefetch_helper.h"
#include "farfetchd/trace_manager.h"
#include "libstorage/platform/platform.h"
namespace farfetchd {
namespace {
constexpr char kFarfetchdServiceName[] = "org.chromium.Farfetchd";
constexpr char kFarfetchdServicePath[] = "/org/chromium/Farfetchd";
} // namespace
DBusAdaptor::DBusAdaptor(scoped_refptr<dbus::Bus> bus)
: org::chromium::FarfetchdAdaptor(this),
helper_(std::make_unique<PrefetchHelper>(&platform_)),
trace_manager_(std::make_unique<TraceManager>()),
dbus_object_(
nullptr, bus, dbus::ObjectPath(::farfetchd::kFarfetchdServicePath)) {}
void DBusAdaptor::RegisterAsync(
brillo::dbus_utils::AsyncEventSequencer::CompletionAction cb) {
RegisterWithDBusObject(&dbus_object_);
dbus_object_.RegisterAsync(std::move(cb));
}
// Preload file by reading it into memory
bool DBusAdaptor::PreloadFile(const std::string& p) {
return helper_->PreloadFile(base::FilePath(p));
}
// Preload file by reading it into memory asynchronously.
// Scheduling is handled by the kernel so the actual caching
// may be delayed.
bool DBusAdaptor::PreloadFileAsync(const std::string& p) {
return helper_->PreloadFileAsync(base::FilePath(p));
}
// Preload file by mmapping it into memory
bool DBusAdaptor::PreloadFileMmap(const std::string& p) {
return helper_->PreloadFileMmap(base::FilePath(p));
}
// Tracing method implementations
std::string DBusAdaptor::StartTrace(
const std::string& app_name,
const std::vector<std::string>& process_names,
const std::vector<std::string>& path_allowlist,
const std::vector<std::string>& path_denylist) {
return trace_manager_->StartTrace(app_name, process_names, path_allowlist,
path_denylist);
}
bool DBusAdaptor::StopTrace(const std::string& trace_id) {
return trace_manager_->StopTrace(trace_id);
}
bool DBusAdaptor::CancelTrace(const std::string& trace_id) {
return trace_manager_->CancelTrace(trace_id);
}
std::string DBusAdaptor::GetTraceStatus(const std::string& trace_id) {
return trace_manager_->GetTraceStatus(trace_id);
}
std::string DBusAdaptor::GetTracePath(const std::string& trace_id) {
return trace_manager_->GetTracePath(trace_id);
}
Daemon::Daemon() : DBusServiceDaemon(kFarfetchdServiceName) {}
void Daemon::RegisterDBusObjectsAsync(
brillo::dbus_utils::AsyncEventSequencer* sequencer) {
adaptor_ = std::make_unique<DBusAdaptor>(bus_);
adaptor_->RegisterAsync(
sequencer->GetHandler("RegisterAsync() failed", true));
}
} // namespace farfetchd