// c++ -o eve eve.cpp -lprivatedevdctl #include #include #include #include #include #include #include #include #include #include #include DevdCtl::EventFactory::Record entries[] = { { DevdCtl::Event::NOTIFY, "GEOM", &DevdCtl::GeomEvent::Builder }, { DevdCtl::Event::NOTIFY, "ZFS", &DevdCtl::ZfsEvent::Builder } }; int main() { int kq = {}; int rc = {}; size_t size = 0; struct kevent event = {}; std::string physPath = {}; size = sizeof(entries) / sizeof(*entries); DevdCtl::Consumer c(NULL, entries, size); if (c.ConnectToDevd() == false) { std::cerr << "Can not connect to devd" << std::endl; return 1; } kq = kqueue(); if (kq == -1) { std::cerr << "kqueue: " << strerror(errno) << '\n'; return 1; } EV_SET(&event, c.GetPollFd(), EVFILT_READ, EV_ADD | EV_CLEAR, NOTE_READ, 0, nullptr); rc = kevent(kq, &event, 1, nullptr, 0, nullptr); if (rc == -1) { std::cerr << "kevent register: " << strerror(errno) << '\n'; return 1; } while (true) { rc = kevent(kq, nullptr, 0, &event, 1, nullptr); if (rc == -1 || event.data == 0) { break; } std::cout << "Event for fd " << event.ident << ": "; auto e = c.NextEvent(); if (e != nullptr) { std::cout << e->ToString(); e->PhysicalPath(physPath); std::cout << " physical path = \"" << physPath << '"'; } std::cout << std::endl; } c.DisconnectFromDevd(); return 0; }