/* $Id$ */
-typedef pthread_t THREAD;
/* 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
+/*
+ * New format for a message in memory
+ */
+#define CTDLMESSAGE_MAGIC 0x159d
+struct CtdlMessage {
+ int cm_magic; /* Self-check */
+ 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 CM_SKIP_HOOKS 0x01 /* Don't run server-side handlers */
+
/*
* Generic per-session variable or data structure storage
*/
enum {
SYM_DESIRED_SECTION, /* Used by the MIME parser */
+ SYM_MA_INFO, /* Handles multipart/alternative */
+ SYM_REPL, /* Used for replication checking */
SYM_MAX
};
struct usersupp usersupp; /* Database record buffers */
struct quickroom quickroom;
- long *msglist;
- int num_msgs;
+ int state; /* thread state (see CON_ values below) */
char curr_user[32]; /* name of current user */
int logged_in; /* logged in */
int nologin; /* not allowed to log in */
char net_node[32];
- THREAD mythread;
- int n_crit; /* number of critical sections open */
int client_socket;
int cs_pid; /* session ID */
- char cs_room[ROOMNAMELEN]; /* current room */
time_t cs_lastupdt; /* time of last update */
time_t lastcmd; /* time of last command executed */
time_t lastidle; /* For computing idle time */
int cs_clienttyp; /* client type code */
int cs_clientver; /* client version number */
char cs_clientname[32]; /* name of client software */
- char cs_host[25]; /* host logged in from */
+ char cs_host[26]; /* host logged in from */
FILE *download_fp; /* Fields relating to file transfer */
FILE *upload_fp;
typedef struct CitContext t_context;
+/* Values for CitContext.state */
+enum {
+ CON_IDLE, /* This context is doing nothing */
+ CON_EXECUTING, /* This context is bound to a thread */
+ CON_DYING /* This context is being terminated */
+};
+
+
#define CS_STEALTH 1 /* stealth mode */
#define CS_CHAT 2 /* chat mode */
#define CS_POSTING 4 /* Posting */
S_DATABASE,
S_NETDB,
S_SUPPMSGMAIN,
+ S_I_WANNA_SELECT,
MAX_SEMAPHORES
};
*/
enum {
MT_CITADEL, /* Citadel proprietary */
- MT_DATE, /* We're only looking for the date */
MT_RFC822, /* RFC822 */
- MT_RAW, /* IGnet raw format */
MT_MIME, /* MIME-formatted message */
MT_DOWNLOAD /* Download a component */
};
};
+
/* Structures and declarations for function hooks of various types */
struct LogFunctionHook {
extern struct CleanupFunctionHook *CleanupHookTable;
+
+
/*
* SessionFunctionHook extensions are used for any type of hook for which
* the context in which it's being called (which is determined by the event
#define EVT_LOGOUT 4 /* A user is logging out */
#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_OUTPUTMSG 101 /* Outputting a message */
+/*
+ * MessageFunctionHook extensions are used for hooks which implement handlers
+ * for various types of message operations (save, read, etc.)
+ */
+struct MessageFunctionHook {
+ struct MessageFunctionHook *next;
+ int (*h_function_pointer) (struct CtdlMessage *msg);
+ int eventtype;
+};
+extern struct MessageFunctionHook *MessageHookTable;
+
+#define EVT_BEFOREREAD 200
+#define EVT_BEFORESAVE 201
+#define EVT_AFTERSAVE 202
+
+
+/*
+ * ExpressMessageFunctionHook extensions are used for hooks which implement
+ * the sending of an express message through various channels. Any function
+ * registered should return the number of recipients to whom the message was
+ * successfully transmitted.
+ */
+struct XmsgFunctionHook {
+ struct XmsgFunctionHook *next;
+ int (*h_function_pointer) (char *, char *, char *);
+ int order;
+};
+extern struct XmsgFunctionHook *XmsgHookTable;
+
+/* Priority levels for paging functions (lower is better) */
+enum {
+ XMSG_PRI_LOCAL, /* Other users on -this- server */
+ XMSG_PRI_REMOTE, /* Other users on a Citadel network (future) */
+ XMSG_PRI_FOREIGN, /* Contacts on foreign instant message hosts */
+ MAX_XMSG_PRI
+};
+
+
+
+
+
/* Defines the relationship of a user to a particular room */
struct visit {
long v_roomnum;
/* 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 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;
#else
-#define mallok(howbig) malloc(howbig)
-#define phree(whichptr) free(whichptr)
+#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;
+};
+
+
+/* Preferred field order */
+/* ********* Important fields */
+/* **************** Semi-important fields */
+/* * Message text (MUST be last) */
+#define FORDER "IPTAONHRDBCEFGJKLQSUVWXYZM"