X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fserver.h;h=19eb12a2a1b722a4e06a197fa134166207223a60;hb=d27e5ce95bd12d9c25a4e596655212253d50c5c9;hp=33ceef4a4f2449df5222a0119bd6fedb8f406ba6;hpb=336721634c09a52e6c3fa27b54d5dc95c7ad9bee;p=citadel.git diff --git a/citadel/server.h b/citadel/server.h index 33ceef4a4..19eb12a2a 100644 --- a/citadel/server.h +++ b/citadel/server.h @@ -1,43 +1,49 @@ /* $Id$ */ -/* Uncomment this if you want to track memory leaks. - * This incurs some overhead, so don't use it unless you're debugging the code! - */ -/* #define DEBUG_MEMORY_LEAKS */ + +#ifndef SERVER_H +#define SERVER_H + +#ifdef __GNUC__ +#define INLINE __inline__ +#else +#define INLINE +#endif + +#include "citadel.h" +#ifdef HAVE_OPENSSL +#define OPENSSL_NO_KRB5 /* work around redhat b0rken ssl headers */ +#include +#endif /* * New format for a message in memory */ -#define CTDLMESSAGE_MAGIC 0x159d struct CtdlMessage { - int cm_magic; /* Self-check */ + int cm_magic; /* Self-check (NOT SAVED TO DISK) */ char cm_anon_type; /* Anonymous or author-visible */ char cm_format_type; /* Format type */ char *cm_fields[256]; /* Data fields */ unsigned int cm_flags; /* How to handle (NOT SAVED TO DISK) */ }; +#define CTDLMESSAGE_MAGIC 0x159d #define CM_SKIP_HOOKS 0x01 /* Don't run server-side handlers */ -/* - * Generic per-session variable or data structure storage - */ -struct CtdlSessData { - struct CtdlSessData *next; - unsigned long sym_id; - void *sym_data; -}; /* - * Static user data symbol types + * Exit codes 101 through 109 are used for conditions in which + * we deliberately do NOT want the service to automatically + * restart. */ -enum { - SYM_DESIRED_SECTION, /* Used by the MIME parser */ - SYM_MA_INFO, /* Handles multipart/alternative */ - SYM_REPL, /* Used for replication checking */ - SYM_MAX -}; +#define CTDLEXIT_CONFIG 101 /* Could not read citadel.config */ +#define CTDLEXIT_CONTROL 102 /* Could not acquire lock */ +#define CTDLEXIT_HOME 103 /* Citadel home directory not found */ +#define CTDLEXIT_OOD 104 /* Out Of Date config - rerun setup */ +#define CTDLEXIT_DB 105 /* Unable to initialize database */ + + /* @@ -46,78 +52,115 @@ enum { * This structure keeps track of all information relating to a running * session on the server. We keep one of these for each session thread. * - * Note that the first element is "*next" so that it may be used without - * modification in a linked list. */ struct CitContext { + struct CitContext *prev; /* Link to previous session in list */ struct CitContext *next; /* Link to next session in the list */ - struct usersupp usersupp; /* Database record buffers */ - struct quickroom quickroom; - int state; /* thread state (see CON_ values below) */ int kill_me; /* Set to nonzero to flag for termination */ + int client_socket; + int cs_pid; /* session ID */ + time_t lastcmd; /* time of last command executed */ + time_t lastidle; /* For computing idle time */ char curr_user[USERNAME_SIZE]; /* name of current user */ int logged_in; /* logged in */ int internal_pgm; /* authenticated as internal program */ - char temp[32]; /* temp file name */ int nologin; /* not allowed to log in */ int is_local_socket; /* set to 1 if client is on unix domain sock */ + int curr_view; /* The view type for the current user/room */ - char net_node[32]; /* Is the client another Citadel server? */ - int client_socket; - int cs_pid; /* session ID */ - time_t cs_lastupdt; /* time of last update */ - time_t lastcmd; /* time of last command executed */ - time_t lastidle; /* For computing idle time */ + char net_node[32] ;/* Is the client another Citadel server? */ + time_t previous_login; /* Date/time of previous login */ char lastcmdname[5]; /* name of last command executed */ unsigned cs_flags; /* miscellaneous flags */ void (*h_command_function) (void) ; /* service command function */ + void (*h_async_function) (void) ; /* do async msgs function */ int is_async; /* Nonzero if client accepts async msgs */ + int async_waiting; /* Nonzero if there are async msgs waiting */ + int input_waiting; /* Nonzero if there is client input waiting */ - /* feeping creaturisms... */ + /* Client information */ int cs_clientdev; /* client developer ID */ int cs_clienttyp; /* client type code */ int cs_clientver; /* client version number */ char cs_clientname[32]; /* name of client software */ - char cs_host[26]; /* host logged in from */ + char cs_host[64]; /* host logged in from */ + char cs_addr[64]; /* address logged in from */ - /* Beginning of cryptography - session nonce */ - char cs_nonce[NONCE_SIZE]; /* The nonce for this session's next auth transaction */ + /* The Internet type of thing */ + char cs_inet_email[128]; /* Return address of outbound Internet mail */ + char cs_inet_other_emails[1024]; /* User's other valid Internet email addresses */ + char cs_inet_fn[128]; /* Friendly-name of outbound Internet mail */ FILE *download_fp; /* Fields relating to file transfer */ + char download_desired_section[128]; FILE *upload_fp; - char upl_file[SIZ]; - char upl_path[SIZ]; - char upl_comment[SIZ]; - char upl_filedir[SIZ]; + char upl_file[256]; + char upl_path[PATH_MAX]; + char upl_comment[256]; + char upl_filedir[PATH_MAX]; char dl_is_net; char upload_type; - /* Redirect this session's output to somewhere else? */ - FILE *redirect_fp; - int redirect_sock; + struct ctdluser user; /* Database record buffers */ + struct ctdlroom room; + + /* Beginning of cryptography - session nonce */ + char cs_nonce[NONCE_SIZE]; /* The nonce for this session's next auth transaction */ + + /* Redirect this session's output to a memory buffer? */ + char *redirect_buffer; /* the buffer */ + size_t redirect_len; /* length of data in buffer */ + size_t redirect_alloc; /* length of allocated buffer */ +#ifdef HAVE_OPENSSL + SSL *ssl; + int redirect_ssl; +#endif + + int buffering; + char *output_buffer; /* hold output for one big dump */ + int buffer_len; - /* A linked list of all express messages sent to us. */ + /* A linked list of all instant messages sent to us. */ struct ExpressMessage *FirstExpressMessage; int disable_exp; /* Set to 1 to disable incoming pages */ + int newmail; /* Other sessions increment this */ + + /* Masqueraded values in the 'who is online' list */ + char fake_username[USERNAME_SIZE]; + char fake_hostname[64]; + char fake_roomname[ROOMNAMELEN]; - /* Masquerade... */ - char fake_username[USERNAME_SIZE]; /* Fake username */ - char fake_postname[USERNAME_SIZE]; /* Fake postname */ - char fake_hostname[25]; /* Fake hostname */ - char fake_roomname[ROOMNAMELEN]; /* Fake roomname */ + char preferred_formats[256]; /* Preferred MIME formats */ /* Dynamically allocated session data */ - struct CtdlSessData *FirstSessData; + struct citimap *IMAP; + struct citpop3 *POP3; + struct citsmtp *SMTP; + struct citmgsve *MGSVE; /**< Managesieve Session struct */ + char *SMTP_RECPS; + char *SMTP_ROOMS; + struct cit_ical *CIT_ICAL; /* calendaring data */ + struct ma_info *ma; /* multipart/alternative data */ }; typedef struct CitContext t_context; -/* Values for CitContext.state */ +/* + * Values for CitContext.state + * + * A session that is doing nothing is in CON_IDLE state. When activity + * is detected on the socket, it goes to CON_READY, indicating that it + * needs to have a worker thread bound to it. When a thread binds to + * the session, it goes to CON_EXECUTING and does its thing. When the + * transaction is finished, the thread sets it back to CON_IDLE and lets + * it go. + */ enum { CON_IDLE, /* This context is doing nothing */ + CON_READY, /* This context needs attention */ CON_EXECUTING /* This context is bound to a thread */ }; @@ -127,7 +170,20 @@ enum { #define CS_POSTING 4 /* Posting */ struct CitContext *MyContext(void); -#define CC ((struct CitContext *)MyContext()) +#define CC MyContext() + +/* + * This is the control record for the message base... + */ +struct CitControl { + long MMhighest; /* highest message number in file */ + unsigned MMflags; /* Global system flags */ + long MMnextuser; /* highest user number on system */ + long MMnextroom; /* highest room number on system */ + int version; /* Server-hosted upgrade level */ + int fulltext_wordbreaker; /* ID of wordbreaker in use */ + long MMfulltext; /* highest message number indexed */ +}; extern struct CitContext *ContextList; extern int ScheduledShutdown; @@ -159,18 +215,28 @@ struct ChatLine { * Various things we need to lock and unlock */ enum { - S_USERSUPP, - S_QUICKROOM, + S_USERS, + S_ROOMS, S_SESSION_TABLE, S_FLOORTAB, S_CHATQUEUE, S_CONTROL, - S_DATABASE, S_NETDB, S_SUPPMSGMAIN, - S_I_WANNA_SELECT, S_CONFIG, S_WORKER_LIST, + S_HOUSEKEEPING, + S_NTTLIST, + S_DIRECTORY, + S_NETCONFIGS, + S_PUBLIC_CLIENTS, + S_LDAP, + S_FLOORCACHE, + S_DEBUGMEMLEAKS, + S_ATBF, + S_JOURNAL_QUEUE, + S_RPLIST, + S_SIEVELIST, MAX_SEMAPHORES }; @@ -190,7 +256,8 @@ enum { MT_CITADEL, /* Citadel proprietary */ MT_RFC822, /* RFC822 */ MT_MIME, /* MIME-formatted message */ - MT_DOWNLOAD /* Download a component */ + MT_DOWNLOAD, /* Download a component */ + MT_SPEW_SECTION /* Download a component in a single operation */ }; /* @@ -206,11 +273,16 @@ enum { */ enum { CDB_MSGMAIN, /* message base */ - CDB_USERSUPP, /* user file */ - CDB_QUICKROOM, /* room index */ + CDB_USERS, /* user file */ + CDB_ROOMS, /* room index */ CDB_FLOORTAB, /* floor index */ CDB_MSGLISTS, /* room message lists */ CDB_VISIT, /* user/room relationships */ + CDB_DIRECTORY, /* address book directory */ + CDB_USETABLE, /* network use table */ + CDB_BIGMSGS, /* larger message bodies */ + CDB_FULLTEXT, /* full text search index */ + CDB_EUIDINDEX, /* locate msgs by EUID */ MAXCDB /* total number of CDB's defined */ }; @@ -236,6 +308,12 @@ struct CleanupFunctionHook { }; extern struct CleanupFunctionHook *CleanupHookTable; +struct FixedOutputHook { + struct FixedOutputHook *next; + char content_type[64]; + void (*h_function_pointer) (char *, int); +}; +extern struct FixedOutputHook *FixedOutputTable; @@ -264,6 +342,7 @@ extern struct SessionFunctionHook *SessionHookTable; #define EVT_SETPASS 5 /* Setting or changing password */ #define EVT_CMD 6 /* Called after each server command */ #define EVT_RWHO 7 /* An RWHO command is being executed */ +#define EVT_ASYNC 8 /* Doing asynchronous messages */ #define EVT_TIMER 50 /* Timer events are called once per minute and are not tied to any session */ @@ -275,13 +354,13 @@ extern struct SessionFunctionHook *SessionHookTable; */ struct UserFunctionHook { struct UserFunctionHook *next; - void (*h_function_pointer) (char *username, long usernum); + void (*h_function_pointer) (struct ctdluser *usbuf); int eventtype; }; extern struct UserFunctionHook *UserHookTable; #define EVT_PURGEUSER 100 /* Deleting a user */ -#define EVT_OUTPUTMSG 101 /* Outputting a message */ +#define EVT_NEWUSER 102 /* Creating a user */ /* * MessageFunctionHook extensions are used for hooks which implement handlers @@ -297,11 +376,35 @@ extern struct MessageFunctionHook *MessageHookTable; #define EVT_BEFOREREAD 200 #define EVT_BEFORESAVE 201 #define EVT_AFTERSAVE 202 +#define EVT_SMTPSCAN 203 /* called before submitting a msg from SMTP */ + + + +/* + * NetprocFunctionHook extensions are used for hooks which implement handlers + * for incoming network messages. + */ +struct NetprocFunctionHook { + struct NetprocFunctionHook *next; + int (*h_function_pointer) (struct CtdlMessage *msg, char *target_room); +}; +extern struct NetprocFunctionHook *NetprocHookTable; + + +/* + * DeleteFunctionHook extensions are used for hooks which get called when a + * message is about to be deleted. + */ +struct DeleteFunctionHook { + struct DeleteFunctionHook *next; + void (*h_function_pointer) (char *target_room, long msgnum); +}; +extern struct DeleteFunctionHook *DeleteHookTable; /* * ExpressMessageFunctionHook extensions are used for hooks which implement - * the sending of an express message through various channels. Any function + * the sending of an instant message through various channels. Any function * registered should return the number of recipients to whom the message was * successfully transmitted. */ @@ -324,7 +427,7 @@ enum { /* * ServiceFunctionHook extensions are used for hooks which implement various - * non-Citadel services (on TCP protocols) directly in the Citadel server. + * protocols (either on TCP or on unix domain sockets) directly in the Citadel server. */ struct ServiceFunctionHook { struct ServiceFunctionHook *next; @@ -332,6 +435,7 @@ struct ServiceFunctionHook { char *sockpath; void (*h_greeting_function) (void) ; void (*h_command_function) (void) ; + void (*h_async_function) (void) ; int msock; }; extern struct ServiceFunctionHook *ServiceHookTable; @@ -345,77 +449,51 @@ struct visit { long v_usernum; long v_lastseen; unsigned int v_flags; + char v_seen[SIZ]; + char v_answered[SIZ]; + int v_view; }; #define V_FORGET 1 /* User has zapped this room */ #define V_LOCKOUT 2 /* User is locked out of this room */ #define V_ACCESS 4 /* Access is granted to this room */ -#define UA_KNOWN 2 -#define UA_GOTOALLOWED 4 -#define UA_HASNEWMSGS 8 -#define UA_ZAPPED 16 - /* Supplementary data for a message on disk - * (These are kept separately from the message itself because they are - * fields whose values may change at some point after the message is saved.) + * These are kept separate from the message itself for one of two reasons: + * 1. Either their values may change at some point after initial save, or + * 2. They are merely caches of data which exist somewhere else, for speed. */ -struct SuppMsgInfo { - long smi_msgnum; /* Message number in *local* message base */ - int smi_refcount; /* Number of rooms which point to this msg */ - char smi_content_type[64]; - char smi_mod; /* Moderated to what level? */ - /* more stuff will be added to this record in the future */ +struct MetaData { + long meta_msgnum; /* Message number in *local* message base */ + int meta_refcount; /* Number of rooms pointing to this msg */ + char meta_content_type[64]; /* Cached MIME content-type */ + long meta_rfc822_length; /* Cache of RFC822-translated msg length */ }; - - -/* Built-in debuggable stuff for checking for memory leaks */ -#ifdef DEBUG_MEMORY_LEAKS - -#define mallok(howbig) tracked_malloc(howbig, __FILE__, __LINE__) -#define phree(whichptr) tracked_free(whichptr) -#define reallok(whichptr,howbig) tracked_realloc(whichptr,howbig) -#define strdoop(orig) tracked_strdup(orig, __FILE__, __LINE__) - -void *tracked_malloc(size_t, char *, int); -void tracked_free(void *); -void *tracked_realloc(void *, size_t); -void dump_tracked(void); -char *tracked_strdup(const char *, char *, int); - -struct TheHeap { - struct TheHeap *next; - char h_file[32]; - int h_line; - void *h_ptr; +/* Calls to AdjRefCount() are queued and deferred, so the user doesn't + * have to wait for various disk-intensive operations to complete synchronously. + * This is the record format. + */ +struct arcq { + long arcq_msgnum; /* Message number being adjusted */ + int arcq_delta; /* Adjustment ( usually 1 or -1 ) */ }; -extern struct TheHeap *heap; - -#else - -#define mallok(howbig) malloc(howbig) -#define phree(whichptr) free(whichptr) -#define reallok(whichptr,howbig) realloc(whichptr,howbig) -#define strdoop(orig) strdup(orig) - - -#endif - /* * Serialization routines use this struct to return a pointer and a length */ struct ser_ret { size_t len; - char *ser; + unsigned char *ser; }; -/* Preferred field order */ -/* ********** Important fields */ -/* *************** Semi-important fields */ -/* * Message text (MUST be last) */ -#define FORDER "IPTAFONHRDBCEGJKLQSUVWXYZM" +/* Preferred field order */ +/* ********** Important fields */ +/* *************** Semi-important fields */ +/* * Message text (MUST be last) */ +#define FORDER "IPTAFONHRDBCEJGKLQSVWXZYUM" + +#endif /* SERVER_H */