X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fcontext.c;h=953d1d6ae77b6e1c8dd1409f3eeae5bd9b985d2d;hb=aa7365c86de8e26e796d3aa3fd605c85d8c26220;hp=a04198db2529c148f160096d8895e398550164fa;hpb=ffa2f0d76075e6e404b050b340307affcf8cd79b;p=citadel.git diff --git a/citadel/context.c b/citadel/context.c index a04198db2..953d1d6ae 100644 --- a/citadel/context.c +++ b/citadel/context.c @@ -5,18 +5,12 @@ * Copyright (c) 1987-2011 by the citadel.org team * * 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. + * it under the terms of the GNU General Public License, version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * 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 */ #include "sysdep.h" @@ -84,7 +78,7 @@ #include "user_ops.h" #include "control.h" - +int DebugSession = 0; pthread_key_t MyConKey; /* TSD key for MyContext() */ @@ -159,7 +153,7 @@ int CtdlTerminateOtherSession (int session_num) return TERM_NOTALLOWED; } - syslog(LOG_DEBUG, "Locating session to kill\n"); + CONM_syslog(LOG_DEBUG, "Locating session to kill\n"); begin_critical_section(S_SESSION_TABLE); for (ccptr = ContextList; ccptr != NULL; ccptr = ccptr->next) { if (session_num == ccptr->cs_pid) { @@ -276,30 +270,31 @@ void terminate_idle_sessions(void) { CitContext *ccptr; time_t now; - int session_to_kill; int killed = 0; int longrunners = 0; now = time(NULL); - session_to_kill = 0; begin_critical_section(S_SESSION_TABLE); for (ccptr = ContextList; ccptr != NULL; ccptr = ccptr->next) { - if ( (ccptr!=CC) - && (config.c_sleeping > 0) - && (now - (ccptr->lastcmd) > config.c_sleeping) ) { + if ( + (ccptr != CC) + && (config.c_sleeping > 0) + && (now - (ccptr->lastcmd) > config.c_sleeping) + ) { if (!ccptr->dont_term) { ccptr->kill_me = KILLME_IDLE; ++killed; } - else - longrunners ++; + else { + ++longrunners; + } } } end_critical_section(S_SESSION_TABLE); if (killed > 0) - syslog(LOG_INFO, "Scheduled %d idle sessions for termination\n", killed); + CON_syslog(LOG_INFO, "Scheduled %d idle sessions for termination\n", killed); if (longrunners > 0) - syslog(LOG_INFO, "Didn't terminate %d protected idle sessions;\n", killed); + CON_syslog(LOG_INFO, "Didn't terminate %d protected idle sessions", longrunners); } @@ -315,7 +310,7 @@ void terminate_all_sessions(void) for (ccptr = ContextList; ccptr != NULL; ccptr = ccptr->next) { if (ccptr->client_socket != -1) { - syslog(LOG_INFO, "terminate_all_sessions() is murdering %s", ccptr->curr_user); + CON_syslog(LOG_INFO, "terminate_all_sessions() is murdering %s", ccptr->curr_user); close(ccptr->client_socket); ccptr->client_socket = -1; killed++; @@ -323,7 +318,7 @@ void terminate_all_sessions(void) } end_critical_section(S_SESSION_TABLE); if (killed > 0) { - syslog(LOG_INFO, "Flushed %d stuck sessions\n", killed); + CON_syslog(LOG_INFO, "Flushed %d stuck sessions\n", killed); } } @@ -335,15 +330,16 @@ void terminate_all_sessions(void) void RemoveContext (CitContext *con) { const char *c; - if (con==NULL) { - syslog(LOG_ERR, "WARNING: RemoveContext() called with NULL!\n"); + if (con == NULL) { + CONM_syslog(LOG_ERR, "WARNING: RemoveContext() called with NULL!"); return; } c = con->ServiceName; - if (c == NULL) + if (c == NULL) { c = "WTF?"; - syslog(LOG_DEBUG, "RemoveContext(%s) session %d\n", c, con->cs_pid); - cit_backtrace (); + } + CON_syslog(LOG_DEBUG, "RemoveContext(%s) session %d", c, con->cs_pid); +/// cit_backtrace(); /* Run any cleanup routines registered by loadable modules. * Note: We have to "become_session()" because the cleanup functions @@ -355,21 +351,31 @@ void RemoveContext (CitContext *con) client_close(); /* If the client is still connected, blow 'em away. */ become_session(NULL); - syslog(LOG_NOTICE, "[%3d] Session ended.\n", con->cs_pid); + CON_syslog(LOG_NOTICE, "[%3d]SRV[%s] Session ended.", con->cs_pid, c); + + /* + * If the client is still connected, blow 'em away. + * if the socket is 0 or -1, its already gone or was never there. + */ + if (con->client_socket > 0) + { + CON_syslog(LOG_NOTICE, "Closing socket %d", con->client_socket); + close(con->client_socket); + } /* If using AUTHMODE_LDAP, free the DN */ if (con->ldap_dn) { free(con->ldap_dn); con->ldap_dn = NULL; } - + FreeStrBuf(&con->StatusMessage); FreeStrBuf(&con->MigrateBuf); FreeStrBuf(&con->RecvBuf.Buf); if (con->cached_msglist) { free(con->cached_msglist); } - syslog(LOG_DEBUG, "Done with RemoveContext()\n"); + CONM_syslog(LOG_DEBUG, "Done with RemoveContext()"); } @@ -386,7 +392,7 @@ CitContext *CreateNewContext(void) { me = (CitContext *) malloc(sizeof(CitContext)); if (me == NULL) { - syslog(LOG_ALERT, "citserver: can't allocate memory!!\n"); + CONM_syslog(LOG_ALERT, "citserver: can't allocate memory!!\n"); return NULL; } memset(me, 0, sizeof(CitContext)); @@ -436,7 +442,7 @@ CitContext *CloneContext(CitContext *CloneMe) { me = (CitContext *) malloc(sizeof(CitContext)); if (me == NULL) { - syslog(LOG_ALERT, "citserver: can't allocate memory!!\n"); + CONM_syslog(LOG_ALERT, "citserver: can't allocate memory!!\n"); return NULL; } memcpy(me, CloneMe, sizeof(CitContext)); @@ -540,23 +546,13 @@ void CtdlFillSystemContext(CitContext *context, char *name) if (context->user.usernum == 0) { /* old system user with number 0, upgrade it */ context->user.usernum = get_new_user_number(); - syslog(LOG_DEBUG, "Upgrading system user \"%s\" from user number 0 to user number %ld\n", context->user.fullname, context->user.usernum); + CON_syslog(LOG_INFO, "Upgrading system user \"%s\" from user number 0 to user number %ld\n", context->user.fullname, context->user.usernum); /* add user to the database */ CtdlPutUser(&(context->user)); cdb_store(CDB_USERSBYNUMBER, &(context->user.usernum), sizeof(long), context->user.fullname, strlen(context->user.fullname)+1); } } -/* - * flush it again... - */ -void CtdlClearSystemContext(void) -{ - CitContext *CCC = MyContext(); - - memset(CCC, 0, sizeof(CitContext)); - pthread_setspecific(MyConKey, NULL); -} /* * Cleanup any contexts that are left lying around @@ -584,7 +580,7 @@ void context_cleanup(void) rem = ptr->next; --num_sessions; - syslog(LOG_DEBUG, "context_cleanup(): Purging session #%d %s\n", ptr->cs_pid, ptr->ServiceName); + CON_syslog(LOG_DEBUG, "context_cleanup(): purging session %d\n", ptr->cs_pid); RemoveContext(ptr); free (ptr); ptr = rem; @@ -644,7 +640,7 @@ void dead_session_purge(int force) { * is allocated privately on this thread's stack. */ while (rem != NULL) { - syslog(LOG_DEBUG, "dead_session_purge(): purging session %d, reason=%d\n", rem->cs_pid, rem->kill_me); + CON_syslog(LOG_DEBUG, "dead_session_purge(): purging session %d, reason=%d\n", rem->cs_pid, rem->kill_me); RemoveContext(rem); ptr = rem; rem = rem->next; @@ -675,7 +671,7 @@ void InitializeMasterCC(void) { */ void set_async_waiting(struct CitContext *ccptr) { - syslog(LOG_DEBUG, "Setting async_waiting flag for session %d\n", ccptr->cs_pid); + CON_syslog(LOG_DEBUG, "Setting async_waiting flag for session %d\n", ccptr->cs_pid); if (ccptr->is_async) { ccptr->async_waiting++; if (ccptr->state == CON_IDLE) { @@ -683,3 +679,16 @@ void set_async_waiting(struct CitContext *ccptr) } } } + + +void DebugSessionEnable(const int n) +{ + DebugSession = n; +} +CTDL_MODULE_INIT(session) +{ + if (!threading) { + CtdlRegisterDebugFlagHook(HKEY("session"), DebugSessionEnable, &DebugSession); + } + return "session"; +}