.service_name = "imap",
.ip = client->state.remote_ip,
};
- if (master_service_anvil_connect(master_service, &anvil_session))
+ if (master_service_anvil_connect(master_service, &anvil_session,
+ client->state.anvil_conn_guid))
client->state.anvil_sent = TRUE;
p_array_init(&client->notifys, pool, 2);
.service_name = "imap",
.ip = client->state.remote_ip,
};
- master_service_anvil_disconnect(master_service, &anvil_session);
+ master_service_anvil_disconnect(master_service, &anvil_session,
+ client->state.anvil_conn_guid);
}
if (client->master_conn != NULL)
const unsigned char *state;
size_t state_size;
+ guid_128_t anvil_conn_guid;
unsigned int imap_idle_notify_interval;
bool idle_cmd;
bool have_notify_fd;
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))
+ if (master_service_anvil_connect(master_service, &anvil_session,
+ client->anvil_conn_guid))
client->anvil_sent = TRUE;
imap_client_count++;
if (client->anvil_sent) {
struct master_service_anvil_session anvil_session;
mail_user_get_anvil_session(client->user, &anvil_session);
- master_service_anvil_disconnect(master_service, &anvil_session);
+ master_service_anvil_disconnect(master_service, &anvil_session,
+ client->anvil_conn_guid);
}
if (client->free_parser != NULL)
struct istream *input;
struct ostream *output;
struct timeout *to_idle, *to_idle_output, *to_delayed_input;
+ guid_128_t anvil_conn_guid;
pool_t pool;
struct mail_storage_service_user *service_user;
}
bool master_service_anvil_connect(struct master_service *service,
- const struct master_service_anvil_session *session)
+ const struct master_service_anvil_session *session,
+ guid_128_t conn_guid_r)
{
+ guid_128_generate(conn_guid_r);
+
string_t *cmd = t_str_new(128);
str_append(cmd, "CONNECT\t");
master_service_anvil_session_to_cmd(cmd, session);
+ str_append_c(cmd, '\t');
+ str_append(cmd, guid_128_to_string(conn_guid_r));
str_append_c(cmd, '\n');
return master_service_anvil_send(service, str_c(cmd));
}
void master_service_anvil_disconnect(struct master_service *service,
- const struct master_service_anvil_session *session)
+ const struct master_service_anvil_session *session,
+ const guid_128_t conn_guid)
{
string_t *cmd = t_str_new(128);
str_append(cmd, "DISCONNECT\t");
master_service_anvil_session_to_cmd(cmd, session);
+ str_append_c(cmd, '\t');
+ str_append(cmd, guid_128_to_string(conn_guid));
str_append_c(cmd, '\n');
(void)master_service_anvil_send(service, str_c(cmd));
}
#define MASTER_SERVICE_H
#include "net.h"
+#include "guid.h"
#include <unistd.h> /* for getopt() opt* variables */
#include <stdio.h> /* for getopt() opt* variables in Solaris */
bool master_service_is_master_stopped(struct master_service *service);
/* Send CONNECT command to anvil process, if it's still connected.
- Returns TRUE if it was successfully sent. */
+ Returns TRUE and connection GUID if it was successfully sent. */
bool master_service_anvil_connect(struct master_service *service,
- const struct master_service_anvil_session *session);
-/* Send DISCONNECT command to anvil process, if it's still connected. */
+ const struct master_service_anvil_session *session,
+ 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,
- const struct master_service_anvil_session *session);
+ const struct master_service_anvil_session *session,
+ const guid_128_t conn_guid);
/* Call to accept the client connection. Otherwise the connection is closed. */
void master_service_client_connection_accept(struct master_service_connection *conn);
/* Used to create "extra client connections" outside the common accept()
struct mail_storage_service_user *service_user;
struct anvil_query *anvil_query;
+ guid_128_t anvil_conn_guid;
struct lmtp_local_recipient *duplicate;
.username = input->username,
.service_name = master_service_get_name(master_service),
};
- master_service_anvil_disconnect(master_service, &anvil_session);
+ master_service_anvil_disconnect(master_service, &anvil_session,
+ llrcpt->anvil_conn_guid);
}
static void
.username = input->username,
.service_name = master_service_get_name(master_service),
};
- if (master_service_anvil_connect(master_service, &anvil_session))
+ if (master_service_anvil_connect(master_service, &anvil_session,
+ llrcpt->anvil_conn_guid))
llrcpt->anvil_connect_sent = TRUE;
}
}
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))
+ if (master_service_anvil_connect(master_service, &anvil_session,
+ client->anvil_conn_guid))
client->anvil_sent = TRUE;
return 0;
}
if (client->anvil_sent) {
struct master_service_anvil_session anvil_session;
mail_user_get_anvil_session(client->user, &anvil_session);
- master_service_anvil_disconnect(master_service, &anvil_session);
+ master_service_anvil_disconnect(master_service, &anvil_session,
+ client->anvil_conn_guid);
}
if (client->session_dotlock != NULL)
#define POP3_CLIENT_H
#include "seq-range-array.h"
+#include "guid.h"
struct client;
struct mail_storage;
struct istream *input;
struct ostream *output;
struct timeout *to_idle, *to_commit;
+ guid_128_t anvil_conn_guid;
command_func_t *cmd;
void *cmd_context;
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))
+ if (master_service_anvil_connect(master_service, &anvil_session,
+ client->anvil_conn_guid))
client->anvil_sent = TRUE;
if (hook_client_created != NULL)
if (client->anvil_sent) {
struct master_service_anvil_session anvil_session;
mail_user_get_anvil_session(client->user, &anvil_session);
- master_service_anvil_disconnect(master_service, &anvil_session);
+ master_service_anvil_disconnect(master_service, &anvil_session,
+ client->anvil_conn_guid);
}
if (client->urlauth_ctx != NULL)
#define CLIENT_H
#include "net.h"
+#include "guid.h"
struct smtp_reply;
const struct submission_settings *set;
struct smtp_server_connection *conn;
+ guid_128_t anvil_conn_guid;
struct client_state state;
ARRAY(struct submission_backend *) pending_backends;
ARRAY(struct submission_recipient *) rcpt_to;