blob: 7e678ecbe8d2da8190230c15a0e6cfe8686a3794 [file] [log] [blame]
// 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