config.c
上传用户:awang829
上传日期:2019-07-14
资源大小:2356k
文件大小:184k
源码类别:

网络

开发平台:

Unix_Linux

  1. /** Allocate and return a new string holding the written-out values of the vars
  2.  * in 'options'.  If 'minimal', do not write out any default-valued vars.
  3.  * Else, if comment_defaults, write default values as comments.
  4.  */
  5. static char *
  6. config_dump(config_format_t *fmt, void *options, int minimal,
  7.             int comment_defaults)
  8. {
  9.   smartlist_t *elements;
  10.   or_options_t *defaults;
  11.   config_line_t *line, *assigned;
  12.   char *result;
  13.   int i;
  14.   const char *desc;
  15.   char *msg = NULL;
  16.   defaults = config_alloc(fmt);
  17.   config_init(fmt, defaults);
  18.   /* XXX use a 1 here so we don't add a new log line while dumping */
  19.   if (fmt->validate_fn(NULL,defaults, 1, &msg) < 0) {
  20.     log_err(LD_BUG, "Failed to validate default config.");
  21.     tor_free(msg);
  22.     tor_assert(0);
  23.   }
  24.   elements = smartlist_create();
  25.   for (i=0; fmt->vars[i].name; ++i) {
  26.     int comment_option = 0;
  27.     if (fmt->vars[i].type == CONFIG_TYPE_OBSOLETE ||
  28.         fmt->vars[i].type == CONFIG_TYPE_LINELIST_S)
  29.       continue;
  30.     /* Don't save 'hidden' control variables. */
  31.     if (!strcmpstart(fmt->vars[i].name, "__"))
  32.       continue;
  33.     if (minimal && option_is_same(fmt, options, defaults, fmt->vars[i].name))
  34.       continue;
  35.     else if (comment_defaults &&
  36.              option_is_same(fmt, options, defaults, fmt->vars[i].name))
  37.       comment_option = 1;
  38.     desc = config_find_description(fmt, fmt->vars[i].name);
  39.     line = assigned = get_assigned_option(fmt, options, fmt->vars[i].name, 1);
  40.     if (line && desc) {
  41.       /* Only dump the description if there's something to describe. */
  42.       wrap_string(elements, desc, 78, "# ", "# ");
  43.     }
  44.     for (; line; line = line->next) {
  45.       size_t len = strlen(line->key) + strlen(line->value) + 5;
  46.       char *tmp;
  47.       tmp = tor_malloc(len);
  48.       if (tor_snprintf(tmp, len, "%s%s %sn",
  49.                        comment_option ? "# " : "",
  50.                        line->key, line->value)<0) {
  51.         log_err(LD_BUG,"Internal error writing option value");
  52.         tor_assert(0);
  53.       }
  54.       smartlist_add(elements, tmp);
  55.     }
  56.     config_free_lines(assigned);
  57.   }
  58.   if (fmt->extra) {
  59.     line = *(config_line_t**)STRUCT_VAR_P(options, fmt->extra->var_offset);
  60.     for (; line; line = line->next) {
  61.       size_t len = strlen(line->key) + strlen(line->value) + 3;
  62.       char *tmp;
  63.       tmp = tor_malloc(len);
  64.       if (tor_snprintf(tmp, len, "%s %sn", line->key, line->value)<0) {
  65.         log_err(LD_BUG,"Internal error writing option value");
  66.         tor_assert(0);
  67.       }
  68.       smartlist_add(elements, tmp);
  69.     }
  70.   }
  71.   result = smartlist_join_strings(elements, "", 0, NULL);
  72.   SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp));
  73.   smartlist_free(elements);
  74.   config_free(fmt, defaults);
  75.   return result;
  76. }
  77. /** Return a string containing a possible configuration file that would give
  78.  * the configuration in <b>options</b>.  If <b>minimal</b> is true, do not
  79.  * include options that are the same as Tor's defaults.
  80.  */
  81. static char *
  82. options_dump(or_options_t *options, int minimal)
  83. {
  84.   return config_dump(&options_format, options, minimal, 0);
  85. }
  86. /** Return 0 if every element of sl is a string holding a decimal
  87.  * representation of a port number, or if sl is NULL.
  88.  * Otherwise set *msg and return -1. */
  89. static int
  90. validate_ports_csv(smartlist_t *sl, const char *name, char **msg)
  91. {
  92.   int i;
  93.   char buf[1024];
  94.   tor_assert(name);
  95.   if (!sl)
  96.     return 0;
  97.   SMARTLIST_FOREACH(sl, const char *, cp,
  98.   {
  99.     i = atoi(cp);
  100.     if (i < 1 || i > 65535) {
  101.       int r = tor_snprintf(buf, sizeof(buf),
  102.                            "Port '%s' out of range in %s", cp, name);
  103.       *msg = tor_strdup(r >= 0 ? buf : "internal error");
  104.       return -1;
  105.     }
  106.   });
  107.   return 0;
  108. }
  109. /** If <b>value</b> exceeds ROUTER_MAX_DECLARED_BANDWIDTH, write
  110.  * a complaint into *<b>msg</b> using string <b>desc</b>, and return -1.
  111.  * Else return 0.
  112.  */
  113. static int
  114. ensure_bandwidth_cap(uint64_t *value, const char *desc, char **msg)
  115. {
  116.   int r;
  117.   char buf[1024];
  118.   if (*value > ROUTER_MAX_DECLARED_BANDWIDTH) {
  119.     /* This handles an understandable special case where somebody says "2gb"
  120.      * whereas our actual maximum is 2gb-1 (INT_MAX) */
  121.     --*value;
  122.   }
  123.   if (*value > ROUTER_MAX_DECLARED_BANDWIDTH) {
  124.     r = tor_snprintf(buf, sizeof(buf), "%s ("U64_FORMAT") must be at most %d",
  125.                      desc, U64_PRINTF_ARG(*value),
  126.                      ROUTER_MAX_DECLARED_BANDWIDTH);
  127.     *msg = tor_strdup(r >= 0 ? buf : "internal error");
  128.     return -1;
  129.   }
  130.   return 0;
  131. }
  132. /** Parse an authority type from <b>options</b>->PublishServerDescriptor
  133.  * and write it to <b>options</b>->_PublishServerDescriptor. Treat "1"
  134.  * as "v2,v3" unless BridgeRelay is 1, in which case treat it as "bridge".
  135.  * Treat "0" as "".
  136.  * Return 0 on success or -1 if not a recognized authority type (in which
  137.  * case the value of _PublishServerDescriptor is undefined). */
  138. static int
  139. compute_publishserverdescriptor(or_options_t *options)
  140. {
  141.   smartlist_t *list = options->PublishServerDescriptor;
  142.   authority_type_t *auth = &options->_PublishServerDescriptor;
  143.   *auth = NO_AUTHORITY;
  144.   if (!list) /* empty list, answer is none */
  145.     return 0;
  146.   SMARTLIST_FOREACH(list, const char *, string, {
  147.     if (!strcasecmp(string, "v1"))
  148.       *auth |= V1_AUTHORITY;
  149.     else if (!strcmp(string, "1"))
  150.       if (options->BridgeRelay)
  151.         *auth |= BRIDGE_AUTHORITY;
  152.       else
  153.         *auth |= V2_AUTHORITY | V3_AUTHORITY;
  154.     else if (!strcasecmp(string, "v2"))
  155.       *auth |= V2_AUTHORITY;
  156.     else if (!strcasecmp(string, "v3"))
  157.       *auth |= V3_AUTHORITY;
  158.     else if (!strcasecmp(string, "bridge"))
  159.       *auth |= BRIDGE_AUTHORITY;
  160.     else if (!strcasecmp(string, "hidserv"))
  161.       *auth |= HIDSERV_AUTHORITY;
  162.     else if (!strcasecmp(string, "") || !strcmp(string, "0"))
  163.       /* no authority */;
  164.     else
  165.       return -1;
  166.     });
  167.   return 0;
  168. }
  169. /** Lowest allowable value for RendPostPeriod; if this is too low, hidden
  170.  * services can overload the directory system. */
  171. #define MIN_REND_POST_PERIOD (10*60)
  172. /** Highest allowable value for RendPostPeriod. */
  173. #define MAX_DIR_PERIOD (MIN_ONION_KEY_LIFETIME/2)
  174. /** Lowest allowable value for CircuitBuildTimeout; values too low will
  175.  * increase network load because of failing connections being retried, and
  176.  * might prevent users from connecting to the network at all. */
  177. #define MIN_CIRCUIT_BUILD_TIMEOUT 30
  178. /** Lowest allowable value for MaxCircuitDirtiness; if this is too low, Tor
  179.  * will generate too many circuits and potentially overload the network. */
  180. #define MIN_MAX_CIRCUIT_DIRTINESS 10
  181. /** Return 0 if every setting in <b>options</b> is reasonable, and a
  182.  * permissible transition from <b>old_options</b>. Else return -1.
  183.  * Should have no side effects, except for normalizing the contents of
  184.  * <b>options</b>.
  185.  *
  186.  * On error, tor_strdup an error explanation into *<b>msg</b>.
  187.  *
  188.  * XXX
  189.  * If <b>from_setconf</b>, we were called by the controller, and our
  190.  * Log line should stay empty. If it's 0, then give us a default log
  191.  * if there are no logs defined.
  192.  */
  193. static int
  194. options_validate(or_options_t *old_options, or_options_t *options,
  195.                  int from_setconf, char **msg)
  196. {
  197.   int i, r;
  198.   config_line_t *cl;
  199.   const char *uname = get_uname();
  200.   char buf[1024];
  201. #define REJECT(arg) 
  202.   STMT_BEGIN *msg = tor_strdup(arg); return -1; STMT_END
  203. #define COMPLAIN(arg) STMT_BEGIN log(LOG_WARN, LD_CONFIG, arg); STMT_END
  204.   tor_assert(msg);
  205.   *msg = NULL;
  206.   if (options->ORPort < 0 || options->ORPort > 65535)
  207.     REJECT("ORPort option out of bounds.");
  208.   if (server_mode(options) &&
  209.       (!strcmpstart(uname, "Windows 95") ||
  210.        !strcmpstart(uname, "Windows 98") ||
  211.        !strcmpstart(uname, "Windows Me"))) {
  212.     log(LOG_WARN, LD_CONFIG, "Tor is running as a server, but you are "
  213.         "running %s; this probably won't work. See "
  214.         "http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#ServerOS "
  215.         "for details.", uname);
  216.   }
  217.   if (options->ORPort == 0 && options->ORListenAddress != NULL)
  218.     REJECT("ORPort must be defined if ORListenAddress is defined.");
  219.   if (options->DirPort == 0 && options->DirListenAddress != NULL)
  220.     REJECT("DirPort must be defined if DirListenAddress is defined.");
  221.   if (options->DNSPort == 0 && options->DNSListenAddress != NULL)
  222.     REJECT("DNSPort must be defined if DNSListenAddress is defined.");
  223.   if (options->ControlPort == 0 && options->ControlListenAddress != NULL)
  224.     REJECT("ControlPort must be defined if ControlListenAddress is defined.");
  225.   if (options->TransPort == 0 && options->TransListenAddress != NULL)
  226.     REJECT("TransPort must be defined if TransListenAddress is defined.");
  227.   if (options->NatdPort == 0 && options->NatdListenAddress != NULL)
  228.     REJECT("NatdPort must be defined if NatdListenAddress is defined.");
  229.   /* Don't gripe about SocksPort 0 with SocksListenAddress set; a standard
  230.    * configuration does this. */
  231.   for (i = 0; i < 3; ++i) {
  232.     int is_socks = i==0;
  233.     int is_trans = i==1;
  234.     config_line_t *line, *opt, *old;
  235.     const char *tp;
  236.     if (is_socks) {
  237.       opt = options->SocksListenAddress;
  238.       old = old_options ? old_options->SocksListenAddress : NULL;
  239.       tp = "SOCKS proxy";
  240.     } else if (is_trans) {
  241.       opt = options->TransListenAddress;
  242.       old = old_options ? old_options->TransListenAddress : NULL;
  243.       tp = "transparent proxy";
  244.     } else {
  245.       opt = options->NatdListenAddress;
  246.       old = old_options ? old_options->NatdListenAddress : NULL;
  247.       tp = "natd proxy";
  248.     }
  249.     for (line = opt; line; line = line->next) {
  250.       char *address = NULL;
  251.       uint16_t port;
  252.       uint32_t addr;
  253.       if (parse_addr_port(LOG_WARN, line->value, &address, &addr, &port)<0)
  254.         continue; /* We'll warn about this later. */
  255.       if (!is_internal_IP(addr, 1) &&
  256.           (!old_options || !config_lines_eq(old, opt))) {
  257.         log_warn(LD_CONFIG,
  258.              "You specified a public address '%s' for a %s. Other "
  259.              "people on the Internet might find your computer and use it as "
  260.              "an open %s. Please don't allow this unless you have "
  261.              "a good reason.", address, tp, tp);
  262.       }
  263.       tor_free(address);
  264.     }
  265.   }
  266.   if (validate_data_directory(options)<0)
  267.     REJECT("Invalid DataDirectory");
  268.   if (options->Nickname == NULL) {
  269.     if (server_mode(options)) {
  270.       if (!(options->Nickname = get_default_nickname())) {
  271.         log_notice(LD_CONFIG, "Couldn't pick a nickname based on "
  272.                    "our hostname; using %s instead.", UNNAMED_ROUTER_NICKNAME);
  273.         options->Nickname = tor_strdup(UNNAMED_ROUTER_NICKNAME);
  274.       } else {
  275.         log_notice(LD_CONFIG, "Choosing default nickname '%s'",
  276.                    options->Nickname);
  277.       }
  278.     }
  279.   } else {
  280.     if (!is_legal_nickname(options->Nickname)) {
  281.       r = tor_snprintf(buf, sizeof(buf),
  282.           "Nickname '%s' is wrong length or contains illegal characters.",
  283.           options->Nickname);
  284.       *msg = tor_strdup(r >= 0 ? buf : "internal error");
  285.       return -1;
  286.     }
  287.   }
  288.   if (server_mode(options) && !options->ContactInfo)
  289.     log(LOG_NOTICE, LD_CONFIG, "Your ContactInfo config option is not set. "
  290.         "Please consider setting it, so we can contact you if your server is "
  291.         "misconfigured or something else goes wrong.");
  292.   /* Special case on first boot if no Log options are given. */
  293.   if (!options->Logs && !options->RunAsDaemon && !from_setconf)
  294.     config_line_append(&options->Logs, "Log", "notice stdout");
  295.   if (options_init_logs(options, 1)<0) /* Validate the log(s) */
  296.     REJECT("Failed to validate Log options. See logs for details.");
  297.   if (options->NoPublish) {
  298.     log(LOG_WARN, LD_CONFIG,
  299.         "NoPublish is obsolete. Use PublishServerDescriptor instead.");
  300.     SMARTLIST_FOREACH(options->PublishServerDescriptor, char *, s,
  301.                       tor_free(s));
  302.     smartlist_clear(options->PublishServerDescriptor);
  303.   }
  304.   if (authdir_mode(options)) {
  305.     /* confirm that our address isn't broken, so we can complain now */
  306.     uint32_t tmp;
  307.     if (resolve_my_address(LOG_WARN, options, &tmp, NULL) < 0)
  308.       REJECT("Failed to resolve/guess local address. See logs for details.");
  309.   }
  310. #ifndef MS_WINDOWS
  311.   if (options->RunAsDaemon && torrc_fname && path_is_relative(torrc_fname))
  312.     REJECT("Can't use a relative path to torrc when RunAsDaemon is set.");
  313. #endif
  314.   if (options->SocksPort < 0 || options->SocksPort > 65535)
  315.     REJECT("SocksPort option out of bounds.");
  316.   if (options->DNSPort < 0 || options->DNSPort > 65535)
  317.     REJECT("DNSPort option out of bounds.");
  318.   if (options->TransPort < 0 || options->TransPort > 65535)
  319.     REJECT("TransPort option out of bounds.");
  320.   if (options->NatdPort < 0 || options->NatdPort > 65535)
  321.     REJECT("NatdPort option out of bounds.");
  322.   if (options->SocksPort == 0 && options->TransPort == 0 &&
  323.       options->NatdPort == 0 && options->ORPort == 0 &&
  324.       options->DNSPort == 0 && !options->RendConfigLines)
  325.     log(LOG_WARN, LD_CONFIG,
  326.         "SocksPort, TransPort, NatdPort, DNSPort, and ORPort are all "
  327.         "undefined, and there aren't any hidden services configured.  "
  328.         "Tor will still run, but probably won't do anything.");
  329.   if (options->ControlPort < 0 || options->ControlPort > 65535)
  330.     REJECT("ControlPort option out of bounds.");
  331.   if (options->DirPort < 0 || options->DirPort > 65535)
  332.     REJECT("DirPort option out of bounds.");
  333. #ifndef USE_TRANSPARENT
  334.   if (options->TransPort || options->TransListenAddress)
  335.     REJECT("TransPort and TransListenAddress are disabled in this build.");
  336. #endif
  337.   if (options->AccountingMax &&
  338.       (is_listening_on_low_port(options->ORPort, options->ORListenAddress) ||
  339.        is_listening_on_low_port(options->DirPort, options->DirListenAddress)))
  340.   {
  341.     log(LOG_WARN, LD_CONFIG,
  342.           "You have set AccountingMax to use hibernation. You have also "
  343.           "chosen a low DirPort or OrPort. This combination can make Tor stop "
  344.           "working when it tries to re-attach the port after a period of "
  345.           "hibernation. Please choose a different port or turn off "
  346.           "hibernation unless you know this combination will work on your "
  347.           "platform.");
  348.   }
  349.   if (options->ExcludeExitNodes || options->ExcludeNodes) {
  350.     options->_ExcludeExitNodesUnion = routerset_new();
  351.     routerset_union(options->_ExcludeExitNodesUnion,options->ExcludeExitNodes);
  352.     routerset_union(options->_ExcludeExitNodesUnion,options->ExcludeNodes);
  353.   }
  354.   if (options->StrictExitNodes &&
  355.       (!options->ExitNodes) &&
  356.       (!old_options ||
  357.        (old_options->StrictExitNodes != options->StrictExitNodes) ||
  358.        (!routerset_equal(old_options->ExitNodes,options->ExitNodes))))
  359.     COMPLAIN("StrictExitNodes set, but no ExitNodes listed.");
  360.   if (options->StrictEntryNodes &&
  361.       (!options->EntryNodes) &&
  362.       (!old_options ||
  363.        (old_options->StrictEntryNodes != options->StrictEntryNodes) ||
  364.        (!routerset_equal(old_options->EntryNodes,options->EntryNodes))))
  365.     COMPLAIN("StrictEntryNodes set, but no EntryNodes listed.");
  366.   if (options->EntryNodes && !routerset_is_list(options->EntryNodes)) {
  367.     /* XXXX fix this; see entry_guards_prepend_from_config(). */
  368.     REJECT("IPs or countries are not yet supported in EntryNodes.");
  369.   }
  370.   if (options->AuthoritativeDir) {
  371.     if (!options->ContactInfo && !options->TestingTorNetwork)
  372.       REJECT("Authoritative directory servers must set ContactInfo");
  373.     if (options->V1AuthoritativeDir && !options->RecommendedVersions)
  374.       REJECT("V1 authoritative dir servers must set RecommendedVersions.");
  375.     if (!options->RecommendedClientVersions)
  376.       options->RecommendedClientVersions =
  377.         config_lines_dup(options->RecommendedVersions);
  378.     if (!options->RecommendedServerVersions)
  379.       options->RecommendedServerVersions =
  380.         config_lines_dup(options->RecommendedVersions);
  381.     if (options->VersioningAuthoritativeDir &&
  382.         (!options->RecommendedClientVersions ||
  383.          !options->RecommendedServerVersions))
  384.       REJECT("Versioning authoritative dir servers must set "
  385.              "Recommended*Versions.");
  386.     if (options->UseEntryGuards) {
  387.       log_info(LD_CONFIG, "Authoritative directory servers can't set "
  388.                "UseEntryGuards. Disabling.");
  389.       options->UseEntryGuards = 0;
  390.     }
  391.     if (!options->DownloadExtraInfo && authdir_mode_any_main(options)) {
  392.       log_info(LD_CONFIG, "Authoritative directories always try to download "
  393.                "extra-info documents. Setting DownloadExtraInfo.");
  394.       options->DownloadExtraInfo = 1;
  395.     }
  396.     if (!(options->BridgeAuthoritativeDir || options->HSAuthoritativeDir ||
  397.           options->V1AuthoritativeDir || options->V2AuthoritativeDir ||
  398.           options->V3AuthoritativeDir))
  399.       REJECT("AuthoritativeDir is set, but none of "
  400.              "(Bridge/HS/V1/V2/V3)AuthoritativeDir is set.");
  401.   }
  402.   if (options->AuthoritativeDir && !options->DirPort)
  403.     REJECT("Running as authoritative directory, but no DirPort set.");
  404.   if (options->AuthoritativeDir && !options->ORPort)
  405.     REJECT("Running as authoritative directory, but no ORPort set.");
  406.   if (options->AuthoritativeDir && options->ClientOnly)
  407.     REJECT("Running as authoritative directory, but ClientOnly also set.");
  408.   if (options->HSAuthorityRecordStats && !options->HSAuthoritativeDir)
  409.     REJECT("HSAuthorityRecordStats is set but we're not running as "
  410.            "a hidden service authority.");
  411.   if (options->ConnLimit <= 0) {
  412.     r = tor_snprintf(buf, sizeof(buf),
  413.         "ConnLimit must be greater than 0, but was set to %d",
  414.         options->ConnLimit);
  415.     *msg = tor_strdup(r >= 0 ? buf : "internal error");
  416.     return -1;
  417.   }
  418.   if (validate_ports_csv(options->FirewallPorts, "FirewallPorts", msg) < 0)
  419.     return -1;
  420.   if (validate_ports_csv(options->LongLivedPorts, "LongLivedPorts", msg) < 0)
  421.     return -1;
  422.   if (validate_ports_csv(options->RejectPlaintextPorts,
  423.                          "RejectPlaintextPorts", msg) < 0)
  424.     return -1;
  425.   if (validate_ports_csv(options->WarnPlaintextPorts,
  426.                          "WarnPlaintextPorts", msg) < 0)
  427.     return -1;
  428.   if (options->FascistFirewall && !options->ReachableAddresses) {
  429.     if (options->FirewallPorts && smartlist_len(options->FirewallPorts)) {
  430.       /* We already have firewall ports set, so migrate them to
  431.        * ReachableAddresses, which will set ReachableORAddresses and
  432.        * ReachableDirAddresses if they aren't set explicitly. */
  433.       smartlist_t *instead = smartlist_create();
  434.       config_line_t *new_line = tor_malloc_zero(sizeof(config_line_t));
  435.       new_line->key = tor_strdup("ReachableAddresses");
  436.       /* If we're configured with the old format, we need to prepend some
  437.        * open ports. */
  438.       SMARTLIST_FOREACH(options->FirewallPorts, const char *, portno,
  439.       {
  440.         int p = atoi(portno);
  441.         char *s;
  442.         if (p<0) continue;
  443.         s = tor_malloc(16);
  444.         tor_snprintf(s, 16, "*:%d", p);
  445.         smartlist_add(instead, s);
  446.       });
  447.       new_line->value = smartlist_join_strings(instead,",",0,NULL);
  448.       /* These have been deprecated since 0.1.1.5-alpha-cvs */
  449.       log(LOG_NOTICE, LD_CONFIG,
  450.           "Converting FascistFirewall and FirewallPorts "
  451.           "config options to new format: "ReachableAddresses %s"",
  452.           new_line->value);
  453.       options->ReachableAddresses = new_line;
  454.       SMARTLIST_FOREACH(instead, char *, cp, tor_free(cp));
  455.       smartlist_free(instead);
  456.     } else {
  457.       /* We do not have FirewallPorts set, so add 80 to
  458.        * ReachableDirAddresses, and 443 to ReachableORAddresses. */
  459.       if (!options->ReachableDirAddresses) {
  460.         config_line_t *new_line = tor_malloc_zero(sizeof(config_line_t));
  461.         new_line->key = tor_strdup("ReachableDirAddresses");
  462.         new_line->value = tor_strdup("*:80");
  463.         options->ReachableDirAddresses = new_line;
  464.         log(LOG_NOTICE, LD_CONFIG, "Converting FascistFirewall config option "
  465.             "to new format: "ReachableDirAddresses *:80"");
  466.       }
  467.       if (!options->ReachableORAddresses) {
  468.         config_line_t *new_line = tor_malloc_zero(sizeof(config_line_t));
  469.         new_line->key = tor_strdup("ReachableORAddresses");
  470.         new_line->value = tor_strdup("*:443");
  471.         options->ReachableORAddresses = new_line;
  472.         log(LOG_NOTICE, LD_CONFIG, "Converting FascistFirewall config option "
  473.             "to new format: "ReachableORAddresses *:443"");
  474.       }
  475.     }
  476.   }
  477.   for (i=0; i<3; i++) {
  478.     config_line_t **linep =
  479.       (i==0) ? &options->ReachableAddresses :
  480.         (i==1) ? &options->ReachableORAddresses :
  481.                  &options->ReachableDirAddresses;
  482.     if (!*linep)
  483.       continue;
  484.     /* We need to end with a reject *:*, not an implicit accept *:* */
  485.     for (;;) {
  486.       if (!strcmp((*linep)->value, "reject *:*")) /* already there */
  487.         break;
  488.       linep = &((*linep)->next);
  489.       if (!*linep) {
  490.         *linep = tor_malloc_zero(sizeof(config_line_t));
  491.         (*linep)->key = tor_strdup(
  492.           (i==0) ?  "ReachableAddresses" :
  493.             (i==1) ? "ReachableORAddresses" :
  494.                      "ReachableDirAddresses");
  495.         (*linep)->value = tor_strdup("reject *:*");
  496.         break;
  497.       }
  498.     }
  499.   }
  500.   if ((options->ReachableAddresses ||
  501.        options->ReachableORAddresses ||
  502.        options->ReachableDirAddresses) &&
  503.       server_mode(options))
  504.     REJECT("Servers must be able to freely connect to the rest "
  505.            "of the Internet, so they must not set Reachable*Addresses "
  506.            "or FascistFirewall.");
  507.   if (options->UseBridges &&
  508.       server_mode(options))
  509.     REJECT("Servers must be able to freely connect to the rest "
  510.            "of the Internet, so they must not set UseBridges.");
  511.   options->_AllowInvalid = 0;
  512.   if (options->AllowInvalidNodes) {
  513.     SMARTLIST_FOREACH(options->AllowInvalidNodes, const char *, cp, {
  514.         if (!strcasecmp(cp, "entry"))
  515.           options->_AllowInvalid |= ALLOW_INVALID_ENTRY;
  516.         else if (!strcasecmp(cp, "exit"))
  517.           options->_AllowInvalid |= ALLOW_INVALID_EXIT;
  518.         else if (!strcasecmp(cp, "middle"))
  519.           options->_AllowInvalid |= ALLOW_INVALID_MIDDLE;
  520.         else if (!strcasecmp(cp, "introduction"))
  521.           options->_AllowInvalid |= ALLOW_INVALID_INTRODUCTION;
  522.         else if (!strcasecmp(cp, "rendezvous"))
  523.           options->_AllowInvalid |= ALLOW_INVALID_RENDEZVOUS;
  524.         else {
  525.           r = tor_snprintf(buf, sizeof(buf),
  526.               "Unrecognized value '%s' in AllowInvalidNodes", cp);
  527.           *msg = tor_strdup(r >= 0 ? buf : "internal error");
  528.           return -1;
  529.         }
  530.       });
  531.   }
  532.   if (compute_publishserverdescriptor(options) < 0) {
  533.     r = tor_snprintf(buf, sizeof(buf),
  534.                      "Unrecognized value in PublishServerDescriptor");
  535.     *msg = tor_strdup(r >= 0 ? buf : "internal error");
  536.     return -1;
  537.   }
  538.   if ((options->BridgeRelay
  539.         || options->_PublishServerDescriptor & BRIDGE_AUTHORITY)
  540.       && (options->_PublishServerDescriptor
  541.           & (V1_AUTHORITY|V2_AUTHORITY|V3_AUTHORITY))) {
  542.     REJECT("Bridges are not supposed to publish router descriptors to the "
  543.            "directory authorities. Please correct your "
  544.            "PublishServerDescriptor line.");
  545.   }
  546.   if (options->MinUptimeHidServDirectoryV2 < 0) {
  547.     log_warn(LD_CONFIG, "MinUptimeHidServDirectoryV2 option must be at "
  548.                         "least 0 seconds. Changing to 0.");
  549.     options->MinUptimeHidServDirectoryV2 = 0;
  550.   }
  551.   if (options->RendPostPeriod < MIN_REND_POST_PERIOD) {
  552.     log(LOG_WARN,LD_CONFIG,"RendPostPeriod option is too short; "
  553.         "raising to %d seconds.", MIN_REND_POST_PERIOD);
  554.     options->RendPostPeriod = MIN_REND_POST_PERIOD;
  555.   }
  556.   if (options->RendPostPeriod > MAX_DIR_PERIOD) {
  557.     log(LOG_WARN, LD_CONFIG, "RendPostPeriod is too large; clipping to %ds.",
  558.         MAX_DIR_PERIOD);
  559.     options->RendPostPeriod = MAX_DIR_PERIOD;
  560.   }
  561.   if (options->CircuitBuildTimeout < MIN_CIRCUIT_BUILD_TIMEOUT) {
  562.     log(LOG_WARN, LD_CONFIG, "CircuitBuildTimeout option is too short; "
  563.       "raising to %d seconds.", MIN_CIRCUIT_BUILD_TIMEOUT);
  564.     options->CircuitBuildTimeout = MIN_CIRCUIT_BUILD_TIMEOUT;
  565.   }
  566.   if (options->MaxCircuitDirtiness < MIN_MAX_CIRCUIT_DIRTINESS) {
  567.     log(LOG_WARN, LD_CONFIG, "MaxCircuitDirtiness option is too short; "
  568.       "raising to %d seconds.", MIN_MAX_CIRCUIT_DIRTINESS);
  569.     options->MaxCircuitDirtiness = MIN_MAX_CIRCUIT_DIRTINESS;
  570.   }
  571.   if (options->KeepalivePeriod < 1)
  572.     REJECT("KeepalivePeriod option must be positive.");
  573.   if (ensure_bandwidth_cap(&options->BandwidthRate,
  574.                            "BandwidthRate", msg) < 0)
  575.     return -1;
  576.   if (ensure_bandwidth_cap(&options->BandwidthBurst,
  577.                            "BandwidthBurst", msg) < 0)
  578.     return -1;
  579.   if (ensure_bandwidth_cap(&options->MaxAdvertisedBandwidth,
  580.                            "MaxAdvertisedBandwidth", msg) < 0)
  581.     return -1;
  582.   if (ensure_bandwidth_cap(&options->RelayBandwidthRate,
  583.                            "RelayBandwidthRate", msg) < 0)
  584.     return -1;
  585.   if (ensure_bandwidth_cap(&options->RelayBandwidthBurst,
  586.                            "RelayBandwidthBurst", msg) < 0)
  587.     return -1;
  588.   if (server_mode(options)) {
  589.     if (options->BandwidthRate < ROUTER_REQUIRED_MIN_BANDWIDTH) {
  590.       r = tor_snprintf(buf, sizeof(buf),
  591.                        "BandwidthRate is set to %d bytes/second. "
  592.                        "For servers, it must be at least %d.",
  593.                        (int)options->BandwidthRate,
  594.                        ROUTER_REQUIRED_MIN_BANDWIDTH);
  595.       *msg = tor_strdup(r >= 0 ? buf : "internal error");
  596.       return -1;
  597.     } else if (options->MaxAdvertisedBandwidth <
  598.                ROUTER_REQUIRED_MIN_BANDWIDTH/2) {
  599.       r = tor_snprintf(buf, sizeof(buf),
  600.                        "MaxAdvertisedBandwidth is set to %d bytes/second. "
  601.                        "For servers, it must be at least %d.",
  602.                        (int)options->MaxAdvertisedBandwidth,
  603.                        ROUTER_REQUIRED_MIN_BANDWIDTH/2);
  604.       *msg = tor_strdup(r >= 0 ? buf : "internal error");
  605.       return -1;
  606.     }
  607.     if (options->RelayBandwidthRate &&
  608.       options->RelayBandwidthRate < ROUTER_REQUIRED_MIN_BANDWIDTH) {
  609.       r = tor_snprintf(buf, sizeof(buf),
  610.                        "RelayBandwidthRate is set to %d bytes/second. "
  611.                        "For servers, it must be at least %d.",
  612.                        (int)options->RelayBandwidthRate,
  613.                        ROUTER_REQUIRED_MIN_BANDWIDTH);
  614.       *msg = tor_strdup(r >= 0 ? buf : "internal error");
  615.       return -1;
  616.     }
  617.   }
  618.   if (options->RelayBandwidthRate && !options->RelayBandwidthBurst)
  619.     options->RelayBandwidthBurst = options->RelayBandwidthRate;
  620.   if (options->RelayBandwidthRate > options->RelayBandwidthBurst)
  621.     REJECT("RelayBandwidthBurst must be at least equal "
  622.            "to RelayBandwidthRate.");
  623.   if (options->BandwidthRate > options->BandwidthBurst)
  624.     REJECT("BandwidthBurst must be at least equal to BandwidthRate.");
  625.   /* if they set relaybandwidth* really high but left bandwidth*
  626.    * at the default, raise the defaults. */
  627.   if (options->RelayBandwidthRate > options->BandwidthRate)
  628.     options->BandwidthRate = options->RelayBandwidthRate;
  629.   if (options->RelayBandwidthBurst > options->BandwidthBurst)
  630.     options->BandwidthBurst = options->RelayBandwidthBurst;
  631.   if (accounting_parse_options(options, 1)<0)
  632.     REJECT("Failed to parse accounting options. See logs for details.");
  633.   if (options->HttpProxy) { /* parse it now */
  634.     if (parse_addr_port(LOG_WARN, options->HttpProxy, NULL,
  635.                         &options->HttpProxyAddr, &options->HttpProxyPort) < 0)
  636.       REJECT("HttpProxy failed to parse or resolve. Please fix.");
  637.     if (options->HttpProxyPort == 0) { /* give it a default */
  638.       options->HttpProxyPort = 80;
  639.     }
  640.   }
  641.   if (options->HttpProxyAuthenticator) {
  642.     if (strlen(options->HttpProxyAuthenticator) >= 48)
  643.       REJECT("HttpProxyAuthenticator is too long (>= 48 chars).");
  644.   }
  645.   if (options->HttpsProxy) { /* parse it now */
  646.     if (parse_addr_port(LOG_WARN, options->HttpsProxy, NULL,
  647.                         &options->HttpsProxyAddr, &options->HttpsProxyPort) <0)
  648.       REJECT("HttpsProxy failed to parse or resolve. Please fix.");
  649.     if (options->HttpsProxyPort == 0) { /* give it a default */
  650.       options->HttpsProxyPort = 443;
  651.     }
  652.   }
  653.   if (options->HttpsProxyAuthenticator) {
  654.     if (strlen(options->HttpsProxyAuthenticator) >= 48)
  655.       REJECT("HttpsProxyAuthenticator is too long (>= 48 chars).");
  656.   }
  657.   if (options->HashedControlPassword) {
  658.     smartlist_t *sl = decode_hashed_passwords(options->HashedControlPassword);
  659.     if (!sl) {
  660.       REJECT("Bad HashedControlPassword: wrong length or bad encoding");
  661.     } else {
  662.       SMARTLIST_FOREACH(sl, char*, cp, tor_free(cp));
  663.       smartlist_free(sl);
  664.     }
  665.   }
  666.   if (options->HashedControlSessionPassword) {
  667.     smartlist_t *sl = decode_hashed_passwords(
  668.                                   options->HashedControlSessionPassword);
  669.     if (!sl) {
  670.       REJECT("Bad HashedControlSessionPassword: wrong length or bad encoding");
  671.     } else {
  672.       SMARTLIST_FOREACH(sl, char*, cp, tor_free(cp));
  673.       smartlist_free(sl);
  674.     }
  675.   }
  676.   if (options->ControlListenAddress) {
  677.     int all_are_local = 1;
  678.     config_line_t *ln;
  679.     for (ln = options->ControlListenAddress; ln; ln = ln->next) {
  680.       if (strcmpstart(ln->value, "127."))
  681.         all_are_local = 0;
  682.     }
  683.     if (!all_are_local) {
  684.       if (!options->HashedControlPassword &&
  685.           !options->HashedControlSessionPassword &&
  686.           !options->CookieAuthentication) {
  687.         log_warn(LD_CONFIG,
  688.                  "You have a ControlListenAddress set to accept "
  689.                  "unauthenticated connections from a non-local address.  "
  690.                  "This means that programs not running on your computer "
  691.                  "can reconfigure your Tor, without even having to guess a "
  692.                  "password.  That's so bad that I'm closing your ControlPort "
  693.                  "for you.  If you need to control your Tor remotely, try "
  694.                  "enabling authentication and using a tool like stunnel or "
  695.                  "ssh to encrypt remote access.");
  696.         options->ControlPort = 0;
  697.       } else {
  698.         log_warn(LD_CONFIG, "You have a ControlListenAddress set to accept "
  699.                  "connections from a non-local address.  This means that "
  700.                  "programs not running on your computer can reconfigure your "
  701.                  "Tor.  That's pretty bad, since the controller "
  702.                  "protocol isn't encrypted!  Maybe you should just listen on "
  703.                  "127.0.0.1 and use a tool like stunnel or ssh to encrypt "
  704.                  "remote connections to your control port.");
  705.       }
  706.     }
  707.   }
  708.   if (options->ControlPort && !options->HashedControlPassword &&
  709.       !options->HashedControlSessionPassword &&
  710.       !options->CookieAuthentication) {
  711.     log_warn(LD_CONFIG, "ControlPort is open, but no authentication method "
  712.              "has been configured.  This means that any program on your "
  713.              "computer can reconfigure your Tor.  That's bad!  You should "
  714.              "upgrade your Tor controller as soon as possible.");
  715.   }
  716.   if (options->UseEntryGuards && ! options->NumEntryGuards)
  717.     REJECT("Cannot enable UseEntryGuards with NumEntryGuards set to 0");
  718.   if (check_nickname_list(options->MyFamily, "MyFamily", msg))
  719.     return -1;
  720.   for (cl = options->NodeFamilies; cl; cl = cl->next) {
  721.     if (check_nickname_list(cl->value, "NodeFamily", msg))
  722.       return -1;
  723.   }
  724.   if (validate_addr_policies(options, msg) < 0)
  725.     return -1;
  726.   if (validate_dir_authorities(options, old_options) < 0)
  727.     REJECT("Directory authority line did not parse. See logs for details.");
  728.   if (options->UseBridges && !options->Bridges)
  729.     REJECT("If you set UseBridges, you must specify at least one bridge.");
  730.   if (options->UseBridges && !options->TunnelDirConns)
  731.     REJECT("If you set UseBridges, you must set TunnelDirConns.");
  732.   if (options->Bridges) {
  733.     for (cl = options->Bridges; cl; cl = cl->next) {
  734.       if (parse_bridge_line(cl->value, 1)<0)
  735.         REJECT("Bridge line did not parse. See logs for details.");
  736.     }
  737.   }
  738.   if (options->ConstrainedSockets) {
  739.     /* If the user wants to constrain socket buffer use, make sure the desired
  740.      * limit is between MIN|MAX_TCPSOCK_BUFFER in k increments. */
  741.     if (options->ConstrainedSockSize < MIN_CONSTRAINED_TCP_BUFFER ||
  742.         options->ConstrainedSockSize > MAX_CONSTRAINED_TCP_BUFFER ||
  743.         options->ConstrainedSockSize % 1024) {
  744.       r = tor_snprintf(buf, sizeof(buf),
  745.           "ConstrainedSockSize is invalid.  Must be a value between %d and %d "
  746.           "in 1024 byte increments.",
  747.           MIN_CONSTRAINED_TCP_BUFFER, MAX_CONSTRAINED_TCP_BUFFER);
  748.       *msg = tor_strdup(r >= 0 ? buf : "internal error");
  749.       return -1;
  750.     }
  751.     if (options->DirPort) {
  752.       /* Providing cached directory entries while system TCP buffers are scarce
  753.        * will exacerbate the socket errors.  Suggest that this be disabled. */
  754.       COMPLAIN("You have requested constrained socket buffers while also "
  755.                "serving directory entries via DirPort.  It is strongly "
  756.                "suggested that you disable serving directory requests when "
  757.                "system TCP buffer resources are scarce.");
  758.     }
  759.   }
  760.   if (options->V3AuthVoteDelay + options->V3AuthDistDelay >=
  761.       options->V3AuthVotingInterval/2) {
  762.     REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half "
  763.            "V3AuthVotingInterval");
  764.   }
  765.   if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS)
  766.     REJECT("V3AuthVoteDelay is way too low.");
  767.   if (options->V3AuthDistDelay < MIN_DIST_SECONDS)
  768.     REJECT("V3AuthDistDelay is way too low.");
  769.   if (options->V3AuthNIntervalsValid < 2)
  770.     REJECT("V3AuthNIntervalsValid must be at least 2.");
  771.   if (options->V3AuthVotingInterval < MIN_VOTE_INTERVAL) {
  772.     REJECT("V3AuthVotingInterval is insanely low.");
  773.   } else if (options->V3AuthVotingInterval > 24*60*60) {
  774.     REJECT("V3AuthVotingInterval is insanely high.");
  775.   } else if (((24*60*60) % options->V3AuthVotingInterval) != 0) {
  776.     COMPLAIN("V3AuthVotingInterval does not divide evenly into 24 hours.");
  777.   }
  778.   if (rend_config_services(options, 1) < 0)
  779.     REJECT("Failed to configure rendezvous options. See logs for details.");
  780.   /* Parse client-side authorization for hidden services. */
  781.   if (rend_parse_service_authorization(options, 1) < 0)
  782.     REJECT("Failed to configure client authorization for hidden services. "
  783.            "See logs for details.");
  784.   if (parse_virtual_addr_network(options->VirtualAddrNetwork, 1, NULL)<0)
  785.     return -1;
  786.   if (options->PreferTunneledDirConns && !options->TunnelDirConns)
  787.     REJECT("Must set TunnelDirConns if PreferTunneledDirConns is set.");
  788.   if (options->AutomapHostsSuffixes) {
  789.     SMARTLIST_FOREACH(options->AutomapHostsSuffixes, char *, suf,
  790.     {
  791.       size_t len = strlen(suf);
  792.       if (len && suf[len-1] == '.')
  793.         suf[len-1] = '';
  794.     });
  795.   }
  796.   if (options->TestingTorNetwork && !options->DirServers) {
  797.     REJECT("TestingTorNetwork may only be configured in combination with "
  798.            "a non-default set of DirServers.");
  799.   }
  800.   /*XXXX022 checking for defaults manually like this is a bit fragile.*/
  801.   /* Keep changes to hard-coded values synchronous to man page and default
  802.    * values table. */
  803.   if (options->TestingV3AuthInitialVotingInterval != 30*60 &&
  804.       !options->TestingTorNetwork) {
  805.     REJECT("TestingV3AuthInitialVotingInterval may only be changed in testing "
  806.            "Tor networks!");
  807.   } else if (options->TestingV3AuthInitialVotingInterval < MIN_VOTE_INTERVAL) {
  808.     REJECT("TestingV3AuthInitialVotingInterval is insanely low.");
  809.   } else if (((30*60) % options->TestingV3AuthInitialVotingInterval) != 0) {
  810.     REJECT("TestingV3AuthInitialVotingInterval does not divide evenly into "
  811.            "30 minutes.");
  812.   }
  813.   if (options->TestingV3AuthInitialVoteDelay != 5*60 &&
  814.       !options->TestingTorNetwork) {
  815.     REJECT("TestingV3AuthInitialVoteDelay may only be changed in testing "
  816.            "Tor networks!");
  817.   } else if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS) {
  818.     REJECT("TestingV3AuthInitialVoteDelay is way too low.");
  819.   }
  820.   if (options->TestingV3AuthInitialDistDelay != 5*60 &&
  821.       !options->TestingTorNetwork) {
  822.     REJECT("TestingV3AuthInitialDistDelay may only be changed in testing "
  823.            "Tor networks!");
  824.   } else if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS) {
  825.     REJECT("TestingV3AuthInitialDistDelay is way too low.");
  826.   }
  827.   if (options->TestingV3AuthInitialVoteDelay +
  828.       options->TestingV3AuthInitialDistDelay >=
  829.       options->TestingV3AuthInitialVotingInterval/2) {
  830.     REJECT("TestingV3AuthInitialVoteDelay plus TestingV3AuthInitialDistDelay "
  831.            "must be less than half TestingV3AuthInitialVotingInterval");
  832.   }
  833.   if (options->TestingAuthDirTimeToLearnReachability != 30*60 &&
  834.       !options->TestingTorNetwork) {
  835.     REJECT("TestingAuthDirTimeToLearnReachability may only be changed in "
  836.            "testing Tor networks!");
  837.   } else if (options->TestingAuthDirTimeToLearnReachability < 0) {
  838.     REJECT("TestingAuthDirTimeToLearnReachability must be non-negative.");
  839.   } else if (options->TestingAuthDirTimeToLearnReachability > 2*60*60) {
  840.     COMPLAIN("TestingAuthDirTimeToLearnReachability is insanely high.");
  841.   }
  842.   if (options->TestingEstimatedDescriptorPropagationTime != 10*60 &&
  843.       !options->TestingTorNetwork) {
  844.     REJECT("TestingEstimatedDescriptorPropagationTime may only be changed in "
  845.            "testing Tor networks!");
  846.   } else if (options->TestingEstimatedDescriptorPropagationTime < 0) {
  847.     REJECT("TestingEstimatedDescriptorPropagationTime must be non-negative.");
  848.   } else if (options->TestingEstimatedDescriptorPropagationTime > 60*60) {
  849.     COMPLAIN("TestingEstimatedDescriptorPropagationTime is insanely high.");
  850.   }
  851.   if (options->TestingTorNetwork) {
  852.     log_warn(LD_CONFIG, "TestingTorNetwork is set. This will make your node "
  853.                         "almost unusable in the public Tor network, and is "
  854.                         "therefore only advised if you are building a "
  855.                         "testing Tor network!");
  856.   }
  857.   return 0;
  858. #undef REJECT
  859. #undef COMPLAIN
  860. }
  861. /** Helper: return true iff s1 and s2 are both NULL, or both non-NULL
  862.  * equal strings. */
  863. static int
  864. opt_streq(const char *s1, const char *s2)
  865. {
  866.   if (!s1 && !s2)
  867.     return 1;
  868.   else if (s1 && s2 && !strcmp(s1,s2))
  869.     return 1;
  870.   else
  871.     return 0;
  872. }
  873. /** Check if any of the previous options have changed but aren't allowed to. */
  874. static int
  875. options_transition_allowed(or_options_t *old, or_options_t *new_val,
  876.                            char **msg)
  877. {
  878.   if (!old)
  879.     return 0;
  880.   if (!opt_streq(old->PidFile, new_val->PidFile)) {
  881.     *msg = tor_strdup("PidFile is not allowed to change.");
  882.     return -1;
  883.   }
  884.   if (old->RunAsDaemon != new_val->RunAsDaemon) {
  885.     *msg = tor_strdup("While Tor is running, changing RunAsDaemon "
  886.                       "is not allowed.");
  887.     return -1;
  888.   }
  889.   if (strcmp(old->DataDirectory,new_val->DataDirectory)!=0) {
  890.     char buf[1024];
  891.     int r = tor_snprintf(buf, sizeof(buf),
  892.                "While Tor is running, changing DataDirectory "
  893.                "("%s"->"%s") is not allowed.",
  894.                old->DataDirectory, new_val->DataDirectory);
  895.     *msg = tor_strdup(r >= 0 ? buf : "internal error");
  896.     return -1;
  897.   }
  898.   if (!opt_streq(old->User, new_val->User)) {
  899.     *msg = tor_strdup("While Tor is running, changing User is not allowed.");
  900.     return -1;
  901.   }
  902.   if (!opt_streq(old->Group, new_val->Group)) {
  903.     *msg = tor_strdup("While Tor is running, changing Group is not allowed.");
  904.     return -1;
  905.   }
  906.   if (old->HardwareAccel != new_val->HardwareAccel) {
  907.     *msg = tor_strdup("While Tor is running, changing HardwareAccel is "
  908.                       "not allowed.");
  909.     return -1;
  910.   }
  911.   if (old->TestingTorNetwork != new_val->TestingTorNetwork) {
  912.     *msg = tor_strdup("While Tor is running, changing TestingTorNetwork "
  913.                       "is not allowed.");
  914.     return -1;
  915.   }
  916.   return 0;
  917. }
  918. /** Return 1 if any change from <b>old_options</b> to <b>new_options</b>
  919.  * will require us to rotate the CPU and DNS workers; else return 0. */
  920. static int
  921. options_transition_affects_workers(or_options_t *old_options,
  922.                                    or_options_t *new_options)
  923. {
  924.   if (!opt_streq(old_options->DataDirectory, new_options->DataDirectory) ||
  925.       old_options->NumCpus != new_options->NumCpus ||
  926.       old_options->ORPort != new_options->ORPort ||
  927.       old_options->ServerDNSSearchDomains !=
  928.                                        new_options->ServerDNSSearchDomains ||
  929.       old_options->SafeLogging != new_options->SafeLogging ||
  930.       old_options->ClientOnly != new_options->ClientOnly ||
  931.       !config_lines_eq(old_options->Logs, new_options->Logs))
  932.     return 1;
  933.   /* Check whether log options match. */
  934.   /* Nothing that changed matters. */
  935.   return 0;
  936. }
  937. /** Return 1 if any change from <b>old_options</b> to <b>new_options</b>
  938.  * will require us to generate a new descriptor; else return 0. */
  939. static int
  940. options_transition_affects_descriptor(or_options_t *old_options,
  941.                                       or_options_t *new_options)
  942. {
  943.   /* XXX We can be smarter here. If your DirPort isn't being
  944.    * published and you just turned it off, no need to republish. Etc. */
  945.   if (!opt_streq(old_options->DataDirectory, new_options->DataDirectory) ||
  946.       !opt_streq(old_options->Nickname,new_options->Nickname) ||
  947.       !opt_streq(old_options->Address,new_options->Address) ||
  948.       !config_lines_eq(old_options->ExitPolicy,new_options->ExitPolicy) ||
  949.       old_options->ExitPolicyRejectPrivate !=
  950.         new_options->ExitPolicyRejectPrivate ||
  951.       old_options->ORPort != new_options->ORPort ||
  952.       old_options->DirPort != new_options->DirPort ||
  953.       old_options->ClientOnly != new_options->ClientOnly ||
  954.       old_options->NoPublish != new_options->NoPublish ||
  955.       old_options->_PublishServerDescriptor !=
  956.         new_options->_PublishServerDescriptor ||
  957.       get_effective_bwrate(old_options) != get_effective_bwrate(new_options) ||
  958.       get_effective_bwburst(old_options) !=
  959.         get_effective_bwburst(new_options) ||
  960.       !opt_streq(old_options->ContactInfo, new_options->ContactInfo) ||
  961.       !opt_streq(old_options->MyFamily, new_options->MyFamily) ||
  962.       !opt_streq(old_options->AccountingStart, new_options->AccountingStart) ||
  963.       old_options->AccountingMax != new_options->AccountingMax)
  964.     return 1;
  965.   return 0;
  966. }
  967. #ifdef MS_WINDOWS
  968. /** Return the directory on windows where we expect to find our application
  969.  * data. */
  970. static char *
  971. get_windows_conf_root(void)
  972. {
  973.   static int is_set = 0;
  974.   static char path[MAX_PATH+1];
  975.   LPITEMIDLIST idl;
  976.   IMalloc *m;
  977.   HRESULT result;
  978.   if (is_set)
  979.     return path;
  980.   /* Find X:documents and settingsusernameapplication data .
  981.    * We would use SHGetSpecialFolder path, but that wasn't added until IE4.
  982.    */
  983. #ifdef ENABLE_LOCAL_APPDATA
  984. #define APPDATA_PATH CSIDL_LOCAL_APPDATA
  985. #else
  986. #define APPDATA_PATH CSIDL_APPDATA
  987. #endif
  988.   if (!SUCCEEDED(SHGetSpecialFolderLocation(NULL, APPDATA_PATH, &idl))) {
  989.     GetCurrentDirectory(MAX_PATH, path);
  990.     is_set = 1;
  991.     log_warn(LD_CONFIG,
  992.              "I couldn't find your application data folder: are you "
  993.              "running an ancient version of Windows 95? Defaulting to "%s"",
  994.              path);
  995.     return path;
  996.   }
  997.   /* Convert the path from an "ID List" (whatever that is!) to a path. */
  998.   result = SHGetPathFromIDList(idl, path);
  999.   /* Now we need to free the */
  1000.   SHGetMalloc(&m);
  1001.   if (m) {
  1002.     m->lpVtbl->Free(m, idl);
  1003.     m->lpVtbl->Release(m);
  1004.   }
  1005.   if (!SUCCEEDED(result)) {
  1006.     return NULL;
  1007.   }
  1008.   strlcat(path,"\tor",MAX_PATH);
  1009.   is_set = 1;
  1010.   return path;
  1011. }
  1012. #endif
  1013. /** Return the default location for our torrc file. */
  1014. static const char *
  1015. get_default_conf_file(void)
  1016. {
  1017. #ifdef MS_WINDOWS
  1018.   static char path[MAX_PATH+1];
  1019.   strlcpy(path, get_windows_conf_root(), MAX_PATH);
  1020.   strlcat(path,"\torrc",MAX_PATH);
  1021.   return path;
  1022. #else
  1023.   return (CONFDIR "/torrc");
  1024. #endif
  1025. }
  1026. /** Verify whether lst is a string containing valid-looking comma-separated
  1027.  * nicknames, or NULL. Return 0 on success. Warn and return -1 on failure.
  1028.  */
  1029. static int
  1030. check_nickname_list(const char *lst, const char *name, char **msg)
  1031. {
  1032.   int r = 0;
  1033.   smartlist_t *sl;
  1034.   if (!lst)
  1035.     return 0;
  1036.   sl = smartlist_create();
  1037.   smartlist_split_string(sl, lst, ",",
  1038.     SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK|SPLIT_STRIP_SPACE, 0);
  1039.   SMARTLIST_FOREACH(sl, const char *, s,
  1040.     {
  1041.       if (!is_legal_nickname_or_hexdigest(s)) {
  1042.         char buf[1024];
  1043.         int tmp = tor_snprintf(buf, sizeof(buf),
  1044.                   "Invalid nickname '%s' in %s line", s, name);
  1045.         *msg = tor_strdup(tmp >= 0 ? buf : "internal error");
  1046.         r = -1;
  1047.         break;
  1048.       }
  1049.     });
  1050.   SMARTLIST_FOREACH(sl, char *, s, tor_free(s));
  1051.   smartlist_free(sl);
  1052.   return r;
  1053. }
  1054. /** Learn config file name from command line arguments, or use the default */
  1055. static char *
  1056. find_torrc_filename(int argc, char **argv,
  1057.                     int *using_default_torrc, int *ignore_missing_torrc)
  1058. {
  1059.   char *fname=NULL;
  1060.   int i;
  1061.   for (i = 1; i < argc; ++i) {
  1062.     if (i < argc-1 && !strcmp(argv[i],"-f")) {
  1063.       if (fname) {
  1064.         log(LOG_WARN, LD_CONFIG, "Duplicate -f options on command line.");
  1065.         tor_free(fname);
  1066.       }
  1067. #ifdef MS_WINDOWS
  1068.       /* XXX one day we might want to extend expand_filename to work
  1069.        * under Windows as well. */
  1070.       fname = tor_strdup(argv[i+1]);
  1071. #else
  1072.       fname = expand_filename(argv[i+1]);
  1073. #endif
  1074.       *using_default_torrc = 0;
  1075.       ++i;
  1076.     } else if (!strcmp(argv[i],"--ignore-missing-torrc")) {
  1077.       *ignore_missing_torrc = 1;
  1078.     }
  1079.   }
  1080.   if (*using_default_torrc) {
  1081.     /* didn't find one, try CONFDIR */
  1082.     const char *dflt = get_default_conf_file();
  1083.     if (dflt && file_status(dflt) == FN_FILE) {
  1084.       fname = tor_strdup(dflt);
  1085.     } else {
  1086. #ifndef MS_WINDOWS
  1087.       char *fn;
  1088.       fn = expand_filename("~/.torrc");
  1089.       if (fn && file_status(fn) == FN_FILE) {
  1090.         fname = fn;
  1091.       } else {
  1092.         tor_free(fn);
  1093.         fname = tor_strdup(dflt);
  1094.       }
  1095. #else
  1096.       fname = tor_strdup(dflt);
  1097. #endif
  1098.     }
  1099.   }
  1100.   return fname;
  1101. }
  1102. /** Load torrc from disk, setting torrc_fname if successful */
  1103. static char *
  1104. load_torrc_from_disk(int argc, char **argv)
  1105. {
  1106.   char *fname=NULL;
  1107.   char *cf = NULL;
  1108.   int using_default_torrc = 1;
  1109.   int ignore_missing_torrc = 0;
  1110.   fname = find_torrc_filename(argc, argv,
  1111.                               &using_default_torrc, &ignore_missing_torrc);
  1112.   tor_assert(fname);
  1113.   log(LOG_DEBUG, LD_CONFIG, "Opening config file "%s"", fname);
  1114.   tor_free(torrc_fname);
  1115.   torrc_fname = fname;
  1116.   /* Open config file */
  1117.   if (file_status(fname) != FN_FILE ||
  1118.       !(cf = read_file_to_str(fname,0,NULL))) {
  1119.     if (using_default_torrc == 1 || ignore_missing_torrc ) {
  1120.       log(LOG_NOTICE, LD_CONFIG, "Configuration file "%s" not present, "
  1121.           "using reasonable defaults.", fname);
  1122.       tor_free(fname); /* sets fname to NULL */
  1123.       torrc_fname = NULL;
  1124.       cf = tor_strdup("");
  1125.     } else {
  1126.       log(LOG_WARN, LD_CONFIG,
  1127.           "Unable to open configuration file "%s".", fname);
  1128.       goto err;
  1129.     }
  1130.   }
  1131.   return cf;
  1132.  err:
  1133.   tor_free(fname);
  1134.   torrc_fname = NULL;
  1135.   return NULL;
  1136. }
  1137. /** Read a configuration file into <b>options</b>, finding the configuration
  1138.  * file location based on the command line.  After loading the file
  1139.  * call options_init_from_string() to load the config.
  1140.  * Return 0 if success, -1 if failure. */
  1141. int
  1142. options_init_from_torrc(int argc, char **argv)
  1143. {
  1144.   char *cf=NULL;
  1145.   int i, retval, command;
  1146.   static char **backup_argv;
  1147.   static int backup_argc;
  1148.   char *command_arg = NULL;
  1149.   char *errmsg=NULL;
  1150.   if (argv) { /* first time we're called. save command line args */
  1151.     backup_argv = argv;
  1152.     backup_argc = argc;
  1153.   } else { /* we're reloading. need to clean up old options first. */
  1154.     argv = backup_argv;
  1155.     argc = backup_argc;
  1156.   }
  1157.   if (argc > 1 && (!strcmp(argv[1], "-h") || !strcmp(argv[1],"--help"))) {
  1158.     print_usage();
  1159.     exit(0);
  1160.   }
  1161.   if (argc > 1 && !strcmp(argv[1], "--list-torrc-options")) {
  1162.     /* For documenting validating whether we've documented everything. */
  1163.     list_torrc_options();
  1164.     exit(0);
  1165.   }
  1166.   if (argc > 1 && (!strcmp(argv[1],"--version"))) {
  1167.     printf("Tor version %s.n",get_version());
  1168.     exit(0);
  1169.   }
  1170.   /* Go through command-line variables */
  1171.   if (!global_cmdline_options) {
  1172.     /* Or we could redo the list every time we pass this place.
  1173.      * It does not really matter */
  1174.     if (config_get_commandlines(argc, argv, &global_cmdline_options) < 0) {
  1175.       goto err;
  1176.     }
  1177.   }
  1178.   command = CMD_RUN_TOR;
  1179.   for (i = 1; i < argc; ++i) {
  1180.     if (!strcmp(argv[i],"--list-fingerprint")) {
  1181.       command = CMD_LIST_FINGERPRINT;
  1182.     } else if (!strcmp(argv[i],"--hash-password")) {
  1183.       command = CMD_HASH_PASSWORD;
  1184.       command_arg = tor_strdup( (i < argc-1) ? argv[i+1] : "");
  1185.       ++i;
  1186.     } else if (!strcmp(argv[i],"--verify-config")) {
  1187.       command = CMD_VERIFY_CONFIG;
  1188.     }
  1189.   }
  1190.   if (command == CMD_HASH_PASSWORD) {
  1191.     cf = tor_strdup("");
  1192.   } else {
  1193.     cf = load_torrc_from_disk(argc, argv);
  1194.     if (!cf)
  1195.       goto err;
  1196.   }
  1197.   retval = options_init_from_string(cf, command, command_arg, &errmsg);
  1198.   tor_free(cf);
  1199.   if (retval < 0)
  1200.     goto err;
  1201.   return 0;
  1202.  err:
  1203.   if (errmsg) {
  1204.     log(LOG_WARN,LD_CONFIG,"%s", errmsg);
  1205.     tor_free(errmsg);
  1206.   }
  1207.   return -1;
  1208. }
  1209. /** Load the options from the configuration in <b>cf</b>, validate
  1210.  * them for consistency and take actions based on them.
  1211.  *
  1212.  * Return 0 if success, negative on error:
  1213.  *  * -1 for general errors.
  1214.  *  * -2 for failure to parse/validate,
  1215.  *  * -3 for transition not allowed
  1216.  *  * -4 for error while setting the new options
  1217.  */
  1218. setopt_err_t
  1219. options_init_from_string(const char *cf,
  1220.                          int command, const char *command_arg,
  1221.                          char **msg)
  1222. {
  1223.   or_options_t *oldoptions, *newoptions;
  1224.   config_line_t *cl;
  1225.   int retval;
  1226.   setopt_err_t err = SETOPT_ERR_MISC;
  1227.   tor_assert(msg);
  1228.   oldoptions = global_options; /* get_options unfortunately asserts if
  1229.                                   this is the first time we run*/
  1230.   newoptions = tor_malloc_zero(sizeof(or_options_t));
  1231.   newoptions->_magic = OR_OPTIONS_MAGIC;
  1232.   options_init(newoptions);
  1233.   newoptions->command = command;
  1234.   newoptions->command_arg = command_arg;
  1235.   /* get config lines, assign them */
  1236.   retval = config_get_lines(cf, &cl);
  1237.   if (retval < 0) {
  1238.     err = SETOPT_ERR_PARSE;
  1239.     goto err;
  1240.   }
  1241.   retval = config_assign(&options_format, newoptions, cl, 0, 0, msg);
  1242.   config_free_lines(cl);
  1243.   if (retval < 0) {
  1244.     err = SETOPT_ERR_PARSE;
  1245.     goto err;
  1246.   }
  1247.   /* Go through command-line variables too */
  1248.   retval = config_assign(&options_format, newoptions,
  1249.                          global_cmdline_options, 0, 0, msg);
  1250.   if (retval < 0) {
  1251.     err = SETOPT_ERR_PARSE;
  1252.     goto err;
  1253.   }
  1254.   /* If this is a testing network configuration, change defaults
  1255.    * for a list of dependent config options, re-initialize newoptions
  1256.    * with the new defaults, and assign all options to it second time. */
  1257.   if (newoptions->TestingTorNetwork) {
  1258.     /* XXXX this is a bit of a kludge.  perhaps there's a better way to do
  1259.      * this?  We could, for example, make the parsing algorithm do two passes
  1260.      * over the configuration.  If it finds any "suite" options like
  1261.      * TestingTorNetwork, it could change the defaults before its second pass.
  1262.      * Not urgent so long as this seems to work, but at any sign of trouble,
  1263.      * let's clean it up.  -NM */
  1264.     /* Change defaults. */
  1265.     int i;
  1266.     for (i = 0; testing_tor_network_defaults[i].name; ++i) {
  1267.       config_var_t *new_var = &testing_tor_network_defaults[i];
  1268.       config_var_t *old_var =
  1269.           config_find_option(&options_format, new_var->name);
  1270.       tor_assert(new_var);
  1271.       tor_assert(old_var);
  1272.       old_var->initvalue = new_var->initvalue;
  1273.     }
  1274.     /* Clear newoptions and re-initialize them with new defaults. */
  1275.     config_free(&options_format, newoptions);
  1276.     newoptions = tor_malloc_zero(sizeof(or_options_t));
  1277.     newoptions->_magic = OR_OPTIONS_MAGIC;
  1278.     options_init(newoptions);
  1279.     newoptions->command = command;
  1280.     newoptions->command_arg = command_arg;
  1281.     /* Assign all options a second time. */
  1282.     retval = config_get_lines(cf, &cl);
  1283.     if (retval < 0) {
  1284.       err = SETOPT_ERR_PARSE;
  1285.       goto err;
  1286.     }
  1287.     retval = config_assign(&options_format, newoptions, cl, 0, 0, msg);
  1288.     config_free_lines(cl);
  1289.     if (retval < 0) {
  1290.       err = SETOPT_ERR_PARSE;
  1291.       goto err;
  1292.     }
  1293.     retval = config_assign(&options_format, newoptions,
  1294.                            global_cmdline_options, 0, 0, msg);
  1295.     if (retval < 0) {
  1296.       err = SETOPT_ERR_PARSE;
  1297.       goto err;
  1298.     }
  1299.   }
  1300.   /* Validate newoptions */
  1301.   if (options_validate(oldoptions, newoptions, 0, msg) < 0) {
  1302.     err = SETOPT_ERR_PARSE; /*XXX make this a separate return value.*/
  1303.     goto err;
  1304.   }
  1305.   if (options_transition_allowed(oldoptions, newoptions, msg) < 0) {
  1306.     err = SETOPT_ERR_TRANSITION;
  1307.     goto err;
  1308.   }
  1309.   if (set_options(newoptions, msg)) {
  1310.     err = SETOPT_ERR_SETTING;
  1311.     goto err; /* frees and replaces old options */
  1312.   }
  1313.   return SETOPT_OK;
  1314.  err:
  1315.   config_free(&options_format, newoptions);
  1316.   if (*msg) {
  1317.     int len = (int)strlen(*msg)+256;
  1318.     char *newmsg = tor_malloc(len);
  1319.     tor_snprintf(newmsg, len, "Failed to parse/validate config: %s", *msg);
  1320.     tor_free(*msg);
  1321.     *msg = newmsg;
  1322.   }
  1323.   return err;
  1324. }
  1325. /** Return the location for our configuration file.
  1326.  */
  1327. const char *
  1328. get_torrc_fname(void)
  1329. {
  1330.   if (torrc_fname)
  1331.     return torrc_fname;
  1332.   else
  1333.     return get_default_conf_file();
  1334. }
  1335. /** Adjust the address map based on the MapAddress elements in the
  1336.  * configuration <b>options</b>
  1337.  */
  1338. static void
  1339. config_register_addressmaps(or_options_t *options)
  1340. {
  1341.   smartlist_t *elts;
  1342.   config_line_t *opt;
  1343.   char *from, *to;
  1344.   addressmap_clear_configured();
  1345.   elts = smartlist_create();
  1346.   for (opt = options->AddressMap; opt; opt = opt->next) {
  1347.     smartlist_split_string(elts, opt->value, NULL,
  1348.                            SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2);
  1349.     if (smartlist_len(elts) >= 2) {
  1350.       from = smartlist_get(elts,0);
  1351.       to = smartlist_get(elts,1);
  1352.       if (address_is_invalid_destination(to, 1)) {
  1353.         log_warn(LD_CONFIG,
  1354.                  "Skipping invalid argument '%s' to MapAddress", to);
  1355.       } else {
  1356.         addressmap_register(from, tor_strdup(to), 0, ADDRMAPSRC_TORRC);
  1357.         if (smartlist_len(elts)>2) {
  1358.           log_warn(LD_CONFIG,"Ignoring extra arguments to MapAddress.");
  1359.         }
  1360.       }
  1361.     } else {
  1362.       log_warn(LD_CONFIG,"MapAddress '%s' has too few arguments. Ignoring.",
  1363.                opt->value);
  1364.     }
  1365.     SMARTLIST_FOREACH(elts, char*, cp, tor_free(cp));
  1366.     smartlist_clear(elts);
  1367.   }
  1368.   smartlist_free(elts);
  1369. }
  1370. /**
  1371.  * Initialize the logs based on the configuration file.
  1372.  */
  1373. static int
  1374. options_init_logs(or_options_t *options, int validate_only)
  1375. {
  1376.   config_line_t *opt;
  1377.   int ok;
  1378.   smartlist_t *elts;
  1379.   int daemon =
  1380. #ifdef MS_WINDOWS
  1381.                0;
  1382. #else
  1383.                options->RunAsDaemon;
  1384. #endif
  1385.   ok = 1;
  1386.   elts = smartlist_create();
  1387.   for (opt = options->Logs; opt; opt = opt->next) {
  1388.     log_severity_list_t *severity;
  1389.     const char *cfg = opt->value;
  1390.     severity = tor_malloc_zero(sizeof(log_severity_list_t));
  1391.     if (parse_log_severity_config(&cfg, severity) < 0) {
  1392.       log_warn(LD_CONFIG, "Couldn't parse log levels in Log option 'Log %s'",
  1393.                opt->value);
  1394.       ok = 0; goto cleanup;
  1395.     }
  1396.     smartlist_split_string(elts, cfg, NULL,
  1397.                            SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2);
  1398.     if (smartlist_len(elts) == 0)
  1399.       smartlist_add(elts, tor_strdup("stdout"));
  1400.     if (smartlist_len(elts) == 1 &&
  1401.         (!strcasecmp(smartlist_get(elts,0), "stdout") ||
  1402.          !strcasecmp(smartlist_get(elts,0), "stderr"))) {
  1403.       int err = smartlist_len(elts) &&
  1404.         !strcasecmp(smartlist_get(elts,0), "stderr");
  1405.       if (!validate_only) {
  1406.         if (daemon) {
  1407.           log_warn(LD_CONFIG,
  1408.                    "Can't log to %s with RunAsDaemon set; skipping stdout",
  1409.                    err?"stderr":"stdout");
  1410.         } else {
  1411.           add_stream_log(severity, err?"<stderr>":"<stdout>",
  1412.                          fileno(err?stderr:stdout));
  1413.         }
  1414.       }
  1415.       goto cleanup;
  1416.     }
  1417.     if (smartlist_len(elts) == 1 &&
  1418.         !strcasecmp(smartlist_get(elts,0), "syslog")) {
  1419. #ifdef HAVE_SYSLOG_H
  1420.       if (!validate_only) {
  1421.         add_syslog_log(severity);
  1422.       }
  1423. #else
  1424.       log_warn(LD_CONFIG, "Syslog is not supported on this system. Sorry.");
  1425. #endif
  1426.       goto cleanup;
  1427.     }
  1428.     if (smartlist_len(elts) == 2 &&
  1429.         !strcasecmp(smartlist_get(elts,0), "file")) {
  1430.       if (!validate_only) {
  1431.         if (add_file_log(severity, smartlist_get(elts, 1)) < 0) {
  1432.           log_warn(LD_CONFIG, "Couldn't open file for 'Log %s': %s",
  1433.                    opt->value, strerror(errno));
  1434.           ok = 0;
  1435.         }
  1436.       }
  1437.       goto cleanup;
  1438.     }
  1439.     log_warn(LD_CONFIG, "Bad syntax on file Log option 'Log %s'",
  1440.              opt->value);
  1441.     ok = 0; goto cleanup;
  1442.   cleanup:
  1443.     SMARTLIST_FOREACH(elts, char*, cp, tor_free(cp));
  1444.     smartlist_clear(elts);
  1445.     tor_free(severity);
  1446.   }
  1447.   smartlist_free(elts);
  1448.   return ok?0:-1;
  1449. }
  1450. /** Read the contents of a Bridge line from <b>line</b>. Return 0
  1451.  * if the line is well-formed, and -1 if it isn't. If
  1452.  * <b>validate_only</b> is 0, and the line is well-formed, then add
  1453.  * the bridge described in the line to our internal bridge list. */
  1454. static int
  1455. parse_bridge_line(const char *line, int validate_only)
  1456. {
  1457.   smartlist_t *items = NULL;
  1458.   int r;
  1459.   char *addrport=NULL, *fingerprint=NULL;
  1460.   tor_addr_t addr;
  1461.   uint16_t port = 0;
  1462.   char digest[DIGEST_LEN];
  1463.   items = smartlist_create();
  1464.   smartlist_split_string(items, line, NULL,
  1465.                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
  1466.   if (smartlist_len(items) < 1) {
  1467.     log_warn(LD_CONFIG, "Too few arguments to Bridge line.");
  1468.     goto err;
  1469.   }
  1470.   addrport = smartlist_get(items, 0);
  1471.   smartlist_del_keeporder(items, 0);
  1472.   if (tor_addr_port_parse(addrport, &addr, &port)<0) {
  1473.     log_warn(LD_CONFIG, "Error parsing Bridge address '%s'", addrport);
  1474.     goto err;
  1475.   }
  1476.   if (!port) {
  1477.     log_info(LD_CONFIG,
  1478.              "Bridge address '%s' has no port; using default port 443.",
  1479.              addrport);
  1480.     port = 443;
  1481.   }
  1482.   if (smartlist_len(items)) {
  1483.     fingerprint = smartlist_join_strings(items, "", 0, NULL);
  1484.     if (strlen(fingerprint) != HEX_DIGEST_LEN) {
  1485.       log_warn(LD_CONFIG, "Key digest for Bridge is wrong length.");
  1486.       goto err;
  1487.     }
  1488.     if (base16_decode(digest, DIGEST_LEN, fingerprint, HEX_DIGEST_LEN)<0) {
  1489.       log_warn(LD_CONFIG, "Unable to decode Bridge key digest.");
  1490.       goto err;
  1491.     }
  1492.   }
  1493.   if (!validate_only) {
  1494.     log_debug(LD_DIR, "Bridge at %s:%d (%s)", fmt_addr(&addr),
  1495.               (int)port,
  1496.               fingerprint ? fingerprint : "no key listed");
  1497.     bridge_add_from_config(&addr, port, fingerprint ? digest : NULL);
  1498.   }
  1499.   r = 0;
  1500.   goto done;
  1501.   err:
  1502.   r = -1;
  1503.   done:
  1504.   SMARTLIST_FOREACH(items, char*, s, tor_free(s));
  1505.   smartlist_free(items);
  1506.   tor_free(addrport);
  1507.   tor_free(fingerprint);
  1508.   return r;
  1509. }
  1510. /** Read the contents of a DirServer line from <b>line</b>. If
  1511.  * <b>validate_only</b> is 0, and the line is well-formed, and it
  1512.  * shares any bits with <b>required_type</b> or <b>required_type</b>
  1513.  * is 0, then add the dirserver described in the line (minus whatever
  1514.  * bits it's missing) as a valid authority. Return 0 on success,
  1515.  * or -1 if the line isn't well-formed or if we can't add it. */
  1516. static int
  1517. parse_dir_server_line(const char *line, authority_type_t required_type,
  1518.                       int validate_only)
  1519. {
  1520.   smartlist_t *items = NULL;
  1521.   int r;
  1522.   char *addrport=NULL, *address=NULL, *nickname=NULL, *fingerprint=NULL;
  1523.   uint16_t dir_port = 0, or_port = 0;
  1524.   char digest[DIGEST_LEN];
  1525.   char v3_digest[DIGEST_LEN];
  1526.   authority_type_t type = V2_AUTHORITY;
  1527.   int is_not_hidserv_authority = 0, is_not_v2_authority = 0;
  1528.   items = smartlist_create();
  1529.   smartlist_split_string(items, line, NULL,
  1530.                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
  1531.   if (smartlist_len(items) < 1) {
  1532.     log_warn(LD_CONFIG, "No arguments on DirServer line.");
  1533.     goto err;
  1534.   }
  1535.   if (is_legal_nickname(smartlist_get(items, 0))) {
  1536.     nickname = smartlist_get(items, 0);
  1537.     smartlist_del_keeporder(items, 0);
  1538.   }
  1539.   while (smartlist_len(items)) {
  1540.     char *flag = smartlist_get(items, 0);
  1541.     if (TOR_ISDIGIT(flag[0]))
  1542.       break;
  1543.     if (!strcasecmp(flag, "v1")) {
  1544.       type |= (V1_AUTHORITY | HIDSERV_AUTHORITY);
  1545.     } else if (!strcasecmp(flag, "hs")) {
  1546.       type |= HIDSERV_AUTHORITY;
  1547.     } else if (!strcasecmp(flag, "no-hs")) {
  1548.       is_not_hidserv_authority = 1;
  1549.     } else if (!strcasecmp(flag, "bridge")) {
  1550.       type |= BRIDGE_AUTHORITY;
  1551.     } else if (!strcasecmp(flag, "no-v2")) {
  1552.       is_not_v2_authority = 1;
  1553.     } else if (!strcasecmpstart(flag, "orport=")) {
  1554.       int ok;
  1555.       char *portstring = flag + strlen("orport=");
  1556.       or_port = (uint16_t) tor_parse_long(portstring, 10, 1, 65535, &ok, NULL);
  1557.       if (!ok)
  1558.         log_warn(LD_CONFIG, "Invalid orport '%s' on DirServer line.",
  1559.                  portstring);
  1560.     } else if (!strcasecmpstart(flag, "v3ident=")) {
  1561.       char *idstr = flag + strlen("v3ident=");
  1562.       if (strlen(idstr) != HEX_DIGEST_LEN ||
  1563.           base16_decode(v3_digest, DIGEST_LEN, idstr, HEX_DIGEST_LEN)<0) {
  1564.         log_warn(LD_CONFIG, "Bad v3 identity digest '%s' on DirServer line",
  1565.                  flag);
  1566.       } else {
  1567.         type |= V3_AUTHORITY;
  1568.       }
  1569.     } else {
  1570.       log_warn(LD_CONFIG, "Unrecognized flag '%s' on DirServer line",
  1571.                flag);
  1572.     }
  1573.     tor_free(flag);
  1574.     smartlist_del_keeporder(items, 0);
  1575.   }
  1576.   if (is_not_hidserv_authority)
  1577.     type &= ~HIDSERV_AUTHORITY;
  1578.   if (is_not_v2_authority)
  1579.     type &= ~V2_AUTHORITY;
  1580.   if (smartlist_len(items) < 2) {
  1581.     log_warn(LD_CONFIG, "Too few arguments to DirServer line.");
  1582.     goto err;
  1583.   }
  1584.   addrport = smartlist_get(items, 0);
  1585.   smartlist_del_keeporder(items, 0);
  1586.   if (parse_addr_port(LOG_WARN, addrport, &address, NULL, &dir_port)<0) {
  1587.     log_warn(LD_CONFIG, "Error parsing DirServer address '%s'", addrport);
  1588.     goto err;
  1589.   }
  1590.   if (!dir_port) {
  1591.     log_warn(LD_CONFIG, "Missing port in DirServer address '%s'",addrport);
  1592.     goto err;
  1593.   }
  1594.   fingerprint = smartlist_join_strings(items, "", 0, NULL);
  1595.   if (strlen(fingerprint) != HEX_DIGEST_LEN) {
  1596.     log_warn(LD_CONFIG, "Key digest for DirServer is wrong length %d.",
  1597.              (int)strlen(fingerprint));
  1598.     goto err;
  1599.   }
  1600.   if (!strcmp(fingerprint, "E623F7625FBE0C87820F11EC5F6D5377ED816294")) {
  1601.     /* a known bad fingerprint. refuse to use it. We can remove this
  1602.      * clause once Tor 0.1.2.17 is obsolete. */
  1603.     log_warn(LD_CONFIG, "Dangerous dirserver line. To correct, erase your "
  1604.              "torrc file (%s), or reinstall Tor and use the default torrc.",
  1605.              get_torrc_fname());
  1606.     goto err;
  1607.   }
  1608.   if (base16_decode(digest, DIGEST_LEN, fingerprint, HEX_DIGEST_LEN)<0) {
  1609.     log_warn(LD_CONFIG, "Unable to decode DirServer key digest.");
  1610.     goto err;
  1611.   }
  1612.   if (!validate_only && (!required_type || required_type & type)) {
  1613.     if (required_type)
  1614.       type &= required_type; /* pare down what we think of them as an
  1615.                               * authority for. */
  1616.     log_debug(LD_DIR, "Trusted %d dirserver at %s:%d (%s)", (int)type,
  1617.               address, (int)dir_port, (char*)smartlist_get(items,0));
  1618.     if (!add_trusted_dir_server(nickname, address, dir_port, or_port,
  1619.                                 digest, v3_digest, type))
  1620.       goto err;
  1621.   }
  1622.   r = 0;
  1623.   goto done;
  1624.   err:
  1625.   r = -1;
  1626.   done:
  1627.   SMARTLIST_FOREACH(items, char*, s, tor_free(s));
  1628.   smartlist_free(items);
  1629.   tor_free(addrport);
  1630.   tor_free(address);
  1631.   tor_free(nickname);
  1632.   tor_free(fingerprint);
  1633.   return r;
  1634. }
  1635. /** Adjust the value of options->DataDirectory, or fill it in if it's
  1636.  * absent. Return 0 on success, -1 on failure. */
  1637. static int
  1638. normalize_data_directory(or_options_t *options)
  1639. {
  1640. #ifdef MS_WINDOWS
  1641.   char *p;
  1642.   if (options->DataDirectory)
  1643.     return 0; /* all set */
  1644.   p = tor_malloc(MAX_PATH);
  1645.   strlcpy(p,get_windows_conf_root(),MAX_PATH);
  1646.   options->DataDirectory = p;
  1647.   return 0;
  1648. #else
  1649.   const char *d = options->DataDirectory;
  1650.   if (!d)
  1651.     d = "~/.tor";
  1652.  if (strncmp(d,"~/",2) == 0) {
  1653.    char *fn = expand_filename(d);
  1654.    if (!fn) {
  1655.      log_warn(LD_CONFIG,"Failed to expand filename "%s".", d);
  1656.      return -1;
  1657.    }
  1658.    if (!options->DataDirectory && !strcmp(fn,"/.tor")) {
  1659.      /* If our homedir is /, we probably don't want to use it. */
  1660.      /* Default to LOCALSTATEDIR/tor which is probably closer to what we
  1661.       * want. */
  1662.      log_warn(LD_CONFIG,
  1663.               "Default DataDirectory is "~/.tor".  This expands to "
  1664.               ""%s", which is probably not what you want.  Using "
  1665.               ""%s"PATH_SEPARATOR"tor" instead", fn, LOCALSTATEDIR);
  1666.      tor_free(fn);
  1667.      fn = tor_strdup(LOCALSTATEDIR PATH_SEPARATOR "tor");
  1668.    }
  1669.    tor_free(options->DataDirectory);
  1670.    options->DataDirectory = fn;
  1671.  }
  1672.  return 0;
  1673. #endif
  1674. }
  1675. /** Check and normalize the value of options->DataDirectory; return 0 if it
  1676.  * sane, -1 otherwise. */
  1677. static int
  1678. validate_data_directory(or_options_t *options)
  1679. {
  1680.   if (normalize_data_directory(options) < 0)
  1681.     return -1;
  1682.   tor_assert(options->DataDirectory);
  1683.   if (strlen(options->DataDirectory) > (512-128)) {
  1684.     log_warn(LD_CONFIG, "DataDirectory is too long.");
  1685.     return -1;
  1686.   }
  1687.   return 0;
  1688. }
  1689. /** This string must remain the same forevermore. It is how we
  1690.  * recognize that the torrc file doesn't need to be backed up. */
  1691. #define GENERATED_FILE_PREFIX "# This file was generated by Tor; " 
  1692.   "if you edit it, comments will not be preserved"
  1693. /** This string can change; it tries to give the reader an idea
  1694.  * that editing this file by hand is not a good plan. */
  1695. #define GENERATED_FILE_COMMENT "# The old torrc file was renamed " 
  1696.   "to torrc.orig.1 or similar, and Tor will ignore it"
  1697. /** Save a configuration file for the configuration in <b>options</b>
  1698.  * into the file <b>fname</b>.  If the file already exists, and
  1699.  * doesn't begin with GENERATED_FILE_PREFIX, rename it.  Otherwise
  1700.  * replace it.  Return 0 on success, -1 on failure. */
  1701. static int
  1702. write_configuration_file(const char *fname, or_options_t *options)
  1703. {
  1704.   char *old_val=NULL, *new_val=NULL, *new_conf=NULL;
  1705.   int rename_old = 0, r;
  1706.   size_t len;
  1707.   tor_assert(fname);
  1708.   switch (file_status(fname)) {
  1709.     case FN_FILE:
  1710.       old_val = read_file_to_str(fname, 0, NULL);
  1711.       if (strcmpstart(old_val, GENERATED_FILE_PREFIX)) {
  1712.         rename_old = 1;
  1713.       }
  1714.       tor_free(old_val);
  1715.       break;
  1716.     case FN_NOENT:
  1717.       break;
  1718.     case FN_ERROR:
  1719.     case FN_DIR:
  1720.     default:
  1721.       log_warn(LD_CONFIG,
  1722.                "Config file "%s" is not a file? Failing.", fname);
  1723.       return -1;
  1724.   }
  1725.   if (!(new_conf = options_dump(options, 1))) {
  1726.     log_warn(LD_BUG, "Couldn't get configuration string");
  1727.     goto err;
  1728.   }
  1729.   len = strlen(new_conf)+256;
  1730.   new_val = tor_malloc(len);
  1731.   tor_snprintf(new_val, len, "%sn%snn%s",
  1732.                GENERATED_FILE_PREFIX, GENERATED_FILE_COMMENT, new_conf);
  1733.   if (rename_old) {
  1734.     int i = 1;
  1735.     size_t fn_tmp_len = strlen(fname)+32;
  1736.     char *fn_tmp;
  1737.     tor_assert(fn_tmp_len > strlen(fname)); /*check for overflow*/
  1738.     fn_tmp = tor_malloc(fn_tmp_len);
  1739.     while (1) {
  1740.       if (tor_snprintf(fn_tmp, fn_tmp_len, "%s.orig.%d", fname, i)<0) {
  1741.         log_warn(LD_BUG, "tor_snprintf failed inexplicably");
  1742.         tor_free(fn_tmp);
  1743.         goto err;
  1744.       }
  1745.       if (file_status(fn_tmp) == FN_NOENT)
  1746.         break;
  1747.       ++i;
  1748.     }
  1749.     log_notice(LD_CONFIG, "Renaming old configuration file to "%s"", fn_tmp);
  1750.     if (rename(fname, fn_tmp) < 0) {
  1751.       log_warn(LD_FS,
  1752.                "Couldn't rename configuration file "%s" to "%s": %s",
  1753.                fname, fn_tmp, strerror(errno));
  1754.       tor_free(fn_tmp);
  1755.       goto err;
  1756.     }
  1757.     tor_free(fn_tmp);
  1758.   }
  1759.   if (write_str_to_file(fname, new_val, 0) < 0)
  1760.     goto err;
  1761.   r = 0;
  1762.   goto done;
  1763.  err:
  1764.   r = -1;
  1765.  done:
  1766.   tor_free(new_val);
  1767.   tor_free(new_conf);
  1768.   return r;
  1769. }
  1770. /**
  1771.  * Save the current configuration file value to disk.  Return 0 on
  1772.  * success, -1 on failure.
  1773.  **/
  1774. int
  1775. options_save_current(void)
  1776. {
  1777.   if (torrc_fname) {
  1778.     /* This fails if we can't write to our configuration file.
  1779.      *
  1780.      * If we try falling back to datadirectory or something, we have a better
  1781.      * chance of saving the configuration, but a better chance of doing
  1782.      * something the user never expected. Let's just warn instead. */
  1783.     return write_configuration_file(torrc_fname, get_options());
  1784.   }
  1785.   return write_configuration_file(get_default_conf_file(), get_options());
  1786. }
  1787. /** Mapping from a unit name to a multiplier for converting that unit into a
  1788.  * base unit. */
  1789. struct unit_table_t {
  1790.   const char *unit;
  1791.   uint64_t multiplier;
  1792. };
  1793. /** Table to map the names of memory units to the number of bytes they
  1794.  * contain. */
  1795. static struct unit_table_t memory_units[] = {
  1796.   { "",          1 },
  1797.   { "b",         1<< 0 },
  1798.   { "byte",      1<< 0 },
  1799.   { "bytes",     1<< 0 },
  1800.   { "kb",        1<<10 },
  1801.   { "kbyte",     1<<10 },
  1802.   { "kbytes",    1<<10 },
  1803.   { "kilobyte",  1<<10 },
  1804.   { "kilobytes", 1<<10 },
  1805.   { "m",         1<<20 },
  1806.   { "mb",        1<<20 },
  1807.   { "mbyte",     1<<20 },
  1808.   { "mbytes",    1<<20 },
  1809.   { "megabyte",  1<<20 },
  1810.   { "megabytes", 1<<20 },
  1811.   { "gb",        1<<30 },
  1812.   { "gbyte",     1<<30 },
  1813.   { "gbytes",    1<<30 },
  1814.   { "gigabyte",  1<<30 },
  1815.   { "gigabytes", 1<<30 },
  1816.   { "tb",        U64_LITERAL(1)<<40 },
  1817.   { "terabyte",  U64_LITERAL(1)<<40 },
  1818.   { "terabytes", U64_LITERAL(1)<<40 },
  1819.   { NULL, 0 },
  1820. };
  1821. /** Table to map the names of time units to the number of seconds they
  1822.  * contain. */
  1823. static struct unit_table_t time_units[] = {
  1824.   { "",         1 },
  1825.   { "second",   1 },
  1826.   { "seconds",  1 },
  1827.   { "minute",   60 },
  1828.   { "minutes",  60 },
  1829.   { "hour",     60*60 },
  1830.   { "hours",    60*60 },
  1831.   { "day",      24*60*60 },
  1832.   { "days",     24*60*60 },
  1833.   { "week",     7*24*60*60 },
  1834.   { "weeks",    7*24*60*60 },
  1835.   { NULL, 0 },
  1836. };
  1837. /** Parse a string <b>val</b> containing a number, zero or more
  1838.  * spaces, and an optional unit string.  If the unit appears in the
  1839.  * table <b>u</b>, then multiply the number by the unit multiplier.
  1840.  * On success, set *<b>ok</b> to 1 and return this product.
  1841.  * Otherwise, set *<b>ok</b> to 0.
  1842.  */
  1843. static uint64_t
  1844. config_parse_units(const char *val, struct unit_table_t *u, int *ok)
  1845. {
  1846.   uint64_t v;
  1847.   char *cp;
  1848.   tor_assert(ok);
  1849.   v = tor_parse_uint64(val, 10, 0, UINT64_MAX, ok, &cp);
  1850.   if (!*ok)
  1851.     return 0;
  1852.   if (!cp) {
  1853.     *ok = 1;
  1854.     return v;
  1855.   }
  1856.   while (TOR_ISSPACE(*cp))
  1857.     ++cp;
  1858.   for ( ;u->unit;++u) {
  1859.     if (!strcasecmp(u->unit, cp)) {
  1860.       v *= u->multiplier;
  1861.       *ok = 1;
  1862.       return v;
  1863.     }
  1864.   }
  1865.   log_warn(LD_CONFIG, "Unknown unit '%s'.", cp);
  1866.   *ok = 0;
  1867.   return 0;
  1868. }
  1869. /** Parse a string in the format "number unit", where unit is a unit of
  1870.  * information (byte, KB, M, etc).  On success, set *<b>ok</b> to true
  1871.  * and return the number of bytes specified.  Otherwise, set
  1872.  * *<b>ok</b> to false and return 0. */
  1873. static uint64_t
  1874. config_parse_memunit(const char *s, int *ok)
  1875. {
  1876.   return config_parse_units(s, memory_units, ok);
  1877. }
  1878. /** Parse a string in the format "number unit", where unit is a unit of time.
  1879.  * On success, set *<b>ok</b> to true and return the number of seconds in
  1880.  * the provided interval.  Otherwise, set *<b>ok</b> to 0 and return -1.
  1881.  */
  1882. static int
  1883. config_parse_interval(const char *s, int *ok)
  1884. {
  1885.   uint64_t r;
  1886.   r = config_parse_units(s, time_units, ok);
  1887.   if (!ok)
  1888.     return -1;
  1889.   if (r > INT_MAX) {
  1890.     log_warn(LD_CONFIG, "Interval '%s' is too long", s);
  1891.     *ok = 0;
  1892.     return -1;
  1893.   }
  1894.   return (int)r;
  1895. }
  1896. /* This is what passes for version detection on OSX.  We set
  1897.  * MACOSX_KQUEUE_IS_BROKEN to true iff we're on a version of OSX before
  1898.  * 10.4.0 (aka 1040). */
  1899. #ifdef __APPLE__
  1900. #ifdef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
  1901. #define MACOSX_KQUEUE_IS_BROKEN 
  1902.   (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1040)
  1903. #else
  1904. #define MACOSX_KQUEUE_IS_BROKEN 0
  1905. #endif
  1906. #endif
  1907. /**
  1908.  * Initialize the libevent library.
  1909.  */
  1910. static void
  1911. init_libevent(void)
  1912. {
  1913.   configure_libevent_logging();
  1914.   /* If the kernel complains that some method (say, epoll) doesn't
  1915.    * exist, we don't care about it, since libevent will cope.
  1916.    */
  1917.   suppress_libevent_log_msg("Function not implemented");
  1918. #ifdef __APPLE__
  1919.   if (MACOSX_KQUEUE_IS_BROKEN ||
  1920.       decode_libevent_version(event_get_version(), NULL) < LE_11B) {
  1921.     setenv("EVENT_NOKQUEUE","1",1);
  1922.   }
  1923. #endif
  1924.   /* In libevent versions before 2.0, it's hard to keep binary compatibility
  1925.    * between upgrades, and unpleasant to detect when the version we compiled
  1926.    * against is unlike the version we have linked against. Here's how. */
  1927. #if defined(_EVENT_VERSION) && defined(HAVE_EVENT_GET_VERSION)
  1928.   /* We have a header-file version and a function-call version. Easy. */
  1929.   if (strcmp(_EVENT_VERSION, event_get_version())) {
  1930.     int compat1 = -1, compat2 = -1;
  1931.     int verybad, prettybad ;
  1932.     decode_libevent_version(_EVENT_VERSION, &compat1);
  1933.     decode_libevent_version(event_get_version(), &compat2);
  1934.     verybad = compat1 != compat2;
  1935.     prettybad = (compat1 == -1 || compat2 == -1) && compat1 != compat2;
  1936.     log(verybad ? LOG_WARN : (prettybad ? LOG_NOTICE : LOG_INFO),
  1937.         LD_GENERAL, "We were compiled with headers from version %s "
  1938.         "of Libevent, but we're using a Libevent library that says it's "
  1939.         "version %s.", _EVENT_VERSION, event_get_version());
  1940.     if (verybad)
  1941.       log_warn(LD_GENERAL, "This will almost certainly make Tor crash.");
  1942.     else if (prettybad)
  1943.       log_notice(LD_GENERAL, "If Tor crashes, this might be why.");
  1944.     else
  1945.       log_info(LD_GENERAL, "I think these versions are binary-compatible.");
  1946.   }
  1947. #elif defined(HAVE_EVENT_GET_VERSION)
  1948.   /* event_get_version but no _EVENT_VERSION.  We might be in 1.4.0-beta or
  1949.      earlier, where that's normal.  To see whether we were compiled with an
  1950.      earlier version, let's see whether the struct event defines MIN_HEAP_IDX.
  1951.   */
  1952. #ifdef HAVE_STRUCT_EVENT_MIN_HEAP_IDX
  1953.   /* The header files are 1.4.0-beta or later. If the version is not
  1954.    * 1.4.0-beta, we are incompatible. */
  1955.   {
  1956.     if (strcmp(event_get_version(), "1.4.0-beta")) {
  1957.       log_warn(LD_GENERAL, "It's a little hard to tell, but you seem to have "
  1958.                "Libevent 1.4.0-beta header files, whereas you have linked "
  1959.                "against Libevent %s.  This will probably make Tor crash.",
  1960.                event_get_version());
  1961.     }
  1962.   }
  1963. #else
  1964.   /* Our headers are 1.3e or earlier. If the library version is not 1.4.x or
  1965.      later, we're probably fine. */
  1966.   {
  1967.     const char *v = event_get_version();
  1968.     if ((v[0] == '1' && v[2] == '.' && v[3] > '3') || v[0] > '1') {
  1969.       log_warn(LD_GENERAL, "It's a little hard to tell, but you seem to have "
  1970.                "Libevent header file from 1.3e or earlier, whereas you have "
  1971.                "linked against Libevent %s.  This will probably make Tor "
  1972.                "crash.", event_get_version());
  1973.     }
  1974.   }
  1975. #endif
  1976. #elif defined(_EVENT_VERSION)
  1977. #warn "_EVENT_VERSION is defined but not get_event_version(): Libevent is odd."
  1978. #else
  1979.   /* Your libevent is ancient. */
  1980. #endif
  1981.   event_init();
  1982.   suppress_libevent_log_msg(NULL);
  1983. #if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD)
  1984.   /* Making this a NOTICE for now so we can link bugs to a libevent versions
  1985.    * or methods better. */
  1986.   log(LOG_NOTICE, LD_GENERAL,
  1987.       "Initialized libevent version %s using method %s. Good.",
  1988.       event_get_version(), event_get_method());
  1989.   check_libevent_version(event_get_method(), get_options()->ORPort != 0);
  1990. #else
  1991.   log(LOG_NOTICE, LD_GENERAL,
  1992.       "Initialized old libevent (version 1.0b or earlier).");
  1993.   log(LOG_WARN, LD_GENERAL,
  1994.       "You have a *VERY* old version of libevent.  It is likely to be buggy; "
  1995.       "please build Tor with a more recent version.");
  1996. #endif
  1997. }
  1998. /** Table mapping return value of event_get_version() to le_version_t. */
  1999. static const struct {
  2000.   const char *name; le_version_t version; int bincompat;
  2001. } le_version_table[] = {
  2002.   /* earlier versions don't have get_version. */
  2003.   { "1.0c", LE_10C, 1},
  2004.   { "1.0d", LE_10D, 1},
  2005.   { "1.0e", LE_10E, 1},
  2006.   { "1.1",  LE_11,  1 },
  2007.   { "1.1a", LE_11A, 1 },
  2008.   { "1.1b", LE_11B, 1 },
  2009.   { "1.2",  LE_12,  1 },
  2010.   { "1.2a", LE_12A, 1 },
  2011.   { "1.3",  LE_13,  1 },
  2012.   { "1.3a", LE_13A, 1 },
  2013.   { "1.3b", LE_13B, 1 },
  2014.   { "1.3c", LE_13C, 1 },
  2015.   { "1.3d", LE_13D, 1 },
  2016.   { "1.3e", LE_13E, 1 },
  2017.   { "1.4.0-beta", LE_140, 2 },
  2018.   { "1.4.1-beta", LE_141, 2 },
  2019.   { "1.4.2-rc",   LE_142, 2 },
  2020.   { "1.4.3-stable", LE_143, 2 },
  2021.   { "1.4.4-stable", LE_144, 2 },
  2022.   { "1.4.5-stable", LE_145, 2 },
  2023.   { "1.4.6-stable", LE_146, 2 },
  2024.   { "1.4.7-stable", LE_147, 2 },
  2025.   { "1.4.8-stable", LE_148, 2 },
  2026.   { "1.4.99-trunk", LE_1499, 3 },
  2027.   { NULL, LE_OTHER, 0 }
  2028. };
  2029. /** Return the le_version_t for the current version of libevent.  If the
  2030.  * version is very new, return LE_OTHER.  If the version is so old that it
  2031.  * doesn't support event_get_version(), return LE_OLD. */
  2032. static le_version_t
  2033. decode_libevent_version(const char *v, int *bincompat_out)
  2034. {
  2035.   int i;
  2036.   for (i=0; le_version_table[i].name; ++i) {
  2037.     if (!strcmp(le_version_table[i].name, v)) {
  2038.       if (bincompat_out)
  2039.         *bincompat_out = le_version_table[i].bincompat;
  2040.       return le_version_table[i].version;
  2041.     }
  2042.   }
  2043.   if (v[0] != '1' && bincompat_out)
  2044.     *bincompat_out = 100;
  2045.   else if (!strcmpstart(v, "1.4") && bincompat_out)
  2046.     *bincompat_out = 2;
  2047.   return LE_OTHER;
  2048. }
  2049. #if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD)
  2050. /**
  2051.  * Compare the given libevent method and version to a list of versions
  2052.  * which are known not to work.  Warn the user as appropriate.
  2053.  */
  2054. static void
  2055. check_libevent_version(const char *m, int server)
  2056. {
  2057.   int buggy = 0, iffy = 0, slow = 0, thread_unsafe = 0;
  2058.   le_version_t version;
  2059.   const char *v = event_get_version();
  2060.   const char *badness = NULL;
  2061.   const char *sad_os = "";
  2062.   version = decode_libevent_version(v, NULL);
  2063.   /* XXX Would it be worthwhile disabling the methods that we know
  2064.    * are buggy, rather than just warning about them and then proceeding
  2065.    * to use them? If so, we should probably not wrap this whole thing
  2066.    * in HAVE_EVENT_GET_VERSION and HAVE_EVENT_GET_METHOD. -RD */
  2067.   /* XXXX The problem is that it's not trivial to get libevent to change it's
  2068.    * method once it's initialized, and it's not trivial to tell what method it
  2069.    * will use without initializing it.  I guess we could preemptively disable
  2070.    * buggy libevent modes based on the version _before_ initializing it,
  2071.    * though, but then there's no good way (afaict) to warn "I would have used
  2072.    * kqueue, but instead I'm using select." -NM */
  2073.   if (!strcmp(m, "kqueue")) {
  2074.     if (version < LE_11B)
  2075.       buggy = 1;
  2076.   } else if (!strcmp(m, "epoll")) {
  2077.     if (version < LE_11)
  2078.       iffy = 1;
  2079.   } else if (!strcmp(m, "poll")) {
  2080.     if (version < LE_10E)
  2081.       buggy = 1;
  2082.     else if (version < LE_11)
  2083.       slow = 1;
  2084.   } else if (!strcmp(m, "select")) {
  2085.     if (version < LE_11)
  2086.       slow = 1;
  2087.   } else if (!strcmp(m, "win32")) {
  2088.     if (version < LE_11B)
  2089.       buggy = 1;
  2090.   }
  2091.   /* Libevent versions before 1.3b do very badly on operating systems with
  2092.    * user-space threading implementations. */
  2093. #if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
  2094.   if (server && version < LE_13B) {
  2095.     thread_unsafe = 1;
  2096.     sad_os = "BSD variants";
  2097.   }
  2098. #elif defined(__APPLE__) || defined(__darwin__)
  2099.   if (server && version < LE_13B) {
  2100.     thread_unsafe = 1;
  2101.     sad_os = "Mac OS X";
  2102.   }
  2103. #endif
  2104.   if (thread_unsafe) {
  2105.     log(LOG_WARN, LD_GENERAL,
  2106.         "Libevent version %s often crashes when running a Tor server with %s. "
  2107.         "Please use the latest version of libevent (1.3b or later)",v,sad_os);
  2108.     badness = "BROKEN";
  2109.   } else if (buggy) {
  2110.     log(LOG_WARN, LD_GENERAL,
  2111.         "There are serious bugs in using %s with libevent %s. "
  2112.         "Please use the latest version of libevent.", m, v);
  2113.     badness = "BROKEN";
  2114.   } else if (iffy) {
  2115.     log(LOG_WARN, LD_GENERAL,
  2116.         "There are minor bugs in using %s with libevent %s. "
  2117.         "You may want to use the latest version of libevent.", m, v);
  2118.     badness = "BUGGY";
  2119.   } else if (slow && server) {
  2120.     log(LOG_WARN, LD_GENERAL,
  2121.         "libevent %s can be very slow with %s. "
  2122.         "When running a server, please use the latest version of libevent.",
  2123.         v,m);
  2124.     badness = "SLOW";
  2125.   }
  2126.   if (badness) {
  2127.     control_event_general_status(LOG_WARN,
  2128.         "BAD_LIBEVENT VERSION=%s METHOD=%s BADNESS=%s RECOVERED=NO",
  2129.                                  v, m, badness);
  2130.   }
  2131. }
  2132. #endif
  2133. /** Return the persistent state struct for this Tor. */
  2134. or_state_t *
  2135. get_or_state(void)
  2136. {
  2137.   tor_assert(global_state);
  2138.   return global_state;
  2139. }
  2140. /** Return a newly allocated string holding a filename relative to the data
  2141.  * directory.  If <b>sub1</b> is present, it is the first path component after
  2142.  * the data directory.  If <b>sub2</b> is also present, it is the second path
  2143.  * component after the data directory.  If <b>suffix</b> is present, it
  2144.  * is appended to the filename.
  2145.  *
  2146.  * Examples:
  2147.  *    get_datadir_fname2_suffix("a", NULL, NULL) -> $DATADIR/a
  2148.  *    get_datadir_fname2_suffix("a", NULL, ".tmp") -> $DATADIR/a.tmp
  2149.  *    get_datadir_fname2_suffix("a", "b", ".tmp") -> $DATADIR/a/b/.tmp
  2150.  *    get_datadir_fname2_suffix("a", "b", NULL) -> $DATADIR/a/b
  2151.  *
  2152.  * Note: Consider using the get_datadir_fname* macros in or.h.
  2153.  */
  2154. char *
  2155. options_get_datadir_fname2_suffix(or_options_t *options,
  2156.                                   const char *sub1, const char *sub2,
  2157.                                   const char *suffix)
  2158. {
  2159.   char *fname = NULL;
  2160.   size_t len;
  2161.   tor_assert(options);
  2162.   tor_assert(options->DataDirectory);
  2163.   tor_assert(sub1 || !sub2); /* If sub2 is present, sub1 must be present. */
  2164.   len = strlen(options->DataDirectory);
  2165.   if (sub1) {
  2166.     len += strlen(sub1)+1;
  2167.     if (sub2)
  2168.       len += strlen(sub2)+1;
  2169.   }
  2170.   if (suffix)
  2171.     len += strlen(suffix);
  2172.   len++;
  2173.   fname = tor_malloc(len);
  2174.   if (sub1) {
  2175.     if (sub2) {
  2176.       tor_snprintf(fname, len, "%s"PATH_SEPARATOR"%s"PATH_SEPARATOR"%s",
  2177.                    options->DataDirectory, sub1, sub2);
  2178.     } else {
  2179.       tor_snprintf(fname, len, "%s"PATH_SEPARATOR"%s",
  2180.                    options->DataDirectory, sub1);
  2181.     }
  2182.   } else {
  2183.     strlcpy(fname, options->DataDirectory, len);
  2184.   }
  2185.   if (suffix)
  2186.     strlcat(fname, suffix, len);
  2187.   return fname;
  2188. }
  2189. /** Return 0 if every setting in <b>state</b> is reasonable, and a
  2190.  * permissible transition from <b>old_state</b>.  Else warn and return -1.
  2191.  * Should have no side effects, except for normalizing the contents of
  2192.  * <b>state</b>.
  2193.  */
  2194. /* XXX from_setconf is here because of bug 238 */
  2195. static int
  2196. or_state_validate(or_state_t *old_state, or_state_t *state,
  2197.                   int from_setconf, char **msg)
  2198. {
  2199.   /* We don't use these; only options do. Still, we need to match that
  2200.    * signature. */
  2201.   (void) from_setconf;
  2202.   (void) old_state;
  2203.   if (entry_guards_parse_state(state, 0, msg)<0)
  2204.     return -1;
  2205.   return 0;
  2206. }
  2207. /** Replace the current persistent state with <b>new_state</b> */
  2208. static void
  2209. or_state_set(or_state_t *new_state)
  2210. {
  2211.   char *err = NULL;
  2212.   tor_assert(new_state);
  2213.   if (global_state)
  2214.     config_free(&state_format, global_state);
  2215.   global_state = new_state;
  2216.   if (entry_guards_parse_state(global_state, 1, &err)<0) {
  2217.     log_warn(LD_GENERAL,"%s",err);
  2218.     tor_free(err);
  2219.   }
  2220.   if (rep_hist_load_state(global_state, &err)<0) {
  2221.     log_warn(LD_GENERAL,"Unparseable bandwidth history state: %s",err);
  2222.     tor_free(err);
  2223.   }
  2224. }
  2225. /** Reload the persistent state from disk, generating a new state as needed.
  2226.  * Return 0 on success, less than 0 on failure.
  2227.  */
  2228. static int
  2229. or_state_load(void)
  2230. {
  2231.   or_state_t *new_state = NULL;
  2232.   char *contents = NULL, *fname;
  2233.   char *errmsg = NULL;
  2234.   int r = -1, badstate = 0;
  2235.   fname = get_datadir_fname("state");
  2236.   switch (file_status(fname)) {
  2237.     case FN_FILE:
  2238.       if (!(contents = read_file_to_str(fname, 0, NULL))) {
  2239.         log_warn(LD_FS, "Unable to read state file "%s"", fname);
  2240.         goto done;
  2241.       }
  2242.       break;
  2243.     case FN_NOENT:
  2244.       break;
  2245.     case FN_ERROR:
  2246.     case FN_DIR:
  2247.     default:
  2248.       log_warn(LD_GENERAL,"State file "%s" is not a file? Failing.", fname);
  2249.       goto done;
  2250.   }
  2251.   new_state = tor_malloc_zero(sizeof(or_state_t));
  2252.   new_state->_magic = OR_STATE_MAGIC;
  2253.   config_init(&state_format, new_state);
  2254.   if (contents) {
  2255.     config_line_t *lines=NULL;
  2256.     int assign_retval;
  2257.     if (config_get_lines(contents, &lines)<0)
  2258.       goto done;
  2259.     assign_retval = config_assign(&state_format, new_state,
  2260.                                   lines, 0, 0, &errmsg);
  2261.     config_free_lines(lines);
  2262.     if (assign_retval<0)
  2263.       badstate = 1;
  2264.     if (errmsg) {
  2265.       log_warn(LD_GENERAL, "%s", errmsg);
  2266.       tor_free(errmsg);
  2267.     }
  2268.   }
  2269.   if (!badstate && or_state_validate(NULL, new_state, 1, &errmsg) < 0)
  2270.     badstate = 1;
  2271.   if (errmsg) {
  2272.     log_warn(LD_GENERAL, "%s", errmsg);
  2273.     tor_free(errmsg);
  2274.   }
  2275.   if (badstate && !contents) {
  2276.     log_warn(LD_BUG, "Uh oh.  We couldn't even validate our own default state."
  2277.              " This is a bug in Tor.");
  2278.     goto done;
  2279.   } else if (badstate && contents) {
  2280.     int i;
  2281.     file_status_t status;
  2282.     size_t len = strlen(fname)+16;
  2283.     char *fname2 = tor_malloc(len);
  2284.     for (i = 0; i < 100; ++i) {
  2285.       tor_snprintf(fname2, len, "%s.%d", fname, i);
  2286.       status = file_status(fname2);
  2287.       if (status == FN_NOENT)
  2288.         break;
  2289.     }
  2290.     if (i == 100) {
  2291.       log_warn(LD_BUG, "Unable to parse state in "%s"; too many saved bad "
  2292.                "state files to move aside. Discarding the old state file.",
  2293.                fname);
  2294.       unlink(fname);
  2295.     } else {
  2296.       log_warn(LD_BUG, "Unable to parse state in "%s". Moving it aside "
  2297.                "to "%s".  This could be a bug in Tor; please tell "
  2298.                "the developers.", fname, fname2);
  2299.       if (rename(fname, fname2) < 0) {
  2300.         log_warn(LD_BUG, "Weirdly, I couldn't even move the state aside. The "
  2301.                  "OS gave an error of %s", strerror(errno));
  2302.       }
  2303.     }
  2304.     tor_free(fname2);
  2305.     tor_free(contents);
  2306.     config_free(&state_format, new_state);
  2307.     new_state = tor_malloc_zero(sizeof(or_state_t));
  2308.     new_state->_magic = OR_STATE_MAGIC;
  2309.     config_init(&state_format, new_state);
  2310.   } else if (contents) {
  2311.     log_info(LD_GENERAL, "Loaded state from "%s"", fname);
  2312.   } else {
  2313.     log_info(LD_GENERAL, "Initialized state");
  2314.   }
  2315.   or_state_set(new_state);
  2316.   new_state = NULL;
  2317.   if (!contents) {
  2318.     global_state->next_write = 0;
  2319.     or_state_save(time(NULL));
  2320.   }
  2321.   r = 0;
  2322.  done:
  2323.   tor_free(fname);
  2324.   tor_free(contents);
  2325.   if (new_state)
  2326.     config_free(&state_format, new_state);
  2327.   return r;
  2328. }
  2329. /** Write the persistent state to disk. Return 0 for success, <0 on failure. */
  2330. int
  2331. or_state_save(time_t now)
  2332. {
  2333.   char *state, *contents;
  2334.   char tbuf[ISO_TIME_LEN+1];
  2335.   size_t len;
  2336.   char *fname;
  2337.   tor_assert(global_state);
  2338.   if (global_state->next_write > now)
  2339.     return 0;
  2340.   /* Call everything else that might dirty the state even more, in order
  2341.    * to avoid redundant writes. */
  2342.   entry_guards_update_state(global_state);
  2343.   rep_hist_update_state(global_state);
  2344.   if (accounting_is_enabled(get_options()))
  2345.     accounting_run_housekeeping(now);
  2346.   global_state->LastWritten = time(NULL);
  2347.   tor_free(global_state->TorVersion);
  2348.   len = strlen(get_version())+8;
  2349.   global_state->TorVersion = tor_malloc(len);
  2350.   tor_snprintf(global_state->TorVersion, len, "Tor %s", get_version());
  2351.   state = config_dump(&state_format, global_state, 1, 0);
  2352.   len = strlen(state)+256;
  2353.   contents = tor_malloc(len);
  2354.   format_local_iso_time(tbuf, time(NULL));
  2355.   tor_snprintf(contents, len,
  2356.                "# Tor state file last generated on %s local timen"
  2357.                "# Other times below are in GMTn"
  2358.                "# You *do not* need to edit this file.nn%s",
  2359.                tbuf, state);
  2360.   tor_free(state);
  2361.   fname = get_datadir_fname("state");
  2362.   if (write_str_to_file(fname, contents, 0)<0) {
  2363.     log_warn(LD_FS, "Unable to write state to file "%s"", fname);
  2364.     tor_free(fname);
  2365.     tor_free(contents);
  2366.     return -1;
  2367.   }
  2368.   log_info(LD_GENERAL, "Saved state to "%s"", fname);
  2369.   tor_free(fname);
  2370.   tor_free(contents);
  2371.   global_state->next_write = TIME_MAX;
  2372.   return 0;
  2373. }
  2374. /** Given a file name check to see whether the file exists but has not been
  2375.  * modified for a very long time.  If so, remove it. */
  2376. void
  2377. remove_file_if_very_old(const char *fname, time_t now)
  2378. {
  2379. #define VERY_OLD_FILE_AGE (28*24*60*60)
  2380.   struct stat st;
  2381.   if (stat(fname, &st)==0 && st.st_mtime < now-VERY_OLD_FILE_AGE) {
  2382.     char buf[ISO_TIME_LEN+1];
  2383.     format_local_iso_time(buf, st.st_mtime);
  2384.     log_notice(LD_GENERAL, "Obsolete file %s hasn't been modified since %s. "
  2385.                "Removing it.", fname, buf);
  2386.     unlink(fname);
  2387.   }
  2388. }
  2389. /** Helper to implement GETINFO functions about configuration variables (not
  2390.  * their values).  Given a "config/names" question, set *<b>answer</b> to a
  2391.  * new string describing the supported configuration variables and their
  2392.  * types. */
  2393. int
  2394. getinfo_helper_config(control_connection_t *conn,
  2395.                       const char *question, char **answer)
  2396. {
  2397.   (void) conn;
  2398.   if (!strcmp(question, "config/names")) {
  2399.     smartlist_t *sl = smartlist_create();
  2400.     int i;
  2401.     for (i = 0; _option_vars[i].name; ++i) {
  2402.       config_var_t *var = &_option_vars[i];
  2403.       const char *type, *desc;
  2404.       char *line;
  2405.       size_t len;
  2406.       desc = config_find_description(&options_format, var->name);
  2407.       switch (var->type) {
  2408.         case CONFIG_TYPE_STRING: type = "String"; break;
  2409.         case CONFIG_TYPE_FILENAME: type = "Filename"; break;
  2410.         case CONFIG_TYPE_UINT: type = "Integer"; break;
  2411.         case CONFIG_TYPE_INTERVAL: type = "TimeInterval"; break;
  2412.         case CONFIG_TYPE_MEMUNIT: type = "DataSize"; break;
  2413.         case CONFIG_TYPE_DOUBLE: type = "Float"; break;
  2414.         case CONFIG_TYPE_BOOL: type = "Boolean"; break;
  2415.         case CONFIG_TYPE_ISOTIME: type = "Time"; break;
  2416.         case CONFIG_TYPE_ROUTERSET: type = "RouterList"; break;
  2417.         case CONFIG_TYPE_CSV: type = "CommaList"; break;
  2418.         case CONFIG_TYPE_LINELIST: type = "LineList"; break;
  2419.         case CONFIG_TYPE_LINELIST_S: type = "Dependant"; break;
  2420.         case CONFIG_TYPE_LINELIST_V: type = "Virtual"; break;
  2421.         default:
  2422.         case CONFIG_TYPE_OBSOLETE:
  2423.           type = NULL; break;
  2424.       }
  2425.       if (!type)
  2426.         continue;
  2427.       len = strlen(var->name)+strlen(type)+16;
  2428.       if (desc)
  2429.         len += strlen(desc);
  2430.       line = tor_malloc(len);
  2431.       if (desc)
  2432.         tor_snprintf(line, len, "%s %s %sn",var->name,type,desc);
  2433.       else
  2434.         tor_snprintf(line, len, "%s %sn",var->name,type);
  2435.       smartlist_add(sl, line);
  2436.     }
  2437.     *answer = smartlist_join_strings(sl, "", 0, NULL);
  2438.     SMARTLIST_FOREACH(sl, char *, c, tor_free(c));
  2439.     smartlist_free(sl);
  2440.   }
  2441.   return 0;
  2442. }