diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2008-02-14 09:32:46 +0000 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2008-02-14 09:32:46 +0000 |
commit | 413aa120019af45ee8c8c51934cbf5df844a3bdd (patch) | |
tree | 4abd8856ef5fd89a40ac3f4214fbd5bc2cc158b4 /plugins | |
parent | d9905a864c1adc4fe8a519ed8d65189645390e59 (diff) | |
download | rsyslog-413aa120019af45ee8c8c51934cbf5df844a3bdd.tar.gz rsyslog-413aa120019af45ee8c8c51934cbf5df844a3bdd.tar.xz rsyslog-413aa120019af45ee8c8c51934cbf5df844a3bdd.zip |
error handling and cleanup in imfile
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/imfile/imfile.c | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/plugins/imfile/imfile.c b/plugins/imfile/imfile.c index b8198a4c..ef233f50 100644 --- a/plugins/imfile/imfile.c +++ b/plugins/imfile/imfile.c @@ -252,7 +252,6 @@ CODESTARTrunInput pollFile(&files[i]); } -RUNLOG_VAR("%d", iPollInterval); /* Note: the 10ns additional wait is vitally important. It guards rsyslog against totally * hogging the CPU if the users selects a polling interval of 0 seconds. It doesn't hurt any * other valid scenario. So do not remove. -- rgerhards, 2008-02-14 @@ -303,7 +302,6 @@ persistStrmState(fileInfo_t *pInfo) ASSERT(pInfo != NULL); -dbgprintf("persistStrmState: dir %s, file %s\n", glblGetWorkDir(), pInfo->pszStateFile); /* TODO: create a function persistObj in obj.c? */ CHKiRet(strmConstruct(&psSF)); CHKiRet(strmSetDir(psSF, glblGetWorkDir(), strlen((char*)glblGetWorkDir()))); @@ -324,29 +322,16 @@ finalize_it: /* This function is called by the framework after runInput() has been terminated. It * shall free any resources and prepare the module for unload. - * - * So it is important that runInput() keeps track of what needs to be cleaned up. - * Objects to think about are files (must be closed), network connections, threads (must - * be stopped and joined) and memory (must be freed). Of course, there are a myriad - * of other things, so use your own judgement what you need to do. - * - * Another important chore of this function is to persist whatever state the module - * needs to persist. Unfortunately, there is currently no standard way of doing that. - * Future version of the module interface will probably support it, but that doesn't - * help you right at the moment. In general, it is suggested that anything that needs - * to be persisted is saved in a file, whose name and location is passed in by a - * module-specific config directive. */ BEGINafterRun int i; CODESTARTafterRun - /* loop through file array and close everything that's open */ - - /* persist file state information. We do NOT abort on error iRet as that makes + /* Close files and persist file state information. We do NOT abort on error iRet as that makes * matters worse (at least we can try persisting the others...). */ for(i = 0 ; i < iFilPtr ; ++i) { persistStrmState(&files[i]); + strmDestruct(&(files[i].pStrm)); } ENDafterRun @@ -404,8 +389,8 @@ static rsRetVal resetConfigVariables(uchar __attribute__((unused)) *pp, void __a /* set defaults... */ iPollInterval = 10; - iFacility = 12; /* see RFC 3164 for values */ - iSeverity = 4; + iFacility = 16; /* local0, as of RFC 3164 */ + iSeverity = 5; /* notice, as of rfc 3164 */ RETiRet; } @@ -419,20 +404,40 @@ static rsRetVal addMonitor(void __attribute__((unused)) *pVal, uchar __attribute if(iFilPtr < MAX_INPUT_FILES) { pThis = &files[iFilPtr]; - ++iFilPtr; /* TODO: check for strdup() NULL return */ - if(pszFileName != NULL) + if(pszFileName == NULL) { + logerror("imfile error: no file name given, file monitor can not be created"); + ABORT_FINALIZE(RS_RET_CONFIG_ERROR); + } else { pThis->pszFileName = (uchar*) strdup((char*) pszFileName); - if(pszFileTag != NULL) + } + + if(pszFileTag != NULL) { + logerror("imfile error: no tag value given , file monitor can not be created"); + ABORT_FINALIZE(RS_RET_CONFIG_ERROR); + } else { pThis->pszTag = (uchar*) strdup((char*) pszFileTag); - if(pszStateFile != NULL) + } + + if(pszStateFile != NULL) { + logerror("imfile error: not state file name given, file monitor can not be created"); + ABORT_FINALIZE(RS_RET_CONFIG_ERROR); + } else { pThis->pszStateFile = (uchar*) strdup((char*) pszStateFile); + } + pThis->iSeverity = iSeverity; pThis->iFacility = iFacility; pThis->offsLast = 0; } else { logerror("Too many file monitors configured - ignoring this one"); + ABORT_FINALIZE(RS_RET_OUT_OF_DESRIPTORS); } + +finalize_it: + if(iRet == RS_RET_OK) + ++iFilPtr; /* we got a new file to monitor */ + RETiRet; } |