#include "citadel.h"
#ifdef HAVE_OPENSSL
+#define OPENSSL_NO_KRB5 /* work around redhat b0rken ssl headers */
#include <openssl/ssl.h>
#endif
#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. Server extensions can ask for dynamic
- * extensions to per-session data, but the symbol ID has to be listed here.
- */
-enum {
- SYM_DESIRED_SECTION, /* Used by the MIME parser */
- SYM_MA_INFO, /* Handles multipart/alternative */
- SYM_REPL, /* Used for replication checking */
- SYM_CIT_ICAL, /* Used by the calendar service */
- SYM_IMAP, /* Used by the IMAP service */
- SYM_POP3, /* Used by the POP3 service */
- SYM_SMTP, /* Used by the SMTP service */
- SYM_SMTP_RECPS,
- SYM_SMTP_ROOMS,
- SYM_VCARD, /* vCard handling requires this */
- SYM_MAX
-};
-
-
/*
* Here's the big one... the Citadel context structure.
*
* 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 ctdluser user; /* Database record buffers */
- struct ctdlroom room;
-
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 */
char temp[PATH_MAX]; /* 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[PATH_MAX];/* Is the client another Citadel server? */
- int client_socket;
- int cs_pid; /* session ID */
- time_t lastcmd; /* time of last command executed */
- time_t lastidle; /* For computing idle time */
time_t previous_login; /* Date/time of previous login */
char lastcmdname[5]; /* name of last command executed */
unsigned cs_flags; /* miscellaneous flags */
char cs_inet_email[SIZ];/* Return address of outbound Internet mail */
FILE *download_fp; /* Fields relating to file transfer */
+ char download_desired_section[128];
FILE *upload_fp;
char upl_file[PATH_MAX];
char upl_path[PATH_MAX];
char dl_is_net;
char upload_type;
+ 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 somewhere else? */
- FILE *redirect_fp;
- int redirect_sock;
+ FILE *redirect_fp; /* a file instead (will go away) */
+ 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;
char preferred_formats[SIZ]; /* Preferred MIME formats */
/* Dynamically allocated session data */
- struct CtdlSessData *FirstSessData;
+ struct citimap *IMAP;
+ struct citpop3 *POP3;
+ struct citsmtp *SMTP;
+ 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;
enum {
CON_IDLE, /* This context is doing nothing */
CON_READY, /* This context needs attention */
- CON_EXECUTING, /* This context is bound to a thread */
+ CON_EXECUTING /* This context is bound to a thread */
};
S_FLOORTAB,
S_CHATQUEUE,
S_CONTROL,
- S_DATABASE,
S_NETDB,
S_SUPPMSGMAIN,
S_CONFIG,
/* 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 MetaData {
- long meta_msgnum; /* Message number in *local* message base */
- int meta_refcount; /* Number of rooms which point to this msg */
- char meta_content_type[64];
- /* more stuff will be added to this record in the future */
+ 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 */
};
*/
struct ser_ret {
size_t len;
- char *ser;
+ unsigned char *ser;
};