// 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 <lib/fdio/vfs.h>
#include <lib/vfs/cpp/internal/dirent_filler.h>
#include <limits.h>

namespace vfs {
namespace internal {

DirentFiller::DirentFiller(void* ptr, uint64_t len)
    : ptr_(static_cast<char*>(ptr)), pos_(0), len_(len) {}

zx_status_t DirentFiller::Next(const std::string& name, uint8_t type, uint64_t ino) {
  return Next(name.data(), name.length(), type, ino);
}

zx_status_t DirentFiller::Next(const char* name, size_t name_len, uint8_t type, uint64_t ino) {
  vdirent_t* de = reinterpret_cast<vdirent_t*>(ptr_ + pos_);
  size_t sz = sizeof(vdirent_t) + name_len;

  if (sz > len_ - pos_ || name_len > NAME_MAX) {
    return ZX_ERR_INVALID_ARGS;
  }
  de->ino = ino;
  de->size = static_cast<uint8_t>(name_len);
  de->type = type;
  memcpy(de->name, name, name_len);
  pos_ += sz;
  return ZX_OK;
}

}  // namespace internal
}  // namespace vfs
