]> code.citadel.org Git - citadel.git/blobdiff - citadel/citserver.c
* strlen holy war: loops. in loops it's very evil. the easy ones go away now.
[citadel.git] / citadel / citserver.c
index 825d756e544ff6150a851210f1a72154119b2b59..6032caeaadcc712e13f83e0a8803120d1341af67 100644 (file)
@@ -53,7 +53,7 @@
 #include "control.h"
 #include "tools.h"
 #include "euidindex.h"
-#include "serv_network.h"
+#include "serv_network.h"      /* Needed for destroy_network_queue_room called from master_cleanup */
 
 #ifndef HAVE_SNPRINTF
 #include "snprintf.h"
@@ -125,6 +125,7 @@ void master_startup(void) {
  */
 void master_cleanup(int exitcode) {
        struct CleanupFunctionHook *fcn;
+       struct MaintenanceThreadHook *m_fcn;
        static int already_cleaning_up = 0;
 
        if (already_cleaning_up) while(1) sleep(1);
@@ -138,13 +139,11 @@ void master_cleanup(int exitcode) {
        /* Close the AdjRefCount queue file */
        AdjRefCount(-1, 0);
 
-       /* Shut down the indexer thread */
-       lprintf(CTDL_INFO, "Waiting for the indexer thread to shut down\n");
-       pthread_join(indexer_thread_tid, NULL);
-
-       /* Shut down the checkpoint thread */
-       lprintf(CTDL_INFO, "Waiting for the checkpoint thread to shut down\n");
-       pthread_join(checkpoint_thread_tid, NULL);
+       for (m_fcn = MaintenanceThreadHookTable; m_fcn != NULL; m_fcn = m_fcn->next) {
+               lprintf(CTDL_INFO, "Waiting for maintenance thread \"%s\" to shut down\n", m_fcn->name);
+               pthread_join(m_fcn->MaintenanceThread_tid, NULL);
+       }
+       
 
        /* Close databases */
        lprintf(CTDL_INFO, "Closing databases\n");
@@ -335,8 +334,11 @@ int is_public_client(void)
 
                fp = fopen(public_clients_file, "r");
                if (fp != NULL) while (fgets(buf, sizeof buf, fp)!=NULL) {
-                       for (i=0; i<strlen(buf); ++i) {
+                       char *ptr;
+                       ptr = buf;
+                       while (!IsEmptyStr(*ptr)) {
                                if (buf[i] == '#') buf[i] = 0;
+                               else ptr++;
                        }
                        while (isspace((buf[strlen(buf)-1]))) {
                                buf[strlen(buf)-1] = 0;
@@ -404,7 +406,7 @@ void cmd_iden(char *argbuf)
        safestrncpy(CC->cs_clientname, desc, sizeof CC->cs_clientname);
        CC->cs_clientname[31] = 0;
 
-       if (strlen(from_host) > 0) {
+       if (!IsEmptyStr(from_host)) {
                if (CC->is_local_socket) do_lookup = 1;
                else if (is_public_client()) do_lookup = 1;
        }
@@ -475,12 +477,12 @@ void cmd_mesg(char *mname)
        /* Otherwise, look for the requested file by name. */
        else {
                mesg_locate(targ, sizeof targ, buf2, 2, (const char **)dirs);
-               if (strlen(targ) == 0) {
+               if (IsEmptyStr(targ)) {
                        snprintf(buf2, sizeof buf2, "%s.%d",
                                                        buf, CC->cs_clientdev);
                        mesg_locate(targ, sizeof targ, buf2, 2,
                                                        (const char **)dirs);
-                       if (strlen(targ) == 0) {
+                       if (IsEmptyStr(targ)) {
                                mesg_locate(targ, sizeof targ, buf, 2,
                                                        (const char **)dirs);
                        }       
@@ -490,7 +492,7 @@ void cmd_mesg(char *mname)
        free(dirs[0]);
        free(dirs[1]);
 
-       if (strlen(targ)==0) {
+       if (IsEmptyStr(targ)) {
                cprintf("%d '%s' not found.  (Searching in %s and %s)\n",
                        ERROR + FILE_NOT_FOUND,
                        mname,
@@ -535,7 +537,7 @@ void cmd_emsg(char *mname)
        if (CtdlAccessCheck(ac_aide)) return;
 
        extract_token(buf, mname, 0, '|', sizeof buf);
-       for (a=0; a<strlen(buf); ++a) {         /* security measure */
+       for (a=0; !IsEmptyStr(&buf[a]); ++a) {          /* security measure */
                if (buf[a] == '/') buf[a] = '.';
        }
 
@@ -546,7 +548,7 @@ void cmd_emsg(char *mname)
        free(dirs[0]);
        free(dirs[1]);
 
-       if (strlen(targ)==0) {
+       if (IsEmptyStr(targ)) {
                snprintf(targ, sizeof targ, 
                                 "%s/%s",
                                 ctdl_hlp_dir, buf);
@@ -793,14 +795,29 @@ void cmd_halt(void) {
 void cmd_scdn(char *argbuf)
 {
        int new_state;
+       int state = CIT_OK;
+       char *Reply = "%d %d\n";
 
        if (CtdlAccessCheck(ac_aide)) return;
 
        new_state = extract_int(argbuf, 0);
+       if ((new_state == 2) || (new_state == 3))
+       {
+               restart_server = 1;
+               if (!running_as_daemon)
+               {
+                       lprintf(CTDL_ERR, "The user requested restart, but not running as deamon! Geronimooooooo!\n");
+                       Reply = "%d %d Warning, not running in deamon mode. maybe we will come up again, but don't lean on it.\n";
+                       state = ERROR;
+               }
+
+               restart_server = extract_int(argbuf, 0);
+               new_state -= 2;
+       }
        if ((new_state == 0) || (new_state == 1)) {
                ScheduledShutdown = new_state;
        }
-       cprintf("%d %d\n", CIT_OK, ScheduledShutdown);
+       cprintf(Reply, state, ScheduledShutdown);
 }