#pragma once #include #include #include "util.hpp" class TunDevice { public: class InitializationError : public MsgException { public: InitializationError( const std::string& msg, int code=0, bool is_perror=false) : MsgException(msg, code, is_perror) {} }; class NetError : public MsgException { public: NetError( const std::string& msg, int code=0, bool is_perror=false) : MsgException(msg, code, is_perror) {} }; TunDevice(const std::string& dev); ~TunDevice(); const std::string& get_dev_name() const { return _dev_name; } int get_fd() const { return _fd; } /* Reads a packet from the device. * Timeouts after `timeout` ms, or never if `timeout < 0`. * Upon timeout, returns 0. */ size_t read_packet(char* read_buffer, size_t buf_size, int timeout=-1); size_t write_packet(const char* data, size_t len); private: int _fd; std::string _dev_name; struct pollfd _poll_fd; size_t _last_read_size; };