13{
15
16 const auto directory = std::filesystem::temp_directory_path() /
17 "bastionguard-rootguard-file-identity-tests";
18 std::filesystem::remove_all(directory);
19 std::filesystem::create_directories(directory);
20
21 const auto path = directory / "regular-file";
22 {
23 std::ofstream output(path);
24 output << "rootguard\n";
25 }
26
27 struct stat status {};
28 assert(::stat(path.c_str(), &status) == 0);
29
30 const auto identity = rg::FileIdentityResolver::resolve(path, true, false);
31 const auto expected =
32 (static_cast<std::uint64_t>(major(status.st_dev)) << 20U) |
33 static_cast<std::uint64_t>(minor(status.st_dev));
34
35 assert(identity.key.device == expected);
36 assert(identity.key.device == rg::FileIdentityResolver::kernelDeviceNumber(status.st_dev));
37 assert(identity.key.inode == static_cast<std::uint64_t>(status.st_ino));
38
39 const auto secondIdentity = rg::FileIdentityResolver::resolve(path, true, false);
40 assert(secondIdentity.key.device == identity.key.device);
41 assert(secondIdentity.key.inode == identity.key.inode);
42 assert(secondIdentity.mode == identity.mode);
43 assert(secondIdentity.uid == identity.uid);
44 assert(secondIdentity.gid == identity.gid);
45
46 std::filesystem::remove_all(directory);
47 std::cout << "FileIdentityTests: OK\n";
48 return 0;
49}