* Added function CtdlGetDynamicSymbol() for dynamic symbol allocation
authorArt Cancro <ajc@citadel.org>
Sat, 22 May 1999 00:23:20 +0000 (00:23 +0000)
committerArt Cancro <ajc@citadel.org>
Sat, 22 May 1999 00:23:20 +0000 (00:23 +0000)
        * 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
citadel/citserver.c
citadel/citserver.h
citadel/database.c
citadel/dynloader.c
citadel/server.h
citadel/sysdep.c

index a235422fc5f2341ad9791f249cd3c3f061eab063..4c7189d7e43274bcd30928fbf4e87c1ca4404e77 100644 (file)
@@ -1,3 +1,9 @@
+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()
@@ -86,8 +92,8 @@ Thu Apr  8 22:51:28 EDT 1999 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
          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
@@ -97,8 +103,8 @@ Wed Apr  7 21:36:16 EDT 1999 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
 
 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
index 45e36721a170baa86aba19403a5cf164289f70fc..44a98d021bbf27470c04e1e362a7e5a8ecb3d733 100644 (file)
@@ -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.
index 2f4534f1962c7efda3b74924fc5285f19df607d8..04e1458bf066facccafeb101eaf46c86101c0a15 100644 (file)
@@ -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);
index 4dcda3e30ba1321eeb9cdf0640671e186a5babd5..ee2e2422fe4e43662c31bbc81dfbcac0da32a1d5 100644 (file)
@@ -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; a<MAXCDB; ++a) {
index acd66c1dff46c2335fc1a22bcf5485d5f459471c..1f6dab1cd164c956ab981a0492d1775ad5346872 100644 (file)
@@ -36,191 +36,186 @@ struct CleanupFunctionHook *CleanupHookTable = 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;
 } *ProtoHookList = NULL;
 
-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)
 {
-  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);
+               }
        }
-
+}
index d7c2361dcce4ae96783876a023e005f30980fb4b..0c954bb4b6551d63063ecbb7ca9b6fbdb3ecee31 100644 (file)
@@ -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 <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;
 };
 
@@ -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 */
index fbc42d2ab1924950df03960e5a8cecb74c83d45b..43d6355735da7eef6cf45e1b5bb3eff5a473d522 100644 (file)
@@ -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();