-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutil.cc
94 lines (75 loc) · 2.27 KB
/
util.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Copyright 2021 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "fusebox/util.h"
#include <fcntl.h>
#include <fuse_lowlevel.h>
#include <base/strings/stringprintf.h>
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 kFuseToSetFlags[] = {
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) {
std::string flags_string;
if (!flags)
return "0";
for (const auto& d : defs) {
if (flags & d.flag) {
if (!flags_string.empty())
flags_string.append("|");
flags_string.append(d.name);
flags &= ~d.flag;
}
}
if (flags) {
if (!flags_string.empty())
flags_string.append("|");
flags_string.append(base::StringPrintf("0x%x", flags));
}
return flags_string;
}
} // namespace
std::string OpenFlagsToString(int flags) {
std::string open_flags_string;
switch (flags & O_ACCMODE) { // Only three things, ...
case O_RDONLY:
open_flags_string = "O_RDONLY";
break;
case O_WRONLY:
open_flags_string = "O_WRONLY";
break;
case O_RDWR:
open_flags_string = "O_RDWR";
break;
default:
open_flags_string = "INVALID_O_ACCMODE_FLAG";
break;
}
flags &= ~O_ACCMODE;
if (flags) {
open_flags_string.append("|");
open_flags_string.append(FlagsToString(kOpenFlags, flags));
}
return open_flags_string;
}
std::string ToSetFlagsToString(int flags) {
return FlagsToString(kFuseToSetFlags, flags);
}