123#define parse_server_method_error(l) parse_method_error(l, 1)
124#define parse_client_method_error(l) parse_method_error(l, 0)
127#define PROTO_ENV_ERROR "ENV-ERROR"
128#define PROTO_NEG_SUCCESS "VERSION"
129#define PROTO_NEG_FAIL "VERSION-ERROR no-version"
130#define PROTO_CMETHOD "CMETHOD"
131#define PROTO_SMETHOD "SMETHOD"
132#define PROTO_CMETHOD_ERROR "CMETHOD-ERROR"
133#define PROTO_SMETHOD_ERROR "SMETHOD-ERROR"
134#define PROTO_CMETHODS_DONE "CMETHODS DONE"
135#define PROTO_SMETHODS_DONE "SMETHODS DONE"
136#define PROTO_PROXY_DONE "PROXY DONE"
137#define PROTO_PROXY_ERROR "PROXY-ERROR"
138#define PROTO_LOG "LOG"
139#define PROTO_STATUS "STATUS"
143#define PROTO_VERSION_ONE 1
153 const char *
name,
int socks_ver,
154 const char *extra_info_args)
199 if (t->marked_for_removal) {
203 } SMARTLIST_FOREACH_END(t);
225 new_transport = tor_malloc_zero(
sizeof(
transport_t));
228 new_transport->
name = tor_strdup(transport->
name);
230 new_transport->
port = transport->
port;
233 return new_transport;
247 if (!strcmp(transport->name,
name))
249 } SMARTLIST_FOREACH_END(transport);
287 char *new_transport_addrport =
290 log_notice(
LD_GENERAL,
"You tried to add transport '%s' at '%s' "
291 "but there was already a transport marked for deletion at "
292 "'%s'. We deleted the old transport and registered the "
293 "new one.", t->
name, new_transport_addrport,
296 transport_free(t_tmp);
299 log_notice(
LD_GENERAL,
"You tried to add transport '%s' at '%s' "
300 "but the same transport already exists at '%s'. "
301 "Skipping.", t->
name, new_transport_addrport,
342 const char *
name,
int socks_ver))
351 log_notice(
LD_GENERAL,
"Could not add transport %s at %s. Skipping.",
356 log_info(
LD_GENERAL,
"Successfully registered transport %s at %s.",
361 log_info(
LD_GENERAL,
"Successfully registered transport %s at %s.",
387 if (!strcasecmp(
name, transport_name)) {
390 } SMARTLIST_FOREACH_END(
name);
391 } SMARTLIST_FOREACH_END(mp);
416 if (mp->conf_state == PT_PROTO_COMPLETED)
428 char **tmp1=proxy_argv;
429 char **tmp2=mp->argv;
434 while (*tmp1 && *tmp2) {
435 if (strcmp(*tmp1++, *tmp2++))
439 if (!*tmp1 && !*tmp2)
447static managed_proxy_t *
455 mp->is_server == is_server)
457 } SMARTLIST_FOREACH_END(mp);
485 if (
strcmp_opt(proxy_uri, mp->proxy_uri) != 0)
496 tor_assert(smartlist_len(mp->transports_to_launch) > 0);
497 if (BUG(mp->conf_state != PT_PROTO_COMPLETED)) {
501 if (smartlist_len(mp->transports_to_launch) != smartlist_len(mp->transports))
508 } SMARTLIST_FOREACH_END(t);
526 static ratelim_t log_died_lim = RATELIM_INIT(300);
528 "Managed proxy at '%s' died in state %s", mp->argv[0],
529 managed_proxy_state_to_string(mp->conf_state));
535 log_notice(
LD_CONFIG,
"Managed proxy \"%s\" having PID %" PRIu64
" "
536 "is being terminated...", mp->argv[0],
552 } SMARTLIST_FOREACH_END(t);
562 mp->proxy_supported = 0;
564 if (mp->conf_state == PT_PROTO_COMPLETED)
594 for (
int i = 1; mp->argv[i] != NULL; ++i)
598 log_warn(
LD_CONFIG,
"Managed proxy at '%s' failed at launch.",
604 "Managed proxy at '%s' has spawned with PID '%" PRIu64
"'.",
616 int at_least_a_proxy_config_finished = 0;
619 log_debug(
LD_CONFIG,
"Configuring remaining managed proxies (%d)!",
629 tor_assert(mp->conf_state != PT_PROTO_BROKEN &&
630 mp->conf_state != PT_PROTO_FAILED_LAUNCH);
632 if (mp->was_around_before_config_read) {
636 mp->was_around_before_config_read = 0;
639 log_info(
LD_GENERAL,
"Preparing managed proxy '%s' for restart.",
643 log_info(
LD_GENERAL,
"Nothing changed for managed proxy '%s' after "
644 "HUP: not restarting.", mp->argv[0]);
654 at_least_a_proxy_config_finished = 1;
656 } SMARTLIST_FOREACH_END(mp);
662 if (at_least_a_proxy_config_finished)
670 managed_proxy_t *mp = v;
675 if (BUG(mp->conf_state != PT_PROTO_WAITING)) {
693 if (mp->conf_state == PT_PROTO_INFANT) {
694 const struct timeval delay_tv = { 1, 0 };
695 if (!mp->process_launch_ev) {
704 tor_assert(mp->conf_state != PT_PROTO_INFANT);
706 return mp->conf_state == PT_PROTO_COMPLETED;
713 tor_assert(mp->conf_state != PT_PROTO_COMPLETED);
717 log_notice(
LD_GENERAL,
"Registered server transport '%s' at '%s'",
720 } SMARTLIST_FOREACH_END(t);
731 tor_assert(mp->conf_state != PT_PROTO_COMPLETED);
738 log_notice(
LD_GENERAL,
"Could not add transport %s. Skipping.", t->name);
739 transport_free(transport_tmp);
742 log_info(
LD_GENERAL,
"Successfully registered transport %s", t->name);
746 log_info(
LD_GENERAL,
"Successfully registered transport %s", t->name);
748 transport_free(transport_tmp);
751 } SMARTLIST_FOREACH_END(t);
767 int also_terminate_process)
772 smartlist_free(mp->transports);
776 smartlist_free(mp->transports_to_launch);
793 if (also_terminate_process && mp->process) {
801 if (mp->process_launch_ev)
802 mainloop_event_free(mp->process_launch_ev);
853 switch (mp->conf_state) {
854 case PT_PROTO_BROKEN:
857 case PT_PROTO_FAILED_LAUNCH:
860 case PT_PROTO_CONFIGURED:
861 if (mp->proxy_uri && !mp->proxy_supported) {
862 log_warn(
LD_CONFIG,
"Managed proxy '%s' did not configure the "
863 "specified outgoing proxy and will be terminated.",
875 case PT_PROTO_INFANT:
876 case PT_PROTO_WAITING:
877 case PT_PROTO_LAUNCHED:
878 case PT_PROTO_ACCEPTING_METHODS:
879 case PT_PROTO_COMPLETED:
881 log_warn(
LD_CONFIG,
"Unexpected state '%d' of managed proxy '%s'.",
882 (
int)mp->conf_state, mp->argv[0]);
894 return (mp->conf_state == PT_PROTO_CONFIGURED ||
895 mp->conf_state == PT_PROTO_BROKEN ||
896 mp->conf_state == PT_PROTO_FAILED_LAUNCH);
905 if (smartlist_len(mp->transports) == 0)
906 log_warn(
LD_GENERAL,
"Managed proxy '%s' was spawned successfully, "
907 "but it didn't launch any pluggable transport listeners!",
910 log_info(
LD_CONFIG,
"%s managed proxy '%s' configuration completed!",
911 mp->is_server ?
"Server" :
"Client",
920 log_info(
LD_PT,
"Got a line from managed proxy '%s': (%s)",
924 if (mp->conf_state != PT_PROTO_LAUNCHED)
930 if (mp->conf_state != PT_PROTO_LAUNCHED)
933 log_warn(
LD_CONFIG,
"Managed proxy could not pick a "
934 "configuration protocol version.");
936 }
else if (!
strcmpstart(line, PROTO_NEG_SUCCESS)) {
937 if (mp->conf_state != PT_PROTO_LAUNCHED)
946 }
else if (!
strcmpstart(line, PROTO_CMETHODS_DONE)) {
947 if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
954 }
else if (!
strcmpstart(line, PROTO_SMETHODS_DONE)) {
955 if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
962 }
else if (!
strcmpstart(line, PROTO_CMETHOD_ERROR)) {
963 if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
973 parse_client_method_error(line);
975 }
else if (!
strcmpstart(line, PROTO_SMETHOD_ERROR)) {
976 if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
980 parse_server_method_error(line);
983 if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
991 if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
999 if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
1002 if (mp->proxy_uri) {
1003 mp->proxy_supported = 1;
1008 }
else if (!
strcmpstart(line, PROTO_PROXY_ERROR)) {
1009 if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
1022 }
else if (!
strcmpstart(line, PROTO_STATUS
" ")) {
1027 log_notice(
LD_GENERAL,
"Unknown line received by managed proxy (%s).", line);
1032 log_warn(
LD_CONFIG,
"Managed proxy at '%s' failed the configuration protocol"
1033 " and will be destroyed.", mp->argv[0]);
1043 log_notice(
LD_CONFIG,
"Managed proxy sent us an %s without an error "
1046 log_warn(
LD_CONFIG,
"Managed proxy couldn't understand the "
1047 "pluggable transport environment variables. (%s)",
1056 if (strlen(line) < (strlen(PROTO_NEG_SUCCESS) + 2)) {
1057 log_warn(
LD_CONFIG,
"Managed proxy sent us malformed %s line.",
1062 if (strcmp(
"1", line+strlen(PROTO_NEG_SUCCESS)+1)) {
1063 log_warn(
LD_CONFIG,
"Managed proxy tried to negotiate on version '%s'. "
1064 "We only support version '1'", line+strlen(PROTO_NEG_SUCCESS)+1);
1078 const char* error = is_server ?
1079 PROTO_SMETHOD_ERROR : PROTO_CMETHOD_ERROR;
1083 if (strlen(line) < (strlen(error) + 2))
1084 log_warn(
LD_CONFIG,
"Managed proxy sent us an %s without an error "
1087 log_warn(
LD_CONFIG,
"%s managed proxy encountered a method error. (%s)",
1088 is_server ?
"Server" :
"Client",
1089 line+strlen(error)+1);
1098 managed_proxy_t *mp,
1104 char *transport_name=NULL;
1105 char *args_string=NULL;
1106 char *addrport=NULL;
1107 int socks_ver=PROXY_NONE;
1111 const char *method_str = is_smethod ? PROTO_SMETHOD : PROTO_CMETHOD;
1112 const int min_args_count = is_smethod ? 3 : 4;
1119 SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
1120 if (smartlist_len(items) < min_args_count) {
1121 log_warn(
LD_CONFIG,
"Managed proxy sent us a %s line "
1122 "with too few arguments.", method_str);
1126 tor_assert(!strcmp(smartlist_get(items, item_index),method_str));
1129 transport_name = smartlist_get(items,item_index);
1132 log_warn(
LD_CONFIG,
"Transport name is not a C identifier (%s).",
1139 const char *socks_ver_str = smartlist_get(items,item_index);
1142 if (!strcmp(socks_ver_str,
"socks4")) {
1143 socks_ver = PROXY_SOCKS4;
1144 }
else if (!strcmp(socks_ver_str,
"socks5")) {
1145 socks_ver = PROXY_SOCKS5;
1147 log_warn(
LD_CONFIG,
"Client managed proxy sent us a proxy protocol "
1148 "we don't recognize. (%s)", socks_ver_str);
1153 addrport = smartlist_get(items, item_index);
1156 log_warn(
LD_CONFIG,
"Error parsing transport address '%s'", addrport);
1162 "Transport address '%s' has no port.", addrport);
1167 log_warn(
LD_CONFIG,
"Error parsing transport address '%s'", address);
1172 if (is_smethod && smartlist_len(items) > min_args_count) {
1175 char *options_string = smartlist_get(items, item_index);
1176 log_debug(
LD_CONFIG,
"Got options_string: %s", options_string);
1178 args_string = options_string+strlen(
"ARGS:");
1179 log_debug(
LD_CONFIG,
"Got ARGS: %s", args_string);
1184 socks_ver, args_string);
1190 log_info(
LD_CONFIG,
"Server transport %s at %s:%d.",
1191 transport_name, address, (
int)port);
1193 log_info(
LD_CONFIG,
"Transport %s at %s:%d with SOCKS %d. "
1194 "Attached to managed proxy.",
1195 transport_name, address, (
int)port, socks_ver);
1206 smartlist_free(items);
1237 if (strlen(line) < (strlen(PROTO_PROXY_ERROR) + 2))
1238 log_notice(
LD_CONFIG,
"Managed proxy sent us an %s without an error "
1239 "message.", PROTO_PROXY_ERROR);
1241 log_warn(
LD_CONFIG,
"Managed proxy failed to configure the "
1242 "pluggable transport's outgoing proxy. (%s)",
1243 line+strlen(PROTO_PROXY_ERROR)+1);
1254 char *log_message = NULL;
1256 if (strlen(line) < (strlen(PROTO_LOG) + 1)) {
1257 log_warn(
LD_PT,
"Managed proxy sent us a %s line "
1258 "with missing argument.", PROTO_LOG);
1262 const char *data = line + strlen(PROTO_LOG) + 1;
1266 log_warn(
LD_PT,
"Managed proxy \"%s\" wrote an invalid LOG message: %s",
1276 log_warn(
LD_PT,
"Managed proxy \"%s\" wrote a LOG line without "
1277 "MESSAGE: %s", mp->argv[0],
escaped(data));
1283 log_warn(
LD_PT,
"Managed proxy \"%s\" wrote a LOG line without "
1284 "SEVERITY: %s", mp->argv[0],
escaped(data));
1290 if (log_severity == -1) {
1291 log_warn(
LD_PT,
"Managed proxy \"%s\" wrote a LOG line with an "
1292 "invalid severity level: %s",
1293 mp->argv[0], severity->value);
1297 tor_log(log_severity,
LD_PT,
"Managed proxy \"%s\": %s",
1298 mp->argv[0], message->value);
1308 config_free_lines(values);
1320 char *status_message = NULL;
1322 if (strlen(line) < (strlen(PROTO_STATUS) + 1)) {
1323 log_warn(
LD_PT,
"Managed proxy sent us a %s line "
1324 "with missing argument.", PROTO_STATUS);
1328 const char *data = line + strlen(PROTO_STATUS) + 1;
1333 log_warn(
LD_PT,
"Managed proxy \"%s\" wrote an invalid "
1334 "STATUS message: %s", mp->argv[0],
escaped(data));
1339 handle_status_message(values, mp);
1350 config_free_lines(values);
1356 managed_proxy_t *mp)
1359 log_warn(
LD_PT,
"Managed proxy \"%s\" has multiple TYPE key which "
1360 "is not allowed.", mp->argv[0]);
1366 if (message_type == NULL) {
1367 log_debug(
LD_PT,
"Managed proxy \"%s\" wrote a STATUS line without "
1368 "a defined message TYPE", mp->argv[0]);
1373 if (! strcasecmp(message_type->value,
"version")) {
1378 if (version == NULL) {
1379 log_warn(
LD_PT,
"Managed proxy \"%s\" wrote a STATUS TYPE=version line "
1380 "with a missing VERSION field", mp->argv[0]);
1384 if (implementation == NULL) {
1385 log_warn(
LD_PT,
"Managed proxy \"%s\" wrote a STATUS TYPE=version line "
1386 "with a missing IMPLEMENTATION field", mp->argv[0]);
1391 mp->version = tor_strdup(version->value);
1394 mp->implementation = tor_strdup(implementation->value);
1406 char *options_string = NULL;
1417 options_tmp_sl = pt_get_options_for_server_transport(transport);
1418 if (!options_tmp_sl)
1426 transport, escaped_opts);
1428 } SMARTLIST_FOREACH_END(options);
1431 smartlist_free(options_tmp_sl);
1432 } SMARTLIST_FOREACH_END(transport);
1434 if (smartlist_len(string_sl)) {
1439 smartlist_free(string_sl);
1441 return options_string;
1451 char *bindaddr_result = NULL;
1452 char *bindaddr_tmp = NULL;
1463 } SMARTLIST_FOREACH_END(t);
1468 smartlist_free(string_tmp);
1470 return bindaddr_result;
1491 char *state_tmp = get_datadir_fname(
"pt_state/");
1499 char *transports_to_launch =
1504 "TOR_PT_SERVER_TRANSPORTS=%s" :
1505 "TOR_PT_CLIENT_TRANSPORTS=%s",
1506 transports_to_launch);
1511 if (mp->is_server) {
1528 char *server_transport_options =
1530 if (server_transport_options) {
1532 server_transport_options);
1533 tor_free(server_transport_options);
1545 char *ext_or_addrport_tmp =
1547 char *cookie_file_loc = get_ext_or_auth_cookie_file_name();
1549 if (ext_or_addrport_tmp) {
1551 ext_or_addrport_tmp);
1553 if (cookie_file_loc) {
1569 if (mp->proxy_uri) {
1593 "TOR_PT_OUTBOUND_BIND_ADDRESS_V4=%s",
1604 "TOR_PT_OUTBOUND_BIND_ADDRESS_V6=[%s]",
1613 } SMARTLIST_FOREACH_END(env_var);
1615 smartlist_free(envs);
1617 return merged_env_vars;
1628 char **proxy_argv,
int is_server)
1630 managed_proxy_t *mp = tor_malloc_zero(
sizeof(managed_proxy_t));
1632 mp->is_server = is_server;
1633 mp->argv = proxy_argv;
1666 char **proxy_argv,
int is_server))
1668 managed_proxy_t *mp=NULL;
1671 if (!proxy_argv || !proxy_argv[0]) {
1681 if (mp->was_around_before_config_read) {
1687 if (mp->marked_for_removal) {
1688 mp->marked_for_removal = 0;
1699 } SMARTLIST_FOREACH_END(transport);
1734 if (mp->conf_state != PT_PROTO_COMPLETED) {
1741 tor_assert(mp->conf_state == PT_PROTO_COMPLETED);
1745 mp->marked_for_removal = 1;
1746 mp->was_around_before_config_read = 1;
1749 } SMARTLIST_FOREACH_END(mp);
1769 if (!mp->is_server || mp->conf_state != PT_PROTO_COMPLETED)
1778 } SMARTLIST_FOREACH_END(mp);
1791 char *the_string = NULL;
1801 if ((!mp->is_server) || (mp->conf_state != PT_PROTO_COMPLETED))
1807 char *transport_args = NULL;
1808 const char *addrport = NULL;
1818 RELAY_FIND_ADDR_NO_FLAG,
1822 RELAY_FIND_ADDR_NO_FLAG, &addr);
1825 log_err(
LD_PT,
"Unable to find address for transport %s", t->name);
1835 if (t->extra_info_args)
1836 tor_asprintf(&transport_args,
" %s", t->extra_info_args);
1839 "transport %s %s%s",
1841 transport_args ? transport_args :
"");
1844 } SMARTLIST_FOREACH_END(t);
1848 char *version = NULL;
1854 if (mp->implementation) {
1855 tor_asprintf(&impl,
" implementation=%s", mp->implementation);
1860 version ? version:
"", impl ? impl:
"");
1864 } SMARTLIST_FOREACH_END(mp);
1866 if (smartlist_len(string_chunks) == 0) {
1867 smartlist_free(string_chunks);
1875 smartlist_free(string_chunks);
1891 log_err(
LD_BUG,
"Error computing fingerprint");
1904 char *transport_args = NULL;
1905 const char *saddr = NULL;
1914 RELAY_FIND_ADDR_NO_FLAG,
1918 RELAY_FIND_ADDR_NO_FLAG, &addr);
1923 saddr =
"<IP ADDRESS>";
1932 if (t->extra_info_args) {
1933 tor_asprintf(&transport_args,
" %s", t->extra_info_args);
1934 for (
int i = 0; transport_args[i]; i++) {
1935 if (transport_args[i] ==
',') {
1936 transport_args[i] =
' ';
1942 t->name, saddr, t->port, fingerprint,
1943 transport_args ? transport_args :
"");
1945 } SMARTLIST_FOREACH_END(t);
1946 } SMARTLIST_FOREACH_END(mp);
1950 if (smartlist_len(string_chunks) != 0) {
1952 char *fname = get_datadir_fname(
"bridgelines");
1953 if (write_str_to_file_if_not_equal(fname, str)) {
1954 log_warn(
LD_FS,
"Couldn't save bridge lines to disk");
1956 log_info(
LD_FS,
"Saved bridge lines to disk");
1963 smartlist_free(string_chunks);
1975 char *escaped_string = NULL;
1976 char *new_string = NULL;
1986 if (!escaped_string)
1990 } SMARTLIST_FOREACH_END(s);
1996 smartlist_free(sl_tmp);
2028 if (mp->marked_for_removal) {
2032 } SMARTLIST_FOREACH_END(mp);
2066 char *new_string = NULL;
2067 char *new_cp = NULL;
2068 size_t length, new_length;
2072 length = strlen(
string);
2075 return tor_strdup(
"");
2078 if (length > (SIZE_MAX - 1)/2)
2082 new_length = (length * 2) + 1;
2084 new_string = new_cp = tor_malloc(new_length);
2087 if (strchr(chars_to_escape, *
string))
2090 *new_cp++ = *
string++;
2137 if (BUG(mp == NULL))
2141 "Managed proxy at '%s' reported via standard error: %s",
2155 const char *
name = mp ? mp->argv[0] :
"N/A";
2158 log_warn(
LD_PT,
"Managed proxy \"%s\" having PID %" PRIu64
" "
2159 "terminated with status code %" PRIu64,
2162 log_notice(
LD_PT,
"Managed proxy \"%s\" having PID %" PRIu64
" "
2193 if (! strcmp(severity,
"debug"))
2196 if (! strcmp(severity,
"info"))
2199 if (! strcmp(severity,
"notice"))
2202 if (! strcmp(severity,
"warning"))
2205 if (! strcmp(severity,
"error"))
2231 tor_assert_unreached();
2255managed_proxy_state_to_string(
enum pt_proto_state state)
2258 case PT_PROTO_INFANT:
2260 case PT_PROTO_WAITING:
2262 case PT_PROTO_LAUNCHED:
2264 case PT_PROTO_ACCEPTING_METHODS:
2265 return "Accepting methods";
2266 case PT_PROTO_CONFIGURED:
2267 return "Configured";
2268 case PT_PROTO_COMPLETED:
2270 case PT_PROTO_BROKEN:
2272 case PT_PROTO_FAILED_LAUNCH:
2273 return "Failed to launch";
2277 tor_assert_unreached();
2287 if (mp->conf_state == new_state)
2292 managed_proxy_state_to_string(mp->conf_state),
2293 managed_proxy_state_to_string(new_state));
2295 mp->conf_state = new_state;
void tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src)
int tor_addr_parse(tor_addr_t *addr, const char *src)
int tor_addr_port_split(int severity, const char *addrport, char **address_out, uint16_t *port_out)
int tor_addr_is_null(const tor_addr_t *addr)
char * tor_addr_to_str_dup(const tor_addr_t *addr)
const char * fmt_addrport(const tor_addr_t *addr, uint16_t port)
const char * tor_addr_to_str(char *dest, const tor_addr_t *addr, size_t len, int decorate)
#define fmt_and_decorate_addr(a)
#define tor_addr_eq(a, b)
const smartlist_t * get_socks_args_by_bridge_addrport(const tor_addr_t *addr, uint16_t port)
Header file for circuitbuild.c.
Header file for circuitbuild.c.
int mainloop_event_schedule(mainloop_event_t *event, const struct timeval *tv)
mainloop_event_t * mainloop_event_new(void(*cb)(mainloop_event_t *, void *), void *userdata)
Header for compat_libevent.c.
char * get_first_listener_addrport_string(int listener_type)
const or_options_t * get_options(void)
Header file for config.c.
void config_line_prepend(config_line_t **lst, const char *key, const char *val)
int config_count_key(const config_line_t *a, const char *key)
const config_line_t * config_line_find(const config_line_t *lines, const char *key)
Header file for connection.c.
#define CONN_TYPE_OR_LISTENER
#define CONN_TYPE_EXT_OR_LISTENER
Header file for connection_or.c.
void control_event_pt_status(const char *status)
void control_event_pt_log(const char *log)
void control_event_transport_launched(const char *mode, const char *transport_name, tor_addr_t *addr, uint16_t port)
Header file for control_events.c.
int crypto_pk_get_fingerprint(crypto_pk_t *pk, char *fp_out, int add_space)
struct smartlist_t * get_current_process_environment_variables(void)
void set_environment_variable_in_smartlist(struct smartlist_t *env_vars, const char *new_var, void(*free_old)(void *), int free_p)
const char * escaped(const char *s)
int we_are_shutting_down(void)
Header file for hibernate.c.
char * kvline_encode(const config_line_t *line, unsigned flags)
config_line_t * kvline_parse(const char *line, unsigned flags)
void tor_log(int severity, log_domain_mask_t domain, const char *format,...)
#define log_fn_ratelim(ratelim, severity, domain, args,...)
void tor_free_(void *mem)
Master header file for Tor-specific functionality.
int tor_asprintf(char **strp, const char *fmt,...)
void process_set_stderr_read_callback(process_t *process, process_read_callback_t callback)
void process_set_data(process_t *process, void *data)
void process_append_argument(process_t *process, const char *argument)
void process_set_exit_callback(process_t *process, process_exit_callback_t callback)
void * process_get_data(const process_t *process)
void process_reset_environment(process_t *process, const smartlist_t *env)
void process_set_stdout_read_callback(process_t *process, process_read_callback_t callback)
bool process_terminate(process_t *process)
process_status_t process_exec(process_t *process)
process_t * process_new(const char *command)
process_pid_t process_get_pid(process_t *process)
bool relay_find_addr_to_publish(const or_options_t *options, int family, int flags, tor_addr_t *addr_out)
Header file for relay_find_addr.c.
int server_identity_key_is_set(void)
void mark_my_descriptor_dirty(const char *reason)
Header file for router.c.
void smartlist_add_asprintf(struct smartlist_t *sl, const char *pattern,...)
int smartlist_contains_string(const smartlist_t *sl, const char *element)
char * smartlist_join_strings(smartlist_t *sl, const char *join, int terminate, size_t *len_out)
void smartlist_add_all(smartlist_t *s1, const smartlist_t *s2)
void smartlist_add_strdup(struct smartlist_t *sl, const char *string)
smartlist_t * smartlist_new(void)
void smartlist_add(smartlist_t *sl, void *element)
void smartlist_clear(smartlist_t *sl)
void smartlist_remove(smartlist_t *sl, const void *element)
#define SMARTLIST_FOREACH_BEGIN(sl, type, var)
#define SMARTLIST_FOREACH(sl, type, var, cmd)
#define SMARTLIST_DEL_CURRENT(sl, var)
int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep, int flags, int max)
char * get_stored_bindaddr_for_server_transport(const char *transport)
void save_transport_to_state(const char *transport, const tor_addr_t *addr, uint16_t port)
tor_addr_t Socks4ProxyAddr
tor_addr_t HTTPSProxyAddr
struct config_line_t * ExtORPort_lines
char * Socks5ProxyUsername
char * Socks5ProxyPassword
tor_addr_t Socks5ProxyAddr
tor_addr_t OutboundBindAddresses[OUTBOUND_ADDR_MAX][2]
char * HTTPSProxyAuthenticator
unsigned marked_for_removal
#define MOCK_IMPL(rv, funcname, arglist)
Header for feature/relay/transport_config.c.
#define PROTO_VERSION_ONE
static managed_proxy_t * get_managed_proxy_by_argv_and_type(char **proxy_argv, int is_server)
static int launch_managed_proxy(managed_proxy_t *mp)
static transport_t * transport_copy(const transport_t *transport)
STATIC char * get_transport_options_for_server_proxy(const managed_proxy_t *mp)
int pt_proxies_configuration_pending(void)
int transport_add_from_config(const tor_addr_t *addr, uint16_t port, const char *name, int socks_ver)
static int managed_proxy_has_argv(const managed_proxy_t *mp, char **proxy_argv)
static void register_client_proxy(const managed_proxy_t *mp)
static void handle_methods_done(const managed_proxy_t *mp)
static void register_proxy(const managed_proxy_t *mp)
bool managed_proxy_has_transport(const char *transport_name)
static void parse_method_error(const char *line, int is_server_method)
static int unconfigured_proxies_n
STATIC char * get_pt_proxy_uri(void)
char * pt_stringify_socks_args(const smartlist_t *socks_args)
STATIC const tor_addr_t * managed_proxy_outbound_address(const or_options_t *options, sa_family_t family)
STATIC transport_t * transport_new(const tor_addr_t *addr, uint16_t port, const char *name, int socks_ver, const char *extra_info_args)
void pt_configure_remaining_proxies(void)
STATIC void parse_proxy_error(const char *line)
STATIC void managed_proxy_destroy(managed_proxy_t *mp, int also_terminate_process)
void sweep_proxy_list(void)
static void clear_transport_list(void)
char * pt_get_socks_args_for_proxy_addrport(const tor_addr_t *addr, uint16_t port)
STATIC void launch_proxy_ev(mainloop_event_t *event, void *v)
STATIC void parse_log_line(const char *line, managed_proxy_t *mp)
STATIC managed_proxy_t * managed_proxy_create(const smartlist_t *with_transport_list, char **proxy_argv, int is_server)
void mark_transport_list(void)
static int proxy_needs_restart(const managed_proxy_t *mp)
void pt_update_bridge_lines(void)
static void proxy_prepare_for_restart(managed_proxy_t *mp)
STATIC int managed_proxy_severity_parse(const char *severity)
STATIC int parse_cmethod_line(const char *line, managed_proxy_t *mp)
static void handle_finished_proxy(managed_proxy_t *mp)
static int transport_add(transport_t *t)
STATIC void parse_status_line(const char *line, managed_proxy_t *mp)
static smartlist_t * transport_list
transport_t * transport_get_by_name(const char *name)
static void register_server_proxy(const managed_proxy_t *mp)
STATIC void managed_proxy_stderr_callback(process_t *process, const char *line, size_t size)
static void add_transport_to_proxy(const char *transport, managed_proxy_t *mp)
STATIC void managed_proxy_stdout_callback(process_t *process, const char *line, size_t size)
STATIC void managed_proxy_set_state(managed_proxy_t *mp, enum pt_proto_state new_state)
STATIC int parse_version(const char *line, managed_proxy_t *mp)
static smartlist_t * create_managed_proxy_environment(const managed_proxy_t *mp)
void sweep_transport_list(void)
static void assert_unconfigured_count_ok(void)
static char * get_bindaddr_for_server_proxy(const managed_proxy_t *mp)
void transport_free_(transport_t *transport)
STATIC void parse_env_error(const char *line)
void pt_prepare_proxy_list_for_config_read(void)
smartlist_t * get_transport_proxy_ports(void)
static int check_if_restarts_needed
char * tor_escape_str_for_pt_args(const char *string, const char *chars_to_escape)
void pt_kickstart_proxy(const smartlist_t *with_transport_list, char **proxy_argv, int is_server)
STATIC int parse_smethod_line(const char *line, managed_proxy_t *mp)
static int parse_method_line_helper(const char *line, managed_proxy_t *mp, int is_smethod)
static int transport_resolve_conflicts(const transport_t *t)
STATIC int configure_proxy(managed_proxy_t *mp)
STATIC void free_execve_args(char **arg)
STATIC bool managed_proxy_exit_callback(process_t *process, process_exit_code_t exit_code)
static int proxy_configuration_finished(const managed_proxy_t *mp)
char * pt_get_extra_info_descriptor_string(void)
static smartlist_t * managed_proxy_list
STATIC void handle_proxy_line(const char *line, managed_proxy_t *mp)
Headers for transports.c.
int strcmpstart(const char *s1, const char *s2)
int strcmp_opt(const char *s1, const char *s2)
int string_is_C_identifier(const char *string)