void mail_session_refresh(struct mail_session *session, const struct stats *diff_stats) { timeout_reset(session->to_idle); if (diff_stats != NULL) stats_add(session->stats, diff_stats); session->last_update = ioloop_timeval; DLLIST2_REMOVE_FULL(&mail_sessions_head, &mail_sessions_tail, session, sorted_prev, sorted_next); DLLIST2_APPEND_FULL(&mail_sessions_head, &mail_sessions_tail, session, sorted_prev, sorted_next); mail_user_refresh(session->user, diff_stats); if (session->ip != NULL) mail_ip_refresh(session->ip, diff_stats); }
struct mail_user *mail_user_login(const char *username) { struct mail_user *user; const char *domain; user = hash_table_lookup(mail_users_hash, username); if (user != NULL) { user->num_logins++; mail_user_refresh(user, NULL); mail_domain_login(user->domain); return user; } domain = strchr(username, '@'); if (domain != NULL) domain++; else domain = ""; user = i_malloc(sizeof(struct mail_user) + stats_alloc_size()); user->stats = (void *)(user + 1); user->name = i_strdup(username); user->reset_timestamp = ioloop_time; user->domain = mail_domain_login_create(domain); hash_table_insert(mail_users_hash, user->name, user); DLLIST_PREPEND_FULL(&stable_mail_users, user, stable_prev, stable_next); DLLIST2_APPEND_FULL(&mail_users_head, &mail_users_tail, user, sorted_prev, sorted_next); DLLIST_PREPEND_FULL(&user->domain->users, user, domain_prev, domain_next); mail_domain_ref(user->domain); user->num_logins++; user->last_update = ioloop_timeval; global_memory_alloc(mail_user_memsize(user)); return user; }