/* Copyright (c) 2011 Dovecot authors, see the included COPYING file */
#include "lib.h"
+#include "hostpid.h"
#include "network.h"
#include "str.h"
#include "strescape.h"
str_tabescape_write(str, user->username);
str_append_c(str, '\t');
str_tabescape_write(str, user->service);
+ str_printfa(str, "\t%s", my_pid);
/* optional fields */
if (user->local_ip != NULL) {
if (!cmd->header_sent) {
o_stream_send_str(client->output,
- "session\tuser\tip\tservice\tconnected"
+ "session\tuser\tip\tservice\tpid\tconnected"
"\tlast_update\tnum_cmds"
MAIL_STATS_HEADER);
cmd->header_sent = TRUE;
str_append_c(cmd->str, '\t');
str_tabescape_write(cmd->str, session->service);
} T_END;
+ str_printfa(cmd->str, "\t%ld", (long)session->pid);
str_printfa(cmd->str, "\t%d", !session->disconnected);
client_export_timeval(cmd->str, &session->last_update);
str_printfa(cmd->str, "\t%u", session->num_cmds);
{
struct mail_session *session;
guid_128_t session_guid;
+ pid_t pid;
struct ip_addr ip;
unsigned int i;
- /* <session guid> <username> <service> [key=value ..] */
- if (str_array_length(args) < 3) {
+ /* <session guid> <username> <service> <pid> [key=value ..] */
+ if (str_array_length(args) < 4) {
*error_r = "CONNECT: Too few parameters";
return -1;
}
*error_r = "CONNECT: Invalid GUID";
return -1;
}
+ if (str_to_pid(args[3], &pid) < 0) {
+ *error_r = "CONNECT: Invalid pid";
+ return -1;
+ }
+
session = hash_table_lookup(mail_sessions_hash, session_guid);
if (session != NULL) {
*error_r = "CONNECT: Duplicate session GUID";
session->refcount = 1; /* unrefed at disconnect */
session->service = i_strdup(args[2]);
memcpy(session->guid, session_guid, sizeof(session->guid));
+ session->pid = pid;
session->last_update = ioloop_timeval;
session->to_idle = timeout_add(MAIL_SESSION_IDLE_TIMEOUT_MSECS,
mail_session_idle_timeout, session);
guid_128_t guid;
struct mail_user *user;
char *service;
+ pid_t pid;
/* ip address may be NULL if there's none */
struct mail_ip *ip;
struct timeout *to_idle;