CC->kill_me now contains an enum indicating the REASON session was killed
[citadel.git] / citadel / server.h
index a926a3c14c05c18b9f8a3a0435a044956ead4933..d3b89f21541895a498ec93753d83541cb99f4b79 100644 (file)
@@ -1,4 +1,3 @@
-/* $Id$ */
 
 
 #ifndef SERVER_H
@@ -47,125 +46,32 @@ struct CtdlMessage {
 #define CTDLEXIT_LIBCITADEL    106     /* Incorrect version of libcitadel */
 #define CTDL_EXIT_UNSUP_AUTH   107     /* Unsupported auth mode configured */
 
-
-
 /*
- * 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 */
-       int can_receive_im;     /* Session is capable of receiving instant messages */
-
-       /* Client information */
-       int cs_clientdev;       /* client developer ID */
-       int cs_clienttyp;       /* client type code */
-       int cs_clientver;       /* client version number */
-       uid_t cs_UDSclientUID;  /* the uid of the client when talking via UDS */
-       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 */
-       char *ldap_dn;                          /* DN of user when using AUTHMODE_LDAP */
-};
-
-typedef struct CitContext t_context;
-
-/*
- * 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
 };
 
 
@@ -173,8 +79,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... 
@@ -190,7 +94,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;
 
@@ -207,15 +110,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
  */
@@ -248,6 +142,7 @@ enum {
        S_SCHEDULE_LIST,
        S_SINGLE_USER,
        S_LDAP,
+       S_IM_LOGS,
        MAX_SEMAPHORES
 };
 
@@ -324,6 +219,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 */
@@ -342,7 +238,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;
@@ -351,7 +247,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  */