diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2007-08-06 20:51:52 +0000 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2007-08-06 20:51:52 +0000 |
commit | acb7dae3ae782dae451f2f7a2322138ee495244a (patch) | |
tree | 0268f8febf92e3b03186c12fbc85ca5cb6b4f07c /action.c | |
parent | a7a9e013291754e27e5d074fae5b65cc045ce51b (diff) | |
download | rsyslog-acb7dae3ae782dae451f2f7a2322138ee495244a.tar.gz rsyslog-acb7dae3ae782dae451f2f7a2322138ee495244a.tar.xz rsyslog-acb7dae3ae782dae451f2f7a2322138ee495244a.zip |
moved action object out of syslogd.c to its own fileset (action.c/h)
Diffstat (limited to 'action.c')
-rw-r--r-- | action.c | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/action.c b/action.c new file mode 100644 index 00000000..99e86c3d --- /dev/null +++ b/action.c @@ -0,0 +1,178 @@ +/* action.c + * + * Implementation of the action object. + * + * File begun on 2007-08-06 by RGerhards (extracted from syslogd.c) + * + * Copyright 2007 Rainer Gerhards and Adiscon GmbH. + * + * This program is free 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 2 + * of the License, or (at your option) any later version. + * + * 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. + * + * A copy of the GPL can be found in the file "COPYING" in this distribution. + */ +#include "config.h" +#include <stdio.h> +#include <assert.h> +#include <stdarg.h> +#include <stdlib.h> +#include <time.h> + +#include "rsyslog.h" +#include "syslogd.h" /* to get the own definition of dprintf() - not a smart thing... */ +#include "template.h" +#include "action.h" +#include "modules.h" + + +/* destructs an action descriptor object + * rgerhards, 2007-08-01 + */ +rsRetVal actionDestruct(action_t *pThis) +{ + assert(pThis != NULL); + + if(pThis->pMod != NULL) + pThis->pMod->freeInstance(pThis->pModData); + + if(pThis->f_pMsg != NULL) + MsgDestruct(pThis->f_pMsg); + + if(pThis->ppTpl != NULL) + free(pThis->ppTpl); + if(pThis->ppMsgs != NULL) + free(pThis->ppMsgs); + free(pThis); + + return RS_RET_OK; +} + + +/* create a new action descriptor object + * rgerhards, 2007-08-01 + */ +rsRetVal actionConstruct(action_t **ppThis) +{ + DEFiRet; + action_t *pThis; + + assert(ppThis != NULL); + + if((pThis = (action_t*) calloc(1, sizeof(action_t))) == NULL) { + ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY); + } + +finalize_it: + *ppThis = pThis; + return iRet; +} + + +/* set an action back to active state -- rgerhards, 2007-08-02 + */ +static rsRetVal actionResume(action_t *pThis) +{ + DEFiRet; + + assert(pThis != NULL); + pThis->bSuspended = 0; + + return iRet; +} + + +#define ACTION_RESUME_INTERVAL 30 /* TODO: make this dynamic from conf file */ +/* suspend an action -- rgerhards, 2007-08-02 + */ +rsRetVal actionSuspend(action_t *pThis) +{ + DEFiRet; + + assert(pThis != NULL); + pThis->bSuspended = 1; + pThis->ttResumeRtry = time(NULL) + ACTION_RESUME_INTERVAL; + pThis->iNbrResRtry = 0; /* tell that we did not yet retry to resume */ + + return iRet; +} + +/* try to resume an action -- rgerhards, 2007-08-02 + * returns RS_RET_OK if resumption worked, RS_RET_SUSPEND if the + * action is still suspended. + */ +rsRetVal actionTryResume(action_t *pThis) +{ + DEFiRet; + time_t ttNow; + + assert(pThis != NULL); + + ttNow = time(NULL); /* do the system call just once */ + + /* first check if it is time for a re-try */ + if(ttNow > pThis->ttResumeRtry) { + iRet = pThis->pMod->tryResume(pThis->pModData); + if(iRet == RS_RET_SUSPENDED) { + /* set new tryResume time */ + ++pThis->iNbrResRtry; + /* if we have more than 10 retries, we prolong the + * retry interval. If something is really stalled, it will + * get re-tried only very, very seldom - but that saves + * CPU time. TODO: maybe a config option for that? + * rgerhards, 2007-08-02 + */ + pThis->ttResumeRtry = ttNow + ACTION_RESUME_INTERVAL * (pThis->iNbrResRtry / 10 + 1); + } + } else { + /* it's too early, we are still suspended --> indicate this */ + iRet = RS_RET_SUSPENDED; + } + + if(iRet == RS_RET_OK) + actionResume(pThis); + + dprintf("actionTryResume: iRet: %d, next retry (if applicable): %u [now %u]\n", + iRet, (unsigned) pThis->ttResumeRtry, (unsigned) ttNow); + + return iRet; +} + + +/* debug-print the contents of an action object + * rgerhards, 2007-08-02 + */ +rsRetVal actionDbgPrint(action_t *pThis) +{ + DEFiRet; + + printf("%s: ", modGetStateName(pThis->pMod)); + pThis->pMod->dbgPrintInstInfo(pThis->pModData); + printf("\n\tInstance data: 0x%x\n", (unsigned) pThis->pModData); + printf("\tRepeatedMsgReduction: %d\n", pThis->f_ReduceRepeated); + printf("\tSuspended: %d", pThis->bSuspended); + if(pThis->bSuspended) { + printf(" next retry: %u, number retries: %d", (unsigned) pThis->ttResumeRtry, pThis->iNbrResRtry); + } + printf("\n"); + printf("\tDisabled: %d\n", !pThis->bEnabled); + printf("\tExec only when previous is suspended: %d\n", pThis->bExecWhenPrevSusp); + printf("\n"); + + return iRet; +} + + +/* + * vi:set ai: + */ |