/* free the outgoing proxy URI */
tor_free(mp->proxy_uri);
+ /* free our version, if any is set. */
+ tor_free(mp->version);
+
/* do we want to terminate our process if it's still running? */
if (also_terminate_process && mp->process) {
/* Note that we do not call process_free(mp->process) here because we let
goto done;
}
+ /* Handle the different messages. */
+ handle_status_message(values, mp);
+
/* Prepend the PT name. */
config_line_prepend(&values, "PT", mp->argv[0]);
status_message = kvline_encode(values, KV_QUOTED);
tor_free(status_message);
}
+STATIC void
+handle_status_message(const config_line_t *values,
+ managed_proxy_t *mp)
+{
+ const config_line_t *message_type = config_line_find(values, "TYPE");
+
+ /* Check if we have a TYPE field? */
+ if (message_type == NULL) {
+ log_debug(LD_PT, "Managed proxy \"%s\" wrote a STATUS line without "
+ "a defined message TYPE", mp->argv[0]);
+ return;
+ }
+
+ /* Handle VERSION messages. */
+ if (! strcasecmp(message_type->value, "version")) {
+ const config_line_t *version = config_line_find(values, "VERSION");
+
+ if (version == NULL) {
+ log_warn(LD_PT, "Managed proxy \"%s\" wrote a STATUS TYPE=version line "
+ "with a missing VERSION field", mp->argv[0]);
+ return;
+ }
+
+ tor_free(mp->version);
+ mp->version = tor_strdup(version->value);
+
+ return;
+ }
+}
+
/** Return a newly allocated string that tor should place in
* TOR_PT_SERVER_TRANSPORT_OPTIONS while configuring the server
* manged proxy in <b>mp</b>. Return NULL if no such options are found. */
/* transports to-be-launched by this proxy */
smartlist_t *transports_to_launch;
+ /** Version as set by STATUS TYPE=version messages. */
+ char *version;
+
/* The 'transports' list contains all the transports this proxy has
launched. */
smartlist_t *transports;
} managed_proxy_t;
+struct config_line_t;
+
STATIC transport_t *transport_new(const tor_addr_t *addr, uint16_t port,
const char *name, int socks_ver,
const char *extra_info_args);
STATIC void handle_proxy_line(const char *line, managed_proxy_t *mp);
STATIC void parse_log_line(const char *line, managed_proxy_t *mp);
STATIC void parse_status_line(const char *line, managed_proxy_t *mp);
+STATIC void handle_status_message(const struct config_line_t *values,
+ managed_proxy_t *mp);
STATIC char *get_transport_options_for_server_proxy(const managed_proxy_t *mp);
STATIC void managed_proxy_destroy(managed_proxy_t *mp,
tor_free(mp);
}
+static void
+test_pt_status_parsing(void *arg)
+{
+ char line[200];
+ char *test_binary = tor_strdup("test-pt");
+ char *argv[] = {
+ test_binary,
+ NULL,
+ };
+
+ managed_proxy_t *mp = tor_malloc_zero(sizeof(managed_proxy_t));
+ (void)arg;
+ mp->conf_state = PT_PROTO_INFANT;
+ mp->transports = smartlist_new();
+ mp->argv = argv;
+
+ /* STATUS TYPE=version messages. */
+ tt_ptr_op(mp->version, OP_EQ, NULL);
+ strlcpy(line, "STATUS TRANSPORT=x "
+ "TYPE=version "
+ "VERSION=\"1.33.7-hax beta\"",
+ sizeof(line));
+ handle_proxy_line(line, mp);
+ tt_str_op(mp->version, OP_EQ, "1.33.7-hax beta");
+
+ reset_mp(mp);
+
+ done:
+ reset_mp(mp);
+ smartlist_free(mp->transports);
+ tor_free(mp);
+ tor_free(test_binary);
+}
+
static void
test_pt_get_transport_options(void *arg)
{
struct testcase_t pt_tests[] = {
PT_LEGACY(parsing),
+ PT_LEGACY(status_parsing),
PT_LEGACY(protocol),
{ "get_transport_options", test_pt_get_transport_options, TT_FORK,
NULL, NULL },