use an Enum for the cm_fields vector instead of nameless chars
[citadel.git] / citadel / server.h
index 314c7ce258020ced1a209d3127592b10a1091715..10e8bee731ff5e246c196e24c901ee50bc535472 100644 (file)
@@ -1,6 +1,3 @@
-/* $Id$ */
-
-
 #ifndef SERVER_H
 #define SERVER_H
 
@@ -45,123 +42,34 @@ struct CtdlMessage {
 #define CTDLEXIT_OOD           104     /* Out Of Date config - rerun setup */
 #define CTDLEXIT_DB            105     /* Unable to initialize database */
 #define CTDLEXIT_LIBCITADEL    106     /* Incorrect version of libcitadel */
-
-
-
-/*
- * Here's the big one... the Citadel context structure.
- *
- * This structure keeps track of all information relating to a running 
- * session on the server.  We keep one of these for each session thread.
- *
- */
-struct CitContext {
-       struct CitContext *prev;        /* Link to previous session in list */
-       struct CitContext *next;        /* Link to next session in the list */
-
-       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 */
-       int dont_term;          /* for special activities like artv so we don't get killed */
-       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 */
-       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 */
-       int is_master;          /* Is this session logged in using the master user? */
-
-       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 */
-
-       /* 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[64];       /* host logged in from */
-       char cs_addr[64];       /* address logged in from */
-
-       /* 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[256];
-       char upl_path[PATH_MAX];
-       char upl_comment[256];
-       char upl_filedir[PATH_MAX];
-       char upl_mimetype[64];
-       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 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
-
-       /* 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];
-
-       /* Preferred MIME formats */
-       char preferred_formats[256];
-       int msg4_dont_decode;
-
-       /* Dynamically allocated session data */
-       char *session_specific_data;            /* Used by individual protocol modules */
-       struct cit_ical *CIT_ICAL;              /* calendaring data */
-       struct ma_info *ma;                     /* multipart/alternative data */
-       const char *ServiceName;                /* readable purpose of this session */
-       void *openid_data;                      /* Data stored by the OpenID module */
-};
-
-typedef struct CitContext t_context;
+#define CTDL_EXIT_UNSUP_AUTH   107     /* Unsupported auth mode configured */
 
 /*
- * 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.
+ * Reasons why a session would be terminated (set CC->kill_me to these values)
  */
 enum {
-       CON_IDLE,               /* This context is doing nothing */
-       CON_READY,              /* This context needs attention */
-       CON_EXECUTING           /* This context is bound to a thread */
+       KILLME_NOT,
+       KILLME_UNKNOWN,
+       KILLME_CLIENT_LOGGED_OUT,
+       KILLME_IDLE,
+       KILLME_CLIENT_DISCONNECTED,
+       KILLME_AUTHFAILED,
+       KILLME_SERVER_SHUTTING_DOWN,
+       KILLME_MAX_SESSIONS_EXCEEDED,
+       KILLME_ADMIN_TERMINATE,
+       KILLME_SELECT_INTERRUPTED,
+       KILLME_SELECT_FAILED,
+       KILLME_WRITE_FAILED,
+       KILLME_SIMULATION_WORKER,
+       KILLME_NOLOGIN,
+       KILLME_NO_CRYPTO,
+       KILLME_READSTRING_FAILED,
+       KILLME_MALLOC_FAILED,
+       KILLME_QUOTA,
+       KILLME_READ_FAILED,
+       KILLME_ILLEGAL_MANAGESIEVE_COMMAND,
+       KILLME_SPAMMER,
+       KILLME_XML_PARSER
 };
 
 
@@ -169,8 +77,6 @@ enum {
 #define CS_CHAT                2       /* chat mode */
 #define CS_POSTING     4       /* Posting */
 
-struct CitContext *MyContext(void);
-#define CC MyContext()
 
 /*
  * This is the control record for the message base... 
@@ -186,7 +92,6 @@ struct CitControl {
        int MMdbversion;                /* Version of Berkeley DB used on previous server run */
 };
 
-extern struct CitContext *ContextList;
 extern int ScheduledShutdown;
 extern struct CitControl CitControl;
 
@@ -203,15 +108,6 @@ struct ExpressMessage {
 #define EM_GO_AWAY     2       /* Server requests client log off */
 #define EM_CHAT                4       /* Server requests client enter chat */
 
-struct ChatLine {
-       struct ChatLine *next;
-       int chat_seq;
-       time_t chat_time;
-       char chat_text[SIZ];
-       char chat_username[USERNAME_SIZE];
-       char chat_room[ROOMNAMELEN];
-};
-
 /*
  * Various things we need to lock and unlock
  */
@@ -231,7 +127,6 @@ enum {
        S_NETCONFIGS,
        S_PUBLIC_CLIENTS,
        S_FLOORCACHE,
-       S_DEBUGMEMLEAKS,
        S_ATBF,
        S_JOURNAL_QUEUE,
        S_RPLIST,
@@ -239,11 +134,11 @@ enum {
        S_CHKPWD,
        S_LOG,
        S_NETSPOOL,
-       S_THREAD_LIST,
        S_XMPP_QUEUE,
        S_SCHEDULE_LIST,
-       S_SINGLE_USER,
-       S_LDAP,
+       S_SINGLE_USER,
+       S_LDAP,
+       S_IM_LOGS,
        MAX_SEMAPHORES
 };
 
@@ -270,7 +165,7 @@ enum {
 /*
  * Message format types in the database
  */
-#define        FMT_CITADEL     0       /* Citadel vari-format (proprietary) */
+#define FMT_CITADEL    0       /* Citadel vari-format (proprietary) */
 #define FMT_FIXED      1       /* Fixed format (proprietary)        */
 #define FMT_RFC822     4       /* Standard (headers are in M field) */
 
@@ -301,7 +196,7 @@ struct cdbdata {
 };
 
 
-/* 
+/*
  * Event types can't be enum'ed, because they must remain consistent between
  * builds (to allow for binary modules built somewhere else)
  */
@@ -320,6 +215,7 @@ struct cdbdata {
 #define EVT_TIMER      50      /* Timer events are called once per minute
                                   and are not tied to any session */
 #define EVT_HOUSE      51      /* as needed houskeeping stuff */
+#define EVT_SHUTDOWN   52      /* Server is shutting down */
 
 #define EVT_PURGEUSER  100     /* Deleting a user */
 #define EVT_NEWUSER    102     /* Creating a user */
@@ -338,7 +234,7 @@ enum {
 
 
 /* Defines the relationship of a user to a particular room */
-struct visit {
+typedef struct __visit {
        long v_roomnum;
        long v_roomgen;
        long v_usernum;
@@ -347,7 +243,7 @@ struct visit {
        char v_seen[SIZ];
        char v_answered[SIZ];
        int v_view;
-};
+} visit;
 
 #define V_FORGET       1       /* User has zapped this room        */
 #define V_LOCKOUT      2       /* User is locked out of this room  */
@@ -377,12 +273,12 @@ struct arcq {
 };
 
 
-/* 
+/*
  * Serialization routines use this struct to return a pointer and a length
  */
 struct ser_ret {
-        size_t len;
-        unsigned char *ser;
+       size_t len;
+       unsigned char *ser;
 };
 
 
@@ -396,10 +292,40 @@ struct UseTable {
 
 
 
-/* Preferred field order                                                       */
+/* Preferred field order                                                       */
 /*               **********                    Important fields                */
 /*                         ***************     Semi-important fields           */
-/*                                        *    Message text (MUST be last)     */
-#define FORDER "IPTAFONHRDBCEWJGKLQSVXZYUM"
+/*                                        **   internal only                   */
+/*                                          *  Message text (MUST be last)     */
+///#define FORDER      "IPTAFONHRDBCEWJGKLQSVXZYU12M"
+
+typedef enum _MsgField {
+       eAuthor       = 'A',
+       eBig_message  = 'B',
+       eRemoteRoom   = 'C',
+       eDestination  = 'D',
+       eExclusiveID  = 'E',
+       erFc822Addr   = 'F',
+       eHumanNode    = 'H',
+       emessageId    = 'I',
+       eJournal      = 'J',
+       eReplyTo      = 'K',
+       eListID       = 'L',
+       eMesageText   = 'M',
+       eNodeName     = 'N',
+       eOriginalRoom = 'O',
+       eMessagePath  = 'P',
+       eRecipient    = 'R',
+       eSpecialField = 'S',
+       eTimestamp    = 'T',
+       eMsgSubject   = 'U',
+       eenVelopeTo   = 'V',
+       eWeferences   = 'W',
+       eCarbonCopY   = 'Y',
+       eErrorMsg     = '0',
+       eSuppressIdx  = '1',
+       eExtnotify    = '2',
+       eVltMsgNum    = '3'
+}eMsgField;
 
 #endif /* SERVER_H */