TEST(ProcessTests, path_positive)
{
- auto name = Process::GetPath(Process::GetPid());
- EXPECT_EQ("/usr/bin/vist-test", name);
+ auto name = Process::GetIdentifier(Process::GetPid());
+ EXPECT_EQ("vist-test", name);
}
TEST(ProcessTests, path_negative)
{
bool raised = false;
try {
- Process::GetPath(-1);
+ Process::GetIdentifier(-1);
} catch(...) {
raised = true;
}
return ::getpid();
}
- /// TODO(Sangwan): Unify the method which get process identifier
- static std::string GetPath(pid_t pid)
+ static std::string GetIdentifier(pid_t pid)
{
- std::string exe = "/proc/" + std::to_string(pid) + "/exe";
-
- /// c++17 std::filesystem::read_symlink
- std::vector<char> buf(1024);
errno = 0;
- auto size = ::readlink(exe.c_str(), buf.data(), buf.size());
- if (size == -1) {
- WARN(VIST) << "Failed to get process path by exe: " << exe
- << ", errno: " << errno;
-
- std::string cmdline = "/proc/" + std::to_string(pid) + "/cmdline";
- int fd = ::open(cmdline.c_str(), O_RDONLY);
- if (fd == -1)
- THROW(ErrCode::RuntimeError) << "Failed to get process path: " << cmdline;
+ std::string cmdline = "/proc/" + std::to_string(pid) + "/cmdline";
+ int fd = ::open(cmdline.c_str(), O_RDONLY);
+ if (fd == -1)
+ THROW(ErrCode::RuntimeError) << "Failed to get process path: " << cmdline;
- errno = 0;
- size = ::read(fd, buf.data(), buf.size());
- ::close(fd);
+ errno = 0;
+ std::vector<char> buf(1024);
+ auto size = ::read(fd, buf.data(), buf.size());
+ ::close(fd);
- if (size == -1)
- THROW(ErrCode::RuntimeError) << "Failed to get process path: " << cmdline
- << ", errno: " << errno;
+ if (size == -1)
+ THROW(ErrCode::RuntimeError) << "Failed to get process path: " << cmdline
+ << ", errno: " << errno;
- buf[size - 1] = '\0';
- }
+ buf[size - 1] = '\0';
return canonicalize(std::string(buf.begin(), buf.begin() + size));
}
private:
static std::string canonicalize(std::string&& s)
{
- auto predicate = [](unsigned char c){ return std::isspace(c) || c == '\0'; };
- auto base = std::find_if(s.begin(), s.end(), predicate);
- s.erase(base, s.end());
+ { /// rtrim
+ auto predicate = [](unsigned char c){ return std::isspace(c) || c == '\0'; };
+ auto base = std::find_if(s.begin(), s.end(), predicate);
+ s.erase(base, s.end());
+ }
+
+ { /// ltrim
+ auto predicate = [](unsigned char c){ return c == '/'; };
+ auto base = std::find_if(s.rbegin(), s.rend(), predicate).base();
+ s.erase(s.begin(), base);
+ }
+
return s;
}
};
TEST_F(CoreTests, query_update)
{
- policy::API::Admin::Enroll("/usr/bin/vist-test");
+ policy::API::Admin::Enroll("vist-test");
std::string statement = "SELECT * FROM policy WHERE name = 'sample-int-policy'";
auto rows = Vistd::Query(statement);
rows = Vistd::Query(statement);
EXPECT_EQ(rows[0]["value"], "I/10");
- policy::API::Admin::Disenroll("/usr/bin/vist-test");
+ policy::API::Admin::Disenroll("vist-test");
}