Welcome to mirror list, hosted at ThFree Co, Russian Federation.

FSFileFlags.cpp « mix « src « far2l - github.com/elfmz/far2l.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 07114caf32dfc78d6108b88ab6a8b75f7244b00c (plain)
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