// Copyright 2018 The Chromium OS 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 "crosdns/crosdns_daemon.h"

#include <sysexits.h>

#include <base/logging.h>
#include <chromeos/dbus/service_constants.h>

#include "crosdns/hosts_modifier.h"

namespace {

// Domain for D-Bus error messages.
constexpr char kErrorDomain[] = "crosdns";
// Type for D-Bus error messages.
constexpr char kInternalError[] = "internal_error";
// Path to our modifiable /etc/hosts file, the parent dir is bind mounted
// on top of the dir where the real hosts file is at.
constexpr char kEtcHostsPath[] = "/run/crosdns/hosts";

}  // namespace

namespace crosdns {

CrosDnsDaemon::CrosDnsDaemon()
    : brillo::DBusServiceDaemon(kCrosDnsServiceName), dbus_adaptor_(this) {}

CrosDnsDaemon::~CrosDnsDaemon() = default;

int CrosDnsDaemon::OnInit() {
  int exit_code = DBusServiceDaemon::OnInit();
  if (exit_code == EX_OK) {
    if (!hosts_modifier_.Init(base::FilePath(kEtcHostsPath))) {
      return EX_IOERR;
    }
  }

  return exit_code;
}

void CrosDnsDaemon::RegisterDBusObjectsAsync(
    brillo::dbus_utils::AsyncEventSequencer* sequencer) {
  dbus_object_ = std::make_unique<brillo::dbus_utils::DBusObject>(
      nullptr, bus_, org::chromium::CrosDnsAdaptor::GetObjectPath());
  dbus_adaptor_.RegisterWithDBusObject(dbus_object_.get());
  dbus_object_->RegisterAsync(
      sequencer->GetHandler("CrosDns.RegisterAsync() failed.", true));
}

bool CrosDnsDaemon::SetHostnameIpMapping(brillo::ErrorPtr* err,
                                         const std::string& hostname,
                                         const std::string& ipv4,
                                         const std::string& ipv6) {
  std::string err_str;
  if (!hosts_modifier_.SetHostnameIpMapping(hostname, ipv4, ipv6, &err_str)) {
    *err =
        brillo::Error::Create(FROM_HERE, kErrorDomain, kInternalError, err_str);
    return false;
  }

  return true;
}

bool CrosDnsDaemon::RemoveHostnameIpMapping(brillo::ErrorPtr* err,
                                            const std::string& hostname) {
  std::string err_str;
  if (!hosts_modifier_.RemoveHostnameIpMapping(hostname, &err_str)) {
    *err =
        brillo::Error::Create(FROM_HERE, kErrorDomain, kInternalError, err_str);
    return false;
  }

  return true;
}

}  // namespace crosdns
