hlswmaster-ng/multisock.cpp

114 lines
2.2 KiB
C++
Raw Normal View History

2006-02-02 16:55:44 +01:00
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "multisock.h"
2006-04-16 21:02:41 +02:00
#include "logging.h"
2006-02-02 16:55:44 +01:00
#define DEFAULT_PORT 7130
#define DEVFILE "/proc/net/dev"
2006-02-20 12:31:34 +01:00
#define BUFSIZE 1024
2006-02-02 16:55:44 +01:00
MultiSock::MultiSock(Config& conf)
{
2006-02-05 12:00:47 +01:00
char* buf = new char [BUFSIZE];
2006-02-02 16:55:44 +01:00
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;
}
2006-03-05 02:28:19 +01:00
2006-02-02 16:55:44 +01:00
fgets(buf, BUFSIZE, fp);
fgets(buf, BUFSIZE, fp);
2006-03-05 02:28:19 +01:00
2006-02-02 16:55:44 +01:00
int port = conf.getInteger("global", "scan_port", DEFAULT_PORT);
2006-02-05 16:44:38 +01:00
Iterator<char>* it = conf.createIterator("global", "scan_deny_iface");
2006-02-02 16:55:44 +01:00
2006-02-05 16:44:38 +01:00
FD_ZERO(&fdsel);
2006-02-02 16:55:44 +01:00
while (fgets(buf, BUFSIZE, fp) != NULL) {
char* tok = strtok(buf, " :");
2006-03-05 02:28:19 +01:00
2006-02-05 16:44:38 +01:00
it->reset();
while (it->hasNext()) {
if (!strcmp(it->next(), tok)) {
LogSystem::log(LOG_NOTICE, "Interface '%s' denied by config", tok);
tok = 0;
break;
}
}
2006-03-05 02:28:19 +01:00
2006-02-05 16:44:38 +01:00
if (tok) {
Socket* sock = Socket::createSocket(tok, port);
if (sock) {
FD_SET(sock->getFD(), &fdsel);
2006-03-05 02:28:19 +01:00
2006-02-05 16:44:38 +01:00
sock->show(buf, BUFSIZE);
LogSystem::log(LOG_NOTICE, "adding Interface %s", buf);
2006-03-05 02:28:19 +01:00
2006-02-05 16:44:38 +01:00
ifaceList.add(sock);
}
2006-02-02 16:55:44 +01:00
}
}
2006-02-05 16:44:38 +01:00
delete it;
2006-03-05 02:28:19 +01:00
2006-02-02 16:55:44 +01:00
fclose(fp);
2006-02-05 12:00:47 +01:00
delete buf;
2006-02-05 16:44:38 +01:00
if (ifaceList.isEmpty())
LogSystem::log(LOG_CRIT, "No useable Interfaces found!");
2006-02-02 16:55:44 +01:00
}
MultiSock::~MultiSock()
{
while (!ifaceList.isEmpty())
delete ifaceList.get();
}
2006-03-05 02:28:19 +01:00
NetPkt* MultiSock::recv()
2006-02-02 16:55:44 +01:00
{
fd_set fdcpy;
while (1) {
memcpy(&fdcpy, &fdsel, sizeof(fdcpy));
select(FD_SETSIZE, &fdcpy, NULL, NULL, NULL);
2006-03-05 02:28:19 +01:00
2006-02-02 16:55:44 +01:00
Iterator<Socket>* it = ifaceList.createIterator();
while (it->hasNext()) {
Socket* sock = it->next();
if (FD_ISSET(sock->getFD(), &fdcpy)) {
delete it;
2006-03-05 02:28:19 +01:00
return sock->recv();
2006-02-02 16:55:44 +01:00
}
}
delete it;
2006-03-05 02:28:19 +01:00
LogSystem::log(LOG_WARN, "MultiSock::recvFrom(): select()");
2006-02-02 16:55:44 +01:00
}
2006-03-05 02:28:19 +01:00
return NULL;
2006-02-02 16:55:44 +01:00
}
2006-03-05 02:28:19 +01:00
int MultiSock::sendto(NetPkt* pkt, struct sockaddr_in* dst)
2006-02-05 16:44:38 +01:00
{
Iterator<Socket>* it = ifaceList.createIterator();
while (it->hasNext())
2006-03-05 02:28:19 +01:00
it->next()->sendto(pkt, dst);
2006-02-05 16:44:38 +01:00
2006-03-05 02:28:19 +01:00
delete it;
2006-02-05 16:44:38 +01:00
2006-03-06 20:13:26 +01:00
usleep(1000);
2006-03-05 02:28:19 +01:00
return 0;
2006-02-05 16:44:38 +01:00
}