iPXE
syslog.c File Reference

Syslog protocol. More...

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <byteswap.h>
#include <ipxe/xfer.h>
#include <ipxe/open.h>
#include <ipxe/tcpip.h>
#include <ipxe/dhcp.h>
#include <ipxe/dhcpv6.h>
#include <ipxe/settings.h>
#include <ipxe/console.h>
#include <ipxe/lineconsole.h>
#include <ipxe/syslog.h>
#include <config/console.h>

Go to the source code of this file.

Macros

#define CONSOLE_SYSLOG   ( CONSOLE_USAGE_ALL & ~CONSOLE_USAGE_TUI )

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
int syslog_send (struct interface *xfer, unsigned int severity, const char *message, const char *terminator)
 Transmit formatted syslog message.
static void syslog_handle_priority (struct ansiesc_context *ctx __unused, unsigned int count __unused, int params[])
 Handle ANSI set syslog priority (private sequence)
static void syslog_putchar (int character)
 Print a character to syslog console.
const struct setting syslog_setting __setting (SETTING_MISC, syslog)
 IPv4 syslog server setting.
const struct setting syslog6_setting __setting (SETTING_MISC, syslog6)
 IPv6 syslog server setting.
static void syslog_fix_name (char *name)
 Strip invalid characters from host/domain name.
static int apply_syslog_settings (void)
 Apply syslog settings.

Variables

union { 
   struct sockaddr   sa 
   struct sockaddr_tcpip   st 
   struct sockaddr_in   sin 
   struct sockaddr_in6   sin6 
logserver
 The syslog server.
static struct interface_operation syslogger_operations [] = {}
 Syslog UDP interface operations.
static struct interface_descriptor syslogger_desc
 Syslog UDP interface descriptor.
static struct interface syslogger = INTF_INIT ( syslogger_desc )
 The syslog UDP interface.
static char * syslog_hostname
 Host name (for log messages)
static char * syslog_domain
 Domain name (for log messages)
static char syslog_buffer [SYSLOG_BUFSIZE]
 Syslog line buffer.
static unsigned int syslog_severity = SYSLOG_DEFAULT_SEVERITY
 Syslog severity.
static struct ansiesc_handler syslog_handlers []
 Syslog ANSI escape sequence handlers.
static struct line_console syslog_line
 Syslog line console.
static int syslog_entered
 Syslog recursion marker.
struct console_driver syslog_console __console_driver
 Syslog console driver.
struct settings_applicator syslog_applicator __settings_applicator
 Syslog settings applicator.

Detailed Description

Syslog protocol.

Definition in file syslog.c.

Macro Definition Documentation

◆ CONSOLE_SYSLOG

#define CONSOLE_SYSLOG   ( CONSOLE_USAGE_ALL & ~CONSOLE_USAGE_TUI )

Definition at line 52 of file syslog.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ syslog_send()

int syslog_send ( struct interface * xfer,
unsigned int severity,
const char * message,
const char * terminator )

Transmit formatted syslog message.

Parameters
xferData transfer interface
severitySeverity
messageMessage
terminatorMessage terminator
Return values
rcReturn status code

Definition at line 99 of file syslog.c.

100 {
101 const char *hostname = ( syslog_hostname ? syslog_hostname : "" );
102 const char *domain = ( ( hostname[0] && syslog_domain ) ?
103 syslog_domain : "" );
104
105 return xfer_printf ( xfer, "<%d>%s%s%s%sipxe: %s%s",
107 severity ), hostname,
108 ( domain[0] ? "." : "" ), domain,
109 ( hostname[0] ? " " : "" ), message, terminator );
110}
struct eth_slow_terminator_tlv terminator
Terminator.
Definition eth_slow.h:9
#define SYSLOG_PRIORITY(facility, severity)
Syslog priority.
Definition syslog.h:37
#define SYSLOG_DEFAULT_FACILITY
Syslog default facility.
Definition syslog.h:28
static char * syslog_domain
Domain name (for log messages)
Definition syslog.c:88
static char * syslog_hostname
Host name (for log messages)
Definition syslog.c:85
char message[VMCONSOLE_BUFSIZE]
Definition vmconsole.c:54
int xfer_printf(struct interface *intf, const char *format,...)
Deliver formatted string.
Definition xfer.c:335

References message, SYSLOG_DEFAULT_FACILITY, syslog_domain, syslog_hostname, SYSLOG_PRIORITY, terminator, and xfer_printf().

Referenced by syslog_putchar(), and syslogs_putchar().

◆ syslog_handle_priority()

void syslog_handle_priority ( struct ansiesc_context *ctx __unused,
unsigned int count __unused,
int params[] )
static

Handle ANSI set syslog priority (private sequence)

Parameters
ctxANSI escape sequence context
countParameter count
paramsList of graphic rendition aspects

Definition at line 132 of file syslog.c.

134 {
135 if ( params[0] >= 0 ) {
136 syslog_severity = params[0];
137 } else {
139 }
140}
#define SYSLOG_DEFAULT_SEVERITY
Syslog default severity.
Definition syslog.h:34
static unsigned int syslog_severity
Syslog severity.
Definition syslog.c:123

References __unused, count, ctx, SYSLOG_DEFAULT_SEVERITY, and syslog_severity.

◆ syslog_putchar()

void syslog_putchar ( int character)
static

Print a character to syslog console.

Parameters
characterCharacter to be printed

Definition at line 165 of file syslog.c.

165 {
166 int rc;
167
168 /* Ignore if we are already mid-logging */
169 if ( syslog_entered )
170 return;
171
172 /* Fill line buffer */
173 if ( line_putchar ( &syslog_line, character ) == 0 )
174 return;
175
176 /* Guard against re-entry */
177 syslog_entered = 1;
178
179 /* Send log message */
181 syslog_buffer, "" ) ) != 0 ) {
182 DBG ( "SYSLOG could not send log message: %s\n",
183 strerror ( rc ) );
184 }
185
186 /* Clear re-entry flag */
187 syslog_entered = 0;
188}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
#define DBG(...)
Print a debugging message.
Definition compiler.h:498
size_t line_putchar(struct line_console *line, int character)
Print a character to a line-based console.
Definition lineconsole.c:44
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
int syslog_send(struct interface *xfer, unsigned int severity, const char *message, const char *terminator)
Transmit formatted syslog message.
Definition syslog.c:99
static struct line_console syslog_line
Syslog line console.
Definition syslog.c:149
static char syslog_buffer[SYSLOG_BUFSIZE]
Syslog line buffer.
Definition syslog.c:120
static struct interface syslogger
The syslog UDP interface.
Definition syslog.c:75
static int syslog_entered
Syslog recursion marker.
Definition syslog.c:158

References DBG, line_putchar(), rc, strerror(), syslog_buffer, syslog_entered, syslog_line, syslog_send(), syslog_severity, and syslogger.

◆ __setting() [1/2]

const struct setting syslog_setting __setting ( SETTING_MISC ,
syslog  )

IPv4 syslog server setting.

References __setting, DHCP_LOG_SERVERS, SETTING_MISC, and syslog.

◆ __setting() [2/2]

const struct setting syslog6_setting __setting ( SETTING_MISC ,
syslog6  )

IPv6 syslog server setting.

References __setting, DHCPV6_LOG_SERVERS, dhcpv6_scope, and SETTING_MISC.

◆ syslog_fix_name()

void syslog_fix_name ( char * name)
static

Strip invalid characters from host/domain name.

Parameters
nameName to strip

Definition at line 226 of file syslog.c.

226 {
227 char *fixed = name;
228 int c;
229
230 /* Do nothing if name does not exist */
231 if ( ! name )
232 return;
233
234 /* Strip any non-printable or whitespace characters from the name */
235 do {
236 c = *(name++);
237 *fixed = c;
238 if ( isprint ( c ) && ! isspace ( c ) )
239 fixed++;
240 } while ( c );
241}
const char * name
Definition ath9k_hw.c:1986
int isspace(int character)
Check to see if character is a space.
Definition ctype.c:42
static int isprint(int character)
Check if character is printable.
Definition ctype.h:98
struct eltorito_descriptor_fixed fixed
Fixed portion.
Definition eltorito.h:1

References fixed, isprint(), isspace(), and name.

Referenced by apply_syslog_settings().

◆ apply_syslog_settings()

int apply_syslog_settings ( void )
static

Apply syslog settings.

Return values
rcReturn status code

Definition at line 248 of file syslog.c.

248 {
249 struct sockaddr old_logserver;
250 int rc;
251
252 /* Fetch hostname and domain name */
254 fetch_string_setting_copy ( NULL, &hostname_setting, &syslog_hostname );
257 fetch_string_setting_copy ( NULL, &domain_setting, &syslog_domain );
259
260 /* Fetch log server */
261 syslog_console.disabled = CONSOLE_DISABLED;
262 memcpy ( &old_logserver, &logserver, sizeof ( old_logserver ) );
263 logserver.sa.sa_family = 0;
264 if ( fetch_ipv6_setting ( NULL, &syslog6_setting,
265 &logserver.sin6.sin6_addr ) >= 0 ) {
266 logserver.sin6.sin6_family = AF_INET6;
267 } else if ( fetch_ipv4_setting ( NULL, &syslog_setting,
268 &logserver.sin.sin_addr ) >= 0 ) {
269 logserver.sin.sin_family = AF_INET;
270 }
271 if ( logserver.sa.sa_family ) {
272 syslog_console.disabled = 0;
273 DBG ( "SYSLOG using log server %s\n",
274 sock_ntoa ( &logserver.sa ) );
275 }
276
277 /* Do nothing unless log server has changed */
278 if ( memcmp ( &logserver, &old_logserver, sizeof ( logserver ) ) == 0 )
279 return 0;
280
281 /* Reset syslog connection */
282 intf_restart ( &syslogger, 0 );
283
284 /* Do nothing unless we have a log server */
285 if ( syslog_console.disabled ) {
286 DBG ( "SYSLOG has no log server\n" );
287 return 0;
288 }
289
290 /* Connect to log server */
292 &logserver.sa, NULL ) ) != 0 ) {
293 DBG ( "SYSLOG cannot connect to log server: %s\n",
294 strerror ( rc ) );
295 return rc;
296 }
297
298 return 0;
299}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
#define AF_INET
IPv4 Internet addresses.
Definition socket.h:64
#define AF_INET6
IPv6 Internet addresses.
Definition socket.h:65
#define SOCK_DGRAM
Definition socket.h:30
#define CONSOLE_DISABLED
Console is disabled for all uses.
Definition console.h:112
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void intf_restart(struct interface *intf, int rc)
Shut down and restart an object interface.
Definition interface.c:344
int xfer_open_socket(struct interface *intf, int semantics, struct sockaddr *peer, struct sockaddr *local)
Open socket.
Definition open.c:143
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
int fetch_ipv6_setting(struct settings *settings, const struct setting *setting, struct in6_addr *inp)
Fetch value of IPv6 address setting.
Definition settings.c:951
int fetch_string_setting_copy(struct settings *settings, const struct setting *setting, char **data)
Fetch value of string setting.
Definition settings.c:874
int fetch_ipv4_setting(struct settings *settings, const struct setting *setting, struct in_addr *inp)
Fetch value of IPv4 address setting.
Definition settings.c:913
const char * sock_ntoa(struct sockaddr *sa)
Transcribe socket address.
Definition socket.c:43
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition string.c:115
Generalized socket address structure.
Definition socket.h:97
static void syslog_fix_name(char *name)
Strip invalid characters from host/domain name.
Definition syslog.c:226
static struct sockaddr_tcpip logserver
The encrypted syslog server.
Definition syslogs.c:58

References AF_INET, AF_INET6, CONSOLE_DISABLED, DBG, fetch_ipv4_setting(), fetch_ipv6_setting(), fetch_string_setting_copy(), free, intf_restart(), logserver, memcmp(), memcpy(), NULL, rc, SOCK_DGRAM, sock_ntoa(), strerror(), syslog_domain, syslog_fix_name(), syslog_hostname, syslogger, and xfer_open_socket().

Variable Documentation

◆ sa

◆ st

◆ sin

◆ sin6

◆ [union]

union { ... } logserver
Initial value:
= {
.st = {
.st_port = htons ( SYSLOG_PORT ),
},
}
#define htons(value)
Definition byteswap.h:136
#define SYSLOG_PORT
Syslog server port.
Definition syslog.h:16

The syslog server.

◆ syslogger_operations

struct interface_operation syslogger_operations[] = {}
static

Syslog UDP interface operations.

Definition at line 68 of file syslog.c.

68{};

◆ syslogger_desc

struct interface_descriptor syslogger_desc
static
Initial value:
=
#define INTF_DESC_PURE(operations)
Define an object interface descriptor for a pure-interface object.
Definition interface.h:116
static struct interface_operation syslogger_operations[]
Syslog UDP interface operations.
Definition syslog.c:68

Syslog UDP interface descriptor.

Definition at line 71 of file syslog.c.

◆ syslogger

struct interface syslogger = INTF_INIT ( syslogger_desc )
static

The syslog UDP interface.

Definition at line 75 of file syslog.c.

Referenced by apply_syslog_settings(), and syslog_putchar().

◆ syslog_hostname

char* syslog_hostname
static

Host name (for log messages)

Definition at line 85 of file syslog.c.

Referenced by apply_syslog_settings(), and syslog_send().

◆ syslog_domain

char* syslog_domain
static

Domain name (for log messages)

Definition at line 88 of file syslog.c.

Referenced by apply_syslog_settings(), and syslog_send().

◆ syslog_buffer

char syslog_buffer[SYSLOG_BUFSIZE]
static

Syslog line buffer.

Definition at line 120 of file syslog.c.

Referenced by syslog_putchar().

◆ syslog_severity

unsigned int syslog_severity = SYSLOG_DEFAULT_SEVERITY
static

Syslog severity.

Definition at line 123 of file syslog.c.

Referenced by syslog_handle_priority(), and syslog_putchar().

◆ syslog_handlers

struct ansiesc_handler syslog_handlers[]
static
Initial value:
= {
{ 0, NULL }
}
#define ANSIESC_LOG_PRIORITY
Explicit log message priority.
Definition ansiesc.h:126
static void syslog_handle_priority(struct ansiesc_context *ctx __unused, unsigned int count __unused, int params[])
Handle ANSI set syslog priority (private sequence)
Definition syslog.c:132

Syslog ANSI escape sequence handlers.

Definition at line 143 of file syslog.c.

143 {
145 { 0, NULL }
146};

◆ syslog_line

struct line_console syslog_line
static
Initial value:
= {
.buffer = syslog_buffer,
.len = sizeof ( syslog_buffer ),
.ctx = {
.handlers = syslog_handlers,
},
}
struct golan_eq_context ctx
Definition CIB_PRM.h:0
static struct ansiesc_handler syslog_handlers[]
Syslog ANSI escape sequence handlers.
Definition syslog.c:143

Syslog line console.

Definition at line 149 of file syslog.c.

149 {
150 .buffer = syslog_buffer,
151 .len = sizeof ( syslog_buffer ),
152 .ctx = {
153 .handlers = syslog_handlers,
154 },
155};

Referenced by syslog_putchar().

◆ syslog_entered

int syslog_entered
static

Syslog recursion marker.

Definition at line 158 of file syslog.c.

Referenced by syslog_putchar().

◆ __console_driver

struct console_driver syslog_console __console_driver
Initial value:
= {
.putchar = syslog_putchar,
.disabled = CONSOLE_DISABLED,
.usage = CONSOLE_SYSLOG,
}
static void syslog_putchar(int character)
Print a character to syslog console.
Definition syslog.c:165
#define CONSOLE_SYSLOG
Definition syslog.c:52

Syslog console driver.

Definition at line 191 of file syslog.c.

191 {
192 .putchar = syslog_putchar,
193 .disabled = CONSOLE_DISABLED,
194 .usage = CONSOLE_SYSLOG,
195};

◆ __settings_applicator

struct settings_applicator syslog_applicator __settings_applicator
Initial value:
= {
}
static int apply_syslog_settings(void)
Apply syslog settings.
Definition syslog.c:248

Syslog settings applicator.

Definition at line 302 of file syslog.c.

302 {
303 .apply = apply_syslog_settings,
304};