From aee185758d5a494dd5a5b6349d1a82febb30dca0 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sun, 22 Feb 2009 06:38:56 +0000 Subject: fixed signalController on unix added anytunError --- src/anytunError.hpp | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ src/linux/tunDevice.cpp | 14 +++++------- src/log.h | 2 +- src/signalController.cpp | 28 ++++++++++++------------ src/signalController.h | 4 ++-- 5 files changed, 79 insertions(+), 26 deletions(-) create mode 100644 src/anytunError.hpp 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 + * + * 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 . + */ + +#ifndef _ANYTUN_ERROR_HPP +#define _ANYTUN_ERROR_HPP + +#include + +class ErrorStringBuilder +{ +public: + ErrorStringBuilder(ErrorStringBuilder const& src) { stream << src.stream.str(); }; + ErrorStringBuilder() {}; + ~ErrorStringBuilder() { throw std::runtime_error(stream.str()); }; + + template + 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; diff --git a/src/log.h b/src/log.h index 6550b10..56ca5ae 100644 --- a/src/log.h +++ b/src/log.h @@ -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 #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 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; -- cgit v1.2.3