// 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 "patchpanel/socket_daemon.h"

#include <memory>
#include <utility>

#include <base/functional/bind.h>
#include <brillo/daemons/dbus_daemon.h>
#include <brillo/dbus/async_event_sequencer.h>
#include <chromeos/dbus/patchpanel/dbus-constants.h>

#include "patchpanel/minijailed_process_runner.h"
#include "patchpanel/routing_service.h"
#include "patchpanel/socket_service_adaptor.h"

namespace patchpanel {

SocketDaemon::SocketDaemon(base::ScopedFD control_fd)
    : DBusServiceDaemon(kSocketServiceName),
      msg_dispatcher_(std::move(control_fd)) {
  msg_dispatcher_.RegisterFailureHandler(base::BindRepeating(
      &SocketDaemon::OnParentProcessExit, weak_factory_.GetWeakPtr()));
}

int SocketDaemon::OnInit() {
  EnterChildProcessJailWithNetAdmin();
  return DBusServiceDaemon::OnInit();
}

void SocketDaemon::OnShutdown(int* exit_code) {
  adaptor_.reset();

  if (bus_) {
    bus_->ShutdownAndBlock();
  }
  DBusServiceDaemon::OnShutdown(exit_code);
}

void SocketDaemon::RegisterDBusObjectsAsync(
    brillo::dbus_utils::AsyncEventSequencer* sequencer) {
  adaptor_ = std::make_unique<SocketServiceAdaptor>(
      bus_, std::make_unique<RoutingService>());
  adaptor_->RegisterAsync(
      sequencer->GetHandler("RegisterAsync() failed", true));
}

void SocketDaemon::OnParentProcessExit() {
  LOG(ERROR) << "Quitting because the parent process died";
  Quit();
}

}  // namespace patchpanel
