shrunk cpp code

This commit is contained in:
Jake Hillion 2020-12-28 11:52:32 +00:00
parent 36e0b008c2
commit f72a54d4f9

View File

@ -16,19 +16,14 @@
#include <sstream> #include <sstream>
struct Packet { struct Packet {
size_t len; size_t len; uint8_t* data;
uint8_t* data;
Packet(const uint8_t *input, size_t num_bytes) { Packet(const uint8_t *input, size_t num_bytes) {
len = num_bytes; len = num_bytes; data = new uint8_t[len];
data = new uint8_t[len];
std::memcpy(data, input, len); std::memcpy(data, input, len);
}; };
~Packet() { ~Packet() { delete[] data; }
delete[] data;
}
[[nodiscard]] std::string print() const { [[nodiscard]] std::string print() const {
std::stringstream out; std::stringstream out;
@ -42,18 +37,13 @@ struct Packet {
template <class T> class ThreadSafeQueue { template <class T> class ThreadSafeQueue {
std::queue<T> _queue = std::queue<T>(); std::queue<T> _queue = std::queue<T>();
std::mutex _mutex; std::condition_variable _cond;
std::mutex _mutex;
std::condition_variable _cond;
public: public:
ThreadSafeQueue() = default; ThreadSafeQueue() = default;
void push(T item) { void push(T item) {
_mutex.lock(); _mutex.lock(); _queue.push(item); _mutex.unlock();
_queue.push(item);
_mutex.unlock();
_cond.notify_one(); _cond.notify_one();
} }
@ -79,11 +69,8 @@ int tun_alloc(const char *dev, short flags) {
perror("Opening /dev/net/tun"); perror("Opening /dev/net/tun");
return fd; return fd;
} }
memset(&ifr, 0, sizeof(ifr)); memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = flags; ifr.ifr_flags = flags;
strncpy(ifr.ifr_name, dev, IFNAMSIZ); strncpy(ifr.ifr_name, dev, IFNAMSIZ);
if( (err = ioctl(fd, TUNSETIFF, (void *)&ifr)) < 0 ) { if( (err = ioctl(fd, TUNSETIFF, (void *)&ifr)) < 0 ) {
@ -95,12 +82,6 @@ int tun_alloc(const char *dev, short flags) {
return fd; return fd;
} }
volatile sig_atomic_t stop = 0;
void interrupt_handler(int signum) {
stop = 1;
}
std::mutex print_lock; std::mutex print_lock;
void consumer(const int index, ThreadSafeQueue<Packet*> *queue) { void consumer(const int index, ThreadSafeQueue<Packet*> *queue) {
@ -118,10 +99,7 @@ void consumer(const int index, ThreadSafeQueue<Packet*> *queue) {
} }
int main() { int main() {
signal(SIGINT, interrupt_handler);
int tun = tun_alloc("nc%d", IFF_TUN); int tun = tun_alloc("nc%d", IFF_TUN);
auto queue = new ThreadSafeQueue<Packet*>(); auto queue = new ThreadSafeQueue<Packet*>();
std::thread threads[10]; std::thread threads[10];
@ -134,19 +112,12 @@ int main() {
std::thread reader([tun, queue]() { std::thread reader([tun, queue]() {
uint8_t buffer[1500]; uint8_t buffer[1500];
while (!stop) { while (true) {
int num_bytes = read(tun, &buffer, 1500); int num_bytes = read(tun, &buffer, 1500);
if (num_bytes != 0) { if (num_bytes != 0) {
auto *packet = new Packet(buffer, num_bytes); auto *packet = new Packet(buffer, num_bytes);
queue->push(packet); queue->push(packet);
} else { }
stop = 1;
};
} }
}); });
while (!stop) pause();
std::cout << "terminating..." << std::endl;
std::terminate();
} }