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

#ifndef VM_TOOLS_VSH_VSH_CLIENT_H_
#define VM_TOOLS_VSH_VSH_CLIENT_H_

#include <sys/ioctl.h>  // For struct winsize.

#include <memory>
#include <string>

#include <base/files/file_descriptor_watcher_posix.h>
#include <base/files/scoped_file.h>
#include <base/macros.h>
#include <brillo/asynchronous_signal_handler.h>
#include <brillo/message_loops/message_loop.h>
#include <google/protobuf/message_lite.h>
#include <vm_protos/proto_bindings/vsh.pb.h>

#include "vm_tools/vsh/scoped_termios.h"

namespace vm_tools {
namespace vsh {

// VshClient encapsulates a vsh client session.
class VshClient {
 public:
  static std::unique_ptr<VshClient> Create(base::ScopedFD sock_fd,
                                           base::ScopedFD stdout_fd,
                                           base::ScopedFD stderr_fd,
                                           const std::string& user,
                                           const std::string& container,
                                           const std::string& cwd,
                                           bool interactive);

  static std::unique_ptr<VshClient> CreateForTesting(base::ScopedFD sock_fd,
                                                     base::ScopedFD stdout_fd,
                                                     base::ScopedFD stderr_fd);
  ~VshClient() = default;

  int exit_code();

  // Helper function defined in vsh_client_fuzzer.cc.
  friend void vsh_client_fuzzer_run(const HostMessage& msg);

 private:
  explicit VshClient(base::ScopedFD sock_fd,
                     base::ScopedFD stdout_fd,
                     base::ScopedFD stderr_fd);

  bool Init(const std::string& user,
            const std::string& container,
            const std::string& cwd,
            bool interactive);

  bool HandleSignal(const struct signalfd_siginfo& siginfo);
  bool HandleWindowResizeSignal(const struct signalfd_siginfo& siginfo);
  void HandleVsockReadable();
  void HandleHostMessage(const HostMessage& msg);
  void HandleStdinReadable();
  bool SendCurrentWindowSize();
  bool GetCurrentWindowSize(struct winsize* ws);
  void CancelStdinTask();

  base::ScopedFD sock_fd_;
  std::unique_ptr<base::FileDescriptorWatcher::Controller> sock_watcher_;
  std::unique_ptr<base::FileDescriptorWatcher::Controller> stdin_watcher_;

  // VshClient expects to take ownership of stdout and stderr file descriptors,
  // since it will close them once the guest has indicated EOF.
  //
  // These fds should be overridden for testing.
  base::ScopedFD stdout_fd_;
  base::ScopedFD stderr_fd_;

  brillo::AsynchronousSignalHandler signal_handler_;

  int exit_code_;

  DISALLOW_COPY_AND_ASSIGN(VshClient);
};

}  // namespace vsh
}  // namespace vm_tools

#endif  // VM_TOOLS_VSH_VSH_CLIENT_H_
