From 6d7925e26bb90a8d64305b0e91638f65bae9fa46 Mon Sep 17 00:00:00 2001 From: Rainer Gerhards Date: Tue, 17 Jul 2007 10:17:07 +0000 Subject: added $DirCreateMode config directive --- ChangeLog | 2 ++ syslogd-types.h | 1 + syslogd.c | 17 +++++++++++++++-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4257effa..3454a027 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ Version 1.16.1 (RGer), 2007-07-17 - added $RepeatedLineReduction config parameter - added $EscapeControlCharactersOnReceive config parameter - added $ControlCharacterEscapePrefix config parameter +- added $DirCreateMode config parameter - added regular expression support to the filter engine thanks to Michel Samia for providing the patch! - enhanced $AllowedSender functionality. Credits to mildew@gmail.com for @@ -12,6 +13,7 @@ Version 1.16.1 (RGer), 2007-07-17 - allowed DNS wildcard names - added new option $DropMsgsWithMaliciousDnsPTRRecords - added autoconf so that rfc3195d, rsyslogd and klogd are stored to /sbin +- added capability to auto-create directories with dynaFiles --------------------------------------------------------------------------- Version 1.16.0 (RGer/Peter Vrabec), 2007-07-13 - The Friday, 13th Release ;) - build system switched to autotools diff --git a/syslogd-types.h b/syslogd-types.h index 852b19ea..2be96605 100644 --- a/syslogd-types.h +++ b/syslogd-types.h @@ -251,6 +251,7 @@ struct filed { struct template *pTpl; /* pointer to template object */ char bDynamicName; /* 0 - static name, 1 - dynamic name (with properties) */ int fCreateMode; /* file creation mode for open() */ + int fDirCreateMode; /* creation mode for mkdir() */ int iCurrElt; /* currently active cache element (-1 = none) */ int iCurrCacheSize; /* currently cache size (1-based) */ int iDynaFileCacheSize; /* size of file handle cache */ diff --git a/syslogd.c b/syslogd.c index 70785e8c..9cf8e89c 100644 --- a/syslogd.c +++ b/syslogd.c @@ -444,6 +444,7 @@ static int bRequestDoMark = 0; /* do mark processing? (multithread safe) */ static int glblHadMemShortage = 0; /* indicates if we had memory shortage some time during the run */ static int iDynaFileCacheSize = 10; /* max cache for dynamic files */ static int fCreateMode = 0644; /* mode to use when creating files */ +static int fDirCreateMode = 0644; /* mode to use when creating files */ int nfunix = 1; /* number of Unix sockets open / read-only after startup */ int startIndexUxLocalSockets = 0; /* process funix from that index on (used to * suppress local logging. rgerhards 2005-08-01 @@ -491,7 +492,8 @@ static const char *directive_name_list[] = { /* ... and their definitions: */ enum eDirective { DIR_TEMPLATE = 0, DIR_OUTCHANNEL = 1, DIR_ALLOWEDSENDER = 2, DIR_FILECREATEMODE = 3, - DIR_UMASK = 4, DIR_DYNAFILECACHESIZE = 5}; + DIR_DIRCREATEMODE = 4, + DIR_UMASK = 5, DIR_DYNAFILECACHESIZE = 6}; /* The following global variables are used for building * tag and host selector lines during startup and config reload. @@ -6237,7 +6239,7 @@ static int prepareDynFile(selector_t *f) * handler below. */ if(makeFileParentDirs(newFileName, strlen(newFileName), - f->f_un.f_file.fCreateMode) == 0) { + f->f_un.f_file.fDirCreateMode) == 0) { f->f_file = open((char*) newFileName, O_WRONLY|O_APPEND|O_CREAT|O_NOCTTY, f->f_un.f_file.fCreateMode); } @@ -7503,6 +7505,10 @@ static void doFileCreateModeUmaskLine(uchar **pp, enum eDirective eDir) */ iMode = (*(p+1)-'0') * 64 + (*(p+2)-'0') * 8 + (*(p+3)-'0'); switch(eDir) { + case DIR_DIRCREATEMODE: + fDirCreateMode = iMode; + dprintf("FileCreateMode set to 0%o.\n", iMode); + break; case DIR_FILECREATEMODE: fCreateMode = iMode; dprintf("FileCreateMode set to 0%o.\n", iMode); @@ -7609,6 +7615,8 @@ void cfsysline(uchar *p) doNameLine(&p, DIR_OUTCHANNEL); } else if(!strcasecmp((char*) szCmd, "allowedsender")) { doNameLine(&p, DIR_ALLOWEDSENDER); + } else if(!strcasecmp((char*) szCmd, "dircreatemode")) { + doFileCreateModeUmaskLine(&p, DIR_DIRCREATEMODE); } else if(!strcasecmp((char*) szCmd, "filecreatemode")) { doFileCreateModeUmaskLine(&p, DIR_FILECREATEMODE); } else if(!strcasecmp((char*) szCmd, "umask")) { @@ -7771,6 +7779,9 @@ static void init() nextp = NULL; /* re-setting values to defaults (where applicable) */ + iDynaFileCacheSize = 10; + fCreateMode = 0644; + fDirCreateMode = 0644; cCCEscapeChar = '#'; bEscapeCCOnRcv = 1; /* default is to escape control characters */ bReduceRepeatMsgs = (logEveryMsg == 1) ? 0 : 1; @@ -8858,6 +8869,7 @@ static rsRetVal cfline(char *line, register selector_t *f) cflineParseOutchannel(f, p); f->f_un.f_file.bDynamicName = 0; f->f_un.f_file.fCreateMode = fCreateMode; /* preserve current setting */ + f->f_un.f_file.fDirCreateMode = fDirCreateMode; /* preserve current setting */ f->f_file = open(f->f_un.f_file.f_fname, O_WRONLY|O_APPEND|O_CREAT|O_NOCTTY, f->f_un.f_file.fCreateMode); break; @@ -8885,6 +8897,7 @@ static rsRetVal cfline(char *line, register selector_t *f) f->f_un.f_file.bDynamicName = 1; f->f_un.f_file.iCurrElt = -1; /* no current element */ f->f_un.f_file.fCreateMode = fCreateMode; /* freeze current setting */ + f->f_un.f_file.fDirCreateMode = fDirCreateMode; /* preserve current setting */ f->f_un.f_file.iDynaFileCacheSize = iDynaFileCacheSize; /* freeze current setting */ /* we now allocate the cache table. We use calloc() intentionally, as we * need all pointers to be initialized to NULL pointers. -- cgit