str_append_c(cmd, '\n');
ctx->tcp_conn = conn;
- /* dsync command can't be proxied currently, so use TTL 1 */
- doveadm_client_cmd(conn, 1, str_c(cmd), NULL,
+ struct doveadm_client_cmd_settings cmd_set = {
+ /* dsync command can't be proxied currently, so use TTL 1 */
+ .proxy_ttl = 1,
+ };
+ doveadm_client_cmd(conn, &cmd_set, str_c(cmd), NULL,
dsync_connected_callback, ctx);
io_loop_run(current_ioloop);
ctx->tcp_conn = NULL;
servercmd->server = new_server;
if (servercmd->input != NULL)
i_stream_seek(servercmd->input, 0);
- doveadm_client_cmd(conn, cmd_ctx->proxy_ttl,
- servercmd->cmdline, servercmd->input,
+
+ struct doveadm_client_cmd_settings cmd_set = {
+ .proxy_ttl = cmd_ctx->proxy_ttl,
+ };
+ doveadm_client_cmd(conn, &cmd_set, servercmd->cmdline, servercmd->input,
doveadm_cmd_callback, servercmd);
return 0;
}
i_stream_ref(servercmd->input);
doveadm_client_set_print(conn, doveadm_cmd_print_callback,
servercmd);
- doveadm_client_cmd(conn, cmd_ctx->proxy_ttl,
- str_c(cmd), cmd_ctx->cmd_input,
+ struct doveadm_client_cmd_settings cmd_set = {
+ .proxy_ttl = cmd_ctx->proxy_ttl,
+ };
+ doveadm_client_cmd(conn, &cmd_set, str_c(cmd), cmd_ctx->cmd_input,
doveadm_cmd_callback, servercmd);
}
struct istream *cmd_input;
struct ostream *cmd_output;
const char *delayed_cmd;
- int delayed_cmd_proxy_ttl;
+ struct doveadm_client_cmd_settings delayed_set;
doveadm_client_cmd_callback_t *callback;
void *context;
static void
doveadm_client_send_cmd(struct doveadm_client *conn,
- const char *cmdline, int proxy_ttl)
+ const char *cmdline,
+ const struct doveadm_client_cmd_settings *set)
{
i_assert(conn->authenticated);
- i_assert(proxy_ttl >= 1);
+ i_assert(set->proxy_ttl >= 1);
if (conn->conn.minor_version < DOVEADM_PROTOCOL_MIN_VERSION_EXTRA_FIELDS) {
o_stream_nsend_str(conn->conn.output, cmdline);
size_t prefix_len = p - cmdline;
const char *proxy_ttl_str = t_strdup_printf(
- "x\tproxy-ttl=%d", proxy_ttl);
+ "x\tproxy-ttl=%d", set->proxy_ttl);
struct const_iovec iov[] = {
{ cmdline, prefix_len },
{ proxy_ttl_str, strlen(proxy_ttl_str) },
if (conn->delayed_cmd != NULL) {
doveadm_client_send_cmd(conn, conn->delayed_cmd,
- conn->delayed_cmd_proxy_ttl);
+ &conn->delayed_set);
conn->delayed_cmd = NULL;
doveadm_client_send_cmd_input(conn);
}
return &conn->set;
}
-void doveadm_client_cmd(struct doveadm_client *conn, int proxy_ttl,
+static void
+doveadm_client_cmd_settings_dup(const struct doveadm_client_cmd_settings *src,
+ struct doveadm_client_cmd_settings *dest_r)
+{
+ i_zero(dest_r);
+ dest_r->proxy_ttl = src->proxy_ttl;
+}
+
+void doveadm_client_cmd(struct doveadm_client *conn,
+ const struct doveadm_client_cmd_settings *set,
const char *line, struct istream *cmd_input,
doveadm_client_cmd_callback_t *callback, void *context)
{
i_assert(conn->delayed_cmd == NULL);
- i_assert(proxy_ttl >= 1);
+ i_assert(set->proxy_ttl >= 1);
conn->state = DOVEADM_CLIENT_REPLY_STATE_PRINT;
if (cmd_input != NULL) {
conn->cmd_input = cmd_input;
}
if (!conn->authenticated) {
- conn->delayed_cmd_proxy_ttl = proxy_ttl;
+ doveadm_client_cmd_settings_dup(set, &conn->delayed_set);
conn->delayed_cmd = p_strdup(conn->pool, line);
} else {
- doveadm_client_send_cmd(conn, line, proxy_ttl);
+ doveadm_client_send_cmd(conn, line, set);
doveadm_client_send_cmd_input(conn);
}
conn->callback = callback;
bool log_passthrough;
};
+struct doveadm_client_cmd_settings {
+ /* TTL for proxying */
+ int proxy_ttl;
+};
+
/* Duplicate doveadm client settings. Note that the ssl_ctx is referenced by
this call, so it must be unreferenced later. */
void doveadm_client_settings_dup(const struct doveadm_client_settings *src,
TRUE ? context : CALLBACK_TYPECHECK(callback, \
void (*)(const unsigned char *, size_t, bool, typeof(context))))
-void doveadm_client_cmd(struct doveadm_client *conn, int proxy_ttl,
+void doveadm_client_cmd(struct doveadm_client *conn,
+ const struct doveadm_client_cmd_settings *set,
const char *line, struct istream *cmd_input,
doveadm_client_cmd_callback_t *callback, void *context);