]> code.citadel.org Git - citadel.git/blobdiff - citadel/citserver.c
* Got bounce messages working (mostly ... testers, please beat this up!)
[citadel.git] / citadel / citserver.c
index 1245332c27d7ccc98e8b977b24a9a4ebbc220a6d..5e508ec5672d67739758feb4802fd814b6da02b6 100644 (file)
@@ -55,9 +55,10 @@ void master_startup(void) {
        check_ref_counts();
 
        lprintf(7, "Creating base rooms (if necessary)\n");
-       create_room(BASEROOM, 0, "", 0);
-       create_room(AIDEROOM, 4, "", 0);
-       create_room(config.c_twitroom, 0, "", 0);
+       create_room(BASEROOM,           0, "", 0);
+       create_room(AIDEROOM,           3, "", 0);
+       create_room(SYSCONFIGROOM,      3, "", 0);
+       create_room(config.c_twitroom,  0, "", 0);
        }
 
 /*
@@ -69,7 +70,7 @@ void master_cleanup(void) {
        /* Cancel all running sessions */
        lprintf(7, "Cancelling running sessions...\n");
 
-/* FIX do something here
+/* FIXME do something here
        while (ContextList != NULL) {
                }
  */
@@ -157,6 +158,16 @@ void RemoveContext (struct CitContext *con)
                return;
        }
 
+       /* Run any cleanup routines registered by loadable modules.
+        * Note 1: This must occur *before* deallocate_user_data() because the
+        *         cleanup functions might touch dynamic session data.
+        * Note 2: We have to "become_session()" because the cleanup functions
+        *         might make references to "CC" assuming it's the right one.
+        */
+       become_session(con);
+       PerformSessionHooks(EVT_STOP);
+       become_session(NULL);
+
        /* Now handle all of the administrivia. */
        lprintf(7, "Calling logout(%d)\n", con->cs_pid);
        logout(con);
@@ -165,8 +176,6 @@ void RemoveContext (struct CitContext *con)
        unlink(con->temp);
        lprintf(3, "citserver[%3d]: ended.\n", con->cs_pid);
        
-       /* Run any cleanup routines registered by loadable modules */
-       PerformSessionHooks(EVT_STOP);
 
        syslog(LOG_NOTICE,"session %d ended", con->cs_pid);
        
@@ -243,6 +252,7 @@ void CtdlAllocUserData(unsigned long requested_sym, size_t num_bytes)
        ptr = mallok(sizeof(struct CtdlSessData));
        ptr->sym_id = requested_sym;
        ptr->sym_data = mallok(num_bytes);
+       memset(ptr->sym_data, 0, num_bytes);
 
        begin_critical_section(S_SESSION_TABLE);
        ptr->next = CC->FirstSessData;
@@ -253,6 +263,25 @@ void CtdlAllocUserData(unsigned long requested_sym, size_t num_bytes)
 }
 
 
+/* 
+ * Change the size of a buffer allocated with CtdlAllocUserData()
+ */
+void CtdlReallocUserData(unsigned long requested_sym, size_t num_bytes)
+{
+       struct CtdlSessData *ptr;
+
+       for (ptr = CC->FirstSessData; ptr != NULL; ptr = ptr->next)  {
+               if (ptr->sym_id == requested_sym) {
+                       ptr->sym_data = reallok(ptr->sym_data, num_bytes);
+                       return;
+               }
+       }
+
+       lprintf(2, "CtdlReallocUserData() ERROR: symbol %ld not found!\n",
+               requested_sym);
+}
+
+
 
 
 
@@ -847,7 +876,7 @@ void cmd_scdn(char *argbuf)
 
 
 /*
- * 
+ * Back-end function for starting a session
  */
 void begin_session(struct CitContext *con)
 {
@@ -866,7 +895,7 @@ void begin_session(struct CitContext *con)
        time(&con->lastidle);
        strcpy(con->lastcmdname, "    ");
        strcpy(con->cs_clientname, "(unknown)");
-       strcpy(con->curr_user,"(not logged in)");
+       strcpy(con->curr_user, NLI);
        strcpy(con->net_node,"");
        snprintf(con->temp, sizeof con->temp, tmpnam(NULL));
        safestrncpy(con->cs_host, config.c_fqdn, sizeof con->cs_host);
@@ -883,7 +912,17 @@ void begin_session(struct CitContext *con)
        if ((config.c_maxsessions > 0)&&(num_sessions > config.c_maxsessions))
                con->nologin = 1;
 
-       if (con->nologin==1) {
+       lprintf(3, "citserver[%3d]: started.\n", con->cs_pid);
+
+       /* Run any session startup routines registered by loadable modules */
+       PerformSessionHooks(EVT_START);
+
+       rec_log(CL_CONNECT, "");
+}
+
+
+void citproto_begin_session() {
+       if (CC->nologin==1) {
                cprintf("%d %s: Too many users are already online "
                        "(maximum is %d)\n",
                        ERROR+MAX_SESSIONS_EXCEEDED,
@@ -893,13 +932,6 @@ void begin_session(struct CitContext *con)
                cprintf("%d %s Citadel/UX server ready.\n",
                        OK, config.c_nodename);
                }
-
-       lprintf(3, "citserver[%3d]: started.\n", con->cs_pid);
-
-       /* Run any session startup routines registered by loadable modules */
-       PerformSessionHooks(EVT_START);
-
-       rec_log(CL_CONNECT, "");
 }