mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
Add support for logging messages from pluggable transports.
This patch adds support for the "LOG" protocol message from a pluggable transport. This allows pluggable transport developers to relay log messages from their binary to Tor, which will both emit them as log messages from the Tor process itself, but also pass them on via the control port. See: https://bugs.torproject.org/28180 See: https://bugs.torproject.org/28181 See: https://bugs.torproject.org/28182
This commit is contained in:
committed by
Nick Mathewson
parent
bfb94dd2ca
commit
e3ceaebba2
@@ -128,6 +128,7 @@ static void parse_method_error(const char *line, int is_server_method);
|
||||
#define PROTO_SMETHODS_DONE "SMETHODS DONE"
|
||||
#define PROTO_PROXY_DONE "PROXY DONE"
|
||||
#define PROTO_PROXY_ERROR "PROXY-ERROR"
|
||||
#define PROTO_LOG "LOG"
|
||||
|
||||
/** The first and only supported - at the moment - configuration
|
||||
protocol version. */
|
||||
@@ -909,6 +910,9 @@ handle_proxy_line(const char *line, managed_proxy_t *mp)
|
||||
|
||||
parse_proxy_error(line);
|
||||
goto err;
|
||||
} else if (!strcmpstart(line, PROTO_LOG)) {
|
||||
parse_log_line(line);
|
||||
return;
|
||||
} else if (!strcmpstart(line, SPAWN_ERROR_MESSAGE)) {
|
||||
/* managed proxy launch failed: parse error message to learn why. */
|
||||
int retval, child_state, saved_errno;
|
||||
@@ -1146,6 +1150,44 @@ parse_proxy_error(const char *line)
|
||||
line+strlen(PROTO_PROXY_ERROR)+1);
|
||||
}
|
||||
|
||||
/** Parses a LOG <b>line</b> and emit log events accordingly. */
|
||||
STATIC void
|
||||
parse_log_line(const char *line)
|
||||
{
|
||||
smartlist_t *items = smartlist_new();
|
||||
|
||||
if (strlen(line) < (strlen(PROTO_LOG) + 1)) {
|
||||
log_warn(LD_PT, "Managed proxy sent us a %s line "
|
||||
"with missing arguments.", PROTO_LOG);
|
||||
goto done;
|
||||
}
|
||||
|
||||
const char *arguments = line + strlen(PROTO_LOG) + 1;
|
||||
|
||||
/* The format is 'LOG <transport> <message>'. We accept empty messages. */
|
||||
smartlist_split_string(items, arguments, NULL,
|
||||
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2);
|
||||
|
||||
if (smartlist_len(items) < 2) {
|
||||
log_warn(LD_PT, "Managed proxy sent us a %s line "
|
||||
"with too few arguments.", PROTO_LOG);
|
||||
goto done;
|
||||
}
|
||||
|
||||
const char *transport_name = smartlist_get(items, 0);
|
||||
const char *message = smartlist_get(items, 1);
|
||||
|
||||
log_info(LD_PT, "Managed proxy transport \"%s\" says: %s",
|
||||
transport_name, message);
|
||||
|
||||
/* Emit control port event. */
|
||||
control_event_transport_log(transport_name, message);
|
||||
|
||||
done:
|
||||
SMARTLIST_FOREACH(items, char *, s, tor_free(s));
|
||||
smartlist_free(items);
|
||||
}
|
||||
|
||||
/** 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. */
|
||||
|
||||
@@ -128,6 +128,7 @@ STATIC int parse_version(const char *line, managed_proxy_t *mp);
|
||||
STATIC void parse_env_error(const char *line);
|
||||
STATIC void parse_proxy_error(const char *line);
|
||||
STATIC void handle_proxy_line(const char *line, managed_proxy_t *mp);
|
||||
STATIC void parse_log_line(const char *line);
|
||||
STATIC char *get_transport_options_for_server_proxy(const managed_proxy_t *mp);
|
||||
|
||||
STATIC void managed_proxy_destroy(managed_proxy_t *mp,
|
||||
|
||||
Reference in New Issue
Block a user