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

#include "peridot/bin/basemgr/wait_for_minfs.h"

#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <memory>
#include <utility>

#include <fbl/unique_fd.h>
#include <fuchsia/io/c/fidl.h>
#include "src/lib/files/file.h"
#include <src/lib/fxl/logging.h>
#include <src/lib/fxl/macros.h>
#include <src/lib/fxl/strings/string_printf.h>
#include <src/lib/fxl/strings/string_view.h>
#include <lib/fzl/fdio.h>
#include <lib/zx/time.h>
#include <zircon/device/vfs.h>
#include <zircon/syscalls.h>

namespace modular {

// For polling minfs.
constexpr fxl::StringView kPersistentFileSystem = "/data";
constexpr fxl::StringView kMinFsName = "minfs";
constexpr zx::duration kMaxPollingDelay = zx::sec(10);

void WaitForMinfs() {
  auto delay = zx::msec(10);
  zx::time now = zx::clock::get_monotonic();
  while (zx::clock::get_monotonic() - now < kMaxPollingDelay) {
    fbl::unique_fd fd(open(kPersistentFileSystem.data(), O_RDONLY));
    if (fd.is_valid()) {
      fuchsia_io_FilesystemInfo info;
      zx_status_t status, io_status;
      fzl::FdioCaller caller{std::move(fd)};
      io_status = fuchsia_io_DirectoryAdminQueryFilesystem(
          caller.borrow_channel(), &status, &info);
      if (io_status == ZX_OK && status == ZX_OK) {
        const char* name = reinterpret_cast<const char*>(info.name);
        fxl::StringView fs_name(name,
                                strnlen(name, fuchsia_io_MAX_FS_NAME_BUFFER));
        if (fs_name == kMinFsName) {
          return;
        }
      }
    }

    usleep(delay.to_usecs());
    delay = delay * 2;
  }

  FXL_LOG(WARNING) << kPersistentFileSystem
                   << " is not persistent. Did you forget to configure it?";
}

}  // namespace modular
