X-Git-Url: https://git.syn-net.org/debian/?a=blobdiff_plain;f=src%2Foptions.cpp;h=96828737178fc8ba8f65fb7df417ea55ef0c4d20;hb=ef0cacf2508418915d3f64b04003be3c13fed3cc;hp=b77ab41f20e1d254562335562b7a1da02afb0ebe;hpb=058ae090a970436caec3b3059e9e18b310dd6b0d;p=anytun.git diff --git a/src/options.cpp b/src/options.cpp index b77ab41..9682873 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -11,14 +11,15 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2008 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 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. + * 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 @@ -36,6 +37,8 @@ #include #include "datatypes.h" +#include "version.h" + #include "options.h" #include "log.h" #include "authAlgoFactory.h" @@ -45,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; @@ -54,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; } @@ -66,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 @@ -102,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 } @@ -121,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; } @@ -146,13 +158,14 @@ Options& Options::instance() { Lock lock(instMutex); static instanceCleaner c; - if(!inst) + if(!inst) { inst = new Options(); - + } + return *inst; } -Options::Options() : key_(u_int32_t(0)), salt_(u_int32_t(0)) +Options::Options() : key_(uint32_t(0)), salt_(uint32_t(0)) { #if defined(ANYCTR_OPTIONS) progname_ = "anytun-controld"; @@ -171,6 +184,8 @@ Options::Options() : key_(u_int32_t(0)), salt_(u_int32_t(0)) chroot_dir_ = ""; pid_file_ = ""; + debug_ = false; + file_name_ = ""; bind_to_.addr = "127.0.0.1"; bind_to_.port = "2323"; @@ -250,7 +265,7 @@ Options::~Options() if(argc < 1) \ throw syntax_error(str, str.length()); \ if(argv[i+1][0] == '-') { \ - u_int32_t pos = str.length() + 1; \ + uint32_t pos = str.length() + 1; \ throw syntax_error(str.append(" ").append(argv[i+1]), pos); \ } \ std::stringstream tmp; \ @@ -269,11 +284,11 @@ Options::~Options() if(argc < 2) \ throw syntax_error(str.append(" ").append(argv[i+1]), str.length()); \ if(argv[i+1][0] == '-') { \ - u_int32_t pos = str.length() + 1; \ + uint32_t pos = str.length() + 1; \ throw syntax_error(str.append(" ").append(argv[i+1]), pos); \ } \ if(argv[i+2][0] == '-') { \ - u_int32_t pos = str.length() + 1 + strlen(argv[i+1]) + 1; \ + uint32_t pos = str.length() + 1 + strlen(argv[i+1]) + 1; \ throw syntax_error(str.append(" ").append(argv[i+1]).append(" ").append(argv[i+2]), pos); \ } \ std::stringstream tmp; \ @@ -291,7 +306,7 @@ Options::~Options() if(argc < 1) \ throw syntax_error(str, str.length()); \ if(argv[i+1][0] == '-') { \ - u_int32_t pos = str.length() + 1; \ + uint32_t pos = str.length() + 1; \ throw syntax_error(str.append(" ").append(argv[i+1]), pos); \ } \ std::stringstream tmp(argv[i+1]); \ @@ -312,7 +327,7 @@ Options::~Options() if(argc < 1) \ throw syntax_error(str, str.length()); \ if(argv[i+1][0] == '-') { \ - u_int32_t pos = str.length() + 1; \ + uint32_t pos = str.length() + 1; \ throw syntax_error(str.append(" ").append(argv[i+1]), pos); \ } \ VALUE = Buffer(std::string(argv[i+1])); \ @@ -329,7 +344,7 @@ Options::~Options() if(argc < 1) \ throw syntax_error(str, str.length()); \ if(argv[i+1][0] == '-') { \ - u_int32_t pos = str.length() + 1; \ + uint32_t pos = str.length() + 1; \ throw syntax_error(str.append(" ").append(argv[i+1]), pos); \ } \ VALUE = argv[i+1]; \ @@ -346,7 +361,7 @@ Options::~Options() if(argc < 1) \ throw syntax_error(str, str.length()); \ if(argv[i+1][0] == '-') { \ - u_int32_t pos = str.length() + 1; \ + uint32_t pos = str.length() + 1; \ throw syntax_error(str.append(" ").append(argv[i+1]), pos); \ } \ LIST.push_back(argv[i+1]); \ @@ -363,27 +378,32 @@ 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") + if(str == "-h" || str == "--help") { + printUsage(); return false; + } else if(str == "-v" || str == "--version") { + printVersion(); + return false; + } #if defined(ANYTUN_OPTIONS) || defined(ANYCTR_OPTIONS) - #ifndef NO_DAEMON +#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 PARSE_STRING_LIST("-L","--log", log_targets_, NOTHING) + PARSE_BOOL_PARAM("-U","--debug", debug_, NOTHING) #if defined(ANYCTR_OPTIONS) @@ -416,57 +436,81 @@ bool Options::parse(int argc, char* argv[]) PARSE_SCALAR_PARAM("-d","--dev", dev_name_, NOTHING) PARSE_SCALAR_PARAM("-t","--type", dev_type_, NOTHING) PARSE_SCALAR_PARAM("-n","--ifconfig", ifconfig_param_, NOTHING) - #ifndef NO_EXEC PARSE_SCALAR_PARAM("-x","--post-up-script", post_up_script_, NOTHING) - #endif #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; + } + + if(log_targets_.empty()) { +#ifndef _MSC_VER +#if !defined(ANYCONF_OPTIONS) + log_targets_.push_back(std::string("syslog:3,").append(progname_).append(",daemon")); +#else + log_targets_.push_back("stderr:2"); +#endif +#else +#ifdef WIN_SERVICE + log_targets_.push_back(std::string("eventlog:3,").append(progname_)); +#else + log_targets_.push_back("stdout:3"); +#endif +#endif } return true; @@ -475,24 +519,41 @@ 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; + uint32_t tag_len_max = AuthAlgoFactory::getDigestLength(auth_algo_); + 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() +{ +#if defined(ANYCTR_OPTIONS) + std::cout << "anytun-controld"; +#elif defined(ANYCONF_OPTIONS) + std::cout << "anytun-config"; +#else + std::cout << "anytun"; +#endif + std::cout << VERSION_STRING_0 << std::endl; + std::cout << VERSION_STRING_1 << std::endl; } void Options::printUsage() @@ -508,21 +569,24 @@ void Options::printUsage() #endif std::cout << " [-h|--help] prints this..." << std::endl; + std::cout << " [-v|--version] print version info and exit" << std::endl; #if defined(ANYTUN_OPTIONS) || defined(ANYCTR_OPTIONS) - #ifndef NO_DAEMON +#ifndef _MSC_VER std::cout << " [-D|--nodaemonize] don't run in background" << std::endl; std::cout << " [-u|--username] change to this user" << std::endl; std::cout << " [-g|--groupname] change to this group" << std::endl; std::cout << " [-C|--chroot] chroot to this directory" << std::endl; std::cout << " [-P|--write-pid] write pid to this file" << std::endl; - #endif +#endif #endif std::cout << " [-L|--log] :[,[,..]]" << std::endl; std::cout << " add a log target, can be invoked several times" << std::endl; + std::cout << " i.e.: stdout:5" << std::endl; + std::cout << " [-U|--debug] don't daemonize and log to stdout with maximum log level" << std::endl; #if defined(ANYCTR_OPTIONS) @@ -558,38 +622,36 @@ void Options::printUsage() std::cout << " [-d|--dev] device name" << std::endl; std::cout << " [-t|--type] device type" << std::endl; std::cout << " [-n|--ifconfig] / the local address for the tun/tap device and the used prefix length" << std::endl; - #ifndef NO_EXEC std::cout << " [-x|--post-up-script]