diff options
Diffstat (limited to 'sysklogd')
-rw-r--r-- | sysklogd/Config.in | 8 | ||||
-rw-r--r-- | sysklogd/syslogd.c | 49 |
2 files changed, 56 insertions, 1 deletions
diff --git a/sysklogd/Config.in b/sysklogd/Config.in index 87b9ed7..83640bb 100644 --- a/sysklogd/Config.in +++ b/sysklogd/Config.in @@ -20,6 +20,14 @@ config CONFIG_SYSLOGD wrong. And something almost always will go wrong if you wait long enough.... +config CONFIG_FEATURE_ROTATE_LOGFILE + bool " Rotate message files" + default n + depends on CONFIG_SYSLOGD + help + This enables syslogd to rotate the message files + on his own. No need to use an external rotatescript. + config CONFIG_FEATURE_REMOTE_LOG bool " Remote Log support" default n diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c index 3ba2398..74b242c 100644 --- a/sysklogd/syslogd.c +++ b/sysklogd/syslogd.c @@ -58,6 +58,14 @@ static char lfile[MAXPATHLEN]; static const char *logFilePath = __LOG_FILE; +#ifdef CONFIG_FEATURE_ROTATE_LOGFILE +/* max size of message file bevor being rotated */ +static int logFileSize = 200 * 1024; + +/* number of rotated message files */ +static int logFileRotate = 1; +#endif + /* interval between marks in seconds */ static int MarkInterval = 20 * 60; @@ -305,6 +313,36 @@ static void message(char *fmt, ...) O_NONBLOCK)) >= 0) { fl.l_type = F_WRLCK; fcntl(fd, F_SETLKW, &fl); +#ifdef CONFIG_FEATURE_ROTATE_LOGFILE + if ( logFileSize > 0 ) { + struct stat statf; + int r = fstat(fd, &statf); + if( !r && (statf.st_mode & S_IFREG) + && (lseek(fd,0,SEEK_END) > logFileSize) ) { + if(logFileRotate > 0) { + int i; + char oldFile[(strlen(logFilePath)+3)], newFile[(strlen(logFilePath)+3)]; + for(i=logFileRotate-1;i>0;i--) { + sprintf(oldFile, "%s.%d", logFilePath, i-1); + sprintf(newFile, "%s.%d", logFilePath, i); + rename(oldFile, newFile); + } + sprintf(newFile, "%s.%d", logFilePath, 0); + fl.l_type = F_UNLCK; + fcntl (fd, F_SETLKW, &fl); + close(fd); + rename(logFilePath, newFile); + fd = device_open (logFilePath, + O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND | + O_NONBLOCK); + fl.l_type = F_WRLCK; + fcntl (fd, F_SETLKW, &fl); + } else { + ftruncate( fd, 0 ); + } + } + } +#endif va_start(arguments, fmt); vdprintf(fd, fmt, arguments); va_end(arguments); @@ -578,7 +616,7 @@ extern int syslogd_main(int argc, char **argv) char *p; /* do normal option parsing */ - while ((opt = getopt(argc, argv, "m:nO:R:LC::")) > 0) { + while ((opt = getopt(argc, argv, "m:nO:s:b:R:LC::")) > 0) { switch (opt) { case 'm': MarkInterval = atoi(optarg) * 60; @@ -589,6 +627,15 @@ extern int syslogd_main(int argc, char **argv) case 'O': logFilePath = optarg; break; +#ifdef CONFIG_FEATURE_ROTATE_LOGFILE + case 's': + logFileSize = atoi(optarg) * 1024; + break; + case 'b': + logFileRotate = atoi(optarg); + if( logFileRotate > 99 ) logFileRotate = 99; + break; +#endif #ifdef CONFIG_FEATURE_REMOTE_LOG case 'R': RemoteHost = bb_xstrdup(optarg); |