From 4e6f4f8bd5d8dc7246ac2c0893041032269997e0 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Thu, 17 Mar 2011 12:09:24 -0400 Subject: [PATCH] More debugging --- citadel/context.c | 11 +----- citadel/sysdep.c | 83 +++++++++++++++++++++++------------------- citadel/sysdep_decls.h | 1 + 3 files changed, 49 insertions(+), 46 deletions(-) diff --git a/citadel/context.c b/citadel/context.c index 70657537e..1bdea3829 100644 --- a/citadel/context.c +++ b/citadel/context.c @@ -354,15 +354,8 @@ void RemoveContext (CitContext *con) syslog(LOG_NOTICE, "[%3d] Session ended.\n", con->cs_pid); - /* - * If the client is still connected, blow 'em away. - * if the socket is 0, its already gone or was never there. - */ - if (con->client_socket != 0) - { - syslog(LOG_DEBUG, "Closing socket %d\n", con->client_socket); - if (close(con->client_socket)) syslog(LOG_NOTICE, "close() : %s", strerror(errno)); - } + /* If the client is still connected, blow 'em away. */ + client_close(); /* If using AUTHMODE_LDAP, free the DN */ if (con->ldap_dn) { diff --git a/citadel/sysdep.c b/citadel/sysdep.c index 628e955b3..9809cddbb 100644 --- a/citadel/sysdep.c +++ b/citadel/sysdep.c @@ -9,7 +9,7 @@ * * Copyright (c) 1987-2011 by the citadel.org team * - * This program is free software; you can redistribute it and/or modify + * This program is open source software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. @@ -21,7 +21,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sysdep.h" @@ -433,6 +433,25 @@ static void flush_client_inbuf(void) } */ + +/* + * client_close() ... close the client socket + */ +void client_close(void) { + CitContext *CCC = CC; + int r; + + if (!CCC) return; + if (CCC->client_socket <= 0) return; + syslog(LOG_DEBUG, "Closing socket %d\n", CCC->client_socket); + r = close(CCC->client_socket); + if (!r) syslog(LOG_INFO, "close() failed: %s\n", strerror(errno)); + CCC->client_socket = -1 ; +} + + + + /* * client_write() ... Send binary data to the client. */ @@ -506,22 +525,25 @@ int client_write(const char *buf, int nbytes) syslog(LOG_ERR, "client_write(%d bytes) select failed: %s (%d)\n", nbytes - bytes_written, - strerror(errno), errno); + strerror(errno), errno + ); cit_backtrace(); + client_close(); Ctx->kill_me = KILLME_SELECT_FAILED; return -1; } } } - retval = write(Ctx->client_socket, &buf[bytes_written], - nbytes - bytes_written); + retval = write(Ctx->client_socket, &buf[bytes_written], nbytes - bytes_written); if (retval < 1) { syslog(LOG_ERR, "client_write(%d bytes) failed: %s (%d)\n", nbytes - bytes_written, - strerror(errno), errno); + strerror(errno), errno + ); cit_backtrace(); + client_close(); // syslog(LOG_DEBUG, "Tried to send: %s", &buf[bytes_written]); Ctx->kill_me = KILLME_WRITE_FAILED; return -1; @@ -636,10 +658,8 @@ int client_read_blob(StrBuf *Target, int bytes, int timeout) O_TERM, &Error); if (retval < 0) { - syslog(LOG_CRIT, - "%s failed: %s\n", - __FUNCTION__, - Error); + syslog(LOG_CRIT, "%s failed: %s\n", __FUNCTION__, Error); + client_close(); return retval; } #ifdef BIGBAD_IODBG @@ -650,8 +670,6 @@ int client_read_blob(StrBuf *Target, int bytes, int timeout) StrLength(Target)); rv = fwrite(ChrPtr(Target), StrLength(Target), 1, fd); fprintf(fd, "]\n"); - - fclose(fd); #endif } @@ -1198,18 +1216,17 @@ do_select: force_purge = 0; begin_critical_section(S_SESSION_TABLE); for (ptr = ContextList; ptr != NULL; ptr = ptr->next) { - int client_socket; if ((ptr->state == CON_SYS) && (ptr->client_socket == 0)) continue; - client_socket = ptr->client_socket; - /* Dont select on dead sessions only truly idle ones */ - if ((ptr->state == CON_IDLE) && - (CC->kill_me == 0) && - (client_socket > 0)) - { - FD_SET(client_socket, &readfds); - if (client_socket > highest) - highest = client_socket; + + /* Don't select on dead sessions, only truly idle ones */ + if ( (ptr->state == CON_IDLE) + && (ptr->kill_me == 0) + && (ptr->client_socket > 0) + ) { + FD_SET(ptr->client_socket, &readfds); + if (ptr->client_socket > highest) + highest = ptr->client_socket; } if ((bind_me == NULL) && (ptr->state == CON_READY)) { bind_me = ptr; @@ -1418,9 +1435,7 @@ void *select_on_master (void *arg) if (FD_ISSET(serviceptr->msock, &master_fds)) { ssock = accept(serviceptr->msock, NULL, 0); if (ssock >= 0) { - syslog(LOG_DEBUG, - "New client socket %d\n", - ssock); + syslog(LOG_DEBUG, "New client socket %d\n", ssock); /* The master socket is non-blocking but the client * sockets need to be blocking, otherwise certain @@ -1439,26 +1454,20 @@ void *select_on_master (void *arg) /* Assign our new socket number to it. */ con->client_socket = ssock; - con->h_command_function = - serviceptr->h_command_function; - con->h_async_function = - serviceptr->h_async_function; + con->h_command_function = serviceptr->h_command_function; + con->h_async_function = serviceptr->h_async_function; con->h_greeting_function = serviceptr->h_greeting_function; - con->ServiceName = - serviceptr->ServiceName; + con->ServiceName = serviceptr->ServiceName; /* Determine whether it's a local socket */ - if (serviceptr->sockpath != NULL) + if (serviceptr->sockpath != NULL) { con->is_local_socket = 1; + } /* Set the SO_REUSEADDR socket option */ i = 1; - setsockopt(ssock, SOL_SOCKET, - SO_REUSEADDR, - &i, sizeof(i)); - + setsockopt(ssock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)); con->state = CON_GREETING; - retval--; if (retval == 0) break; diff --git a/citadel/sysdep_decls.h b/citadel/sysdep_decls.h index f0343c728..a333714fd 100644 --- a/citadel/sysdep_decls.h +++ b/citadel/sysdep_decls.h @@ -61,6 +61,7 @@ int CtdlClientGetLine(StrBuf *Target); int client_read_blob(StrBuf *Target, int bytes, int timeout); void client_set_inbound_buf(long N); int client_read_random_blob(StrBuf *Target, int timeout); +void client_close(void); void sysdep_master_cleanup (void); void kill_session (int session_to_kill); void start_daemon (int do_close_stdio); -- 2.30.2