// 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/lib/util/filesystem.h"

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

#include <fbl/unique_fd.h>
#include <fuchsia/io/c/fidl.h>
#include <lib/fxl/files/file.h>
#include <lib/fxl/logging.h>
#include <lib/fxl/macros.h>
#include <lib/fxl/strings/string_printf.h>
#include <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(fbl::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
