]> code.citadel.org Git - citadel.git/blobdiff - citadel/sysdep.c
* Finished removing all the "dynamic session data" stuff in order to
[citadel.git] / citadel / sysdep.c
index c8137cda397a0349b38dc7049179dc42e9cef02d..b571b8b478674dbc558c7c41d32f78a997f4d56e 100644 (file)
@@ -211,17 +211,18 @@ void init_sysdep(void) {
        sigaddset(&set, SIGQUIT);
        sigaddset(&set, SIGHUP);
        sigaddset(&set, SIGTERM);
-       sigaddset(&set, SIGSEGV);
-       sigaddset(&set, SIGILL);
-       sigaddset(&set, SIGBUS);
+       // sigaddset(&set, SIGSEGV);    commented out because
+       // sigaddset(&set, SIGILL);     we want core dumps
+       // sigaddset(&set, SIGBUS);
        sigprocmask(SIG_UNBLOCK, &set, NULL);
+
        signal(SIGINT, signal_cleanup);
        signal(SIGQUIT, signal_cleanup);
        signal(SIGHUP, signal_cleanup);
        signal(SIGTERM, signal_cleanup);
-       signal(SIGSEGV, signal_cleanup);
-       signal(SIGILL, signal_cleanup);
-       signal(SIGBUS, signal_cleanup);
+       // signal(SIGSEGV, signal_cleanup);     commented out because
+       // signal(SIGILL, signal_cleanup);      we want core dumps
+       // signal(SIGBUS, signal_cleanup);
 
        /*
         * Do not shut down the server on broken pipe signals, otherwise the
@@ -409,7 +410,8 @@ struct CitContext *MyContext(void) {
  * sessions terminate.
  */
 struct CitContext *CreateNewContext(void) {
-       struct CitContext *me, *ptr;
+       struct CitContext *me;
+       static int next_pid = 0;
 
        me = (struct CitContext *) malloc(sizeof(struct CitContext));
        if (me == NULL) {
@@ -430,42 +432,14 @@ struct CitContext *CreateNewContext(void) {
         * the list.
         */
        begin_critical_section(S_SESSION_TABLE);
-
-       if (ContextList == NULL) {
-               ContextList = me;
-               me->cs_pid = 1;
-               me->prev = NULL;
-               me->next = NULL;
-       }
-
-       else if (ContextList->cs_pid > 1) {
-               me->prev = NULL;
-               me->next = ContextList;
-               ContextList = me;
-               me->cs_pid = 1;
-       }
-
-       else {
-               for (ptr = ContextList; ptr != NULL; ptr = ptr->next) {
-                       if (ptr->next == NULL) {
-                               ptr->next = me;
-                               me->cs_pid = ptr->cs_pid + 1;
-                               me->prev = ptr;
-                               me->next = NULL;
-                               goto DONE;
-                       }
-                       else if (ptr->next->cs_pid > (ptr->cs_pid+1)) {
-                               me->prev = ptr;
-                               me->next = ptr->next;
-                               ptr->next->prev = me;
-                               ptr->next = me;
-                               me->cs_pid = ptr->cs_pid + 1;
-                               goto DONE;
-                       }
-               }
+       me->cs_pid = ++next_pid;
+       me->prev = NULL;
+       me->next = ContextList;
+       ContextList = me;
+       if (me->next != NULL) {
+               me->next->prev = me;
        }
-
-DONE:  ++num_sessions;
+       ++num_sessions;
        end_critical_section(S_SESSION_TABLE);
        return(me);
 }
@@ -542,19 +516,19 @@ void client_write(char *buf, int nbytes)
 {
        int bytes_written = 0;
        int retval;
-       int sock;
 #ifndef HAVE_TCP_BUFFERING
        int old_buffer_len = 0;
 #endif
 
        if (CC->redirect_buffer != NULL) {
-               if (CC->redirect_len + nbytes >= CC->redirect_alloc) {
-                       CC->redirect_alloc = CC->redirect_alloc * 2;
+               if ((CC->redirect_len + nbytes + 2) >= CC->redirect_alloc) {
+                       CC->redirect_alloc = (CC->redirect_alloc * 2) + nbytes;
                        CC->redirect_buffer = realloc(CC->redirect_buffer,
                                                CC->redirect_alloc);
                }
                memcpy(&CC->redirect_buffer[CC->redirect_len], buf, nbytes);
                CC->redirect_len += nbytes;
+               CC->redirect_buffer[CC->redirect_len] = 0;
                return;
        }
 
@@ -563,13 +537,6 @@ void client_write(char *buf, int nbytes)
                return;
        }
 
-       if (CC->redirect_sock > 0) {
-               sock = CC->redirect_sock;       /* and continue below... */
-       }
-       else {
-               sock = CC->client_socket;
-       }
-
 #ifndef HAVE_TCP_BUFFERING
        /* If we're buffering for later, do that now. */
        if (CC->buffering) {
@@ -591,12 +558,12 @@ void client_write(char *buf, int nbytes)
 #endif
 
        while (bytes_written < nbytes) {
-               retval = write(sock, &buf[bytes_written],
+               retval = write(CC->client_socket, &buf[bytes_written],
                        nbytes - bytes_written);
                if (retval < 1) {
                        lprintf(CTDL_ERR, "client_write() failed: %s\n",
                                strerror(errno));
-                       if (sock == CC->client_socket) CC->kill_me = 1;
+                       CC->kill_me = 1;
                        return;
                }
                bytes_written = bytes_written + retval;
@@ -903,18 +870,14 @@ void dead_session_purge(int force) {
 
 
 /*
- * Redirect a session's output to a file or socket.
- * This function may be called with a file handle *or* a socket (but not
- * both).  Call with neither to return output to its normal client socket.
+ * Redirect a session's output to a file.
+ * This function may be called with a file handle.
+ * Call with NULL to return output to its normal client socket.
  */
-void CtdlRedirectOutput(FILE *fp, int sock) {
-
+void CtdlRedirectOutput(FILE *fp)
+{
        if (fp != NULL) CC->redirect_fp = fp;
        else CC->redirect_fp = NULL;
-
-       if (sock > 0) CC->redirect_sock = sock;
-       else CC->redirect_sock = (-1);
-
 }
 
 
@@ -1041,12 +1004,7 @@ do_select:       force_purge = 0;
 
                        if (FD_ISSET(serviceptr->msock, &readfds)) {
                                ssock = accept(serviceptr->msock, NULL, 0);
-                               if (ssock < 0) {
-                                       lprintf(CTDL_CRIT,
-                                               "citserver: accept(): %s\n",
-                                               strerror(errno));
-                               }
-                               else {
+                               if (ssock >= 0) {
                                        lprintf(CTDL_DEBUG,
                                                "New client socket %d\n",
                                                ssock);