diff options
109 files changed, 2982 insertions, 2711 deletions
diff --git a/src/anyrtpproxy/anyrtpproxy.cpp b/src/anyrtpproxy/anyrtpproxy.cpp index 7c5514c..22d7494 100644 --- a/src/anyrtpproxy/anyrtpproxy.cpp +++ b/src/anyrtpproxy/anyrtpproxy.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -66,64 +66,62 @@ void listener(RtpSession::proto::socket* sock1, RtpSession::proto::socket* sock2 { cLog.msg(Log::PRIO_NOTICE) << "listener(" << call_id << "/" << dir << ") started"; - try - { + try { Buffer buf(u_int32_t(MAX_PACKET_SIZE)); RtpSession::proto::endpoint remote_end; while(1) { buf.setLength(MAX_PACKET_SIZE); u_int32_t len=0; - if(dir == 1) - len = 0;//sock1->recvFromNonBlocking(buf.getBuf(), buf.getLength(), remote_end, 1000); - else if(dir == 2) - len = 0; //sock2->recvFromNonBlocking(buf.getBuf(), buf.getLength(), remote_end, 1000); - else break; + if(dir == 1) { + len = 0; //sock1->recvFromNonBlocking(buf.getBuf(), buf.getLength(), remote_end, 1000); + } else if(dir == 2) { + len = 0; //sock2->recvFromNonBlocking(buf.getBuf(), buf.getLength(), remote_end, 1000); + } else { break; } RtpSession& session = gRtpSessionTable.getSession(call_id); if(session.isDead()) { - cLog.msg(Log::PRIO_NOTICE) << "listener(" << call_id << "/" << dir << ") session is dead, exiting"; + cLog.msg(Log::PRIO_NOTICE) << "listener(" << call_id << "/" << dir << ") session is dead, exiting"; break; } - if(!len) + if(!len) { continue; + } buf.setLength(len); - - if((dir == 1 && remote_end != session.getRemoteEnd1()) || - (dir == 2 && remote_end != session.getRemoteEnd2())) - { + + if((dir == 1 && remote_end != session.getRemoteEnd1()) || + (dir == 2 && remote_end != session.getRemoteEnd2())) { if(gOpt.getNat() || - (!gOpt.getNoNatOnce() && ((dir == 1 && !session.getSeen1()) || - (dir == 2 && !session.getSeen2())))) - { + (!gOpt.getNoNatOnce() && ((dir == 1 && !session.getSeen1()) || + (dir == 2 && !session.getSeen2())))) { cLog.msg(Log::PRIO_NOTICE) << "listener(" << call_id << "/" << dir << ") setting remote host to " << remote_end; - if(dir == 1) + if(dir == 1) { session.setRemoteEnd1(remote_end); - if(dir == 2) + } + if(dir == 2) { session.setRemoteEnd2(remote_end); - + } + if(!gOpt.getNat()) { // with nat enabled sync is not needed SyncRtpCommand sc(call_id); queue->push(sc); } - } - else + } else { continue; - } + } + } session.setSeen1(); session.setSeen2(); - if(dir == 1) + if(dir == 1) { sock2->send_to(boost::asio::buffer(buf.getBuf(), buf.getLength()), session.getRemoteEnd2()); - else if(dir == 2) + } else if(dir == 2) { sock1->send_to(boost::asio::buffer(buf.getBuf(), buf.getLength()), session.getRemoteEnd1()); - else break; - } - } - catch(std::exception &e) - { + } else { break; } + } + } catch(std::exception& e) { cLog.msg(Log::PRIO_ERR) << "listener(" << call_id << "/" << dir << ") exiting because: " << e.what(); } *running = false; @@ -150,21 +148,19 @@ void listenerManager(void* p) SyncQueue* queue_ = reinterpret_cast<SyncQueue*>(p); std::map<std::string, ListenerData*> listenerMap; - while(1) - { - try - { + while(1) { + try { std::string call_id = gCallIdQueue.front(); // waits for semaphor and returns next call_id gCallIdQueue.pop(); RtpSession& session = gRtpSessionTable.getSession(call_id); - if(!session.isComplete()) + if(!session.isComplete()) { continue; + } std::map<std::string, ListenerData*>::iterator it; it = listenerMap.find(call_id); - if(it == listenerMap.end()) // listener Threads not existing yet - { + if(it == listenerMap.end()) { // listener Threads not existing yet ListenerData* ld = new ListenerData(); ld->sock1_.open(session.getLocalEnd1().protocol()); @@ -181,8 +177,7 @@ void listenerManager(void* p) continue; } - if(!it->second->running1_ && !it->second->running2_) - { + if(!it->second->running1_ && !it->second->running2_) { cLog.msg(Log::PRIO_NOTICE) << "listenerManager both threads for '" << call_id << "' exited, cleaning up"; if(it->second->thread1_) { it->second->thread1_->join(); @@ -197,10 +192,8 @@ void listenerManager(void* p) gRtpSessionTable.delSession(call_id); continue; } - // TODO: reinit if session changed - } - catch(std::exception &e) - { + // TODO: reinit if session changed + } catch(std::exception& e) { cLog.msg(Log::PRIO_ERR) << "listenerManager restarting after exception: " << e.what(); usleep(500); // in case of an hard error don't block cpu (this is ugly) } @@ -210,33 +203,28 @@ void listenerManager(void* p) void chrootAndDrop(string const& chrootdir, string const& username) { - if (getuid() != 0) - { - std::cerr << "this program has to be run as root in order to run in a chroot" << std::endl; - exit(-1); - } - - struct passwd *pw = getpwnam(username.c_str()); - if(pw) { - if(chroot(chrootdir.c_str())) - { + if(getuid() != 0) { + std::cerr << "this program has to be run as root in order to run in a chroot" << std::endl; + exit(-1); + } + + struct passwd* pw = getpwnam(username.c_str()); + if(pw) { + if(chroot(chrootdir.c_str())) { std::cerr << "can't chroot to " << chrootdir << std::endl; exit(-1); - } + } std::cout << "we are in chroot jail (" << chrootdir << ") now" << std::endl; chdir("/"); - if (initgroups(pw->pw_name, pw->pw_gid) || setgid(pw->pw_gid) || setuid(pw->pw_uid)) - { - std::cerr << "can't drop to user " << username << " " << pw->pw_uid << ":" << pw->pw_gid << std::endl; - exit(-1); - } + if(initgroups(pw->pw_name, pw->pw_gid) || setgid(pw->pw_gid) || setuid(pw->pw_uid)) { + std::cerr << "can't drop to user " << username << " " << pw->pw_uid << ":" << pw->pw_gid << std::endl; + exit(-1); + } std::cout << "dropped user to " << username << " " << pw->pw_uid << ":" << pw->pw_gid << std::endl; - } - else - { + } else { std::cerr << "unknown user " << username << std::endl; exit(-1); - } + } } void daemonize() @@ -244,65 +232,62 @@ void daemonize() pid_t pid; pid = fork(); - if(pid) exit(0); + if(pid) { exit(0); } setsid(); pid = fork(); - if(pid) exit(0); - -// std::cout << "running in background now..." << std::endl; + if(pid) { exit(0); } + + // std::cout << "running in background now..." << std::endl; int fd; -// for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors - for (fd=0;fd<=2;fd++) // close all file descriptors + // for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors + for(fd=0; fd<=2; fd++) { // close all file descriptors close(fd); + } fd=open("/dev/null",O_RDWR); // stdin dup(fd); // stdout dup(fd); // stderr - umask(027); + umask(027); } class ThreadParam { public: - ThreadParam(SyncQueue & queue_,OptionConnectTo & connto_) + ThreadParam(SyncQueue& queue_,OptionConnectTo& connto_) : queue(queue_),connto(connto_) - {}; - SyncQueue & queue; - OptionConnectTo & connto; + {}; + SyncQueue& queue; + OptionConnectTo& connto; }; void syncConnector(void* p) { - ThreadParam* param = reinterpret_cast<ThreadParam*>(p); + ThreadParam* param = reinterpret_cast<ThreadParam*>(p); - SyncClient sc ( param->connto.host, param->connto.port); - sc.run(); + SyncClient sc(param->connto.host, param->connto.port); + sc.run(); } -void syncListener(SyncQueue * queue) +void syncListener(SyncQueue* queue) { - try - { + try { boost::asio::io_service io_service; - SyncTcpConnection::proto::resolver resolver(io_service); - SyncTcpConnection::proto::endpoint e; - if(gOpt.getLocalSyncAddr()!="") - { - SyncTcpConnection::proto::resolver::query query(gOpt.getLocalSyncAddr(), gOpt.getLocalSyncPort()); - e = *resolver.resolve(query); - } else { - SyncTcpConnection::proto::resolver::query query(gOpt.getLocalSyncPort()); - e = *resolver.resolve(query); - } + SyncTcpConnection::proto::resolver resolver(io_service); + SyncTcpConnection::proto::endpoint e; + if(gOpt.getLocalSyncAddr()!="") { + SyncTcpConnection::proto::resolver::query query(gOpt.getLocalSyncAddr(), gOpt.getLocalSyncPort()); + e = *resolver.resolve(query); + } else { + SyncTcpConnection::proto::resolver::query query(gOpt.getLocalSyncPort()); + e = *resolver.resolve(query); + } SyncServer server(io_service,e); - server.onConnect=boost::bind(syncOnConnect,_1); - queue->setSyncServerPtr(&server); + server.onConnect=boost::bind(syncOnConnect,_1); + queue->setSyncServerPtr(&server); io_service.run(); - } - catch (std::exception& e) - { + } catch(std::exception& e) { std::string addr = gOpt.getLocalSyncAddr() == "" ? "*" : gOpt.getLocalSyncAddr(); cLog.msg(Log::PRIO_ERR) << "sync: cannot bind to " << addr << ":" << gOpt.getLocalSyncPort() << " (" << e.what() << ")" << std::endl; @@ -312,9 +297,8 @@ void syncListener(SyncQueue * queue) int main(int argc, char* argv[]) { -// std::cout << "anyrtpproxy" << std::endl; - if(!gOpt.parse(argc, argv)) - { + // std::cout << "anyrtpproxy" << std::endl; + if(!gOpt.parse(argc, argv)) { gOpt.printUsage(); exit(-1); } @@ -330,17 +314,19 @@ int main(int argc, char* argv[]) } } - if(gOpt.getChroot()) + if(gOpt.getChroot()) { chrootAndDrop(gOpt.getChrootDir(), gOpt.getUsername()); - if(gOpt.getDaemonize()) + } + if(gOpt.getDaemonize()) { daemonize(); + } if(pidFile.is_open()) { pid_t pid = getpid(); pidFile << pid; pidFile.close(); } - + SignalController sig; sig.init(); @@ -350,38 +336,38 @@ int main(int argc, char* argv[]) boost::thread listenerManagerThread(boost::bind(listenerManager,&queue)); -// #ifndef ANYTUN_NOSYNC -// boost::thread * syncListenerThread; -// if(gOpt.getLocalSyncPort() != "") -// syncListenerThread = new boost::thread(boost::bind(syncListener,&queue)); - -// std::list<boost::thread *> connectThreads; -// for(ConnectToList::iterator it = connect_to.begin() ;it != connect_to.end(); ++it) { -// ThreadParam * point = new ThreadParam(dev, *src, cl, queue,*it); -// connectThreads.push_back(new boost::thread(boost::bind(syncConnector,point))); -// } -// #endif + // #ifndef ANYTUN_NOSYNC + // boost::thread * syncListenerThread; + // if(gOpt.getLocalSyncPort() != "") + // syncListenerThread = new boost::thread(boost::bind(syncListener,&queue)); + + // std::list<boost::thread *> connectThreads; + // for(ConnectToList::iterator it = connect_to.begin() ;it != connect_to.end(); ++it) { + // ThreadParam * point = new ThreadParam(dev, *src, cl, queue,*it); + // connectThreads.push_back(new boost::thread(boost::bind(syncConnector,point))); + // } + // #endif -// pthread_t syncListenerThread; + // pthread_t syncListenerThread; -// ConnectToList connect_to = gOpt.getConnectTo(); -// ThreadParam p( queue,*(new OptionConnectTo())); -// if ( gOpt.getLocalSyncPort()) -// pthread_create(&syncListenerThread, NULL, syncListener, &p); + // ConnectToList connect_to = gOpt.getConnectTo(); + // ThreadParam p( queue,*(new OptionConnectTo())); + // if ( gOpt.getLocalSyncPort()) + // pthread_create(&syncListenerThread, NULL, syncListener, &p); -// std::list<pthread_t> connectThreads; -// for(ConnectToList::iterator it = connect_to.begin() ;it != connect_to.end(); ++it) -// { -// connectThreads.push_back(pthread_t()); -// ThreadParam * point = new ThreadParam(queue,*it); -// pthread_create(& connectThreads.back(), NULL, syncConnector, point); -// } + // std::list<pthread_t> connectThreads; + // for(ConnectToList::iterator it = connect_to.begin() ;it != connect_to.end(); ++it) + // { + // connectThreads.push_back(pthread_t()); + // ThreadParam * point = new ThreadParam(queue,*it); + // pthread_create(& connectThreads.back(), NULL, syncConnector, point); + // } - PortWindow port_window(gOpt.getRtpStartPort(),gOpt.getRtpEndPort()); + PortWindow port_window(gOpt.getRtpStartPort(),gOpt.getRtpEndPort()); CommandHandler cmd(queue, gOpt.getControlInterface().addr_, gOpt.getControlInterface().port_,port_window); - + int ret = sig.run(); return ret; } diff --git a/src/anyrtpproxy/callIdQueue.cpp b/src/anyrtpproxy/callIdQueue.cpp index de48bab..514abf6 100644 --- a/src/anyrtpproxy/callIdQueue.cpp +++ b/src/anyrtpproxy/callIdQueue.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -40,9 +40,10 @@ CallIdQueue& CallIdQueue::instance() { Lock lock(instMutex); static instanceCleaner c; - if(!inst) + if(!inst) { inst = new CallIdQueue(); - + } + return *inst; } @@ -52,8 +53,9 @@ CallIdQueue::CallIdQueue() CallIdQueue::~CallIdQueue() { - while(!callids_.empty()) + while(!callids_.empty()) { pop(); + } } std::string& CallIdQueue::front() diff --git a/src/anyrtpproxy/callIdQueue.h b/src/anyrtpproxy/callIdQueue.h index 2cea155..4d6f7fc 100644 --- a/src/anyrtpproxy/callIdQueue.h +++ b/src/anyrtpproxy/callIdQueue.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -41,8 +41,8 @@ class CallIdQueue { public: - static CallIdQueue& instance(); - + static CallIdQueue& instance(); + std::string& front(); void push(std::string c); void pop(); @@ -51,15 +51,18 @@ private: CallIdQueue(); ~CallIdQueue(); - void operator=(const CallIdQueue &src); - CallIdQueue(const CallIdQueue &src); + void operator=(const CallIdQueue& src); + CallIdQueue(const CallIdQueue& src); static CallIdQueue* inst; static ::Mutex instMutex; - class instanceCleaner { - public: ~instanceCleaner() { - if(CallIdQueue::inst != 0) + class instanceCleaner + { + public: + ~instanceCleaner() { + if(CallIdQueue::inst != 0) { delete CallIdQueue::inst; + } } }; friend class instanceCleaner; diff --git a/src/anyrtpproxy/commandHandler.cpp b/src/anyrtpproxy/commandHandler.cpp index db0ca4d..72c3061 100644 --- a/src/anyrtpproxy/commandHandler.cpp +++ b/src/anyrtpproxy/commandHandler.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -50,23 +50,23 @@ #define MAX_COMMAND_LENGTH 1000 -CommandHandler::CommandHandler(SyncQueue& q, std::string lp,PortWindow & pw) : thread_(boost::bind(run,this)), - queue_(q), running_(true), control_sock_(io_service_), - local_address_(""), local_port_(lp),port_window_(pw) +CommandHandler::CommandHandler(SyncQueue& q, std::string lp,PortWindow& pw) : thread_(boost::bind(run,this)), + queue_(q), running_(true), control_sock_(io_service_), + local_address_(""), local_port_(lp),port_window_(pw) { proto::resolver resolver(io_service_); - proto::resolver::query query(local_port_); + proto::resolver::query query(local_port_); proto::endpoint e = *resolver.resolve(query); control_sock_.open(e.protocol()); control_sock_.bind(e); } -CommandHandler::CommandHandler(SyncQueue& q, string la, std::string lp, PortWindow & pw) : thread_(boost::bind(run,this)), - queue_(q), running_(true), control_sock_(io_service_), - local_address_(la), local_port_(lp),port_window_(pw) +CommandHandler::CommandHandler(SyncQueue& q, string la, std::string lp, PortWindow& pw) : thread_(boost::bind(run,this)), + queue_(q), running_(true), control_sock_(io_service_), + local_address_(la), local_port_(lp),port_window_(pw) { proto::resolver resolver(io_service_); - proto::resolver::query query(local_address_, local_port_); + proto::resolver::query query(local_address_, local_port_); proto::endpoint e = *resolver.resolve(query); control_sock_.open(e.protocol()); control_sock_.bind(e); @@ -77,13 +77,11 @@ void CommandHandler::run(void* s) CommandHandler* self = reinterpret_cast<CommandHandler*>(s); Buffer buf(u_int32_t(MAX_COMMAND_LENGTH)); - try - { + try { proto::endpoint remote_end; int len; - while(1) - { + while(1) { buf.setLength(MAX_COMMAND_LENGTH); len = self->control_sock_.receive_from(boost::asio::buffer(buf.getBuf(), buf.getLength()), remote_end); @@ -95,9 +93,7 @@ void CommandHandler::run(void* s) self->control_sock_.send_to(boost::asio::buffer(ret.c_str(), ret.length()), remote_end); } - } - catch(std::exception& e) - { + } catch(std::exception& e) { self->running_ = false; } self->running_ = false; @@ -133,8 +129,7 @@ std::string CommandHandler::handle(std::string command) params.push_back(tmp); } - switch(std::toupper(cmd[0])) - { + switch(std::toupper(cmd[0])) { case CMD_REQUEST: if(params.size() < 4) { oss << RET_ERR_SYNTAX; break; } oss << handleRequest(cmd.erase(0,1), params[0], params[1], params[2], params[3], (params.size() < 5) ? "" : params[4]); @@ -168,24 +163,21 @@ std::string CommandHandler::handle(std::string command) string CommandHandler::handleRequest(string modifiers, string call_id, string addr, string port, string from_tag, string to_tag) { - std::cout << "received request[" << modifiers << "] command ('" << call_id << "','" << addr << "','" << port + std::cout << "received request[" << modifiers << "] command ('" << call_id << "','" << addr << "','" << port << "','" << from_tag << "','" << to_tag << "')" << std::endl; - try - { + try { RtpSession::proto::resolver resolver(io_service_); bool is_new; RtpSession& session = gRtpSessionTable.getOrNewSession(call_id, is_new); - if(is_new) - { + if(is_new) { u_int16_t port1 = port_window_.newPort(); // TODO: get next available port u_int16_t port2 = port_window_.newPort(); // TODO: get next available port - if( !port1 || !port2) - { - if( port1) port_window_.freePort(port1); - if( port2) port_window_.freePort(port2); - throw std::runtime_error("no free port found"); - } + if(!port1 || !port2) { + if(port1) { port_window_.freePort(port1); } + if(port2) { port_window_.freePort(port2); } + throw std::runtime_error("no free port found"); + } std::stringstream ps1, ps2; ps1 << port1; ps2 << port2; @@ -196,8 +188,7 @@ string CommandHandler::handleRequest(string modifiers, string call_id, string ad e1 = *resolver.resolve(query1); RtpSession::proto::resolver::query query2(ps2.str()); e2 = *resolver.resolve(query2); - } - else { + } else { RtpSession::proto::resolver::query query1(gOpt.getLocalAddr(),ps1.str()); e1 = *resolver.resolve(query1); RtpSession::proto::resolver::query query2(gOpt.getLocalAddr(),ps2.str()); @@ -213,20 +204,17 @@ string CommandHandler::handleRequest(string modifiers, string call_id, string ad ostringstream oss; oss << session.getLocalEnd2().port(); return oss.str(); - } - catch(std::exception& e) - { + } catch(std::exception& e) { return RET_ERR_UNKNOWN; // TODO: change to corret error value } } string CommandHandler::handleResponse(string modifiers, string call_id, string addr, string port, string from_tag, string to_tag) { - std::cout << "received response[" << modifiers << "] command ('" << call_id << "','" << addr << "','" << port + std::cout << "received response[" << modifiers << "] command ('" << call_id << "','" << addr << "','" << port << "','" << from_tag << "','" << to_tag << "')" << std::endl; - try - { + try { RtpSession& session = gRtpSessionTable.getSession(call_id); RtpSession::proto::resolver resolver(io_service_); RtpSession::proto::resolver::query query(addr,port); @@ -238,9 +226,7 @@ string CommandHandler::handleResponse(string modifiers, string call_id, string a ostringstream oss; oss << session.getLocalEnd1().port(); return oss.str(); - } - catch(std::exception& e) - { + } catch(std::exception& e) { return RET_ERR_UNKNOWN; // TODO: change to corret error value } } @@ -249,39 +235,37 @@ string CommandHandler::handleDelete(string call_id, string from_tag, string to_t { std::cout << "received delete command ('" << call_id << "','" << from_tag << "','" << to_tag << "')" << std::endl; - try - { + try { RtpSession& session = gRtpSessionTable.getSession(call_id); session.isDead(true); SyncRtpCommand sc(call_id); queue_.push(sc); return RET_OK; - } - catch(std::exception& e) - { + } catch(std::exception& e) { return RET_ERR_UNKNOWN; // TODO: change to corret error value } } string CommandHandler::handleVersion() { - std::cout << "received version command" << std::endl; + std::cout << "received version command" << std::endl; return BASE_VERSION; } string CommandHandler::handleVersionF(string date_code) { - std::cout << "received version[F] command ('" << date_code << "')" << std::endl; - if(!date_code.compare(SUP_VERSION)) + std::cout << "received version[F] command ('" << date_code << "')" << std::endl; + if(!date_code.compare(SUP_VERSION)) { return "1"; - + } + return "0"; } string CommandHandler::handleInfo() { - std::cout << "received info command, ignoring" << std::endl; + std::cout << "received info command, ignoring" << std::endl; return RET_OK; } diff --git a/src/anyrtpproxy/commandHandler.h b/src/anyrtpproxy/commandHandler.h index 6634f14..954efc7 100644 --- a/src/anyrtpproxy/commandHandler.h +++ b/src/anyrtpproxy/commandHandler.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -46,31 +46,31 @@ class CommandHandler public: typedef boost::asio::ip::udp proto; - CommandHandler(SyncQueue& q, std::string lp, PortWindow &); - CommandHandler(SyncQueue& q, std::string la, std::string lp, PortWindow &); - + CommandHandler(SyncQueue& q, std::string lp, PortWindow&); + CommandHandler(SyncQueue& q, std::string la, std::string lp, PortWindow&); + bool isRunning(); - #define CMD_REQUEST 'U' - #define CMD_RESPONSE 'L' - #define CMD_DELETE 'D' - #define CMD_VERSION 'V' - #define CMD_INFO 'I' +#define CMD_REQUEST 'U' +#define CMD_RESPONSE 'L' +#define CMD_DELETE 'D' +#define CMD_VERSION 'V' +#define CMD_INFO 'I' - #define RET_OK "0" - #define RET_ERR_SYNTAX "E1" - #define RET_ERR_UNKNOWN "E2" +#define RET_OK "0" +#define RET_ERR_SYNTAX "E1" +#define RET_ERR_UNKNOWN "E2" - #define BASE_VERSION "20040107" - #define SUP_VERSION "20050322" +#define BASE_VERSION "20040107" +#define SUP_VERSION "20050322" private: - CommandHandler(const CommandHandler &c); - void operator=(const CommandHandler &c); + CommandHandler(const CommandHandler& c); + void operator=(const CommandHandler& c); static void run(void* s); std::string handle(std::string command); - + std::string handleRequest(std::string modifiers, std::string call_id, std::string addr, std::string port, std::string from_tag, std::string to_tag); std::string handleResponse(std::string modifiers, std::string call_id, std::string addr, std::string port, std::string from_tag, std::string to_tag); std::string handleDelete(std::string call_id, std::string from_tag, std::string to_tag); @@ -86,7 +86,7 @@ private: proto::socket control_sock_; std::string local_address_; std::string local_port_; - PortWindow& port_window_; + PortWindow& port_window_; }; diff --git a/src/anyrtpproxy/connectionList.cpp b/src/anyrtpproxy/connectionList.cpp index 4c274e8..e83a6ba 100644 --- a/src/anyrtpproxy/connectionList.cpp +++ b/src/anyrtpproxy/connectionList.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -38,15 +38,15 @@ ConnectionList::ConnectionList() ConnectionList::~ConnectionList() { -} +} -void ConnectionList::addConnection(ConnectionParam &conn, u_int16_t mux ) +void ConnectionList::addConnection(ConnectionParam& conn, u_int16_t mux) { } const ConnectionMap::iterator ConnectionList::getEnd() { - return connections_.end(); + return connections_.end(); } ConnectionMap::iterator ConnectionList::getBeginUnlocked() @@ -61,28 +61,28 @@ ConnectionMap::iterator ConnectionList::getEndUnlocked() const ConnectionMap::iterator ConnectionList::getConnection(u_int16_t mux) { - Lock lock(mutex_); - ConnectionMap::iterator it = connections_.find(mux); - return it; + Lock lock(mutex_); + ConnectionMap::iterator it = connections_.find(mux); + return it; } -ConnectionParam & ConnectionList::getOrNewConnectionUnlocked(u_int16_t mux) +ConnectionParam& ConnectionList::getOrNewConnectionUnlocked(u_int16_t mux) { - ConnectionMap::iterator it = connections_.find(mux); - return it->second; + ConnectionMap::iterator it = connections_.find(mux); + return it->second; } void ConnectionList::clear() { Lock lock(mutex_); - connections_.clear(); + connections_.clear(); } bool ConnectionList::empty() { Lock lock(mutex_); - return connections_.empty(); + return connections_.empty(); } Mutex& ConnectionList::getMutex() diff --git a/src/anyrtpproxy/connectionList.h b/src/anyrtpproxy/connectionList.h index a30f6d5..62da471 100644 --- a/src/anyrtpproxy/connectionList.h +++ b/src/anyrtpproxy/connectionList.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -44,22 +44,22 @@ typedef std::map<u_int16_t, ConnectionParam> ConnectionMap; class ConnectionList { public: - ConnectionList(); - ~ConnectionList(); - void addConnection(ConnectionParam &conn, u_int16_t mux); - const ConnectionMap::iterator getConnection(u_int16_t mux); - const ConnectionMap::iterator getEnd(); - ConnectionMap::iterator getEndUnlocked(); - ConnectionMap::iterator getBeginUnlocked(); - ConnectionParam & getOrNewConnectionUnlocked(u_int16_t mux); - bool empty(); - void clear(); + ConnectionList(); + ~ConnectionList(); + void addConnection(ConnectionParam& conn, u_int16_t mux); + const ConnectionMap::iterator getConnection(u_int16_t mux); + const ConnectionMap::iterator getEnd(); + ConnectionMap::iterator getEndUnlocked(); + ConnectionMap::iterator getBeginUnlocked(); + ConnectionParam& getOrNewConnectionUnlocked(u_int16_t mux); + bool empty(); + void clear(); Mutex& getMutex(); private: - ConnectionList(const ConnectionList &s); - void operator=(const ConnectionList &s); - ConnectionMap connections_; + ConnectionList(const ConnectionList& s); + void operator=(const ConnectionList& s); + ConnectionMap connections_; Mutex mutex_; }; diff --git a/src/anyrtpproxy/options.cpp b/src/anyrtpproxy/options.cpp index e651770..3fd9975 100644 --- a/src/anyrtpproxy/options.cpp +++ b/src/anyrtpproxy/options.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -45,9 +45,10 @@ Options& Options::instance() { Lock lock(instMutex); static instanceCleaner c; - if(!inst) + if(!inst) { inst = new Options(); - + } + return *inst; } @@ -56,34 +57,37 @@ void Host::splitAndSetAddrPort(std::string addr_port) if(addr_port.length() >= 2 && addr_port[0] == ':' && addr_port[1] != ':') { addr_ = ""; addr_port.erase(0,1); - std::stringstream tmp_stream(addr_port); + std::stringstream tmp_stream(addr_port); tmp_stream >> port_; return; } size_t pos = addr_port.find_first_of("["); - if(pos != std::string::npos && pos != 0) - return; // an [ was found but not at the beginning + if(pos != std::string::npos && pos != 0) { + return; // an [ was found but not at the beginning + } bool hasPort = false; if(pos != std::string::npos) { addr_port.erase(pos, 1); pos = addr_port.find_first_of("]"); - if(pos == std::string::npos) - return; // no trailing ] although an leading [ was found + if(pos == std::string::npos) { + return; // no trailing ] although an leading [ was found + } if(pos < addr_port.length()-2) { - if(addr_port[pos+1] != ':') - return; // wrong port delimieter + if(addr_port[pos+1] != ':') { + return; // wrong port delimieter + } addr_port[pos+1] = '/'; hasPort = true; + } else if(pos != addr_port.length()-1) { + return; // to few characters left } - else if(pos != addr_port.length()-1) - return; // to few characters left addr_port.erase(pos, 1); } @@ -92,12 +96,12 @@ void Host::splitAndSetAddrPort(std::string addr_port) std::stringstream tmp_stream(addr_port); getline(tmp_stream, addr_, '/'); - if(!tmp_stream.good()) + if(!tmp_stream.good()) { return; + } tmp_stream >> port_; - } - else { + } else { addr_ = addr_port; port_ = "2323"; // default sync port } @@ -114,11 +118,11 @@ Options::Options() : control_interface_("0.0.0.0", "22222") daemonize_ = true; pid_file_ = ""; local_addr_ = ""; - local_sync_port_ = ""; - rtp_start_port_ = 34000; - rtp_end_port_ = 35000; - no_nat_once_ = false; - nat_ = false; + local_sync_port_ = ""; + rtp_start_port_ = 34000; + rtp_end_port_ = 35000; + no_nat_once_ = false; + nat_ = false; } Options::~Options() @@ -205,13 +209,13 @@ bool Options::parse(int argc, char* argv[]) progname_ = argv[0]; std::queue<std::string> host_port_queue; argc--; - for(int i=1; argc > 0; ++i) - { + for(int i=1; argc > 0; ++i) { std::string str(argv[i]); argc--; - if(str == "-h" || str == "--help") + if(str == "-h" || str == "--help") { return false; + } PARSE_BOOL_PARAM("-t","--chroot", chroot_) PARSE_BOOL_PARAM("-n","--nat", nat_) PARSE_BOOL_PARAM("-o","--no-nat-once", no_nat_once_) @@ -222,30 +226,31 @@ bool Options::parse(int argc, char* argv[]) PARSE_SCALAR_PARAM("-i","--interface", local_addr_) PARSE_STRING_PARAM("-s","--control", control_interface_) PARSE_SCALAR_PARAM2("-p","--port-range", rtp_start_port_, rtp_end_port_) - PARSE_CSLIST_PARAM("-M","--sync-hosts", host_port_queue) + PARSE_CSLIST_PARAM("-M","--sync-hosts", host_port_queue) PARSE_SCALAR_PARAM("-S","--sync-port", local_sync_port_) PARSE_SCALAR_PARAM("-I","--sync-interface", local_sync_addr_) - else + else { return false; + } } - while(!host_port_queue.empty()) - { + while(!host_port_queue.empty()) { std::stringstream tmp_stream(host_port_queue.front()); OptionConnectTo oct; getline(tmp_stream,oct.host,':'); - if(!tmp_stream.good()) + if(!tmp_stream.good()) { return false; + } tmp_stream >> oct.port; host_port_queue.pop(); connect_to_.push_back(oct); } - + return sanityCheck(); } bool Options::sanityCheck() { - if(control_interface_.port_ == "") control_interface_.port_ = "22222"; + if(control_interface_.port_ == "") { control_interface_.port_ = "22222"; } return true; } diff --git a/src/anyrtpproxy/options.h b/src/anyrtpproxy/options.h index 679dace..8188831 100644 --- a/src/anyrtpproxy/options.h +++ b/src/anyrtpproxy/options.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -37,8 +37,7 @@ #include <list> #include <sstream> -typedef struct OptionConnectTo -{ +typedef struct OptionConnectTo { std::string host; std::string port; }; @@ -51,16 +50,15 @@ public: Host(std::string addr, std::string port) : addr_(addr), port_(port) {} Host(std::string addr_port) { splitAndSetAddrPort(addr_port); - } - std::string toString() const - { + } + std::string toString() const { std::ostringstream oss; oss << addr_ << ":" << port_; return oss.str(); } - + std::string addr_; - std::string port_; + std::string port_; protected: void splitAndSetAddrPort(std::string addr_port); @@ -89,28 +87,31 @@ public: std::string getLocalAddr(); Options& setLocalAddr(std::string l); std::string getLocalSyncAddr(); - Options& setLocalSyncAddr(std::string l); + Options& setLocalSyncAddr(std::string l); std::string getLocalSyncPort(); - Options& setLocalSyncPort(std::string l); + Options& setLocalSyncPort(std::string l); u_int16_t getRtpStartPort(); - Options& setRtpStartPort(u_int16_t l); + Options& setRtpStartPort(u_int16_t l); u_int16_t getRtpEndPort(); - Options& setRtpEndPort(u_int16_t l); + Options& setRtpEndPort(u_int16_t l); ConnectToList getConnectTo(); private: Options(); ~Options(); - Options(const Options &l); - void operator=(const Options &l); + Options(const Options& l); + void operator=(const Options& l); bool sanityCheck(); static Options* inst; static ::Mutex instMutex; - class instanceCleaner { - public: ~instanceCleaner() { - if(Options::inst != 0) + class instanceCleaner + { + public: + ~instanceCleaner() { + if(Options::inst != 0) { delete Options::inst; + } } }; friend class instanceCleaner; @@ -125,12 +126,12 @@ private: std::string chroot_dir_; std::string pid_file_; bool daemonize_; - std::string local_sync_addr_; - std::string local_sync_port_; + std::string local_sync_addr_; + std::string local_sync_port_; std::string local_addr_; - u_int16_t rtp_start_port_; - u_int16_t rtp_end_port_; - ConnectToList connect_to_; + u_int16_t rtp_start_port_; + u_int16_t rtp_end_port_; + ConnectToList connect_to_; Host control_interface_; }; diff --git a/src/anyrtpproxy/portWindow.cpp b/src/anyrtpproxy/portWindow.cpp index 3e07662..ed23686 100644 --- a/src/anyrtpproxy/portWindow.cpp +++ b/src/anyrtpproxy/portWindow.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -51,8 +51,9 @@ bool PortWindow::hasPort(u_int16_t port) Lock lock(mutex_); PortSet::const_iterator it=ports_.find(port); - if(it == ports_.end()) + if(it == ports_.end()) { return false; + } return true; } @@ -61,22 +62,25 @@ bool PortWindow::freePort(u_int16_t port) Lock lock(mutex_); PortSet::iterator it=ports_.find(port); - if(it == ports_.end()) + if(it == ports_.end()) { return false; - ports_.erase(it); + } + ports_.erase(it); return true; } u_int16_t PortWindow::newPort() { Lock lock(mutex_); - u_int16_t port= start_port_; - while (port<end_port_ && ports_.find(port) !=ports_.end()) - port++; - if (port>=end_port_) - return 0; - ports_.insert(port); - return port; + u_int16_t port= start_port_; + while(port<end_port_ && ports_.find(port) !=ports_.end()) { + port++; + } + if(port>=end_port_) { + return 0; + } + ports_.insert(port); + return port; } void PortWindow::clear() diff --git a/src/anyrtpproxy/portWindow.h b/src/anyrtpproxy/portWindow.h index b5a667f..74cd4ed 100644 --- a/src/anyrtpproxy/portWindow.h +++ b/src/anyrtpproxy/portWindow.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -53,13 +53,13 @@ public: private: - u_int16_t start_port_; - u_int16_t end_port_; + u_int16_t start_port_; + u_int16_t end_port_; ::Mutex mutex_; - PortSet ports_; + PortSet ports_; - PortWindow(const PortWindow &s); - void operator=(const PortWindow &s); + PortWindow(const PortWindow& s); + void operator=(const PortWindow& s); }; #endif diff --git a/src/anyrtpproxy/rtpSession.cpp b/src/anyrtpproxy/rtpSession.cpp index 93333ac..3afba33 100644 --- a/src/anyrtpproxy/rtpSession.cpp +++ b/src/anyrtpproxy/rtpSession.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -34,9 +34,9 @@ #include "callIdQueue.h" -RtpSession::RtpSession(const std::string& call_id) : in_sync_(false), call_id_(call_id) , dead_(false), complete_(false), - seen1_(false), seen2_(false) -{ +RtpSession::RtpSession(const std::string& call_id) : in_sync_(false), call_id_(call_id) , dead_(false), complete_(false), + seen1_(false), seen2_(false) +{ } void RtpSession::reinit() diff --git a/src/anyrtpproxy/rtpSession.h b/src/anyrtpproxy/rtpSession.h index cac5115..3247dcc 100644 --- a/src/anyrtpproxy/rtpSession.h +++ b/src/anyrtpproxy/rtpSession.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -45,7 +45,7 @@ class RtpSession public: typedef boost::asio::ip::udp proto; - RtpSession(const std::string& call_id); + RtpSession(const std::string& call_id); bool isDead(); bool isDead(bool d); @@ -63,71 +63,71 @@ public: proto::endpoint getRemoteEnd2(); RtpSession& setRemoteEnd2(proto::endpoint e); - RtpSession& setSeen1(); + RtpSession& setSeen1(); bool getSeen1(); - RtpSession& setSeen2(); + RtpSession& setSeen2(); bool getSeen2(); private: - RtpSession(const RtpSession & src); - + RtpSession(const RtpSession& src); + void reinit(); //TODO: check if this is ok friend class boost::serialization::access; template<class Archive> - void serialize(Archive & ar, const unsigned int version) - { + void serialize(Archive& ar, const unsigned int version) { Lock lock(mutex_); - // address of local_end1 and local_end2 are always equal - std::string local_addr(local_end1_.address().to_string()); - u_int16_t local_port1 = local_end1_.port(); - u_int16_t local_port2 = local_end2_.port(); - - std::string remote_addr1(remote_end1_.address().to_string()); - u_int16_t remote_port1 = remote_end1_.port(); - std::string remote_addr2(remote_end2_.address().to_string()); - u_int16_t remote_port2 = remote_end2_.port(); - - ar & dead_; - ar & complete_; - ar & local_addr; - ar & local_port1; - ar & local_port2; - ar & remote_addr1; - ar & remote_port1; - ar & remote_addr2; - ar & remote_port2; - ar & seen1_; - ar & seen2_; - - proto::endpoint local_end1(boost::asio::ip::address::from_string(local_addr), local_port1); + // address of local_end1 and local_end2 are always equal + std::string local_addr(local_end1_.address().to_string()); + u_int16_t local_port1 = local_end1_.port(); + u_int16_t local_port2 = local_end2_.port(); + + std::string remote_addr1(remote_end1_.address().to_string()); + u_int16_t remote_port1 = remote_end1_.port(); + std::string remote_addr2(remote_end2_.address().to_string()); + u_int16_t remote_port2 = remote_end2_.port(); + + ar& dead_; + ar& complete_; + ar& local_addr; + ar& local_port1; + ar& local_port2; + ar& remote_addr1; + ar& remote_port1; + ar& remote_addr2; + ar& remote_port2; + ar& seen1_; + ar& seen2_; + + proto::endpoint local_end1(boost::asio::ip::address::from_string(local_addr), local_port1); local_end1_ = local_end1; - proto::endpoint local_end2(boost::asio::ip::address::from_string(local_addr), local_port2); - local_end2_ = local_end2; + proto::endpoint local_end2(boost::asio::ip::address::from_string(local_addr), local_port2); + local_end2_ = local_end2; - proto::endpoint remote_end1(boost::asio::ip::address::from_string(remote_addr1), remote_port1); - remote_end1_ = remote_end1; - proto::endpoint remote_end2(boost::asio::ip::address::from_string(remote_addr2), remote_port2); - remote_end2_ = remote_end2; + proto::endpoint remote_end1(boost::asio::ip::address::from_string(remote_addr1), remote_port1); + remote_end1_ = remote_end1; + proto::endpoint remote_end2(boost::asio::ip::address::from_string(remote_addr2), remote_port2); + remote_end2_ = remote_end2; - if(complete_ && !dead_) + if(complete_ && !dead_) { reinit(); + } in_sync_ = true; - } + } bool in_sync_; - ::Mutex mutex_; + ::Mutex mutex_; const std::string& call_id_; bool dead_; bool complete_; proto::endpoint local_end1_, local_end2_; proto::endpoint remote_end1_, remote_end2_; - bool seen1_,seen2_; //has at least 1 packet been recieved? + bool seen1_,seen2_; //has at least 1 packet been recieved? }; diff --git a/src/anyrtpproxy/rtpSessionTable.cpp b/src/anyrtpproxy/rtpSessionTable.cpp index 934cf8c..de7b031 100644 --- a/src/anyrtpproxy/rtpSessionTable.cpp +++ b/src/anyrtpproxy/rtpSessionTable.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -43,8 +43,9 @@ RtpSessionTable& RtpSessionTable::instance() { Lock lock(instMutex); static instanceCleaner c; - if(!inst) + if(!inst) { inst = new RtpSessionTable(); + } return *inst; } @@ -55,31 +56,33 @@ RtpSessionTable::RtpSessionTable() RtpSessionTable::~RtpSessionTable() { -} +} -void RtpSessionTable::delSession(const std::string & call_id) +void RtpSessionTable::delSession(const std::string& call_id) { Lock lock(mutex_); RtpSessionMap::iterator it = map_.find(call_id); - if(it!=map_.end()) + if(it!=map_.end()) { delete it->second; + } map_.erase(it); } -RtpSession& RtpSessionTable::getOrNewSession(const std::string & call_id, bool& is_new) +RtpSession& RtpSessionTable::getOrNewSession(const std::string& call_id, bool& is_new) { Lock lock(mutex_); return getOrNewSessionUnlocked(call_id, is_new); } -RtpSession& RtpSessionTable::getOrNewSessionUnlocked(const std::string & call_id, bool& is_new) +RtpSession& RtpSessionTable::getOrNewSessionUnlocked(const std::string& call_id, bool& is_new) { is_new = false; RtpSessionMap::iterator it = map_.find(call_id); - if(it!=map_.end()) + if(it!=map_.end()) { return *(it->second); + } is_new = true; std::pair<RtpSessionMap::iterator, bool> ret = map_.insert(RtpSessionMap::value_type(call_id, NULL)); @@ -87,11 +90,12 @@ RtpSession& RtpSessionTable::getOrNewSessionUnlocked(const std::string & call_id return *(ret.first->second); } -RtpSession& RtpSessionTable::getSession(const std::string & call_id) +RtpSession& RtpSessionTable::getSession(const std::string& call_id) { RtpSessionMap::iterator it = map_.find(call_id); - if(it!=map_.end()) + if(it!=map_.end()) { return *(it->second); + } throw std::runtime_error("session not found"); } @@ -109,13 +113,13 @@ RtpSessionMap::iterator RtpSessionTable::getEndUnlocked() void RtpSessionTable::clear() { Lock lock(mutex_); - map_.clear(); + map_.clear(); } bool RtpSessionTable::empty() { Lock lock(mutex_); - return map_.empty(); + return map_.empty(); } Mutex& RtpSessionTable::getMutex() diff --git a/src/anyrtpproxy/rtpSessionTable.h b/src/anyrtpproxy/rtpSessionTable.h index 49a062f..79be6cc 100644 --- a/src/anyrtpproxy/rtpSessionTable.h +++ b/src/anyrtpproxy/rtpSessionTable.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -43,31 +43,34 @@ typedef std::map<std::string,RtpSession*> RtpSessionMap; class RtpSessionTable { public: - static RtpSessionTable& instance(); - RtpSessionTable(); - ~RtpSessionTable(); - void delSession(const std::string & call_id); - bool empty(); - void clear(); + static RtpSessionTable& instance(); + RtpSessionTable(); + ~RtpSessionTable(); + void delSession(const std::string& call_id); + bool empty(); + void clear(); ::Mutex& getMutex(); - RtpSessionMap::iterator getBeginUnlocked(); - RtpSessionMap::iterator getEndUnlocked(); - RtpSession& getOrNewSession(const std::string & call_id, bool& isnew); - RtpSession& getOrNewSessionUnlocked(const std::string & call_id, bool& isnew); - RtpSession& getSession(const std::string & call_id); + RtpSessionMap::iterator getBeginUnlocked(); + RtpSessionMap::iterator getEndUnlocked(); + RtpSession& getOrNewSession(const std::string& call_id, bool& isnew); + RtpSession& getOrNewSessionUnlocked(const std::string& call_id, bool& isnew); + RtpSession& getSession(const std::string& call_id); private: static ::Mutex instMutex; - static RtpSessionTable* inst; - class instanceCleaner { - public: ~instanceCleaner() { - if(RtpSessionTable::inst != 0) - delete RtpSessionTable::inst; - } - }; - RtpSessionTable(const RtpSessionTable &s); - void operator=(const RtpSessionTable &s); - RtpSessionMap map_; + static RtpSessionTable* inst; + class instanceCleaner + { + public: + ~instanceCleaner() { + if(RtpSessionTable::inst != 0) { + delete RtpSessionTable::inst; + } + } + }; + RtpSessionTable(const RtpSessionTable& s); + void operator=(const RtpSessionTable& s); + RtpSessionMap map_; ::Mutex mutex_; }; diff --git a/src/anyrtpproxy/syncRtpCommand.cpp b/src/anyrtpproxy/syncRtpCommand.cpp index 10dfbf4..e1d5147 100644 --- a/src/anyrtpproxy/syncRtpCommand.cpp +++ b/src/anyrtpproxy/syncRtpCommand.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -32,16 +32,16 @@ #include "syncRtpCommand.h" SyncRtpCommand::SyncRtpCommand() -{ +{ } -SyncRtpCommand::SyncRtpCommand( const std::string & addr ) -:callid_(addr) -{ +SyncRtpCommand::SyncRtpCommand(const std::string& addr) + :callid_(addr) +{ } -std::string SyncRtpCommand::getCallId() const +std::string SyncRtpCommand::getCallId() const { - return callid_; + return callid_; } diff --git a/src/anyrtpproxy/syncRtpCommand.h b/src/anyrtpproxy/syncRtpCommand.h index 7b4c186..31b333c 100644 --- a/src/anyrtpproxy/syncRtpCommand.h +++ b/src/anyrtpproxy/syncRtpCommand.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -40,22 +40,21 @@ class SyncRtpCommand { public: - SyncRtpCommand(const std::string & ); - SyncRtpCommand(); - std::string getCallId() const; + SyncRtpCommand(const std::string&); + SyncRtpCommand(); + std::string getCallId() const; private: - SyncRtpCommand(const SyncRtpCommand &); - std::string callid_; + SyncRtpCommand(const SyncRtpCommand&); + std::string callid_; friend class boost::serialization::access; template<class Archive> - void serialize(Archive & ar, const unsigned int version) - { - Lock lock(gRtpSessionTable.getMutex()); - ar & callid_; + void serialize(Archive& ar, const unsigned int version) { + Lock lock(gRtpSessionTable.getMutex()); + ar& callid_; bool is_new; - ar & gRtpSessionTable.getOrNewSessionUnlocked(callid_, is_new); - }; + ar& gRtpSessionTable.getOrNewSessionUnlocked(callid_, is_new); + }; }; diff --git a/src/anytun-config.cpp b/src/anytun-config.cpp index d09f1e8..43c4ada 100644 --- a/src/anytun-config.cpp +++ b/src/anytun-config.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -51,15 +51,15 @@ -void createConnection(const PacketSourceEndpoint & remote_end, ConnectionList & cl, u_int16_t seqSize, SyncQueue & queue, mux_t mux, Semaphore& sem) +void createConnection(const PacketSourceEndpoint& remote_end, ConnectionList& cl, u_int16_t seqSize, SyncQueue& queue, mux_t mux, Semaphore& sem) { - SeqWindow * seq = new SeqWindow(seqSize); + SeqWindow* seq = new SeqWindow(seqSize); seq_nr_t seq_nr_ = 0; - KeyDerivation * kd = KeyDerivationFactory::create(gOpt.getKdPrf()); + KeyDerivation* kd = KeyDerivationFactory::create(gOpt.getKdPrf()); kd->init(gOpt.getKey(), gOpt.getSalt(), gOpt.getPassphrase()); kd->setRole(gOpt.getRole()); cLog.msg(Log::PRIO_NOTICE) << "added connection remote host " << remote_end; - ConnectionParam connparam ((*kd), (*seq), seq_nr_, remote_end); + ConnectionParam connparam((*kd), (*seq), seq_nr_, remote_end); cl.addConnection(connparam, mux); std::ostringstream sout; @@ -71,24 +71,23 @@ void createConnection(const PacketSourceEndpoint & remote_end, ConnectionList & NetworkList routes = gOpt.getRoutes(); NetworkList::const_iterator rit; - for(rit = routes.begin(); rit != routes.end(); ++rit) - { + for(rit = routes.begin(); rit != routes.end(); ++rit) { NetworkAddress addr(rit->net_addr.c_str()); NetworkPrefix prefix(addr, rit->prefix_length); - + gRoutingTable.addRoute(prefix, mux); - + std::ostringstream sout2; boost::archive::text_oarchive oa2(sout2); const SyncCommand scom2(prefix); - + oa2 << scom2; std::cout << std::setw(5) << std::setfill('0') << sout2.str().size()<< ' ' << sout2.str() << std::endl; - } + } sem.up(); } -void createConnectionResolver(PacketSourceResolverIt& it, ConnectionList & cl, u_int16_t seqSize, SyncQueue & queue, mux_t mux, Semaphore& sem) +void createConnectionResolver(PacketSourceResolverIt& it, ConnectionList& cl, u_int16_t seqSize, SyncQueue& queue, mux_t mux, Semaphore& sem) { createConnection(*it, cl, seqSize, queue, mux, sem); } @@ -102,38 +101,37 @@ void createConnectionError(const std::exception& e, Semaphore& sem, int& ret) int main(int argc, char* argv[]) { - try - { - if(!gOpt.parse(argc, argv)) + try { + if(!gOpt.parse(argc, argv)) { exit(0); + } StringList targets = gOpt.getLogTargets(); - for(StringList::const_iterator it = targets.begin();it != targets.end(); ++it) + for(StringList::const_iterator it = targets.begin(); it != targets.end(); ++it) { cLog.addTarget(*it); - } - catch(syntax_error& e) - { + } + } catch(syntax_error& e) { std::cerr << e << std::endl; gOpt.printUsage(); exit(-1); } - gOpt.parse_post(); // print warnings + gOpt.parse_post(); // print warnings gResolver.init(); - ConnectionList cl; - SyncQueue queue; + ConnectionList cl; + SyncQueue queue; Semaphore sem; int ret = 0; - UDPPacketSource::proto::endpoint endpoint; - // allow emtpy endpoint!!! - gResolver.resolveUdp(gOpt.getRemoteAddr(), gOpt.getRemotePort(), - boost::bind(createConnectionResolver, _1, boost::ref(cl), gOpt.getSeqWindowSize(), boost::ref(queue), gOpt.getMux(), boost::ref(sem)), - boost::bind(createConnectionError, _1, boost::ref(sem), boost::ref(ret)), - gOpt.getResolvAddrType()); - sem.down(); + UDPPacketSource::proto::endpoint endpoint; + // allow emtpy endpoint!!! + gResolver.resolveUdp(gOpt.getRemoteAddr(), gOpt.getRemotePort(), + boost::bind(createConnectionResolver, _1, boost::ref(cl), gOpt.getSeqWindowSize(), boost::ref(queue), gOpt.getMux(), boost::ref(sem)), + boost::bind(createConnectionError, _1, boost::ref(sem), boost::ref(ret)), + gOpt.getResolvAddrType()); + sem.down(); return ret; } diff --git a/src/anytun-controld.cpp b/src/anytun-controld.cpp index 767db53..c4813ca 100644 --- a/src/anytun-controld.cpp +++ b/src/anytun-controld.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -51,26 +51,22 @@ std::list<std::string> config_; -void syncOnConnect(SyncTcpConnection * connptr) +void syncOnConnect(SyncTcpConnection* connptr) { - for(std::list<std::string>::const_iterator it=config_.begin(); it!=config_.end();++it) - { + for(std::list<std::string>::const_iterator it=config_.begin(); it!=config_.end(); ++it) { connptr->Send(*it); } } void syncListener() { - boost::asio::io_service io_service; - try - { + boost::asio::io_service io_service; + try { SyncServer server(gOpt.getBindToAddr(), gOpt.getBindToPort(), boost::bind(syncOnConnect, _1)); server.run(); - } - catch(std::runtime_error& e) { + } catch(std::runtime_error& e) { cLog.msg(Log::PRIO_ERROR) << "sync listener thread died due to an uncaught runtime_error: " << e.what(); - } - catch(std::exception& e) { + } catch(std::exception& e) { cLog.msg(Log::PRIO_ERROR) << "sync listener thread died due to an uncaught exception: " << e.what(); } } @@ -78,73 +74,70 @@ void syncListener() int main(int argc, char* argv[]) { DaemonService service; - try - { - try - { - if(!gOpt.parse(argc, argv)) + try { + try { + if(!gOpt.parse(argc, argv)) { exit(0); + } StringList targets = gOpt.getLogTargets(); - for(StringList::const_iterator it = targets.begin();it != targets.end(); ++it) + for(StringList::const_iterator it = targets.begin(); it != targets.end(); ++it) { cLog.addTarget(*it); - } - catch(syntax_error& e) - { + } + } catch(syntax_error& e) { std::cerr << e << std::endl; gOpt.printUsage(); exit(-1); } - - cLog.msg(Log::PRIO_NOTICE) << "anytun-controld started..."; + + cLog.msg(Log::PRIO_NOTICE) << "anytun-controld started..."; gOpt.parse_post(); // print warnings - std::ifstream file( gOpt.getFileName().c_str() ); - if( file.is_open() ) - { - std::string line; - while (!file.eof()) { - getline (file,line); + std::ifstream file(gOpt.getFileName().c_str()); + if(file.is_open()) { + std::string line; + while(!file.eof()) { + getline(file,line); config_.push_back(line); - } + } file.close(); } else { std::cout << "ERROR: unable to open file!" << std::endl; exit(-1); } - + service.initPrivs(gOpt.getUsername(), gOpt.getGroupname()); - if(gOpt.getDaemonize()) + if(gOpt.getDaemonize()) { service.daemonize(); + } - if(gOpt.getChrootDir() != "") + if(gOpt.getChrootDir() != "") { service.chroot(gOpt.getChrootDir()); + } service.dropPrivs(); gSignalController.init(service); gResolver.init(); - boost::thread * syncListenerThread; + boost::thread* syncListenerThread; syncListenerThread = new boost::thread(boost::bind(syncListener)); - + int ret = gSignalController.run(); - + return ret; - } - catch(std::runtime_error& e) - { - if(service.isDaemonized()) + } catch(std::runtime_error& e) { + if(service.isDaemonized()) { cLog.msg(Log::PRIO_ERROR) << "uncaught runtime error, exiting: " << e.what(); - else + } else { std::cout << "uncaught runtime error, exiting: " << e.what() << std::endl; - } - catch(std::exception& e) - { - if(service.isDaemonized()) + } + } catch(std::exception& e) { + if(service.isDaemonized()) { cLog.msg(Log::PRIO_ERROR) << "uncaught exception, exiting: " << e.what(); - else + } else { std::cout << "uncaught exception, exiting: " << e.what() << std::endl; + } } } diff --git a/src/anytun-showtables.cpp b/src/anytun-showtables.cpp index ff851c9..7e1e6ae 100644 --- a/src/anytun-showtables.cpp +++ b/src/anytun-showtables.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -51,86 +51,78 @@ void output() { - ConnectionList &cl(gConnectionList); - if( !cl.empty() ) - { - ConnectionMap::iterator it = cl.getBeginUnlocked(); - mux_t mux = it->first; - ConnectionParam &conn( it->second ); - std::cout << "Client " << mux << ": " ; - if( conn.remote_end_==PacketSourceEndpoint()) - { - std::cout<< "not registered"; - } else { - std::cout<< conn.remote_end_; - } - std::cout << std::endl; + ConnectionList& cl(gConnectionList); + if(!cl.empty()) { + ConnectionMap::iterator it = cl.getBeginUnlocked(); + mux_t mux = it->first; + ConnectionParam& conn(it->second); + std::cout << "Client " << mux << ": " ; + if(conn.remote_end_==PacketSourceEndpoint()) { + std::cout<< "not registered"; + } else { + std::cout<< conn.remote_end_; + } + std::cout << std::endl; //std::cout << "Connection: Keyderivation-Type: " << conn.kd_.printType() << std::endl; cl.clear(); - } else { - network_address_type_t types[] = {ipv4,ipv6,ethernet}; - for (int types_idx=0; types_idx<3; types_idx++) - { - network_address_type_t type = types[types_idx]; - if( !gRoutingTable.empty(type) ) - { - RoutingMap::iterator it = gRoutingTable.getBeginUnlocked(type); - NetworkPrefix pref( it->first ); - std::cout << "Route: " << pref.toString() << "/" << (int)pref.getNetworkPrefixLength() << " -> "; - mux_t mux = it->second; - std::cout << mux << std::endl; - gRoutingTable.clear(type); - } - } - } + } else { + network_address_type_t types[] = {ipv4,ipv6,ethernet}; + for(int types_idx=0; types_idx<3; types_idx++) { + network_address_type_t type = types[types_idx]; + if(!gRoutingTable.empty(type)) { + RoutingMap::iterator it = gRoutingTable.getBeginUnlocked(type); + NetworkPrefix pref(it->first); + std::cout << "Route: " << pref.toString() << "/" << (int)pref.getNetworkPrefixLength() << " -> "; + mux_t mux = it->second; + std::cout << mux << std::endl; + gRoutingTable.clear(type); + } + } + } } -void readExactly(size_t toread, std::iostream & result) +void readExactly(size_t toread, std::iostream& result) { size_t hasread = 0; - while (toread > hasread && std::cin.good()) - { - char a[1]; - std::cin.read(a,1); - result.write(a,1); - hasread++; + while(toread > hasread && std::cin.good()) { + char a[1]; + std::cin.read(a,1); + result.write(a,1); + hasread++; } } void readAndProcessOne() { size_t message_lenght ; - std::stringstream message_lenght_stream; - readExactly(5,message_lenght_stream); - message_lenght_stream >> message_lenght; - std::stringstream void_stream; - readExactly(1,void_stream); //skip space - if (!message_lenght) - return; - std::stringstream sync_command_stream; - readExactly(message_lenght, sync_command_stream); - //std::cout << message_lenght << std::endl; - //std::cout << sync_command_stream.str()<< std::endl; - boost::archive::text_iarchive ia(sync_command_stream); - SyncCommand scom(gConnectionList); - ia >> scom; + std::stringstream message_lenght_stream; + readExactly(5,message_lenght_stream); + message_lenght_stream >> message_lenght; + std::stringstream void_stream; + readExactly(1,void_stream); //skip space + if(!message_lenght) { + return; + } + std::stringstream sync_command_stream; + readExactly(message_lenght, sync_command_stream); + //std::cout << message_lenght << std::endl; + //std::cout << sync_command_stream.str()<< std::endl; + boost::archive::text_iarchive ia(sync_command_stream); + SyncCommand scom(gConnectionList); + ia >> scom; } int main(int argc, char* argv[]) { int ret = 0; - while( std::cin.good() ) - { - try - { - readAndProcessOne(); - } - catch(std::exception& e) - { - std::cout << "uncaught exception, exiting: " << e.what() << std::endl; - } - output(); + while(std::cin.good()) { + try { + readAndProcessOne(); + } catch(std::exception& e) { + std::cout << "uncaught exception, exiting: " << e.what() << std::endl; + } + output(); } return ret; } diff --git a/src/anytun.cpp b/src/anytun.cpp index 1ac9397..16c20b4 100644 --- a/src/anytun.cpp +++ b/src/anytun.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -84,18 +84,18 @@ bool disableRouting = false; void createConnection(const PacketSourceEndpoint& remote_end, window_size_t seqSize, mux_t mux) { - SeqWindow* seq = new SeqWindow(seqSize); - seq_nr_t seq_nr_=0; - KeyDerivation * kd = KeyDerivationFactory::create(gOpt.getKdPrf()); + SeqWindow* seq = new SeqWindow(seqSize); + seq_nr_t seq_nr_=0; + KeyDerivation* kd = KeyDerivationFactory::create(gOpt.getKdPrf()); kd->init(gOpt.getKey(), gOpt.getSalt(), gOpt.getPassphrase()); kd->setRole(gOpt.getRole()); cLog.msg(Log::PRIO_NOTICE) << "added connection remote host " << remote_end; - ConnectionParam connparam ((*kd), (*seq), seq_nr_, remote_end); - gConnectionList.addConnection(connparam,mux); + ConnectionParam connparam((*kd), (*seq), seq_nr_, remote_end); + gConnectionList.addConnection(connparam,mux); #ifndef ANYTUN_NOSYNC - SyncCommand sc (gConnectionList,mux); - gSyncQueue.push(sc); + SyncCommand sc(gConnectionList,mux); + gSyncQueue.push(sc); #endif } @@ -118,16 +118,13 @@ void syncConnector(const OptionHost& connto) void syncListener() { - try - { + try { SyncServer server(gOpt.getLocalSyncAddr(), gOpt.getLocalSyncPort(), boost::bind(syncOnConnect, _1)); gSyncQueue.setSyncServerPtr(&server); server.run(); - } - catch(std::runtime_error& e) { + } catch(std::runtime_error& e) { cLog.msg(Log::PRIO_ERROR) << "sync listener thread died due to an uncaught runtime_error: " << e.what(); - } - catch(std::exception& e) { + } catch(std::exception& e) { cLog.msg(Log::PRIO_ERROR) << "sync listener thread died due to an uncaught exception: " << e.what(); } } @@ -136,88 +133,91 @@ void syncListener() void sender(TunDevice* dev, PacketSource* src) { if(!dev || !src) { - cLog.msg(Log::PRIO_ERROR) << "sender thread died because either dev or src pointer is null"; + cLog.msg(Log::PRIO_ERROR) << "sender thread died because either dev or src pointer is null"; return; } - try - { + try { std::auto_ptr<Cipher> c(CipherFactory::create(gOpt.getCipher(), KD_OUTBOUND)); - std::auto_ptr<AuthAlgo> a(AuthAlgoFactory::create(gOpt.getAuthAlgo(), KD_OUTBOUND) ); - + std::auto_ptr<AuthAlgo> a(AuthAlgoFactory::create(gOpt.getAuthAlgo(), KD_OUTBOUND)); + PlainPacket plain_packet(MAX_PACKET_LENGTH); EncryptedPacket encrypted_packet(MAX_PACKET_LENGTH, gOpt.getAuthTagLength()); - + u_int16_t mux = gOpt.getMux(); PacketSourceEndpoint emptyEndpoint; while(1) { plain_packet.setLength(MAX_PACKET_LENGTH); encrypted_packet.withAuthTag(false); encrypted_packet.setLength(MAX_PACKET_LENGTH); - - // read packet from device + + // read packet from device int len = dev->read(plain_packet.getPayload(), plain_packet.getPayloadLength()); - if(len < 0) - continue; // silently ignore device read errors, this is probably no good idea... + if(len < 0) { + continue; // silently ignore device read errors, this is probably no good idea... + } - if(static_cast<u_int32_t>(len) < PlainPacket::getHeaderLength()) - continue; // ignore short packets + if(static_cast<u_int32_t>(len) < PlainPacket::getHeaderLength()) { + continue; // ignore short packets + } plain_packet.setPayloadLength(len); - // set payload type - if(dev->getType() == TYPE_TUN) + // set payload type + if(dev->getType() == TYPE_TUN) { plain_packet.setPayloadType(PAYLOAD_TYPE_TUN); - else if(dev->getType() == TYPE_TAP) + } else if(dev->getType() == TYPE_TAP) { plain_packet.setPayloadType(PAYLOAD_TYPE_TAP); - else + } else { plain_packet.setPayloadType(0); - - if(gConnectionList.empty()) + } + + if(gConnectionList.empty()) { continue; - //std::cout << "got Packet for plain "<<plain_packet.getDstAddr().toString(); - ConnectionMap::iterator cit; + } + //std::cout << "got Packet for plain "<<plain_packet.getDstAddr().toString(); + ConnectionMap::iterator cit; #ifndef NO_ROUTING - if (!disableRouting) - try { - mux = gRoutingTable.getRoute(plain_packet.getDstAddr()); - //std::cout << " -> "<<mux << std::endl; - cit = gConnectionList.getConnection(mux); - } catch (std::exception&) { continue; } // no route - else - cit = gConnectionList.getBegin(); + if(!disableRouting) + try { + mux = gRoutingTable.getRoute(plain_packet.getDstAddr()); + //std::cout << " -> "<<mux << std::endl; + cit = gConnectionList.getConnection(mux); + } catch(std::exception&) { continue; } // no route + else { + cit = gConnectionList.getBegin(); + } #else - cit = gConnectionList.getBegin(); + cit = gConnectionList.getBegin(); #endif - if(cit==gConnectionList.getEnd()) - continue; //no connection - ConnectionParam & conn = cit->second; - + if(cit==gConnectionList.getEnd()) { + continue; //no connection + } + ConnectionParam& conn = cit->second; + if(conn.remote_end_ == emptyEndpoint) { //cLog.msg(Log::PRIO_INFO) << "no remote address set"; continue; } - // encrypt packet + // encrypt packet c->encrypt(conn.kd_, plain_packet, encrypted_packet, conn.seq_nr_, gOpt.getSenderId(), mux); - + encrypted_packet.setHeader(conn.seq_nr_, gOpt.getSenderId(), mux); conn.seq_nr_++; - - // add authentication tag + + // add authentication tag a->generate(conn.kd_, encrypted_packet); try { src->send(encrypted_packet.getBuf(), encrypted_packet.getLength(), conn.remote_end_); - } catch (std::exception& /*e*/) { - //TODO: do something here - //cLog.msg(Log::PRIO_ERROR) << "could not send data: " << e.what(); - } + } catch(std::exception& /*e*/) { + //TODO: do something here + //cLog.msg(Log::PRIO_ERROR) << "could not send data: " << e.what(); + } } - } - catch(std::runtime_error& e) { + } catch(std::runtime_error& e) { cLog.msg(Log::PRIO_ERROR) << "sender thread died due to an uncaught runtime_error: " << e.what(); - } - catch(std::exception& e) { + } catch(std::exception& e) { cLog.msg(Log::PRIO_ERROR) << "sender thread died due to an uncaught exception: " << e.what(); } } @@ -225,98 +225,100 @@ void sender(TunDevice* dev, PacketSource* src) void receiver(TunDevice* dev, PacketSource* src) { if(!dev || !src) { - cLog.msg(Log::PRIO_ERROR) << "receiver thread died because either dev or src pointer is null"; + cLog.msg(Log::PRIO_ERROR) << "receiver thread died because either dev or src pointer is null"; return; } - try - { + try { std::auto_ptr<Cipher> c(CipherFactory::create(gOpt.getCipher(), KD_INBOUND)); std::auto_ptr<AuthAlgo> a(AuthAlgoFactory::create(gOpt.getAuthAlgo(), KD_INBOUND)); - + u_int32_t auth_tag_length = gOpt.getAuthTagLength(); EncryptedPacket encrypted_packet(MAX_PACKET_LENGTH, auth_tag_length); PlainPacket plain_packet(MAX_PACKET_LENGTH); - + while(1) { PacketSourceEndpoint remote_end; plain_packet.setLength(MAX_PACKET_LENGTH); encrypted_packet.withAuthTag(false); encrypted_packet.setLength(MAX_PACKET_LENGTH); - - // read packet from socket + + // read packet from socket int len; try { len = src->recv(encrypted_packet.getBuf(), encrypted_packet.getLength(), remote_end); - } catch (std::exception& /*e*/) { - //TODO: do something here - //cLog.msg(Log::PRIO_ERROR) << "could not recive packet "<< e.what(); - continue; - } - if(len < 0) - continue; // silently ignore socket recv errors, this is probably no good idea... - - if(static_cast<u_int32_t>(len) < (EncryptedPacket::getHeaderLength() + auth_tag_length)) - continue; // ignore short packets + } catch(std::exception& /*e*/) { + //TODO: do something here + //cLog.msg(Log::PRIO_ERROR) << "could not recive packet "<< e.what(); + continue; + } + if(len < 0) { + continue; // silently ignore socket recv errors, this is probably no good idea... + } + + if(static_cast<u_int32_t>(len) < (EncryptedPacket::getHeaderLength() + auth_tag_length)) { + continue; // ignore short packets + } encrypted_packet.setLength(len); - + mux_t mux = encrypted_packet.getMux(); - // autodetect peer - if( gConnectionList.empty() && gOpt.getRemoteAddr() == "") { + // autodetect peer + if(gConnectionList.empty() && gOpt.getRemoteAddr() == "") { cLog.msg(Log::PRIO_NOTICE) << "autodetected remote host " << remote_end; createConnection(remote_end, gOpt.getSeqWindowSize(),mux); } - + ConnectionMap::iterator cit = gConnectionList.getConnection(mux); - if (cit == gConnectionList.getEnd()) + if(cit == gConnectionList.getEnd()) { continue; - ConnectionParam & conn = cit->second; - - // check whether auth tag is ok or not + } + ConnectionParam& conn = cit->second; + + // check whether auth tag is ok or not if(!a->checkTag(conn.kd_, encrypted_packet)) { cLog.msg(Log::PRIO_NOTICE) << "wrong Authentication Tag!"; continue; - } + } - // Replay Protection + // Replay Protection if(conn.seq_window_.checkAndAdd(encrypted_packet.getSenderId(), encrypted_packet.getSeqNr())) { - cLog.msg(Log::PRIO_NOTICE) << "Replay attack from " << conn.remote_end_ + cLog.msg(Log::PRIO_NOTICE) << "Replay attack from " << conn.remote_end_ << " seq:"<< encrypted_packet.getSeqNr() << " sid: "<< encrypted_packet.getSenderId(); continue; } - - //Allow dynamic IP changes - //TODO: add command line option to turn this off - if (remote_end != conn.remote_end_) { + + //Allow dynamic IP changes + //TODO: add command line option to turn this off + if(remote_end != conn.remote_end_) { cLog.msg(Log::PRIO_NOTICE) << "connection "<< mux << " autodetected remote host ip changed " << remote_end; conn.remote_end_=remote_end; #ifndef ANYTUN_NOSYNC - SyncCommand sc (gConnectionList,mux); + SyncCommand sc(gConnectionList,mux); gSyncQueue.push(sc); #endif - } - // ignore zero length packets - if(encrypted_packet.getPayloadLength() <= PlainPacket::getHeaderLength()) + } + // ignore zero length packets + if(encrypted_packet.getPayloadLength() <= PlainPacket::getHeaderLength()) { continue; + } - // decrypt packet + // decrypt packet c->decrypt(conn.kd_, encrypted_packet, plain_packet); - - // check payload_type - if((dev->getType() == TYPE_TUN && plain_packet.getPayloadType() != PAYLOAD_TYPE_TUN4 && - plain_packet.getPayloadType() != PAYLOAD_TYPE_TUN6) || - (dev->getType() == TYPE_TAP && plain_packet.getPayloadType() != PAYLOAD_TYPE_TAP)) + + // check payload_type + if((dev->getType() == TYPE_TUN && plain_packet.getPayloadType() != PAYLOAD_TYPE_TUN4 && + plain_packet.getPayloadType() != PAYLOAD_TYPE_TUN6) || + (dev->getType() == TYPE_TAP && plain_packet.getPayloadType() != PAYLOAD_TYPE_TAP)) { continue; - - // write it on the device + } + + // write it on the device dev->write(plain_packet.getPayload(), plain_packet.getLength()); } - } - catch(std::runtime_error& e) { + } catch(std::runtime_error& e) { cLog.msg(Log::PRIO_ERROR) << "receiver thread died due to an uncaught runtime_error: " << e.what(); - } - catch(std::exception& e) { + } catch(std::exception& e) { cLog.msg(Log::PRIO_ERROR) << "receiver thread died due to an uncaught exception: " << e.what(); } } @@ -324,9 +326,9 @@ void receiver(TunDevice* dev, PacketSource* src) void startSendRecvThreads(TunDevice* dev, PacketSource* src) { src->waitUntilReady(); - + boost::thread(boost::bind(sender, dev, src)); - boost::thread(boost::bind(receiver, dev, src)); + boost::thread(boost::bind(receiver, dev, src)); } @@ -336,23 +338,18 @@ int main(int argc, char* argv[]) try { if(argc > 1) { if(std::string(argv[1]) == "install") { - WinService::install(); + WinService::install(); return 0; - } - else if(std::string(argv[1]) == "uninstall") { - WinService::uninstall(); + } else if(std::string(argv[1]) == "uninstall") { + WinService::uninstall(); return 0; } } WinService::start(); return 0; - } - catch(std::runtime_error& e) - { + } catch(std::runtime_error& e) { std::cout << "caught runtime error, exiting: " << e.what() << std::endl; - } - catch(std::exception& e) - { + } catch(std::exception& e) { std::cout << "caught exception, exiting: " << e.what() << std::endl; } } @@ -363,20 +360,18 @@ int real_main(int argc, char* argv[], WinService& service) int main(int argc, char* argv[]) { DaemonService service; -#endif - try - { - try - { - if(!gOpt.parse(argc, argv)) +#endif + try { + try { + if(!gOpt.parse(argc, argv)) { exit(0); + } StringList targets = gOpt.getLogTargets(); - for(StringList::const_iterator it = targets.begin();it != targets.end(); ++it) + for(StringList::const_iterator it = targets.begin(); it != targets.end(); ++it) { cLog.addTarget(*it); - } - catch(syntax_error& e) - { + } + } catch(syntax_error& e) { std::cerr << e << std::endl; gOpt.printUsage(); exit(-1); @@ -385,17 +380,18 @@ int main(int argc, char* argv[]) cLog.msg(Log::PRIO_NOTICE) << "anytun started..."; gOpt.parse_post(); // print warnings - // daemonizing has to done before any thread gets started + // daemonizing has to done before any thread gets started service.initPrivs(gOpt.getUsername(), gOpt.getGroupname()); - if(gOpt.getDaemonize()) + if(gOpt.getDaemonize()) { service.daemonize(); + } OptionNetwork net = gOpt.getIfconfigParam(); TunDevice dev(gOpt.getDevName(), gOpt.getDevType(), net.net_addr, net.prefix_length); cLog.msg(Log::PRIO_NOTICE) << "dev opened - name '" << dev.getActualName() << "', node '" << dev.getActualNode() << "'"; cLog.msg(Log::PRIO_NOTICE) << "dev type is '" << dev.getTypeString() << "'"; - SysExec * postup_script = NULL; + SysExec* postup_script = NULL; if(gOpt.getPostUpScript() != "") { cLog.msg(Log::PRIO_NOTICE) << "executing post-up script '" << gOpt.getPostUpScript() << "'"; StringVector args = boost::assign::list_of(dev.getActualName())(dev.getActualNode()); @@ -405,8 +401,7 @@ int main(int argc, char* argv[]) if(gOpt.getChrootDir() != "") { try { service.chroot(gOpt.getChrootDir()); - } - catch(const std::runtime_error& e) { + } catch(const std::runtime_error& e) { cLog.msg(Log::PRIO_WARNING) << "ignoring chroot error: " << e.what(); } } @@ -416,68 +411,70 @@ int main(int argc, char* argv[]) gSignalController.init(service); gResolver.init(); boost::thread(boost::bind(&TunDevice::waitUntilReady,&dev)); - if (postup_script) + if(postup_script) { boost::thread(boost::bind(&SysExec::waitAndDestroy,postup_script)); + } + + initCrypto(); - initCrypto(); - PacketSource* src = new UDPPacketSource(gOpt.getLocalAddr(), gOpt.getLocalPort()); - if(gOpt.getRemoteAddr() != "") + if(gOpt.getRemoteAddr() != "") { gResolver.resolveUdp(gOpt.getRemoteAddr(), gOpt.getRemotePort(), boost::bind(createConnectionResolver, _1, gOpt.getSeqWindowSize(), gOpt.getMux()), boost::bind(createConnectionError, _1), gOpt.getResolvAddrType()); + } HostList connect_to = gOpt.getRemoteSyncHosts(); #ifndef NO_ROUTING NetworkList routes = gOpt.getRoutes(); - NetworkList::const_iterator rit; - for(rit = routes.begin(); rit != routes.end(); ++rit) { - NetworkAddress addr( rit->net_addr ); - NetworkPrefix prefix( addr, static_cast<u_int8_t>(rit->prefix_length)); - gRoutingTable.addRoute( prefix, gOpt.getMux() ); - } - if (connect_to.begin() == connect_to.end() || gOpt.getDevType()!="tun") { - cLog.msg(Log::PRIO_NOTICE) << "No sync/control host defined or not a tun device. Disabling multi connection support (routing)"; - disableRouting=true; - } + NetworkList::const_iterator rit; + for(rit = routes.begin(); rit != routes.end(); ++rit) { + NetworkAddress addr(rit->net_addr); + NetworkPrefix prefix(addr, static_cast<u_int8_t>(rit->prefix_length)); + gRoutingTable.addRoute(prefix, gOpt.getMux()); + } + if(connect_to.begin() == connect_to.end() || gOpt.getDevType()!="tun") { + cLog.msg(Log::PRIO_NOTICE) << "No sync/control host defined or not a tun device. Disabling multi connection support (routing)"; + disableRouting=true; + } #endif #ifndef ANYTUN_NOSYNC boost::thread* syncListenerThread = NULL; - if(gOpt.getLocalSyncPort() != "") + if(gOpt.getLocalSyncPort() != "") { syncListenerThread = new boost::thread(boost::bind(syncListener)); - + } + boost::thread_group connectThreads; - for(HostList::const_iterator it = connect_to.begin() ;it != connect_to.end(); ++it) + for(HostList::const_iterator it = connect_to.begin() ; it != connect_to.end(); ++it) { connectThreads.create_thread(boost::bind(syncConnector, *it)); + } #endif // wait for packet source to finish in a seperate thread in order // to be still able to process signals while waiting boost::thread(boost::bind(startSendRecvThreads, &dev, src)); - int ret = gSignalController.run(); + int ret = gSignalController.run(); -// TODO: stop all threads and cleanup -// -// if(src) -// delete src; -// if(connTo) -// delete connTo; - return ret; - } - catch(std::runtime_error& e) - { + // TODO: stop all threads and cleanup + // + // if(src) + // delete src; + // if(connTo) + // delete connTo; + return ret; + } catch(std::runtime_error& e) { cLog.msg(Log::PRIO_ERROR) << "uncaught runtime error, exiting: " << e.what(); - if(!service.isDaemonized()) + if(!service.isDaemonized()) { std::cout << "uncaught runtime error, exiting: " << e.what() << std::endl; - } - catch(std::exception& e) - { + } + } catch(std::exception& e) { cLog.msg(Log::PRIO_ERROR) << "uncaught exception, exiting: " << e.what(); - if(!service.isDaemonized()) + if(!service.isDaemonized()) { std::cout << "uncaught exception, exiting: " << e.what() << std::endl; + } } return -1; } - - + + diff --git a/src/anytunError.cpp b/src/anytunError.cpp index 60bf8eb..20595b3 100644 --- a/src/anytunError.cpp +++ b/src/anytunError.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. diff --git a/src/anytunError.h b/src/anytunError.h index d500545..616450c 100644 --- a/src/anytunError.h +++ b/src/anytunError.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -61,7 +61,7 @@ public: }; std::ostream& operator<<(std::ostream& stream, AnytunErrno const& value); -class ErrorStringBuilder +class ErrorStringBuilder { public: ErrorStringBuilder(ErrorStringBuilder const& src) { stream << src.stream.str(); }; diff --git a/src/authAlgo.cpp b/src/authAlgo.cpp index f9228c6..75f6a86 100644 --- a/src/authAlgo.cpp +++ b/src/authAlgo.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -59,7 +59,7 @@ Sha1AuthAlgo::Sha1AuthAlgo(kd_dir_t d) : AuthAlgo(d), key_(DIGEST_LENGTH) if(err) { cLog.msg(Log::PRIO_ERROR) << "Sha1AuthAlgo::Sha1AuthAlgo: Failed to open message digest algo"; return; - } + } #else HMAC_CTX_init(&ctx_); HMAC_Init_ex(&ctx_, NULL, 0, EVP_sha1(), NULL); @@ -69,31 +69,34 @@ Sha1AuthAlgo::Sha1AuthAlgo(kd_dir_t d) : AuthAlgo(d), key_(DIGEST_LENGTH) Sha1AuthAlgo::~Sha1AuthAlgo() { #ifndef USE_SSL_CRYPTO - if(handle_) + if(handle_) { gcry_md_close(handle_); + } #else HMAC_CTX_cleanup(&ctx_); -#endif +#endif } void Sha1AuthAlgo::generate(KeyDerivation& kd, EncryptedPacket& packet) { #ifndef USE_SSL_CRYPTO - if(!handle_) + if(!handle_) { return; + } #endif packet.addAuthTag(); - if(!packet.getAuthTagLength()) + if(!packet.getAuthTagLength()) { return; - + } + kd.generate(dir_, LABEL_AUTH, packet.getSeqNr(), key_); #ifndef USE_SSL_CRYPTO gcry_error_t err = gcry_md_setkey(handle_, key_.getBuf(), key_.getLength()); if(err) { cLog.msg(Log::PRIO_ERROR) << "Sha1AuthAlgo::setKey: Failed to set hmac key: " << AnytunGpgError(err); return; - } + } gcry_md_reset(handle_); gcry_md_write(handle_, packet.getAuthenticatedPortion(), packet.getAuthenticatedPortionLength()); @@ -110,8 +113,9 @@ void Sha1AuthAlgo::generate(KeyDerivation& kd, EncryptedPacket& packet) u_int8_t* tag = packet.getAuthTag(); u_int32_t length = (packet.getAuthTagLength() < DIGEST_LENGTH) ? packet.getAuthTagLength() : DIGEST_LENGTH; - if(length > DIGEST_LENGTH) + if(length > DIGEST_LENGTH) { std::memset(tag, 0, packet.getAuthTagLength()); + } std::memcpy(&tag[packet.getAuthTagLength() - length], &hmac[DIGEST_LENGTH - length], length); } @@ -119,13 +123,15 @@ void Sha1AuthAlgo::generate(KeyDerivation& kd, EncryptedPacket& packet) bool Sha1AuthAlgo::checkTag(KeyDerivation& kd, EncryptedPacket& packet) { #ifndef USE_SSL_CRYPTO - if(!handle_) + if(!handle_) { return false; + } #endif packet.withAuthTag(true); - if(!packet.getAuthTagLength()) + if(!packet.getAuthTagLength()) { return true; + } kd.generate(dir_, LABEL_AUTH, packet.getSeqNr(), key_); #ifndef USE_SSL_CRYPTO @@ -133,15 +139,15 @@ bool Sha1AuthAlgo::checkTag(KeyDerivation& kd, EncryptedPacket& packet) if(err) { cLog.msg(Log::PRIO_ERROR) << "Sha1AuthAlgo::setKey: Failed to set hmac key: " << AnytunGpgError(err); return false; - } - + } + gcry_md_reset(handle_); gcry_md_write(handle_, packet.getAuthenticatedPortion(), packet.getAuthenticatedPortionLength()); gcry_md_final(handle_); u_int8_t* hmac = gcry_md_read(handle_, 0); #else HMAC_Init_ex(&ctx_, key_.getBuf(), key_.getLength(), EVP_sha1(), NULL); - + u_int8_t hmac[DIGEST_LENGTH]; HMAC_Update(&ctx_, packet.getAuthenticatedPortion(), packet.getAuthenticatedPortionLength()); HMAC_Final(&ctx_, hmac, NULL); @@ -152,13 +158,14 @@ bool Sha1AuthAlgo::checkTag(KeyDerivation& kd, EncryptedPacket& packet) if(length > DIGEST_LENGTH) for(u_int32_t i=0; i < (packet.getAuthTagLength() - DIGEST_LENGTH); ++i) - if(tag[i]) return false; + if(tag[i]) { return false; } int ret = std::memcmp(&tag[packet.getAuthTagLength() - length], &hmac[DIGEST_LENGTH - length], length); packet.removeAuthTag(); - - if(ret) + + if(ret) { return false; + } return true; diff --git a/src/authAlgo.h b/src/authAlgo.h index 1c7fa1b..c616f84 100644 --- a/src/authAlgo.h +++ b/src/authAlgo.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -100,7 +100,7 @@ private: #else HMAC_CTX ctx_; #endif - + Buffer key_; }; #endif diff --git a/src/authAlgoFactory.cpp b/src/authAlgoFactory.cpp index d1b2fc5..c96027a 100644 --- a/src/authAlgoFactory.cpp +++ b/src/authAlgoFactory.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -39,25 +39,31 @@ AuthAlgo* AuthAlgoFactory::create(std::string const& type, kd_dir_t dir) { - if(type == "null") + if(type == "null") { return new NullAuthAlgo(); + } #ifndef NO_CRYPT - else if(type == "sha1") + else if(type == "sha1") { return new Sha1AuthAlgo(dir); + } #endif - else + else { throw std::invalid_argument("auth algo not available"); + } } u_int32_t AuthAlgoFactory::getDigestLength(std::string const& type) { - if(type == "null") + if(type == "null") { return NullAuthAlgo::DIGEST_LENGTH; + } #ifndef NO_CRYPT - else if(type == "sha1") + else if(type == "sha1") { return Sha1AuthAlgo::DIGEST_LENGTH; + } #endif - else + else { throw std::invalid_argument("auth algo not available"); + } } diff --git a/src/authAlgoFactory.h b/src/authAlgoFactory.h index db3125b..597539c 100644 --- a/src/authAlgoFactory.h +++ b/src/authAlgoFactory.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. diff --git a/src/bsd/tunDevice.cpp b/src/bsd/tunDevice.cpp index 9cd58df..87f8578 100644 --- a/src/bsd/tunDevice.cpp +++ b/src/bsd/tunDevice.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -71,14 +71,14 @@ TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifc else if(conf_.type_ == TYPE_TUN) { device_file.append("tun"); actual_name_ = "tun"; - } - else if(conf_.type_ == TYPE_TAP) { + } else if(conf_.type_ == TYPE_TAP) { device_file.append("tap"); actual_name_ = "tap"; } #endif - else + else { AnytunError::throwErr() << "unable to recognize type of device (tun or tap)"; + } u_int32_t dev_id=0; if(dynamic) { @@ -87,18 +87,20 @@ TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifc ds << device_file; ds << dev_id; fd_ = ::open(ds.str().c_str(), O_RDWR); - if(fd_ >= 0) + if(fd_ >= 0) { break; + } } - } - else + } else { fd_ = ::open(device_file.c_str(), O_RDWR); + } if(fd_ < 0) { - if(dynamic) + if(dynamic) { AnytunError::throwErr() << "can't open device file dynamically: no unused node left"; - else + } else { AnytunError::throwErr() << "can't open device file (" << device_file << "): " << AnytunErrno(errno); + } } if(dynamic) { @@ -106,22 +108,24 @@ TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifc s << actual_name_; s << dev_id; actual_name_ = s.str(); - } - else + } else { actual_name_ = dev_name; - + } + actual_node_ = device_file; init_post(); - if(ifcfg_addr != "") + if(ifcfg_addr != "") { do_ifconfig(); + } } TunDevice::~TunDevice() { - if(fd_ > 0) + if(fd_ > 0) { ::close(fd_); + } } #if defined(__GNUC__) && defined(__OpenBSD__) @@ -129,21 +133,23 @@ TunDevice::~TunDevice() void TunDevice::init_post() { with_pi_ = true; - if(conf_.type_ == TYPE_TAP) + if(conf_.type_ == TYPE_TAP) { with_pi_ = false; - - struct tuninfo ti; + } + + struct tuninfo ti; - if (ioctl(fd_, TUNGIFINFO, &ti) < 0) { + if(ioctl(fd_, TUNGIFINFO, &ti) < 0) { ::close(fd_); AnytunError::throwErr() << "can't enable multicast for interface: " << AnytunErrno(errno); } - + ti.flags |= IFF_MULTICAST; - if(conf_.type_ == TYPE_TUN) + if(conf_.type_ == TYPE_TUN) { ti.flags &= ~IFF_POINTOPOINT; - - if (ioctl(fd_, TUNSIFINFO, &ti) < 0) { + } + + if(ioctl(fd_, TUNSIFINFO, &ti) < 0) { ::close(fd_); AnytunError::throwErr() << "can't enable multicast for interface: " << AnytunErrno(errno); } @@ -154,8 +160,9 @@ void TunDevice::init_post() void TunDevice::init_post() { with_pi_ = true; - if(conf_.type_ == TYPE_TAP) + if(conf_.type_ == TYPE_TAP) { with_pi_ = false; + } if(conf_.type_ == TYPE_TUN) { int arg = 0; @@ -192,63 +199,68 @@ void TunDevice::init_post() } #else - #error This Device works just for OpenBSD, FreeBSD or NetBSD +#error This Device works just for OpenBSD, FreeBSD or NetBSD #endif int TunDevice::fix_return(int ret, size_t pi_length) const { - if(ret < 0) + if(ret < 0) { return ret; + } return (static_cast<size_t>(ret) > pi_length ? (ret - pi_length) : 0); } int TunDevice::read(u_int8_t* buf, u_int32_t len) { - if(fd_ < 0) + if(fd_ < 0) { return -1; - + } + if(with_pi_) { struct iovec iov[2]; u_int32_t type; - + iov[0].iov_base = &type; iov[0].iov_len = sizeof(type); iov[1].iov_base = buf; iov[1].iov_len = len; return(fix_return(::readv(fd_, iov, 2), sizeof(type))); - } - else + } else { return(::read(fd_, buf, len)); + } } int TunDevice::write(u_int8_t* buf, u_int32_t len) { - if(fd_ < 0) + if(fd_ < 0) { return -1; - - if(!buf) + } + + if(!buf) { return 0; + } if(with_pi_) { struct iovec iov[2]; u_int32_t type; - struct ip *hdr = reinterpret_cast<struct ip*>(buf); - + struct ip* hdr = reinterpret_cast<struct ip*>(buf); + type = 0; - if(hdr->ip_v == 4) + if(hdr->ip_v == 4) { type = htonl(AF_INET); - else + } else { type = htonl(AF_INET6); - + } + iov[0].iov_base = &type; iov[0].iov_len = sizeof(type); iov[1].iov_base = buf; iov[1].iov_len = len; return(fix_return(::writev(fd_, iov, 2), sizeof(type))); - } - else + } else { return(::write(fd_, buf, len)); + } } void TunDevice::do_ifconfig() @@ -257,17 +269,17 @@ void TunDevice::do_ifconfig() mtu_ss << conf_.mtu_; StringVector args = boost::assign::list_of(actual_name_)(conf_.addr_.toString())("netmask")(conf_.netmask_.toString())("mtu")(mtu_ss.str()); - if(conf_.type_ == TYPE_TUN) + if(conf_.type_ == TYPE_TUN) { args.push_back("up"); - else { + } else { #if defined(__GNUC__) && defined(__OpenBSD__) args.push_back("link0"); #elif defined(__GNUC__) && (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) args.push_back("up"); #elif defined(__GNUC__) && defined(__NetBSD__) - // nothing to be done here + // nothing to be done here #else - #error This Device works just for OpenBSD, FreeBSD or NetBSD +#error This Device works just for OpenBSD, FreeBSD or NetBSD #endif } sys_exec_ = new SysExec("/sbin/ifconfig", args); @@ -275,7 +287,8 @@ void TunDevice::do_ifconfig() void TunDevice::waitUntilReady() { - if(sys_exec_) + if(sys_exec_) { SysExec::waitAndDestroy(sys_exec_); + } } diff --git a/src/buffer.cpp b/src/buffer.cpp index 574c034..c4b0c5c 100644 --- a/src/buffer.cpp +++ b/src/buffer.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -41,11 +41,11 @@ #include "buffer.h" Buffer::Buffer(bool allow_realloc) : buf_(0), length_(0), real_length_(0), allow_realloc_(allow_realloc) -{ +{ } -Buffer::Buffer(u_int32_t length, bool allow_realloc) : length_(length), real_length_(length_ + Buffer::OVER_SIZE_), - allow_realloc_(allow_realloc) +Buffer::Buffer(u_int32_t length, bool allow_realloc) : length_(length), real_length_(length_ + Buffer::OVER_SIZE_), + allow_realloc_(allow_realloc) { buf_ = new u_int8_t[real_length_]; if(!buf_) { @@ -56,8 +56,8 @@ Buffer::Buffer(u_int32_t length, bool allow_realloc) : length_(length), real_len std::memset(buf_, 0, real_length_); } -Buffer::Buffer(u_int8_t* data, u_int32_t length, bool allow_realloc) : length_(length), real_length_(length + Buffer::OVER_SIZE_), - allow_realloc_(allow_realloc) +Buffer::Buffer(u_int8_t* data, u_int32_t length, bool allow_realloc) : length_(length), real_length_(length + Buffer::OVER_SIZE_), + allow_realloc_(allow_realloc) { if(!data) { length_ = 0; @@ -74,9 +74,9 @@ Buffer::Buffer(u_int8_t* data, u_int32_t length, bool allow_realloc) : length_(l std::memcpy(buf_, data, length_); } -Buffer::Buffer(std::string hex_data, bool allow_realloc) : length_(static_cast<u_int32_t>(hex_data.size())/2), - real_length_(length_ + Buffer::OVER_SIZE_), - allow_realloc_(allow_realloc) +Buffer::Buffer(std::string hex_data, bool allow_realloc) : length_(static_cast<u_int32_t>(hex_data.size())/2), + real_length_(length_ + Buffer::OVER_SIZE_), + allow_realloc_(allow_realloc) { buf_ = new u_int8_t[real_length_]; if(!buf_) { @@ -84,23 +84,23 @@ Buffer::Buffer(std::string hex_data, bool allow_realloc) : length_(static_cast<u real_length_ = 0; throw std::bad_alloc(); } - - for(u_int32_t i=0; i<length_; ++i) - { + + for(u_int32_t i=0; i<length_; ++i) { u_int32_t tmp; std::istringstream ss(std::string(hex_data.c_str(), i*2, 2)); - if(!(ss >> std::hex >> tmp)) tmp = 0; + if(!(ss >> std::hex >> tmp)) { tmp = 0; } buf_[i] = static_cast<u_int8_t>(tmp); } } Buffer::~Buffer() { - if(buf_) + if(buf_) { delete[] buf_; + } } -Buffer::Buffer(const Buffer &src) : length_(src.length_), real_length_(src.real_length_), allow_realloc_(src.allow_realloc_) +Buffer::Buffer(const Buffer& src) : length_(src.length_), real_length_(src.real_length_), allow_realloc_(src.allow_realloc_) { buf_ = new u_int8_t[real_length_]; if(!buf_) { @@ -111,15 +111,16 @@ Buffer::Buffer(const Buffer &src) : length_(src.length_), real_length_(src.real_ std::memcpy(buf_, src.buf_, length_); } -void Buffer::operator=(const Buffer &src) +void Buffer::operator=(const Buffer& src) { - if(buf_) + if(buf_) { delete[] buf_; - + } + length_ = src.length_; - real_length_ = src.real_length_; + real_length_ = src.real_length_; allow_realloc_ = src.allow_realloc_; - + buf_ = new u_int8_t[real_length_]; if(!buf_) { length_ = 0; @@ -129,26 +130,29 @@ void Buffer::operator=(const Buffer &src) std::memcpy(buf_, src.buf_, length_); } -bool Buffer::operator==(const Buffer &cmp) const +bool Buffer::operator==(const Buffer& cmp) const { - if(length_ != cmp.length_) + if(length_ != cmp.length_) { return false; + } - if(!std::memcmp(buf_, cmp.buf_, length_)) + if(!std::memcmp(buf_, cmp.buf_, length_)) { return true; + } return false; } -Buffer Buffer::operator^(const Buffer &xor_by) const +Buffer Buffer::operator^(const Buffer& xor_by) const { u_int32_t res_length = (xor_by.length_ > length_) ? xor_by.length_ : length_; u_int32_t min_length = (xor_by.length_ < length_) ? xor_by.length_ : length_; Buffer res(res_length); - for( u_int32_t index = 0; index < min_length; index++ ) + for(u_int32_t index = 0; index < min_length; index++) { res[index] = buf_[index] ^ xor_by[index]; - + } + return res; } @@ -159,42 +163,45 @@ u_int32_t Buffer::getLength() const void Buffer::setLength(u_int32_t new_length) { - if(new_length == length_) + if(new_length == length_) { return; + } - if(new_length > real_length_) - { - if(!allow_realloc_) + if(new_length > real_length_) { + if(!allow_realloc_) { throw std::out_of_range("buffer::setLength() - reallocation not allowed for this Buffer"); + } u_int8_t* old_buf = buf_; u_int32_t old_length = length_; length_ = new_length; real_length_ = length_ + Buffer::OVER_SIZE_; - + buf_ = new u_int8_t[real_length_]; if(!buf_) { length_ = 0; real_length_ = 0; - if(old_buf) + if(old_buf) { delete[] old_buf; - + } + throw std::bad_alloc(); } std::memcpy(buf_, old_buf, old_length); - if(old_buf) + if(old_buf) { delete[] old_buf; + } old_buf = &buf_[old_length]; std::memset(old_buf, 0, real_length_ - old_length); - } - else + } else { length_ = new_length; + } reinit(); -} +} u_int8_t* Buffer::getBuf() @@ -204,16 +211,18 @@ u_int8_t* Buffer::getBuf() u_int8_t& Buffer::operator[](u_int32_t index) { - if(index >= length_) + if(index >= length_) { throw std::out_of_range("buffer::operator[]"); + } return buf_[index]; } u_int8_t Buffer::operator[](u_int32_t index) const { - if(index >= length_) + if(index >= length_) { throw std::out_of_range("buffer::operator[] const"); + } return buf_[index]; } @@ -227,15 +236,15 @@ std::string Buffer::getHexDump() const { std::stringstream ss; ss << "Length=" << length_ << std::endl << std::hex << std::uppercase; - for( u_int32_t index = 0; index < length_; index++ ) - { + for(u_int32_t index = 0; index < length_; index++) { ss << std::setw(2) << std::setfill('0') << u_int32_t(buf_[index]) << " "; if(!((index+1) % 16)) { ss << std::endl; continue; } - if(!((index+1) % 8)) + if(!((index+1) % 8)) { ss << " "; + } } return ss.str(); } @@ -244,8 +253,7 @@ std::string Buffer::getHexDumpOneLine() const { std::stringstream ss; ss << length_ << " Bytes,'" << std::hex << std::uppercase; - for( u_int32_t index = 0; index < length_; index++ ) - { + for(u_int32_t index = 0; index < length_; index++) { ss << std::setw(2) << std::setfill('0') << u_int32_t(buf_[index]); } ss << "'"; diff --git a/src/buffer.h b/src/buffer.h index bbece3d..4dafd5e 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -47,10 +47,10 @@ public: Buffer(u_int8_t* data, u_int32_t length, bool allow_realloc = true); Buffer(std::string hex_data, bool allow_realloc = true); virtual ~Buffer(); - Buffer(const Buffer &src); - void operator=(const Buffer &src); - bool operator==(const Buffer &cmp) const; - Buffer operator^(const Buffer &xor_by) const; + Buffer(const Buffer& src); + void operator=(const Buffer& src); + bool operator==(const Buffer& cmp) const; + Buffer operator^(const Buffer& xor_by) const; u_int32_t getLength() const; virtual void setLength(u_int32_t new_length); @@ -67,7 +67,7 @@ public: protected: virtual void reinit() {}; - u_int8_t *buf_; + u_int8_t* buf_; u_int32_t length_; u_int32_t real_length_; bool allow_realloc_; diff --git a/src/cipher.cpp b/src/cipher.cpp index 5613739..ee77001 100644 --- a/src/cipher.cpp +++ b/src/cipher.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -42,19 +42,19 @@ #include "log.h" #include "anytunError.h" -void Cipher::encrypt(KeyDerivation& kd, PlainPacket & in, EncryptedPacket & out, seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux) +void Cipher::encrypt(KeyDerivation& kd, PlainPacket& in, EncryptedPacket& out, seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux) { - u_int32_t len = cipher(kd, in, in.getLength(), out.getPayload(), out.getPayloadLength(), seq_nr, sender_id, mux); - out.setSenderId(sender_id); - out.setSeqNr(seq_nr); + u_int32_t len = cipher(kd, in, in.getLength(), out.getPayload(), out.getPayloadLength(), seq_nr, sender_id, mux); + out.setSenderId(sender_id); + out.setSeqNr(seq_nr); out.setMux(mux); - out.setPayloadLength(len); + out.setPayloadLength(len); } -void Cipher::decrypt(KeyDerivation& kd, EncryptedPacket & in, PlainPacket & out) +void Cipher::decrypt(KeyDerivation& kd, EncryptedPacket& in, PlainPacket& out) { - u_int32_t len = decipher(kd, in.getPayload() , in.getPayloadLength(), out, out.getLength(), in.getSeqNr(), in.getSenderId(), in.getMux()); - out.setLength(len); + u_int32_t len = decipher(kd, in.getPayload() , in.getPayloadLength(), out, out.getLength(), in.getSeqNr(), in.getSenderId(), in.getMux()); + out.setLength(len); } @@ -62,18 +62,18 @@ void Cipher::decrypt(KeyDerivation& kd, EncryptedPacket & in, PlainPacket & out) u_int32_t NullCipher::cipher(KeyDerivation& kd, u_int8_t* in, u_int32_t ilen, u_int8_t* out, u_int32_t olen, seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux) { - std::memcpy(out, in, (ilen < olen) ? ilen : olen); + std::memcpy(out, in, (ilen < olen) ? ilen : olen); return (ilen < olen) ? ilen : olen; } u_int32_t NullCipher::decipher(KeyDerivation& kd, u_int8_t* in, u_int32_t ilen, u_int8_t* out, u_int32_t olen, seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux) { - std::memcpy(out, in, (ilen < olen) ? ilen : olen); + std::memcpy(out, in, (ilen < olen) ? ilen : olen); return (ilen < olen) ? ilen : olen; } #ifndef NO_CRYPT -//****** AesIcmCipher ****** +//****** AesIcmCipher ****** AesIcmCipher::AesIcmCipher(kd_dir_t d) : Cipher(d), key_(u_int32_t(DEFAULT_KEY_LENGTH/8)), salt_(u_int32_t(SALT_LENGTH)) { @@ -91,9 +91,15 @@ void AesIcmCipher::init(u_int16_t key_length) handle_ = NULL; int algo; switch(key_length) { - case 128: algo = GCRY_CIPHER_AES128; break; - case 192: algo = GCRY_CIPHER_AES192; break; - case 256: algo = GCRY_CIPHER_AES256; break; + case 128: + algo = GCRY_CIPHER_AES128; + break; + case 192: + algo = GCRY_CIPHER_AES192; + break; + case 256: + algo = GCRY_CIPHER_AES256; + break; default: { cLog.msg(Log::PRIO_ERROR) << "AesIcmCipher::AesIcmCipher: cipher key length of " << key_length << " Bits is not supported"; return; @@ -101,9 +107,9 @@ void AesIcmCipher::init(u_int16_t key_length) } gcry_error_t err = gcry_cipher_open(&handle_, algo, GCRY_CIPHER_MODE_CTR, 0); - if( err ) { + if(err) { cLog.msg(Log::PRIO_ERROR) << "AesIcmCipher::AesIcmCipher: Failed to open cipher" << AnytunGpgError(err); - } + } #endif } @@ -111,8 +117,9 @@ void AesIcmCipher::init(u_int16_t key_length) AesIcmCipher::~AesIcmCipher() { #ifndef USE_SSL_CRYPTO - if(handle_) + if(handle_) { gcry_cipher_close(handle_); + } #endif } @@ -144,8 +151,9 @@ void AesIcmCipher::calcCtr(KeyDerivation& kd, seq_nr_t seq_nr, sender_id_t sende void AesIcmCipher::calc(KeyDerivation& kd, u_int8_t* in, u_int32_t ilen, u_int8_t* out, u_int32_t olen, seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux) { #ifndef USE_SSL_CRYPTO - if(!handle_) + if(!handle_) { return; + } #endif kd.generate(dir_, LABEL_ENC, seq_nr, key_); @@ -164,7 +172,7 @@ void AesIcmCipher::calc(KeyDerivation& kd, u_int8_t* in, u_int32_t ilen, u_int8_ #endif calcCtr(kd, seq_nr, sender_id, mux); - + #ifndef USE_SSL_CRYPTO err = gcry_cipher_setctr(handle_, ctr_.buf_, CTR_LENGTH); if(err) { diff --git a/src/cipher.h b/src/cipher.h index 92c4ef2..20f4a69 100644 --- a/src/cipher.h +++ b/src/cipher.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -53,12 +53,12 @@ public: Cipher(kd_dir_t d) : dir_(d) {}; virtual ~Cipher() {}; - void encrypt(KeyDerivation& kd, PlainPacket & in, EncryptedPacket & out, seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux); - void decrypt(KeyDerivation& kd, EncryptedPacket & in, PlainPacket & out); - + void encrypt(KeyDerivation& kd, PlainPacket& in, EncryptedPacket& out, seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux); + void decrypt(KeyDerivation& kd, EncryptedPacket& in, PlainPacket& out); + protected: virtual u_int32_t cipher(KeyDerivation& kd, u_int8_t* in, u_int32_t ilen, u_int8_t* out, u_int32_t olen, seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux) = 0; - virtual u_int32_t decipher(KeyDerivation& kd, u_int8_t* in, u_int32_t ilen, u_int8_t* out, u_int32_t olen, seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux) = 0; + virtual u_int32_t decipher(KeyDerivation& kd, u_int8_t* in, u_int32_t ilen, u_int8_t* out, u_int32_t olen, seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux) = 0; kd_dir_t dir_; }; @@ -81,7 +81,7 @@ public: AesIcmCipher(kd_dir_t d); AesIcmCipher(kd_dir_t d, u_int16_t key_length); ~AesIcmCipher(); - + static const u_int16_t DEFAULT_KEY_LENGTH = 128; static const u_int16_t CTR_LENGTH = 16; static const u_int16_t SALT_LENGTH = 14; @@ -106,7 +106,7 @@ private: Buffer salt_; #ifdef _MSC_VER - #pragma pack(push, 1) +#pragma pack(push, 1) #endif union ATTR_PACKED cipher_aesctr_ctr_union { u_int8_t buf_[CTR_LENGTH]; @@ -114,7 +114,7 @@ private: u_int8_t buf_[SALT_LENGTH]; u_int16_t zero_; } salt_; - struct ATTR_PACKED { + struct ATTR_PACKED { u_int8_t fill_[SALT_LENGTH - sizeof(mux_t) - sizeof(sender_id_t) - 2*sizeof(u_int8_t) - sizeof(seq_nr_t)]; mux_t mux_; sender_id_t sender_id_; @@ -124,7 +124,7 @@ private: } params_; } ctr_; #ifdef _MSC_VER - #pragma pack(pop) +#pragma pack(pop) #endif }; #endif diff --git a/src/cipherFactory.cpp b/src/cipherFactory.cpp index 96879b7..836a517 100644 --- a/src/cipherFactory.cpp +++ b/src/cipherFactory.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -39,19 +39,22 @@ Cipher* CipherFactory::create(std::string const& type, kd_dir_t dir) { - if(type == "null") + if(type == "null") { return new NullCipher(); + } #ifndef NO_CRYPT - else if(type == "aes-ctr") + else if(type == "aes-ctr") { return new AesIcmCipher(dir); - else if(type == "aes-ctr-128") + } else if(type == "aes-ctr-128") { return new AesIcmCipher(dir, 128); - else if(type == "aes-ctr-192") + } else if(type == "aes-ctr-192") { return new AesIcmCipher(dir, 192); - else if(type == "aes-ctr-256") + } else if(type == "aes-ctr-256") { return new AesIcmCipher(dir, 256); + } #endif - else + else { throw std::invalid_argument("cipher not available"); + } } diff --git a/src/cipherFactory.h b/src/cipherFactory.h index 96a8d33..e268c7c 100644 --- a/src/cipherFactory.h +++ b/src/cipherFactory.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. diff --git a/src/connectionList.cpp b/src/connectionList.cpp index 9ddb277..2893dc2 100644 --- a/src/connectionList.cpp +++ b/src/connectionList.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -47,8 +47,9 @@ ConnectionList& ConnectionList::instance() { Lock lock(instMutex); static instanceCleaner c; - if(!inst) + if(!inst) { inst = new ConnectionList(); + } return *inst; } @@ -59,22 +60,21 @@ ConnectionList::ConnectionList() ConnectionList::~ConnectionList() { -// TODO: comment this in as soon as threads @ main get cleaned up properly -// Lock lock(mutex_); -// ConnectionMap::iterator it; -// for(it = connections_.begin(); it != connections_.end(); ++it) { -// delete &it->second.kd_; -// delete &it->second.seq_window_; -// } -} - -void ConnectionList::addConnection(ConnectionParam &conn, u_int16_t mux ) + // TODO: comment this in as soon as threads @ main get cleaned up properly + // Lock lock(mutex_); + // ConnectionMap::iterator it; + // for(it = connections_.begin(); it != connections_.end(); ++it) { + // delete &it->second.kd_; + // delete &it->second.seq_window_; + // } +} + +void ConnectionList::addConnection(ConnectionParam& conn, u_int16_t mux) { Lock lock(mutex_); std::pair<ConnectionMap::iterator, bool> ret = connections_.insert(ConnectionMap::value_type(mux, conn)); - if(!ret.second) - { + if(!ret.second) { connections_.erase(ret.first); connections_.insert(ConnectionMap::value_type(mux, conn)); } @@ -82,8 +82,8 @@ void ConnectionList::addConnection(ConnectionParam &conn, u_int16_t mux ) const ConnectionMap::iterator ConnectionList::getEnd() { - Lock lock(mutex_); - return connections_.end(); + Lock lock(mutex_); + return connections_.end(); } ConnectionMap::iterator ConnectionList::getBeginUnlocked() @@ -105,48 +105,49 @@ ConnectionMap::iterator ConnectionList::getEndUnlocked() const ConnectionMap::iterator ConnectionList::getConnection(u_int16_t mux) { - Lock lock(mutex_); - ConnectionMap::iterator it = connections_.find(mux); - return it; + Lock lock(mutex_); + ConnectionMap::iterator it = connections_.find(mux); + return it; } -ConnectionParam & ConnectionList::getOrNewConnectionUnlocked(u_int16_t mux) +ConnectionParam& ConnectionList::getOrNewConnectionUnlocked(u_int16_t mux) { - ConnectionMap::iterator it = connections_.find(mux); - if(it!=connections_.end()) - return it->second; + ConnectionMap::iterator it = connections_.find(mux); + if(it!=connections_.end()) { + return it->second; + } u_int8_t key[] = { - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', - 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p' + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p' }; - + u_int8_t salt[] = { - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', - 'i', 'j', 'k', 'l', 'm', 'n' + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', 'm', 'n' }; - SeqWindow * seq= new SeqWindow(0); + SeqWindow* seq= new SeqWindow(0); seq_nr_t seq_nr_=0; - KeyDerivation * kd = KeyDerivationFactory::create(gOpt.getKdPrf()); + KeyDerivation* kd = KeyDerivationFactory::create(gOpt.getKdPrf()); kd->init(Buffer(key, sizeof(key)), Buffer(salt, sizeof(salt))); - ConnectionParam conn ((*kd), (*seq), seq_nr_, PacketSourceEndpoint()); - connections_.insert(ConnectionMap::value_type(mux, conn)); - it = connections_.find(mux); - return it->second; + ConnectionParam conn((*kd), (*seq), seq_nr_, PacketSourceEndpoint()); + connections_.insert(ConnectionMap::value_type(mux, conn)); + it = connections_.find(mux); + return it->second; } void ConnectionList::clear() { Lock lock(mutex_); - connections_.clear(); + connections_.clear(); } bool ConnectionList::empty() { Lock lock(mutex_); - return connections_.empty(); + return connections_.empty(); } Mutex& ConnectionList::getMutex() diff --git a/src/connectionList.h b/src/connectionList.h index 29eb94f..949889d 100644 --- a/src/connectionList.h +++ b/src/connectionList.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -45,32 +45,35 @@ typedef std::map<u_int16_t, ConnectionParam> ConnectionMap; class ConnectionList { public: - ConnectionList(); - ~ConnectionList(); - static ConnectionList& instance(); - void addConnection(ConnectionParam &conn, u_int16_t mux); - const ConnectionMap::iterator getConnection(u_int16_t mux); - const ConnectionMap::iterator getEnd(); - ConnectionMap::iterator getEndUnlocked(); - ConnectionMap::iterator getBeginUnlocked(); - const ConnectionMap::iterator getBegin(); - ConnectionParam & getOrNewConnectionUnlocked(u_int16_t mux); - bool empty(); - void clear(); + ConnectionList(); + ~ConnectionList(); + static ConnectionList& instance(); + void addConnection(ConnectionParam& conn, u_int16_t mux); + const ConnectionMap::iterator getConnection(u_int16_t mux); + const ConnectionMap::iterator getEnd(); + ConnectionMap::iterator getEndUnlocked(); + ConnectionMap::iterator getBeginUnlocked(); + const ConnectionMap::iterator getBegin(); + ConnectionParam& getOrNewConnectionUnlocked(u_int16_t mux); + bool empty(); + void clear(); Mutex& getMutex(); private: static Mutex instMutex; - static ConnectionList* inst; - class instanceCleaner { - public: ~instanceCleaner() { - if(ConnectionList::inst != 0) - delete ConnectionList::inst; - } + static ConnectionList* inst; + class instanceCleaner + { + public: + ~instanceCleaner() { + if(ConnectionList::inst != 0) { + delete ConnectionList::inst; + } + } }; - ConnectionList(const ConnectionList &s); - void operator=(const ConnectionList &s); - ConnectionMap connections_; + ConnectionList(const ConnectionList& s); + void operator=(const ConnectionList& s); + ConnectionMap connections_; Mutex mutex_; }; diff --git a/src/connectionParam.cpp b/src/connectionParam.cpp index fc1e33a..05b02ca 100644 --- a/src/connectionParam.cpp +++ b/src/connectionParam.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -36,6 +36,6 @@ ConnectionParam::ConnectionParam(KeyDerivation& kd, SeqWindow& seq_window,seq_nr { } -ConnectionParam::ConnectionParam(const ConnectionParam & src) : kd_(src.kd_),seq_window_(src.seq_window_),seq_nr_(src.seq_nr_),remote_end_(src.remote_end_),mutex_() +ConnectionParam::ConnectionParam(const ConnectionParam& src) : kd_(src.kd_),seq_window_(src.seq_window_),seq_nr_(src.seq_nr_),remote_end_(src.remote_end_),mutex_() { } diff --git a/src/connectionParam.h b/src/connectionParam.h index ed24531..072d0a1 100644 --- a/src/connectionParam.h +++ b/src/connectionParam.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -44,36 +44,36 @@ class ConnectionParam { public: - ConnectionParam(const ConnectionParam & src); - ConnectionParam( KeyDerivation& kd, SeqWindow& seq_window, seq_nr_t seq_nr_, PacketSourceEndpoint remote_end); + ConnectionParam(const ConnectionParam& src); + ConnectionParam(KeyDerivation& kd, SeqWindow& seq_window, seq_nr_t seq_nr_, PacketSourceEndpoint remote_end); KeyDerivation& kd_; SeqWindow& seq_window_; - seq_nr_t seq_nr_; - PacketSourceEndpoint remote_end_; + seq_nr_t seq_nr_; + PacketSourceEndpoint remote_end_; private: //TODO: check if this is ok - Mutex mutex_; + Mutex mutex_; friend class boost::serialization::access; template<class Archive> - void serialize(Archive & ar, const unsigned int version) - { - Lock lock(mutex_); - std::string remote_host(remote_end_.address().to_string()); - u_int16_t remote_port = remote_end_.port(); - ar & kd_; - ar & seq_window_; - ar & seq_nr_; - ar & remote_host; - ar & remote_port; - PacketSourceEndpoint emptyEndpoint; - UDPPacketSource::proto::endpoint endpoint(boost::asio::ip::address::from_string(remote_host), remote_port); - //This is a workarround, against race condition in sync process - //TODO: find a better solution - if (endpoint != emptyEndpoint && remote_host != "::" && remote_host != "[::]" && remote_host != "0.0.0.0") - remote_end_ = endpoint; - } + void serialize(Archive& ar, const unsigned int version) { + Lock lock(mutex_); + std::string remote_host(remote_end_.address().to_string()); + u_int16_t remote_port = remote_end_.port(); + ar& kd_; + ar& seq_window_; + ar& seq_nr_; + ar& remote_host; + ar& remote_port; + PacketSourceEndpoint emptyEndpoint; + UDPPacketSource::proto::endpoint endpoint(boost::asio::ip::address::from_string(remote_host), remote_port); + //This is a workarround, against race condition in sync process + //TODO: find a better solution + if(endpoint != emptyEndpoint && remote_host != "::" && remote_host != "[::]" && remote_host != "0.0.0.0") { + remote_end_ = endpoint; + } + } }; #endif diff --git a/src/cryptinit.hpp b/src/cryptinit.hpp index f8ac938..64c57b4 100644 --- a/src/cryptinit.hpp +++ b/src/cryptinit.hpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -38,62 +38,64 @@ #include <gcrypt.h> // boost thread callbacks for libgcrypt -static int boost_mutex_init(void **priv) +static int boost_mutex_init(void** priv) { - boost::mutex *lock = new boost::mutex(); - if (!lock) + boost::mutex* lock = new boost::mutex(); + if(!lock) { return ENOMEM; + } *priv = lock; return 0; } -static int boost_mutex_destroy(void **lock) +static int boost_mutex_destroy(void** lock) { delete reinterpret_cast<boost::mutex*>(*lock); return 0; } -static int boost_mutex_lock(void **lock) +static int boost_mutex_lock(void** lock) { reinterpret_cast<boost::mutex*>(*lock)->lock(); return 0; } -static int boost_mutex_unlock(void **lock) +static int boost_mutex_unlock(void** lock) { reinterpret_cast<boost::mutex*>(*lock)->unlock(); return 0; } -static struct gcry_thread_cbs gcry_threads_boost = -{ GCRY_THREAD_OPTION_USER, NULL, +static struct gcry_thread_cbs gcry_threads_boost = { + GCRY_THREAD_OPTION_USER, NULL, boost_mutex_init, boost_mutex_destroy, - boost_mutex_lock, boost_mutex_unlock }; + boost_mutex_lock, boost_mutex_unlock +}; #define MIN_GCRYPT_VERSION "1.2.0" bool initLibGCrypt() { - // make libgcrypt thread safe + // make libgcrypt thread safe // this must be called before any other libgcrypt call - gcry_control( GCRYCTL_SET_THREAD_CBS, &gcry_threads_boost ); + gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_boost); // this must be called right after the GCRYCTL_SET_THREAD_CBS command // no other function must be called till now - if( !gcry_check_version( MIN_GCRYPT_VERSION ) ) { + if(!gcry_check_version(MIN_GCRYPT_VERSION)) { std::cout << "initLibGCrypt: Invalid Version of libgcrypt, should be >= " << MIN_GCRYPT_VERSION << std::endl; return false; } - gcry_error_t err = gcry_control (GCRYCTL_DISABLE_SECMEM, 0); - if( err ) { + gcry_error_t err = gcry_control(GCRYCTL_DISABLE_SECMEM, 0); + if(err) { std::cout << "initLibGCrypt: Failed to disable secure memory: " << AnytunGpgError(err) << std::endl; return false; } // Tell Libgcrypt that initialization has completed. err = gcry_control(GCRYCTL_INITIALIZATION_FINISHED); - if( err ) { + if(err) { std::cout << "initLibGCrypt: Failed to finish initialization: " << AnytunGpgError(err) << std::endl; return false; } diff --git a/src/datatypes.h b/src/datatypes.h index ba34614..3364fe3 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -63,7 +63,7 @@ typedef int system_error_t; #include <windows.h> #define ATTR_PACKED typedef DWORD system_error_t; -#endif +#endif #define MAX_PACKET_LENGTH 1600 diff --git a/src/deviceConfig.hpp b/src/deviceConfig.hpp index 6353cd1..fa882b5 100644 --- a/src/deviceConfig.hpp +++ b/src/deviceConfig.hpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -41,41 +41,45 @@ class TunDevice; enum device_type_t { TYPE_UNDEF, TYPE_TUN, TYPE_TAP }; -class DeviceConfig +class DeviceConfig { public: - DeviceConfig(std::string dev_name ,std::string dev_type, std::string ifcfg_addr, u_int16_t ifcfg_prefix, u_int16_t mtu) - { + DeviceConfig(std::string dev_name ,std::string dev_type, std::string ifcfg_addr, u_int16_t ifcfg_prefix, u_int16_t mtu) { mtu_ = mtu; type_ = TYPE_UNDEF; #ifndef _MSC_VER if(dev_type != "") { - if(!dev_type.compare(0,3,"tun")) + if(!dev_type.compare(0,3,"tun")) { type_ = TYPE_TUN; - else if (!dev_type.compare(0,3,"tap")) + } else if(!dev_type.compare(0,3,"tap")) { type_ = TYPE_TAP; - } - else if(dev_name != "") { - if(!dev_name.compare(0,3,"tun")) + } + } else if(dev_name != "") { + if(!dev_name.compare(0,3,"tun")) { type_ = TYPE_TUN; - else if(!dev_name.compare(0,3,"tap")) + } else if(!dev_name.compare(0,3,"tap")) { type_ = TYPE_TAP; + } } #else - if(dev_type == "") + if(dev_type == "") { AnytunError::throwErr() << "Device type must be specified on Windows"; - - if(dev_type == "tun") + } + + if(dev_type == "tun") { type_ = TYPE_TUN; - else if(dev_type == "tap") + } else if(dev_type == "tap") { type_ = TYPE_TAP; + } - if(type_ == TYPE_TUN && ifcfg_addr == "") + if(type_ == TYPE_TUN && ifcfg_addr == "") { AnytunError::throwErr() << "Device type tun requires ifconfig parameter (--ifconfig)"; + } #endif - if(ifcfg_addr != "") + if(ifcfg_addr != "") { addr_.setNetworkAddress(ipv4, ifcfg_addr.c_str()); + } prefix_ = ifcfg_prefix; u_int32_t mask = 0; for(u_int16_t i = 0; i < prefix_; ++i) { diff --git a/src/encryptedPacket.cpp b/src/encryptedPacket.cpp index 46235c5..731074b 100644 --- a/src/encryptedPacket.cpp +++ b/src/encryptedPacket.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -46,8 +46,7 @@ EncryptedPacket::EncryptedPacket(u_int32_t payload_length, u_int32_t auth_tag_le header_ = reinterpret_cast<struct HeaderStruct*>(buf_); payload_ = buf_ + sizeof(struct HeaderStruct); auth_tag_ = NULL; - if(header_) - { + if(header_) { header_->seq_nr = 0; header_->sender_id = 0; header_->mux = 0; @@ -61,50 +60,57 @@ u_int32_t EncryptedPacket::getHeaderLength() seq_nr_t EncryptedPacket::getSeqNr() const { - if(header_) + if(header_) { return SEQ_NR_T_NTOH(header_->seq_nr); - + } + return 0; } sender_id_t EncryptedPacket::getSenderId() const { - if(header_) + if(header_) { return SENDER_ID_T_NTOH(header_->sender_id); + } return 0; } mux_t EncryptedPacket::getMux() const { - if(header_) + if(header_) { return MUX_T_NTOH(header_->mux); + } return 0; } void EncryptedPacket::setSeqNr(seq_nr_t seq_nr) { - if(header_) + if(header_) { header_->seq_nr = SEQ_NR_T_HTON(seq_nr); + } } void EncryptedPacket::setSenderId(sender_id_t sender_id) { - if(header_) + if(header_) { header_->sender_id = SENDER_ID_T_HTON(sender_id); + } } void EncryptedPacket::setMux(mux_t mux) { - if(header_) + if(header_) { header_->mux = MUX_T_HTON(mux); + } } void EncryptedPacket::setHeader(seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux) { - if(!header_) + if(!header_) { return; + } header_->seq_nr = SEQ_NR_T_HTON(seq_nr); header_->sender_id = SENDER_ID_T_HTON(sender_id); @@ -113,43 +119,45 @@ void EncryptedPacket::setHeader(seq_nr_t seq_nr, sender_id_t sender_id, mux_t mu u_int32_t EncryptedPacket::getPayloadLength() const { - if(!payload_) + if(!payload_) { return 0; + } - if(!auth_tag_) + if(!auth_tag_) { return (length_ > sizeof(struct HeaderStruct)) ? (length_ - sizeof(struct HeaderStruct)) : 0; - + } + return (length_ > (sizeof(struct HeaderStruct) + auth_tag_length_)) ? (length_ - sizeof(struct HeaderStruct) - auth_tag_length_) : 0; } void EncryptedPacket::setPayloadLength(u_int32_t payload_length) { Buffer::setLength(payload_length + sizeof(struct HeaderStruct)); - // depending on allow_realloc buf_ may point to another address - // therefore in this case reinit() gets called by Buffer::setLength() + // depending on allow_realloc buf_ may point to another address + // therefore in this case reinit() gets called by Buffer::setLength() } void EncryptedPacket::reinit() { header_ = reinterpret_cast<struct HeaderStruct*>(buf_); payload_ = buf_ + sizeof(struct HeaderStruct); - - if(length_ <= (sizeof(struct HeaderStruct))) + + if(length_ <= (sizeof(struct HeaderStruct))) { payload_ = NULL; - + } + if(length_ < (sizeof(struct HeaderStruct))) { header_ = NULL; - AnytunError::throwErr() << "encrypted packet can't be initialized, buffer is too small"; - } - - if(auth_tag_) - { + AnytunError::throwErr() << "encrypted packet can't be initialized, buffer is too small"; + } + + if(auth_tag_) { if(length_ < (sizeof(struct HeaderStruct) + auth_tag_length_)) { auth_tag_ = NULL; - AnytunError::throwErr() << "auth-tag can't be enabled, buffer is too small"; + AnytunError::throwErr() << "auth-tag can't be enabled, buffer is too small"; } auth_tag_ = buf_ + length_ - auth_tag_length_; - } + } } u_int8_t* EncryptedPacket::getPayload() @@ -164,46 +172,52 @@ u_int8_t* EncryptedPacket::getAuthenticatedPortion() u_int32_t EncryptedPacket::getAuthenticatedPortionLength() { - if(!buf_) + if(!buf_) { return 0; + } - if(!auth_tag_) + if(!auth_tag_) { return length_; - + } + return (length_ > auth_tag_length_) ? (length_ - auth_tag_length_) : 0; } void EncryptedPacket::withAuthTag(bool b) { - if((b && auth_tag_) || (!b && !auth_tag_)) + if((b && auth_tag_) || (!b && !auth_tag_)) { return; - - if(b) - { - if(length_ < (sizeof(struct HeaderStruct) + auth_tag_length_)) + } + + if(b) { + if(length_ < (sizeof(struct HeaderStruct) + auth_tag_length_)) { AnytunError::throwErr() << "auth-tag can't be enabled, buffer is too small"; - + } + auth_tag_ = buf_ + length_ - auth_tag_length_; - } - else + } else { auth_tag_ = NULL; + } } void EncryptedPacket::addAuthTag() { - if(auth_tag_) + if(auth_tag_) { return; + } auth_tag_ = buf_; // will be set to the correct value @ reinit setLength(length_ + auth_tag_length_); - if(auth_tag_ == buf_) // reinit was not called by setLength + if(auth_tag_ == buf_) { // reinit was not called by setLength reinit(); + } } void EncryptedPacket::removeAuthTag() { - if(!auth_tag_) + if(!auth_tag_) { return; + } auth_tag_ = NULL; setLength(length_ - auth_tag_length_); @@ -216,8 +230,9 @@ u_int8_t* EncryptedPacket::getAuthTag() u_int32_t EncryptedPacket::getAuthTagLength() { - if(auth_tag_) + if(auth_tag_) { return auth_tag_length_; + } return 0; } diff --git a/src/encryptedPacket.h b/src/encryptedPacket.h index bd321b3..c73dea8 100644 --- a/src/encryptedPacket.h +++ b/src/encryptedPacket.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -43,7 +43,7 @@ public: /** * Packet constructor - * @param the length of the payload + * @param the length of the payload * @param allow reallocation of buffer */ EncryptedPacket(u_int32_t payload_length, u_int32_t auth_tag_length, bool allow_realloc = false); @@ -130,29 +130,28 @@ public: void removeAuthTag(); u_int8_t* getAuthTag(); u_int32_t getAuthTagLength(); - + private: EncryptedPacket(); - EncryptedPacket(const EncryptedPacket &src); + EncryptedPacket(const EncryptedPacket& src); void reinit(); #ifdef _MSC_VER - #pragma pack(push, 1) -#endif - struct ATTR_PACKED HeaderStruct - { +#pragma pack(push, 1) +#endif + struct ATTR_PACKED HeaderStruct { seq_nr_t seq_nr; sender_id_t sender_id; mux_t mux; }; #ifdef _MSC_VER - #pragma pack(pop) +#pragma pack(pop) #endif struct HeaderStruct* header_; - u_int8_t * payload_; - u_int8_t * auth_tag_; + u_int8_t* payload_; + u_int8_t* auth_tag_; u_int32_t auth_tag_length_; }; diff --git a/src/endian.h b/src/endian.h index 75646e7..498db4d 100644 --- a/src/endian.h +++ b/src/endian.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. diff --git a/src/keyDerivation.cpp b/src/keyDerivation.cpp index 25b7cf0..fac1da6 100644 --- a/src/keyDerivation.cpp +++ b/src/keyDerivation.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -126,34 +126,31 @@ satp_prf_label_t KeyDerivation::convertLabel(kd_dir_t dir, satp_prf_label_t labe switch(label) { case LABEL_ENC: { if(dir == KD_OUTBOUND) { - if(role_ == ROLE_LEFT) return LABEL_LEFT_ENC; - if(role_ == ROLE_RIGHT) return LABEL_RIGHT_ENC; - } - else { - if(role_ == ROLE_LEFT) return LABEL_RIGHT_ENC; - if(role_ == ROLE_RIGHT) return LABEL_LEFT_ENC; + if(role_ == ROLE_LEFT) { return LABEL_LEFT_ENC; } + if(role_ == ROLE_RIGHT) { return LABEL_RIGHT_ENC; } + } else { + if(role_ == ROLE_LEFT) { return LABEL_RIGHT_ENC; } + if(role_ == ROLE_RIGHT) { return LABEL_LEFT_ENC; } } break; } case LABEL_SALT: { if(dir == KD_OUTBOUND) { - if(role_ == ROLE_LEFT) return LABEL_LEFT_SALT; - if(role_ == ROLE_RIGHT) return LABEL_RIGHT_SALT; - } - else { - if(role_ == ROLE_LEFT) return LABEL_RIGHT_SALT; - if(role_ == ROLE_RIGHT) return LABEL_LEFT_SALT; + if(role_ == ROLE_LEFT) { return LABEL_LEFT_SALT; } + if(role_ == ROLE_RIGHT) { return LABEL_RIGHT_SALT; } + } else { + if(role_ == ROLE_LEFT) { return LABEL_RIGHT_SALT; } + if(role_ == ROLE_RIGHT) { return LABEL_LEFT_SALT; } } break; } case LABEL_AUTH: { if(dir == KD_OUTBOUND) { - if(role_ == ROLE_LEFT) return LABEL_LEFT_AUTH; - if(role_ == ROLE_RIGHT) return LABEL_RIGHT_AUTH; - } - else { - if(role_ == ROLE_LEFT) return LABEL_RIGHT_AUTH; - if(role_ == ROLE_RIGHT) return LABEL_LEFT_AUTH; + if(role_ == ROLE_LEFT) { return LABEL_LEFT_AUTH; } + if(role_ == ROLE_RIGHT) { return LABEL_RIGHT_AUTH; } + } else { + if(role_ == ROLE_LEFT) { return LABEL_RIGHT_AUTH; } + if(role_ == ROLE_RIGHT) { return LABEL_LEFT_AUTH; } } break; } @@ -173,19 +170,21 @@ bool NullKeyDerivation::generate(kd_dir_t dir, satp_prf_label_t label, seq_nr_t #ifndef NO_CRYPT //****** AesIcmKeyDerivation ****** -AesIcmKeyDerivation::AesIcmKeyDerivation() : KeyDerivation(DEFAULT_KEY_LENGTH) +AesIcmKeyDerivation::AesIcmKeyDerivation() : KeyDerivation(DEFAULT_KEY_LENGTH) { #ifndef USE_SSL_CRYPTO - for(int i=0; i<2; i++) + for(int i=0; i<2; i++) { handle_[i] = NULL; + } #endif } -AesIcmKeyDerivation::AesIcmKeyDerivation(u_int16_t key_length) : KeyDerivation(key_length) +AesIcmKeyDerivation::AesIcmKeyDerivation(u_int16_t key_length) : KeyDerivation(key_length) { #ifndef USE_SSL_CRYPTO - for(int i=0; i<2; i++) + for(int i=0; i<2; i++) { handle_[i] = NULL; + } #endif } @@ -194,8 +193,9 @@ AesIcmKeyDerivation::~AesIcmKeyDerivation() WritersLock lock(mutex_); #ifndef USE_SSL_CRYPTO for(int i=0; i<2; i++) - if(handle_[i]) + if(handle_[i]) { gcry_cipher_close(handle_[i]); + } #endif } @@ -205,15 +205,17 @@ void AesIcmKeyDerivation::init(Buffer key, Buffer salt, std::string passphrase) is_initialized_ = false; #ifndef NO_PASSPHRASE - if(passphrase != "" && !key.getLength()) + if(passphrase != "" && !key.getLength()) { calcMasterKey(passphrase, key_length_/8); - else + } else { master_key_ = SyncBuffer(key); - - if(passphrase != "" && !salt.getLength()) + } + + if(passphrase != "" && !salt.getLength()) { calcMasterSalt(passphrase, SALT_LENGTH); - else + } else { master_salt_ = SyncBuffer(salt); + } #else master_key_ = SyncBuffer(key); master_salt_ = SyncBuffer(salt); @@ -237,9 +239,15 @@ void AesIcmKeyDerivation::updateMasterKey() #ifndef USE_SSL_CRYPTO int algo; switch(key_length_) { - case 128: algo = GCRY_CIPHER_AES128; break; - case 192: algo = GCRY_CIPHER_AES192; break; - case 256: algo = GCRY_CIPHER_AES256; break; + case 128: + algo = GCRY_CIPHER_AES128; + break; + case 192: + algo = GCRY_CIPHER_AES192; + break; + case 256: + algo = GCRY_CIPHER_AES256; + break; default: { cLog.msg(Log::PRIO_ERROR) << "KeyDerivation::updateMasterKey: cipher key length of " << key_length_ << " Bits is not supported"; return; @@ -247,15 +255,16 @@ void AesIcmKeyDerivation::updateMasterKey() } for(int i=0; i<2; i++) { - if(handle_[i]) + if(handle_[i]) { gcry_cipher_close(handle_[i]); - + } + gcry_error_t err = gcry_cipher_open(&handle_[i], algo, GCRY_CIPHER_MODE_CTR, 0); if(err) { cLog.msg(Log::PRIO_ERROR) << "KeyDerivation::updateMasterKey: Failed to open cipher: " << AnytunGpgError(err); return; - } - + } + err = gcry_cipher_setkey(handle_[i], master_key_.getBuf(), master_key_.getLength()); if(err) { cLog.msg(Log::PRIO_ERROR) << "KeyDerivation::updateMasterKey: Failed to set cipher key: " << AnytunGpgError(err); @@ -274,7 +283,7 @@ void AesIcmKeyDerivation::updateMasterKey() is_initialized_ = true; } -std::string AesIcmKeyDerivation::printType() +std::string AesIcmKeyDerivation::printType() { ReadersLock lock(mutex_); @@ -297,17 +306,18 @@ bool AesIcmKeyDerivation::calcCtr(kd_dir_t dir, satp_prf_label_t label, seq_nr_t return true; } -bool AesIcmKeyDerivation::generate(kd_dir_t dir, satp_prf_label_t label, seq_nr_t seq_nr, Buffer& key) +bool AesIcmKeyDerivation::generate(kd_dir_t dir, satp_prf_label_t label, seq_nr_t seq_nr, Buffer& key) { ReadersLock lock(mutex_); - if(!is_initialized_) + if(!is_initialized_) { return false; + } if(!calcCtr(dir, label, seq_nr)) { return false; } - + #ifndef USE_SSL_CRYPTO gcry_error_t err = gcry_cipher_reset(handle_[dir]); if(err) { @@ -335,7 +345,7 @@ bool AesIcmKeyDerivation::generate(kd_dir_t dir, satp_prf_label_t label, seq_nr_ std::memset(key.getBuf(), 0, key.getLength()); AES_ctr128_encrypt(key.getBuf(), key.getBuf(), key.getLength(), &aes_key_[dir], ctr_[dir].buf_, ecount_buf_[dir], &num); #endif - + return true; } #endif diff --git a/src/keyDerivation.h b/src/keyDerivation.h index eea4266..15d4988 100644 --- a/src/keyDerivation.h +++ b/src/keyDerivation.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -77,28 +77,27 @@ public: virtual std::string printType() { return "GenericKeyDerivation"; }; - satp_prf_label_t convertLabel(kd_dir_t dir, satp_prf_label_t label); + satp_prf_label_t convertLabel(kd_dir_t dir, satp_prf_label_t label); protected: virtual void updateMasterKey() = 0; - + #ifndef NO_PASSPHRASE void calcMasterKey(std::string passphrase, u_int16_t length); void calcMasterSalt(std::string passphrase, u_int16_t length); #endif - KeyDerivation(const KeyDerivation & src); - friend class boost::serialization::access; - template<class Archive> - void serialize(Archive & ar, const unsigned int version) - { - WritersLock lock(mutex_); - ar & role_; - ar & key_length_; - ar & master_salt_; - ar & master_key_; + KeyDerivation(const KeyDerivation& src); + friend class boost::serialization::access; + template<class Archive> + void serialize(Archive& ar, const unsigned int version) { + WritersLock lock(mutex_); + ar& role_; + ar& key_length_; + ar& master_salt_; + ar& master_key_; updateMasterKey(); - } + } bool is_initialized_; role_t role_; @@ -109,7 +108,7 @@ protected: SharedMutex mutex_; }; -#if BOOST_VERSION <= 103500 +#if BOOST_VERSION <= 103500 BOOST_IS_ABSTRACT(KeyDerivation); #else BOOST_SERIALIZATION_ASSUME_ABSTRACT(KeyDerivation); @@ -131,12 +130,11 @@ public: private: void updateMasterKey() {}; - friend class boost::serialization::access; - template<class Archive> - void serialize(Archive & ar, const unsigned int version) - { - ar & boost::serialization::base_object<KeyDerivation>(*this); - } + friend class boost::serialization::access; + template<class Archive> + void serialize(Archive& ar, const unsigned int version) { + ar& boost::serialization::base_object<KeyDerivation>(*this); + } }; @@ -153,7 +151,7 @@ public: static const u_int16_t DEFAULT_KEY_LENGTH = 128; static const u_int16_t CTR_LENGTH = 16; static const u_int16_t SALT_LENGTH = 14; - + void init(Buffer key, Buffer salt, std::string passphrase = ""); bool generate(kd_dir_t dir, satp_prf_label_t label, seq_nr_t seq_nr, Buffer& key); @@ -164,12 +162,11 @@ private: bool calcCtr(kd_dir_t dir, satp_prf_label_t label, seq_nr_t seq_nr); - friend class boost::serialization::access; - template<class Archive> - void serialize(Archive & ar, const unsigned int version) - { - ar & boost::serialization::base_object<KeyDerivation>(*this); - } + friend class boost::serialization::access; + template<class Archive> + void serialize(Archive& ar, const unsigned int version) { + ar& boost::serialization::base_object<KeyDerivation>(*this); + } #ifndef USE_SSL_CRYPTO gcry_cipher_hd_t handle_[2]; @@ -179,8 +176,8 @@ private: #endif #ifdef _MSC_VER - #pragma pack(push, 1) -#endif +#pragma pack(push, 1) +#endif union ATTR_PACKED key_derivation_aesctr_ctr_union { u_int8_t buf_[CTR_LENGTH]; struct ATTR_PACKED { @@ -194,8 +191,8 @@ private: u_int16_t zero_; } params_; } ctr_[2]; -#ifdef _MSC_VER - #pragma pack(pop) +#ifdef _MSC_VER +#pragma pack(pop) #endif }; diff --git a/src/keyDerivationFactory.cpp b/src/keyDerivationFactory.cpp index d325c35..a4cbf1c 100644 --- a/src/keyDerivationFactory.cpp +++ b/src/keyDerivationFactory.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -39,19 +39,22 @@ KeyDerivation* KeyDerivationFactory::create(std::string const& type) { - if(type == "null") + if(type == "null") { return new NullKeyDerivation(); + } #ifndef NO_CRYPT - else if(type == "aes-ctr") + else if(type == "aes-ctr") { return new AesIcmKeyDerivation(); - else if(type == "aes-ctr-128") + } else if(type == "aes-ctr-128") { return new AesIcmKeyDerivation(128); - else if(type == "aes-ctr-192") + } else if(type == "aes-ctr-192") { return new AesIcmKeyDerivation(192); - else if(type == "aes-ctr-256") + } else if(type == "aes-ctr-256") { return new AesIcmKeyDerivation(256); + } #endif - else + else { throw std::invalid_argument("key derivation prf not available"); + } } diff --git a/src/keyDerivationFactory.h b/src/keyDerivationFactory.h index caafe7e..fc11a4d 100644 --- a/src/keyDerivationFactory.h +++ b/src/keyDerivationFactory.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. diff --git a/src/linux/tunDevice.cpp b/src/linux/tunDevice.cpp index ee6ac0e..85f90e1 100644 --- a/src/linux/tunDevice.cpp +++ b/src/linux/tunDevice.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -52,108 +52,114 @@ TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifcfg_addr, u_int16_t ifcfg_prefix) : conf_(dev_name, dev_type, ifcfg_addr, ifcfg_prefix, 1400), sys_exec_(NULL) { - struct ifreq ifr; - memset(&ifr, 0, sizeof(ifr)); + struct ifreq ifr; + memset(&ifr, 0, sizeof(ifr)); if(conf_.type_ == TYPE_TUN) { ifr.ifr_flags = IFF_TUN; with_pi_ = true; - } - else if(conf_.type_ == TYPE_TAP) { + } else if(conf_.type_ == TYPE_TAP) { ifr.ifr_flags = IFF_TAP | IFF_NO_PI; with_pi_ = false; - } - else + } else { AnytunError::throwErr() << "unable to recognize type of device (tun or tap)"; + } - if(dev_name != "") - strncpy(ifr.ifr_name, dev_name.c_str(), IFNAMSIZ); + if(dev_name != "") { + strncpy(ifr.ifr_name, dev_name.c_str(), IFNAMSIZ); + } - fd_ = ::open(DEFAULT_DEVICE, O_RDWR); - if(fd_ < 0) + fd_ = ::open(DEFAULT_DEVICE, O_RDWR); + if(fd_ < 0) { AnytunError::throwErr() << "can't open device file (" << DEFAULT_DEVICE << "): " << AnytunErrno(errno); + } - if(!ioctl(fd_, TUNSETIFF, &ifr)) { - actual_name_ = ifr.ifr_name; - } else if(!ioctl(fd_, (('T' << 8) | 202), &ifr)) { - actual_name_ = ifr.ifr_name; - } else { + if(!ioctl(fd_, TUNSETIFF, &ifr)) { + actual_name_ = ifr.ifr_name; + } else if(!ioctl(fd_, (('T' << 8) | 202), &ifr)) { + actual_name_ = ifr.ifr_name; + } else { ::close(fd_); AnytunError::throwErr() << "tun/tap device ioctl failed: " << AnytunErrno(errno); } actual_node_ = DEFAULT_DEVICE; - if(ifcfg_addr != "") + if(ifcfg_addr != "") { do_ifconfig(); + } } TunDevice::~TunDevice() { - if(fd_ > 0) + if(fd_ > 0) { ::close(fd_); + } } int TunDevice::fix_return(int ret, size_t pi_length) const { - if(ret < 0) + if(ret < 0) { return ret; + } return (static_cast<size_t>(ret) > pi_length ? (ret - pi_length) : 0); } int TunDevice::read(u_int8_t* buf, u_int32_t len) { - if(fd_ < 0) + if(fd_ < 0) { return -1; + } - if(with_pi_) - { + if(with_pi_) { struct iovec iov[2]; struct tun_pi tpi; - + iov[0].iov_base = &tpi; iov[0].iov_len = sizeof(tpi); iov[1].iov_base = buf; iov[1].iov_len = len; return(fix_return(::readv(fd_, iov, 2), sizeof(tpi))); - } - else + } else { return(::read(fd_, buf, len)); + } } int TunDevice::write(u_int8_t* buf, u_int32_t len) { - if(fd_ < 0) + if(fd_ < 0) { return -1; + } - if(!buf) + if(!buf) { return 0; + } - if(with_pi_) - { + if(with_pi_) { struct iovec iov[2]; struct tun_pi tpi; - struct iphdr *hdr = reinterpret_cast<struct iphdr *>(buf); - + struct iphdr* hdr = reinterpret_cast<struct iphdr*>(buf); + tpi.flags = 0; - if(hdr->version == 4) + if(hdr->version == 4) { tpi.proto = htons(ETH_P_IP); - else + } else { tpi.proto = htons(ETH_P_IPV6); - + } + iov[0].iov_base = &tpi; iov[0].iov_len = sizeof(tpi); iov[1].iov_base = buf; iov[1].iov_len = len; return(fix_return(::writev(fd_, iov, 2), sizeof(tpi))); - } - else + } else { return(::write(fd_, buf, len)); + } } void TunDevice::init_post() { -// nothing to be done here + // nothing to be done here } void TunDevice::do_ifconfig() @@ -166,6 +172,7 @@ void TunDevice::do_ifconfig() void TunDevice::waitUntilReady() { - if(sys_exec_) + if(sys_exec_) { SysExec::waitAndDestroy(sys_exec_); + } } diff --git a/src/log.cpp b/src/log.cpp index d1049b2..9924d7f 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -40,17 +40,17 @@ Log* Log::inst = NULL; Mutex Log::instMutex; Log& cLog = Log::instance(); -LogStringBuilder::LogStringBuilder(LogStringBuilder const& src) : log(src.log), prio(src.prio) +LogStringBuilder::LogStringBuilder(LogStringBuilder const& src) : log(src.log), prio(src.prio) { stream << src.stream.str(); } -LogStringBuilder::LogStringBuilder(Log& l, int p) : log(l), prio(p) +LogStringBuilder::LogStringBuilder(Log& l, int p) : log(l), prio(p) { - // do something on the start of the line. + // do something on the start of the line. } -LogStringBuilder::~LogStringBuilder() +LogStringBuilder::~LogStringBuilder() { log.log(stream.str(), prio); } @@ -59,9 +59,10 @@ Log& Log::instance() { Lock lock(instMutex); static instanceCleaner c; - if(!inst) + if(!inst) { inst = new Log(); - + } + return *inst; } @@ -70,8 +71,9 @@ void Log::addTarget(std::string conf) Lock lock(mutex); LogTarget* target = targets.add(conf); target->open(); - if(target->getMaxPrio() > 0) + if(target->getMaxPrio() > 0) { target->enable(); + } } void Log::addTarget(LogTargetList::target_type_t type, int prio, std::string conf) @@ -79,8 +81,9 @@ void Log::addTarget(LogTargetList::target_type_t type, int prio, std::string con Lock lock(mutex); LogTarget* target = targets.add(type, prio, conf); target->open(); - if(target->getMaxPrio() > 0) + if(target->getMaxPrio() > 0) { target->enable(); + } } void Log::log(std::string msg, int prio) @@ -92,11 +95,17 @@ void Log::log(std::string msg, int prio) std::string Log::prioToString(int prio) { switch(prio) { - case PRIO_ERROR: return "ERROR"; - case PRIO_WARNING: return "WARNING"; - case PRIO_NOTICE: return "NOTICE"; - case PRIO_INFO: return "INFO"; - case PRIO_DEBUG: return "DEBUG"; - default: return "UNKNOWN"; + case PRIO_ERROR: + return "ERROR"; + case PRIO_WARNING: + return "WARNING"; + case PRIO_NOTICE: + return "NOTICE"; + case PRIO_INFO: + return "INFO"; + case PRIO_DEBUG: + return "DEBUG"; + default: + return "UNKNOWN"; } } @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -41,7 +41,7 @@ class Log; -class LogStringBuilder +class LogStringBuilder { public: LogStringBuilder(LogStringBuilder const& src); @@ -77,15 +77,18 @@ public: private: Log() {}; ~Log() {}; - Log(const Log &l); - void operator=(const Log &l); + Log(const Log& l); + void operator=(const Log& l); static Log* inst; static Mutex instMutex; - class instanceCleaner { - public: ~instanceCleaner() { - if(Log::inst != 0) + class instanceCleaner + { + public: + ~instanceCleaner() { + if(Log::inst != 0) { delete Log::inst; + } } }; friend class instanceCleaner; diff --git a/src/logTargets.cpp b/src/logTargets.cpp index 5b19954..487ee8b 100644 --- a/src/logTargets.cpp +++ b/src/logTargets.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -62,23 +62,29 @@ LogTargetList::~LogTargetList() LogTargetList::target_type_t LogTargetList::targetTypeFromString(std::string type) { - if(type == "syslog") return TARGET_SYSLOG; - if(type == "file") return TARGET_FILE; - if(type == "stdout") return TARGET_STDOUT; - if(type == "stderr") return TARGET_STDERR; - if(type == "eventlog") return TARGET_WINEVENTLOG; + if(type == "syslog") { return TARGET_SYSLOG; } + if(type == "file") { return TARGET_FILE; } + if(type == "stdout") { return TARGET_STDOUT; } + if(type == "stderr") { return TARGET_STDERR; } + if(type == "eventlog") { return TARGET_WINEVENTLOG; } return TARGET_UNKNOWN; } std::string LogTargetList::targetTypeToString(target_type_t type) { switch(type) { - case TARGET_SYSLOG: return "syslog"; - case TARGET_FILE: return "file"; - case TARGET_STDOUT: return "stdout"; - case TARGET_STDERR: return "stderr"; - case TARGET_WINEVENTLOG: return "eventlog"; - default: return "unknown"; + case TARGET_SYSLOG: + return "syslog"; + case TARGET_FILE: + return "file"; + case TARGET_STDOUT: + return "stdout"; + case TARGET_STDERR: + return "stderr"; + case TARGET_WINEVENTLOG: + return "eventlog"; + default: + return "unknown"; } } @@ -87,23 +93,26 @@ LogTarget* LogTargetList::add(std::string conf) std::stringstream s(conf); std::string type; getline(s, type, ':'); - if(!s.good()) + if(!s.good()) { throw syntax_error(conf, 0); + } int prio = Log::PRIO_NOTICE; s >> prio; - if(s.fail()) + if(s.fail()) { throw syntax_error(conf, conf.find_first_of(':')+1); + } char buff[100]; if(s.good()) { s.get(buff[0]); - if(buff[0] != ',') + if(buff[0] != ',') { throw syntax_error(conf, (s.tellg() > 0) ? static_cast<size_t>(s.tellg()) - 1 : 0); + } s.get(buff, 100); - } - else + } else { buff[0] = 0; + } return add(targetTypeFromString(type), prio, buff); } @@ -112,50 +121,55 @@ LogTarget* LogTargetList::add(target_type_t type, int prio, std::string conf) { switch(type) { case TARGET_SYSLOG: { - #ifdef LOG_SYSLOG - if(!LogTargetSyslog::duplicateAllowed() && targets.count(TARGET_SYSLOG)) +#ifdef LOG_SYSLOG + if(!LogTargetSyslog::duplicateAllowed() && targets.count(TARGET_SYSLOG)) { AnytunError::throwErr() << targetTypeToString(TARGET_SYSLOG) << " logtarget is supported only once"; + } return targets.insert(TargetsMap::value_type(TARGET_SYSLOG, new LogTargetSyslog(prio, conf)))->second; - #else +#else AnytunError::throwErr() << targetTypeToString(TARGET_SYSLOG) << " logtarget is not supported"; - #endif +#endif } case TARGET_FILE: { - #ifdef LOG_FILE - if(!LogTargetFile::duplicateAllowed() && targets.count(TARGET_FILE)) +#ifdef LOG_FILE + if(!LogTargetFile::duplicateAllowed() && targets.count(TARGET_FILE)) { AnytunError::throwErr() << targetTypeToString(TARGET_FILE) << " logtarget is supported only once"; + } return targets.insert(TargetsMap::value_type(TARGET_FILE, new LogTargetFile(prio, conf)))->second; - #else +#else AnytunError::throwErr() << targetTypeToString(TARGET_FILE) << " logtarget is not supported"; - #endif +#endif } - case TARGET_STDOUT: + case TARGET_STDOUT: case TARGET_STDERR: { - #ifdef LOG_STDOUT - if(!LogTargetStdout::duplicateAllowed() && targets.count(type)) +#ifdef LOG_STDOUT + if(!LogTargetStdout::duplicateAllowed() && targets.count(type)) { AnytunError::throwErr() << targetTypeToString(type) << " logtarget is supported only once"; - - if(type == TARGET_STDERR) + } + + if(type == TARGET_STDERR) { return targets.insert(TargetsMap::value_type(type, new LogTargetStdout(prio, std::cerr)))->second; - else + } else { return targets.insert(TargetsMap::value_type(type, new LogTargetStdout(prio, std::cout)))->second; - #else + } +#else AnytunError::throwErr() << targetTypeToString(type) + " logtarget is not supported"; - #endif +#endif } case TARGET_WINEVENTLOG: { - #ifdef LOG_WINEVENTLOG - if(!LogTargetWinEventlog::duplicateAllowed() && targets.count(TARGET_WINEVENTLOG)) +#ifdef LOG_WINEVENTLOG + if(!LogTargetWinEventlog::duplicateAllowed() && targets.count(TARGET_WINEVENTLOG)) { AnytunError::throwErr() << targetTypeToString(TARGET_WINEVENTLOG) << " logtarget is supported only once"; + } return targets.insert(TargetsMap::value_type(TARGET_WINEVENTLOG, new LogTargetWinEventlog(prio, conf)))->second; - #else +#else AnytunError::throwErr() << targetTypeToString(TARGET_WINEVENTLOG) << " logtarget is not supported"; - #endif +#endif } - default: + default: AnytunError::throwErr() << "unknown log target"; } return NULL; @@ -164,17 +178,19 @@ LogTarget* LogTargetList::add(target_type_t type, int prio, std::string conf) void LogTargetList::clear() { TargetsMap::iterator it; - for(it = targets.begin(); it != targets.end(); ++it) + for(it = targets.begin(); it != targets.end(); ++it) { delete it->second; + } targets.clear(); } - + void LogTargetList::log(std::string msg, int prio) { TargetsMap::const_iterator it; for(it = targets.begin(); it != targets.end(); ++it) { - if(it->second->isEnabled() && it->second->getMaxPrio() >= prio) + if(it->second->isEnabled() && it->second->getMaxPrio() >= prio) { it->second->log(msg, prio); + } } } @@ -182,26 +198,26 @@ void LogTargetList::log(std::string msg, int prio) #ifdef LOG_SYSLOG int LogTargetSyslog::facilityFromString(std::string fac) { - if(fac == "user") return FAC_USER; - if(fac == "mail") return FAC_MAIL; - if(fac == "daemon") return FAC_DAEMON; - if(fac == "auth") return FAC_AUTH; - if(fac == "syslog") return FAC_SYSLOG; - if(fac == "lpr") return FAC_LPR; - if(fac == "news") return FAC_NEWS; - if(fac == "uucp") return FAC_UUCP; - if(fac == "cron") return FAC_CRON; - if(fac == "authpriv") return FAC_AUTHPRIV; - if(fac == "ftp") return FAC_FTP; - if(fac == "local0") return FAC_LOCAL0; - if(fac == "local1") return FAC_LOCAL1; - if(fac == "local2") return FAC_LOCAL2; - if(fac == "local3") return FAC_LOCAL3; - if(fac == "local4") return FAC_LOCAL4; - if(fac == "local5") return FAC_LOCAL5; - if(fac == "local6") return FAC_LOCAL6; - if(fac == "local7") return FAC_LOCAL7; - + if(fac == "user") { return FAC_USER; } + if(fac == "mail") { return FAC_MAIL; } + if(fac == "daemon") { return FAC_DAEMON; } + if(fac == "auth") { return FAC_AUTH; } + if(fac == "syslog") { return FAC_SYSLOG; } + if(fac == "lpr") { return FAC_LPR; } + if(fac == "news") { return FAC_NEWS; } + if(fac == "uucp") { return FAC_UUCP; } + if(fac == "cron") { return FAC_CRON; } + if(fac == "authpriv") { return FAC_AUTHPRIV; } + if(fac == "ftp") { return FAC_FTP; } + if(fac == "local0") { return FAC_LOCAL0; } + if(fac == "local1") { return FAC_LOCAL1; } + if(fac == "local2") { return FAC_LOCAL2; } + if(fac == "local3") { return FAC_LOCAL3; } + if(fac == "local4") { return FAC_LOCAL4; } + if(fac == "local5") { return FAC_LOCAL5; } + if(fac == "local6") { return FAC_LOCAL6; } + if(fac == "local7") { return FAC_LOCAL7; } + AnytunError::throwErr() << "unknown syslog facility"; return 0; } @@ -209,26 +225,46 @@ int LogTargetSyslog::facilityFromString(std::string fac) std::string LogTargetSyslog::facilityToString(int fac) { switch(fac) { - case FAC_USER: return "user"; - case FAC_MAIL: return "mail"; - case FAC_DAEMON: return "daemon"; - case FAC_AUTH: return "auth"; - case FAC_SYSLOG: return "syslog"; - case FAC_LPR: return "lpr"; - case FAC_NEWS: return "news"; - case FAC_UUCP: return "uucp"; - case FAC_CRON: return "cron"; - case FAC_AUTHPRIV: return "authpriv"; - case FAC_FTP: return "ftp"; - case FAC_LOCAL0: return "local0"; - case FAC_LOCAL1: return "local1"; - case FAC_LOCAL2: return "local2"; - case FAC_LOCAL3: return "local3"; - case FAC_LOCAL4: return "local4"; - case FAC_LOCAL5: return "local5"; - case FAC_LOCAL6: return "local6"; - case FAC_LOCAL7: return "local7"; - default: AnytunError::throwErr() << "unknown syslog facility"; + case FAC_USER: + return "user"; + case FAC_MAIL: + return "mail"; + case FAC_DAEMON: + return "daemon"; + case FAC_AUTH: + return "auth"; + case FAC_SYSLOG: + return "syslog"; + case FAC_LPR: + return "lpr"; + case FAC_NEWS: + return "news"; + case FAC_UUCP: + return "uucp"; + case FAC_CRON: + return "cron"; + case FAC_AUTHPRIV: + return "authpriv"; + case FAC_FTP: + return "ftp"; + case FAC_LOCAL0: + return "local0"; + case FAC_LOCAL1: + return "local1"; + case FAC_LOCAL2: + return "local2"; + case FAC_LOCAL3: + return "local3"; + case FAC_LOCAL4: + return "local4"; + case FAC_LOCAL5: + return "local5"; + case FAC_LOCAL6: + return "local6"; + case FAC_LOCAL7: + return "local7"; + default: + AnytunError::throwErr() << "unknown syslog facility"; } return ""; } @@ -244,16 +280,18 @@ LogTargetSyslog::LogTargetSyslog(int prio, std::string conf) : LogTarget(prio) } std::string fac; getline(s, fac, ','); - if(s.fail()) + if(s.fail()) { return; + } facility = LogTargetSyslog::facilityFromString(fac); } LogTargetSyslog::~LogTargetSyslog() { - if(opened) + if(opened) { close(); + } } void LogTargetSyslog::open() @@ -270,17 +308,19 @@ void LogTargetSyslog::close() void LogTargetSyslog::log(std::string msg, int prio) { - if(!opened) + if(!opened) { return; + } - syslog((prio + 2) | facility, "%s", msg.c_str()); + syslog((prio + 2) | facility, "%s", msg.c_str()); } LogTargetSyslog& LogTargetSyslog::setLogName(std::string l) { logname = l; - if(opened) + if(opened) { close(); + } open(); return *this; } @@ -288,8 +328,9 @@ LogTargetSyslog& LogTargetSyslog::setLogName(std::string l) LogTargetSyslog& LogTargetSyslog::setFacility(int f) { facility = f; - if(opened) + if(opened) { close(); + } open(); return *this; } @@ -301,14 +342,16 @@ LogTargetFile::LogTargetFile(int prio, std::string conf) : LogTarget(prio) { std::stringstream s(conf); getline(s, logfilename, ','); - if(s.fail()) + if(s.fail()) { logfilename = "anytun.log"; + } } LogTargetFile::~LogTargetFile() { - if(opened) + if(opened) { close(); + } } void LogTargetFile::open() @@ -319,15 +362,17 @@ void LogTargetFile::open() void LogTargetFile::close() { - if(logfile.is_open()) + if(logfile.is_open()) { logfile.close(); + } opened = false; } void LogTargetFile::log(std::string msg, int prio) { - if(!opened) + if(!opened) { return; + } std::string timestamp = boost::posix_time::to_simple_string(boost::posix_time::second_clock::local_time()); logfile << timestamp << " " << Log::prioToString(prio) << ": " << msg << std::endl; @@ -336,8 +381,9 @@ void LogTargetFile::log(std::string msg, int prio) LogTargetFile& LogTargetFile::setLogFilename(std::string l) { logfilename = l; - if(opened) + if(opened) { close(); + } open(); return *this; } @@ -351,8 +397,9 @@ LogTargetStdout::LogTargetStdout(int prio, std::ostream& s) : LogTarget(prio), s LogTargetStdout::~LogTargetStdout() { - if(opened) + if(opened) { close(); + } } void LogTargetStdout::open() @@ -367,8 +414,9 @@ void LogTargetStdout::close() void LogTargetStdout::log(std::string msg, int prio) { - if(!opened) + if(!opened) { return; + } std::string timestamp = boost::posix_time::to_simple_string(boost::posix_time::second_clock::local_time()); stream << timestamp << " " << Log::prioToString(prio) << ": " << msg << std::endl; @@ -381,48 +429,55 @@ LogTargetWinEventlog::LogTargetWinEventlog(int prio, std::string conf) : LogTarg { std::stringstream s(conf); getline(s, logname, ','); - if(s.fail()) + if(s.fail()) { logname = "anytun"; + } } LogTargetWinEventlog::~LogTargetWinEventlog() { - if(opened) + if(opened) { close(); + } } void LogTargetWinEventlog::open() { h_event_source = RegisterEventSourceA(NULL, logname.c_str()); - if(h_event_source) + if(h_event_source) { opened = true; + } } void LogTargetWinEventlog::close() { - if(h_event_source) + if(h_event_source) { DeregisterEventSource(h_event_source); + } opened = false; } void LogTargetWinEventlog::log(std::string msg, int prio) { - if(!opened) + if(!opened) { return; + } - LPCTSTR lpszStrings[1]; + LPCTSTR lpszStrings[1]; CHAR buffer[STERROR_TEXT_MAX]; StringCchPrintfA(buffer, STERROR_TEXT_MAX, "%s", msg.c_str()); lpszStrings[0] = buffer; - if(h_event_source) + if(h_event_source) { ReportEventA(h_event_source, prioToEventLogType(prio), 0, prio, NULL, 1, 0, lpszStrings, NULL); + } } LogTargetWinEventlog& LogTargetWinEventlog::setLogName(std::string l) { logname = l; - if(opened) + if(opened) { close(); + } open(); return *this; } @@ -430,12 +485,18 @@ LogTargetWinEventlog& LogTargetWinEventlog::setLogName(std::string l) WORD LogTargetWinEventlog::prioToEventLogType(int prio) { switch(prio) { - case Log::PRIO_ERROR: return EVENTLOG_ERROR_TYPE; - case Log::PRIO_WARNING: return EVENTLOG_WARNING_TYPE; - case Log::PRIO_NOTICE: return EVENTLOG_INFORMATION_TYPE; - case Log::PRIO_INFO: return EVENTLOG_SUCCESS; - case Log::PRIO_DEBUG: return EVENTLOG_INFORMATION_TYPE; - default: return EVENTLOG_ERROR_TYPE; + case Log::PRIO_ERROR: + return EVENTLOG_ERROR_TYPE; + case Log::PRIO_WARNING: + return EVENTLOG_WARNING_TYPE; + case Log::PRIO_NOTICE: + return EVENTLOG_INFORMATION_TYPE; + case Log::PRIO_INFO: + return EVENTLOG_SUCCESS; + case Log::PRIO_DEBUG: + return EVENTLOG_INFORMATION_TYPE; + default: + return EVENTLOG_ERROR_TYPE; } } #endif diff --git a/src/logTargets.h b/src/logTargets.h index 63156c1..a42d2c6 100644 --- a/src/logTargets.h +++ b/src/logTargets.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -64,7 +64,7 @@ public: int getMaxPrio() { return max_prio; }; void setMaxPrio(int p) { max_prio = p; }; - virtual void log(std::string msg, int prio) = 0; + virtual void log(std::string msg, int prio) = 0; protected: bool opened; @@ -72,11 +72,12 @@ protected: int max_prio; }; -class LogTargetList +class LogTargetList { public: - typedef enum { TARGET_UNKNOWN, TARGET_SYSLOG, TARGET_FILE, - TARGET_STDOUT, TARGET_STDERR, TARGET_WINEVENTLOG } target_type_t; + typedef enum { TARGET_UNKNOWN, TARGET_SYSLOG, TARGET_FILE, + TARGET_STDOUT, TARGET_STDERR, TARGET_WINEVENTLOG + } target_type_t; static target_type_t targetTypeFromString(std::string type); static std::string targetTypeToString(target_type_t type); @@ -85,7 +86,7 @@ public: LogTarget* add(std::string conf); LogTarget* add(target_type_t type, int prio, std::string conf); void clear(); - + void log(std::string msg, int prio); private: @@ -126,14 +127,14 @@ public: void open(); void close(); - void log(std::string msg, int prio); + void log(std::string msg, int prio); static bool duplicateAllowed() { return false; }; - LogTargetSyslog& setLogName(std::string l); + LogTargetSyslog& setLogName(std::string l); std::string getLogName() const { return logname; } LogTargetSyslog& setFacility(int f); int getFacility() const { return facility; } - + private: std::string logname; int facility; @@ -149,12 +150,12 @@ public: void open(); void close(); - void log(std::string msg, int prio); + void log(std::string msg, int prio); static bool duplicateAllowed() { return true; }; - LogTargetFile& setLogFilename(std::string l); + LogTargetFile& setLogFilename(std::string l); std::string getLogFilename() const { return logfilename; } - + private: std::string logfilename; std::ofstream logfile; @@ -170,7 +171,7 @@ public: void open(); void close(); - void log(std::string msg, int prio); + void log(std::string msg, int prio); static bool duplicateAllowed() { return false; }; private: @@ -189,10 +190,10 @@ public: void open(); void close(); - void log(std::string msg, int prio); + void log(std::string msg, int prio); static bool duplicateAllowed() { return false; }; - LogTargetWinEventlog& setLogName(std::string l); + LogTargetWinEventlog& setLogName(std::string l); std::string getLogName() const { return logname; }; private: diff --git a/src/networkAddress.cpp b/src/networkAddress.cpp index 7701159..f3b7544 100644 --- a/src/networkAddress.cpp +++ b/src/networkAddress.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -39,42 +39,41 @@ NetworkAddress::NetworkAddress():ipv4_address_(),ipv6_address_() { - network_address_type_=ipv4; + network_address_type_=ipv4; } -NetworkAddress::NetworkAddress(const NetworkAddress & ref) : mutex_(),ipv4_address_(ref.ipv4_address_),ipv6_address_(ref.ipv6_address_),ethernet_address_(ref.ethernet_address_),network_address_type_(ref.network_address_type_) +NetworkAddress::NetworkAddress(const NetworkAddress& ref) : mutex_(),ipv4_address_(ref.ipv4_address_),ipv6_address_(ref.ipv6_address_),ethernet_address_(ref.ethernet_address_),network_address_type_(ref.network_address_type_) { } -NetworkAddress::NetworkAddress(const std::string & address) +NetworkAddress::NetworkAddress(const std::string& address) { - boost::asio::ip::address addr = boost::asio::ip::address::from_string(address); - if (addr.is_v4()) - { - network_address_type_=ipv4; - ipv4_address_ = addr.to_v4(); - } else { - network_address_type_=ipv6; - ipv6_address_ = addr.to_v6(); - } + boost::asio::ip::address addr = boost::asio::ip::address::from_string(address); + if(addr.is_v4()) { + network_address_type_=ipv4; + ipv4_address_ = addr.to_v4(); + } else { + network_address_type_=ipv6; + ipv6_address_ = addr.to_v6(); + } } NetworkAddress::NetworkAddress(boost::asio::ip::address_v6 ipv6_address) { - network_address_type_=ipv6; - ipv6_address_ = ipv6_address; + network_address_type_=ipv6; + ipv6_address_ = ipv6_address; } NetworkAddress::NetworkAddress(boost::asio::ip::address_v4 ipv4_address) { - network_address_type_=ipv4; - ipv4_address_ = ipv4_address; + network_address_type_=ipv4; + ipv4_address_ = ipv4_address; } NetworkAddress::NetworkAddress(u_int64_t ethernet_address) { - network_address_type_=ethernet; - ethernet_address_=ethernet_address; + network_address_type_=ethernet; + ethernet_address_=ethernet_address; } @@ -82,123 +81,122 @@ NetworkAddress::~NetworkAddress() { } -NetworkAddress::NetworkAddress(const network_address_type_t type, const std::string & address ) +NetworkAddress::NetworkAddress(const network_address_type_t type, const std::string& address) { - setNetworkAddress( type, address); + setNetworkAddress(type, address); } -void NetworkAddress::setNetworkAddress(const network_address_type_t type, const std::string & address ) +void NetworkAddress::setNetworkAddress(const network_address_type_t type, const std::string& address) { - if (type==ipv4) - { - ipv4_address_=boost::asio::ip::address_v4::from_string(address); - } else if (type==ipv6) { - ipv6_address_=boost::asio::ip::address_v6::from_string(address); - } else if (type==ethernet) { - //TODO - } else { - //TODO - } - network_address_type_ = type; + if(type==ipv4) { + ipv4_address_=boost::asio::ip::address_v4::from_string(address); + } else if(type==ipv6) { + ipv6_address_=boost::asio::ip::address_v6::from_string(address); + } else if(type==ethernet) { + //TODO + } else { + //TODO + } + network_address_type_ = type; } void NetworkAddress::setNetworkAddress(boost::asio::ip::address_v4 addr) { - network_address_type_=ipv4; - ipv4_address_ = addr; + network_address_type_=ipv4; + ipv4_address_ = addr; } void NetworkAddress::setNetworkAddress(boost::asio::ip::address_v6 addr) { - network_address_type_=ipv6; - ipv6_address_ = addr; + network_address_type_=ipv6; + ipv6_address_ = addr; } void NetworkAddress::setNetworkAddress(u_int64_t addr) { - network_address_type_=ethernet; - ethernet_address_=addr; + network_address_type_=ethernet; + ethernet_address_=addr; } network_address_type_t NetworkAddress::getNetworkAddressType() const { - return network_address_type_; + return network_address_type_; } const boost::asio::ip::address_v4& NetworkAddress::getNetworkAddressV4() const { - if(network_address_type_ != ipv4) + if(network_address_type_ != ipv4) { AnytunError::throwErr() << "wrong address type"; - + } + return ipv4_address_; } const boost::asio::ip::address_v6& NetworkAddress::getNetworkAddressV6() const { - if(network_address_type_ != ipv6) + if(network_address_type_ != ipv6) { AnytunError::throwErr() << "wrong address type"; - + } + return ipv6_address_; } const u_int64_t NetworkAddress::getNetworkAdrressEther() const { - if(network_address_type_ != ethernet) + if(network_address_type_ != ethernet) { AnytunError::throwErr() << "wrong address type"; - + } + return ethernet_address_; } std::string NetworkAddress::toString() const { - if (network_address_type_==ipv4){ - return ipv4_address_.to_string(); - } - else if (network_address_type_==ipv6) { - return ipv6_address_.to_string(); - } - else if (network_address_type_==ethernet) { - // TODO - } + if(network_address_type_==ipv4) { + return ipv4_address_.to_string(); + } else if(network_address_type_==ipv6) { + return ipv6_address_.to_string(); + } else if(network_address_type_==ethernet) { + // TODO + } return std::string(""); } ipv4_bytes_type NetworkAddress::to_bytes_v4() const { - return ipv4_address_.to_bytes(); + return ipv4_address_.to_bytes(); } ipv6_bytes_type NetworkAddress::to_bytes_v6() const { - return ipv6_address_.to_bytes(); + return ipv6_address_.to_bytes(); } ethernet_bytes_type NetworkAddress::to_bytes_ethernet() const { - boost::array<unsigned char,6> result; - u_int64_t ether=ethernet_address_; - for (int i = 0; i < 6; i++) - { - result[i] = (unsigned char) (ether && 0xff); - ether >>= 8; - } - return result; -} - -bool NetworkAddress::operator<(const NetworkAddress &right) const -{ - if (network_address_type_!=right.network_address_type_) - AnytunError::throwErr() << "NetworkAddress::operator<() address types don't match"; - if (network_address_type_==ipv4) - { - return (ipv4_address_ < right.ipv4_address_); - } else if (network_address_type_==ipv6) { - return (ipv6_address_ < right.ipv6_address_); - } else if (network_address_type_==ethernet) { - return (ethernet_address_ < right.ethernet_address_); - } else { - //TODO - } - return false; + boost::array<unsigned char,6> result; + u_int64_t ether=ethernet_address_; + for(int i = 0; i < 6; i++) { + result[i] = (unsigned char)(ether && 0xff); + ether >>= 8; + } + return result; +} + +bool NetworkAddress::operator<(const NetworkAddress& right) const +{ + if(network_address_type_!=right.network_address_type_) { + AnytunError::throwErr() << "NetworkAddress::operator<() address types don't match"; + } + if(network_address_type_==ipv4) { + return (ipv4_address_ < right.ipv4_address_); + } else if(network_address_type_==ipv6) { + return (ipv6_address_ < right.ipv6_address_); + } else if(network_address_type_==ethernet) { + return (ethernet_address_ < right.ethernet_address_); + } else { + //TODO + } + return false; } diff --git a/src/networkAddress.h b/src/networkAddress.h index dc4c7ac..df4f788 100644 --- a/src/networkAddress.h +++ b/src/networkAddress.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -48,65 +48,62 @@ typedef boost::array<unsigned char,6> ethernet_bytes_type; typedef boost::asio::ip::address_v4::bytes_type ipv4_bytes_type; typedef boost::asio::ip::address_v6::bytes_type ipv6_bytes_type; -enum network_address_type_t -{ - ipv4=0, - ipv6=1, - ethernet=2 +enum network_address_type_t { + ipv4=0, + ipv6=1, + ethernet=2 }; class NetworkAddress { public: - NetworkAddress(); - NetworkAddress(const NetworkAddress &); - NetworkAddress(const std::string &); - NetworkAddress(boost::asio::ip::address_v6); - NetworkAddress(boost::asio::ip::address_v4); - NetworkAddress(u_int64_t); - NetworkAddress(const network_address_type_t type, const std::string & address ); - ~NetworkAddress(); - void setNetworkAddress(const network_address_type_t type, const std::string & address ); - void setNetworkAddress(boost::asio::ip::address_v4); - void setNetworkAddress(boost::asio::ip::address_v6); - void setNetworkAddress(u_int64_t); - network_address_type_t getNetworkAddressType() const; + NetworkAddress(); + NetworkAddress(const NetworkAddress&); + NetworkAddress(const std::string&); + NetworkAddress(boost::asio::ip::address_v6); + NetworkAddress(boost::asio::ip::address_v4); + NetworkAddress(u_int64_t); + NetworkAddress(const network_address_type_t type, const std::string& address); + ~NetworkAddress(); + void setNetworkAddress(const network_address_type_t type, const std::string& address); + void setNetworkAddress(boost::asio::ip::address_v4); + void setNetworkAddress(boost::asio::ip::address_v6); + void setNetworkAddress(u_int64_t); + network_address_type_t getNetworkAddressType() const; std::string toString() const; - bool operator<(const NetworkAddress &s) const; - ipv4_bytes_type to_bytes_v4() const; - ipv6_bytes_type to_bytes_v6() const; - ethernet_bytes_type to_bytes_ethernet() const; + bool operator<(const NetworkAddress& s) const; + ipv4_bytes_type to_bytes_v4() const; + ipv6_bytes_type to_bytes_v6() const; + ethernet_bytes_type to_bytes_ethernet() const; const boost::asio::ip::address_v4& getNetworkAddressV4() const; const boost::asio::ip::address_v6& getNetworkAddressV6() const; const u_int64_t getNetworkAdrressEther() const; protected: Mutex mutex_; - boost::asio::ip::address_v4 ipv4_address_; - boost::asio::ip::address_v6 ipv6_address_; - u_int64_t ethernet_address_; - network_address_type_t network_address_type_; + boost::asio::ip::address_v4 ipv4_address_; + boost::asio::ip::address_v6 ipv6_address_; + u_int64_t ethernet_address_; + network_address_type_t network_address_type_; private: - NetworkAddress operator=(const NetworkAddress &s); + NetworkAddress operator=(const NetworkAddress& s); friend class boost::serialization::access; template<class Archive> - void serialize(Archive & ar, const unsigned int version) - { - ar & network_address_type_; - if (network_address_type_==ipv4) - { - std::string ip(ipv4_address_.to_string()); - ar & ip; - ipv4_address_=boost::asio::ip::address_v4::from_string(ip); - } - if (network_address_type_==ipv6) - { - std::string ip(ipv6_address_.to_string()); - ar & ip; - ipv6_address_=boost::asio::ip::address_v6::from_string(ip); - } - if (network_address_type_==ethernet) - ar & ethernet_address_; - } + void serialize(Archive& ar, const unsigned int version) { + ar& network_address_type_; + if(network_address_type_==ipv4) { + std::string ip(ipv4_address_.to_string()); + ar& ip; + ipv4_address_=boost::asio::ip::address_v4::from_string(ip); + } + if(network_address_type_==ipv6) { + std::string ip(ipv6_address_.to_string()); + ar& ip; + ipv6_address_=boost::asio::ip::address_v6::from_string(ip); + } + if(network_address_type_==ethernet) { + ar& ethernet_address_; + } + } }; // for(int i=0;i<4;i++) diff --git a/src/networkPrefix.cpp b/src/networkPrefix.cpp index 31287b9..a6a2ef4 100644 --- a/src/networkPrefix.cpp +++ b/src/networkPrefix.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -40,31 +40,33 @@ NetworkPrefix::NetworkPrefix(): NetworkAddress(),length_(0) { } -NetworkPrefix::NetworkPrefix(const NetworkAddress & src,u_int8_t length): NetworkAddress(src),length_(length) +NetworkPrefix::NetworkPrefix(const NetworkAddress& src,u_int8_t length): NetworkAddress(src),length_(length) { } -NetworkPrefix::NetworkPrefix(const NetworkPrefix & src): NetworkAddress(src),length_(src.length_) +NetworkPrefix::NetworkPrefix(const NetworkPrefix& src): NetworkAddress(src),length_(src.length_) { } -void NetworkPrefix::setNetworkPrefixLength(u_int8_t length ) +void NetworkPrefix::setNetworkPrefixLength(u_int8_t length) { - length_ = length; + length_ = length; } u_int8_t NetworkPrefix::getNetworkPrefixLength() const { - return length_; + return length_; } -bool NetworkPrefix::operator<(const NetworkPrefix &right) const +bool NetworkPrefix::operator<(const NetworkPrefix& right) const { - if (network_address_type_!=right.network_address_type_) - return false; - if (right.length_!=length_) - return (length_<right.length_); - return static_cast<NetworkAddress>(*this)<static_cast<NetworkAddress>(right); + if(network_address_type_!=right.network_address_type_) { + return false; + } + if(right.length_!=length_) { + return (length_<right.length_); + } + return static_cast<NetworkAddress>(*this)<static_cast<NetworkAddress>(right); } diff --git a/src/networkPrefix.h b/src/networkPrefix.h index 1c023ed..43adb8c 100644 --- a/src/networkPrefix.h +++ b/src/networkPrefix.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -43,23 +43,22 @@ class NetworkPrefix : public NetworkAddress { public: - NetworkPrefix(); - NetworkPrefix(const NetworkAddress &, u_int8_t length); - NetworkPrefix(const NetworkPrefix &); - void setNetworkPrefixLength(u_int8_t length ); - u_int8_t getNetworkPrefixLength() const; - bool operator<(const NetworkPrefix &s) const; + NetworkPrefix(); + NetworkPrefix(const NetworkAddress&, u_int8_t length); + NetworkPrefix(const NetworkPrefix&); + void setNetworkPrefixLength(u_int8_t length); + u_int8_t getNetworkPrefixLength() const; + bool operator<(const NetworkPrefix& s) const; private: - operator NetworkAddress(); - void operator=(const NetworkPrefix &s); - u_int8_t length_; + operator NetworkAddress(); + void operator=(const NetworkPrefix& s); + u_int8_t length_; friend class boost::serialization::access; template<class Archive> - void serialize(Archive & ar, const unsigned int version) - { - ar & length_; - ar & boost::serialization::base_object<NetworkAddress>(*this); + void serialize(Archive& ar, const unsigned int version) { + ar& length_; + ar& boost::serialization::base_object<NetworkAddress>(*this); }; }; diff --git a/src/nullDaemon.cpp b/src/nullDaemon.cpp index 5c1235c..8adcb50 100644 --- a/src/nullDaemon.cpp +++ b/src/nullDaemon.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -34,22 +34,22 @@ void DaemonService::initPrivs(std::string const& username, std::string const& groupname) { -// nothing here + // nothing here } void DaemonService::dropPrivs() { -// nothing here + // nothing here } void DaemonService::chroot(std::string const& chrootdir) { -// nothing here + // nothing here } void DaemonService::daemonize() { -// nothing here + // nothing here } bool DaemonService::isDaemonized() diff --git a/src/nullDaemon.h b/src/nullDaemon.h index 379b300..7f5ec5a 100644 --- a/src/nullDaemon.h +++ b/src/nullDaemon.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. diff --git a/src/options.cpp b/src/options.cpp index 5d70751..863d457 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -48,7 +48,7 @@ std::ostream& operator<<(std::ostream& stream, syntax_error const& error) stream << "syntax error: " << error.what() << std::endl; if(error.pos >= 0) { stream << " "; - for(int32_t i = 0; i < error.pos; ++i) stream << " "; + for(int32_t i = 0; i < error.pos; ++i) { stream << " "; } return stream << "^"; } return stream; @@ -57,10 +57,16 @@ std::ostream& operator<<(std::ostream& stream, syntax_error const& error) std::ostream& operator<<(std::ostream& stream, role_t const& role) { switch(role) { - case ROLE_LEFT: stream << "left"; break; - case ROLE_RIGHT: stream << "right"; break; - default: stream << "unknown"; break; - } + case ROLE_LEFT: + stream << "left"; + break; + case ROLE_RIGHT: + stream << "right"; + break; + default: + stream << "unknown"; + break; + } return stream; } @@ -69,30 +75,32 @@ void OptionHost::init(std::string addrPort) std::string origAddrPort(addrPort); size_t pos = addrPort.find_first_of("["); - if(pos != std::string::npos && pos != 0) - throw syntax_error(origAddrPort, pos); // an [ was found but not at the beginning; + if(pos != std::string::npos && pos != 0) { + throw syntax_error(origAddrPort, pos); // an [ was found but not at the beginning; + } bool hasPort = false; if(pos != std::string::npos) { addrPort.erase(pos, 1); pos = addrPort.find_first_of("]"); - if(pos == std::string::npos) - throw syntax_error(origAddrPort, origAddrPort.length()); //no trailing ] although an leading [ was found + if(pos == std::string::npos) { + throw syntax_error(origAddrPort, origAddrPort.length()); //no trailing ] although an leading [ was found + } if(pos < addrPort.length()-2) { - if(addrPort[pos+1] != ':') - throw syntax_error(origAddrPort, pos+2); // wrong port delimieter + if(addrPort[pos+1] != ':') { + throw syntax_error(origAddrPort, pos+2); // wrong port delimieter + } addrPort[pos+1] = '/'; hasPort = true; + } else if(pos != addrPort.length()-1) { + throw syntax_error(origAddrPort, pos+2); // too few characters left } - else if(pos != addrPort.length()-1) - throw syntax_error(origAddrPort, pos+2); // too few characters left addrPort.erase(pos, 1); - } - else { + } else { pos = addrPort.find_first_of(":"); if(pos != std::string::npos && pos == addrPort.find_last_of(":")) { // an ':' has been found and it is the only one -> assuming port present @@ -105,12 +113,12 @@ void OptionHost::init(std::string addrPort) std::stringstream tmp_stream(addrPort); getline(tmp_stream, addr, '/'); - if(!tmp_stream.good()) + if(!tmp_stream.good()) { throw syntax_error(origAddrPort, addr.length()); + } tmp_stream >> port; - } - else { + } else { addr = addrPort; port = "2323"; // default sync port } @@ -124,12 +132,13 @@ std::istream& operator>>(std::istream& stream, OptionHost& host) return stream; } -void OptionNetwork::init(std::string network) +void OptionNetwork::init(std::string network) { std::stringstream tmp_stream(network); getline(tmp_stream, net_addr, '/'); - if(!tmp_stream.good()) + if(!tmp_stream.good()) { throw syntax_error(network, net_addr.length()); + } tmp_stream >> prefix_length; } @@ -149,9 +158,10 @@ Options& Options::instance() { Lock lock(instMutex); static instanceCleaner c; - if(!inst) + if(!inst) { inst = new Options(); - + } + return *inst; } @@ -368,29 +378,27 @@ bool Options::parse(int argc, char* argv[]) argc--; bool ipv4_only = false, ipv6_only = false; std::string role = ""; - for(int i=1; argc > 0; ++i) - { + for(int i=1; argc > 0; ++i) { std::string str(argv[i]); argc--; if(str == "-h" || str == "--help") { printUsage(); return false; - } - else if(str == "-v" || str == "--version") { + } else if(str == "-v" || str == "--version") { printVersion(); return false; } #if defined(ANYTUN_OPTIONS) || defined(ANYCTR_OPTIONS) - #ifndef _MSC_VER +#ifndef _MSC_VER PARSE_INVERSE_BOOL_PARAM("-D","--nodaemonize", daemonize_, NOTHING) PARSE_SCALAR_PARAM("-u","--username", username_, NOTHING) PARSE_SCALAR_PARAM("-g","--groupname", groupname_, NOTHING) PARSE_SCALAR_PARAM("-C","--chroot", chroot_dir_, NOTHING) PARSE_SCALAR_PARAM("-P","--write-pid", pid_file_, NOTHING) - #endif +#endif #endif @@ -433,70 +441,75 @@ bool Options::parse(int argc, char* argv[]) #endif #if defined(ANYTUN_OPTIONS) || defined(ANYCONF_OPTIONS) - #ifndef NO_ROUTING +#ifndef NO_ROUTING PARSE_CSLIST_PARAM("-R","--route", routes_, OptionNetwork, connection_opts = true) - #endif +#endif PARSE_SCALAR_PARAM("-m","--mux", mux_, connection_opts = true) PARSE_SCALAR_PARAM("-w","--window-size", seq_window_size_, connection_opts = true) - #ifndef NO_CRYPT +#ifndef NO_CRYPT PARSE_SCALAR_PARAM("-k","--kd-prf", kd_prf_, connection_opts = true) PARSE_SCALAR_PARAM("-e","--role", role, connection_opts = true) - #ifndef NO_PASSPHRASE +#ifndef NO_PASSPHRASE PARSE_PHRASE_PARAM_SEC("-E","--passphrase", passphrase_, connection_opts = true) - #endif +#endif PARSE_HEXSTRING_PARAM_SEC("-K","--key", key_, connection_opts = true) PARSE_HEXSTRING_PARAM_SEC("-A","--salt", salt_, connection_opts = true) - #endif +#endif #endif #if defined(ANYTUN_OPTIONS) - #ifndef NO_CRYPT +#ifndef NO_CRYPT PARSE_SCALAR_PARAM("-c","--cipher", cipher_, NOTHING) PARSE_SCALAR_PARAM("-a","--auth-algo", auth_algo_, NOTHING) PARSE_SCALAR_PARAM("-b","--auth-tag-length", auth_tag_length_, NOTHING) - #endif +#endif #endif - else + else { throw syntax_error(str, 0); + } } - if(ipv4_only && ipv6_only) + if(ipv4_only && ipv6_only) { throw syntax_error("-4 and -6 are mutual exclusive", -1); - if(ipv4_only) + } + if(ipv4_only) { resolv_addr_type_ = IPV4_ONLY; - if(ipv6_only) + } + if(ipv6_only) { resolv_addr_type_ = IPV6_ONLY; + } if(role != "") { - if(role == "alice" || role == "server" || role == "left") + if(role == "alice" || role == "server" || role == "left") { role_ = ROLE_LEFT; - else if(role == "bob" || role == "client" || role == "right") + } else if(role == "bob" || role == "client" || role == "right") { role_ = ROLE_RIGHT; - else - throw syntax_error("unknown role name: " + role, -1); + } else { + throw syntax_error("unknown role name: " + role, -1); + } } if(debug_) { log_targets_.push_back("stdout:5"); - daemonize_ = false; + daemonize_ = false; } if(log_targets_.empty()) { #ifndef _MSC_VER - #if !defined(ANYCONF_OPTIONS) +#if !defined(ANYCONF_OPTIONS) log_targets_.push_back(std::string("syslog:3,").append(progname_).append(",daemon")); - #else +#else log_targets_.push_back("stderr:2"); - #endif +#endif #else - #ifdef WIN_SERVICE +#ifdef WIN_SERVICE log_targets_.push_back(std::string("eventlog:3,").append(progname_)); - #else +#else log_targets_.push_back("stdout:3"); - #endif +#endif #endif } @@ -506,24 +519,28 @@ bool Options::parse(int argc, char* argv[]) void Options::parse_post() { #if defined(ANYTUN_OPTIONS) - if(cluster_opts && connection_opts) + if(cluster_opts && connection_opts) { cLog.msg(Log::PRIO_WARNING) << "you have provided options for cluster support as well as connection oriented options, we strongly recommend to use anytun-config and anytun-controld when building a cluster"; + } - if(cipher_ == "null" && auth_algo_ == "null") + if(cipher_ == "null" && auth_algo_ == "null") { kd_prf_ = "null"; - if((cipher_ != "null" || auth_algo_ != "null") && kd_prf_ == "null") + } + if((cipher_ != "null" || auth_algo_ != "null") && kd_prf_ == "null") { cLog.msg(Log::PRIO_WARNING) << "using NULL key derivation with encryption and or authentication enabled!"; + } u_int32_t tag_len_max = AuthAlgoFactory::getDigestLength(auth_algo_); - if(!tag_len_max) auth_tag_length_ = 0; + if(!tag_len_max) { auth_tag_length_ = 0; } else if(tag_len_max < auth_tag_length_) { cLog.msg(Log::PRIO_WARNING) << auth_algo_ << " auth algo can't generate tags of length " << auth_tag_length_ << ", using maximum tag length(" << tag_len_max << ")"; auth_tag_length_ = tag_len_max; } #endif - if(dev_name_ == "" && dev_type_ == "") + if(dev_name_ == "" && dev_type_ == "") { dev_type_ = "tun"; + } } void Options::printVersion() @@ -556,13 +573,13 @@ void Options::printUsage() #if defined(ANYTUN_OPTIONS) || defined(ANYCTR_OPTIONS) - #ifndef _MSC_VER +#ifndef _MSC_VER std::cout << " [-D|--nodaemonize] don't run in background" << std::endl; std::cout << " [-u|--username] <username> change to this user" << std::endl; std::cout << " [-g|--groupname] <groupname> change to this group" << std::endl; std::cout << " [-C|--chroot] <path> chroot to this directory" << std::endl; std::cout << " [-P|--write-pid] <path> write pid to this file" << std::endl; - #endif +#endif #endif @@ -610,31 +627,31 @@ void Options::printUsage() #endif #if defined(ANYTUN_OPTIONS) || defined(ANYCONF_OPTIONS) - #ifndef NO_ROUTING +#ifndef NO_ROUTING std::cout << " [-R|--route] <net>/<prefix length> add a route to connection, can be invoked several times" << std::endl; - #endif +#endif std::cout << " [-m|--mux] <mux-id> the multiplex id to use" << std::endl; std::cout << " [-w|--window-size] <window size> seqence number window size" << std::endl; - #ifndef NO_CRYPT +#ifndef NO_CRYPT std::cout << " [-k|--kd-prf] <kd-prf type> key derivation pseudo random function" << std::endl; std::cout << " [-e|--role] <role> left (alice) or right (bob)" << std::endl; - #ifndef NO_PASSPHRASE +#ifndef NO_PASSPHRASE std::cout << " [-E|--passphrase] <pass phrase> a passprhase to generate master key and salt from" << std::endl; - #endif +#endif std::cout << " [-K|--key] <master key> master key to use for encryption" << std::endl; std::cout << " [-A|--salt] <master salt> master salt to use for encryption" << std::endl; - #endif +#endif #endif #if defined(ANYTUN_OPTIONS) - #ifndef NO_CRYPT +#ifndef NO_CRYPT std::cout << " [-c|--cipher] <cipher type> payload encryption algorithm" << std::endl; std::cout << " [-a|--auth-algo] <algo type> message authentication algorithm" << std::endl; std::cout << " [-b|--auth-tag-length] length of the auth tag" << std::endl; - #endif +#endif #endif } @@ -653,8 +670,9 @@ void Options::printOptions() std::cout << std::endl; std::cout << "log_targets:"; StringList::const_iterator lit = log_targets_.begin(); - for(; lit != log_targets_.end(); ++lit) + for(; lit != log_targets_.end(); ++lit) { std::cout << " '" << *lit << "',"; + } std::cout << std::endl; std::cout << "debug = " << debug_ << std::endl; std::cout << std::endl; @@ -664,10 +682,18 @@ void Options::printOptions() std::cout << std::endl; std::cout << "resolv_addr_type = "; switch(resolv_addr_type_) { - case ANY: std::cout << "any" << std::endl; break; - case IPV4_ONLY: std::cout << "ipv4-only" << std::endl; break; - case IPV6_ONLY: std::cout << "ipv6-only" << std::endl; break; - default: std::cout << "?" << std::endl; break; + case ANY: + std::cout << "any" << std::endl; + break; + case IPV4_ONLY: + std::cout << "ipv4-only" << std::endl; + break; + case IPV6_ONLY: + std::cout << "ipv6-only" << std::endl; + break; + default: + std::cout << "?" << std::endl; + break; } std::cout << std::endl; std::cout << "local.addr = '" << local_.addr << "'" << std::endl; @@ -678,8 +704,9 @@ void Options::printOptions() std::cout << "local_sync.port = '" << local_sync_.port << "'" << std::endl; std::cout << "remote_sync_hosts:" << std::endl; HostList::const_iterator hit = remote_sync_hosts_.begin(); - for(; hit != remote_sync_hosts_.end(); ++hit) + for(; hit != remote_sync_hosts_.end(); ++hit) { std::cout << " '" << hit->addr << "','" << hit->port << "'" << std::endl; + } std::cout << std::endl; std::cout << "dev_name = '" << dev_name_ << "'" << std::endl; std::cout << "dev_type = '" << dev_type_ << "'" << std::endl; @@ -687,8 +714,9 @@ void Options::printOptions() std::cout << "post_up_script = '" << post_up_script_ << "'" << std::endl; std::cout << "routes:" << std::endl; NetworkList::const_iterator rit; - for(rit = routes_.begin(); rit != routes_.end(); ++rit) + for(rit = routes_.begin(); rit != routes_.end(); ++rit) { std::cout << " " << rit->net_addr << "/" << rit->prefix_length << std::endl; + } std::cout << std::endl; std::cout << "sender_id = '" << sender_id_ << "'" << std::endl; std::cout << "mux_id = " << mux_ << std::endl; @@ -700,9 +728,15 @@ void Options::printOptions() std::cout << "kd_prf = '" << kd_prf_ << "'" << std::endl; std::cout << "role = "; switch(role_) { - case ROLE_LEFT: std::cout << "left" << std::endl; break; - case ROLE_RIGHT: std::cout << "right" << std::endl; break; - default: std::cout << "??" << std::endl; break; + case ROLE_LEFT: + std::cout << "left" << std::endl; + break; + case ROLE_RIGHT: + std::cout << "right" << std::endl; + break; + default: + std::cout << "??" << std::endl; + break; } std::cout << "passphrase = '" << passphrase_ << "'" << std::endl; std::cout << "key = " << key_.getHexDumpOneLine() << std::endl; @@ -839,7 +873,7 @@ Options& Options::setBindToAddr(std::string b) std::string Options::getBindToPort() { ReadersLock lock(mutex); - return bind_to_.port; + return bind_to_.port; } Options& Options::setBindToPort(std::string b) diff --git a/src/options.h b/src/options.h index 7a58c58..02b0c1b 100644 --- a/src/options.h +++ b/src/options.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -56,7 +56,7 @@ public: void init(std::string addrPort); std::string addr; - std::string port; + std::string port; }; typedef std::list<OptionHost> HostList; std::istream& operator>>(std::istream& stream, OptionHost& host); @@ -131,7 +131,7 @@ public: Options& setLocalSyncAddr(std::string l); std::string getLocalSyncPort(); Options& setLocalSyncPort(std::string l); - HostList getRemoteSyncHosts(); + HostList getRemoteSyncHosts(); std::string getDevName(); Options& setDevName(std::string d); @@ -171,15 +171,18 @@ public: private: Options(); ~Options(); - Options(const Options &l); - void operator=(const Options &l); + Options(const Options& l); + void operator=(const Options& l); static Options* inst; static ::Mutex instMutex; - class instanceCleaner { - public: ~instanceCleaner() { - if(Options::inst != 0) + class instanceCleaner + { + public: + ~instanceCleaner() { + if(Options::inst != 0) { delete Options::inst; + } } }; friend class instanceCleaner; @@ -208,7 +211,7 @@ private: OptionHost remote_; OptionHost local_sync_; - HostList remote_sync_hosts_; + HostList remote_sync_hosts_; std::string dev_name_; std::string dev_type_; diff --git a/src/packetSource.cpp b/src/packetSource.cpp index a5443ad..9a86ef4 100644 --- a/src/packetSource.cpp +++ b/src/packetSource.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -55,11 +55,11 @@ UDPPacketSource::UDPPacketSource(std::string localaddr, std::string port) UDPPacketSource::~UDPPacketSource() { std::list<SocketsElement>::iterator it = sockets_.begin(); - for(;it != sockets_.end(); ++it) { -/// this might be a needed by the receiver thread, TODO cleanup -// delete[](it->buf_); -// delete(it->sem_); -// delete(it->sock_); + for(; it != sockets_.end(); ++it) { + /// this might be a needed by the receiver thread, TODO cleanup + // delete[](it->buf_); + // delete(it->sem_); + // delete(it->sock_); } } @@ -74,13 +74,15 @@ void UDPPacketSource::onResolve(PacketSourceResolverIt& it) sock.len_ = 0; sock.sem_ = NULL; sock.sock_ = new proto::socket(io_service_); - if(!sock.sock_) + if(!sock.sock_) { AnytunError::throwErr() << "memory error"; + } sock.sock_->open(e.protocol()); #ifndef _MSC_VER - if(e.protocol() == proto::v6()) + if(e.protocol() == proto::v6()) { sock.sock_->set_option(boost::asio::ip::v6_only(true)); + } #endif sock.sock_->bind(e); sockets_.push_back(sock); @@ -88,15 +90,16 @@ void UDPPacketSource::onResolve(PacketSourceResolverIt& it) it++; } - // prepare multi-socket recv + // prepare multi-socket recv if(sockets_.size() > 1) { std::list<SocketsElement>::iterator it = sockets_.begin(); - for(;it != sockets_.end(); ++it) { + for(; it != sockets_.end(); ++it) { it->len_ = MAX_PACKET_LENGTH; it->buf_ = new u_int8_t[it->len_]; - if(!it->buf_) + if(!it->buf_) { AnytunError::throwErr() << "memory error"; - + } + it->sem_ = new Semaphore(); if(!it->sem_) { delete[](it->buf_); @@ -136,8 +139,9 @@ void UDPPacketSource::recv_thread(std::list<SocketsElement>::iterator it) u_int32_t UDPPacketSource::recv(u_int8_t* buf, u_int32_t len, PacketSourceEndpoint& remote) { - if(sockets_.size() == 1) + if(sockets_.size() == 1) { return static_cast<u_int32_t>(sockets_.front().sock_->receive_from(boost::asio::buffer(buf, len), remote)); + } thread_result_sem_.down(); ThreadResult result; @@ -157,7 +161,7 @@ u_int32_t UDPPacketSource::recv(u_int8_t* buf, u_int32_t len, PacketSourceEndpoi void UDPPacketSource::send(u_int8_t* buf, u_int32_t len, PacketSourceEndpoint remote) { std::list<SocketsElement>::iterator it = sockets_.begin(); - for(;it != sockets_.end(); ++it) { + for(; it != sockets_.end(); ++it) { if(it->sock_->local_endpoint().protocol() == remote.protocol()) { it->sock_->send_to(boost::asio::buffer(buf, len), remote); return; diff --git a/src/packetSource.h b/src/packetSource.h index d5ee736..286c9df 100644 --- a/src/packetSource.h +++ b/src/packetSource.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -60,7 +60,7 @@ protected: }; class UDPPacketSource : public PacketSource -{ +{ public: typedef boost::asio::ip::udp proto; @@ -75,7 +75,7 @@ public: private: boost::asio::io_service io_service_; - + typedef struct { u_int8_t* buf_; u_int32_t len_; diff --git a/src/plainPacket.cpp b/src/plainPacket.cpp index 79a72de..0fa21e6 100644 --- a/src/plainPacket.cpp +++ b/src/plainPacket.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -51,48 +51,52 @@ u_int32_t PlainPacket::getHeaderLength() payload_type_t PlainPacket::getPayloadType() const { - if(payload_type_) + if(payload_type_) { return PAYLOAD_TYPE_T_NTOH(*payload_type_); + } return 0; } void PlainPacket::setPayloadType(payload_type_t payload_type) { - if(!payload_type_) + if(!payload_type_) { return; - + } + if(payload_type == PAYLOAD_TYPE_TUN) { if(!payload_) { *payload_type_ = PAYLOAD_TYPE_T_HTON(PAYLOAD_TYPE_TUN); return; } - char * ip_version_ptr = reinterpret_cast<char *>(payload_); - char ip_version = ip_version_ptr[0]; - ip_version >>=4; - if(ip_version == 4) + char* ip_version_ptr = reinterpret_cast<char*>(payload_); + char ip_version = ip_version_ptr[0]; + ip_version >>=4; + if(ip_version == 4) { *payload_type_ = PAYLOAD_TYPE_T_HTON(PAYLOAD_TYPE_TUN4); - else if(ip_version == 6) + } else if(ip_version == 6) { *payload_type_ = PAYLOAD_TYPE_T_HTON(PAYLOAD_TYPE_TUN6); - } - else + } + } else { *payload_type_ = PAYLOAD_TYPE_T_HTON(payload_type); + } } u_int32_t PlainPacket::getPayloadLength() const { - if(!payload_) + if(!payload_) { return 0; + } return (length_ > sizeof(payload_type_t)) ? (length_ - sizeof(payload_type_t)) : 0; } - + void PlainPacket::setPayloadLength(u_int32_t payload_length) { Buffer::setLength(payload_length + sizeof(payload_type_t)); - // depending on allow_realloc buf_ may point to another address - // therefore in this case reinit() gets called by Buffer::setLength() + // depending on allow_realloc buf_ may point to another address + // therefore in this case reinit() gets called by Buffer::setLength() } void PlainPacket::reinit() @@ -100,12 +104,13 @@ void PlainPacket::reinit() payload_type_ = reinterpret_cast<payload_type_t*>(buf_); payload_ = buf_ + sizeof(payload_type_t); - if(length_ <= (sizeof(payload_type_t))) + if(length_ <= (sizeof(payload_type_t))) { payload_ = NULL; + } if(length_ < (sizeof(payload_type_t))) { payload_type_ = NULL; - AnytunError::throwErr() << "plain packet can't be initialized, buffer is too small"; + AnytunError::throwErr() << "plain packet can't be initialized, buffer is too small"; } } @@ -147,35 +152,35 @@ NetworkAddress PlainPacket::getSrcAddr() const NetworkAddress PlainPacket::getDstAddr() const { - if(!payload_type_ || !payload_) - return NetworkAddress(); - - payload_type_t type = PAYLOAD_TYPE_T_NTOH(*payload_type_); - - if(type == PAYLOAD_TYPE_TAP) // Ehternet - { - // TODO - return NetworkAddress(); - } - else if(type == PAYLOAD_TYPE_TUN4) // IPv4 - { - if(length_ < (sizeof(payload_type_t)+5*4)) - return NetworkAddress(); - char * hdr = reinterpret_cast<char *>(payload_); - boost::asio::ip::address_v4::bytes_type ip_octets; - for (int i=0; i<4;i++) - ip_octets[i]=hdr[4*4+i]; - return NetworkAddress(boost::asio::ip::address_v4(ip_octets)); - } - else if(type == PAYLOAD_TYPE_TUN6) // IPv6 - { - if(length_ < (sizeof(payload_type_t)+2*16+2*4)) - return NetworkAddress(); - char * hdr = reinterpret_cast<char *>(payload_); - boost::asio::ip::address_v6::bytes_type ip_octets; - for (int i=0; i<16;i++) - ip_octets[i]=hdr[2*4+16+i]; - return NetworkAddress(boost::asio::ip::address_v6(ip_octets)); - } - return NetworkAddress(); + if(!payload_type_ || !payload_) { + return NetworkAddress(); + } + + payload_type_t type = PAYLOAD_TYPE_T_NTOH(*payload_type_); + + if(type == PAYLOAD_TYPE_TAP) { // Ehternet + // TODO + return NetworkAddress(); + } else if(type == PAYLOAD_TYPE_TUN4) { // IPv4 + if(length_ < (sizeof(payload_type_t)+5*4)) { + return NetworkAddress(); + } + char* hdr = reinterpret_cast<char*>(payload_); + boost::asio::ip::address_v4::bytes_type ip_octets; + for(int i=0; i<4; i++) { + ip_octets[i]=hdr[4*4+i]; + } + return NetworkAddress(boost::asio::ip::address_v4(ip_octets)); + } else if(type == PAYLOAD_TYPE_TUN6) { // IPv6 + if(length_ < (sizeof(payload_type_t)+2*16+2*4)) { + return NetworkAddress(); + } + char* hdr = reinterpret_cast<char*>(payload_); + boost::asio::ip::address_v6::bytes_type ip_octets; + for(int i=0; i<16; i++) { + ip_octets[i]=hdr[2*4+16+i]; + } + return NetworkAddress(boost::asio::ip::address_v6(ip_octets)); + } + return NetworkAddress(); } diff --git a/src/plainPacket.h b/src/plainPacket.h index 8cf0368..2aa7115 100644 --- a/src/plainPacket.h +++ b/src/plainPacket.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -47,14 +47,14 @@ class Cipher; #define PAYLOAD_TYPE_TAP 0x6558 #define PAYLOAD_TYPE_TUN 0x0000 #define PAYLOAD_TYPE_TUN4 0x0800 -#define PAYLOAD_TYPE_TUN6 0x86DD +#define PAYLOAD_TYPE_TUN6 0x86DD class PlainPacket : public Buffer { public: /** * Packet constructor - * @param the length of the payload + * @param the length of the payload * @param allow reallocation of buffer */ PlainPacket(u_int32_t payload_length, bool allow_realloc = false); @@ -72,7 +72,7 @@ public: /** * Get the payload type - * @return the id of the payload type + * @return the id of the payload type */ payload_type_t getPayloadType() const; @@ -100,12 +100,12 @@ public: */ u_int8_t* getPayload(); -// NetworkAddress getSrcAddr() const; + // NetworkAddress getSrcAddr() const; NetworkAddress getDstAddr() const; private: PlainPacket(); - PlainPacket(const PlainPacket &src); + PlainPacket(const PlainPacket& src); void reinit(); diff --git a/src/posix/posixDaemon.cpp b/src/posix/posixDaemon.cpp index e4a4148..96cad00 100644 --- a/src/posix/posixDaemon.cpp +++ b/src/posix/posixDaemon.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -49,112 +49,131 @@ DaemonService::DaemonService() : pw_(NULL), gr_(NULL), daemonized_(false) void DaemonService::initPrivs(std::string const& username, std::string const& groupname) { - if(username == "") + if(username == "") { return; - + } + pw_ = getpwnam(username.c_str()); - if(!pw_) + if(!pw_) { AnytunError::throwErr() << "unknown user " << username; - - if(groupname != "") + } + + if(groupname != "") { gr_ = getgrnam(groupname.c_str()); - else + } else { gr_ = getgrgid(pw_->pw_gid); - - if(!gr_) + } + + if(!gr_) { AnytunError::throwErr() << "unknown group " << groupname; + } } void DaemonService::dropPrivs() { - if(!pw_ || !gr_) + if(!pw_ || !gr_) { return; - - if(setgid(gr_->gr_gid)) + } + + if(setgid(gr_->gr_gid)) { AnytunError::throwErr() << "setgid('" << gr_->gr_name << "') failed: " << AnytunErrno(errno); - + } + gid_t gr_list[1]; gr_list[0] = gr_->gr_gid; - if(setgroups (1, gr_list)) + if(setgroups(1, gr_list)) { AnytunError::throwErr() << "setgroups(['" << gr_->gr_name << "']) failed: " << AnytunErrno(errno); - - if(setuid(pw_->pw_uid)) + } + + if(setuid(pw_->pw_uid)) { AnytunError::throwErr() << "setuid('" << pw_->pw_name << "') failed: " << AnytunErrno(errno); - + } + cLog.msg(Log::PRIO_NOTICE) << "dropped privileges to " << pw_->pw_name << ":" << gr_->gr_name; } void DaemonService::chroot(std::string const& chrootdir) { - if (getuid() != 0) + if(getuid() != 0) { AnytunError::throwErr() << "this program has to be run as root in order to run in a chroot"; + } - if(::chroot(chrootdir.c_str())) + if(::chroot(chrootdir.c_str())) { AnytunError::throwErr() << "can't chroot to " << chrootdir; + } cLog.msg(Log::PRIO_NOTICE) << "we are in chroot jail (" << chrootdir << ") now" << std::endl; - if(chdir("/")) + if(chdir("/")) { AnytunError::throwErr() << "can't change to /"; + } } /// TODO: this outstandignly ugly please and i really can't stress the please fix it asap!!!!!!! -std::ofstream pidFile; // FIXXXME no global variable +std::ofstream pidFile; // FIXXXME no global variable void DaemonService::daemonize() { -// std::ofstream pidFile; + // std::ofstream pidFile; if(gOpt.getPidFile() != "") { pidFile.open(gOpt.getPidFile().c_str()); - if(!pidFile.is_open()) + if(!pidFile.is_open()) { AnytunError::throwErr() << "can't open pid file (" << gOpt.getPidFile() << "): " << AnytunErrno(errno); + } } pid_t pid; pid = fork(); - if(pid < 0) + if(pid < 0) { AnytunError::throwErr() << "daemonizing failed at fork(): " << AnytunErrno(errno) << ", exitting"; + } - if(pid) exit(0); + if(pid) { exit(0); } umask(0); - if(setsid() < 0) + if(setsid() < 0) { AnytunError::throwErr() << "daemonizing failed at setsid(): " << AnytunErrno(errno) << ", exitting"; + } pid = fork(); - if(pid < 0) + if(pid < 0) { AnytunError::throwErr() << "daemonizing failed at fork(): " << AnytunErrno(errno) << ", exitting"; + } - if(pid) exit(0); + if(pid) { exit(0); } - if ((chdir("/")) < 0) + if((chdir("/")) < 0) { AnytunError::throwErr() << "daemonizing failed at chdir(): " << AnytunErrno(errno) << ", exitting"; + } -// std::cout << "running in background now..." << std::endl; + // std::cout << "running in background now..." << std::endl; int fd; -// for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors - for (fd=0;fd<=2;fd++) // close all file descriptors + // for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors + for(fd=0; fd<=2; fd++) { // close all file descriptors close(fd); + } fd = open("/dev/null",O_RDWR); // stdin - if(fd == -1) + if(fd == -1) { cLog.msg(Log::PRIO_WARNING) << "can't open /dev/null as stdin"; - else { - if(dup(fd) == -1) // stdout + } else { + if(dup(fd) == -1) { // stdout cLog.msg(Log::PRIO_WARNING) << "can't open /dev/null as stdout"; - if(dup(fd) == -1) // stderr + } + if(dup(fd) == -1) { // stderr cLog.msg(Log::PRIO_WARNING) << "can't open /dev/null as stderr"; + } } - -// FIXXXXME: write this pid to file (currently pid from posix/signhandler.hpp:77 is used) -// -// if(pidFile.is_open()) { -// pid_t pid = getpid(); -// pidFile << pid; -// pidFile.close(); -// } + + // FIXXXXME: write this pid to file (currently pid from posix/signhandler.hpp:77 is used) + // + // if(pidFile.is_open()) { + // pid_t pid = getpid(); + // pidFile << pid; + // pidFile.close(); + // } daemonized_ = true; } diff --git a/src/posix/posixDaemon.h b/src/posix/posixDaemon.h index e6d56d5..e3ac3e3 100644 --- a/src/posix/posixDaemon.h +++ b/src/posix/posixDaemon.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. diff --git a/src/posix/signalHandler.hpp b/src/posix/signalHandler.hpp index 3851c78..11d0c2f 100644 --- a/src/posix/signalHandler.hpp +++ b/src/posix/signalHandler.hpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -51,7 +51,7 @@ int SigQuitHandler(int /*sig*/, const std::string& /*msg*/) int SigHupHandler(int /*sig*/, const std::string& /*msg*/) { - cLog.msg(Log::PRIO_NOTICE) << "SIG-Hup caught"; + cLog.msg(Log::PRIO_NOTICE) << "SIG-Hup caught"; return 0; } @@ -98,10 +98,10 @@ void handleSignal() timeout.tv_sec = 1; timeout.tv_nsec = 0; sigNum = sigtimedwait(&signal_set, NULL, &timeout); - if (sigNum == -1) { - if (errno != EINTR && errno != EAGAIN) { - cLog.msg(Log::PRIO_ERROR) << "sigwait failed with error: \"" << AnytunErrno(errno) << "\" SignalHandling will be disabled"; - break; + if(sigNum == -1) { + if(errno != EINTR && errno != EAGAIN) { + cLog.msg(Log::PRIO_ERROR) << "sigwait failed with error: \"" << AnytunErrno(errno) << "\" SignalHandling will be disabled"; + break; } } else { gSignalController.inject(sigNum); @@ -112,7 +112,7 @@ void handleSignal() void registerSignalHandler(SignalController& ctrl, DaemonService& /*service*/) { sigset_t signal_set; - + sigemptyset(&signal_set); sigaddset(&signal_set, SIGINT); sigaddset(&signal_set, SIGQUIT); @@ -120,13 +120,13 @@ void registerSignalHandler(SignalController& ctrl, DaemonService& /*service*/) sigaddset(&signal_set, SIGTERM); sigaddset(&signal_set, SIGUSR1); sigaddset(&signal_set, SIGUSR2); - + #if defined(BOOST_HAS_PTHREADS) pthread_sigmask(SIG_BLOCK, &signal_set, NULL); #else #error The signalhandler works only with pthreads #endif - + boost::thread(boost::bind(handleSignal)); ctrl.handler[SIGINT] = boost::bind(SigIntHandler, _1, _2); diff --git a/src/posix/sysExec.hpp b/src/posix/sysExec.hpp index 18fde97..7e8f37e 100644 --- a/src/posix/sysExec.hpp +++ b/src/posix/sysExec.hpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -45,8 +45,9 @@ SysExec::~SysExec() { - if(!closed_) + if(!closed_) { close(pipefd_); + } } @@ -55,15 +56,17 @@ char** dupSysStringArray(T const& array) { char** new_array; new_array = static_cast<char**>(malloc((array.size() + 1)*sizeof(char*))); - if(!new_array) + if(!new_array) { return NULL; + } unsigned int i = 0; for(typename T::const_iterator it = array.begin(); it != array.end(); ++it) { new_array[i] = strdup(it->c_str()); if(!new_array) { - while(i--) + while(i--) { free(new_array[i]); + } free(new_array); return NULL; } @@ -75,11 +78,13 @@ char** dupSysStringArray(T const& array) void freeSysStringArray(char** array) { - if(!array) + if(!array) { return; + } - for(int i=0; array[i] ; ++i) + for(int i=0; array[i] ; ++i) { free(array[i]); + } free(array); } @@ -106,35 +111,38 @@ void SysExec::doExec(StringVector args, StringList env) } // child code, exec the script int fd; - for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors - if(fd != pipefd[1]) close(fd); - + for(fd=getdtablesize(); fd>=0; --fd) // close all file descriptors + if(fd != pipefd[1]) { close(fd); } + fd = open("/dev/null",O_RDWR); // stdin - if(fd == -1) + if(fd == -1) { cLog.msg(Log::PRIO_WARNING) << "can't open stdin"; - else { - if(dup(fd) == -1) // stdout + } else { + if(dup(fd) == -1) { // stdout cLog.msg(Log::PRIO_WARNING) << "can't open stdout"; - if(dup(fd) == -1) // stderr + } + if(dup(fd) == -1) { // stderr cLog.msg(Log::PRIO_WARNING) << "can't open stderr"; + } } - + args.insert(args.begin(), script_); char** argv = dupSysStringArray(args); char** evp = dupSysStringArray(env); - + execve(script_.c_str(), argv, evp); - // if execve returns, an error occurred, but logging doesn't work - // because we closed all file descriptors, so just write errno to - // pipe and call exit - + // if execve returns, an error occurred, but logging doesn't work + // because we closed all file descriptors, so just write errno to + // pipe and call exit + freeSysStringArray(argv); freeSysStringArray(evp); int err = errno; int ret = write(pipefd[1], (void*)(&err), sizeof(err)); - if(ret != sizeof(errno)) + if(ret != sizeof(errno)) { exit(-2); + } exit(-1); } @@ -166,18 +174,20 @@ int SysExec::waitForScript() void SysExec::waitAndDestroy(SysExec*& s) { - if(!s) + if(!s) { return; + } s->waitForScript(); - if(WIFEXITED(s->return_code_)) - cLog.msg(Log::PRIO_NOTICE) << "script '" << s->script_ << "' returned " << WEXITSTATUS(s->return_code_); - else if(WIFSIGNALED(s->return_code_)) + if(WIFEXITED(s->return_code_)) { + cLog.msg(Log::PRIO_NOTICE) << "script '" << s->script_ << "' returned " << WEXITSTATUS(s->return_code_); + } else if(WIFSIGNALED(s->return_code_)) { cLog.msg(Log::PRIO_NOTICE) << "script '" << s->script_ << "' terminated after signal " << WTERMSIG(s->return_code_); - else if(WIFSTOPPED(s->return_code_)) + } else if(WIFSTOPPED(s->return_code_)) { cLog.msg(Log::PRIO_NOTICE) << "script '" << s->script_ << "' stopped after signal " << WSTOPSIG(s->return_code_); - else if(WIFCONTINUED(s->return_code_)) + } else if(WIFCONTINUED(s->return_code_)) { cLog.msg(Log::PRIO_NOTICE) << "script '" << s->script_ << "' continued after SIGCONT"; + } delete(s); s = NULL; diff --git a/src/resolver.cpp b/src/resolver.cpp index 55371d0..26ffc72 100644 --- a/src/resolver.cpp +++ b/src/resolver.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -71,9 +71,7 @@ void ResolveHandler<Proto>::operator()(const boost::system::error_code& e, boost if(boost::system::posix_error::success == e) { try { onResolve_(endpointIt); - } - catch(const std::runtime_error& e) - { + } catch(const std::runtime_error& e) { onError_(e); } } else { @@ -90,9 +88,10 @@ Resolver& Resolver::instance() { Lock lock(instMutex); static instanceCleaner c; - if(!inst) + if(!inst) { inst = new Resolver(); - + } + return *inst; } @@ -102,14 +101,16 @@ Resolver::Resolver() : udp_resolver_(io_service_), tcp_resolver_(io_service_), t Resolver::~Resolver() { - if(thread_) + if(thread_) { delete thread_; + } } void Resolver::init() { - if(!thread_) - thread_ = new boost::thread(boost::bind(&Resolver::run, this)); + if(!thread_) { + thread_ = new boost::thread(boost::bind(&Resolver::run, this)); + } } void Resolver::run() @@ -121,13 +122,9 @@ void Resolver::run() io_service_.run(); io_service_.reset(); boost::this_thread::sleep(boost::posix_time::milliseconds(250)); - } - catch(const std::runtime_error& e) - { + } catch(const std::runtime_error& e) { cLog.msg(Log::PRIO_ERROR) << "resolver caught runtime error, restarting: " << e.what(); - } - catch(const std::exception& e) - { + } catch(const std::exception& e) { cLog.msg(Log::PRIO_ERROR) << "resolver caught exception, restarting: " << e.what(); } } @@ -141,16 +138,27 @@ void Resolver::resolveUdp(const std::string& addr, const std::string& port, UdpR std::auto_ptr<udp::resolver::query> query; if(addr != "") { switch(r) { - case IPV4_ONLY: query = std::auto_ptr<udp::resolver::query>(new udp::resolver::query(udp::v4(), addr, port)); break; - case IPV6_ONLY: query = std::auto_ptr<udp::resolver::query>(new udp::resolver::query(udp::v6(), addr, port)); break; - default: query = std::auto_ptr<udp::resolver::query>(new udp::resolver::query(addr, port)); break; + case IPV4_ONLY: + query = std::auto_ptr<udp::resolver::query>(new udp::resolver::query(udp::v4(), addr, port)); + break; + case IPV6_ONLY: + query = std::auto_ptr<udp::resolver::query>(new udp::resolver::query(udp::v6(), addr, port)); + break; + default: + query = std::auto_ptr<udp::resolver::query>(new udp::resolver::query(addr, port)); + break; } - } - else { + } else { switch(r) { - case IPV4_ONLY: query = std::auto_ptr<udp::resolver::query>(new udp::resolver::query(udp::v4(), port)); break; - case IPV6_ONLY: query = std::auto_ptr<udp::resolver::query>(new udp::resolver::query(udp::v6(), port)); break; - default: query = std::auto_ptr<udp::resolver::query>(new udp::resolver::query(port)); break; + case IPV4_ONLY: + query = std::auto_ptr<udp::resolver::query>(new udp::resolver::query(udp::v4(), port)); + break; + case IPV6_ONLY: + query = std::auto_ptr<udp::resolver::query>(new udp::resolver::query(udp::v6(), port)); + break; + default: + query = std::auto_ptr<udp::resolver::query>(new udp::resolver::query(port)); + break; } } UdpResolveHandler handler(addr, port, onResolve, onError, r); @@ -164,18 +172,29 @@ void Resolver::resolveTcp(const std::string& addr, const std::string& port, TcpR std::auto_ptr<tcp::resolver::query> query; if(addr != "") { switch(r) { - case IPV4_ONLY: query = std::auto_ptr<tcp::resolver::query>(new tcp::resolver::query(tcp::v4(), addr, port)); break; - case IPV6_ONLY: query = std::auto_ptr<tcp::resolver::query>(new tcp::resolver::query(tcp::v6(), addr, port)); break; - default: query = std::auto_ptr<tcp::resolver::query>(new tcp::resolver::query(addr, port)); break; + case IPV4_ONLY: + query = std::auto_ptr<tcp::resolver::query>(new tcp::resolver::query(tcp::v4(), addr, port)); + break; + case IPV6_ONLY: + query = std::auto_ptr<tcp::resolver::query>(new tcp::resolver::query(tcp::v6(), addr, port)); + break; + default: + query = std::auto_ptr<tcp::resolver::query>(new tcp::resolver::query(addr, port)); + break; } - } - else { + } else { switch(r) { - case IPV4_ONLY: query = std::auto_ptr<tcp::resolver::query>(new tcp::resolver::query(tcp::v4(), port)); break; - case IPV6_ONLY: query = std::auto_ptr<tcp::resolver::query>(new tcp::resolver::query(tcp::v6(), port)); break; - default: query = std::auto_ptr<tcp::resolver::query>(new tcp::resolver::query(port)); break; + case IPV4_ONLY: + query = std::auto_ptr<tcp::resolver::query>(new tcp::resolver::query(tcp::v4(), port)); + break; + case IPV6_ONLY: + query = std::auto_ptr<tcp::resolver::query>(new tcp::resolver::query(tcp::v6(), port)); + break; + default: + query = std::auto_ptr<tcp::resolver::query>(new tcp::resolver::query(port)); + break; } } TcpResolveHandler handler(addr, port, onResolve, onError, r); - tcp_resolver_.async_resolve(*query, handler); + tcp_resolver_.async_resolve(*query, handler); } diff --git a/src/resolver.h b/src/resolver.h index 35c2bc4..4a82733 100644 --- a/src/resolver.h +++ b/src/resolver.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -62,7 +62,7 @@ private: typedef ResolveHandler<boost::asio::ip::udp> UdpResolveHandler; typedef ResolveHandler<boost::asio::ip::tcp> TcpResolveHandler; -class Resolver +class Resolver { public: static Resolver& instance(); @@ -76,15 +76,18 @@ public: private: Resolver(); ~Resolver(); - Resolver(const Resolver &r); - void operator=(const Resolver &r); + Resolver(const Resolver& r); + void operator=(const Resolver& r); static Resolver* inst; static ::Mutex instMutex; - class instanceCleaner { - public: ~instanceCleaner() { - if(Resolver::inst != 0) + class instanceCleaner + { + public: + ~instanceCleaner() { + if(Resolver::inst != 0) { delete Resolver::inst; + } } }; friend class instanceCleaner; diff --git a/src/routingTable.cpp b/src/routingTable.cpp index c64366d..3cfe6f6 100644 --- a/src/routingTable.cpp +++ b/src/routingTable.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -46,8 +46,9 @@ RoutingTable& RoutingTable::instance() { Lock lock(instMutex); static instanceCleaner c; - if(!inst) + if(!inst) { inst = new RoutingTable(); + } return *inst; } @@ -58,102 +59,104 @@ RoutingTable::RoutingTable() RoutingTable::~RoutingTable() { -} +} -void RoutingTable::updateRouteTreeUnlocked(const NetworkPrefix & pref) +void RoutingTable::updateRouteTreeUnlocked(const NetworkPrefix& pref) { //Lock lock(mutex_); //deadlock - u_int8_t length=pref.getNetworkPrefixLength(); - network_address_type_t type=pref.getNetworkAddressType(); - u_int16_t mux = routes_[pref.getNetworkAddressType()].find(pref)->second; - RoutingTreeNode * node = &(root_[type]); - if (type==ipv4) - { - ipv4_bytes_type bytes(pref.to_bytes_v4()); - if (length>32) - length=32; - RoutingTree::walk(bytes, node, length, mux); - } else if (type==ipv6) { - ipv6_bytes_type bytes(pref.to_bytes_v6()); - if (length>128) - length=128; - RoutingTree::walk(bytes, node, length, mux); - } else if (type==ethernet) { - ethernet_bytes_type bytes(pref.to_bytes_ethernet()); - if (length>48) - length=48; - RoutingTree::walk(bytes, node, length, mux); - } else { - AnytunError::throwErr() << "illegal protocol type"; - } - //root_[type].print(0); + u_int8_t length=pref.getNetworkPrefixLength(); + network_address_type_t type=pref.getNetworkAddressType(); + u_int16_t mux = routes_[pref.getNetworkAddressType()].find(pref)->second; + RoutingTreeNode* node = &(root_[type]); + if(type==ipv4) { + ipv4_bytes_type bytes(pref.to_bytes_v4()); + if(length>32) { + length=32; + } + RoutingTree::walk(bytes, node, length, mux); + } else if(type==ipv6) { + ipv6_bytes_type bytes(pref.to_bytes_v6()); + if(length>128) { + length=128; + } + RoutingTree::walk(bytes, node, length, mux); + } else if(type==ethernet) { + ethernet_bytes_type bytes(pref.to_bytes_ethernet()); + if(length>48) { + length=48; + } + RoutingTree::walk(bytes, node, length, mux); + } else { + AnytunError::throwErr() << "illegal protocol type"; + } + //root_[type].print(0); } -void RoutingTable::addRoute(const NetworkPrefix & pref, u_int16_t mux) +void RoutingTable::addRoute(const NetworkPrefix& pref, u_int16_t mux) { Lock lock(mutex_); - - network_address_type_t type=pref.getNetworkAddressType(); - if (type==ipv4 || type==ipv6) - { + network_address_type_t type=pref.getNetworkAddressType(); + + if(type==ipv4 || type==ipv6) { std::pair<RoutingMap::iterator, bool> ret = routes_[type].insert(RoutingMap::value_type(pref,mux)); - if(!ret.second) - { + if(!ret.second) { routes_[pref.getNetworkAddressType()].erase(ret.first); routes_[pref.getNetworkAddressType()].insert(RoutingMap::value_type(pref,mux)); } - root_[pref.getNetworkAddressType()]=RoutingTreeNode(); - RoutingMap::iterator it = routes_[type].begin(); - for (;it!=routes_[pref.getNetworkAddressType()].end();++it) - updateRouteTreeUnlocked(it->first); - } else if (type==ethernet) { + root_[pref.getNetworkAddressType()]=RoutingTreeNode(); + RoutingMap::iterator it = routes_[type].begin(); + for(; it!=routes_[pref.getNetworkAddressType()].end(); ++it) { + updateRouteTreeUnlocked(it->first); + } + } else if(type==ethernet) { return; // TODO: add support for ethernet - } else { - AnytunError::throwErr() << "illegal protocol type"; - } + } else { + AnytunError::throwErr() << "illegal protocol type"; + } } -void RoutingTable::delRoute(const NetworkPrefix & pref ) +void RoutingTable::delRoute(const NetworkPrefix& pref) { Lock lock(mutex_); - - routes_[pref.getNetworkAddressType()].erase(routes_[pref.getNetworkAddressType()].find(pref)); + + routes_[pref.getNetworkAddressType()].erase(routes_[pref.getNetworkAddressType()].find(pref)); } -u_int16_t RoutingTable::getRoute(const NetworkAddress & addr) +u_int16_t RoutingTable::getRoute(const NetworkAddress& addr) { - Lock lock(mutex_); - network_address_type_t type=addr.getNetworkAddressType(); - - if (routes_[type].empty()) - AnytunError::throwErr() << "no route"; - - if (type==ipv4) - { - ipv4_bytes_type bytes(addr.to_bytes_v4()); - return RoutingTree::find(bytes, root_[type]); - } else if (type==ipv6) { - ipv6_bytes_type bytes(addr.to_bytes_v6()); - return RoutingTree::find(bytes, root_[type]); - } else if (type==ethernet) { - //TODO Our model wont fit to ethernet addresses well. - // maybe use hashmap or something like that instead - ethernet_bytes_type bytes(addr.to_bytes_ethernet()); - return RoutingTree::find(bytes, root_[type]); - } else { - AnytunError::throwErr() << "illegal protocol type"; - } + Lock lock(mutex_); + network_address_type_t type=addr.getNetworkAddressType(); + + if(routes_[type].empty()) { + AnytunError::throwErr() << "no route"; + } + + if(type==ipv4) { + ipv4_bytes_type bytes(addr.to_bytes_v4()); + return RoutingTree::find(bytes, root_[type]); + } else if(type==ipv6) { + ipv6_bytes_type bytes(addr.to_bytes_v6()); + return RoutingTree::find(bytes, root_[type]); + } else if(type==ethernet) { + //TODO Our model wont fit to ethernet addresses well. + // maybe use hashmap or something like that instead + ethernet_bytes_type bytes(addr.to_bytes_ethernet()); + return RoutingTree::find(bytes, root_[type]); + } else { + AnytunError::throwErr() << "illegal protocol type"; + } return 0; } -u_int16_t* RoutingTable::getOrNewRoutingTEUnlocked(const NetworkPrefix & addr) +u_int16_t* RoutingTable::getOrNewRoutingTEUnlocked(const NetworkPrefix& addr) { RoutingMap::iterator it = routes_[addr.getNetworkAddressType()].find(addr); - if(it!=routes_[addr.getNetworkAddressType()].end()) + if(it!=routes_[addr.getNetworkAddressType()].end()) { return &(it->second); + } routes_[addr.getNetworkAddressType()].insert(RoutingMap::value_type(addr, 1)); it = routes_[addr.getNetworkAddressType()].find(addr); @@ -162,33 +165,34 @@ u_int16_t* RoutingTable::getOrNewRoutingTEUnlocked(const NetworkPrefix & addr) u_int16_t RoutingTable::getCountUnlocked(network_address_type_t type) { - RoutingMap::iterator it = routes_[type].begin(); - u_int16_t routes=0; - for (;it!=routes_[type].end();++it) - routes++; - return routes; + RoutingMap::iterator it = routes_[type].begin(); + u_int16_t routes=0; + for(; it!=routes_[type].end(); ++it) { + routes++; + } + return routes; } RoutingMap::iterator RoutingTable::getBeginUnlocked(network_address_type_t type) { - return routes_[type].begin(); + return routes_[type].begin(); } RoutingMap::iterator RoutingTable::getEndUnlocked(network_address_type_t type) { - return routes_[type].end(); + return routes_[type].end(); } void RoutingTable::clear(network_address_type_t type) { Lock lock(mutex_); - routes_[type].clear(); + routes_[type].clear(); } bool RoutingTable::empty(network_address_type_t type) { Lock lock(mutex_); - return routes_[type].empty(); + return routes_[type].empty(); } Mutex& RoutingTable::getMutex() diff --git a/src/routingTable.h b/src/routingTable.h index 4a60ec3..8fb1f64 100644 --- a/src/routingTable.h +++ b/src/routingTable.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -47,34 +47,37 @@ typedef std::map<NetworkPrefix,u_int16_t> RoutingMap; class RoutingTable { public: - static RoutingTable& instance(); - RoutingTable(); - ~RoutingTable(); - void addRoute(const NetworkPrefix & ,u_int16_t); - void updateRouteTreeUnlocked(const NetworkPrefix & pref); - void delRoute(const NetworkPrefix & ); - u_int16_t getRoute(const NetworkAddress &); - bool empty(network_address_type_t type); - void clear(network_address_type_t type); + static RoutingTable& instance(); + RoutingTable(); + ~RoutingTable(); + void addRoute(const NetworkPrefix& ,u_int16_t); + void updateRouteTreeUnlocked(const NetworkPrefix& pref); + void delRoute(const NetworkPrefix&); + u_int16_t getRoute(const NetworkAddress&); + bool empty(network_address_type_t type); + void clear(network_address_type_t type); Mutex& getMutex(); - u_int16_t* getOrNewRoutingTEUnlocked(const NetworkPrefix & addr); - u_int16_t getCountUnlocked(network_address_type_t type); - RoutingMap::iterator getBeginUnlocked(network_address_type_t type); - RoutingMap::iterator getEndUnlocked(network_address_type_t type); + u_int16_t* getOrNewRoutingTEUnlocked(const NetworkPrefix& addr); + u_int16_t getCountUnlocked(network_address_type_t type); + RoutingMap::iterator getBeginUnlocked(network_address_type_t type); + RoutingMap::iterator getEndUnlocked(network_address_type_t type); private: static Mutex instMutex; - static RoutingTable* inst; - class instanceCleaner { - public: ~instanceCleaner() { - if(RoutingTable::inst != 0) - delete RoutingTable::inst; - } - }; - RoutingTable(const RoutingTable &s); - void operator=(const RoutingTable &s); - boost::array<RoutingMap,3> routes_; - boost::array<RoutingTreeNode,3> root_; + static RoutingTable* inst; + class instanceCleaner + { + public: + ~instanceCleaner() { + if(RoutingTable::inst != 0) { + delete RoutingTable::inst; + } + } + }; + RoutingTable(const RoutingTable& s); + void operator=(const RoutingTable& s); + boost::array<RoutingMap,3> routes_; + boost::array<RoutingTreeNode,3> root_; Mutex mutex_; }; diff --git a/src/routingTree.hpp b/src/routingTree.hpp index 89b7c18..a2a5312 100644 --- a/src/routingTree.hpp +++ b/src/routingTree.hpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -35,30 +35,29 @@ #include "anytunError.h" -class RoutingTree { +class RoutingTree +{ public: template <class BinaryType> - static void walk(BinaryType bytes ,RoutingTreeNode * node,u_int8_t length,u_int16_t mux) - { - for (int i=0; i<(length/8); i++) - { - if (!node->nodes_[bytes[i]]) + static void walk(BinaryType bytes ,RoutingTreeNode* node,u_int8_t length,u_int16_t mux) { + for(int i=0; i<(length/8); i++) { + if(!node->nodes_[bytes[i]]) { node->nodes_[bytes[i]] = new RoutingTreeNode; + } node=node->nodes_[bytes[i]]; } - if (length%8) - { + if(length%8) { unsigned char idx=0xff; idx <<=8-(length%8); idx &= bytes[length/8]; unsigned char maxidx=0xff; maxidx>>=(length%8); maxidx|=idx; - for (unsigned char i=idx; i<=maxidx; i++) - { - if (!node->nodes_[i]) + for(unsigned char i=idx; i<=maxidx; i++) { + if(!node->nodes_[i]) { node->nodes_[i] = new RoutingTreeNode; + } node->nodes_[i]->valid_=true; node->nodes_[i]->mux_=mux; } @@ -67,25 +66,20 @@ public: node->mux_=mux; } } - + template <class BinaryType> - static u_int16_t find(BinaryType bytes ,RoutingTreeNode & root ) - { + static u_int16_t find(BinaryType bytes ,RoutingTreeNode& root) { bool valid=0; u_int16_t mux=0; - RoutingTreeNode * node = &root; - if (root.valid_) - { + RoutingTreeNode* node = &root; + if(root.valid_) { mux=root.mux_; valid=1; } - for (size_t level=0;level<bytes.size();level++) - { - if (node->nodes_[bytes[level]]) - { + for(size_t level=0; level<bytes.size(); level++) { + if(node->nodes_[bytes[level]]) { node=node->nodes_[bytes[level]]; - if(node->valid_) - { + if(node->valid_) { mux=node->mux_; valid=1; } @@ -93,8 +87,9 @@ public: break; } } - if(!valid) + if(!valid) { AnytunError::throwErr() << "no route"; + } return mux; } diff --git a/src/routingTreeNode.cpp b/src/routingTreeNode.cpp index e50ff70..9d65248 100644 --- a/src/routingTreeNode.cpp +++ b/src/routingTreeNode.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -34,32 +34,32 @@ RoutingTreeNode::RoutingTreeNode():mux_(0),valid_(false) { - for(int i=0; i<256; i++) - nodes_[i]=NULL; + for(int i=0; i<256; i++) { + nodes_[i]=NULL; + } } void RoutingTreeNode::print(int level) const { - if (valid_) - { - std::cout << " -> " <<mux_ ; - } - std::cout << std::endl; - for(int i=0; i<256; i++) - { - if ( nodes_[i]) - { - for(int l=0;l<level;l++) - std::cout << " "; - std::cout << (int) i; - nodes_[i]->print(level+1); - } - } + if(valid_) { + std::cout << " -> " <<mux_ ; + } + std::cout << std::endl; + for(int i=0; i<256; i++) { + if(nodes_[i]) { + for(int l=0; l<level; l++) { + std::cout << " "; + } + std::cout << (int) i; + nodes_[i]->print(level+1); + } + } } RoutingTreeNode::~RoutingTreeNode() { - for(int i=0; i<256; i++) - if(nodes_[i]) - delete nodes_[i]; -} + for(int i=0; i<256; i++) + if(nodes_[i]) { + delete nodes_[i]; + } +} diff --git a/src/routingTreeNode.h b/src/routingTreeNode.h index 9efc6f2..56e76cf 100644 --- a/src/routingTreeNode.h +++ b/src/routingTreeNode.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -43,15 +43,15 @@ class RoutingTree; class RoutingTreeNode { public: - RoutingTreeNode(); - ~RoutingTreeNode(); - void print(int) const; + RoutingTreeNode(); + ~RoutingTreeNode(); + void print(int) const; private: -// Mutex mutex_; - u_int16_t mux_; - bool valid_; - boost::array<RoutingTreeNode *,256> nodes_; + // Mutex mutex_; + u_int16_t mux_; + bool valid_; + boost::array<RoutingTreeNode*,256> nodes_; friend class RoutingTree; }; diff --git a/src/seqWindow.cpp b/src/seqWindow.cpp index 359ba63..e860464 100644 --- a/src/seqWindow.cpp +++ b/src/seqWindow.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -44,16 +44,18 @@ SeqWindowElement::SeqWindowElement() SeqWindowElement::~SeqWindowElement() { - if(window_) + if(window_) { delete[] window_; + } } void SeqWindowElement::init(window_size_t w, seq_nr_t m) { - if(window_) + if(window_) { delete[] window_; + } window_ = new u_int8_t[w]; - memset(window_, 0, w); + memset(window_, 0, w); pos_ = 0; max_ = m; window_[pos_] = 1; @@ -70,8 +72,9 @@ SeqWindow::~SeqWindow() bool SeqWindow::checkAndAdd(sender_id_t sender, seq_nr_t seq_nr) { Lock lock(mutex_); - if (!window_size_) + if(!window_size_) { return false; + } SenderMap::iterator s = sender_.find(sender); if(s == sender_.end()) { @@ -84,67 +87,71 @@ bool SeqWindow::checkAndAdd(sender_id_t sender, seq_nr_t seq_nr) s->second.max_ += SEQ_NR_MAX/2; seq_nr += SEQ_NR_MAX/2; shifted = 1; - } - else if(s->second.max_ > (SEQ_NR_MAX - window_size_)) { + } else if(s->second.max_ > (SEQ_NR_MAX - window_size_)) { s->second.max_ -= SEQ_NR_MAX/2; seq_nr -= SEQ_NR_MAX/2; shifted = 2; } - + seq_nr_t min = s->second.max_ - window_size_ + 1; if(seq_nr < min || seq_nr == s->second.max_) { - if(shifted == 1) + if(shifted == 1) { s->second.max_ -= SEQ_NR_MAX/2; - else if(shifted == 2) + } else if(shifted == 2) { s->second.max_ += SEQ_NR_MAX/2; + } return true; } - + if(seq_nr > s->second.max_) { seq_nr_t diff = seq_nr - s->second.max_; - if(diff >= window_size_) + if(diff >= window_size_) { diff = window_size_; - + } + window_size_t new_pos = s->second.pos_ + diff; - + if(new_pos >= window_size_) { new_pos -= window_size_; - - if(s->second.pos_ < window_size_ - 1) + + if(s->second.pos_ < window_size_ - 1) { memset(&(s->second.window_[s->second.pos_ + 1]), 0, window_size_ - s->second.pos_ - 1); - + } + memset(s->second.window_, 0, new_pos); - } - else { + } else { memset(&(s->second.window_[s->second.pos_ + 1]), 0, diff); } s->second.pos_ = new_pos; s->second.window_[s->second.pos_] = 1; s->second.max_ = seq_nr; - - if(shifted == 1) + + if(shifted == 1) { s->second.max_ -= SEQ_NR_MAX/2; - else if(shifted == 2) + } else if(shifted == 2) { s->second.max_ += SEQ_NR_MAX/2; - + } + return false; } - + seq_nr_t diff = s->second.max_ - seq_nr; - window_size_t pos = diff > s->second.pos_ ? s->second.pos_ + window_size_ : s->second.pos_; + window_size_t pos = diff > s->second.pos_ ? s->second.pos_ + window_size_ : s->second.pos_; pos -= diff; - - if(shifted == 1) + + if(shifted == 1) { s->second.max_ -= SEQ_NR_MAX/2; - else if(shifted == 2) + } else if(shifted == 2) { s->second.max_ += SEQ_NR_MAX/2; - + } + int ret = s->second.window_[pos]; s->second.window_[pos] = 1; - - if(ret) + + if(ret) { return true; - + } + return false; } diff --git a/src/seqWindow.h b/src/seqWindow.h index 1090447..a8b8700 100644 --- a/src/seqWindow.h +++ b/src/seqWindow.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -42,7 +42,8 @@ class SeqWindow; -class SeqWindowElement { +class SeqWindowElement +{ public: SeqWindowElement(); ~SeqWindowElement(); @@ -71,21 +72,20 @@ private: Mutex mutex_; SenderMap sender_; - SeqWindow(const SeqWindow &s); - void operator=(const SeqWindow &s); + SeqWindow(const SeqWindow& s); + void operator=(const SeqWindow& s); - friend class boost::serialization::access; - template<class Archive> - void serialize(Archive & ar, const unsigned int version) - { - Lock lock(mutex_); - //unsigned int serial = (unsigned int) window_size_; - //window_size_t serial = (window_size_t) window_size_; - ar & window_size_; - //TODO: Do not sync complete Sender Map! - // ar & sender_; + friend class boost::serialization::access; + template<class Archive> + void serialize(Archive& ar, const unsigned int version) { + Lock lock(mutex_); + //unsigned int serial = (unsigned int) window_size_; + //window_size_t serial = (window_size_t) window_size_; + ar& window_size_; + //TODO: Do not sync complete Sender Map! + // ar & sender_; } - + }; diff --git a/src/signalController.cpp b/src/signalController.cpp index 6a20588..d0df71c 100644 --- a/src/signalController.cpp +++ b/src/signalController.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -45,12 +45,13 @@ SignalController& gSignalController = SignalController::instance(); SignalController& SignalController::instance() { - Lock lock(instMutex); - static instanceCleaner c; - if(!inst) - inst = new SignalController(); + Lock lock(instMutex); + static instanceCleaner c; + if(!inst) { + inst = new SignalController(); + } - return *inst; + return *inst; } int SigErrorHandler(int /*sig*/, const std::string& msg) @@ -64,11 +65,11 @@ int SigErrorHandler(int /*sig*/, const std::string& msg) #ifndef _MSC_VER #include "signalHandler.hpp" #else - #ifdef WIN_SERVICE - #include "win32/signalServiceHandler.hpp" - #else - #include "win32/signalHandler.hpp" - #endif +#ifdef WIN_SERVICE +#include "win32/signalServiceHandler.hpp" +#else +#include "win32/signalHandler.hpp" +#endif #endif void SignalController::init(DaemonService& service) @@ -89,8 +90,9 @@ void SignalController::inject(int sig, const std::string& msg) int SignalController::run() { for(CallbackMap::iterator it = callbacks.begin(); it != callbacks.end(); ++it) - if(it->first == CALLB_RUNNING) + if(it->first == CALLB_RUNNING) { it->second(); + } int ret = 0; while(1) { @@ -101,27 +103,28 @@ int SignalController::run() sig = sigQueue.front(); sigQueue.pop(); } - + HandlerMap::iterator it = handler.find(sig.first); - if(it != handler.end()) - { + if(it != handler.end()) { ret = it->second(sig.first, sig.second); - if(ret) + if(ret) { break; - } - else { + } + } else { it = handler.find(SIGUNKNOWN); - if(it != handler.end()) + if(it != handler.end()) { it->second(sig.first, sig.second); - else + } else { cLog.msg(Log::PRIO_NOTICE) << "SIG " << sig.first << " caught with message '" << sig.second << "' - ignoring"; + } } } for(CallbackMap::iterator it = callbacks.begin(); it != callbacks.end(); ++it) - if(it->first == CALLB_STOPPING) + if(it->first == CALLB_STOPPING) { it->second(); + } return ret; } diff --git a/src/signalController.h b/src/signalController.h index fa5f0fb..7a52fc7 100644 --- a/src/signalController.h +++ b/src/signalController.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -66,15 +66,18 @@ public: private: SignalController() {}; ~SignalController() {}; - SignalController(const SignalController &s); - void operator=(const SignalController &s); + SignalController(const SignalController& s); + void operator=(const SignalController& s); static SignalController* inst; static Mutex instMutex; - class instanceCleaner { - public: ~instanceCleaner() { - if(SignalController::inst != NULL) + class instanceCleaner + { + public: + ~instanceCleaner() { + if(SignalController::inst != NULL) { delete SignalController::inst; + } } }; friend class instanceCleaner; diff --git a/src/syncBuffer.cpp b/src/syncBuffer.cpp index 0ad2b4a..ca1eb09 100644 --- a/src/syncBuffer.cpp +++ b/src/syncBuffer.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. diff --git a/src/syncBuffer.h b/src/syncBuffer.h index a9aee4e..8723d70 100644 --- a/src/syncBuffer.h +++ b/src/syncBuffer.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -43,23 +43,23 @@ class SyncBuffer : public Buffer { public: - SyncBuffer() : Buffer(){}; - SyncBuffer(u_int32_t length) : Buffer(length){}; - SyncBuffer(Buffer b): Buffer(b) {}; - SyncBuffer(u_int8_t* data, u_int32_t length): Buffer(data,length) {}; - SyncBuffer(const SyncBuffer & src) : Buffer(src) {}; + SyncBuffer() : Buffer() {}; + SyncBuffer(u_int32_t length) : Buffer(length) {}; + SyncBuffer(Buffer b): Buffer(b) {}; + SyncBuffer(u_int8_t* data, u_int32_t length): Buffer(data,length) {}; + SyncBuffer(const SyncBuffer& src) : Buffer(src) {}; private: -//TODO check if this is ok -// Mutex mutex_; - friend class boost::serialization::access; - template<class Archive> - void serialize(Archive & ar, const unsigned int version) - { -// Lock lock(mutex_); - ar & length_; - for(u_int32_t i = 0; i < length_; i++) - ar & (*this)[i]; - } + //TODO check if this is ok + // Mutex mutex_; + friend class boost::serialization::access; + template<class Archive> + void serialize(Archive& ar, const unsigned int version) { + // Lock lock(mutex_); + ar& length_; + for(u_int32_t i = 0; i < length_; i++) { + ar & (*this)[i]; + } + } }; #endif diff --git a/src/syncClient.cpp b/src/syncClient.cpp index dd6a166..bca915a 100644 --- a/src/syncClient.cpp +++ b/src/syncClient.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -47,82 +47,79 @@ SyncClient::SyncClient(std::string hostname,std::string port) -:hostname_( hostname),port_(port) + :hostname_(hostname),port_(port) { } void SyncClient::run() { - bool connected(false); - for(;;) - { - try - { - boost::asio::io_service io_service; - SyncTcpConnection::proto::resolver resolver(io_service); - SyncTcpConnection::proto::resolver::query query( hostname_, port_); - SyncTcpConnection::proto::resolver::iterator endpoint_iterator = resolver.resolve(query); - SyncTcpConnection::proto::resolver::iterator end; + bool connected(false); + for(;;) { + try { + boost::asio::io_service io_service; + SyncTcpConnection::proto::resolver resolver(io_service); + SyncTcpConnection::proto::resolver::query query(hostname_, port_); + SyncTcpConnection::proto::resolver::iterator endpoint_iterator = resolver.resolve(query); + SyncTcpConnection::proto::resolver::iterator end; - SyncTcpConnection::proto::socket socket(io_service); - boost::system::error_code error = boost::asio::error::host_not_found; - while (error && endpoint_iterator != end) - { - socket.close(); - socket.connect(*endpoint_iterator++, error); - } - if (error) - throw boost::system::system_error(error); - if (!connected) - cLog.msg(Log::PRIO_NOTICE) << "sync: connected to " << hostname_ <<":"<< port_; - connected=true; - readAndProcess(socket); //endless loop - } - catch (std::exception& e) - { - if (connected) - cLog.msg(Log::PRIO_NOTICE) << "sync: connection to " << hostname_ <<":"<< port_<< " lost ("<< e.what() << ") retrying every 10sec"; - connected=false; - boost::this_thread::sleep(boost::posix_time::milliseconds(10000)); - } - } + SyncTcpConnection::proto::socket socket(io_service); + boost::system::error_code error = boost::asio::error::host_not_found; + while(error && endpoint_iterator != end) { + socket.close(); + socket.connect(*endpoint_iterator++, error); + } + if(error) { + throw boost::system::system_error(error); + } + if(!connected) { + cLog.msg(Log::PRIO_NOTICE) << "sync: connected to " << hostname_ <<":"<< port_; + } + connected=true; + readAndProcess(socket); //endless loop + } catch(std::exception& e) { + if(connected) { + cLog.msg(Log::PRIO_NOTICE) << "sync: connection to " << hostname_ <<":"<< port_<< " lost ("<< e.what() << ") retrying every 10sec"; + } + connected=false; + boost::this_thread::sleep(boost::posix_time::milliseconds(10000)); + } + } } -void SyncClient::readAndProcess(SyncTcpConnection::proto::socket & socket) +void SyncClient::readAndProcess(SyncTcpConnection::proto::socket& socket) { - ConnectionList & cl_ (gConnectionList); - size_t message_lenght ; - for (;;) - { - std::stringstream message_lenght_stream; - readExactly(socket,5,message_lenght_stream); - message_lenght_stream >> message_lenght; - std::stringstream void_stream; - readExactly(socket,1,void_stream); //skip space - std::stringstream sync_command_stream; - readExactly(socket,message_lenght, sync_command_stream); - //cLog.msg(Log::PRIO_NOTICE) << "recieved sync inforamtaion "<<tmp.str()<< std::endl; - boost::archive::text_iarchive ia(sync_command_stream); - SyncCommand scom(cl_); - ia >> scom; - } + ConnectionList& cl_(gConnectionList); + size_t message_lenght ; + for(;;) { + std::stringstream message_lenght_stream; + readExactly(socket,5,message_lenght_stream); + message_lenght_stream >> message_lenght; + std::stringstream void_stream; + readExactly(socket,1,void_stream); //skip space + std::stringstream sync_command_stream; + readExactly(socket,message_lenght, sync_command_stream); + //cLog.msg(Log::PRIO_NOTICE) << "recieved sync inforamtaion "<<tmp.str()<< std::endl; + boost::archive::text_iarchive ia(sync_command_stream); + SyncCommand scom(cl_); + ia >> scom; + } } -void SyncClient::readExactly(SyncTcpConnection::proto::socket & socket,size_t toread, std::iostream & result) +void SyncClient::readExactly(SyncTcpConnection::proto::socket& socket,size_t toread, std::iostream& result) { - size_t hasread = 0; - while (toread > hasread) - { - //TODO read bigger buffers - boost::array<char, 1> buf; - boost::system::error_code error; - size_t len = socket.read_some(boost::asio::buffer(buf), error); - if (error == boost::asio::error::eof) - break; // Connection closed cleanly by peer. - else if (error) - throw boost::system::system_error(error); // Some other error. - //for (size_t pos=0; pos<len; pos++) - result<<buf[0]; - hasread+=len; - } + size_t hasread = 0; + while(toread > hasread) { + //TODO read bigger buffers + boost::array<char, 1> buf; + boost::system::error_code error; + size_t len = socket.read_some(boost::asio::buffer(buf), error); + if(error == boost::asio::error::eof) { + break; // Connection closed cleanly by peer. + } else if(error) { + throw boost::system::system_error(error); // Some other error. + } + //for (size_t pos=0; pos<len; pos++) + result<<buf[0]; + hasread+=len; + } } diff --git a/src/syncClient.h b/src/syncClient.h index bc9d004..47f81e2 100644 --- a/src/syncClient.h +++ b/src/syncClient.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -37,14 +37,14 @@ class SyncClient { public: - SyncClient(std::string hostname,std::string port); + SyncClient(std::string hostname,std::string port); - void run(); + void run(); private: - void readAndProcess(SyncTcpConnection::proto::socket & socket); - void readExactly(SyncTcpConnection::proto::socket & socket,size_t toread, std::iostream &); - std::string hostname_; - std::string port_; + void readAndProcess(SyncTcpConnection::proto::socket& socket); + void readExactly(SyncTcpConnection::proto::socket& socket,size_t toread, std::iostream&); + std::string hostname_; + std::string port_; }; diff --git a/src/syncCommand.cpp b/src/syncCommand.cpp index 8668504..1f7548e 100644 --- a/src/syncCommand.cpp +++ b/src/syncCommand.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -31,28 +31,30 @@ */ #include "syncCommand.h" -SyncCommand::SyncCommand(ConnectionList & cl ) -{ - scc_ = new SyncConnectionCommand(cl); - src_ = new SyncRouteCommand(); +SyncCommand::SyncCommand(ConnectionList& cl) +{ + scc_ = new SyncConnectionCommand(cl); + src_ = new SyncRouteCommand(); } -SyncCommand::SyncCommand(ConnectionList & cl, u_int16_t mux ) -{ - scc_ = new SyncConnectionCommand(cl,mux); - src_=NULL; +SyncCommand::SyncCommand(ConnectionList& cl, u_int16_t mux) +{ + scc_ = new SyncConnectionCommand(cl,mux); + src_=NULL; } -SyncCommand::SyncCommand(NetworkPrefix np ) -{ - scc_ = NULL; - src_ = new SyncRouteCommand(np); +SyncCommand::SyncCommand(NetworkPrefix np) +{ + scc_ = NULL; + src_ = new SyncRouteCommand(np); } SyncCommand::~SyncCommand() { - if (scc_) - delete scc_; - if (src_) - delete src_; + if(scc_) { + delete scc_; + } + if(src_) { + delete src_; + } } diff --git a/src/syncCommand.h b/src/syncCommand.h index 71c1ffe..f72a029 100644 --- a/src/syncCommand.h +++ b/src/syncCommand.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -45,36 +45,35 @@ class SyncCommand { public: - SyncCommand(ConnectionList & cl ); - SyncCommand(ConnectionList & cl ,u_int16_t mux); - SyncCommand(NetworkPrefix); - ~SyncCommand(); + SyncCommand(ConnectionList& cl); + SyncCommand(ConnectionList& cl ,u_int16_t mux); + SyncCommand(NetworkPrefix); + ~SyncCommand(); private: - SyncCommand(const SyncCommand &); - SyncConnectionCommand * scc_; - SyncRouteCommand * src_; + SyncCommand(const SyncCommand&); + SyncConnectionCommand* scc_; + SyncRouteCommand* src_; friend class boost::serialization::access; template<class Archive> - void serialize(Archive & ar, const unsigned int version) - { - std::string syncstr; - if (scc_) - { - syncstr = "connection"; - } - if ( src_) - { - syncstr = "route"; - } - ar & syncstr; -// std::cout << "syncstr received " <<syncstr << std::endl; - if (syncstr == "connection") - ar & *scc_; - if (syncstr == "route") - ar & *src_; -// std::cout << "syncstr done " <<syncstr << std::endl; - } + void serialize(Archive& ar, const unsigned int version) { + std::string syncstr; + if(scc_) { + syncstr = "connection"; + } + if(src_) { + syncstr = "route"; + } + ar& syncstr; + // std::cout << "syncstr received " <<syncstr << std::endl; + if(syncstr == "connection") { + ar & *scc_; + } + if(syncstr == "route") { + ar & *src_; + } + // std::cout << "syncstr done " <<syncstr << std::endl; + } }; diff --git a/src/syncConnectionCommand.cpp b/src/syncConnectionCommand.cpp index d0d4a9a..533cab3 100644 --- a/src/syncConnectionCommand.cpp +++ b/src/syncConnectionCommand.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -31,17 +31,17 @@ */ #include "syncConnectionCommand.h" -SyncConnectionCommand::SyncConnectionCommand(ConnectionList & cl ) -:cl_(cl) -{ +SyncConnectionCommand::SyncConnectionCommand(ConnectionList& cl) + :cl_(cl) +{ } -SyncConnectionCommand::SyncConnectionCommand(ConnectionList & cl, u_int16_t mux ) -:cl_(cl),mux_(mux) -{ +SyncConnectionCommand::SyncConnectionCommand(ConnectionList& cl, u_int16_t mux) + :cl_(cl),mux_(mux) +{ } -u_int16_t SyncConnectionCommand::getMux() const +u_int16_t SyncConnectionCommand::getMux() const { - return mux_; + return mux_; } diff --git a/src/syncConnectionCommand.h b/src/syncConnectionCommand.h index 0c2eb43..c95d34e 100644 --- a/src/syncConnectionCommand.h +++ b/src/syncConnectionCommand.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -42,23 +42,22 @@ class SyncConnectionCommand { public: - SyncConnectionCommand(ConnectionList & cl ); - SyncConnectionCommand(ConnectionList & cl ,u_int16_t mux); - u_int16_t getMux() const; + SyncConnectionCommand(ConnectionList& cl); + SyncConnectionCommand(ConnectionList& cl ,u_int16_t mux); + u_int16_t getMux() const; private: - SyncConnectionCommand(const SyncConnectionCommand &); - ConnectionList & cl_; - u_int16_t mux_; + SyncConnectionCommand(const SyncConnectionCommand&); + ConnectionList& cl_; + u_int16_t mux_; friend class boost::serialization::access; template<class Archive> - void serialize(Archive & ar, const unsigned int version) - { - Lock lock(cl_.getMutex()); - ar & mux_; - ConnectionParam & conn = cl_.getOrNewConnectionUnlocked(mux_); - ar & conn; - } + void serialize(Archive& ar, const unsigned int version) { + Lock lock(cl_.getMutex()); + ar& mux_; + ConnectionParam& conn = cl_.getOrNewConnectionUnlocked(mux_); + ar& conn; + } }; diff --git a/src/syncOnConnect.hpp b/src/syncOnConnect.hpp index 79df42f..fe8a0eb 100644 --- a/src/syncOnConnect.hpp +++ b/src/syncOnConnect.hpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -35,13 +35,12 @@ // TODO required headers -void syncOnConnect(SyncTcpConnection * connptr) +void syncOnConnect(SyncTcpConnection* connptr) { - //TODO Locking here - ConnectionList & cl_(gConnectionList); + //TODO Locking here + ConnectionList& cl_(gConnectionList); ConnectionMap::iterator cit = cl_.getBeginUnlocked(); - for (;cit!=cl_.getEndUnlocked();++cit) - { + for(; cit!=cl_.getEndUnlocked(); ++cit) { std::ostringstream sout; boost::archive::text_oarchive oa(sout); const SyncCommand scom(cl_,cit->first); @@ -51,25 +50,23 @@ void syncOnConnect(SyncTcpConnection * connptr) connptr->Send(lengthout.str()); connptr->Send(sout.str()); } - //TODO Locking here - network_address_type_t types[] = {ipv4,ipv6,ethernet}; - for (int types_idx=0; types_idx<3; types_idx++) - { - network_address_type_t type = types[types_idx]; - RoutingMap::iterator it = gRoutingTable.getBeginUnlocked(type); - for (;it!=gRoutingTable.getEndUnlocked(type);++it) - { - NetworkPrefix tmp(it->first); - std::ostringstream sout; - boost::archive::text_oarchive oa(sout); - const SyncCommand scom(tmp); - oa << scom; - std::stringstream lengthout; - lengthout << std::setw(5) << std::setfill('0') << sout.str().size()<< ' '; - connptr->Send(lengthout.str()); - connptr->Send(sout.str()); - } - } + //TODO Locking here + network_address_type_t types[] = {ipv4,ipv6,ethernet}; + for(int types_idx=0; types_idx<3; types_idx++) { + network_address_type_t type = types[types_idx]; + RoutingMap::iterator it = gRoutingTable.getBeginUnlocked(type); + for(; it!=gRoutingTable.getEndUnlocked(type); ++it) { + NetworkPrefix tmp(it->first); + std::ostringstream sout; + boost::archive::text_oarchive oa(sout); + const SyncCommand scom(tmp); + oa << scom; + std::stringstream lengthout; + lengthout << std::setw(5) << std::setfill('0') << sout.str().size()<< ' '; + connptr->Send(lengthout.str()); + connptr->Send(sout.str()); + } + } } #endif diff --git a/src/syncQueue.cpp b/src/syncQueue.cpp index 270bb26..8ddc743 100644 --- a/src/syncQueue.cpp +++ b/src/syncQueue.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -52,39 +52,41 @@ SyncQueue& SyncQueue::instance() { Lock lock(instMutex); static instanceCleaner c; - if(!inst) + if(!inst) { inst = new SyncQueue(); + } return *inst; } -void SyncQueue::push(const SyncCommand & scom ) +void SyncQueue::push(const SyncCommand& scom) { - std::ostringstream sout; - boost::archive::text_oarchive oa(sout); - oa << scom; + std::ostringstream sout; + boost::archive::text_oarchive oa(sout); + oa << scom; std::stringstream lengthout; lengthout << std::setw(5) << std::setfill('0') << sout.str().size()<< ' '; - push(lengthout.str()+sout.str()); + push(lengthout.str()+sout.str()); } -void SyncQueue::push(const std::string & str ) +void SyncQueue::push(const std::string& str) { Lock lock(mutex_); -// std::cout << "Debug" << std:endl; - if( syncServer_) - syncServer_->send(str); + // std::cout << "Debug" << std:endl; + if(syncServer_) { + syncServer_->send(str); + } } -void SyncQueue::setSyncServerPtr(SyncServer * ptr) +void SyncQueue::setSyncServerPtr(SyncServer* ptr) { Lock lock(mutex_); - syncServer_=ptr; + syncServer_=ptr; } bool SyncQueue::empty() { Lock lock(mutex_); - return 1; + return 1; } diff --git a/src/syncQueue.h b/src/syncQueue.h index 8da82b9..e5eb8d7 100644 --- a/src/syncQueue.h +++ b/src/syncQueue.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -45,28 +45,31 @@ class SyncQueue { public: - SyncQueue():syncServer_(NULL) {}; - ~SyncQueue() {}; + SyncQueue():syncServer_(NULL) {}; + ~SyncQueue() {}; static SyncQueue& instance(); - void setSyncServerPtr(SyncServer *); - void push(const std::string & ); - void push(const SyncCommand & ); - std::string pop(); - bool empty(); + void setSyncServerPtr(SyncServer*); + void push(const std::string&); + void push(const SyncCommand&); + std::string pop(); + bool empty(); private: static Mutex instMutex; - static SyncQueue* inst; - class instanceCleaner { - public: ~instanceCleaner() { - if(SyncQueue::inst != 0) - delete SyncQueue::inst; - } + static SyncQueue* inst; + class instanceCleaner + { + public: + ~instanceCleaner() { + if(SyncQueue::inst != 0) { + delete SyncQueue::inst; + } + } }; - SyncQueue(const SyncQueue &s); - void operator=(const SyncQueue &s); + SyncQueue(const SyncQueue& s); + void operator=(const SyncQueue& s); Mutex mutex_; - SyncServer * syncServer_; + SyncServer* syncServer_; }; extern SyncQueue& gSyncQueue; diff --git a/src/syncRouteCommand.cpp b/src/syncRouteCommand.cpp index 3c02a02..439b693 100644 --- a/src/syncRouteCommand.cpp +++ b/src/syncRouteCommand.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -32,16 +32,16 @@ #include "syncRouteCommand.h" SyncRouteCommand::SyncRouteCommand() -{ +{ } -SyncRouteCommand::SyncRouteCommand( const NetworkPrefix & addr ) -:addr_(addr) -{ +SyncRouteCommand::SyncRouteCommand(const NetworkPrefix& addr) + :addr_(addr) +{ } -NetworkPrefix SyncRouteCommand::getPrefix() const +NetworkPrefix SyncRouteCommand::getPrefix() const { - return addr_; + return addr_; } diff --git a/src/syncRouteCommand.h b/src/syncRouteCommand.h index e91ffd0..6ad87ae 100644 --- a/src/syncRouteCommand.h +++ b/src/syncRouteCommand.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -42,25 +42,24 @@ class SyncRouteCommand { public: - SyncRouteCommand(const NetworkPrefix & ); - SyncRouteCommand(); - NetworkPrefix getPrefix() const; + SyncRouteCommand(const NetworkPrefix&); + SyncRouteCommand(); + NetworkPrefix getPrefix() const; private: - SyncRouteCommand(const SyncRouteCommand &); - u_int16_t count_; - NetworkPrefix addr_; + SyncRouteCommand(const SyncRouteCommand&); + u_int16_t count_; + NetworkPrefix addr_; friend class boost::serialization::access; template<class Archive> - void serialize(Archive & ar, const unsigned int version) - { - Lock lock(gRoutingTable.getMutex()); - ar & addr_; -// u_int16_t & mux (gRoutingTable.getOrNewRoutingTEUnlocked(addr_)); -// ar & mux; - ar & (*(gRoutingTable.getOrNewRoutingTEUnlocked(addr_))); - gRoutingTable.updateRouteTreeUnlocked(addr_); - }; + void serialize(Archive& ar, const unsigned int version) { + Lock lock(gRoutingTable.getMutex()); + ar& addr_; + // u_int16_t & mux (gRoutingTable.getOrNewRoutingTEUnlocked(addr_)); + // ar & mux; + ar & (*(gRoutingTable.getOrNewRoutingTEUnlocked(addr_))); + gRoutingTable.updateRouteTreeUnlocked(addr_); + }; }; diff --git a/src/syncServer.cpp b/src/syncServer.cpp index e4f6434..4003dba 100644 --- a/src/syncServer.cpp +++ b/src/syncServer.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -37,18 +37,18 @@ //using asio::ip::tcp; -SyncServer::SyncServer(std::string localaddr, std::string port, ConnectCallback onConnect) +SyncServer::SyncServer(std::string localaddr, std::string port, ConnectCallback onConnect) : onConnect_(onConnect) { gResolver.resolveTcp(localaddr, port, boost::bind(&SyncServer::onResolve, this, _1), boost::bind(&SyncServer::onResolvError, this, _1)); } -SyncServer::~SyncServer() +SyncServer::~SyncServer() { std::list<AcceptorsElement>::iterator it = acceptors_.begin(); - for(;it != acceptors_.end(); ++it) { -/// this might be a needed by a running thread, TODO cleanup -// delete(it->acceptor_); + for(; it != acceptors_.end(); ++it) { + /// this might be a needed by a running thread, TODO cleanup + // delete(it->acceptor_); } } @@ -56,16 +56,18 @@ void SyncServer::onResolve(SyncTcpConnection::proto::resolver::iterator& it) { while(it != SyncTcpConnection::proto::resolver::iterator()) { SyncTcpConnection::proto::endpoint e = *it; - + AcceptorsElement acceptor; acceptor.acceptor_ = new SyncTcpConnection::proto::acceptor(io_service_); - if(!acceptor.acceptor_) + if(!acceptor.acceptor_) { AnytunError::throwErr() << "memory error"; + } acceptor.acceptor_->open(e.protocol()); #ifndef _MSC_VER - if(e.protocol() == boost::asio::ip::tcp::v6()) + if(e.protocol() == boost::asio::ip::tcp::v6()) { acceptor.acceptor_->set_option(boost::asio::ip::v6_only(true)); + } #endif acceptor.acceptor_->set_option(boost::asio::socket_base::reuse_address(true)); acceptor.acceptor_->bind(e); @@ -86,7 +88,7 @@ void SyncServer::onResolve(SyncTcpConnection::proto::resolver::iterator& it) void SyncServer::onResolvError(const std::runtime_error& e) { cLog.msg(Log::PRIO_ERROR) << "sync server bind/listen failed: " << e.what(); - // TODO: stop daemon?? + // TODO: stop daemon?? } void SyncServer::run() @@ -98,8 +100,9 @@ void SyncServer::run() void SyncServer::send(std::string message) { Lock lock(mutex_); - for(std::list<SyncTcpConnection::pointer>::iterator it = conns_.begin() ;it != conns_.end(); ++it) + for(std::list<SyncTcpConnection::pointer>::iterator it = conns_.begin() ; it != conns_.end(); ++it) { (*it)->Send(message); + } } void SyncServer::start_accept() @@ -107,12 +110,12 @@ void SyncServer::start_accept() Lock lock(mutex_); std::list<AcceptorsElement>::iterator it = acceptors_.begin(); - for(;it != acceptors_.end(); ++it) { + for(; it != acceptors_.end(); ++it) { if(!it->started_) { SyncTcpConnection::pointer new_connection = SyncTcpConnection::create(it->acceptor_->io_service()); conns_.push_back(new_connection); it->acceptor_->async_accept(new_connection->socket(), - boost::bind(&SyncServer::handle_accept, this, new_connection, boost::asio::placeholders::error, it)); + boost::bind(&SyncServer::handle_accept, this, new_connection, boost::asio::placeholders::error, it)); it->started_ = true; } } @@ -120,7 +123,7 @@ void SyncServer::start_accept() void SyncServer::handle_accept(SyncTcpConnection::pointer new_connection, const boost::system::error_code& error, std::list<AcceptorsElement>::iterator it) { - if (!error) { + if(!error) { cLog.msg(Log::PRIO_INFO) << "new sync client connected from " << new_connection->socket().remote_endpoint(); new_connection->onConnect = onConnect_; diff --git a/src/syncServer.h b/src/syncServer.h index 032e975..983013d 100644 --- a/src/syncServer.h +++ b/src/syncServer.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -44,7 +44,7 @@ #include <list> #include "syncTcpConnection.h" -typedef boost::function<void (SyncTcpConnection *)> ConnectCallback; +typedef boost::function<void (SyncTcpConnection*)> ConnectCallback; class SyncServer { @@ -53,12 +53,12 @@ public: ~SyncServer(); void onResolve(SyncTcpConnection::proto::resolver::iterator& it); void onResolvError(const std::runtime_error& e); - + void run(); void send(std::string message); - + std::list<SyncTcpConnection::pointer> conns_; - + private: Mutex mutex_; //Mutex for list conns_ boost::asio::io_service io_service_; diff --git a/src/syncTcpConnection.cpp b/src/syncTcpConnection.cpp index 08875c7..bd6e6fb 100644 --- a/src/syncTcpConnection.cpp +++ b/src/syncTcpConnection.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -54,11 +54,11 @@ void SyncTcpConnection::Send(std::string message) boost::asio::placeholders::bytes_transferred)); } SyncTcpConnection::SyncTcpConnection(boost::asio::io_service& io_service) - : socket_(io_service) + : socket_(io_service) { } void SyncTcpConnection::handle_write(const boost::system::error_code& /*error*/, - size_t /*bytes_transferred*/) + size_t /*bytes_transferred*/) { } diff --git a/src/syncTcpConnection.h b/src/syncTcpConnection.h index e35c574..807d10e 100644 --- a/src/syncTcpConnection.h +++ b/src/syncTcpConnection.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -46,21 +46,20 @@ public: typedef boost::shared_ptr<SyncTcpConnection> pointer; typedef boost::asio::ip::tcp proto; - static pointer create(boost::asio::io_service& io_service) - { - return pointer(new SyncTcpConnection(io_service)); - }; + static pointer create(boost::asio::io_service& io_service) { + return pointer(new SyncTcpConnection(io_service)); + }; - boost::function<void(SyncTcpConnection *)> onConnect; + boost::function<void(SyncTcpConnection*)> onConnect; proto::socket& socket(); void start(); - void Send(std::string message); + void Send(std::string message); private: SyncTcpConnection(boost::asio::io_service& io_service); void handle_write(const boost::system::error_code & /*error*/, - size_t /*bytes_transferred*/); + size_t /*bytes_transferred*/); proto::socket socket_; }; diff --git a/src/sysExec.cpp b/src/sysExec.cpp index a69349f..bf3714d 100644 --- a/src/sysExec.cpp +++ b/src/sysExec.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -66,7 +66,7 @@ SysExec::SysExec(std::string const& script, StringVector args, StringList env) : doExec(args, env); } -int SysExec::getReturnCode() const +int SysExec::getReturnCode() const { return return_code_; } diff --git a/src/sysExec.h b/src/sysExec.h index b5400b9..7b99638 100644 --- a/src/sysExec.h +++ b/src/sysExec.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -42,33 +42,33 @@ typedef std::list<std::string> StringList; class SysExec { - public: - SysExec(std::string const& script); - SysExec(std::string const& script, StringVector args); - SysExec(std::string const& script, StringList env); - SysExec(std::string const& script, StringVector args, StringList env); - ~SysExec(); +public: + SysExec(std::string const& script); + SysExec(std::string const& script, StringVector args); + SysExec(std::string const& script, StringList env); + SysExec(std::string const& script, StringVector args, StringList env); + ~SysExec(); - int waitForScript(); - int getReturnCode() const; + int waitForScript(); + int getReturnCode() const; - static void waitAndDestroy(SysExec*& s); + static void waitAndDestroy(SysExec*& s); - private: - void doExec(StringVector args, StringList env); +private: + void doExec(StringVector args, StringList env); - std::string script_; - bool closed_; + std::string script_; + bool closed_; #ifdef _MSC_VER - PROCESS_INFORMATION process_info_; - DWORD return_code_; + PROCESS_INFORMATION process_info_; + DWORD return_code_; #else - pid_t pid_; - int pipefd_; - int return_code_; + pid_t pid_; + int pipefd_; + int return_code_; #endif - + }; #endif diff --git a/src/threadUtils.hpp b/src/threadUtils.hpp index 7e33302..6285b58 100644 --- a/src/threadUtils.hpp +++ b/src/threadUtils.hpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -50,20 +50,19 @@ class Semaphore { public: Semaphore(unsigned int initVal=0) - :count_(initVal){}; - void up() - { - boost::mutex::scoped_lock lock(mutex_); - count_++; - lock.unlock(); - cond_.notify_one(); + :count_(initVal) {}; + void up() { + boost::mutex::scoped_lock lock(mutex_); + count_++; + lock.unlock(); + cond_.notify_one(); } - void down() - { - boost::mutex::scoped_lock lock(mutex_); - while (count_ <= 0) - cond_.wait(lock); - count_--; + void down() { + boost::mutex::scoped_lock lock(mutex_); + while(count_ <= 0) { + cond_.wait(lock); + } + count_--; } private: boost::mutex mutex_; diff --git a/src/tunDevice.h b/src/tunDevice.h index 8b400a9..cb9b76f 100644 --- a/src/tunDevice.h +++ b/src/tunDevice.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -47,35 +47,39 @@ class TunDevice public: TunDevice(std::string dev,std::string dev_type, std::string ifcfg_addr, u_int16_t ifcfg_prefix); ~TunDevice(); - + int read(u_int8_t* buf, u_int32_t len); int write(u_int8_t* buf, u_int32_t len); const char* getActualName() const { return actual_name_.c_str(); } const char* getActualNode() const { return actual_node_.c_str(); } - device_type_t getType() const { return conf_.type_; } + device_type_t getType() const { return conf_.type_; } void waitUntilReady(); - const char* getTypeString() const - { + const char* getTypeString() const { #ifndef _MSC_VER if(fd_ < 0) #else if(handle_ == INVALID_HANDLE_VALUE) #endif return ""; - - switch(conf_.type_) - { - case TYPE_UNDEF: return "undef"; break; - case TYPE_TUN: return "tun"; break; - case TYPE_TAP: return "tap"; break; + + switch(conf_.type_) { + case TYPE_UNDEF: + return "undef"; + break; + case TYPE_TUN: + return "tun"; + break; + case TYPE_TAP: + return "tap"; + break; } return ""; } private: - void operator=(const TunDevice &src); - TunDevice(const TunDevice &src); + void operator=(const TunDevice& src); + TunDevice(const TunDevice& src); void init_post(); void do_ifconfig(); @@ -86,14 +90,14 @@ private: #else bool getAdapter(std::string const& dev_name); DWORD performIoControl(DWORD controlCode, LPVOID inBuffer, DWORD inBufferSize, - LPVOID outBuffer, DWORD outBufferSize); + LPVOID outBuffer, DWORD outBufferSize); HANDLE handle_; OVERLAPPED roverlapped_, woverlapped_; #endif DeviceConfig conf_; #ifndef _MSC_VER - SysExec * sys_exec_; + SysExec* sys_exec_; #endif bool with_pi_; std::string actual_name_; diff --git a/src/win32/registryKey.cpp b/src/win32/registryKey.cpp index a9a0959..4c6240c 100644 --- a/src/win32/registryKey.cpp +++ b/src/win32/registryKey.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -64,14 +64,16 @@ std::string RegistryKey::getName() const DWORD RegistryKey::open(HKEY hkey, std::string subKey, REGSAM samDesired) { - if(opened_) + if(opened_) { RegCloseKey(key_); + } opened_ = false; name_ = ""; LONG err = RegOpenKeyExA(hkey, subKey.c_str(), 0, samDesired, &key_); - if(err != ERROR_SUCCESS) + if(err != ERROR_SUCCESS) { return err; + } name_ = subKey; opened_ = true; @@ -80,28 +82,32 @@ DWORD RegistryKey::open(HKEY hkey, std::string subKey, REGSAM samDesired) void RegistryKey::close() { - if(opened_) + if(opened_) { RegCloseKey(key_); + } opened_ = false; } std::string RegistryKey::operator[](std::string const& name) const { - if(!opened_) + if(!opened_) { throw AnytunErrno(ERROR_INVALID_HANDLE); + } char value[STRING_VALUE_LENGTH]; DWORD len = sizeof(value); LONG err = RegQueryValueExA(key_, name.c_str(), NULL, NULL, (LPBYTE)value, &len); - if(err != ERROR_SUCCESS) + if(err != ERROR_SUCCESS) { throw AnytunErrno(err); + } if(value[len-1] != 0) { - if(len < sizeof(value)) + if(len < sizeof(value)) { value[len++] = 0; - else + } else { throw AnytunErrno(ERROR_INSUFFICIENT_BUFFER); - } + } + } return std::string(value); } @@ -110,8 +116,9 @@ DWORD RegistryKey::getSubKey(DWORD index, RegistryKey& subKey, REGSAM sam) const char subkeyname[NAME_LENGTH]; DWORD len = sizeof(subkeyname); DWORD err = RegEnumKeyExA(key_, index, subkeyname, &len, NULL, NULL, NULL, NULL); - if(err != ERROR_SUCCESS) + if(err != ERROR_SUCCESS) { return err; + } return subKey.open(key_, subkeyname, sam); } diff --git a/src/win32/registryKey.h b/src/win32/registryKey.h index 6aceba0..9e42e29 100644 --- a/src/win32/registryKey.h +++ b/src/win32/registryKey.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -37,9 +37,9 @@ class RegistryKey { -public: - #define NAME_LENGTH 256 - #define STRING_VALUE_LENGTH 256 +public: +#define NAME_LENGTH 256 +#define STRING_VALUE_LENGTH 256 RegistryKey(); RegistryKey(HKEY hkey, std::string subKey, REGSAM samDesired); diff --git a/src/win32/signalHandler.hpp b/src/win32/signalHandler.hpp index 23872a6..6bcea18 100644 --- a/src/win32/signalHandler.hpp +++ b/src/win32/signalHandler.hpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -73,8 +73,9 @@ bool handleSignal(DWORD ctrlType) void registerSignalHandler(SignalController& ctrl, DaemonService& /*service*/) { - if(!SetConsoleCtrlHandler((PHANDLER_ROUTINE)handleSignal, true)) + if(!SetConsoleCtrlHandler((PHANDLER_ROUTINE)handleSignal, true)) { AnytunError::throwErr() << "Error on SetConsoleCtrlhandler: " << AnytunErrno(GetLastError()); + } ctrl.handler[CTRL_C_EVENT] = boost::bind(CtrlCHandler, _1, _2); ctrl.handler[CTRL_BREAK_EVENT] = boost::bind(CtrlBreakHandler, _1, _2); diff --git a/src/win32/signalServiceHandler.hpp b/src/win32/signalServiceHandler.hpp index da16de5..c897aa2 100644 --- a/src/win32/signalServiceHandler.hpp +++ b/src/win32/signalServiceHandler.hpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. diff --git a/src/win32/sysExec.hpp b/src/win32/sysExec.hpp index ed5be01..3807a63 100644 --- a/src/win32/sysExec.hpp +++ b/src/win32/sysExec.hpp @@ -1,160 +1,162 @@ -/*
- * anytun
- *
- * The secure anycast tunneling protocol (satp) defines a protocol used
- * for communication between any combination of unicast and anycast
- * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel
- * mode and allows tunneling of every ETHER TYPE protocol (e.g.
- * ethernet, ip, arp ...). satp directly includes cryptography and
- * message authentication based on the methodes used by SRTP. It is
- * intended to deliver a generic, scaleable and secure solution for
- * tunneling and relaying of packets of any protocol.
- *
- *
- * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl,
- * Christian Pointner <satp@wirdorange.org>
- *
- * This file is part of Anytun.
- *
- * Anytun is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * any later version.
- *
- * Anytun is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with anytun. If not, see <http://www.gnu.org/licenses/>.
- */
-#pragma once
-#ifndef ANYTUN_sysexec_hpp_INCLUDED
-#define ANYTUN_sysexec_hpp_INCLUDED
-
-#include <algorithm>
-#include <iostream> // todo remove
-#include <windows.h>
-
-SysExec::~SysExec()
-{
- if(!closed_) {
- CloseHandle(process_info_.hProcess);
- CloseHandle(process_info_.hThread);
- }
-}
-
-STARTUPINFOA getStartupInfo() {
- STARTUPINFOA startup_info;
- startup_info.cb = sizeof(STARTUPINFOA);
- GetStartupInfoA(&startup_info);
-
- //startup_info.dwFlags = STARTF_USESTDHANDLES;
- //startup_info.hStdInput = CreateFile("NUL", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 0, 0, 0); // INVALID_HANDLE_VALUE;
- //startup_info.hStdOutput = CreateFile("NUL", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 0, 0, 0); // INVALID_HANDLE_VALUE;
- //startup_info.hStdError = CreateFile("NUL", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 0, 0, 0); // INVALID_HANDLE_VALUE;
- startup_info.dwFlags |= STARTF_USESHOWWINDOW;
- startup_info.wShowWindow = SW_HIDE;
-
- return startup_info;
-}
-
-char const * const BATCH_FILE_EXTS[] = { ".bat", ".cmd" };
-int const BATCH_FILE_EXTS_COUNT = sizeof(BATCH_FILE_EXTS) / sizeof(BATCH_FILE_EXTS[0]);
-
-bool endsWith(std::string const& string, std::string const& suffix) {
- return string.find(suffix, string.size() - suffix.size()) != std::string::npos;
-}
-
-void SysExec::doExec(StringVector args, StringList env)
-{
- std::vector<char> arguments;
-
- bool isBatchFile = false;
- for(int i = 0; i < BATCH_FILE_EXTS_COUNT; ++i) {
- if(endsWith(script_, BATCH_FILE_EXTS[i])) {
- isBatchFile = true;
- break;
- }
- }
-
- if(isBatchFile) {
- std::string const BATCH_INTERPRETER = "cmd /c \"";
- arguments.insert(arguments.end(), BATCH_INTERPRETER.begin(), BATCH_INTERPRETER.end());
- }
- arguments.push_back('\"');
- arguments.insert(arguments.end(), script_.begin(), script_.end());
- arguments.push_back('\"');
- arguments.push_back(' ');
-
- for(StringVector::const_iterator it = args.begin(); it != args.end(); ++it) {
- arguments.push_back('\"');
- arguments.insert(arguments.end(), it->begin(), it->end());
- arguments.push_back('\"');
- arguments.push_back(' ');
- }
-
- if(isBatchFile) {
- arguments.push_back('\"');
- }
- arguments.push_back(0);
-
- STARTUPINFOA startup_info = getStartupInfo();
-
- std::map<std::string, std::string> envDict;
- for(StringList::const_iterator it = env.begin(); it != env.begin(); ++it) {
- size_t delimiter_pos = it->find('=');
- envDict.insert(std::make_pair(it->substr(0, delimiter_pos), it->substr(delimiter_pos + 1)));
- }
- std::vector<char> env;
- for(std::map<std::string, std::string>::iterator it = envDict.begin(); it != envDict.end(); ++it) {
- env.insert(env.end(), it->first.begin(), it->first.end());
- env.push_back(0);
- }
- env.push_back(0);
-
- if(!CreateProcessA(NULL,
- &arguments[0],
- NULL,
- NULL,
- false,
- NULL,
- &env[0],
- NULL,
- &startup_info,
- &process_info_
- ))
- {
- cLog.msg(Log::PRIO_ERROR) << "executing script '" << script_ << "' CreateProcess() error: " << GetLastError();
- return;
- }
-}
-
-int SysExec::waitForScript()
-{
- DWORD result = WaitForSingleObject(process_info_.hProcess, INFINITE);
- assert(WAIT_OBJECT_0 == result); // WAIT_FAILED, WAIT_TIMEOUT ... ???
- bool success = GetExitCodeProcess(process_info_.hProcess, &return_code_) != 0;
- assert(true == success); // false -> HU?
-
- CloseHandle(process_info_.hProcess);
- CloseHandle(process_info_.hThread);
- closed_ = true;
-
- return static_cast<int>(return_code_);
-}
-
-void SysExec::waitAndDestroy(SysExec*& s)
-{
- if(!s)
- return;
-
- s->waitForScript();
- cLog.msg(Log::PRIO_NOTICE) << "script '" << s->script_ << "' returned " << s->return_code_;
-
- delete(s);
- s = NULL;
-}
-
-#endif // ANYTUN_sysexec_hpp_INCLUDED
+/* + * anytun + * + * The secure anycast tunneling protocol (satp) defines a protocol used + * for communication between any combination of unicast and anycast + * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel + * mode and allows tunneling of every ETHER TYPE protocol (e.g. + * ethernet, ip, arp ...). satp directly includes cryptography and + * message authentication based on the methodes used by SRTP. It is + * intended to deliver a generic, scaleable and secure solution for + * tunneling and relaying of packets of any protocol. + * + * + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Christian Pointner <satp@wirdorange.org> + * + * This file is part of Anytun. + * + * Anytun is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * Anytun is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with anytun. If not, see <http://www.gnu.org/licenses/>. + */ +#pragma once +#ifndef ANYTUN_sysexec_hpp_INCLUDED +#define ANYTUN_sysexec_hpp_INCLUDED + +#include <algorithm> +#include <iostream> // todo remove +#include <windows.h> + +SysExec::~SysExec() +{ + if(!closed_) { + CloseHandle(process_info_.hProcess); + CloseHandle(process_info_.hThread); + } +} + +STARTUPINFOA getStartupInfo() +{ + STARTUPINFOA startup_info; + startup_info.cb = sizeof(STARTUPINFOA); + GetStartupInfoA(&startup_info); + + //startup_info.dwFlags = STARTF_USESTDHANDLES; + //startup_info.hStdInput = CreateFile("NUL", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 0, 0, 0); // INVALID_HANDLE_VALUE; + //startup_info.hStdOutput = CreateFile("NUL", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 0, 0, 0); // INVALID_HANDLE_VALUE; + //startup_info.hStdError = CreateFile("NUL", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 0, 0, 0); // INVALID_HANDLE_VALUE; + startup_info.dwFlags |= STARTF_USESHOWWINDOW; + startup_info.wShowWindow = SW_HIDE; + + return startup_info; +} + +char const* const BATCH_FILE_EXTS[] = { ".bat", ".cmd" }; +int const BATCH_FILE_EXTS_COUNT = sizeof(BATCH_FILE_EXTS) / sizeof(BATCH_FILE_EXTS[0]); + +bool endsWith(std::string const& string, std::string const& suffix) +{ + return string.find(suffix, string.size() - suffix.size()) != std::string::npos; +} + +void SysExec::doExec(StringVector args, StringList env) +{ + std::vector<char> arguments; + + bool isBatchFile = false; + for(int i = 0; i < BATCH_FILE_EXTS_COUNT; ++i) { + if(endsWith(script_, BATCH_FILE_EXTS[i])) { + isBatchFile = true; + break; + } + } + + if(isBatchFile) { + std::string const BATCH_INTERPRETER = "cmd /c \""; + arguments.insert(arguments.end(), BATCH_INTERPRETER.begin(), BATCH_INTERPRETER.end()); + } + arguments.push_back('\"'); + arguments.insert(arguments.end(), script_.begin(), script_.end()); + arguments.push_back('\"'); + arguments.push_back(' '); + + for(StringVector::const_iterator it = args.begin(); it != args.end(); ++it) { + arguments.push_back('\"'); + arguments.insert(arguments.end(), it->begin(), it->end()); + arguments.push_back('\"'); + arguments.push_back(' '); + } + + if(isBatchFile) { + arguments.push_back('\"'); + } + arguments.push_back(0); + + STARTUPINFOA startup_info = getStartupInfo(); + + std::map<std::string, std::string> envDict; + for(StringList::const_iterator it = env.begin(); it != env.begin(); ++it) { + size_t delimiter_pos = it->find('='); + envDict.insert(std::make_pair(it->substr(0, delimiter_pos), it->substr(delimiter_pos + 1))); + } + std::vector<char> env; + for(std::map<std::string, std::string>::iterator it = envDict.begin(); it != envDict.end(); ++it) { + env.insert(env.end(), it->first.begin(), it->first.end()); + env.push_back(0); + } + env.push_back(0); + + if(!CreateProcessA(NULL, + &arguments[0], + NULL, + NULL, + false, + NULL, + &env[0], + NULL, + &startup_info, + &process_info_ + )) { + cLog.msg(Log::PRIO_ERROR) << "executing script '" << script_ << "' CreateProcess() error: " << GetLastError(); + return; + } +} + +int SysExec::waitForScript() +{ + DWORD result = WaitForSingleObject(process_info_.hProcess, INFINITE); + assert(WAIT_OBJECT_0 == result); // WAIT_FAILED, WAIT_TIMEOUT ... ??? + bool success = GetExitCodeProcess(process_info_.hProcess, &return_code_) != 0; + assert(true == success); // false -> HU? + + CloseHandle(process_info_.hProcess); + CloseHandle(process_info_.hThread); + closed_ = true; + + return static_cast<int>(return_code_); +} + +void SysExec::waitAndDestroy(SysExec*& s) +{ + if(!s) { + return; + } + + s->waitForScript(); + cLog.msg(Log::PRIO_NOTICE) << "script '" << s->script_ << "' returned " << s->return_code_; + + delete(s); + s = NULL; +} + +#endif // ANYTUN_sysexec_hpp_INCLUDED diff --git a/src/win32/tunDevice.cpp b/src/win32/tunDevice.cpp index 6e6c83d..810e094 100644 --- a/src/win32/tunDevice.cpp +++ b/src/win32/tunDevice.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -49,19 +49,22 @@ TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifcfg_addr, u_int16_t ifcfg_prefix) : conf_(dev_name, dev_type, ifcfg_addr, ifcfg_prefix, 1400) { - if(conf_.type_ != TYPE_TUN && conf_.type_ != TYPE_TAP) + if(conf_.type_ != TYPE_TUN && conf_.type_ != TYPE_TAP) { AnytunError::throwErr() << "unable to recognize type of device (tun or tap)"; + } handle_ = INVALID_HANDLE_VALUE; - if(!getAdapter(dev_name)) + if(!getAdapter(dev_name)) { AnytunError::throwErr() << "can't find any suitable device"; + } if(handle_ == INVALID_HANDLE_VALUE) { std::stringstream tapname; - tapname << USERMODEDEVICEDIR << actual_node_ << TAPSUFFIX; + tapname << USERMODEDEVICEDIR << actual_node_ << TAPSUFFIX; handle_ = CreateFileA(tapname.str().c_str(), GENERIC_WRITE | GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED, 0); - if(handle_ == INVALID_HANDLE_VALUE) + if(handle_ == INVALID_HANDLE_VALUE) { AnytunError::throwErr() << "Unable to open device: " << actual_node_ << " (" << actual_name_ << "): " << AnytunErrno(GetLastError()); + } } DWORD err; @@ -90,15 +93,16 @@ TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifc } } - if(ifcfg_addr != "") + if(ifcfg_addr != "") { do_ifconfig(); + } int status = true; err = performIoControl(TAP_IOCTL_SET_MEDIA_STATUS, &status, sizeof(status), &status, sizeof(status)); if(err != ERROR_SUCCESS) { CloseHandle(handle_); AnytunError::throwErr() << "Unable to set device media status: " << AnytunErrno(err); - } + } roverlapped_.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); woverlapped_.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); @@ -108,45 +112,50 @@ bool TunDevice::getAdapter(std::string const& dev_name) { RegistryKey akey; DWORD err = akey.open(HKEY_LOCAL_MACHINE, ADAPTER_KEY, KEY_ENUMERATE_SUB_KEYS); - if(err != ERROR_SUCCESS) + if(err != ERROR_SUCCESS) { AnytunError::throwErr() << "Unable to open registry key (HKLM\\" << ADAPTER_KEY << "): " << AnytunErrno(err); - + } + bool found = false; for(int i=0; ; ++i) { RegistryKey ckey; DWORD err = akey.getSubKey(i, ckey, KEY_QUERY_VALUE); - if(err == ERROR_NO_MORE_ITEMS) + if(err == ERROR_NO_MORE_ITEMS) { break; - if(err != ERROR_SUCCESS) + } + if(err != ERROR_SUCCESS) { continue; + } try { - if(ckey["ComponentId"] != TAP_COMPONENT_ID) + if(ckey["ComponentId"] != TAP_COMPONENT_ID) { continue; + } actual_node_ = ckey["NetCfgInstanceId"]; RegistryKey nkey; std::stringstream keyname; keyname << NETWORK_CONNECTIONS_KEY << "\\" << actual_node_ << "\\Connection"; err = nkey.open(HKEY_LOCAL_MACHINE, keyname.str().c_str(), KEY_QUERY_VALUE);; - if(err != ERROR_SUCCESS) + if(err != ERROR_SUCCESS) { continue; - - actual_name_ = nkey["Name"]; - } catch(AnytunErrno&) { continue; } + } + + actual_name_ = nkey["Name"]; + } catch(AnytunErrno&) { continue; } if(dev_name != "") { if(dev_name == actual_name_) { found = true; break; } - } - else { + } else { std::stringstream tapname; tapname << USERMODEDEVICEDIR << actual_node_ << TAPSUFFIX; handle_ = CreateFileA(tapname.str().c_str(), GENERIC_WRITE | GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED, 0); - if(handle_ == INVALID_HANDLE_VALUE) + if(handle_ == INVALID_HANDLE_VALUE) { continue; + } found = true; break; } @@ -163,18 +172,19 @@ DWORD TunDevice::performIoControl(DWORD controlCode, LPVOID inBuffer, DWORD inBu OVERLAPPED overlapped; overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); overlapped.Offset = 0; - overlapped.OffsetHigh = 0; - + overlapped.OffsetHigh = 0; + DWORD len; if(!DeviceIoControl(handle_, controlCode, inBuffer, inBufferSize, outBuffer, outBufferSize, &len, &overlapped)) { DWORD err = GetLastError(); if(err == ERROR_IO_PENDING) { WaitForSingleObject(overlapped.hEvent, INFINITE); - if(!GetOverlappedResult(handle_, &overlapped, &len, FALSE)) + if(!GetOverlappedResult(handle_, &overlapped, &len, FALSE)) { return GetLastError(); - } - else + } + } else { return GetLastError(); + } } return ERROR_SUCCESS; } @@ -182,27 +192,30 @@ DWORD TunDevice::performIoControl(DWORD controlCode, LPVOID inBuffer, DWORD inBu TunDevice::~TunDevice() { - if(handle_ != INVALID_HANDLE_VALUE) + if(handle_ != INVALID_HANDLE_VALUE) { CloseHandle(handle_); - if(roverlapped_.hEvent != INVALID_HANDLE_VALUE) + } + if(roverlapped_.hEvent != INVALID_HANDLE_VALUE) { CloseHandle(roverlapped_.hEvent); - if(woverlapped_.hEvent != INVALID_HANDLE_VALUE) + } + if(woverlapped_.hEvent != INVALID_HANDLE_VALUE) { CloseHandle(woverlapped_.hEvent); + } } int TunDevice::fix_return(int ret, size_t pi_length) const { -// nothing to be done here - return 0; + // nothing to be done here + return 0; } int TunDevice::read(u_int8_t* buf, u_int32_t len) { DWORD lenout; roverlapped_.Offset = 0; - roverlapped_.OffsetHigh = 0; + roverlapped_.OffsetHigh = 0; ResetEvent(roverlapped_.hEvent); - + if(!ReadFile(handle_, buf, len, &lenout, &roverlapped_)) { DWORD err = GetLastError(); if(err == ERROR_IO_PENDING) { @@ -211,8 +224,7 @@ int TunDevice::read(u_int8_t* buf, u_int32_t len) cLog.msg(Log::PRIO_ERROR) << "Error while trying to get overlapped result: " << AnytunErrno(GetLastError()); return -1; } - } - else { + } else { cLog.msg(Log::PRIO_ERROR) << "Error while reading from device: " << AnytunErrno(GetLastError()); return -1; } @@ -224,10 +236,10 @@ int TunDevice::write(u_int8_t* buf, u_int32_t len) { DWORD lenout; woverlapped_.Offset = 0; - woverlapped_.OffsetHigh = 0; + woverlapped_.OffsetHigh = 0; ResetEvent(woverlapped_.hEvent); - if(!WriteFile(handle_, buf, len, &lenout, &woverlapped_)) { + if(!WriteFile(handle_, buf, len, &lenout, &woverlapped_)) { DWORD err = GetLastError(); if(err == ERROR_IO_PENDING) { WaitForSingleObject(woverlapped_.hEvent, INFINITE); @@ -235,18 +247,17 @@ int TunDevice::write(u_int8_t* buf, u_int32_t len) cLog.msg(Log::PRIO_ERROR) << "Error while trying to get overlapped result: " << AnytunErrno(GetLastError()); return -1; } - } - else { + } else { cLog.msg(Log::PRIO_ERROR) << "Error while writing to device: " << AnytunErrno(GetLastError()); return -1; } } - return lenout; + return lenout; } void TunDevice::init_post() { -// nothing to be done here + // nothing to be done here } void TunDevice::do_ifconfig() @@ -260,18 +271,18 @@ void TunDevice::do_ifconfig() if(err != ERROR_SUCCESS) { CloseHandle(handle_); AnytunError::throwErr() << "Unable to set device dhcp masq mode: " << AnytunErrno(err); - } + } u_long mtu; err = performIoControl(TAP_IOCTL_GET_MTU, &mtu, sizeof(mtu), &mtu, sizeof(mtu)); if(err != ERROR_SUCCESS) { CloseHandle(handle_); AnytunError::throwErr() << "Unable to get device mtu: " << AnytunErrno(err); - } + } conf_.mtu_ = static_cast<u_int16_t>(mtu); } void TunDevice::waitUntilReady() { -// nothing to be done here + // nothing to be done here } diff --git a/src/win32/winService.cpp b/src/win32/winService.cpp index 8c17420..084fa85 100644 --- a/src/win32/winService.cpp +++ b/src/win32/winService.cpp @@ -1,197 +1,205 @@ -/*
- * anytun
- *
- * The secure anycast tunneling protocol (satp) defines a protocol used
- * for communication between any combination of unicast and anycast
- * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel
- * mode and allows tunneling of every ETHER TYPE protocol (e.g.
- * ethernet, ip, arp ...). satp directly includes cryptography and
- * message authentication based on the methodes used by SRTP. It is
- * intended to deliver a generic, scaleable and secure solution for
- * tunneling and relaying of packets of any protocol.
- *
- *
- * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl,
- * Christian Pointner <satp@wirdorange.org>
- *
- * This file is part of Anytun.
- *
- * Anytun is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * any later version.
- *
- * Anytun is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with anytun. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifdef WIN_SERVICE
-
-#include <iostream>
-
-#include <windows.h>
-
-#include "winService.h"
-#include "../log.h"
-#include "../anytunError.h"
-#include "../threadUtils.hpp"
-
-void WinService::install()
-{
- SC_HANDLE schSCManager;
- SC_HANDLE schService;
- char szPath[MAX_PATH];
-
- if(!GetModuleFileNameA(NULL, szPath, MAX_PATH))
- AnytunError::throwErr() << "Error on GetModuleFileName: " << AnytunErrno(GetLastError());
-
- schSCManager = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);
- if(NULL == schSCManager)
- AnytunError::throwErr() << "Error on OpenSCManager: " << AnytunErrno(GetLastError());
-
- schService = CreateServiceA(schSCManager, SVC_NAME, SVC_NAME, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
- SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, szPath, NULL, NULL, NULL, NULL, NULL);
- if(schService == NULL) {
- CloseServiceHandle(schSCManager);
- AnytunError::throwErr() << "Error on CreateService: " << AnytunErrno(GetLastError());
- }
-
- std::cout << "Service installed successfully" << std::endl;
-
- CloseServiceHandle(schService);
- CloseServiceHandle(schSCManager);
-}
-
-void WinService::uninstall()
-{
- SC_HANDLE schSCManager;
- SC_HANDLE schService;
-
- schSCManager = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);
- if(NULL == schSCManager)
- AnytunError::throwErr() << "Error on OpenSCManager: " << AnytunErrno(GetLastError());
-
- schService = OpenServiceA(schSCManager, SVC_NAME, SERVICE_ALL_ACCESS);
- if(schService == NULL) {
- CloseServiceHandle(schSCManager);
- AnytunError::throwErr() << "Error on CreateService: " << AnytunErrno(GetLastError());
- }
-
- if(!DeleteService(schService)) {
- CloseServiceHandle(schService);
- CloseServiceHandle(schSCManager);
- AnytunError::throwErr() << "Error on DeleteService: " << AnytunErrno(GetLastError());
- }
-
- std::cout << "Service uninstalled successfully" << std::endl;
-
- CloseServiceHandle(schService);
- CloseServiceHandle(schSCManager);
-}
-
-void WinService::start()
-{
- SERVICE_TABLE_ENTRY DispatchTable[] = {
- {SVC_NAME, (LPSERVICE_MAIN_FUNCTION)WinService::main },
- {NULL, NULL}
- };
-
- if(!StartServiceCtrlDispatcherA(DispatchTable))
- AnytunError::throwErr() << "Error on StartServiceCtrlDispatcher: " << AnytunErrno(GetLastError());
-}
-
-int real_main(int argc, char* argv[], WinService& service);
-
-VOID WINAPI WinService::main(DWORD dwArgc, LPTSTR *lpszArgv)
-{
- WinService service;
-
- service.status_handle_ = RegisterServiceCtrlHandlerA(SVC_NAME, WinService::ctrlHandler);
- if(!service.status_handle_) {
- cLog.msg(Log::PRIO_ERROR) << "Error on RegisterServiceCtrlHandler: " << AnytunErrno(GetLastError());
- return;
- }
- service.status_.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
- service.status_.dwServiceSpecificExitCode = 0;
- service.reportStatus(SERVICE_START_PENDING, NO_ERROR);
-
- real_main(dwArgc, lpszArgv, service);
-
- service.reportStatus(SERVICE_STOPPED, NO_ERROR);
-}
-
-VOID WINAPI WinService::ctrlHandler(DWORD dwCtrl)
-{
- gSignalController.inject(dwCtrl);
-}
-
-int WinService::handleCtrlSignal(int sig, const std::string& msg)
-{
- switch(sig) {
- case SERVICE_CONTROL_STOP: {
- reportStatus(SERVICE_STOP_PENDING, NO_ERROR);
- cLog.msg(Log::PRIO_NOTICE) << "received service stop signal, exitting";
- return 1;
- }
- case SERVICE_CONTROL_INTERROGATE: break;
- default: break;
- }
- reportStatus(status_.dwCurrentState, NO_ERROR);
-
- return 0;
-}
-
-void WinService::reportStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode)
-{
- static DWORD dwCheckPoint = 1;
-
- status_.dwCurrentState = dwCurrentState;
- status_.dwWin32ExitCode = dwWin32ExitCode;
- status_.dwWaitHint = 0;
-
- if((dwCurrentState == SERVICE_START_PENDING) ||
- (dwCurrentState == SERVICE_STOP_PENDING))
- status_.dwControlsAccepted = 0;
- else
- status_.dwControlsAccepted = SERVICE_ACCEPT_STOP;
-
- if((dwCurrentState == SERVICE_RUNNING) ||
- (dwCurrentState == SERVICE_STOPPED))
- status_.dwCheckPoint = 0;
- else
- status_.dwCheckPoint = dwCheckPoint++;
-
- SetServiceStatus(status_handle_, &status_);
-}
-
-void WinService::initPrivs(std::string const& username, std::string const& groupname)
-{
-// nothing here
-}
-
-void WinService::dropPrivs()
-{
-// nothing here
-}
-
-void WinService::chroot(std::string const& dir)
-{
-// nothing here
-}
-
-void WinService::daemonize()
-{
-// nothing here
-}
-
-bool WinService::isDaemonized()
-{
- return true;
-}
-
-#endif
+/* + * anytun + * + * The secure anycast tunneling protocol (satp) defines a protocol used + * for communication between any combination of unicast and anycast + * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel + * mode and allows tunneling of every ETHER TYPE protocol (e.g. + * ethernet, ip, arp ...). satp directly includes cryptography and + * message authentication based on the methodes used by SRTP. It is + * intended to deliver a generic, scaleable and secure solution for + * tunneling and relaying of packets of any protocol. + * + * + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Christian Pointner <satp@wirdorange.org> + * + * This file is part of Anytun. + * + * Anytun is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * Anytun is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with anytun. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifdef WIN_SERVICE + +#include <iostream> + +#include <windows.h> + +#include "winService.h" +#include "../log.h" +#include "../anytunError.h" +#include "../threadUtils.hpp" + +void WinService::install() +{ + SC_HANDLE schSCManager; + SC_HANDLE schService; + char szPath[MAX_PATH]; + + if(!GetModuleFileNameA(NULL, szPath, MAX_PATH)) { + AnytunError::throwErr() << "Error on GetModuleFileName: " << AnytunErrno(GetLastError()); + } + + schSCManager = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS); + if(NULL == schSCManager) { + AnytunError::throwErr() << "Error on OpenSCManager: " << AnytunErrno(GetLastError()); + } + + schService = CreateServiceA(schSCManager, SVC_NAME, SVC_NAME, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, + SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, szPath, NULL, NULL, NULL, NULL, NULL); + if(schService == NULL) { + CloseServiceHandle(schSCManager); + AnytunError::throwErr() << "Error on CreateService: " << AnytunErrno(GetLastError()); + } + + std::cout << "Service installed successfully" << std::endl; + + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); +} + +void WinService::uninstall() +{ + SC_HANDLE schSCManager; + SC_HANDLE schService; + + schSCManager = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS); + if(NULL == schSCManager) { + AnytunError::throwErr() << "Error on OpenSCManager: " << AnytunErrno(GetLastError()); + } + + schService = OpenServiceA(schSCManager, SVC_NAME, SERVICE_ALL_ACCESS); + if(schService == NULL) { + CloseServiceHandle(schSCManager); + AnytunError::throwErr() << "Error on CreateService: " << AnytunErrno(GetLastError()); + } + + if(!DeleteService(schService)) { + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + AnytunError::throwErr() << "Error on DeleteService: " << AnytunErrno(GetLastError()); + } + + std::cout << "Service uninstalled successfully" << std::endl; + + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); +} + +void WinService::start() +{ + SERVICE_TABLE_ENTRY DispatchTable[] = { + {SVC_NAME, (LPSERVICE_MAIN_FUNCTION)WinService::main }, + {NULL, NULL} + }; + + if(!StartServiceCtrlDispatcherA(DispatchTable)) { + AnytunError::throwErr() << "Error on StartServiceCtrlDispatcher: " << AnytunErrno(GetLastError()); + } +} + +int real_main(int argc, char* argv[], WinService& service); + +VOID WINAPI WinService::main(DWORD dwArgc, LPTSTR* lpszArgv) +{ + WinService service; + + service.status_handle_ = RegisterServiceCtrlHandlerA(SVC_NAME, WinService::ctrlHandler); + if(!service.status_handle_) { + cLog.msg(Log::PRIO_ERROR) << "Error on RegisterServiceCtrlHandler: " << AnytunErrno(GetLastError()); + return; + } + service.status_.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + service.status_.dwServiceSpecificExitCode = 0; + service.reportStatus(SERVICE_START_PENDING, NO_ERROR); + + real_main(dwArgc, lpszArgv, service); + + service.reportStatus(SERVICE_STOPPED, NO_ERROR); +} + +VOID WINAPI WinService::ctrlHandler(DWORD dwCtrl) +{ + gSignalController.inject(dwCtrl); +} + +int WinService::handleCtrlSignal(int sig, const std::string& msg) +{ + switch(sig) { + case SERVICE_CONTROL_STOP: { + reportStatus(SERVICE_STOP_PENDING, NO_ERROR); + cLog.msg(Log::PRIO_NOTICE) << "received service stop signal, exitting"; + return 1; + } + case SERVICE_CONTROL_INTERROGATE: + break; + default: + break; + } + reportStatus(status_.dwCurrentState, NO_ERROR); + + return 0; +} + +void WinService::reportStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode) +{ + static DWORD dwCheckPoint = 1; + + status_.dwCurrentState = dwCurrentState; + status_.dwWin32ExitCode = dwWin32ExitCode; + status_.dwWaitHint = 0; + + if((dwCurrentState == SERVICE_START_PENDING) || + (dwCurrentState == SERVICE_STOP_PENDING)) { + status_.dwControlsAccepted = 0; + } else { + status_.dwControlsAccepted = SERVICE_ACCEPT_STOP; + } + + if((dwCurrentState == SERVICE_RUNNING) || + (dwCurrentState == SERVICE_STOPPED)) { + status_.dwCheckPoint = 0; + } else { + status_.dwCheckPoint = dwCheckPoint++; + } + + SetServiceStatus(status_handle_, &status_); +} + +void WinService::initPrivs(std::string const& username, std::string const& groupname) +{ + // nothing here +} + +void WinService::dropPrivs() +{ + // nothing here +} + +void WinService::chroot(std::string const& dir) +{ + // nothing here +} + +void WinService::daemonize() +{ + // nothing here +} + +bool WinService::isDaemonized() +{ + return true; +} + +#endif diff --git a/src/win32/winService.h b/src/win32/winService.h index 9c95400..91853fe 100644 --- a/src/win32/winService.h +++ b/src/win32/winService.h @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner <satp@wirdorange.org> * * This file is part of Anytun. @@ -41,12 +41,12 @@ class WinService { public: - #define SVC_NAME "anytun" +#define SVC_NAME "anytun" static void install(); static void uninstall(); static void start(); - static VOID WINAPI main(DWORD dwArgc, LPTSTR *lpszArgv); + static VOID WINAPI main(DWORD dwArgc, LPTSTR* lpszArgv); static VOID WINAPI ctrlHandler(DWORD dwCtrl); void reportStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode); @@ -61,8 +61,8 @@ public: private: WinService() {}; ~WinService() {}; - WinService(const WinService &w); - void operator=(const WinService &w); + WinService(const WinService& w); + void operator=(const WinService& w); SERVICE_STATUS status_; SERVICE_STATUS_HANDLE status_handle_; |