From 63d7e433f104dd13d015df3a048697fad6d43a55 Mon Sep 17 00:00:00 2001 From: deva Date: Thu, 15 May 2008 14:19:02 +0000 Subject: Added a lot of testcode... and fixed a lot of minor error (-Wall -Werror) --- server/src/queryhandler.cc | 196 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 195 insertions(+), 1 deletion(-) (limited to 'server/src/queryhandler.cc') diff --git a/server/src/queryhandler.cc b/server/src/queryhandler.cc index 16db038..e21d820 100644 --- a/server/src/queryhandler.cc +++ b/server/src/queryhandler.cc @@ -26,6 +26,200 @@ */ #include "queryhandler.h" -QueryHandler::QueryHandler() +// For time +#include + +#include +#include +#include + +// For getpid +#include +#include + +// For time +#include + +// For strerror and errno +#include + +// For socket and friends +#include +#include +#include +#include + +// For ioctl +#include + +typedef struct { + in_addr_t ip; + time_t time; + pid_t pid; + unsigned short int count; +} UID; + + +#define SIOCGIFCONF 0x8912 // get iface list + +static in_addr_t getIP(char *interface) { + in_addr_t ret = 0; + int numreqs = 30, sd, n; + struct ifconf ifc; + struct ifreq *ifr; + struct in_addr *ia; + + sd = socket(AF_INET, SOCK_STREAM, 0); + if(sd == -1) { + // throw Pentominos::UIDCouldNotConnectException(strerror(errno)); + } + + ifc.ifc_buf = NULL; + ifc.ifc_len = sizeof(struct ifreq) * numreqs; + + ifc.ifc_buf = (char*)malloc(ifc.ifc_len); + if(ifc.ifc_buf == NULL) { + // throw Pentominos::UIDOutOfMemoryException(); + } + + if (ioctl(sd, SIOCGIFCONF, &ifc) < 0) { + // throw Pentominos::UIDInterfaceListException(strerror(errno)); + } + + ifr = ifc.ifc_req; + for (n = 0; n < ifc.ifc_len; n += sizeof(struct ifreq)) { + ia = (struct in_addr *)((ifr->ifr_ifru.ifru_addr.sa_data)+2); + if(!strcmp(ifr->ifr_ifrn.ifrn_name, interface)) { + ret = *(in_addr_t*)ia; + } + ifr++; + } + + if(!ret) { // Still no interface... We're fucked! + // throw Pentominos::UIDInterfaceException(interface); + } + + free(ifc.ifc_buf); + return ret; +} + + +static unsigned short counter = 0; +static unsigned short getCounter() +{ + return counter++; +} + +static UID uid = {0,0,0,0}; +static std::string getUID(char *interface) +{ + if(!uid.ip) uid.ip = getIP(interface); + + time_t t = time(NULL); + if(uid.time != t) counter = 0; // If time differes, reset the counter + uid.time = t; // We need this value every time. + + if(!uid.pid) uid.pid = getpid(); + + uid.count = getCounter(); + + char buf[32]; + sprintf(buf, "%08x%08x%04x%04x", uid.ip, (unsigned int)uid.time, uid.pid, uid.count); + return std::string(buf); } + + +QueryHandler::QueryHandler(TCPSocket *socket, std::string cpr) +{ + this->cpr = cpr; + this->socket = socket; +} + +void QueryHandler::addQuery(Query &query) +{ + queries.push_back(query); +} + +std::string QueryHandler::exec() +{ + time_t timestamp = time(NULL); + std::string uid = getUID("eth0"); + + char buf[512]; + char header[] = + "\n" + "\n"; + socket->write(header, strlen(header)); + + sprintf(buf, " \n", + cpr.c_str(), + socket->srcaddr().c_str(), + socket->dstaddr().c_str(), + (unsigned int)timestamp, + uid.c_str()); + socket->write(buf, strlen(buf)); + + std::vector< Query >::iterator j = queries.begin(); + while(j != queries.end()) { + Query query = *j; + + sprintf(buf, " \n", + query.device_id.c_str(), + query.device_type.c_str()); + + socket->write(buf, strlen(buf)); + + j++; + } + + sprintf(buf, "\n"); + socket->write(buf, strlen(buf)); + + // Terminate + socket->write("\0", 1); + + // Wait for answer + char abuf[64]; + int res; + std::string answer; + do { + memset(abuf, 0, sizeof(abuf)); + res = socket->read(abuf, sizeof(abuf) - 1); + answer += abuf; + } while(res); + + return answer; +} + +#ifdef TEST_QUERYHANDLER + +int main() +{ + TCPSocket s; + s.connect("localhost", 11108); + + QueryHandler qh(&s, "2003791613"); + + Query q1("lensmeter", "lensmeter"); + qh.addQuery(q1); + + std::string res = qh.exec(); + + printf("%s\n", res.c_str()); + + return 0; +} + +#endif/*TEST_QUERYHANDLER*/ -- cgit v1.2.3