]> code.citadel.org Git - citadel.git/blobdiff - citadel/sysdep.c
* move arround some files in the configured build according to the suggestions of...
[citadel.git] / citadel / sysdep.c
index 1d344029edfc1a9116c6b76b31f0a9f7dfc9e8e9..ae90340fc7ac21f3ab6a3f456063a93ca3d4cebf 100644 (file)
@@ -23,6 +23,7 @@
 #include <sys/stat.h>
 #include <sys/wait.h>
 #include <sys/socket.h>
+#include <syslog.h>
 #include <sys/syslog.h>
 
 #if TIME_WITH_SYS_TIME
@@ -101,6 +102,8 @@ int syslog_facility = LOG_DAEMON;
 int enable_syslog = 0;
 extern int running_as_daemon;
 
+void DestroyWorkerList(void);
+
 /*
  * lprintf()  ...   Write logging information
  */
@@ -162,7 +165,6 @@ static RETSIGTYPE signal_cleanup(int signum) {
        master_cleanup(signum);
 }
 
-
 /*
  * Some initialization stuff...
  */
@@ -289,7 +291,7 @@ int ig_tcp_server(char *ip_addr, int port_number, int queue_len, char **errormes
                sin.sin_addr.s_addr = inet_addr(ip_addr);
        }
                                                                                
-       if (sin.sin_addr.s_addr == INADDR_NONE) {
+       if (sin.sin_addr.s_addr == !INADDR_ANY) {
                sin.sin_addr.s_addr = INADDR_ANY;
        }
 
@@ -720,6 +722,7 @@ int client_getln(char *buf, int bufsize)
 void sysdep_master_cleanup(void) {
        struct ServiceFunctionHook *serviceptr;
 
+/////  DestroyWorkerList();
        /*
         * close all protocol master sockets
         */
@@ -741,9 +744,25 @@ void sysdep_master_cleanup(void) {
                        unlink(serviceptr->sockpath);
                }
        }
+#ifdef HAVE_OPENSSL
+       destruct_ssl();
+#endif
+       serv_calendar_destroy();
+       CtdlDestroyProtoHooks();
+       CtdlDestroyDeleteHooks();
+       CtdlDestroyXmsgHooks();
+       CtdlDestroyNetprocHooks();
+       CtdlDestroyUserHooks();
+       CtdlDestroyMessageHook();
+       CtdlDestroyCleanupHooks();
+       CtdlDestroyFixedOutputHooks();  
+       CtdlDestroySessionHooks();
+       CtdlDestroyServiceHook();
 }
 
 
+
+
 /*
  * Terminate another session.
  * (This could justifiably be moved out of sysdep.c because it
@@ -818,7 +837,7 @@ void start_daemon(int unused) {
                else {
                        fp = fopen(file_pid_file, "w");
                        if (fp != NULL) {
-                               fprintf(fp, "%d\n", child);
+                               fprintf(fp, ""F_PID_T"\n", child);
                                fclose(fp);
                        }
                        waitpid(current_child, &status, 0);
@@ -928,6 +947,37 @@ void create_worker(void) {
        pthread_attr_destroy(&attr);
 }
 
+void DestroyWorkerList(void)
+{
+       struct CitContext *ptr;         /* general-purpose utility pointer */
+       struct CitContext *rem = NULL;  /* list of sessions to be destroyed */
+
+       begin_critical_section(S_SESSION_TABLE);
+       ptr = ContextList;
+       while (ptr != NULL){
+               /* Remove the session from the active list */
+               rem = ptr->next;
+               --num_sessions;
+               
+               lprintf(CTDL_DEBUG, "Purging session %d\n", rem->cs_pid);
+               end_critical_section(S_SESSION_TABLE);
+               RemoveContext(ptr);
+               begin_critical_section(S_SESSION_TABLE);
+               free (ptr);
+               ptr = rem;
+       }
+       end_critical_section(S_SESSION_TABLE);
+
+       struct worker_node *cur, *p;
+       cur = worker_list;
+       while (cur != NULL)
+       {
+               p = cur->next;
+               free (cur);
+               cur = p;
+       }
+       worker_list = NULL;
+}
 
 /*
  * Create the indexer thread and begin its operation.
@@ -963,6 +1013,8 @@ void create_maintenance_threads(void) {
                lprintf(CTDL_ALERT, "Can't create thread: %s\n", strerror(ret));
        }
 
+       lprintf(CTDL_NOTICE, "Spawned indexer (%ld) and checkpoint (%ld) thread. \n", 
+               indexer_thread_tid, checkpoint_thread_tid);
        pthread_attr_destroy(&attr);
 }
 
@@ -1260,7 +1312,7 @@ SKIP_SELECT:
                do_housekeeping();
                check_sched_shutdown();
        }
-
+       if (con != NULL) free (con);//// TODO: could this harm other threads? 
        /* If control reaches this point, the server is shutting down */        
        return(NULL);
 }