summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/anytunError.hpp57
-rw-r--r--src/linux/tunDevice.cpp14
-rw-r--r--src/log.h2
-rw-r--r--src/signalController.cpp28
-rw-r--r--src/signalController.h4
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;
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 <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;