/* $Id: connection_imp.h,v 1.6 2006/07/01 07:37:48 hurtta Exp $ */ /****************************************************************************** * The Elm (ME+) Mail System - $Revision: 1.6 $ * * Author: Kari Hurtta *****************************************************************************/ /* service_list.c -------------------------------------------- */ #ifdef REMOTE_MBX #ifdef I_NETINET_IN #include #include #endif typedef union socket_addr { struct sockaddr sa; /* general version */ #ifdef I_NETINET_IN struct sockaddr_in sin; /* INET family */ #endif } SOCKADDR; typedef enum { PORT_end = 0, PORT_smtp = 25, PORT_pop3 = 110, PORT_imap4 = 143, PORT_submission = 587 } PORTS; extern struct service_entry * service_list; extern int service_count; #define STFLAG_browser 0x01 #define STFLAG_mbox 0x02 #define STFLAG_smtp_like 0x04 #define STFLAG_is_imap 0x0100 #define STFLAG_is_pop 0x0200 #define STFLAG_is_submission 0x0400 #define STFLAG_is_smtp 0x0800 extern CONST struct service_type * IMAP_SERVICE; extern CONST struct service_type * POP_SERVICE; extern CONST struct service_type * SUBMISSION_SERVICE; extern CONST struct service_type * SMTP_SERVICE; #define SE_given_alias 0x01 #define SE_given_addr 0x02 #define SE_given_port 0x04 #define SE_temporary 0x08 #define SE_system 0x10 #define SE_given_name_addr 0x20 #define SE_rescan_name_addr 0x40 #ifdef ANSI_C struct SE_option; #endif /* return: 0 = failure, 1 = option ok */ typedef int SE_option_parse P_((struct SE_option *X, const char *name, /* without prefix */ const char * value)); /* return: malloced string -- caller must free */ typedef char * SE_option_values P_((struct SE_option *X, const char *prefix)); typedef void SE_option_zero P_((struct SE_option *X)); typedef void SE_option_free P_((struct SE_option *X)); typedef void SE_option_merge P_((struct SE_option *target, struct SE_option *source)); #define SE_option_t_magic 0xF907 extern struct service_entry { int flags; char * official_name; char * * aliases_list; int aliases_count; SOCKADDR * addr_list; int addr_count; char ** addr_name_list; int addr_name_count; CONST struct service_type * service; int * port_list; int port_count; struct SE_option { struct SE_option_type { unsigned short magic; /* SE_option_t_magic */ SE_option_parse * parse_on_option; SE_option_values * give_values; SE_option_zero * zero_options; SE_option_free * free_options; SE_option_merge * merge_options; } * type; char * prefix; /* Anonymous type */ struct SE_option_value * value; } * option_list; int option_count; } * give_service_entry P_((const char *hostname, int flag)); extern void free_temporary_service_entry P_((struct service_entry **Y)); #endif /* remote_mbx.c ---------------------------------------------- */ #ifdef POLL_METHOD struct Read_Buffer { char *read_buffer; int read_len; }; struct Write_Buffer { char *write_buffer; int write_len; }; extern int ReadFromSocket P_((int fd, struct Read_Buffer *buffer, int wanted)); extern int find_crlf P_((struct Read_Buffer *buffer, int add_null)); extern void zero_Read_Buffer P_((struct Read_Buffer *buffer)); extern void free_Read_Buffer P_((struct Read_Buffer *buffer)); extern void cut_line P_((struct Read_Buffer *buffer, int len)); extern void zero_Write_Buffer P_((struct Write_Buffer *buffer)); extern void free_Write_Buffer P_((struct Write_Buffer *buffer)); extern int WriteToSocket P_((int fd, struct Write_Buffer *buffer)); extern void cut_Write_Buffer P_((struct Write_Buffer *buffer, int n)); extern void add_to_Write_Buffer P_((struct Write_Buffer *buffer, char **str,int l)); #endif #ifdef REMOTE_MBX #define REMOTE_ACCOUNT_magic 0xF504 struct remote_account { unsigned short magic; /* REMOTE_ACCOUNT_magic */ SOCKADDR hostaddr; struct streamsched *stream; int service_idx; char * username; char * host; }; extern void zero_remote_account P_((struct remote_account *ra)); extern void free_remote_account P_((struct remote_account *ra)); extern int connect_remote_account P_((struct remote_account *ra, int *got, struct service_entry *se, PORTS default_portlist[], PORTS force_port)); extern int split_remote_name P_((char *name, struct remote_account *X, struct service_entry **se, char **rest, int lookup_flags)); #ifdef ANSI_C struct connection_cache; struct folder_browser; #endif typedef void cache_zero_connection P_((struct connection_cache *c)); typedef void cache_free_connection P_((struct connection_cache *c)); typedef int cache_open_connection P_((struct connection_cache *c)); typedef int cache_login_connection P_((struct connection_cache *c, const struct string *password /* May be NULL */)); typedef int cache_close_connection P_((struct connection_cache *c)); typedef void cache_folder_from_connection P_((struct connection_cache *c, struct folder_info *f)); typedef void cache_browser_from_connection P_((struct connection_cache *c, struct folder_browser *d)); #define CONNECTION_TYPE_magic 0xF906 struct connection_type { unsigned short magic; /* CONNECTION_TYPE_magic */ CONST char * type_name; cache_zero_connection * cache_zero_it; cache_free_connection * cache_free_it; cache_open_connection * cache_open_it; cache_login_connection * cache_login_it; cache_close_connection * cache_close_it; cache_folder_from_connection * cache_folder_from_it; cache_browser_from_connection * cache_browser_from_it; }; /* Structure is on connection cache list if not given to folder - structure ... */ enum connection_state { CON_greeting = -1, CON_error = 0, CON_open = 1, CON_logged = 2 }; struct connection_cache { struct connection_type * type; /* Either one from these only should be on non-NULL */ struct connection_cache * next; struct folder_info *f; struct folder_browser *d; struct remote_account C; uint16 port; /* 0 == default port */ enum connection_state state; union { void * any; struct generic_connection_1 * g1_con; struct generic_connection_2 * g2_con; struct IMAP_CON * imap_con; } a; }; /* May not be uin16 port because this is promoted to int */ extern struct connection_cache * locate_from_cache P_((const char * username, const char * host, const struct connection_type *con_type, int port /* 0 == default port */)); extern struct connection_cache * create_connection P_((struct connection_type *T)); extern void free_connection P_((struct connection_cache **c)); extern int join_connection P_((struct connection_cache *c, struct remote_account *X, enum connection_state st)); extern int login_connection P_((struct connection_cache *c, const struct string *password /* May be NULL */)); extern void folder_from_connection P_((struct connection_cache *c, struct folder_info *f)); extern void browser_from_connection P_((struct connection_cache *c, struct folder_browser *d)); extern void close_connection P_((struct connection_cache *c)); extern void cache_connection P_((struct connection_cache *c)); #endif /* * Local Variables: * mode:c * c-basic-offset:4 * buffer-file-coding-system: iso-8859-1 * End: */