david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[syslog] Separate out generic line-based console functionality

Abstract out the generic line-handling portions of the syslog
putchar() routine, to allow use by other console types.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2012-02-28 22:45:32 +00:00
parent c72b8969e2
commit 851b93fbc3
3 changed files with 117 additions and 36 deletions

76
src/core/lineconsole.c Normal file
View File

@ -0,0 +1,76 @@
/*
* Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
FILE_LICENCE ( GPL2_OR_LATER );
/** @file
*
* Line-based console
*
*/
#include <stdint.h>
#include <stddef.h>
#include <ipxe/ansiesc.h>
#include <ipxe/lineconsole.h>
/** Line-based console ANSI escape sequence handlers */
static struct ansiesc_handler line_ansiesc_handlers[] = {
{ 0, NULL }
};
/** Line-based console ANSI escape sequence context */
static struct ansiesc_context line_ansiesc_ctx = {
.handlers = line_ansiesc_handlers,
};
/**
* Print a character to a line-based console
*
* @v character Character to be printed
* @ret print Print line
*/
size_t line_putchar ( struct line_console *line, int character ) {
/* Strip ANSI escape sequences */
character = ansiesc_process ( &line_ansiesc_ctx, character );
if ( character < 0 )
return 0;
/* Ignore carriage return */
if ( character == '\r' )
return 0;
/* Treat newline as a terminator */
if ( character == '\n' )
character = 0;
/* Add character to buffer */
line->buffer[line->index++] = character;
/* Do nothing more unless we reach end-of-line (or end-of-buffer) */
if ( ( character != 0 ) &&
( line->index < ( line->len - 1 /* NUL */ ) ) ) {
return 0;
}
/* Reset to start of buffer */
line->index = 0;
return 1;
}

View File

@ -0,0 +1,33 @@
#ifndef _IPXE_LINECONSOLE_H
#define _IPXE_LINECONSOLE_H
/** @file
*
* Line-based console
*
*/
FILE_LICENCE ( GPL2_OR_LATER );
#include <stdint.h>
/** A line-based console */
struct line_console {
/** Data buffer
*
* Must initially be filled with NULs
*/
char *buffer;
/** Current index within buffer */
size_t index;
/** Length of buffer
*
* The final character of the buffer will only ever be used as
* a potential terminating NUL.
*/
size_t len;
};
extern size_t line_putchar ( struct line_console *line, int character );
#endif /* _IPXE_LINECONSOLE_H */

View File

@ -32,7 +32,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/dhcp.h>
#include <ipxe/settings.h>
#include <ipxe/console.h>
#include <ipxe/ansiesc.h>
#include <ipxe/lineconsole.h>
#include <ipxe/syslog.h>
/** The syslog server */
@ -61,22 +61,15 @@ static struct interface syslogger = INTF_INIT ( syslogger_desc );
/** Syslog line buffer */
static char syslog_buffer[SYSLOG_BUFSIZE];
/** Index into syslog line buffer */
static unsigned int syslog_idx;
/** Syslog line console */
static struct line_console syslog_line = {
.buffer = syslog_buffer,
.len = sizeof ( syslog_buffer ),
};
/** Syslog recursion marker */
static int syslog_entered;
/** Syslog ANSI escape sequence handlers */
static struct ansiesc_handler syslog_ansiesc_handlers[] = {
{ 0, NULL }
};
/** Syslog ANSI escape sequence context */
static struct ansiesc_context syslog_ansiesc_ctx = {
.handlers = syslog_ansiesc_handlers,
};
/**
* Print a character to syslog console
*
@ -89,31 +82,10 @@ static void syslog_putchar ( int character ) {
if ( syslog_entered )
return;
/* Strip ANSI escape sequences */
character = ansiesc_process ( &syslog_ansiesc_ctx, character );
if ( character < 0 )
/* Fill line buffer */
if ( line_putchar ( &syslog_line, character ) == 0 )
return;
/* Ignore carriage return */
if ( character == '\r' )
return;
/* Treat newline as a terminator */
if ( character == '\n' )
character = 0;
/* Add character to buffer */
syslog_buffer[syslog_idx++] = character;
/* Do nothing more unless we reach end-of-line (or end-of-buffer) */
if ( ( character != 0 ) &&
( syslog_idx < ( sizeof ( syslog_buffer ) - 1 /* NUL */ ) ) ) {
return;
}
/* Reset to start of buffer */
syslog_idx = 0;
/* Guard against re-entry */
syslog_entered = 1;