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
|
#include <sudo.h>
#include <stdio.h>
#include <errno.h>
#ifdef __linux__
# include <linux/fs.h>
#endif
#include "FSFileFlags.h"
FSFileFlags::FSFileFlags(const std::string &path)
{
if (sdc_fs_flags_get(path.c_str(), &_flags) == 0) {
_valid = true;
_actual_flags = _flags;
} else {
fprintf(stderr, "FSFileFlags: error %d; path='%s'\n", errno, path.c_str());
}
}
void FSFileFlags::Apply(const std::string &path, bool force)
{
if (!_valid) {
fprintf(stderr, "FSFileFlags::Apply: not valid; path='%s'\n", path.c_str());
} else if (_flags != _actual_flags || force) {
if (sdc_fs_flags_set(path.c_str(), _flags) == 0) {
_actual_flags = _flags;
fprintf(stderr, "FSFileFlags::Apply: OK; path='%s'\n", path.c_str());
} else {
fprintf(stderr, "FSFileFlags::Apply: error %d; path='%s'\n", errno, path.c_str());
}
}
}
////////
bool FSFileFlags::Immutable() const
{
return FS_FLAGS_CONTAIN_IMMUTABLE(_flags);
}
void FSFileFlags::SetImmutable(bool v)
{
if (v && !FS_FLAGS_CONTAIN_IMMUTABLE(_flags)) {
_flags = FS_FLAGS_WITH_IMMUTABLE(_flags);
} else if (!v && FS_FLAGS_CONTAIN_IMMUTABLE(_flags)) {
_flags = FS_FLAGS_WITHOUT_IMMUTABLE(_flags);
}
}
bool FSFileFlags::Append() const
{
return FS_FLAGS_CONTAIN_APPEND(_flags);
}
void FSFileFlags::SetAppend(bool v)
{
if (v && !FS_FLAGS_CONTAIN_APPEND(_flags)) {
_flags = FS_FLAGS_WITH_APPEND(_flags);
} else if (!v && FS_FLAGS_CONTAIN_APPEND(_flags)) {
_flags = FS_FLAGS_WITHOUT_APPEND(_flags);
}
}
#if defined(__APPLE__) || defined(__FreeBSD__)
bool FSFileFlags::Hidden() const
{
return FS_FLAGS_CONTAIN_HIDDEN(_flags);
}
void FSFileFlags::SetHidden(bool v)
{
if (v && !FS_FLAGS_CONTAIN_HIDDEN(_flags)) {
_flags = FS_FLAGS_WITH_HIDDEN(_flags);
} else if (!v && FS_FLAGS_CONTAIN_HIDDEN(_flags)) {
_flags = FS_FLAGS_WITHOUT_HIDDEN(_flags);
}
}
#endif
|