.ip = client->state.remote_ip,
};
if (master_service_anvil_connect(master_service, &anvil_session,
- client->state.anvil_conn_guid))
+ FALSE, client->state.anvil_conn_guid))
client->state.anvil_sent = TRUE;
p_array_init(&client->notifys, pool, 2);
struct master_service_anvil_session anvil_session;
mail_user_get_anvil_session(client->user, &anvil_session);
if (master_service_anvil_connect(master_service, &anvil_session,
- client->anvil_conn_guid))
+ TRUE, client->anvil_conn_guid))
client->anvil_sent = TRUE;
imap_client_count++;
bool master_service_anvil_connect(struct master_service *service,
const struct master_service_anvil_session *session,
- guid_128_t conn_guid_r)
+ bool kick_supported, guid_128_t conn_guid_r)
{
guid_128_generate(conn_guid_r);
str_append(cmd, guid_128_to_string(conn_guid_r));
str_append_c(cmd, '\t');
master_service_anvil_session_to_cmd(cmd, session);
+ str_append_c(cmd, '\t');
+ if (!kick_supported)
+ str_append_c(cmd, 'N');
+ else if (master_service_get_client_limit(service) == 1)
+ str_append_c(cmd, 'S');
+ else
+ str_append_c(cmd, 'A');
str_append_c(cmd, '\n');
return master_service_anvil_send(service, str_c(cmd));
}
standalone. */
bool master_service_is_master_stopped(struct master_service *service);
-/* Send CONNECT command to anvil process, if it's still connected.
- Returns TRUE and connection GUID if it was successfully sent. */
+/* Send CONNECT command to anvil process, if it's still connected. Returns TRUE
+ and connection GUID if it was successfully sent. If kick_supported=TRUE, the
+ process implements the KICK-USER command in anvil and admin sockets. */
bool master_service_anvil_connect(struct master_service *service,
const struct master_service_anvil_session *session,
- guid_128_t conn_guid_r);
+ bool kick_supported, guid_128_t conn_guid_r);
/* Send DISCONNECT command to anvil process, if it's still connected.
The conn_guid must match the guid returned by _connect(). */
void master_service_anvil_disconnect(struct master_service *service,
.service_name = master_service_get_name(master_service),
};
if (master_service_anvil_connect(master_service, &anvil_session,
- llrcpt->anvil_conn_guid))
+ FALSE, llrcpt->anvil_conn_guid))
llrcpt->anvil_connect_sent = TRUE;
}
}
.ip = client->ip,
};
if (master_service_anvil_connect(master_service, &anvil_session,
- proxy->anvil_conn_guid))
+ TRUE, proxy->anvil_conn_guid))
proxy->anvil_connect_sent = TRUE;
if (login_proxy_ipc_server == NULL) {
struct master_service_anvil_session anvil_session;
mail_user_get_anvil_session(client->user, &anvil_session);
if (master_service_anvil_connect(master_service, &anvil_session,
- client->anvil_conn_guid))
+ TRUE, client->anvil_conn_guid))
client->anvil_sent = TRUE;
return 0;
}
struct master_service_anvil_session anvil_session;
mail_user_get_anvil_session(client->user, &anvil_session);
if (master_service_anvil_connect(master_service, &anvil_session,
- client->anvil_conn_guid))
+ TRUE, client->anvil_conn_guid))
client->anvil_sent = TRUE;
if (hook_client_created != NULL)