#include #include #include "logging.h" // Read exact same size as count ssize_t xxread(int fd, void *buf, size_t count) { size_t read_sz = 0; ssize_t ret; do { ret = read(fd, (std::byte *) buf + read_sz, count - read_sz); if (ret < 0) { if (errno == EINTR) continue; LOGE("read"); return ret; } read_sz += ret; } while (read_sz != count && ret != 0); if (read_sz != count) { LOGE("read (%zu != %zu)", count, read_sz); } return read_sz; } bool ends_with(std::string_view str, std::string_view suffix) { return str.size() >= suffix.size() && str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; } bool starts_with(std::string_view str, std::string_view prefix) { return str.size() >= prefix.size() && str.compare(0, prefix.size(), prefix) == 0; } bool contains(std::string_view str, std::string_view substr) { return str.size() >= substr.size() && str.find(substr) != std::string::npos; }