TunDevice: separate poll and read

This commit is contained in:
Théophile Bastian 2020-06-04 11:46:09 +02:00
parent 8ec3f20513
commit a27e894fc1
2 changed files with 13 additions and 6 deletions

View file

@ -53,7 +53,7 @@ TunDevice::~TunDevice() {
close(_fd); close(_fd);
} }
size_t TunDevice::read_packet(char* read_buffer, size_t buf_size, int timeout) { size_t TunDevice::poll_packet(char* read_buffer, size_t buf_size, int timeout) {
int poll_rc = poll(&_poll_fd, 1, timeout); int poll_rc = poll(&_poll_fd, 1, timeout);
if(poll_rc < 0) { if(poll_rc < 0) {
if(errno == EINTR) // Interrupt. if(errno == EINTR) // Interrupt.
@ -66,7 +66,11 @@ size_t TunDevice::read_packet(char* read_buffer, size_t buf_size, int timeout) {
return 0; return 0;
} }
int nread = read(_fd, read_buffer, buf_size); return this->read(read_buffer, buf_size);
}
size_t TunDevice::read(char* read_buffer, size_t buf_size) {
int nread = ::read(_fd, read_buffer, buf_size);
if(nread < 0) { if(nread < 0) {
throw TunDevice::NetError( throw TunDevice::NetError(
"Error reading from interface", errno, true); "Error reading from interface", errno, true);
@ -75,8 +79,8 @@ size_t TunDevice::read_packet(char* read_buffer, size_t buf_size, int timeout) {
return _last_read_size; return _last_read_size;
} }
size_t TunDevice::write_packet(const char* data, size_t len) { size_t TunDevice::write(const char* data, size_t len) {
int nwritten = write(_fd, data, len); int nwritten = ::write(_fd, data, len);
if(nwritten < 0) { if(nwritten < 0) {
throw TunDevice::NetError( throw TunDevice::NetError(
"Error writing to interface: ", errno, true); "Error writing to interface: ", errno, true);

View file

@ -33,9 +33,12 @@ class TunDevice {
* Timeouts after `timeout` ms, or never if `timeout < 0`. * Timeouts after `timeout` ms, or never if `timeout < 0`.
* Upon timeout, returns 0. * Upon timeout, returns 0.
*/ */
size_t read_packet(char* read_buffer, size_t buf_size, int timeout=-1); size_t poll_packet(char* read_buffer, size_t buf_size, int timeout=-1);
size_t write_packet(const char* data, size_t len); /* Reads a packet, blocking if none is available. */
size_t read(char* read_buffer, size_t buf_size);
size_t write(const char* data, size_t len);
private: private:
int _fd; int _fd;