// Copyright 2019 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 "utils.h"

#include <fcntl.h>
#include <sys/stat.h>

#include "minfs_fixtures.h"

std::string BuildPath(const std::string_view& name) {
  std::string path(kMountPath);
  if (name.compare(0, path.length(), path) == 0) {
    return std::string(name);
  }
  path.append(name);
  return path;
}

bool CreateDirectory(const std::string_view& name) {
  return mkdir(BuildPath(name).c_str(), 0755)== 0;
}

fbl::unique_fd CreateFile(const std::string_view& name) {
  return fbl::unique_fd(open(BuildPath(name).c_str(), O_RDWR | O_CREAT, 0644));
}

fbl::unique_fd OpenFile(const std::string_view& name, bool read_only) {
  int flags = read_only ? O_RDONLY : O_RDWR;
  return fbl::unique_fd(open(BuildPath(name).c_str(), flags, 0644));
}
