in src/oomd/Stats.cpp [107:140]
bool Stats::startSocket() {
std::array<char, 64> err_buf = {};
sockfd_ = ::socket(AF_UNIX, SOCK_STREAM, 0);
if (sockfd_ < 0) {
OLOG << "Error creating socket: "
<< ::strerror_r(errno, err_buf.data(), err_buf.size() - 1);
return false;
}
::memset(&serv_addr_, '\0', sizeof(serv_addr_));
serv_addr_.sun_family = AF_UNIX;
::strcpy(serv_addr_.sun_path, stats_socket_path_.c_str());
if (::unlink(serv_addr_.sun_path) < 0 && errno != ENOENT) {
OLOG << "Pre-unlinking of socket path failed. " << serv_addr_.sun_path
<< ". Errno: " << ::strerror_r(errno, err_buf.data(), err_buf.size());
return false;
}
if (::bind(sockfd_, (struct sockaddr*)&serv_addr_, sizeof(serv_addr_)) < 0) {
OLOG << "Error binding stats collection socket: "
<< ::strerror_r(errno, err_buf.data(), err_buf.size());
return false;
}
if (::chmod(stats_socket_path_.c_str(), 0666) < 0) {
OLOG << "Unable to set permissions on " << stats_socket_path_;
return false;
}
if (::listen(sockfd_, 5) < 0) {
OLOG << "Error listening at socket: "
<< ::strerror_r(errno, err_buf.data(), err_buf.size());
return false;
}
stats_thread_ = std::thread([this] { this->runSocket(); });
return true;
}