From 7eda06f15186213bc85e7fa448a48e25011ba8f5 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Sat, 22 May 1999 00:23:20 +0000 Subject: [PATCH] * 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. --- citadel/ChangeLog | 14 ++- citadel/citserver.c | 11 +++ citadel/citserver.h | 1 + citadel/database.c | 2 +- citadel/dynloader.c | 201 +++++++++++++++++++++----------------------- citadel/server.h | 75 ++++++++++------- citadel/sysdep.c | 10 ++- 7 files changed, 172 insertions(+), 142 deletions(-) diff --git a/citadel/ChangeLog b/citadel/ChangeLog index a235422fc..4c7189d7e 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,3 +1,9 @@ +Fri May 21 20:05:00 EDT 1999 Art Cancro + * 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 * database.c: print log messages for file defragmentations * citserver.c: implemented CtdlAllocUserData() and CtdlGetUserData() @@ -86,8 +92,8 @@ Thu Apr 8 22:51:28 EDT 1999 Art Cancro is checked for in config.c 1999-04-08 Nathan Bryant - * 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 @@ -97,8 +103,8 @@ Wed Apr 7 21:36:16 EDT 1999 Art Cancro 1999-04-07 Nathan Bryant * 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 diff --git a/citadel/citserver.c b/citadel/citserver.c index 45e36721a..44a98d021 100644 --- a/citadel/citserver.c +++ b/citadel/citserver.c @@ -152,6 +152,17 @@ void cleanup_stuff(void *arg) } +/* + * 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. diff --git a/citadel/citserver.h b/citadel/citserver.h index 2f4534f19..04e1458bf 100644 --- a/citadel/citserver.h +++ b/citadel/citserver.h @@ -26,3 +26,4 @@ void *context_loop (struct CitContext *con); 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); diff --git a/citadel/database.c b/citadel/database.c index 4dcda3e30..ee2e2422f 100644 --- a/citadel/database.c +++ b/citadel/database.c @@ -179,8 +179,8 @@ void close_databases(void) { /* Hmm... we should decide when would be a good time to defrag. * Server shutdowns might be an opportune time. - */ defrag_databases(); + */ begin_critical_section(S_DATABASE); for (a=0; ahandler = 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) { - 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; + } } - } - return 0; + return 0; } 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); #ifdef RTLD_NOW - 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))) #endif - { - 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)) #ifndef __OpenBSD__ - dlsym(fcn_handle, "Dynamic_Module_Init"); + dlsym(fcn_handle, "Dynamic_Module_Init"); #else - dlsym(fcn_handle, "_Dynamic_Module_Init"); + dlsym(fcn_handle, "_Dynamic_Module_Init"); #endif - 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 *) - 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"); - } +} -void CtdlRegisterCleanupHook(void (*fcn_ptr)(void)) { +void CtdlRegisterCleanupHook(void (*fcn_ptr) (void)) +{ 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"); - } +} -void CtdlRegisterSessionHook(void (*fcn_ptr)(void), int EventType) { +void CtdlRegisterSessionHook(void (*fcn_ptr) (void), int EventType) +{ 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; - lprintf(5, "Registered a new session function (type %d)\n", + lprintf(5, "Registered a new session function (type %d)\n", EventType); - } +} -void CtdlRegisterUserHook(void (*fcn_ptr)(char*, long), int EventType) { +void CtdlRegisterUserHook(void (*fcn_ptr) (char *, long), int EventType) +{ 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; - lprintf(5, "Registered a new user function (type %d)\n", + lprintf(5, "Registered a new user function (type %d)\n", EventType); - } +} -void PerformSessionHooks(int EventType) { +void PerformSessionHooks(int EventType) +{ struct SessionFunctionHook *fcn; - for (fcn = SessionHookTable; fcn != NULL; fcn = fcn->next) { + for (fcn = SessionHookTable; fcn != NULL; fcn = fcn->next) { 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) { - (*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; - for (fcn = UserHookTable; fcn != NULL; fcn = fcn->next) { + for (fcn = UserHookTable; fcn != NULL; fcn = fcn->next) { if (fcn->eventtype == EventType) { - (*fcn->h_function_pointer)(username, usernum); - } - } + (*fcn->h_function_pointer) (username, usernum); + } } - +} diff --git a/citadel/server.h b/citadel/server.h index d7c2361dc..0c954bb4b 100644 --- a/citadel/server.h +++ b/citadel/server.h @@ -17,9 +17,12 @@ struct CtdlSessData { }; /* - * 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 +}; /* @@ -58,7 +61,7 @@ struct CitContext { 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 */ @@ -80,9 +83,9 @@ struct CitContext { char fake_username[32]; /* Fake username */ char fake_postname[32]; /* Fake postname */ char fake_hostname[25]; /* Name of the fake hostname */ - char fake_roomname[ROOMNAMELEN]; /* Name of the fake room */ + char fake_roomname[ROOMNAMELEN]; /* Name of the fake room */ - int FloorBeingSearched; /* This is used by cmd_lrms() etc. */ + int FloorBeingSearched; /* This is used by cmd_lrms() etc. */ struct CtdlSessData *FirstSessData; }; @@ -124,19 +127,21 @@ struct ChatLine { /* * 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 +}; /* @@ -150,24 +155,28 @@ struct ChatLine { /* * 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) */ -#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; @@ -204,6 +213,10 @@ struct SessionFunctionHook { }; 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 */ diff --git a/citadel/sysdep.c b/citadel/sysdep.c index fbc42d2ab..43d635573 100644 --- a/citadel/sysdep.c +++ b/citadel/sysdep.c @@ -842,9 +842,13 @@ int main(int argc, char **argv) } /* 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(); -- 2.30.2