// 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 LIBBRILLO_BRILLO_DBUS_FILE_DESCRIPTOR_H_
#define LIBBRILLO_BRILLO_DBUS_FILE_DESCRIPTOR_H_

#include <utility>

#include <base/files/scoped_file.h>
#include <base/macros.h>

namespace brillo {
namespace dbus_utils {

// This struct wraps file descriptors to give them a type other than int.
// Implicit conversions are provided because this should be as transparent
// a wrapper as possible to match the libchrome bindings below when this
// class is used by chromeos-dbus-bindings.
//
// Because we might pass these around and the calling code neither passes
// ownership nor knows when this will be destroyed, it actually dups the FD
// so that the calling code and binding code both have a clear handle on the
// lifetimes of their respective copies of the FD.
struct FileDescriptor {
  FileDescriptor() = default;
  FileDescriptor(int fd) : fd(dup(fd)) {}
  FileDescriptor(FileDescriptor&& other) : fd(std::move(other.fd)) {}
  FileDescriptor(base::ScopedFD&& other) : fd(std::move(other)) {}
  FileDescriptor(const FileDescriptor&) = delete;
  FileDescriptor& operator=(const FileDescriptor&) = delete;

  inline FileDescriptor& operator=(int new_fd) {
    fd.reset(dup(new_fd));
    return *this;
  }

  FileDescriptor& operator=(FileDescriptor&& other) {
    fd = std::move(other.fd);
    return *this;
  }

  FileDescriptor& operator=(base::ScopedFD&& other) {
    fd = std::move(other);
    return *this;
  }

  int release() { return fd.release(); }

  int get() const { return fd.get(); }

 private:

  base::ScopedFD fd;
};

}  // namespace dbus_utils
}  // namespace brillo

#endif  // LIBBRILLO_BRILLO_DBUS_FILE_DESCRIPTOR_H_
