]> code.citadel.org Git - citadel.git/blobdiff - citadel/citserver.c
* master_cleanup() now passes along an exit code from its caller to the OS.
[citadel.git] / citadel / citserver.c
index eda6a754efb9fd26597d5cbb0959fcf9e6dc8780..88a7ad0ad5beb72fba8d1ea94b02070067531939 100644 (file)
@@ -125,11 +125,13 @@ void master_startup(void) {
 
 /*
  * Cleanup routine to be called when the server is shutting down.
- * WARNING: It's no longer safe to call this function to force a shutdown.
- * Instead, set time_to_die = 1.
  */
-void master_cleanup(void) {
+void master_cleanup(int exitcode) {
        struct CleanupFunctionHook *fcn;
+       static int already_cleaning_up = 0;
+
+       if (already_cleaning_up) while(1) sleep(1);
+       already_cleaning_up = 1;
 
        /* Run any cleanup routines registered by loadable modules */
        for (fcn = CleanupHookTable; fcn != NULL; fcn = fcn->next) {
@@ -148,9 +150,9 @@ void master_cleanup(void) {
 #endif
 
        /* Now go away. */
-       lprintf(CTDL_NOTICE, "citserver: exiting.\n");
+       lprintf(CTDL_NOTICE, "citserver: Exiting with status %d.\n", exitcode);
        fflush(stdout); fflush(stderr);
-       exit(0);
+       exit(exitcode);
 }
 
 
@@ -182,9 +184,6 @@ void deallocate_user_data(struct CitContext *con)
  */
 void RemoveContext (struct CitContext *con)
 {
-       struct CitContext *ptr = NULL;
-       struct CitContext *ToFree = NULL;
-
        if (con==NULL) {
                lprintf(CTDL_ERR, "WARNING: RemoveContext() called with NULL!\n");
                return;
@@ -197,30 +196,11 @@ void RemoveContext (struct CitContext *con)
         */
        lprintf(CTDL_DEBUG, "Removing context for session %d\n", con->cs_pid);
        begin_critical_section(S_SESSION_TABLE);
-       if (ContextList == con) {
-               ToFree = ContextList;
-               ContextList = ContextList->next;
-               --num_sessions;
-       }
-       else {
-               for (ptr = ContextList; ptr != NULL; ptr = ptr->next) {
-                       if (ptr->next == con) {
-                               /* See fair scheduling in sysdep.c */
-                               if (next_session == ptr->next)
-                                       next_session = ptr->next->next;
-                               ToFree = ptr->next;
-                               ptr->next = ptr->next->next;
-                               --num_sessions;
-                       }
-               }
-       }
+         if (con->prev) con->prev->next = con->next; else ContextList = con->next;
+         if (con->next) con->next->prev = con->prev;
+         --num_sessions;
        end_critical_section(S_SESSION_TABLE);
 
-       if (ToFree == NULL) {
-               lprintf(CTDL_DEBUG, "RemoveContext() found nothing to remove\n");
-               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.
@@ -622,7 +602,7 @@ void cmd_emsg(char *mname)
        }
        cprintf("%d %s\n", SEND_LISTING, targ);
 
-       while (client_gets(buf), strcmp(buf, "000")) {
+       while (client_getln(buf, sizeof buf), strcmp(buf, "000")) {
                fprintf(mfp, "%s\n", buf);
        }
 
@@ -637,13 +617,15 @@ void GenerateRoomDisplay(char *real_room,
                        struct CitContext *viewed,
                        struct CitContext *viewer) {
 
+       int ra;
+
        strcpy(real_room, viewed->room.QRname);
        if (viewed->room.QRflags & QR_MAILBOX) {
                strcpy(real_room, &real_room[11]);
        }
        if (viewed->room.QRflags & QR_PRIVATE) {
-               if ( (CtdlRoomAccess(&viewed->room, &viewer->user)
-                  & UA_KNOWN) == 0) {
+               CtdlRoomAccess(&viewed->room, &viewer->user, &ra, NULL);
+               if ( (ra & UA_KNOWN) == 0) {
                        strcpy(real_room, "<private room>");
                }
        }
@@ -887,7 +869,7 @@ void begin_session(struct CitContext *con)
        strcpy(con->fake_hostname, "");
        strcpy(con->fake_roomname, "");
        generate_nonce(con);
-       snprintf(con->temp, sizeof con->temp, tmpnam(NULL));
+       safestrncpy(con->temp, tmpnam(NULL), sizeof con->temp);
        safestrncpy(con->cs_host, config.c_fqdn, sizeof con->cs_host);
        safestrncpy(con->cs_addr, "", sizeof con->cs_addr);
        con->cs_host[sizeof con->cs_host - 1] = 0;
@@ -942,7 +924,7 @@ void do_command_loop(void) {
 
        time(&CC->lastcmd);
        memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */
-       if (client_gets(cmdbuf) < 1) {
+       if (client_getln(cmdbuf, sizeof cmdbuf) < 1) {
                lprintf(CTDL_ERR, "Client socket is broken; ending session\n");
                CC->kill_me = 1;
                return;