// Copyright 2019 The Chromium OS 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 "smbfs/util.h"

#include <fcntl.h>
#include <fuse_lowlevel.h>

#include <base/strings/stringprintf.h>

namespace smbfs {
namespace {

struct FlagDef {
  const int flag;
  const char* name;
};

#define FLAG_DEF(f) \
  { f, #f }
const FlagDef kOpenFlags[] = {
    FLAG_DEF(O_APPEND),   FLAG_DEF(O_ASYNC),  FLAG_DEF(O_CLOEXEC),
    FLAG_DEF(O_CREAT),    FLAG_DEF(O_DIRECT), FLAG_DEF(O_DIRECTORY),
    FLAG_DEF(O_DSYNC),    FLAG_DEF(O_EXCL),   FLAG_DEF(O_LARGEFILE),
    FLAG_DEF(O_NOATIME),  FLAG_DEF(O_NOCTTY), FLAG_DEF(O_NOFOLLOW),
    FLAG_DEF(O_NONBLOCK), FLAG_DEF(O_PATH),   FLAG_DEF(O_SYNC),
    FLAG_DEF(O_TMPFILE),  FLAG_DEF(O_TRUNC),
};

const FlagDef kToSetFlags[] = {
    FLAG_DEF(FUSE_SET_ATTR_MODE),      FLAG_DEF(FUSE_SET_ATTR_UID),
    FLAG_DEF(FUSE_SET_ATTR_GID),       FLAG_DEF(FUSE_SET_ATTR_SIZE),
    FLAG_DEF(FUSE_SET_ATTR_ATIME),     FLAG_DEF(FUSE_SET_ATTR_MTIME),
    FLAG_DEF(FUSE_SET_ATTR_ATIME_NOW), FLAG_DEF(FUSE_SET_ATTR_MTIME_NOW),
};

template <size_t N>
std::string FlagsToString(const FlagDef (&defs)[N], int flags) {
  if (!flags) {
    return "0";
  }

  std::string str;
  for (const auto& def : defs) {
    if (flags & def.flag) {
      if (!str.empty()) {
        str.append("|");
      }
      str.append(def.name);
      flags &= ~def.flag;
    }
  }
  if (flags) {
    if (!str.empty()) {
      str.append("|");
    }
    str.append(base::StringPrintf("0x%x", flags));
  }
  return str;
}

}  // namespace

std::string OpenFlagsToString(int flags) {
  std::string str;
  switch (flags & O_ACCMODE) {
    case O_RDONLY:
      str = "O_RDONLY";
      break;
    case O_WRONLY:
      str = "O_WRONLY";
      break;
    case O_RDWR:
      str = "O_RDWR";
      break;
    default:
      str = "INVALID_OPEN_MODE";
      break;
  }
  flags &= ~O_ACCMODE;
  if (flags) {
    str.append("|");
    str.append(FlagsToString(kOpenFlags, flags));
  }

  return str;
}

std::string ToSetFlagsToString(int flags) {
  return FlagsToString(kToSetFlags, flags);
}

std::string IpAddressToString(const std::vector<uint8_t>& address) {
  if (address.size() != 4) {
    return {};
  }

  return base::StringPrintf("%u.%u.%u.%u", address[0], address[1], address[2],
                            address[3]);
}

}  // namespace smbfs
