diff --git a/posix/interface.hpp b/posix/interface.hpp index dfdb5cab..369a8229 100644 --- a/posix/interface.hpp +++ b/posix/interface.hpp @@ -19,13 +19,8 @@ namespace cruft::posix { interface (void) { struct iterator { - iterator () - { - error::try_call (getifaddrs, &cursor); - } - - iterator (ifaddrs *_cursor): - cursor (_cursor) + explicit iterator (ifaddrs *_cursor) noexcept + : cursor (_cursor) { ; } ifaddrs *cursor; @@ -44,9 +39,37 @@ namespace cruft::posix { }; - struct container { - auto begin (void) { return iterator ( ); } + class container { + public: + container () + { + error::try_call (getifaddrs, &m_data); + } + + ~container () + { + if (m_data) + freeifaddrs (m_data); + } + + + container (container &&rhs) noexcept: + m_data (std::exchange (rhs.m_data, nullptr)) + { ; } + + container& operator= (container &&rhs) noexcept + { + std::swap (m_data, rhs.m_data); + return *this; + } + + container (container const&) = delete; + container& operator= (container const&) = delete; + + auto begin (void) { return iterator (m_data); } auto end (void) { return iterator (nullptr); } + + ifaddrs *m_data; }; return container ();