+ }
+ h->bind_task = GNUNET_SCHEDULER_add_now (&add_from_bind, h);
+ if (GNUNET_OK ==
+ GNUNET_CONFIGURATION_have_value (cfg, "nat", "INTERNAL_ADDRESS"))
+ {
+ (void) GNUNET_CONFIGURATION_get_value_string (cfg, "nat",
+ "INTERNAL_ADDRESS",
+ &h->internal_address);
+ }
+ if ((h->internal_address != NULL) &&
+ (inet_pton (AF_INET, h->internal_address, &in_addr) != 1))
+ {
+ GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING,
+ "nat", "INTERNAL_ADDRESS",
+ _("malformed"));
+ GNUNET_free (h->internal_address);
+ h->internal_address = NULL;
+ }
+
+ if (GNUNET_OK ==
+ GNUNET_CONFIGURATION_have_value (cfg, "nat", "EXTERNAL_ADDRESS"))
+ {
+ (void) GNUNET_CONFIGURATION_get_value_string (cfg, "nat",
+ "EXTERNAL_ADDRESS",
+ &h->external_address);
+ }
+ h->behind_nat =
+ GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "BEHIND_NAT");
+ h->nat_punched =
+ GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "PUNCHED_NAT");
+ h->enable_nat_client =
+ GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "ENABLE_ICMP_CLIENT");
+ h->enable_nat_server =
+ GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "ENABLE_ICMP_SERVER");
+ h->enable_upnp =
+ GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "ENABLE_UPNP");
+ h->use_localaddresses =
+ GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "USE_LOCALADDR");
+ h->return_localaddress =
+ GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat",
+ "RETURN_LOCAL_ADDRESSES");
+
+ h->use_hostname =
+ GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "USE_HOSTNAME");
+ h->disable_ipv6 =
+ GNUNET_CONFIGURATION_get_value_yesno (cfg, "nat", "DISABLEV6");
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_time (cfg, "nat", "DYNDNS_FREQUENCY",
+ &h->dyndns_frequency))
+ h->dyndns_frequency = DYNDNS_FREQUENCY;
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_time (cfg, "nat", "IFC_SCAN_FREQUENCY",
+ &h->ifc_scan_frequency))
+ h->ifc_scan_frequency = IFC_SCAN_FREQUENCY;
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_time (cfg, "nat", "HOSTNAME_DNS_FREQUENCY",
+ &h->hostname_dns_frequency))
+ h->hostname_dns_frequency = HOSTNAME_DNS_FREQUENCY;
+
+ if (NULL == reversal_callback)
+ h->enable_nat_server = GNUNET_NO;
+
+ /* Check if NAT was hole-punched */
+ if ((NULL != h->address_callback) && (h->external_address != NULL) &&
+ (h->nat_punched == GNUNET_YES))
+ {
+ h->dns_task = GNUNET_SCHEDULER_add_now (&resolve_dns, h);
+ h->enable_nat_server = GNUNET_NO;
+ h->enable_upnp = GNUNET_NO;
+ }
+
+ /* Test for SUID binaries */
+ binary = GNUNET_OS_get_libexec_binary_path ("gnunet-helper-nat-server");
+ if ((h->behind_nat == GNUNET_YES) && (GNUNET_YES == h->enable_nat_server) &&
+ (GNUNET_YES !=
+ GNUNET_OS_check_helper_binary (binary)))
+ {
+ h->enable_nat_server = GNUNET_NO;
+ LOG (GNUNET_ERROR_TYPE_WARNING,
+ _
+ ("Configuration requires `%s', but binary is not installed properly (SUID bit not set). Option disabled.\n"),
+ "gnunet-helper-nat-server");
+ }
+ GNUNET_free (binary);
+ binary = GNUNET_OS_get_libexec_binary_path ("gnunet-helper-nat-client");
+ if ((GNUNET_YES == h->enable_nat_client) &&
+ (GNUNET_YES !=
+ GNUNET_OS_check_helper_binary (binary)))
+ {
+ h->enable_nat_client = GNUNET_NO;
+ LOG (GNUNET_ERROR_TYPE_WARNING,
+ _
+ ("Configuration requires `%s', but binary is not installed properly (SUID bit not set). Option disabled.\n"),
+ "gnunet-helper-nat-client");
+ }
+ GNUNET_free (binary);
+ start_gnunet_nat_server (h);
+
+ /* FIXME: add support for UPnP, etc */
+
+ if (NULL != h->address_callback)
+ {
+ h->ifc_task = GNUNET_SCHEDULER_add_now (&list_interfaces, h);
+ if (GNUNET_YES == h->use_hostname)
+ h->hostname_task = GNUNET_SCHEDULER_add_now (&resolve_hostname, h);
+ }
+