From 45905a4a4621a09dfca50042854640a3dfada5dc Mon Sep 17 00:00:00 2001 From: Trog Date: Wed, 26 Jan 2005 17:28:36 +0000 Subject: [PATCH] fixup SESSION mode. git-svn: trunk@1281 --- clamav-devel/ChangeLog | 4 +++ clamav-devel/clamd/server-th.c | 65 +++++++++++++++++++++++++--------- clamav-devel/clamd/session.c | 38 ++++---------------- clamav-devel/clamd/session.h | 2 ++ 4 files changed, 60 insertions(+), 49 deletions(-) diff --git a/clamav-devel/ChangeLog b/clamav-devel/ChangeLog index 4ef33a8d9..bd32f4f50 100644 --- a/clamav-devel/ChangeLog +++ b/clamav-devel/ChangeLog @@ -1,3 +1,7 @@ +Wed Jan 26 17:26:03 GMT 2005 (trog) +----------------------------------- + * clamd/server-th.c clamd/session.c clamd/session.h: fixup SESSION mode. + Wed Jan 26 17:40:56 CET 2005 (tk) --------------------------------- * docs: update diff --git a/clamav-devel/clamd/server-th.c b/clamav-devel/clamd/server-th.c index fca5fad38..dfe802645 100644 --- a/clamav-devel/clamd/server-th.c +++ b/clamav-devel/clamd/server-th.c @@ -64,7 +64,7 @@ void scanner_thread(void *arg) { client_conn_t *conn = (client_conn_t *) arg; sigset_t sigset; - int ret, timeout; + int ret, timeout, session=FALSE; struct cfgstruct *cpt; @@ -81,23 +81,52 @@ void scanner_thread(void *arg) if(!timeout) timeout = -1; - ret = command(conn->sd, conn->root, conn->limits, conn->options, conn->copt, timeout); - - switch(ret) { - case COMMAND_SHUTDOWN: - pthread_mutex_lock(&exit_mutex); - progexit = 1; - kill(conn->mainpid, SIGTERM); - pthread_mutex_unlock(&exit_mutex); - break; - - case COMMAND_RELOAD: - pthread_mutex_lock(&reload_mutex); - reload = 1; - pthread_mutex_unlock(&reload_mutex); - break; + do { + ret = command(conn->sd, conn->root, conn->limits, conn->options, conn->copt, timeout); + if (ret == -1) { + break; } + switch(ret) { + case COMMAND_SHUTDOWN: + pthread_mutex_lock(&exit_mutex); + progexit = 1; + kill(conn->mainpid, SIGTERM); + pthread_mutex_unlock(&exit_mutex); + break; + + case COMMAND_RELOAD: + pthread_mutex_lock(&reload_mutex); + reload = 1; + pthread_mutex_unlock(&reload_mutex); + break; + + case COMMAND_SESSION: + session = TRUE; + timeout = 5; + break; + + case COMMAND_END: + session = FALSE; + break; + + case COMMAND_TIMEOUT: + if (session) { + pthread_mutex_lock(&exit_mutex); + if(progexit) { + session = FALSE; + } + pthread_mutex_unlock(&exit_mutex); + pthread_mutex_lock(&reload_mutex); + if(reload) { + session = FALSE; + } + pthread_mutex_unlock(&reload_mutex); + } + break; + } + } while (session); + close(conn->sd); free(conn); return; @@ -525,7 +554,6 @@ int acceptloop_th(int socketd, struct cl_node *root, const struct cfgstruct *cop pthread_mutex_lock(&reload_mutex); if(reload) { - reload = 0; pthread_mutex_unlock(&reload_mutex); /* Destroy the thread manager. * This waits for all current tasks to end @@ -537,6 +565,9 @@ int acceptloop_th(int socketd, struct cl_node *root, const struct cfgstruct *cop pthread_mutex_unlock(&reload_mutex); exit(-1); } + pthread_mutex_lock(&reload_mutex); + reload = 0; + pthread_mutex_unlock(&reload_mutex); #ifdef CLAMUKO if(cfgopt(copt, "ClamukoScanOnLine") || cfgopt(copt, "ClamukoScanOnAccess")) { logg("Stopping and restarting Clamuko.\n"); diff --git a/clamav-devel/clamd/session.c b/clamav-devel/clamd/session.c index b13e12d2f..f26bb70d9 100644 --- a/clamav-devel/clamd/session.c +++ b/clamav-devel/clamd/session.c @@ -56,9 +56,7 @@ int command(int desc, const struct cl_node *root, const struct cl_limits *limits retval = poll_fd(desc, timeout); switch (retval) { case 0: /* timeout */ - mdprintf(desc, "ERROR\n"); - logg("!Command: command timeout.\n"); - return -1; + return COMMAND_TIMEOUT; case -1: mdprintf(desc, "ERROR\n"); logg("!Command: poll_fd failed.\n"); @@ -67,8 +65,10 @@ int command(int desc, const struct cl_node *root, const struct cl_limits *limits while((bread = readsock(desc, buff, 1024)) == -1 && errno == EINTR); - if(!bread) - return 0; + if(bread == 0) { + /* Connection closed */ + return -1; + } if(bread < 0) { logg("!Command parser: read() failed.\n"); @@ -142,33 +142,7 @@ int command(int desc, const struct cl_node *root, const struct cl_limits *limits return COMMAND_SHUTDOWN; } else if(!strncmp(buff, CMD9, strlen(CMD9))) { /* SESSION */ - do { - if(!is_fd_connected(desc)) { - logg("SESSION: Client disconnected without END\n"); - return 0; - } - ret = command(desc, root, limits, options, copt, -1); - } while(!ret); - - switch(ret) { - case COMMAND_SHUTDOWN: - mdprintf(desc, "SESSION TERMINATED (SHUTDOWN)\n"); - break; - - case COMMAND_RELOAD: - mdprintf(desc, "SESSION TERMINATED (DATABASE RELOADING)\n"); - break; - - case COMMAND_END: - mdprintf(desc, "BYE\n"); - break; - - default: - mdprintf(desc, "SESSION TERMINATED (INTERNAL ERROR)\n"); - break; - } - - return ret; + return COMMAND_SESSION; } else if(!strncmp(buff, CMD10, strlen(CMD10))) { /* END */ return COMMAND_END; diff --git a/clamav-devel/clamd/session.h b/clamav-devel/clamd/session.h index d77ff4f67..c4a014761 100644 --- a/clamav-devel/clamd/session.h +++ b/clamav-devel/clamd/session.h @@ -22,6 +22,8 @@ #define COMMAND_SHUTDOWN 1 #define COMMAND_RELOAD 2 #define COMMAND_END 3 +#define COMMAND_SESSION 4 +#define COMMAND_TIMEOUT 5 #define CMD1 "SCAN" #define CMD2 "RAWSCAN"