#include "util.hpp" #include #include #include #include #include #include struct strftime_cache { time_t time; char buf[128]; }; static void log_(char const *log_type, FILE *stream, char const *fmt, va_list args) { static struct strftime_cache strft; time_t t = time(nullptr); if (t != strft.time) { strft.time = t; struct tm tm; struct tm *tmp = localtime_r(&t, &tm); strftime(strft.buf, sizeof(strft.buf), "%Y-%m-%dT%H:%M:%S", tmp); } fputs(program_invocation_short_name, stream); fputs(" ", stream); fputs(strft.buf, stream); fputs(" ", stream); fputs(log_type, stream); fputs(" ", stream); vfprintf(stream, fmt, args); fputs("\n", stream); } void lognotice(char const *fmt, ...) noexcept { va_list a; va_start(a, fmt); log_("notice", stdout, fmt, a); va_end(a); } void logerror(char const *fmt, ...) noexcept { va_list a; va_start(a, fmt); log_("error", stderr, fmt, a); va_end(a); } void fatal(char const *fmt, ...) noexcept { va_list a; va_start(a, fmt); log_("fatal", stderr, fmt, a); va_end(a); abort(); } #ifdef DEBUG_OUTPUT void logdebug(char const *fmt, ...) noexcept { va_list a; va_start(a, fmt); log_("debug", stdout, fmt, a); va_end(a); } #endif void Poller::add_fd(int fd, std::function handler) { pfds.emplace_back(pollfd{.fd = fd, .events = POLLIN, .revents = 0}); handlers.emplace_back(std::move(handler)); } int Poller::check_events() { int ret = 0; if ((ret = poll(this->pfds.data(), this->pfds.size(), -1)) != -1 && errno != EINTR) { for (unsigned i = 0; i < pfds.size(); i++) { if ((pfds[i].revents & POLLIN) != 0) { if (handlers[i](pfds[i].fd) == -1) { return -1; } pfds[i].revents = 0; pfds[i].events = POLLIN; } } } return ret; } unique_fd::~unique_fd() { if (this->fd != -1) { close(this->fd); } }