[LEDE-DEV] [ubox] syslog: change log buffer size

Dan Bugnar danutbug at gmail.com
Tue Jun 7 03:11:15 PDT 2016


Change the log buffer size and copy the messages.
Copy the messages from the oldest to newest using the log_list.
First time we calculate the size of the all entries. The log_entries_size
calculates the size indifferent of the positions of the newest and oldest.

If we want to increase the log buffer size is simple, we just copy from the oldest
message to the newest all the messages into the new buffer.

In case we shrink the buffer we go over messages and decrease the entries size
with the size of each message until the entries size is less or equal to the new
size we allocate the new buffer.

Signed-off-by: Dan Bugnar <danutbug at gmail.com>
---
 log/syslog.c | 41 +++++++++++++++++++++++++++++++----------
 log/syslog.h |  2 +-
 2 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/log/syslog.c b/log/syslog.c
index 2042e93..0183d4e 100644
--- a/log/syslog.c
+++ b/log/syslog.c
@@ -42,7 +42,7 @@
 #define PAD(x) (x % 4) ? (((x) - (x % 4)) + 4) : (x)
 
 static char *log_dev = LOG_DEFAULT_SOCKET;
-static int log_size = LOG_DEFAULT_SIZE;
+static int log_size;
 static struct log_head *log, *log_end, *oldest, *newest;
 static int current_id = 0;
 static regex_t pat_prio;
@@ -93,6 +93,7 @@ log_add(char *buf, int size, int source)
 	}
 #endif
 
+	size = PAD(size);
 	/* strip syslog timestamp */
 	if ((source == SOURCE_SYSLOG) && (size > SYSLOG_PADDING) && (buf[SYSLOG_PADDING - 1] == ' ')) {
 		size -= SYSLOG_PADDING;
@@ -213,6 +214,15 @@ syslog_open(void)
 	return 0;
 }
 
+static inline int 
+log_entries_size(void)
+{
+	if (newest > oldest)
+		return (newest - oldest);
+	else
+		return (log_end - oldest + newest - log);
+}
+
 struct log_head*
 log_list(int count, struct log_head *h)
 {
@@ -237,26 +247,40 @@ log_list(int count, struct log_head *h)
 }
 
 int
-log_buffer_init(int size)
+log_buffer_reinit(int size)
 {
-	struct log_head *_log = malloc(size);
+	struct log_head *_log;
+
+	if (size <= 0)
+		size = LOG_DEFAULT_SIZE;
+	if (log_size == size)
+		return 0;
+
+	_log = malloc(size);
 
 	if (!_log) {
+		oldest = newest = log = NULL;
 		fprintf(stderr, "Failed to initialize log buffer with size %d\n", log_size);
 		return -1;
 	}
 
 	memset(_log, 0, size);
 
-	if (log && ((log_size + sizeof(struct log_head)) < size)) {
+	if (log) {
 		struct log_head *start = _log;
 		struct log_head *end = ((void*) _log) + size;
 		struct log_head *l;
+		int entries_size = log_entries_size();
 
 		l = log_list(0, NULL);
 		while ((start < end) && l && l->size) {
-			memcpy(start, l, PAD(sizeof(struct log_head) + l->size));
-			start = (struct log_head *) &l->data[PAD(l->size)];
+			int copy_len = sizeof(struct log_head) + l->size;
+			if (entries_size < size) {
+				memcpy(start, l, copy_len);
+				start = (struct log_head *) &start->data[l->size];
+			} else{
+				entries_size -= copy_len;
+			}
 			l = log_list(0, l);
 		}
 		free(log);
@@ -276,13 +300,10 @@ log_buffer_init(int size)
 void
 log_init(int _log_size)
 {
-	if (_log_size > 0)
-		log_size = _log_size;
-
 	regcomp(&pat_prio, "^<([0-9]*)>(.*)", REG_EXTENDED);
 	regcomp(&pat_tstamp, "^\[[ 0]*([0-9]*).([0-9]*)] (.*)", REG_EXTENDED);
 
-	if (log_buffer_init(log_size)) {
+	if (log_buffer_reinit(_log_size)) {
 		fprintf(stderr, "Failed to allocate log memory\n");
 		exit(-1);
 	}
diff --git a/log/syslog.h b/log/syslog.h
index 81a039f..ed5a41b 100644
--- a/log/syslog.h
+++ b/log/syslog.h
@@ -35,7 +35,7 @@ void log_shutdown(void);
 
 typedef void (*log_list_cb)(struct log_head *h);
 struct log_head* log_list(int count, struct log_head *h);
-int log_buffer_init(int size);
+int log_buffer_reinit(int size);
 void log_add(char *buf, int size, int source);
 void ubus_notify_log(struct log_head *l);
 
-- 
2.8.1




More information about the Lede-dev mailing list