// 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.

#ifndef SRC_DEVELOPER_SSHD_HOST_SERVICE_H_
#define SRC_DEVELOPER_SSHD_HOST_SERVICE_H_

#include <lib/sys/cpp/service_directory.h>
#include <lib/zx/job.h>
#include <lib/zx/process.h>

#include <string>
#include <vector>

#include "constants.h"
#include "src/lib/fsl/tasks/fd_waiter.h"

namespace sshd_host {

constexpr zx_rights_t kChildJobRights =
    ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_DESTROY | ZX_RIGHT_MANAGE_JOB;

constexpr char kSshDirectory[] = "/data/ssh";
constexpr char kAuthorizedKeysPath[] = "/data/ssh/authorized_keys";

zx_status_t provision_authorized_keys_from_bootloader_file(
    std::shared_ptr<sys::ServiceDirectory> service_directory);

zx_status_t make_child_job(const zx::job& parent, std::string name, zx::job* job);

// Service relies on the default async dispatcher and is not thread safe.
class Service {
 public:
  explicit Service(uint16_t port);
  ~Service();

 private:
  void Wait();
  void Launch(int conn, const std::string& peer_name);
  void ProcessTerminated(zx::process process, zx::job job);

  uint16_t port_;
  int sock_;
  fsl::FDWaiter waiter_;
  zx::job job_;

  std::vector<std::unique_ptr<async::Wait>> process_waiters_;
};

}  // namespace sshd_host

#endif  // SRC_DEVELOPER_SSHD_HOST_SERVICE_H_
