summaryrefslogtreecommitdiff
path: root/sysklogd
diff options
context:
space:
mode:
Diffstat (limited to 'sysklogd')
-rw-r--r--sysklogd/Config.in8
-rw-r--r--sysklogd/syslogd.c49
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);