sleep(5);
cprintf("%d Authentication failed.\n", ERROR + PASSWORD_REQUIRED);
syslog(LOG_ERR, "Warning: ipgm authentication failed.\n");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_AUTHFAILED;
}
}
{
cprintf(Reply, CIT_OK + SERVER_SHUTTING_DOWN);
}
- CC->kill_me = 1; /* Even the DOWN command has to follow correct proceedure when disconecting */
+ CC->kill_me = KILLME_SERVER_SHUTTING_DOWN;
CtdlThreadStopAll();
}
ERROR + MAX_SESSIONS_EXCEEDED,
config.c_nodename, config.c_maxsessions
);
- CC->kill_me = 1;
+ CC->kill_me = KILLME_MAX_SESSIONS_EXCEEDED;
}
else {
cprintf("%d %s Citadel server ready.\n", CIT_OK, config.c_nodename);
void cmd_quit(char *argbuf)
{
cprintf("%d Goodbye.\n", CIT_OK);
- CC->kill_me = 1;
+ CC->kill_me = KILLME_CLIENT_LOGGED_OUT;
}
memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */
if (client_getln(cmdbuf, sizeof cmdbuf) < 1) {
syslog(LOG_ERR, "Client disconnected: ending session.\n");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_CLIENT_DISCONNECTED;
CtdlThreadName(old_name);
return;
}
*
* Copyright (c) 1987-2010 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.
*
* 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"
if ((ccptr->user.usernum == CC->user.usernum)
|| (CC->user.axlevel >= AxAideU)) {
ret |= TERM_ALLOWED;
- ccptr->kill_me = 1;
+ ccptr->kill_me = KILLME_ADMIN_TERMINATE;
}
}
}
&& (config.c_sleeping > 0)
&& (now - (ccptr->lastcmd) > config.c_sleeping) ) {
if (!ccptr->dont_term) {
- ccptr->kill_me = 1;
+ ccptr->kill_me = KILLME_IDLE;
++killed;
}
else
-/*
- * Terminate another session.
- * (This could justifiably be moved out of sysdep.c because it
- * no longer does anything that is system-dependent.)
- */
-void kill_session(int session_to_kill) {
- CitContext *ptr;
-
- begin_critical_section(S_SESSION_TABLE);
- for (ptr = ContextList; ptr != NULL; ptr = ptr->next) {
- if (ptr->cs_pid == session_to_kill) {
- ptr->kill_me = 1;
- }
- }
- end_critical_section(S_SESSION_TABLE);
-}
-
/*
* Purge all sessions which have the 'kill_me' flag set.
* This function has code to prevent it from running more than once every
* is allocated privately on this thread's stack.
*/
while (rem != NULL) {
- syslog(LOG_DEBUG, "dead_session_purge(): purging session %d\n", rem->cs_pid);
+ 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;
if (CCC->nologin)
{
IAPuts("* BYE; Server busy, try later\r\n");
- CCC->kill_me = 1;
+ CCC->kill_me = KILLME_NOLOGIN;
IUnbuffer();
return;
}
void imaps_greeting(void) {
CtdlModuleStartCryptoMsgs(NULL, NULL, NULL);
#ifdef HAVE_OPENSSL
- if (!CC->redirect_ssl) CC->kill_me = 1; /* kill session if no crypto */
+ if (!CC->redirect_ssl) CC->kill_me = KILLME_NO_CRYPTO; /* kill session if no crypto */
#endif
imap_greeting();
}
if (CtdlClientGetLine(Imap->Cmd.CmdBuf) < 1) {
syslog(LOG_ERR, "Client disconnected: ending session.\r\n");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_CLIENT_DISCONNECTED;
return;
}
}
IAPrintf("* BYE %s logging out\r\n", config.c_fqdn);
IReply("OK Citadel IMAP session ended.");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_CLIENT_LOGGED_OUT;
return;
}
if (size < 1) {
cprintf("NO %s: %ld BAD Message length must be at least 1.\r\n",
command, size);
- CC->kill_me = 1;
+ CC->kill_me = KILLME_READSTRING_FAILED;
return NULL;
}
MGSVE->transmitted_message = malloc(size + 2);
if (MGSVE->transmitted_message == NULL) {
cprintf("NO %s Cannot allocate memory.\r\n", command);
- CC->kill_me = 1;
+ CC->kill_me = KILLME_MALLOC_FAILED;
return NULL;
}
MGSVE->transmitted_length = size;
}
}
cprintf("NO \"Authentication Failure.\"\r\n");/* we just support auth plain. */
- CC->kill_me = 1;
+ CC->kill_me = KILLME_AUTHFAILED;
}
-/**
- *LOGOUT command, see chapter 2.3
+/*
+ * LOGOUT command, see chapter 2.3
*/
void cmd_mgsve_logout(struct sdm_userdata *u)
{
cprintf("OK\r\n");
syslog(LOG_NOTICE, "MgSve bye.");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_CLIENT_LOGGED_OUT;
}
-/**
+/*
* HAVESPACE command. see chapter 2.5
*/
void cmd_mgsve_havespace(void)
if (MGSVE->command_state != mgsve_password)
{
cprintf("NO\r\n");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_QUOTA;
}
else
{
}
}
-/**
+/*
* PUTSCRIPT command, see chapter 2.6
*/
void cmd_mgsve_putscript(int num_parms, char **parms, struct sdm_userdata *u)
}
else {
cprintf("%s NO Read failed.\r\n", parms[0]);
- CC->kill_me = 1;
+ CC->kill_me = KILLME_READ_FAILED;
return;
}
}
if (length < 1) {
syslog(LOG_CRIT, "Client disconnected: ending session.\n");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_CLIENT_DISCONNECTED;
return;
}
syslog(LOG_INFO, "MANAGESIEVE: %s\n", cmdbuf);
else {
cprintf("No Invalid access or command.\r\n");
syslog(LOG_INFO, "illegal Managesieve command: %s", parms[0]);
- CC->kill_me = 1;
+ CC->kill_me = KILLME_ILLEGAL_MANAGESIEVE_COMMAND;
}
migr_global_message_list = fopen(migr_tempfilename1, "r");
if (migr_global_message_list != NULL) {
syslog(LOG_INFO, "Opened %s\n", migr_tempfilename1);
- while ((Ctx->kill_me != 1) &&
+ while ((Ctx->kill_me == 0) &&
(fgets(buf, sizeof(buf), migr_global_message_list) != NULL)) {
msgnum = atol(buf);
if (msgnum > 0L) {
}
fclose(migr_global_message_list);
}
- if (Ctx->kill_me != 1)
+ if (Ctx->kill_me == 0)
syslog(LOG_INFO, "Exported %d messages.\n", count);
else
syslog(LOG_ERR, "Export aborted due to client disconnect! \n");
cprintf("<control_version>%d</control_version>\n", CitControl.version);
client_write("</control>\n", 11);
- if (Ctx->kill_me != 1) migr_export_users();
- if (Ctx->kill_me != 1) migr_export_openids();
- if (Ctx->kill_me != 1) migr_export_rooms();
- if (Ctx->kill_me != 1) migr_export_floors();
- if (Ctx->kill_me != 1) migr_export_visits();
- if (Ctx->kill_me != 1) migr_export_messages();
+ if (Ctx->kill_me == 0) migr_export_users();
+ if (Ctx->kill_me == 0) migr_export_openids();
+ if (Ctx->kill_me == 0) migr_export_rooms();
+ if (Ctx->kill_me == 0) migr_export_floors();
+ if (Ctx->kill_me == 0) migr_export_visits();
+ if (Ctx->kill_me == 0) migr_export_messages();
client_write("</citadel_migrate_data>\n", 24);
client_write("000\n", 4);
Ctx->dont_term = 0;
/* kill session if no crypto */
#ifdef HAVE_OPENSSL
- if (!CC->redirect_ssl) CC->kill_me = 1;
+ if (!CC->redirect_ssl) CC->kill_me = KILLME_NO_CRYPTO;
#else
- CC->kill_me = 1;
+ CC->kill_me = KILLME_NO_CRYPTO;
#endif
pop3_greeting();
memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */
if (client_getln(cmdbuf, sizeof cmdbuf) < 1) {
syslog(LOG_ERR, "Client disconnected: ending session.");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_CLIENT_DISCONNECTED;
return;
}
if (!strncasecmp(cmdbuf, "PASS", 4)) {
else if (!strncasecmp(cmdbuf, "QUIT", 4)) {
cprintf("+OK Goodbye...\r\n");
pop3_update();
- CC->kill_me = 1;
+ CC->kill_me = KILLME_CLIENT_LOGGED_OUT;
return;
}
else if (CC->nologin) {
cprintf("-ERR System busy, try later.\r\n");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_NOLOGIN;
}
else if (!strncasecmp(cmdbuf, "LIST", 4)) {
cprintf("421 %s\r\n", message_to_spammer);
else
cprintf("550 %s\r\n", message_to_spammer);
- CC->kill_me = 1;
+ CC->kill_me = KILLME_SPAMMER;
/* no need to free_recipients(valid), it's not allocated yet */
return;
}
cprintf("500 Too many users are already online (maximum is %d)\r\n",
config.c_maxsessions
);
- CC->kill_me = 1;
+ CC->kill_me = KILLME_MAX_SESSIONS_EXCEEDED;
/* no need to free_recipients(valid), it's not allocated yet */
return;
}
void smtps_greeting(void) {
CtdlModuleStartCryptoMsgs(NULL, NULL, NULL);
#ifdef HAVE_OPENSSL
- if (!CC->redirect_ssl) CC->kill_me = 1; /* kill session if no crypto */
+ if (!CC->redirect_ssl) CC->kill_me = KILLME_NO_CRYPTO; /* kill session if no crypto */
#endif
smtp_greeting(0);
}
memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */
if (client_getln(cmdbuf, sizeof cmdbuf) < 1) {
syslog(LOG_CRIT, "Client disconnected: ending session.\n");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_CLIENT_DISCONNECTED;
return;
}
syslog(LOG_INFO, "SMTP server: %s\n", cmdbuf);
else if (!strncasecmp(cmdbuf, "QUIT", 4)) {
cprintf("221 Goodbye...\r\n");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_CLIENT_LOGGED_OUT;
return;
}
memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */
if (client_getln(cmdbuf, sizeof cmdbuf) < 1) {
syslog(LOG_CRIT, "Client disconnected: ending session.\n");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_CLIENT_DISCONNECTED;
return;
}
syslog(LOG_INFO, ": %s\n", cmdbuf);
#ifdef HAVE_OPENSSL
cprintf("<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
CtdlModuleStartCryptoMsgs(NULL, NULL, NULL);
- if (!CC->redirect_ssl) CC->kill_me = 1;
+ if (!CC->redirect_ssl) CC->kill_me = KILLME_NO_CRYPTO;
#else
cprintf("<failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_NO_CRYPTO;
#endif
}
syslog(LOG_DEBUG, "XMPP client shut down their stream\n");
xmpp_massacre_roster();
cprintf("</stream>\n");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_CLIENT_LOGGED_OUT;
}
else {
XMPP->xp = XML_ParserCreateNS("UTF-8", ':');
if (XMPP->xp == NULL) {
syslog(LOG_ALERT, "Cannot create XML parser!\n");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_XML_PARSER;
return;
}
}
else {
syslog(LOG_ERR, "Client disconnected: ending session.\n");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_CLIENT_DISCONNECTED;
}
FreeStrBuf(&stream_input);
}
*
* Copyright (c) 2007-2010 by Art Cancro
*
- * 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.
#define CTDLEXIT_LIBCITADEL 106 /* Incorrect version of libcitadel */
#define CTDL_EXIT_UNSUP_AUTH 107 /* Unsupported auth mode configured */
+/*
+ * Reasons why a session would be terminated (set CC->kill_me to these values)
+ */
+enum {
+ KILLME_NOT,
+ KILLME_UNKNOWN,
+ KILLME_CLIENT_LOGGED_OUT,
+ KILLME_IDLE,
+ KILLME_CLIENT_DISCONNECTED,
+ KILLME_AUTHFAILED,
+ KILLME_SERVER_SHUTTING_DOWN,
+ KILLME_MAX_SESSIONS_EXCEEDED,
+ KILLME_ADMIN_TERMINATE,
+ KILLME_SELECT_INTERRUPTED,
+ KILLME_SELECT_FAILED,
+ KILLME_WRITE_FAILED,
+ KILLME_SIMULATION_WORKER,
+ KILLME_NOLOGIN,
+ KILLME_NO_CRYPTO,
+ KILLME_READSTRING_FAILED,
+ KILLME_MALLOC_FAILED,
+ KILLME_QUOTA,
+ KILLME_READ_FAILED,
+ KILLME_ILLEGAL_MANAGESIEVE_COMMAND,
+ KILLME_SPAMMER,
+ KILLME_XML_PARSER
+};
#define CS_STEALTH 1 /* stealth mode */
{
syslog(LOG_DEBUG, "client_write(%d bytes) select() interrupted.\n", nbytes-bytes_written);
if (CtdlThreadCheckStop()) {
- CC->kill_me = 1;
+ CC->kill_me = KILLME_SELECT_INTERRUPTED;
return (-1);
} else {
/* can't trust fd's and stuff so we need to re-create them */
nbytes - bytes_written,
strerror(errno), errno);
cit_backtrace();
- Ctx->kill_me = 1;
+ Ctx->kill_me = KILLME_SELECT_FAILED;
return -1;
}
}
strerror(errno), errno);
cit_backtrace();
// syslog(LOG_DEBUG, "Tried to send: %s", &buf[bytes_written]);
- Ctx->kill_me = 1;
+ Ctx->kill_me = KILLME_WRITE_FAILED;
return -1;
}
bytes_written = bytes_written + retval;
int HaveMoreLinesWaiting(CitContext *CCC)
{
- if ((CCC->kill_me == 1) || (
+ if ((CCC->kill_me != 0) || (
(CCC->Pos == NULL) &&
(StrLength(CCC->ReadBuf) == 0) &&
(CCC->client_socket != -1)) )
this = CreateNewContext();
CtdlThreadSleep(1);
- this->kill_me = 1;
+ this->kill_me = KILLME_SIMULATION_WORKER;
this->state = CON_IDLE;
dead_session_purge(1);
begin_critical_section(S_SESSION_TABLE);