/* Run this at startup. * * return allocated instance of tox on success. * return 0 if there are problems. */ Tox *tox_new(Tox_Options *options) { LOGGER_INIT(LOGGER_OUTPUT_FILE, LOGGER_LEVEL); Messenger_Options m_options = {0}; if (options == NULL) { m_options.ipv6enabled = TOX_ENABLE_IPV6_DEFAULT; } else { m_options.ipv6enabled = options->ipv6enabled; m_options.udp_disabled = options->udp_disabled; m_options.proxy_enabled = options->proxy_enabled; if (m_options.proxy_enabled) { ip_init(&m_options.proxy_info.ip_port.ip, m_options.ipv6enabled); if (m_options.ipv6enabled) m_options.proxy_info.ip_port.ip.family = AF_UNSPEC; if (!addr_resolve_or_parse_ip(options->proxy_address, &m_options.proxy_info.ip_port.ip, NULL)) return NULL; m_options.proxy_info.ip_port.port = htons(options->proxy_port); } } return new_messenger(&m_options); }
/* TODO: expose this properly. */ static int tox_add_tcp_relay(Tox *tox, const char *address, uint8_t ipv6enabled, uint16_t port, uint8_t *public_key) { Messenger *m = tox; IP_Port ip_port_v64; IP *ip_extra = NULL; IP_Port ip_port_v4; ip_init(&ip_port_v64.ip, ipv6enabled); if (ipv6enabled) { /* setup for getting BOTH: an IPv6 AND an IPv4 address */ ip_port_v64.ip.family = AF_UNSPEC; ip_reset(&ip_port_v4.ip); ip_extra = &ip_port_v4.ip; } if (addr_resolve_or_parse_ip(address, &ip_port_v64.ip, ip_extra)) { ip_port_v64.port = port; add_tcp_relay(m->net_crypto, ip_port_v64, public_key); return 1; } else { return 0; } }