// 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 <unistd.h>
#include <zircon/device/vfs.h>
#include <zircon/syscalls.h>
#include <memory>

#include "lib/fxl/files/file.h"
#include "lib/fxl/files/unique_fd.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/fxl/time/time_delta.h"
#include "lib/fxl/time/time_point.h"

namespace modular {

// For polling minfs.
constexpr fxl::StringView kPersistentFileSystem = "/data";
constexpr fxl::StringView kMinFsName = "minfs";
constexpr fxl::TimeDelta kMaxPollingDelay = fxl::TimeDelta::FromSeconds(10);

void WaitForMinfs() {
  auto delay = fxl::TimeDelta::FromMilliseconds(10);
  fxl::TimePoint now = fxl::TimePoint::Now();
  while (fxl::TimePoint::Now() - now < kMaxPollingDelay) {
    fxl::UniqueFD fd(open(kPersistentFileSystem.data(), O_RDONLY));
    if (fd.is_valid()) {
      char buf[sizeof(vfs_query_info_t) + MAX_FS_NAME_LEN + 1];
      auto* info = reinterpret_cast<vfs_query_info_t*>(buf);
      ssize_t len = ioctl_vfs_query_fs(fd.get(), info, sizeof(buf) - 1);
      FXL_DCHECK(len > (ssize_t)sizeof(vfs_query_info_t));
      fxl::StringView fs_name(info->name, len - sizeof(vfs_query_info_t));
      if (fs_name == kMinFsName) {
        return;
      }
    }

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

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

}  // namespace modular
