#include #include #include #include #include #include #include #include #include #include #include "multisock.h" #include "logging.h" #define DEFAULT_PORT 7130 #define DEVFILE "/proc/net/dev" #define BUFSIZE 1024 MultiSock::MultiSock(Config& conf) { char* buf = new char [BUFSIZE]; if (buf == NULL) { LogSystem::log(LOG_CRIT, "MultiSock(): out of memory"); return; } FILE* fp = fopen(DEVFILE, "r"); if (fp == NULL) { LogSystem::log(LOG_CRIT, "MultiSock(): can not open " DEVFILE); free(buf); return; } fgets(buf, BUFSIZE, fp); fgets(buf, BUFSIZE, fp); int port = conf.getInteger("global", "scan_port", DEFAULT_PORT); Iterator* it = conf.createIterator("global", "scan_deny_iface"); FD_ZERO(&fdsel); while (fgets(buf, BUFSIZE, fp) != NULL) { char* tok = strtok(buf, " :"); it->reset(); while (it->hasNext()) { if (!strcmp(it->next(), tok)) { LogSystem::log(LOG_NOTICE, "Interface '%s' denied by config", tok); tok = 0; break; } } if (tok) { Socket* sock = Socket::createSocket(tok, port); if (sock) { FD_SET(sock->getFD(), &fdsel); sock->show(buf, BUFSIZE); LogSystem::log(LOG_NOTICE, "adding Interface %s", buf); ifaceList.add(sock); } } } delete it; fclose(fp); delete buf; if (ifaceList.isEmpty()) LogSystem::log(LOG_CRIT, "No useable Interfaces found!"); } MultiSock::~MultiSock() { while (!ifaceList.isEmpty()) delete ifaceList.get(); } NetPkt* MultiSock::recv() { fd_set fdcpy; while (1) { memcpy(&fdcpy, &fdsel, sizeof(fdcpy)); select(FD_SETSIZE, &fdcpy, NULL, NULL, NULL); Iterator* it = ifaceList.createIterator(); while (it->hasNext()) { Socket* sock = it->next(); if (FD_ISSET(sock->getFD(), &fdcpy)) { delete it; return sock->recv(); } } delete it; LogSystem::log(LOG_WARN, "MultiSock::recvFrom(): select()"); } return NULL; } int MultiSock::sendto(NetPkt* pkt, struct sockaddr_in* dst) { Iterator* it = ifaceList.createIterator(); while (it->hasNext()) it->next()->sendto(pkt, dst); delete it; usleep(1000); return 0; }