diff options
-rw-r--r-- | src/anytunError.hpp | 57 | ||||
-rw-r--r-- | src/linux/tunDevice.cpp | 14 | ||||
-rw-r--r-- | src/log.h | 2 | ||||
-rw-r--r-- | src/signalController.cpp | 28 | ||||
-rw-r--r-- | src/signalController.h | 4 |
5 files changed, 79 insertions, 26 deletions
diff --git a/src/anytunError.hpp b/src/anytunError.hpp new file mode 100644 index 0000000..9a84277 --- /dev/null +++ b/src/anytunError.hpp @@ -0,0 +1,57 @@ +/* + * 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-2008 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 version 3 as + * published by the Free Software Foundation. + * + * 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/>. + */ + +#ifndef _ANYTUN_ERROR_HPP +#define _ANYTUN_ERROR_HPP + +#include <sstream> + +class ErrorStringBuilder +{ +public: + ErrorStringBuilder(ErrorStringBuilder const& src) { stream << src.stream.str(); }; + ErrorStringBuilder() {}; + ~ErrorStringBuilder() { throw std::runtime_error(stream.str()); }; + + template<class T> + std::ostream& operator<<(T const& value) { return stream << value; } + +private: + std::stringstream stream; +}; + +class AnytunError +{ +public: + static ErrorStringBuilder throwErr() { return ErrorStringBuilder(); } +}; + +#endif diff --git a/src/linux/tunDevice.cpp b/src/linux/tunDevice.cpp index 8ab7ff8..7c7e8ff 100644 --- a/src/linux/tunDevice.cpp +++ b/src/linux/tunDevice.cpp @@ -45,6 +45,7 @@ #include "tunDevice.h" #include "threadUtils.hpp" #include "log.h" +#include "anytunError.hpp" 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) { @@ -60,17 +61,14 @@ TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifc with_pi_ = false; } else - throw std::runtime_error("unable to recognize type of device (tun or tap)"); + AnytunError::throwErr() << "unable to recognize type of device (tun or tap)"; if(dev_name != "") strncpy(ifr.ifr_name, dev_name.c_str(), IFNAMSIZ); fd_ = ::open(DEFAULT_DEVICE, O_RDWR); - if(fd_ < 0) { - std::stringstream msg; - msg << "can't open device file (" << DEFAULT_DEVICE << "): " << LogErrno(errno); - throw std::runtime_error(msg.str()); - } + if(fd_ < 0) + AnytunError::throwErr() << "can't open device file (" << DEFAULT_DEVICE << "): " << LogErrno(errno); if(!ioctl(fd_, TUNSETIFF, &ifr)) { actual_name_ = ifr.ifr_name; @@ -78,9 +76,7 @@ TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifc actual_name_ = ifr.ifr_name; } else { ::close(fd_); - std::stringstream msg; - msg << "tun/tap device ioctl failed: " << LogErrno(errno); - throw std::runtime_error(msg.str()); + AnytunError::throwErr() << "tun/tap device ioctl failed: " << LogErrno(errno); } actual_node_ = DEFAULT_DEVICE; @@ -85,7 +85,7 @@ private: std::stringstream stream; }; -class Log : public std::ostringstream +class Log { public: #ifdef LOG_SYSLOG diff --git a/src/signalController.cpp b/src/signalController.cpp index 4868d55..4e5f8b6 100644 --- a/src/signalController.cpp +++ b/src/signalController.cpp @@ -45,19 +45,19 @@ #include <windows.h> #endif -SignalController* SignalController::inst = NULL;
-Mutex SignalController::instMutex;
-SignalController& gSignalController = SignalController::instance();
-
-SignalController& SignalController::instance()
-{
- Lock lock(instMutex);
- static instanceCleaner c;
- if(!inst)
- inst = new SignalController();
-
- return *inst;
-}
+SignalController* SignalController::inst = NULL; +Mutex SignalController::instMutex; +SignalController& gSignalController = SignalController::instance(); + +SignalController& SignalController::instance() +{ + Lock lock(instMutex); + static instanceCleaner c; + if(!inst) + inst = new SignalController(); + + return *inst; +} #ifndef _MSC_VER @@ -240,4 +240,4 @@ int SignalController::run() return 0; } -#endif
\ No newline at end of file +#endif diff --git a/src/signalController.h b/src/signalController.h index c893e15..6b8a92a 100644 --- a/src/signalController.h +++ b/src/signalController.h @@ -156,7 +156,7 @@ private: typedef std::map<int, SignalHandler*> HandlerMap; #ifndef _MSC_VER - SignalController() : thread(null) {}; + SignalController() : thread(NULL) {}; #else SignalController() {}; #endif @@ -178,7 +178,7 @@ private: Mutex sigQueueMutex; Semaphore sigQueueSem; -#ifdef _MSC_VER +#ifndef _MSC_VER boost::thread* thread; #endif HandlerMap handler; |