Imported Upstream version 0.3.4
[anytun.git] / src / options.cpp
index b77ab41..9682873 100644 (file)
  *  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 <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.
+ *  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 <sstream>
 
 #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] <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
 
   std::cout << "   [-L|--log] <target>:<level>[,<param1>[,<param2>..]]" << 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] <name>                   device name" << std::endl;
   std::cout << "   [-t|--type] <tun|tap>               device type" << std::endl;
   std::cout << "   [-n|--ifconfig] <local>/<prefix>    the local address for the tun/tap device and the used prefix length" << std::endl;
- #ifndef NO_EXEC
   std::cout << "   [-x|--post-up-script] <script>      script gets called after interface is created" << std::endl;
- #endif
 
 #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
 }
@@ -608,19 +670,30 @@ 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::endl;
+  }
+  std::cout << std::endl;
+  std::cout << "debug = " << debug_ << std::endl;
+  std::cout << std::endl;
   std::cout << "file_name = '" << file_name_ << "'" << std::endl;
   std::cout << "bind_to.addr = '" << bind_to_.addr << "'" << std::endl;
   std::cout << "bind_to.port = '" << bind_to_.port << "'" << std::endl;
   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;
@@ -631,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;
@@ -640,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;
@@ -653,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;
@@ -743,13 +824,24 @@ Options& Options::setPidFile(std::string p)
 }
 
 
-
 StringList Options::getLogTargets()
 {
   ReadersLock lock(mutex);
   return log_targets_;
 }
 
+bool Options::getDebug()
+{
+  ReadersLock lock(mutex);
+  return debug_;
+}
+
+Options& Options::setDebug(bool d)
+{
+  WritersLock lock(mutex);
+  debug_ = d;
+  return *this;
+}
 
 
 std::string Options::getFileName()
@@ -781,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)
@@ -1018,13 +1110,13 @@ Options& Options::setAuthAlgo(std::string a)
   return *this;
 }
 
-u_int32_t Options::getAuthTagLength()
+uint32_t Options::getAuthTagLength()
 {
   ReadersLock lock(mutex);
   return auth_tag_length_;
 }
 
-Options& Options::setAuthTagLength(u_int32_t a)
+Options& Options::setAuthTagLength(uint32_t a)
 {
   WritersLock lock(mutex);
   auth_tag_length_ = a;