client.h revision 30fc0b14f0d99a86c04aacff311e4cf2ddd5ff12
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen#ifndef CLIENT_H
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen#define CLIENT_H
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen#include "network.h"
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
c5c61a6a9d748525ff3b2dd2705844464bed324fTimo Sirainen#define CLIENT_MAIL_DATA_MAX_INMEMORY_SIZE (1024*128)
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainenstruct mail_recipient {
9a935c34e98ba7a9cc90784ceb63b2fbdab4105fTimo Sirainen const char *address;
9a935c34e98ba7a9cc90784ceb63b2fbdab4105fTimo Sirainen const char *detail; /* +detail part is also in address */
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen struct mail_storage_service_user *service_user;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen};
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainenstruct client_state {
ed45903d7ad49b3d54f0883b203632fbccf8eff2Timo Sirainen const char *name;
eed03830015b7138b9d4522e72bef650aa24b45fTimo Sirainen const char *session_id;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen const char *mail_from;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen ARRAY_DEFINE(rcpt_to, struct mail_recipient);
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen unsigned int rcpt_idx;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen unsigned int data_end_idx;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen /* Initially we start writing to mail_data. If it grows too large,
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen start using mail_data_fd. */
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen buffer_t *mail_data;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen int mail_data_fd;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen struct ostream *mail_data_output;
9deb15b8dec1a593940d72532ececc673c6b48ffTimo Sirainen const char *added_headers;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen struct mail *raw_mail;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen struct mail_user *dest_user;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen struct mail *first_saved_mail;
e93ab1b206e3792a8dabc460ad2ee60aaf6830b1Timo Sirainen
e93ab1b206e3792a8dabc460ad2ee60aaf6830b1Timo Sirainen unsigned int mail_body_7bit:1;
e93ab1b206e3792a8dabc460ad2ee60aaf6830b1Timo Sirainen unsigned int mail_body_8bitmime:1;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen};
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainenstruct client {
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen struct client *prev, *next;
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen pool_t pool;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen const struct setting_parser_info *user_set_info;
c2ebc8f28b5504f280cd5d4adfe57ed70f9a7d83Timo Sirainen const struct lda_settings *set;
458acd7b39c84bae0d18c36ff9ddff9a49b4ae4aTimo Sirainen const struct lmtp_settings *lmtp_set;
30fc0b14f0d99a86c04aacff311e4cf2ddd5ff12Timo Sirainen const struct master_service_settings *service_set;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen int fd_in, fd_out;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen struct io *io;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen struct istream *input;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen struct ostream *output;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen struct timeout *to_idle;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen time_t last_input;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen struct ip_addr remote_ip, local_ip;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen unsigned int remote_port, local_port;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen struct mail_user *raw_mail_user;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen const char *my_domain;
fcd443a32b01c4da131f36649d5a5fa5f8452dcfTimo Sirainen char *lhlo;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen pool_t state_pool;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen struct client_state state;
c4390dad33b03dd51ba2a475f550347c86ebdb9aTimo Sirainen struct istream *dot_input;
c2ebc8f28b5504f280cd5d4adfe57ed70f9a7d83Timo Sirainen struct lmtp_proxy *proxy;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen unsigned int disconnected:1;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen};
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainenextern unsigned int clients_count;
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainenstruct client *client_create(int fd_in, int fd_out,
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen const struct master_service_connection *conn);
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainenvoid client_destroy(struct client *client, const char *prefix,
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen const char *reason);
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainenvoid client_disconnect(struct client *client, const char *prefix,
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen const char *reason);
4818cf6ae9cda663ad68823fd83b18ac380a8a4dTimo Sirainenvoid client_io_reset(struct client *client);
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainenvoid client_state_reset(struct client *client);
30fc0b14f0d99a86c04aacff311e4cf2ddd5ff12Timo Sirainenvoid client_state_set(struct client *client, const char *name);
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainenvoid client_input_handle(struct client *client);
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainenint client_input_read(struct client *client);
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainenvoid client_send_line(struct client *client, const char *fmt, ...)
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen ATTR_FORMAT(2, 3);
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainenvoid clients_destroy(void);
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen
315ce5be539bfe8bc7777ab0654499c49583cea2Timo Sirainen#endif