diff --git a/drivers/syslog/ramlog.c b/drivers/syslog/ramlog.c index 1ad53b0e690..4a5b3a07fb5 100644 --- a/drivers/syslog/ramlog.c +++ b/drivers/syslog/ramlog.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -136,8 +137,8 @@ static struct ramlog_dev_s g_sysdev = #ifndef CONFIG_RAMLOG_NONBLOCKING 0, /* rl_nwaiters */ #endif - 0, /* rl_head */ - 0, /* rl_tail */ + CONFIG_RAMLOG_BUFSIZE, /* rl_head */ + CONFIG_RAMLOG_BUFSIZE, /* rl_tail */ SEM_INITIALIZER(1), /* rl_exclsem */ #ifndef CONFIG_RAMLOG_NONBLOCKING SEM_INITIALIZER(0), /* rl_waitsem */ @@ -385,6 +386,7 @@ static ssize_t ramlog_read(FAR struct file *filep, FAR char *buffer, */ ch = priv->rl_buffer[priv->rl_tail]; + priv->rl_buffer[priv->rl_tail] = '\0'; /* Increment the tail index. */ @@ -679,6 +681,60 @@ errout: return ret; } +/**************************************************************************** + * Name: ramlog_initbuf + * + * Description: + * Initialize g_sysdev based on the current system ramlog buffer. + * + ****************************************************************************/ + +#ifdef CONFIG_RAMLOG_SYSLOG +static void ramlog_initbuf(void) +{ + FAR struct ramlog_dev_s *priv = &g_sysdev; + char prev, cur; + size_t i; + + if (priv->rl_head != CONFIG_RAMLOG_BUFSIZE || + priv->rl_tail != CONFIG_RAMLOG_BUFSIZE) + { + return; + } + + prev = priv->rl_buffer[priv->rl_bufsize - 1]; + + for (i = 0; i < priv->rl_bufsize; i++) + { + cur = priv->rl_buffer[i]; + + if (!isascii(cur)) + { + goto out; + } + + if (prev && !cur) + { + priv->rl_head = i; + } + + if (!prev && cur) + { + priv->rl_tail = i; + } + + prev = cur; + } + +out: + if (i != priv->rl_bufsize) + { + priv->rl_head = priv->rl_tail = 0; + memset(priv->rl_buffer, 0, priv->rl_bufsize); + } +} +#endif + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -768,6 +824,8 @@ int ramlog_putc(FAR struct syslog_channel_s *channel, int ch) UNUSED(channel); + ramlog_initbuf(); + #ifdef CONFIG_RAMLOG_CRLF /* Ignore carriage returns. But return success. */