* server.h: Changed discrete #define's to enum's where appropriate
* sysdep.c: Changed the startup message to give credit to the whole
development team :) Also made the message more GNU-ish.
+Fri May 21 20:05:00 EDT 1999 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
+ * Added function CtdlGetDynamicSymbol() for dynamic symbol allocation
+ * server.h: Changed discrete #define's to enum's where appropriate
+ * sysdep.c: Changed the startup message to give credit to the whole
+ development team :) Also made the message more GNU-ish.
+
Thu May 20 20:01:30 EDT 1999 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
* database.c: print log messages for file defragmentations
* citserver.c: implemented CtdlAllocUserData() and CtdlGetUserData()
Thu May 20 20:01:30 EDT 1999 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
* database.c: print log messages for file defragmentations
* citserver.c: implemented CtdlAllocUserData() and CtdlGetUserData()
is checked for in config.c
1999-04-08 Nathan Bryant <bryant@cs.usm.maine.edu>
is checked for in config.c
1999-04-08 Nathan Bryant <bryant@cs.usm.maine.edu>
- * citserver.c: improved is_public_client(), also if a public_client only
- supplies a numeric address, attempt to resolve it
+ * citserver.c: improved is_public_client(), also if a public_client
+ only supplies a numeric address, attempt to resolve it
* locate_host.c: verify that the forward DNS matches the reverse
* locate_host.c, locate_host.h: more general interface
* configure.in, acconfig.h: fixes for Digital UNIX
* locate_host.c: verify that the forward DNS matches the reverse
* locate_host.c, locate_host.h: more general interface
* configure.in, acconfig.h: fixes for Digital UNIX
1999-04-07 Nathan Bryant <bryant@cs.usm.maine.edu>
* configure.in: updated help messages, OpenBSD support
1999-04-07 Nathan Bryant <bryant@cs.usm.maine.edu>
* configure.in: updated help messages, OpenBSD support
- * setup.c: if /etc/inittab doesn't exist, don't ask to create an entry
- in it
+ * setup.c: if /etc/inittab doesn't exist, don't ask to create an
+ entry in it
* server.h, sysdep.c: fix a potential deadlock/data corruption bug
* room_ops.c: fixed the 'gdbm error: Illegal data' message when
deleting a room which had never been posted to
* server.h, sysdep.c: fix a potential deadlock/data corruption bug
* room_ops.c: fixed the 'gdbm error: Illegal data' message when
deleting a room which had never been posted to
+/*
+ * Get a dynamic symbol number for per-session user data.
+ * This API call should be made only ONCE per symbol per citserver run.
+ */
+int CtdlGetDynamicSymbol()
+{
+ static unsigned int next_symbol = SYM_MAX;
+ return ++next_symbol;
+}
+
+
/*
* Return a pointer to some generic per-session user data.
/*
* Return a pointer to some generic per-session user data.
void deallocate_user_data(struct CitContext *con);
void *CtdlGetUserData(unsigned long requested_sym);
void CtdlAllocUserData(unsigned long requested_sym, size_t num_bytes);
void deallocate_user_data(struct CitContext *con);
void *CtdlGetUserData(unsigned long requested_sym);
void CtdlAllocUserData(unsigned long requested_sym, size_t num_bytes);
+int CtdlGetDynamicSymbol(void);
/* Hmm... we should decide when would be a good time to defrag.
* Server shutdowns might be an opportune time.
/* Hmm... we should decide when would be a good time to defrag.
* Server shutdowns might be an opportune time.
begin_critical_section(S_DATABASE);
for (a=0; a<MAXCDB; ++a) {
begin_critical_section(S_DATABASE);
for (a=0; a<MAXCDB; ++a) {
struct SessionFunctionHook *SessionHookTable = NULL;
struct UserFunctionHook *UserHookTable = NULL;
struct SessionFunctionHook *SessionHookTable = NULL;
struct UserFunctionHook *UserHookTable = NULL;
-struct ProtoFunctionHook
-{
- void (*handler)(char *cmdbuf);
- char *cmd;
- char *desc;
- struct ProtoFunctionHook *next;
+struct ProtoFunctionHook {
+ void (*handler) (char *cmdbuf);
+ char *cmd;
+ char *desc;
+ struct ProtoFunctionHook *next;
-void CtdlRegisterProtoHook(void (*handler)(char *), char *cmd, char *desc)
+void CtdlRegisterProtoHook(void (*handler) (char *), char *cmd, char *desc)
- struct ProtoFunctionHook *p = mallok(sizeof *p);
-
- if (p == NULL)
- {
- fprintf(stderr, "can't malloc new ProtoFunctionHook\n");
- exit(EXIT_FAILURE);
- }
-
- p->handler = handler;
- p->cmd = cmd;
- p->desc = desc;
- p->next = ProtoHookList;
- ProtoHookList = p;
+ struct ProtoFunctionHook *p = mallok(sizeof *p);
+
+ if (p == NULL) {
+ fprintf(stderr, "can't malloc new ProtoFunctionHook\n");
+ exit(EXIT_FAILURE);
+ }
+ p->handler = handler;
+ p->cmd = cmd;
+ p->desc = desc;
+ p->next = ProtoHookList;
+ ProtoHookList = p;
}
int DLoader_Exec_Cmd(char *cmdbuf)
{
}
int DLoader_Exec_Cmd(char *cmdbuf)
{
- struct ProtoFunctionHook *p;
-
- for (p = ProtoHookList; p; p = p->next)
- {
- if (!strncasecmp(cmdbuf, p->cmd, 4))
- {
- p->handler(&cmdbuf[5]);
- return 1;
+ struct ProtoFunctionHook *p;
+
+ for (p = ProtoHookList; p; p = p->next) {
+ if (!strncasecmp(cmdbuf, p->cmd, 4)) {
+ p->handler(&cmdbuf[5]);
+ return 1;
+ }
}
void DLoader_Init(char *pathname)
{
}
void DLoader_Init(char *pathname)
{
- void *fcn_handle;
- const char *dl_error;
- DIR *dir;
- struct dirent *dptr;
- struct DLModule_Info* (*h_init_fcn)(void);
- struct DLModule_Info *dl_info;
-
- char pathbuf[PATH_MAX];
-
- if ((dir = opendir(pathname))==NULL)
- {
- perror("opendir");
- exit(1);
- }
-
- while ((dptr=readdir(dir))!= NULL)
- {
- if (dptr->d_name[0] == '.')
- continue;
-
- snprintf(pathbuf, PATH_MAX, "%s/%s", pathname, dptr->d_name);
+ void *fcn_handle;
+ const char *dl_error;
+ DIR *dir;
+ struct dirent *dptr;
+ struct DLModule_Info *(*h_init_fcn) (void);
+ struct DLModule_Info *dl_info;
+
+ char pathbuf[PATH_MAX];
+
+ if ((dir = opendir(pathname)) == NULL) {
+ perror("opendir");
+ exit(1);
+ }
+ while ((dptr = readdir(dir)) != NULL) {
+ if (dptr->d_name[0] == '.')
+ continue;
+
+ snprintf(pathbuf, PATH_MAX, "%s/%s", pathname, dptr->d_name);
- if (!(fcn_handle = dlopen(pathbuf, RTLD_NOW)))
-#else /* OpenBSD */
- if (!(fcn_handle = dlopen(pathbuf, DL_LAZY)))
+ if (!(fcn_handle = dlopen(pathbuf, RTLD_NOW)))
+#else /* OpenBSD */
+ if (!(fcn_handle = dlopen(pathbuf, DL_LAZY)))
- {
- dl_error = dlerror();
- fprintf(stderr, "DLoader_Init dlopen failed (%s)\n", dl_error);
- continue;
- }
-
- h_init_fcn = (struct DLModule_Info * (*)(void))
+ {
+ /* dl_error = dlerror(); */
+ fprintf(stderr, "DLoader_Init dlopen failed\n");
+ continue;
+ }
+ h_init_fcn = (struct DLModule_Info * (*)(void))
- dlsym(fcn_handle, "Dynamic_Module_Init");
+ dlsym(fcn_handle, "Dynamic_Module_Init");
- dlsym(fcn_handle, "_Dynamic_Module_Init");
+ dlsym(fcn_handle, "_Dynamic_Module_Init");
- if ((dl_error = dlerror()) != NULL)
- {
- fprintf(stderr,"DLoader_Init dlsym failed (%s)\n", dl_error);
- continue;
- }
-
- dl_info = h_init_fcn();
-
- printf("Loaded module %s v%d.%d\nBy %s (%s)\n", dl_info->module_name,
- dl_info->major_version, dl_info->minor_version,
- dl_info->module_author, dl_info->module_author_email);
- } /* While */
+ if ((dl_error = dlerror()) != NULL) {
+ fprintf(stderr, "DLoader_Init dlsym failed (%s)\n", dl_error);
+ continue;
+ }
+ dl_info = h_init_fcn();
+
+ printf("Loaded module: %s v%d.%d\nBy %s (%s)\n", dl_info->module_name,
+ dl_info->major_version, dl_info->minor_version,
+ dl_info->module_author, dl_info->module_author_email);
+ } /* While */
-void CtdlRegisterLogHook(void (*fcn_ptr)(char *), int loglevel) {
+void CtdlRegisterLogHook(void (*fcn_ptr) (char *), int loglevel)
+{
struct LogFunctionHook *newfcn;
newfcn = (struct LogFunctionHook *)
struct LogFunctionHook *newfcn;
newfcn = (struct LogFunctionHook *)
- mallok(sizeof(struct LogFunctionHook));
+ mallok(sizeof(struct LogFunctionHook));
newfcn->next = LogHookTable;
newfcn->h_function_pointer = fcn_ptr;
newfcn->loglevel = loglevel;
LogHookTable = newfcn;
lprintf(5, "Registered a new logging function\n");
newfcn->next = LogHookTable;
newfcn->h_function_pointer = fcn_ptr;
newfcn->loglevel = loglevel;
LogHookTable = newfcn;
lprintf(5, "Registered a new logging function\n");
-void CtdlRegisterCleanupHook(void (*fcn_ptr)(void)) {
+void CtdlRegisterCleanupHook(void (*fcn_ptr) (void))
+{
struct CleanupFunctionHook *newfcn;
newfcn = (struct CleanupFunctionHook *)
struct CleanupFunctionHook *newfcn;
newfcn = (struct CleanupFunctionHook *)
- mallok(sizeof(struct CleanupFunctionHook));
+ mallok(sizeof(struct CleanupFunctionHook));
newfcn->next = CleanupHookTable;
newfcn->h_function_pointer = fcn_ptr;
CleanupHookTable = newfcn;
lprintf(5, "Registered a new cleanup function\n");
newfcn->next = CleanupHookTable;
newfcn->h_function_pointer = fcn_ptr;
CleanupHookTable = newfcn;
lprintf(5, "Registered a new cleanup function\n");
-void CtdlRegisterSessionHook(void (*fcn_ptr)(void), int EventType) {
+void CtdlRegisterSessionHook(void (*fcn_ptr) (void), int EventType)
+{
struct SessionFunctionHook *newfcn;
newfcn = (struct SessionFunctionHook *)
struct SessionFunctionHook *newfcn;
newfcn = (struct SessionFunctionHook *)
- mallok(sizeof(struct SessionFunctionHook));
+ mallok(sizeof(struct SessionFunctionHook));
newfcn->next = SessionHookTable;
newfcn->h_function_pointer = fcn_ptr;
newfcn->eventtype = EventType;
SessionHookTable = newfcn;
newfcn->next = SessionHookTable;
newfcn->h_function_pointer = fcn_ptr;
newfcn->eventtype = EventType;
SessionHookTable = newfcn;
- lprintf(5, "Registered a new session function (type %d)\n",
+ lprintf(5, "Registered a new session function (type %d)\n",
-void CtdlRegisterUserHook(void (*fcn_ptr)(char*, long), int EventType) {
+void CtdlRegisterUserHook(void (*fcn_ptr) (char *, long), int EventType)
+{
struct UserFunctionHook *newfcn;
newfcn = (struct UserFunctionHook *)
struct UserFunctionHook *newfcn;
newfcn = (struct UserFunctionHook *)
- mallok(sizeof(struct UserFunctionHook));
+ mallok(sizeof(struct UserFunctionHook));
newfcn->next = UserHookTable;
newfcn->h_function_pointer = fcn_ptr;
newfcn->eventtype = EventType;
UserHookTable = newfcn;
newfcn->next = UserHookTable;
newfcn->h_function_pointer = fcn_ptr;
newfcn->eventtype = EventType;
UserHookTable = newfcn;
- lprintf(5, "Registered a new user function (type %d)\n",
+ lprintf(5, "Registered a new user function (type %d)\n",
-void PerformSessionHooks(int EventType) {
+void PerformSessionHooks(int EventType)
+{
struct SessionFunctionHook *fcn;
struct SessionFunctionHook *fcn;
- for (fcn = SessionHookTable; fcn != NULL; fcn = fcn->next) {
+ for (fcn = SessionHookTable; fcn != NULL; fcn = fcn->next) {
if (fcn->eventtype == EventType) {
if (fcn->eventtype == EventType) {
- (*fcn->h_function_pointer)();
- }
- }
+ (*fcn->h_function_pointer) ();
+ }
-void PerformLogHooks(int loglevel, char *logmsg) {
+void PerformLogHooks(int loglevel, char *logmsg)
+{
struct LogFunctionHook *fcn;
for (fcn = LogHookTable; fcn != NULL; fcn = fcn->next) {
if (fcn->loglevel >= loglevel) {
struct LogFunctionHook *fcn;
for (fcn = LogHookTable; fcn != NULL; fcn = fcn->next) {
if (fcn->loglevel >= loglevel) {
- (*fcn->h_function_pointer)(logmsg);
- }
+ (*fcn->h_function_pointer) (logmsg);
-void PerformUserHooks(char *username, long usernum, int EventType) {
+void PerformUserHooks(char *username, long usernum, int EventType)
+{
struct UserFunctionHook *fcn;
struct UserFunctionHook *fcn;
- for (fcn = UserHookTable; fcn != NULL; fcn = fcn->next) {
+ for (fcn = UserHookTable; fcn != NULL; fcn = fcn->next) {
if (fcn->eventtype == EventType) {
if (fcn->eventtype == EventType) {
- (*fcn->h_function_pointer)(username, usernum);
- }
- }
+ (*fcn->h_function_pointer) (username, usernum);
+ }
- * For the time being, all known userdata symbols are defined here.
+ * Static user data symbol types
-#define SYM_DESIRED_SECTION 0x00000001
+enum {
+ SYM_DESIRED_SECTION, /* Used by the MIME parser */
+ SYM_MAX
+};
char lastcmdname[5]; /* name of last command executed */
unsigned cs_flags; /* miscellaneous flags */
char lastcmdname[5]; /* name of last command executed */
unsigned cs_flags; /* miscellaneous flags */
- /* feeping creaturisms... */
+ /* feeping creaturisms... */
int cs_clientdev; /* client developer ID */
int cs_clienttyp; /* client type code */
int cs_clientver; /* client version number */
int cs_clientdev; /* client developer ID */
int cs_clienttyp; /* client type code */
int cs_clientver; /* client version number */
char fake_username[32]; /* Fake username <bc> */
char fake_postname[32]; /* Fake postname <bc> */
char fake_hostname[25]; /* Name of the fake hostname <bc> */
char fake_username[32]; /* Fake username <bc> */
char fake_postname[32]; /* Fake postname <bc> */
char fake_hostname[25]; /* Name of the fake hostname <bc> */
- char fake_roomname[ROOMNAMELEN]; /* Name of the fake room <bc> */
+ char fake_roomname[ROOMNAMELEN]; /* Name of the fake room <bc> */
- int FloorBeingSearched; /* This is used by cmd_lrms() etc. */
+ int FloorBeingSearched; /* This is used by cmd_lrms() etc. */
struct CtdlSessData *FirstSessData;
};
struct CtdlSessData *FirstSessData;
};
/*
* Various things we need to lock and unlock
*/
/*
* Various things we need to lock and unlock
*/
-#define S_USERSUPP 0
-#define S_USER_TRANS 1
-#define S_QUICKROOM 2
-#define S_MSGMAIN 3
-#define S_CALLLOG 4
-#define S_SESSION_TABLE 5
-#define S_FLOORTAB 6
-#define S_CHATQUEUE 7
-#define S_CONTROL 8
-#define S_HOUSEKEEPING 9
-#define S_DATABASE 10
-#define S_NETDB 11
-#define MAX_SEMAPHORES 12
+enum {
+ S_USERSUPP,
+ S_USER_TRANS,
+ S_QUICKROOM,
+ S_MSGMAIN,
+ S_CALLLOG,
+ S_SESSION_TABLE,
+ S_FLOORTAB,
+ S_CHATQUEUE,
+ S_CONTROL,
+ S_HOUSEKEEPING,
+ S_DATABASE,
+ S_NETDB,
+ MAX_SEMAPHORES
+};
/*
* message transfer formats
*/
/*
* message transfer formats
*/
-#define MT_CITADEL 0 /* Citadel proprietary */
-#define MT_DATE 1 /* We're only looking for the date */
-#define MT_RFC822 2 /* RFC822 */
-#define MT_RAW 3 /* IGnet raw format */
-#define MT_MIME 4 /* MIME-formatted message */
-#define MT_DOWNLOAD 5 /* Download a component */
+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 */
+};
/*
* Citadel DataBases (define one for each cdb we need to open)
*/
/*
* Citadel DataBases (define one for each cdb we need to open)
*/
-#define CDB_MSGMAIN 0 /* message base */
-#define CDB_USERSUPP 1 /* user file */
-#define CDB_QUICKROOM 2 /* room index */
-#define CDB_FLOORTAB 3 /* floor index */
-#define CDB_MSGLISTS 4 /* room message lists */
-#define CDB_VISIT 5 /* user/room relationships */
-#define MAXCDB 6 /* total number of CDB's defined */
+enum {
+ CDB_MSGMAIN, /* message base */
+ CDB_USERSUPP, /* user file */
+ CDB_QUICKROOM, /* room index */
+ CDB_FLOORTAB, /* floor index */
+ CDB_MSGLISTS, /* room message lists */
+ CDB_VISIT, /* user/room relationships */
+ MAXCDB /* total number of CDB's defined */
+};
struct cdbdata {
size_t len;
struct cdbdata {
size_t len;
};
extern struct SessionFunctionHook *SessionHookTable;
};
extern struct SessionFunctionHook *SessionHookTable;
+/*
+ * Event types can't be enum'ed, because they must remain consistent between
+ * builds (to allow for binary modules built somewhere else)
+ */
#define EVT_STOP 0 /* Session is terminating */
#define EVT_START 1 /* Session is starting */
#define EVT_LOGIN 2 /* A user is logging in */
#define EVT_STOP 0 /* Session is terminating */
#define EVT_START 1 /* Session is starting */
#define EVT_LOGIN 2 /* A user is logging in */
}
/* Tell 'em who's in da house */
}
/* Tell 'em who's in da house */
- lprintf(1, "Multithreaded message server for %s\n", CITADEL);
- lprintf(1, "Copyright (C) 1987-1999 by Art Cancro. ");
- lprintf(1, "All rights reserved.\n\n");
+ lprintf(1,
+"\nMultithreaded message server for Citadel/UX\n"
+"Copyright (C) 1987-1999 by the Citadel/UX development team.\n"
+"Citadel/UX is free software, covered by the GNU General Public License, and\n"
+"you are welcome to change it and/or distribute copies of it under certain\n"
+"conditions. There is absolutely no warranty for this software. Please\n"
+"read the 'COPYING.txt' file for details.\n\n");
/* Initialize... */
init_sysdep();
/* Initialize... */
init_sysdep();