cctx.remote_port = conn->conn.remote_port;
doveadm_exit_code = 0;
- flags = args[0];
- cctx.username = args[1];
- cmd_name = args[2];
+ flags = args[0]; args++; argc--;
doveadm_debug = FALSE;
doveadm_verbose = FALSE;
case 'v':
doveadm_verbose = TRUE;
break;
+ case 'x':
+ cctx.extra_fields = t_strsplit_tabescaped(args[0]);
+ args++; argc--;
+ break;
default:
i_error("doveadm client: Unknown flag: %c", *flags);
return FALSE;
}
}
+ cctx.username = args[0]; args++; argc--;
+ cmd_name = args[0];
if (strcmp(cmd_name, "OPTION") == 0) {
- client_handle_options(conn, args+3);
+ client_handle_options(conn, args+1);
return TRUE;
}
/* Disable IO while running a command. This is required for commands
that do IO themselves (e.g. dsync-server). */
io_remove(&conn->io);
- if (doveadm_cmd_handle(conn, cmd_name, argc-2, args+2, &cctx) < 0)
+ if (doveadm_cmd_handle(conn, cmd_name, argc, args, &cctx) < 0)
o_stream_nsend(conn->output, "\n-\n", 3);
o_stream_uncork(conn->output);
conn->io = io_add_istream(conn->input, client_connection_tcp_input, conn);
const char *username;
struct ip_addr local_ip, remote_ip;
in_port_t local_port, remote_port;
+ /* extra fields (e.g. forward_*) sent via doveadm protocol */
+ const char *const *extra_fields;
enum doveadm_client_type conn_type;
struct istream *input;
return ret;
}
+static void
+doveadm_mail_cmd_extra_fields_parse(struct doveadm_mail_cmd_context *ctx)
+{
+ const char *key, *value;
+
+ if (ctx->cctx->extra_fields == NULL)
+ return;
+ for (unsigned int i = 0; ctx->cctx->extra_fields[i] != NULL; i++) {
+ key = ctx->cctx->extra_fields[i];
+ value = strchr(key, '=');
+ if (value != NULL)
+ key = t_strdup_until(key, value++);
+ else
+ value = "";
+ if (strcmp(key, "proxy-ttl") == 0) {
+ if (str_to_int(value, &ctx->proxy_ttl) < 0 ||
+ ctx->proxy_ttl <= 0)
+ i_error("Invalid proxy-ttl value: %s", value);
+ }
+ }
+}
+
int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
const char **error_r)
{
i_assert(cmd_ctx == ctx || cmd_ctx == NULL);
cmd_ctx = ctx;
+ doveadm_mail_cmd_extra_fields_parse(ctx);
ret = doveadm_mail_server_user_get_host(ctx, &proxy_set, &socket_path,
&referral, error_r);
if (ret < 0)
/* This parameter allows to set additional
* mailbox transaction flags. */
mctx->transaction_flags = arg->value.v_int64;
- } else if (strcmp(arg->name, "proxy-ttl") == 0) {
- /* if this becomes <= 1, stop attempting to proxy */
- mctx->proxy_ttl = arg->value.v_int64;
/* Keep all named special parameters above this line */
DOVEADM_CMD_PARAM('S', "socket-path", CMD_PARAM_STR, 0) \
DOVEADM_CMD_PARAM('u', "user", CMD_PARAM_STR, 0) \
DOVEADM_CMD_PARAM('\0', "trans-flags", CMD_PARAM_INT64, 0) \
-DOVEADM_CMD_PARAM('F', "user-file", CMD_PARAM_ISTREAM, 0) \
-DOVEADM_CMD_PARAM('\0', "proxy-ttl", CMD_PARAM_INT64, 0)
+DOVEADM_CMD_PARAM('F', "user-file", CMD_PARAM_ISTREAM, 0)
#define DOVEADM_CMD_MAIL_USAGE_PREFIX \
"[-u <user>|-A] [-S <socket_path>] "
i_assert(conn->authenticated);
i_assert(proxy_ttl >= 1);
- if (conn->conn.minor_version < DOVEADM_PROTOCOL_MIN_VERSION_PROXY_TTL) {
+ if (conn->conn.minor_version < DOVEADM_PROTOCOL_MIN_VERSION_EXTRA_FIELDS) {
o_stream_nsend_str(conn->conn.output, cmdline);
return;
}
- /* <flags> <username> <command> [<args>] -
- Insert --proxy-ttl as the first arg. */
+ /* <flags + x> <extra fields> <username> <command> [<args>] */
const char *p = strchr(cmdline, '\t');
i_assert(p != NULL);
- p = strchr(p+1, '\t');
- i_assert(p != NULL);
- p = strchr(p+1, '\t');
- i_assert(p != NULL);
size_t prefix_len = p - cmdline;
const char *proxy_ttl_str = t_strdup_printf(
- "\t--proxy-ttl\t%d", proxy_ttl);
+ "x\tproxy-ttl=%d", proxy_ttl);
struct const_iovec iov[] = {
{ cmdline, prefix_len },
{ proxy_ttl_str, strlen(proxy_ttl_str) },
#define DOVEADM_PROTOCOL_MIN_VERSION_MULTIPLEX 1
#define DOVEADM_PROTOCOL_MIN_VERSION_STARTTLS 2
-#define DOVEADM_PROTOCOL_MIN_VERSION_PROXY_TTL 3
#define DOVEADM_PROTOCOL_MIN_VERSION_LOG_PASSTHROUGH 3
+#define DOVEADM_PROTOCOL_MIN_VERSION_EXTRA_FIELDS 3
#define DOVEADM_EX_NOTFOUND EX_NOHOST
#define DOVEADM_EX_NOTPOSSIBLE EX_DATAERR