drivers/syslog/syslog_device: fix flushing data when end of line is detected
Signed-off-by: Petro Karashchenko <petro.karashchenko@gmail.com>
This commit is contained in:
parent
a597e66070
commit
74a4394352
@ -451,58 +451,71 @@ static ssize_t syslog_dev_write(FAR struct syslog_channel_s *channel,
|
|||||||
|
|
||||||
if (*endptr == '\r' || *endptr == '\n')
|
if (*endptr == '\r' || *endptr == '\n')
|
||||||
{
|
{
|
||||||
|
/* Write everything up to the position of the special
|
||||||
|
* character.
|
||||||
|
*
|
||||||
|
* - buffer points to next byte to output.
|
||||||
|
* - endptr points to the special character.
|
||||||
|
*/
|
||||||
|
|
||||||
|
writelen = (size_t)((uintptr_t)endptr - (uintptr_t)buffer);
|
||||||
|
if (writelen > 0)
|
||||||
|
{
|
||||||
|
nwritten = file_write(&syslog_dev->sl_file,
|
||||||
|
buffer, writelen);
|
||||||
|
if (nwritten < 0)
|
||||||
|
{
|
||||||
|
ret = (int)nwritten;
|
||||||
|
goto errout_with_sem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Check for pre-formatted CR-LF sequence */
|
/* Check for pre-formatted CR-LF sequence */
|
||||||
|
|
||||||
if (remaining > 1 &&
|
if (remaining > 1 &&
|
||||||
((endptr[0] == '\r' && endptr[1] == '\n') ||
|
((endptr[0] == '\r' && endptr[1] == '\n') ||
|
||||||
(endptr[0] == '\n' && endptr[1] == '\r')))
|
(endptr[0] == '\n' && endptr[1] == '\r')))
|
||||||
{
|
{
|
||||||
/* Just skip over pre-formatted CR-LF or LF-CR sequence */
|
writelen = sizeof(g_syscrlf);
|
||||||
|
|
||||||
|
/* Skip over pre-formatted CR-LF or LF-CR sequence */
|
||||||
|
|
||||||
endptr++;
|
endptr++;
|
||||||
remaining--;
|
remaining--;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Write everything up to the position of the special
|
|
||||||
* character.
|
|
||||||
*
|
|
||||||
* - buffer points to next byte to output.
|
|
||||||
* - endptr points to the special character.
|
|
||||||
*/
|
|
||||||
|
|
||||||
writelen = (size_t)((uintptr_t)endptr - (uintptr_t)buffer);
|
|
||||||
if (writelen > 0)
|
|
||||||
{
|
|
||||||
nwritten = file_write(&syslog_dev->sl_file,
|
|
||||||
buffer, writelen);
|
|
||||||
if (nwritten < 0)
|
|
||||||
{
|
|
||||||
ret = (int)nwritten;
|
|
||||||
goto errout_with_sem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ignore the carriage return, but for the linefeed, output
|
/* Ignore the carriage return, but for the linefeed, output
|
||||||
* both a carriage return and a linefeed.
|
* both a carriage return and a linefeed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (*endptr == '\n')
|
writelen = *endptr == '\n' ? sizeof(g_syscrlf) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (writelen > 0)
|
||||||
|
{
|
||||||
|
nwritten = file_write(&syslog_dev->sl_file,
|
||||||
|
g_syscrlf, writelen);
|
||||||
|
|
||||||
|
/* Synchronize the file when each CR-LF is encountered
|
||||||
|
* (i.e., implements line buffering always).
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (nwritten > 0)
|
||||||
{
|
{
|
||||||
nwritten = file_write(&syslog_dev->sl_file,
|
syslog_dev_flush(channel);
|
||||||
g_syscrlf, 2);
|
|
||||||
if (nwritten < 0)
|
|
||||||
{
|
|
||||||
ret = (int)nwritten;
|
|
||||||
goto errout_with_sem;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Adjust pointers */
|
if (nwritten < 0)
|
||||||
|
{
|
||||||
writelen++; /* Skip the special character */
|
ret = (int)nwritten;
|
||||||
buffer += writelen; /* Points past the special character */
|
goto errout_with_sem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Adjust pointers */
|
||||||
|
|
||||||
|
buffer = endptr + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -599,12 +612,10 @@ static int syslog_dev_putc(FAR struct syslog_channel_s *channel, int ch)
|
|||||||
* implements line buffering always).
|
* implements line buffering always).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
|
||||||
if (nbytes > 0)
|
if (nbytes > 0)
|
||||||
{
|
{
|
||||||
syslog_dev_flush(channel);
|
syslog_dev_flush(channel);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user